Hace un par de años (finales de 2022) me planteé realizar un proyecto de fotografía que necesitaba de una planificación previa muy precisa si quería obtener los resultados que esperaba.
El proyecto no era otro que hacer un «timelapse» (es decir, un vídeo acelerado compuesto de fotografías capturadas periódicamente de un objeto en movimiento).
Ya había realizado algunos vídeos de este tipo en observaciones astronómicas como éste (de hace 10 años) del paso de la Luna llena tras las 4 Torres de Madrid (¡Ahora ya son 5 las Torres!):
La planificación de este tipo de vídeo no era complicada pues el movimiento de la Luna es fácil de prever (mientras el Señor Newton siga al mando). La ubicación de la cámara ya es harina de otro costal. Pero ya os expliqué hace años cómo se hacen.
En mi nuevo proyecto la ubicación de la cámara no planteaba ningún problema de cálculo. Pero elegir el momento de captura de las fotos no era sencillo.
Llegados a este punto me doy cuenta de que todavía no os he dicho qué objeto en movimiento quería capturar.

Mi objetivo era realizar una captura del movimiento de la que puede ser una de las mayores estructuras móviles de la Comunidad de Madrid: La antena de 70 metros de diámetro DSS-63 de la Estación de Espacio Profundo de NASA en Robledo de Chavela.
Primer paso
El proyecto estaba claro. Había que definir ahora los pasos para realizarlo.
Lo primero era elegir el momento adecuado.
Mis requisitos: Quería captar un movimiento largo de la antena. No quería grabar la antena durante el tracking (seguimiento) de alguna de las sondas que recorren el sistema solar.
Durante el tracking la antena se mueve muy despacio ya que apunta constantemente a la sonda para tener la máxima ganancia en la señal recibida.
El movimiento más rápido de la antena se produce cuando la antena deja de seguir a una sonda para ir a la siguiente según un plan preestablecido de observaciones. En ese momento del proyecto yo no sabía cómo se iba a mover la antena (si iba de una sonda a otra, si pasaba por la posición de reposo, etc.).
Así que necesitaba conocer la planificación de observaciones y seguimientos de la antena DSS-63.
Segundo paso
Necesitaba saber el cronograma de seguimiento de la antena en cuestión.
Imaginaba que debía existir ese documento con meses de antelación. Lo que no sabía es si era público o confidencial.
Así que hice lo que cualquiera puede hacer en internet: buscar en google.
Mi primera búsqueda «schedule dss63 nasa» me llevó a una página prometedora:

Pero al pulsar en el enlace: ¡Vaya!

Utilizando las herramientas de desarrolladores del navegador veo que la página carga en un iframe cuyo título es 7 day Schedule que apunta a un fichero que no existe /auto/sched/fichero_web.html.
https://www.mdscc.nasa.gov/auto/sched/fichero_web.html
Mi gozo en un pozo.
Seguí buscando varios minutos sin éxito.
Entre mis búsquedas incluí las otras dos estaciones de la red DSN: Canberra y Goldstone.
Y si bien la de Goldstone no informaba del cronograma, la de Canberra sí lo hacía. De hecho puedes verlo en esta página.
La idea de viajar a Australia pera llevar a cabo mi proyecto me resultaba muy, muy atractiva. Pero no creo que me hubieran autorizado en casa…
Había que buscar una alternativa más sencilla y, por supuesto, más económica.
Tercer paso
Por algún motivo oscuro que se me escapaba, las estaciones de Espacio Profundo de NASA de Madrid y Goldstone no publicaban con antelación su cronograma de observación.
Pero sí publican en tiempo real dónde está apuntando cada una de sus antenas.
La NASA pone a disposición de los espaciotrastornados el servicio DSN Now!

Con un interfaz gráfico muy atractivo muestra en tiempo real qué está captando cada una de las antenas de la Red de Espacio Profundo.
De un vistazo puedes ver a qué sonda apunta cada antena, si está recibiendo, transmitiendo o ambas cosas a la vez y si pulsas sobre una de ellas es donde empieza lo interesante (lo interesante porque es lo que estamos buscando).

Además de diversos datos técnicos podemos ver los dos datos que nos van a servir para conocer dónde apunta la antena en el cielo (y si sabemos dónde apunta en cada instante de tiempo podremos saber cómo se mueve).
Esos dos datos son el azimuth y la elevación. Si no sabes qué son esos datos puedes leer la entrada de la Wikipedia dedicada al sistema de coordenadas horizontales.

