# Copyright 2016 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/dart/dart.gni")
import("//build/dart/dart_package_config.gni")
import("//build/dart/toolchain.gni")
import("//build/json/validate_json.gni")
import("//build/sdk/sdk_atom.gni")
import("//build/toolchain/concurrent_jobs.gni")

declare_args() {
  # Enable all dart analysis
  # TODO(fxbug.dev/98703) reenable analysis when hangs are fixed.
  enable_dart_analysis = false

  # Enable all strict deps.
  disable_dart_strict_deps = false

  # Detect dart API changes
  enable_api_diff = true
}

# Defines a Dart library
#
# Parameters
#
#   sources
#     The list of all sources in this library.
#     These sources must be within source_dir.
#
#   package_root (optional)
#     Path to the directory hosting the library.
#     This is useful for generated content, and can be ignored otherwise.
#     Defaults to ".".
#
#   package_name (optional)
#     Name of the Dart package. This is used as an identifier in code that
#     depends on this library. Must be a valid Dart package name, so for
#     example "some_name" is OK, but "some-name" is not.
#
#   language_version (optional)
#     Specify the Dart language version to use for this package.
#     If language_version is not specified but pubspec is then the language
#     version will be read from the pubspec. If no language version can be
#     determined then we will default to version "2.8".
#     It is recommended to specify a language_version if it is well known
#     instead of relying on the pubspec file since this will improve compilation
#     times.
#
#   infer_package_name (optional)
#     Infer the package name based on the path to the package.
#
#     NOTE: Exactly one of package_name or infer_package_name must be set.
#
#   source_dir (optional)
#     Path to the directory containing the package sources, relative to
#     package_root. All non third-party dart files under source_dir must be
#     included in sources.
#     Defaults to "lib".
#
#   deps (optional)
#     List of labels this library depends on.
#
#   TODO(fxb/63133): non_dart_deps is deprecated. Use deps instead.
#   non_dart_deps (optional, deprecated)
#     List of labels this library depends on that are not Dart libraries. This
#     includes things like actions that generate Dart code. It typically doesn't
#     need to be set.
#     Note that these labels *must* have an explicit toolchain attached.
#
#   disable_analysis (optional)
#     Prevents analysis from being run on this target.
#
#   TODO(fxbug.dev/71902): set up allowlist for disable_source_verification when
#   dart_test no longer depends on dart_library.
#   NOTE: Do NOT disable source verification unless you are 100% sure it is
#   absolutely necessary.
#   disable_source_verification (optional)
#     Prevents source verification from being run on this target.
#
#   sdk_category (optional)
#     Publication level of the library in SDKs.
#     See //build/sdk/sdk_atom.gni.
#
#   api (optional)
#     Path to the file representing the API of this library.
#     This file is used to ensure modifications to the library's API are
#     explicitly acknowledged. This file must exist for publication categories
#     of "partner" or "public"; if it does not exist, it will be automatically
#     generated by analyzing the given sources list.
#     Defaults to "<Dart library name>.api".
#
#   extra_sources (optional)
#     Additional sources to consider for analysis.
#
#   pubspec (optional)
#     Path to the pubspec.yaml. If not provided, will default to looking for
#     the pubspec.yaml in the package root. It is not common that this value will
#     need to be set but can be useful for generated code.
#
#   options_file (optional, deprecated)
#     Path to the analysis_options.yaml file. If not provided, will default to
#     looking for the analysis_options.yaml in the package root. It is not common
#     that this value needs to be set but can be useful for generated code.
#
#   disable_metadata_entry (optional)
#     Prevents metedata entry from being written to the dart_packag_config json file.
#
#   null_safe (optional)
#     A flag that enables null safety check in dart libraries.
#
# Example of usage:
#
#   dart_library("baz") {
#     package_name = "foo.bar.baz"
#
#     sources = [
#       "blah.dart",
#     ]
#
#     deps = [
#       "//foo/bar/owl",
#     ]
#   }
if (current_toolchain == dart_toolchain) {
  template("dart_library") {
    forward_variables_from(invoker,
                           [
                             "visibility",
                             "hermetic_deps",
                           ])

    if (defined(invoker.package_name)) {
      package_name = invoker.package_name
    } else if (defined(invoker.infer_package_name) &&
               invoker.infer_package_name) {
      # Compute a package name from the label:
      #   //foo/bar --> foo.bar
      #   //foo/bar:blah --> foo.bar._blah
      # Strip public directories.
      full_dir = get_label_info(":$target_name", "dir")
      package_name = full_dir
      package_name = string_replace(package_name, "//", "")
      package_name = string_replace(package_name, "/", ".")

      # If the last directory name does not match the target name, add the
      # target name to the resulting package name.
      name = get_label_info(":$target_name", "name")
      last_dir = get_path_info(full_dir, "name")
      if (last_dir != name) {
        package_name = "$package_name._$name"
      }
    } else {
      assert(false, "Must specify either a package_name or infer_package_name")
    }

    _dart_deps = []
    if (defined(invoker.deps)) {
      foreach(dep, invoker.deps) {
        _dart_deps += [ get_label_info(dep, "label_no_toolchain") ]
      }
    }

    _non_dart_deps = []
    if (defined(invoker.non_dart_deps)) {
      _non_dart_deps += invoker.non_dart_deps
    }

    package_root = "."
    if (defined(invoker.package_root)) {
      package_root = invoker.package_root
    }

    source_dir = "$package_root/lib"
    if (defined(invoker.source_dir)) {
      source_dir = "$package_root/${invoker.source_dir}"
    }

    assert(defined(invoker.sources), "Sources must be defined")

    disable_source_verification =
        defined(invoker.disable_source_verification) &&
        invoker.disable_source_verification
    if (disable_source_verification && invoker.sources == []) {
      not_needed([ source_dir ])
    }

    rebased_sources = []
    foreach(source, invoker.sources) {
      rebased_source_dir = rebase_path(source_dir, root_build_dir)
      rebased_sources += [ "$rebased_source_dir/$source" ]
    }
    if (defined(invoker.extra_sources)) {
      foreach(source, invoker.extra_sources) {
        rebased_sources += [ rebase_path(source, root_build_dir) ]
      }
    }
    source_file = "$target_gen_dir/$target_name.sources"
    write_file(source_file, rebased_sources, "list lines")

    # Dependencies of the umbrella group for the targets in this file.
    group_deps = []

    _public_deps = []
    if (defined(invoker.public_deps)) {
      _public_deps = invoker.public_deps
    }

    _metadata = {
      package_config_entries = [
        {
          name = package_name
          if (defined(invoker.language_version)) {
            language_version = invoker.language_version
          } else if (defined(invoker.null_safe) && invoker.null_safe) {
            language_version = "2.12"
          } else if (defined(invoker.pubspec)) {
            pubspec_path = rebase_path(invoker.pubspec, root_build_dir)
          }
          root_uri = rebase_path(package_root, root_build_dir)
          if (defined(invoker.source_dir)) {
            package_uri = invoker.source_dir
          } else {
            package_uri = "lib"
          }
        },
      ]
      dart_build_info = [
        {
          __is_current_target = false
          __package_name = package_name
          __deps = _dart_deps + _non_dart_deps
          __public_deps = _public_deps
          __rebased_sources = rebased_sources
        },
      ]

      dart_build_info_barrier = []
    }

    # When we generate a package_config for the analyzer we need to make sure
    # that we are including this library in that file. The dart_package_config
    # collects metadata from its dependencies so we create this group to expose
    # that data. We also expose this in the group target below so that users of
    # the dart_package_config target can just add the targets to the deps list.
    _publish_metadata_target_name = "${target_name}_package_metadata"
    group(_publish_metadata_target_name) {
      metadata = _metadata
    }

    _dart_package_config_target_name = "${target_name}_dart_package"
    _packages_path = "$target_gen_dir/${target_name}_package_config.json"
    dart_package_config(_dart_package_config_target_name) {
      # Do not publish the metadata to the dart_package_config json file if the
      # disable_metadata_entry flag is enabled in the dart_tool. The reason this is here
      # is to avoid entries that may have identical rootUris as fxb/58781 has highlighted.
      deps = _dart_deps
      if (!defined(invoker.disable_metadata_entry) ||
          !invoker.disable_metadata_entry) {
        deps += [ ":$_publish_metadata_target_name" ]
      }
      public_deps = _non_dart_deps
      outputs = [ _packages_path ]
      forward_variables_from(invoker, [ "testonly" ])
    }
    group_deps += [ ":$_dart_package_config_target_name" ]

    ################################
    # Dart source "verification"
    #
    # Warn if there are dart sources from the source directory that are
    # not explicitly part of sources. This may cause a failure when syncing to
    # another repository, as they will be excluded from the resulting BUILD
    # file.
    #
    # Also warn if nonexistent files are included in sources.
    if (!disable_source_verification) {
      source_verification_target_name = "${target_name}_source_verification"
      action(source_verification_target_name) {
        script = "//build/dart/verify_sources.py"
        output_file = "$target_gen_dir/$target_name.missing"

        sources = rebase_path(rebased_sources, ".", root_build_dir)
        outputs = [ output_file ]

        args = [
                 "--source_dir",
                 rebase_path(source_dir, root_build_dir),
                 "--stamp",
                 rebase_path(output_file, root_build_dir),
               ] + invoker.sources

        forward_variables_from(invoker, [ "testonly" ])

        # Deps may include codegen dependencies that generate dart sources.
        deps = _dart_deps + _non_dart_deps
      }
      group_deps += [ ":$source_verification_target_name" ]
    }

    # Generate a file that lists files containing full (including all direct and
    # transitive dependencies) sources for this target's dependencies.
    _all_deps_sources_list_target = "${target_name}.all_deps_sources.list"
    _all_deps_sources_list_file =
        "${target_gen_dir}/${target_name}.all_deps_sources.list"
    generated_file(_all_deps_sources_list_target) {
      forward_variables_from(invoker, [ "testonly" ])
      outputs = [ _all_deps_sources_list_file ]
      data_keys = [ "all_deps_sources" ]
      walk_keys = [ "all_deps_sources_barrier" ]
      deps = _dart_deps
    }

    # Generate full sources for this target by combining sources of this target
    # with full sources of all dependencies.
    #
    # The generated file contains sources of this target and all of its direct
    # and transitive dependencies.
    #
    # The output file is useful when writing depfiles for actions like dart
    # analyzer, which recursively reads all sources.
    _all_deps_sources_target = "${target_name}.all_deps_sources"
    _all_deps_sources_file = "${target_gen_dir}/${target_name}.all_deps_sources"
    action(_all_deps_sources_target) {
      forward_variables_from(invoker, [ "testonly" ])

      script = "//build/dart/merge_deps_sources.py"

      outputs = [ _all_deps_sources_file ]
      depfile = "${_all_deps_sources_file}.d"
      args = [
               "--output",
               rebase_path(outputs[0], root_build_dir),
               "--depfile",
               rebase_path(depfile, root_build_dir),
               "--source_lists",
               "@" + rebase_path(_all_deps_sources_list_file, root_build_dir),
               "--sources",
             ] + rebased_sources

      inputs = [ _all_deps_sources_list_file ]
      deps = [ ":${_all_deps_sources_list_target}" ]
      metadata = {
        all_deps_sources = [ rebase_path(outputs[0], root_build_dir) ]
        all_deps_sources_barrier = []
      }
    }
    group_deps += [ ":${_all_deps_sources_target}" ]

    ################################
    # Don't run the analyzer if it is explicitly disabled or if we are using
    # a custom-built Dart SDK in a cross-build.
    with_analysis =
        !defined(invoker.disable_analysis) || !invoker.disable_analysis
    with_analysis = enable_dart_analysis && with_analysis
    if (with_analysis) {
      if (defined(invoker.options_file)) {
        # Always append a trailing "/" so both paths consistently ends with a
        # "/" after get_path_info.
        _abs_options_file_dir =
            get_path_info(get_path_info(invoker.options_file, "abspath"),
                          "dir") + "/"
        _abs_package_root = get_path_info(package_root + "/", "abspath")
        assert(
            _abs_options_file_dir == _abs_package_root,
            "custom analysis options file must be located in package root ${_abs_package_root}, it's currently located in ${_abs_options_file_dir}")
      }

      analysis_target_name = "${target_name}_analysis"
      group_deps += [ ":$analysis_target_name" ]

      # Runs analysis on the sources.
      action(analysis_target_name) {
        forward_variables_from(concurrent_jobs.local, "*")
        forward_variables_from(invoker, [ "testonly" ])

        # This script is built by "//build/dart:run_analysis". However, because
        # that target is not defined in this file we can't use
        # `get_target_outputs`, which only supports targets previously defined
        # in the current file. We don't want to include that target as part of
        # the template, to avoid repeatedly building it for every dart_library.
        script = "${root_out_dir}/obj/build/dart/run_analysis.pyz"

        depfile = "$target_gen_dir/$target_name.analysis.d"

        _pubspec = "${package_root}/pubspec.yaml"
        if (defined(invoker.pubspec)) {
          _pubspec = invoker.pubspec
        }
        inputs = [
                   "//analysis_options.yaml",
                   _all_deps_sources_file,
                   _packages_path,
                   _pubspec,
                   prebuilt_dart,
                   source_file,
                 ] + rebase_path(rebased_sources, ".", root_build_dir)

        deps = _dart_deps + dart_sdk_deps + [
                 ":$_all_deps_sources_target",
                 ":$_dart_package_config_target_name",
                 "//build/dart:run_analysis",
               ]

        if (defined(invoker.options_file)) {
          inputs += [ invoker.options_file ]
          deps += [ "//build/dart:custom_analysis_options" ]
        }

        output_file = "$target_gen_dir/$target_name.analyzed"
        outputs = [ output_file ]

        args = [
          "--dart",
          rebase_path(prebuilt_dart, root_build_dir),
          "--source-file",
          rebase_path(source_file, root_build_dir),
          "--dot-packages",
          rebase_path(_packages_path, root_build_dir),
          "--stamp",
          rebase_path(output_file, root_build_dir),
          "--depname",
          rebase_path(output_file, root_build_dir),
          "--depfile",
          rebase_path(depfile, root_build_dir),
          "--all-deps-sources-file",
          rebase_path(_all_deps_sources_file, root_build_dir),
        ]
      }
    } else {
      if (defined(invoker.pubspec)) {
        not_needed([ invoker.pubspec ])
      }
      if (defined(invoker.options_file)) {
        not_needed([ invoker.options_file ])
      }
    }

    ################################
    # Dart strict deps
    #
    # Ensures that this target specifies all of the Dart packages that it
    # imports as direct dependencies.

    group("${invoker.target_name}_dart_build_info_self_marker") {
      metadata = {
        dart_build_info = [
          {
            __is_current_target = true
            __package_name = package_name
            __deps = _dart_deps + _non_dart_deps
            __public_deps = _public_deps
            __rebased_sources = rebased_sources
          },
        ]
      }
      forward_variables_from(invoker, [ "testonly" ])
    }

    _metadata_collection_results_path =
        "$target_gen_dir/${target_name}_dart_build_info.out"
    generated_file("${invoker.target_name}_dart_build_info") {
      data_keys = [ "dart_build_info" ]
      walk_keys = [ "dart_build_info_barrier" ]
      outputs = [ _metadata_collection_results_path ]
      output_conversion = "json"
      deps =
          _dart_deps + [ ":${invoker.target_name}_dart_build_info_self_marker" ]
      forward_variables_from(invoker, [ "testonly" ])
    }

    _strict_deps_tool_label =
        "//tools/dart-strict-deps:strict_deps($host_toolchain)"
    _strict_deps_tool_path =
        get_label_info(_strict_deps_tool_label, "root_out_dir") +
        "/dart-tools/strict_deps"
    _strict_deps_stamp =
        "${invoker.target_gen_dir}/${invoker.target_name}_strict_deps.report"
    _strict_deps_snapshot_path =
        get_label_info(_strict_deps_tool_label, "target_gen_dir") +
        "/strict_deps.snapshot"

    action("${invoker.target_name}_strict_deps") {
      deps = [
               ":$_dart_package_config_target_name",
               ":${invoker.target_name}_dart_build_info",
               "//tools/dart-strict-deps:strict_deps_snapshot($host_toolchain)",
               _strict_deps_tool_label,
             ] + _dart_deps
      sources = []
      if (defined(invoker.sources)) {
        foreach(src, invoker.sources) {
          sources += [ "$source_dir/$src" ]
        }
      }
      inputs = [
        _metadata_collection_results_path,
        _packages_path,
        _strict_deps_snapshot_path,
      ]
      outputs = [ _strict_deps_stamp ]
      script = _strict_deps_tool_path
      args = [
        "--metadata-file",
        rebase_path(_metadata_collection_results_path, root_build_dir),
        "--output-file",
        rebase_path(_strict_deps_stamp, root_build_dir),
        "--packages-file",
        rebase_path(_packages_path, root_build_dir),
      ]
      forward_variables_from(invoker, [ "testonly" ])

      # The strict_deps.report contains the output dir name.
      no_output_dir_leaks = false
    }

    # The strict deps tool is excluded from the strict deps check to
    # prevent a circular dependency.
    _strict_deps_package_excludes = [
      "strict_deps_dart_library",
      "dart_strict_deps_lib",
      "dart_strict_deps_proto",
      "protoc_gen_dart_dart_library",
    ]
    _package_excludes_contains_target =
        _strict_deps_package_excludes + [ target_name ] - [ target_name ] !=
        _strict_deps_package_excludes

    _full_target_label = get_label_info(":$target_name", "label_no_toolchain")

    _is_third_party_lib =
        string_replace(_full_target_label, "//third_party/dart-pkg/pub", "") !=
        _full_target_label

    group(target_name) {
      # _dart_deps are added here to ensure they are fully built.
      # Up to this point, only the targets generating .packages had been
      # depended on.
      deps = _dart_deps + _non_dart_deps

      if (!disable_dart_strict_deps && !_package_excludes_contains_target &&
          !_is_third_party_lib) {
        deps += [ ":${invoker.target_name}_strict_deps" ]
      } else {
        not_needed([
                     "_package_excludes_contains_target",
                     "_is_third_party_lib",
                   ])
      }

      public_deps = group_deps

      metadata = _metadata
      forward_variables_from(invoker, [ "testonly" ])
    }

    ################################################
    # SDK support
    #

    with_api_diff = enable_api_diff && (defined(invoker.sdk_category) &&
                                        invoker.sdk_category != "excluded")

    if (with_api_diff) {
      detect_target_name = "${target_name}_detect_action"
      verify_target_name = "${target_name}_verify"
      detect_target_file = "$target_gen_dir/$package_name.api"
      _target_dir = get_label_info(":$target_name", "dir")
      pubspec_target_file = _target_dir + "/pubspec.yaml"

      _detect_snapshot_label = "//build/dart/sdk/detect_api_changes:detect_api_changes_snapshot($dart_toolchain)"
      _detect_snapshot_path =
          get_label_info(_detect_snapshot_label, "target_gen_dir") +
          "/detect_api_changes.snapshot"

      action(detect_target_name) {
        runner_label = "//build/dart/sdk/detect_api_changes($dart_toolchain)"
        runner_out_dir = get_label_info(runner_label, "root_out_dir")
        script = "$runner_out_dir/dart-tools/detect_api_changes"
        output_file = detect_target_file
        depfile = "${target_out_dir}/${detect_target_name}.d"

        inputs = [
          pubspec_target_file,
          "//analysis_options.yaml",
          _detect_snapshot_path,
          _packages_path,
          source_file,
        ]  # the gen directory, which triggers an "unexpected file access"
           # error.
           # Explicitly add that file to the inputs here.

        # The zircon dart library also copies over the pubspec.yaml file into
        if (string_replace(target_name, "zircon", "") != target_name) {
          inputs += [ "$target_gen_dir/zircon/pubspec.yaml" ]
        }

        outputs = [ output_file ]

        args = [
          "--api-name",
          get_label_info(":$target_name", "label_no_toolchain"),
          "--source-file",
          rebase_path(source_file, root_build_dir),
          "--dot-packages",
          rebase_path(_packages_path, root_build_dir),
          "--output-file",
          rebase_path("$detect_target_file", root_build_dir),
          "--golden-api",
          rebase_path("$package_name.api", root_build_dir),
          "--fuchsia-root",
          rebase_path("//", root_build_dir),
          "--fuchsia-build-root",
          rebase_path(root_build_dir, root_build_dir),
          "--depfile",
          rebase_path(depfile, root_build_dir),

          # Uncomment to force updating the .api files
          #"--overwrite",
        ]

        deps = dart_sdk_deps + [
                 runner_label,
                 ":$_dart_package_config_target_name",
                 _detect_snapshot_label,
               ]
        forward_variables_from(invoker, [ "testonly" ])
      }

      # Verify that the library API file complies with the specified schema.
      validate_json(verify_target_name) {
        forward_variables_from(invoker, [ "testonly" ])
        data = detect_target_file
        schema = "//build/dart/sdk/detect_api_changes/schema.json"
        deps = dart_sdk_deps + [ ":$detect_target_name" ]
        public_deps = [ ":$detect_target_name" ]
      }
    }

    if (defined(invoker.sdk_category) && invoker.sdk_category != "excluded") {
      assert(
          defined(invoker.package_name),
          "Dart libraries published in SDKs must have an explicit package name")

      assert(
          !defined(invoker.extra_sources),
          "Extra sources can not be included in SDKs: put them in source_dir")

      # Dependencies that should normally be included in any SDK containing this
      # target.
      sdk_deps = []

      # Path to SDK metadata files for first-party dependencies.
      sdk_metas = []

      # Path to Dart manifest files for third-party dependencies.
      third_party_pubspecs = []

      local_deps = filter_exclude(_dart_deps, [ "//third_party/*" ])
      third_party_deps = filter_include(_dart_deps, [ "//third_party/*" ])
      foreach(dep, local_deps) {
        sdk_dep = "${dep}_sdk"
        sdk_deps += [ sdk_dep ]

        gen_dir = get_label_info(sdk_dep, "target_gen_dir")
        name = get_label_info(sdk_dep, "name")
        sdk_metas += [ "$gen_dir/$name.meta.json" ]
      }
      foreach(dep, third_party_deps) {
        path = get_label_info(dep, "dir")
        third_party_pubspecs += [ "$path/pubspec.yaml" ]
      }

      file_base = "dart/${invoker.package_name}"

      sdk_sources = []
      sdk_source_mappings = []
      foreach(source, rebased_sources) {
        relative_source = rebase_path(source, source_dir, root_build_dir)
        dest = "$file_base/lib/$relative_source"
        sdk_sources += [ dest ]
        sdk_source_mappings += [
          {
            source = "${source_dir}/${relative_source}"
            dest = dest
          },
        ]
      }

      metadata_target_name = "${target_name}_sdk_metadata"
      metadata_file = "$target_gen_dir/$target_name.sdk_meta.json"
      action(metadata_target_name) {
        # This script is built by "//build/dart:gen_meta_file". However, because
        # that target is not defined in this file we can't use
        # `get_target_outputs`, which only supports targets previously defined
        # in the current file. We don't want to include that target as part of
        # the template, to avoid repeatedly building it for every dart_library.
        script = "${root_out_dir}/obj/build/dart/gen_meta_file.pyz"

        inputs = sdk_metas + third_party_pubspecs

        outputs = [ metadata_file ]

        args = [
          "--out",
          rebase_path(metadata_file, root_build_dir),
          "--name",
          package_name,
          "--root",
          file_base,
        ]
        args += [ "--specs" ] + rebase_path(sdk_metas, root_build_dir)
        args += [ "--sources" ] + sdk_sources
        args += [ "--third-party-specs" ] +
                rebase_path(third_party_pubspecs, root_build_dir)

        if (defined(invoker.null_safe) && invoker.null_safe) {
          args += [ "--dart-library-null-safe" ]
        }

        deps = sdk_deps + [ "//build/dart:gen_meta_file" ]

        forward_variables_from(invoker, [ "testonly" ])
      }

      sdk_atom("${target_name}_sdk") {
        id = "sdk://dart/${invoker.package_name}"

        category = invoker.sdk_category

        meta = {
          source = metadata_file
          dest = "$file_base/meta.json"
          schema = "dart_library"
        }

        deps = sdk_deps

        non_sdk_deps = [ ":$metadata_target_name" ]
        if (with_api_diff) {
          non_sdk_deps += [ ":$verify_target_name" ]
        }

        if (defined(invoker.non_dart_deps)) {
          non_sdk_deps += invoker.non_dart_deps
        }

        files = sdk_source_mappings
      }
    }
  }
} else {  # Not the Dart toolchain.
  template("dart_library") {
    group(target_name) {
      forward_variables_from(invoker, [ "testonly" ])
      not_needed(invoker, "*")

      public_deps = [ ":$target_name($dart_toolchain)" ]
    }
  }
}
