set(autostart ${PLUGIN_COBALT_AUTOSTART})
set(preconditions Platform Graphics Internet)

if(PLUGIN_COBALT_PERSISTENTPATHPOSTFIX)
  set(persistentpathpostfix ${PLUGIN_COBALT_PERSISTENTPATHPOSTFIX})
endif()

map()
    kv(mode ${PLUGIN_COBALT_MODE})
    kv(locator lib${PLUGIN_COBALT_IMPLEMENTATION}.so)
    if(PLUGIN_COBALT_USER)
        kv(user ${PLUGIN_COBALT_USER})
    endif()
    if(PLUGIN_COBALT_GROUP)
        kv(group ${PLUGIN_COBALT_GROUP})
    endif()
end()
ans(rootobject)

map()
    kv(url "https://www.youtube.com/tv")
    if(PLUGIN_COBALT_CLIENTIDENTIFIER)
        kv(clientidentifier ${PLUGIN_COBALT_CLIENTIDENTIFIER})
    endif()
    if(PLUGIN_COBALT_LANGUAGE)
        kv(language ${PLUGIN_COBALT_LANGUAGE})
    endif()
    if(PLUGIN_COBALT_CONTENT_DIR)
        kv(contentdir ${PLUGIN_COBALT_CONTENT_DIR})
    endif()
    if(PLUGIN_COBALT_ESSOS_CONTEXT_DESTROY)
        kv(essoscontextdestroy ${PLUGIN_COBALT_ESSOS_CONTEXT_DESTROY})
    endif()
    if(PLUGIN_COBALT_PRELOAD)
        kv(preload ${PLUGIN_COBALT_PRELOAD})
    endif()
    if(PLUGIN_COBALT_CLOSUREPOLICY)
        kv(closurepolicy ${PLUGIN_COBALT_CLOSUREPOLICY})
    endif()
end()
ans(configuration)

map()
    if(PLUGIN_COBALT_PROP_MODELNAME)
        kv(modelname "${PLUGIN_COBALT_PROP_MODELNAME}")
    endif()
    if(PLUGIN_COBALT_PROP_BRANDNAME)
        kv(brandname "${PLUGIN_COBALT_PROP_BRANDNAME}")
    endif()
    if(PLUGIN_COBALT_PROP_MODELYEAR)
        kv(modelyear "${PLUGIN_COBALT_PROP_MODELYEAR}")
    endif()
    if(PLUGIN_COBALT_PROP_CHIPSETMODELNUMBER)
        kv(chipsetmodelnumber "${PLUGIN_COBALT_PROP_CHIPSETMODELNUMBER}")
    endif()
    if(PLUGIN_COBALT_PROP_FIRMWAREVERSION)
        kv(firmwareversion "${PLUGIN_COBALT_PROP_FIRMWAREVERSION}")
    endif()
    if(PLUGIN_COBALT_PROP_INTEGRATORNAME)
        kv(integratorname "${PLUGIN_COBALT_PROP_INTEGRATORNAME}")
    endif()
    if(PLUGIN_COBALT_PROP_FRIENDLYNAME)
        kv(friendlyname "${PLUGIN_COBALT_PROP_FRIENDLYNAME}")
    endif()
    if(PLUGIN_COBALT_PROP_DEVICETYPE)
        kv(devicetype "${PLUGIN_COBALT_PROP_DEVICETYPE}")
    endif()
end()
ans(systemproperties)

map_isempty(${systemproperties})
ans(systemproperties_isempty)
if (NOT systemproperties_isempty)
  map_append(${configuration} systemproperties ${systemproperties})
endif()

map_append(${configuration} root ${rootobject})
