In this R Markdown notebook I draw some figures illustrating the basic ideas in the monocentric city model (Alonso-Muth-Mills model). To keep things simple, I use a model without a housing construction industry and where consumers just consume land directly. The city is a line and the amount of land at every point is equal to 1.

Assumptions and Functional Forms

Consumers have Cobb-Douglas utility over land \(l\) and a numeraire good \(z\).

\[U(l,z)=l^{\alpha}z^{1-\alpha}\tag{1}\]

For a consumer living at distance \(x\) from the center, the budget constraint is: \[y=z+r(x)l(x)-\tau*x\tag{2}\] The city is closed, with population \(N\), and agricultural land rent \(r_A\).

Solving the Model

In equilibrium all consumers have the same (endogenous) utility, \(\bar{u}\), and the land rent at the fringe of the city is equal to the agricultural rent, \(r(\bar{x})=r_A\). Further, there is one unit of land at every location, \(L(x)=1\) for \(x=0\) to \(x=\bar{x}\), and everyone is housed between the center of the city and the fringe.

From Cobb-Douglas demand we know that \(z(x)=(1-\alpha)(y-\tau*x)\) and \(l(x)=\frac{\alpha(y-\tau*x)}{r(x)}\). Substituting these into the spatial equilibrium condition (equal utility) gives:

\[U(l,z)=\left[\frac{\alpha(y-\tau*x)}{r(x)}\right]^{\alpha}\left[(1-\alpha)(y-\tau*x)\right]^{1-\alpha}=\bar{u}\tag{3}\] We can rewrite this equation to express land rent at \(x\) as a function of \(y\), \(\tau\), \(\bar{u}\), and \(\alpha\). \[r(x)=\left(\frac{y-\tau*x}{\bar{u}}\right)^{\frac{1}{\alpha}}\alpha(1-\alpha)^{\frac{1-\alpha}{\alpha}}\tag{4}\] The Alonso-Muth condition tells us the gradient of the land rent, which we could also derive by taking the derivative of the above equation: \[\frac{dr(x)}{dx}=-\tau((1-\alpha)(y-\tau*x))^{\frac{1-\alpha}{\alpha}}\bar{u}^{\frac{-1}{\alpha}}=\frac{-\tau}{l(x)}\tag{5}\] There are \(1/l(x)\) people living at every location \(x\). Combining the Alonso-Muth condition with the requirement that everyone is housed in the city implies that: \[\displaystyle\int_{x=0}^{\bar{x}}\frac{1}{l(x)}dx=\frac{1}{-\tau}\displaystyle\int_{x=0}^{\bar{x}}\frac{dr(x)}{dx}dx=\frac{r(\bar{x})-r(0)}{-\tau}=N\tag{6}\] Using \(r(\bar{x})=r_A\) gives \(r(0)=\tau*N+r(\bar{x})\). We can then find the utility of a consumer at the center by inserting this expression for \(r(0)\) into the indirect utility function (eq 3), thus giving us \(\bar{u}\). Finally, with \(\bar{u}\) we can solve for \(\bar{x}\) by the land rent equation (eq 4) equal to \(r_A\).

Solving for equilibrium

First, let’s set the exogenous parameters: \(\alpha\), \(y\), \(\tau\), \(r_A\), and \(N\).

alpha<-0.5
y<-100
tau<-1
r.A<-50
N<-1000

Next, let’s write functions for the indirect utility and land rent, so that we can solve for the equilibrium values of \(\bar{u}\) and \(\bar{x}\).

V<-function(x,r.x,alpha,y,tau){
  l.x<-alpha*(y-tau*x)/r.x #demand for land
  z.x<-(1-alpha)*(y-tau*x) #demand for numeraire
  l.x^alpha*z.x^(1-alpha) #returns the utility at x
}
R<-function(x,alpha,y,tau,u.bar) {
  inner<-(y-tau*x)/u.bar
  const<-alpha*(1-alpha)^((1-alpha)/alpha)
  inner^(1/alpha)*const #returns the rent at x
}

