Movimiento Browniano
Conceptos preliminares.
El movimiento Browniano juega un papel importante dentro de la teoría de la probabilidad, procesos estocásticos, la matemática financiera, la física, la biología, etc.
Uno de los componentes básicos de un modelo que describe la evolución de un proceso estocástico es el llamado movimiento Browniano o proceso de Wiener. Hay muchas formas de definir el proceso de Wiener. Antes de ver una deficion formar es necesario algunos conceptos introductorios que nos ayudaran a comprender mejor la deficion de movimiento Browniano.
Definición 1.
Dado un espació de probabilidad \(( \Omega,\mathcal{A},P )\). Un proceso estocástico de valores reales es una familia de variables aleatorias \(\{X_{\gamma}, \gamma \in \Gamma\}\) definida sobre \(\Gamma \times \Omega\) tomando valores en \(\mathbb{R}\). Por lo tanto la familia de variables aleatorias (medibles para todo \(\gamma \in \Gamma\)) son funciones de la forma \[X(\gamma,\omega): \Gamma \times \Omega \longrightarrow \mathbb{R}.\] Para \(\Gamma = \mathbb{N}\), tenemos un proceso de tiempo discreto, y para \(\Gamma \subset \mathbb{R}\) tenemos un proceso de tiempo continuo.
Definición 2.
Sea \(X=\{ X_{t}, t \in T \}\) un proceso estocástico y \(T\subset \mathbb{R}\) un intervalo.
Decimos que \(X\) tiene incrementos independientes si para todo \(t_{i} \in T\) con \(t_{1},t_{2},t_{3},...,t_{n}\) y \(n \geq 1\), se cumple que \[X_{t_{2}}-X_{t_{1}},..,X_{t_{n}}-X_{t_{n-1}}\] son variables aleatorias independientes.
Definición 3.
Se conoce como proceso de Gauus, al proceso continuo en el que toda combinación lineal de variables es una varable de distribución normal.
Definión
Después de estudiar los conceptos anteriores estamos listos para definir matemáticamente el concepto de movimiento Browniano, así.
Definición 4. Decimos que un proceso estocástico se considera un proceso de Wiener o movimiento Browniano \({W(t),t \geq 0 }\) si este es un proceso Gaussiano, con trayectoria continua e incrementos independientes tales que:
- \(W(0)=0\).
- \(E[W(t)] = 0\).
- \(Var(W(t)-W(s)) = t-s ,\) para todo \(0\leq s \leq t\).
En la practica, es de relevancia enunciar además las siguientes propiedades de forma matemática:
- \(W(t)-W(s) \sim N(0,t-s)\), para todo \(0\leq s \leq t\)
- Para dos intervalos \((t_{1},t_{2}),(t_{3},t_{4})\), con \(t_{1} \leq t_{2} \leq t_{3} \leq t_{4}\), los incrementos de en las trayectorias \(W(t_{2})-W(t_{1})\) y \(W(t_{4})-W(t_{3})\) son independientes.
Simulación.
A continuación se describirá un proceso por medio del cual podremos simular el movimiento Browniano, es importante tener claro como simular el movimiento Browniano ya que depende de los propósitos por los cuales estemos interesados en estudiar los procesos estocásticos, en la mayoría de las veces necesitaremos realizar simulaciones que ayuden a reforzar la teoría expuesta y así motiven mas a los lectores a investigar mas sobre temas de aplicación interesantes, donde el movimiento Browniano siempre estará involucrado.
Dado un tiempo de incremento fijo \(\Delta t > 0\), es posible simular la trayectoria del movimiento Browniano en el intervalo \([0,T]\), así se tiene que para todo \(W_{\Delta t}\) se cumple que \[W(\Delta t) = W(\Delta t) - W(0) \sim N(0,\Delta t) \sim \sqrt{\Delta t} * N(0,1),\] y esto mismo es cierto para otros incrementos \(W(t + \Delta t) - W(t)\), es decir, \[W(t + \Delta t) - W(t) \sim N(0,\Delta t) \sim \sqrt{\Delta t} * N(0,1)\] Tomando el intervalo \([0,T]\) podemos la partición \(0=t_{1},t_{2},...,t_{n-1},t_{n}=T\), adoptando la notación de diferenciales, tenemos que \(\Delta t = t_{i+1}+t_{i}\) y recordando una de las propiedades anteriores, tenmos que \(W(0)=W(t_{1})=0\), ahora solo tendriamos que iterar siguiendo el siguiente algoritmo:
- Generar un numero aleatorio \(z\) con distribucion normal.
- actualizar el contador i= i+1.
- Iterar \(W(t_{i}) = W(t_{i-1}) + z*\sqrt{\Delta t}\).
- si \(i\leq N\), regresamos al paso 1.
Con todos los elementos descritos anteriormente, es fácil poder traducir el algoritmo anterior a un lenguaje de programación, en este caso se utilizara el lenguaje de programación R para mostrar algunas simulaciones.
set.seed(123) #Iniciamos una semilla, para que exista variabilidad en los datos,
N <- 1000 #Número de puntos en la malla.
T <- 1 #Limite superior del intervalo.
Delta <- T/N # Incrementos de tiempo
t <- seq(0,T,length=N+1)
W <- c(0,cumsum(sqrt(Delta)*rnorm(N)))
MB <- ggplot()+geom_line(aes(t,W), color = "red")+labs(title="Movimiento Browniano",x="Tiempo (t)",y="Trayectoria W(t)")+theme_gray()
ggplotly(MB)
Aplicaciones.
Son muchas las aplicaciones en donde podemos encontrar al movimiento Browniano, entre los cuales podemos encontrar:
- Ecuaciones diferenciales estocásticas.
- Integrales de estocásticas de Itô.
- Variación del precio en derivados financieros.
- Modelado de fenómenos biológicos.
La importancia del movimiento Browniano en el cálculo estocástico, se verá en otra publicación dentro de este repositorio, donde se verán detalles más complejos y se hará uso de simulaciones que ayudaran a comprender mejor los conceptos y motivar así a la investigación y aplicación de estos temas.
Movimiento Browniano Geométrico.
Definición.
Llamamos movimiento Browniano geométrico al proceso estocástico que presenta la propiedad de tener incrementos multiplicativos independientes y se define en función del movimiento Browniano estándar, por
\[S(t) = x exp \left\{ \left(r - \dfrac{\sigma^{2}}{2}\right)t + \sigma W(t) \right\}, t>0\] con \(S(0)=x, x \in \mathbb{R}\) como valor inicial y \(\sigma > 0\) (volatilidad), \(r\) (tasa de interés) los cuales son constantes.
Simulación.
Algo importantes que podemos preguntarnos, es ¿cómo puedo simular el movimiento Browniano geométrico? Esta duda es muy interesante y siguiendo la lógica que usamos con el movimiento Browniano, tendremos el siguiente resultado.
set.seed(123)
r <- 2
sigma <- 1
x <- 10
N <- 1000
T <- 1
Delta <- T/N
W <- numeric(N+1)
t <- seq(0,T,length = N+1)
for(i in 2:(N+1))
W[i] <- W[i-1] +rnorm(1)*sqrt(Delta)
S <- x*exp((r-(sigma^2)/2)*t + sigma*W)
MBG <- ggplot()+geom_line(aes(t,S), color = "red")+labs(title="Movimiento Browniano Geométrico",x="Tiempo (t)",y="Trayectoria W(t)")+theme_gray()
ggplotly(MBG)
Si tienes dudas, o te gustaría aportar a fortalecer más esta publicación no dudes en contactarme a través de mi correo electrónico, el cual es joel.ramirez936@gmail.com .
Bibliografia.
S. M. Iacus. Simulation and inference for stochastic differential equations: With R examples. Springer Series in Statistics 1. Springer-Verlag New York, 1 edition, 2008.
T. Mikosch. Elementary Stochastic Calculus with Finance in View. Advanced series on statistical science and applied probability 6. World Scientific Publ, 1998
LS0tDQp0aXRsZTogIk1vdmltaWVudG8gQnJvd25pYW5vLiINCmF1dGhvcjogIkpvZWwgUmFtw61yZXoiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IA0KICAgICAgY29sbGFwc2VkOiB0cnVlDQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCi0tLQ0KDQojIE1vdmltaWVudG8gQnJvd25pYW5vDQojIyBDb25jZXB0b3MgcHJlbGltaW5hcmVzLg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShzZGUpDQoNCmBgYA0KDQpgRWwgbW92aW1pZW50byBCcm93bmlhbm9gIGp1ZWdhIHVuIHBhcGVsIGltcG9ydGFudGUgZGVudHJvIGRlIGxhIHRlb3LDrWEgZGUgbGEgcHJvYmFiaWxpZGFkLCBwcm9jZXNvcyBlc3RvY8Ohc3RpY29zLCBsYSBtYXRlbcOhdGljYSBmaW5hbmNpZXJhLCBsYSBmw61zaWNhLCBsYSBiaW9sb2fDrWEsIGV0Yy4gDQoNClVubyBkZSBsb3MgY29tcG9uZW50ZXMgYsOhc2ljb3MgZGUgdW4gbW9kZWxvIHF1ZSBkZXNjcmliZSBsYSBldm9sdWNpw7NuIGRlIHVuIHByb2Nlc28gZXN0b2PDoXN0aWNvDQplcyBlbCBsbGFtYWRvIG1vdmltaWVudG8gQnJvd25pYW5vIG8gcHJvY2VzbyBkZSBXaWVuZXIuIEhheSBtdWNoYXMgZm9ybWFzIGRlIGRlZmluaXIgZWwNCnByb2Nlc28gZGUgV2llbmVyLiBBbnRlcyBkZSB2ZXIgdW5hIGRlZmljaW9uIGZvcm1hciBlcyBuZWNlc2FyaW8gYWxndW5vcyBjb25jZXB0b3MgaW50cm9kdWN0b3Jpb3MgcXVlIG5vcyBheXVkYXJhbiBhIGNvbXByZW5kZXIgbWVqb3IgbGEgZGVmaWNpb24gZGUgbW92aW1pZW50byBCcm93bmlhbm8uDQoNCg0KKipEZWZpbmljacOzbiAxLioqDQoNCkRhZG8gdW4gZXNwYWNpw7MgZGUgcHJvYmFiaWxpZGFkICQoIFxPbWVnYSxcbWF0aGNhbHtBfSxQICkkLiBVbiBwcm9jZXNvIGVzdG9jw6FzdGljbyBkZSB2YWxvcmVzIHJlYWxlcyBlcyB1bmEgZmFtaWxpYSBkZSB2YXJpYWJsZXMgYWxlYXRvcmlhcyAkXHtYX3tcZ2FtbWF9LCBcZ2FtbWEgXGluIFxHYW1tYVx9JCBkZWZpbmlkYSBzb2JyZSAkXEdhbW1hIFx0aW1lcyBcT21lZ2EkIHRvbWFuZG8gdmFsb3JlcyBlbiAkXG1hdGhiYntSfSQuIFBvciBsbyB0YW50byBsYSBmYW1pbGlhIGRlIHZhcmlhYmxlcyBhbGVhdG9yaWFzIChtZWRpYmxlcyBwYXJhIHRvZG8gJFxnYW1tYSBcaW4gXEdhbW1hJCkgc29uIGZ1bmNpb25lcyBkZSBsYSBmb3JtYQ0KJCRYKFxnYW1tYSxcb21lZ2EpOiBcR2FtbWEgXHRpbWVzIFxPbWVnYSAgXGxvbmdyaWdodGFycm93IFxtYXRoYmJ7Un0uJCQNClBhcmEgJFxHYW1tYSA9IFxtYXRoYmJ7Tn0kLCB0ZW5lbW9zIHVuIGBwcm9jZXNvIGRlIHRpZW1wbyBkaXNjcmV0b2AsIHkgcGFyYSAkXEdhbW1hIFxzdWJzZXQgXG1hdGhiYntSfSQgdGVuZW1vcyB1biBgcHJvY2VzbyBkZSB0aWVtcG8gY29udGludW9gLg0KDQoqKkRlZmluaWNpw7NuIDIuKioNCg0KU2VhICRYPVx7IFhfe3R9LCB0IFxpbiBUIFx9JCB1biBwcm9jZXNvIGVzdG9jw6FzdGljbyB5ICRUXHN1YnNldCBcbWF0aGJie1J9JCB1biBpbnRlcnZhbG8uDQoNCkRlY2ltb3MgcXVlICRYJCB0aWVuZSBpbmNyZW1lbnRvcyBpbmRlcGVuZGllbnRlcyBzaSBwYXJhIHRvZG8gJHRfe2l9IFxpbiBUJCBjb24gJHRfezF9LHRfezJ9LHRfezN9LC4uLix0X3tufSQgeSAkbiBcZ2VxIDEkLCBzZSBjdW1wbGUgcXVlICQkWF97dF97Mn19LVhfe3RfezF9fSwuLixYX3t0X3tufX0tWF97dF97bi0xfX0kJA0Kc29uIHZhcmlhYmxlcyBhbGVhdG9yaWFzIGluZGVwZW5kaWVudGVzLg0KDQoqKkRlZmluaWNpw7NuIDMuKioNCg0KU2UgY29ub2NlIGNvbW8gcHJvY2VzbyBkZSBHYXV1cywgYWwgcHJvY2VzbyBjb250aW51byBlbiBlbCBxdWUgdG9kYSBjb21iaW5hY2nDs24gbGluZWFsIGRlIHZhcmlhYmxlcyBlcyB1bmEgdmFyYWJsZSBkZSBkaXN0cmlidWNpw7NuIG5vcm1hbC4gDQoNCg0KIyMgRGVmaW5pw7NuDQoNCkRlc3B1w6lzIGRlIGVzdHVkaWFyIGxvcyBjb25jZXB0b3MgYW50ZXJpb3JlcyBlc3RhbW9zIGxpc3RvcyBwYXJhIGRlZmluaXIgbWF0ZW3DoXRpY2FtZW50ZSBlbCBjb25jZXB0byBkZSBtb3ZpbWllbnRvIEJyb3duaWFubywgYXPDrS4NCg0KDQoqKkRlZmluaWNpw7NuIDQuKiogDQpEZWNpbW9zIHF1ZSB1biBwcm9jZXNvIGVzdG9jw6FzdGljbyBzZSBjb25zaWRlcmEgdW4gcHJvY2VzbyBkZSBXaWVuZXIgbyBtb3ZpbWllbnRvIEJyb3duaWFubyAke1codCksdCBcZ2VxIDAgfSQgc2kgZXN0ZSBlcyB1biBwcm9jZXNvIEdhdXNzaWFubywgY29uIHRyYXllY3RvcmlhIGNvbnRpbnVhIGUgaW5jcmVtZW50b3MgaW5kZXBlbmRpZW50ZXMgdGFsZXMgcXVlOg0KDQotICRXKDApPTAkLg0KLSAkRVtXKHQpXSA9IDAkLg0KLSAkVmFyKFcodCktVyhzKSkgPSB0LXMgLCQgcGFyYSB0b2RvICQwXGxlcSBzIFxsZXEgdCQuDQoNCkVuIGxhIHByYWN0aWNhLCBlcyBkZSByZWxldmFuY2lhIGVudW5jaWFyIGFkZW3DoXMgbGFzIHNpZ3VpZW50ZXMgYHByb3BpZWRhZGVzYCBkZSBmb3JtYSBtYXRlbcOhdGljYToNCg0KLSAkVyh0KS1XKHMpIFxzaW0gTigwLHQtcykkLCBwYXJhIHRvZG8gJDBcbGVxIHMgXGxlcSB0JA0KLSBQYXJhIGRvcyBpbnRlcnZhbG9zICQodF97MX0sdF97Mn0pLCh0X3szfSx0X3s0fSkkLCBjb24gJHRfezF9IFxsZXEgdF97Mn0gXGxlcSB0X3szfSBcbGVxIHRfezR9JCwgbG9zIGluY3JlbWVudG9zIGRlIGVuIGxhcyB0cmF5ZWN0b3JpYXMgJFcodF97Mn0pLVcodF97MX0pJCB5ICRXKHRfezR9KS1XKHRfezN9KSQgc29uIGluZGVwZW5kaWVudGVzLg0KDQojIyBTaW11bGFjacOzbi4NCkEgY29udGludWFjacOzbiBzZSBkZXNjcmliaXLDoSB1biBwcm9jZXNvIHBvciBtZWRpbyBkZWwgY3VhbCBwb2RyZW1vcyBgc2ltdWxhcmAgZWwgbW92aW1pZW50byBCcm93bmlhbm8sIGVzIGltcG9ydGFudGUgdGVuZXIgY2xhcm8gY29tbyBzaW11bGFyIGVsIG1vdmltaWVudG8gQnJvd25pYW5vIHlhIHF1ZSBkZXBlbmRlIGRlIGxvcyBwcm9ww7NzaXRvcyBwb3IgbG9zIGN1YWxlcyBlc3RlbW9zIGludGVyZXNhZG9zIGVuIGVzdHVkaWFyIGxvcyBwcm9jZXNvcyBlc3RvY8Ohc3RpY29zLCBlbiBsYSBtYXlvcsOtYSBkZSBsYXMgdmVjZXMgbmVjZXNpdGFyZW1vcyByZWFsaXphciBzaW11bGFjaW9uZXMgcXVlIGF5dWRlbiBhIHJlZm9yemFyIGxhIHRlb3LDrWEgZXhwdWVzdGEgeSBhc8OtIG1vdGl2ZW4gbWFzIGEgbG9zIGxlY3RvcmVzIGEgaW52ZXN0aWdhciBtYXMgc29icmUgdGVtYXMgZGUgYXBsaWNhY2nDs24gaW50ZXJlc2FudGVzLCBkb25kZSBlbCBtb3ZpbWllbnRvIEJyb3duaWFubyBzaWVtcHJlIGVzdGFyw6EgaW52b2x1Y3JhZG8uDQoNCkRhZG8gdW4gdGllbXBvIGRlIGluY3JlbWVudG8gZmlqbyAkXERlbHRhIHQgPiAwJCwgZXMgcG9zaWJsZSBzaW11bGFyIGxhIHRyYXllY3RvcmlhIGRlbCBtb3ZpbWllbnRvIEJyb3duaWFubyBlbiBlbCBpbnRlcnZhbG8gJFswLFRdJCwgYXPDrSBzZSB0aWVuZSBxdWUgcGFyYSB0b2RvICRXX3tcRGVsdGEgdH0kIHNlIGN1bXBsZSBxdWUgDQokJFcoXERlbHRhIHQpID0gVyhcRGVsdGEgdCkgLSBXKDApIFxzaW0gTigwLFxEZWx0YSB0KSBcc2ltIFxzcXJ0e1xEZWx0YSB0fSAqIE4oMCwxKSwkJA0KeSBlc3RvIG1pc21vIGVzIGNpZXJ0byBwYXJhIG90cm9zIGluY3JlbWVudG9zICRXKHQgKyBcRGVsdGEgdCkgLSBXKHQpJCwgZXMgZGVjaXIsIA0KJCRXKHQgKyBcRGVsdGEgdCkgLSBXKHQpIFxzaW0gTigwLFxEZWx0YSB0KSBcc2ltIFxzcXJ0e1xEZWx0YSB0fSAqIE4oMCwxKSQkDQpUb21hbmRvIGVsIGludGVydmFsbyAkWzAsVF0kIHBvZGVtb3MgbGEgcGFydGljacOzbiAkMD10X3sxfSx0X3syfSwuLi4sdF97bi0xfSx0X3tufT1UJCwgYWRvcHRhbmRvIGxhIG5vdGFjacOzbiBkZSBkaWZlcmVuY2lhbGVzLCB0ZW5lbW9zIHF1ZSAkXERlbHRhIHQgPSB0X3tpKzF9K3Rfe2l9JCB5IHJlY29yZGFuZG8gdW5hIGRlIGxhcyBwcm9waWVkYWRlcyBhbnRlcmlvcmVzLCB0ZW5tb3MgcXVlICRXKDApPVcodF97MX0pPTAkLCBhaG9yYSBzb2xvIHRlbmRyaWFtb3MgcXVlIGl0ZXJhciBzaWd1aWVuZG8gZWwgc2lndWllbnRlIGFsZ29yaXRtbzoNCg0KMS4gR2VuZXJhciB1biBudW1lcm8gYWxlYXRvcmlvICR6JCBjb24gZGlzdHJpYnVjaW9uIG5vcm1hbC4NCjIuIGFjdHVhbGl6YXIgZWwgY29udGFkb3IgaT0gaSsxLg0KMy4gSXRlcmFyICRXKHRfe2l9KSA9ICBXKHRfe2ktMX0pICsgeipcc3FydHtcRGVsdGEgdH0kLg0KNC4gc2kgJGlcbGVxIE4kLCByZWdyZXNhbW9zIGFsIHBhc28gMS4gDQoNCkNvbiB0b2RvcyBsb3MgZWxlbWVudG9zIGRlc2NyaXRvcyBhbnRlcmlvcm1lbnRlLCBlcyBmw6FjaWwgcG9kZXIgdHJhZHVjaXIgZWwgYWxnb3JpdG1vIGFudGVyaW9yIGEgdW4gbGVuZ3VhamUgZGUgcHJvZ3JhbWFjacOzbiwgZW4gZXN0ZSBjYXNvIHNlIHV0aWxpemFyYSBlbCBgbGVuZ3VhamUgZGUgcHJvZ3JhbWFjacOzbiBSYCBwYXJhIG1vc3RyYXIgYWxndW5hcyBzaW11bGFjaW9uZXMuDQoNCg0KDQpgYGB7cn0NCnNldC5zZWVkKDEyMykgI0luaWNpYW1vcyB1bmEgc2VtaWxsYSwgcGFyYSBxdWUgZXhpc3RhIHZhcmlhYmlsaWRhZCBlbiBsb3MgZGF0b3MsIA0KTiA8LSAxMDAwICNOw7ptZXJvIGRlIHB1bnRvcyBlbiBsYSBtYWxsYS4NClQgPC0gMSAjTGltaXRlIHN1cGVyaW9yIGRlbCBpbnRlcnZhbG8uDQpEZWx0YSA8LSBUL04gIyBJbmNyZW1lbnRvcyBkZSB0aWVtcG8NCnQgPC0gc2VxKDAsVCxsZW5ndGg9TisxKSANClcgPC0gYygwLGN1bXN1bShzcXJ0KERlbHRhKSpybm9ybShOKSkpDQpNQiA8LSBnZ3Bsb3QoKStnZW9tX2xpbmUoYWVzKHQsVyksIGNvbG9yID0gInJlZCIpK2xhYnModGl0bGU9Ik1vdmltaWVudG8gQnJvd25pYW5vIix4PSJUaWVtcG8gKHQpIix5PSJUcmF5ZWN0b3JpYSBXKHQpIikrdGhlbWVfZ3JheSgpDQpnZ3Bsb3RseShNQikNCmBgYA0KDQojIyBBcGxpY2FjaW9uZXMuDQpTb24gbXVjaGFzIGxhcyBhcGxpY2FjaW9uZXMgZW4gZG9uZGUgcG9kZW1vcyBlbmNvbnRyYXIgYWwgbW92aW1pZW50byBCcm93bmlhbm8sIGVudHJlIGxvcyBjdWFsZXMgcG9kZW1vcyBlbmNvbnRyYXI6IA0KDQotIEVjdWFjaW9uZXMgZGlmZXJlbmNpYWxlcyBlc3RvY8Ohc3RpY2FzLg0KLSBJbnRlZ3JhbGVzIGRlIGVzdG9jw6FzdGljYXMgZGUgSXTDtC4NCi0gVmFyaWFjacOzbiBkZWwgcHJlY2lvIGVuIGRlcml2YWRvcyBmaW5hbmNpZXJvcy4NCi0gTW9kZWxhZG8gZGUgZmVuw7NtZW5vcyBiaW9sw7NnaWNvcy4NCg0KTGEgaW1wb3J0YW5jaWEgZGVsIG1vdmltaWVudG8gQnJvd25pYW5vIGVuIGVsIGPDoWxjdWxvIGVzdG9jw6FzdGljbywgc2UgdmVyw6EgZW4gb3RyYSBwdWJsaWNhY2nDs24gZGVudHJvIGRlIGVzdGUgcmVwb3NpdG9yaW8sIGRvbmRlIHNlIHZlcsOhbiBkZXRhbGxlcyBtw6FzIGNvbXBsZWpvcyB5IHNlIGhhcsOhIHVzbyBkZSBzaW11bGFjaW9uZXMgcXVlIGF5dWRhcmFuIGEgY29tcHJlbmRlciBtZWpvciBsb3MgY29uY2VwdG9zIHkgbW90aXZhciBhc8OtIGEgbGEgaW52ZXN0aWdhY2nDs24geSBhcGxpY2FjacOzbiBkZSBlc3RvcyB0ZW1hcy4gDQoNCg0KIyBNb3ZpbWllbnRvIEJyb3duaWFubyBHZW9tw6l0cmljby4NCiMjIERlZmluaWNpw7NuLg0KDQpMbGFtYW1vcyBgbW92aW1pZW50byBCcm93bmlhbm8gZ2VvbcOpdHJpY29gIGFsIHByb2Nlc28gZXN0b2PDoXN0aWNvIHF1ZSBwcmVzZW50YSBsYSBwcm9waWVkYWQgZGUgdGVuZXIgaW5jcmVtZW50b3MgbXVsdGlwbGljYXRpdm9zIGluZGVwZW5kaWVudGVzIHkgc2UgZGVmaW5lIGVuIGZ1bmNpw7NuIGRlbCBtb3ZpbWllbnRvIEJyb3duaWFubyBlc3TDoW5kYXIsIHBvcg0KDQokJFModCkgPSB4IGV4cCBcbGVmdFx7IFxsZWZ0KHIgLSBcZGZyYWN7XHNpZ21hXnsyfX17Mn1ccmlnaHQpdCArIFxzaWdtYSBXKHQpIFxyaWdodFx9LCB0PjAkJA0KY29uICRTKDApPXgsIHggXGluIFxtYXRoYmJ7Un0kIGNvbW8gdmFsb3IgaW5pY2lhbCB5ICRcc2lnbWEgPiAwJCAodm9sYXRpbGlkYWQpLCAkciQgKHRhc2EgZGUgaW50ZXLDqXMpIGxvcyBjdWFsZXMgc29uIGNvbnN0YW50ZXMuDQoNCiMjIFNpbXVsYWNpw7NuLg0KDQpBbGdvIGltcG9ydGFudGVzIHF1ZSBwb2RlbW9zIHByZWd1bnRhcm5vcywgZXMgwr9jw7NtbyBwdWVkbyBzaW11bGFyIGVsIG1vdmltaWVudG8gQnJvd25pYW5vIGdlb23DqXRyaWNvPyBFc3RhIGR1ZGEgZXMgbXV5IGludGVyZXNhbnRlIHkgc2lndWllbmRvIGxhIGzDs2dpY2EgcXVlIHVzYW1vcyBjb24gZWwgbW92aW1pZW50byBCcm93bmlhbm8sIHRlbmRyZW1vcyBlbCBzaWd1aWVudGUgcmVzdWx0YWRvLg0KDQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCnIgPC0gMg0Kc2lnbWEgPC0gMQ0KeCA8LSAxMA0KTiA8LSAxMDAwDQpUIDwtIDENCkRlbHRhIDwtIFQvTg0KVyA8LSBudW1lcmljKE4rMSkNCnQgPC0gc2VxKDAsVCxsZW5ndGggPSBOKzEpDQpmb3IoaSBpbiAyOihOKzEpKQ0KICBXW2ldIDwtIFdbaS0xXSArcm5vcm0oMSkqc3FydChEZWx0YSkNClMgPC0geCpleHAoKHItKHNpZ21hXjIpLzIpKnQgKyBzaWdtYSpXKQ0KTUJHIDwtIGdncGxvdCgpK2dlb21fbGluZShhZXModCxTKSwgY29sb3IgPSAicmVkIikrbGFicyh0aXRsZT0iTW92aW1pZW50byBCcm93bmlhbm8gR2VvbcOpdHJpY28iLHg9IlRpZW1wbyAodCkiLHk9IlRyYXllY3RvcmlhIFcodCkiKSt0aGVtZV9ncmF5KCkNCmdncGxvdGx5KE1CRykNCmBgYA0KDQoNClNpIHRpZW5lcyBkdWRhcywgbyB0ZSBndXN0YXLDrWEgYXBvcnRhciBhIGZvcnRhbGVjZXIgbcOhcyBlc3RhIHB1YmxpY2FjacOzbiBubyBkdWRlcyBlbiBjb250YWN0YXJtZSBhIHRyYXbDqXMgZGUgbWkgY29ycmVvIGVsZWN0csOzbmljbywgZWwgY3VhbCBlcyBqb2VsLnJhbWlyZXo5MzZAZ21haWwuY29tIC4NCg0KIyMgQmlibGlvZ3JhZmlhLg0KDQotIFMuIE0uIElhY3VzLiBTaW11bGF0aW9uIGFuZCBpbmZlcmVuY2UgZm9yIHN0b2NoYXN0aWMgZGlmZmVyZW50aWFsIGVxdWF0aW9uczogV2l0aCBSIGV4YW1wbGVzLg0KU3ByaW5nZXIgU2VyaWVzIGluIFN0YXRpc3RpY3MgMS4gU3ByaW5nZXItVmVybGFnIE5ldyBZb3JrLCAxIGVkaXRpb24sIDIwMDguDQoNCi0gVC4gTWlrb3NjaC4gRWxlbWVudGFyeSBTdG9jaGFzdGljIENhbGN1bHVzIHdpdGggRmluYW5jZSBpbiBWaWV3LiBBZHZhbmNlZCBzZXJpZXMgb24NCnN0YXRpc3RpY2FsIHNjaWVuY2UgYW5kIGFwcGxpZWQgcHJvYmFiaWxpdHkgNi4gV29ybGQgU2NpZW50aWZpYyBQdWJsLCAxOTk4DQo=