code: def copy_built_artifacts_to_canonical_place(
      system: str,
      real_build_dir: str,
      build_native_platform_dir: str,
      dry_run: bool,
      verbose: bool,
  ):
      """
      Copy only artifacts that are not copied already by postprocessing in building JVM, R and Python packages
      """
      artifacts = [
          (
              os.path.join("catboost", "app"),
              get_exe_files(system, "catboost"),
          ),
          (
              os.path.join("catboost", "libs", "model_interface"),
              get_shared_lib_files(system, "catboostmodel"),
          ),
          (
              os.path.join(
                  "catboost", "libs", "model_interface", "static"
              ),
              get_static_lib_files(system, "catboostmodel_static"),
          ),
          (
              os.path.join("catboost", "libs", "train_interface"),
              get_shared_lib_files(system, "catboost"),
          ),
      ]
  
      for sub_path, files in artifacts:
          for f in files:
              src = os.path.join(real_build_dir, sub_path, f)
              dst = os.path.join(build_native_platform_dir, sub_path, f)
              if dry_run:
                  logging.info(f"copying {src} -> {dst}")
              else:
                  distutils.dir_util.mkpath(
                      os.path.dirname(dst),
                      verbose=verbose,
                      dry_run=dry_run,
                  )
                  distutils.file_util.copy_file(
                      src, dst, verbose=verbose, dry_run=dry_run
                  )
  
imports: import argparse
  import distutils
  import hashlib
  import logging
  import os
  import subprocess
  import sys
  import tarfile
  from typing import List, Tuple
label_desc: Use image node_id 15 for calling a global function with example usage: copy_built_artifacts_to_canonical_place(system, real_build_dir, build_native_platform_dir, dry_run, verbose) without return types