Now let’s solve for the equilibrium values. To find the fringe we will look for the value \(\bar{x}\) such that \(R(\bar{x})-r_A=0\).

r.0<-r.A+tau*N
u.bar<-V(0,r.0,alpha,y,tau)
#Define a function so that we can find x.bar
find.xbar<-function(x,alpha,y,tau,r.A,u.bar) {
  R(x,alpha,y,tau,u.bar)-r.A
}
x.bar<-as.numeric(uniroot(find.xbar,lower=0,upper=y/tau,alpha=alpha,y=y,tau=tau,r.A=r.A,u.bar=u.bar)[1])

The equilibrium values are \(\bar{u}\)=1.5430335 and \(\bar{x}\)=78.178211. Is this correct? Let’s check if integrating the population at each location is equal to the total, \(N\).

l.demand<-function(x,alpha,y,tau,r.x) { #demand for land
  alpha*(y-tau*x)/r.x
}
pop<-function(x,alpha,y,tau,u.bar) {
  r.x<-R(x,alpha,y,tau,u.bar)
  1/l.demand(x,alpha,y,tau,r.x)
}
N.check<-integrate(pop,lower=0,upper=x.bar,alpha=alpha,y=y,tau=tau,u.bar=u.bar) #this should be equal to N

Integrating the population over the city yields a total population of N.check=1000

Graphing

First, let’s graph the equilibrium rent curve

curve(R(x,alpha,y,tau,u.bar),from=0,to=x.bar,xlab="Distance from center (x)",ylab="Land rent, r(x)",main="Land rent over the city")

Next we can look at land consumption:

curve(l.demand(x,alpha,y,tau,R(x,alpha,y,tau,u.bar)),from=0,to=x.bar,xlab="Distance from center (x)",ylab="Land consumption, l(x)",main="Land consumption over the city")

Comparative Statics

Now let’s look at some comparative statics.

y.1<-500
tau.1<-0.7
r.A.1<-100
N.1<-5000

How does a change in the transporation cost \(\tau\) from \(\tau_0\)=1 to \(\tau_1\)=0.7 affect land consumption at every point?

r.0.1<-r.A+tau.1*N
u.bar.1<-V(0,r.0.1,alpha,y,tau.1)
x.bar.1<-as.numeric(uniroot(find.xbar,lower=0,upper=y/tau.1,alpha=alpha,y=y,tau=tau.1,r.A=r.A,u.bar=u.bar.1)[1])

curve(R(x,alpha,y,tau.1,u.bar.1),from=0,to=x.bar.1,xlab="Distance from center (x)",ylab="Land rent, r(x)",main="Land rent over the city",col="red",ylim=c(0,max(r.0,r.0.1)),xlim=c(0,max(x.bar,x.bar.1)))
curve(R(x,alpha,y,tau,u.bar),from=0,to=x.bar,add=TRUE,col="black")
text(x.bar,l.demand(x.bar,alpha,y,tau,r.A),"tau.0")
text(x.bar.1,l.demand(x.bar.1,alpha,y,tau.1,r.A),"tau.1",col="red")


curve(l.demand(x,alpha,y,tau.1,R(x,alpha,y,tau.1,u.bar.1)),from=0,to=x.bar.1,xlab="Distance from center (x)",ylab="Land consumption, l(x)",main="Land consumption over the city",col="red",ylim=c(0,0.3),xlim=c(0,max(x.bar,x.bar.1)))
curve(l.demand(x,alpha,y,tau,R(x,alpha,y,tau,u.bar)),from=0,to=x.bar,add=TRUE,col="black")
text(x.bar,l.demand(x.bar,alpha,y,tau,r.A),"tau.0")
text(x.bar.1,l.demand(x.bar.1,alpha,y,tau.1,r.A),"tau.1",col="red")

