Some General Comments:

Muon Decay Kinematics

A beam of \(\pi^+\) particles (\(m_{\pi}\) = 140 MeV/\(c^2\)) is accelerated to a momentum of \(p_{\pi_+}\) = 3.1 GeV/\(c\) in the laboratory frame. A \(\pi^+\) particle decays into a positive muon (\(m_{\mu}\) = 105 MeV/\(c^2\)) and a muon neutrino (\(m_{\nu_\mu}\) = 0 MeV/\(c^2\)).

  1. What is the energy of the muon in the rest frame of the \(\pi^+\)?
  2. What is the energy of the muon in the laboratory frame if it is found traveling in the beam direction?
  3. What is the energy of the muon in the laboratory frame if it is found traveling at and angle of 250 mrad with respect to the beam direction?
# a) In the pion rest frame:
mc2pi = 139.57 # MeV
mc2mu = 105.65 # MeV
Estar = (mc2pi^2+mc2mu^2)/2/mc2pi
Estar
[1] 109.7718
pstar = (mc2pi^2 - mc2mu^2)/2/mc2pi
pstar
[1] 29.79817
# b) In the lab frame:
#    E = gamma_pi * [Estar + beta_pi * pstar * cos(thetastar)]
#       cos(thetastar) = cos(0) = 1
gamma_pi = sqrt(3100^2+mc2pi^2)/mc2pi
gamma_pi
[1] 22.23358
beta_pi  = sqrt(1-1/gamma_pi^2)
beta_pi
[1] 0.998988
E = gamma_pi*(Estar + beta_pi * pstar * cos(   0))
E/1000 # GeV
[1] 3.10247
# c)  If thetastar = 0.25 rad, ...
#  Note:  wording was a bit ambiguous; graded generously
E = gamma_pi*(Estar + beta_pi * pstar * cos(0.25))
E/1000 # GeV
[1] 3.081895

G4beamline Problem (optional)

  1. Assume that at the downstream end of the lithium lens (\(z\) = 0.577 m) we have a collection of pions all at 3.094 GeV/\(c\). Based on the exponential decay law, how many pions will survive at the end of M3 (\(z\) = 279.230 m) in the lab frame?
mc2Pi = 139.57  # MeV
Epi   =  3094   # MeV
tauPi = 2.6e-8  # s
gamPi = Epi/mc2pi
tauLab = gamPi*tauPi # s
dt2M3 = (279.23 - 0.577)/2.9979e8  # s
Nf = exp(-dt2M3/gamPi/tauPi)
Nf
[1] 0.199355

The pion lifetime in its own frame is \(\tau\) = \(2.6\times 10^{-8}\) s. In the lab frame the pion lifetime is \(\gamma\tau\) = \(5.7637028\times 10^{-7}\) where \(\gamma\) = 22.1680877 for 3.094 GeV/c pions. The time needed to reach the end of M3 is dt2M3 = \(9.2949398\times 10^{-7}\) s. The exponential decay law predicts about 20% of the pions remain at the of M3, or 80% of the pions have decayed.

  1. Now let’s open the G4beamline GUI and download and open the G4beamline file HW1_G4_M2M3.g4bl. This is a beam line description of the “M2-M3” beam line at the Fermilab Muon Campus; the beam line starts just in front of a target used for producing muon beams. Start to play with the visualization tools. Note: A demonstration of using G4beamline was provided in class.

[Simply run G4beamline and proceed to next question…]

  1. Starting at the downstream end of the lithium lens, the G4beamline code (HW1_G4_M2M3.g4bl) tracks a distribution of 3000 pions (param nparticles = 3000) with a momentum of 3.1 GeV/\(c\). Running the code should take about 10 minutes or less, depending on the speed of your computer. The distribution at the end of M3 should be generated by the code, and written to a text file called HW1_particles_EndM3.txt. Open the file and exam with an appropriate editor and/or program (such as R). How many pions will survive to the end of M3? How does it compare with the exponential decay law? Note: PDGid for pions is 211 and PDGid for muons is -13.

Running the simulation predicts 573 pions at the end of M3. Starting with 3000 pions, the exponential decay calculation above would predict \(3000~\times\) Nf = 598, which is very close.

  1. For the distribution you have created for Part c above, make a histogram of the muon and pion momentum distributions. What do you observe?

In addition to pions we have \(\approx 100\) muons. The pion and muon momentum histograms are created and shown below:

library(data.table)
data.table 1.12.2 using 2 threads (see ?getDTthreads).  Latest news: r-datatable.com
df = fread("HW1_particles_EndM3.txt",skip = 2)
head(df)
colnames(df[,8]) = "P0"
dfpi = df[V8 == 211]
dfmu = df[V8 == -13]
nrow(dfpi)  # number of pions
[1] 610
nrow(dfmu)  # number of muons
[1] 84
par(mfrow=c(1,2))
hist(dfpi$V6,breaks=50,main="pion distribution",xlab="pion energy [MeV]")
hist(dfmu$V6,breaks=50,main="muon distribution",xlab="muon energy [MeV]")

Beam Debunching

Protons transported to the Fermilab Booster ring are first accelerated through a linear accelerator. The particles leaving this “linac” are arranged in bunches spaced 5 ns apart, where each bunch has an average kinetic energy of 400 MeV, a relative momentum spread of 0.3% and a time spread of 0.5 ns (rms values for each; assume Gaussian distributions). After leaving the linac, the particles travel approximately 100 m and then go through a cavity. The cavity is operating sinusoidally with a 200 MHz frequency and can be used to lower the overall momentum spread of the beam. The cavity is located approximately 100 m before the Booster injection point.

  1. Write a short code that transports several thousand particles within one bunch, with the initial conditions given above, through 100 m of drift, then through the cavity, then 100 m further. Plot the longitudinal phase space distribution (\(\Delta p/p\) vs. \(\Delta t\)) at the beginning and end of the transport system, as well as just before and after the cavity. Treat the cavity as a “thin” device for our purposes, but retain its sinusoidal time structure.

  2. What overall effective voltage is required of the cavity to minimize the momentum spread of the beam? What minimum value do you arrive at?