Resumiendo: son dos coordenadas que indican una dirección en la esfera celeste. Una, la elevación, es el ángulo que hay que desplazarse desde el horizonte hasta el objeto en cuestión. La otra, el azimuth, es el ángulo (en el sentido de las agujas del reloj) que hay que desplazarse desde la dirección al Norte hasta el objeto.
Tener un histórico de los datos de apuntamiento de la antena me permitiría analizar y buscar patrones en los mismos y, con suerte, poder predecir el cronograma de seguimiento para poder elegir el momento de realizar mis fotografías.
Cuarto paso
Ya sabemos que de algún modo tenemos en esa página los datos de azimuth y elevación de cada antena en un momento dado.
Podíamos verlo en la página https://eyes.nasa.gov/apps/dsn-now/dsn.html. Esa dirección web (que se denomina URL) es una página estática. Quiero decir con eso que no se refresca (la indicación de que es estática nos la da la extensión del archivo (no entraré en detalles). Un archivo con extensión html (el valor a la derecha del punto en la URL) suele ser un archivo fijo que no cambia su contenido.
Tiene que haber «algo» en ese archivo que actualice los valores porque, si te fijas durante un rato, cambian los datos de azimuth y elevación y (el resto de la información).
Nos va a tocar analizar el código de la página. Pero no te asustes lo vamos a ver sin tener que saber el lenguaje con el que se escriben las páginas web (html, javascript, etc.).
Para ello vamos a usar el propio navegador o browser con el que navegamos por internet. Y dado que es el navegador Chrome (el de Google) el más utilizado os diré cómo verlo con él.

Usaremos un navegador Chrome para visitar (y analizar) la página web de Deep Space Network NOW!

Pulsamos en los tres puntos verticales del menú (esquina superior derecha) y seleccionamos la opción Más herramientas/Herramientas para Desarrolladores

La ventana del navegador se divide en dos partes.
A la izquierda seguiremos viendo el contenido de la página web.
A la derecha nos aparecerán «cosas maravillosas» (Respuesta que dio el célebre egiptólogo Howard Carter ante la pregunta que le hizo Lord Carnarvon, su patrocinador en la búsqueda de la tumba de Tutankhamon, cuando el primero miró por un agujero que acababa de hacer en la puerta sellada de la tumba del faraón).
Para saber cómo se actualiza la página podríamos analizar el código javascript que se incluye en la página html.
Pero lo vamos a hacer más sencillo. Pensemos un poco en qué significa «actualizar los datos».
Si los datos que hay en la página cambian a lo largo del tiempo es porque se reciben actualizados desde el servidor web (esto puede parecer una perogrullada, lo sé). Las páginas web se reciben desde los servidores porque antes las hemos pedido o solicitado en el navegador. Es decir, ningún servidor web te manda datos si tú no se lo pides (realmente es el navegador el que los pide). Es como funciona el protocolo en el que se fundamenta el WWW (Que por cierto hay que dar gracias a la Física de partículas ya que ese protocolo se inventó en el CERN).
¿Lo tienes claro, no? Los datos de la página se actualizan porque la página los pide al servidor. Y si la página manda una petición al servidor dicha petición va como un paquete de datos hacia el servidor a través de la red (wifi, ethernet, fibra…)
Dicho esto vamos a ver qué cosas ha pedido la página web al servidor. Para ello seleccionamos la pestaña Network en el menú de la parte derecha de la ventana del navegador.

Al seleccionar Network veremos las solicitudes que la página realiza

Fijaos en la tabla: Vemos que periódicamente se pide el archivo dsn.xml con un valor distinto de la variable r.
Los datos que nos interesan están en el archivo dsn.xml, es decir, que completando la URL nos queda en https://eyes.nasa.gov/apps/dsn-now/dsn.xml
Quinto paso
Seguro que ya has puesto esa dirección en el navegador (simplemente pulsa en el enlace que te he puesto)

