MODULE arps_netio_metadata 5

!-----------------------------------------------------------------------
!
!  Define meta types
!
!-----------------------------------------------------------------------

  TYPE :: VARMETA               ! Structure to hold CF variable attributes
     CHARACTER(80) :: standard_name
     CHARACTER(80) :: long_name
     CHARACTER(40) :: units
     CHARACTER(1)  :: stagger
  END TYPE VARMETA

  TYPE :: ARPSVARS            ! All of ARPS variables are defined here
    TYPE(VARMETA) :: Time
    TYPE(VARMETA) :: x_stag, y_stag, z_stag, zp, zpsoil      ! grdout = 1
    TYPE(VARMETA) :: ubar, vbar, wbar, ptbar, pbar, qvbar    ! grdbas = 1
    TYPE(VARMETA) :: soiltyp, stypfrct,vegtyp,lai,roufns,veg ! landout= 1
    TYPE(VARMETA) ::    u,    v,    w,    pt, p    ! totout = 1, varout = 1
    TYPE(VARMETA) :: uprt, vprt, wprt, ptprt, pprt ! totout = 0, varout = 1
    TYPE(VARMETA) :: qvprt,qv, qc, qr                        ! mstout = 1
    TYPE(VARMETA) :: qi, qs, qh                              ! iceout = 1
    TYPE(VARMETA) :: prcrate1, prcrate2, prcrate3, prcrate4  ! prcout = 1
    TYPE(VARMETA) :: raing, rainc
    TYPE(VARMETA) :: tke                                     ! tkeout = 1
    TYPE(VARMETA) :: kmh, kmv                                ! trbout = 1
    TYPE(VARMETA) :: tsoil, qsoil, wetcanp, snowdpth         ! sfcout = 1
    TYPE(VARMETA) :: radfrc, radsw, rnflx, radswnet, radlwin ! radflg = 1
    TYPE(VARMETA) :: usflx, vsflx, ptsflx, qvsflx            ! flxflg = 1
  END TYPE ARPSVARS

  TYPE TRNVARS
    TYPE(VARMETA) :: hterrain
  END TYPE TRNVARS

  TYPE SFCVARS
    TYPE(VARMETA) :: soiltyp
    TYPE(VARMETA) :: stypfrct
    TYPE(VARMETA) :: vegtyp
    TYPE(VARMETA) :: lai
    TYPE(VARMETA) :: roufns
    TYPE(VARMETA) :: veg
    TYPE(VARMETA) :: ndvi
  END TYPE SFCVARS

  TYPE SOILVARS
    TYPE(VARMETA) :: zpsoil
    TYPE(VARMETA) :: tsoil
    TYPE(VARMETA) :: qsoil
    TYPE(VARMETA) :: wetcanp
    TYPE(VARMETA) :: snowdpth
    TYPE(VARMETA) :: soiltyp
  END TYPE SOILVARS

  TYPE BDYVARS
    TYPE(VARMETA) :: ctime
    TYPE(VARMETA) :: u, v, w, pt, p
    TYPE(VARMETA) :: qv, qc, qr, qi, qs, qh
  END TYPE BDYVARS

!-----------------------------------------------------------------------
!
! Define meta variables
!
!-----------------------------------------------------------------------

  TYPE (ARPSVARS)  :: arpsmeta
  TYPE (TRNVARS)   :: trnmeta
  TYPE (SFCVARS)   :: sfcmeta
  TYPE (SOILVARS)  :: soilmeta
  TYPE (BDYVARS)   :: bdymeta

CONTAINS


  SUBROUTINE init_varmeta 1

!#######################################################################
!
! Assign values to all defined variables
!
! Note: It should NOT be called outside of this module.
!
!#######################################################################
!
    IMPLICIT NONE
  