Np    = 10000
Veff  = 2.5e6
gamma = (938+400)/938
beta  = sqrt(1-1/gamma^2)
dt0   = rnorm(Np,0,0.05)    # ns
del   = rnorm(Np,0,0.002)  # dp/p
par(mfrow=c(2,2))
plot(dt0,del*100,xlim=c(-3,3),ylim=c(-1,1)*1.2,pch=".",
   xlab="dt [ns]",ylab="dp/p [%]",main="exit of linac")
text(1.7,0.8,paste("dp/p rms = ",round(sd(del)*100,2)," %" ))

dt1   = dt0 -(100/2.9979e8*1e9)/beta/gamma^2*del
plot(dt1,del*100,xlim=c(-3,3),ylim=c(-1,1)*1.2,pch=".",
   xlab="dt [ns]",ylab="dp/p [%]",main="entrance to cavity")
curve(sin(2*pi*200e6*x/1e9),add=TRUE,col="blue",lty=2)

del2  = del + sin(2*pi*200e6*dt1/1e9)*Veff/400e6*gamma/(1+gamma)
plot(dt1,del2*100,xlim=c(-3,3),ylim=c(-1,1)*1.2,pch=".",
   xlab="dt [ns]",ylab="dp/p [%]",main="exit of cavity")
text(1,0.8,paste("Veff =", round(Veff/1e6,2),"MV\n","rms = ",round(sd(del2)*100,3)," %" ))

dt2   = dt1 -(100/2.9979e8*1e9)/beta/gamma^2*del2
plot(dt2,del2*100,xlim=c(-3,3),ylim=c(-1,1)*1.2,pch=".",
   xlab="dt [ns]",ylab="dp/p [%]",main="entrance to Booster")
text(1,0.8,paste("Veff =", round(Veff/1e6,2),"MV\n","rms = ",round(sd(del2)*100,3)," %" ))

Adiabatic Ramping

Synchrotron motion in the longitudinal degree of freedom can be characterized by the following set of difference equations:

SynchTrk = function(U){
   U[2] = U[2] + k*sin( 2*pi*(U[1]-us) )
   U[1] = U[1] - g*U[2]
   return(U)
}

where u and v are “energy” and “phase” variables, and k and g are constants determined by the accelerating voltage and time of flight between accelerating stations. The synchronous phase is given by the parameter us. The above function SynchTrk will hence track the u-v variables through one turn about a synchrotron or, say, between two successive cavities in a linac.

g  = 0.02
k  = 0.005
us = 0

u = 0.01
v = 0
  1. Create a small code chunk that uses the above function to track a single particle through nturn iterations. From your code, determine the approximate period of a synchrotron oscillation for values of k = 0.005, g = 0.02 and us = 0.0833333. [A good initial condition for your particle is (u,v) = (0.01, 0).]

Tip: In R, employ the following plot attributes to make consistent looking plots:

# prior to the loop:
plot(U[1],U[2],xlim=c(-1,1)*0.15,ylim=c(-1,1)*0.05,asp=1,typ="n")
#     asp is the "aspect ratio"; typ="n" means do not plot anything yet

#... within the loop:
   points(U[1],U[2],pch=".")    # adds points to the previous plot
#...
nturn =  5000
U = c(u,v)
plot(u,v,xlim=c(-1,1)*0.15,ylim=c(-1,1)*0.05,asp=1,typ="n")

i = 0
while(i<250){  # the phase space trajectory appears to "close" after about 250 turns
   i = i+1
   U = SynchTrk(U)
   points(U[1],U[2],pch=".")
}

  1. Next, we wish to adjust the synchronous phase from an initial value of us0 = 0 (zero degrees) to a value of usmax = \(\pi/6\) (30 degrees). In order to explore various “ramp rates” of this phase, create a function usR(n) that
    1. maintains usR = us0 until n = on,
    2. varies usR linearly from us0 to usmax between turns n = on and n = off,
    3. maintains usR = usmax for n > off.
      Make a plot of your function over the range 0 < n < 400 turns using values of on = 100, off = 300.
on    =   100
off   =   300
us0   =     0
usmax =   1/12

usR = function(x){
   ifelse(x<on,us0,ifelse(x>=off,usmax,
      (usmax-us0)/(off-on)*(x-on) ))
}
curve(usR,0,400)

  1. Modify your tracking code to employ your phase ramp function in the calculation. Make an intial test by setting usmax = 0 and on = 1, off = 2 then re-tracking for a sufficient number of turns to make sure you get the same result as previously.
nturn =  400
U = c(u,v)
plot(u,v,xlim=c(-1,1)*0.15,ylim=c(-1,1)*0.05,asp=1,typ="n")

i = 0
usmax = 0
on = 1
off = 2
while(i<nturn){  # the phase space trajectory appears to "close" after about 250 turns
   i = i+1
   us = usR(i)
   U = SynchTrk(U)
   points(U[1],U[2],pch=".")
}

nturn =  8000
us0   =     0
usmax =   1/12
on    =   250
offJ  = c(350, 400, 600, 2000, 3000, 6000)
  1. Finally, set usmax = 0.0833333, on = 250 and make phase space plots for various “ramp off” times: off = 350, 400, 600, 2000, 3000, 6000. For consistency, use nturn = 8000 for each case. Comment on the results.
