<<<<<<< HEAD ======= >>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203

This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

library(tidyverse)
library(viridis)
Loading required package: viridisLite
c_x_t <- function(x,t){
  m_0=1
  A=0.05
  D=10^-5
  
  return( (m_0/(A*sqrt(4*pi*D*t)))*exp(-(x^2)/(4*D*t)) )
}
cmax_t <- function(t){
  m_0=10
  A=1
  D=10^-5
  return(2*m_0/(A*sqrt(4*pi*D*t)))
}
grid <- expand.grid(
  x = seq(-0.1,0.1,length=101),
  t = seq(0, 100, length = 101)
  )
grid_data <- grid %>% 
  mutate(c=c_x_t(x,t))
ggplot(grid_data,aes(x*10000,c,color=t))+geom_path(aes(group=t))+scale_color_viridis()
<<<<<<< HEAD

=======

>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
ggplot(grid_data %>% filter(x==0),aes(t,c,color=t))+geom_point()+scale_color_viridis()
<<<<<<< HEAD

=======

>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
c_x_t_noFlux <- function(x,t){
  m_0=10
  A=1
  D=10^-5
  
  return( (m_0/(A*sqrt(4*pi*D*t)))*(exp(-(x^2)/(4*D*t))+exp(-((x)^2)/(4*D*t)) )  )
}
grid_data2 <- grid %>% 
  mutate(c=c_x_t_noFlux(x,t))
ggplot(grid_data2,aes(x*10000,c,color=t))+geom_path(aes(group=t))+scale_color_viridis()
<<<<<<< HEAD

=======

>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
ggplot(grid_data2 %>% filter(x==0),aes(t,c,color=t))+geom_point()+scale_color_viridis()
<<<<<<< HEAD

=======

>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
ggplot(grid_data %>% filter(x==0),aes(t,c,color=t))+geom_point()+
  geom_point(data=grid_data2 %>% filter(x==0),aes(t,c,color=t))+
  scale_color_viridis()
<<<<<<< HEAD

=======

>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203 <<<<<<< HEAD
max_data <- tibble(t = seq(0, 100, length = 101)) %>% 
  mutate(c=cmax_t(t))

=======

max_data <- tibble(t = seq(0, 100, length = 101)) %>% 
  mutate(c=cmax_t(t))
>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
ggplot(grid_data %>% filter(x==0),aes(t,c,color=t))+geom_point()+
  geom_point(data=grid_data2 %>% filter(x==0),aes(t,c,color=t))+
  geom_point(data=max_data,aes(t,c),color='black',shape=21)+
  scale_color_viridis()
<<<<<<< HEAD

=======

>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
c_x_t_abs <- function(x,t){
  m_0=10
  A=1
  D=10^-5
  L=0.01
  return( (m_0/(A*sqrt(4*pi*D*t)))*(exp(-(x^2)/(4*D*t))-exp(-((x+2*L)^2)/(4*D*t)) )  )
}
grid_data3 <- grid %>% 
  mutate(c=c_x_t_abs(x,t))
ggplot(grid_data3,aes(x*10000,c,color=t))+geom_path(aes(group=t))+scale_color_viridis()
<<<<<<< HEAD

=======

>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
c_x_t_noFluxabs <- function(x,t){
  m_0=10
  A=1
  D=10^-5
  L=0.01
  return( (m_0/(A*sqrt(4*pi*D*t)))*(exp(-(x^2)/(4*D*t))-exp(-((x+2*L)^2)/(4*D*t))+exp(-((x)^2)/(4*D*t)))  )
}
grid_data4 <- grid %>% 
  mutate(c=c_x_t_noFluxabs(x,t))
ggplot(grid_data3,aes(x*10000,c,color=t))+geom_path(aes(group=t))+scale_color_viridis()
<<<<<<< HEAD

=======

>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
ggplot(grid_data %>% filter(x==0),aes(t,c,color=t))+geom_point()+
  geom_point(data=grid_data2 %>% filter(x==0),aes(t,c,color=t))+
  geom_point(data=grid_data4 %>% filter(x==0),aes(t,c),color='black',shape=21)+
  scale_color_viridis()
<<<<<<< HEAD

=======

>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203 <<<<<<< HEAD ======= >>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
c_x_t_finite <- function(x,t){
  m_0=10
  A=1
  D=10^-5
  L=0.1
  return( (m_0/(A*sqrt(4*pi*D*t)))*(exp(-(x^2)/(4*D*t))+exp(-((x+2*L)^2)/(4*D*t))+exp(-((x)^2)/(4*D*t)))  )
}
<<<<<<< HEAD

grid_data_finite <- grid %>% 
  mutate(c=c_x_t_finite(x,t))

=======
grid_data_finite <- grid %>% 
  mutate(c=c_x_t_finite(x,t))
>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
ggplot(grid_data_finite %>% filter(x==0),aes(t,c,color=t))+geom_point()+
  geom_point(data=grid_data4 %>% filter(x==0),aes(t,c),color='black',shape=21)+
  scale_color_viridis()+
  ylim(0,NA)
<<<<<<< HEAD

=======

>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203 <<<<<<< HEAD ======= >>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
c_x_t_noFlux <- function(x,t,D=10^-5){
  m_0=1
  A=1
  D=D
  
  return( (m_0/(A*sqrt(4*pi*D*t)))*(exp(-(x^2)/(4*D*t))+exp(-((x)^2)/(4*D*t)) )  )
}
cmax_t <- function(t,D=10^-5){
  m_0=1
  A=1
  D=D
  return(2*m_0/(A*sqrt(4*pi*D*t)))
}
multi_D <- grid %>% 
  mutate(cfast=c_x_t_noFlux(x,t,D=10^-6)) %>% 
  mutate(cslow=c_x_t_noFlux(x,t,D=10^-7))
ggplot(multi_D %>% filter(x==0),aes(x=t,color=t))+
  geom_point(aes(y=cfast),color='red')+
  geom_point(aes(y=cslow),color='blue')
<<<<<<< HEAD


ggplot(multi_D %>% filter(x==0),aes(x=t^-0.5,color=t))+
=======

ggplot(multi_D %>% filter(x==0),aes(x=t^-0.5,color=t))+
>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
  geom_point(aes(y=cfast),color='red')+
  geom_point(aes(y=cslow),color='blue')+
  geom_smooth(aes(y=cfast),method='lm',se=F,color='red',linetype=2)+
  geom_smooth(aes(y=cslow),method='lm',se=F,color='blue',linetype=2)
<<<<<<< HEAD


multi_D_norm <- multi_D %>% 
=======

