Some General Comments:

Simple Calcs and Plots

  1. From the relativistic definition of momentum, \(p = \gamma mv\), show that the change in kinetic energy of a moving particle is \(\Delta W = \Delta\gamma \;mc^2\) and hence deduce that its total energy is \(E=\gamma mc^2\) and \(W = (\gamma-1)mc^2\). (Hint: look at 1-D problem, and integrate force x distance.)

\[ v = c\beta; ~~~~~ p = \gamma\beta mc;~~~~~ \gamma = (1-\beta^2)^{-\frac12} ~~ \longrightarrow ~~~~ \gamma^2 = 1 + (\beta\gamma)^2 \\ 2\gamma d\gamma = 2\;(\beta\gamma)\;d(\beta\gamma) \longrightarrow d(\beta\gamma) = d\gamma/\beta \\ \Delta W = \int F\cdot dx = \int \frac{dp}{dt} dx = \int v\; dp = mc^2 \int \beta \; d(\beta\gamma) = mc^2 \int d\gamma = mc^2\Delta\gamma\\ \]

  1. Produce a formula for \(\beta = v/c\) vs. \(W\) and produce a single plot of \(\beta\) vs \(W\) from 0 to 1000 MeV with curves for an electron, a muon, a proton and a uranium ion (\(_{238}\)U\(^{+90}\)).
Mc2 = c(0.511,106,938,238*931)
mc2=Mc2[1]
beta = function(x){ sqrt(1-(mc2/(mc2+x))^2) }
curve(beta(x),0.0,1000,ylim=c(0,1))
i=1
while(i<4){
   i=i+1
   mc2 = Mc2[i]
   curve(beta(x),add=TRUE,lty=i)
}

  1. Find expressions for
    1. \(\Delta v/v\) for a given \(\Delta p/p\), and
    2. \(\Delta p/p\) for a given \(\Delta W/W\).
      \[ \frac{dp}{p} = \frac{d(\beta\gamma)}{\beta\gamma} = \frac{d\gamma}{\beta^2\gamma} \\ d\gamma = -\frac12\gamma^3(-2\beta\;d\beta) = \beta\gamma^3d\beta \longrightarrow \frac{d\gamma}{\beta^2\gamma} = \gamma^2\frac{d\beta}{\beta}\\ \longrightarrow\frac{d\beta}{\beta} = \frac{1}{\gamma^2} \frac{dp}{p} \]