par(mfrow=c(2,3))
j = 0
while(j<6){
   j = j+1
   off = offJ[j]
   U = c(u,v)
   plot(u,v,xlim=c(-1,1)*0.15,ylim=c(-1,1)*0.05,asp=1,
      typ="n",main=paste("off =", off))
   i = 0
   while(i<nturn){
      i = i+1
      us = usR(i)
      U = SynchTrk(U)
      points(U[1],U[2],pch=".",   # add colors to envision times during ramping
         col=ifelse(i<on,"green",ifelse(i>off,"red","black") ))
   }
   abline(v=c(0,usmax),lty=3,col="brown")
}


  1. Northern Illinois University and Fermi National Accelerator Laboratory

LS0tCnRpdGxlOiAiSG9tZXdvcmsgNiBEaXNjdXNzaW9uIgphdXRob3I6IE1pa2UgU3lwaGVyc15bTm9ydGhlcm4gSWxsaW5vaXMgVW5pdmVyc2l0eSBhbmQgRmVybWkgTmF0aW9uYWwgQWNjZWxlcmF0b3IKICBMYWJvcmF0b3J5XQpkYXRlOiAnbGFzdCB1cGRhdGU6IGByIGZvcm1hdCgoU3lzLkRhdGUoKSksICIlZCAlYiAlWSIpYCcKb3V0cHV0OiAgaHRtbF9ub3RlYm9vawotLS0KCioqU29tZSBHZW5lcmFsIENvbW1lbnRzOioqCgotIGdyYWRlOiAgMzAgcG9zc2libGUgIAogICAgICArIDEwIHB0cyBlYWNoIHByb2JsZW0gKCsxMCBmb3IgYm9udXMpICAKICAgICAgKyBhdmUgc2NvcmU6ICAyNy8zMCAoaW5jbC4gYm9udXMpICAKCi0gdXNlIG9mIGRhdGEudGFibGUsIGV0Yy4gIAogICArIGRmMiA9IGRmW1BER2lkID09IC0xM107IG5yb3coZGYyKSAgCi0gc29tZSBsZWV3YXkgZ2l2ZW4gZm9yIFByb2IuIDFjICh2YWd1ZSB3b3JkaW5nKSAgCgoKCioqTXVvbiBEZWNheSBLaW5lbWF0aWNzKioKCkEgYmVhbSBvZiAkXHBpXiskIHBhcnRpY2xlcyAoJG1fe1xwaX0kID0gMTQwIE1lVi8kY14yJCkgaXMgYWNjZWxlcmF0ZWQgdG8gYSBtb21lbnR1bSBvZiAkcF97XHBpXyt9JCA9IDMuMSBHZVYvJGMkIGluIHRoZSBsYWJvcmF0b3J5IGZyYW1lLiAgQSAkXHBpXiskIHBhcnRpY2xlIGRlY2F5cyBpbnRvIGEgcG9zaXRpdmUgbXVvbiAoJG1fe1xtdX0kID0gMTA1IE1lVi8kY14yJCkgYW5kIGEgbXVvbiBuZXV0cmlubyAoJG1fe1xudV9cbXV9JCA9IDAgTWVWLyRjXjIkKS4gIAoKYS4gIFdoYXQgaXMgdGhlIGVuZXJneSBvZiB0aGUgbXVvbiBpbiB0aGUgcmVzdCBmcmFtZSBvZiB0aGUgJFxwaV4rJD8gIApiLiAgV2hhdCBpcyB0aGUgZW5lcmd5IG9mIHRoZSBtdW9uIGluIHRoZSBsYWJvcmF0b3J5IGZyYW1lIGlmIGl0IGlzIGZvdW5kIHRyYXZlbGluZyBpbiB0aGUgYmVhbSBkaXJlY3Rpb24/ICAKYy4gIFdoYXQgaXMgdGhlIGVuZXJneSBvZiB0aGUgbXVvbiBpbiB0aGUgbGFib3JhdG9yeSBmcmFtZSBpZiBpdCBpcyBmb3VuZCB0cmF2ZWxpbmcgYXQgYW5kIGFuZ2xlIG9mIDI1MCBtcmFkIHdpdGggcmVzcGVjdCB0byB0aGUgYmVhbSBkaXJlY3Rpb24/ICAKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0KIyBhKSBJbiB0aGUgcGlvbiByZXN0IGZyYW1lOgptYzJwaSA9IDEzOS41NyAjIE1lVgptYzJtdSA9IDEwNS42NSAjIE1lVgpFc3RhciA9IChtYzJwaV4yK21jMm11XjIpLzIvbWMycGkKRXN0YXIKCnBzdGFyID0gKG1jMnBpXjIgLSBtYzJtdV4yKS8yL21jMnBpCnBzdGFyCgojIGIpIEluIHRoZSBsYWIgZnJhbWU6CiMgICAgRSA9IGdhbW1hX3BpICogW0VzdGFyICsgYmV0YV9waSAqIHBzdGFyICogY29zKHRoZXRhc3RhcildCiMgICAgICAgY29zKHRoZXRhc3RhcikgPSBjb3MoMCkgPSAxCmdhbW1hX3BpID0gc3FydCgzMTAwXjIrbWMycGleMikvbWMycGkKZ2FtbWFfcGkKYmV0YV9waSAgPSBzcXJ0KDEtMS9nYW1tYV9waV4yKQpiZXRhX3BpCgpFID0gZ2FtbWFfcGkqKEVzdGFyICsgYmV0YV9waSAqIHBzdGFyICogY29zKCAgIDApKQpFLzEwMDAgIyBHZVYKCiMgYykgIElmIHRoZXRhc3RhciA9IDAuMjUgcmFkLCAuLi4KIyAgTm90ZTogIHdvcmRpbmcgd2FzIGEgYml0IGFtYmlndW91czsgZ3JhZGVkIGdlbmVyb3VzbHkKRSA9IGdhbW1hX3BpKihFc3RhciArIGJldGFfcGkgKiBwc3RhciAqIGNvcygwLjI1KSkKRS8xMDAwICMgR2VWCmBgYAoKCioqYEc0YmVhbWxpbmVgIFByb2JsZW0gKG9wdGlvbmFsKSoqCgphLgkgQXNzdW1lIHRoYXQgYXQgdGhlIGRvd25zdHJlYW0gZW5kIG9mIHRoZSBsaXRoaXVtIGxlbnMgKCR6JCA9IDAuNTc3IG0pIHdlIGhhdmUgYSBjb2xsZWN0aW9uIG9mIHBpb25zIGFsbCBhdCAzLjA5NCBHZVYvJGMkLiBCYXNlZCBvbiB0aGUgZXhwb25lbnRpYWwgZGVjYXkgbGF3LCBob3cgbWFueSBwaW9ucyB3aWxsIHN1cnZpdmUgYXQgdGhlIGVuZCBvZiBNMyAoJHokID0gMjc5LjIzMCBtKSBpbiB0aGUgbGFiIGZyYW1lPyAgCgpgYGB7cn0KbWMyUGkgPSAxMzkuNTcgICMgTWVWCkVwaSAgID0gIDMwOTQgICAjIE1lVgp0YXVQaSA9IDIuNmUtOCAgIyBzCmdhbVBpID0gRXBpL21jMnBpCnRhdUxhYiA9IGdhbVBpKnRhdVBpICMgcwpkdDJNMyA9ICgyNzkuMjMgLSAwLjU3NykvMi45OTc5ZTggICMgcwpOZiA9IGV4cCgtZHQyTTMvZ2FtUGkvdGF1UGkpCk5mCmBgYAoKVGhlIHBpb24gbGlmZXRpbWUgaW4gaXRzIG93biBmcmFtZSBpcyAkXHRhdSQgPSAkYHIgdGF1UGlgJCBzLiBJbiB0aGUgbGFiIGZyYW1lIHRoZSBwaW9uIGxpZmV0aW1lIGlzICRcZ2FtbWFcdGF1JCA9ICAkYHIgdGF1TGFiYCQgd2hlcmUgJFxnYW1tYSQgPSBgciBnYW1QaWAgZm9yIGByIEVwaS8xMDAwYCBHZVYvYyBwaW9ucy4gVGhlIHRpbWUgbmVlZGVkIHRvIHJlYWNoIHRoZSBlbmQgb2YgTTMgaXMgYGR0Mk0zYCA9ICRgciBkdDJNM2AkIHMuIFRoZSBleHBvbmVudGlhbCBkZWNheSBsYXcgcHJlZGljdHMgYWJvdXQgYHIgcm91bmQoTmYqMTAwKWAlIG9mIHRoZSBwaW9ucyByZW1haW4gYXQgdGhlIG9mIE0zLCBvciBgciByb3VuZCgoMS1OZikqMTAwKWAlIG9mIHRoZSBwaW9ucyBoYXZlIGRlY2F5ZWQuCgpiLglOb3cgbGV04oCZcyBvcGVuIHRoZSBgRzRiZWFtbGluZWAgR1VJIGFuZCBkb3dubG9hZCBhbmQgb3BlbiB0aGUgYEc0YmVhbWxpbmVgIGZpbGUgIFtgSFcxX0c0X00yTTMuZzRibGBdKC4vSFcxX0c0X00yTTMuZzRibCkuIFRoaXMgaXMgYSBiZWFtIGxpbmUgZGVzY3JpcHRpb24gb2YgdGhlICJNMi1NMyIKIGJlYW0gbGluZSBhdCB0aGUgRmVybWlsYWIgTXVvbiBDYW1wdXM7IHRoZSBiZWFtIGxpbmUgc3RhcnRzIGp1c3QgaW4gZnJvbnQgb2YgYSB0YXJnZXQgdXNlZCBmb3IgcHJvZHVjaW5nIG11b24gYmVhbXMuICBTdGFydCB0byBwbGF5IHdpdGggdGhlIHZpc3VhbGl6YXRpb24gdG9vbHMuIE5vdGU6IEEgZGVtb25zdHJhdGlvbiBvZiB1c2luZyBgRzRiZWFtbGluZWAgd2FzIHByb3ZpZGVkIGluIGNsYXNzLiAgCgpbU2ltcGx5IHJ1biBgRzRiZWFtbGluZWAgYW5kIHByb2NlZWQgdG8gbmV4dCBxdWVzdGlvbi4uLl0KCmMuCVN0YXJ0aW5nIGF0IHRoZSBkb3duc3RyZWFtIGVuZCBvZiB0aGUgKmxpdGhpdW0gbGVucyosIHRoZSBgRzRiZWFtbGluZWAgY29kZSAoYEhXMV9HNF9NMk0zLmc0YmxgKSB0cmFja3MgYSBkaXN0cmlidXRpb24gb2YgMzAwMCBwaW9ucyAocGFyYW0gbnBhcnRpY2xlcyA9IDMwMDApIHdpdGggYSBtb21lbnR1bSBvZiAzLjEgR2VWLyRjJC4gUnVubmluZyB0aGUgY29kZSBzaG91bGQgdGFrZSBhYm91dCAxMCBtaW51dGVzIG9yIGxlc3MsIGRlcGVuZGluZyBvbiB0aGUgc3BlZWQgb2YgeW91ciBjb21wdXRlci4gVGhlIGRpc3RyaWJ1dGlvbiBhdCB0aGUgZW5kIG9mICpNMyogc2hvdWxkIGJlIGdlbmVyYXRlZCBieSB0aGUgY29kZSwgYW5kIHdyaXR0ZW4gdG8gYSB0ZXh0IGZpbGUgY2FsbGVkIEhXMV9wYXJ0aWNsZXNfRW5kTTMudHh0LiBPcGVuIHRoZSBmaWxlIGFuZCBleGFtIHdpdGggYW4gYXBwcm9wcmlhdGUgZWRpdG9yIGFuZC9vciBwcm9ncmFtIChzdWNoIGFzIGBSYCkuIEhvdyBtYW55IHBpb25zIHdpbGwgc3Vydml2ZSB0byB0aGUgZW5kIG9mIE0zPyBIb3cgZG9lcyBpdCBjb21wYXJlIHdpdGggdGhlIGV4cG9uZW50aWFsIGRlY2F5IGxhdz8gIE5vdGU6IFBER2lkIGZvciBwaW9ucyBpcyAyMTEgYW5kIFBER2lkIGZvciBtdW9ucyBpcyAtMTMuICAKClJ1bm5pbmcgdGhlIHNpbXVsYXRpb24gcHJlZGljdHMgNTczIHBpb25zIGF0IHRoZSBlbmQgb2YgTTMuICBTdGFydGluZyB3aXRoIDMwMDAgcGlvbnMsIHRoZSBleHBvbmVudGlhbCBkZWNheSBjYWxjdWxhdGlvbiBhYm92ZSB3b3VsZCBwcmVkaWN0ICQzMDAwflx0aW1lcyQgYE5mYCAgPSBgciByb3VuZCgzMDAwKk5mKWAsIHdoaWNoIGlzIHZlcnkgY2xvc2UuCgpkLglGb3IgdGhlIGRpc3RyaWJ1dGlvbiB5b3UgaGF2ZSBjcmVhdGVkIGZvciBQYXJ0IGBjYCBhYm92ZSwgbWFrZSBhIGhpc3RvZ3JhbSBvZiB0aGUgbXVvbiBhbmQgcGlvbiBtb21lbnR1bSBkaXN0cmlidXRpb25zLiBXaGF0IGRvIHlvdSBvYnNlcnZlPyAgCgpJbiBhZGRpdGlvbiB0byBwaW9ucyB3ZSBoYXZlICRcYXBwcm94IDEwMCQgbXVvbnMuIFRoZSBwaW9uIGFuZCBtdW9uIG1vbWVudHVtIGhpc3RvZ3JhbXMgYXJlIGNyZWF0ZWQgYW5kIHNob3duIGJlbG93OiAKCmBgYHtyfQpsaWJyYXJ5KGRhdGEudGFibGUpCmRmID0gZnJlYWQoIkhXMV9wYXJ0aWNsZXNfRW5kTTMudHh0Iixza2lwID0gMikKaGVhZChkZikKY29sbmFtZXMoZGZbLDhdKSA9ICJQMCIKZGZwaSA9IGRmW1Y4ID09IDIxMV0KZGZtdSA9IGRmW1Y4ID09IC0xM10KbnJvdyhkZnBpKSAgIyBudW1iZXIgb2YgcGlvbnMKbnJvdyhkZm11KSAgIyBudW1iZXIgb2YgbXVvbnMKcGFyKG1mcm93PWMoMSwyKSkKaGlzdChkZnBpJFY2LGJyZWFrcz01MCxtYWluPSJwaW9uIGRpc3RyaWJ1dGlvbiIseGxhYj0icGlvbiBlbmVyZ3kgW01lVl0iKQpoaXN0KGRmbXUkVjYsYnJlYWtzPTUwLG1haW49Im11b24gZGlzdHJpYnV0aW9uIix4bGFiPSJtdW9uIGVuZXJneSBbTWVWXSIpCmBgYAoKCioqQmVhbSBEZWJ1bmNoaW5nKioKClByb3RvbnMgdHJhbnNwb3J0ZWQgdG8gdGhlIEZlcm1pbGFiIEJvb3N0ZXIgcmluZyBhcmUgZmlyc3QgYWNjZWxlcmF0ZWQgdGhyb3VnaCBhIGxpbmVhciBhY2NlbGVyYXRvci4gIFRoZSBwYXJ0aWNsZXMgbGVhdmluZyB0aGlzICJsaW5hYyIgYXJlIGFycmFuZ2VkIGluICpidW5jaGVzKiBzcGFjZWQgYHIgcm91bmQoMS8yMDBlNioxZTksMSlgIG5zIGFwYXJ0LCB3aGVyZSBlYWNoIGJ1bmNoIGhhcyBhbiBhdmVyYWdlIGtpbmV0aWMgZW5lcmd5IG9mIDQwMCBNZVYsIGEgcmVsYXRpdmUgbW9tZW50dW0gc3ByZWFkIG9mIDAuMyUgYW5kIGEgdGltZSBzcHJlYWQgb2YgMC41IG5zIChybXMgdmFsdWVzIGZvciBlYWNoOyBhc3N1bWUgR2F1c3NpYW4gZGlzdHJpYnV0aW9ucykuICBBZnRlciBsZWF2aW5nIHRoZSBsaW5hYywgdGhlIHBhcnRpY2xlcyB0cmF2ZWwgYXBwcm94aW1hdGVseSAxMDAgbSBhbmQgdGhlbiBnbyB0aHJvdWdoIGEgY2F2aXR5LiAgVGhlIGNhdml0eSBpcyBvcGVyYXRpbmcgc2ludXNvaWRhbGx5IHdpdGggYSAyMDAgTUh6IGZyZXF1ZW5jeSBhbmQgY2FuIGJlIHVzZWQgdG8gbG93ZXIgdGhlIG92ZXJhbGwgbW9tZW50dW0gc3ByZWFkIG9mIHRoZSBiZWFtLiAgVGhlIGNhdml0eSBpcyBsb2NhdGVkIGFwcHJveGltYXRlbHkgMTAwIG0gYmVmb3JlIHRoZSBCb29zdGVyIGluamVjdGlvbiBwb2ludC4KCmEuIFdyaXRlIGEgc2hvcnQgY29kZSB0aGF0IHRyYW5zcG9ydHMgc2V2ZXJhbCB0aG91c2FuZCBwYXJ0aWNsZXMgd2l0aGluIG9uZSBidW5jaCwgd2l0aCB0aGUgaW5pdGlhbCBjb25kaXRpb25zIGdpdmVuIGFib3ZlLCB0aHJvdWdoIDEwMCBtIG9mIGRyaWZ0LCB0aGVuIHRocm91Z2ggdGhlIGNhdml0eSwgdGhlbiAxMDAgbSBmdXJ0aGVyLiAgUGxvdCB0aGUgbG9uZ2l0dWRpbmFsIHBoYXNlIHNwYWNlIGRpc3RyaWJ1dGlvbiAoJFxEZWx0YSBwL3AkICp2cy4qICRcRGVsdGEgdCQpIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgdHJhbnNwb3J0IHN5c3RlbSwgYXMgd2VsbCBhcyBqdXN0IGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGNhdml0eS4gIFRyZWF0IHRoZSBjYXZpdHkgYXMgYSAidGhpbiIgZGV2aWNlIGZvciBvdXIgcHVycG9zZXMsIGJ1dCByZXRhaW4gaXRzIHNpbnVzb2lkYWwgdGltZSBzdHJ1Y3R1cmUuCgpiLiBXaGF0IG92ZXJhbGwgZWZmZWN0aXZlIHZvbHRhZ2UgaXMgcmVxdWlyZWQgb2YgdGhlIGNhdml0eSB0byBtaW5pbWl6ZSB0aGUgbW9tZW50dW0gc3ByZWFkIG9mIHRoZSBiZWFtPyAgV2hhdCBtaW5pbXVtIHZhbHVlIGRvIHlvdSBhcnJpdmUgYXQ/CgpgYGB7ciwgZXZhbD1UUlVFLGVjaG89VFJVRX0KTnAgICAgPSAxMDAwMApWZWZmICA9IDIuNWU2CmdhbW1hID0gKDkzOCs0MDApLzkzOApiZXRhICA9IHNxcnQoMS0xL2dhbW1hXjIpCmR0MCAgID0gcm5vcm0oTnAsMCwwLjA1KSAgICAjIG5zCmRlbCAgID0gcm5vcm0oTnAsMCwwLjAwMikgICMgZHAvcApwYXIobWZyb3c9YygyLDIpKQpwbG90KGR0MCxkZWwqMTAwLHhsaW09YygtMywzKSx5bGltPWMoLTEsMSkqMS4yLHBjaD0iLiIsCiAgIHhsYWI9ImR0IFtuc10iLHlsYWI9ImRwL3AgWyVdIixtYWluPSJleGl0IG9mIGxpbmFjIikKdGV4dCgxLjcsMC44LHBhc3RlKCJkcC9wIHJtcyA9ICIscm91bmQoc2QoZGVsKSoxMDAsMiksIiAlIiApKQoKZHQxICAgPSBkdDAgLSgxMDAvMi45OTc5ZTgqMWU5KS9iZXRhL2dhbW1hXjIqZGVsCnBsb3QoZHQxLGRlbCoxMDAseGxpbT1jKC0zLDMpLHlsaW09YygtMSwxKSoxLjIscGNoPSIuIiwKICAgeGxhYj0iZHQgW25zXSIseWxhYj0iZHAvcCBbJV0iLG1haW49ImVudHJhbmNlIHRvIGNhdml0eSIpCmN1cnZlKHNpbigyKnBpKjIwMGU2KngvMWU5KSxhZGQ9VFJVRSxjb2w9ImJsdWUiLGx0eT0yKQoKZGVsMiAgPSBkZWwgKyBzaW4oMipwaSoyMDBlNipkdDEvMWU5KSpWZWZmLzQwMGU2KmdhbW1hLygxK2dhbW1hKQpwbG90KGR0MSxkZWwyKjEwMCx4bGltPWMoLTMsMykseWxpbT1jKC0xLDEpKjEuMixwY2g9Ii4iLAogICB4bGFiPSJkdCBbbnNdIix5bGFiPSJkcC9wIFslXSIsbWFpbj0iZXhpdCBvZiBjYXZpdHkiKQp0ZXh0KDEsMC44LHBhc3RlKCJWZWZmID0iLCByb3VuZChWZWZmLzFlNiwyKSwiTVZcbiIsInJtcyA9ICIscm91bmQoc2QoZGVsMikqMTAwLDMpLCIgJSIgKSkKCmR0MiAgID0gZHQxIC0oMTAwLzIuOTk3OWU4KjFlOSkvYmV0YS9nYW1tYV4yKmRlbDIKcGxvdChkdDIsZGVsMioxMDAseGxpbT1jKC0zLDMpLHlsaW09YygtMSwxKSoxLjIscGNoPSIuIiwKICAgeGxhYj0iZHQgW25zXSIseWxhYj0iZHAvcCBbJV0iLG1haW49ImVudHJhbmNlIHRvIEJvb3N0ZXIiKQp0ZXh0KDEsMC44LHBhc3RlKCJWZWZmID0iLCByb3VuZChWZWZmLzFlNiwyKSwiTVZcbiIsInJtcyA9ICIscm91bmQoc2QoZGVsMikqMTAwLDMpLCIgJSIgKSkKYGBgCgoKKipBZGlhYmF0aWMgUmFtcGluZyoqCgpTeW5jaHJvdHJvbiBtb3Rpb24gaW4gdGhlIGxvbmdpdHVkaW5hbCBkZWdyZWUgb2YgZnJlZWRvbSBjYW4gYmUgY2hhcmFjdGVyaXplZCBieSB0aGUgZm9sbG93aW5nIHNldCBvZiBkaWZmZXJlbmNlIGVxdWF0aW9uczoKCmBgYHtyfQpTeW5jaFRyayA9IGZ1bmN0aW9uKFUpewogICBVWzJdID0gVVsyXSArIGsqc2luKCAyKnBpKihVWzFdLXVzKSApCiAgIFVbMV0gPSBVWzFdIC0gZypVWzJdCiAgIHJldHVybihVKQp9CmBgYAoKd2hlcmUgYHVgIGFuZCBgdmAgYXJlICJlbmVyZ3kiIGFuZCAicGhhc2UiIHZhcmlhYmxlcywgYW5kIGBrYCBhbmQgYGdgIGFyZSBjb25zdGFudHMgZGV0ZXJtaW5lZCBieSB0aGUgYWNjZWxlcmF0aW5nIHZvbHRhZ2UgYW5kIHRpbWUgb2YgZmxpZ2h0IGJldHdlZW4gYWNjZWxlcmF0aW5nIHN0YXRpb25zLiAgVGhlICpzeW5jaHJvbm91cyogcGhhc2UgaXMgZ2l2ZW4gYnkgdGhlIHBhcmFtZXRlciBgdXNgLiAgVGhlIGFib3ZlIGZ1bmN0aW9uIGBTeW5jaFRya2Agd2lsbCBoZW5jZSB0cmFjayB0aGUgYHVgLWB2YCB2YXJpYWJsZXMgdGhyb3VnaCBvbmUgdHVybiBhYm91dCBhIHN5bmNocm90cm9uIG9yLCBzYXksIGJldHdlZW4gdHdvIHN1Y2Nlc3NpdmUgY2F2aXRpZXMgaW4gYSBsaW5hYy4gIAoKYGBge3IsIGV2YWw9VFJVRSwgZWNobz1UUlVFfQpnICA9IDAuMDIKayAgPSAwLjAwNQp1cyA9IDAKCnUgPSAwLjAxCnYgPSAwCmBgYAoKYS4gQ3JlYXRlIGEgc21hbGwgY29kZSBjaHVuayB0aGF0IHVzZXMgdGhlIGFib3ZlIGZ1bmN0aW9uIHRvIHRyYWNrIGEgc2luZ2xlIHBhcnRpY2xlIHRocm91Z2ggYG50dXJuYCBpdGVyYXRpb25zLiAgRnJvbSB5b3VyIGNvZGUsIGRldGVybWluZSB0aGUgYXBwcm94aW1hdGUgcGVyaW9kIG9mIGEgc3luY2hyb3Ryb24gb3NjaWxsYXRpb24gZm9yIHZhbHVlcyBvZiBga2AgPSBgciBrYCwgYGdgID0gYHIgZ2AgYW5kIGB1c2AgPSBgciB1c2AuICBbQSBnb29kIGluaXRpYWwgY29uZGl0aW9uIGZvciB5b3VyIHBhcnRpY2xlIGlzIChgdWAsYHZgKSA9IChgciB1YCwgYHIgdmApLl0KClRpcDogIEluIGBSYCwgZW1wbG95IHRoZSBmb2xsb3dpbmcgcGxvdCBhdHRyaWJ1dGVzIHRvIG1ha2UgY29uc2lzdGVudCBsb29raW5nIHBsb3RzOgoKYGBgCiMgcHJpb3IgdG8gdGhlIGxvb3A6CnBsb3QoVVsxXSxVWzJdLHhsaW09YygtMSwxKSowLjE1LHlsaW09YygtMSwxKSowLjA1LGFzcD0xLHR5cD0ibiIpCiMgICAgIGFzcCBpcyB0aGUgImFzcGVjdCByYXRpbyI7IHR5cD0ibiIgbWVhbnMgZG8gbm90IHBsb3QgYW55dGhpbmcgeWV0CgojLi4uIHdpdGhpbiB0aGUgbG9vcDoKICAgcG9pbnRzKFVbMV0sVVsyXSxwY2g9Ii4iKSAgICAjIGFkZHMgcG9pbnRzIHRvIHRoZSBwcmV2aW91cyBwbG90CiMuLi4KYGBgCgpgYGB7ciwgZXZhbD1UUlVFLCBlY2hvPVRSVUV9Cm50dXJuID0gIDUwMDAKVSA9IGModSx2KQpwbG90KHUsdix4bGltPWMoLTEsMSkqMC4xNSx5bGltPWMoLTEsMSkqMC4wNSxhc3A9MSx0eXA9Im4iKQoKaSA9IDAKd2hpbGUoaTwyNTApeyAgIyB0aGUgcGhhc2Ugc3BhY2UgdHJhamVjdG9yeSBhcHBlYXJzIHRvICJjbG9zZSIgYWZ0ZXIgYWJvdXQgMjUwIHR1cm5zCiAgIGkgPSBpKzEKICAgVSA9IFN5bmNoVHJrKFUpCiAgIHBvaW50cyhVWzFdLFVbMl0scGNoPSIuIikKfQpgYGAKCmIuIE5leHQsIHdlIHdpc2ggdG8gYWRqdXN0IHRoZSBzeW5jaHJvbm91cyBwaGFzZSBmcm9tIGFuIGluaXRpYWwgdmFsdWUgb2YgYHVzMGAgPSAwICh6ZXJvIGRlZ3JlZXMpIHRvIGEgdmFsdWUgb2YgYHVzbWF4YCA9ICRccGkvNiQgKDMwIGRlZ3JlZXMpLiAgSW4gb3JkZXIgdG8gZXhwbG9yZSB2YXJpb3VzICJyYW1wIHJhdGVzIiBvZiB0aGlzIHBoYXNlLCBjcmVhdGUgYSBmdW5jdGlvbiBgdXNSKG4pYCB0aGF0ICAKICAgaS4gbWFpbnRhaW5zIGB1c1JgID0gYHVzMGAgdW50aWwgYG5gID0gYG9uYCwgIAogICBpaS4gdmFyaWVzIGB1c1JgIGxpbmVhcmx5IGZyb20gYHVzMGAgdG8gYHVzbWF4YCBiZXR3ZWVuIHR1cm5zIGBuYCA9IGBvbmAgYW5kIGBuYCA9IGBvZmZgLCAgCiAgIGlpaS4gbWFpbnRhaW5zIGB1c1JgID0gYHVzbWF4YCBmb3IgYG5gID4gYG9mZmAuICAKTWFrZSBhIHBsb3Qgb2YgeW91ciBmdW5jdGlvbiBvdmVyIHRoZSByYW5nZSAwIDwgYG5gIDwgNDAwIHR1cm5zIHVzaW5nIHZhbHVlcyBvZiBgb25gID0gMTAwLCBgb2ZmYCA9IDMwMC4KCmBgYHtyLCBldmFsPVRSVUUsIGVjaG89VFJVRX0Kb24gICAgPSAgIDEwMApvZmYgICA9ICAgMzAwCnVzMCAgID0gICAgIDAKdXNtYXggPSAgIDEvMTIKCnVzUiA9IGZ1bmN0aW9uKHgpewogICBpZmVsc2UoeDxvbix1czAsaWZlbHNlKHg+PW9mZix1c21heCwKICAgICAgKHVzbWF4LXVzMCkvKG9mZi1vbikqKHgtb24pICkpCn0KY3VydmUodXNSLDAsNDAwKQpgYGAKCmMuICBNb2RpZnkgeW91ciB0cmFja2luZyBjb2RlIHRvIGVtcGxveSB5b3VyIHBoYXNlIHJhbXAgZnVuY3Rpb24gaW4gdGhlIGNhbGN1bGF0aW9uLiAgTWFrZSBhbiBpbnRpYWwgdGVzdCBieSBzZXR0aW5nIGB1c21heGAgPSAwIGFuZCBgb25gID0gMSwgYG9mZmAgPSAyIHRoZW4gcmUtdHJhY2tpbmcgZm9yIGEgc3VmZmljaWVudCBudW1iZXIgb2YgdHVybnMgdG8gbWFrZSBzdXJlIHlvdSBnZXQgdGhlIHNhbWUgcmVzdWx0IGFzIHByZXZpb3VzbHkuCgpgYGB7ciwgZXZhbD1UUlVFLCBlY2hvPVRSVUV9Cm50dXJuID0gIDQwMApVID0gYyh1LHYpCnBsb3QodSx2LHhsaW09YygtMSwxKSowLjE1LHlsaW09YygtMSwxKSowLjA1LGFzcD0xLHR5cD0ibiIpCgppID0gMAp1c21heCA9IDAKb24gPSAxCm9mZiA9IDIKd2hpbGUoaTxudHVybil7ICAjIHRoZSBwaGFzZSBzcGFjZSB0cmFqZWN0b3J5IGFwcGVhcnMgdG8gImNsb3NlIiBhZnRlciBhYm91dCAyNTAgdHVybnMKICAgaSA9IGkrMQogICB1cyA9IHVzUihpKQogICBVID0gU3luY2hUcmsoVSkKICAgcG9pbnRzKFVbMV0sVVsyXSxwY2g9Ii4iKQp9CmBgYAoKYGBge3IsIGV2YWw9VFJVRSwgZWNobz1UUlVFfQpudHVybiA9ICA4MDAwCnVzMCAgID0gICAgIDAKdXNtYXggPSAgIDEvMTIKb24gICAgPSAgIDI1MApvZmZKICA9IGMoMzUwLCA0MDAsIDYwMCwgMjAwMCwgMzAwMCwgNjAwMCkKYGBgCgpkLiBGaW5hbGx5LCBzZXQgYHVzbWF4YCA9IGByIHVzbWF4YCwgYG9uYCA9IGByIG9uYCBhbmQgbWFrZSBwaGFzZSBzcGFjZSBwbG90cyBmb3IgdmFyaW91cyAicmFtcCBvZmYiIHRpbWVzOiAgYG9mZmAgPSBgciBvZmZKYC4gIEZvciBjb25zaXN0ZW5jeSwgdXNlIGBudHVybmAgPSBgciBudHVybmAgZm9yIGVhY2ggY2FzZS4gIENvbW1lbnQgb24gdGhlIHJlc3VsdHMuCgpgYGB7ciwgZXZhbD1UUlVFLCBlY2hvPVRSVUV9CnBhcihtZnJvdz1jKDIsMykpCmogPSAwCndoaWxlKGo8Nil7CiAgIGogPSBqKzEKICAgb2ZmID0gb2ZmSltqXQogICBVID0gYyh1LHYpCiAgIHBsb3QodSx2LHhsaW09YygtMSwxKSowLjE1LHlsaW09YygtMSwxKSowLjA1LGFzcD0xLAogICAgICB0eXA9Im4iLG1haW49cGFzdGUoIm9mZiA9Iiwgb2ZmKSkKICAgaSA9IDAKICAgd2hpbGUoaTxudHVybil7CiAgICAgIGkgPSBpKzEKICAgICAgdXMgPSB1c1IoaSkKICAgICAgVSA9IFN5bmNoVHJrKFUpCiAgICAgIHBvaW50cyhVWzFdLFVbMl0scGNoPSIuIiwgICAjIGFkZCBjb2xvcnMgdG8gZW52aXNpb24gdGltZXMgZHVyaW5nIHJhbXBpbmcKICAgICAgICAgY29sPWlmZWxzZShpPG9uLCJncmVlbiIsaWZlbHNlKGk+b2ZmLCJyZWQiLCJibGFjayIpICkpCiAgIH0KICAgYWJsaW5lKHY9YygwLHVzbWF4KSxsdHk9Myxjb2w9ImJyb3duIikKfQpgYGAKCgo=