R Notebook Instructions

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tDQp0aXRsZTogIlNpbXBsZSBNb25vY2VudHJpYyBDaXR5OiBObyBIb3VzaW5nLCBMYW5kIGluIFV0aWxpdHkgRnVuY3Rpb24iDQpoZWFkZXItaW5jbHVkZXM6IFx1c2VwYWNrYWdle2Ftc21hdGh9DQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpJbiB0aGlzIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBub3RlYm9vayBJIGRyYXcgc29tZSBmaWd1cmVzIGlsbHVzdHJhdGluZyB0aGUgYmFzaWMgaWRlYXMgaW4gdGhlIG1vbm9jZW50cmljIGNpdHkgbW9kZWwgKEFsb25zby1NdXRoLU1pbGxzIG1vZGVsKS4gVG8ga2VlcCB0aGluZ3Mgc2ltcGxlLCBJIHVzZSBhIG1vZGVsIHdpdGhvdXQgYSBob3VzaW5nIGNvbnN0cnVjdGlvbiBpbmR1c3RyeSBhbmQgd2hlcmUgY29uc3VtZXJzIGp1c3QgY29uc3VtZSBsYW5kIGRpcmVjdGx5LiBUaGUgY2l0eSBpcyBhIGxpbmUgYW5kIHRoZSBhbW91bnQgb2YgbGFuZCBhdCBldmVyeSBwb2ludCBpcyBlcXVhbCB0byAxLg0KDQojIyBBc3N1bXB0aW9ucyBhbmQgRnVuY3Rpb25hbCBGb3Jtcw0KQ29uc3VtZXJzIGhhdmUgQ29iYi1Eb3VnbGFzIHV0aWxpdHkgb3ZlciAqbGFuZCogJGwkIGFuZCBhIG51bWVyYWlyZSBnb29kICR6JC4gDQoNCiQkVShsLHopPWxee1xhbHBoYX16XnsxLVxhbHBoYX1cdGFnezF9JCQNCg0KRm9yIGEgY29uc3VtZXIgbGl2aW5nIGF0IGRpc3RhbmNlICR4JCBmcm9tIHRoZSBjZW50ZXIsIHRoZSBidWRnZXQgY29uc3RyYWludCBpczoNCiQkeT16K3IoeClsKHgpLVx0YXUqeFx0YWd7Mn0kJA0KVGhlIGNpdHkgaXMgY2xvc2VkLCB3aXRoIHBvcHVsYXRpb24gJE4kLCBhbmQgIGFncmljdWx0dXJhbCBsYW5kIHJlbnQgJHJfQSQuDQoNCiMjIFNvbHZpbmcgdGhlIE1vZGVsDQpJbiBlcXVpbGlicml1bSBhbGwgY29uc3VtZXJzIGhhdmUgdGhlIHNhbWUgKGVuZG9nZW5vdXMpIHV0aWxpdHksICRcYmFye3V9JCwgYW5kIHRoZSBsYW5kIHJlbnQgYXQgdGhlIGZyaW5nZSBvZiB0aGUgY2l0eSBpcyBlcXVhbCB0byB0aGUgYWdyaWN1bHR1cmFsIHJlbnQsICRyKFxiYXJ7eH0pPXJfQSQuIEZ1cnRoZXIsIHRoZXJlIGlzIG9uZSB1bml0IG9mIGxhbmQgYXQgZXZlcnkgbG9jYXRpb24sICRMKHgpPTEkIGZvciAkeD0wJCB0byAkeD1cYmFye3h9JCwgYW5kIGV2ZXJ5b25lIGlzIGhvdXNlZCBiZXR3ZWVuIHRoZSBjZW50ZXIgb2YgdGhlIGNpdHkgYW5kIHRoZSBmcmluZ2UuDQoNCkZyb20gQ29iYi1Eb3VnbGFzIGRlbWFuZCB3ZSBrbm93IHRoYXQgJHooeCk9KDEtXGFscGhhKSh5LVx0YXUqeCkkIGFuZCAkbCh4KT1cZnJhY3tcYWxwaGEoeS1cdGF1KngpfXtyKHgpfSQuIFN1YnN0aXR1dGluZyB0aGVzZSBpbnRvIHRoZSBzcGF0aWFsIGVxdWlsaWJyaXVtIGNvbmRpdGlvbiAoZXF1YWwgdXRpbGl0eSkgZ2l2ZXM6DQoNCiQkVShsLHopPVxsZWZ0W1xmcmFje1xhbHBoYSh5LVx0YXUqeCl9e3IoeCl9XHJpZ2h0XV57XGFscGhhfVxsZWZ0WygxLVxhbHBoYSkoeS1cdGF1KngpXHJpZ2h0XV57MS1cYWxwaGF9PVxiYXJ7dX1cdGFnezN9JCQNCldlIGNhbiByZXdyaXRlIHRoaXMgZXF1YXRpb24gdG8gZXhwcmVzcyBsYW5kIHJlbnQgYXQgJHgkIGFzIGEgZnVuY3Rpb24gb2YgJHkkLCAkXHRhdSQsICRcYmFye3V9JCwgYW5kICRcYWxwaGEkLg0KJCRyKHgpPVxsZWZ0KFxmcmFje3ktXHRhdSp4fXtcYmFye3V9fVxyaWdodClee1xmcmFjezF9e1xhbHBoYX19XGFscGhhKDEtXGFscGhhKV57XGZyYWN7MS1cYWxwaGF9e1xhbHBoYX19XHRhZ3s0fSQkDQpUaGUgQWxvbnNvLU11dGggY29uZGl0aW9uIHRlbGxzIHVzIHRoZSBncmFkaWVudCBvZiB0aGUgbGFuZCByZW50LCB3aGljaCB3ZSBjb3VsZCBhbHNvIGRlcml2ZSBieSB0YWtpbmcgdGhlIGRlcml2YXRpdmUgb2YgdGhlIGFib3ZlIGVxdWF0aW9uOg0KJCRcZnJhY3tkcih4KX17ZHh9PS1cdGF1KCgxLVxhbHBoYSkoeS1cdGF1KngpKV57XGZyYWN7MS1cYWxwaGF9e1xhbHBoYX19XGJhcnt1fV57XGZyYWN7LTF9e1xhbHBoYX19PVxmcmFjey1cdGF1fXtsKHgpfVx0YWd7NX0kJA0KVGhlcmUgYXJlICQxL2woeCkkIHBlb3BsZSBsaXZpbmcgYXQgZXZlcnkgbG9jYXRpb24gJHgkLiBDb21iaW5pbmcgdGhlIEFsb25zby1NdXRoIGNvbmRpdGlvbiB3aXRoIHRoZSByZXF1aXJlbWVudCB0aGF0IGV2ZXJ5b25lIGlzIGhvdXNlZCBpbiB0aGUgY2l0eSBpbXBsaWVzIHRoYXQ6DQokJFxkaXNwbGF5c3R5bGVcaW50X3t4PTB9XntcYmFye3h9fVxmcmFjezF9e2woeCl9ZHg9XGZyYWN7MX17LVx0YXV9XGRpc3BsYXlzdHlsZVxpbnRfe3g9MH1ee1xiYXJ7eH19XGZyYWN7ZHIoeCl9e2R4fWR4PVxmcmFje3IoXGJhcnt4fSktcigwKX17LVx0YXV9PU5cdGFnezZ9JCQNClVzaW5nICRyKFxiYXJ7eH0pPXJfQSQgZ2l2ZXMgJHIoMCk9XHRhdSpOK3IoXGJhcnt4fSkkLiBXZSBjYW4gdGhlbiBmaW5kIHRoZSB1dGlsaXR5IG9mIGEgY29uc3VtZXIgYXQgdGhlIGNlbnRlciBieSBpbnNlcnRpbmcgdGhpcyBleHByZXNzaW9uIGZvciAkcigwKSQgaW50byB0aGUgaW5kaXJlY3QgdXRpbGl0eSBmdW5jdGlvbiAoZXEgMyksIHRodXMgZ2l2aW5nIHVzICRcYmFye3V9JC4gRmluYWxseSwgd2l0aCAkXGJhcnt1fSQgd2UgY2FuIHNvbHZlIGZvciAkXGJhcnt4fSQgYnkgdGhlIGxhbmQgcmVudCBlcXVhdGlvbiAoZXEgNCkgZXF1YWwgdG8gJHJfQSQuDQoNCiMjIFNvbHZpbmcgZm9yIGVxdWlsaWJyaXVtDQpGaXJzdCwgbGV0J3Mgc2V0IHRoZSBleG9nZW5vdXMgcGFyYW1ldGVyczogJFxhbHBoYSQsICR5JCwgJFx0YXUkLCAkcl9BJCwgYW5kICROJC4NCmBgYHtyfQ0KYWxwaGE8LTAuNQ0KeTwtMTAwDQp0YXU8LTENCnIuQTwtNTANCk48LTEwMDANCmBgYA0KTmV4dCwgbGV0J3Mgd3JpdGUgZnVuY3Rpb25zIGZvciB0aGUgaW5kaXJlY3QgdXRpbGl0eSBhbmQgbGFuZCByZW50LCBzbyB0aGF0IHdlIGNhbiBzb2x2ZSBmb3IgdGhlIGVxdWlsaWJyaXVtIHZhbHVlcyBvZiAkXGJhcnt1fSQgYW5kICRcYmFye3h9JC4NCmBgYHtyfQ0KVjwtZnVuY3Rpb24oeCxyLngsYWxwaGEseSx0YXUpew0KICBsLng8LWFscGhhKih5LXRhdSp4KS9yLnggI2RlbWFuZCBmb3IgbGFuZA0KICB6Lng8LSgxLWFscGhhKSooeS10YXUqeCkgI2RlbWFuZCBmb3IgbnVtZXJhaXJlDQogIGwueF5hbHBoYSp6LnheKDEtYWxwaGEpICNyZXR1cm5zIHRoZSB1dGlsaXR5IGF0IHgNCn0NClI8LWZ1bmN0aW9uKHgsYWxwaGEseSx0YXUsdS5iYXIpIHsNCiAgaW5uZXI8LSh5LXRhdSp4KS91LmJhcg0KICBjb25zdDwtYWxwaGEqKDEtYWxwaGEpXigoMS1hbHBoYSkvYWxwaGEpDQogIGlubmVyXigxL2FscGhhKSpjb25zdCAjcmV0dXJucyB0aGUgcmVudCBhdCB4DQp9DQpgYGANCk5vdyBsZXQncyBzb2x2ZSBmb3IgdGhlIGVxdWlsaWJyaXVtIHZhbHVlcy4gVG8gZmluZCB0aGUgZnJpbmdlIHdlIHdpbGwgbG9vayBmb3IgdGhlIHZhbHVlICRcYmFye3h9JCBzdWNoIHRoYXQgJFIoXGJhcnt4fSktcl9BPTAkLg0KYGBge3J9DQpyLjA8LXIuQSt0YXUqTg0KdS5iYXI8LVYoMCxyLjAsYWxwaGEseSx0YXUpDQojRGVmaW5lIGEgZnVuY3Rpb24gc28gdGhhdCB3ZSBjYW4gZmluZCB4LmJhcg0KZmluZC54YmFyPC1mdW5jdGlvbih4LGFscGhhLHksdGF1LHIuQSx1LmJhcikgew0KICBSKHgsYWxwaGEseSx0YXUsdS5iYXIpLXIuQQ0KfQ0KeC5iYXI8LWFzLm51bWVyaWModW5pcm9vdChmaW5kLnhiYXIsbG93ZXI9MCx1cHBlcj15L3RhdSxhbHBoYT1hbHBoYSx5PXksdGF1PXRhdSxyLkE9ci5BLHUuYmFyPXUuYmFyKVsxXSkNCmBgYA0KVGhlIGVxdWlsaWJyaXVtIHZhbHVlcyBhcmUgJFxiYXJ7dX0kPWByIHUuYmFyYCBhbmQgJFxiYXJ7eH0kPWByIHguYmFyYC4NCklzIHRoaXMgY29ycmVjdD8gTGV0J3MgY2hlY2sgaWYgaW50ZWdyYXRpbmcgdGhlIHBvcHVsYXRpb24gYXQgZWFjaCBsb2NhdGlvbiBpcyBlcXVhbCB0byB0aGUgdG90YWwsICROJC4NCmBgYHtyfQ0KbC5kZW1hbmQ8LWZ1bmN0aW9uKHgsYWxwaGEseSx0YXUsci54KSB7ICNkZW1hbmQgZm9yIGxhbmQNCiAgYWxwaGEqKHktdGF1KngpL3IueA0KfQ0KcG9wPC1mdW5jdGlvbih4LGFscGhhLHksdGF1LHUuYmFyKSB7DQogIHIueDwtUih4LGFscGhhLHksdGF1LHUuYmFyKQ0KICAxL2wuZGVtYW5kKHgsYWxwaGEseSx0YXUsci54KQ0KfQ0KTi5jaGVjazwtaW50ZWdyYXRlKHBvcCxsb3dlcj0wLHVwcGVyPXguYmFyLGFscGhhPWFscGhhLHk9eSx0YXU9dGF1LHUuYmFyPXUuYmFyKSAjdGhpcyBzaG91bGQgYmUgZXF1YWwgdG8gTg0KYGBgDQpJbnRlZ3JhdGluZyB0aGUgcG9wdWxhdGlvbiBvdmVyIHRoZSBjaXR5IHlpZWxkcyBhIHRvdGFsIHBvcHVsYXRpb24gb2YgKk4uY2hlY2sqPWByIE4uY2hlY2skdmFsdWVgDQoNCiMjIEdyYXBoaW5nDQpGaXJzdCwgbGV0J3MgZ3JhcGggdGhlIGVxdWlsaWJyaXVtIHJlbnQgY3VydmUNCmBgYHtyfQ0KY3VydmUoUih4LGFscGhhLHksdGF1LHUuYmFyKSxmcm9tPTAsdG89eC5iYXIseGxhYj0iRGlzdGFuY2UgZnJvbSBjZW50ZXIgKHgpIix5bGFiPSJMYW5kIHJlbnQsIHIoeCkiLG1haW49IkxhbmQgcmVudCBvdmVyIHRoZSBjaXR5IikNCmBgYA0KTmV4dCB3ZSBjYW4gbG9vayBhdCBsYW5kIGNvbnN1bXB0aW9uOg0KYGBge3J9DQpjdXJ2ZShsLmRlbWFuZCh4LGFscGhhLHksdGF1LFIoeCxhbHBoYSx5LHRhdSx1LmJhcikpLGZyb209MCx0bz14LmJhcix4bGFiPSJEaXN0YW5jZSBmcm9tIGNlbnRlciAoeCkiLHlsYWI9IkxhbmQgY29uc3VtcHRpb24sIGwoeCkiLG1haW49IkxhbmQgY29uc3VtcHRpb24gb3ZlciB0aGUgY2l0eSIpDQpgYGANCg0KIyMjIENvbXBhcmF0aXZlIFN0YXRpY3MNCk5vdyBsZXQncyBsb29rIGF0IHNvbWUgY29tcGFyYXRpdmUgc3RhdGljcy4NCmBgYHtyfQ0KeS4xPC01MDANCnRhdS4xPC0wLjcNCnIuQS4xPC0xMDANCk4uMTwtNTAwMA0KYGBgDQpIb3cgZG9lcyBhIGNoYW5nZSAgaW4gdGhlIHRyYW5zcG9yYXRpb24gY29zdCAkXHRhdSQgZnJvbSAkXHRhdV8wJD1gciB0YXVgIHRvICRcdGF1XzEkPWByIHRhdS4xYCBhZmZlY3QgbGFuZCBjb25zdW1wdGlvbiBhdCBldmVyeSBwb2ludD8NCmBgYHtyfQ0Kci4wLjE8LXIuQSt0YXUuMSpODQp1LmJhci4xPC1WKDAsci4wLjEsYWxwaGEseSx0YXUuMSkNCnguYmFyLjE8LWFzLm51bWVyaWModW5pcm9vdChmaW5kLnhiYXIsbG93ZXI9MCx1cHBlcj15L3RhdS4xLGFscGhhPWFscGhhLHk9eSx0YXU9dGF1LjEsci5BPXIuQSx1LmJhcj11LmJhci4xKVsxXSkNCg0KY3VydmUoUih4LGFscGhhLHksdGF1LjEsdS5iYXIuMSksZnJvbT0wLHRvPXguYmFyLjEseGxhYj0iRGlzdGFuY2UgZnJvbSBjZW50ZXIgKHgpIix5bGFiPSJMYW5kIHJlbnQsIHIoeCkiLG1haW49IkxhbmQgcmVudCBvdmVyIHRoZSBjaXR5Iixjb2w9InJlZCIseWxpbT1jKDAsbWF4KHIuMCxyLjAuMSkpLHhsaW09YygwLG1heCh4LmJhcix4LmJhci4xKSkpDQpjdXJ2ZShSKHgsYWxwaGEseSx0YXUsdS5iYXIpLGZyb209MCx0bz14LmJhcixhZGQ9VFJVRSxjb2w9ImJsYWNrIikNCnRleHQoeC5iYXIsbC5kZW1hbmQoeC5iYXIsYWxwaGEseSx0YXUsci5BKSwidGF1LjAiKQ0KdGV4dCh4LmJhci4xLGwuZGVtYW5kKHguYmFyLjEsYWxwaGEseSx0YXUuMSxyLkEpLCJ0YXUuMSIsY29sPSJyZWQiKQ0KDQpjdXJ2ZShsLmRlbWFuZCh4LGFscGhhLHksdGF1LjEsUih4LGFscGhhLHksdGF1LjEsdS5iYXIuMSkpLGZyb209MCx0bz14LmJhci4xLHhsYWI9IkRpc3RhbmNlIGZyb20gY2VudGVyICh4KSIseWxhYj0iTGFuZCBjb25zdW1wdGlvbiwgbCh4KSIsbWFpbj0iTGFuZCBjb25zdW1wdGlvbiBvdmVyIHRoZSBjaXR5Iixjb2w9InJlZCIseWxpbT1jKDAsMC4zKSx4bGltPWMoMCxtYXgoeC5iYXIseC5iYXIuMSkpKQ0KY3VydmUobC5kZW1hbmQoeCxhbHBoYSx5LHRhdSxSKHgsYWxwaGEseSx0YXUsdS5iYXIpKSxmcm9tPTAsdG89eC5iYXIsYWRkPVRSVUUsY29sPSJibGFjayIpDQp0ZXh0KHguYmFyLGwuZGVtYW5kKHguYmFyLGFscGhhLHksdGF1LHIuQSksInRhdS4wIikNCnRleHQoeC5iYXIuMSxsLmRlbWFuZCh4LmJhci4xLGFscGhhLHksdGF1LjEsci5BKSwidGF1LjEiLGNvbD0icmVkIikNCmBgYA0KDQoNCiMgUiBOb3RlYm9vayBJbnN0cnVjdGlvbnMNCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDdHJsK0FsdCtJKi4NCg0KV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuDQoNClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4NCg==