¡A que mola!
Un precioso archivo XML que contiene información de las 3 Estaciones de la Red de Espacio Profundo de NASA con datos instantáneos de cada una de las antenas.
En particular si nos centramos en los datos de la antena que nos interesa: DSS63:
<dish name="DSS63" azimuthAngle="255" elevationAngle="56" windSpeed="2" isMSPA="true" isArray="false" isDDOR="false">
<downSignal signalType="active" dataRate="1.163e+01" frequency="" band="X" power="-1.6e+02" spacecraft="MVN" spacecraftID="-202"/>
<downSignal signalType="inactive" dataRate="4.000e+06" frequency="" band="X" power="-1.5e+02" spacecraft="MRO" spacecraftID="-74"/>
<upSignal signalType="active" dataRate="7.813e+00" frequency="" band="C" power="4.4e+00" spacecraft="MVN" spacecraftID="-202"/>
<target name="MVN" id="202" uplegRange="2.25e+08" downlegRange="2.25e+08" rtlt="1498.081"/>
<target name="MRO" id="74" uplegRange="2.25e+08" downlegRange="2.25e+08" rtlt="1498.094"/>
</dish>
Con esta información podemos ya plantearnos recogerla para almacenarla en una base de datos.
Así que prepárate porque ahora sí vamos a programar.
Vamos a hacer un software que descargue ese archivo, analice el contenido, extraiga los datos que nos interesan, se almacenen en una «base de datos» y que sea accesible para todo el mundo. Además no será necesario tener encendido el PC en casa ya que TODO se encontrará en la nube de Google..
Sexto paso
Para realizar el proyecto vamos a utilizar herramientas que nos ofrece Google de modo gratuito (si por gratuito entiendes que no te cuestan dinero y solo pierdes privacidad).
Si has llegado hasta este punto creo que no será necesario que baje mucho a detallar el procedimiento de acceso a las herramientas de Google. Voy a suponer que te has movido ya por ellas y sabes crear una hoja de cálculo.
Usaremos una hoja de cálculo como una base de datos. Evidentemente no es lo mismo pero Google Sheets es gratis y para crear una Base de datos necesitas un plan de pago. Y seamos sinceros, no nos gusta pagar por usar servicios de la red.
Así que vamos a acceder a nuestro Google Drive y vamos a crear una hoja de cálculo a través de la herramienta Google Sheets.

En la primera fila de la hoja de cálculo vamos a insertar los campos que vamos a extraer del xml de NASA. De momento nos vale con los siguientes:
| Campo | Descripción | Elemento XML | Atributo XML |
| timestamp | Marca de tiempo de los datos | timestamp | |
| target | Sonda a la que apunta la antena | dish | spacecraft |
| azimuth | Ángulo de azimuth de la antena | dish | azimuthAngle |
| elevation | Ángulo de Elevación de la antena | dish | elevationAngle |
Le he puesto el nombre de «NASA Eyes» y he eliminado las filas y columnas que no vamos a necesitar (Sí, es una manía).

Ya tenemos la estructura de lo que va a ser nuestra Base de Datos. Ahora tenemos que ponernos a programar el software que va a recoger los datos de NASA e insertarlos en la hoja de cálculo.
Séptimo paso
Google nos ofrece un lenguaje de programación para poder hacer funciones y otras virguerías: el App Script.
Para entrar en el editor desde la propia hoja de cálculo vamos a la opción de menú Extensiones\App Script

En la nueva pestaña crearemos el código necesario