!----------------------------------------------------------------------
! 
! ARPS history variables
!
!----------------------------------------------------------------------

    arpsmeta%x_stag = VARMETA('projection_x_coordinate',                &
                                                 'X coordinate','m','X')
    arpsmeta%y_stag = VARMETA('projection_y_coordinate',                &
                                                 'Y coordinate','m','Y')
    arpsmeta%z_stag = VARMETA('height',                                 &
                                                 'Z coordinate','m','Z')
    arpsmeta%zp     = VARMETA('geopotential_height',                    &
                             'Physical height coordinate (MSL)','m','Z')
    arpsmeta%zpsoil = VARMETA('geopotential_height',                    &
          'Physical height coordinate (soil), meters above msl','m',' ')

    arpsmeta%ubar  = VARMETA('base_x_wind',                             &
                                    'Base state u-velocity','m s-1','X') !!
    arpsmeta%vbar  = VARMETA('base_y_wind',                             &
                                    'Base state v-velocity','m s-1','Y') !!
    arpsmeta%wbar  = VARMETA('base_upward_air_velocity',                &
                                    'Base state w-velocity','m s-1','Z') !!
    arpsmeta%ptbar = VARMETA('base_air_potential_temperature',          &
                           'Base state potential temperature','K',  ' ') !!
    arpsmeta%pbar  = VARMETA('base_air_pressure',                       &
                                        'Base state pressure','Pa', ' ') !!
    arpsmeta%qvbar = VARMETA('base_specific_humidity',                  &
                     'Base state water vapor specific humidity','1',' ') !!

    arpsmeta%soiltyp  = VARMETA('soil_category',                        &
                                          'Soil type',      'index',' ') !!
    arpsmeta%stypfrct = VARMETA('soil_fraction',                        &
                                'Soil type fractional coverage','1',' ') !!
    arpsmeta%vegtyp   = VARMETA('vegetation_category',                  &
                                          'Vegetation type','index',' ') !!
    arpsmeta%lai      = VARMETA('leaf_area_index',                      &
                                            'Leaf Area Index',  '1',' ')
    arpsmeta%roufns   = VARMETA('surface_roughness_length',             &
                                            'Surface roughness','m',' ')
    arpsmeta%veg      = VARMETA('vegetation_area_fraction',             &
                                          'Vegetation fraction','1',' ')

    arpsmeta%Time  = VARMETA('time','Data valid time','s',' ')

    arpsmeta%uprt  = VARMETA('perturbation_x_wind',                     &
                                  'Perturbation u-velocity','m s-1','X') !!
    arpsmeta%vprt  = VARMETA('perturbation_y_wind',                     &
                                  'Perturbation u-velocity','m s-1','Y') !!
    arpsmeta%wprt  = VARMETA('perturbation_upward_air_velocity',        &
                                  'Perturbation w-velocity','m s-1','Z') !!
    arpsmeta%ptprt = VARMETA('perturbation_air_potential_temperature',  &
                           'Perturbation potential temperature','K',' ') !!
    arpsmeta%pprt  = VARMETA('perturbation_air_pressure',               &
                                       'Perturbation pressure','Pa',' ') !!
    arpsmeta%qvprt = VARMETA('perturbation_specific_humidity',          &
                   'Perturbation water vapor specific humidity','1',' ') !!

    arpsmeta%u  = VARMETA('x_wind',                                     &
                                               'U-velocity','m s-1','X')
    arpsmeta%v  = VARMETA('y_wind',                                     &
                                               'V-velocity','m s-1','Y')
    arpsmeta%w  = VARMETA('upward_air_velocity',                        &
                                               'W-velocity','m s-1','Z')
    arpsmeta%pt = VARMETA('air_potential_temperature',                  &
                                        'Potential temperature','K',' ')
    arpsmeta%p  = VARMETA('air_pressure',                               &
                                                    'Pressure','Pa',' ')

    arpsmeta%qv = VARMETA('specific_humidity',                          &
                                'Water vapor specific humidity','1',' ') 
    arpsmeta%qc = VARMETA('mass_fraction_of_cloud_liquid_water_in_air', &
                                     'Cloud water mixing ratio','1',' ')
    arpsmeta%qr = VARMETA('mass_fraction_of_rain_water_in_air',         &
                                      'Rain water mixing ratio','1',' ') !!
    arpsmeta%qi = VARMETA('mass_fraction_of_cloud_ice_in_air',          &
                                       'Cloud ice mixing ratio','1',' ')
    arpsmeta%qs = VARMETA('mass_fraction_of_cloud_snow_water_in_air',   &
                                            'Snow mixing ratio','1',' ') !!
    arpsmeta%qh = VARMETA('mass_fraction_of_cloud_graupel_water_in_air',&
                                            'Hail mixing ratio','1',' ') !!

    arpsmeta%prcrate1 = VARMETA('lwe_large_scale_precipitation_rate',   &
                            'Grid scale precipitation rate','m s-1',' ')
    arpsmeta%prcrate2 = VARMETA('lwe_convective_precipitation_rate',    &
                               'Cumulus precipitation rate','m s-1',' ')
    arpsmeta%prcrate3 = VARMETA('lwe_microphysics_precipitation_rate',  &
                          'Microphysics precipitation rate','m s-1',' ') !!
    arpsmeta%prcrate4 = VARMETA('lwe_precipitation_rate',               &
                                 'Total precipitation rate','m s-1',' ')

    arpsmeta%raing = VARMETA('thickness_of_large_scale_rainfall_amount',&
                                   'Grid supersaturation rain','mm',' ')  !
    arpsmeta%rainc = VARMETA('thickness_of_convective_rainfall_amount', &
                                     'Cumulus convective rain','mm',' ')  !

    arpsmeta%tke = VARMETA('turbulent_kinetic_energy',                  &
                                'Turbulent Kinetic Energy','m2 s-2',' ') !!
    arpsmeta%kmh = VARMETA('turbulent_mixing_coefficient_for_horizontal_momentum', &
                   'Hori. turb. mixing coef. for momentum','m2 s-1',' ') !!
    arpsmeta%kmv = VARMETA('turbulent_mixing_coefficient_for_vertical_momentum', &
                   'Vert. turb. mixing coef. for momentum','m2 s-1',' ') !!

    arpsmeta%tsoil   = VARMETA('soil_temperature',                      &
                                             'Soil temperature','K',' ')
    arpsmeta%qsoil   = VARMETA('soil_moisture_content',                 &
                                           'Soil moisture','kg m-2',' ')
    arpsmeta%wetcanp = VARMETA('canopy_water_amount',                   &
                                     'Canopy water amount','kg m-2',' ')
    arpsmeta%snowdpth= VARMETA('surface_snow_thickness',                &
                                                   'Snow depth','m',' ')

    arpsmeta%radfrc   = VARMETA('radiation_forcing',                    &
                                          'Radiation forcing','K/s',' ') !!
    arpsmeta%radsw    = VARMETA('surface_downwelling_shortwave_flux_in_air', &
                     'Solar radiation reaching the surface','W m-2',' ')
    arpsmeta%rnflx    = VARMETA('surface_net_downward_longwave_flux',   &
                   'Net radiation flux absorbed by surface','W m-2',' ') !
    arpsmeta%radswnet = VARMETA('surface_net_downward_shortwave_flux',  &
                                      'Net solar radiation','W m-2',' ') !
    arpsmeta%radlwin  = VARMETA('surface_downwelling_longwave_flux_in_air',&
                              'Incoming longwave radiation','W m-2',' ') !

    arpsmeta%usflx  = VARMETA('surface_u_momentum_flux',                &
                          'Surface flux of u-momentum','kg m-1 s-2',' ') !!
    arpsmeta%vsflx  = VARMETA('surface_v_momentum_flux',                &
                          'Surface flux of v-momentum','kg m-1 s-2',' ') !!
    arpsmeta%ptsflx = VARMETA('surface_downward_sensible_heat_flux',    &
                                 'Surface heat flux','K kg m-1 s-2',' ') !
    arpsmeta%qvsflx = VARMETA('surface_downward_water_flux',            &
                               'Surface moisture flux','kg m-2 s-1',' ') !