\[ \frac{d(\beta\gamma)}{\beta\gamma} = \frac{d\gamma}{\beta^2\gamma} = \frac{\gamma-1}{\beta^2\gamma}\frac{d\gamma}{\gamma-1} \longrightarrow \\ \frac{dp}{p} = \frac{\gamma(\gamma-1)}{(\beta\gamma)^2} \frac{dW}{W} = \frac{\gamma(\gamma-1)}{\gamma^2-1} \frac{dW}{W} = \frac{\gamma}{\gamma+1}\frac{dW}{W} \]

  1. Create a Gaussian distribution of 2000 proton kinetic energies with central value 200 MeV and rms energy spread of 1 MeV and create a histogram of the distribution; next, calculate the velocity for each proton above and create a histogram of the velocity distribution; how do the relative standard deviations of these two distributions compare? (i.e., \((\sqrt{\langle(W-\langle W\rangle)^2\rangle}/\langle W\rangle\), for example.) Is the value what you expect? (Explain.)
mc2 = 938   # MeV
W = rnorm(2000,200,1) # MeV
betp = sqrt(1-(mc2/(mc2+W))^2)
hist(W)

hist(betp)

Note:

dWonW = sd(W)/mean(W)
dbetonbet = sd(betp)/mean(betp)
dWonW
[1] 0.004889169
dbetonbet
[1] 0.001820877
# central value of relativistic gamma should be:
gammap = (mc2+200)/mc2
# would expect relative spreads to have ratio:  (dW/W)/(dv/v) = (gamma+1/gamma)/(1/gamma^2) = gamma * (gamma+1)
gammap*(gammap + 1)
[1] 2.685121
# from the distributions:
dWonW/dbetonbet
[1] 2.685062
  1. In the same or similar plots, overlay normal curves on top of the histograms with the mean and standard deviation of the distributions.
hist(W,freq = FALSE)
curve(1/sqrt(2*pi)/sd(W)*exp(-(x-mean(W))^2/2/sd(W)^2), add=TRUE, col="red")

hist(betp, freq=FALSE)
curve(1/sqrt(2*pi)/sd(betp)*exp(-(x-mean(betp))^2/2/sd(betp)^2), add=TRUE, col="red")

Charge-to-Mass Selection

Positively charged ions are emitted from a source, emerging through a potential difference of \(V_0\). The kinetic energy of each particle is thus \(qV_0\), where \(q\) is the charge of the ion. The particles are then directed through a “velocity selector”, a device made up of electric and magnetic fields, \(E\) and \(B\), at right angles to each other such that when the values of these fields are tuned properly, particles travel through the device without deflection of their trajectory.

V0  = 62e3   # V
E0  = 100e3  # V/m
B0  = 0.05   # T
ell = 0.15   # m
  1. If the electric field of the Selector is \(E_0\) = \(100\) kV/m and the magnetic field of the Selector is \(B_0\) = 0.05 T, what is the velocity relative to the speed of light (\(\beta = v/c\)) of the particles that travel straight through the Selector?
EonBc = E0/B0/2.9979e8
EonBc
[1] 0.006671337
  1. Next, the magnetic field of the Selector is turned off. The particles entering are now deflected solely by the uniform electric field, \(E_0\). If the length of the field region is \(\ell\), show that upon exit from the Selector the particles leave at an angle of deflection given by \[\tan\theta = \frac{1}{2} \frac{E_0 \ell}{V_0}.\] In uniform E-field (and non-relativistic): \[ d^2y/dt^2 = F_y/m = qE_0/m\\ dy/dt = (qE_0/m)\; t =\frac{qE_0}{m}\left(\frac{\ell}{v_s}\right) = (dy/ds)(ds/dt) = y'(\ell)\; v_s\\ \tan\theta =y'(s=\ell) = \frac{qE_0}{mv_s^2}\;\ell = \frac12 \frac{qE_0}{\frac12 mv_s^2}\; \ell = \frac12\frac{E_0\ell}{V_0} \]

  2. If \(\ell\) = 0.15 m, and \(V_0\) = 62 kV, at what angle do the particles emerge at the end of the Selector?

thet = atan(E0*ell/2/V0)
thet*180/pi  # degrees
[1] 6.897428
  1. Estimate by how much the particle’s energy is changed after passing through the Selector with the magnet turned off.
# dE = q*E0*dy = q*E0 * 1/2 \ell * thet
dE = 1/2*E0*ell*thet   # eV
dE/1000                # keV
[1] 0.9028712
  1. If, instead, the electric field is turned off and the magnetic field is left on at its original value of \(B_0\), the particle trajectory through the field region will be circular. Show that the radius of curvature of the trajectory will be \[ R = \frac{2V_0}{E_0}. \] In uniform B-field (and non-relativistic): \[ mv^2/R = qvB \longrightarrow R = \frac{mv^2}{qvB} = \frac{2\cdot\frac12 mv^2}{q(vB_0)} = \frac{2qV_0}{qE_0} = \frac{2V_0}{E_0} \]

  2. By what angle will the particle leave the Selector with the magnetic field on and the electric field off?

# thetB = ell/R = E0*ell/(2*V0)
thetB = E0*ell/V0/2  # m
thetB*180/pi
[1] 6.930941
  1. Estimate by how much the particle’s energy is changed after passing through the Selector with the electric field turned off.
# the particle's energy is not changed -- magnetic field does no work
  1. If the ions have charge state \(Q = q/e\) and atomic mass \(A = m/m_u\), where \(m_uc^2\) = 931 MeV is the rest mass of the nucleon, then show that \[ \frac{Q}{A} = \frac12 \frac{m_uc^2}{eV_0} \left(\frac{E_0}{cB_0}\right)^2 = \; \frac12 \frac{m_uc^2}{eV_0} \; (v/c)^2. \]
  2. For our parameters above, what must be the value of \(Q/A\) for the ions? If we believe the ions to be those of Potassium atoms, what charge state most likely comprises the beam?
QonA = 1/2*931e6/V0*(E0/2.9979e8/B0)^2
QonA
[1] 0.3341594
# Note:  Potassium -- Z = 19, A = 39; 13/39 = 0.333;  thus, likely +13 charge state

Beam Distributions

The file inputBeam.dat contains information of 20,000 protons produced from a particle tracking code. Each line in the file contains the final phase space coordinates of a proton at the end of a beam line: transverse coordinates \(x\) and \(y\) in mm, momentum components \(p_x\), \(p_y\) and \(p_z\) in MeV/c, and the time of arrival \(dt\), in seconds, relative to an ideal particle’s time of arrival. The file can be read in as a “data frame” using R, for example.

  1. Use the file to generate a display of the horizontal and vertical transverse phase space distributions as heat maps, or density plots.
df = read.csv("inputBeam.dat", sep=" ")
df$xp = df$pcx/df$pcz*1000 # mrad   
df$yp = df$pcy/df$pcz*1000 # mrad
df$p = sqrt(df$pcx^2 + df$pcy^2 + df$pcz^2)
aveP = mean(df$p)
df$del = df$p/aveP-1
avebg = aveP/0.938
head(df)
hist(df$xp)
library(ggplot2)

psPlt = ggplot(df)
psPlt+ geom_bin2d(aes(x,xp),bins=100)

psPlt+ geom_bin2d(aes(y,yp),bins=100)

  1. Calculate the Courant-Snyder parameters and rms emittances that best represent the distribution in both the horizontal and vertical dimensions. Neglect dispersion effects for this calculation. (Note: Are there any strong correlations between the longitudinal parameters of the particles?)
sig11x = mean(df$x^2)
sig21x = mean(df$x*df$xp)
sig22x = mean(df$xp^2)
emittx = sqrt(sig11x*sig22x-sig21x^2)
emittx
[1] 0.6507174
sig11y = mean(df$y^2)
sig21y = mean(df$y*df$yp)
sig22y = mean(df$yp^2)
emitty = sqrt(sig11y*sig22y-sig21y^2)
emitty
[1] 0.8099194
plot(df$delT,df$del)

  1. From the result above, make a scatter plot of \(\alpha_y\; y + \beta_y\; y'\) vs. \(y\) for the vertical distribution. What fraction of the particles are within the rms emittance of the beam? What fraction of the particles are within 6 times the rms emittance?
alphax = -sig21x/emittx
betax  =  sig11x/emittx
alphay = -sig21y/emitty
betay  =  sig11y/emitty
plot(df$y,df$y*alphay+df$yp*betay,asp=1,pch=".")
symbols(x=c(0,0),y=c(0,0), circles = c(sqrt(betay*emitty),sqrt(betay*emitty*6)),lty=c(2,3),fg=c("red","blue"),lwd=2,add=TRUE)


# inside    rms emittance:
nrow( df[df$y^2 + (df$y*alphay+df$yp*betay)^2 < (  emitty*betay),] ) / nrow(df)  
[1] 0.4014
# inside 6x rms emittance:
nrow( df[df$y^2 + (df$y*alphay+df$yp*betay)^2 < (6*emitty*betay),] ) / nrow(df)  
[1] 0.9483
  1. Assume that the distribution drifts downstream a distance of 5 m. Show the phase space distributions at this new location, and re-compute the Courant-Snyder parameters and rms emittances. Discuss the changes you observe.
df$x5 = df$x + df$xp*5
df$y5 = df$y + df$yp*5
psPlt = ggplot(df)
psPlt+ geom_bin2d(aes(x5,xp),bins=100)

psPlt+ geom_bin2d(aes(y5,yp),bins=100)

sig11x = mean(df$x5^2)
sig21x = mean(df$x5*df$xp)
sig22x = mean(df$xp^2)
emittx = sqrt(sig11x*sig22x-sig21x^2)
emittx
[1] 0.6507174
sig11y = mean(df$y5^2)
sig21y = mean(df$y5*df$yp)
sig22y = mean(df$yp^2)
emitty = sqrt(sig11y*sig22y-sig21y^2)
emitty
[1] 0.8099194
alphax5 = -sig21x/emittx
betax5  =  sig11x/emittx
alphay5 = -sig21y/emitty
betay5  =  sig11y/emitty
s = 0 s= 5 m
\(\beta_x\) 25.16 23.778
\(\alpha_x\) 0.244 0.033
\(\epsilon_x\) 0.651 0.651
\(\beta_y\) 13.35 57.305
\(\alpha_y\) -2.771 -6.02
\(\epsilon_y\) 0.81 0.81

  1. Northern Illinois University and Fermi National Accelerator Laboratory

LS0tCnRpdGxlOiAiSG9tZXdvcmsgMSBEaXNjdXNzaW9uIgphdXRob3I6IE1pa2UgU3lwaGVyc15bTm9ydGhlcm4gSWxsaW5vaXMgVW5pdmVyc2l0eSBhbmQgRmVybWkgTmF0aW9uYWwgQWNjZWxlcmF0b3IKICBMYWJvcmF0b3J5XQpkYXRlOiAnbGFzdCB1cGRhdGU6IGByIGZvcm1hdCgoU3lzLkRhdGUoKSksICIlZCAlYiAlWSIpYCcKb3V0cHV0OiAgaHRtbF9ub3RlYm9vawotLS0KCioqU29tZSBHZW5lcmFsIENvbW1lbnRzOioqCgotIHB1dCBsYXN0IG5hbWVzIGluIHlvdXIgZmlsZSBuYW1lczsgdmVyeSBoZWxwZnVsIHRvIG1lICAKCSAgICsgZXg6ICBzeXBoZXJzXzAxLm5iLmh0bWwgIAotIHVzZSB0aXRsZSwgYXV0aG9yLCBkYXRlICgsIHN1YnRpdGxlKSBpbiB0aGUgeWFtbCBoZWFkZXIgIAotIGJyZWFrIGNhbGNzIGludG8gc2VwYXJhdGUgY2h1bmtzOyBhbHdheXMgc2hvdyB0aGUgaW1wb3J0YW50IHBhcnRzICAKICAgICAgICAgKyBvbmx5IGhpZGUgY2h1bmtzIHRoYXQgYXJlIG9idmlvdXMgb3IgdW5pbXBvcnRhbnQgKGdyYXBoaWNzIGNvbW1hbmRzLCBldGMpICAKLSByb3VuZCh4LDMpIC0tIGFuZCB1c2luZyBkb2xsYXIgc2lnbnMgaW4gTGFUZVggIAotIGJlIGNhcmVmdWwgb2YgdW5pdHMhIGJlIHN1cmUgdG8gdW5kZXJzdGFuZCBlYWNoIHN0ZXAgb2YgYSBjYWxjICAKLSB1c2luZyAiZGVuc2l0eSIgaW4gaGlzdG9ncmFtcyB2cy4gImZyZXF1ZW5jeSIgKGRlZmF1bHQpICAKLSBwaSBpbiBSIGlzIHBpICAKLSB0YWtpbmcgZGlmZmVyZW50aWFscyEgIHJlYWxseT8gIAotIHVuaXRzIHVuaXRzIHVuaXRzIHVuaXRzOyBkaWQgSSBtZW50aW9uIHVuaXRzPyAgCi0gcHJhY3RpY2UgdXNpbmcgZGF0YSBmcmFtZXM7IHN1YnNldHRpbmcgZGF0YSBmcmFtZXMgIAotIGdyYWRlOiAgT0EqMS41ICsgKFAxK1AyK1AzKS8yICBvdXQgb2YgMzAgcG9zc2libGUgKHRoaXMgc2V0IG9ubHkhKSAgCiAgICAgICsgbmV4dCBzZXRzOiAgMTAgcHRzIGVhY2ggcHJvYmxlbSAgCiAgICAgICsgYXZlIHNjb3JlOiAgMjUvMzAKCgoKKipTaW1wbGUgQ2FsY3MgYW5kIFBsb3RzKioKCmEuIEZyb20gdGhlIHJlbGF0aXZpc3RpYyBkZWZpbml0aW9uIG9mIG1vbWVudHVtLCAkcCA9IFxnYW1tYSBtdiQsIHNob3cgdGhhdCB0aGUgY2hhbmdlIGluIGtpbmV0aWMgZW5lcmd5IG9mIGEgbW92aW5nIHBhcnRpY2xlIGlzICRcRGVsdGEgVyA9IFxEZWx0YVxnYW1tYSBcO21jXjIkIGFuZCBoZW5jZSBkZWR1Y2UgdGhhdCBpdHMgdG90YWwgZW5lcmd5IGlzICRFPVxnYW1tYSBtY14yJCBhbmQgJFcgPSAoXGdhbW1hLTEpbWNeMiQuICAoKkhpbnQqOiAgbG9vayBhdCAxLUQgcHJvYmxlbSwgYW5kIGludGVncmF0ZSBmb3JjZSB4IGRpc3RhbmNlLikKCiQkCnYgPSBjXGJldGE7IH5+fn5+IHAgPSBcZ2FtbWFcYmV0YSBtYzt+fn5+fiBcZ2FtbWEgPSAoMS1cYmV0YV4yKV57LVxmcmFjMTJ9IH5+IFxsb25ncmlnaHRhcnJvdyB+fn5+IFxnYW1tYV4yID0gMSArIChcYmV0YVxnYW1tYSleMiBcXAoyXGdhbW1hIGRcZ2FtbWEgPSAyXDsoXGJldGFcZ2FtbWEpXDtkKFxiZXRhXGdhbW1hKSBcbG9uZ3JpZ2h0YXJyb3cgZChcYmV0YVxnYW1tYSkgPSBkXGdhbW1hL1xiZXRhIFxcClxEZWx0YSBXID0gXGludCBGXGNkb3QgZHggPSBcaW50IFxmcmFje2RwfXtkdH0gZHggPSAKICAgICAgXGludCB2XDsgZHAgPSBtY14yIFxpbnQgXGJldGEgXDsgZChcYmV0YVxnYW1tYSkgPSBtY14yIFxpbnQgZFxnYW1tYSA9IG1jXjJcRGVsdGFcZ2FtbWFcXAokJAoKYi4gUHJvZHVjZSBhIGZvcm11bGEgZm9yICRcYmV0YSA9IHYvYyQgdnMuICRXJCBhbmQgcHJvZHVjZSBhIHNpbmdsZSBwbG90IG9mICRcYmV0YSQgdnMgJFckIGZyb20gMCB0byAxMDAwIE1lViB3aXRoIGN1cnZlcyBmb3IgYW4gZWxlY3Ryb24sIGEgbXVvbiwgYSBwcm90b24gYW5kIGEgdXJhbml1bSBpb24gKCRfezIzOH0kVSReeys5MH0kKS4KYGBge3IsIGVjaG89VFJVRSxldmFsPVRSVUV9Ck1jMiA9IGMoMC41MTEsMTA2LDkzOCwyMzgqOTMxKQptYzI9TWMyWzFdCmJldGEgPSBmdW5jdGlvbih4KXsgc3FydCgxLShtYzIvKG1jMit4KSleMikgfQpjdXJ2ZShiZXRhKHgpLDAuMCwxMDAwLHlsaW09YygwLDEpKQppPTEKd2hpbGUoaTw0KXsKICAgaT1pKzEKICAgbWMyID0gTWMyW2ldCiAgIGN1cnZlKGJldGEoeCksYWRkPVRSVUUsbHR5PWkpCn0KYGBgCgpjLiBGaW5kIGV4cHJlc3Npb25zIGZvcgogICBpLiAgJFxEZWx0YSB2L3YkIGZvciBhIGdpdmVuICRcRGVsdGEgcC9wJCwgYW5kICAgCiAgIGlpLiAkXERlbHRhIHAvcCQgZm9yIGEgZ2l2ZW4gJFxEZWx0YSBXL1ckLiAgCiQkClxmcmFje2RwfXtwfSA9IFxmcmFje2QoXGJldGFcZ2FtbWEpfXtcYmV0YVxnYW1tYX0gPSBcZnJhY3tkXGdhbW1hfXtcYmV0YV4yXGdhbW1hfSBcXApkXGdhbW1hID0gLVxmcmFjMTJcZ2FtbWFeMygtMlxiZXRhXDtkXGJldGEpID0gXGJldGFcZ2FtbWFeM2RcYmV0YSBcbG9uZ3JpZ2h0YXJyb3cgXGZyYWN7ZFxnYW1tYX17XGJldGFeMlxnYW1tYX0gPSBcZ2FtbWFeMlxmcmFje2RcYmV0YX17XGJldGF9XFwKXGxvbmdyaWdodGFycm93XGZyYWN7ZFxiZXRhfXtcYmV0YX0gPSBcZnJhY3sxfXtcZ2FtbWFeMn0gXGZyYWN7ZHB9e3B9CiQkCgokJApcZnJhY3tkKFxiZXRhXGdhbW1hKX17XGJldGFcZ2FtbWF9ID0gXGZyYWN7ZFxnYW1tYX17XGJldGFeMlxnYW1tYX0gPSBcZnJhY3tcZ2FtbWEtMX17XGJldGFeMlxnYW1tYX1cZnJhY3tkXGdhbW1hfXtcZ2FtbWEtMX0gXGxvbmdyaWdodGFycm93IFxcClxmcmFje2RwfXtwfSA9IFxmcmFje1xnYW1tYShcZ2FtbWEtMSl9eyhcYmV0YVxnYW1tYSleMn0gXGZyYWN7ZFd9e1d9ID0gXGZyYWN7XGdhbW1hKFxnYW1tYS0xKX17XGdhbW1hXjItMX0gXGZyYWN7ZFd9e1d9ID0gXGZyYWN7XGdhbW1hfXtcZ2FtbWErMX1cZnJhY3tkV317V30KJCQKCgpkLiBDcmVhdGUgYSBHYXVzc2lhbiBkaXN0cmlidXRpb24gb2YgMjAwMCBwcm90b24ga2luZXRpYyBlbmVyZ2llcyB3aXRoIGNlbnRyYWwgdmFsdWUgMjAwIE1lViBhbmQgcm1zIGVuZXJneSBzcHJlYWQgb2YgMSBNZVYgYW5kIGNyZWF0ZSBhIGhpc3RvZ3JhbSBvZiB0aGUgZGlzdHJpYnV0aW9uOyBuZXh0LCBjYWxjdWxhdGUgdGhlIHZlbG9jaXR5IGZvciBlYWNoIHByb3RvbiBhYm92ZSBhbmQgY3JlYXRlIGEgaGlzdG9ncmFtIG9mIHRoZSB2ZWxvY2l0eSBkaXN0cmlidXRpb247IGhvdyBkbyB0aGUgcmVsYXRpdmUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGVzZSB0d28gZGlzdHJpYnV0aW9ucyBjb21wYXJlPyAoaS5lLiwgJChcc3FydHtcbGFuZ2xlKFctXGxhbmdsZSBXXHJhbmdsZSleMlxyYW5nbGV9L1xsYW5nbGUgV1xyYW5nbGUkLCBmb3IgZXhhbXBsZS4pICBJcyB0aGUgdmFsdWUgd2hhdCB5b3UgZXhwZWN0PyAoRXhwbGFpbi4pCmBgYHtyLCBlY2hvPVRSVUUsZXZhbD1UUlVFfQptYzIgPSA5MzggICAjIE1lVgpXID0gcm5vcm0oMjAwMCwyMDAsMSkgIyBNZVYKYmV0cCA9IHNxcnQoMS0obWMyLyhtYzIrVykpXjIpCmhpc3QoVykKaGlzdChiZXRwKQpgYGAKTm90ZToKYGBge3IsIGVjaG89VFJVRSxldmFsPVRSVUV9CmRXb25XID0gc2QoVykvbWVhbihXKQpkYmV0b25iZXQgPSBzZChiZXRwKS9tZWFuKGJldHApCmRXb25XCmRiZXRvbmJldAoKIyBjZW50cmFsIHZhbHVlIG9mIHJlbGF0aXZpc3RpYyBnYW1tYSBzaG91bGQgYmU6CmdhbW1hcCA9IChtYzIrMjAwKS9tYzIKIyB3b3VsZCBleHBlY3QgcmVsYXRpdmUgc3ByZWFkcyB0byBoYXZlIHJhdGlvOiAgKGRXL1cpLyhkdi92KSA9IChnYW1tYSsxL2dhbW1hKS8oMS9nYW1tYV4yKSA9IGdhbW1hICogKGdhbW1hKzEpCmdhbW1hcCooZ2FtbWFwICsgMSkKIyBmcm9tIHRoZSBkaXN0cmlidXRpb25zOgpkV29uVy9kYmV0b25iZXQKYGBgCgplLiBJbiB0aGUgc2FtZSBvciBzaW1pbGFyIHBsb3RzLCBvdmVybGF5IG5vcm1hbCBjdXJ2ZXMgb24gdG9wIG9mIHRoZSBoaXN0b2dyYW1zIHdpdGggdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgZGlzdHJpYnV0aW9ucy4KYGBge3IsIGVjaG89VFJVRSxldmFsPVRSVUV9Cmhpc3QoVyxmcmVxID0gRkFMU0UpCmN1cnZlKDEvc3FydCgyKnBpKS9zZChXKSpleHAoLSh4LW1lYW4oVykpXjIvMi9zZChXKV4yKSwgYWRkPVRSVUUsIGNvbD0icmVkIikKaGlzdChiZXRwLCBmcmVxPUZBTFNFKQpjdXJ2ZSgxL3NxcnQoMipwaSkvc2QoYmV0cCkqZXhwKC0oeC1tZWFuKGJldHApKV4yLzIvc2QoYmV0cCleMiksIGFkZD1UUlVFLCBjb2w9InJlZCIpCmBgYAoKKipDaGFyZ2UtdG8tTWFzcyBTZWxlY3Rpb24qKiAgCgpQb3NpdGl2ZWx5IGNoYXJnZWQgaW9ucyBhcmUgZW1pdHRlZCBmcm9tIGEgc291cmNlLCBlbWVyZ2luZyB0aHJvdWdoIGEgcG90ZW50aWFsIGRpZmZlcmVuY2Ugb2YgJFZfMCQuICBUaGUga2luZXRpYyBlbmVyZ3kgb2YgZWFjaCBwYXJ0aWNsZSBpcyB0aHVzICRxVl8wJCwgd2hlcmUgJHEkIGlzIHRoZSBjaGFyZ2Ugb2YgdGhlIGlvbi4gIFRoZSBwYXJ0aWNsZXMgYXJlIHRoZW4gZGlyZWN0ZWQgdGhyb3VnaCBhICJ2ZWxvY2l0eSBzZWxlY3RvciIsIGEgZGV2aWNlIG1hZGUgdXAgb2YgZWxlY3RyaWMgYW5kIG1hZ25ldGljIGZpZWxkcywgJEUkIGFuZCAkQiQsIGF0IHJpZ2h0IGFuZ2xlcyB0byBlYWNoIG90aGVyIHN1Y2ggdGhhdCB3aGVuIHRoZSB2YWx1ZXMgb2YgdGhlc2UgZmllbGRzIGFyZSB0dW5lZCBwcm9wZXJseSwgcGFydGljbGVzIHRyYXZlbCB0aHJvdWdoIHRoZSBkZXZpY2Ugd2l0aG91dCBkZWZsZWN0aW9uIG9mIHRoZWlyIHRyYWplY3RvcnkuICAKYGBge3IsIGVjaG89VFJVRSxldmFsPVRSVUV9ClYwICA9IDYyZTMgICAjIFYKRTAgID0gMTAwZTMgICMgVi9tCkIwICA9IDAuMDUgICAjIFQKZWxsID0gMC4xNSAgICMgbQpgYGAKCmEuIElmIHRoZSBlbGVjdHJpYyBmaWVsZCBvZiB0aGUgU2VsZWN0b3IgaXMgJEVfMCQgPSAkYHIgRTAvMTAwMGAkIGtWL20gYW5kIHRoZSBtYWduZXRpYyBmaWVsZCBvZiB0aGUgU2VsZWN0b3IgaXMgJEJfMCQgPSBgciBCMGAgVCwgd2hhdCBpcyB0aGUgdmVsb2NpdHkgcmVsYXRpdmUgdG8gdGhlIHNwZWVkIG9mIGxpZ2h0ICgkXGJldGEgPSB2L2MkKSBvZiB0aGUgcGFydGljbGVzIHRoYXQgdHJhdmVsICpzdHJhaWdodCogdGhyb3VnaCB0aGUgU2VsZWN0b3I/CmBgYHtyLCBlY2hvPVRSVUUsZXZhbD1UUlVFfQpFb25CYyA9IEUwL0IwLzIuOTk3OWU4CkVvbkJjCmBgYApiLiBOZXh0LCB0aGUgbWFnbmV0aWMgZmllbGQgb2YgdGhlIFNlbGVjdG9yIGlzIHR1cm5lZCBvZmYuICBUaGUgcGFydGljbGVzIGVudGVyaW5nIGFyZSBub3cgZGVmbGVjdGVkIHNvbGVseSBieSB0aGUgdW5pZm9ybSBlbGVjdHJpYyBmaWVsZCwgJEVfMCQuICBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZCByZWdpb24gaXMgJFxlbGwkLCBzaG93IHRoYXQgdXBvbiBleGl0IGZyb20gdGhlIFNlbGVjdG9yIHRoZSBwYXJ0aWNsZXMgbGVhdmUgYXQgYW4gYW5nbGUgb2YgZGVmbGVjdGlvbiBnaXZlbiBieQokJFx0YW5cdGhldGEgPSBcZnJhY3sxfXsyfSBcZnJhY3tFXzAgXGVsbH17Vl8wfS4kJAoqKkluIHVuaWZvcm0gRS1maWVsZCAoYW5kIG5vbi1yZWxhdGl2aXN0aWMpOioqCiQkCmReMnkvZHReMiA9IEZfeS9tID0gcUVfMC9tXFwKZHkvZHQgPSAocUVfMC9tKVw7IHQgPVxmcmFje3FFXzB9e219XGxlZnQoXGZyYWN7XGVsbH17dl9zfVxyaWdodCkgPSAoZHkvZHMpKGRzL2R0KSA9IHknKFxlbGwpXDsgdl9zXFwKXHRhblx0aGV0YSA9eScocz1cZWxsKSA9IFxmcmFje3FFXzB9e212X3NeMn1cO1xlbGwgPSBcZnJhYzEyIFxmcmFje3FFXzB9e1xmcmFjMTIgbXZfc14yfVw7IFxlbGwgPSBcZnJhYzEyXGZyYWN7RV8wXGVsbH17Vl8wfQokJAoKYy4gIElmICRcZWxsJCA9IDAuMTUgbSwgYW5kICRWXzAkID0gYHIgVjAvMTAwMGAga1YsIGF0IHdoYXQgYW5nbGUgZG8gdGhlIHBhcnRpY2xlcyBlbWVyZ2UgYXQgdGhlIGVuZCBvZiB0aGUgU2VsZWN0b3I/IApgYGB7ciwgZWNobz1UUlVFLGV2YWw9VFJVRX0KdGhldCA9IGF0YW4oRTAqZWxsLzIvVjApCnRoZXQqMTgwL3BpICAjIGRlZ3JlZXMKYGBgCmQuIEVzdGltYXRlIGJ5IGhvdyBtdWNoIHRoZSBwYXJ0aWNsZSdzIGVuZXJneSBpcyBjaGFuZ2VkIGFmdGVyIHBhc3NpbmcgdGhyb3VnaCB0aGUgU2VsZWN0b3Igd2l0aCB0aGUgbWFnbmV0IHR1cm5lZCBvZmYuCmBgYHtyLCBlY2hvPVRSVUUsZXZhbD1UUlVFfQojIGRFID0gcSpFMCpkeSA9IHEqRTAgKiAxLzIgXGVsbCAqIHRoZXQKZEUgPSAxLzIqRTAqZWxsKnRoZXQgICAjIGVWCmRFLzEwMDAgICAgICAgICAgICAgICAgIyBrZVYKYGBgCmUuICBJZiwgaW5zdGVhZCwgdGhlIGVsZWN0cmljIGZpZWxkIGlzIHR1cm5lZCBvZmYgYW5kIHRoZSBtYWduZXRpYyBmaWVsZCBpcyBsZWZ0IG9uIGF0IGl0cyBvcmlnaW5hbCB2YWx1ZSBvZiAkQl8wJCwgdGhlIHBhcnRpY2xlIHRyYWplY3RvcnkgdGhyb3VnaCB0aGUgZmllbGQgcmVnaW9uIHdpbGwgYmUgY2lyY3VsYXIuICBTaG93IHRoYXQgdGhlIHJhZGl1cyBvZiBjdXJ2YXR1cmUgb2YgdGhlIHRyYWplY3Rvcnkgd2lsbCBiZQokJApSID0gXGZyYWN7MlZfMH17RV8wfS4KJCQKKipJbiB1bmlmb3JtIEItZmllbGQgKGFuZCBub24tcmVsYXRpdmlzdGljKToqKgokJAptdl4yL1IgPSBxdkIgXGxvbmdyaWdodGFycm93IFIgPSBcZnJhY3ttdl4yfXtxdkJ9ID0gXGZyYWN7MlxjZG90XGZyYWMxMiBtdl4yfXtxKHZCXzApfSA9IFxmcmFjezJxVl8wfXtxRV8wfSA9IFxmcmFjezJWXzB9e0VfMH0KJCQKCmYuIEJ5IHdoYXQgYW5nbGUgd2lsbCB0aGUgcGFydGljbGUgbGVhdmUgdGhlIFNlbGVjdG9yIHdpdGggdGhlIG1hZ25ldGljIGZpZWxkIG9uIGFuZCB0aGUgZWxlY3RyaWMgZmllbGQgb2ZmPwpgYGB7ciwgZWNobz1UUlVFLGV2YWw9VFJVRX0KIyB0aGV0QiA9IGVsbC9SID0gRTAqZWxsLygyKlYwKQp0aGV0QiA9IEUwKmVsbC9WMC8yICAjIG0KdGhldEIqMTgwL3BpCmBgYApnLiBFc3RpbWF0ZSBieSBob3cgbXVjaCB0aGUgcGFydGljbGUncyBlbmVyZ3kgaXMgY2hhbmdlZCBhZnRlciBwYXNzaW5nIHRocm91Z2ggdGhlIFNlbGVjdG9yIHdpdGggdGhlIGVsZWN0cmljIGZpZWxkIHR1cm5lZCBvZmYuCmBgYHtyLCBlY2hvPVRSVUUsZXZhbD1UUlVFfQojIHRoZSBwYXJ0aWNsZSdzIGVuZXJneSBpcyBub3QgY2hhbmdlZCAtLSBtYWduZXRpYyBmaWVsZCBkb2VzIG5vIHdvcmsKYGBgCgpoLiBJZiB0aGUgaW9ucyBoYXZlIGNoYXJnZSBzdGF0ZSAkUSA9IHEvZSQgYW5kIGF0b21pYyBtYXNzICRBID0gbS9tX3UkLCB3aGVyZSAkbV91Y14yJCA9IDkzMSBNZVYgaXMgdGhlIHJlc3QgbWFzcyBvZiB0aGUgbnVjbGVvbiwgdGhlbiBzaG93IHRoYXQKJCQKXGZyYWN7UX17QX0gPSBcZnJhYzEyIFxmcmFje21fdWNeMn17ZVZfMH0gXGxlZnQoXGZyYWN7RV8wfXtjQl8wfVxyaWdodCleMgogICAgICAgICAgICAgICAgPSBcOyBcZnJhYzEyIFxmcmFje21fdWNeMn17ZVZfMH0gXDsgKHYvYyleMi4KJCQKaC4gRm9yIG91ciBwYXJhbWV0ZXJzIGFib3ZlLCB3aGF0IG11c3QgYmUgdGhlIHZhbHVlIG9mICRRL0EkIGZvciB0aGUgaW9ucz8gIElmIHdlIGJlbGlldmUgdGhlIGlvbnMgdG8gYmUgdGhvc2Ugb2YgUG90YXNzaXVtIGF0b21zLCB3aGF0IGNoYXJnZSBzdGF0ZSBtb3N0IGxpa2VseSBjb21wcmlzZXMgdGhlIGJlYW0/CmBgYHtyLCBlY2hvPVRSVUUsZXZhbD1UUlVFfQpRb25BID0gMS8yKjkzMWU2L1YwKihFMC8yLjk5NzllOC9CMCleMgpRb25BCiMgTm90ZTogIFBvdGFzc2l1bSAtLSBaID0gMTksIEEgPSAzOTsgMTMvMzkgPSAwLjMzMzsgIHRodXMsIGxpa2VseSArMTMgY2hhcmdlIHN0YXRlCmBgYAoKCioqQmVhbSBEaXN0cmlidXRpb25zKioKClRoZSBmaWxlIFtgaW5wdXRCZWFtLmRhdGBdKC4vaW5wdXRCZWFtLmRhdCkgY29udGFpbnMgaW5mb3JtYXRpb24gb2YgMjAsMDAwIHByb3RvbnMgcHJvZHVjZWQgZnJvbSBhIHBhcnRpY2xlIHRyYWNraW5nIGNvZGUuICBFYWNoIGxpbmUgaW4gdGhlIGZpbGUgY29udGFpbnMgdGhlIGZpbmFsIHBoYXNlIHNwYWNlIGNvb3JkaW5hdGVzIG9mIGEgcHJvdG9uIGF0IHRoZSBlbmQgb2YgYSBiZWFtIGxpbmU6ICB0cmFuc3ZlcnNlIGNvb3JkaW5hdGVzICR4JCBhbmQgJHkkIGluIG1tLCBtb21lbnR1bSBjb21wb25lbnRzICRwX3gkLCAkcF95JCBhbmQgJHBfeiQgaW4gTWVWL2MsIGFuZCB0aGUgdGltZSBvZiBhcnJpdmFsICRkdCQsIGluIHNlY29uZHMsIHJlbGF0aXZlIHRvIGFuIGlkZWFsIHBhcnRpY2xlJ3MgdGltZSBvZiBhcnJpdmFsLiAgVGhlIGZpbGUgY2FuIGJlIHJlYWQgaW4gYXMgYSAiZGF0YSBmcmFtZSIgdXNpbmcgYFJgLCBmb3IgZXhhbXBsZS4gIAoKYS4gVXNlIHRoZSBmaWxlIHRvIGdlbmVyYXRlIGEgZGlzcGxheSBvZiB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgdHJhbnN2ZXJzZSBwaGFzZSBzcGFjZSBkaXN0cmlidXRpb25zIGFzIGhlYXQgbWFwcywgb3IgZGVuc2l0eSBwbG90cy4gIAoKYGBge3IsIGVjaG89VFJVRSxldmFsPVRSVUV9CmRmID0gcmVhZC5jc3YoImlucHV0QmVhbS5kYXQiLCBzZXA9IiAiKQpkZiR4cCA9IGRmJHBjeC9kZiRwY3oqMTAwMCAjIG1yYWQgICAKZGYkeXAgPSBkZiRwY3kvZGYkcGN6KjEwMDAgIyBtcmFkCmRmJHAgPSBzcXJ0KGRmJHBjeF4yICsgZGYkcGN5XjIgKyBkZiRwY3peMikKYXZlUCA9IG1lYW4oZGYkcCkKZGYkZGVsID0gZGYkcC9hdmVQLTEKYXZlYmcgPSBhdmVQLzAuOTM4CmhlYWQoZGYpCmhpc3QoZGYkeHApCmxpYnJhcnkoZ2dwbG90MikKcHNQbHQgPSBnZ3Bsb3QoZGYpCnBzUGx0KyBnZW9tX2JpbjJkKGFlcyh4LHhwKSxiaW5zPTEwMCkKcHNQbHQrIGdlb21fYmluMmQoYWVzKHkseXApLGJpbnM9MTAwKQpgYGAKCmIuIENhbGN1bGF0ZSB0aGUgQ291cmFudC1TbnlkZXIgcGFyYW1ldGVycyBhbmQgcm1zIGVtaXR0YW5jZXMgdGhhdCBiZXN0IHJlcHJlc2VudCB0aGUgZGlzdHJpYnV0aW9uIGluIGJvdGggdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRpbWVuc2lvbnMuICBOZWdsZWN0IGRpc3BlcnNpb24gZWZmZWN0cyBmb3IgdGhpcyBjYWxjdWxhdGlvbi4gIChOb3RlOiBBcmUgdGhlcmUgYW55IHN0cm9uZyBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgbG9uZ2l0dWRpbmFsIHBhcmFtZXRlcnMgb2YgdGhlIHBhcnRpY2xlcz8pICAKYGBge3IsIGVjaG89VFJVRSxldmFsPVRSVUV9CnNpZzExeCA9IG1lYW4oZGYkeF4yKQpzaWcyMXggPSBtZWFuKGRmJHgqZGYkeHApCnNpZzIyeCA9IG1lYW4oZGYkeHBeMikKZW1pdHR4ID0gc3FydChzaWcxMXgqc2lnMjJ4LXNpZzIxeF4yKQplbWl0dHgKc2lnMTF5ID0gbWVhbihkZiR5XjIpCnNpZzIxeSA9IG1lYW4oZGYkeSpkZiR5cCkKc2lnMjJ5ID0gbWVhbihkZiR5cF4yKQplbWl0dHkgPSBzcXJ0KHNpZzExeSpzaWcyMnktc2lnMjF5XjIpCmVtaXR0eQpwbG90KGRmJGRlbFQsZGYkZGVsKQpgYGAKCmMuIEZyb20gdGhlIHJlc3VsdCBhYm92ZSwgbWFrZSBhIHNjYXR0ZXIgcGxvdCBvZiAkXGFscGhhX3lcOyB5ICsgXGJldGFfeVw7IHknJCB2cy4gJHkkIGZvciB0aGUgdmVydGljYWwgZGlzdHJpYnV0aW9uLiAgV2hhdCBmcmFjdGlvbiBvZiB0aGUgcGFydGljbGVzIGFyZSB3aXRoaW4gdGhlIHJtcyBlbWl0dGFuY2Ugb2YgdGhlIGJlYW0/ICBXaGF0IGZyYWN0aW9uIG9mIHRoZSBwYXJ0aWNsZXMgYXJlIHdpdGhpbiA2IHRpbWVzIHRoZSBybXMgZW1pdHRhbmNlPwpgYGB7ciwgZWNobz1UUlVFLGV2YWw9VFJVRX0KYWxwaGF4ID0gLXNpZzIxeC9lbWl0dHgKYmV0YXggID0gIHNpZzExeC9lbWl0dHgKYWxwaGF5ID0gLXNpZzIxeS9lbWl0dHkKYmV0YXkgID0gIHNpZzExeS9lbWl0dHkKcGxvdChkZiR5LGRmJHkqYWxwaGF5K2RmJHlwKmJldGF5LGFzcD0xLHBjaD0iLiIpCnN5bWJvbHMoeD1jKDAsMCkseT1jKDAsMCksIGNpcmNsZXMgPSBjKHNxcnQoYmV0YXkqZW1pdHR5KSxzcXJ0KGJldGF5KmVtaXR0eSo2KSksbHR5PWMoMiwzKSxmZz1jKCJyZWQiLCJibHVlIiksbHdkPTIsYWRkPVRSVUUpCgojIGluc2lkZSAgICBybXMgZW1pdHRhbmNlOgpucm93KCBkZltkZiR5XjIgKyAoZGYkeSphbHBoYXkrZGYkeXAqYmV0YXkpXjIgPCAoICBlbWl0dHkqYmV0YXkpLF0gKSAvIG5yb3coZGYpICAKIyBpbnNpZGUgNnggcm1zIGVtaXR0YW5jZToKbnJvdyggZGZbZGYkeV4yICsgKGRmJHkqYWxwaGF5K2RmJHlwKmJldGF5KV4yIDwgKDYqZW1pdHR5KmJldGF5KSxdICkgLyBucm93KGRmKSAgCmBgYApkLiBBc3N1bWUgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGRyaWZ0cyBkb3duc3RyZWFtIGEgZGlzdGFuY2Ugb2YgNSBtLiAgU2hvdyB0aGUgcGhhc2Ugc3BhY2UgZGlzdHJpYnV0aW9ucyBhdCB0aGlzIG5ldyBsb2NhdGlvbiwgYW5kIHJlLWNvbXB1dGUgdGhlIENvdXJhbnQtU255ZGVyIHBhcmFtZXRlcnMgYW5kIHJtcyBlbWl0dGFuY2VzLiAgRGlzY3VzcyB0aGUgY2hhbmdlcyB5b3Ugb2JzZXJ2ZS4KYGBge3IsIGVjaG89VFJVRSxldmFsPVRSVUV9CmRmJHg1ID0gZGYkeCArIGRmJHhwKjUKZGYkeTUgPSBkZiR5ICsgZGYkeXAqNQpwc1BsdCA9IGdncGxvdChkZikKcHNQbHQrIGdlb21fYmluMmQoYWVzKHg1LHhwKSxiaW5zPTEwMCkKcHNQbHQrIGdlb21fYmluMmQoYWVzKHk1LHlwKSxiaW5zPTEwMCkKYGBgCmBgYHtyLCBlY2hvPVRSVUUsZXZhbD1UUlVFfQpzaWcxMXggPSBtZWFuKGRmJHg1XjIpCnNpZzIxeCA9IG1lYW4oZGYkeDUqZGYkeHApCnNpZzIyeCA9IG1lYW4oZGYkeHBeMikKZW1pdHR4ID0gc3FydChzaWcxMXgqc2lnMjJ4LXNpZzIxeF4yKQplbWl0dHgKc2lnMTF5ID0gbWVhbihkZiR5NV4yKQpzaWcyMXkgPSBtZWFuKGRmJHk1KmRmJHlwKQpzaWcyMnkgPSBtZWFuKGRmJHlwXjIpCmVtaXR0eSA9IHNxcnQoc2lnMTF5KnNpZzIyeS1zaWcyMXleMikKZW1pdHR5CmFscGhheDUgPSAtc2lnMjF4L2VtaXR0eApiZXRheDUgID0gIHNpZzExeC9lbWl0dHgKYWxwaGF5NSA9IC1zaWcyMXkvZW1pdHR5CmJldGF5NSAgPSAgc2lnMTF5L2VtaXR0eQpgYGAKCnwgICAgICAgICAgICB8ICAgICAgICBzID0gMCAgICAgICAgIHwgICAgICAgICBzPSA1IG0gICAgICAgfAp8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCAkXGJldGFfeCQgIHwgYHIgcm91bmQoYmV0YXgsICAzKWAgfCBgciByb3VuZChiZXRheDUsIDMpYCB8CnwgJFxhbHBoYV94JCB8IGByIHJvdW5kKGFscGhheCwgMylgIHwgYHIgcm91bmQoYWxwaGF4NSwzKWAgfAp8ICRcZXBzaWxvbl94JCB8IGByIHJvdW5kKGVtaXR0eCAsMylgIHwgYHIgcm91bmQoZW1pdHR4LDMpYHwKfCAkXGJldGFfeSQgIHwgYHIgcm91bmQoYmV0YXksICAzKWAgfCBgciByb3VuZChiZXRheTUsIDMpYCB8CnwgJFxhbHBoYV95JCB8IGByIHJvdW5kKGFscGhheSAsMylgIHwgYHIgcm91bmQoYWxwaGF5NSwzKWAgfAp8JFxlcHNpbG9uX3kkIHwgYHIgcm91bmQoZW1pdHR5ICwzKWAgfCBgciByb3VuZChlbWl0dHksMylgIHw=