multi_D_norm <- multi_D %>% 
>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
  filter(x==0 & t>0) %>% 
  mutate(max_fast=max(cfast)) %>% 
  mutate(max_slow=max(cslow)) %>% 
  mutate(fast_norm=cfast/max_fast) %>% 
  mutate(slow_norm=cslow/max_slow)
ggplot(multi_D_norm %>% filter(x==0),aes(x=t^-0.5,color=t))+
  geom_point(aes(y=fast_norm),color='red',size=3)+
  geom_point(aes(y=slow_norm),color='blue')
<<<<<<< HEAD

=======

>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203 <<<<<<< HEAD
multi_D <- grid %>% 
=======

cmax_t <- function(t,m0=1,D=10^-5){
  m0=m0
  A=1
  D=D
  return(2*m_0/(A*sqrt(4*pi*D*t)))
}

multi_D <- grid %>% 
>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203
  filter(x==0) %>% 
  filter(t>0) %>% 
  mutate(cfast=cmax_t(t,m0=1,D=10^-6)) %>% 
  mutate(cfast_high=cmax_t(t,m0=10,D=10^-6)) %>% 
  mutate(cslow=cmax_t(t,m0=1,D=10^-7)) %>% 
  mutate(max_fast=max(cfast)) %>% 
  mutate(max_slow=max(cslow)) %>% 
  mutate(max_fast_high=max(cfast_high)) %>% 
  mutate(fast_norm=cfast/max_fast) %>% 
  mutate(slow_norm=cslow/max_slow) %>% 
  mutate(fast_high_norm=cfast_high/max_fast_high)
Error in mutate_impl(.data, dots) : 
  Evaluation error: object 'm_0' not found.