!----------------------------------------------------------------------
! 
! ARPS terrain variables
!
!----------------------------------------------------------------------
    trnmeta%hterrain = VARMETA('geopotential_height',                   &
                                               'Terrain height','m',' ') !

!----------------------------------------------------------------------
! 
! ARPS surface variables
!
!----------------------------------------------------------------------

    sfcmeta%soiltyp  = arpsmeta%soiltyp
    sfcmeta%stypfrct = arpsmeta%stypfrct
    sfcmeta%vegtyp   = arpsmeta%vegtyp
    sfcmeta%lai      = arpsmeta%lai
    sfcmeta%roufns   = arpsmeta%roufns
    sfcmeta%veg      = arpsmeta%veg
    sfcmeta%ndvi     = VARMETA('ndvi',                                  &
                     'Normalized differential vegetation index','1',' ') !!

!----------------------------------------------------------------------
! 
! ARPS soil variables
!
!----------------------------------------------------------------------

    soilmeta%zpsoil   = arpsmeta%zpsoil
    soilmeta%tsoil    = arpsmeta%tsoil
    soilmeta%qsoil    = arpsmeta%qsoil
    soilmeta%wetcanp  = arpsmeta%wetcanp
    soilmeta%snowdpth = arpsmeta%snowdpth
    soilmeta%soiltyp  = arpsmeta%soiltyp
    