Os dejo aquí el código para que lo peguéis (el nombre de la función (executeCronJob) es anecdótico. Puedes poner lo que quieras.
function executeCronJob() {
// DEFINICION VARIABLES
const url = "https://eyes.nasa.gov/dsn/data/dsn.xml";
const dish_target = "DSS63";
// DESCARGA EL OBJETO XML DE NASA Now
const options = {
headers: {
'Content-Type': 'application/xml'
},
method: 'GET'
}
const response = UrlFetchApp.fetch(url, options);
//console.log(response.toString());
// PARSEAR XML
const xmlDoc = XmlService.parse(response);
// OBJETO RAIZ XML
const root = xmlDoc.getRootElement();
// NODO TIMESTAMP
const children = root.getChildren('timestamp');
fetch_timestamp = parseInt(children[0].getText());
var timestamp = new Date(fetch_timestamp);
//
var sheet_dish = SpreadsheetApp.getActive().getSheetByName(dish_target);
var sheet_signals = SpreadsheetApp.getActive().getSheetByName(dish_target+"_Signals");
// SELECCIONA NODOS 'dish'
const dishes = root.getChildren('dish');
dishes.forEach(dish => {
// GUARDA SOLO LA DSS63
if (dish.getAttribute('name').getValue() == dish_target) {
console.log(XmlService.getPrettyFormat().format(dish));
// ANGULOS APUNTAMIENTO
azimuth = dish.getAttribute('azimuthAngle').getValue();
elevation = dish.getAttribute('elevationAngle').getValue();
// CONVERSION FORMATO INTERNACIONAL: '.' por ','
azimuth = azimuth.replace(/\./g, ",");
elevation = elevation.replace(/\./g, ",");
// SPACECRAFT
target = dish.getChildren("target")[0].getAttribute('name').getValue();
// AÑADE DATOS A LA HOJA DE CALCULO
console.log(timestamp, target, azimuth, elevation);
sheet_dish.appendRow([Utilities.formatDate(timestamp, 'GMT+0100', 'yyyy/MM/dd HH:mm:ss'), target, azimuth, elevation]);
// DOWNLINKS
const downSignals = dish.getChildren('downSignal');
downSignals.forEach(item => {
//console.log(XmlService.getPrettyFormat().format(item));
active = item.getAttribute('active').getValue();
signalType = item.getAttribute('signalType').getValue();
dataRate = Number(item.getAttribute('dataRate').getValue());
spacecraft = item.getAttribute('spacecraft').getValue();
// AÑADE DATOS A LA HOJA DE CALCULO
console.log(timestamp, spacecraft, "DownLink", signalType, dataRate);
sheet_signals.appendRow([Utilities.formatDate(timestamp, 'GMT+0100', 'yyyy/MM/dd HH:mm:ss'), spacecraft, "DownLink", signalType, dataRate]);
});
// UPLINKS
const upSignals = dish.getChildren('upSignal');
upSignals.forEach(item => {
//console.log(XmlService.getPrettyFormat().format(item));
active = item.getAttribute('active').getValue();
signalType = item.getAttribute('signalType').getValue();
dataRate = Number(item.getAttribute('dataRate').getValue());
spacecraft = item.getAttribute('spacecraft').getValue();
// AÑADE DATOS A LA HOJA DE CALCULO
console.log(timestamp, spacecraft, "UpLink", signalType, dataRate);
sheet_signals.appendRow([Utilities.formatDate(timestamp, 'GMT+0100', 'yyyy/MM/dd HH:mm:ss'), spacecraft, "UpLink", signalType, dataRate]);
});
}
});
SpreadsheetApp.flush();
}
Explicación código
El software creo que es bastante autoexplicativo (¡si hasta he puesto comentarios y nombres de variables relacionadas con su contenido!).
No obstante te dejo explicaciones adicionales por bloque de código:
Declaración variables
const url = "https://eyes.nasa.gov/dsn/data/dsn.xml";
const dish_target = "DSS63";
Se definen dos variables:
Descarga del archivo XML de NASA Now
const options = {
headers: {
'Content-Type': 'application/xml'
},
method: 'GET'
}
const response = UrlFetchApp.fetch(url, options);
Usaremos la clase UrlFetchApp para que nuestro software acceda a internet a descargar el archivo xml y lo almacene en la variable response.
Definimos el objeto headers con el método HTTP a utilizar (GET) y el tipo de objeto que vamos a descargar (application/xml).
Conversión archivo xml
const xmlDoc = XmlService.parse(response);
const root = xmlDoc.getRootElement();
Usaremos la función XmlService para cargar el archivo xml y poder ser analizado con los métodos que nos ofrece dicho servicio.
En el objeto root se carga el elemento raíz del archivo xml que nos permitirá un sencillo modo de acceso a los objetos «hijos».
Hora (timestamp) de los datos
const children = root.getChildren('timestamp');
fetch_timestamp = parseInt(children[0].getText());
var timestamp = new Date(fetch_timestamp);
Uno de los nodos hijos del documento xml es timestamp. El método getChildren() permite obtener una referencia a dicho objeto pasando la etiqueta deseada (timestamp). El método getText() aplicado al objeto nos devuelve el valor incluido en el elemento.
El valor obtenido (es un texto) se convierte a un objeto de tiempo lo que nos permitirá formatearlo adecuadamente para la Base de Datos.
Acceso a la hoja de cálculo para almacenamiento de los datos
var sheet_dish=SpreadsheetApp.getActive().getSheetByName(dish_target);
var sheet_signals=SpreadsheetApp.getActive().getSheetByName(dish_target+"_Signals");
[...]
SpreadsheetApp.flush();
Se preparan los objetos asociados a las dos pestañas de la hoja de cálculo:
He decidido separar en dos pestañas los datos pero se pueden relacionar con la clave timestamp.
Acabamos con una invocación al método flush() para asegurarnos que se vacían los bufferes de escritura en la Hoja de Cálculo.
Obtención del nodo de la antena DSS63
const dishes = root.getChildren('dish');
dishes.forEach(dish => {
// GUARDA SOLO LA DSS63
if (dish.getAttribute('name').getValue() == dish_target) {
console.log(XmlService.getPrettyFormat().format(dish));
[ ... ]
}
}
Cargamos una referencia (dishes) a la colección de objetos dish que son hijos del elemento principal del archivo xml.
Nos movemos en la colección de objetos (.forEach()) hasta que encontramos el hijo cuyo atributo name es la antena que nos interesa (dish_target).
El método console.log() es el modo con el que los malos programadores como yo comprobamos que la cosa va funcionando. Aquí mostramos en consola el nodo hijo de la antena DSS63.
Obtención de nave y datos apuntamiento de antena
azimuth = dish.getAttribute('azimuthAngle').getValue();
elevation = dish.getAttribute('elevationAngle').getValue();
// CONVERSION FORMATO INTERNACIONAL: '.' por ','
azimuth = azimuth.replace(/\./g, ",");
elevation = elevation.replace(/\./g, ",");
target = dish.getChildren("target");
En la sección anterior nos movíamos por todos los nodos dish del documento hasta encontrar el que nos interesa. Una vez encontrado invocamos el método getAttribute() para obtener el valor con getValue() de los datos de apuntamiento de la antena.
Las dos siguientes líneas son un truco para que cuando almacenemos en la hoja de cálculo estos valores se queden correctamente (como una variable numérica y no de texto). Como sabes los americanos usan el «.» como separador decimal pero en España usamos la «,». Usamos el método replace() con una expresión regular /\./g para cambiar los puntos por comas (realmente valdría con /\./ pero soy muy global.
Las expresiones regulares son MARAVILLOSAS pero quedan fuera del objeto de esta entrada.
Por último obtenemos el nombre de la nave a la que apunta la antena.
Almacenamiento en la Hoja de Cálculo
sheet_dish.appendRow([Utilities.formatDate(timestamp, 'GMT+0100', 'yyyy/MM/dd HH:mm:ss'), target, azimuth, elevation]);
La escritura en la Hoja de cálculo se realiza con una simple invocación al método appendRow (Añadir fila) en la que pasamos los valores que se añaden en columnas consecutivas. Solo nos preocupamos de que la fecha y hora estén en el fomato que nos interese.
Obtención de datos de los enlaces de transmisión y recepción de la antena.
const downSignals = dish.getChildren('downSignal');
downSignals.forEach(item => {
active = item.getAttribute('active').getValue();
signalType = item.getAttribute('signalType').getValue();
dataRate = Number(item.getAttribute('dataRate').getValue());
spacecraft = item.getAttribute('spacecraft').getValue();
});
En una primera aproximación podrías pensar que la antena recibe en una frecuencia o transmite en otra. Pero no es así.
La antena recibe y concentra un espectro de frecuencias que mediante splitters (divisores) y LNB (amplificadores) puede recibir múltiples señales simultáneamente en la misma dirección.
Por eso dentro del nodo dish pueden aparecer más de uno de los nodos downLink y upLink. Y eso nos obliga a buscar mediante el método getChildren() una posible colección de enlaces.
De igual modo que en el caso de los nodos de antena vamos recorriendo la colección de enlaces y obtenemos los datos que queremos almacenar en la Hoja de Cálculo.:
En ambos casos (transmisión y recpeción) almacenamos los datos en la pestaña correspondiente de la Hoja de Cálculo.
Ejecución periódica del código
Ya tenemos la Hoja de Cálculo definida y el código preparado para ejecutarse. Solo nos falta que el programa se ejecute periódicamente para empezar a almacenar los datos.
En el menú de la izquierda del editor de Apps Script (hasta ahora hemos estado en el editor) vemos un icono de una especie de reloj o cronómetro. Pulsaremos en Añadir activador.

Se nos abrirá una ventana que rellenaremos como sigue

Como función a ejecutar nos ofrecerá las que hayamos definido en la Hoja de Cálculo. Como solo tenemos una, la cosa está clara. Os recuerdo que en mi caso yo nombré la función como executeCronJob.
El despliegue será el Principal. Puedes tener diversos despliegues en el servidor pero eso ya para cursos avanzados.
La fuente del evento será Según tiempo ya que queremos que se ejecute periódicamente.
Dado que queremos que se ejecute cada 5 minutos (tampoco hay que molestar demasiado y para lo que queremos nos basta con esa frecuencia) seleccionamos los valores adecuados.
El sistema nos ofrece la posibilidad de recibir notificaciones de los errores que se produzcan mediante un correo de frecuencia a elegir. Un correo a la semana es más que suficiente una vez depurado el código.
Guardar y… ¡A correr!
Podrás ver que en tu Hoja de Calculo van aumentando las filas con nuevos datos de apuntamiento de la antena y de naves espaciales de las que se reciben datos de ciencia y telemetría.
¿Y luego qué?
Esto lo hice hace 2 años.
¿Pensáis que me puse a analizar los datos para ver cómo se movía la antena y así decidir en qué momento iba a Robledo para hacer el timelapse?
Pues no. El proyecto fue sustituido por otros y el software que había hecho quedo corriendo sin que nadie le hiciera caso.
Pero…
Interés renovado
Así seguía en el limbo hasta que en una conversación con Pedro León (Autor del libro VIAJES INTERESTELARES. HISTORIA DE LAS SONDAS VOYAGER) le pasé el enlace a la Hoja de cálculo que había ido recibiendo datos durante meses.
A finales de Octubre de 2024 me comentó sobre la fiabilidad del software. A lo que yo respondí que funciona bien hasta que falla. Nunca pondré la mano en el fuego por ningún software y menos por uno mío.
En los últimos meses la sonda Voyager 1 ha perdido la conectividad con la red de DSN de NASA por diversos motivos que se han ido solucionando (de momento).
Así que se me ocurrió mirar el Excel y lanzar unas consultas SQL sobre él (Sí, se puede consultar como si fuera una Base de Datos).
Y mirad qué salió

Entre el 9 de Octubre y el 5 de Noviembre se aprecia una falta de comunicación con la nave (al menos se aprecia que en esos días según Nasa Now la cosa estaba fea).
Hay otras ventanas extrañas en el año 2023 pero como no tengo logs completo no sé a qué pueden deberse.
¿Quiere eso decir que en esos tres periodos no se recibieron datos del Voyager 1?
NO.
El programa funcionó sin errores y almacenó los datos en la base de datos. Así que el servicio de DSN Now estaba operativo de lo contrario no se hubiera leído el nodo de la antena DSS63 del archivo XML. Otra cosa muy distinta es que el archivo refleje el estado real de la recepción de Radiofrecuencia de la antena.
Se puede extraer información bastante interesante de los datos así que te invito a que hagas tus propias investigaciones y mejores y amplíes las funcionalidades.
Esto me ha motivado a depurar el programa y a completarlo incluyendo el resto de antenas que pueden captar a nuestros venerables Voyager y así ser los primeros en saber si se cae el enlace (para lo que pienso poner una alerta que me avise via mail si de nuevo el Voyager 1 deja de recibirse en las antenas de la Red de Espacio profundo de NASA.
A estas alturas ya quizás entiendas el título de esta entrada:
La sonda de Schrödinger (Voyager 1) es como los pimientos de Padrón:
Unas veces emite mas outras non
Nota
Una aclaración sobre la fotografía que encabeza esta entrada de blog.

Esta fotografía la hice en mi primera visita al interior de la Estación de Robledo de Chavela. Fue en 1985 mientras cursaba el tercer curso de Ciencias Físicas en la Facultad de Ciencias de la Universidad de Zaragoza.
He vuelto un par de veces al interior pero ya hace años que resulta complicadísimo (por no decir imposible) entrar. Si alguien de la Estación lee esto y me quiere autorizar a entrada estaré encantado.



Deja un comentario