<<<<<<< HEAD

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0KY194X3QgPC0gZnVuY3Rpb24oeCx0KXsKICBtXzA9MQogIEE9MC4wNQogIEQ9MTBeLTUKICAKICByZXR1cm4oIChtXzAvKEEqc3FydCg0KnBpKkQqdCkpKSpleHAoLSh4XjIpLyg0KkQqdCkpICkKfQoKY21heF90IDwtIGZ1bmN0aW9uKHQpewogIG1fMD0xMAogIEE9MQogIEQ9MTBeLTUKICByZXR1cm4oMiptXzAvKEEqc3FydCg0KnBpKkQqdCkpKQp9CmBgYAoKCmBgYHtyfQpncmlkIDwtIGV4cGFuZC5ncmlkKAogIHggPSBzZXEoLTAuMSwwLjEsbGVuZ3RoPTEwMSksCiAgdCA9IHNlcSgwLCAxMDAsIGxlbmd0aCA9IDEwMSkKICApCgpncmlkX2RhdGEgPC0gZ3JpZCAlPiUgCiAgbXV0YXRlKGM9Y194X3QoeCx0KSkKCmdncGxvdChncmlkX2RhdGEsYWVzKHgqMTAwMDAsYyxjb2xvcj10KSkrZ2VvbV9wYXRoKGFlcyhncm91cD10KSkrc2NhbGVfY29sb3JfdmlyaWRpcygpCgpnZ3Bsb3QoZ3JpZF9kYXRhICU+JSBmaWx0ZXIoeD09MCksYWVzKHQsYyxjb2xvcj10KSkrZ2VvbV9wb2ludCgpK3NjYWxlX2NvbG9yX3ZpcmlkaXMoKQpgYGAKCmBgYHtyfQpjX3hfdF9ub0ZsdXggPC0gZnVuY3Rpb24oeCx0KXsKICBtXzA9MTAKICBBPTEKICBEPTEwXi01CiAgCiAgcmV0dXJuKCAobV8wLyhBKnNxcnQoNCpwaSpEKnQpKSkqKGV4cCgtKHheMikvKDQqRCp0KSkrZXhwKC0oKHgpXjIpLyg0KkQqdCkpICkgICkKfQoKZ3JpZF9kYXRhMiA8LSBncmlkICU+JSAKICBtdXRhdGUoYz1jX3hfdF9ub0ZsdXgoeCx0KSkKCmdncGxvdChncmlkX2RhdGEyLGFlcyh4KjEwMDAwLGMsY29sb3I9dCkpK2dlb21fcGF0aChhZXMoZ3JvdXA9dCkpK3NjYWxlX2NvbG9yX3ZpcmlkaXMoKQoKZ2dwbG90KGdyaWRfZGF0YTIgJT4lIGZpbHRlcih4PT0wKSxhZXModCxjLGNvbG9yPXQpKStnZW9tX3BvaW50KCkrc2NhbGVfY29sb3JfdmlyaWRpcygpCmBgYAoKYGBge3J9CmdncGxvdChncmlkX2RhdGEgJT4lIGZpbHRlcih4PT0wKSxhZXModCxjLGNvbG9yPXQpKStnZW9tX3BvaW50KCkrCiAgZ2VvbV9wb2ludChkYXRhPWdyaWRfZGF0YTIgJT4lIGZpbHRlcih4PT0wKSxhZXModCxjLGNvbG9yPXQpKSsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkKCmBgYAoKYGBge3J9Cm1heF9kYXRhIDwtIHRpYmJsZSh0ID0gc2VxKDAsIDEwMCwgbGVuZ3RoID0gMTAxKSkgJT4lIAogIG11dGF0ZShjPWNtYXhfdCh0KSkKCmdncGxvdChncmlkX2RhdGEgJT4lIGZpbHRlcih4PT0wKSxhZXModCxjLGNvbG9yPXQpKStnZW9tX3BvaW50KCkrCiAgZ2VvbV9wb2ludChkYXRhPWdyaWRfZGF0YTIgJT4lIGZpbHRlcih4PT0wKSxhZXModCxjLGNvbG9yPXQpKSsKICBnZW9tX3BvaW50KGRhdGE9bWF4X2RhdGEsYWVzKHQsYyksY29sb3I9J2JsYWNrJyxzaGFwZT0yMSkrCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpCmBgYAoKYGBge3J9CmNfeF90X2FicyA8LSBmdW5jdGlvbih4LHQpewogIG1fMD0xMAogIEE9MQogIEQ9MTBeLTUKICBMPTAuMDEKICByZXR1cm4oIChtXzAvKEEqc3FydCg0KnBpKkQqdCkpKSooZXhwKC0oeF4yKS8oNCpEKnQpKS1leHAoLSgoeCsyKkwpXjIpLyg0KkQqdCkpICkgICkKfQoKZ3JpZF9kYXRhMyA8LSBncmlkICU+JSAKICBtdXRhdGUoYz1jX3hfdF9hYnMoeCx0KSkKCmdncGxvdChncmlkX2RhdGEzLGFlcyh4KjEwMDAwLGMsY29sb3I9dCkpK2dlb21fcGF0aChhZXMoZ3JvdXA9dCkpK3NjYWxlX2NvbG9yX3ZpcmlkaXMoKQpgYGAKCmBgYHtyfQpjX3hfdF9ub0ZsdXhhYnMgPC0gZnVuY3Rpb24oeCx0KXsKICBtXzA9MTAKICBBPTEKICBEPTEwXi01CiAgTD0wLjAxCiAgcmV0dXJuKCAobV8wLyhBKnNxcnQoNCpwaSpEKnQpKSkqKGV4cCgtKHheMikvKDQqRCp0KSktZXhwKC0oKHgrMipMKV4yKS8oNCpEKnQpKStleHAoLSgoeCleMikvKDQqRCp0KSkpICApCn0KCmdyaWRfZGF0YTQgPC0gZ3JpZCAlPiUgCiAgbXV0YXRlKGM9Y194X3Rfbm9GbHV4YWJzKHgsdCkpCgpnZ3Bsb3QoZ3JpZF9kYXRhMyxhZXMoeCoxMDAwMCxjLGNvbG9yPXQpKStnZW9tX3BhdGgoYWVzKGdyb3VwPXQpKStzY2FsZV9jb2xvcl92aXJpZGlzKCkKCmdncGxvdChncmlkX2RhdGEgJT4lIGZpbHRlcih4PT0wKSxhZXModCxjLGNvbG9yPXQpKStnZW9tX3BvaW50KCkrCiAgZ2VvbV9wb2ludChkYXRhPWdyaWRfZGF0YTIgJT4lIGZpbHRlcih4PT0wKSxhZXModCxjLGNvbG9yPXQpKSsKICBnZW9tX3BvaW50KGRhdGE9Z3JpZF9kYXRhNCAlPiUgZmlsdGVyKHg9PTApLGFlcyh0LGMpLGNvbG9yPSdibGFjaycsc2hhcGU9MjEpKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKQpgYGAKCmBgYHtyfQpjX3hfdF9maW5pdGUgPC0gZnVuY3Rpb24oeCx0KXsKICBtXzA9MTAKICBBPTEKICBEPTEwXi01CiAgTD0wLjEKICByZXR1cm4oIChtXzAvKEEqc3FydCg0KnBpKkQqdCkpKSooZXhwKC0oeF4yKS8oNCpEKnQpKStleHAoLSgoeCsyKkwpXjIpLyg0KkQqdCkpK2V4cCgtKCh4KV4yKS8oNCpEKnQpKSkgICkKfQoKZ3JpZF9kYXRhX2Zpbml0ZSA8LSBncmlkICU+JSAKICBtdXRhdGUoYz1jX3hfdF9maW5pdGUoeCx0KSkKCmdncGxvdChncmlkX2RhdGFfZmluaXRlICU+JSBmaWx0ZXIoeD09MCksYWVzKHQsYyxjb2xvcj10KSkrZ2VvbV9wb2ludCgpKwogIGdlb21fcG9pbnQoZGF0YT1ncmlkX2RhdGE0ICU+JSBmaWx0ZXIoeD09MCksYWVzKHQsYyksY29sb3I9J2JsYWNrJyxzaGFwZT0yMSkrCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpKwogIHlsaW0oMCxOQSkKYGBgCgoKYGBge3J9CmNfeF90X25vRmx1eCA8LSBmdW5jdGlvbih4LHQsRD0xMF4tNSl7CiAgbV8wPTEKICBBPTEKICBEPUQKICAKICByZXR1cm4oIChtXzAvKEEqc3FydCg0KnBpKkQqdCkpKSooZXhwKC0oeF4yKS8oNCpEKnQpKStleHAoLSgoeCleMikvKDQqRCp0KSkgKSAgKQp9CgpjbWF4X3QgPC0gZnVuY3Rpb24odCxEPTEwXi01KXsKICBtXzA9MQogIEE9MQogIEQ9RAogIHJldHVybigyKm1fMC8oQSpzcXJ0KDQqcGkqRCp0KSkpCn0KCm11bHRpX0QgPC0gZ3JpZCAlPiUgCiAgbXV0YXRlKGNmYXN0PWNfeF90X25vRmx1eCh4LHQsRD0xMF4tNikpICU+JSAKICBtdXRhdGUoY3Nsb3c9Y194X3Rfbm9GbHV4KHgsdCxEPTEwXi03KSkKCmdncGxvdChtdWx0aV9EICU+JSBmaWx0ZXIoeD09MCksYWVzKHg9dCxjb2xvcj10KSkrCiAgZ2VvbV9wb2ludChhZXMoeT1jZmFzdCksY29sb3I9J3JlZCcpKwogIGdlb21fcG9pbnQoYWVzKHk9Y3Nsb3cpLGNvbG9yPSdibHVlJykKCmdncGxvdChtdWx0aV9EICU+JSBmaWx0ZXIoeD09MCksYWVzKHg9dF4tMC41LGNvbG9yPXQpKSsKICBnZW9tX3BvaW50KGFlcyh5PWNmYXN0KSxjb2xvcj0ncmVkJykrCiAgZ2VvbV9wb2ludChhZXMoeT1jc2xvdyksY29sb3I9J2JsdWUnKSsKICBnZW9tX3Ntb290aChhZXMoeT1jZmFzdCksbWV0aG9kPSdsbScsc2U9Rixjb2xvcj0ncmVkJyxsaW5ldHlwZT0yKSsKICBnZW9tX3Ntb290aChhZXMoeT1jc2xvdyksbWV0aG9kPSdsbScsc2U9Rixjb2xvcj0nYmx1ZScsbGluZXR5cGU9MikKCm11bHRpX0Rfbm9ybSA8LSBtdWx0aV9EICU+JSAKICBmaWx0ZXIoeD09MCAmIHQ+MCkgJT4lIAogIG11dGF0ZShtYXhfZmFzdD1tYXgoY2Zhc3QpKSAlPiUgCiAgbXV0YXRlKG1heF9zbG93PW1heChjc2xvdykpICU+JSAKICBtdXRhdGUoZmFzdF9ub3JtPWNmYXN0L21heF9mYXN0KSAlPiUgCiAgbXV0YXRlKHNsb3dfbm9ybT1jc2xvdy9tYXhfc2xvdykKCmdncGxvdChtdWx0aV9EX25vcm0gJT4lIGZpbHRlcih4PT0wKSxhZXMoeD10Xi0wLjUsY29sb3I9dCkpKwogIGdlb21fcG9pbnQoYWVzKHk9ZmFzdF9ub3JtKSxjb2xvcj0ncmVkJyxzaXplPTMpKwogIGdlb21fcG9pbnQoYWVzKHk9c2xvd19ub3JtKSxjb2xvcj0nYmx1ZScpCmBgYAoKYGBge3J9CmNtYXhfdCA8LSBmdW5jdGlvbih0LG0wPTEsRD0xMF4tNSl7CiAgbTA9bTAKICBBPTEKICBEPUQKICByZXR1cm4oMiptXzAvKEEqc3FydCg0KnBpKkQqdCkpKQp9CgptdWx0aV9EIDwtIGdyaWQgJT4lIAogIGZpbHRlcih4PT0wKSAlPiUgCiAgZmlsdGVyKHQ+MCkgJT4lIAogIG11dGF0ZShjZmFzdD1jbWF4X3QodCxtMD0xLEQ9MTBeLTYpKSAlPiUgCiAgbXV0YXRlKGNmYXN0X2hpZ2g9Y21heF90KHQsbTA9MTAsRD0xMF4tNikpICU+JSAKICBtdXRhdGUoY3Nsb3c9Y21heF90KHQsbTA9MSxEPTEwXi03KSkgJT4lIAogIG11dGF0ZShtYXhfZmFzdD1tYXgoY2Zhc3QpKSAlPiUgCiAgbXV0YXRlKG1heF9zbG93PW1heChjc2xvdykpICU+JSAKICBtdXRhdGUobWF4X2Zhc3RfaGlnaD1tYXgoY2Zhc3RfaGlnaCkpICU+JSAKICBtdXRhdGUoZmFzdF9ub3JtPWNmYXN0L21heF9mYXN0KSAlPiUgCiAgbXV0YXRlKHNsb3dfbm9ybT1jc2xvdy9tYXhfc2xvdykgJT4lIAogIG11dGF0ZShmYXN0X2hpZ2hfbm9ybT1jZmFzdF9oaWdoL21heF9mYXN0X2hpZ2gpCgptdWx0aV9EX2xtIDwtIG11bHRpX0QgJT4lIAogIG11dGF0ZSh0SGFsZj10Xi0wLjUpCgpnZ3Bsb3QobXVsdGlfRCxhZXMoeD10KSkrCiAgZ2VvbV9wb2ludChhZXMoeT1jZmFzdCksY29sb3I9J3JlZCcsc2l6ZT0zKSsKICBnZW9tX3BvaW50KGFlcyh5PWNmYXN0X2hpZ2gpLGNvbG9yPSdncmVlbicpKwogIGdlb21fcG9pbnQoYWVzKHk9Y3Nsb3cpLGNvbG9yPSdibHVlJykKCmdncGxvdChtdWx0aV9EX2xtLGFlcyh4PXRIYWxmKSkrCiAgZ2VvbV9wb2ludChhZXMoeT1jZmFzdCksY29sb3I9J3JlZCcsc2l6ZT0zKSsKICBnZW9tX3BvaW50KGFlcyh5PWNmYXN0X2hpZ2gpLGNvbG9yPSdncmVlbicpKwogIGdlb21fcG9pbnQoYWVzKHk9Y3Nsb3cpLGNvbG9yPSdibHVlJykKCmdncGxvdChtdWx0aV9ELGFlcyh4PXQpKSsKICBnZW9tX3BvaW50KGFlcyh5PWZhc3Rfbm9ybSksY29sb3I9J3JlZCcsc2l6ZT0zKSsKICBnZW9tX3BvaW50KGFlcyh5PWZhc3RfaGlnaF9ub3JtKSxjb2xvcj0nZ3JlZW4nKSsKICBnZW9tX3BvaW50KGFlcyh5PXNsb3dfbm9ybSksY29sb3I9J2JsdWUnLHNpemU9MC41KQoKbG1fZmFzdCA8LSBsbShjZmFzdH50SGFsZixkYXRhPW11bHRpX0RfbG0pCnN1bW1hcnkobG1fZmFzdCkKCkQ9MS8ocGkqY29lZihsbV9mYXN0KVsyXV4yKQpECgoKCmNtYXhfdChEPTEwXi02KQoKbG1fZmFzdCA8LSBsbShzbG93X25vcm1+dEhhbGYsZGF0YT1tdWx0aV9EX2xtKQpzdW1tYXJ5KGxtX2Zhc3QpCmBgYAoKYGBge3J9CmdlbmVyYXRlX0lzd3YgPC0gZnVuY3Rpb24odCxJMCxEX2FwLERfbSx0X3MpewogIElzd3YgPC0gSTAqKHNxcnQoRF9hcCp0X3MpL3NxcnQoNCpEX20qdCkpCiAgSXN3dgp9CgpjYWxjX0RfbSA8LSBmdW5jdGlvbihkZix0PXQsaTFfbm9pc2U9aTFfbm9pc2UsRF9hcCx0X3MsaV8wPU5BKXsKICBpZihpcy5uYShpXzApKXsKICAgIGlfMCA9IG1pbihkZiRpMV9ub2lzZSkKICB9CiAgZml0ID0gbmxzKGkxX25vaXNlfm0qdF4tMC41K2IsZGF0YT1kZixzdGFydD1jKG09MC4xLGI9MCkpCiAgbT1jb2VmKGZpdClbMV0KICBEX209KGlfMF4yICogRF9hcCAqIHRfcykgLyAoNCptXjIpCiAgYyhEX20saV8wLGNvZWYoZml0KVsyXSkKfQoKI2dlbmVyYXRlX0lzd3YoMSxJMD0xLDFlLTUsMWUtOSwwLjEpCgpnZW5fSXN3diA8LSBncmlkICU+JSAKICBmaWx0ZXIoeD09MCkgJT4lIAogIGZpbHRlcih0PjApICU+JSAKICBtdXRhdGUoaTE9Z2VuZXJhdGVfSXN3dih0LEkwPTEwLERfYXA9MWUtNSxEX209MWUtOSx0X3M9MC4xKSkgJT4lIAogIG11dGF0ZShpMV9ub2lzZSA9IHJub3JtKGxlbmd0aChnZW5fSXN3diR0KSxtZWFuPWkxLHNkPTAuMSkpCgpnZ3Bsb3QoZ2VuX0lzd3YsYWVzKHg9dCx5PWkxKSkrZ2VvbV9wb2ludCgpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEwKQoKZ2dwbG90KGdlbl9Jc3d2LGFlcyh4PXQseT1pMV9ub2lzZSkpK2dlb21fcG9pbnQoKSAgICAgICAKICAgICAgIApmaXQgPC0gbmxzKGkxX25vaXNlfmIrKG0qdF4tMC41KSxkYXRhID0gZ2VuX0lzd3Ysc3RhcnQ9YyhtPTAuMSxiPTApKQpjb2VmKGZpdCkKCgpEX21fMiA9IGNhbGNfRF9tKGRmPWdlbl9Jc3d2LHQ9dCxpMV9ub2lzZT1pMV9ub2lzZSxEX2FwPTFlLTUsdF9zPTAuMSkKRF9tXzIgPSBjYWxjX0RfbShkZj1nZW5fSXN3dix0PXQsaTFfbm9pc2U9aTFfbm9pc2UsRF9hcD0xZS01LHRfcz0wLjEsaV8wID0gMSkKCmdlbl9Jc3d2XzIgPC0gZ3JpZCAlPiUgCiAgZmlsdGVyKHg9PTApICU+JSAKICBmaWx0ZXIodD4wKSAlPiUgCiAgbXV0YXRlKGkxPWdlbmVyYXRlX0lzd3YodCxJMD1EX21fMlsyXSxEX2FwPTFlLTUsRF9tPURfbV8yWzFdLHRfcz0wLjEpKSAlPiUgCiAgbXV0YXRlKGkxX25vaXNlID0gcm5vcm0obGVuZ3RoKGdlbl9Jc3d2JHQpLG1lYW49aTEsc2Q9MC4xKSkKCmdncGxvdChnZW5fSXN3dixhZXMoeD10LHk9aTFfbm9pc2UpKStnZW9tX3BvaW50KCkrCiAgZ2VvbV9wb2ludChkYXRhPWdlbl9Jc3d2XzIsY29sb3I9J3JlZCcpK2dlb21faGxpbmUoeWludGVyY2VwdCA9IDEwKSsKICBnZW9tX3Ntb290aChtZXRob2Q9J25scycsZm9ybXVsYT15fmIqKHgpXi0wLjUrYSxtZXRob2QuYXJncz1saXN0KHN0YXJ0PWMoYj0wLjEsYT0wKSksc2U9RixmdWxscmFuZ2U9VCkKCiAgI2lfMD1tYXgoZ2VuX0lzd3YpCiNmaXQ9bmxzKGkxX25vaXNlfm0qdF4tMC41K2IsZGF0YT1nZW5fSXN3dixzdGFydD1jKG09MC4xLGI9MCkpCiNtPWNvZWYoZml0KVsxXQojRF9tPShpXzBeMiAqIERfYXAgKiB0X3MpIC8gKDQqbV4yKQojICBEX20KCmBgYA==
=======
generate_Iswv <- function(t,I0,D_ap,D_m,t_s){
  Iswv <- I0*(sqrt(D_ap*t_s)/sqrt(4*D_m*t))
  Iswv
}