!----------------------------------------------------------------------
! 
! ARPS lateral boundary variables
!
!----------------------------------------------------------------------

    bdymeta%ctime = VARMETA('ctime',                                    &
                                'Data valid time','YYYYMMDD.HHMMSS',' ') !!
    bdymeta%u     = arpsmeta%u
    bdymeta%v     = arpsmeta%v
    bdymeta%w     = arpsmeta%w
    bdymeta%pt    = arpsmeta%pt
    bdymeta%p     = arpsmeta%p
    bdymeta%qv    = arpsmeta%qv
    bdymeta%qc    = arpsmeta%qc
    bdymeta%qr    = arpsmeta%qr
    bdymeta%qi    = arpsmeta%qi
    bdymeta%qs    = arpsmeta%qs
    bdymeta%qh    = arpsmeta%qh

    RETURN
  END SUBROUTINE init_varmeta
!
!##################################################################
!##################################################################
!######                                                      ######
!######            SUBROUTINE netwrt_general_att             ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

  SUBROUTINE netwrt_general_att(ncid,packed,title,nx,ny,dx,dy,mapproj,  & 5,7
                                sclfct,trulat1,trulat2,trulon,          &
                                ctrlat,ctrlon,istatus)

!-----------------------------------------------------------------------
!
! PURPOSE:
!
!    Write general global attributes to ARPS data file
!
! Note: It will be called outside of this module. So keep the interface
!       unchanged as long as possilbe.
!
!-----------------------------------------------------------------------
    IMPLICIT NONE
    INTEGER,          INTENT(IN)  :: ncid
    CHARACTER(LEN=*), INTENT(IN)  :: title
    INTEGER,          INTENT(IN)  :: packed
    INTEGER,          INTENT(IN)  :: nx, ny    ! global domain size
    REAL,             INTENT(IN)  :: dx, dy
    INTEGER,          INTENT(IN)  :: mapproj
    REAL,             INTENT(IN)  :: sclfct
    REAL,             INTENT(IN)  :: trulat1, trulat2, trulon
    REAL,             INTENT(IN)  :: ctrlat, ctrlon
    INTEGER,          INTENT(OUT) :: istatus
  
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------

    CHARACTER(LEN=80) :: tmpstr,  history
    CHARACTER(LEN=10) :: datestr, timestr, zonestr

    CHARACTER(LEN=17), PARAMETER :: fmtstr = '005.10 NetCDF 3.0'
   
    INTEGER           :: lenstr

    INTEGER           :: iproj_orig
    REAL              :: scale_orig
    REAL              :: latnot_orig(2),trlon_orig
    REAL              :: x0_orig,y0_orig

    REAL              :: trulats(2)
    REAL              :: xctr, yctr, x0,y0
    REAL              :: xno, yno, offeast, offnorth

    INCLUDE 'netcdf.inc'

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Begining of executable code ....
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

    CALL init_varmeta

!-----------------------------------------------------------------------
!
! Define global attributes
!
!-----------------------------------------------------------------------

    istatus = NF_PUT_ATT_TEXT(ncid,NF_GLOBAL,'Conventions',9,'ARPS/ADAS')
                                           ! For Lead IDV visualization

    lenstr  = LEN_TRIM(title)
    istatus = NF_PUT_ATT_TEXT(ncid,NF_GLOBAL,'Title',lenstr,title)

    CALL DATE_AND_TIME(datestr,timestr,zonestr)
    WRITE(tmpstr,'(13a)') datestr(1:4),'-',datestr(5:6),'-',            &
                          datestr(7:8),'_',timestr(1:2),':',            &
                          timestr(3:4),':',timestr(5:10),' ',           &
                          zonestr(1:3)
    WRITE(history,'(2a)')  'Created from ARPS NetCDF API at ', TRIM(tmpstr)
    lenstr  = LEN_TRIM(history)
    istatus = NF_PUT_ATT_TEXT(ncid,NF_GLOBAL,'History',lenstr,history)

    lenstr  = LEN_TRIM(fmtstr)
    istatus = NF_PUT_ATT_TEXT(ncid,NF_GLOBAL,'FMTVER',lenstr,fmtstr)

    istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'PACKED',NF_INT,1,packed)

    istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'DX',NF_FLOAT,1,dx)
    istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'DY',NF_FLOAT,1,dy)

    !
    ! Map projection
    !
  
    SELECT CASE (mapproj)
    CASE (0)
      WRITE(tmpstr,'(a)') 'no_mapping'
    CASE (1,-1)
      WRITE(tmpstr,'(a)') 'polar_stereographic'
    CASE (2,-2)
      WRITE(tmpstr,'(a)') 'lambert_conformal_conic'
    CASE (3,-3)
      WRITE(tmpstr,'(a)') 'mercator'
    CASE (4)
      WRITE(tmpstr,'(a)') 'lat_lon_projection'
    CASE (5)
      WRITE(tmpstr,'(a)') 'flat_earth_projection'
    CASE DEFAULT
      WRITE(tmpstr,'(a)') 'unknown_map_projection'
    END SELECT

    lenstr  = LEN_TRIM(tmpstr)
    istatus = NF_PUT_ATT_TEXT(ncid,NF_GLOBAL,'grid_mapping_name',lenstr,tmpstr)

    istatus = NF_PUT_ATT_INT (ncid,NF_GLOBAL,'MAPPROJ',   NF_INT,  1,mapproj)
    istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'SCLFCT',    NF_FLOAT,1,sclfct)
    istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT1',  NF_FLOAT,1,trulat1)
    istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'TRUELAT2',  NF_FLOAT,1,trulat2)
    istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'TRUELON',   NF_FLOAT,1,trulon)
    istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'CTRLAT',    NF_FLOAT,1,ctrlat)
    istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'CTRLON',    NF_FLOAT,1,ctrlon)

    !-------------------------------------------------------------------
    !
    ! Used only by IDV
    ! 
    !-------------------------------------------------------------------
    !
    ! save original map projection
    !
    CALL getmapr(iproj_orig,scale_orig,latnot_orig,                     &
                 trlon_orig,x0_orig,y0_orig)

    !
    ! set ARPS map projection
    !
    trulats(1) = trulat1
    trulats(2) = trulat2
    CALL setmapr(mapproj,sclfct,trulats,trulon)
    CALL lltoxy(1,1,ctrlat,ctrlon,xctr,yctr)
    x0 = xctr - 0.5*(nx-3)*dx
    y0 = yctr - 0.5*(ny-3)*dy

    CALL lltoxy(1,1,trulat1,trulon,xno,yno)
    offeast  = xno - x0      ! false easting
    offnorth = yno - y0      ! false northing

    !
    ! Restore orginal map projection
    !
    CALL setmapr(iproj_orig,scale_orig,latnot_orig,trlon_orig)
    CALL setorig(1,x0_orig,y0_orig)

    istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'latitude_of_projection_origin', &
                              NF_FLOAT,1,trulat1)
    istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'longitude_of_central_meridian', &
                              NF_FLOAT,1,trulon)
    istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'standard_parallel',             &
                              NF_FLOAT,2,trulats)
    istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'false_easting',                 &
                              NF_FLOAT,1,offeast)
    istatus = NF_PUT_ATT_REAL(ncid,NF_GLOBAL,'false_northing',                &
                              NF_FLOAT,1,offnorth)

    RETURN
  END SUBROUTINE netwrt_general_att