calc_D_m <- function(df,t=t,i1_noise=i1_noise,D_ap,t_s,i_0=NA){
  if(is.na(i_0)){
    i_0 = min(df$i1_noise)
  }
  fit = nls(i1_noise~m*t^-0.5+b,data=df,start=c(m=0.1,b=0))
  m=coef(fit)[1]
  D_m=(i_0^2 * D_ap * t_s) / (4*m^2)
  c(D_m,i_0,coef(fit)[2])
}

#generate_Iswv(1,I0=1,1e-5,1e-9,0.1)

gen_Iswv <- grid %>% 
  filter(x==0) %>% 
  filter(t>0) %>% 
  mutate(i1=generate_Iswv(t,I0=10,D_ap=1e-5,D_m=1e-9,t_s=0.1)) %>% 
  mutate(i1_noise = rnorm(length(gen_Iswv$t),mean=i1,sd=0.1))

ggplot(gen_Iswv,aes(x=t,y=i1))+geom_point()+
  geom_hline(yintercept = 10)

ggplot(gen_Iswv,aes(x=t,y=i1_noise))+geom_point()       
       
fit <- nls(i1_noise~b+(m*t^-0.5),data = gen_Iswv,start=c(m=0.1,b=0))
coef(fit)


D_m_2 = calc_D_m(df=gen_Iswv,t=t,i1_noise=i1_noise,D_ap=1e-5,t_s=0.1)
D_m_2 = calc_D_m(df=gen_Iswv,t=t,i1_noise=i1_noise,D_ap=1e-5,t_s=0.1,i_0 = 1)

gen_Iswv_2 <- grid %>% 
  filter(x==0) %>% 
  filter(t>0) %>% 
  mutate(i1=generate_Iswv(t,I0=D_m_2[2],D_ap=1e-5,D_m=D_m_2[1],t_s=0.1)) %>% 
  mutate(i1_noise = rnorm(length(gen_Iswv$t),mean=i1,sd=0.1))

ggplot(gen_Iswv,aes(x=t,y=i1_noise))+geom_point()+
  geom_point(data=gen_Iswv_2,color='red')+geom_hline(yintercept = 10)+
  geom_smooth(method='nls',formula=y~b*(x)^-0.5+a,method.args=list(start=c(b=0.1,a=0)),se=F,fullrange=T)

  #i_0=max(gen_Iswv)
#fit=nls(i1_noise~m*t^-0.5+b,data=gen_Iswv,start=c(m=0.1,b=0))
#m=coef(fit)[1]
#D_m=(i_0^2 * D_ap * t_s) / (4*m^2)
#  D_m
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodmlyaWRpcykKCmNfeF90IDwtIGZ1bmN0aW9uKHgsdCl7CiAgbV8wPTEKICBBPTAuMDUKICBEPTEwXi01CiAgCiAgcmV0dXJuKCAobV8wLyhBKnNxcnQoNCpwaSpEKnQpKSkqZXhwKC0oeF4yKS8oNCpEKnQpKSApCn0KCmNtYXhfdCA8LSBmdW5jdGlvbih0KXsKICBtXzA9MTAKICBBPTEKICBEPTEwXi01CiAgcmV0dXJuKDIqbV8wLyhBKnNxcnQoNCpwaSpEKnQpKSkKfQpgYGAKCgpgYGB7cn0KZ3JpZCA8LSBleHBhbmQuZ3JpZCgKICB4ID0gc2VxKC0wLjEsMC4xLGxlbmd0aD0xMDEpLAogIHQgPSBzZXEoMCwgMTAwLCBsZW5ndGggPSAxMDEpCiAgKQoKZ3JpZF9kYXRhIDwtIGdyaWQgJT4lIAogIG11dGF0ZShjPWNfeF90KHgsdCkpCgpnZ3Bsb3QoZ3JpZF9kYXRhLGFlcyh4KjEwMDAwLGMsY29sb3I9dCkpK2dlb21fcGF0aChhZXMoZ3JvdXA9dCkpK3NjYWxlX2NvbG9yX3ZpcmlkaXMoKQoKZ2dwbG90KGdyaWRfZGF0YSAlPiUgZmlsdGVyKHg9PTApLGFlcyh0LGMsY29sb3I9dCkpK2dlb21fcG9pbnQoKStzY2FsZV9jb2xvcl92aXJpZGlzKCkKYGBgCgpgYGB7cn0KY194X3Rfbm9GbHV4IDwtIGZ1bmN0aW9uKHgsdCl7CiAgbV8wPTEwCiAgQT0xCiAgRD0xMF4tNQogIAogIHJldHVybiggKG1fMC8oQSpzcXJ0KDQqcGkqRCp0KSkpKihleHAoLSh4XjIpLyg0KkQqdCkpK2V4cCgtKCh4KV4yKS8oNCpEKnQpKSApICApCn0KCmdyaWRfZGF0YTIgPC0gZ3JpZCAlPiUgCiAgbXV0YXRlKGM9Y194X3Rfbm9GbHV4KHgsdCkpCgpnZ3Bsb3QoZ3JpZF9kYXRhMixhZXMoeCoxMDAwMCxjLGNvbG9yPXQpKStnZW9tX3BhdGgoYWVzKGdyb3VwPXQpKStzY2FsZV9jb2xvcl92aXJpZGlzKCkKCmdncGxvdChncmlkX2RhdGEyICU+JSBmaWx0ZXIoeD09MCksYWVzKHQsYyxjb2xvcj10KSkrZ2VvbV9wb2ludCgpK3NjYWxlX2NvbG9yX3ZpcmlkaXMoKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZ3JpZF9kYXRhICU+JSBmaWx0ZXIoeD09MCksYWVzKHQsYyxjb2xvcj10KSkrZ2VvbV9wb2ludCgpKwogIGdlb21fcG9pbnQoZGF0YT1ncmlkX2RhdGEyICU+JSBmaWx0ZXIoeD09MCksYWVzKHQsYyxjb2xvcj10KSkrCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpCgpgYGAKCmBgYHtyfQptYXhfZGF0YSA8LSB0aWJibGUodCA9IHNlcSgwLCAxMDAsIGxlbmd0aCA9IDEwMSkpICU+JSAKICBtdXRhdGUoYz1jbWF4X3QodCkpCgpnZ3Bsb3QoZ3JpZF9kYXRhICU+JSBmaWx0ZXIoeD09MCksYWVzKHQsYyxjb2xvcj10KSkrZ2VvbV9wb2ludCgpKwogIGdlb21fcG9pbnQoZGF0YT1ncmlkX2RhdGEyICU+JSBmaWx0ZXIoeD09MCksYWVzKHQsYyxjb2xvcj10KSkrCiAgZ2VvbV9wb2ludChkYXRhPW1heF9kYXRhLGFlcyh0LGMpLGNvbG9yPSdibGFjaycsc2hhcGU9MjEpKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKQpgYGAKCmBgYHtyfQpjX3hfdF9hYnMgPC0gZnVuY3Rpb24oeCx0KXsKICBtXzA9MTAKICBBPTEKICBEPTEwXi01CiAgTD0wLjAxCiAgcmV0dXJuKCAobV8wLyhBKnNxcnQoNCpwaSpEKnQpKSkqKGV4cCgtKHheMikvKDQqRCp0KSktZXhwKC0oKHgrMipMKV4yKS8oNCpEKnQpKSApICApCn0KCmdyaWRfZGF0YTMgPC0gZ3JpZCAlPiUgCiAgbXV0YXRlKGM9Y194X3RfYWJzKHgsdCkpCgpnZ3Bsb3QoZ3JpZF9kYXRhMyxhZXMoeCoxMDAwMCxjLGNvbG9yPXQpKStnZW9tX3BhdGgoYWVzKGdyb3VwPXQpKStzY2FsZV9jb2xvcl92aXJpZGlzKCkKYGBgCgpgYGB7cn0KY194X3Rfbm9GbHV4YWJzIDwtIGZ1bmN0aW9uKHgsdCl7CiAgbV8wPTEwCiAgQT0xCiAgRD0xMF4tNQogIEw9MC4wMQogIHJldHVybiggKG1fMC8oQSpzcXJ0KDQqcGkqRCp0KSkpKihleHAoLSh4XjIpLyg0KkQqdCkpLWV4cCgtKCh4KzIqTCleMikvKDQqRCp0KSkrZXhwKC0oKHgpXjIpLyg0KkQqdCkpKSAgKQp9CgpncmlkX2RhdGE0IDwtIGdyaWQgJT4lIAogIG11dGF0ZShjPWNfeF90X25vRmx1eGFicyh4LHQpKQoKZ2dwbG90KGdyaWRfZGF0YTMsYWVzKHgqMTAwMDAsYyxjb2xvcj10KSkrZ2VvbV9wYXRoKGFlcyhncm91cD10KSkrc2NhbGVfY29sb3JfdmlyaWRpcygpCgpnZ3Bsb3QoZ3JpZF9kYXRhICU+JSBmaWx0ZXIoeD09MCksYWVzKHQsYyxjb2xvcj10KSkrZ2VvbV9wb2ludCgpKwogIGdlb21fcG9pbnQoZGF0YT1ncmlkX2RhdGEyICU+JSBmaWx0ZXIoeD09MCksYWVzKHQsYyxjb2xvcj10KSkrCiAgZ2VvbV9wb2ludChkYXRhPWdyaWRfZGF0YTQgJT4lIGZpbHRlcih4PT0wKSxhZXModCxjKSxjb2xvcj0nYmxhY2snLHNoYXBlPTIxKSsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkKYGBgCgpgYGB7cn0KY194X3RfZmluaXRlIDwtIGZ1bmN0aW9uKHgsdCl7CiAgbV8wPTEwCiAgQT0xCiAgRD0xMF4tNQogIEw9MC4xCiAgcmV0dXJuKCAobV8wLyhBKnNxcnQoNCpwaSpEKnQpKSkqKGV4cCgtKHheMikvKDQqRCp0KSkrZXhwKC0oKHgrMipMKV4yKS8oNCpEKnQpKStleHAoLSgoeCleMikvKDQqRCp0KSkpICApCn0KCmdyaWRfZGF0YV9maW5pdGUgPC0gZ3JpZCAlPiUgCiAgbXV0YXRlKGM9Y194X3RfZmluaXRlKHgsdCkpCgpnZ3Bsb3QoZ3JpZF9kYXRhX2Zpbml0ZSAlPiUgZmlsdGVyKHg9PTApLGFlcyh0LGMsY29sb3I9dCkpK2dlb21fcG9pbnQoKSsKICBnZW9tX3BvaW50KGRhdGE9Z3JpZF9kYXRhNCAlPiUgZmlsdGVyKHg9PTApLGFlcyh0LGMpLGNvbG9yPSdibGFjaycsc2hhcGU9MjEpKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSsKICB5bGltKDAsTkEpCmBgYAoKCmBgYHtyfQpjX3hfdF9ub0ZsdXggPC0gZnVuY3Rpb24oeCx0LEQ9MTBeLTUpewogIG1fMD0xCiAgQT0xCiAgRD1ECiAgCiAgcmV0dXJuKCAobV8wLyhBKnNxcnQoNCpwaSpEKnQpKSkqKGV4cCgtKHheMikvKDQqRCp0KSkrZXhwKC0oKHgpXjIpLyg0KkQqdCkpICkgICkKfQoKY21heF90IDwtIGZ1bmN0aW9uKHQsRD0xMF4tNSl7CiAgbV8wPTEKICBBPTEKICBEPUQKICByZXR1cm4oMiptXzAvKEEqc3FydCg0KnBpKkQqdCkpKQp9CgptdWx0aV9EIDwtIGdyaWQgJT4lIAogIG11dGF0ZShjZmFzdD1jX3hfdF9ub0ZsdXgoeCx0LEQ9MTBeLTYpKSAlPiUgCiAgbXV0YXRlKGNzbG93PWNfeF90X25vRmx1eCh4LHQsRD0xMF4tNykpCgpnZ3Bsb3QobXVsdGlfRCAlPiUgZmlsdGVyKHg9PTApLGFlcyh4PXQsY29sb3I9dCkpKwogIGdlb21fcG9pbnQoYWVzKHk9Y2Zhc3QpLGNvbG9yPSdyZWQnKSsKICBnZW9tX3BvaW50KGFlcyh5PWNzbG93KSxjb2xvcj0nYmx1ZScpCgpnZ3Bsb3QobXVsdGlfRCAlPiUgZmlsdGVyKHg9PTApLGFlcyh4PXReLTAuNSxjb2xvcj10KSkrCiAgZ2VvbV9wb2ludChhZXMoeT1jZmFzdCksY29sb3I9J3JlZCcpKwogIGdlb21fcG9pbnQoYWVzKHk9Y3Nsb3cpLGNvbG9yPSdibHVlJykrCiAgZ2VvbV9zbW9vdGgoYWVzKHk9Y2Zhc3QpLG1ldGhvZD0nbG0nLHNlPUYsY29sb3I9J3JlZCcsbGluZXR5cGU9MikrCiAgZ2VvbV9zbW9vdGgoYWVzKHk9Y3Nsb3cpLG1ldGhvZD0nbG0nLHNlPUYsY29sb3I9J2JsdWUnLGxpbmV0eXBlPTIpCgptdWx0aV9EX25vcm0gPC0gbXVsdGlfRCAlPiUgCiAgZmlsdGVyKHg9PTAgJiB0PjApICU+JSAKICBtdXRhdGUobWF4X2Zhc3Q9bWF4KGNmYXN0KSkgJT4lIAogIG11dGF0ZShtYXhfc2xvdz1tYXgoY3Nsb3cpKSAlPiUgCiAgbXV0YXRlKGZhc3Rfbm9ybT1jZmFzdC9tYXhfZmFzdCkgJT4lIAogIG11dGF0ZShzbG93X25vcm09Y3Nsb3cvbWF4X3Nsb3cpCgpnZ3Bsb3QobXVsdGlfRF9ub3JtICU+JSBmaWx0ZXIoeD09MCksYWVzKHg9dF4tMC41LGNvbG9yPXQpKSsKICBnZW9tX3BvaW50KGFlcyh5PWZhc3Rfbm9ybSksY29sb3I9J3JlZCcsc2l6ZT0zKSsKICBnZW9tX3BvaW50KGFlcyh5PXNsb3dfbm9ybSksY29sb3I9J2JsdWUnKQpgYGAKCmBgYHtyIGV2YWwgPSBGfQpjbWF4X3QgPC0gZnVuY3Rpb24odCxtMD0xLEQ9MTBeLTUpewogIG0wPW0wCiAgQT0xCiAgRD1ECiAgcmV0dXJuKDIqbV8wLyhBKnNxcnQoNCpwaSpEKnQpKSkKfQoKbXVsdGlfRCA8LSBncmlkICU+JSAKICBmaWx0ZXIoeD09MCkgJT4lIAogIGZpbHRlcih0PjApICU+JSAKICBtdXRhdGUoY2Zhc3Q9Y21heF90KHQsbTA9MSxEPTEwXi02KSkgJT4lIAogIG11dGF0ZShjZmFzdF9oaWdoPWNtYXhfdCh0LG0wPTEwLEQ9MTBeLTYpKSAlPiUgCiAgbXV0YXRlKGNzbG93PWNtYXhfdCh0LG0wPTEsRD0xMF4tNykpICU+JSAKICBtdXRhdGUobWF4X2Zhc3Q9bWF4KGNmYXN0KSkgJT4lIAogIG11dGF0ZShtYXhfc2xvdz1tYXgoY3Nsb3cpKSAlPiUgCiAgbXV0YXRlKG1heF9mYXN0X2hpZ2g9bWF4KGNmYXN0X2hpZ2gpKSAlPiUgCiAgbXV0YXRlKGZhc3Rfbm9ybT1jZmFzdC9tYXhfZmFzdCkgJT4lIAogIG11dGF0ZShzbG93X25vcm09Y3Nsb3cvbWF4X3Nsb3cpICU+JSAKICBtdXRhdGUoZmFzdF9oaWdoX25vcm09Y2Zhc3RfaGlnaC9tYXhfZmFzdF9oaWdoKQoKbXVsdGlfRF9sbSA8LSBtdWx0aV9EICU+JSAKICBtdXRhdGUodEhhbGY9dF4tMC41KQoKZ2dwbG90KG11bHRpX0QsYWVzKHg9dCkpKwogIGdlb21fcG9pbnQoYWVzKHk9Y2Zhc3QpLGNvbG9yPSdyZWQnLHNpemU9MykrCiAgZ2VvbV9wb2ludChhZXMoeT1jZmFzdF9oaWdoKSxjb2xvcj0nZ3JlZW4nKSsKICBnZW9tX3BvaW50KGFlcyh5PWNzbG93KSxjb2xvcj0nYmx1ZScpCgpnZ3Bsb3QobXVsdGlfRF9sbSxhZXMoeD10SGFsZikpKwogIGdlb21fcG9pbnQoYWVzKHk9Y2Zhc3QpLGNvbG9yPSdyZWQnLHNpemU9MykrCiAgZ2VvbV9wb2ludChhZXMoeT1jZmFzdF9oaWdoKSxjb2xvcj0nZ3JlZW4nKSsKICBnZW9tX3BvaW50KGFlcyh5PWNzbG93KSxjb2xvcj0nYmx1ZScpCgpnZ3Bsb3QobXVsdGlfRCxhZXMoeD10KSkrCiAgZ2VvbV9wb2ludChhZXMoeT1mYXN0X25vcm0pLGNvbG9yPSdyZWQnLHNpemU9MykrCiAgZ2VvbV9wb2ludChhZXMoeT1mYXN0X2hpZ2hfbm9ybSksY29sb3I9J2dyZWVuJykrCiAgZ2VvbV9wb2ludChhZXMoeT1zbG93X25vcm0pLGNvbG9yPSdibHVlJyxzaXplPTAuNSkKCmxtX2Zhc3QgPC0gbG0oY2Zhc3R+dEhhbGYsZGF0YT1tdWx0aV9EX2xtKQpzdW1tYXJ5KGxtX2Zhc3QpCgpEPTEvKHBpKmNvZWYobG1fZmFzdClbMl1eMikKRAoKCgpjbWF4X3QoRD0xMF4tNikKCmxtX2Zhc3QgPC0gbG0oc2xvd19ub3JtfnRIYWxmLGRhdGE9bXVsdGlfRF9sbSkKc3VtbWFyeShsbV9mYXN0KQpgYGAKCmBgYHtyIGV2YWwgPSBGfQpnZW5lcmF0ZV9Jc3d2IDwtIGZ1bmN0aW9uKHQsSTAsRF9hcCxEX20sdF9zKXsKICBJc3d2IDwtIEkwKihzcXJ0KERfYXAqdF9zKS9zcXJ0KDQqRF9tKnQpKQogIElzd3YKfQoKY2FsY19EX20gPC0gZnVuY3Rpb24oZGYsdD10LGkxX25vaXNlPWkxX25vaXNlLERfYXAsdF9zLGlfMD1OQSl7CiAgaWYoaXMubmEoaV8wKSl7CiAgICBpXzAgPSBtaW4oZGYkaTFfbm9pc2UpCiAgfQogIGZpdCA9IG5scyhpMV9ub2lzZX5tKnReLTAuNStiLGRhdGE9ZGYsc3RhcnQ9YyhtPTAuMSxiPTApKQogIG09Y29lZihmaXQpWzFdCiAgRF9tPShpXzBeMiAqIERfYXAgKiB0X3MpIC8gKDQqbV4yKQogIGMoRF9tLGlfMCxjb2VmKGZpdClbMl0pCn0KCiNnZW5lcmF0ZV9Jc3d2KDEsSTA9MSwxZS01LDFlLTksMC4xKQoKZ2VuX0lzd3YgPC0gZ3JpZCAlPiUgCiAgZmlsdGVyKHg9PTApICU+JSAKICBmaWx0ZXIodD4wKSAlPiUgCiAgbXV0YXRlKGkxPWdlbmVyYXRlX0lzd3YodCxJMD0xMCxEX2FwPTFlLTUsRF9tPTFlLTksdF9zPTAuMSkpICU+JSAKICBtdXRhdGUoaTFfbm9pc2UgPSBybm9ybShsZW5ndGgoZ2VuX0lzd3YkdCksbWVhbj1pMSxzZD0wLjEpKQoKZ2dwbG90KGdlbl9Jc3d2LGFlcyh4PXQseT1pMSkpK2dlb21fcG9pbnQoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxMCkKCmdncGxvdChnZW5fSXN3dixhZXMoeD10LHk9aTFfbm9pc2UpKStnZW9tX3BvaW50KCkgICAgICAgCiAgICAgICAKZml0IDwtIG5scyhpMV9ub2lzZX5iKyhtKnReLTAuNSksZGF0YSA9IGdlbl9Jc3d2LHN0YXJ0PWMobT0wLjEsYj0wKSkKY29lZihmaXQpCgoKRF9tXzIgPSBjYWxjX0RfbShkZj1nZW5fSXN3dix0PXQsaTFfbm9pc2U9aTFfbm9pc2UsRF9hcD0xZS01LHRfcz0wLjEpCkRfbV8yID0gY2FsY19EX20oZGY9Z2VuX0lzd3YsdD10LGkxX25vaXNlPWkxX25vaXNlLERfYXA9MWUtNSx0X3M9MC4xLGlfMCA9IDEpCgpnZW5fSXN3dl8yIDwtIGdyaWQgJT4lIAogIGZpbHRlcih4PT0wKSAlPiUgCiAgZmlsdGVyKHQ+MCkgJT4lIAogIG11dGF0ZShpMT1nZW5lcmF0ZV9Jc3d2KHQsSTA9RF9tXzJbMl0sRF9hcD0xZS01LERfbT1EX21fMlsxXSx0X3M9MC4xKSkgJT4lIAogIG11dGF0ZShpMV9ub2lzZSA9IHJub3JtKGxlbmd0aChnZW5fSXN3diR0KSxtZWFuPWkxLHNkPTAuMSkpCgpnZ3Bsb3QoZ2VuX0lzd3YsYWVzKHg9dCx5PWkxX25vaXNlKSkrZ2VvbV9wb2ludCgpKwogIGdlb21fcG9pbnQoZGF0YT1nZW5fSXN3dl8yLGNvbG9yPSdyZWQnKStnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxMCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSdubHMnLGZvcm11bGE9eX5iKih4KV4tMC41K2EsbWV0aG9kLmFyZ3M9bGlzdChzdGFydD1jKGI9MC4xLGE9MCkpLHNlPUYsZnVsbHJhbmdlPVQpCgogICNpXzA9bWF4KGdlbl9Jc3d2KQojZml0PW5scyhpMV9ub2lzZX5tKnReLTAuNStiLGRhdGE9Z2VuX0lzd3Ysc3RhcnQ9YyhtPTAuMSxiPTApKQojbT1jb2VmKGZpdClbMV0KI0RfbT0oaV8wXjIgKiBEX2FwICogdF9zKSAvICg0Km1eMikKIyAgRF9tCgpgYGA=
>>>>>>> cf151da1e1952567d595e650cfd7faa0282d5203