!
!##################################################################
!##################################################################
!######                                                      ######
!######            SUBROUTINE net_define_var_meta            ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

  SUBROUTINE net_define_var_meta(ncid,varid,vartype,vmeta) 83
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
!   Write ARPS variable meta data (NetCDF variable attributes)
!  
! Note: It will be called outside of this module. So keep the interface
!       unchanged as long as possilbe.
!
!-----------------------------------------------------------------------
  
    IMPLICIT NONE
  
    INTEGER,          INTENT(IN) :: ncid
    INTEGER,          INTENT(IN) :: varid
    CHARACTER(LEN=*), INTENT(IN) :: vartype
    TYPE(VARMETA),    INTENT(IN) :: vmeta
  
!-----------------------------------------------------------------------
!
! Include file
!
!-----------------------------------------------------------------------
  
    INCLUDE 'netcdf.inc'
  
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
  
    INTEGER :: lenstr, istatus
  
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code ... ...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  
    lenstr = LEN_TRIM(vmeta%standard_name)
    istatus = NF_PUT_ATT_TEXT(ncid,varid,'standard_name',lenstr,vmeta%standard_name)
  
    lenstr = LEN_TRIM(vmeta%long_name)
    istatus = NF_PUT_ATT_TEXT(ncid,varid,'long_name',lenstr,vmeta%long_name)
  
    lenstr = LEN_TRIM(vmeta%units)
    istatus = NF_PUT_ATT_TEXT(ncid,varid,'units',lenstr,vmeta%units)
  
    istatus = NF_PUT_ATT_TEXT(ncid,varid,'stagger',1,vmeta%stagger)
  
    IF ( TRIM(vartype) == 'INT' ) THEN
      istatus = NF_PUT_ATT_INT (ncid,varid,'_FillValue',NF_INT,1,0)
    END IF

  !  IF ( TRIM(vartype) == 'INT' ) THEN
  !    istatus = NF_PUT_ATT_INT (ncid,varid,'scale_factor',NF_INT,1,1)
  !    istatus = NF_PUT_ATT_INT (ncid,varid,'add_offset',NF_INT,1,0)
  !  ELSE
  !    istatus = NF_PUT_ATT_REAL (ncid,varid,'scale_factor',NF_INT,1,1.0)
  !    istatus = NF_PUT_ATT_REAL (ncid,varid,'add_offset',NF_INT,1,0.0)
  !  END IF
  
    RETURN
  END SUBROUTINE net_define_var_meta

END MODULE arps_netio_metadata