Ktlo

Pocket Stargate

Nov 25th, 2024 (edited)
749
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 475.97 KB | Software | 0 0
  1. VERSION = 'v1.6.1'
  2. local base64 = [[local a={}local b=_G.bit32 and _G.bit32.extract;if not b then if _G.bit then local c,d,e=_G.bit.lshift,_G.bit.rshift,_G.bit.band;b=function(f,g,h)return e(d(f,g),c(1,h)-1)end elseif _G._VERSION=="Lua 5.1"then b=function(f,g,h)local i=0;local j=2^g;for k=0,h-1 do local l=j+j;if f%l>=j then i=i+2^k end;j=l end;return i end else b=load'return function( v, from, width )return ( v >> from ) & ((1 << width) - 1)end'()end end;function a.makeencoder(m,n,o)local p={}for q,r in pairs{[0]='A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9',m or'+',n or'/',o or'='}do p[q]=r:byte()end;return p end;function a.makedecoder(m,n,o)local s={}for q,t in pairs(a.makeencoder(m,n,o))do s[t]=q end;return s end;local u=a.makeencoder()local v=a.makedecoder()local r,w=string.char,table.concat;function a.encode(x,p,y)p=p or u;local z,A,B={},1,#x;local C=B%3;local D={}for k=1,B-C,3 do local E,F,G=x:byte(k,k+2)local f=E*0x10000+F*0x100+G;local H;if y then H=D[f]if not H then H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])D[f]=H end else H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])end;z[A]=H;A=A+1 end;if C==2 then local E,F=x:byte(B-1,B)local f=E*0x10000+F*0x100;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[64])elseif C==1 then local f=x:byte(B)*0x10000;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[64],p[64])end;return w(z)end;function a.decode(I,s,y)s=s or v;local J='[^%w%+%/%=]'if s then local m,n;for t,q in pairs(s)do if q==62 then m=t elseif q==63 then n=t end end;J=('[^%%w%%%s%%%s%%=]'):format(r(m),r(n))end;I=I:gsub(J,'')local D=y and{}local z,A={},1;local B=#I;local K=I:sub(-2)=='=='and 2 or I:sub(-1)=='='and 1 or 0;for k=1,K>0 and B-4 or B,4 do local E,F,G,L=I:byte(k,k+3)local H;if y then local M=E*0x1000000+F*0x10000+G*0x100+L;H=D[M]if not H then local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))D[M]=H end else local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))end;z[A]=H;A=A+1 end;if K==1 then local E,F,G=I:byte(B-3,B-1)local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40;z[A]=r(b(f,16,8),b(f,8,8))elseif K==2 then local E,F=I:byte(B-3,B-2)local f=s[E]*0x40000+s[F]*0x1000;z[A]=r(b(f,16,8))end;return w(z)end;return a
  3. ]]
  4. base64 = load(base64, "@[included]/base64.lua", 't', _ENV)()
  5.  
  6. function saveExtra(resource, filename)
  7.     filename = filename or resource
  8.     local file = assert(io.open(filename, 'w'))
  9.     file:write(EXTRAS[resource])
  10.     file:close()
  11. end
  12. function saveProgram(filename)
  13.     filename = filename or "psg.lua"
  14.     local file = assert(io.open(filename, 'w'))
  15.     file:write(PROGRAM)
  16.     file:close()
  17. end
  18. function typeY()
  19.     write("Do you want to continue? (Type Y for continue): ")
  20.     local read = read(nil, nil, nil, "N")
  21.     if read ~= 'Y' then
  22.         print("Exiting...")
  23.         error("Terminated", 0)
  24.     end
  25. end
  26. EXTRAS = {
  27.     ["addresses.conf"] = base64.decode "ewogIGlkZW50aXR5ID0gewogICAgewogICAgICBuYW1lID0gIkRlc3RpbnkiLAogICAgICBhZGRyZXNzID0gIi01LTE2LTIwLTMwLTM0LTIzLTQtMTAtIiwKICAgIH0sCiAgfSwKICBwb3NpdGlvbiA9IHsKICAgIHsKICAgICAgaW50ZXJzdGVsbGFyID0gewogICAgICAgIFsgInNnam91cm5leTptaWxreV93YXkiIF0gPSAiLTI3LTI1LTQtMzUtMTAtMjgtIiwKICAgICAgfSwKICAgICAgZXh0cmFnYWxhY3RpYyA9ICItMS0zNS00LTMxLTE1LTMwLTMyLSIsCiAgICAgIG5hbWUgPSAiT3ZlcndvcmxkIiwKICAgICAga2V5ID0gInNnam91cm5leTp0ZXJyYSIsCiAgICB9LAogICAgewogICAgICBpbnRlcnN0ZWxsYXIgPSB7CiAgICAgICAgWyAic2dqb3VybmV5Om1pbGt5X3dheSIgXSA9ICItMjYtNi0xNC0zMS0xMS0yOS0iLAogICAgICB9LAogICAgICBuYW1lID0gIkFieWRvcyIsCiAgICAgIGtleSA9ICJzZ2pvdXJuZXk6YWJ5ZG9zIiwKICAgIH0sCiAgICB7CiAgICAgIGludGVyc3RlbGxhciA9IHsKICAgICAgICBbICJzZ2pvdXJuZXk6bWlsa3lfd2F5IiBdID0gIi0yNy0yMy00LTM0LTEyLTI4LSIsCiAgICAgIH0sCiAgICAgIG5hbWUgPSAiTmV0aGVyIiwKICAgICAga2V5ID0gInNnam91cm5leTpuZXRoZXIiLAogICAgfSwKICAgIHsKICAgICAgaW50ZXJzdGVsbGFyID0gewogICAgICAgIFsgInNnam91cm5leTpwZWdhc3VzIiBdID0gIi0xNC0zMC02LTEzLTE3LTIzLSIsCiAgICAgICAgWyAic2dqb3VybmV5Om1pbGt5X3dheSIgXSA9ICItMTMtMjQtMi0xOS0zLTMwLSIsCiAgICAgIH0sCiAgICAgIG5hbWUgPSAiRW5kIiwKICAgICAga2V5ID0gInNnam91cm5leTplbmQiLAogICAgfSwKICAgIHsKICAgICAgaW50ZXJzdGVsbGFyID0gewogICAgICAgIFsgInNnam91cm5leTptaWxreV93YXkiIF0gPSAiLTgtMS0yMi0xNC0zNi0xOS0iLAogICAgICB9LAogICAgICBuYW1lID0gIkNodWxhayIsCiAgICAgIGtleSA9ICJzZ2pvdXJuZXk6Y2h1bGFrIiwKICAgIH0sCiAgICB7CiAgICAgIGludGVyc3RlbGxhciA9IHsKICAgICAgICBbICJzZ2pvdXJuZXk6bWlsa3lfd2F5IiBdID0gIi0xLTItMy00LTUtNi0iLAogICAgICB9LAogICAgICBuYW1lID0gIkV4YW1wbGUiLAogICAgICBrZXkgPSAiZXhhbXBsZSIsCiAgICB9LAogICAgewogICAgICBpbnRlcnN0ZWxsYXIgPSB7CiAgICAgICAgWyAic2dqb3VybmV5Om1pbGt5X3dheSIgXSA9ICItMTgtNy0zLTM2LTI1LTE1LSIsCiAgICAgIH0sCiAgICAgIG5hbWUgPSAiQ2F2dW0gVGVuZWJyYWUiLAogICAgICBrZXkgPSAic2dqb3VybmV5OmNhdnVtX3RlbmVicmFlIiwKICAgIH0sCiAgICB7CiAgICAgIGludGVyc3RlbGxhciA9IHsKICAgICAgICBbICJzZ2pvdXJuZXk6bWlsa3lfd2F5IiBdID0gIi0yLTI3LTgtMzQtMjQtMTUtIiwKICAgICAgfSwKICAgICAgbmFtZSA9ICJVbml0YXMiLAogICAgICBrZXkgPSAic2dqb3VybmV5OnVuaXRhcyIsCiAgICB9LAogICAgewogICAgICBpbnRlcnN0ZWxsYXIgPSB7CiAgICAgICAgWyAic2dqb3VybmV5Om1pbGt5X3dheSIgXSA9ICItMzMtMjAtMTAtMjItMy0xNy0iLAogICAgICB9LAogICAgICBuYW1lID0gIlJpbWEiLAogICAgICBrZXkgPSAic2dqb3VybmV5OnJpbWEiLAogICAgfSwKICAgIHsKICAgICAgaW50ZXJzdGVsbGFyID0gewogICAgICAgIFsgInNnam91cm5leTpwZWdhc3VzIiBdID0gIi0yOS01LTE3LTM0LTYtMTItIiwKICAgICAgfSwKICAgICAgZXh0cmFnYWxhY3RpYyA9ICItMTgtMjAtMS0xNS0xNC03LTE5LSIsCiAgICAgIG5hbWUgPSAiTGFudGVhIiwKICAgICAga2V5ID0gInNnam91cm5leTpsYW50ZWEiLAogICAgfSwKICAgIHsKICAgICAgaW50ZXJzdGVsbGFyID0gewogICAgICAgIFsgInNnam91cm5leTpwZWdhc3VzIiBdID0gIi0yMS0xNC0yNC0xLTI2LTI4LSIsCiAgICAgIH0sCiAgICAgIG5hbWUgPSAiQXRob3MiLAogICAgICBrZXkgPSAic2dqb3VybmV5OmF0aG9zIiwKICAgIH0sCiAgICB7CiAgICAgIGludGVyc3RlbGxhciA9IHsKICAgICAgICBbICJzZ2pvdXJuZXk6bWlsa3lfd2F5IiBdID0gIi0yNi0yMC00LTM2LTktMjctIiwKICAgICAgfSwKICAgICAgbmFtZSA9ICJHbGFjaW8iLAogICAgICBrZXkgPSAic2dqb3VybmV5OnByb3hpbWFfY2VudGF1cmkiLAogICAgfSwKICB9LAp9Cg==";
  28. }
  29. PROGRAM = ([[VERSION = 'v1.6.1'
  30. local base64 = <$<local a={}local b=_G.bit32 and _G.bit32.extract;if not b then if _G.bit then local c,d,e=_G.bit.lshift,_G.bit.rshift,_G.bit.band;b=function(f,g,h)return e(d(f,g),c(1,h)-1)end elseif _G._VERSION=="Lua 5.1"then b=function(f,g,h)local i=0;local j=2^g;for k=0,h-1 do local l=j+j;if f%l>=j then i=i+2^k end;j=l end;return i end else b=load'return function( v, from, width )return ( v >> from ) & ((1 << width) - 1)end'()end end;function a.makeencoder(m,n,o)local p={}for q,r in pairs{[0]='A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9',m or'+',n or'/',o or'='}do p[q]=r:byte()end;return p end;function a.makedecoder(m,n,o)local s={}for q,t in pairs(a.makeencoder(m,n,o))do s[t]=q end;return s end;local u=a.makeencoder()local v=a.makedecoder()local r,w=string.char,table.concat;function a.encode(x,p,y)p=p or u;local z,A,B={},1,#x;local C=B%3;local D={}for k=1,B-C,3 do local E,F,G=x:byte(k,k+2)local f=E*0x10000+F*0x100+G;local H;if y then H=D[f]if not H then H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])D[f]=H end else H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])end;z[A]=H;A=A+1 end;if C==2 then local E,F=x:byte(B-1,B)local f=E*0x10000+F*0x100;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[64])elseif C==1 then local f=x:byte(B)*0x10000;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[64],p[64])end;return w(z)end;function a.decode(I,s,y)s=s or v;local J='[^%w%+%/%=]'if s then local m,n;for t,q in pairs(s)do if q==62 then m=t elseif q==63 then n=t end end;J=('[^%%w%%%s%%%s%%=]'):format(r(m),r(n))end;I=I:gsub(J,'')local D=y and{}local z,A={},1;local B=#I;local K=I:sub(-2)=='=='and 2 or I:sub(-1)=='='and 1 or 0;for k=1,K>0 and B-4 or B,4 do local E,F,G,L=I:byte(k,k+3)local H;if y then local M=E*0x1000000+F*0x10000+G*0x100+L;H=D[M]if not H then local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))D[M]=H end else local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))end;z[A]=H;A=A+1 end;if K==1 then local E,F,G=I:byte(B-3,B-1)local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40;z[A]=r(b(f,16,8),b(f,8,8))elseif K==2 then local E,F=I:byte(B-3,B-2)local f=s[E]*0x40000+s[F]*0x1000;z[A]=r(b(f,16,8))end;return w(z)end;return a
  31. >$>
  32. base64 = load(base64, "@[included]/base64.lua", 't', _ENV)()
  33. local modules = {
  34.     ["ccryptolib.chacha20"] = base64.decode "Cgpsb2NhbCBleHBlY3QgID0gcmVxdWlyZSAiY2MuZXhwZWN0Ii5leHBlY3QKbG9jYWwgbGFzc2VydCA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwudXRpbCIubGFzc2VydApsb2NhbCBwYWNraW5nID0gcmVxdWlyZSAiY2NyeXB0b2xpYi5pbnRlcm5hbC5wYWNraW5nIgoKbG9jYWwgYnhvciA9IGJpdDMyLmJ4b3IKbG9jYWwgcm9sID0gYml0MzIubHJvdGF0ZQpsb2NhbCB1OHg0LCBmbXQ4eDQgPSBwYWNraW5nLmNvbXBpbGVVbnBhY2soIjxJNEk0STRJNEk0STRJNEk0IikKbG9jYWwgdTN4NCwgZm10M3g0ID0gcGFja2luZy5jb21waWxlVW5wYWNrKCI8STRJNEk0IikKbG9jYWwgcDE2eDQsIGZtdDE2eDQgPSBwYWNraW5nLmNvbXBpbGVQYWNrKCI8STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STQiKQpsb2NhbCB1MTZ4NCA9IHBhY2tpbmcuY29tcGlsZVVucGFjayhmbXQxNng0KQoKCgoKCgoKCmxvY2FsIGZ1bmN0aW9uIGNyeXB0KGtleSwgbm9uY2UsIG1lc3NhZ2UsIHJvdW5kcywgb2Zmc2V0KQogICAgZXhwZWN0KDEsIGtleSwgInN0cmluZyIpCiAgICBsYXNzZXJ0KCNrZXkgPT0gMzIsICJrZXkgbGVuZ3RoIG11c3QgYmUgMzIiLCAyKQogICAgZXhwZWN0KDIsIG5vbmNlLCAic3RyaW5nIikKICAgIGxhc3NlcnQoI25vbmNlID09IDEyLCAibm9uY2UgbGVuZ3RoIG11c3QgYmUgMTIiLCAyKQogICAgZXhwZWN0KDMsIG1lc3NhZ2UsICJzdHJpbmciKQogICAgcm91bmRzID0gZXhwZWN0KDQsIHJvdW5kcywgIm51bWJlciIsICJuaWwiKSBvciAyMAogICAgbGFzc2VydChyb3VuZHMgJSAyID09IDAsICJyb3VuZCBudW1iZXIgbXVzdCBiZSBldmVuIiwgMikKICAgIGxhc3NlcnQocm91bmRzID49IDgsICJyb3VuZCBudW1iZXIgbXVzdCBiZSBubyBzbWFsbGVyIHRoYW4gOCIsIDIpCiAgICBsYXNzZXJ0KHJvdW5kcyA8PSAyMCwgInJvdW5kIG51bWJlciBtdXN0IGJlIG5vIGxhcmdlciB0aGFuIDIwIiwgMikKICAgIG9mZnNldCA9IGV4cGVjdCg1LCBvZmZzZXQsICJudW1iZXIiLCAibmlsIikgb3IgMQogICAgbGFzc2VydChvZmZzZXQgJSAxID09IDAsICJvZmZzZXQgbXVzdCBiZSBhbiBpbnRlZ2VyIiwgMikKICAgIGxhc3NlcnQob2Zmc2V0ID49IDAsICJvZmZzZXQgbXVzdCBiZSBub25uZWdhdGl2ZSIsIDIpCiAgICBsYXNzZXJ0KCNtZXNzYWdlICsgNjQgKiBvZmZzZXQgPD0gMiBeIDM4LCAib2Zmc2V0IHRvbyBsYXJnZSIsIDIpCgogICAgCiAgICBsb2NhbCBpMCwgaTEsIGkyLCBpMyA9IDB4NjE3MDc4NjUsIDB4MzMyMDY0NmUsIDB4Nzk2MjJkMzIsIDB4NmIyMDY1NzQKICAgIGxvY2FsIGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNyA9IHU4eDQoZm10OHg0LCBrZXksIDEpCiAgICBsb2NhbCBjciwgbjAsIG4xLCBuMiA9IG9mZnNldCwgdTN4NChmbXQzeDQsIG5vbmNlLCAxKQoKICAgIAogICAgbG9jYWwgcGFkZGVkID0gbWVzc2FnZSAuLiAoIlwwIik6cmVwKC0jbWVzc2FnZSAlIDY0KQoKICAgIAogICAgbG9jYWwgb3V0ID0ge30KICAgIGxvY2FsIGlkeCA9IDEKICAgIGZvciBpID0gMSwgI3BhZGRlZCAvIDY0IGRvCiAgICAgICAgCiAgICAgICAgbG9jYWwgczAwLCBzMDEsIHMwMiwgczAzID0gaTAsIGkxLCBpMiwgaTMKICAgICAgICBsb2NhbCBzMDQsIHMwNSwgczA2LCBzMDcgPSBrMCwgazEsIGsyLCBrMwogICAgICAgIGxvY2FsIHMwOCwgczA5LCBzMTAsIHMxMSA9IGs0LCBrNSwgazYsIGs3CiAgICAgICAgbG9jYWwgczEyLCBzMTMsIHMxNCwgczE1ID0gY3IsIG4wLCBuMSwgbjIKCiAgICAgICAgCiAgICAgICAgZm9yIF8gPSAxLCByb3VuZHMsIDIgZG8KICAgICAgICAgICAgczAwID0gczAwICsgczA0IHMxMiA9IHJvbChieG9yKHMxMiwgczAwKSwgMTYpCiAgICAgICAgICAgIHMwOCA9IHMwOCArIHMxMiBzMDQgPSByb2woYnhvcihzMDQsIHMwOCksIDEyKQogICAgICAgICAgICBzMDAgPSBzMDAgKyBzMDQgczEyID0gcm9sKGJ4b3IoczEyLCBzMDApLCA4KQogICAgICAgICAgICBzMDggPSBzMDggKyBzMTIgczA0ID0gcm9sKGJ4b3IoczA0LCBzMDgpLCA3KQoKICAgICAgICAgICAgczAxID0gczAxICsgczA1IHMxMyA9IHJvbChieG9yKHMxMywgczAxKSwgMTYpCiAgICAgICAgICAgIHMwOSA9IHMwOSArIHMxMyBzMDUgPSByb2woYnhvcihzMDUsIHMwOSksIDEyKQogICAgICAgICAgICBzMDEgPSBzMDEgKyBzMDUgczEzID0gcm9sKGJ4b3IoczEzLCBzMDEpLCA4KQogICAgICAgICAgICBzMDkgPSBzMDkgKyBzMTMgczA1ID0gcm9sKGJ4b3IoczA1LCBzMDkpLCA3KQoKICAgICAgICAgICAgczAyID0gczAyICsgczA2IHMxNCA9IHJvbChieG9yKHMxNCwgczAyKSwgMTYpCiAgICAgICAgICAgIHMxMCA9IHMxMCArIHMxNCBzMDYgPSByb2woYnhvcihzMDYsIHMxMCksIDEyKQogICAgICAgICAgICBzMDIgPSBzMDIgKyBzMDYgczE0ID0gcm9sKGJ4b3IoczE0LCBzMDIpLCA4KQogICAgICAgICAgICBzMTAgPSBzMTAgKyBzMTQgczA2ID0gcm9sKGJ4b3IoczA2LCBzMTApLCA3KQoKICAgICAgICAgICAgczAzID0gczAzICsgczA3IHMxNSA9IHJvbChieG9yKHMxNSwgczAzKSwgMTYpCiAgICAgICAgICAgIHMxMSA9IHMxMSArIHMxNSBzMDcgPSByb2woYnhvcihzMDcsIHMxMSksIDEyKQogICAgICAgICAgICBzMDMgPSBzMDMgKyBzMDcgczE1ID0gcm9sKGJ4b3IoczE1LCBzMDMpLCA4KQogICAgICAgICAgICBzMTEgPSBzMTEgKyBzMTUgczA3ID0gcm9sKGJ4b3IoczA3LCBzMTEpLCA3KQoKICAgICAgICAgICAgczAwID0gczAwICsgczA1IHMxNSA9IHJvbChieG9yKHMxNSwgczAwKSwgMTYpCiAgICAgICAgICAgIHMxMCA9IHMxMCArIHMxNSBzMDUgPSByb2woYnhvcihzMDUsIHMxMCksIDEyKQogICAgICAgICAgICBzMDAgPSBzMDAgKyBzMDUgczE1ID0gcm9sKGJ4b3IoczE1LCBzMDApLCA4KQogICAgICAgICAgICBzMTAgPSBzMTAgKyBzMTUgczA1ID0gcm9sKGJ4b3IoczA1LCBzMTApLCA3KQoKICAgICAgICAgICAgczAxID0gczAxICsgczA2IHMxMiA9IHJvbChieG9yKHMxMiwgczAxKSwgMTYpCiAgICAgICAgICAgIHMxMSA9IHMxMSArIHMxMiBzMDYgPSByb2woYnhvcihzMDYsIHMxMSksIDEyKQogICAgICAgICAgICBzMDEgPSBzMDEgKyBzMDYgczEyID0gcm9sKGJ4b3IoczEyLCBzMDEpLCA4KQogICAgICAgICAgICBzMTEgPSBzMTEgKyBzMTIgczA2ID0gcm9sKGJ4b3IoczA2LCBzMTEpLCA3KQoKICAgICAgICAgICAgczAyID0gczAyICsgczA3IHMxMyA9IHJvbChieG9yKHMxMywgczAyKSwgMTYpCiAgICAgICAgICAgIHMwOCA9IHMwOCArIHMxMyBzMDcgPSByb2woYnhvcihzMDcsIHMwOCksIDEyKQogICAgICAgICAgICBzMDIgPSBzMDIgKyBzMDcgczEzID0gcm9sKGJ4b3IoczEzLCBzMDIpLCA4KQogICAgICAgICAgICBzMDggPSBzMDggKyBzMTMgczA3ID0gcm9sKGJ4b3IoczA3LCBzMDgpLCA3KQoKICAgICAgICAgICAgczAzID0gczAzICsgczA0IHMxNCA9IHJvbChieG9yKHMxNCwgczAzKSwgMTYpCiAgICAgICAgICAgIHMwOSA9IHMwOSArIHMxNCBzMDQgPSByb2woYnhvcihzMDQsIHMwOSksIDEyKQogICAgICAgICAgICBzMDMgPSBzMDMgKyBzMDQgczE0ID0gcm9sKGJ4b3IoczE0LCBzMDMpLCA4KQogICAgICAgICAgICBzMDkgPSBzMDkgKyBzMTQgczA0ID0gcm9sKGJ4b3IoczA0LCBzMDkpLCA3KQogICAgICAgIGVuZAoKICAgICAgICAKICAgICAgICBsb2NhbCBtMDAsIG0wMSwgbTAyLCBtMDMsIG0wNCwgbTA1LCBtMDYsIG0wNwogICAgICAgIGxvY2FsIG0wOCwgbTA5LCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0xNCwgbTE1CgogICAgICAgIG0wMCwgbTAxLCBtMDIsIG0wMywgbTA0LCBtMDUsIG0wNiwgbTA3LAogICAgICAgIG0wOCwgbTA5LCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0xNCwgbTE1LCBpZHggPQogICAgICAgICAgICB1MTZ4NChmbXQxNng0LCBwYWRkZWQsIGlkeCkKCiAgICAgICAgCiAgICAgICAgb3V0W2ldID0gcDE2eDQoZm10MTZ4NCwKICAgICAgICAgICAgYnhvcihtMDAsIHMwMCArIGkwKSwgYnhvcihtMDEsIHMwMSArIGkxKSwKICAgICAgICAgICAgYnhvcihtMDIsIHMwMiArIGkyKSwgYnhvcihtMDMsIHMwMyArIGkzKSwKICAgICAgICAgICAgYnhvcihtMDQsIHMwNCArIGswKSwgYnhvcihtMDUsIHMwNSArIGsxKSwKICAgICAgICAgICAgYnhvcihtMDYsIHMwNiArIGsyKSwgYnhvcihtMDcsIHMwNyArIGszKSwKICAgICAgICAgICAgYnhvcihtMDgsIHMwOCArIGs0KSwgYnhvcihtMDksIHMwOSArIGs1KSwKICAgICAgICAgICAgYnhvcihtMTAsIHMxMCArIGs2KSwgYnhvcihtMTEsIHMxMSArIGs3KSwKICAgICAgICAgICAgYnhvcihtMTIsIHMxMiArIGNyKSwgYnhvcihtMTMsIHMxMyArIG4wKSwKICAgICAgICAgICAgYnhvcihtMTQsIHMxNCArIG4xKSwgYnhvcihtMTUsIHMxNSArIG4yKQogICAgICAgICkKCiAgICAgICAgCiAgICAgICAgY3IgPSBjciArIDEKICAgIGVuZAoKICAgIHJldHVybiB0YWJsZS5jb25jYXQob3V0KTpzdWIoMSwgI21lc3NhZ2UpCmVuZAoKcmV0dXJuIHsKICAgIGNyeXB0ID0gY3J5cHQsCn0K";
  35.     ["ccryptolib.internal.mp"] = base64.decode "Cgpsb2NhbCB1bnBhY2sgPSB1bnBhY2sgb3IgdGFibGUudW5wYWNrCgoKCgoKCgoKCgoKCgoKbG9jYWwgZnVuY3Rpb24gY2FycnlXZWFrKGEpCiAgICBsb2NhbCBhMDAsIGEwMSwgYTAyLCBhMDMsIGEwNCwgYTA1LCBhMDYsIGEwNywgYTA4LCBhMDksIGExMCA9IHVucGFjayhhKQoKICAgIGxvY2FsIGgwMCA9IGEwMCArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwMSA9IGEwMSArIGgwMCAqIDIgXiAtMjQKICAgIGxvY2FsIGgwMSA9IGEwMSArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwMiA9IGEwMiArIGgwMSAqIDIgXiAtMjQKICAgIGxvY2FsIGgwMiA9IGEwMiArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwMyA9IGEwMyArIGgwMiAqIDIgXiAtMjQKICAgIGxvY2FsIGgwMyA9IGEwMyArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwNCA9IGEwNCArIGgwMyAqIDIgXiAtMjQKICAgIGxvY2FsIGgwNCA9IGEwNCArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwNSA9IGEwNSArIGgwNCAqIDIgXiAtMjQKICAgIGxvY2FsIGgwNSA9IGEwNSArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwNiA9IGEwNiArIGgwNSAqIDIgXiAtMjQKICAgIGxvY2FsIGgwNiA9IGEwNiArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwNyA9IGEwNyArIGgwNiAqIDIgXiAtMjQKICAgIGxvY2FsIGgwNyA9IGEwNyArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwOCA9IGEwOCArIGgwNyAqIDIgXiAtMjQKICAgIGxvY2FsIGgwOCA9IGEwOCArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwOSA9IGEwOSArIGgwOCAqIDIgXiAtMjQKICAgIGxvY2FsIGgwOSA9IGEwOSArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGExMCA9IGExMCArIGgwOSAqIDIgXiAtMjQKICAgIGxvY2FsIGgxMCA9IGExMCArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1CgogICAgcmV0dXJuIHsKICAgICAgICBhMDAgLSBoMDAsCiAgICAgICAgYTAxIC0gaDAxLAogICAgICAgIGEwMiAtIGgwMiwKICAgICAgICBhMDMgLSBoMDMsCiAgICAgICAgYTA0IC0gaDA0LAogICAgICAgIGEwNSAtIGgwNSwKICAgICAgICBhMDYgLSBoMDYsCiAgICAgICAgYTA3IC0gaDA3LAogICAgICAgIGEwOCAtIGgwOCwKICAgICAgICBhMDkgLSBoMDksCiAgICAgICAgYTEwIC0gaDEwLAogICAgfSwgaDEwICogMiBeIC0yNAplbmQKCgoKCgpsb2NhbCBmdW5jdGlvbiBjYXJyeShhKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAgPSB1bnBhY2soYSkKCiAgICBsb2NhbCBsMDAgPSBhMDAgJSAyIF4gMjQgYTAxID0gYTAxICsgKGEwMCAtIGwwMCkgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDEgPSBhMDEgJSAyIF4gMjQgYTAyID0gYTAyICsgKGEwMSAtIGwwMSkgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDIgPSBhMDIgJSAyIF4gMjQgYTAzID0gYTAzICsgKGEwMiAtIGwwMikgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDMgPSBhMDMgJSAyIF4gMjQgYTA0ID0gYTA0ICsgKGEwMyAtIGwwMykgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDQgPSBhMDQgJSAyIF4gMjQgYTA1ID0gYTA1ICsgKGEwNCAtIGwwNCkgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDUgPSBhMDUgJSAyIF4gMjQgYTA2ID0gYTA2ICsgKGEwNSAtIGwwNSkgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDYgPSBhMDYgJSAyIF4gMjQgYTA3ID0gYTA3ICsgKGEwNiAtIGwwNikgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDcgPSBhMDcgJSAyIF4gMjQgYTA4ID0gYTA4ICsgKGEwNyAtIGwwNykgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDggPSBhMDggJSAyIF4gMjQgYTA5ID0gYTA5ICsgKGEwOCAtIGwwOCkgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDkgPSBhMDkgJSAyIF4gMjQgYTEwID0gYTEwICsgKGEwOSAtIGwwOSkgKiAyIF4gLTI0CiAgICBsb2NhbCBsMTAgPSBhMTAgJSAyIF4gMjQKICAgIGxvY2FsIGgxMCA9IChhMTAgLSBsMTApICogMiBeIC0yNAoKICAgIHJldHVybiB7bDAwLCBsMDEsIGwwMiwgbDAzLCBsMDQsIGwwNSwgbDA2LCBsMDcsIGwwOCwgbDA5LCBsMTB9LCBoMTAKZW5kCgoKCgoKbG9jYWwgZnVuY3Rpb24gYWRkKGEsIGIpCiAgICBsb2NhbCBhMDAsIGEwMSwgYTAyLCBhMDMsIGEwNCwgYTA1LCBhMDYsIGEwNywgYTA4LCBhMDksIGExMCA9IHVucGFjayhhKQogICAgbG9jYWwgYjAwLCBiMDEsIGIwMiwgYjAzLCBiMDQsIGIwNSwgYjA2LCBiMDcsIGIwOCwgYjA5LCBiMTAgPSB1bnBhY2soYikKCiAgICByZXR1cm4gewogICAgICAgIGEwMCArIGIwMCwKICAgICAgICBhMDEgKyBiMDEsCiAgICAgICAgYTAyICsgYjAyLAogICAgICAgIGEwMyArIGIwMywKICAgICAgICBhMDQgKyBiMDQsCiAgICAgICAgYTA1ICsgYjA1LAogICAgICAgIGEwNiArIGIwNiwKICAgICAgICBhMDcgKyBiMDcsCiAgICAgICAgYTA4ICsgYjA4LAogICAgICAgIGEwOSArIGIwOSwKICAgICAgICBhMTAgKyBiMTAsCiAgICB9CmVuZAoKCgoKCmxvY2FsIGZ1bmN0aW9uIHN1YihhLCBiKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAgPSB1bnBhY2soYSkKICAgIGxvY2FsIGIwMCwgYjAxLCBiMDIsIGIwMywgYjA0LCBiMDUsIGIwNiwgYjA3LCBiMDgsIGIwOSwgYjEwID0gdW5wYWNrKGIpCgogICAgcmV0dXJuIHsKICAgICAgICBhMDAgLSBiMDAsCiAgICAgICAgYTAxIC0gYjAxLAogICAgICAgIGEwMiAtIGIwMiwKICAgICAgICBhMDMgLSBiMDMsCiAgICAgICAgYTA0IC0gYjA0LAogICAgICAgIGEwNSAtIGIwNSwKICAgICAgICBhMDYgLSBiMDYsCiAgICAgICAgYTA3IC0gYjA3LAogICAgICAgIGEwOCAtIGIwOCwKICAgICAgICBhMDkgLSBiMDksCiAgICAgICAgYTEwIC0gYjEwLAogICAgfQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gbG11bChhLCBiKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAgPSB1bnBhY2soYSkKICAgIGxvY2FsIGIwMCwgYjAxLCBiMDIsIGIwMywgYjA0LCBiMDUsIGIwNiwgYjA3LCBiMDgsIGIwOSwgYjEwID0gdW5wYWNrKGIpCgogICAgcmV0dXJuIGNhcnJ5IHsKICAgICAgICBhMDAgKiBiMDAsCiAgICAgICAgYTAxICogYjAwICsgYTAwICogYjAxLAogICAgICAgIGEwMiAqIGIwMCArIGEwMSAqIGIwMSArIGEwMCAqIGIwMiwKICAgICAgICBhMDMgKiBiMDAgKyBhMDIgKiBiMDEgKyBhMDEgKiBiMDIgKyBhMDAgKiBiMDMsCiAgICAgICAgYTA0ICogYjAwICsgYTAzICogYjAxICsgYTAyICogYjAyICsgYTAxICogYjAzICsgYTAwICogYjA0LAogICAgICAgIGEwNSAqIGIwMCArIGEwNCAqIGIwMSArIGEwMyAqIGIwMiArIGEwMiAqIGIwMyArIGEwMSAqIGIwNCArIGEwMCAqIGIwNSwKICAgICAgICBhMDYgKiBiMDAgKyBhMDUgKiBiMDEgKyBhMDQgKiBiMDIgKyBhMDMgKiBiMDMgKyBhMDIgKiBiMDQgKyBhMDEgKiBiMDUgKyBhMDAgKiBiMDYsCiAgICAgICAgYTA3ICogYjAwICsgYTA2ICogYjAxICsgYTA1ICogYjAyICsgYTA0ICogYjAzICsgYTAzICogYjA0ICsgYTAyICogYjA1ICsgYTAxICogYjA2ICsgYTAwICogYjA3LAogICAgICAgIGEwOCAqIGIwMCArIGEwNyAqIGIwMSArIGEwNiAqIGIwMiArIGEwNSAqIGIwMyArIGEwNCAqIGIwNCArIGEwMyAqIGIwNSArIGEwMiAqIGIwNiArIGEwMSAqIGIwNyArIGEwMCAqIGIwOCwKICAgICAgICBhMDkgKiBiMDAgKyBhMDggKiBiMDEgKyBhMDcgKiBiMDIgKyBhMDYgKiBiMDMgKyBhMDUgKiBiMDQgKyBhMDQgKiBiMDUgKyBhMDMgKiBiMDYgKyBhMDIgKiBiMDcgKyBhMDEgKiBiMDggKyBhMDAgKiBiMDksCiAgICAgICAgYTEwICogYjAwICsgYTA5ICogYjAxICsgYTA4ICogYjAyICsgYTA3ICogYjAzICsgYTA2ICogYjA0ICsgYTA1ICogYjA1ICsgYTA0ICogYjA2ICsgYTAzICogYjA3ICsgYTAyICogYjA4ICsgYTAxICogYjA5ICsgYTAwICogYjEwLAogICAgfQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gbXVsKGEsIGIpCiAgICBsb2NhbCBsb3csIG9mID0gbG11bChhLCBiKQoKICAgIGxvY2FsIF8sIGEwMSwgYTAyLCBhMDMsIGEwNCwgYTA1LCBhMDYsIGEwNywgYTA4LCBhMDksIGExMCA9IHVucGFjayhhKQogICAgbG9jYWwgXywgYjAxLCBiMDIsIGIwMywgYjA0LCBiMDUsIGIwNiwgYjA3LCBiMDgsIGIwOSwgYjEwID0gdW5wYWNrKGIpCgogICAgCiAgICByZXR1cm4gbG93LCAoY2FycnkgewogICAgICAgIG9mICsgYTEwICogYjAxICsgYTA5ICogYjAyICsgYTA4ICogYjAzICsgYTA3ICogYjA0ICsgYTA2ICogYjA1ICsgYTA1ICogYjA2ICsgYTA0ICogYjA3ICsgYTAzICogYjA4ICsgYTAyICogYjA5ICsgYTAxICogYjEwLAogICAgICAgIGExMCAqIGIwMiArIGEwOSAqIGIwMyArIGEwOCAqIGIwNCArIGEwNyAqIGIwNSArIGEwNiAqIGIwNiArIGEwNSAqIGIwNyArIGEwNCAqIGIwOCArIGEwMyAqIGIwOSArIGEwMiAqIGIxMCwKICAgICAgICBhMTAgKiBiMDMgKyBhMDkgKiBiMDQgKyBhMDggKiBiMDUgKyBhMDcgKiBiMDYgKyBhMDYgKiBiMDcgKyBhMDUgKiBiMDggKyBhMDQgKiBiMDkgKyBhMDMgKiBiMTAsCiAgICAgICAgYTEwICogYjA0ICsgYTA5ICogYjA1ICsgYTA4ICogYjA2ICsgYTA3ICogYjA3ICsgYTA2ICogYjA4ICsgYTA1ICogYjA5ICsgYTA0ICogYjEwLAogICAgICAgIGExMCAqIGIwNSArIGEwOSAqIGIwNiArIGEwOCAqIGIwNyArIGEwNyAqIGIwOCArIGEwNiAqIGIwOSArIGEwNSAqIGIxMCwKICAgICAgICBhMTAgKiBiMDYgKyBhMDkgKiBiMDcgKyBhMDggKiBiMDggKyBhMDcgKiBiMDkgKyBhMDYgKiBiMTAsCiAgICAgICAgYTEwICogYjA3ICsgYTA5ICogYjA4ICsgYTA4ICogYjA5ICsgYTA3ICogYjEwLAogICAgICAgIGExMCAqIGIwOCArIGEwOSAqIGIwOSArIGEwOCAqIGIxMCwKICAgICAgICBhMTAgKiBiMDkgKyBhMDkgKiBiMTAsCiAgICAgICAgYTEwICogYjEwLAogICAgICAgIDAKICAgIH0pCmVuZAoKCgoKCgoKCgpsb2NhbCBmdW5jdGlvbiBkd2FkZChhMCwgYTEsIGIwLCBiMSkKICAgIGxvY2FsIGxvdywgYyA9IGNhcnJ5KGFkZChhMCwgYjApKQogICAgbG9jYWwgaGlnaCA9IGFkZChhMSwgYjEpCiAgICBoaWdoWzFdID0gaGlnaFsxXSArIGMKICAgIHJldHVybiBsb3csIGNhcnJ5KGhpZ2gpCmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gaGFsZihhKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAgPSB1bnBhY2soYSkKCiAgICByZXR1cm4gKGNhcnJ5V2VhayB7CiAgICAgICAgYTAwICogMC41ICsgYTAxICogMiBeIDIzLAogICAgICAgIGEwMiAqIDIgXiAyMywKICAgICAgICBhMDMgKiAyIF4gMjMsCiAgICAgICAgYTA0ICogMiBeIDIzLAogICAgICAgIGEwNSAqIDIgXiAyMywKICAgICAgICBhMDYgKiAyIF4gMjMsCiAgICAgICAgYTA3ICogMiBeIDIzLAogICAgICAgIGEwOCAqIDIgXiAyMywKICAgICAgICBhMDkgKiAyIF4gMjMsCiAgICAgICAgYTEwICogMiBeIDIzLAogICAgICAgIDAsCiAgICB9KQplbmQKCgoKCmxvY2FsIGZ1bmN0aW9uIHRoaXJkKGEpCiAgICBsb2NhbCBhMDAsIGEwMSwgYTAyLCBhMDMsIGEwNCwgYTA1LCBhMDYsIGEwNywgYTA4LCBhMDksIGExMCA9IHVucGFjayhhKQoKICAgIGxvY2FsIGQwMCA9IGEwMCAqIDB4YWFhYWFhCiAgICBsb2NhbCBkMDEgPSBhMDEgKiAweGFhYWFhYSArIGQwMAogICAgbG9jYWwgZDAyID0gYTAyICogMHhhYWFhYWEgKyBkMDEKICAgIGxvY2FsIGQwMyA9IGEwMyAqIDB4YWFhYWFhICsgZDAyCiAgICBsb2NhbCBkMDQgPSBhMDQgKiAweGFhYWFhYSArIGQwMwogICAgbG9jYWwgZDA1ID0gYTA1ICogMHhhYWFhYWEgKyBkMDQKICAgIGxvY2FsIGQwNiA9IGEwNiAqIDB4YWFhYWFhICsgZDA1CiAgICBsb2NhbCBkMDcgPSBhMDcgKiAweGFhYWFhYSArIGQwNgogICAgbG9jYWwgZDA4ID0gYTA4ICogMHhhYWFhYWEgKyBkMDcKICAgIGxvY2FsIGQwOSA9IGEwOSAqIDB4YWFhYWFhICsgZDA4CiAgICBsb2NhbCBkMTAgPSBhMTAgKiAweGFhYWFhYSArIGQwOQoKICAgIAogICAgCiAgICByZXR1cm4gKGNhcnJ5V2VhayB7CiAgICAgICAgYTAwICsgZDAwLAogICAgICAgIGEwMSArIGQwMSwKICAgICAgICBhMDIgKyBkMDIsCiAgICAgICAgYTAzICsgZDAzLAogICAgICAgIGEwNCArIGQwNCwKICAgICAgICBhMDUgKyBkMDUsCiAgICAgICAgYTA2ICsgZDA2LAogICAgICAgIGEwNyArIGQwNywKICAgICAgICBhMDggKyBkMDgsCiAgICAgICAgYTA5ICsgZDA5LAogICAgICAgIGExMCArIGQxMCwKICAgIH0pCmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gbW9kMihhKQogICAgcmV0dXJuIGFbMV0gJSAyCmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gbW9kMyhhKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAgPSB1bnBhY2soYSkKICAgIHJldHVybiAoYTAwICsgYTAxICsgYTAyICsgYTAzICsgYTA0ICsgYTA1ICsgYTA2ICsgYTA3ICsgYTA4ICsgYTA5ICsgYTEwKSAlIDMKZW5kCgoKCgpsb2NhbCBmdW5jdGlvbiBhcHByb3goYSkKICAgIGxvY2FsIGEwMCwgYTAxLCBhMDIsIGEwMywgYTA0LCBhMDUsIGEwNiwgYTA3LCBhMDgsIGEwOSwgYTEwID0gdW5wYWNrKGEpCiAgICByZXR1cm4gYTAwCiAgICAgICAgICsgYTAxICogMiBeIDI0CiAgICAgICAgICsgYTAyICogMiBeIDQ4CiAgICAgICAgICsgYTAzICogMiBeIDcyCiAgICAgICAgICsgYTA0ICogMiBeIDk2CiAgICAgICAgICsgYTA1ICogMiBeIDEyMAogICAgICAgICArIGEwNiAqIDIgXiAxNDQKICAgICAgICAgKyBhMDcgKiAyIF4gMTY4CiAgICAgICAgICsgYTA4ICogMiBeIDE5MgogICAgICAgICArIGEwOSAqIDIgXiAyMTYKICAgICAgICAgKyBhMTAgKiAyIF4gMjQwCmVuZAoKCgoKCmxvY2FsIGZ1bmN0aW9uIGNtcChhLCBiKQogICAgcmV0dXJuIGFwcHJveChzdWIoYSwgYikpCmVuZAoKbG9jYWwgZnVuY3Rpb24gbnVtKGEpCiAgICByZXR1cm4ge2EsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CmVuZAoKcmV0dXJuIHsKICAgIGNhcnJ5ID0gY2FycnksCiAgICBjYXJyeVdlYWsgPSBjYXJyeVdlYWssCiAgICBhZGQgPSBhZGQsCiAgICBzdWIgPSBzdWIsCiAgICBkd2FkZCA9IGR3YWRkLAogICAgbG11bCA9IGxtdWwsCiAgICBtdWwgPSBtdWwsCiAgICBoYWxmID0gaGFsZiwKICAgIHRoaXJkID0gdGhpcmQsCiAgICBtb2QyID0gbW9kMiwKICAgIG1vZDMgPSBtb2QzLAogICAgYXBwcm94ID0gYXBwcm94LAogICAgY21wID0gY21wLAogICAgbnVtID0gbnVtLAp9Cg==";
  36.     ["ccryptolib.internal.sha512"] = base64.decode "Cgpsb2NhbCBleHBlY3QgID0gcmVxdWlyZSAiY2MuZXhwZWN0Ii5leHBlY3QKbG9jYWwgcGFja2luZyA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwucGFja2luZyIKCmxvY2FsIHNobCA9IGJpdDMyLmxzaGlmdApsb2NhbCBzaHIgPSBiaXQzMi5yc2hpZnQKbG9jYWwgYnhvciA9IGJpdDMyLmJ4b3IKbG9jYWwgYm5vdCA9IGJpdDMyLmJub3QKbG9jYWwgYmFuZCA9IGJpdDMyLmJhbmQKbG9jYWwgcDF4MTYsIGZtdDF4MTYgPSBwYWNraW5nLmNvbXBpbGVQYWNrKCI+STE2IikKbG9jYWwgcDE2eDQsIGZtdDE2eDQgPSBwYWNraW5nLmNvbXBpbGVQYWNrKCI+STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STQiKQpsb2NhbCB1MzJ4NCwgZm10MzJ4NCA9IHBhY2tpbmcuY29tcGlsZVVucGFjaygiPkk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STQiKQoKbG9jYWwgZnVuY3Rpb24gY2Fycnk2NChhMSwgYTApCiAgICBsb2NhbCByMCA9IGEwICUgMiBeIDMyCiAgICBhMSA9IGExICsgKGEwIC0gcjApIC8gMiBeIDMyCiAgICByZXR1cm4gYTEgJSAyIF4gMzIsIHIwCmVuZAoKbG9jYWwgSyA9IHsKICAgIDB4NDI4YTJmOTgsIDB4ZDcyOGFlMjIsIDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QsIDB4YjVjMGZiY2YsIDB4ZWM0ZDNiMmYsCiAgICAweGU5YjVkYmE1LCAweDgxODlkYmJjLCAweDM5NTZjMjViLCAweGYzNDhiNTM4LCAweDU5ZjExMWYxLCAweGI2MDVkMDE5LAogICAgMHg5MjNmODJhNCwgMHhhZjE5NGY5YiwgMHhhYjFjNWVkNSwgMHhkYTZkODExOCwgMHhkODA3YWE5OCwgMHhhMzAzMDI0MiwKICAgIDB4MTI4MzViMDEsIDB4NDU3MDZmYmUsIDB4MjQzMTg1YmUsIDB4NGVlNGIyOGMsIDB4NTUwYzdkYzMsIDB4ZDVmZmI0ZTIsCiAgICAweDcyYmU1ZDc0LCAweGYyN2I4OTZmLCAweDgwZGViMWZlLCAweDNiMTY5NmIxLCAweDliZGMwNmE3LCAweDI1YzcxMjM1LAogICAgMHhjMTliZjE3NCwgMHhjZjY5MjY5NCwgMHhlNDliNjljMSwgMHg5ZWYxNGFkMiwgMHhlZmJlNDc4NiwgMHgzODRmMjVlMywKICAgIDB4MGZjMTlkYzYsIDB4OGI4Y2Q1YjUsIDB4MjQwY2ExY2MsIDB4NzdhYzljNjUsIDB4MmRlOTJjNmYsIDB4NTkyYjAyNzUsCiAgICAweDRhNzQ4NGFhLCAweDZlYTZlNDgzLCAweDVjYjBhOWRjLCAweGJkNDFmYmQ0LCAweDc2Zjk4OGRhLCAweDgzMTE1M2I1LAogICAgMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiwgMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCwgMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiwKICAgIDB4YmY1OTdmYzcsIDB4YmVlZjBlZTQsIDB4YzZlMDBiZjMsIDB4M2RhODhmYzIsIDB4ZDVhNzkxNDcsIDB4OTMwYWE3MjUsCiAgICAweDA2Y2E2MzUxLCAweGUwMDM4MjZmLCAweDE0MjkyOTY3LCAweDBhMGU2ZTcwLCAweDI3YjcwYTg1LCAweDQ2ZDIyZmZjLAogICAgMHgyZTFiMjEzOCwgMHg1YzI2YzkyNiwgMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCwgMHg1MzM4MGQxMywgMHg5ZDk1YjNkZiwKICAgIDB4NjUwYTczNTQsIDB4OGJhZjYzZGUsIDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgsIDB4ODFjMmM5MmUsIDB4NDdlZGFlZTYsCiAgICAweDkyNzIyYzg1LCAweDE0ODIzNTNiLCAweGEyYmZlOGExLCAweDRjZjEwMzY0LCAweGE4MWE2NjRiLCAweGJjNDIzMDAxLAogICAgMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSwgMHhjNzZjNTFhMywgMHgwNjU0YmUzMCwgMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCwKICAgIDB4ZDY5OTA2MjQsIDB4NTU2NWE5MTAsIDB4ZjQwZTM1ODUsIDB4NTc3MTIwMmEsIDB4MTA2YWEwNzAsIDB4MzJiYmQxYjgsCiAgICAweDE5YTRjMTE2LCAweGI4ZDJkMGM4LCAweDFlMzc2YzA4LCAweDUxNDFhYjUzLCAweDI3NDg3NzRjLCAweGRmOGVlYjk5LAogICAgMHgzNGIwYmNiNSwgMHhlMTliNDhhOCwgMHgzOTFjMGNiMywgMHhjNWM5NWE2MywgMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYiwKICAgIDB4NWI5Y2NhNGYsIDB4Nzc2M2UzNzMsIDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMsIDB4NzQ4ZjgyZWUsIDB4NWRlZmIyZmMsCiAgICAweDc4YTU2MzZmLCAweDQzMTcyZjYwLCAweDg0Yzg3ODE0LCAweGExZjBhYjcyLCAweDhjYzcwMjA4LCAweDFhNjQzOWVjLAogICAgMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCwgMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSwgMHhiZWY5YTNmNywgMHhiMmM2NzkxNSwKICAgIDB4YzY3MTc4ZjIsIDB4ZTM3MjUzMmIsIDB4Y2EyNzNlY2UsIDB4ZWEyNjYxOWMsIDB4ZDE4NmI4YzcsIDB4MjFjMGMyMDcsCiAgICAweGVhZGE3ZGQ2LCAweGNkZTBlYjFlLCAweGY1N2Q0ZjdmLCAweGVlNmVkMTc4LCAweDA2ZjA2N2FhLCAweDcyMTc2ZmJhLAogICAgMHgwYTYzN2RjNSwgMHhhMmM4OThhNiwgMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSwgMHgxYjcxMGIzNSwgMHgxMzFjNDcxYiwKICAgIDB4MjhkYjc3ZjUsIDB4MjMwNDdkODQsIDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMsIDB4M2M5ZWJlMGEsIDB4MTVjOWJlYmMsCiAgICAweDQzMWQ2N2M0LCAweDljMTAwZDRjLCAweDRjYzVkNGJlLCAweGNiM2U0MmI2LCAweDU5N2YyOTljLCAweGZjNjU3ZTJhLAogICAgMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYywgMHg2YzQ0MTk4YywgMHg0YTQ3NTgxNywKfQoKCgoKbG9jYWwgZnVuY3Rpb24gZGlnZXN0KGRhdGEpCiAgICBleHBlY3QoMSwgZGF0YSwgInN0cmluZyIpCgogICAgCiAgICBsb2NhbCBiaXRsZW4gPSAjZGF0YSAqIDgKICAgIGxvY2FsIHBhZGxlbiA9IC0oI2RhdGEgKyAxNykgJSAxMjgKICAgIGRhdGEgPSBkYXRhIC4uICJceDgwIiAuLiAoIlwwIik6cmVwKHBhZGxlbikgLi4gcDF4MTYoZm10MXgxNiwgYml0bGVuKQoKICAgIAogICAgbG9jYWwgaDAxLCBoMDAgPSAweDZhMDllNjY3LCAweGYzYmNjOTA4CiAgICBsb2NhbCBoMTEsIGgxMCA9IDB4YmI2N2FlODUsIDB4ODRjYWE3M2IKICAgIGxvY2FsIGgyMSwgaDIwID0gMHgzYzZlZjM3MiwgMHhmZTk0ZjgyYgogICAgbG9jYWwgaDMxLCBoMzAgPSAweGE1NGZmNTNhLCAweDVmMWQzNmYxCiAgICBsb2NhbCBoNDEsIGg0MCA9IDB4NTEwZTUyN2YsIDB4YWRlNjgyZDEKICAgIGxvY2FsIGg1MSwgaDUwID0gMHg5YjA1Njg4YywgMHgyYjNlNmMxZgogICAgbG9jYWwgaDYxLCBoNjAgPSAweDFmODNkOWFiLCAweGZiNDFiZDZiCiAgICBsb2NhbCBoNzEsIGg3MCA9IDB4NWJlMGNkMTksIDB4MTM3ZTIxNzkKCiAgICAKICAgIGZvciBpID0gMSwgI2RhdGEsIDEyOCBkbwogICAgICAgIGxvY2FsIHcgPSB7dTMyeDQoZm10MzJ4NCwgZGF0YSwgaSl9CgogICAgICAgIAogICAgICAgIGZvciBqID0gMzMsIDE2MCwgMiBkbwogICAgICAgICAgICBsb2NhbCB3ZjEsIHdmMCA9IHdbaiAtIDMwXSwgd1tqIC0gMjldCiAgICAgICAgICAgIGxvY2FsIHQxID0gc2hyKHdmMSwgMSkgKyBzaGwod2YwLCAzMSkKICAgICAgICAgICAgbG9jYWwgdDAgPSBzaHIod2YwLCAxKSArIHNobCh3ZjEsIDMxKQogICAgICAgICAgICBsb2NhbCB1MSA9IHNocih3ZjEsIDgpICsgc2hsKHdmMCwgMjQpCiAgICAgICAgICAgIGxvY2FsIHUwID0gc2hyKHdmMCwgOCkgKyBzaGwod2YxLCAyNCkKICAgICAgICAgICAgbG9jYWwgdjEgPSBzaHIod2YxLCA3KQogICAgICAgICAgICBsb2NhbCB2MCA9IHNocih3ZjAsIDcpICsgc2hsKHdmMSwgMjUpCgogICAgICAgICAgICBsb2NhbCB3MjEsIHcyMCA9IHdbaiAtIDRdLCB3W2ogLSAzXQogICAgICAgICAgICBsb2NhbCB3MSA9IHNocih3MjEsIDE5KSArIHNobCh3MjAsIDEzKQogICAgICAgICAgICBsb2NhbCB3MCA9IHNocih3MjAsIDE5KSArIHNobCh3MjEsIDEzKQogICAgICAgICAgICBsb2NhbCB4MCA9IHNocih3MjEsIDI5KSArIHNobCh3MjAsIDMpCiAgICAgICAgICAgIGxvY2FsIHgxID0gc2hyKHcyMCwgMjkpICsgc2hsKHcyMSwgMykKICAgICAgICAgICAgbG9jYWwgeTEgPSBzaHIodzIxLCA2KQogICAgICAgICAgICBsb2NhbCB5MCA9IHNocih3MjAsIDYpICsgc2hsKHcyMSwgMjYpCgogICAgICAgICAgICBsb2NhbCByMSwgcjAgPQogICAgICAgICAgICAgICAgd1tqIC0gMzJdICsgYnhvcih0MSwgdTEsIHYxKSArIHdbaiAtIDE0XSArIGJ4b3IodzEsIHgxLCB5MSksCiAgICAgICAgICAgICAgICB3W2ogLSAzMV0gKyBieG9yKHQwLCB1MCwgdjApICsgd1tqIC0gMTNdICsgYnhvcih3MCwgeDAsIHkwKQoKICAgICAgICAgICAgd1tqXSwgd1tqICsgMV0gPSBjYXJyeTY0KHIxLCByMCkKICAgICAgICBlbmQKCiAgICAgICAgCiAgICAgICAgbG9jYWwgYTEsIGEwID0gaDAxLCBoMDAKICAgICAgICBsb2NhbCBiMSwgYjAgPSBoMTEsIGgxMAogICAgICAgIGxvY2FsIGMxLCBjMCA9IGgyMSwgaDIwCiAgICAgICAgbG9jYWwgZDEsIGQwID0gaDMxLCBoMzAKICAgICAgICBsb2NhbCBlMSwgZTAgPSBoNDEsIGg0MAogICAgICAgIGxvY2FsIGYxLCBmMCA9IGg1MSwgaDUwCiAgICAgICAgbG9jYWwgZzEsIGcwID0gaDYxLCBoNjAKICAgICAgICBsb2NhbCBoMSwgaDAgPSBoNzEsIGg3MAogICAgICAgIGZvciBqID0gMSwgMTYwLCAyIGRvCiAgICAgICAgICAgIGxvY2FsIHQxID0gc2hyKGUxLCAxNCkgKyBzaGwoZTAsIDE4KQogICAgICAgICAgICBsb2NhbCB0MCA9IHNocihlMCwgMTQpICsgc2hsKGUxLCAxOCkKICAgICAgICAgICAgbG9jYWwgdTEgPSBzaHIoZTEsIDE4KSArIHNobChlMCwgMTQpCiAgICAgICAgICAgIGxvY2FsIHUwID0gc2hyKGUwLCAxOCkgKyBzaGwoZTEsIDE0KQogICAgICAgICAgICBsb2NhbCB2MCA9IHNocihlMSwgOSkgKyBzaGwoZTAsIDIzKQogICAgICAgICAgICBsb2NhbCB2MSA9IHNocihlMCwgOSkgKyBzaGwoZTEsIDIzKQogICAgICAgICAgICBsb2NhbCBzMTEgPSBieG9yKHQxLCB1MSwgdjEpCiAgICAgICAgICAgIGxvY2FsIHMxMCA9IGJ4b3IodDAsIHUwLCB2MCkKCiAgICAgICAgICAgIGxvY2FsIGNoMSA9IGJ4b3IoYmFuZChlMSwgZjEpLCBiYW5kKGJub3QoZTEpLCBnMSkpCiAgICAgICAgICAgIGxvY2FsIGNoMCA9IGJ4b3IoYmFuZChlMCwgZjApLCBiYW5kKGJub3QoZTApLCBnMCkpCgogICAgICAgICAgICBsb2NhbCB0ZW1wMTEgPSBoMSArIHMxMSArIGNoMSArIEtbal0gKyB3W2pdCiAgICAgICAgICAgIGxvY2FsIHRlbXAxMCA9IGgwICsgczEwICsgY2gwICsgS1tqICsgMV0gKyB3W2ogKyAxXQoKICAgICAgICAgICAgbG9jYWwgdzEgPSBzaHIoYTEsIDI4KSArIHNobChhMCwgNCkKICAgICAgICAgICAgbG9jYWwgdzAgPSBzaHIoYTAsIDI4KSArIHNobChhMSwgNCkKICAgICAgICAgICAgbG9jYWwgeDAgPSBzaHIoYTEsIDIpICsgc2hsKGEwLCAzMCkKICAgICAgICAgICAgbG9jYWwgeDEgPSBzaHIoYTAsIDIpICsgc2hsKGExLCAzMCkKICAgICAgICAgICAgbG9jYWwgeTAgPSBzaHIoYTEsIDcpICsgc2hsKGEwLCAyNSkKICAgICAgICAgICAgbG9jYWwgeTEgPSBzaHIoYTAsIDcpICsgc2hsKGExLCAyNSkKICAgICAgICAgICAgbG9jYWwgczAxID0gYnhvcih3MSwgeDEsIHkxKQogICAgICAgICAgICBsb2NhbCBzMDAgPSBieG9yKHcwLCB4MCwgeTApCgogICAgICAgICAgICBsb2NhbCBtYWoxID0gYnhvcihiYW5kKGExLCBiMSksIGJhbmQoYTEsIGMxKSwgYmFuZChiMSwgYzEpKQogICAgICAgICAgICBsb2NhbCBtYWowID0gYnhvcihiYW5kKGEwLCBiMCksIGJhbmQoYTAsIGMwKSwgYmFuZChiMCwgYzApKQoKICAgICAgICAgICAgbG9jYWwgdGVtcDIxID0gczAxICsgbWFqMQogICAgICAgICAgICBsb2NhbCB0ZW1wMjAgPSBzMDAgKyBtYWowCgogICAgICAgICAgICBoMSA9IGcxICBoMCA9IGcwCiAgICAgICAgICAgIGcxID0gZjEgIGcwID0gZjAKICAgICAgICAgICAgZjEgPSBlMSAgZjAgPSBlMAogICAgICAgICAgICBlMSwgZTAgPSBjYXJyeTY0KGQxICsgdGVtcDExLCBkMCArIHRlbXAxMCkKICAgICAgICAgICAgZDEgPSBjMSAgZDAgPSBjMAogICAgICAgICAgICBjMSA9IGIxICBjMCA9IGIwCiAgICAgICAgICAgIGIxID0gYTEgIGIwID0gYTAKICAgICAgICAgICAgYTEsIGEwID0gY2Fycnk2NCh0ZW1wMTEgKyB0ZW1wMjEsIHRlbXAxMCArIHRlbXAyMCkKICAgICAgICBlbmQKCiAgICAgICAgaDAxLCBoMDAgPSBjYXJyeTY0KGgwMSArIGExLCBoMDAgKyBhMCkKICAgICAgICBoMTEsIGgxMCA9IGNhcnJ5NjQoaDExICsgYjEsIGgxMCArIGIwKQogICAgICAgIGgyMSwgaDIwID0gY2Fycnk2NChoMjEgKyBjMSwgaDIwICsgYzApCiAgICAgICAgaDMxLCBoMzAgPSBjYXJyeTY0KGgzMSArIGQxLCBoMzAgKyBkMCkKICAgICAgICBoNDEsIGg0MCA9IGNhcnJ5NjQoaDQxICsgZTEsIGg0MCArIGUwKQogICAgICAgIGg1MSwgaDUwID0gY2Fycnk2NChoNTEgKyBmMSwgaDUwICsgZjApCiAgICAgICAgaDYxLCBoNjAgPSBjYXJyeTY0KGg2MSArIGcxLCBoNjAgKyBnMCkKICAgICAgICBoNzEsIGg3MCA9IGNhcnJ5NjQoaDcxICsgaDEsIGg3MCArIGgwKQogICAgZW5kCgogICAgcmV0dXJuIHAxNng0KGZtdDE2eDQsCiAgICAgICAgaDAxLCBoMDAsIGgxMSwgaDEwLCBoMjEsIGgyMCwgaDMxLCBoMzAsCiAgICAgICAgaDQxLCBoNDAsIGg1MSwgaDUwLCBoNjEsIGg2MCwgaDcxLCBoNzAKICAgICkKZW5kCgpyZXR1cm4gewogICAgZGlnZXN0ID0gZGlnZXN0LAp9Cg==";
  37.     ["ccryptolib.internal.fq"] = base64.decode "Cgpsb2NhbCBtcCA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwubXAiCmxvY2FsIHV0aWwgPSByZXF1aXJlICJjY3J5cHRvbGliLmludGVybmFsLnV0aWwiCmxvY2FsIHBhY2tpbmcgPSByZXF1aXJlICJjY3J5cHRvbGliLmludGVybmFsLnBhY2tpbmciCgpsb2NhbCB1bnBhY2sgPSB1bnBhY2sgb3IgdGFibGUudW5wYWNrCmxvY2FsIHBmcSwgZm10ZnEgPSBwYWNraW5nLmNvbXBpbGVQYWNrKCI8STNJM0kzSTNJM0kzSTNJM0kzSTNJMiIpCmxvY2FsIHVmcSA9IHBhY2tpbmcuY29tcGlsZVVucGFjayhmbXRmcSkKbG9jYWwgdWZxbCwgZm10ZnFsID0gcGFja2luZy5jb21waWxlVW5wYWNrKCI8STNJM0kzSTNJM0kzSTNJM0kzSTNJMyIpCmxvY2FsIHVmcWgsIGZtdGZxaCA9IHBhY2tpbmcuY29tcGlsZVVucGFjaygiPEkzSTNJM0kzSTNJM0kzSTNJM0kzSTEiKQoKCmxvY2FsIFEgPSB7CiAgICAxNjExMDU3MywKICAgIDA2NDk0ODEyLAogICAgMTQwNDcyNTAsCiAgICAxMDY4MDIyMCwKICAgIDE0NjEyOTU4LAogICAgMDAwMDAwMjAsCiAgICAwMDAwMDAwMCwKICAgIDAwMDAwMDAwLAogICAgMDAwMDAwMDAsCiAgICAwMDAwMDAwMCwKICAgIDAwMDA0MDk2LAp9CgoKbG9jYWwgVDAgPSB7CiAgICAwNTUzNzMwNywKICAgIDAxOTQyMjkwLAogICAgMTY3NjU2MjEsCiAgICAxNjYyODM1NiwKICAgIDEwNjE4NjEwLAogICAgMDcwNzI0MzMsCiAgICAwMzczNTQ1OSwKICAgIDAxMzY5OTQwLAogICAgMTUyNzYwODYsCiAgICAxMzAzODE5MSwKICAgIDEzNDA5NzE4LAp9CgoKbG9jYWwgVDEgPSB7CiAgICAxMTcxMTk5NiwKICAgIDAxNzQ3ODYwLAogICAgMDgzMjY5NjEsCiAgICAwMzgxNDcxOCwKICAgIDAxODU5OTc0LAogICAgMTMzMjc0NjEsCiAgICAxNjEwNTA2MSwKICAgIDA3NTkwNDIzLAogICAgMDQwNTA2NjgsCiAgICAwODEzODkwNiwKICAgIDAwMDAwMjgzLAp9Cgpsb2NhbCBUOCA9IHsKICAgIDUxMTAyNTMsCiAgICAzMDM5MzQ1LAogICAgMjUwMzUwMCwKICAgIDExNzc5NTY4LAogICAgMTU0MTY0NzIsCiAgICAxNjc2NjU1MCwKICAgIDE2Nzc3MjE1LAogICAgMTY3NzcyMTUsCiAgICAxNjc3NzIxNSwKICAgIDE2Nzc3MjE1LAogICAgNDA5NSwKfQoKbG9jYWwgWkVSTyA9IG1wLm51bSgwKQoKCgoKCgpsb2NhbCBmdW5jdGlvbiByZWR1Y2UoYSkKICAgIGxvY2FsIGMgPSBtcC5zdWIoYSwgUSkKCiAgICAKICAgIGlmIG1wLmFwcHJveChjKSA8IDAgdGhlbiByZXR1cm4gKG1wLmNhcnJ5KGEpKSBlbmQKCiAgICAKICAgIAogICAgCiAgICByZXR1cm4gKG1wLmNhcnJ5KGMpKSAKZW5kCgoKCgoKCgoKCgpsb2NhbCBmdW5jdGlvbiBhZGQoYSwgYikKICAgIHJldHVybiByZWR1Y2UobXAuYWRkKGEsIGIpKQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gbmVnKGEpCiAgICByZXR1cm4gcmVkdWNlKG1wLnN1YihRLCBhKSkKZW5kCgoKCgoKCgoKCgpsb2NhbCBmdW5jdGlvbiBzdWIoYSwgYikKICAgIHJldHVybiBhZGQoYSwgbmVnKGIpKQplbmQKCgoKCgoKCmxvY2FsIGZ1bmN0aW9uIG11bChhLCBiKQogICAgbG9jYWwgdDAsIHQxID0gbXAubXVsKGEsIGIpCiAgICBsb2NhbCBtcTAsIG1xMSA9IG1wLm11bChtcC5sbXVsKHQwLCBUMCksIFEpCiAgICBsb2NhbCBfLCBzMSA9IG1wLmR3YWRkKHQwLCB0MSwgbXEwLCBtcTEpCiAgICByZXR1cm4gcmVkdWNlKHMxKQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gbW9udGdvbWVyeShhKQogICAgCiAgICByZXR1cm4gbXVsKGEsIFQxKQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gZGVtb250Z29tZXJ5KGEpCiAgICAKICAgIGxvY2FsIG1xMCwgbXExID0gbXAubXVsKG1wLmxtdWwoYSwgVDApLCBRKQogICAgbG9jYWwgXywgczEgPSBtcC5kd2FkZChhLCBaRVJPLCBtcTAsIG1xMSkKICAgIHJldHVybiByZWR1Y2UoczEpCmVuZAoKCgoKCgpsb2NhbCBmdW5jdGlvbiBlbmNvZGUoYSkKICAgIHJldHVybiBwZnEoZm10ZnEsIHVucGFjayhkZW1vbnRnb21lcnkoYSkpKQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gZGVjb2RlKHN0cikKICAgIGxvY2FsIGRlYyA9IHt1ZnEoZm10ZnEsIHN0ciwgMSl9IGRlY1sxMl0gPSBuaWwKICAgIHJldHVybiBtb250Z29tZXJ5KGRlYykKZW5kCgoKCgoKCmxvY2FsIGZ1bmN0aW9uIGRlY29kZVdpZGUoc3RyKQogICAgbG9jYWwgbG93ID0ge3VmcWwoZm10ZnFsLCBzdHIsIDEpfSBsb3dbMTJdID0gbmlsCiAgICBsb2NhbCBoaWdoID0ge3VmcWgoZm10ZnFoLCBzdHIsIDM0KX0gaGlnaFsxMl0gPSBuaWwKICAgIHJldHVybiBhZGQobW9udGdvbWVyeShsb3cpLCBtb250Z29tZXJ5KG1vbnRnb21lcnkoaGlnaCkpKQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gZGVjb2RlQ2xhbXBlZChzdHIpCiAgICAKICAgIGxvY2FsIHdvcmRzID0ge3VmcShmbXRmcSwgc3RyLCAxKX0gd29yZHNbMTJdID0gbmlsCgogICAgCiAgICB3b3Jkc1sxXSA9IGJpdDMyLmJhbmQod29yZHNbMV0sIDB4ZmZmZmY4KQogICAgd29yZHNbMTFdID0gYml0MzIuYmFuZCh3b3Jkc1sxMV0sIDB4N2ZmZikKICAgIHdvcmRzWzExXSA9IGJpdDMyLmJvcih3b3Jkc1sxMV0sIDB4NDAwMCkKCiAgICByZXR1cm4gbW9udGdvbWVyeSh3b3JkcykKZW5kCgoKCgoKbG9jYWwgZnVuY3Rpb24gZWlnaHRoKGEpCiAgICByZXR1cm4gbXVsKGEsIFQ4KQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gYml0cyhhKQogICAgbG9jYWwgb3V0ID0gdXRpbC5yZWJhc2VMRShkZW1vbnRnb21lcnkoYSksIDIgXiAyNCwgMikKICAgIGZvciBpID0gMjU0LCAyODkgZG8gb3V0W2ldID0gbmlsIGVuZAogICAgcmV0dXJuIG91dAplbmQKCgoKCgoKCgoKCgpsb2NhbCBmdW5jdGlvbiBtYWtlUnVsZXNldChhLCBiKQogICAgCiAgICBsb2NhbCBkdCA9IGRlbW9udGdvbWVyeShhKSAKICAgIGxvY2FsIGV0ID0gZGVtb250Z29tZXJ5KGIpIAogICAgbG9jYWwgZnQgPSBtcC5zdWIoZHQsIGV0KSAgCgogICAgCiAgICBsb2NhbCBkMiA9IG1wLm1vZDIoZHQpCiAgICBsb2NhbCBlMiA9IG1wLm1vZDIoZXQpCgogICAgCiAgICBsb2NhbCBkMyA9IG1wLm1vZDMoZHQpCiAgICBsb2NhbCBlMyA9IG1wLm1vZDMoZXQpCgogICAgCiAgICBsb2NhbCBlZiA9IG1wLmFwcHJveChldCkKICAgIGxvY2FsIGZmID0gbXAuYXBwcm94KGZ0KQoKICAgIAogICAgbG9jYWwgbHV0MyA9IHtbMF0gPSAwLCAyLCAxfQoKICAgIGxvY2FsIHJ1bGVzID0ge30KICAgIHdoaWxlIGZmIH49IDAgZG8KICAgICAgICBpZiBmZiA8IDAgdGhlbgogICAgICAgICAgICAKICAgICAgICAgICAgcnVsZXNbI3J1bGVzICsgMV0gPSAwCiAgICAgICAgICAgIAogICAgICAgICAgICBkdCwgZXQgPSBldCwgZHQKICAgICAgICAgICAgZDIsIGUyID0gZTIsIGQyCiAgICAgICAgICAgIGQzLCBlMyA9IGUzLCBkMwogICAgICAgICAgICBlZiA9IG1wLmFwcHJveChldCkKICAgICAgICAgICAgZnQgPSBtcC5zdWIoZHQsIGV0KQogICAgICAgICAgICBmZiA9IC1mZgogICAgICAgIGVsc2VpZiA0ICogZmYgPCBlZiBhbmQgZDMgPT0gbHV0M1tlM10gdGhlbgogICAgICAgICAgICAKICAgICAgICAgICAgcnVsZXNbI3J1bGVzICsgMV0gPSAxCiAgICAgICAgICAgIAogICAgICAgICAgICBkdCwgZXQgPSBtcC50aGlyZChtcC5hZGQoZHQsIGZ0KSksIG1wLnRoaXJkKG1wLnN1YihldCwgZnQpKQogICAgICAgICAgICBkMiwgZTIgPSBlMiwgZDIKICAgICAgICAgICAgZDMsIGUzID0gbXAubW9kMyhkdCksIG1wLm1vZDMoZXQpCiAgICAgICAgICAgIGVmID0gbXAuYXBwcm94KGV0KQogICAgICAgIGVsc2VpZiA0ICogZmYgPCBlZiBhbmQgZDIgPT0gZTIgYW5kIGQzID09IGUzIHRoZW4KICAgICAgICAgICAgCiAgICAgICAgICAgIHJ1bGVzWyNydWxlcyArIDFdID0gMgogICAgICAgICAgICAKICAgICAgICAgICAgZHQgPSBtcC5oYWxmKGZ0KQogICAgICAgICAgICBkMiA9IG1wLm1vZDIoZHQpCiAgICAgICAgICAgIGQzID0gbHV0M1soZDMgLSBlMykgJSAzXQogICAgICAgICAgICBmdCA9IG1wLnN1YihkdCwgZXQpCiAgICAgICAgICAgIGZmID0gbXAuYXBwcm94KGZ0KQogICAgICAgIGVsc2VpZiBmZiA8IDMgKiBlZiB0aGVuCiAgICAgICAgICAgIAogICAgICAgICAgICBydWxlc1sjcnVsZXMgKyAxXSA9IDMKICAgICAgICAgICAgCiAgICAgICAgICAgIGR0ID0gbXAuY2FycnlXZWFrKGZ0KQogICAgICAgICAgICBkMiA9IChkMiAtIGUyKSAlIDIKICAgICAgICAgICAgZDMgPSAoZDMgLSBlMykgJSAzCiAgICAgICAgICAgIGZ0ID0gbXAuc3ViKGR0LCBldCkKICAgICAgICAgICAgZmYgPSBtcC5hcHByb3goZnQpCiAgICAgICAgZWxzZWlmIGQyID09IGUyIHRoZW4KICAgICAgICAgICAgCiAgICAgICAgICAgIHJ1bGVzWyNydWxlcyArIDFdID0gMgogICAgICAgICAgICAKICAgICAgICAgICAgZHQgPSBtcC5oYWxmKGZ0KQogICAgICAgICAgICBkMiA9IG1wLm1vZDIoZHQpCiAgICAgICAgICAgIGQzID0gbHV0M1soZDMgLSBlMykgJSAzXQogICAgICAgICAgICBmdCA9IG1wLnN1YihkdCwgZXQpCiAgICAgICAgICAgIGZmID0gbXAuYXBwcm94KGZ0KQogICAgICAgIGVsc2VpZiBkMiA9PSAwIHRoZW4KICAgICAgICAgICAgCiAgICAgICAgICAgIHJ1bGVzWyNydWxlcyArIDFdID0gNQogICAgICAgICAgICAKICAgICAgICAgICAgZHQgPSBtcC5oYWxmKGR0KQogICAgICAgICAgICBkMiA9IG1wLm1vZDIoZHQpCiAgICAgICAgICAgIGQzID0gbHV0M1tkM10KICAgICAgICAgICAgZnQgPSBtcC5zdWIoZHQsIGV0KQogICAgICAgICAgICBmZiA9IG1wLmFwcHJveChmdCkKICAgICAgICBlbHNlaWYgZDMgPT0gMCB0aGVuCiAgICAgICAgICAgIAogICAgICAgICAgICBydWxlc1sjcnVsZXMgKyAxXSA9IDYKICAgICAgICAgICAgCiAgICAgICAgICAgIGR0ID0gbXAuY2FycnlXZWFrKG1wLnN1YihtcC50aGlyZChkdCksIGV0KSkKICAgICAgICAgICAgZDIgPSAoZDIgLSBlMikgJSAyCiAgICAgICAgICAgIGQzID0gbXAubW9kMyhkdCkKICAgICAgICAgICAgZnQgPSBtcC5zdWIoZHQsIGV0KQogICAgICAgICAgICBmZiA9IG1wLmFwcHJveChmdCkKICAgICAgICBlbHNlaWYgZDMgPT0gbHV0M1tlM10gdGhlbgogICAgICAgICAgICAKICAgICAgICAgICAgcnVsZXNbI3J1bGVzICsgMV0gPSA3CiAgICAgICAgICAgIAogICAgICAgICAgICBkdCA9IG1wLnRoaXJkKG1wLnN1YihmdCwgZXQpKQogICAgICAgICAgICBkMyA9IG1wLm1vZDMoZHQpCiAgICAgICAgICAgIGZ0ID0gbXAuc3ViKGR0LCBldCkKICAgICAgICAgICAgZmYgPSBtcC5hcHByb3goZnQpCiAgICAgICAgZWxzZWlmIGQzID09IGUzIHRoZW4KICAgICAgICAgICAgCiAgICAgICAgICAgIHJ1bGVzWyNydWxlcyArIDFdID0gOAogICAgICAgICAgICAKICAgICAgICAgICAgZHQgPSBtcC50aGlyZChmdCkKICAgICAgICAgICAgZDIgPSAoZDIgLSBlMikgJSAyCiAgICAgICAgICAgIGQzID0gbXAubW9kMyhkdCkKICAgICAgICAgICAgZnQgPSBtcC5zdWIoZHQsIGV0KQogICAgICAgICAgICBmZiA9IG1wLmFwcHJveChmdCkKICAgICAgICBlbHNlCiAgICAgICAgICAgIAogICAgICAgICAgICBydWxlc1sjcnVsZXMgKyAxXSA9IDkKICAgICAgICAgICAgCiAgICAgICAgICAgIGV0ID0gbXAuaGFsZihldCkKICAgICAgICAgICAgZTIgPSBtcC5tb2QyKGV0KQogICAgICAgICAgICBlMyA9IGx1dDNbZTNdCiAgICAgICAgICAgIGVmID0gbXAuYXBwcm94KGV0KQogICAgICAgICAgICBmdCA9IG1wLnN1YihkdCwgZXQpCiAgICAgICAgICAgIGZmID0gbXAuYXBwcm94KGZ0KQogICAgICAgIGVuZAogICAgZW5kCgogICAgbG9jYWwgdWJpdHMgPSB1dGlsLnJlYmFzZUxFKGR0LCAyIF4gMjQsIDIpCiAgICB3aGlsZSB1Yml0c1sjdWJpdHNdID09IDAgZG8gdWJpdHNbI3ViaXRzXSA9IG5pbCBlbmQKCiAgICByZXR1cm4ge3ViaXRzLCBydWxlc30KZW5kCgpyZXR1cm4gewogICAgYWRkID0gYWRkLAogICAgc3ViID0gc3ViLAogICAgbXVsID0gbXVsLAogICAgZW5jb2RlID0gZW5jb2RlLAogICAgZGVjb2RlID0gZGVjb2RlLAogICAgZGVjb2RlV2lkZSA9IGRlY29kZVdpZGUsCiAgICBkZWNvZGVDbGFtcGVkID0gZGVjb2RlQ2xhbXBlZCwKICAgIGVpZ2h0aCA9IGVpZ2h0aCwKICAgIGJpdHMgPSBiaXRzLAogICAgbWFrZVJ1bGVzZXQgPSBtYWtlUnVsZXNldCwKfQo=";
  38.     ["ccryptolib.internal.edwards25519"] = base64.decode "Cgpsb2NhbCBmcCA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwuZnAiCgpsb2NhbCB1bnBhY2sgPSB1bnBhY2sgb3IgdGFibGUudW5wYWNrCgoKCgoKCgoKCgoKCgpsb2NhbCBEID0gZnAubXVsKGZwLm51bSgtMTIxNjY1KSwgZnAuaW52ZXJ0KGZwLm51bSgxMjE2NjYpKSkKbG9jYWwgSyA9IGZwLmttdWwoRCwgMikKCgpsb2NhbCBPID0ge2ZwLm51bSgwKSwgZnAubnVtKDEpLCBmcC5udW0oMSksIGZwLm51bSgwKX0KbG9jYWwgRyA9IG5pbAoKCgoKbG9jYWwgZnVuY3Rpb24gZG91YmxlKFAxKQogICAgCiAgICAKICAgIAogICAgbG9jYWwgUDF4LCBQMXksIFAxeiA9IHVucGFjayhQMSkKICAgIGxvY2FsIGEgPSBmcC5zcXVhcmUoUDF4KQogICAgbG9jYWwgYiA9IGZwLnNxdWFyZShQMXkpCiAgICBsb2NhbCBjID0gZnAuc3F1YXJlKFAxeikKICAgIGxvY2FsIGQgPSBmcC5hZGQoYywgYykKICAgIGxvY2FsIGUgPSBmcC5hZGQoYSwgYikKICAgIGxvY2FsIGYgPSBmcC5hZGQoUDF4LCBQMXkpCiAgICBsb2NhbCBnID0gZnAuc3F1YXJlKGYpCiAgICBsb2NhbCBoID0gZnAuY2FycnkoZnAuc3ViKGcsIGUpKQogICAgbG9jYWwgaSA9IGZwLnN1YihiLCBhKQogICAgbG9jYWwgaiA9IGZwLmNhcnJ5KGZwLnN1YihkLCBpKSkKICAgIGxvY2FsIFAzeCA9IGZwLm11bChoLCBqKQogICAgbG9jYWwgUDN5ID0gZnAubXVsKGksIGUpCiAgICBsb2NhbCBQM3ogPSBmcC5tdWwoaiwgaSkKICAgIGxvY2FsIFAzdCA9IGZwLm11bChoLCBlKQogICAgcmV0dXJuIHtQM3gsIFAzeSwgUDN6LCBQM3R9CmVuZAoKCgoKCmxvY2FsIGZ1bmN0aW9uIGFkZChQMSwgTjIpCiAgICBsb2NhbCBQMXgsIFAxeSwgUDF6LCBQMXQgPSB1bnBhY2soUDEpCiAgICBsb2NhbCBOMXAsIE4xbSwgTjF6LCBOMXQgPSB1bnBhY2soTjIpCiAgICBsb2NhbCBhID0gZnAuc3ViKFAxeSwgUDF4KQogICAgbG9jYWwgYiA9IGZwLm11bChhLCBOMW0pCiAgICBsb2NhbCBjID0gZnAuYWRkKFAxeSwgUDF4KQogICAgbG9jYWwgZCA9IGZwLm11bChjLCBOMXApCiAgICBsb2NhbCBlID0gZnAubXVsKFAxdCwgTjF0KQogICAgbG9jYWwgZiA9IGZwLm11bChQMXosIE4xeikKICAgIGxvY2FsIGcgPSBmcC5zdWIoZCwgYikKICAgIGxvY2FsIGggPSBmcC5zdWIoZiwgZSkKICAgIGxvY2FsIGkgPSBmcC5hZGQoZiwgZSkKICAgIGxvY2FsIGogPSBmcC5hZGQoZCwgYikKICAgIGxvY2FsIFAzeCA9IGZwLm11bChnLCBoKQogICAgbG9jYWwgUDN5ID0gZnAubXVsKGksIGopCiAgICBsb2NhbCBQM3ogPSBmcC5tdWwoaCwgaSkKICAgIGxvY2FsIFAzdCA9IGZwLm11bChnLCBqKQogICAgcmV0dXJuIHtQM3gsIFAzeSwgUDN6LCBQM3R9CmVuZAoKCgoKCmxvY2FsIGZ1bmN0aW9uIHN1YihQMSwgTjIpCiAgICBsb2NhbCBQMXgsIFAxeSwgUDF6LCBQMXQgPSB1bnBhY2soUDEpCiAgICBsb2NhbCBOMXAsIE4xbSwgTjF6LCBOMXQgPSB1bnBhY2soTjIpCiAgICBsb2NhbCBhID0gZnAuc3ViKFAxeSwgUDF4KQogICAgbG9jYWwgYiA9IGZwLm11bChhLCBOMXApCiAgICBsb2NhbCBjID0gZnAuYWRkKFAxeSwgUDF4KQogICAgbG9jYWwgZCA9IGZwLm11bChjLCBOMW0pCiAgICBsb2NhbCBlID0gZnAubXVsKFAxdCwgTjF0KQogICAgbG9jYWwgZiA9IGZwLm11bChQMXosIE4xeikKICAgIGxvY2FsIGcgPSBmcC5zdWIoZCwgYikKICAgIGxvY2FsIGggPSBmcC5hZGQoZiwgZSkKICAgIGxvY2FsIGkgPSBmcC5zdWIoZiwgZSkKICAgIGxvY2FsIGogPSBmcC5hZGQoZCwgYikKICAgIGxvY2FsIFAzeCA9IGZwLm11bChnLCBoKQogICAgbG9jYWwgUDN5ID0gZnAubXVsKGksIGopCiAgICBsb2NhbCBQM3ogPSBmcC5tdWwoaCwgaSkKICAgIGxvY2FsIFAzdCA9IGZwLm11bChnLCBqKQogICAgcmV0dXJuIHtQM3gsIFAzeSwgUDN6LCBQM3R9CmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gbmllbHMoUDEpCiAgICBsb2NhbCBQMXgsIFAxeSwgUDF6LCBQMXQgPSB1bnBhY2soUDEpCiAgICBsb2NhbCBOM3AgPSBmcC5hZGQoUDF5LCBQMXgpCiAgICBsb2NhbCBOM20gPSBmcC5zdWIoUDF5LCBQMXgpCiAgICBsb2NhbCBOM3ogPSBmcC5hZGQoUDF6LCBQMXopCiAgICBsb2NhbCBOM3QgPSBmcC5tdWwoUDF0LCBLKQogICAgcmV0dXJuIHtOM3AsIE4zbSwgTjN6LCBOM3R9CmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gc2NhbGUoUDEpCiAgICBsb2NhbCBQMXgsIFAxeSwgUDF6ID0gdW5wYWNrKFAxKQogICAgbG9jYWwgekludiA9IGZwLmludmVydChQMXopCiAgICBsb2NhbCBQM3ggPSBmcC5tdWwoUDF4LCB6SW52KQogICAgbG9jYWwgUDN5ID0gZnAubXVsKFAxeSwgekludikKICAgIGxvY2FsIFAzeiA9IGZwLm51bSgxKQogICAgbG9jYWwgUDN0ID0gZnAubXVsKFAzeCwgUDN5KQogICAgcmV0dXJuIHtQM3gsIFAzeSwgUDN6LCBQM3R9CmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gZW5jb2RlKFAxKQogICAgUDEgPSBzY2FsZShQMSkKICAgIGxvY2FsIFAxeCwgUDF5ID0gdW5wYWNrKFAxKQogICAgbG9jYWwgeSA9IGZwLmVuY29kZShQMXkpCiAgICBsb2NhbCB4Qml0ID0gZnAuY2Fub25pY2FsaXplKFAxeClbMV0gJSAyCiAgICByZXR1cm4geTpzdWIoMSwgLTIpIC4uIHN0cmluZy5jaGFyKHk6Ynl0ZSgtMSkgKyB4Qml0ICogMTI4KQplbmQKCgoKCmxvY2FsIGZ1bmN0aW9uIGRlY29kZShzdHIpCiAgICBsb2NhbCBQM3kgPSBmcC5kZWNvZGUoc3RyKQogICAgbG9jYWwgYSA9IGZwLnNxdWFyZShQM3kpCiAgICBsb2NhbCBiID0gZnAuc3ViKGEsIGZwLm51bSgxKSkKICAgIGxvY2FsIGMgPSBmcC5tdWwoYSwgRCkKICAgIGxvY2FsIGQgPSBmcC5hZGQoYywgZnAubnVtKDEpKQogICAgbG9jYWwgUDN4ID0gZnAuc3FydERpdihiLCBkKQogICAgaWYgbm90IFAzeCB0aGVuIHJldHVybiBuaWwgZW5kCiAgICBsb2NhbCB4Qml0ID0gZnAuY2Fub25pY2FsaXplKFAzeClbMV0gJSAyCiAgICBpZiB4Qml0IH49IGJpdDMyLmV4dHJhY3Qoc3RyOmJ5dGUoLTEpLCA3KSB0aGVuCiAgICAgICAgUDN4ID0gZnAuY2FycnkoZnAubmVnKFAzeCkpCiAgICBlbmQKICAgIGxvY2FsIFAzeiA9IGZwLm51bSgxKQogICAgbG9jYWwgUDN0ID0gZnAubXVsKFAzeCwgUDN5KQogICAgcmV0dXJuIHtQM3gsIFAzeSwgUDN6LCBQM3R9CmVuZAoKRyA9IGRlY29kZSgiWGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYiKSAKCgoKCgpsb2NhbCBmdW5jdGlvbiBzaWduZWRSYWRpeFcoYml0cywgdykKICAgIAogICAgbG9jYWwgd1BvdyA9IDIgXiB3CiAgICBsb2NhbCB3UG93aCA9IHdQb3cgLyAyCiAgICBsb2NhbCBvdXQgPSB7fQogICAgbG9jYWwgYWNjID0gMAogICAgbG9jYWwgbXVsID0gMQogICAgZm9yIGkgPSAxLCAjYml0cyBkbwogICAgICAgIGFjYyA9IGFjYyArIGJpdHNbaV0gKiBtdWwKICAgICAgICBtdWwgPSBtdWwgKiAyCiAgICAgICAgd2hpbGUgaSA9PSAjYml0cyBhbmQgYWNjID4gMCBvciBtdWwgPiB3UG93IGRvCiAgICAgICAgICAgIGxvY2FsIHJlbSA9IGFjYyAlIHdQb3cKICAgICAgICAgICAgaWYgcmVtID49IHdQb3doIHRoZW4gcmVtID0gcmVtIC0gd1BvdyBlbmQKICAgICAgICAgICAgYWNjID0gKGFjYyAtIHJlbSkgLyB3UG93CiAgICAgICAgICAgIG11bCA9IG11bCAvIHdQb3cKICAgICAgICAgICAgb3V0WyNvdXQgKyAxXSA9IHJlbQogICAgICAgIGVuZAogICAgZW5kCiAgICByZXR1cm4gb3V0CmVuZAoKCgoKCmxvY2FsIGZ1bmN0aW9uIHJhZGl4V1RhYmxlKFAsIHcpCiAgICBsb2NhbCBvdXQgPSB7fQogICAgZm9yIGkgPSAxLCBtYXRoLmNlaWwoMjU2IC8gdykgZG8KICAgICAgICBsb2NhbCByb3cgPSB7bmllbHMoUCl9CiAgICAgICAgZm9yIGogPSAyLCAyIF4gdyAvIDIgZG8KICAgICAgICAgICAgUCA9IGFkZChQLCByb3dbMV0pCiAgICAgICAgICAgIHJvd1tqXSA9IG5pZWxzKFApCiAgICAgICAgZW5kCiAgICAgICAgb3V0W2ldID0gcm93CiAgICAgICAgUCA9IGRvdWJsZShQKQogICAgZW5kCiAgICByZXR1cm4gb3V0CmVuZAoKCmxvY2FsIEdfVyA9IDUKCgpsb2NhbCBHX1RBQkxFID0gcmFkaXhXVGFibGUoRywgR19XKQoKCgoKCgoKCgpsb2NhbCBmdW5jdGlvbiB3TmFmKGJpdHMsIHcpCiAgICAKICAgIGxvY2FsIHdQb3cgPSAyIF4gdwogICAgbG9jYWwgd1Bvd2ggPSB3UG93IC8gMgogICAgbG9jYWwgb3V0ID0ge30KICAgIGxvY2FsIGFjYyA9IDAKICAgIGxvY2FsIG11bCA9IDEKICAgIGZvciBpID0gMSwgI2JpdHMgZG8KICAgICAgICBhY2MgPSBhY2MgKyBiaXRzW2ldICogbXVsCiAgICAgICAgbXVsID0gbXVsICogMgogICAgICAgIHdoaWxlIGkgPT0gI2JpdHMgYW5kIGFjYyA+IDAgb3IgbXVsID4gd1BvdyBkbwogICAgICAgICAgICBpZiBhY2MgJSAyID09IDAgdGhlbgogICAgICAgICAgICAgICAgYWNjID0gYWNjIC8gMgogICAgICAgICAgICAgICAgbXVsID0gbXVsIC8gMgogICAgICAgICAgICAgICAgb3V0WyNvdXQgKyAxXSA9IDAKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbG9jYWwgcmVtID0gYWNjICUgd1BvdwogICAgICAgICAgICAgICAgaWYgcmVtID49IHdQb3doIHRoZW4gcmVtID0gcmVtIC0gd1BvdyBlbmQKICAgICAgICAgICAgICAgIGFjYyA9IGFjYyAtIHJlbQogICAgICAgICAgICAgICAgb3V0WyNvdXQgKyAxXSA9IHJlbQogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgIGVuZAogICAgd2hpbGUgb3V0WyNvdXRdID09IDAgZG8gb3V0WyNvdXRdID0gbmlsIGVuZAogICAgcmV0dXJuIG91dAplbmQKCgoKCgpsb2NhbCBmdW5jdGlvbiBXTkFGVGFibGUoUCwgdykKICAgIGxvY2FsIGRQID0gZG91YmxlKFApCiAgICBsb2NhbCBvdXQgPSB7bmllbHMoUCl9CiAgICBmb3IgaSA9IDMsIDIgXiB3LCAyIGRvCiAgICAgICAgb3V0W2ldID0gbmllbHMoYWRkKGRQLCBvdXRbaSAtIDJdKSkKICAgIGVuZAogICAgcmV0dXJuIG91dAplbmQKCgoKCmxvY2FsIGZ1bmN0aW9uIG11bEcoYml0cykKICAgIGxvY2FsIHN3ID0gc2lnbmVkUmFkaXhXKGJpdHMsIEdfVykKICAgIGxvY2FsIFIgPSBPCiAgICBmb3IgaSA9IDEsICNzdyBkbwogICAgICAgIGxvY2FsIGIgPSBzd1tpXQogICAgICAgIGlmIGIgPiAwIHRoZW4KICAgICAgICAgICAgUiA9IGFkZChSLCBHX1RBQkxFW2ldW2JdKQogICAgICAgIGVsc2VpZiBiIDwgMCB0aGVuCiAgICAgICAgICAgIFIgPSBzdWIoUiwgR19UQUJMRVtpXVstYl0pCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBSCmVuZAoKCgoKCmxvY2FsIGZ1bmN0aW9uIG11bChQLCBiaXRzKQogICAgbG9jYWwgbmFmID0gd05hZihiaXRzLCA1KQogICAgbG9jYWwgdGJsID0gV05BRlRhYmxlKFAsIDUpCiAgICBsb2NhbCBSID0gTwogICAgZm9yIGkgPSAjbmFmLCAxLCAtMSBkbwogICAgICAgIGxvY2FsIGIgPSBuYWZbaV0KICAgICAgICBpZiBiID09IDAgdGhlbgogICAgICAgICAgICBSID0gZG91YmxlKFIpCiAgICAgICAgZWxzZWlmIGIgPiAwIHRoZW4KICAgICAgICAgICAgUiA9IGFkZChSLCB0YmxbYl0pCiAgICAgICAgZWxzZQogICAgICAgICAgICBSID0gc3ViKFIsIHRibFstYl0pCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBSCmVuZAoKcmV0dXJuIHsKICAgIGRvdWJsZSA9IGRvdWJsZSwKICAgIGFkZCA9IGFkZCwKICAgIHN1YiA9IHN1YiwKICAgIG5pZWxzID0gbmllbHMsCiAgICBzY2FsZSA9IHNjYWxlLAogICAgZW5jb2RlID0gZW5jb2RlLAogICAgZGVjb2RlID0gZGVjb2RlLAogICAgbXVsRyA9IG11bEcsCiAgICBtdWwgPSBtdWwsCn0K";
  39.     ["ccryptolib.internal.fp"] = base64.decode "Cgpsb2NhbCBwYWNraW5nID0gcmVxdWlyZSAiY2NyeXB0b2xpYi5pbnRlcm5hbC5wYWNraW5nIgoKbG9jYWwgdW5wYWNrID0gdW5wYWNrIG9yIHRhYmxlLnVucGFjawpsb2NhbCB1ZnAsIGZtdGZwID0gcGFja2luZy5jb21waWxlVW5wYWNrKCI8STNJM0kySTNJM0kySTNJM0kySTNJM0kyIikKCgoKCgoKCgoKCmxvY2FsIEkgPSB7CiAgICAwOTU4NjQwICogMiBeIDAsCiAgICAwODI2NjY0ICogMiBeIDIyLAogICAgMTYxMzI1MSAqIDIgXiA0MywKICAgIDEwNDE1MjggKiAyIF4gNjQsCiAgICAwMDEzNjczICogMiBeIDg1LAogICAgMDM4NzE3MSAqIDIgXiAxMDcsCiAgICAxODI0Njc5ICogMiBeIDEyOCwKICAgIDAzMTM4MzkgKiAyIF4gMTQ5LAogICAgMDcwOTQ0MCAqIDIgXiAxNzAsCiAgICAwMTIyNjM1ICogMiBeIDE5MiwKICAgIDAyNjI3ODIgKiAyIF4gMjEzLAogICAgMDcxMjkwNSAqIDIgXiAyMzQsCn0KCgoKCmxvY2FsIGZ1bmN0aW9uIG51bShuKQogICAgcmV0dXJuIHtuLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQplbmQKCgoKCmxvY2FsIGZ1bmN0aW9uIG5lZyhhKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAsIGExMSA9IHVucGFjayhhKQogICAgcmV0dXJuIHsKICAgICAgICAtYTAwLAogICAgICAgIC1hMDEsCiAgICAgICAgLWEwMiwKICAgICAgICAtYTAzLAogICAgICAgIC1hMDQsCiAgICAgICAgLWEwNSwKICAgICAgICAtYTA2LAogICAgICAgIC1hMDcsCiAgICAgICAgLWEwOCwKICAgICAgICAtYTA5LAogICAgICAgIC1hMTAsCiAgICAgICAgLWExMSwKICAgIH0KZW5kCgoKCgoKbG9jYWwgZnVuY3Rpb24gYWRkKGEsIGIpCiAgICBsb2NhbCBhMDAsIGEwMSwgYTAyLCBhMDMsIGEwNCwgYTA1LCBhMDYsIGEwNywgYTA4LCBhMDksIGExMCwgYTExID0gdW5wYWNrKGEpCiAgICBsb2NhbCBiMDAsIGIwMSwgYjAyLCBiMDMsIGIwNCwgYjA1LCBiMDYsIGIwNywgYjA4LCBiMDksIGIxMCwgYjExID0gdW5wYWNrKGIpCiAgICByZXR1cm4gewogICAgICAgIGEwMCArIGIwMCwKICAgICAgICBhMDEgKyBiMDEsCiAgICAgICAgYTAyICsgYjAyLAogICAgICAgIGEwMyArIGIwMywKICAgICAgICBhMDQgKyBiMDQsCiAgICAgICAgYTA1ICsgYjA1LAogICAgICAgIGEwNiArIGIwNiwKICAgICAgICBhMDcgKyBiMDcsCiAgICAgICAgYTA4ICsgYjA4LAogICAgICAgIGEwOSArIGIwOSwKICAgICAgICBhMTAgKyBiMTAsCiAgICAgICAgYTExICsgYjExLAogICAgfQplbmQKCgoKCgpsb2NhbCBmdW5jdGlvbiBzdWIoYSwgYikKICAgIGxvY2FsIGEwMCwgYTAxLCBhMDIsIGEwMywgYTA0LCBhMDUsIGEwNiwgYTA3LCBhMDgsIGEwOSwgYTEwLCBhMTEgPSB1bnBhY2soYSkKICAgIGxvY2FsIGIwMCwgYjAxLCBiMDIsIGIwMywgYjA0LCBiMDUsIGIwNiwgYjA3LCBiMDgsIGIwOSwgYjEwLCBiMTEgPSB1bnBhY2soYikKICAgIHJldHVybiB7CiAgICAgICAgYTAwIC0gYjAwLAogICAgICAgIGEwMSAtIGIwMSwKICAgICAgICBhMDIgLSBiMDIsCiAgICAgICAgYTAzIC0gYjAzLAogICAgICAgIGEwNCAtIGIwNCwKICAgICAgICBhMDUgLSBiMDUsCiAgICAgICAgYTA2IC0gYjA2LAogICAgICAgIGEwNyAtIGIwNywKICAgICAgICBhMDggLSBiMDgsCiAgICAgICAgYTA5IC0gYjA5LAogICAgICAgIGExMCAtIGIxMCwKICAgICAgICBhMTEgLSBiMTEsCiAgICB9CmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gY2FycnkoYSkKICAgIGxvY2FsIGEwMCwgYTAxLCBhMDIsIGEwMywgYTA0LCBhMDUsIGEwNiwgYTA3LCBhMDgsIGEwOSwgYTEwLCBhMTEgPSB1bnBhY2soYSkKICAgIGxvY2FsIGMwMCwgYzAxLCBjMDIsIGMwMywgYzA0LCBjMDUsIGMwNiwgYzA3LCBjMDgsIGMwOSwgYzEwLCBjMTEKCiAgICBjMTEgPSBhMTEgKyAzICogMiBeIDMwNiAtIDMgKiAyIF4gMzA2ICBhMDAgPSBhMDAgKyAxOSAvIDIgXiAyNTUgKiBjMTEKCiAgICBjMDAgPSBhMDAgKyAzICogMiBeIDczICAtIDMgKiAyIF4gNzMgICBhMDEgPSBhMDEgKyBjMDAKICAgIGMwMSA9IGEwMSArIDMgKiAyIF4gOTQgIC0gMyAqIDIgXiA5NCAgIGEwMiA9IGEwMiArIGMwMQogICAgYzAyID0gYTAyICsgMyAqIDIgXiAxMTUgLSAzICogMiBeIDExNSAgYTAzID0gYTAzICsgYzAyCiAgICBjMDMgPSBhMDMgKyAzICogMiBeIDEzNiAtIDMgKiAyIF4gMTM2ICBhMDQgPSBhMDQgKyBjMDMKICAgIGMwNCA9IGEwNCArIDMgKiAyIF4gMTU4IC0gMyAqIDIgXiAxNTggIGEwNSA9IGEwNSArIGMwNAogICAgYzA1ID0gYTA1ICsgMyAqIDIgXiAxNzkgLSAzICogMiBeIDE3OSAgYTA2ID0gYTA2ICsgYzA1CiAgICBjMDYgPSBhMDYgKyAzICogMiBeIDIwMCAtIDMgKiAyIF4gMjAwICBhMDcgPSBhMDcgKyBjMDYKICAgIGMwNyA9IGEwNyArIDMgKiAyIF4gMjIxIC0gMyAqIDIgXiAyMjEgIGEwOCA9IGEwOCArIGMwNwogICAgYzA4ID0gYTA4ICsgMyAqIDIgXiAyNDMgLSAzICogMiBeIDI0MyAgYTA5ID0gYTA5ICsgYzA4CiAgICBjMDkgPSBhMDkgKyAzICogMiBeIDI2NCAtIDMgKiAyIF4gMjY0ICBhMTAgPSBhMTAgKyBjMDkKICAgIGMxMCA9IGExMCArIDMgKiAyIF4gMjg1IC0gMyAqIDIgXiAyODUgIGExMSA9IGExMSAtIGMxMSArIGMxMAoKICAgIGMxMSA9IGExMSArIDMgKiAyIF4gMzA2IC0gMyAqIDIgXiAzMDYKCiAgICByZXR1cm4gewogICAgICAgIGEwMCAtIGMwMCArIDE5IC8gMiBeIDI1NSAqIGMxMSwKICAgICAgICBhMDEgLSBjMDEsCiAgICAgICAgYTAyIC0gYzAyLAogICAgICAgIGEwMyAtIGMwMywKICAgICAgICBhMDQgLSBjMDQsCiAgICAgICAgYTA1IC0gYzA1LAogICAgICAgIGEwNiAtIGMwNiwKICAgICAgICBhMDcgLSBjMDcsCiAgICAgICAgYTA4IC0gYzA4LAogICAgICAgIGEwOSAtIGMwOSwKICAgICAgICBhMTAgLSBjMTAsCiAgICAgICAgYTExIC0gYzExLAogICAgfQplbmQKCgoKCgoKCgoKCmxvY2FsIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShhKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAsIGExMSA9IHVucGFjayhhKQogICAgbG9jYWwgYzAwLCBjMDEsIGMwMiwgYzAzLCBjMDQsIGMwNSwgYzA2LCBjMDcsIGMwOCwgYzA5LCBjMTAsIGMxMQoKICAgIAogICAgCiAgICBjMDAgPSBhMDAgJSAyIF4gMjIgICBhMDEgPSBhMDAgLSBjMDAgKyBhMDEKICAgIGMwMSA9IGEwMSAlIDIgXiA0MyAgIGEwMiA9IGEwMSAtIGMwMSArIGEwMgogICAgYzAyID0gYTAyICUgMiBeIDY0ICAgYTAzID0gYTAyIC0gYzAyICsgYTAzCiAgICBjMDMgPSBhMDMgJSAyIF4gODUgICBhMDQgPSBhMDMgLSBjMDMgKyBhMDQKICAgIGMwNCA9IGEwNCAlIDIgXiAxMDcgIGEwNSA9IGEwNCAtIGMwNCArIGEwNQogICAgYzA1ID0gYTA1ICUgMiBeIDEyOCAgYTA2ID0gYTA1IC0gYzA1ICsgYTA2CiAgICBjMDYgPSBhMDYgJSAyIF4gMTQ5ICBhMDcgPSBhMDYgLSBjMDYgKyBhMDcKICAgIGMwNyA9IGEwNyAlIDIgXiAxNzAgIGEwOCA9IGEwNyAtIGMwNyArIGEwOAogICAgYzA4ID0gYTA4ICUgMiBeIDE5MiAgYTA5ID0gYTA4IC0gYzA4ICsgYTA5CiAgICBjMDkgPSBhMDkgJSAyIF4gMjEzICBhMTAgPSBhMDkgLSBjMDkgKyBhMTAKICAgIGMxMCA9IGExMCAlIDIgXiAyMzQgIGExMSA9IGExMCAtIGMxMCArIGExMQogICAgYzExID0gYTExICUgMiBeIDI1NSAgYzAwID0gYzAwICsgMTkgLyAyIF4gMjU1ICogKGExMSAtIGMxMSkKCiAgICAKICAgIGlmICAgICAgYzExIC8gMiBeIDIzNCA9PSAyIF4gMjEgLSAxCiAgICAgICAgYW5kIGMxMCAvIDIgXiAyMTMgPT0gMiBeIDIxIC0gMQogICAgICAgIGFuZCBjMDkgLyAyIF4gMTkyID09IDIgXiAyMSAtIDEKICAgICAgICBhbmQgYzA4IC8gMiBeIDE3MCA9PSAyIF4gMjIgLSAxCiAgICAgICAgYW5kIGMwNyAvIDIgXiAxNDkgPT0gMiBeIDIxIC0gMQogICAgICAgIGFuZCBjMDYgLyAyIF4gMTI4ID09IDIgXiAyMSAtIDEKICAgICAgICBhbmQgYzA1IC8gMiBeIDEwNyA9PSAyIF4gMjEgLSAxCiAgICAgICAgYW5kIGMwNCAvIDIgXiA4NSAgPT0gMiBeIDIyIC0gMQogICAgICAgIGFuZCBjMDMgLyAyIF4gNjQgID09IDIgXiAyMSAtIDEKICAgICAgICBhbmQgYzAyIC8gMiBeIDQzICA9PSAyIF4gMjEgLSAxCiAgICAgICAgYW5kIGMwMSAvIDIgXiAyMiAgPT0gMiBeIDIxIC0gMQogICAgICAgIGFuZCBjMDAgPj0gMiBeIDIyIC0gMTkKICAgIHRoZW4KICAgICAgICByZXR1cm4gezE5IC0gMiBeIDIyICsgYzAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQogICAgZWxzZQogICAgICAgIHJldHVybiB7YzAwLCBjMDEsIGMwMiwgYzAzLCBjMDQsIGMwNSwgYzA2LCBjMDcsIGMwOCwgYzA5LCBjMTAsIGMxMX0KICAgIGVuZAplbmQKCgoKCgpsb2NhbCBmdW5jdGlvbiBlcShhLCBiKQogICAgbG9jYWwgYyA9IGNhbm9uaWNhbGl6ZShzdWIoYSwgYikpCiAgICBmb3IgaSA9IDEsIDEyIGRvIGlmIGNbaV0gfj0gMCB0aGVuIHJldHVybiBmYWxzZSBlbmQgZW5kCiAgICByZXR1cm4gdHJ1ZQplbmQKCgoKCgpsb2NhbCBmdW5jdGlvbiBtdWwoYSwgYikKICAgIGxvY2FsIGEwMCwgYTAxLCBhMDIsIGEwMywgYTA0LCBhMDUsIGEwNiwgYTA3LCBhMDgsIGEwOSwgYTEwLCBhMTEgPSB1bnBhY2soYSkKICAgIGxvY2FsIGIwMCwgYjAxLCBiMDIsIGIwMywgYjA0LCBiMDUsIGIwNiwgYjA3LCBiMDgsIGIwOSwgYjEwLCBiMTEgPSB1bnBhY2soYikKICAgIGxvY2FsIGMwMCwgYzAxLCBjMDIsIGMwMywgYzA0LCBjMDUsIGMwNiwgYzA3LCBjMDgsIGMwOSwgYzEwLCBjMTEKCiAgICAKICAgIGMwMCA9IGExMSAqIGIwMQogICAgICAgICsgYTEwICogYjAyCiAgICAgICAgKyBhMDkgKiBiMDMKICAgICAgICArIGEwOCAqIGIwNAogICAgICAgICsgYTA3ICogYjA1CiAgICAgICAgKyBhMDYgKiBiMDYKICAgICAgICArIGEwNSAqIGIwNwogICAgICAgICsgYTA0ICogYjA4CiAgICAgICAgKyBhMDMgKiBiMDkKICAgICAgICArIGEwMiAqIGIxMAogICAgICAgICsgYTAxICogYjExCiAgICBjMDEgPSBhMTEgKiBiMDIKICAgICAgICArIGExMCAqIGIwMwogICAgICAgICsgYTA5ICogYjA0CiAgICAgICAgKyBhMDggKiBiMDUKICAgICAgICArIGEwNyAqIGIwNgogICAgICAgICsgYTA2ICogYjA3CiAgICAgICAgKyBhMDUgKiBiMDgKICAgICAgICArIGEwNCAqIGIwOQogICAgICAgICsgYTAzICogYjEwCiAgICAgICAgKyBhMDIgKiBiMTEKICAgIGMwMiA9IGExMSAqIGIwMwogICAgICAgICsgYTEwICogYjA0CiAgICAgICAgKyBhMDkgKiBiMDUKICAgICAgICArIGEwOCAqIGIwNgogICAgICAgICsgYTA3ICogYjA3CiAgICAgICAgKyBhMDYgKiBiMDgKICAgICAgICArIGEwNSAqIGIwOQogICAgICAgICsgYTA0ICogYjEwCiAgICAgICAgKyBhMDMgKiBiMTEKICAgIGMwMyA9IGExMSAqIGIwNAogICAgICAgICsgYTEwICogYjA1CiAgICAgICAgKyBhMDkgKiBiMDYKICAgICAgICArIGEwOCAqIGIwNwogICAgICAgICsgYTA3ICogYjA4CiAgICAgICAgKyBhMDYgKiBiMDkKICAgICAgICArIGEwNSAqIGIxMAogICAgICAgICsgYTA0ICogYjExCiAgICBjMDQgPSBhMTEgKiBiMDUKICAgICAgICArIGExMCAqIGIwNgogICAgICAgICsgYTA5ICogYjA3CiAgICAgICAgKyBhMDggKiBiMDgKICAgICAgICArIGEwNyAqIGIwOQogICAgICAgICsgYTA2ICogYjEwCiAgICAgICAgKyBhMDUgKiBiMTEKICAgIGMwNSA9IGExMSAqIGIwNgogICAgICAgICsgYTEwICogYjA3CiAgICAgICAgKyBhMDkgKiBiMDgKICAgICAgICArIGEwOCAqIGIwOQogICAgICAgICsgYTA3ICogYjEwCiAgICAgICAgKyBhMDYgKiBiMTEKICAgIGMwNiA9IGExMSAqIGIwNwogICAgICAgICsgYTEwICogYjA4CiAgICAgICAgKyBhMDkgKiBiMDkKICAgICAgICArIGEwOCAqIGIxMAogICAgICAgICsgYTA3ICogYjExCiAgICBjMDcgPSBhMTEgKiBiMDgKICAgICAgICArIGExMCAqIGIwOQogICAgICAgICsgYTA5ICogYjEwCiAgICAgICAgKyBhMDggKiBiMTEKICAgIGMwOCA9IGExMSAqIGIwOQogICAgICAgICsgYTEwICogYjEwCiAgICAgICAgKyBhMDkgKiBiMTEKICAgIGMwOSA9IGExMSAqIGIxMAogICAgICAgICsgYTEwICogYjExCiAgICBjMTAgPSBhMTEgKiBiMTEKCiAgICAKICAgIGMwMCA9IGMwMCAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDAgKiBiMDAKICAgIGMwMSA9IGMwMSAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDEgKiBiMDAKICAgICAgICArIGEwMCAqIGIwMQogICAgYzAyID0gYzAyICogKDE5IC8gMiBeIDI1NSkKICAgICAgICArIGEwMiAqIGIwMAogICAgICAgICsgYTAxICogYjAxCiAgICAgICAgKyBhMDAgKiBiMDIKICAgIGMwMyA9IGMwMyAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDMgKiBiMDAKICAgICAgICArIGEwMiAqIGIwMQogICAgICAgICsgYTAxICogYjAyCiAgICAgICAgKyBhMDAgKiBiMDMKICAgIGMwNCA9IGMwNCAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDQgKiBiMDAKICAgICAgICArIGEwMyAqIGIwMQogICAgICAgICsgYTAyICogYjAyCiAgICAgICAgKyBhMDEgKiBiMDMKICAgICAgICArIGEwMCAqIGIwNAogICAgYzA1ID0gYzA1ICogKDE5IC8gMiBeIDI1NSkKICAgICAgICArIGEwNSAqIGIwMAogICAgICAgICsgYTA0ICogYjAxCiAgICAgICAgKyBhMDMgKiBiMDIKICAgICAgICArIGEwMiAqIGIwMwogICAgICAgICsgYTAxICogYjA0CiAgICAgICAgKyBhMDAgKiBiMDUKICAgIGMwNiA9IGMwNiAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDYgKiBiMDAKICAgICAgICArIGEwNSAqIGIwMQogICAgICAgICsgYTA0ICogYjAyCiAgICAgICAgKyBhMDMgKiBiMDMKICAgICAgICArIGEwMiAqIGIwNAogICAgICAgICsgYTAxICogYjA1CiAgICAgICAgKyBhMDAgKiBiMDYKICAgIGMwNyA9IGMwNyAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDcgKiBiMDAKICAgICAgICArIGEwNiAqIGIwMQogICAgICAgICsgYTA1ICogYjAyCiAgICAgICAgKyBhMDQgKiBiMDMKICAgICAgICArIGEwMyAqIGIwNAogICAgICAgICsgYTAyICogYjA1CiAgICAgICAgKyBhMDEgKiBiMDYKICAgICAgICArIGEwMCAqIGIwNwogICAgYzA4ID0gYzA4ICogKDE5IC8gMiBeIDI1NSkKICAgICAgICArIGEwOCAqIGIwMAogICAgICAgICsgYTA3ICogYjAxCiAgICAgICAgKyBhMDYgKiBiMDIKICAgICAgICArIGEwNSAqIGIwMwogICAgICAgICsgYTA0ICogYjA0CiAgICAgICAgKyBhMDMgKiBiMDUKICAgICAgICArIGEwMiAqIGIwNgogICAgICAgICsgYTAxICogYjA3CiAgICAgICAgKyBhMDAgKiBiMDgKICAgIGMwOSA9IGMwOSAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDkgKiBiMDAKICAgICAgICArIGEwOCAqIGIwMQogICAgICAgICsgYTA3ICogYjAyCiAgICAgICAgKyBhMDYgKiBiMDMKICAgICAgICArIGEwNSAqIGIwNAogICAgICAgICsgYTA0ICogYjA1CiAgICAgICAgKyBhMDMgKiBiMDYKICAgICAgICArIGEwMiAqIGIwNwogICAgICAgICsgYTAxICogYjA4CiAgICAgICAgKyBhMDAgKiBiMDkKICAgIGMxMCA9IGMxMCAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMTAgKiBiMDAKICAgICAgICArIGEwOSAqIGIwMQogICAgICAgICsgYTA4ICogYjAyCiAgICAgICAgKyBhMDcgKiBiMDMKICAgICAgICArIGEwNiAqIGIwNAogICAgICAgICsgYTA1ICogYjA1CiAgICAgICAgKyBhMDQgKiBiMDYKICAgICAgICArIGEwMyAqIGIwNwogICAgICAgICsgYTAyICogYjA4CiAgICAgICAgKyBhMDEgKiBiMDkKICAgICAgICArIGEwMCAqIGIxMAogICAgYzExID0gYTExICogYjAwCiAgICAgICAgKyBhMTAgKiBiMDEKICAgICAgICArIGEwOSAqIGIwMgogICAgICAgICsgYTA4ICogYjAzCiAgICAgICAgKyBhMDcgKiBiMDQKICAgICAgICArIGEwNiAqIGIwNQogICAgICAgICsgYTA1ICogYjA2CiAgICAgICAgKyBhMDQgKiBiMDcKICAgICAgICArIGEwMyAqIGIwOAogICAgICAgICsgYTAyICogYjA5CiAgICAgICAgKyBhMDEgKiBiMTAKICAgICAgICArIGEwMCAqIGIxMQoKICAgIAogICAgYTEwID0gYzEwICsgMyAqIDIgXiAyODUgLSAzICogMiBeIDI4NSAgYzExID0gYzExICsgYTEwCiAgICBhMTEgPSBjMTEgKyAzICogMiBeIDMwNiAtIDMgKiAyIF4gMzA2ICBjMDAgPSBjMDAgKyAxOSAvIDIgXiAyNTUgKiBhMTEKCiAgICBhMDAgPSBjMDAgKyAzICogMiBeIDczICAtIDMgKiAyIF4gNzMgICBjMDEgPSBjMDEgKyBhMDAKICAgIGEwMSA9IGMwMSArIDMgKiAyIF4gOTQgIC0gMyAqIDIgXiA5NCAgIGMwMiA9IGMwMiArIGEwMQogICAgYTAyID0gYzAyICsgMyAqIDIgXiAxMTUgLSAzICogMiBeIDExNSAgYzAzID0gYzAzICsgYTAyCiAgICBhMDMgPSBjMDMgKyAzICogMiBeIDEzNiAtIDMgKiAyIF4gMTM2ICBjMDQgPSBjMDQgKyBhMDMKICAgIGEwNCA9IGMwNCArIDMgKiAyIF4gMTU4IC0gMyAqIDIgXiAxNTggIGMwNSA9IGMwNSArIGEwNAogICAgYTA1ID0gYzA1ICsgMyAqIDIgXiAxNzkgLSAzICogMiBeIDE3OSAgYzA2ID0gYzA2ICsgYTA1CiAgICBhMDYgPSBjMDYgKyAzICogMiBeIDIwMCAtIDMgKiAyIF4gMjAwICBjMDcgPSBjMDcgKyBhMDYKICAgIGEwNyA9IGMwNyArIDMgKiAyIF4gMjIxIC0gMyAqIDIgXiAyMjEgIGMwOCA9IGMwOCArIGEwNwogICAgYTA4ID0gYzA4ICsgMyAqIDIgXiAyNDMgLSAzICogMiBeIDI0MyAgYzA5ID0gYzA5ICsgYTA4CiAgICBhMDkgPSBjMDkgKyAzICogMiBeIDI2NCAtIDMgKiAyIF4gMjY0ICBjMTAgPSBjMTAgLSBhMTAgKyBhMDkKICAgIGExMCA9IGMxMCArIDMgKiAyIF4gMjg1IC0gMyAqIDIgXiAyODUgIGMxMSA9IGMxMSAtIGExMSArIGExMAoKICAgIGExMSA9IGMxMSArIDMgKiAyIF4gMzA2IC0gMyAqIDIgXiAzMDYKCiAgICByZXR1cm4gewogICAgICAgIGMwMCAtIGEwMCArIDE5IC8gMiBeIDI1NSAqIGExMSwKICAgICAgICBjMDEgLSBhMDEsCiAgICAgICAgYzAyIC0gYTAyLAogICAgICAgIGMwMyAtIGEwMywKICAgICAgICBjMDQgLSBhMDQsCiAgICAgICAgYzA1IC0gYTA1LAogICAgICAgIGMwNiAtIGEwNiwKICAgICAgICBjMDcgLSBhMDcsCiAgICAgICAgYzA4IC0gYTA4LAogICAgICAgIGMwOSAtIGEwOSwKICAgICAgICBjMTAgLSBhMTAsCiAgICAgICAgYzExIC0gYTExLAogICAgfQplbmQKCgoKCmxvY2FsIGZ1bmN0aW9uIHNxdWFyZShhKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAsIGExMSA9IHVucGFjayhhKQogICAgbG9jYWwgZDAwLCBkMDEsIGQwMiwgZDAzLCBkMDQsIGQwNSwgZDA2LCBkMDcsIGQwOCwgZDA5LCBkMTAKICAgIGxvY2FsIGMwMCwgYzAxLCBjMDIsIGMwMywgYzA0LCBjMDUsIGMwNiwgYzA3LCBjMDgsIGMwOSwgYzEwLCBjMTEKCiAgICAKICAgIGQwMCA9IGEwMCArIGEwMAogICAgZDAxID0gYTAxICsgYTAxCiAgICBkMDIgPSBhMDIgKyBhMDIKICAgIGQwMyA9IGEwMyArIGEwMwogICAgZDA0ID0gYTA0ICsgYTA0CiAgICBkMDUgPSBhMDUgKyBhMDUKICAgIGQwNiA9IGEwNiArIGEwNgogICAgZDA3ID0gYTA3ICsgYTA3CiAgICBkMDggPSBhMDggKyBhMDgKICAgIGQwOSA9IGEwOSArIGEwOQogICAgZDEwID0gYTEwICsgYTEwCgogICAgCiAgICBjMDAgPSBhMTEgKiBkMDEKICAgICAgICArIGExMCAqIGQwMgogICAgICAgICsgYTA5ICogZDAzCiAgICAgICAgKyBhMDggKiBkMDQKICAgICAgICArIGEwNyAqIGQwNQogICAgICAgICsgYTA2ICogYTA2CiAgICBjMDEgPSBhMTEgKiBkMDIKICAgICAgICArIGExMCAqIGQwMwogICAgICAgICsgYTA5ICogZDA0CiAgICAgICAgKyBhMDggKiBkMDUKICAgICAgICArIGEwNyAqIGQwNgogICAgYzAyID0gYTExICogZDAzCiAgICAgICAgKyBhMTAgKiBkMDQKICAgICAgICArIGEwOSAqIGQwNQogICAgICAgICsgYTA4ICogZDA2CiAgICAgICAgKyBhMDcgKiBhMDcKICAgIGMwMyA9IGExMSAqIGQwNAogICAgICAgICsgYTEwICogZDA1CiAgICAgICAgKyBhMDkgKiBkMDYKICAgICAgICArIGEwOCAqIGQwNwogICAgYzA0ID0gYTExICogZDA1CiAgICAgICAgKyBhMTAgKiBkMDYKICAgICAgICArIGEwOSAqIGQwNwogICAgICAgICsgYTA4ICogYTA4CiAgICBjMDUgPSBhMTEgKiBkMDYKICAgICAgICArIGExMCAqIGQwNwogICAgICAgICsgYTA5ICogZDA4CiAgICBjMDYgPSBhMTEgKiBkMDcKICAgICAgICArIGExMCAqIGQwOAogICAgICAgICsgYTA5ICogYTA5CiAgICBjMDcgPSBhMTEgKiBkMDgKICAgICAgICArIGExMCAqIGQwOQogICAgYzA4ID0gYTExICogZDA5CiAgICAgICAgKyBhMTAgKiBhMTAKICAgIGMwOSA9IGExMSAqIGQxMAogICAgYzEwID0gYTExICogYTExCgogICAgCiAgICBjMDAgPSBjMDAgKiAoMTkgLyAyIF4gMjU1KQogICAgICAgICsgYTAwICogYTAwCiAgICBjMDEgPSBjMDEgKiAoMTkgLyAyIF4gMjU1KQogICAgICAgICsgYTAxICogZDAwCiAgICBjMDIgPSBjMDIgKiAoMTkgLyAyIF4gMjU1KQogICAgICAgICsgYTAyICogZDAwCiAgICAgICAgKyBhMDEgKiBhMDEKICAgIGMwMyA9IGMwMyAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDMgKiBkMDAKICAgICAgICArIGEwMiAqIGQwMQogICAgYzA0ID0gYzA0ICogKDE5IC8gMiBeIDI1NSkKICAgICAgICArIGEwNCAqIGQwMAogICAgICAgICsgYTAzICogZDAxCiAgICAgICAgKyBhMDIgKiBhMDIKICAgIGMwNSA9IGMwNSAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDUgKiBkMDAKICAgICAgICArIGEwNCAqIGQwMQogICAgICAgICsgYTAzICogZDAyCiAgICBjMDYgPSBjMDYgKiAoMTkgLyAyIF4gMjU1KQogICAgICAgICsgYTA2ICogZDAwCiAgICAgICAgKyBhMDUgKiBkMDEKICAgICAgICArIGEwNCAqIGQwMgogICAgICAgICsgYTAzICogYTAzCiAgICBjMDcgPSBjMDcgKiAoMTkgLyAyIF4gMjU1KQogICAgICAgICsgYTA3ICogZDAwCiAgICAgICAgKyBhMDYgKiBkMDEKICAgICAgICArIGEwNSAqIGQwMgogICAgICAgICsgYTA0ICogZDAzCiAgICBjMDggPSBjMDggKiAoMTkgLyAyIF4gMjU1KQogICAgICAgICsgYTA4ICogZDAwCiAgICAgICAgKyBhMDcgKiBkMDEKICAgICAgICArIGEwNiAqIGQwMgogICAgICAgICsgYTA1ICogZDAzCiAgICAgICAgKyBhMDQgKiBhMDQKICAgIGMwOSA9IGMwOSAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDkgKiBkMDAKICAgICAgICArIGEwOCAqIGQwMQogICAgICAgICsgYTA3ICogZDAyCiAgICAgICAgKyBhMDYgKiBkMDMKICAgICAgICArIGEwNSAqIGQwNAogICAgYzEwID0gYzEwICogKDE5IC8gMiBeIDI1NSkKICAgICAgICArIGExMCAqIGQwMAogICAgICAgICsgYTA5ICogZDAxCiAgICAgICAgKyBhMDggKiBkMDIKICAgICAgICArIGEwNyAqIGQwMwogICAgICAgICsgYTA2ICogZDA0CiAgICAgICAgKyBhMDUgKiBhMDUKICAgIGMxMSA9IGExMSAqIGQwMAogICAgICAgICsgYTEwICogZDAxCiAgICAgICAgKyBhMDkgKiBkMDIKICAgICAgICArIGEwOCAqIGQwMwogICAgICAgICsgYTA3ICogZDA0CiAgICAgICAgKyBhMDYgKiBkMDUKCiAgICAKICAgIGExMCA9IGMxMCArIDMgKiAyIF4gMjg1IC0gMyAqIDIgXiAyODUgIGMxMSA9IGMxMSArIGExMAogICAgYTExID0gYzExICsgMyAqIDIgXiAzMDYgLSAzICogMiBeIDMwNiAgYzAwID0gYzAwICsgMTkgLyAyIF4gMjU1ICogYTExCgogICAgYTAwID0gYzAwICsgMyAqIDIgXiA3MyAgLSAzICogMiBeIDczICAgYzAxID0gYzAxICsgYTAwCiAgICBhMDEgPSBjMDEgKyAzICogMiBeIDk0ICAtIDMgKiAyIF4gOTQgICBjMDIgPSBjMDIgKyBhMDEKICAgIGEwMiA9IGMwMiArIDMgKiAyIF4gMTE1IC0gMyAqIDIgXiAxMTUgIGMwMyA9IGMwMyArIGEwMgogICAgYTAzID0gYzAzICsgMyAqIDIgXiAxMzYgLSAzICogMiBeIDEzNiAgYzA0ID0gYzA0ICsgYTAzCiAgICBhMDQgPSBjMDQgKyAzICogMiBeIDE1OCAtIDMgKiAyIF4gMTU4ICBjMDUgPSBjMDUgKyBhMDQKICAgIGEwNSA9IGMwNSArIDMgKiAyIF4gMTc5IC0gMyAqIDIgXiAxNzkgIGMwNiA9IGMwNiArIGEwNQogICAgYTA2ID0gYzA2ICsgMyAqIDIgXiAyMDAgLSAzICogMiBeIDIwMCAgYzA3ID0gYzA3ICsgYTA2CiAgICBhMDcgPSBjMDcgKyAzICogMiBeIDIyMSAtIDMgKiAyIF4gMjIxICBjMDggPSBjMDggKyBhMDcKICAgIGEwOCA9IGMwOCArIDMgKiAyIF4gMjQzIC0gMyAqIDIgXiAyNDMgIGMwOSA9IGMwOSArIGEwOAogICAgYTA5ID0gYzA5ICsgMyAqIDIgXiAyNjQgLSAzICogMiBeIDI2NCAgYzEwID0gYzEwIC0gYTEwICsgYTA5CiAgICBhMTAgPSBjMTAgKyAzICogMiBeIDI4NSAtIDMgKiAyIF4gMjg1ICBjMTEgPSBjMTEgLSBhMTEgKyBhMTAKCiAgICBhMTEgPSBjMTEgKyAzICogMiBeIDMwNiAtIDMgKiAyIF4gMzA2CgogICAgcmV0dXJuIHsKICAgICAgICBjMDAgLSBhMDAgKyAxOSAvIDIgXiAyNTUgKiBhMTEsCiAgICAgICAgYzAxIC0gYTAxLAogICAgICAgIGMwMiAtIGEwMiwKICAgICAgICBjMDMgLSBhMDMsCiAgICAgICAgYzA0IC0gYTA0LAogICAgICAgIGMwNSAtIGEwNSwKICAgICAgICBjMDYgLSBhMDYsCiAgICAgICAgYzA3IC0gYTA3LAogICAgICAgIGMwOCAtIGEwOCwKICAgICAgICBjMDkgLSBhMDksCiAgICAgICAgYzEwIC0gYTEwLAogICAgICAgIGMxMSAtIGExMSwKICAgIH0KZW5kCgoKCgoKbG9jYWwgZnVuY3Rpb24ga211bChhLCBrKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAsIGExMSA9IHVucGFjayhhKQogICAgbG9jYWwgYzAwLCBjMDEsIGMwMiwgYzAzLCBjMDQsIGMwNSwgYzA2LCBjMDcsIGMwOCwgYzA5LCBjMTAsIGMxMQoKICAgIAogICAgYTAwID0gYTAwICogawogICAgYTAxID0gYTAxICogawogICAgYTAyID0gYTAyICogawogICAgYTAzID0gYTAzICogawogICAgYTA0ID0gYTA0ICogawogICAgYTA1ID0gYTA1ICogawogICAgYTA2ID0gYTA2ICogawogICAgYTA3ID0gYTA3ICogawogICAgYTA4ID0gYTA4ICogawogICAgYTA5ID0gYTA5ICogawogICAgYTEwID0gYTEwICogawogICAgYTExID0gYTExICogawoKICAgIGMxMSA9IGExMSArIDMgKiAyIF4gMzA2IC0gMyAqIDIgXiAzMDYgIGEwMCA9IGEwMCArIDE5IC8gMiBeIDI1NSAqIGMxMQoKICAgIGMwMCA9IGEwMCArIDMgKiAyIF4gNzMgIC0gMyAqIDIgXiA3MyAgIGEwMSA9IGEwMSArIGMwMAogICAgYzAxID0gYTAxICsgMyAqIDIgXiA5NCAgLSAzICogMiBeIDk0ICAgYTAyID0gYTAyICsgYzAxCiAgICBjMDIgPSBhMDIgKyAzICogMiBeIDExNSAtIDMgKiAyIF4gMTE1ICBhMDMgPSBhMDMgKyBjMDIKICAgIGMwMyA9IGEwMyArIDMgKiAyIF4gMTM2IC0gMyAqIDIgXiAxMzYgIGEwNCA9IGEwNCArIGMwMwogICAgYzA0ID0gYTA0ICsgMyAqIDIgXiAxNTggLSAzICogMiBeIDE1OCAgYTA1ID0gYTA1ICsgYzA0CiAgICBjMDUgPSBhMDUgKyAzICogMiBeIDE3OSAtIDMgKiAyIF4gMTc5ICBhMDYgPSBhMDYgKyBjMDUKICAgIGMwNiA9IGEwNiArIDMgKiAyIF4gMjAwIC0gMyAqIDIgXiAyMDAgIGEwNyA9IGEwNyArIGMwNgogICAgYzA3ID0gYTA3ICsgMyAqIDIgXiAyMjEgLSAzICogMiBeIDIyMSAgYTA4ID0gYTA4ICsgYzA3CiAgICBjMDggPSBhMDggKyAzICogMiBeIDI0MyAtIDMgKiAyIF4gMjQzICBhMDkgPSBhMDkgKyBjMDgKICAgIGMwOSA9IGEwOSArIDMgKiAyIF4gMjY0IC0gMyAqIDIgXiAyNjQgIGExMCA9IGExMCArIGMwOQogICAgYzEwID0gYTEwICsgMyAqIDIgXiAyODUgLSAzICogMiBeIDI4NSAgYTExID0gYTExIC0gYzExICsgYzEwCgogICAgYzExID0gYTExICsgMyAqIDIgXiAzMDYgLSAzICogMiBeIDMwNgoKICAgIHJldHVybiB7CiAgICAgICAgYTAwIC0gYzAwICsgMTkgLyAyIF4gMjU1ICogYzExLAogICAgICAgIGEwMSAtIGMwMSwKICAgICAgICBhMDIgLSBjMDIsCiAgICAgICAgYTAzIC0gYzAzLAogICAgICAgIGEwNCAtIGMwNCwKICAgICAgICBhMDUgLSBjMDUsCiAgICAgICAgYTA2IC0gYzA2LAogICAgICAgIGEwNyAtIGMwNywKICAgICAgICBhMDggLSBjMDgsCiAgICAgICAgYTA5IC0gYzA5LAogICAgICAgIGExMCAtIGMxMCwKICAgICAgICBhMTEgLSBjMTEKICAgIH0KZW5kCgoKCgoKbG9jYWwgZnVuY3Rpb24gbnNxdWFyZShhLCBuKQogICAgZm9yIF8gPSAxLCBuIGRvIGEgPSBzcXVhcmUoYSkgZW5kCiAgICByZXR1cm4gYQplbmQKCgoKCgoKCmxvY2FsIGZ1bmN0aW9uIGludmVydChhKQogICAgbG9jYWwgYTIgPSBzcXVhcmUoYSkKICAgIGxvY2FsIGE5ID0gbXVsKGEsIG5zcXVhcmUoYTIsIDIpKQogICAgbG9jYWwgYTExID0gbXVsKGE5LCBhMikKCiAgICBsb2NhbCB4NSA9IG11bChzcXVhcmUoYTExKSwgYTkpCiAgICBsb2NhbCB4MTAgPSBtdWwobnNxdWFyZSh4NSwgNSksIHg1KQogICAgbG9jYWwgeDIwID0gbXVsKG5zcXVhcmUoeDEwLCAxMCksIHgxMCkKICAgIGxvY2FsIHg0MCA9IG11bChuc3F1YXJlKHgyMCwgMjApLCB4MjApCiAgICBsb2NhbCB4NTAgPSBtdWwobnNxdWFyZSh4NDAsIDEwKSwgeDEwKQogICAgbG9jYWwgeDEwMCA9IG11bChuc3F1YXJlKHg1MCwgNTApLCB4NTApCiAgICBsb2NhbCB4MjAwID0gbXVsKG5zcXVhcmUoeDEwMCwgMTAwKSwgeDEwMCkKICAgIGxvY2FsIHgyNTAgPSBtdWwobnNxdWFyZSh4MjAwLCA1MCksIHg1MCkKCiAgICByZXR1cm4gbXVsKG5zcXVhcmUoeDI1MCwgNSksIGExMSkKZW5kCgoKCgoKCgoKbG9jYWwgZnVuY3Rpb24gc3FydERpdih1LCB2KQogICAgdSA9IGNhcnJ5KHUpCgogICAgbG9jYWwgdjIgPSBzcXVhcmUodikKICAgIGxvY2FsIHYzID0gbXVsKHYsIHYyKQogICAgbG9jYWwgdjYgPSBzcXVhcmUodjMpCiAgICBsb2NhbCB2NyA9IG11bCh2LCB2NikKICAgIGxvY2FsIHV2NyA9IG11bCh1LCB2NykKCiAgICBsb2NhbCB4MiA9IG11bChzcXVhcmUodXY3KSwgdXY3KQogICAgbG9jYWwgeDQgPSBtdWwobnNxdWFyZSh4MiwgMiksIHgyKQogICAgbG9jYWwgeDggPSBtdWwobnNxdWFyZSh4NCwgNCksIHg0KQogICAgbG9jYWwgeDE2ID0gbXVsKG5zcXVhcmUoeDgsIDgpLCB4OCkKICAgIGxvY2FsIHgxOCA9IG11bChuc3F1YXJlKHgxNiwgMiksIHgyKQogICAgbG9jYWwgeDMyID0gbXVsKG5zcXVhcmUoeDE2LCAxNiksIHgxNikKICAgIGxvY2FsIHg1MCA9IG11bChuc3F1YXJlKHgzMiwgMTgpLCB4MTgpCiAgICBsb2NhbCB4MTAwID0gbXVsKG5zcXVhcmUoeDUwLCA1MCksIHg1MCkKICAgIGxvY2FsIHgyMDAgPSBtdWwobnNxdWFyZSh4MTAwLCAxMDApLCB4MTAwKQogICAgbG9jYWwgeDI1MCA9IG11bChuc3F1YXJlKHgyMDAsIDUwKSwgeDUwKQogICAgbG9jYWwgcHIgPSBtdWwobnNxdWFyZSh4MjUwLCAyKSwgdXY3KQoKICAgIGxvY2FsIHV2MyA9IG11bCh1LCB2MykKICAgIGxvY2FsIGIgPSBtdWwodXYzLCBwcikKICAgIGxvY2FsIGIyID0gc3F1YXJlKGIpCiAgICBsb2NhbCB2YjIgPSBtdWwodiwgYjIpCgogICAgaWYgbm90IGVxKHZiMiwgdSkgdGhlbgogICAgICAgIAogICAgICAgIGIgPSBtdWwoYiwgSSkKICAgICAgICBiMiA9IHNxdWFyZShiKQogICAgICAgIHZiMiA9IG11bCh2LCBiMikKICAgIGVuZAoKICAgIGlmIGVxKHZiMiwgdSkgdGhlbgogICAgICAgIHJldHVybiBiCiAgICBlbHNlCiAgICAgICAgcmV0dXJuIG5pbAogICAgZW5kCmVuZAoKCgoKCgpsb2NhbCBmdW5jdGlvbiBlbmNvZGUoYSkKICAgIGEgPSBjYW5vbmljYWxpemUoYSkKICAgIGxvY2FsIGEwMCwgYTAxLCBhMDIsIGEwMywgYTA0LCBhMDUsIGEwNiwgYTA3LCBhMDgsIGEwOSwgYTEwLCBhMTEgPSB1bnBhY2soYSkKCiAgICBsb2NhbCBieXRlcyA9IHt9CiAgICBsb2NhbCBhY2MgPSBhMDAKCiAgICBsb2NhbCBmdW5jdGlvbiBwdXRCeXRlcyhuKQogICAgICAgIGZvciBfID0gMSwgbiBkbwogICAgICAgICAgICBsb2NhbCBieXRlID0gYWNjICUgMjU2CiAgICAgICAgICAgIGJ5dGVzWyNieXRlcyArIDFdID0gYnl0ZQogICAgICAgICAgICBhY2MgPSAoYWNjIC0gYnl0ZSkgLyAyNTYKICAgICAgICBlbmQKICAgIGVuZAoKICAgIHB1dEJ5dGVzKDIpIGFjYyA9IGFjYyArIGEwMSAvIDIgXiAxNgogICAgcHV0Qnl0ZXMoMykgYWNjID0gYWNjICsgYTAyIC8gMiBeIDQwCiAgICBwdXRCeXRlcygzKSBhY2MgPSBhY2MgKyBhMDMgLyAyIF4gNjQKICAgIHB1dEJ5dGVzKDIpIGFjYyA9IGFjYyArIGEwNCAvIDIgXiA4MAogICAgcHV0Qnl0ZXMoMykgYWNjID0gYWNjICsgYTA1IC8gMiBeIDEwNAogICAgcHV0Qnl0ZXMoMykgYWNjID0gYWNjICsgYTA2IC8gMiBeIDEyOAogICAgcHV0Qnl0ZXMoMikgYWNjID0gYWNjICsgYTA3IC8gMiBeIDE0NAogICAgcHV0Qnl0ZXMoMykgYWNjID0gYWNjICsgYTA4IC8gMiBeIDE2OAogICAgcHV0Qnl0ZXMoMykgYWNjID0gYWNjICsgYTA5IC8gMiBeIDE5MgogICAgcHV0Qnl0ZXMoMikgYWNjID0gYWNjICsgYTEwIC8gMiBeIDIwOAogICAgcHV0Qnl0ZXMoMykgYWNjID0gYWNjICsgYTExIC8gMiBeIDIzMgogICAgcHV0Qnl0ZXMoMykKCiAgICByZXR1cm4gc3RyaW5nLmNoYXIodW5wYWNrKGJ5dGVzKSkgCmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gZGVjb2RlKGIpCiAgICBsb2NhbCB3MDAsIHcwMSwgdzAyLCB3MDMsIHcwNCwgdzA1LCB3MDYsIHcwNywgdzA4LCB3MDksIHcxMCwgdzExID0KICAgICAgICB1ZnAoZm10ZnAsIGIsIDEpCgogICAgdzExID0gdzExICUgMiBeIDE1CgogICAgcmV0dXJuIGNhcnJ5IHsKICAgICAgICB3MDAsCiAgICAgICAgdzAxICogMiBeIDI0LAogICAgICAgIHcwMiAqIDIgXiA0OCwKICAgICAgICB3MDMgKiAyIF4gNjQsCiAgICAgICAgdzA0ICogMiBeIDg4LAogICAgICAgIHcwNSAqIDIgXiAxMTIsCiAgICAgICAgdzA2ICogMiBeIDEyOCwKICAgICAgICB3MDcgKiAyIF4gMTUyLAogICAgICAgIHcwOCAqIDIgXiAxNzYsCiAgICAgICAgdzA5ICogMiBeIDE5MiwKICAgICAgICB3MTAgKiAyIF4gMjE2LAogICAgICAgIHcxMSAqIDIgXiAyNDAsCiAgICB9CmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gZXF6KGEpCiAgICBsb2NhbCBjID0gY2Fub25pY2FsaXplKGEpCiAgICBsb2NhbCBjMDAsIGMwMSwgYzAyLCBjMDMsIGMwNCwgYzA1LCBjMDYsIGMwNywgYzA4LCBjMDksIGMxMCwgYzExID0gdW5wYWNrKGMpCiAgICByZXR1cm4gYzAwICsgYzAxICsgYzAyICsgYzAzICsgYzA0ICsgYzA1ICsgYzA2ICsgYzA3ICsgYzA4ICsgYzA5ICsgYzEwICsgYzExCiAgICAgICAgPT0gMAplbmQKCnJldHVybiB7CiAgICBudW0gPSBudW0sCiAgICBuZWcgPSBuZWcsCiAgICBhZGQgPSBhZGQsCiAgICBzdWIgPSBzdWIsCiAgICBrbXVsID0ga211bCwKICAgIG11bCA9IG11bCwKICAgIGNhbm9uaWNhbGl6ZSA9IGNhbm9uaWNhbGl6ZSwKICAgIHNxdWFyZSA9IHNxdWFyZSwKICAgIGNhcnJ5ID0gY2FycnksCiAgICBpbnZlcnQgPSBpbnZlcnQsCiAgICBzcXJ0RGl2ID0gc3FydERpdiwKICAgIGVuY29kZSA9IGVuY29kZSwKICAgIGRlY29kZSA9IGRlY29kZSwKICAgIGVxeiA9IGVxeiwKfQo=";
  40.     ["ccryptolib.ed25519"] = base64.decode "Cgpsb2NhbCBleHBlY3QgPSByZXF1aXJlICJjYy5leHBlY3QiLmV4cGVjdApsb2NhbCBsYXNzZXJ0ID0gcmVxdWlyZSAiY2NyeXB0b2xpYi5pbnRlcm5hbC51dGlsIi5sYXNzZXJ0CmxvY2FsIGZxICAgICA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwuZnEiCmxvY2FsIHNoYTUxMiA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwuc2hhNTEyIgpsb2NhbCBlZCAgICAgPSByZXF1aXJlICJjY3J5cHRvbGliLmludGVybmFsLmVkd2FyZHMyNTUxOSIKbG9jYWwgcmFuZG9tID0gcmVxdWlyZSAiY2NyeXB0b2xpYi5yYW5kb20iCgoKCgpsb2NhbCBmdW5jdGlvbiBwdWJsaWNLZXkoc2spCiAgICBleHBlY3QoMSwgc2ssICJzdHJpbmciKQogICAgYXNzZXJ0KCNzayA9PSAzMiwgInNlY3JldCBrZXkgbGVuZ3RoIG11c3QgYmUgMzIiKQoKICAgIGxvY2FsIGggPSBzaGE1MTIuZGlnZXN0KHNrKQogICAgbG9jYWwgeCA9IGZxLmRlY29kZUNsYW1wZWQoaDpzdWIoMSwgMzIpKQoKICAgIHJldHVybiBlZC5lbmNvZGUoZWQubXVsRyhmcS5iaXRzKHgpKSkKZW5kCgoKCgoKCmxvY2FsIGZ1bmN0aW9uIHNpZ24oc2ssIHBrLCBtc2cpCiAgICBleHBlY3QoMSwgc2ssICJzdHJpbmciKQogICAgbGFzc2VydCgjc2sgPT0gMzIsICJzZWNyZXQga2V5IGxlbmd0aCBtdXN0IGJlIDMyIiwgMikKICAgIGV4cGVjdCgyLCBwaywgInN0cmluZyIpCiAgICBsYXNzZXJ0KCNwayA9PSAzMiwgInB1YmxpYyBrZXkgbGVuZ3RoIG11c3QgYmUgMzIiLCAyKQogICAgZXhwZWN0KDMsIG1zZywgInN0cmluZyIpCgogICAgCiAgICBsb2NhbCBoID0gc2hhNTEyLmRpZ2VzdChzaykKICAgIGxvY2FsIHggPSBmcS5kZWNvZGVDbGFtcGVkKGg6c3ViKDEsIDMyKSkKCiAgICAKICAgIGxvY2FsIGsgPSBmcS5kZWNvZGVXaWRlKHJhbmRvbS5yYW5kb20oNjQpKQogICAgbG9jYWwgciA9IGVkLm11bEcoZnEuYml0cyhrKSkKICAgIGxvY2FsIHJTdHIgPSBlZC5lbmNvZGUocikKCiAgICAKICAgIGxvY2FsIGUgPSBmcS5kZWNvZGVXaWRlKHNoYTUxMi5kaWdlc3QoclN0ciAuLiBwayAuLiBtc2cpKQoKICAgIAogICAgbG9jYWwgbSA9IGZxLmRlY29kZVdpZGUocmFuZG9tLnJhbmRvbSg2NCkpCiAgICBsb2NhbCBzID0gZnEuc3ViKGZxLmFkZChrLCBmcS5tdWwoZnEuYWRkKHgsIG0pLCBlKSksIGZxLm11bChtLCBlKSkKICAgIGxvY2FsIHNTdHIgPSBmcS5lbmNvZGUocykKCiAgICByZXR1cm4gclN0ciAuLiBzU3RyCmVuZAoKCgoKCgpsb2NhbCBmdW5jdGlvbiB2ZXJpZnkocGssIG1zZywgc2lnKQogICAgZXhwZWN0KDEsIHBrLCAic3RyaW5nIikKICAgIGxhc3NlcnQoI3BrID09IDMyLCAicHVibGljIGtleSBsZW5ndGggbXVzdCBiZSAzMiIsIDIpIAogICAgZXhwZWN0KDIsIG1zZywgInN0cmluZyIpCiAgICBleHBlY3QoMywgc2lnLCAic3RyaW5nIikKICAgIGxhc3NlcnQoI3NpZyA9PSA2NCwgInNpZ25hdHVyZSBsZW5ndGggbXVzdCBiZSA2NCIsIDIpCgogICAgbG9jYWwgeSA9IGVkLmRlY29kZShwaykKICAgIGlmIG5vdCB5IHRoZW4gcmV0dXJuIGZhbHNlIGVuZAoKICAgIGxvY2FsIHJTdHIgPSBzaWc6c3ViKDEsIDMyKQogICAgbG9jYWwgc1N0ciA9IHNpZzpzdWIoMzMpCgogICAgbG9jYWwgZSA9IGZxLmRlY29kZVdpZGUoc2hhNTEyLmRpZ2VzdChyU3RyIC4uIHBrIC4uIG1zZykpCgogICAgbG9jYWwgZ3MgPSBlZC5tdWxHKGZxLmJpdHMoZnEuZGVjb2RlKHNTdHIpKSkKICAgIGxvY2FsIHllID0gZWQubXVsKHksIGZxLmJpdHMoZSkpCiAgICBsb2NhbCBydiA9IGVkLnN1YihncywgZWQubmllbHMoeWUpKQoKICAgIHJldHVybiBlZC5lbmNvZGUocnYpID09IHJTdHIKZW5kCgpyZXR1cm4gewogICAgcHVibGljS2V5ID0gcHVibGljS2V5LAogICAgc2lnbiA9IHNpZ24sCiAgICB2ZXJpZnkgPSB2ZXJpZnksCn0K";
  41.     ["ccryptolib.internal.packing"] = base64.decode "CgoKCgoKCmxvY2FsIGZtdCA9IHN0cmluZy5mb3JtYXQKCmxvY2FsIGZ1bmN0aW9uIG1rUGFjayh3b3JkcywgQkUpCiAgICBsb2NhbCBvdXQgPSAibG9jYWwgQz1zdHJpbmcuY2hhciByZXR1cm4gZnVuY3Rpb24oXywiCiAgICBsb2NhbCBuYiA9IDAKICAgIGZvciBpID0gMSwgI3dvcmRzIGRvCiAgICAgICAgb3V0ID0gb3V0IC4uIGZtdCgibiVkLCIsIGkpCiAgICAgICAgbmIgPSBuYiArIHdvcmRzW2ldCiAgICBlbmQKICAgIG91dCA9IG91dDpzdWIoMSwgLTIpIC4uICIpbG9jYWwgIgogICAgZm9yIGkgPSAxLCBuYiBkbwogICAgICAgIG91dCA9IG91dCAuLiBmbXQoImIlZCwiLCBpKQogICAgZW5kCiAgICBvdXQgPSBvdXQ6c3ViKDEsIC0yKSAuLiAiICIKICAgIGxvY2FsIGJpID0gMQogICAgZm9yIGkgPSAxLCAjd29yZHMgZG8KICAgICAgICBmb3IgXyA9IDEsIHdvcmRzW2ldIC0gMSBkbwogICAgICAgICAgICBvdXQgPSBvdXQgLi4gZm10KCJiJWQ9biVkJSUyXjggbiVkPShuJWQtYiVkKSoyXi04ICIsIGJpLCBpLCBpLCBpLCBiaSkKICAgICAgICAgICAgYmkgPSBiaSArIDEKICAgICAgICBlbmQKICAgICAgICBiaSA9IGJpICsgMQogICAgZW5kCiAgICBvdXQgPSBvdXQgLi4gInJldHVybiBDKCIKICAgIGJpID0gMQogICAgaWYgbm90IEJFIHRoZW4KICAgICAgICBmb3IgaSA9IDEsICN3b3JkcyBkbwogICAgICAgICAgICBmb3IgXyA9IDEsIHdvcmRzW2ldIC0gMSBkbwogICAgICAgICAgICAgICAgb3V0ID0gb3V0IC4uIGZtdCgiYiVkLCIsIGJpKQogICAgICAgICAgICAgICAgYmkgPSBiaSArIDEKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIG91dCA9IG91dCAuLiBmbXQoIm4lZCUlMl44LCIsIGkpCiAgICAgICAgICAgIGJpID0gYmkgKyAxCiAgICAgICAgZW5kCiAgICBlbHNlCiAgICAgICAgZm9yIGkgPSAxLCAjd29yZHMgZG8KICAgICAgICAgICAgb3V0ID0gb3V0IC4uIGZtdCgibiVkJSUyXjgsIiwgaSkKICAgICAgICAgICAgYmkgPSBiaSArIHdvcmRzW2ldIC0gMgogICAgICAgICAgICBmb3IgXyA9IDEsIHdvcmRzW2ldIC0gMSBkbwogICAgICAgICAgICAgICAgb3V0ID0gb3V0IC4uIGZtdCgiYiVkLCIsIGJpKQogICAgICAgICAgICAgICAgYmkgPSBiaSAtIDEKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGJpID0gYmkgKyB3b3Jkc1tpXSArIDEKICAgICAgICBlbmQKICAgIGVuZAogICAgb3V0ID0gb3V0OnN1YigxLCAtMikgLi4gIillbmQiCiAgICByZXR1cm4gbG9hZChvdXQpKCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBta1VucGFjayh3b3JkcywgQkUpCiAgICBsb2NhbCBvdXQgPSAibG9jYWwgQj1zdHJpbmcuYnl0ZSByZXR1cm4gZnVuY3Rpb24oXyxzLGkpbG9jYWwgIgogICAgbG9jYWwgYmkgPSAxCiAgICBpZiBub3QgQkUgdGhlbgogICAgICAgIGZvciBpID0gMSwgI3dvcmRzIGRvCiAgICAgICAgICAgIGZvciBfID0gMSwgd29yZHNbaV0gZG8KICAgICAgICAgICAgICAgIG91dCA9IG91dCAuLiBmbXQoImIlZCwiLCBiaSkKICAgICAgICAgICAgICAgIGJpID0gYmkgKyAxCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgZWxzZQogICAgICAgIGZvciBpID0gMSwgI3dvcmRzIGRvCiAgICAgICAgICAgIGJpID0gYmkgKyB3b3Jkc1tpXSAtIDEKICAgICAgICAgICAgZm9yIF8gPSAxLCB3b3Jkc1tpXSBkbwogICAgICAgICAgICAgICAgb3V0ID0gb3V0IC4uIGZtdCgiYiVkLCIsIGJpKQogICAgICAgICAgICAgICAgYmkgPSBiaSAtIDEKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGJpID0gYmkgKyB3b3Jkc1tpXSArIDEKICAgICAgICBlbmQKICAgIGVuZAogICAgb3V0ID0gb3V0OnN1YigxLCAtMikgLi4gZm10KCI9QihzLGksaSslZClyZXR1cm4gIiwgYmkgLSAyKQogICAgYmkgPSAxCiAgICBmb3IgaSA9IDEsICN3b3JkcyBkbwogICAgICAgIG91dCA9IG91dCAuLiBmbXQoImIlZCIsIGJpKQogICAgICAgIGJpID0gYmkgKyAxCiAgICAgICAgZm9yIGogPSAyLCB3b3Jkc1tpXSBkbwogICAgICAgICAgICBvdXQgPSBvdXQgLi4gZm10KCIrYiVkKjJeJWQiLCBiaSwgOCAqIGogLSA4KQogICAgICAgICAgICBiaSA9IGJpICsgMQogICAgICAgIGVuZAogICAgICAgIG91dCA9IG91dCAuLiAiLCIKICAgIGVuZAogICAgb3V0ID0gb3V0IC4uIGZtdCgiaSslZCBlbmQiLCBiaSAtIDEpCiAgICByZXR1cm4gbG9hZChvdXQpKCkKZW5kCgoKaWYgbm90IHN0cmluZy5wYWNrIG9yIHBjYWxsKHN0cmluZy5kdW1wLCBzdHJpbmcucGFjaykgdGhlbgogICAgbG9jYWwgZnVuY3Rpb24gY29tcGlsZShmbXQsIGZuKQogICAgICAgIGxvY2FsIGUgPSBhc3NlcnQoZm10Om1hdGNoKCJeKFs+PF0pSVtJJWRdKyQiKSwgImludmFsaWQgZm9ybWF0IHN0cmluZyIpCiAgICAgICAgbG9jYWwgdyA9IHt9CiAgICAgICAgZm9yIGkgaW4gZm10OmdtYXRjaCgiSShbJWRdKykiKSBkbwogICAgICAgICAgICBsb2NhbCBuID0gdG9udW1iZXIoaSkgb3IgNAogICAgICAgICAgICBhc3NlcnQobiA+IDAgYW5kIG4gPD0gMTYsICJpbnRlZ3JhbCBzaXplIG91dCBvZiBsaW1pdHMiKQogICAgICAgICAgICB3WyN3ICsgMV0gPSBuCiAgICAgICAgZW5kCiAgICAgICAgcmV0dXJuIGZuKHcsIGUgPT0gIj4iKQogICAgZW5kCgogICAgbG9jYWwgcGFja0NhY2hlID0ge30KICAgIGxvY2FsIHVucGFja0NhY2hlID0ge30KCiAgICAKICAgIAoKICAgIAogICAgCiAgICAKICAgIAogICAgCiAgICAKICAgIAogICAgCiAgICBsb2NhbCBmdW5jdGlvbiBjb21waWxlUGFjayhmbXQpCiAgICAgICAgaWYgbm90IHBhY2tDYWNoZVtmbXRdIHRoZW4KICAgICAgICAgICAgcGFja0NhY2hlW2ZtdF0gPSBjb21waWxlKGZtdCwgbWtQYWNrKQogICAgICAgIGVuZAogICAgICAgIHJldHVybiBwYWNrQ2FjaGVbZm10XSwgZm10CiAgICBlbmQKCiAgICAKICAgIAogICAgCiAgICAKICAgIAogICAgCiAgICAKICAgIAogICAgbG9jYWwgZnVuY3Rpb24gY29tcGlsZVVucGFjayhmbXQpCiAgICAgICAgaWYgbm90IHVucGFja0NhY2hlW2ZtdF0gdGhlbgogICAgICAgICAgICB1bnBhY2tDYWNoZVtmbXRdID0gY29tcGlsZShmbXQsIG1rVW5wYWNrKQogICAgICAgIGVuZAogICAgICAgIHJldHVybiB1bnBhY2tDYWNoZVtmbXRdLCBmbXQKICAgIGVuZAoKICAgIHJldHVybiB7CiAgICAgICAgY29tcGlsZVBhY2sgPSBjb21waWxlUGFjaywKICAgICAgICBjb21waWxlVW5wYWNrID0gY29tcGlsZVVucGFjaywKICAgIH0KZWxzZQogICAgCiAgICAKICAgIAogICAgCiAgICBsb2NhbCBmdW5jdGlvbiBjb21waWxlUGFjayhmbXQpIHJldHVybiBzdHJpbmcucGFjaywgZm10IGVuZAoKICAgIAogICAgCiAgICAKICAgIAogICAgbG9jYWwgZnVuY3Rpb24gY29tcGlsZVVucGFjayhmbXQpIHJldHVybiBzdHJpbmcudW5wYWNrLCBmbXQgZW5kCgogICAgcmV0dXJuIHsKICAgICAgICBjb21waWxlUGFjayA9IGNvbXBpbGVQYWNrLAogICAgICAgIGNvbXBpbGVVbnBhY2sgPSBjb21waWxlVW5wYWNrLAogICAgfQplbmQK";
  42.     ["ccryptolib.random"] = base64.decode "bG9jYWwgZXhwZWN0ICAgPSByZXF1aXJlICJjYy5leHBlY3QiLmV4cGVjdApsb2NhbCBibGFrZTMgICA9IHJlcXVpcmUgImNjcnlwdG9saWIuYmxha2UzIgpsb2NhbCBjaGFjaGEyMCA9IHJlcXVpcmUgImNjcnlwdG9saWIuY2hhY2hhMjAiCmxvY2FsIHV0aWwgICAgID0gcmVxdWlyZSAiY2NyeXB0b2xpYi5pbnRlcm5hbC51dGlsIgoKbG9jYWwgbGFzc2VydCA9IHV0aWwubGFzc2VydAoKCmxvY2FsIGN0eCA9IHsKICAgICJjY3J5cHRvbGliIDIwMjMtMDQtMTFUMTk6NDNaIHJhbmRvbS5sdWEgaW5pdGlhbGl6YXRpb24gY29udGV4dCIsCiAgICBvcy5lcG9jaCgidXRjIiksCiAgICBvcy5kYXkoKSwKICAgIG9zLnRpbWUoKSwKICAgIG1hdGgucmFuZG9tKDAsIDIgXiAyNCAtIDEpLAogICAgbWF0aC5yYW5kb20oMCwgMiBeIDI0IC0gMSksCiAgICB0b3N0cmluZyh7fSksCiAgICB0b3N0cmluZyh7fSksCn0KCmxvY2FsIHN0YXRlID0gYmxha2UzLmRpZ2VzdCh0YWJsZS5jb25jYXQoY3R4LCAifCIpKQpsb2NhbCBpbml0aWFsaXplZCA9IGZhbHNlCgoKCmxvY2FsIGZ1bmN0aW9uIGluaXQoc2VlZCkKICAgIGV4cGVjdCgxLCBzZWVkLCAic3RyaW5nIikKICAgIHN0YXRlID0gYmxha2UzLmRpZ2VzdEtleWVkKHN0YXRlLCBzZWVkKQogICAgaW5pdGlhbGl6ZWQgPSB0cnVlCmVuZAoKCgpsb2NhbCBmdW5jdGlvbiBpc0luaXQoKQogICAgcmV0dXJuIGluaXRpYWxpemVkCmVuZAoKCgoKCgoKCgoKCgpsb2NhbCBmdW5jdGlvbiBpbml0V2l0aFRpbWluZygpCiAgICBhc3NlcnQob3MuZXBvY2goInV0YyIpIH49IDApCgogICAgbG9jYWwgZiA9IGFzc2VydChsb2FkKCJsb2NhbCBlPW9zLmVwb2NoIHJldHVybnsiIC4uICgiZSd1dGMnLCIpOnJlcCgyNTYpIC4uICJ9IikpCgogICAgZG8gCiAgICAgICAgbG9jYWwgdCA9IGYoKQogICAgICAgIHdoaWxlIHRbMjU2XSAtIHRbMV0gPiAxIGRvIHQgPSBmKCkgZW5kCiAgICBlbmQKCiAgICAKICAgIGxvY2FsIGJ1ZiA9IHt9CiAgICBmb3IgaSA9IDEsIDUxMiBkbwogICAgICAgIGxvY2FsIHQgPSBmKCkKICAgICAgICB3aGlsZSB0WzI1Nl0gPT0gdFsxXSBkbyB0ID0gZigpIGVuZAogICAgICAgIGZvciBqID0gMSwgMjU2IGRvCiAgICAgICAgICAgIGlmIHRbal0gfj0gdFsxXSB0aGVuCiAgICAgICAgICAgICAgICBidWZbaV0gPSBqIC0gMQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZW5kCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICAKICAgIGxvY2FsIGhpc3QgPSB7fQogICAgZm9yIGkgPSAwLCAyNTUgZG8gaGlzdFtpXSA9IDAgZW5kCiAgICBmb3IgaSA9IDEsICNidWYgZG8gaGlzdFtidWZbaV1dID0gaGlzdFtidWZbaV1dICsgMSBlbmQKICAgIGZvciBpID0gMCwgMjU1IGRvIGFzc2VydChoaXN0W2ldIDwgMjApIGVuZAoKICAgIGluaXQoc3RyaW5nLmNoYXIodGFibGUudW5wYWNrKGJ1ZikpKQplbmQKCgoKbG9jYWwgZnVuY3Rpb24gbWl4KGRhdGEpCiAgICBleHBlY3QoMSwgZGF0YSwgInN0cmluZyIpCiAgICBzdGF0ZSA9IGJsYWtlMy5kaWdlc3RLZXllZChzdGF0ZSwgZGF0YSkKZW5kCgoKCgpsb2NhbCBmdW5jdGlvbiByYW5kb20obGVuKQogICAgZXhwZWN0KDEsIGxlbiwgIm51bWJlciIpCiAgICBsYXNzZXJ0KGluaXRpYWxpemVkLCAiYXR0ZW1wdCB0byB1c2UgYW4gdW5pbml0aWFsaXplZCByYW5kb20gZ2VuZXJhdG9yIiwgMikKICAgIGxvY2FsIG1zZyA9ICgiXDAiKTpyZXAobWF0aC5tYXgobGVuLCAwKSArIDMyKQogICAgbG9jYWwgbm9uY2UgPSAoIlwwIik6cmVwKDEyKQogICAgbG9jYWwgb3V0ID0gY2hhY2hhMjAuY3J5cHQoc3RhdGUsIG5vbmNlLCBtc2csIDgsIDApCiAgICBzdGF0ZSA9IG91dDpzdWIoMSwgMzIpCiAgICByZXR1cm4gb3V0OnN1YigzMykKZW5kCgpyZXR1cm4gewogICAgaW5pdCA9IGluaXQsCiAgICBpc0luaXQgPSBpc0luaXQsCiAgICBpbml0V2l0aFRpbWluZyA9IGluaXRXaXRoVGltaW5nLAogICAgbWl4ID0gbWl4LAogICAgcmFuZG9tID0gcmFuZG9tLAp9Cg==";
  43.     ["ccryptolib.internal.util"] = base64.decode "bG9jYWwgZnVuY3Rpb24gbGFzc2VydCh2YWwsIGVyciwgbGV2ZWwpCiAgICBpZiBub3QgdmFsIHRoZW4gZXJyb3IoZXJyLCBsZXZlbCArIDEpIGVuZAogICAgcmV0dXJuIHZhbAplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gcmViYXNlTEUoYSwgYmFzZTEsIGJhc2UyKSAKICAgIGxvY2FsIG91dCA9IHt9CiAgICBsb2NhbCBvdXRsZW4gPSAxCiAgICBsb2NhbCBhY2MgPSAwCiAgICBsb2NhbCBtdWwgPSAxCiAgICBmb3IgaSA9IDEsICNhIGRvCiAgICAgICAgYWNjID0gYWNjICsgYVtpXSAqIG11bAogICAgICAgIG11bCA9IG11bCAqIGJhc2UxCiAgICAgICAgd2hpbGUgbXVsID49IGJhc2UyIGRvCiAgICAgICAgICAgIGxvY2FsIHJlbSA9IGFjYyAlIGJhc2UyCiAgICAgICAgICAgIGFjYyA9IChhY2MgLSByZW0pIC8gYmFzZTIKICAgICAgICAgICAgbXVsID0gbXVsIC8gYmFzZTIKICAgICAgICAgICAgb3V0W291dGxlbl0gPSByZW0KICAgICAgICAgICAgb3V0bGVuID0gb3V0bGVuICsgMQogICAgICAgIGVuZAogICAgZW5kCiAgICBpZiBtdWwgPiAwIHRoZW4KICAgICAgICBvdXRbb3V0bGVuXSA9IGFjYwogICAgZW5kCiAgICByZXR1cm4gb3V0CmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gYml0cyhzdHIpCiAgICAKICAgIGxvY2FsIGJ5dGVzID0ge3N0cjpieXRlKDEsIDMyKX0KICAgIGxvY2FsIG91dCA9IHt9CiAgICBmb3IgaSA9IDEsIDMyIGRvCiAgICAgICAgbG9jYWwgYnl0ZSA9IGJ5dGVzW2ldCiAgICAgICAgZm9yIGogPSAtNywgMCBkbwogICAgICAgICAgICBsb2NhbCBiaXQgPSBieXRlICUgMgogICAgICAgICAgICBvdXRbOCAqIGkgKyBqXSA9IGJpdAogICAgICAgICAgICBieXRlID0gKGJ5dGUgLSBiaXQpIC8gMgogICAgICAgIGVuZAogICAgZW5kCgogICAgCiAgICBvdXRbMV0gPSAwCiAgICBvdXRbMl0gPSAwCiAgICBvdXRbM10gPSAwCiAgICBvdXRbMjU1XSA9IDEKICAgIG91dFsyNTZdID0gMAoKICAgIHJldHVybiBvdXQKZW5kCgoKCgpsb2NhbCBmdW5jdGlvbiBiaXRzOChzdHIpCiAgICByZXR1cm4ge3VucGFjayhiaXRzKHN0ciksIDQpfQplbmQKCnJldHVybiB7CiAgICBsYXNzZXJ0ID0gbGFzc2VydCwKICAgIHJlYmFzZUxFID0gcmViYXNlTEUsCiAgICBiaXRzID0gYml0cywKICAgIGJpdHM4ID0gYml0czgsCn0K";
  44.     ["ccryptolib.blake3"] = base64.decode "LS0tIFRoZSBCTEFLRTMgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLgoKbG9jYWwgZXhwZWN0ID0gcmVxdWlyZSAiY2MuZXhwZWN0Ii5leHBlY3QKbG9jYWwgbGFzc2VydCA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwudXRpbCIubGFzc2VydApsb2NhbCBwYWNraW5nID0gcmVxdWlyZSAiY2NyeXB0b2xpYi5pbnRlcm5hbC5wYWNraW5nIgoKbG9jYWwgdW5wYWNrID0gdW5wYWNrIG9yIHRhYmxlLnVucGFjawpsb2NhbCBieG9yID0gYml0MzIuYnhvcgpsb2NhbCByb2wgPSBiaXQzMi5scm90YXRlCmxvY2FsIHAxNng0LCBmbXQxNng0ID0gcGFja2luZy5jb21waWxlUGFjaygiPEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0IikKbG9jYWwgdTE2eDQgPSBwYWNraW5nLmNvbXBpbGVVbnBhY2soZm10MTZ4NCkKbG9jYWwgdTh4NCwgZm10OHg0ID0gcGFja2luZy5jb21waWxlVW5wYWNrKCI8STRJNEk0STRJNEk0STRJNCIpCgpsb2NhbCBDSFVOS19TVEFSVCA9IDB4MDEKbG9jYWwgQ0hVTktfRU5EID0gMHgwMgpsb2NhbCBQQVJFTlQgPSAweDA0CmxvY2FsIFJPT1QgPSAweDA4CmxvY2FsIEtFWUVEX0hBU0ggPSAweDEwCmxvY2FsIERFUklWRV9LRVlfQ09OVEVYVCA9IDB4MjAKbG9jYWwgREVSSVZFX0tFWV9NQVRFUklBTCA9IDB4NDAKCmxvY2FsIElWID0gewogICAgMHg2YTA5ZTY2NywgMHhiYjY3YWU4NSwgMHgzYzZlZjM3MiwgMHhhNTRmZjUzYSwKICAgIDB4NTEwZTUyN2YsIDB4OWIwNTY4OGMsIDB4MWY4M2Q5YWIsIDB4NWJlMGNkMTksCn0KCmxvY2FsIGZ1bmN0aW9uIGNvbXByZXNzKGgsIG1zZywgdCwgdjE0LCB2MTUsIGZ1bGwpCiAgICBsb2NhbCBoMDAsIGgwMSwgaDAyLCBoMDMsIGgwNCwgaDA1LCBoMDYsIGgwNyA9IHVucGFjayhoKQogICAgbG9jYWwgdjAwLCB2MDEsIHYwMiwgdjAzID0gaDAwLCBoMDEsIGgwMiwgaDAzCiAgICBsb2NhbCB2MDQsIHYwNSwgdjA2LCB2MDcgPSBoMDQsIGgwNSwgaDA2LCBoMDcKICAgIGxvY2FsIHYwOCwgdjA5LCB2MTAsIHYxMSA9IDB4NmEwOWU2NjcsIDB4YmI2N2FlODUsIDB4M2M2ZWYzNzIsIDB4YTU0ZmY1M2EKICAgIGxvY2FsIHYxMiA9IHQgJSAyIF4gMzIKICAgIGxvY2FsIHYxMyA9ICh0IC0gdjEyKSAqIDIgXiAtMzIKCiAgICBsb2NhbCBtMDAsIG0wMSwgbTAyLCBtMDMsIG0wNCwgbTA1LCBtMDYsIG0wNywKICAgICAgICAgIG0wOCwgbTA5LCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0xNCwgbTE1ID0gdW5wYWNrKG1zZykKCiAgICBsb2NhbCB0bXAKICAgIGZvciBpID0gMSwgNyBkbwogICAgICAgIHYwMCA9IHYwMCArIHYwNCArIG0wMCB2MTIgPSByb2woYnhvcih2MTIsIHYwMCksIDE2KQogICAgICAgIHYwOCA9IHYwOCArIHYxMiAgICAgICB2MDQgPSByb2woYnhvcih2MDQsIHYwOCksIDIwKQogICAgICAgIHYwMCA9IHYwMCArIHYwNCArIG0wMSB2MTIgPSByb2woYnhvcih2MTIsIHYwMCksIDI0KQogICAgICAgIHYwOCA9IHYwOCArIHYxMiAgICAgICB2MDQgPSByb2woYnhvcih2MDQsIHYwOCksIDI1KQoKICAgICAgICB2MDEgPSB2MDEgKyB2MDUgKyBtMDIgdjEzID0gcm9sKGJ4b3IodjEzLCB2MDEpLCAxNikKICAgICAgICB2MDkgPSB2MDkgKyB2MTMgICAgICAgdjA1ID0gcm9sKGJ4b3IodjA1LCB2MDkpLCAyMCkKICAgICAgICB2MDEgPSB2MDEgKyB2MDUgKyBtMDMgdjEzID0gcm9sKGJ4b3IodjEzLCB2MDEpLCAyNCkKICAgICAgICB2MDkgPSB2MDkgKyB2MTMgICAgICAgdjA1ID0gcm9sKGJ4b3IodjA1LCB2MDkpLCAyNSkKCiAgICAgICAgdjAyID0gdjAyICsgdjA2ICsgbTA0IHYxNCA9IHJvbChieG9yKHYxNCwgdjAyKSwgMTYpCiAgICAgICAgdjEwID0gdjEwICsgdjE0ICAgICAgIHYwNiA9IHJvbChieG9yKHYwNiwgdjEwKSwgMjApCiAgICAgICAgdjAyID0gdjAyICsgdjA2ICsgbTA1IHYxNCA9IHJvbChieG9yKHYxNCwgdjAyKSwgMjQpCiAgICAgICAgdjEwID0gdjEwICsgdjE0ICAgICAgIHYwNiA9IHJvbChieG9yKHYwNiwgdjEwKSwgMjUpCgogICAgICAgIHYwMyA9IHYwMyArIHYwNyArIG0wNiB2MTUgPSByb2woYnhvcih2MTUsIHYwMyksIDE2KQogICAgICAgIHYxMSA9IHYxMSArIHYxNSAgICAgICB2MDcgPSByb2woYnhvcih2MDcsIHYxMSksIDIwKQogICAgICAgIHYwMyA9IHYwMyArIHYwNyArIG0wNyB2MTUgPSByb2woYnhvcih2MTUsIHYwMyksIDI0KQogICAgICAgIHYxMSA9IHYxMSArIHYxNSAgICAgICB2MDcgPSByb2woYnhvcih2MDcsIHYxMSksIDI1KQoKICAgICAgICB2MDAgPSB2MDAgKyB2MDUgKyBtMDggdjE1ID0gcm9sKGJ4b3IodjE1LCB2MDApLCAxNikKICAgICAgICB2MTAgPSB2MTAgKyB2MTUgICAgICAgdjA1ID0gcm9sKGJ4b3IodjA1LCB2MTApLCAyMCkKICAgICAgICB2MDAgPSB2MDAgKyB2MDUgKyBtMDkgdjE1ID0gcm9sKGJ4b3IodjE1LCB2MDApLCAyNCkKICAgICAgICB2MTAgPSB2MTAgKyB2MTUgICAgICAgdjA1ID0gcm9sKGJ4b3IodjA1LCB2MTApLCAyNSkKCiAgICAgICAgdjAxID0gdjAxICsgdjA2ICsgbTEwIHYxMiA9IHJvbChieG9yKHYxMiwgdjAxKSwgMTYpCiAgICAgICAgdjExID0gdjExICsgdjEyICAgICAgIHYwNiA9IHJvbChieG9yKHYwNiwgdjExKSwgMjApCiAgICAgICAgdjAxID0gdjAxICsgdjA2ICsgbTExIHYxMiA9IHJvbChieG9yKHYxMiwgdjAxKSwgMjQpCiAgICAgICAgdjExID0gdjExICsgdjEyICAgICAgIHYwNiA9IHJvbChieG9yKHYwNiwgdjExKSwgMjUpCgogICAgICAgIHYwMiA9IHYwMiArIHYwNyArIG0xMiB2MTMgPSByb2woYnhvcih2MTMsIHYwMiksIDE2KQogICAgICAgIHYwOCA9IHYwOCArIHYxMyAgICAgICB2MDcgPSByb2woYnhvcih2MDcsIHYwOCksIDIwKQogICAgICAgIHYwMiA9IHYwMiArIHYwNyArIG0xMyB2MTMgPSByb2woYnhvcih2MTMsIHYwMiksIDI0KQogICAgICAgIHYwOCA9IHYwOCArIHYxMyAgICAgICB2MDcgPSByb2woYnhvcih2MDcsIHYwOCksIDI1KQoKICAgICAgICB2MDMgPSB2MDMgKyB2MDQgKyBtMTQgdjE0ID0gcm9sKGJ4b3IodjE0LCB2MDMpLCAxNikKICAgICAgICB2MDkgPSB2MDkgKyB2MTQgICAgICAgdjA0ID0gcm9sKGJ4b3IodjA0LCB2MDkpLCAyMCkKICAgICAgICB2MDMgPSB2MDMgKyB2MDQgKyBtMTUgdjE0ID0gcm9sKGJ4b3IodjE0LCB2MDMpLCAyNCkKICAgICAgICB2MDkgPSB2MDkgKyB2MTQgICAgICAgdjA0ID0gcm9sKGJ4b3IodjA0LCB2MDkpLCAyNSkKCiAgICAgICAgaWYgaSB+PSA3IHRoZW4KICAgICAgICAgICAgdG1wID0gbTAyCiAgICAgICAgICAgIG0wMiA9IG0wMwogICAgICAgICAgICBtMDMgPSBtMTAKICAgICAgICAgICAgbTEwID0gbTEyCiAgICAgICAgICAgIG0xMiA9IG0wOQogICAgICAgICAgICBtMDkgPSBtMTEKICAgICAgICAgICAgbTExID0gbTA1CiAgICAgICAgICAgIG0wNSA9IG0wMAogICAgICAgICAgICBtMDAgPSB0bXAKCiAgICAgICAgICAgIHRtcCA9IG0wNgogICAgICAgICAgICBtMDYgPSBtMDQKICAgICAgICAgICAgbTA0ID0gbTA3CiAgICAgICAgICAgIG0wNyA9IG0xMwogICAgICAgICAgICBtMTMgPSBtMTQKICAgICAgICAgICAgbTE0ID0gbTE1CiAgICAgICAgICAgIG0xNSA9IG0wOAogICAgICAgICAgICBtMDggPSBtMDEKICAgICAgICAgICAgbTAxID0gdG1wCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICBpZiBmdWxsIHRoZW4KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBieG9yKHYwMCwgdjA4KSwgYnhvcih2MDEsIHYwOSksIGJ4b3IodjAyLCB2MTApLCBieG9yKHYwMywgdjExKSwKICAgICAgICAgICAgYnhvcih2MDQsIHYxMiksIGJ4b3IodjA1LCB2MTMpLCBieG9yKHYwNiwgdjE0KSwgYnhvcih2MDcsIHYxNSksCiAgICAgICAgICAgIGJ4b3IodjA4LCBoMDApLCBieG9yKHYwOSwgaDAxKSwgYnhvcih2MTAsIGgwMiksIGJ4b3IodjExLCBoMDMpLAogICAgICAgICAgICBieG9yKHYxMiwgaDA0KSwgYnhvcih2MTMsIGgwNSksIGJ4b3IodjE0LCBoMDYpLCBieG9yKHYxNSwgaDA3KSwKICAgICAgICB9CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgYnhvcih2MDAsIHYwOCksIGJ4b3IodjAxLCB2MDkpLCBieG9yKHYwMiwgdjEwKSwgYnhvcih2MDMsIHYxMSksCiAgICAgICAgICAgIGJ4b3IodjA0LCB2MTIpLCBieG9yKHYwNSwgdjEzKSwgYnhvcih2MDYsIHYxNCksIGJ4b3IodjA3LCB2MTUpLAogICAgICAgIH0KICAgIGVuZAplbmQKCmxvY2FsIGZ1bmN0aW9uIG1lcmdlKGN2bCwgY3ZyKQogICAgZm9yIGkgPSAxLCA4IGRvIGN2bFtpICsgOF0gPSBjdnJbaV0gZW5kCiAgICByZXR1cm4gY3ZsCmVuZAoKbG9jYWwgZnVuY3Rpb24gYmxha2UzKGl2LCBmbGFncywgbXNnLCBsZW4pCiAgICAtLSBTZXQgdXAgdGhlIHN0YXRlLgogICAgbG9jYWwgc3RhdGVDdnMgPSB7fQogICAgbG9jYWwgc3RhdGVDdiA9IGl2CiAgICBsb2NhbCBzdGF0ZVQgPSAwCiAgICBsb2NhbCBzdGF0ZU4gPSAwCiAgICBsb2NhbCBzdGF0ZVN0YXJ0ID0gQ0hVTktfU1RBUlQKICAgIGxvY2FsIHN0YXRlRW5kID0gMAoKICAgIC0tIERpZ2VzdCBjb21wbGV0ZSBibG9ja3MuCiAgICBmb3IgaSA9IDEsICNtc2cgLSA2NCwgNjQgZG8KICAgICAgICAtLSBDb21wcmVzcyB0aGUgYmxvY2suCiAgICAgICAgbG9jYWwgYmxvY2sgPSB7dTE2eDQoZm10MTZ4NCwgbXNnLCBpKX0KICAgICAgICBsb2NhbCBzdGF0ZUZsYWdzID0gZmxhZ3MgKyBzdGF0ZVN0YXJ0ICsgc3RhdGVFbmQKICAgICAgICBzdGF0ZUN2ID0gY29tcHJlc3Moc3RhdGVDdiwgYmxvY2ssIHN0YXRlVCwgNjQsIHN0YXRlRmxhZ3MpCiAgICAgICAgc3RhdGVTdGFydCA9IDAKICAgICAgICBzdGF0ZU4gPSBzdGF0ZU4gKyAxCgogICAgICAgIGlmIHN0YXRlTiA9PSAxNSB0aGVuCiAgICAgICAgICAgIC0tIExhc3QgYmxvY2sgaW4gY2h1bmsuCiAgICAgICAgICAgIHN0YXRlRW5kID0gQ0hVTktfRU5ECiAgICAgICAgZWxzZWlmIHN0YXRlTiA9PSAxNiB0aGVuCiAgICAgICAgICAgIC0tIENodW5rIGNvbXBsZXRlLCBtZXJnZS4KICAgICAgICAgICAgbG9jYWwgbWVyZ2VDdiA9IHN0YXRlQ3YKICAgICAgICAgICAgbG9jYWwgbWVyZ2VBbXQgPSBzdGF0ZVQgKyAxCiAgICAgICAgICAgIHdoaWxlIG1lcmdlQW10ICUgMiA9PSAwIGRvCiAgICAgICAgICAgICAgICBsb2NhbCBibG9jayA9IG1lcmdlKHRhYmxlLnJlbW92ZShzdGF0ZUN2cyksIG1lcmdlQ3YpCiAgICAgICAgICAgICAgICBtZXJnZUN2ID0gY29tcHJlc3MoaXYsIGJsb2NrLCAwLCA2NCwgZmxhZ3MgKyBQQVJFTlQpCiAgICAgICAgICAgICAgICBtZXJnZUFtdCA9IG1lcmdlQW10IC8gMgogICAgICAgICAgICBlbmQKCiAgICAgICAgICAgIC0tIFB1c2ggYmFjay4KICAgICAgICAgICAgdGFibGUuaW5zZXJ0KHN0YXRlQ3ZzLCBtZXJnZUN2KQoKICAgICAgICAgICAgLS0gVXBkYXRlIHN0YXRlIGJhY2sgdG8gbmV4dCBjaHVuay4KICAgICAgICAgICAgc3RhdGVDdiA9IGl2CiAgICAgICAgICAgIHN0YXRlVCA9IHN0YXRlVCArIDEKICAgICAgICAgICAgc3RhdGVOID0gMAogICAgICAgICAgICBzdGF0ZVN0YXJ0ID0gQ0hVTktfU1RBUlQKICAgICAgICAgICAgc3RhdGVFbmQgPSAwCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICAtLSBQYWQgdGhlIGxhc3QgbWVzc2FnZSBibG9jay4KICAgIGxvY2FsIGxhc3RMZW4gPSAjbXNnID09IDAgYW5kIDAgb3IgKCNtc2cgLSAxKSAlIDY0ICsgMQogICAgbG9jYWwgcGFkZGVkID0gbXNnOnN1YigtbGFzdExlbikgLi4gKCJcMCIpOnJlcCg2NCkKICAgIGxvY2FsIGxhc3QgPSB7dTE2eDQoZm10MTZ4NCwgcGFkZGVkLCAxKX0KCiAgICAtLSBQcmVwYXJlIG91dHB1dCBleHBhbnNpb24gc3RhdGUuCiAgICBsb2NhbCBvdXRDdiwgb3V0QmxvY2ssIG91dExlbiwgb3V0RmxhZ3MKICAgIGlmIHN0YXRlVCA+IDAgdGhlbgogICAgICAgIC0tIFJvb3QgaXMgYSBwYXJlbnQsIGRpZ2VzdCBsYXN0IGJsb2NrIG5vdyBhbmQgbWVyZ2UgcGFyZW50cy4KICAgICAgICBsb2NhbCBzdGF0ZUZsYWdzID0gZmxhZ3MgKyBzdGF0ZVN0YXJ0ICsgQ0hVTktfRU5ECiAgICAgICAgbG9jYWwgbWVyZ2VDdiA9IGNvbXByZXNzKHN0YXRlQ3YsIGxhc3QsIHN0YXRlVCwgbGFzdExlbiwgc3RhdGVGbGFncykKICAgICAgICBmb3IgaSA9ICNzdGF0ZUN2cywgMiwgLTEgZG8KICAgICAgICAgICAgbG9jYWwgYmxvY2sgPSBtZXJnZShzdGF0ZUN2c1tpXSwgbWVyZ2VDdikKICAgICAgICAgICAgbWVyZ2VDdiA9IGNvbXByZXNzKGl2LCBibG9jaywgMCwgNjQsIGZsYWdzICsgUEFSRU5UKQogICAgICAgIGVuZAoKICAgICAgICAtLSBTZXQgb3V0cHV0IHN0YXRlLgogICAgICAgIG91dEN2ID0gaXYKICAgICAgICBvdXRCbG9jayA9IG1lcmdlKHN0YXRlQ3ZzWzFdLCBtZXJnZUN2KQogICAgICAgIG91dExlbiA9IDY0CiAgICAgICAgb3V0RmxhZ3MgPSBmbGFncyArIFJPT1QgKyBQQVJFTlQKICAgIGVsc2UKICAgICAgICAtLSBSb290IGJsb2NrIGlzIGluIHRoZSBmaXJzdCBjaHVuaywgc2V0IG91dHB1dCBzdGF0ZS4KICAgICAgICBvdXRDdiA9IHN0YXRlQ3YKICAgICAgICBvdXRCbG9jayA9IGxhc3QKICAgICAgICBvdXRMZW4gPSBsYXN0TGVuCiAgICAgICAgb3V0RmxhZ3MgPSBmbGFncyArIHN0YXRlU3RhcnQgKyBDSFVOS19FTkQgKyBST09UCiAgICBlbmQKCiAgICAtLSBFeHBhbmQgb3V0cHV0LgogICAgbG9jYWwgb3V0ID0ge30KICAgIGZvciBpID0gMCwgbGVuIC8gNjQgZG8KICAgICAgICBsb2NhbCBtZCA9IGNvbXByZXNzKG91dEN2LCBvdXRCbG9jaywgaSwgb3V0TGVuLCBvdXRGbGFncywgdHJ1ZSkKICAgICAgICBvdXRbaSArIDFdID0gcDE2eDQoZm10MTZ4NCwgdW5wYWNrKG1kKSkKICAgIGVuZAoKICAgIHJldHVybiB0YWJsZS5jb25jYXQob3V0KTpzdWIoMSwgbGVuKQplbmQKCi0tLSBIYXNoZXMgZGF0YSB1c2luZyBCTEFLRTMuCi0tLSBAcGFyYW0gbWVzc2FnZSBzdHJpbmcgVGhlIGlucHV0IG1lc3NhZ2UuCi0tLSBAcGFyYW0gbGVuIG51bWJlcj8gVGhlIGRlc2lyZWQgaGFzaCBsZW5ndGgsIGluIGJ5dGVzLiBEZWZhdWx0cyB0byAzMi4KLS0tIEByZXR1cm4gc3RyaW5nIGhhc2ggVGhlIGhhc2guCmxvY2FsIGZ1bmN0aW9uIGRpZ2VzdChtZXNzYWdlLCBsZW4pCiAgICBleHBlY3QoMSwgbWVzc2FnZSwgInN0cmluZyIpCiAgICBsZW4gPSBleHBlY3QoMiwgbGVuLCAibnVtYmVyIiwgIm5pbCIpIG9yIDMyCiAgICBsYXNzZXJ0KGxlbiAlIDEgPT0gMCwgImRlc2lyZWQgb3V0cHV0IGxlbmd0aCBtdXN0IGJlIGFuIGludGVnZXIiLCAyKQogICAgbGFzc2VydChsZW4gPj0gMSwgImRlc2lyZWQgb3V0cHV0IGxlbmd0aCBtdXN0IGJlIHBvc2l0aXZlIiwgMikKICAgIHJldHVybiBibGFrZTMoSVYsIDAsIG1lc3NhZ2UsIGxlbikKZW5kCgotLS0gUGVyZm9ybXMgYSBrZXllZCBoYXNoLgotLS0gQHBhcmFtIGtleSBzdHJpbmcgQSAzMi1ieXRlIHJhbmRvbSBrZXkuCi0tLSBAcGFyYW0gbWVzc2FnZSBzdHJpbmcgVGhlIGlucHV0IG1lc3NhZ2UuCi0tLSBAcGFyYW0gbGVuIG51bWJlcj8gVGhlIGRlc2lyZWQgaGFzaCBsZW5ndGgsIGluIGJ5dGVzLiBEZWZhdWx0cyB0byAzMi4KLS0tIEByZXR1cm4gc3RyaW5nIGhhc2ggVGhlIGtleWVkIGhhc2guCmxvY2FsIGZ1bmN0aW9uIGRpZ2VzdEtleWVkKGtleSwgbWVzc2FnZSwgbGVuKQogICAgZXhwZWN0KDEsIGtleSwgInN0cmluZyIpCiAgICBsYXNzZXJ0KCNrZXkgPT0gMzIsICJrZXkgbGVuZ3RoIG11c3QgYmUgMzIiLCAyKQogICAgZXhwZWN0KDIsIG1lc3NhZ2UsICJzdHJpbmciKQogICAgbGVuID0gZXhwZWN0KDMsIGxlbiwgIm51bWJlciIsICJuaWwiKSBvciAzMgogICAgbGFzc2VydChsZW4gJSAxID09IDAsICJkZXNpcmVkIG91dHB1dCBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyIiwgMikKICAgIGxhc3NlcnQobGVuID49IDEsICJkZXNpcmVkIG91dHB1dCBsZW5ndGggbXVzdCBiZSBwb3NpdGl2ZSIsIDIpCiAgICByZXR1cm4gYmxha2UzKHt1OHg0KGZtdDh4NCwga2V5LCAxKX0sIEtFWUVEX0hBU0gsIG1lc3NhZ2UsIGxlbikKZW5kCgotLS0gTWFrZXMgYSBjb250ZXh0LWJhc2VkIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIChLREYpLgotLS0gQHBhcmFtIGNvbnRleHQgc3RyaW5nIFRoZSBjb250ZXh0IGZvciB0aGUgS0RGLgotLS0gQHJldHVybiBmdW4obWF0ZXJpYWw6IHN0cmluZywgbGVuOiBudW1iZXI/KTogc3RyaW5nIGtkZiBUaGUgS0RGLgpsb2NhbCBmdW5jdGlvbiBkZXJpdmVLZXkoY29udGV4dCkKICAgIGV4cGVjdCgxLCBjb250ZXh0LCAic3RyaW5nIikKICAgIGxvY2FsIGl2ID0ge3U4eDQoZm10OHg0LCBibGFrZTMoSVYsIERFUklWRV9LRVlfQ09OVEVYVCwgY29udGV4dCwgMzIpLCAxKX0KCiAgICAtLS0gRGVyaXZlcyBhIGtleS4KICAgIC0tLSBAcGFyYW0gbWF0ZXJpYWwgc3RyaW5nIFRoZSBrZXlpbmcgbWF0ZXJpYWwuCiAgICAtLS0gQHBhcmFtIGxlbiBudW1iZXI/IFRoZSBkZXNpcmVkIGhhc2ggbGVuZ3RoLCBpbiBieXRlcy4gRGVmYXVsdHMgdG8gMzIuCiAgICByZXR1cm4gZnVuY3Rpb24obWF0ZXJpYWwsIGxlbikKICAgICAgICBleHBlY3QoMSwgbWF0ZXJpYWwsICJzdHJpbmciKQogICAgICAgIGxlbiA9IGV4cGVjdCgyLCBsZW4sICJudW1iZXIiLCAibmlsIikgb3IgMzIKICAgICAgICBsYXNzZXJ0KGxlbiAlIDEgPT0gMCwgImRlc2lyZWQgb3V0cHV0IGxlbmd0aCBtdXN0IGJlIGFuIGludGVnZXIiLCAyKQogICAgICAgIGxhc3NlcnQobGVuID49IDEsICJkZXNpcmVkIG91dHB1dCBsZW5ndGggbXVzdCBiZSBwb3NpdGl2ZSIsIDIpCiAgICAgICAgcmV0dXJuIGJsYWtlMyhpdiwgREVSSVZFX0tFWV9NQVRFUklBTCwgbWF0ZXJpYWwsIGxlbikKICAgIGVuZAplbmQKCnJldHVybiB7CiAgICBkaWdlc3QgPSBkaWdlc3QsCiAgICBkaWdlc3RLZXllZCA9IGRpZ2VzdEtleWVkLAogICAgZGVyaXZlS2V5ID0gZGVyaXZlS2V5LAp9Cg==";
  45.     ["basalt"] = base64.decode "bG9jYWwgYWE9e31sb2NhbCBiYT10cnVlO2xvY2FsIGNhPXJlcXVpcmUKbG9jYWwgZGE9ZnVuY3Rpb24oYWIpCmZvciBiYixjYiBpbiBwYWlycyhhYSlkbwppZih0eXBlKGNiKT09InRhYmxlIil0aGVuIGZvciBkYixfYyBpbiBwYWlycyhjYilkbyBpZihkYj09YWIpdGhlbgpyZXR1cm4gX2MoKWVuZCBlbmQgZWxzZSBpZihiYj09YWIpdGhlbiByZXR1cm4gY2IoKWVuZCBlbmQgZW5kO3JldHVybiBjYShhYillbmQKbG9jYWwgX2I9ZnVuY3Rpb24oYWIpaWYoYWJ+PW5pbCl0aGVuIHJldHVybiBhYVthYl1lbmQ7cmV0dXJuIGFhIGVuZAphYVsibW9kdWxlIl09ZnVuY3Rpb24oLi4uKXJldHVybgpmdW5jdGlvbihhYilsb2NhbCBiYixjYj1wY2FsbChkYSxhYilyZXR1cm4gYmIgYW5kIGNiIG9yIG5pbCBlbmQgZW5kCmFhWyJGcmFtZSJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgibW9kdWxlIilsb2NhbCBiYj1kYSgiT2JqZWN0IikKbG9jYWwgY2I9ZGEoImxvYWRPYmplY3RzIilsb2NhbCBkYj1kYSgiYmFzYWx0RHJhdyIpbG9jYWwgX2M9ZGEoInV0aWxzIilsb2NhbCBhYz1hYigibGF5b3V0IikKbG9jYWwgYmM9YWIoImJhc2FsdE1vbiIpbG9jYWwgY2M9X2MudXVpZDtsb2NhbCBkYz1fYy5ycGFpcnM7bG9jYWwgX2Q9X2MuZ2V0VmFsdWVGcm9tWE1MO2xvY2FsIGFkPV9jLnRhYmxlQ291bnQKbG9jYWwgYmQsY2QsZGQ9c3RyaW5nLnN1YixtYXRoLm1pbixtYXRoLm1heApyZXR1cm4KZnVuY3Rpb24oX19hLGFfYSxiX2EsY19hKWxvY2FsIGRfYT1iYihfX2EpbG9jYWwgX2FhPSJGcmFtZSJsb2NhbCBhYWE9e31sb2NhbCBiYWE9e31sb2NhbCBjYWE9e31sb2NhbCBkYWE9e31sb2NhbCBfYmE9e31sb2NhbCBhYmE9e30KbG9jYWwgYmJhPXt9bG9jYWwgY2JhPXt9bG9jYWwgZGJhPTA7bG9jYWwgX2NhPWJfYSBvciB0ZXJtLmN1cnJlbnQoKWxvY2FsIGFjYT0iImxvY2FsIGJjYT1mYWxzZQpsb2NhbCBjY2E9ZmFsc2U7bG9jYWwgZGNhPWZhbHNlO2xvY2FsIF9kYT0wO2xvY2FsIGFkYT0wO2xvY2FsIGJkYT1mYWxzZTtsb2NhbCBjZGE9MDtsb2NhbCBkZGE9ZmFsc2U7bG9jYWwgX19iPWZhbHNlO2xvY2FsIGFfYj0iImxvY2FsIGJfYj1mYWxzZQpsb2NhbCBjX2I9ZmFsc2U7bG9jYWwgZF9iO2xvY2FsIF9hYjtsb2NhbCBhYWI9dHJ1ZTtsb2NhbCBiYWI9dHJ1ZTtsb2NhbCBjYWI9ZmFsc2U7bG9jYWwgZGFiPXt9bG9jYWwgX2JiPXt9CmRfYTpzZXRaSW5kZXgoMTApbG9jYWwgYWJiPWRiKF9jYSlsb2NhbCBiYmI9ZmFsc2U7bG9jYWwgY2JiPTE7bG9jYWwgZGJiPTE7bG9jYWwgX2NiPWNvbG9ycy53aGl0ZTtsb2NhbCBhY2IsYmNiPTAsMDtsb2NhbCBjY2I9e30KbG9jYWwgZnVuY3Rpb24gZGNiKGRiYyxfY2MpaWYoX2Njfj0KbmlsKXRoZW4gX2NjOnNldFZhbHVlc0J5WE1MRGF0YShkYmMpZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBfZGIoZGJjLF9jYyxhY2MpCmlmKGRiY349bmlsKXRoZW4gaWYoZGJjLnByb3BlcnRpZXN+PW5pbCl0aGVuIGRiYz17ZGJjfWVuZDtmb3IgYmNjLGNjYyBpbiBwYWlycyhkYmMpZG8gbG9jYWwgZGNjPV9jYyhhY2MsCmNjY1siQGlkIl1vciBjYygpKQp0YWJsZS5pbnNlcnQoY2NiLGRjYylkY2IoY2NjLGRjYyllbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBhZGIoZGJjKWlmKHR5cGUoZGJjKX49InN0cmluZyIpdGhlbiBkYmM9ZGJjLm5hbWUgZW5kO2ZvciBfY2MsYWNjIGluIHBhaXJzKGFhYSlkbwpmb3IgYmNjLGNjYyBpbgpwYWlycyhhY2MpZG8gaWYoY2NjOmdldE5hbWUoKT09ZGJjKXRoZW4gcmV0dXJuIGNjYyBlbmQgZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYmRiKGRiYylsb2NhbCBfY2M9YWRiKGRiYylpZihfY2N+PW5pbCl0aGVuIHJldHVybiBfY2MgZW5kCmZvciBhY2MsYmNjIGluIHBhaXJzKGFhYSlkbwpmb3IgY2NjLGRjYyBpbiBwYWlycyhiY2MpZG8gaWYoCmRjYzpnZXRUeXBlKCk9PSJGcmFtZSIpdGhlbiBsb2NhbCBfZGM9ZGNjOmdldERlZXBPYmplY3QoZGJjKQppZihfZGN+PW5pbCl0aGVuIHJldHVybiBfZGMgZW5kIGVuZCBlbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBjZGIoZGJjKWxvY2FsIF9jYz1kYmM6Z2V0WkluZGV4KCkKaWYoYWRiKGRiYy5uYW1lKX49bmlsKXRoZW4gcmV0dXJuIG5pbCBlbmQKaWYoYWFhW19jY109PW5pbCl0aGVuCmZvciB4PTEsI2JhYSsxIGRvIGlmKGJhYVt4XX49bmlsKXRoZW4gaWYoX2NjPT1iYWFbeF0pdGhlbiBicmVhayBlbmQ7aWYKKF9jYz5iYWFbeF0pdGhlbiB0YWJsZS5pbnNlcnQoYmFhLHgsX2NjKWJyZWFrIGVuZCBlbHNlCnRhYmxlLmluc2VydChiYWEsX2NjKWVuZCBlbmQ7aWYoI2JhYTw9MCl0aGVuIHRhYmxlLmluc2VydChiYWEsX2NjKWVuZDthYWFbX2NjXT17fWVuZDtkYmMucGFyZW50PWNhYTtpZihkYmMuaW5pdH49bmlsKXRoZW4gZGJjOmluaXQoKWVuZAp0YWJsZS5pbnNlcnQoYWFhW19jY10sZGJjKXJldHVybiBkYmMgZW5kCmxvY2FsIGZ1bmN0aW9uIGRkYihkYmMsX2NjKQpmb3IgYWNjLGJjYyBpbiBwYWlycyhkYWEpZG8KZm9yIGNjYyxkY2MgaW4gcGFpcnMoYmNjKWRvCmZvciBfZGMsYWRjIGluIHBhaXJzKGRjYylkbwppZihhZGM9PV9jYyl0aGVuCnRhYmxlLnJlbW92ZShkYWFbYWNjXVtjY2NdLF9kYylpZihkYmMucGFyZW50fj1uaWwpdGhlbiBpZihhZChkYWFbYWNjXSk8PTApdGhlbgpkYmMucGFyZW50OnJlbW92ZUV2ZW50KGFjYyxkYmMpZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kCmxvY2FsIGZ1bmN0aW9uIF9fYyhkYmMsX2NjKQpmb3IgYWNjLGJjYyBpbiBwYWlycyhhYWEpZG8KZm9yIGNjYyxkY2MgaW4gcGFpcnMoYmNjKWRvCmlmKHR5cGUoX2NjKT09InN0cmluZyIpdGhlbgppZihkY2M6Z2V0TmFtZSgpPT1fY2MpdGhlbgp0YWJsZS5yZW1vdmUoYWFhW2FjY10sY2NjKWRkYihjYWEsZGNjKWRiYzp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQgZWxzZSBpZihkY2M9PV9jYyl0aGVuIHRhYmxlLnJlbW92ZShhYWFbYWNjXSxjY2MpZGRiKGNhYSxkY2MpCmRiYzp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQgZW5kIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZDtsb2NhbCBmdW5jdGlvbiBhX2MoZGJjLF9jYyxhY2MpCmZvciBiY2MsY2NjIGluIHBhaXJzKGRhYVtfY2NdKWRvIGZvciBkY2MsX2RjIGluIHBhaXJzKGNjYylkbwppZihfZGM6Z2V0TmFtZSgpPT1hY2MpdGhlbiByZXR1cm4gX2RjIGVuZCBlbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBiX2MoZGJjLF9jYyxhY2MpCmxvY2FsIGJjYz1hY2M6Z2V0WkluZGV4KClpZihkYWFbX2NjXT09bmlsKXRoZW4gZGFhW19jY109e31lbmQ7aWYoX2JhW19jY109PW5pbCl0aGVuCl9iYVtfY2NdPXt9ZW5kCmlmKGFfYyhkYmMsX2NjLGFjYy5uYW1lKX49bmlsKXRoZW4gcmV0dXJuIG5pbCBlbmQKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4gZGJjLnBhcmVudDphZGRFdmVudChfY2MsZGJjKWVuZDtkYWJbX2NjXT10cnVlCmlmKGRhYVtfY2NdW2JjY109PW5pbCl0aGVuCmZvciB4PTEsI19iYVtfY2NdKzEgZG8KaWYKKF9iYVtfY2NdW3hdfj1uaWwpdGhlbiBpZihiY2M9PV9iYVtfY2NdW3hdKXRoZW4gYnJlYWsgZW5kO2lmKGJjYz5fYmFbX2NjXVt4XSl0aGVuCnRhYmxlLmluc2VydChfYmFbX2NjXSx4LGJjYylicmVhayBlbmQgZWxzZQp0YWJsZS5pbnNlcnQoX2JhW19jY10sYmNjKWVuZCBlbmQKaWYoI19iYVtfY2NdPD0wKXRoZW4gdGFibGUuaW5zZXJ0KF9iYVtfY2NdLGJjYyllbmQ7ZGFhW19jY11bYmNjXT17fWVuZDt0YWJsZS5pbnNlcnQoZGFhW19jY11bYmNjXSxhY2MpcmV0dXJuIGFjYyBlbmQKbG9jYWwgZnVuY3Rpb24gY19jKGRiYyxfY2MsYWNjKQppZihkYWFbX2NjXX49bmlsKXRoZW4KZm9yIGJjYyxjY2MgaW4gcGFpcnMoZGFhW19jY10pZG8KZm9yIGRjYyxfZGMgaW4gcGFpcnMoY2NjKWRvCmlmKF9kYz09YWNjKXRoZW4KdGFibGUucmVtb3ZlKGRhYVtfY2NdW2JjY10sZGNjKWlmKCNkYWFbX2NjXVtiY2NdPD0wKXRoZW4gZGFhW19jY11bYmNjXT1uaWwKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4gaWYoCmFkKGRhYVtfY2NdKTw9MCl0aGVuIGRhYltfY2NdPWZhbHNlCmRiYy5wYXJlbnQ6cmVtb3ZlRXZlbnQoX2NjLGRiYyllbmQgZW5kIGVuZDtyZXR1cm4KdHJ1ZSBlbmQgZW5kIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZDtsb2NhbCBkX2M9bWF0aApsb2NhbCBmdW5jdGlvbiBfYWMoZGJjKQpsb2NhbCBfY2MsYWNjPXBjYWxsKGxvYWQoInJldHVybiAiLi5kYmMsIiIsbmlsLHttYXRoPWRfY30pKWlmIG5vdChfY2MpdGhlbgplcnJvcihkYmMuLiIgaXMgbm90IGEgdmFsaWQgZHluYW1pYyBjb2RlIillbmQ7cmV0dXJuIGFjYyBlbmQKbG9jYWwgZnVuY3Rpb24gYWFjKGRiYyxfY2MsYWNjKWZvciBiY2MsY2NjIGluIHBhaXJzKGNiYSlkbwppZihjY2NbMl09PWFjYylhbmQoY2NjWzRdPT1fY2MpdGhlbiByZXR1cm4gY2NjIGVuZCBlbmQ7ZGJhPWRiYSsxCmNiYVtkYmFdPXswLGFjYyx7fSxfY2MsZGJhfXJldHVybiBjYmFbZGJhXWVuZApsb2NhbCBmdW5jdGlvbiBiYWMoZGJjLF9jYylsb2NhbCBhY2M9e31sb2NhbCBiY2M9e31mb3IgY2NjIGluIF9jYzpnbWF0Y2goIiVhKyUueCIpZG8gbG9jYWwgZGNjPWNjYzpnc3ViKCIlLngiLCIiKQppZgooZGNjfj0ic2VsZiIpYW5kKGRjY349InBhcmVudCIpdGhlbiB0YWJsZS5pbnNlcnQoYWNjLGRjYyllbmQgZW5kCmZvciBjY2MgaW4KX2NjOmdtYXRjaCgiJXcrJS55IilkbyBsb2NhbCBkY2M9Y2NjOmdzdWIoIiUueSIsIiIpaWYoZGNjfj0ic2VsZiIpYW5kKGRjY349InBhcmVudCIpdGhlbgp0YWJsZS5pbnNlcnQoYWNjLGRjYyllbmQgZW5kO2ZvciBjY2MgaW4gX2NjOmdtYXRjaCgiJWErJS53IilkbyBsb2NhbCBkY2M9Y2NjOmdzdWIoIiUudyIsIiIpCmlmKGRjY349InNlbGYiKWFuZAooZGNjfj0icGFyZW50Iil0aGVuIHRhYmxlLmluc2VydChhY2MsZGNjKWVuZCBlbmQKZm9yIGNjYyBpbgpfY2M6Z21hdGNoKCIlYSslLmgiKWRvIGxvY2FsIGRjYz1jY2M6Z3N1YigiJS5oIiwiIilpZihkY2N+PSJzZWxmIilhbmQoZGNjfj0icGFyZW50Iil0aGVuCnRhYmxlLmluc2VydChhY2MsZGNjKWVuZCBlbmQKZm9yIGNjYyxkY2MgaW4gcGFpcnMoYWNjKWRvIGJjY1tkY2NdPWFkYihkY2MpaWYoYmNjW2RjY109PW5pbCl0aGVuCmVycm9yKCJEeW5hbWljIFZhbHVlcyAtIHVuYWJsZSB0byBmaW5kIG9iamVjdCAiLi5kY2MpZW5kIGVuZDtiY2NbInNlbGYiXT1kYmM7YmNjWyJwYXJlbnQiXT1kYmM6Z2V0UGFyZW50KClyZXR1cm4gYmNjIGVuZApsb2NhbCBmdW5jdGlvbiBjYWMoZGJjLF9jYylsb2NhbCBhY2M9ZGJjO2ZvciBiY2MgaW4gZGJjOmdtYXRjaCgiJXcrJS54IilkbwphY2M9YWNjOmdzdWIoYmNjLF9jY1tiY2M6Z3N1YigiJS54IiwiIildOmdldFgoKSllbmQ7Zm9yIGJjYyBpbiBkYmM6Z21hdGNoKCIldyslLnkiKWRvCmFjYz1hY2M6Z3N1YihiY2MsX2NjW2JjYzpnc3ViKCIlLnkiLCIiKV06Z2V0WSgpKWVuZDtmb3IgYmNjIGluIGRiYzpnbWF0Y2goIiV3KyUudyIpZG8KYWNjPWFjYzpnc3ViKGJjYyxfY2NbYmNjOmdzdWIoIiUudyIsIiIpXTpnZXRXaWR0aCgpKWVuZDtmb3IgYmNjIGluIGRiYzpnbWF0Y2goIiV3KyUuaCIpZG8KYWNjPWFjYzpnc3ViKGJjYyxfY2NbYmNjOmdzdWIoIiUuaCIsIiIpXTpnZXRIZWlnaHQoKSllbmQ7cmV0dXJuIGFjYyBlbmQKbG9jYWwgZnVuY3Rpb24gZGFjKGRiYykKaWYoI2NiYT4wKXRoZW4KZm9yIG49MSxkYmEgZG8KaWYoY2JhW25dfj1uaWwpdGhlbiBsb2NhbCBfY2M7aWYoI2NiYVtuXVszXTw9MCl0aGVuCmNiYVtuXVszXT1iYWMoY2JhW25dWzRdLGNiYVtuXVsyXSllbmQKX2NjPWNhYyhjYmFbbl1bMl0sY2JhW25dWzNdKWNiYVtuXVsxXT1fYWMoX2NjKWlmKGNiYVtuXVs0XTpnZXRUeXBlKCk9PSJGcmFtZSIpdGhlbgpjYmFbbl1bNF06cmVjYWxjdWxhdGVEeW5hbWljVmFsdWVzKCllbmQgZW5kIGVuZApmb3IgX2NjLGFjYyBpbiBwYWlycyhiYWEpZG8KaWYoYWFhW2FjY11+PW5pbCl0aGVuCmZvciBiY2MsY2NjIGluIHBhaXJzKGFhYVthY2NdKWRvCmlmCihjX2EuZ2V0RHluYW1pY1ZhbHVlRXZlbnRTZXR0aW5nKCkpdGhlbiBpZihjY2MuZXZlbnRIYW5kbGVyfj1uaWwpdGhlbgpjY2M6ZXZlbnRIYW5kbGVyKCJiYXNhbHRfZHluYW1pY3ZhbHVlIixkYmMpZW5kIGVuZDtpZihjY2MuY3VzdG9tRXZlbnRIYW5kbGVyfj1uaWwpdGhlbgpjY2M6Y3VzdG9tRXZlbnRIYW5kbGVyKCJiYXNhbHRfcmVzaXplIixkYmMpZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gX2JjKGRiYylyZXR1cm4gY2JhW2RiY11bMV1lbmQKbG9jYWwgZnVuY3Rpb24gYWJjKGRiYylsb2NhbCBfY2M9MApmb3IgYWNjLGJjYyBpbiBwYWlycyhhYWEpZG8KZm9yIGNjYyxkY2MgaW4gcGFpcnMoYmNjKWRvCmlmKApkY2MuZ2V0SGVpZ2h0fj1uaWwpYW5kKGRjYy5nZXRZfj1uaWwpdGhlbgppZgooZGNjOmdldFR5cGUoKT09IkRyb3Bkb3duIil0aGVuIGxvY2FsIF9kYyxhZGM9ZGNjOmdldEhlaWdodCgpLGRjYzpnZXRZKCkKbG9jYWwgYmRjLGNkYz1kY2M6Z2V0RHJvcGRvd25TaXplKClfZGM9X2RjK2NkYy0xCmlmKF9kYythZGMtZGJjOmdldEhlaWdodCgpPj1fY2MpdGhlbiBfY2M9ZGQoCl9kYythZGMtZGJjOmdldEhlaWdodCgpLDApZW5kIGVsc2UgbG9jYWwgX2RjLGFkYz1kY2M6Z2V0SGVpZ2h0KCksZGNjOmdldFkoKWlmKApfZGMrYWRjLWRiYzpnZXRIZWlnaHQoKT49X2NjKXRoZW4KX2NjPWRkKF9kYythZGMtZGJjOmdldEhlaWdodCgpLDApZW5kIGVuZCBlbmQgZW5kIGVuZDtyZXR1cm4gX2NjIGVuZApsb2NhbCBmdW5jdGlvbiBiYmMoZGJjKWxvY2FsIF9jYz0wCmZvciBhY2MsYmNjIGluIHBhaXJzKGFhYSlkbwpmb3IgY2NjLGRjYyBpbiBwYWlycyhiY2MpZG8KaWYKKGRjYy5nZXRXaWR0aH49bmlsKWFuZChkY2MuZ2V0WH49bmlsKXRoZW4gbG9jYWwgX2RjLGFkYz1kY2M6Z2V0V2lkdGgoKSxkY2M6Z2V0WCgpaWYoCl9kYythZGMtZGJjOmdldFdpZHRoKCk+PV9jYyl0aGVuCl9jYz1kZChfZGMrYWRjLWRiYzpnZXRXaWR0aCgpLDApZW5kIGVuZCBlbmQgZW5kO3JldHVybiBfY2MgZW5kO2xvY2FsIGZ1bmN0aW9uIGNiYyhkYmMpaWYoYmFiKXRoZW4gY2RhPWFiYyhkYmMpZW5kIGVuZApjYWE9e2JhckFjdGl2ZT1mYWxzZSxiYXJCYWNrZ3JvdW5kPWNvbG9ycy5ncmF5LGJhclRleHRjb2xvcj1jb2xvcnMuYmxhY2ssYmFyVGV4dD0iTmV3IEZyYW1lIixiYXJUZXh0QWxpZ249ImxlZnQiLGFkZEV2ZW50PWJfYyxyZW1vdmVFdmVudD1jX2MscmVtb3ZlRXZlbnRzPWRkYixnZXRFdmVudD1hX2MsbmV3RHluYW1pY1ZhbHVlPWFhYyxyZWNhbGN1bGF0ZUR5bmFtaWNWYWx1ZXM9ZGFjLGdldER5bmFtaWNWYWx1ZT1fYmMsZ2V0VHlwZT1mdW5jdGlvbihkYmMpcmV0dXJuCl9hYSBlbmQsc2V0WkluZGV4PWZ1bmN0aW9uKGRiYyxfY2MpZF9hLnNldFpJbmRleChkYmMsX2NjKWZvciBhY2MsYmNjIGluIHBhaXJzKGRhYilkbyBpZihiY2MpdGhlbgpkYmMucGFyZW50OmFkZEV2ZW50KGFjYyxkYmMpZW5kIGVuZDtyZXR1cm4gZGJjIGVuZCxzZXRGb2N1c2VkT2JqZWN0PWZ1bmN0aW9uKGRiYyxfY2MpCmlmKApfYWJ+PV9jYyl0aGVuIGlmKF9hYn49bmlsKXRoZW4KaWYoYWRiKF9hYil+PW5pbCl0aGVuIF9hYjpsb3NlRm9jdXNIYW5kbGVyKCllbmQgZW5kO2lmKF9jY349bmlsKXRoZW4gaWYoYWRiKF9jYyl+PW5pbCl0aGVuCl9jYzpnZXRGb2N1c0hhbmRsZXIoKWVuZCBlbmQ7X2FiPV9jYyBlbmQ7cmV0dXJuIGRiYyBlbmQsZ2V0VmFyaWFibGU9ZnVuY3Rpb24oZGJjLF9jYylyZXR1cm4KY19hLmdldFZhcmlhYmxlKF9jYyllbmQsc2V0U2l6ZT1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MpCmRfYS5zZXRTaXplKGRiYyxfY2MsYWNjLGJjYylpZihkYmMucGFyZW50PT1uaWwpdGhlbiBhYmI9ZGIoX2NhKWVuZApmb3IgY2NjLGRjYyBpbiBwYWlycyhiYWEpZG8gaWYoYWFhW2RjY11+PW5pbCl0aGVuCmZvciBfZGMsYWRjIGluCnBhaXJzKGFhYVtkY2NdKWRvIGlmKGFkYy5jdXN0b21FdmVudEhhbmRsZXJ+PW5pbCl0aGVuCmFkYzpjdXN0b21FdmVudEhhbmRsZXIoImJhc2FsdF9yZXNpemUiLGRiYyllbmQgZW5kIGVuZCBlbmQ7ZGJjOnJlY2FsY3VsYXRlRHluYW1pY1ZhbHVlcygpYWFiPWZhbHNlO3JldHVybiBkYmMgZW5kLHNldFRoZW1lPWZ1bmN0aW9uKGRiYyxfY2MsYWNjKQppZigKdHlwZShfY2MpPT0idGFibGUiKXRoZW4gYmJhPV9jYyBlbHNlaWYodHlwZShfY2MpPT0ic3RyaW5nIil0aGVuIGJiYVtfY2NdPWFjYyBlbmQ7ZGJjOnVwZGF0ZURyYXcoKXJldHVybiBkYmMgZW5kLGdldFRoZW1lPWZ1bmN0aW9uKGRiYyxfY2MpCnJldHVybgpiYmFbX2NjXW9yKGRiYy5wYXJlbnR+PW5pbCBhbmQgZGJjLnBhcmVudDpnZXRUaGVtZShfY2Mpb3IKY19hLmdldFRoZW1lKF9jYykpZW5kLGdldFRoZW1lQ29sb3I9ZnVuY3Rpb24oZGJjLF9jYylyZXR1cm4KX2Njfj1uaWwgYW5kIF9iYltfY2Ndb3IgX2JiIGVuZCxzZXRUaGVtZUNvbG9yPWZ1bmN0aW9uKGRiYyxfY2MsLi4uKQppZgooZGJjLnBhcmVudD09bmlsKXRoZW4KaWYoZGJjPT1jX2EuZ2V0QWN0aXZlRnJhbWUoKSl0aGVuCmlmKHR5cGUoX2NjKT09InN0cmluZyIpdGhlbiBfYmJbX2NjXT0uLi4KX2NhLnNldFBhbGV0dGVDb2xvcigKdHlwZShfY2MpPT0ibnVtYmVyImFuZCBfY2Mgb3IgY29sb3JzW19jY10sLi4uKWVsc2VpZih0eXBlKF9jYyk9PSJ0YWJsZSIpdGhlbgpmb3IgYWNjLGJjYyBpbiBwYWlycyhfY2MpZG8gX2JiW2FjY109YmNjCmlmKHR5cGUoYmNjKT09Im51bWJlciIpdGhlbgpfY2Euc2V0UGFsZXR0ZUNvbG9yKAp0eXBlKGFjYyk9PSJudW1iZXIiYW5kIGFjYyBvciBjb2xvcnNbYWNjXSxiY2MpZWxzZSBsb2NhbCBjY2MsZGNjLF9kYz10YWJsZS51bnBhY2soYmNjKQpfY2Euc2V0UGFsZXR0ZUNvbG9yKAp0eXBlKGFjYyk9PSJudW1iZXIiYW5kIGFjYyBvciBjb2xvcnNbYWNjXSxjY2MsZGNjLF9kYyllbmQgZW5kIGVuZCBlbmQgZW5kO3JldHVybiBkYmMgZW5kLHNldFBvc2l0aW9uPWZ1bmN0aW9uKGRiYyxfY2MsYWNjLGJjYykKZF9hLnNldFBvc2l0aW9uKGRiYyxfY2MsYWNjLGJjYylkYmM6cmVjYWxjdWxhdGVEeW5hbWljVmFsdWVzKClyZXR1cm4gZGJjIGVuZCxnZXRCYXNhbHRJbnN0YW5jZT1mdW5jdGlvbihkYmMpcmV0dXJuCmNfYSBlbmQsc2V0T2Zmc2V0PWZ1bmN0aW9uKGRiYyxfY2MsYWNjKQphY2I9X2Njfj1uaWwgYW5kCmRfYy5mbG9vcihfY2M8MCBhbmQgZF9jLmFicyhfY2Mpb3ItX2NjKW9yIGFjYgpiY2I9YWNjfj1uaWwgYW5kCmRfYy5mbG9vcihhY2M8MCBhbmQgZF9jLmFicyhhY2Mpb3ItYWNjKW9yIGJjYjtkYmM6dXBkYXRlRHJhdygpcmV0dXJuIGRiYyBlbmQsZ2V0T2Zmc2V0SW50ZXJuYWw9ZnVuY3Rpb24oZGJjKXJldHVybgphY2IsYmNiIGVuZCxnZXRPZmZzZXQ9ZnVuY3Rpb24oZGJjKXJldHVybiBhY2I8MCBhbmQgZF9jLmFicyhhY2Ipb3ItYWNiLGJjYjwwIGFuZApkX2MuYWJzKGJjYilvci1iY2IgZW5kLHJlbW92ZUZvY3VzZWRPYmplY3Q9ZnVuY3Rpb24oZGJjKWlmKApfYWJ+PW5pbCl0aGVuCmlmKGFkYihfYWIpfj1uaWwpdGhlbiBfYWI6bG9zZUZvY3VzSGFuZGxlcigpZW5kIGVuZDtfYWI9bmlsO3JldHVybiBkYmMgZW5kLGdldEZvY3VzZWRPYmplY3Q9ZnVuY3Rpb24oZGJjKXJldHVybgpfYWIgZW5kLHNldEN1cnNvcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MsY2NjKQppZihkYmMucGFyZW50fj1uaWwpdGhlbgpsb2NhbCBkY2MsX2RjPWRiYzpnZXRBbmNob3JQb3NpdGlvbigpCmRiYy5wYXJlbnQ6c2V0Q3Vyc29yKF9jYyBvciBmYWxzZSwoYWNjIG9yIDApK2RjYy0xLChiY2Mgb3IgMCkrX2RjLTEsCmNjYyBvciBfY2IpZWxzZQpsb2NhbCBkY2MsX2RjPWRiYzpnZXRBYnNvbHV0ZVBvc2l0aW9uKGRiYzpnZXRBbmNob3JQb3NpdGlvbihkYmM6Z2V0WCgpLGRiYzpnZXRZKCksdHJ1ZSkpYmJiPV9jYyBvciBmYWxzZTtpZihhY2N+PW5pbCl0aGVuIGNiYj1kY2MrYWNjLTEgZW5kO2lmKGJjY349bmlsKXRoZW4gZGJiPV9kYysKYmNjLTEgZW5kO19jYj1jY2Mgb3IgX2NiO2lmKGJiYil0aGVuCl9jYS5zZXRUZXh0Q29sb3IoX2NiKV9jYS5zZXRDdXJzb3JQb3MoY2JiLGRiYilfY2Euc2V0Q3Vyc29yQmxpbmsoYmJiKWVsc2UKX2NhLnNldEN1cnNvckJsaW5rKGZhbHNlKWVuZCBlbmQ7cmV0dXJuIGRiYyBlbmQsc2V0TW92YWJsZT1mdW5jdGlvbihkYmMsX2NjKQppZigKZGJjLnBhcmVudH49bmlsKXRoZW4gYl9iPV9jYyBvciBub3QgYl9iCmRiYy5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2NsaWNrIixkYmMpZGFiWyJtb3VzZV9jbGljayJdPXRydWUKZGJjLnBhcmVudDphZGRFdmVudCgibW91c2VfdXAiLGRiYylkYWJbIm1vdXNlX3VwIl09dHJ1ZQpkYmMucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9kcmFnIixkYmMpZGFiWyJtb3VzZV9kcmFnIl09dHJ1ZSBlbmQ7cmV0dXJuIGRiYyBlbmQsc2V0U2Nyb2xsYWJsZT1mdW5jdGlvbihkYmMsX2NjKWJkYT0oCl9jYyBvciBfY2M9PW5pbClhbmQgdHJ1ZSBvciBmYWxzZQppZigKZGJjLnBhcmVudH49bmlsKXRoZW4gZGJjLnBhcmVudDphZGRFdmVudCgibW91c2Vfc2Nyb2xsIixkYmMpZW5kO2RhYlsibW91c2Vfc2Nyb2xsIl09dHJ1ZTtyZXR1cm4gZGJjIGVuZCxzZXRTY3JvbGxBbW91bnQ9ZnVuY3Rpb24oZGJjLF9jYyljZGE9Cl9jYyBvciBjZGE7YmFiPWZhbHNlO3JldHVybiBkYmMgZW5kLGdldFNjcm9sbEFtb3VudD1mdW5jdGlvbihkYmMpcmV0dXJuIGJhYiBhbmQgY2JjKGRiYylvcgpjZGEgZW5kLGdldENhbGN1bGF0ZWRWZXJ0aWNhbFNjcm9sbD1hYmMsZ2V0Q2FsY3VsYXRlZEhvcml6b250YWxTY3JvbGw9YmJjLHNob3c9ZnVuY3Rpb24oZGJjKWRfYS5zaG93KGRiYykKaWYoCmRiYy5wYXJlbnQ9PW5pbCl0aGVuIGNfYS5zZXRBY3RpdmVGcmFtZShkYmMpCmZvciBfY2MsYWNjIGluIHBhaXJzKGNvbG9ycylkbyBpZgoodHlwZShhY2MpPT0ibnVtYmVyIil0aGVuCl9jYS5zZXRQYWxldHRlQ29sb3IoYWNjLGNvbG9ycy5wYWNrUkdCKHRlcm0ubmF0aXZlUGFsZXR0ZUNvbG9yKChhY2MpKSkpZW5kIGVuZApmb3IgX2NjLGFjYyBpbiBwYWlycyhfYmIpZG8KaWYodHlwZShhY2MpPT0ibnVtYmVyIil0aGVuCl9jYS5zZXRQYWxldHRlQ29sb3IoCnR5cGUoX2NjKT09Im51bWJlciJhbmQgX2NjIG9yIGNvbG9yc1tfY2NdLGFjYyllbHNlIGxvY2FsIGJjYyxjY2MsZGNjPXRhYmxlLnVucGFjayhhY2MpCl9jYS5zZXRQYWxldHRlQ29sb3IoCnR5cGUoX2NjKT09Im51bWJlciJhbmQgX2NjIG9yIGNvbG9yc1tfY2NdLGJjYyxjY2MsZGNjKWVuZCBlbmQKaWYoYmNhKWFuZCBub3QoY2NhKXRoZW4gY19hLnNldE1vbml0b3JGcmFtZShhY2EsZGJjKWVsc2VpZihjY2EpdGhlbgpjX2Euc2V0TW9uaXRvckZyYW1lKGRiYzpnZXROYW1lKCksZGJjLGFjYSllbHNlIGNfYS5zZXRNYWluRnJhbWUoZGJjKWVuZCBlbmQ7cmV0dXJuIGRiYyBlbmQsaGlkZT1mdW5jdGlvbihkYmMpCmRfYS5oaWRlKGRiYykKaWYoZGJjLnBhcmVudD09bmlsKXRoZW4gaWYoYWN0aXZlRnJhbWU9PWRiYyl0aGVuIGFjdGl2ZUZyYW1lPW5pbCBlbmQKaWYoYmNhKWFuZApub3QoY2NhKXRoZW4gaWYoY19hLmdldE1vbml0b3JGcmFtZShhY2EpPT1kYmMpdGhlbgpjX2Euc2V0QWN0aXZlRnJhbWUobmlsKWVuZCBlbHNlaWYoY2NhKXRoZW4KaWYoCmNfYS5nZXRNb25pdG9yRnJhbWUoZGJjOmdldE5hbWUoKSk9PWRiYyl0aGVuIGNfYS5zZXRBY3RpdmVGcmFtZShuaWwpZW5kIGVsc2UKaWYoY19hLmdldE1haW5GcmFtZSgpPT1kYmMpdGhlbiBjX2Euc2V0TWFpbkZyYW1lKG5pbCllbmQgZW5kIGVuZDtyZXR1cm4gZGJjIGVuZCxhZGRMYXlvdXQ9ZnVuY3Rpb24oZGJjLF9jYykKaWYoCl9jY349bmlsKXRoZW4KaWYoZnMuZXhpc3RzKF9jYykpdGhlbiBsb2NhbCBhY2M9ZnMub3BlbihfY2MsInIiKQpsb2NhbCBiY2M9YWM6UGFyc2VYbWxUZXh0KGFjYy5yZWFkQWxsKCkpYWNjLmNsb3NlKCljY2I9e31kYmM6c2V0VmFsdWVzQnlYTUxEYXRhKGJjYyllbmQgZW5kO3JldHVybiBkYmMgZW5kLGdldExhc3RMYXlvdXQ9ZnVuY3Rpb24oZGJjKXJldHVybgpjY2IgZW5kLGFkZExheW91dEZyb21TdHJpbmc9ZnVuY3Rpb24oZGJjLF9jYylpZihfY2N+PW5pbCl0aGVuIGxvY2FsIGFjYz1hYzpQYXJzZVhtbFRleHQoX2NjKQpkYmM6c2V0VmFsdWVzQnlYTUxEYXRhKGFjYyllbmQ7cmV0dXJuIGRiYyBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGRiYyxfY2MpCmRfYS5zZXRWYWx1ZXNCeVhNTERhdGEoZGJjLF9jYylpZihfZCgibW92YWJsZSIsX2NjKX49bmlsKXRoZW4gaWYoX2QoIm1vdmFibGUiLF9jYykpdGhlbgpkYmM6c2V0TW92YWJsZSh0cnVlKWVuZCBlbmQ7aWYoCl9kKCJzY3JvbGxhYmxlIixfY2Mpfj1uaWwpdGhlbgppZihfZCgic2Nyb2xsYWJsZSIsX2NjKSl0aGVuIGRiYzpzZXRTY3JvbGxhYmxlKHRydWUpZW5kIGVuZDtpZgooX2QoIm1vbml0b3IiLF9jYyl+PW5pbCl0aGVuCmRiYzpzZXRNb25pdG9yKF9kKCJtb25pdG9yIixfY2MpKTpzaG93KCllbmQ7aWYoX2QoIm1pcnJvciIsX2NjKX49bmlsKXRoZW4KZGJjOnNldE1pcnJvcihfZCgibWlycm9yIixfY2MpKWVuZAppZihfZCgiYmFyIixfY2Mpfj1uaWwpdGhlbiBpZihfZCgiYmFyIixfY2MpKXRoZW4KZGJjOnNob3dCYXIodHJ1ZSllbHNlIGRiYzpzaG93QmFyKGZhbHNlKWVuZCBlbmQKaWYoX2QoImJhclRleHQiLF9jYyl+PW5pbCl0aGVuIGRiYy5iYXJUZXh0PV9kKCJiYXJUZXh0IixfY2MpZW5kO2lmKF9kKCJiYXJCRyIsX2NjKX49bmlsKXRoZW4KZGJjLmJhckJhY2tncm91bmQ9Y29sb3JzW19kKCJiYXJCRyIsX2NjKV1lbmQ7aWYoX2QoImJhckZHIixfY2Mpfj1uaWwpdGhlbgpkYmMuYmFyVGV4dGNvbG9yPWNvbG9yc1tfZCgiYmFyRkciLF9jYyldZW5kO2lmKF9kKCJiYXJBbGlnbiIsX2NjKX49bmlsKXRoZW4KZGJjLmJhclRleHRBbGlnbj1fZCgiYmFyQWxpZ24iLF9jYyllbmQ7aWYoX2QoImxheW91dCIsX2NjKX49bmlsKXRoZW4KZGJjOmFkZExheW91dChfZCgibGF5b3V0IixfY2MpKWVuZDtpZihfZCgieE9mZnNldCIsX2NjKX49bmlsKXRoZW4KZGJjOnNldE9mZnNldChfZCgieE9mZnNldCIsX2NjKSxiY2IpZW5kO2lmKF9kKCJ5T2Zmc2V0IixfY2Mpfj1uaWwpdGhlbgpkYmM6c2V0T2Zmc2V0KGJjYixfZCgieU9mZnNldCIsX2NjKSllbmQ7aWYoX2QoInNjcm9sbEFtb3VudCIsX2NjKX49bmlsKXRoZW4KZGJjOnNldFNjcm9sbEFtb3VudChfZCgic2Nyb2xsQW1vdW50IixfY2MpKWVuZDtsb2NhbCBhY2M9X2NjOmNoaWxkcmVuKCkKZm9yIGJjYyxjY2MgaW4KcGFpcnMoYWNjKWRvIGlmKGNjYy5fX19uYW1lfj0iYW5pbWF0aW9uIil0aGVuCmxvY2FsIGRjYz1jY2MuX19fbmFtZTpnc3ViKCJeJWwiLHN0cmluZy51cHBlcikKaWYoY2JbZGNjXX49bmlsKXRoZW4gX2RiKGNjYyxkYmNbImFkZCIuLmRjY10sZGJjKWVuZCBlbmQgZW5kO19kYihfY2NbImZyYW1lIl0sZGJjLmFkZEZyYW1lLGRiYykKX2RiKF9jY1siYW5pbWF0aW9uIl0sZGJjLmFkZEFuaW1hdGlvbixkYmMpcmV0dXJuIGRiYyBlbmQsc2hvd0Jhcj1mdW5jdGlvbihkYmMsX2NjKWRiYy5iYXJBY3RpdmU9Cl9jYyBvciBub3QgZGJjLmJhckFjdGl2ZTtkYmM6dXBkYXRlRHJhdygpCnJldHVybiBkYmMgZW5kLHNldEJhcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MpZGJjLmJhclRleHQ9X2NjIG9yIiJkYmMuYmFyQmFja2dyb3VuZD0KYWNjIG9yIGRiYy5iYXJCYWNrZ3JvdW5kCmRiYy5iYXJUZXh0Y29sb3I9YmNjIG9yIGRiYy5iYXJUZXh0Y29sb3I7ZGJjOnVwZGF0ZURyYXcoKXJldHVybiBkYmMgZW5kLHNldEJhclRleHRBbGlnbj1mdW5jdGlvbihkYmMsX2NjKWRiYy5iYXJUZXh0QWxpZ249Cl9jYyBvciJsZWZ0ImRiYzp1cGRhdGVEcmF3KClyZXR1cm4gZGJjIGVuZCxzZXRNaXJyb3I9ZnVuY3Rpb24oZGJjLF9jYylpZigKZGJjLnBhcmVudH49bmlsKXRoZW4KZXJyb3IoIkZyYW1lIGhhcyB0byBiZSBhIGJhc2UgZnJhbWUgaW4gb3JkZXIgdG8gYXR0YWNoIGEgbWlycm9yLiIpZW5kO2FfYj1fY2M7aWYobWlycm9yfj1uaWwpdGhlbgphYmIuc2V0TWlycm9yKG1pcnJvcillbmQ7ZGRhPXRydWU7cmV0dXJuIGRiYyBlbmQscmVtb3ZlTWlycm9yPWZ1bmN0aW9uKGRiYyltaXJyb3I9Cm5pbDtkZGE9ZmFsc2U7YWJiLnNldE1pcnJvcihuaWwpcmV0dXJuIGRiYyBlbmQsc2V0TW9uaXRvclNjYWxlPWZ1bmN0aW9uKGRiYyxfY2MpaWYKKGJjYSl0aGVuIF9jYS5zZXRUZXh0U2NhbGUoX2NjKWVuZDtyZXR1cm4gZGJjIGVuZCxzZXRNb25pdG9yPWZ1bmN0aW9uKGRiYyxfY2MsYWNjKQppZigKX2Njfj1uaWwpYW5kKF9jY349ZmFsc2UpdGhlbgppZih0eXBlKF9jYyk9PSJzdHJpbmciKXRoZW4KaWYoCnBlcmlwaGVyYWwuZ2V0VHlwZShfY2MpPT0ibW9uaXRvciIpdGhlbiBfY2E9cGVyaXBoZXJhbC53cmFwKF9jYylkY2E9dHJ1ZSBlbmQKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4gZGJjLnBhcmVudDpyZW1vdmVPYmplY3QoZGJjKWVuZDtiY2E9dHJ1ZTtjX2Euc2V0TW9uaXRvckZyYW1lKF9jYyxkYmMpZWxzZWlmKHR5cGUoX2NjKT09InRhYmxlIil0aGVuCl9jYT1iYyhfY2MpZGNhPXRydWU7YmNhPXRydWU7Y2NhPXRydWUKY19hLnNldE1vbml0b3JGcmFtZShkYmM6Z2V0TmFtZSgpLGRiYyx0cnVlKWVuZCBlbHNlIF9jYT1wYXJlbnRUZXJtaW5hbDtiY2E9ZmFsc2U7Y2NhPWZhbHNlCmlmKHR5cGUoYWNhKT09InN0cmluZyIpdGhlbgppZigKY19hLmdldE1vbml0b3JGcmFtZShhY2EpPT1kYmMpdGhlbiBjX2Euc2V0TW9uaXRvckZyYW1lKGFjYSxuaWwpZW5kIGVsc2UKaWYoY19hLmdldE1vbml0b3JGcmFtZShkYmM6Z2V0TmFtZSgpKT09ZGJjKXRoZW4gY19hLnNldE1vbml0b3JGcmFtZShkYmM6Z2V0TmFtZSgpLApuaWwpZW5kIGVuZCBlbmQ7aWYoYWNjfj1uaWwpdGhlbiBfY2Euc2V0VGV4dFNjYWxlKGFjYyllbmQ7YWJiPWRiKF9jYSkKZGJjOnNldFNpemUoX2NhLmdldFNpemUoKSlhYWI9dHJ1ZTthY2E9X2NjIG9yIG5pbDtkYmM6dXBkYXRlRHJhdygpcmV0dXJuIGRiYyBlbmQsbG9zZUZvY3VzSGFuZGxlcj1mdW5jdGlvbihkYmMpCmRfYS5sb3NlRm9jdXNIYW5kbGVyKGRiYylpZihfYWJ+PW5pbCl0aGVuIF9hYjpsb3NlRm9jdXNIYW5kbGVyKClfYWI9bmlsIGVuZCBlbmQsZ2V0Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGRiYykKZF9hLmdldEZvY3VzSGFuZGxlcihkYmMpCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmlmKGJfYil0aGVuIGRiYy5wYXJlbnQ6cmVtb3ZlRXZlbnRzKGRiYykKZGJjLnBhcmVudDpyZW1vdmVPYmplY3QoZGJjKWRiYy5wYXJlbnQ6YWRkT2JqZWN0KGRiYylmb3IgX2NjLGFjYyBpbiBwYWlycyhkYWIpZG8gaWYoYWNjKXRoZW4KZGJjLnBhcmVudDphZGRFdmVudChfY2MsZGJjKWVuZCBlbmQKZGJjOnVwZGF0ZURyYXcoKWVuZCBlbmQ7aWYoX2Fifj1uaWwpdGhlbiBfYWI6Z2V0Rm9jdXNIYW5kbGVyKCllbmQgZW5kLGV2ZW50SGFuZGxlcj1mdW5jdGlvbihkYmMsX2NjLC4uLikKZF9hLmV2ZW50SGFuZGxlcihkYmMsX2NjLC4uLikKaWYoZGFhWyJvdGhlcl9ldmVudCJdfj1uaWwpdGhlbgpmb3IgYWNjLGJjYyBpbiBpcGFpcnMoX2JhWyJvdGhlcl9ldmVudCJdKWRvIGlmKApkYWFbIm90aGVyX2V2ZW50Il1bYmNjXX49bmlsKXRoZW4KZm9yIGNjYyxkY2MgaW4gZGMoZGFhWyJvdGhlcl9ldmVudCJdW2JjY10pZG8gaWYKKGRjYy5ldmVudEhhbmRsZXJ+PW5pbCl0aGVuIGRjYzpldmVudEhhbmRsZXIoX2NjLC4uLillbmQgZW5kIGVuZCBlbmQgZW5kCmlmKGFhYilhbmQgbm90KGJjYSl0aGVuIGlmKGRiYy5wYXJlbnQ9PW5pbCl0aGVuCmlmKF9jYz09InRlcm1fcmVzaXplIil0aGVuCmRiYzpzZW5kRXZlbnQoImJhc2FsdF9yZXNpemUiLGRiYyxfY2MsLi4uKWRiYzpzZXRTaXplKF9jYS5nZXRTaXplKCkpYWFiPXRydWUgZW5kIGVuZCBlbmQKaWYoYmNhKXRoZW4KaWYoYWFiKXRoZW4KaWYoX2NjPT0ibW9uaXRvcl9yZXNpemUiKXRoZW4KaWYodHlwZShhY2EpPT0ic3RyaW5nIil0aGVuCmRiYzpzZXRTaXplKF9jYS5nZXRTaXplKCkpZWxzZWlmKHR5cGUoYWNhKT09InRhYmxlIil0aGVuCmZvciBhY2MsYmNjIGluIHBhaXJzKGFjYSlkbyBmb3IgY2NjLGRjYyBpbiBwYWlycyhiY2MpZG8gaWYocDEgPT1kY2MpdGhlbgpkYmM6c2V0U2l6ZShfY2EuZ2V0U2l6ZSgpKWVuZCBlbmQgZW5kIGVuZDthYWI9dHJ1ZTtkYmM6dXBkYXRlRHJhdygpZW5kIGVuZAppZihfY2M9PSJwZXJpcGhlcmFsIilhbmQocDEgPT1hY2EpdGhlbiBpZgoocGVyaXBoZXJhbC5nZXRUeXBlKGFjYSk9PSJtb25pdG9yIil0aGVuIGRjYT10cnVlO19jYT1wZXJpcGhlcmFsLndyYXAoYWNhKWFiYj1kYihfY2EpCmRiYzp1cGRhdGVEcmF3KCllbmQgZW5kCmlmKF9jYz09InBlcmlwaGVyYWxfZGV0YWNoIilhbmQocDEgPT1hY2EpdGhlbiBkY2E9ZmFsc2UgZW5kIGVuZAppZihkZGEpdGhlbiBpZihwZXJpcGhlcmFsLmdldFR5cGUoYV9iKT09Im1vbml0b3IiKXRoZW4gX19iPXRydWUKYWJiLnNldE1pcnJvcihwZXJpcGhlcmFsLndyYXAoYV9iKSllbmQ7aWYoX2NjPT0icGVyaXBoZXJhbF9kZXRhY2giKWFuZAoocDEgPT1hX2IpdGhlbiBkY2E9ZmFsc2UgZW5kCmlmCihfY2M9PSJtb25pdG9yX3RvdWNoIilhbmQoYV9iPT1wMSl0aGVuIGRiYzptb3VzZUhhbmRsZXIoMSxwMixwMyx0cnVlKWVuZCBlbmQgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MsY2NjLGRjYykKaWYKKGNjYSl0aGVuIGlmKF9jYS5jYWxjdWxhdGVDbGlja349bmlsKXRoZW4KYWNjLGJjYz1fY2EuY2FsY3VsYXRlQ2xpY2soZGNjLGFjYyxiY2MpZW5kIGVuZAppZihkX2EubW91c2VIYW5kbGVyKGRiYyxfY2MsYWNjLGJjYyxjY2MpKXRoZW4KaWYoZGFhWyJtb3VzZV9jbGljayJdfj1uaWwpdGhlbgpkYmM6c2V0Q3Vyc29yKGZhbHNlKQpmb3IgX2RjLGFkYyBpbiBpcGFpcnMoX2JhWyJtb3VzZV9jbGljayJdKWRvCmlmCihkYWFbIm1vdXNlX2NsaWNrIl1bYWRjXX49bmlsKXRoZW4gZm9yIGJkYyxjZGMgaW4gZGMoZGFhWyJtb3VzZV9jbGljayJdW2FkY10pZG8KaWYoY2RjLm1vdXNlSGFuZGxlcn49bmlsKXRoZW4gaWYKKGNkYzptb3VzZUhhbmRsZXIoX2NjLGFjYyxiY2MsY2NjKSl0aGVuIHJldHVybiB0cnVlIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kCmlmKGJfYil0aGVuCmxvY2FsIF9kYyxhZGM9ZGJjOmdldEFic29sdXRlUG9zaXRpb24oZGJjOmdldEFuY2hvclBvc2l0aW9uKCkpaWYKKGFjYz49X2RjKWFuZChhY2M8PV9kYytkYmM6Z2V0V2lkdGgoKS0xKWFuZChiY2M9PWFkYyl0aGVuIGNfYj10cnVlO19kYT1fZGMtYWNjCmFkYT15T2ZmIGFuZCAxIG9yIDAgZW5kIGVuZDtkYmM6cmVtb3ZlRm9jdXNlZE9iamVjdCgpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsbW91c2VVcEhhbmRsZXI9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjKWlmCihjX2IpdGhlbiBjX2I9ZmFsc2UgZW5kCmlmKGRfYS5tb3VzZVVwSGFuZGxlcihkYmMsX2NjLGFjYyxiY2MpKXRoZW4KaWYKKGRhYVsibW91c2VfdXAiXX49bmlsKXRoZW4KZm9yIGNjYyxkY2MgaW4gaXBhaXJzKF9iYVsibW91c2VfdXAiXSlkbwppZihkYWFbIm1vdXNlX3VwIl1bZGNjXX49bmlsKXRoZW4KZm9yIF9kYyxhZGMgaW4KZGMoZGFhWyJtb3VzZV91cCJdW2RjY10pZG8gaWYoYWRjLm1vdXNlVXBIYW5kbGVyfj1uaWwpdGhlbgppZihhZGM6bW91c2VVcEhhbmRsZXIoX2NjLGFjYyxiY2MpKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQ7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MpCmlmCihkX2Euc2Nyb2xsSGFuZGxlcihkYmMsX2NjLGFjYyxiY2MpKXRoZW4KaWYoZGFhWyJtb3VzZV9zY3JvbGwiXX49bmlsKXRoZW4KZm9yIGRjYyxfZGMgaW4gcGFpcnMoX2JhWyJtb3VzZV9zY3JvbGwiXSlkbwppZigKZGFhWyJtb3VzZV9zY3JvbGwiXVtfZGNdfj1uaWwpdGhlbgpmb3IgYWRjLGJkYyBpbiBkYyhkYWFbIm1vdXNlX3Njcm9sbCJdW19kY10pZG8gaWYoYmRjLnNjcm9sbEhhbmRsZXJ+PQpuaWwpdGhlbgppZihiZGM6c2Nyb2xsSGFuZGxlcihfY2MsYWNjLGJjYykpdGhlbiByZXR1cm4gdHJ1ZSBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZDtsb2NhbCBjY2M9YmNiCmlmKGJkYSl0aGVuIGNiYyhkYmMpaWYoX2NjPjApb3IoX2NjPDApdGhlbgpiY2I9ZGQoY2QoYmNiLV9jYywwKSwtY2RhKWRiYzp1cGRhdGVEcmF3KCllbmQgZW5kO2lmKGJjYj09Y2NjKXRoZW4gcmV0dXJuIGZhbHNlIGVuZDtkYmM6cmVtb3ZlRm9jdXNlZE9iamVjdCgpCnJldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGhvdmVySGFuZGxlcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MpCmlmCihkX2EuaG92ZXJIYW5kbGVyKGRiYyxfY2MsYWNjLGJjYykpdGhlbgppZihkYWFbIm1vdXNlX21vdmUiXX49bmlsKXRoZW4KZm9yIGNjYyxkY2MgaW4gcGFpcnMoX2JhWyJtb3VzZV9tb3ZlIl0pZG8KaWYoCmRhYVsibW91c2VfbW92ZSJdW2RjY11+PW5pbCl0aGVuIGZvciBfZGMsYWRjIGluIGRjKGRhYVsibW91c2VfbW92ZSJdW2RjY10pZG8KaWYKKGFkYy5ob3ZlckhhbmRsZXJ+PW5pbCl0aGVuIGlmKGFkYzpob3ZlckhhbmRsZXIoX2NjLGFjYyxiY2MpKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kO3JldHVybiBmYWxzZSBlbmQsZHJhZ0hhbmRsZXI9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjKQppZgooY19iKXRoZW4gbG9jYWwgY2NjLGRjYz1kYmMucGFyZW50OmdldE9mZnNldEludGVybmFsKCljY2M9Y2NjPDAgYW5kCmRfYy5hYnMoY2NjKW9yLWNjYztkY2M9ZGNjPDAgYW5kIGRfYy5hYnMoZGNjKW9yLQpkY2M7bG9jYWwgX2RjPTE7bG9jYWwgYWRjPTE7aWYoZGJjLnBhcmVudH49bmlsKXRoZW4KX2RjLGFkYz1kYmMucGFyZW50OmdldEFic29sdXRlUG9zaXRpb24oZGJjLnBhcmVudDpnZXRBbmNob3JQb3NpdGlvbigpKWVuZApkYmM6c2V0UG9zaXRpb24oCmFjYytfZGEtIChfZGMtMSkrY2NjLGJjYythZGEtIChhZGMtMSkrZGNjKWRiYzp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQKaWYoZGJjOmlzVmlzaWJsZSgpKWFuZChkYmM6aXNFbmFibGVkKCkpdGhlbgppZgooZGFhWyJtb3VzZV9kcmFnIl1+PW5pbCl0aGVuCmZvciBjY2MsZGNjIGluIGlwYWlycyhfYmFbIm1vdXNlX2RyYWciXSlkbwppZgooZGFhWyJtb3VzZV9kcmFnIl1bZGNjXX49bmlsKXRoZW4gZm9yIF9kYyxhZGMgaW4gZGMoZGFhWyJtb3VzZV9kcmFnIl1bZGNjXSlkbwppZihhZGMuZHJhZ0hhbmRsZXJ+PW5pbCl0aGVuIGlmCihhZGM6ZHJhZ0hhbmRsZXIoX2NjLGFjYyxiY2MpKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kO2RfYS5kcmFnSGFuZGxlcihkYmMsX2NjLGFjYyxiY2MpcmV0dXJuIGZhbHNlIGVuZCxrZXlIYW5kbGVyPWZ1bmN0aW9uKGRiYyxfY2MsYWNjKQppZgooZGJjOmlzRm9jdXNlZCgpKW9yKGRiYy5wYXJlbnQ9PW5pbCl0aGVuCmxvY2FsIGJjYz1kYmM6Z2V0RXZlbnRTeXN0ZW0oKTpzZW5kRXZlbnQoImtleSIsZGJjLCJrZXkiLF9jYylpZihiY2M9PWZhbHNlKXRoZW4gcmV0dXJuIGZhbHNlIGVuZAppZihkYWFbImtleSJdfj1uaWwpdGhlbgpmb3IgY2NjLGRjYyBpbiBwYWlycyhfYmFbImtleSJdKWRvCmlmKApkYWFbImtleSJdW2RjY11+PW5pbCl0aGVuCmZvciBfZGMsYWRjIGluIGRjKGRhYVsia2V5Il1bZGNjXSlkbyBpZihhZGMua2V5SGFuZGxlcn49bmlsKXRoZW4gaWYKKGFkYzprZXlIYW5kbGVyKF9jYyxhY2MpKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kO3JldHVybiBmYWxzZSBlbmQsa2V5VXBIYW5kbGVyPWZ1bmN0aW9uKGRiYyxfY2MpCmlmCihkYmM6aXNGb2N1c2VkKCkpb3IoZGJjLnBhcmVudD09bmlsKXRoZW4KbG9jYWwgYWNjPWRiYzpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudCgia2V5X3VwIixkYmMsImtleV91cCIsX2NjKWlmKGFjYz09ZmFsc2UpdGhlbiByZXR1cm4gZmFsc2UgZW5kCmlmKGRhYVsia2V5X3VwIl1+PW5pbCl0aGVuCmZvciBiY2MsY2NjIGluCnBhaXJzKF9iYVsia2V5X3VwIl0pZG8KaWYoZGFhWyJrZXlfdXAiXVtjY2Ndfj1uaWwpdGhlbiBmb3IgZGNjLF9kYyBpbiBkYyhkYWFbImtleV91cCJdW2NjY10pZG8KaWYoCl9kYy5rZXlVcEhhbmRsZXJ+PW5pbCl0aGVuIGlmKF9kYzprZXlVcEhhbmRsZXIoX2NjKSl0aGVuIHJldHVybiB0cnVlIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGNoYXJIYW5kbGVyPWZ1bmN0aW9uKGRiYyxfY2MpCmlmCihkYmM6aXNGb2N1c2VkKCkpb3IoZGJjLnBhcmVudD09bmlsKXRoZW4KbG9jYWwgYWNjPWRiYzpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudCgiY2hhciIsZGJjLCJjaGFyIixfY2MpaWYoYWNjPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQKaWYoZGFhWyJjaGFyIl1+PW5pbCl0aGVuCmZvciBiY2MsY2NjIGluCnBhaXJzKF9iYVsiY2hhciJdKWRvCmlmKGRhYVsiY2hhciJdW2NjY11+PW5pbCl0aGVuIGZvciBkY2MsX2RjIGluIGRjKGRhYVsiY2hhciJdW2NjY10pZG8KaWYKKF9kYy5jaGFySGFuZGxlcn49bmlsKXRoZW4gaWYoX2RjOmNoYXJIYW5kbGVyKF9jYykpdGhlbiByZXR1cm4gdHJ1ZSBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxzZXRUZXh0PWZ1bmN0aW9uKGRiYyxfY2MsYWNjLGJjYykKbG9jYWwgY2NjLGRjYz1kYmM6Z2V0QW5jaG9yUG9zaXRpb24oKQppZihhY2M+PTEpYW5kKGFjYzw9ZGJjOmdldEhlaWdodCgpKXRoZW4KaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpzZXRUZXh0KGRkKApfY2MrIChjY2MtMSksY2NjKSxkY2MrYWNjLTEsYmQoYmNjLGRkKDEgLV9jYysxLDEpLGRkKApkYmM6Z2V0V2lkdGgoKS1fY2MrMSwxKSkpZWxzZQphYmIuc2V0VGV4dChkZChfY2MrIChjY2MtMSksY2NjKSxkY2MrYWNjLTEsYmQoYmNjLGRkKDEgLV9jYysxLDEpLGRkKApkYmM6Z2V0V2lkdGgoKS1fY2MrMSwxKSkpZW5kIGVuZCBlbmQsc2V0Qkc9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjKQpsb2NhbCBjY2MsZGNjPWRiYzpnZXRBbmNob3JQb3NpdGlvbigpCmlmKGFjYz49MSlhbmQoYWNjPD1kYmM6Z2V0SGVpZ2h0KCkpdGhlbgppZihkYmMucGFyZW50fj1uaWwpdGhlbgpkYmMucGFyZW50OnNldEJHKGRkKApfY2MrIChjY2MtMSksY2NjKSxkY2MrYWNjLTEsYmQoYmNjLGRkKDEgLV9jYysxLDEpLGRkKApkYmM6Z2V0V2lkdGgoKS1fY2MrMSwxKSkpZWxzZQphYmIuc2V0QkcoZGQoX2NjKyAoY2NjLTEpLGNjYyksZGNjK2FjYy0xLGJkKGJjYyxkZCgxIC1fY2MrMSwxKSxkZCgKZGJjOmdldFdpZHRoKCktX2NjKzEsMSkpKWVuZCBlbmQgZW5kLHNldEZHPWZ1bmN0aW9uKGRiYyxfY2MsYWNjLGJjYykKbG9jYWwgY2NjLGRjYz1kYmM6Z2V0QW5jaG9yUG9zaXRpb24oKQppZihhY2M+PTEpYW5kKGFjYzw9ZGJjOmdldEhlaWdodCgpKXRoZW4KaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpzZXRGRyhkZCgKX2NjKyAoY2NjLTEpLGNjYyksZGNjK2FjYy0xLGJkKGJjYyxkZCgxIC1fY2MrMSwxKSxkZCgKZGJjOmdldFdpZHRoKCktX2NjKzEsMSkpKWVsc2UKYWJiLnNldEZHKGRkKF9jYysgKGNjYy0xKSxjY2MpLGRjYythY2MtMSxiZChiY2MsZGQoMSAtX2NjKzEsMSksZGQoCmRiYzpnZXRXaWR0aCgpLV9jYysxLDEpKSllbmQgZW5kIGVuZCx3cml0ZVRleHQ9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjLGNjYyxkY2MpCmxvY2FsIF9kYyxhZGM9ZGJjOmdldEFuY2hvclBvc2l0aW9uKCkKaWYoYWNjPj0xKWFuZChhY2M8PWRiYzpnZXRIZWlnaHQoKSl0aGVuCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmRiYy5wYXJlbnQ6d3JpdGVUZXh0KGRkKApfY2MrIChfZGMtMSksX2RjKSxhZGMrYWNjLTEsYmQoYmNjLGRkKDEgLV9jYysxLDEpLApkYmM6Z2V0V2lkdGgoKS1fY2MrMSksY2NjLGRjYyllbHNlCmFiYi53cml0ZVRleHQoZGQoX2NjKyAoX2RjLTEpLF9kYyksYWRjK2FjYy0xLGJkKGJjYyxkZCgxIC1fY2MrMSwxKSxkZCgKZGJjOmdldFdpZHRoKCktX2NjKzEsMSkpLGNjYyxkY2MpZW5kIGVuZCBlbmQsYmxpdD1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MsY2NjLGRjYykKbG9jYWwgX2RjLGFkYz1kYmM6Z2V0QW5jaG9yUG9zaXRpb24oKQppZihhY2M+PTEpYW5kKGFjYzw9ZGJjOmdldEhlaWdodCgpKXRoZW4KbG9jYWwgYmRjPWRiYzpnZXRXaWR0aCgpCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmJjYz1iZChiY2MsZGQoMSAtX2NjKzEsMSksYmRjLV9jYysxKWNjYz1iZChjY2MsZGQoMSAtX2NjKzEsMSksYmRjLV9jYysxKWRjYz1iZChkY2MsZGQoCjEgLV9jYysxLDEpLGJkYy1fY2MrMSkKZGJjLnBhcmVudDpibGl0KGRkKApfY2MrIChfZGMtMSksX2RjKSxhZGMrYWNjLTEsYmNjLGNjYyxkY2MpZWxzZQpiY2M9YmQoYmNjLGRkKDEgLV9jYysxLDEpLGRkKGJkYy1fY2MrMSwxKSkKY2NjPWJkKGNjYyxkZCgxIC1fY2MrMSwxKSxkZChiZGMtX2NjKzEsMSkpCmRjYz1iZChkY2MsZGQoMSAtX2NjKzEsMSksZGQoYmRjLV9jYysxLDEpKQphYmIuYmxpdChkZChfY2MrIChfZGMtMSksX2RjKSxhZGMrYWNjLTEsYmNjLGNjYyxkY2MpZW5kIGVuZCBlbmQsZHJhd0JhY2tncm91bmRCb3g9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjLGNjYyxkY2MpCmxvY2FsIF9kYyxhZGM9ZGJjOmdldEFuY2hvclBvc2l0aW9uKCkKY2NjPShhY2M8MSBhbmQoCmNjYythY2M+ZGJjOmdldEhlaWdodCgpYW5kIGRiYzpnZXRIZWlnaHQoKW9yIGNjYythY2MtMSlvcigKY2NjKwphY2M+ZGJjOmdldEhlaWdodCgpYW5kIGRiYzpnZXRIZWlnaHQoKS1hY2MrMSBvciBjY2MpKQpiY2M9KF9jYzwxIGFuZChiY2MrX2NjPmRiYzpnZXRXaWR0aCgpYW5kIGRiYzpnZXRXaWR0aCgpb3IgYmNjKwpfY2MtMSlvcigKCmJjYytfY2M+ZGJjOmdldFdpZHRoKClhbmQgZGJjOmdldFdpZHRoKCktX2NjKzEgb3IgYmNjKSkKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGRjYyllbHNlCmFiYi5kcmF3QmFja2dyb3VuZEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGRjYyllbmQgZW5kLGRyYXdUZXh0Qm94PWZ1bmN0aW9uKGRiYyxfY2MsYWNjLGJjYyxjY2MsZGNjKQpsb2NhbCBfZGMsYWRjPWRiYzpnZXRBbmNob3JQb3NpdGlvbigpCmNjYz0oYWNjPDEgYW5kKApjY2MrYWNjPmRiYzpnZXRIZWlnaHQoKWFuZCBkYmM6Z2V0SGVpZ2h0KClvciBjY2MrYWNjLTEpb3IoCmNjYysKYWNjPmRiYzpnZXRIZWlnaHQoKWFuZCBkYmM6Z2V0SGVpZ2h0KCktYWNjKzEgb3IgY2NjKSkKYmNjPShfY2M8MSBhbmQoYmNjK19jYz5kYmM6Z2V0V2lkdGgoKWFuZCBkYmM6Z2V0V2lkdGgoKW9yIGJjYysKX2NjLTEpb3IoCgpiY2MrX2NjPmRiYzpnZXRXaWR0aCgpYW5kIGRiYzpnZXRXaWR0aCgpLV9jYysxIG9yIGJjYykpCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmRiYy5wYXJlbnQ6ZHJhd1RleHRCb3goZGQoX2NjKyAoX2RjLTEpLF9kYyksZGQoYWNjKyAoYWRjLTEpLGFkYyksYmNjLGNjYyxiZChkY2MsMSwxKSllbHNlCmFiYi5kcmF3VGV4dEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGJkKGRjYywxLDEpKWVuZCBlbmQsZHJhd0ZvcmVncm91bmRCb3g9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjLGNjYyxkY2MpCmxvY2FsIF9kYyxhZGM9ZGJjOmdldEFuY2hvclBvc2l0aW9uKCkKY2NjPShhY2M8MSBhbmQoCmNjYythY2M+ZGJjOmdldEhlaWdodCgpYW5kIGRiYzpnZXRIZWlnaHQoKW9yIGNjYythY2MtMSlvcigKY2NjKwphY2M+ZGJjOmdldEhlaWdodCgpYW5kIGRiYzpnZXRIZWlnaHQoKS1hY2MrMSBvciBjY2MpKQpiY2M9KF9jYzwxIGFuZChiY2MrX2NjPmRiYzpnZXRXaWR0aCgpYW5kIGRiYzpnZXRXaWR0aCgpb3IgYmNjKwpfY2MtMSlvcigKCmJjYytfY2M+ZGJjOmdldFdpZHRoKClhbmQgZGJjOmdldFdpZHRoKCktX2NjKzEgb3IgYmNjKSkKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGRjYyllbHNlCmFiYi5kcmF3Rm9yZWdyb3VuZEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGRjYyllbmQgZW5kLGRyYXc9ZnVuY3Rpb24oZGJjLF9jYylpZgooYmNhKWFuZCBub3QoZGNhKXRoZW4gcmV0dXJuIGZhbHNlIGVuZAppZihkYmMucGFyZW50PT1uaWwpdGhlbiBpZihkYmM6Z2V0RHJhdygpPT0KZmFsc2UpdGhlbiByZXR1cm4gZmFsc2UgZW5kIGVuZAppZihkX2EuZHJhdyhkYmMpKXRoZW4KbG9jYWwgYWNjLGJjYz1kYmM6Z2V0QWJzb2x1dGVQb3NpdGlvbihkYmM6Z2V0QW5jaG9yUG9zaXRpb24oKSlsb2NhbCBjY2MsZGNjPWRiYzpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgX2RjLGFkYz1kYmM6Z2V0U2l6ZSgpCmlmKApkYmMucGFyZW50PT1uaWwpdGhlbgppZihkYmMuYmdDb2xvcn49ZmFsc2UpdGhlbgphYmIuZHJhd0JhY2tncm91bmRCb3goY2NjLGRjYyxfZGMsYWRjLGRiYy5iZ0NvbG9yKWFiYi5kcmF3VGV4dEJveChjY2MsZGNjLF9kYyxhZGMsIiAiKWVuZDtpZihkYmMuZmdDb2xvcn49ZmFsc2UpdGhlbgphYmIuZHJhd0ZvcmVncm91bmRCb3goY2NjLGRjYyxfZGMsYWRjLGRiYy5mZ0NvbG9yKWVuZCBlbmQKaWYoZGJjLmJhckFjdGl2ZSl0aGVuCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmRiYy5wYXJlbnQ6d3JpdGVUZXh0KGNjYyxkY2MsX2MuZ2V0VGV4dEhvcml6b250YWxBbGlnbihkYmMuYmFyVGV4dCxfZGMsZGJjLmJhclRleHRBbGlnbiksZGJjLmJhckJhY2tncm91bmQsZGJjLmJhclRleHRjb2xvcillbHNlCmFiYi53cml0ZVRleHQoY2NjLGRjYyxfYy5nZXRUZXh0SG9yaXpvbnRhbEFsaWduKGRiYy5iYXJUZXh0LF9kYyxkYmMuYmFyVGV4dEFsaWduKSxkYmMuYmFyQmFja2dyb3VuZCxkYmMuYmFyVGV4dGNvbG9yKWVuZAppZihkYmM6Z2V0Qm9yZGVyKCJsZWZ0IikpdGhlbgppZihkYmMucGFyZW50fj1uaWwpdGhlbgpkYmMucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGNjYy0xLGRjYywxLDEsZGJjLmJhckJhY2tncm91bmQpaWYoZGJjLmJnQ29sb3J+PWZhbHNlKXRoZW4KZGJjLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChjY2MtMSxkY2MrMSwxLGFkYy0xLGRiYy5iZ0NvbG9yKWVuZCBlbmQgZW5kCmlmKGRiYzpnZXRCb3JkZXIoInRvcCIpKXRoZW4gaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChjY2MtMSxkY2MtMSxfZGMrMSwxLGRiYy5iYXJCYWNrZ3JvdW5kKWVuZCBlbmQgZW5kO2ZvciBiZGMsY2RjIGluIGRjKGJhYSlkbwppZihhYWFbY2RjXX49bmlsKXRoZW4gZm9yIGRkYyxfX2QgaW4gcGFpcnMoYWFhW2NkY10pZG8KaWYoX19kLmRyYXd+PW5pbCl0aGVuIF9fZDpkcmF3KCllbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCx1cGRhdGVUZXJtPWZ1bmN0aW9uKGRiYylpZgooYmNhKWFuZCBub3QoZGNhKXRoZW4gcmV0dXJuIGZhbHNlIGVuZDthYmIudXBkYXRlKCllbmQsYWRkT2JqZWN0PWZ1bmN0aW9uKGRiYyxfY2MpcmV0dXJuCmNkYihfY2MpZW5kLHJlbW92ZU9iamVjdD1fX2MsZ2V0T2JqZWN0PWZ1bmN0aW9uKGRiYyxfY2MpcmV0dXJuIGFkYihfY2MpZW5kLGdldERlZXBPYmplY3Q9ZnVuY3Rpb24oZGJjLF9jYylyZXR1cm4gYmRiKF9jYyllbmQsYWRkRnJhbWU9ZnVuY3Rpb24oZGJjLF9jYylsb2NhbCBhY2M9Y19hLm5ld0ZyYW1lKApfY2Mgb3IgY2MoKSxkYmMsbmlsLGNfYSlyZXR1cm4gY2RiKGFjYyllbmQsaW5pdD1mdW5jdGlvbihkYmMpCmlmCm5vdChjYWIpdGhlbgppZihhX2F+PW5pbCl0aGVuIGRfYS53aWR0aCxkX2EuaGVpZ2h0PWFfYTpnZXRTaXplKCkKZGJjOnNldEJhY2tncm91bmQoYV9hOmdldFRoZW1lKCJGcmFtZUJHIikpCmRiYzpzZXRGb3JlZ3JvdW5kKGFfYTpnZXRUaGVtZSgiRnJhbWVUZXh0IikpZWxzZSBkX2Eud2lkdGgsZF9hLmhlaWdodD1fY2EuZ2V0U2l6ZSgpCmRiYzpzZXRCYWNrZ3JvdW5kKGNfYS5nZXRUaGVtZSgiQmFzYWx0QkciKSkKZGJjOnNldEZvcmVncm91bmQoY19hLmdldFRoZW1lKCJCYXNhbHRUZXh0IikpZW5kO2NhYj10cnVlIGVuZCBlbmR9CmZvciBkYmMsX2NjIGluIHBhaXJzKGNiKWRvIGNhYVsiYWRkIi4uZGJjXT1mdW5jdGlvbihhY2MsYmNjKQpyZXR1cm4gY2RiKF9jYyhiY2Mgb3IgY2MoKSxhY2MpKWVuZCBlbmQ7c2V0bWV0YXRhYmxlKGNhYSxkX2EpcmV0dXJuIGNhYSBlbmQgZW5kCmFhWyJsb2FkT2JqZWN0cyJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj17fWlmKGJhKXRoZW4KZm9yIGRiLF9jIGluIHBhaXJzKF9iKCJvYmplY3RzIikpZG8gYWJbZGJdPV9jKCllbmQ7cmV0dXJuIGFiIGVuZDtsb2NhbCBiYj10YWJsZS5wYWNrKC4uLilsb2NhbCBjYj1mcy5nZXREaXIoCmJiWzJdb3IiQmFzYWx0IilpZihjYj09bmlsKXRoZW4KZXJyb3IoIlVuYWJsZSB0byBmaW5kIGRpcmVjdG9yeSAiLi5iYlsyXS4uCiIgcGxlYXNlIHJlcG9ydCB0aGlzIGJ1ZyB0byBvdXIgZGlzY29yZC4iKWVuZDtmb3IgZGIsX2MgaW4KcGFpcnMoZnMubGlzdChmcy5jb21iaW5lKGNiLCJvYmplY3RzIikpKWRvCmlmKF9jfj0iZXhhbXBsZS5sdWEiKXRoZW4gbG9jYWwgYWM9X2M6Z3N1YigiLmx1YSIsIiIpYWJbYWNdPWRhKGFjKWVuZCBlbmQ7cmV0dXJuIGFiIGVuZAphYVsibWFpbiJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiYmFzYWx0RXZlbnQiKSgpbG9jYWwgYmI9ZGEoIkZyYW1lIikKbG9jYWwgY2I9ZGEoInRoZW1lIilsb2NhbCBkYj1kYSgidXRpbHMiKWxvY2FsIF9jPWRhKCJiYXNhbHRMb2dzIilsb2NhbCBhYz1kYi51dWlkCmxvY2FsIGJjPWRiLmNyZWF0ZVRleHQ7bG9jYWwgY2M9ZGIudGFibGVDb3VudDtsb2NhbCBkYz0zMDA7bG9jYWwgX2Q9NTA7bG9jYWwgYWQ9dGVybS5jdXJyZW50KClsb2NhbCBiZD0iMS42LjQibG9jYWwgY2Q9ZnMuZ2V0RGlyKAp0YWJsZS5wYWNrKC4uLilbMl1vciIiKQpsb2NhbCBkZCxfX2EsYV9hLGJfYSxjX2EsZF9hPXt9LHt9LHt9LHt9LHt9LHt9bG9jYWwgX2FhLGFhYSxiYWEsY2FhO2xvY2FsIGRhYT17fWlmCm5vdCB0ZXJtLmlzQ29sb3Igb3Igbm90IHRlcm0uaXNDb2xvcigpdGhlbgplcnJvcignQmFzYWx0IHJlcXVpcmVzIGFuIGFkdmFuY2VkIChnb2xkZW4pIGNvbXB1dGVyIHRvIHJ1bi4nLDApZW5kO2xvY2FsIF9iYT17fQpmb3IgZGFiLF9iYiBpbgpwYWlycyhjb2xvcnMpZG8gaWYodHlwZShfYmIpPT0ibnVtYmVyIil0aGVuCl9iYVtkYWJdPXthZC5nZXRQYWxldHRlQ29sb3IoX2JiKX1lbmQgZW5kCmxvY2FsIGZ1bmN0aW9uIGFiYSgpY2FhPWZhbHNlO2FkLmNsZWFyKClhZC5zZXRDdXJzb3JQb3MoMSwxKQpmb3IgZGFiLF9iYiBpbiBwYWlycyhjb2xvcnMpZG8gaWYodHlwZShfYmIpPT0KIm51bWJlciIpdGhlbgphZC5zZXRQYWxldHRlQ29sb3IoX2JiLGNvbG9ycy5wYWNrUkdCKHRhYmxlLnVucGFjayhfYmFbZGFiXSkpKWVuZCBlbmQgZW5kCmxvY2FsIGZ1bmN0aW9uIGJiYShkYWIpYWQuY2xlYXIoKWFkLnNldEJhY2tncm91bmRDb2xvcihjb2xvcnMuYmxhY2spCmFkLnNldFRleHRDb2xvcihjb2xvcnMucmVkKWxvY2FsIF9iYixhYmI9YWQuZ2V0U2l6ZSgpaWYoZGFhLmxvZ2dpbmcpdGhlbiBfYyhkYWIsIkVycm9yIillbmQ7bG9jYWwgYmJiPWJjKAoiQmFzYWx0IGVycm9yOiAiLi5kYWIsX2JiKWxvY2FsIGNiYj0xO2ZvciBkYmIsX2NiIGluIHBhaXJzKGJiYilkbwphZC5zZXRDdXJzb3JQb3MoMSxjYmIpYWQud3JpdGUoX2NiKWNiYj1jYmIrMSBlbmQ7YWQuc2V0Q3Vyc29yUG9zKDEsCmNiYisxKWNhYT1mYWxzZSBlbmQKbG9jYWwgZnVuY3Rpb24gY2JhKGRhYikKYXNzZXJ0KGRhYn49ImZ1bmN0aW9uIiwiU2NoZWR1bGUgbmVlZHMgYSBmdW5jdGlvbiBpbiBvcmRlciB0byB3b3JrISIpCnJldHVybiBmdW5jdGlvbiguLi4pbG9jYWwgX2JiPWNvcm91dGluZS5jcmVhdGUoZGFiKQpsb2NhbCBhYmIsYmJiPWNvcm91dGluZS5yZXN1bWUoX2JiLC4uLikKaWYoYWJiKXRoZW4gdGFibGUuaW5zZXJ0KGRfYSx7X2JiLGJiYn0pZWxzZSBiYmEoYmJiKWVuZCBlbmQgZW5kO2xvY2FsIGRiYT1mdW5jdGlvbihkYWIsX2JiKWNfYVtkYWJdPV9iYiBlbmQKbG9jYWwgX2NhPWZ1bmN0aW9uKGRhYilyZXR1cm4gY19hW2RhYl1lbmQ7bG9jYWwgYWNhPWZ1bmN0aW9uKGRhYiljYj1kYWIgZW5kCmxvY2FsIGJjYT1mdW5jdGlvbihkYWIpcmV0dXJuIGNiW2RhYl1lbmQKbG9jYWwgY2NhPXtnZXREeW5hbWljVmFsdWVFdmVudFNldHRpbmc9ZnVuY3Rpb24oKXJldHVybiBkYWEuZHluYW1pY1ZhbHVlRXZlbnRzIGVuZCxnZXRNYWluRnJhbWU9ZnVuY3Rpb24oKXJldHVybiBfYWEgZW5kLHNldFZhcmlhYmxlPWRiYSxnZXRWYXJpYWJsZT1fY2EsZ2V0VGhlbWU9YmNhLHNldE1haW5GcmFtZT1mdW5jdGlvbihkYWIpCl9hYT1kYWIgZW5kLGdldEFjdGl2ZUZyYW1lPWZ1bmN0aW9uKClyZXR1cm4gYWFhIGVuZCxzZXRBY3RpdmVGcmFtZT1mdW5jdGlvbihkYWIpYWFhPWRhYiBlbmQsZ2V0Rm9jdXNlZE9iamVjdD1mdW5jdGlvbigpcmV0dXJuIGJhYSBlbmQsc2V0Rm9jdXNlZE9iamVjdD1mdW5jdGlvbihkYWIpYmFhPWRhYiBlbmQsZ2V0TW9uaXRvckZyYW1lPWZ1bmN0aW9uKGRhYilyZXR1cm4KYV9hW2RhYl1vciBiX2FbZGFiXVsxXWVuZCxzZXRNb25pdG9yRnJhbWU9ZnVuY3Rpb24oZGFiLF9iYixhYmIpaWYoX2FhPT1fYmIpdGhlbgpfYWE9bmlsIGVuZAppZihhYmIpdGhlbiBiX2FbZGFiXT17X2JiLHNpZGVzfWVsc2UgYV9hW2RhYl09X2JiIGVuZDtpZihfYmI9PW5pbCl0aGVuIGJfYVtkYWJdPW5pbCBlbmQgZW5kLGdldEJhc2VUZXJtPWZ1bmN0aW9uKClyZXR1cm4KYWQgZW5kLHNjaGVkdWxlPWNiYSxzdG9wPWFiYSxuZXdGcmFtZT1iYixnZXREaXJlY3Rvcnk9ZnVuY3Rpb24oKXJldHVybiBjZCBlbmR9CmxvY2FsIGZ1bmN0aW9uIGRjYShkYWIsLi4uKQppZigjZF9hPjApdGhlbiBsb2NhbCBfYmI9e30KZm9yIG49MSwjZF9hIGRvCmlmKGRfYVtuXX49bmlsKXRoZW4KaWYKKGNvcm91dGluZS5zdGF0dXMoZF9hW25dWzFdKT09InN1c3BlbmRlZCIpdGhlbgppZihkX2Fbbl1bMl1+PW5pbCl0aGVuCmlmKGRfYVtuXVsyXT09ZGFiKXRoZW4KbG9jYWwgYWJiLGJiYj1jb3JvdXRpbmUucmVzdW1lKGRfYVtuXVsxXSxkYWIsLi4uKWRfYVtuXVsyXT1iYmI7aWYgbm90KGFiYil0aGVuIGJiYShiYmIpZW5kIGVuZCBlbHNlIGxvY2FsIGFiYixiYmI9Y29yb3V0aW5lLnJlc3VtZShkX2Fbbl1bMV0sZGFiLC4uLikKZF9hW25dWzJdPWJiYjtpZiBub3QoYWJiKXRoZW4gYmJhKGJiYillbmQgZW5kIGVsc2UgdGFibGUuaW5zZXJ0KF9iYixuKWVuZCBlbmQgZW5kCmZvciBuPTEsI19iYiBkbyB0YWJsZS5yZW1vdmUoZF9hLF9iYltuXS0gKG4tMSkpZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gX2RhKClpZihjYWE9PWZhbHNlKXRoZW4gcmV0dXJuIGVuZDtpZihfYWF+PW5pbCl0aGVuIF9hYTpkcmF3KCkKX2FhOnVwZGF0ZVRlcm0oKWVuZApmb3IgZGFiLF9iYiBpbiBwYWlycyhhX2EpZG8gX2JiOmRyYXcoKV9iYjp1cGRhdGVUZXJtKCllbmQKZm9yIGRhYixfYmIgaW4gcGFpcnMoYl9hKWRvIF9iYlsxXTpkcmF3KClfYmJbMV06dXBkYXRlVGVybSgpZW5kIGVuZDtsb2NhbCBhZGEsYmRhLGNkYT1uaWwsbmlsLG5pbDtsb2NhbCBkZGE9bmlsCmxvY2FsIGZ1bmN0aW9uIF9fYihkYWIsX2JiLGFiYixiYmIpYWRhLGJkYSxjZGE9X2JiLGFiYixiYmI7aWYoZGRhPT1uaWwpdGhlbgpkZGE9b3Muc3RhcnRUaW1lcihkYy8xMDAwKWVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYV9iKClkZGE9bmlsO19hYTpob3ZlckhhbmRsZXIoYmRhLGNkYSxhZGEpYWFhPV9hYSBlbmQ7bG9jYWwgYl9iLGNfYixkX2I9bmlsLG5pbCxuaWw7bG9jYWwgX2FiPW5pbDtsb2NhbCBmdW5jdGlvbiBhYWIoKV9hYj1uaWw7X2FhOmRyYWdIYW5kbGVyKGJfYixjX2IsZF9iKQphYWE9X2FhIGVuZDtsb2NhbCBmdW5jdGlvbiBiYWIoZGFiLF9iYixhYmIsYmJiKWJfYixjX2IsZF9iPV9iYixhYmIsYmJiCmlmKF9kPDUwKXRoZW4gYWFiKCllbHNlIGlmKF9hYj09bmlsKXRoZW4gX2FiPW9zLnN0YXJ0VGltZXIoCl9kLzEwMDApZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gY2FiKGRhYiwuLi4pCmxvY2FsIF9iYj17Li4ufQppZihhYjpzZW5kRXZlbnQoImJhc2FsdEV2ZW50Q3ljbGUiLGRhYiwuLi4pPT1mYWxzZSl0aGVuIHJldHVybiBlbmQ7aWYoZGFiPT0idGVybWluYXRlIil0aGVuIGRhYS5zdG9wKCllbmQKaWYoX2Fhfj1uaWwpdGhlbgpsb2NhbCBhYmI9e21vdXNlX2NsaWNrPV9hYS5tb3VzZUhhbmRsZXIsbW91c2VfdXA9X2FhLm1vdXNlVXBIYW5kbGVyLG1vdXNlX3Njcm9sbD1fYWEuc2Nyb2xsSGFuZGxlcixtb3VzZV9kcmFnPWJhYixtb3VzZV9tb3ZlPV9fYn1sb2NhbCBiYmI9YWJiW2RhYl0KaWYoYmJifj1uaWwpdGhlbiBiYmIoX2FhLC4uLilkY2EoZGFiLC4uLilfZGEoKXJldHVybiBlbmQgZW5kCmlmKGRhYj09Im1vbml0b3JfdG91Y2giKXRoZW4gaWYoYV9hW19iYlsxXV1+PW5pbCl0aGVuCmFfYVtfYmJbMV1dOm1vdXNlSGFuZGxlcigxLF9iYlsyXSxfYmJbM10sdHJ1ZSlhYWE9YV9hW19iYlsxXV1lbmQKaWYKKGNjKGJfYSk+MCl0aGVuIGZvciBhYmIsYmJiIGluIHBhaXJzKGJfYSlkbwpiYmJbMV06bW91c2VIYW5kbGVyKDEsX2JiWzJdLF9iYlszXSx0cnVlLF9iYlsxXSllbmQgZW5kO2RjYShkYWIsLi4uKV9kYSgpcmV0dXJuIGVuZAppZihhYWF+PW5pbCl0aGVuCmxvY2FsIGFiYj17Y2hhcj1hYWEuY2hhckhhbmRsZXIsa2V5PWFhYS5rZXlIYW5kbGVyLGtleV91cD1hYWEua2V5VXBIYW5kbGVyfWxvY2FsIGJiYj1hYmJbZGFiXWlmKGJiYn49bmlsKXRoZW4gaWYoZGFiPT0ia2V5Iil0aGVuIGRkW19iYlsxXV09dHJ1ZSBlbHNlaWYoZGFiPT0ia2V5X3VwIil0aGVuCmRkW19iYlsxXV09ZmFsc2UgZW5kO2JiYihhYWEsLi4uKWRjYShkYWIsLi4uKQpfZGEoKXJldHVybiBlbmQgZW5kCmlmKGRhYj09InRpbWVyIilhbmQoX2JiWzFdPT1kZGEpdGhlbiBhX2IoKWVsc2VpZgooZGFiPT0idGltZXIiKWFuZChfYmJbMV09PV9hYil0aGVuIGFhYigpZWxzZQpmb3IgYWJiLGJiYiBpbiBwYWlycyhfX2EpZG8gYmJiOmV2ZW50SGFuZGxlcihkYWIsLi4uKWVuZCBlbmQ7ZGNhKGRhYiwuLi4pX2RhKCllbmQKZGFhPXtsb2dnaW5nPWZhbHNlLGR5bmFtaWNWYWx1ZUV2ZW50cz1mYWxzZSxzZXRUaGVtZT1hY2EsZ2V0VGhlbWU9YmNhLGRyYXdGcmFtZXM9X2RhLGdldFZlcnNpb249ZnVuY3Rpb24oKXJldHVybiBiZCBlbmQsc2V0VmFyaWFibGU9ZGJhLGdldFZhcmlhYmxlPV9jYSxzZXRCYXNlVGVybT1mdW5jdGlvbihkYWIpYWQ9ZGFiIGVuZCxsb2c9ZnVuY3Rpb24oLi4uKV9jKC4uLillbmQsc2V0TW91c2VNb3ZlVGhyb3R0bGU9ZnVuY3Rpb24oZGFiKQppZgooX0hPU1Q6ZmluZCgiQ3JhZnRPUyUtUEMiKSl0aGVuIGlmKGNvbmZpZy5nZXQoIm1vdXNlX21vdmVfdGhyb3R0bGUiKX49MTApdGhlbgpjb25maWcuc2V0KCJtb3VzZV9tb3ZlX3Rocm90dGxlIiwxMCllbmQKaWYoZGFiPDEwMCl0aGVuIGRjPTEwMCBlbHNlIGRjPWRhYiBlbmQ7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsc2V0TW91c2VEcmFnVGhyb3R0bGU9ZnVuY3Rpb24oZGFiKWlmKApkYWI8PTApdGhlbiBfZD0wIGVsc2UgX2FiPW5pbDtfZD1kYWIgZW5kIGVuZCxhdXRvVXBkYXRlPWZ1bmN0aW9uKGRhYikKY2FhPWRhYjtpZihkYWI9PW5pbCl0aGVuIGNhYT10cnVlIGVuZDtsb2NhbCBmdW5jdGlvbiBfYmIoKV9kYSgpd2hpbGUgY2FhIGRvCmNhYihvcy5wdWxsRXZlbnRSYXcoKSllbmQgZW5kCmxvY2FsIGFiYixiYmI9eHBjYWxsKF9iYixkZWJ1Zy50cmFjZWJhY2spaWYgbm90KGFiYil0aGVuIGJiYShiYmIpcmV0dXJuIGVuZCBlbmQsdXBkYXRlPWZ1bmN0aW9uKGRhYiwuLi4paWYoCmRhYn49bmlsKXRoZW4gbG9jYWwgX2JiLGFiYj14cGNhbGwoY2FiLGRlYnVnLnRyYWNlYmFjayxkYWIsLi4uKWlmIG5vdChfYmIpdGhlbgpiYmEoYWJiKXJldHVybiBlbmQgZW5kIGVuZCxzdG9wPWFiYSxzdG9wVXBkYXRlPWFiYSxpc0tleURvd249ZnVuY3Rpb24oZGFiKWlmKApkZFtkYWJdPT1uaWwpdGhlbiByZXR1cm4gZmFsc2UgZW5kO3JldHVybiBkZFtkYWJdZW5kLGdldEZyYW1lPWZ1bmN0aW9uKGRhYilmb3IgX2JiLGFiYiBpbgpwYWlycyhfX2EpZG8gaWYoYWJiLm5hbWU9PWRhYil0aGVuIHJldHVybiBhYmIgZW5kIGVuZCBlbmQsZ2V0QWN0aXZlRnJhbWU9ZnVuY3Rpb24oKXJldHVybgphYWEgZW5kLHNldEFjdGl2ZUZyYW1lPWZ1bmN0aW9uKGRhYikKaWYoZGFiOmdldFR5cGUoKT09IkZyYW1lIil0aGVuIGFhYT1kYWI7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsb25FdmVudD1mdW5jdGlvbiguLi4pCmZvciBkYWIsX2JiIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKF9iYik9PSJmdW5jdGlvbiIpdGhlbgphYjpyZWdpc3RlckV2ZW50KCJiYXNhbHRFdmVudEN5Y2xlIixfYmIpZW5kIGVuZCBlbmQsc2NoZWR1bGU9Y2JhLGNyZWF0ZUZyYW1lPWZ1bmN0aW9uKGRhYikKZGFiPWRhYiBvciBhYygpCmZvciBhYmIsYmJiIGluIHBhaXJzKF9fYSlkbyBpZihiYmIubmFtZT09ZGFiKXRoZW4gcmV0dXJuIG5pbCBlbmQgZW5kO2xvY2FsIF9iYj1iYihkYWIsbmlsLG5pbCxjY2EpX2JiOmluaXQoKQp0YWJsZS5pbnNlcnQoX19hLF9iYilpZgooX2FhPT1uaWwpYW5kKF9iYjpnZXROYW1lKCl+PSJiYXNhbHREZWJ1Z2dpbmdGcmFtZSIpdGhlbiBfYmI6c2hvdygpZW5kO3JldHVybiBfYmIgZW5kLHJlbW92ZUZyYW1lPWZ1bmN0aW9uKGRhYilfX2FbZGFiXT0KbmlsIGVuZCxzZXRQcm9qZWN0RGlyPWZ1bmN0aW9uKGRhYiljZD1kYWIgZW5kLGZvcmNlUmVuZGVyVXBkYXRlPWZ1bmN0aW9uKClfZGEoKWVuZCxkZWJ1Zz1mdW5jdGlvbiguLi4pbG9jYWwgZGFiPXsuLi59aWYKKF9hYT09bmlsKXRoZW4gcHJpbnQoLi4uKXJldHVybiBlbmQ7aWYoX2FhLm5hbWV+PSJiYXNhbHREZWJ1Z2dpbmdGcmFtZSIpdGhlbgppZihfYWF+PQpkYWEuZGVidWdGcmFtZSl0aGVuIGRhYS5kZWJ1Z0xhYmVsOnNldFBhcmVudChfYWEpZW5kIGVuZDtsb2NhbCBfYmI9IiJmb3IgYWJiLGJiYiBpbiBwYWlycyhkYWIpZG8KX2JiPV9iYi4uCnRvc3RyaW5nKGJiYikuLiAoI2RhYn49YWJiIGFuZCIsICJvciIiKWVuZApkYWEuZGVidWdMYWJlbDpzZXRUZXh0KCJbRGVidWddICIuLl9iYilmb3IgYWJiLGJiYiBpbiBwYWlycyhiYyhfYmIsZGFhLmRlYnVnTGlzdDpnZXRXaWR0aCgpKSlkbwpkYWEuZGVidWdMaXN0OmFkZEl0ZW0oYmJiKWVuZAppZigKZGFhLmRlYnVnTGlzdDpnZXRJdGVtQ291bnQoKT41MCl0aGVuIGRhYS5kZWJ1Z0xpc3Q6cmVtb3ZlSXRlbSgxKWVuZApkYWEuZGVidWdMaXN0OnNldFZhbHVlKGRhYS5kZWJ1Z0xpc3Q6Z2V0SXRlbShkYWEuZGVidWdMaXN0OmdldEl0ZW1Db3VudCgpKSlpZgooZGFhLmRlYnVnTGlzdC5nZXRJdGVtQ291bnQoKT5kYWEuZGVidWdMaXN0OmdldEhlaWdodCgpKXRoZW4KZGFhLmRlYnVnTGlzdDpzZXRPZmZzZXQoZGFhLmRlYnVnTGlzdDpnZXRJdGVtQ291bnQoKS0KZGFhLmRlYnVnTGlzdDpnZXRIZWlnaHQoKSllbmQKZGFhLmRlYnVnTGFiZWw6c2hvdygpZW5kfQpkYWEuZGVidWdGcmFtZT1kYWEuY3JlYXRlRnJhbWUoImJhc2FsdERlYnVnZ2luZ0ZyYW1lIik6c2hvd0JhcigpOnNldEJhY2tncm91bmQoY29sb3JzLmxpZ2h0R3JheSk6c2V0QmFyKCJEZWJ1ZyIsY29sb3JzLmJsYWNrLGNvbG9ycy5ncmF5KQpkYWEuZGVidWdGcmFtZTphZGRCdXR0b24oImJhY2siKTpzZXRBbmNob3IoInRvcFJpZ2h0Iik6c2V0U2l6ZSgxLDEpOnNldFRleHQoIlwyMiIpOm9uQ2xpY2soZnVuY3Rpb24oKWlmKApkYWEub2xkRnJhbWV+PW5pbCl0aGVuIGRhYS5vbGRGcmFtZTpzaG93KCllbmQgZW5kKTpzZXRCYWNrZ3JvdW5kKGNvbG9ycy5yZWQpOnNob3coKQpkYWEuZGVidWdMaXN0PWRhYS5kZWJ1Z0ZyYW1lOmFkZExpc3QoImRlYnVnTGlzdCIpOnNldFNpemUoInBhcmVudC53IC0gMiIsInBhcmVudC5oIC0gMyIpOnNldFBvc2l0aW9uKDIsMyk6c2V0U2Nyb2xsYWJsZSh0cnVlKTpzaG93KCkKZGFhLmRlYnVnTGFiZWw9ZGFhLmRlYnVnRnJhbWU6YWRkTGFiZWwoImRlYnVnTGFiZWwiKTpvbkNsaWNrKGZ1bmN0aW9uKCkKZGFhLm9sZEZyYW1lPV9hYTtkYWEuZGVidWdGcmFtZTpzaG93KCllbmQpOnNldEJhY2tncm91bmQoY29sb3JzLmJsYWNrKTpzZXRGb3JlZ3JvdW5kKGNvbG9ycy53aGl0ZSk6c2V0QW5jaG9yKCJib3R0b21MZWZ0Iik6aWdub3JlT2Zmc2V0KCk6c2V0WkluZGV4KDIwKTpzaG93KClyZXR1cm4gZGFhIGVuZAphYVsiT2JqZWN0Il09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJiYXNhbHRFdmVudCIpbG9jYWwgYmI9ZGEoInV0aWxzIikKbG9jYWwgY2I9ZGEoIm1vZHVsZSIpbG9jYWwgZGI9Y2IoImltYWdlcyIpbG9jYWwgX2M9YmIuc3BsaXRTdHJpbmc7bG9jYWwgYWM9YmIubnVtYmVyRnJvbVN0cmluZwpsb2NhbCBiYz1iYi5nZXRWYWx1ZUZyb21YTUw7bG9jYWwgY2MsZGM9dGFibGUudW5wYWNrLHN0cmluZy5zdWIKcmV0dXJuCmZ1bmN0aW9uKF9kKWxvY2FsIGFkPSJPYmplY3QibG9jYWwgYmQ9e31sb2NhbCBjZD0xO2xvY2FsIGRkCmxvY2FsIF9fYT0idG9wTGVmdCJsb2NhbCBhX2E9ZmFsc2U7bG9jYWwgYl9hPXRydWU7bG9jYWwgY19hPWZhbHNlO2xvY2FsIGRfYT1mYWxzZTtsb2NhbCBfYWE9ZmFsc2U7bG9jYWwgYWFhPWZhbHNlCmxvY2FsIGJhYT17bGVmdD1mYWxzZSxyaWdodD1mYWxzZSx0b3A9ZmFsc2UsYm90dG9tPWZhbHNlfWxvY2FsIGNhYT1jb2xvcnMuYmxhY2s7bG9jYWwgZGFhPXRydWU7bG9jYWwgX2JhPWZhbHNlO2xvY2FsIGFiYSxiYmEsY2JhLGRiYT0wLDAsMCwwO2xvY2FsIF9jYTtsb2NhbCBhY2E7bG9jYWwgYmNhPTE7bG9jYWwgY2NhCmxvY2FsIGRjYTtsb2NhbCBfZGE9dHJ1ZTtsb2NhbCBhZGE9dHJ1ZTtsb2NhbCBiZGE9e31sb2NhbCBjZGE9YWIoKQpiZD17eD0xLHk9MSx3aWR0aD0xLGhlaWdodD0xLGJnQ29sb3I9Y29sb3JzLmJsYWNrLGJnU3ltYm9sPSIgIixiZ1N5bWJvbENvbG9yPWNvbG9ycy5ibGFjayxmZ0NvbG9yPWNvbG9ycy53aGl0ZSx0cmFuc3BhcmVudENvbG9yPWZhbHNlLG5hbWU9X2Qgb3IiT2JqZWN0IixwYXJlbnQ9Cm5pbCxzaG93PWZ1bmN0aW9uKGRkYSliX2E9dHJ1ZTtkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsaGlkZT1mdW5jdGlvbihkZGEpYl9hPWZhbHNlCmRkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxlbmFibGU9ZnVuY3Rpb24oZGRhKWRhYT10cnVlO3JldHVybiBkZGEgZW5kLGRpc2FibGU9ZnVuY3Rpb24oZGRhKWRhYT1mYWxzZQpyZXR1cm4gZGRhIGVuZCxpc0VuYWJsZWQ9ZnVuY3Rpb24oZGRhKXJldHVybiBkYWEgZW5kLGdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbj1mdW5jdGlvbihkZGEsX19iLGFfYikKbG9jYWwgYl9iPWZ1bmN0aW9uKGNfYikKaWYoY19iOnN1YigxLDEpPT0iIyIpdGhlbgpsb2NhbCBkX2I9ZGRhOmdldEJhc2VGcmFtZSgpOmdldERlZXBPYmplY3QoY19iOnN1YigyLGNfYjpsZW4oKSkpCmlmKGRfYn49bmlsKWFuZChkX2IuaW50ZXJuYWxPYmpldENhbGx+PW5pbCl0aGVuIF9fYihkZGEsZnVuY3Rpb24oKQpkX2I6aW50ZXJuYWxPYmpldENhbGwoKWVuZCllbmQgZWxzZQpfX2IoZGRhLGRkYTpnZXRCYXNlRnJhbWUoKTpnZXRWYXJpYWJsZShjX2IpKWVuZCBlbmQ7aWYodHlwZShhX2IpPT0ic3RyaW5nIil0aGVuIGJfYihhX2IpZWxzZWlmKHR5cGUoYV9iKT09InRhYmxlIil0aGVuCmZvciBjX2IsZF9iIGluIHBhaXJzKGFfYilkbyBiX2IoZF9iKWVuZCBlbmQ7cmV0dXJuIGRkYSBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGRkYSxfX2IpCmxvY2FsIGFfYj1kZGE6Z2V0QmFzZUZyYW1lKClsb2NhbCBiX2IsY19iLGRfYgppZihiYygidGV4dHVyZSIsX19iKX49bmlsKXRoZW4gYl9iPWJjKCJ0ZXh0dXJlIixfX2IpZW5kO2lmKGJjKCJtb2RlIixfX2Ipfj1uaWwpdGhlbiBjX2I9YmMoIm1vZGUiLF9fYillbmQKaWYoCmJjKCJ0ZXh0dXJlUGxheSIsX19iKX49bmlsKXRoZW4gZF9iPWJjKCJ0ZXh0dXJlUGxheSIsX19iKWVuZDtsb2NhbCBfYWIsYWFiO2lmKGJjKCJ4IixfX2Ipfj1uaWwpdGhlbiBfYWI9YmMoIngiLF9fYillbmQ7aWYoCmJjKCJ5IixfX2Ipfj1uaWwpdGhlbiBhYWI9YmMoInkiLF9fYillbmQ7aWYKKF9hYn49bmlsKW9yKGFhYn49bmlsKXRoZW4gZGRhOnNldFBvc2l0aW9uKF9hYixhYWIpZW5kO2xvY2FsIGJhYixjYWI7aWYoCmJjKCJ3aWR0aCIsX19iKX49bmlsKXRoZW4gYmFiPWJjKCJ3aWR0aCIsX19iKWVuZDtpZigKYmMoImhlaWdodCIsX19iKX49bmlsKXRoZW4gY2FiPWJjKCJoZWlnaHQiLF9fYillbmQ7aWYoYmFifj1uaWwpb3IoCmNhYn49bmlsKXRoZW4gZGRhOnNldFNpemUoYmFiLGNhYillbmQ7aWYoCmJjKCJiZyIsX19iKX49bmlsKXRoZW4KZGRhOnNldEJhY2tncm91bmQoY29sb3JzW2JjKCJiZyIsX19iKV0pZW5kO2lmKGJjKCJiZ1N5bWJvbCIsX19iKX49bmlsKXRoZW4KZGRhOnNldEJhY2tncm91bmQoZGRhLmJnQ29sb3IsYmMoImJnU3ltYm9sIixfX2IpKWVuZDtpZgooYmMoImJnU3ltYm9sQ29sb3IiLF9fYil+PW5pbCl0aGVuCmRkYTpzZXRCYWNrZ3JvdW5kKGRkYS5iZ0NvbG9yLGRkYS5iZ1N5bWJvbCxjb2xvcnNbYmMoImJnU3ltYm9sQ29sb3IiLF9fYildKWVuZAppZgooYmMoImZnIixfX2Ipfj1uaWwpdGhlbiBkZGE6c2V0Rm9yZWdyb3VuZChjb2xvcnNbYmMoImZnIixfX2IpXSllbmQ7aWYoYmMoInZhbHVlIixfX2Ipfj1uaWwpdGhlbgpkZGE6c2V0VmFsdWUoY29sb3JzW2JjKCJ2YWx1ZSIsX19iKV0pZW5kCmlmKGJjKCJ2aXNpYmxlIixfX2Ipfj1uaWwpdGhlbiBpZgooYmMoInZpc2libGUiLF9fYikpdGhlbiBkZGE6c2hvdygpZWxzZSBkZGE6aGlkZSgpZW5kIGVuZAppZihiYygiZW5hYmxlZCIsX19iKX49bmlsKXRoZW4gaWYoYmMoImVuYWJsZWQiLF9fYikpdGhlbiBkZGE6ZW5hYmxlKCllbHNlCmRkYTpkaXNhYmxlKCllbmQgZW5kO2lmKGJjKCJ6SW5kZXgiLF9fYil+PW5pbCl0aGVuCmRkYTpzZXRaSW5kZXgoYmMoInpJbmRleCIsX19iKSllbmQ7aWYoYmMoImFuY2hvciIsX19iKX49bmlsKXRoZW4KZGRhOnNldEFuY2hvcihiYygiYW5jaG9yIixfX2IpKWVuZDtpZihiYygic2hhZG93Q29sb3IiLF9fYil+PW5pbCl0aGVuCmRkYTpzZXRTaGFkb3coY29sb3JzW2JjKCJzaGFkb3dDb2xvciIsX19iKV0pZW5kO2lmKGJjKCJib3JkZXIiLF9fYil+PW5pbCl0aGVuCmRkYTpzZXRCb3JkZXIoY29sb3JzW2JjKCJib3JkZXIiLF9fYildKWVuZDtpZihiYygiYm9yZGVyTGVmdCIsX19iKX49bmlsKXRoZW4KYmFhWyJsZWZ0Il09Y29sb3JzW2JjKCJib3JkZXJMZWZ0IixfX2IpXWVuZDtpZihiYygiYm9yZGVyVG9wIixfX2Ipfj1uaWwpdGhlbgpiYWFbInRvcCJdPWNvbG9yc1tiYygiYm9yZGVyVG9wIixfX2IpXWVuZDtpZihiYygiYm9yZGVyUmlnaHQiLF9fYil+PW5pbCl0aGVuCmJhYVsicmlnaHQiXT1jb2xvcnNbYmMoImJvcmRlclJpZ2h0IixfX2IpXWVuZAppZgooYmMoImJvcmRlckJvdHRvbSIsX19iKX49bmlsKXRoZW4gYmFhWyJib3R0b20iXT1jb2xvcnNbYmMoImJvcmRlckJvdHRvbSIsX19iKV1lbmQ7aWYoYmMoImJvcmRlckNvbG9yIixfX2Ipfj1uaWwpdGhlbgpkZGE6c2V0Qm9yZGVyKGNvbG9yc1tiYygiYm9yZGVyQ29sb3IiLF9fYildKWVuZDtpZgooYmMoImlnbm9yZU9mZnNldCIsX19iKX49bmlsKXRoZW4KaWYoYmMoImlnbm9yZU9mZnNldCIsX19iKSl0aGVuIGRkYTppZ25vcmVPZmZzZXQodHJ1ZSllbmQgZW5kO2lmCihiYygib25DbGljayIsX19iKX49bmlsKXRoZW4KZGRhOmdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbihkZGEub25DbGljayxiYygib25DbGljayIsX19iKSllbmQ7aWYKKGJjKCJvbkNsaWNrVXAiLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uQ2xpY2tVcCxiYygib25DbGlja1VwIixfX2IpKWVuZDtpZgooYmMoIm9uU2Nyb2xsIixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vblNjcm9sbCxiYygib25TY3JvbGwiLF9fYikpZW5kO2lmCihiYygib25EcmFnIixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vbkRyYWcsYmMoIm9uRHJhZyIsX19iKSllbmQ7aWYoYmMoIm9uSG92ZXIiLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uSG92ZXIsYmMoIm9uSG92ZXIiLF9fYikpZW5kO2lmCihiYygib25MZWF2ZSIsX19iKX49bmlsKXRoZW4KZGRhOmdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbihkZGEub25MZWF2ZSxiYygib25MZWF2ZSIsX19iKSllbmQ7aWYoYmMoIm9uS2V5IixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vbktleSxiYygib25LZXkiLF9fYikpZW5kO2lmKGJjKCJvbktleVVwIixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vbktleVVwLGJjKCJvbktleVVwIixfX2IpKWVuZDtpZgooYmMoIm9uQ2hhbmdlIixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vbkNoYW5nZSxiYygib25DaGFuZ2UiLF9fYikpZW5kO2lmCihiYygib25SZXNpemUiLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uUmVzaXplLGJjKCJvblJlc2l6ZSIsX19iKSllbmQ7aWYKKGJjKCJvblJlcG9zaXRpb24iLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uUmVwb3NpdGlvbixiYygib25SZXBvc2l0aW9uIixfX2IpKWVuZDtpZgooYmMoIm9uRXZlbnQiLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uRXZlbnQsYmMoIm9uRXZlbnQiLF9fYikpZW5kO2lmCihiYygib25HZXRGb2N1cyIsX19iKX49bmlsKXRoZW4KZGRhOmdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbihkZGEub25HZXRGb2N1cyxiYygib25HZXRGb2N1cyIsX19iKSllbmQ7aWYKKGJjKCJvbkxvc2VGb2N1cyIsX19iKX49bmlsKXRoZW4KZGRhOmdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbihkZGEub25Mb3NlRm9jdXMsYmMoIm9uTG9zZUZvY3VzIixfX2IpKWVuZDtpZihiX2J+PW5pbCl0aGVuCmRkYTpzZXRUZXh0dXJlKGJfYixjX2IsZF9iKWVuZDtkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsaXNWaXNpYmxlPWZ1bmN0aW9uKGRkYSlyZXR1cm4KYl9hIGVuZCxzZXRGb2N1cz1mdW5jdGlvbihkZGEpaWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDpzZXRGb2N1c2VkT2JqZWN0KGRkYSllbmQ7cmV0dXJuIGRkYSBlbmQsc2V0WkluZGV4PWZ1bmN0aW9uKGRkYSxfX2IpCmNkPV9fYgppZihkZGEucGFyZW50fj1uaWwpdGhlbiBkZGEucGFyZW50OnJlbW92ZU9iamVjdChkZGEpCmRkYS5wYXJlbnQ6YWRkT2JqZWN0KGRkYSlkZGE6dXBkYXRlRXZlbnRIYW5kbGVycygpZW5kO3JldHVybiBkZGEgZW5kLHVwZGF0ZUV2ZW50SGFuZGxlcnM9ZnVuY3Rpb24oZGRhKQpmb3IgX19iLGFfYiBpbgpwYWlycyhiZGEpZG8gaWYoYV9iKXRoZW4gZGRhLnBhcmVudDphZGRFdmVudChfX2IsZGRhKWVuZCBlbmQgZW5kLGdldFpJbmRleD1mdW5jdGlvbihkZGEpcmV0dXJuIGNkIGVuZCxnZXRUeXBlPWZ1bmN0aW9uKGRkYSlyZXR1cm4gYWQgZW5kLGdldE5hbWU9ZnVuY3Rpb24oZGRhKXJldHVybgpkZGEubmFtZSBlbmQscmVtb3ZlPWZ1bmN0aW9uKGRkYSlpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OnJlbW92ZU9iamVjdChkZGEpZW5kO2RkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxzZXRQYXJlbnQ9ZnVuY3Rpb24oZGRhLF9fYikKaWYoCl9fYi5nZXRUeXBlfj1uaWwgYW5kIF9fYjpnZXRUeXBlKCk9PSJGcmFtZSIpdGhlbgpkZGE6cmVtb3ZlKClfX2I6YWRkT2JqZWN0KGRkYSlpZihkZGEuZHJhdyl0aGVuIGRkYTpzaG93KCllbmQgZW5kO3JldHVybiBkZGEgZW5kLHNldFZhbHVlPWZ1bmN0aW9uKGRkYSxfX2IsYV9iKWlmKApkZH49X19iKXRoZW4gZGQ9X19iO2RkYTp1cGRhdGVEcmF3KClpZihhX2J+PWZhbHNlKXRoZW4KZGRhOnZhbHVlQ2hhbmdlZEhhbmRsZXIoKWVuZCBlbmQKcmV0dXJuIGRkYSBlbmQsZ2V0VmFsdWU9ZnVuY3Rpb24oZGRhKXJldHVybiBkZCBlbmQsZ2V0RHJhdz1mdW5jdGlvbihkZGEpcmV0dXJuCmFkYSBlbmQsdXBkYXRlRHJhdz1mdW5jdGlvbihkZGEsX19iKWFkYT1fX2I7aWYoX19iPT1uaWwpdGhlbiBhZGE9dHJ1ZSBlbmQ7aWYoYWRhKXRoZW4gaWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDp1cGRhdGVEcmF3KCllbmQgZW5kO3JldHVybiBkZGEgZW5kLGdldEV2ZW50U3lzdGVtPWZ1bmN0aW9uKGRkYSlyZXR1cm4KY2RhIGVuZCxnZXRQYXJlbnQ9ZnVuY3Rpb24oZGRhKXJldHVybiBkZGEucGFyZW50IGVuZCxzZXRQb3NpdGlvbj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IpCmlmKHR5cGUoX19iKT09Im51bWJlciIpdGhlbiBkZGEueD0KYl9iIGFuZCBkZGE6Z2V0WCgpK19fYiBvciBfX2IgZW5kO2lmKHR5cGUoYV9iKT09Im51bWJlciIpdGhlbgpkZGEueT1iX2IgYW5kIGRkYTpnZXRZKCkrYV9iIG9yIGFfYiBlbmQKaWYoZGRhLnBhcmVudH49bmlsKXRoZW4gaWYodHlwZShfX2IpPT0ic3RyaW5nIil0aGVuCmRkYS54PWRkYS5wYXJlbnQ6bmV3RHluYW1pY1ZhbHVlKGRkYSxfX2IpZW5kO2lmKHR5cGUoYV9iKT09InN0cmluZyIpdGhlbgpkZGEueT1kZGEucGFyZW50Om5ld0R5bmFtaWNWYWx1ZShkZGEsYV9iKWVuZApkZGEucGFyZW50OnJlY2FsY3VsYXRlRHluYW1pY1ZhbHVlcygpZW5kO2RkYTpjdXN0b21FdmVudEhhbmRsZXIoImJhc2FsdF9yZXBvc2l0aW9uIikKZGRhOnVwZGF0ZURyYXcoKXJldHVybiBkZGEgZW5kLGdldFg9ZnVuY3Rpb24oZGRhKXJldHVybgoKdHlwZShkZGEueCk9PSJudW1iZXIiYW5kIGRkYS54IG9yIG1hdGguZmxvb3IoZGRhLnhbMV0rMC41KWVuZCxnZXRZPWZ1bmN0aW9uKGRkYSlyZXR1cm4KCnR5cGUoZGRhLnkpPT0ibnVtYmVyImFuZCBkZGEueSBvciBtYXRoLmZsb29yKGRkYS55WzFdKzAuNSllbmQsZ2V0UG9zaXRpb249ZnVuY3Rpb24oZGRhKXJldHVybgpkZGE6Z2V0WCgpLGRkYTpnZXRZKCllbmQsZ2V0VmlzaWJpbGl0eT1mdW5jdGlvbihkZGEpcmV0dXJuIGJfYSBlbmQsc2V0VmlzaWJpbGl0eT1mdW5jdGlvbihkZGEsX19iKQpiX2E9X19iIG9yIG5vdCBiX2E7ZGRhOnVwZGF0ZURyYXcoKXJldHVybiBkZGEgZW5kLHNldFNpemU9ZnVuY3Rpb24oZGRhLF9fYixhX2IsYl9iKWlmKHR5cGUoX19iKT09CiJudW1iZXIiKXRoZW4KZGRhLndpZHRoPWJfYiBhbmQgZGRhOmdldFdpZHRoKCkrX19iIG9yIF9fYiBlbmQKaWYodHlwZShhX2IpPT0ibnVtYmVyIil0aGVuIGRkYS5oZWlnaHQ9Yl9iIGFuZApkZGE6Z2V0SGVpZ2h0KCkrYV9iIG9yIGFfYiBlbmQKaWYoZGRhLnBhcmVudH49bmlsKXRoZW4gaWYodHlwZShfX2IpPT0ic3RyaW5nIil0aGVuCmRkYS53aWR0aD1kZGEucGFyZW50Om5ld0R5bmFtaWNWYWx1ZShkZGEsX19iKWVuZDtpZih0eXBlKGFfYik9PSJzdHJpbmciKXRoZW4KZGRhLmhlaWdodD1kZGEucGFyZW50Om5ld0R5bmFtaWNWYWx1ZShkZGEsYV9iKWVuZApkZGEucGFyZW50OnJlY2FsY3VsYXRlRHluYW1pY1ZhbHVlcygpZW5kO2lmKF9jYX49bmlsKWFuZChkY2E9PSJzdHJldGNoIil0aGVuCmFjYT1kYi5yZXNpemVCSU1HKF9jYSxkZGE6Z2V0U2l6ZSgpKVtiY2FdZW5kCmRkYTpjdXN0b21FdmVudEhhbmRsZXIoImJhc2FsdF9yZXNpemUiKWRkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxnZXRIZWlnaHQ9ZnVuY3Rpb24oZGRhKQpyZXR1cm4KdHlwZShkZGEuaGVpZ2h0KT09Im51bWJlciJhbmQgZGRhLmhlaWdodCBvcgptYXRoLmZsb29yKGRkYS5oZWlnaHRbMV0rMC41KWVuZCxnZXRXaWR0aD1mdW5jdGlvbihkZGEpcmV0dXJuCgp0eXBlKGRkYS53aWR0aCk9PSJudW1iZXIiYW5kIGRkYS53aWR0aCBvciBtYXRoLmZsb29yKGRkYS53aWR0aFsxXSswLjUpZW5kLGdldFNpemU9ZnVuY3Rpb24oZGRhKXJldHVybgpkZGE6Z2V0V2lkdGgoKSxkZGE6Z2V0SGVpZ2h0KCllbmQsY2FsY3VsYXRlRHluYW1pY1ZhbHVlcz1mdW5jdGlvbihkZGEpCmlmKAp0eXBlKGRkYS53aWR0aCk9PSJ0YWJsZSIpdGhlbiBkZGEud2lkdGg6Y2FsY3VsYXRlKCllbmQKaWYodHlwZShkZGEuaGVpZ2h0KT09InRhYmxlIil0aGVuIGRkYS5oZWlnaHQ6Y2FsY3VsYXRlKCllbmQKaWYodHlwZShkZGEueCk9PSJ0YWJsZSIpdGhlbiBkZGEueDpjYWxjdWxhdGUoKWVuZAppZih0eXBlKGRkYS55KT09InRhYmxlIil0aGVuIGRkYS55OmNhbGN1bGF0ZSgpZW5kO2RkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxzZXRCYWNrZ3JvdW5kPWZ1bmN0aW9uKGRkYSxfX2IsYV9iLGJfYilkZGEuYmdDb2xvcj0KX19iIG9yIGZhbHNlCmRkYS5iZ1N5bWJvbD1hX2Igb3IoZGRhLmJnQ29sb3J+PWZhbHNlIGFuZCBkZGEuYmdTeW1ib2wgb3IKZmFsc2UpZGRhLmJnU3ltYm9sQ29sb3I9Yl9iIG9yIGRkYS5iZ1N5bWJvbENvbG9yCmRkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxzZXRUZXh0dXJlPWZ1bmN0aW9uKGRkYSxfX2IsYV9iLGJfYilpZigKdHlwZShfX2IpPT0ic3RyaW5nIil0aGVuIF9jYT1kYi5sb2FkSW1hZ2VBc0JpbWcoX19iKWVsc2VpZih0eXBlKF9fYik9PSJ0YWJsZSIpdGhlbgpfY2E9X19iIGVuZAppZihfY2EuYW5pbWF0ZWQpdGhlbiBsb2NhbCBjX2I9X2NhW2JjYV0uZHVyYXRpb24gb3IKX2NhLnNlY29uZHNQZXJGcmFtZSBvciAwLjIKY2NhPW9zLnN0YXJ0VGltZXIoY19iKWRkYS5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixkZGEpCmJkYVsib3RoZXJfZXZlbnQiXT10cnVlIGVuZDtfZGE9Yl9iPT1mYWxzZSBhbmQgZmFsc2Ugb3IgdHJ1ZTtiY2E9MQpkY2E9YV9iIG9yIm5vcm1hbCJpZihkY2E9PSJzdHJldGNoIil0aGVuCmFjYT1kYi5yZXNpemVCSU1HKF9jYSxkZGE6Z2V0U2l6ZSgpKVsxXWVsc2UgYWNhPV9jYVsxXWVuZApkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsc2V0VHJhbnNwYXJlbnQ9ZnVuY3Rpb24oZGRhLF9fYilkZGEudHJhbnNwYXJlbnRDb2xvcj0KX19iIG9yIGZhbHNlO2lmKF9fYn49ZmFsc2UpdGhlbiBkZGEuYmdTeW1ib2w9ZmFsc2UKZGRhLmJnU3ltYm9sQ29sb3I9ZmFsc2UgZW5kO2RkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxnZXRCYWNrZ3JvdW5kPWZ1bmN0aW9uKGRkYSlyZXR1cm4KZGRhLmJnQ29sb3IgZW5kLHNldEZvcmVncm91bmQ9ZnVuY3Rpb24oZGRhLF9fYilkZGEuZmdDb2xvcj1fX2Igb3IgZmFsc2UKZGRhOnVwZGF0ZURyYXcoKXJldHVybiBkZGEgZW5kLGdldEZvcmVncm91bmQ9ZnVuY3Rpb24oZGRhKXJldHVybiBkZGEuZmdDb2xvciBlbmQsc2V0U2hhZG93PWZ1bmN0aW9uKGRkYSxfX2IpaWYoCl9fYj09ZmFsc2UpdGhlbiBhYWE9ZmFsc2UgZWxzZSBjYWE9X19iO2FhYT10cnVlIGVuZApkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsaXNTaGFkb3dBY3RpdmU9ZnVuY3Rpb24oZGRhKXJldHVybiBhYWEgZW5kLHNldEJvcmRlcj1mdW5jdGlvbihkZGEsLi4uKQppZigKLi4ufj1uaWwpdGhlbiBsb2NhbCBfX2I9ey4uLn0KZm9yIGFfYixiX2IgaW4gcGFpcnMoX19iKWRvIGlmKGJfYj09ImxlZnQiKW9yKCNfX2I9PTEpdGhlbgpiYWFbImxlZnQiXT1fX2JbMV1lbmQ7aWYoYl9iPT0idG9wIilvcigjX19iPT0xKXRoZW4KYmFhWyJ0b3AiXT1fX2JbMV1lbmQ7aWYoYl9iPT0icmlnaHQiKW9yKCNfX2I9PTEpdGhlbgpiYWFbInJpZ2h0Il09X19iWzFdZW5kO2lmKGJfYj09ImJvdHRvbSIpb3IoI19fYj09MSl0aGVuCmJhYVsiYm90dG9tIl09X19iWzFdZW5kIGVuZCBlbmQ7ZGRhOnVwZGF0ZURyYXcoKXJldHVybiBkZGEgZW5kLGdldEJvcmRlcj1mdW5jdGlvbihkZGEsX19iKWlmKApfX2I9PSJsZWZ0Iil0aGVuIHJldHVybiBib3JkZXJMZWZ0IGVuZAppZihfX2I9PSJ0b3AiKXRoZW4gcmV0dXJuIGJvcmRlclRvcCBlbmQ7aWYoX19iPT0icmlnaHQiKXRoZW4gcmV0dXJuIGJvcmRlclJpZ2h0IGVuZDtpZihfX2I9PSJib3R0b20iKXRoZW4KcmV0dXJuIGJvcmRlckJvdHRvbSBlbmQgZW5kLGRyYXc9ZnVuY3Rpb24oZGRhKQppZgooYl9hKXRoZW4KaWYoZGRhLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgX19iLGFfYj1kZGE6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBiX2IsY19iPWRkYTpnZXRTaXplKClsb2NhbCBkX2IsX2FiPWRkYS5wYXJlbnQ6Z2V0U2l6ZSgpCmlmKF9fYitiX2I8MSlvcihfX2I+ZF9iKW9yKGFfYisKY19iPDEpb3IoYV9iPl9hYil0aGVuIHJldHVybiBmYWxzZSBlbmQ7aWYoZGRhLnRyYW5zcGFyZW50Q29sb3J+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IsYV9iLGJfYixjX2IsZGRhLnRyYW5zcGFyZW50Q29sb3IpZW5kO2lmKGRkYS5iZ0NvbG9yfj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iLGFfYixiX2IsY19iLGRkYS5iZ0NvbG9yKWVuZAppZihkZGEuYmdTeW1ib2x+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3VGV4dEJveChfX2IsYV9iLGJfYixjX2IsZGRhLmJnU3ltYm9sKWlmKGRkYS5iZ1N5bWJvbH49IiAiKXRoZW4KZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IsYV9iLGJfYixjX2IsZGRhLmJnU3ltYm9sQ29sb3IpZW5kIGVuZAppZihhY2F+PW5pbCl0aGVuCmlmKGRjYT09ImNlbnRlciIpdGhlbiBsb2NhbCBiYWIsY2FiPSNhY2FbMV1bMV0sI2FjYQpsb2NhbCBkYWI9YmFiPGJfYiBhbmQgbWF0aC5mbG9vcigoYl9iLWJhYikvCjIpb3IgMApsb2NhbCBfYmI9Y2FiPGNfYiBhbmQgbWF0aC5mbG9vcigoY19iLWNhYikvMilvciAwCmxvY2FsIGFiYj1iYWI8Yl9iIGFuZCAxIG9yIG1hdGguZmxvb3IoKGJhYi1iX2IpLzIpCmxvY2FsIGJiYj1iYWI8Yl9iIGFuZCBiX2Igb3IKYl9iLW1hdGguZmxvb3IoKGJfYi1iYWIpLzIgKzAuNSktMQpsb2NhbCBjYmI9Y2FiPGNfYiBhbmQgMSBvciBtYXRoLmZsb29yKChjYWItY19iKS8yKQpsb2NhbCBkYmI9Y2FiPGNfYiBhbmQgY19iIG9yCmNfYi1tYXRoLmZsb29yKChjX2ItY2FiKS8yICswLjUpLTE7bG9jYWwgX2NiPTEKZm9yIGs9Y2JiLCNhY2EgZG8KaWYoYWNhW2tdfj1uaWwpdGhlbiBsb2NhbCBhY2IsYmNiLGNjYj1jYyhhY2Fba10pYWNiPWRjKGFjYixhYmIsYmJiKQpiY2I9ZGMoYmNiLGFiYixiYmIpY2NiPWRjKGNjYixhYmIsYmJiKQpkZGEucGFyZW50OmJsaXQoX19iK2RhYixhX2IrX2NiLTEgK19iYixhY2IsYmNiLGNjYillbmQ7X2NiPV9jYisxO2lmKGs9PWRiYil0aGVuIGJyZWFrIGVuZCBlbmQgZWxzZQpmb3IgYmFiLGNhYiBpbiBwYWlycyhhY2EpZG8gbG9jYWwgZGFiLF9iYixhYmI9Y2MoY2FiKWRhYj1kYyhkYWIsMSxiX2IpX2JiPWRjKF9iYiwxLGJfYikKYWJiPWRjKGFiYiwxLGJfYilkZGEucGFyZW50OmJsaXQoX19iLGFfYitiYWItMSxkYWIsX2JiLGFiYilpZihiYWI9PQpjX2IpdGhlbiBicmVhayBlbmQgZW5kIGVuZCBlbmQKaWYoYWFhKXRoZW4KZGRhLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChfX2IrMSxhX2IrY19iLGJfYiwxLGNhYSkKZGRhLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChfX2IrYl9iLGFfYisxLDEsY19iLGNhYSkKZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IrMSxhX2IrY19iLGJfYiwxLGNhYSkKZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IrYl9iLGFfYisxLDEsY19iLGNhYSllbmQ7bG9jYWwgYWFiPWRkYS5iZ0NvbG9yCmlmKGJhYVsibGVmdCJdfj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd1RleHRCb3goX19iLGFfYiwxLGNfYiwiXDE0OSIpaWYoYWFifj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iLGFfYiwxLGNfYixhYWIpZW5kCmRkYS5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goX19iLGFfYiwxLGNfYixiYWFbImxlZnQiXSllbmQKaWYoYmFhWyJ0b3AiXX49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdUZXh0Qm94KF9fYixhX2IsYl9iLDEsIlwxMzEiKWlmKGFhYn49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9fYixhX2IsYl9iLDEsZGRhLmJnQ29sb3IpZW5kCmRkYS5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goX19iLGFfYixiX2IsMSxiYWFbInRvcCJdKWVuZAppZihiYWFbImxlZnQiXX49ZmFsc2UpYW5kKGJhYVsidG9wIl1+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3VGV4dEJveChfX2IsYV9iLDEsMSwiXDE1MSIpaWYoYWFifj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iLGFfYiwxLDEsZGRhLmJnQ29sb3IpZW5kCmRkYS5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goX19iLGFfYiwxLDEsYmFhWyJsZWZ0Il0pZW5kCmlmKGJhYVsicmlnaHQiXX49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdUZXh0Qm94KF9fYitiX2ItMSxhX2IsMSxjX2IsIlwxNDkiKWlmKGFhYn49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdGb3JlZ3JvdW5kQm94KF9fYitiX2ItMSxhX2IsMSxjX2IsZGRhLmJnQ29sb3IpZW5kCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iK2JfYi0xLGFfYiwxLGNfYixiYWFbInJpZ2h0Il0pZW5kCmlmKGJhYVsiYm90dG9tIl1+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3VGV4dEJveChfX2IsYV9iK2NfYi0xLGJfYiwxLCJcMTQzIilpZihhYWJ+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IsYV9iK2NfYi0xLGJfYiwxLGRkYS5iZ0NvbG9yKWVuZApkZGEucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9fYixhX2IrY19iLTEsYl9iLDEsYmFhWyJib3R0b20iXSllbmQKaWYoYmFhWyJ0b3AiXX49ZmFsc2UpYW5kKGJhYVsicmlnaHQiXX49ZmFsc2UpdGhlbiBkZGEucGFyZW50OmRyYXdUZXh0Qm94KApfX2IrYl9iLTEsYV9iLDEsMSwiXDE0OCIpaWYKKGFhYn49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdGb3JlZ3JvdW5kQm94KF9fYitiX2ItMSxhX2IsMSwxLGRkYS5iZ0NvbG9yKWVuZApkZGEucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9fYitiX2ItMSxhX2IsMSwxLGJhYVsicmlnaHQiXSllbmQKaWYoYmFhWyJyaWdodCJdfj1mYWxzZSlhbmQoYmFhWyJib3R0b20iXX49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdUZXh0Qm94KApfX2IrYl9iLTEsYV9iK2NfYi0xLDEsMSwiXDEzMyIpaWYoYWFifj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goX19iK2JfYi0xLGFfYitjX2ItMSwxLDEsZGRhLmJnQ29sb3IpZW5kCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iK2JfYi0xLAphX2IrY19iLTEsMSwxLGJhYVsicmlnaHQiXSllbmQKaWYoYmFhWyJib3R0b20iXX49ZmFsc2UpYW5kKGJhYVsibGVmdCJdfj1mYWxzZSl0aGVuIGRkYS5wYXJlbnQ6ZHJhd1RleHRCb3goX19iLAphX2IrY19iLTEsMSwxLCJcMTM4IilpZihhYWJ+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveCgKX19iLTEsYV9iK2NfYi0xLDEsMSxkZGEuYmdDb2xvcillbmQKZGRhLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChfX2IsYV9iK2NfYi0xLDEsMSxiYWFbImxlZnQiXSllbmQgZW5kO2FkYT1mYWxzZTtyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxnZXRBYnNvbHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKGRkYSxfX2IsYV9iKQppZigKX19iPT1uaWwpb3IoYV9iPT1uaWwpdGhlbiBfX2IsYV9iPWRkYTpnZXRBbmNob3JQb3NpdGlvbigpZW5kCmlmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmxvY2FsIGJfYixjX2I9ZGRhLnBhcmVudDpnZXRBYnNvbHV0ZVBvc2l0aW9uKClfX2I9Yl9iK19fYi0xO2FfYj1jX2IrYV9iLTEgZW5kO3JldHVybiBfX2IsYV9iIGVuZCxnZXRBbmNob3JQb3NpdGlvbj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IpaWYoCl9fYj09bmlsKXRoZW4gX19iPWRkYTpnZXRYKCllbmQKaWYoYV9iPT1uaWwpdGhlbiBhX2I9ZGRhOmdldFkoKWVuZAppZihkZGEucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBjX2IsZF9iPWRkYS5wYXJlbnQ6Z2V0U2l6ZSgpCmlmKF9fYT09InRvcCIpdGhlbiBfX2I9bWF0aC5mbG9vcigKY19iLzIpK19fYi0xIGVsc2VpZihfX2E9PSJ0b3BSaWdodCIpdGhlbgpfX2I9Y19iK19fYi0xIGVsc2VpZihfX2E9PSJyaWdodCIpdGhlbiBfX2I9Y19iK19fYi0xCmFfYj1tYXRoLmZsb29yKGRfYi8yKSthX2ItMSBlbHNlaWYoX19hPT0iYm90dG9tUmlnaHQiKXRoZW4gX19iPWNfYitfX2ItMTthX2I9ZF9iK2FfYi0xIGVsc2VpZihfX2E9PSJib3R0b20iKXRoZW4gX19iPW1hdGguZmxvb3IoCmNfYi8yKStfX2ItMTthX2I9ZF9iK2FfYi0xIGVsc2VpZihfX2E9PQoiYm90dG9tTGVmdCIpdGhlbiBhX2I9ZF9iK2FfYi0xIGVsc2VpZihfX2E9PSJsZWZ0Iil0aGVuCmFfYj1tYXRoLmZsb29yKGRfYi8yKSthX2ItMSBlbHNlaWYoX19hPT0iY2VudGVyIil0aGVuIF9fYj1tYXRoLmZsb29yKGNfYi8yKStfX2ItMTthX2I9bWF0aC5mbG9vcigKZF9iLzIpK2FfYi0xIGVuZDtsb2NhbCBfYWIsYWFiPWRkYS5wYXJlbnQ6Z2V0T2Zmc2V0SW50ZXJuYWwoKWlmIG5vdChhX2Egb3IgYl9iKXRoZW4gcmV0dXJuCl9fYitfYWIsYV9iK2FhYiBlbmQgZW5kO3JldHVybiBfX2IsYV9iIGVuZCxpZ25vcmVPZmZzZXQ9ZnVuY3Rpb24oZGRhLF9fYikKYV9hPV9fYjtpZihfX2I9PW5pbCl0aGVuIGFfYT10cnVlIGVuZDtyZXR1cm4gZGRhIGVuZCxnZXRCYXNlRnJhbWU9ZnVuY3Rpb24oZGRhKQppZigKZGRhLnBhcmVudH49bmlsKXRoZW4gcmV0dXJuIGRkYS5wYXJlbnQ6Z2V0QmFzZUZyYW1lKCllbmQ7cmV0dXJuIGRkYSBlbmQsc2V0QW5jaG9yPWZ1bmN0aW9uKGRkYSxfX2IpX19hPV9fYgpkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsZ2V0QW5jaG9yPWZ1bmN0aW9uKGRkYSlyZXR1cm4gX19hIGVuZCxvbkNoYW5nZT1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoInZhbHVlX2NoYW5nZWQiLGFfYillbmQgZW5kO3JldHVybiBkZGEgZW5kLG9uQ2xpY2s9ZnVuY3Rpb24oZGRhLC4uLikKZm9yIF9fYixhX2IgaW4KcGFpcnModGFibGUucGFjayguLi4pKWRvIGlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuCmRkYTpyZWdpc3RlckV2ZW50KCJtb3VzZV9jbGljayIsYV9iKWVuZCBlbmQKaWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGRkYSliZGFbIm1vdXNlX2NsaWNrIl09dHJ1ZQpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsZGRhKWJkYVsibW91c2VfdXAiXT10cnVlIGVuZDtyZXR1cm4gZGRhIGVuZCxvbkNsaWNrVXA9ZnVuY3Rpb24oZGRhLC4uLilmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8KaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4gZGRhOnJlZ2lzdGVyRXZlbnQoIm1vdXNlX3VwIixhX2IpZW5kIGVuZAppZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsZGRhKWJkYVsibW91c2VfY2xpY2siXT10cnVlCmRkYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3VwIixkZGEpYmRhWyJtb3VzZV91cCJdPXRydWUgZW5kO3JldHVybiBkZGEgZW5kLG9uUmVsZWFzZT1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoIm1vdXNlX3JlbGVhc2UiLGFfYillbmQgZW5kCmlmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2NsaWNrIixkZGEpYmRhWyJtb3VzZV9jbGljayJdPXRydWUKZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfdXAiLGRkYSliZGFbIm1vdXNlX3VwIl09dHJ1ZSBlbmQ7cmV0dXJuIGRkYSBlbmQsb25TY3JvbGw9ZnVuY3Rpb24oZGRhLC4uLikKZm9yIF9fYixhX2IgaW4KcGFpcnModGFibGUucGFjayguLi4pKWRvIGlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuCmRkYTpyZWdpc3RlckV2ZW50KCJtb3VzZV9zY3JvbGwiLGFfYillbmQgZW5kCmlmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3Njcm9sbCIsZGRhKWJkYVsibW91c2Vfc2Nyb2xsIl09dHJ1ZSBlbmQ7cmV0dXJuIGRkYSBlbmQsb25Ib3Zlcj1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoIm1vdXNlX2hvdmVyIixhX2IpZW5kIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9tb3ZlIixkZGEpYmRhWyJtb3VzZV9tb3ZlIl09dHJ1ZSBlbmQKcmV0dXJuIGRkYSBlbmQsb25MZWF2ZT1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoIm1vdXNlX2xlYXZlIixhX2IpZW5kIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9tb3ZlIixkZGEpYmRhWyJtb3VzZV9tb3ZlIl09dHJ1ZSBlbmQKcmV0dXJuIGRkYSBlbmQsb25EcmFnPWZ1bmN0aW9uKGRkYSwuLi4pCmZvciBfX2IsYV9iIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKGFfYik9PSJmdW5jdGlvbiIpdGhlbgpkZGE6cmVnaXN0ZXJFdmVudCgibW91c2VfZHJhZyIsYV9iKWVuZCBlbmQKaWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfZHJhZyIsZGRhKWJkYVsibW91c2VfZHJhZyJdPXRydWUKZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGRkYSliZGFbIm1vdXNlX2NsaWNrIl09dHJ1ZQpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsZGRhKWJkYVsibW91c2VfdXAiXT10cnVlIGVuZDtyZXR1cm4gZGRhIGVuZCxvbkV2ZW50PWZ1bmN0aW9uKGRkYSwuLi4pCmZvciBfX2IsYV9iIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKGFfYik9PSJmdW5jdGlvbiIpdGhlbgpkZGE6cmVnaXN0ZXJFdmVudCgib3RoZXJfZXZlbnQiLGFfYillbmQgZW5kO2lmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixkZGEpYmRhWyJvdGhlcl9ldmVudCJdPXRydWUgZW5kO3JldHVybgpkZGEgZW5kLG9uS2V5PWZ1bmN0aW9uKGRkYSwuLi4pCmlmCihkYWEpdGhlbgpmb3IgX19iLGFfYiBpbiBwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoImtleSIsYV9iKWVuZCBlbmQ7aWYoZGRhLnBhcmVudH49bmlsKXRoZW4gZGRhLnBhcmVudDphZGRFdmVudCgia2V5IixkZGEpCmJkYVsia2V5Il09dHJ1ZSBlbmQgZW5kO3JldHVybiBkZGEgZW5kLG9uQ2hhcj1mdW5jdGlvbihkZGEsLi4uKQppZgooZGFhKXRoZW4KZm9yIF9fYixhX2IgaW4gcGFpcnModGFibGUucGFjayguLi4pKWRvIGlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuCmRkYTpyZWdpc3RlckV2ZW50KCJjaGFyIixhX2IpZW5kIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbiBkZGEucGFyZW50OmFkZEV2ZW50KCJjaGFyIixkZGEpCmJkYVsiY2hhciJdPXRydWUgZW5kIGVuZDtyZXR1cm4gZGRhIGVuZCxvblJlc2l6ZT1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoImJhc2FsdF9yZXNpemUiLGFfYillbmQgZW5kO3JldHVybiBkZGEgZW5kLG9uUmVwb3NpdGlvbj1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoImJhc2FsdF9yZXBvc2l0aW9uIixhX2IpZW5kIGVuZDtyZXR1cm4gZGRhIGVuZCxvbktleVVwPWZ1bmN0aW9uKGRkYSwuLi4pZm9yIF9fYixhX2IgaW4KcGFpcnModGFibGUucGFjayguLi4pKWRvCmlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuIGRkYTpyZWdpc3RlckV2ZW50KCJrZXlfdXAiLGFfYillbmQgZW5kO2lmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6YWRkRXZlbnQoImtleV91cCIsZGRhKWJkYVsia2V5X3VwIl09dHJ1ZSBlbmQ7cmV0dXJuIGRkYSBlbmQsaXNGb2N1c2VkPWZ1bmN0aW9uKGRkYSlpZigKZGRhLnBhcmVudH49bmlsKXRoZW4KcmV0dXJuIGRkYS5wYXJlbnQ6Z2V0Rm9jdXNlZE9iamVjdCgpPT1kZGEgZW5kO3JldHVybiBmYWxzZSBlbmQsb25HZXRGb2N1cz1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoImdldF9mb2N1cyIsYV9iKWVuZCBlbmQ7aWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGRkYSliZGFbIm1vdXNlX2NsaWNrIl09dHJ1ZSBlbmQ7cmV0dXJuCmRkYSBlbmQsb25Mb3NlRm9jdXM9ZnVuY3Rpb24oZGRhLC4uLikKZm9yIF9fYixhX2IgaW4KcGFpcnModGFibGUucGFjayguLi4pKWRvIGlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuCmRkYTpyZWdpc3RlckV2ZW50KCJsb3NlX2ZvY3VzIixhX2IpZW5kIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsZGRhKWJkYVsibW91c2VfY2xpY2siXT10cnVlIGVuZDtyZXR1cm4KZGRhIGVuZCxyZWdpc3RlckV2ZW50PWZ1bmN0aW9uKGRkYSxfX2IsYV9iKXJldHVybgpjZGE6cmVnaXN0ZXJFdmVudChfX2IsYV9iKWVuZCxyZW1vdmVFdmVudD1mdW5jdGlvbihkZGEsX19iLGFfYikKcmV0dXJuIGNkYTpyZW1vdmVFdmVudChfX2IsYV9iKWVuZCxzZW5kRXZlbnQ9ZnVuY3Rpb24oZGRhLF9fYiwuLi4pcmV0dXJuIGNkYTpzZW5kRXZlbnQoX19iLGRkYSwuLi4pZW5kLGlzQ29vcmRzSW5PYmplY3Q9ZnVuY3Rpb24oZGRhLF9fYixhX2IpCmlmCihiX2EpYW5kKGRhYSl0aGVuIGlmKF9fYj09bmlsKW9yKGFfYj09bmlsKXRoZW4gcmV0dXJuIGZhbHNlIGVuZApsb2NhbCBiX2IsY19iPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKClsb2NhbCBkX2IsX2FiPWRkYTpnZXRTaXplKCkKaWYKKGJfYjw9X19iKWFuZChiX2IrZF9iPl9fYilhbmQoY19iPD1hX2IpYW5kKGNfYitfYWI+YV9iKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZDtyZXR1cm4gZmFsc2UgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IsY19iKQppZgooZGRhOmlzQ29vcmRzSW5PYmplY3QoYV9iLGJfYikpdGhlbiBsb2NhbCBkX2IsX2FiPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKCkKbG9jYWwgYWFiPWNkYTpzZW5kRXZlbnQoIm1vdXNlX2NsaWNrIixkZGEsIm1vdXNlX2NsaWNrIixfX2IsYV9iLQooZF9iLTEpLGJfYi0gKF9hYi0xKSxhX2IsYl9iLGNfYilpZihhYWI9PWZhbHNlKXRoZW4gcmV0dXJuIGZhbHNlIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OnNldEZvY3VzZWRPYmplY3QoZGRhKWVuZDtfYWE9dHJ1ZTtfYmE9dHJ1ZTthYmEsYmJhPWFfYixiX2I7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsbW91c2VVcEhhbmRsZXI9ZnVuY3Rpb24oZGRhLF9fYixhX2IsYl9iKQpfYmE9ZmFsc2UKaWYoX2FhKXRoZW4gbG9jYWwgY19iLGRfYj1kZGE6Z2V0QWJzb2x1dGVQb3NpdGlvbigpCmxvY2FsIF9hYj1jZGE6c2VuZEV2ZW50KCJtb3VzZV9yZWxlYXNlIixkZGEsIm1vdXNlX3JlbGVhc2UiLF9fYixhX2ItICgKY19iLTEpLGJfYi0gKGRfYi0xKSxhX2IsYl9iKV9hYT1mYWxzZSBlbmQKaWYoZGRhOmlzQ29vcmRzSW5PYmplY3QoYV9iLGJfYikpdGhlbiBsb2NhbCBjX2IsZF9iPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKCkKbG9jYWwgX2FiPWNkYTpzZW5kRXZlbnQoIm1vdXNlX3VwIixkZGEsIm1vdXNlX3VwIixfX2IsCmFfYi0gKGNfYi0xKSxiX2ItIChkX2ItMSksYV9iLGJfYilpZihfYWI9PWZhbHNlKXRoZW4gcmV0dXJuIGZhbHNlIGVuZDtyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmFnSGFuZGxlcj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IpCmlmCihfYmEpdGhlbiBsb2NhbCBjX2IsZF9iPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKCkKbG9jYWwgX2FiPWNkYTpzZW5kRXZlbnQoIm1vdXNlX2RyYWciLGRkYSwibW91c2VfZHJhZyIsX19iLGFfYi0gKGNfYi0xKSwKYl9iLSAoZF9iLTEpLGFiYS1hX2IsYmJhLWJfYixhX2IsYl9iKWFiYSxiYmE9YV9iLGJfYjtpZihfYWJ+PW5pbCl0aGVuIHJldHVybiBfYWIgZW5kO2lmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6c2V0Rm9jdXNlZE9iamVjdChkZGEpZW5kO3JldHVybiB0cnVlIGVuZAppZihkZGE6aXNDb29yZHNJbk9iamVjdChhX2IsYl9iKSl0aGVuCmxvY2FsIGNfYixkX2I9ZGRhOmdldEFic29sdXRlUG9zaXRpb24oZGRhOmdldEFuY2hvclBvc2l0aW9uKCkpYWJhLGJiYT1hX2IsYl9iO2NiYSxkYmE9Y19iLWFfYixkX2ItYl9iIGVuZDtyZXR1cm4gZmFsc2UgZW5kLHNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oZGRhLF9fYixhX2IsYl9iKQppZgooZGRhOmlzQ29vcmRzSW5PYmplY3QoYV9iLGJfYikpdGhlbiBsb2NhbCBjX2IsZF9iPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKCkKbG9jYWwgX2FiPWNkYTpzZW5kRXZlbnQoIm1vdXNlX3Njcm9sbCIsZGRhLCJtb3VzZV9zY3JvbGwiLF9fYixhX2ItCihjX2ItMSksYl9iLSAoZF9iLTEpKWlmKF9hYj09ZmFsc2UpdGhlbiByZXR1cm4gZmFsc2UgZW5kO2lmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6c2V0Rm9jdXNlZE9iamVjdChkZGEpZW5kO3JldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGhvdmVySGFuZGxlcj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IpCmlmCihkZGE6aXNDb29yZHNJbk9iamVjdChfX2IsYV9iKSl0aGVuCmxvY2FsIGNfYj1jZGE6c2VuZEV2ZW50KCJtb3VzZV9ob3ZlciIsZGRhLCJtb3VzZV9ob3ZlciIsX19iLGFfYixiX2IpaWYoY19iPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQ7ZF9hPXRydWU7cmV0dXJuIHRydWUgZW5kCmlmKGRfYSl0aGVuCmxvY2FsIGNfYj1jZGE6c2VuZEV2ZW50KCJtb3VzZV9sZWF2ZSIsZGRhLCJtb3VzZV9sZWF2ZSIsX19iLGFfYixiX2IpaWYoY19iPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQ7ZF9hPWZhbHNlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGtleUhhbmRsZXI9ZnVuY3Rpb24oZGRhLF9fYixhX2IpaWYKKGRhYSlhbmQoYl9hKXRoZW4KaWYoZGRhOmlzRm9jdXNlZCgpKXRoZW4KbG9jYWwgYl9iPWNkYTpzZW5kRXZlbnQoImtleSIsZGRhLCJrZXkiLF9fYixhX2IpaWYoYl9iPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQ7cmV0dXJuIHRydWUgZW5kIGVuZDtyZXR1cm4KZmFsc2UgZW5kLGtleVVwSGFuZGxlcj1mdW5jdGlvbihkZGEsX19iKWlmCihkYWEpYW5kKGJfYSl0aGVuCmlmKGRkYTppc0ZvY3VzZWQoKSl0aGVuCmxvY2FsIGFfYj1jZGE6c2VuZEV2ZW50KCJrZXlfdXAiLGRkYSwia2V5X3VwIixfX2IpaWYoYV9iPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQ7cmV0dXJuIHRydWUgZW5kIGVuZDtyZXR1cm4KZmFsc2UgZW5kLGNoYXJIYW5kbGVyPWZ1bmN0aW9uKGRkYSxfX2IpaWYKKGRhYSlhbmQoYl9hKXRoZW4KaWYoZGRhOmlzRm9jdXNlZCgpKXRoZW4KbG9jYWwgYV9iPWNkYTpzZW5kRXZlbnQoImNoYXIiLGRkYSwiY2hhciIsX19iKWlmKGFfYj09ZmFsc2UpdGhlbiByZXR1cm4gZmFsc2UgZW5kO3JldHVybiB0cnVlIGVuZCBlbmQ7cmV0dXJuCmZhbHNlIGVuZCx2YWx1ZUNoYW5nZWRIYW5kbGVyPWZ1bmN0aW9uKGRkYSkKY2RhOnNlbmRFdmVudCgidmFsdWVfY2hhbmdlZCIsZGRhLGRkKWVuZCxldmVudEhhbmRsZXI9ZnVuY3Rpb24oZGRhLF9fYiwuLi4pbG9jYWwgYV9iPXsuLi59CmlmCihfX2I9PSJ0aW1lciIpYW5kKGFfYlsxXT09Y2NhKXRoZW4KaWYoX2NhW2JjYSsxXX49bmlsKXRoZW4gYmNhPWJjYSsxO2lmKGRjYT09InN0cmV0Y2giKXRoZW4KYWNhPWRiLnJlc2l6ZUJJTUcoX2NhLGRkYTpnZXRTaXplKCkpW2JjYV1lbHNlIGFjYT1fY2FbYmNhXWVuZDtsb2NhbCBjX2I9X2NhW2JjYV0uZHVyYXRpb24gb3IKX2NhLnNlY29uZHNQZXJGcmFtZSBvciAwLjIKY2NhPW9zLnN0YXJ0VGltZXIoY19iKWVsc2UKaWYoX2RhKXRoZW4gYmNhPTE7aWYoZGNhPT0ic3RyZXRjaCIpdGhlbgphY2E9ZGIucmVzaXplQklNRyhfY2EsZGRhOmdldFNpemUoKSlbMV1lbHNlIGFjYT1fY2FbMV1lbmQ7bG9jYWwgY19iPQpfY2FbMV0uZHVyYXRpb24gb3IgX2NhLnNlY29uZHNQZXJGcmFtZSBvciAwLjIKY2NhPW9zLnN0YXJ0VGltZXIoY19iKWVuZCBlbmQ7ZGRhOnVwZGF0ZURyYXcoKWVuZDtsb2NhbCBiX2I9Y2RhOnNlbmRFdmVudCgib3RoZXJfZXZlbnQiLGRkYSxfX2IsLi4uKWlmKGJfYn49bmlsKXRoZW4KcmV0dXJuIGJfYiBlbmQgZW5kLGN1c3RvbUV2ZW50SGFuZGxlcj1mdW5jdGlvbihkZGEsX19iLC4uLikKaWYKKApfY2F+PW5pbClhbmQoZGNhPT0ic3RyZXRjaCIpYW5kKF9fYj09ImJhc2FsdF9yZXNpemUiKXRoZW4KYWNhPWRiLnJlc2l6ZUJJTUcoX2NhLGRkYTpnZXRTaXplKCkpW2JjYV1kZGE6dXBkYXRlRHJhdygpZW5kO2xvY2FsIGFfYj1jZGE6c2VuZEV2ZW50KCJjdXN0b21fZXZlbnQiLGRkYSxfX2IsLi4uKWlmKGFfYn49bmlsKXRoZW4KcmV0dXJuIGFfYiBlbmQ7cmV0dXJuIHRydWUgZW5kLGdldEZvY3VzSGFuZGxlcj1mdW5jdGlvbihkZGEpCmxvY2FsIF9fYj1jZGE6c2VuZEV2ZW50KCJnZXRfZm9jdXMiLGRkYSlpZihfX2J+PW5pbCl0aGVuIHJldHVybiBfX2IgZW5kO3JldHVybiB0cnVlIGVuZCxsb3NlRm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGRkYSkKX2JhPWZhbHNlO2xvY2FsIF9fYj1jZGE6c2VuZEV2ZW50KCJsb3NlX2ZvY3VzIixkZGEpCmlmKF9fYn49bmlsKXRoZW4gcmV0dXJuIF9fYiBlbmQ7cmV0dXJuIHRydWUgZW5kLGluaXQ9ZnVuY3Rpb24oZGRhKQppZgooZGRhLnBhcmVudH49bmlsKXRoZW4gZm9yIF9fYixhX2IgaW4gcGFpcnMoYmRhKWRvCmlmKGFfYil0aGVuIGRkYS5wYXJlbnQ6YWRkRXZlbnQoX19iLGRkYSllbmQgZW5kIGVuZDtpZiBub3QoY19hKXRoZW4gY19hPXRydWU7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmR9YmQuX19pbmRleD1iZDtyZXR1cm4gYmQgZW5kIGVuZAphYVsidGhlbWUiXT1mdW5jdGlvbiguLi4pCnJldHVybgp7QmFzYWx0Qkc9Y29sb3JzLmxpZ2h0R3JheSxCYXNhbHRUZXh0PWNvbG9ycy5ibGFjayxGcmFtZUJHPWNvbG9ycy5ncmF5LEZyYW1lVGV4dD1jb2xvcnMuYmxhY2ssQnV0dG9uQkc9Y29sb3JzLmdyYXksQnV0dG9uVGV4dD1jb2xvcnMuYmxhY2ssQ2hlY2tib3hCRz1jb2xvcnMuZ3JheSxDaGVja2JveFRleHQ9Y29sb3JzLmJsYWNrLElucHV0Qkc9Y29sb3JzLmdyYXksSW5wdXRUZXh0PWNvbG9ycy5ibGFjayxUZXh0ZmllbGRCRz1jb2xvcnMuZ3JheSxUZXh0ZmllbGRUZXh0PWNvbG9ycy5ibGFjayxMaXN0Qkc9Y29sb3JzLmdyYXksTGlzdFRleHQ9Y29sb3JzLmJsYWNrLE1lbnViYXJCRz1jb2xvcnMuZ3JheSxNZW51YmFyVGV4dD1jb2xvcnMuYmxhY2ssRHJvcGRvd25CRz1jb2xvcnMuZ3JheSxEcm9wZG93blRleHQ9Y29sb3JzLmJsYWNrLFJhZGlvQkc9Y29sb3JzLmdyYXksUmFkaW9UZXh0PWNvbG9ycy5ibGFjayxTZWxlY3Rpb25CRz1jb2xvcnMuYmxhY2ssU2VsZWN0aW9uVGV4dD1jb2xvcnMubGlnaHRHcmF5LEdyYXBoaWNCRz1jb2xvcnMuYmxhY2ssSW1hZ2VCRz1jb2xvcnMuYmxhY2ssUGFuZUJHPWNvbG9ycy5ibGFjayxQcm9ncmFtQkc9Y29sb3JzLmJsYWNrLFByb2dyZXNzYmFyQkc9Y29sb3JzLmdyYXksUHJvZ3Jlc3NiYXJUZXh0PWNvbG9ycy5ibGFjayxQcm9ncmVzc2JhckFjdGl2ZUJHPWNvbG9ycy5ibGFjayxTY3JvbGxiYXJCRz1jb2xvcnMubGlnaHRHcmF5LFNjcm9sbGJhclRleHQ9Y29sb3JzLmdyYXksU2Nyb2xsYmFyU3ltYm9sQ29sb3I9Y29sb3JzLmJsYWNrLFNsaWRlckJHPWZhbHNlLFNsaWRlclRleHQ9Y29sb3JzLmdyYXksU2xpZGVyU3ltYm9sQ29sb3I9Y29sb3JzLmJsYWNrLFN3aXRjaEJHPWNvbG9ycy5saWdodEdyYXksU3dpdGNoVGV4dD1jb2xvcnMuZ3JheSxTd2l0Y2hCR1N5bWJvbD1jb2xvcnMuYmxhY2ssU3dpdGNoSW5hY3RpdmU9Y29sb3JzLnJlZCxTd2l0Y2hBY3RpdmU9Y29sb3JzLmdyZWVuLExhYmVsQkc9ZmFsc2UsTGFiZWxUZXh0PWNvbG9ycy5ibGFjayxHcmFwaEJHPWNvbG9ycy5ncmF5LEdyYXBoVGV4dD1jb2xvcnMuYmxhY2t9ZW5kO2FhWyJvYmplY3RzIl09e30KYWFbIm9iamVjdHMiXVsiVGltZXIiXT1mdW5jdGlvbiguLi4pCmxvY2FsIGFiPWRhKCJiYXNhbHRFdmVudCIpbG9jYWwgYmI9ZGEoInV0aWxzIikuZ2V0VmFsdWVGcm9tWE1MCnJldHVybgpmdW5jdGlvbihjYilsb2NhbCBkYj0iVGltZXIibG9jYWwgX2M9MDtsb2NhbCBhYz0wO2xvY2FsIGJjPTA7bG9jYWwgY2MKbG9jYWwgZGM9YWIoKWxvY2FsIF9kPWZhbHNlCmxvY2FsIGFkPWZ1bmN0aW9uKGNkLGRkLF9fYSkKbG9jYWwgYV9hPWZ1bmN0aW9uKGJfYSkKaWYoYl9hOnN1YigxLDEpPT0iIyIpdGhlbgpsb2NhbCBjX2E9Y2Q6Z2V0QmFzZUZyYW1lKCk6Z2V0RGVlcE9iamVjdChiX2E6c3ViKDIsYl9hOmxlbigpKSkKaWYoY19hfj1uaWwpYW5kKGNfYS5pbnRlcm5hbE9iamV0Q2FsbH49bmlsKXRoZW4gZGQoY2QsZnVuY3Rpb24oKQpjX2E6aW50ZXJuYWxPYmpldENhbGwoKWVuZCllbmQgZWxzZQpkZChjZCxjZDpnZXRCYXNlRnJhbWUoKTpnZXRWYXJpYWJsZShiX2EpKWVuZCBlbmQ7aWYodHlwZShfX2EpPT0ic3RyaW5nIil0aGVuIGFfYShfX2EpZWxzZWlmKHR5cGUoX19hKT09InRhYmxlIil0aGVuCmZvciBiX2EsY19hIGluIHBhaXJzKF9fYSlkbyBhX2EoY19hKWVuZCBlbmQ7cmV0dXJuIGNkIGVuZApsb2NhbCBiZD17bmFtZT1jYixnZXRUeXBlPWZ1bmN0aW9uKGNkKXJldHVybiBkYiBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGNkLGRkKQppZihiYigidGltZSIsZGQpfj1uaWwpdGhlbiBfYz1iYigidGltZSIsZGQpZW5kO2lmKGJiKCJyZXBlYXQiLGRkKX49bmlsKXRoZW4gYWM9YmIoInJlcGVhdCIsZGQpZW5kCmlmKApiYigic3RhcnQiLGRkKX49bmlsKXRoZW4gaWYoYmIoInN0YXJ0IixkZCkpdGhlbiBjZDpzdGFydCgpZW5kIGVuZDtpZihiYigib25DYWxsIixkZCl+PW5pbCl0aGVuCmFkKGNkLGNkLm9uQ2FsbCxiYigib25DYWxsIixkZCkpZW5kO3JldHVybiBjZCBlbmQsZ2V0QmFzZUZyYW1lPWZ1bmN0aW9uKGNkKQppZigKY2QucGFyZW50fj1uaWwpdGhlbiByZXR1cm4gY2QucGFyZW50OmdldEJhc2VGcmFtZSgpZW5kO3JldHVybiBjZCBlbmQsZ2V0WkluZGV4PWZ1bmN0aW9uKGNkKXJldHVybiAxIGVuZCxnZXROYW1lPWZ1bmN0aW9uKGNkKQpyZXR1cm4gY2QubmFtZSBlbmQsc2V0VGltZT1mdW5jdGlvbihjZCxkZCxfX2EpX2M9ZGQgb3IgMDthYz1fX2Egb3IgMTtyZXR1cm4gY2QgZW5kLHN0YXJ0PWZ1bmN0aW9uKGNkKWlmKF9kKXRoZW4Kb3MuY2FuY2VsVGltZXIoY2MpZW5kO2JjPWFjO2NjPW9zLnN0YXJ0VGltZXIoX2MpX2Q9dHJ1ZQpjZC5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixjZClyZXR1cm4gY2QgZW5kLGlzQWN0aXZlPWZ1bmN0aW9uKGNkKXJldHVybiBfZCBlbmQsY2FuY2VsPWZ1bmN0aW9uKGNkKWlmKApjY349bmlsKXRoZW4gb3MuY2FuY2VsVGltZXIoY2MpZW5kO19kPWZhbHNlCmNkLnBhcmVudDpyZW1vdmVFdmVudCgib3RoZXJfZXZlbnQiLGNkKXJldHVybiBjZCBlbmQsb25DYWxsPWZ1bmN0aW9uKGNkLGRkKQpkYzpyZWdpc3RlckV2ZW50KCJ0aW1lZF9ldmVudCIsZGQpcmV0dXJuIGNkIGVuZCxldmVudEhhbmRsZXI9ZnVuY3Rpb24oY2QsZGQsX19hKQppZgpkZD09InRpbWVyImFuZCBfX2E9PWNjIGFuZCBfZCB0aGVuIGRjOnNlbmRFdmVudCgidGltZWRfZXZlbnQiLGNkKQppZihiYz49MSl0aGVuIGJjPWJjLTE7aWYoYmM+PTEpdGhlbgpjYz1vcy5zdGFydFRpbWVyKF9jKWVuZCBlbHNlaWYoYmM9PS0xKXRoZW4gY2M9b3Muc3RhcnRUaW1lcihfYyllbmQgZW5kIGVuZH1iZC5fX2luZGV4PWJkO3JldHVybiBiZCBlbmQgZW5kCmFhWyJvYmplY3RzIl1bIklucHV0Il09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ1dGlscyIpCmxvY2FsIGNiPWRhKCJiYXNhbHRMb2dzIilsb2NhbCBkYj1iYi5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKF9jKWxvY2FsIGFjPWFiKF9jKWxvY2FsIGJjPSJJbnB1dCJsb2NhbCBjYz0idGV4dCJsb2NhbCBkYz0wCmFjOnNldFpJbmRleCg1KWFjOnNldFZhbHVlKCIiKWFjLndpZHRoPTEwO2FjLmhlaWdodD0xO2xvY2FsIF9kPTE7bG9jYWwgYWQ9MTtsb2NhbCBiZD0iImxvY2FsIGNkO2xvY2FsIGRkCmxvY2FsIF9fYT1iZDtsb2NhbCBhX2E9ZmFsc2UKbG9jYWwgYl9hPXtnZXRUeXBlPWZ1bmN0aW9uKGNfYSlyZXR1cm4gYmMgZW5kLHNldElucHV0VHlwZT1mdW5jdGlvbihjX2EsZF9hKWlmKGRfYT09InBhc3N3b3JkIilvcihkX2E9PSJudW1iZXIiKW9yKGRfYT09CiJ0ZXh0Iil0aGVuIGNjPWRfYSBlbmQKY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLHNldERlZmF1bHRUZXh0PWZ1bmN0aW9uKGNfYSxkX2EsX2FhLGFhYSliZD1kX2EKY2Q9YWFhIG9yIGNkO2RkPV9hYSBvciBkZDtpZihjX2E6aXNGb2N1c2VkKCkpdGhlbiBfX2E9IiJlbHNlIF9fYT1iZCBlbmQKY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLGdldElucHV0VHlwZT1mdW5jdGlvbihjX2EpCnJldHVybiBjYyBlbmQsc2V0VmFsdWU9ZnVuY3Rpb24oY19hLGRfYSlhYy5zZXRWYWx1ZShjX2EsdG9zdHJpbmcoZF9hKSkKaWYgbm90KGFfYSl0aGVuIF9kPQp0b3N0cmluZyhkX2EpOmxlbigpKzEKYWQ9bWF0aC5tYXgoMSxfZC1jX2E6Z2V0V2lkdGgoKSsxKWlmKGNfYTppc0ZvY3VzZWQoKSl0aGVuIGxvY2FsIF9hYSxhYWE9Y19hOmdldEFuY2hvclBvc2l0aW9uKCkKY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSwKX2FhK19kLWFkLGFhYSttYXRoLmZsb29yKGNfYTpnZXRIZWlnaHQoKS8yKSxjX2EuZmdDb2xvcillbmQgZW5kO2NfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxnZXRWYWx1ZT1mdW5jdGlvbihjX2EpCmxvY2FsIGRfYT1hYy5nZXRWYWx1ZShjX2EpCnJldHVybiBjYz09Im51bWJlciJhbmQgdG9udW1iZXIoZF9hKW9yIGRfYSBlbmQsc2V0SW5wdXRMaW1pdD1mdW5jdGlvbihjX2EsZF9hKQpkYz10b251bWJlcihkX2Epb3IgZGM7Y19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLGdldElucHV0TGltaXQ9ZnVuY3Rpb24oY19hKXJldHVybiBkYyBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGNfYSxkX2EpCmFjLnNldFZhbHVlc0J5WE1MRGF0YShjX2EsZF9hKWxvY2FsIF9hYSxhYWEKaWYoZGIoImRlZmF1bHRCRyIsZF9hKX49bmlsKXRoZW4gX2FhPWRiKCJkZWZhdWx0QkciLGRfYSllbmQKaWYoZGIoImRlZmF1bHRGRyIsZF9hKX49bmlsKXRoZW4gYWFhPWRiKCJkZWZhdWx0RkciLGRfYSllbmQ7aWYoZGIoImRlZmF1bHQiLGRfYSl+PW5pbCl0aGVuCmNfYTpzZXREZWZhdWx0VGV4dChkYigiZGVmYXVsdCIsZF9hKSxhYWF+PW5pbCBhbmQgY29sb3JzW2FhYV0sCl9hYX49bmlsIGFuZCBjb2xvcnNbX2FhXSllbmQKaWYoZGIoImxpbWl0IixkX2Epfj0KbmlsKXRoZW4gY19hOnNldElucHV0TGltaXQoZGIoImxpbWl0IixkX2EpKWVuZDtpZihkYigidHlwZSIsZF9hKX49bmlsKXRoZW4KY19hOnNldElucHV0VHlwZShkYigidHlwZSIsZF9hKSllbmQ7cmV0dXJuIGNfYSBlbmQsZ2V0Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGNfYSkKYWMuZ2V0Rm9jdXNIYW5kbGVyKGNfYSkKaWYoY19hLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgZF9hLF9hYT1jX2E6Z2V0QW5jaG9yUG9zaXRpb24oKV9fYT0iImlmKGJkfj0iIil0aGVuCmNfYTp1cGRhdGVEcmF3KCllbmQKY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxkX2ErX2QtYWQsX2FhK21hdGgubWF4KG1hdGguY2VpbCgKY19hOmdldEhlaWdodCgpLzIgLTEsMSkpLGNfYS5mZ0NvbG9yKWVuZCBlbmQsbG9zZUZvY3VzSGFuZGxlcj1mdW5jdGlvbihjX2EpCmFjLmxvc2VGb2N1c0hhbmRsZXIoY19hKWlmKGNfYS5wYXJlbnR+PW5pbCl0aGVuIF9fYT1iZDtpZihiZH49IiIpdGhlbiBjX2E6dXBkYXRlRHJhdygpZW5kCmNfYS5wYXJlbnQ6c2V0Q3Vyc29yKGZhbHNlKWVuZCBlbmQsa2V5SGFuZGxlcj1mdW5jdGlvbihjX2EsZF9hKQppZgooYWMua2V5SGFuZGxlcihjX2EsZF9hKSl0aGVuIGxvY2FsIF9hYSxhYWE9Y19hOmdldFNpemUoKWFfYT10cnVlCmlmKGRfYT09a2V5cy5iYWNrc3BhY2UpdGhlbgpsb2NhbCBiYmE9dG9zdHJpbmcoYWMuZ2V0VmFsdWUoKSlpZihfZD4xKXRoZW4KY19hOnNldFZhbHVlKGJiYTpzdWIoMSxfZC0yKS4uYmJhOnN1YihfZCxiYmE6bGVuKCkpKWlmKF9kPjEpdGhlbiBfZD1fZC0xIGVuZAppZihhZD4xKXRoZW4gaWYoX2Q8YWQpdGhlbiBhZD1hZC0xIGVuZCBlbmQgZW5kIGVuZDtpZihkX2E9PWtleXMuZW50ZXIpdGhlbiBpZihjX2EucGFyZW50fj1uaWwpdGhlbiBlbmQgZW5kCmlmKApkX2E9PWtleXMucmlnaHQpdGhlbgpsb2NhbCBiYmE9dG9zdHJpbmcoYWMuZ2V0VmFsdWUoKSk6bGVuKClfZD1fZCsxO2lmKF9kPmJiYSl0aGVuIF9kPWJiYSsxIGVuZDtpZihfZDwxKXRoZW4gX2Q9MSBlbmQ7aWYKKF9kPGFkKW9yKF9kPj1fYWErYWQpdGhlbiBhZD1fZC1fYWErMSBlbmQ7aWYoYWQ8MSl0aGVuIGFkPTEgZW5kIGVuZAppZihkX2E9PWtleXMubGVmdCl0aGVuIF9kPV9kLTE7aWYoX2Q+PTEpdGhlbgppZihfZDxhZClvcihfZD49X2FhK2FkKXRoZW4gYWQ9X2QgZW5kIGVuZDtpZihfZDwxKXRoZW4gX2Q9MSBlbmQ7aWYoYWQ8MSl0aGVuIGFkPTEgZW5kIGVuZDtsb2NhbCBiYWEsY2FhPWNfYTpnZXRBbmNob3JQb3NpdGlvbigpCmxvY2FsIGRhYT10b3N0cmluZyhhYy5nZXRWYWx1ZSgpKQpsb2NhbCBfYmE9KF9kPD1kYWE6bGVuKClhbmQgX2QtMSBvciBkYWE6bGVuKCkpLSAoYWQtMSlsb2NhbCBhYmE9Y19hOmdldFgoKQppZihfYmE+YWJhK19hYS0xKXRoZW4gX2JhPWFiYStfYWEtMSBlbmQ7aWYoY19hLnBhcmVudH49bmlsKXRoZW4KY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxiYWErX2JhLGNhYSsKbWF0aC5tYXgobWF0aC5jZWlsKGFhYS8yIC0xLDEpKSxjX2EuZmdDb2xvcillbmQKY19hOnVwZGF0ZURyYXcoKWFfYT1mYWxzZTtyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxjaGFySGFuZGxlcj1mdW5jdGlvbihjX2EsZF9hKQppZgooYWMuY2hhckhhbmRsZXIoY19hLGRfYSkpdGhlbiBhX2E9dHJ1ZTtsb2NhbCBfYWEsYWFhPWNfYTpnZXRTaXplKClsb2NhbCBiYWE9YWMuZ2V0VmFsdWUoKQppZigKYmFhOmxlbigpPGRjIG9yIGRjPD0wKXRoZW4KaWYoY2M9PSJudW1iZXIiKXRoZW4gbG9jYWwgY2JhPWJhYQppZgooX2Q9PTEgYW5kIGRfYT09Ii0iKW9yKGRfYT09Ii4iKW9yKHRvbnVtYmVyKGRfYSl+PW5pbCl0aGVuCmNfYTpzZXRWYWx1ZShiYWE6c3ViKDEsX2QtMSkuLgpkX2EuLmJhYTpzdWIoX2QsYmFhOmxlbigpKSlfZD1fZCsxO2lmKGRfYT09Ii4iKW9yKGRfYT09Ii0iKWFuZCgjYmFhPjApdGhlbgppZigKdG9udW1iZXIoYWMuZ2V0VmFsdWUoKSk9PW5pbCl0aGVuIGNfYTpzZXRWYWx1ZShjYmEpX2Q9X2QtMSBlbmQgZW5kIGVuZCBlbHNlCmNfYTpzZXRWYWx1ZShiYWE6c3ViKDEsX2QtMSkuLmRfYS4uYmFhOnN1YihfZCxiYWE6bGVuKCkpKV9kPV9kKzEgZW5kO2lmKF9kPj1fYWErYWQpdGhlbiBhZD1hZCsxIGVuZCBlbmQ7bG9jYWwgY2FhLGRhYT1jX2E6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBfYmE9dG9zdHJpbmcoYWMuZ2V0VmFsdWUoKSkKbG9jYWwgYWJhPShfZDw9X2JhOmxlbigpYW5kIF9kLTEgb3IgX2JhOmxlbigpKS0gKGFkLTEpbG9jYWwgYmJhPWNfYTpnZXRYKCkKaWYoYWJhPmJiYStfYWEtMSl0aGVuIGFiYT1iYmErX2FhLTEgZW5kO2lmKGNfYS5wYXJlbnR+PW5pbCl0aGVuCmNfYS5wYXJlbnQ6c2V0Q3Vyc29yKHRydWUsY2FhK2FiYSxkYWErCm1hdGgubWF4KG1hdGguY2VpbChhYWEvMiAtMSwxKSksY19hLmZnQ29sb3IpZW5kO2FfYT1mYWxzZQpjX2E6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKGNfYSxkX2EsX2FhLGFhYSkKaWYKKGFjLm1vdXNlSGFuZGxlcihjX2EsZF9hLF9hYSxhYWEpKXRoZW4gbG9jYWwgYmFhLGNhYT1jX2E6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBkYWEsX2JhPWNfYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGJhYSxjYWEpbG9jYWwgYWJhLGJiYT1jX2E6Z2V0U2l6ZSgpX2Q9X2FhLWRhYSthZDtsb2NhbCBjYmE9YWMuZ2V0VmFsdWUoKWlmKF9kPgpjYmE6bGVuKCkpdGhlbiBfZD1jYmE6bGVuKCkrMSBlbmQ7aWYoX2Q8YWQpdGhlbiBhZD1fZC0xCmlmKGFkPDEpdGhlbiBhZD0xIGVuZCBlbmQKY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxiYWErX2QtYWQsY2FhKwptYXRoLm1heChtYXRoLmNlaWwoYmJhLzIgLTEsMSkpLGNfYS5mZ0NvbG9yKXJldHVybiB0cnVlIGVuZCBlbmQsZHJhZ0hhbmRsZXI9ZnVuY3Rpb24oY19hLGRfYSxfYWEsYWFhLGJhYSxjYWEpCmlmCihjX2E6aXNGb2N1c2VkKCkpdGhlbiBpZihjX2E6aXNDb29yZHNJbk9iamVjdChfYWEsYWFhKSl0aGVuCmlmKGFjLmRyYWdIYW5kbGVyKGNfYSxkX2EsX2FhLGFhYSxiYWEsY2FhKSl0aGVuIHJldHVybiB0cnVlIGVuZCBlbmQKY19hLnBhcmVudDpyZW1vdmVGb2N1c2VkT2JqZWN0KCllbmQgZW5kLGV2ZW50SGFuZGxlcj1mdW5jdGlvbihjX2EsZF9hLF9hYSwuLi4pCmFjLmV2ZW50SGFuZGxlcihjX2EsZF9hLF9hYSwuLi4pCmlmKGRfYT09InBhc3RlIil0aGVuCmlmKGNfYTppc0ZvY3VzZWQoKSl0aGVuIGxvY2FsIGFhYT1hYy5nZXRWYWx1ZSgpCmxvY2FsIGJhYSxjYWE9Y19hOmdldFNpemUoKWFfYT10cnVlCmlmKGNjPT0ibnVtYmVyIil0aGVuIGxvY2FsIGRiYT1hYWEKaWYoX2FhPT0iLiIpb3IodG9udW1iZXIoX2FhKX49bmlsKXRoZW4KY19hOnNldFZhbHVlKGFhYTpzdWIoMSwKX2QtMSkuLl9hYS4uYWFhOnN1YihfZCxhYWE6bGVuKCkpKV9kPV9kK19hYTpsZW4oKWVuZAppZih0b251bWJlcihhYy5nZXRWYWx1ZSgpKT09bmlsKXRoZW4gY19hOnNldFZhbHVlKGRiYSllbmQgZWxzZQpjX2E6c2V0VmFsdWUoYWFhOnN1YigxLF9kLTEpLi5fYWEuLmFhYTpzdWIoX2QsYWFhOmxlbigpKSlfZD1fZCtfYWE6bGVuKCllbmQ7aWYoX2Q+PWJhYSthZCl0aGVuIGFkPShfZCsxKS1iYWEgZW5kCmxvY2FsIGRhYSxfYmE9Y19hOmdldEFuY2hvclBvc2l0aW9uKClsb2NhbCBhYmE9dG9zdHJpbmcoYWMuZ2V0VmFsdWUoKSkKbG9jYWwgYmJhPSgKX2Q8PWFiYTpsZW4oKWFuZCBfZC0xIG9yIGFiYTpsZW4oKSktIChhZC0xKWxvY2FsIGNiYT1jX2E6Z2V0WCgpCmlmKGJiYT5jYmErYmFhLTEpdGhlbiBiYmE9Y2JhK2JhYS0xIGVuZDtpZihjX2EucGFyZW50fj1uaWwpdGhlbgpjX2EucGFyZW50OnNldEN1cnNvcih0cnVlLGRhYStiYmEsX2JhKwptYXRoLm1heChtYXRoLmNlaWwoY2FhLzIgLTEsMSkpLGNfYS5mZ0NvbG9yKWVuZApjX2E6dXBkYXRlRHJhdygpYV9hPWZhbHNlIGVuZCBlbmQgZW5kLGRyYXc9ZnVuY3Rpb24oY19hKQppZgooYWMuZHJhdyhjX2EpKXRoZW4KaWYoY19hLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgZF9hLF9hYT1jX2E6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBhYWEsYmFhPWNfYTpnZXRTaXplKClsb2NhbCBjYWE9YmIuZ2V0VGV4dFZlcnRpY2FsQWxpZ24oYmFhLCJjZW50ZXIiKWlmCihjX2EuYmdDb2xvcn49ZmFsc2UpdGhlbgpjX2EucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGRfYSxfYWEsYWFhLGJhYSxjX2EuYmdDb2xvcillbmQKZm9yIG49MSxiYWEgZG8KaWYobj09Y2FhKXRoZW4KbG9jYWwgZGFhPXRvc3RyaW5nKGFjLmdldFZhbHVlKCkpbG9jYWwgX2JhPWNfYS5iZ0NvbG9yO2xvY2FsIGFiYT1jX2EuZmdDb2xvcjtsb2NhbCBiYmE7aWYoZGFhOmxlbigpPD0wKXRoZW4gYmJhPV9fYQpfYmE9Y2Qgb3IgX2JhO2FiYT1kZCBvciBhYmEgZW5kO2JiYT1fX2EKaWYoZGFhfj0iIil0aGVuIGJiYT1kYWEgZW5kO2JiYT1iYmE6c3ViKGFkLGFhYSthZC0xKWxvY2FsIGNiYT1hYWEtYmJhOmxlbigpaWYoY2JhPDApdGhlbgpjYmE9MCBlbmQ7aWYoY2M9PSJwYXNzd29yZCIpYW5kKGRhYX49IiIpdGhlbgpiYmE9c3RyaW5nLnJlcCgiKiIsYmJhOmxlbigpKWVuZApiYmE9YmJhLi5zdHJpbmcucmVwKGNfYS5iZ1N5bWJvbCxjYmEpCmNfYS5wYXJlbnQ6d3JpdGVUZXh0KGRfYSxfYWErIChuLTEpLGJiYSxfYmEsYWJhKWVuZCBlbmQ7aWYoY19hOmlzRm9jdXNlZCgpKXRoZW4KY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxkX2ErX2QtYWQsX2FhKwptYXRoLmZsb29yKGNfYTpnZXRIZWlnaHQoKS8yKSxjX2EuZmdDb2xvcillbmQgZW5kIGVuZCBlbmQsaW5pdD1mdW5jdGlvbihjX2EpCmlmKApjX2EucGFyZW50fj1uaWwpdGhlbiBjX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsY19hKQpjX2EucGFyZW50OmFkZEV2ZW50KCJrZXkiLGNfYSljX2EucGFyZW50OmFkZEV2ZW50KCJjaGFyIixjX2EpCmNfYS5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixjX2EpY19hLnBhcmVudDphZGRFdmVudCgibW91c2VfZHJhZyIsY19hKWVuZAppZihhYy5pbml0KGNfYSkpdGhlbgpjX2EuYmdDb2xvcj1jX2EucGFyZW50OmdldFRoZW1lKCJJbnB1dEJHIiljX2EuZmdDb2xvcj1jX2EucGFyZW50OmdldFRoZW1lKCJJbnB1dFRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShiX2EsYWMpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJDaGVja2JveCJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidXRpbHMiKQpsb2NhbCBjYj1iYi5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGRiKWxvY2FsIF9jPWFiKGRiKWxvY2FsIGFjPSJDaGVja2JveCJfYzpzZXRaSW5kZXgoNSkKX2M6c2V0VmFsdWUoZmFsc2UpX2Mud2lkdGg9MTtfYy5oZWlnaHQ9MTtsb2NhbCBiYz0iXDQyIgpsb2NhbCBjYz17Z2V0VHlwZT1mdW5jdGlvbihkYylyZXR1cm4gYWMgZW5kLHNldFN5bWJvbD1mdW5jdGlvbihkYyxfZCliYz1fZApkYzp1cGRhdGVEcmF3KClyZXR1cm4gZGMgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihkYyxfZCxhZCxiZCkKaWYoX2MubW91c2VIYW5kbGVyKGRjLF9kLGFkLGJkKSl0aGVuCmlmKF9kPT0xKXRoZW4KaWYoCmRjOmdldFZhbHVlKCl+PXRydWUpYW5kKGRjOmdldFZhbHVlKCl+PWZhbHNlKXRoZW4KZGM6c2V0VmFsdWUoZmFsc2UpZWxzZSBkYzpzZXRWYWx1ZShub3QgZGM6Z2V0VmFsdWUoKSllbmQ7ZGM6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kIGVuZDtyZXR1cm4gZmFsc2UgZW5kLHRvdWNoSGFuZGxlcj1mdW5jdGlvbihkYyxfZCxhZClyZXR1cm4KZGM6bW91c2VIYW5kbGVyKDEsX2QsYWQpZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihkYyxfZCkKX2Muc2V0VmFsdWVzQnlYTUxEYXRhKGRjLF9kKQppZihjYigiY2hlY2tlZCIsX2Qpfj1uaWwpdGhlbiBpZihjYigiY2hlY2tlZCIsX2QpKXRoZW4gZGM6c2V0VmFsdWUodHJ1ZSllbHNlCmRjOnNldFZhbHVlKGZhbHNlKWVuZCBlbmQ7cmV0dXJuIGRjIGVuZCxkcmF3PWZ1bmN0aW9uKGRjKQppZgooX2MuZHJhdyhkYykpdGhlbgppZihkYy5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIF9kLGFkPWRjOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgYmQsY2Q9ZGM6Z2V0U2l6ZSgpbG9jYWwgZGQ9YmIuZ2V0VGV4dFZlcnRpY2FsQWxpZ24oY2QsImNlbnRlciIpaWYKKGRjLmJnQ29sb3J+PWZhbHNlKXRoZW4KZGMucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9kLGFkLGJkLGNkLGRjLmJnQ29sb3IpZW5kCmZvciBuPTEsY2QgZG8KaWYobj09ZGQpdGhlbgppZihkYzpnZXRWYWx1ZSgpPT10cnVlKXRoZW4KZGMucGFyZW50OndyaXRlVGV4dChfZCwKYWQrIChuLTEpLGJiLmdldFRleHRIb3Jpem9udGFsQWxpZ24oYmMsYmQsImNlbnRlciIpLGRjLmJnQ29sb3IsZGMuZmdDb2xvcillbHNlCmRjLnBhcmVudDp3cml0ZVRleHQoX2QsYWQrIChuLTEpLGJiLmdldFRleHRIb3Jpem9udGFsQWxpZ24oIiAiLGJkLCJjZW50ZXIiKSxkYy5iZ0NvbG9yLGRjLmZnQ29sb3IpZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQsaW5pdD1mdW5jdGlvbihkYykKZGMucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsZGMpZGMucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsZGMpCmlmKF9jLmluaXQoZGMpKXRoZW4KZGMuYmdDb2xvcj1kYy5wYXJlbnQ6Z2V0VGhlbWUoIkNoZWNrYm94QkciKWRjLmZnQ29sb3I9ZGMucGFyZW50OmdldFRoZW1lKCJDaGVja2JveFRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShjYyxfYyllbmQgZW5kCmFhWyJvYmplY3RzIl1bIlBhbmUiXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoIk9iamVjdCIpbG9jYWwgYmI9ZGEoImJhc2FsdExvZ3MiKQpyZXR1cm4KZnVuY3Rpb24oY2IpCmxvY2FsIGRiPWFiKGNiKWxvY2FsIF9jPSJQYW5lIgpsb2NhbCBhYz17Z2V0VHlwZT1mdW5jdGlvbihiYylyZXR1cm4gX2MgZW5kLHNldEJhY2tncm91bmQ9ZnVuY3Rpb24oYmMsY2MsZGMsX2QpZGIuc2V0QmFja2dyb3VuZChiYyxjYyxkYyxfZCkKcmV0dXJuIGJjIGVuZCxpbml0PWZ1bmN0aW9uKGJjKQppZihkYi5pbml0KGJjKSl0aGVuCmJjLmJnQ29sb3I9YmMucGFyZW50OmdldFRoZW1lKCJQYW5lQkciKWJjLmZnQ29sb3I9YmMucGFyZW50OmdldFRoZW1lKCJQYW5lQkciKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShhYyxkYillbmQgZW5kCmFhWyJvYmplY3RzIl1bIlByb2dyZXNzYmFyIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKQpsb2NhbCBiYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGNiKWxvY2FsIGRiPWFiKGNiKWxvY2FsIF9jPSJQcm9ncmVzc2JhciJsb2NhbCBhYz0wO2RiOnNldFpJbmRleCg1KQpkYjpzZXRWYWx1ZShmYWxzZSlkYi53aWR0aD0yNTtkYi5oZWlnaHQ9MTtsb2NhbCBiYztsb2NhbCBjYz0iImxvY2FsIGRjPWNvbG9ycy53aGl0ZTtsb2NhbCBfZD0iImxvY2FsIGFkPTAKbG9jYWwgYmQ9e2luaXQ9ZnVuY3Rpb24oY2QpCmlmCihkYi5pbml0KGNkKSl0aGVuIGNkLmJnQ29sb3I9Y2QucGFyZW50OmdldFRoZW1lKCJQcm9ncmVzc2JhckJHIikKY2QuZmdDb2xvcj1jZC5wYXJlbnQ6Z2V0VGhlbWUoIlByb2dyZXNzYmFyVGV4dCIpYmM9Y2QucGFyZW50OmdldFRoZW1lKCJQcm9ncmVzc2JhckFjdGl2ZUJHIillbmQgZW5kLGdldFR5cGU9ZnVuY3Rpb24oY2QpcmV0dXJuCl9jIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oY2QsZGQpZGIuc2V0VmFsdWVzQnlYTUxEYXRhKGNkLGRkKWlmKGJiKCJkaXJlY3Rpb24iLGRkKX49Cm5pbCl0aGVuIGFkPWJiKCJkaXJlY3Rpb24iLGRkKWVuZAppZigKYmIoInByb2dyZXNzQ29sb3IiLGRkKX49bmlsKXRoZW4gYmM9Y29sb3JzW2JiKCJwcm9ncmVzc0NvbG9yIixkZCldZW5kCmlmKGJiKCJwcm9ncmVzc1N5bWJvbCIsZGQpfj1uaWwpdGhlbiBjYz1iYigicHJvZ3Jlc3NTeW1ib2wiLGRkKWVuZDtpZihiYigiYmFja2dyb3VuZFN5bWJvbCIsZGQpfj1uaWwpdGhlbgpfZD1iYigiYmFja2dyb3VuZFN5bWJvbCIsZGQpZW5kCmlmCihiYigicHJvZ3Jlc3NTeW1ib2xDb2xvciIsZGQpfj1uaWwpdGhlbiBkYz1jb2xvcnNbYmIoInByb2dyZXNzU3ltYm9sQ29sb3IiLGRkKV1lbmQ7aWYoYmIoIm9uRG9uZSIsZGQpfj1uaWwpdGhlbgpjZDpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oY2Qub25Qcm9ncmVzc0RvbmUsYmIoIm9uRG9uZSIsZGQpKWVuZDtyZXR1cm4gY2QgZW5kLHNldERpcmVjdGlvbj1mdW5jdGlvbihjZCxkZCkKYWQ9ZGQ7Y2Q6dXBkYXRlRHJhdygpcmV0dXJuIGNkIGVuZCxzZXRQcm9ncmVzc0Jhcj1mdW5jdGlvbihjZCxkZCxfX2EsYV9hKWJjPWRkIG9yIGJjCmNjPV9fYSBvciBjYztkYz1hX2Egb3IgZGM7Y2Q6dXBkYXRlRHJhdygpcmV0dXJuIGNkIGVuZCxzZXRCYWNrZ3JvdW5kU3ltYm9sPWZ1bmN0aW9uKGNkLGRkKQpfZD1kZDpzdWIoMSwxKWNkOnVwZGF0ZURyYXcoKXJldHVybiBjZCBlbmQsc2V0UHJvZ3Jlc3M9ZnVuY3Rpb24oY2QsZGQpaWYKKGRkPj0wKWFuZChkZDw9MTAwKWFuZChhY349ZGQpdGhlbiBhYz1kZDtjZDpzZXRWYWx1ZShhYylpZihhYz09MTAwKXRoZW4KY2Q6cHJvZ3Jlc3NEb25lSGFuZGxlcigpZW5kIGVuZApjZDp1cGRhdGVEcmF3KClyZXR1cm4gY2QgZW5kLGdldFByb2dyZXNzPWZ1bmN0aW9uKGNkKXJldHVybgphYyBlbmQsb25Qcm9ncmVzc0RvbmU9ZnVuY3Rpb24oY2QsZGQpY2Q6cmVnaXN0ZXJFdmVudCgicHJvZ3Jlc3NfZG9uZSIsZGQpCnJldHVybiBjZCBlbmQscHJvZ3Jlc3NEb25lSGFuZGxlcj1mdW5jdGlvbihjZCkKY2Q6c2VuZEV2ZW50KCJwcm9ncmVzc19kb25lIixjZCllbmQsZHJhdz1mdW5jdGlvbihjZCkKaWYoZGIuZHJhdyhjZCkpdGhlbgppZihjZC5wYXJlbnR+PW5pbCl0aGVuCmxvY2FsIGRkLF9fYT1jZDpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgYV9hLGJfYT1jZDpnZXRTaXplKClpZihjZC5iZ0NvbG9yfj1mYWxzZSl0aGVuCmNkLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChkZCxfX2EsYV9hLGJfYSxjZC5iZ0NvbG9yKWVuZDtpZihfZH49IiIpdGhlbgpjZC5wYXJlbnQ6ZHJhd1RleHRCb3goZGQsX19hLGFfYSxiX2EsX2QpZW5kO2lmKGNkLmZnQ29sb3J+PWZhbHNlKXRoZW4KY2QucGFyZW50OmRyYXdGb3JlZ3JvdW5kQm94KGRkLF9fYSxhX2EsYl9hLGNkLmZnQ29sb3IpZW5kCmlmKGFkPT0xKXRoZW4gY2QucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGRkLF9fYSxhX2EsCmJfYS8xMDAgKmFjLGJjKWNkLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChkZCxfX2EsYV9hLApiX2EvMTAwICphYyxkYyljZC5wYXJlbnQ6ZHJhd1RleHRCb3goZGQsX19hLGFfYSwKYl9hLzEwMCAqYWMsY2MpZWxzZWlmKGFkPT0yKXRoZW4KY2QucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGRkLApfX2ErbWF0aC5jZWlsKGJfYS1iX2EvMTAwICphYyksYV9hLGJfYS8xMDAgKmFjLGJjKQpjZC5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goZGQsX19hK21hdGguY2VpbChiX2EtYl9hLzEwMCAqYWMpLGFfYSwKYl9hLzEwMCAqYWMsZGMpCmNkLnBhcmVudDpkcmF3VGV4dEJveChkZCxfX2ErbWF0aC5jZWlsKGJfYS1iX2EvMTAwICphYyksYV9hLApiX2EvMTAwICphYyxjYyllbHNlaWYoYWQ9PTMpdGhlbgpjZC5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goZGQrbWF0aC5jZWlsKGFfYS1hX2EvMTAwICphYyksX19hLAphX2EvMTAwICphYyxiX2EsYmMpCmNkLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChkZCttYXRoLmNlaWwoYV9hLWFfYS8xMDAgKmFjKSxfX2EsCmFfYS8xMDAgKmFjLGJfYSxkYykKY2QucGFyZW50OmRyYXdUZXh0Qm94KGRkK21hdGguY2VpbChhX2EtYV9hLzEwMCAqYWMpLF9fYSwKYV9hLzEwMCAqYWMsYl9hLGNjKWVsc2UKY2QucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGRkLF9fYSxhX2EvMTAwICphYyxiX2EsYmMpCmNkLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChkZCxfX2EsYV9hLzEwMCAqYWMsYl9hLGRjKQpjZC5wYXJlbnQ6ZHJhd1RleHRCb3goZGQsX19hLGFfYS8xMDAgKmFjLGJfYSxjYyllbmQgZW5kIGVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShiZCxkYillbmQgZW5kCmFhWyJvYmplY3RzIl1bIkRyb3Bkb3duIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ1dGlscyIpCmxvY2FsIGNiPWRhKCJ1dGlscyIpLmdldFZhbHVlRnJvbVhNTApyZXR1cm4KZnVuY3Rpb24oZGIpbG9jYWwgX2M9YWIoZGIpbG9jYWwgYWM9IkRyb3Bkb3duIl9jLndpZHRoPTEyO19jLmhlaWdodD0xO19jOnNldFpJbmRleCg2KQpsb2NhbCBiYz17fWxvY2FsIGNjO2xvY2FsIGRjO2xvY2FsIF9kPXRydWU7bG9jYWwgYWQ9ImxlZnQibG9jYWwgYmQ9MDtsb2NhbCBjZD0xNjtsb2NhbCBkZD02O2xvY2FsIF9fYT0iXDE2ImxvY2FsIGFfYT0iXDMxImxvY2FsIGJfYT1mYWxzZQpsb2NhbCBjX2E9e2dldFR5cGU9ZnVuY3Rpb24oZF9hKXJldHVybgphYyBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGRfYSxfYWEpX2Muc2V0VmFsdWVzQnlYTUxEYXRhKGRfYSxfYWEpCmlmKApjYigic2VsZWN0aW9uQkciLF9hYSl+PW5pbCl0aGVuIGNjPWNvbG9yc1tjYigic2VsZWN0aW9uQkciLF9hYSldZW5kO2lmKGNiKCJzZWxlY3Rpb25GRyIsX2FhKX49bmlsKXRoZW4KZGM9Y29sb3JzW2NiKCJzZWxlY3Rpb25GRyIsX2FhKV1lbmQ7aWYoY2IoImRyb3Bkb3duV2lkdGgiLF9hYSl+PW5pbCl0aGVuCmNkPWNiKCJkcm9wZG93bldpZHRoIixfYWEpZW5kO2lmKGNiKCJkcm9wZG93bkhlaWdodCIsX2FhKX49bmlsKXRoZW4KZGQ9Y2IoImRyb3Bkb3duSGVpZ2h0IixfYWEpZW5kO2lmKGNiKCJvZmZzZXQiLF9hYSl+PW5pbCl0aGVuCmJkPWNiKCJvZmZzZXQiLF9hYSllbmQKaWYoX2FhWyJpdGVtIl1+PW5pbCl0aGVuIGxvY2FsIGFhYT1fYWFbIml0ZW0iXWlmKAphYWEucHJvcGVydGllc349bmlsKXRoZW4gYWFhPXthYWF9ZW5kO2ZvciBiYWEsY2FhIGluIHBhaXJzKGFhYSlkbwpkX2E6YWRkSXRlbShjYigidGV4dCIsY2FhKSxjb2xvcnNbY2IoImJnIixjYWEpXSxjb2xvcnNbY2IoImZnIixjYWEpXSllbmQgZW5kIGVuZCxzZXRPZmZzZXQ9ZnVuY3Rpb24oZF9hLF9hYSkKYmQ9X2FhO2RfYTp1cGRhdGVEcmF3KClyZXR1cm4gZF9hIGVuZCxnZXRPZmZzZXQ9ZnVuY3Rpb24oZF9hKXJldHVybiBiZCBlbmQsYWRkSXRlbT1mdW5jdGlvbihkX2EsX2FhLGFhYSxiYWEsLi4uKQp0YWJsZS5pbnNlcnQoYmMse3RleHQ9X2FhLGJnQ29sPQphYWEgb3IgZF9hLmJnQ29sb3IsZmdDb2w9YmFhIG9yIGRfYS5mZ0NvbG9yLGFyZ3M9ey4uLn19KWRfYTp1cGRhdGVEcmF3KClyZXR1cm4gZF9hIGVuZCxnZXRBbGw9ZnVuY3Rpb24oZF9hKXJldHVybgpiYyBlbmQscmVtb3ZlSXRlbT1mdW5jdGlvbihkX2EsX2FhKXRhYmxlLnJlbW92ZShiYyxfYWEpZF9hOnVwZGF0ZURyYXcoKQpyZXR1cm4gZF9hIGVuZCxnZXRJdGVtPWZ1bmN0aW9uKGRfYSxfYWEpcmV0dXJuIGJjW19hYV1lbmQsZ2V0SXRlbUluZGV4PWZ1bmN0aW9uKGRfYSkKbG9jYWwgX2FhPWRfYTpnZXRWYWx1ZSgpZm9yIGFhYSxiYWEgaW4gcGFpcnMoYmMpZG8gaWYoYmFhPT1fYWEpdGhlbiByZXR1cm4gYWFhIGVuZCBlbmQgZW5kLGNsZWFyPWZ1bmN0aW9uKGRfYSkKYmM9e31kX2E6c2V0VmFsdWUoe30sZmFsc2UpZF9hOnVwZGF0ZURyYXcoKXJldHVybiBkX2EgZW5kLGdldEl0ZW1Db3VudD1mdW5jdGlvbihkX2EpcmV0dXJuCiNiYyBlbmQsZWRpdEl0ZW09ZnVuY3Rpb24oZF9hLF9hYSxhYWEsYmFhLGNhYSwuLi4pdGFibGUucmVtb3ZlKGJjLF9hYSkKdGFibGUuaW5zZXJ0KGJjLF9hYSx7dGV4dD1hYWEsYmdDb2w9YmFhIG9yIGRfYS5iZ0NvbG9yLGZnQ29sPQpjYWEgb3IgZF9hLmZnQ29sb3IsYXJncz17Li4ufX0pZF9hOnVwZGF0ZURyYXcoKXJldHVybiBkX2EgZW5kLHNlbGVjdEl0ZW09ZnVuY3Rpb24oZF9hLF9hYSlkX2E6c2V0VmFsdWUoCmJjW19hYV1vcnt9LGZhbHNlKWRfYTp1cGRhdGVEcmF3KClyZXR1cm4gZF9hIGVuZCxzZXRTZWxlY3RlZEl0ZW09ZnVuY3Rpb24oZF9hLF9hYSxhYWEsYmFhKWNjPQpfYWEgb3IgZF9hLmJnQ29sb3I7ZGM9YWFhIG9yIGRfYS5mZ0NvbG9yCl9kPWJhYX49bmlsIGFuZCBiYWE7ZF9hOnVwZGF0ZURyYXcoKXJldHVybiBkX2EgZW5kLHNldERyb3Bkb3duU2l6ZT1mdW5jdGlvbihkX2EsX2FhLGFhYSkKY2QsZGQ9X2FhLGFhYTtkX2E6dXBkYXRlRHJhdygpcmV0dXJuIGRfYSBlbmQsZ2V0RHJvcGRvd25TaXplPWZ1bmN0aW9uKGRfYSlyZXR1cm4gY2QsZGQgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihkX2EsX2FhLGFhYSxiYWEsY2FhKQppZgooYl9hKXRoZW4KbG9jYWwgZGFhLF9iYT1kX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihkX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSkKaWYoX2FhPT0xKXRoZW4KaWYoI2JjPjApdGhlbgpmb3Igbj0xLGRkIGRvCmlmKGJjW24rYmRdfj1uaWwpdGhlbgppZihkYWE8PWFhYSlhbmQoZGFhK2NkPmFhYSlhbmQKKF9iYStuPT1iYWEpdGhlbiBkX2E6c2V0VmFsdWUoYmNbbitiZF0pCmRfYTp1cGRhdGVEcmF3KCkKbG9jYWwgYWJhPWRfYTpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudCgibW91c2VfY2xpY2siLGRfYSwibW91c2VfY2xpY2siLGRpcixhYWEsYmFhKWlmKGNhYSl0aGVuIGRfYTptb3VzZVVwSGFuZGxlcihfYWEsYWFhLGJhYSllbmQ7aWYoYWJhPT0KZmFsc2UpdGhlbiByZXR1cm4gYWJhIGVuZDtyZXR1cm4gdHJ1ZSBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZAppZihfYy5tb3VzZUhhbmRsZXIoZF9hLF9hYSxhYWEsYmFhKSl0aGVuIGJfYT0obm90IGJfYSlkX2E6dXBkYXRlRHJhdygpCnJldHVybiB0cnVlIGVsc2UgaWYoYl9hKXRoZW4gZF9hOnVwZGF0ZURyYXcoKWJfYT1mYWxzZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCBlbmQsbW91c2VVcEhhbmRsZXI9ZnVuY3Rpb24oZF9hLF9hYSxhYWEsYmFhKQppZgooYl9hKXRoZW4KbG9jYWwgY2FhLGRhYT1kX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihkX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSkKaWYoX2FhPT0xKXRoZW4KaWYoI2JjPjApdGhlbgpmb3Igbj0xLGRkIGRvCmlmKGJjW24rYmRdfj1uaWwpdGhlbgppZihjYWE8PWFhYSlhbmQoY2FhK2NkPmFhYSlhbmQKKGRhYStuPT1iYWEpdGhlbiBiX2E9ZmFsc2U7ZF9hOnVwZGF0ZURyYXcoKQpsb2NhbCBfYmE9ZF9hOmdldEV2ZW50U3lzdGVtKCk6c2VuZEV2ZW50KCJtb3VzZV91cCIsZF9hLCJtb3VzZV91cCIsZGlyLGFhYSxiYWEpaWYoX2JhPT1mYWxzZSl0aGVuIHJldHVybiBfYmEgZW5kO3JldHVybiB0cnVlIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCxzY3JvbGxIYW5kbGVyPWZ1bmN0aW9uKGRfYSxfYWEsYWFhLGJhYSkKaWYKKGJfYSlhbmQoZF9hOmlzRm9jdXNlZCgpKXRoZW4gYmQ9YmQrX2FhO2lmKGJkPDApdGhlbiBiZD0wIGVuZDtpZihfYWE9PTEpdGhlbgppZigjYmM+ZGQpdGhlbiBpZihiZD4KI2JjLWRkKXRoZW4gYmQ9I2JjLWRkIGVuZCBlbHNlIGJkPW1hdGgubWluKCNiYy0xLDApZW5kIGVuZApsb2NhbCBjYWE9ZF9hOmdldEV2ZW50U3lzdGVtKCk6c2VuZEV2ZW50KCJtb3VzZV9zY3JvbGwiLGRfYSwibW91c2Vfc2Nyb2xsIixfYWEsYWFhLGJhYSlpZihjYWE9PWZhbHNlKXRoZW4gcmV0dXJuIGNhYSBlbmQ7ZF9hOnVwZGF0ZURyYXcoKXJldHVybiB0cnVlIGVuZCBlbmQsZHJhdz1mdW5jdGlvbihkX2EpCmlmCihfYy5kcmF3KGRfYSkpdGhlbiBsb2NhbCBfYWEsYWFhPWRfYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgYmFhLGNhYT1kX2E6Z2V0U2l6ZSgpCmlmKApkX2EucGFyZW50fj1uaWwpdGhlbiBpZihkX2EuYmdDb2xvcn49ZmFsc2UpdGhlbgpkX2EucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9hYSxhYWEsYmFhLGNhYSxkX2EuYmdDb2xvcillbmQ7bG9jYWwgZGFhPWRfYTpnZXRWYWx1ZSgpCmxvY2FsIF9iYT1iYi5nZXRUZXh0SG9yaXpvbnRhbEFsaWduKCgKZGFhfj1uaWwgYW5kIGRhYS50ZXh0IG9yIiIpLGJhYSxhZCk6c3ViKDEsCmJhYS0xKS4uIChiX2EgYW5kIGFfYSBvciBfX2EpCmRfYS5wYXJlbnQ6d3JpdGVUZXh0KF9hYSxhYWEsX2JhLGRfYS5iZ0NvbG9yLGRfYS5mZ0NvbG9yKQppZihiX2EpdGhlbgpmb3Igbj0xLGRkIGRvCmlmKGJjW24rYmRdfj1uaWwpdGhlbgppZihiY1tuK2JkXT09ZGFhKXRoZW4KaWYoX2QpdGhlbgpkX2EucGFyZW50OndyaXRlVGV4dChfYWEsYWFhK24sYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiY1sKbitiZF0udGV4dCxjZCxhZCksY2MsZGMpZWxzZQpkX2EucGFyZW50OndyaXRlVGV4dChfYWEsYWFhK24sYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiY1tuK2JkXS50ZXh0LGNkLGFkKSxiY1sKbitiZF0uYmdDb2wsYmNbbitiZF0uZmdDb2wpZW5kIGVsc2UKZF9hLnBhcmVudDp3cml0ZVRleHQoX2FhLGFhYStuLGJiLmdldFRleHRIb3Jpem9udGFsQWxpZ24oYmNbbitiZF0udGV4dCxjZCxhZCksYmNbCm4rYmRdLmJnQ29sLGJjW24rYmRdLmZnQ29sKWVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGRfYSkKZF9hLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGRfYSlkX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsZF9hKQpkX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9zY3JvbGwiLGRfYSkKaWYoX2MuaW5pdChkX2EpKXRoZW4KZF9hLmJnQ29sb3I9ZF9hLnBhcmVudDpnZXRUaGVtZSgiRHJvcGRvd25CRyIpZF9hLmZnQ29sb3I9ZF9hLnBhcmVudDpnZXRUaGVtZSgiRHJvcGRvd25UZXh0IikKY2M9ZF9hLnBhcmVudDpnZXRUaGVtZSgiU2VsZWN0aW9uQkciKWRjPWRfYS5wYXJlbnQ6Z2V0VGhlbWUoIlNlbGVjdGlvblRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShjX2EsX2MpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJMYWJlbCJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidXRpbHMiKQpsb2NhbCBjYj1iYi5nZXRWYWx1ZUZyb21YTUw7bG9jYWwgZGI9YmIuY3JlYXRlVGV4dDtsb2NhbCBfYz1kYSgidEhleCIpbG9jYWwgYWM9ZGEoImJpZ2ZvbnQiKQpyZXR1cm4KZnVuY3Rpb24oYmMpbG9jYWwgY2M9YWIoYmMpCmxvY2FsIGRjPSJMYWJlbCJjYzpzZXRaSW5kZXgoMylsb2NhbCBfZD10cnVlO2NjOnNldFZhbHVlKCJMYWJlbCIpY2Mud2lkdGg9NQpsb2NhbCBhZD0ibGVmdCJsb2NhbCBiZD0idG9wImxvY2FsIGNkPTA7bG9jYWwgZGQsX19hPWZhbHNlLGZhbHNlCmxvY2FsIGFfYT17Z2V0VHlwZT1mdW5jdGlvbihiX2EpcmV0dXJuIGRjIGVuZCxzZXRUZXh0PWZ1bmN0aW9uKGJfYSxjX2EpY19hPXRvc3RyaW5nKGNfYSkKY2M6c2V0VmFsdWUoY19hKQppZihfZCl0aGVuIGxvY2FsIGRfYT1iX2EucGFyZW50OmdldE9mZnNldCgpCmlmKApjX2E6bGVuKCkrYl9hOmdldFgoKT5iX2EucGFyZW50OmdldFdpZHRoKCkrZF9hKXRoZW4gbG9jYWwgX2FhPQpiX2EucGFyZW50OmdldFdpZHRoKCkrZF9hLWJfYTpnZXRYKCljYy5zZXRTaXplKGJfYSxfYWEsCiNkYihjX2EsX2FhKSllbHNlCmNjLnNldFNpemUoYl9hLGNfYTpsZW4oKSwxKWVuZCBlbmQ7Yl9hOnVwZGF0ZURyYXcoKXJldHVybiBiX2EgZW5kLHNldEJhY2tncm91bmQ9ZnVuY3Rpb24oYl9hLGNfYSkKY2Muc2V0QmFja2dyb3VuZChiX2EsY19hKV9fYT10cnVlO2JfYTp1cGRhdGVEcmF3KClyZXR1cm4gYl9hIGVuZCxzZXRGb3JlZ3JvdW5kPWZ1bmN0aW9uKGJfYSxjX2EpCmNjLnNldEZvcmVncm91bmQoYl9hLGNfYSlkZD10cnVlO2JfYTp1cGRhdGVEcmF3KClyZXR1cm4gYl9hIGVuZCxzZXRUZXh0QWxpZ249ZnVuY3Rpb24oYl9hLGNfYSxkX2EpYWQ9CmNfYSBvciBhZDtiZD1kX2Egb3IgYmQ7Yl9hOnVwZGF0ZURyYXcoKXJldHVybiBiX2EgZW5kLHNldEZvbnRTaXplPWZ1bmN0aW9uKGJfYSxjX2EpaWYoCmNfYT4wKWFuZChjX2E8PTQpdGhlbiBjZD1jX2EtMSBvciAwIGVuZApiX2E6dXBkYXRlRHJhdygpcmV0dXJuIGJfYSBlbmQsZ2V0Rm9udFNpemU9ZnVuY3Rpb24oYl9hKXJldHVybiBjZCsxIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYl9hLGNfYSkKY2Muc2V0VmFsdWVzQnlYTUxEYXRhKGJfYSxjX2EpCmlmKGNiKCJ0ZXh0IixjX2Epfj1uaWwpdGhlbiBiX2E6c2V0VGV4dChjYigidGV4dCIsY19hKSllbmQKaWYoY2IoInZlcnRpY2FsQWxpZ24iLGNfYSl+PW5pbCl0aGVuIGJkPWNiKCJ2ZXJ0aWNhbEFsaWduIixjX2EpZW5kO2lmKGNiKCJob3Jpem9udGFsQWxpZ24iLGNfYSl+PW5pbCl0aGVuCmFkPWNiKCJob3Jpem9udGFsQWxpZ24iLGNfYSllbmQ7aWYoY2IoImZvbnQiLGNfYSl+PW5pbCl0aGVuCmJfYTpzZXRGb250U2l6ZShjYigiZm9udCIsY19hKSllbmQ7cmV0dXJuIGJfYSBlbmQsc2V0U2l6ZT1mdW5jdGlvbihiX2EsY19hLGRfYSxfYWEpCmNjLnNldFNpemUoYl9hLGNfYSxkX2EsX2FhKV9kPWZhbHNlO2JfYTp1cGRhdGVEcmF3KClyZXR1cm4gYl9hIGVuZCxldmVudEhhbmRsZXI9ZnVuY3Rpb24oYl9hLGNfYSkKaWYoCmNfYT09ImJhc2FsdF9yZXNpemUiKXRoZW4KaWYoX2QpdGhlbiBsb2NhbCBkX2E9Yl9hOmdldFZhbHVlKCkKaWYoCmRfYTpsZW4oKStiX2E6Z2V0WCgpPmJfYS5wYXJlbnQ6Z2V0V2lkdGgoKSl0aGVuIGxvY2FsIF9hYT0KYl9hLnBhcmVudDpnZXRXaWR0aCgpLWJfYTpnZXRYKCkKY2Muc2V0U2l6ZShiX2EsX2FhLCNkYihkX2EsX2FhKSllbHNlIGNjLnNldFNpemUoYl9hLGRfYTpsZW4oKSwxKWVuZCBlbHNlIGVuZCBlbmQgZW5kLGRyYXc9ZnVuY3Rpb24oYl9hKQppZgooY2MuZHJhdyhiX2EpKXRoZW4KaWYoYl9hLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgY19hLGRfYT1iX2E6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBfYWEsYWFhPWJfYTpnZXRTaXplKClsb2NhbCBiYWE9YmIuZ2V0VGV4dFZlcnRpY2FsQWxpZ24oYWFhLGJkKQppZihjZD09MCl0aGVuCmlmIG5vdChfZCl0aGVuCmxvY2FsIGNhYT1kYihiX2E6Z2V0VmFsdWUoKSxiX2E6Z2V0V2lkdGgoKSkKZm9yIGRhYSxfYmEgaW4gcGFpcnMoY2FhKWRvIGlmKGRhYTw9YWFhKXRoZW4KYl9hLnBhcmVudDp3cml0ZVRleHQoY19hLGRfYStkYWEtMSxfYmEsYl9hLmJnQ29sb3IsYl9hLmZnQ29sb3IpZW5kIGVuZCBlbHNlCmlmCigjYl9hOmdldFZhbHVlKCkrY19hPmJfYS5wYXJlbnQ6Z2V0V2lkdGgoKSl0aGVuIGxvY2FsIGNhYT1kYihiX2E6Z2V0VmFsdWUoKSxiX2E6Z2V0V2lkdGgoKSkKZm9yIGRhYSxfYmEgaW4KcGFpcnMoY2FhKWRvIGlmKGRhYTw9YWFhKXRoZW4KYl9hLnBhcmVudDp3cml0ZVRleHQoY19hLGRfYStkYWEtMSxfYmEsYl9hLmJnQ29sb3IsYl9hLmZnQ29sb3IpZW5kIGVuZCBlbHNlCmJfYS5wYXJlbnQ6d3JpdGVUZXh0KGNfYSxkX2EsYl9hOmdldFZhbHVlKCksYl9hLmJnQ29sb3IsYl9hLmZnQ29sb3IpZW5kIGVuZCBlbHNlCmxvY2FsIGNhYT1hYyhjZCxiX2E6Z2V0VmFsdWUoKSxiX2EuZmdDb2xvcixiX2EuYmdDb2xvciBvciBjb2xvcnMubGlnaHRHcmF5KQppZihfZCl0aGVuIGJfYTpzZXRTaXplKCNjYWFbMV1bMV0sI2NhYVsxXS0xKWVuZDtsb2NhbCBkYWEsX2JhPWJfYS5wYXJlbnQ6Z2V0U2l6ZSgpCmxvY2FsIGFiYSxiYmE9I2NhYVsxXVsxXSwjY2FhWzFdCmNfYT1jX2Egb3IgbWF0aC5mbG9vcigoZGFhLWFiYSkvMikrMQpkX2E9ZF9hIG9yIG1hdGguZmxvb3IoKF9iYS1iYmEpLzIpKzEKZm9yIGk9MSxiYmEgZG8KYl9hLnBhcmVudDpzZXRGRyhjX2EsZF9hK2ktMSxjYWFbMl1baV0pYl9hLnBhcmVudDpzZXRCRyhjX2EsZF9hK2ktMSxjYWFbM11baV0pYl9hLnBhcmVudDpzZXRUZXh0KGNfYSwKZF9hK2ktMSxjYWFbMV1baV0pZW5kIGVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGJfYSkKYl9hLnBhcmVudDphZGRFdmVudCgib3RoZXJfZXZlbnQiLGJfYSkKaWYoY2MuaW5pdChiX2EpKXRoZW4KYl9hLmJnQ29sb3I9Yl9hLnBhcmVudDpnZXRUaGVtZSgiTGFiZWxCRyIpYl9hLmZnQ29sb3I9Yl9hLnBhcmVudDpnZXRUaGVtZSgiTGFiZWxUZXh0IikKaWYKKApiX2EucGFyZW50LmJnQ29sb3I9PWNvbG9ycy5ibGFjaylhbmQoYl9hLmZnQ29sb3I9PWNvbG9ycy5ibGFjayl0aGVuIGJfYS5mZ0NvbG9yPWNvbG9ycy5saWdodEdyYXkgZW5kIGVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShhX2EsY2MpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJUaHJlYWQiXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoInV0aWxzIikuZ2V0VmFsdWVGcm9tWE1MCnJldHVybgpmdW5jdGlvbihiYilsb2NhbCBjYgpsb2NhbCBkYj0iVGhyZWFkImxvY2FsIF9jO2xvY2FsIGFjO2xvY2FsIGJjPWZhbHNlO2xvY2FsIGNjCmxvY2FsIGRjPWZ1bmN0aW9uKF9kLGFkKQppZihhZDpzdWIoMSwxKT09IiMiKXRoZW4KbG9jYWwgYmQ9X2Q6Z2V0QmFzZUZyYW1lKCk6Z2V0RGVlcE9iamVjdChhZDpzdWIoMixhZDpsZW4oKSkpCmlmKGJkfj1uaWwpYW5kKGJkLmludGVybmFsT2JqZXRDYWxsfj1uaWwpdGhlbiByZXR1cm4oZnVuY3Rpb24oKQpiZDppbnRlcm5hbE9iamV0Q2FsbCgpZW5kKWVuZCBlbHNlIHJldHVybiBfZDpnZXRCYXNlRnJhbWUoKTpnZXRWYXJpYWJsZShhZCllbmQ7cmV0dXJuIF9kIGVuZApjYj17bmFtZT1iYixnZXRUeXBlPWZ1bmN0aW9uKF9kKXJldHVybiBkYiBlbmQsZ2V0WkluZGV4PWZ1bmN0aW9uKF9kKXJldHVybiAxIGVuZCxnZXROYW1lPWZ1bmN0aW9uKF9kKXJldHVybiBfZC5uYW1lIGVuZCxnZXRCYXNlRnJhbWU9ZnVuY3Rpb24oX2QpaWYKKF9kLnBhcmVudH49bmlsKXRoZW4gcmV0dXJuIF9kLnBhcmVudDpnZXRCYXNlRnJhbWUoKWVuZApyZXR1cm4gX2QgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihfZCxhZClsb2NhbCBiZDtpZihhYigidGhyZWFkIixhZCl+PW5pbCl0aGVuCmJkPWRjKF9kLGFiKCJ0aHJlYWQiLGFkKSllbmQKaWYoYWIoInN0YXJ0IixhZCl+PW5pbCl0aGVuIGlmCihhYigic3RhcnQiLGFkKSlhbmQoYmR+PW5pbCl0aGVuIF9kOnN0YXJ0KGJkKWVuZCBlbmQ7cmV0dXJuIF9kIGVuZCxzdGFydD1mdW5jdGlvbihfZCxhZCkKaWYoCmFkPT1uaWwpdGhlbiBlcnJvcigiRnVuY3Rpb24gcHJvdmlkZWQgdG8gdGhyZWFkIGlzIG5pbCIpZW5kO19jPWFkO2FjPWNvcm91dGluZS5jcmVhdGUoX2MpYmM9dHJ1ZTtjYz1uaWwKbG9jYWwgYmQsY2Q9Y29yb3V0aW5lLnJlc3VtZShhYyljYz1jZDtpZiBub3QoYmQpdGhlbiBpZihjZH49IlRlcm1pbmF0ZWQiKXRoZW4KZXJyb3IoIlRocmVhZCBFcnJvciBPY2N1cnJlZCAtICIuLmNkKWVuZCBlbmQKX2QucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsX2QpX2QucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsX2QpCl9kLnBhcmVudDphZGRFdmVudCgibW91c2Vfc2Nyb2xsIixfZClfZC5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2RyYWciLF9kKQpfZC5wYXJlbnQ6YWRkRXZlbnQoImtleSIsX2QpX2QucGFyZW50OmFkZEV2ZW50KCJrZXlfdXAiLF9kKQpfZC5wYXJlbnQ6YWRkRXZlbnQoImNoYXIiLF9kKV9kLnBhcmVudDphZGRFdmVudCgib3RoZXJfZXZlbnQiLF9kKXJldHVybiBfZCBlbmQsZ2V0U3RhdHVzPWZ1bmN0aW9uKF9kLGFkKWlmKAphY349bmlsKXRoZW4gcmV0dXJuIGNvcm91dGluZS5zdGF0dXMoYWMpZW5kO3JldHVybiBuaWwgZW5kLHN0b3A9ZnVuY3Rpb24oX2QsYWQpCmJjPWZhbHNlO19kLnBhcmVudDpyZW1vdmVFdmVudCgibW91c2VfY2xpY2siLF9kKQpfZC5wYXJlbnQ6cmVtb3ZlRXZlbnQoIm1vdXNlX3VwIixfZClfZC5wYXJlbnQ6cmVtb3ZlRXZlbnQoIm1vdXNlX3Njcm9sbCIsX2QpCl9kLnBhcmVudDpyZW1vdmVFdmVudCgibW91c2VfZHJhZyIsX2QpX2QucGFyZW50OnJlbW92ZUV2ZW50KCJrZXkiLF9kKQpfZC5wYXJlbnQ6cmVtb3ZlRXZlbnQoImtleV91cCIsX2QpX2QucGFyZW50OnJlbW92ZUV2ZW50KCJjaGFyIixfZCkKX2QucGFyZW50OnJlbW92ZUV2ZW50KCJvdGhlcl9ldmVudCIsX2QpcmV0dXJuIF9kIGVuZCxtb3VzZUhhbmRsZXI9ZnVuY3Rpb24oX2QsLi4uKQpfZDpldmVudEhhbmRsZXIoIm1vdXNlX2NsaWNrIiwuLi4pZW5kLG1vdXNlVXBIYW5kbGVyPWZ1bmN0aW9uKF9kLC4uLilfZDpldmVudEhhbmRsZXIoIm1vdXNlX3VwIiwuLi4pZW5kLG1vdXNlU2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihfZCwuLi4pCl9kOmV2ZW50SGFuZGxlcigibW91c2Vfc2Nyb2xsIiwuLi4pZW5kLG1vdXNlRHJhZ0hhbmRsZXI9ZnVuY3Rpb24oX2QsLi4uKQpfZDpldmVudEhhbmRsZXIoIm1vdXNlX2RyYWciLC4uLillbmQsbW91c2VNb3ZlSGFuZGxlcj1mdW5jdGlvbihfZCwuLi4pCl9kOmV2ZW50SGFuZGxlcigibW91c2VfbW92ZSIsLi4uKWVuZCxrZXlIYW5kbGVyPWZ1bmN0aW9uKF9kLC4uLilfZDpldmVudEhhbmRsZXIoImtleSIsLi4uKWVuZCxrZXlVcEhhbmRsZXI9ZnVuY3Rpb24oX2QsLi4uKQpfZDpldmVudEhhbmRsZXIoImtleV91cCIsLi4uKWVuZCxjaGFySGFuZGxlcj1mdW5jdGlvbihfZCwuLi4pX2Q6ZXZlbnRIYW5kbGVyKCJjaGFyIiwuLi4pZW5kLGV2ZW50SGFuZGxlcj1mdW5jdGlvbihfZCxhZCwuLi4pCmlmCihiYyl0aGVuCmlmKGNvcm91dGluZS5zdGF0dXMoYWMpPT0ic3VzcGVuZGVkIil0aGVuIGlmKGNjfj1uaWwpdGhlbiBpZihhZH49Y2MpdGhlbiByZXR1cm4gZW5kO2NjPQpuaWwgZW5kCmxvY2FsIGJkLGNkPWNvcm91dGluZS5yZXN1bWUoYWMsYWQsLi4uKWNjPWNkO2lmIG5vdChiZCl0aGVuIGlmKGNkfj0iVGVybWluYXRlZCIpdGhlbgplcnJvcigiVGhyZWFkIEVycm9yIE9jY3VycmVkIC0gIi4uY2QpZW5kIGVuZCBlbHNlCl9kOnN0b3AoKWVuZCBlbmQgZW5kfWNiLl9faW5kZXg9Y2I7cmV0dXJuIGNiIGVuZCBlbmQKYWFbIm9iamVjdHMiXVsiVGV4dGZpZWxkIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ0SGV4IikKbG9jYWwgY2I9ZGEoInV0aWxzIikuZ2V0VmFsdWVGcm9tWE1MO2xvY2FsIGRiPWRhKCJiYXNhbHRMb2dzIikKbG9jYWwgX2MsYWMsYmMsY2MsZGM9c3RyaW5nLnJlcCxzdHJpbmcuZmluZCxzdHJpbmcuZ21hdGNoLHN0cmluZy5zdWIsc3RyaW5nLmxlbgpyZXR1cm4KZnVuY3Rpb24oX2QpbG9jYWwgYWQ9YWIoX2QpbG9jYWwgYmQ9IlRleHRmaWVsZCJsb2NhbCBjZCxkZCxfX2EsYV9hPTEsMSwxLDE7bG9jYWwgYl9hPXsiIn1sb2NhbCBjX2E9eyIifWxvY2FsIGRfYT17IiJ9CmxvY2FsIF9hYT17fWxvY2FsIGFhYT17fWxvY2FsIGJhYSxjYWEsZGFhLF9iYTtsb2NhbCBhYmEsYmJhPWNvbG9ycy5saWdodEJsdWUsY29sb3JzLmJsYWNrO2FkLndpZHRoPTMwCmFkLmhlaWdodD0xMjthZDpzZXRaSW5kZXgoNSlsb2NhbCBmdW5jdGlvbiBjYmEoKQppZgooYmFhfj1uaWwpYW5kKGNhYX49bmlsKWFuZChkYWF+PW5pbClhbmQoX2Jhfj1uaWwpdGhlbiByZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZApsb2NhbCBmdW5jdGlvbiBkYmEoKWxvY2FsIGFkYSxiZGEsY2RhLGRkYQppZgooY2JhKCkpdGhlbiBpZihiYWE+Y2FhKXRoZW4gYWRhLGJkYT1jYWEsYmFhIGVsc2UgYWRhLGJkYT1iYWEsY2FhIGVuZDtpZihkYWE+X2JhKXRoZW4KY2RhLGRkYT1fYmEsZGFhIGVsc2UgY2RhLGRkYT1kYWEsX2JhIGVuZCBlbmQ7cmV0dXJuIGFkYSxiZGEsY2RhLGRkYSBlbmQ7bG9jYWwgZnVuY3Rpb24gX2NhKCllbmQKbG9jYWwgZnVuY3Rpb24gYWNhKGFkYSlsb2NhbCBiZGEsY2RhLGRkYSxfX2I9ZGJhKGFkYSkKZm9yIG49X19iLGRkYSwtMSBkbwppZihuPT1kZGEpb3Iobj09X19iKXRoZW4gbG9jYWwgYV9iPWJfYVtuXQpsb2NhbCBiX2I9Y19hW25dbG9jYWwgY19iPWRfYVtuXQppZihuPT1kZGEpYW5kKG49PV9fYil0aGVuIGFfYj1hX2I6c3ViKDEsYmRhLTEpLi4KYV9iOnN1YihjZGErMSxhX2I6bGVuKCkpYl9iPWJfYjpzdWIoMSxiZGEtMSkuLgpiX2I6c3ViKGNkYSsxLGJfYjpsZW4oKSljX2I9Y19iOnN1YigxLGJkYS0xKS4uCmNfYjpzdWIoY2RhKzEsY19iOmxlbigpKWVsc2VpZihuPT1iZGEpdGhlbgphX2I9YV9iOnN1YigxLGJkYSliX2I9Yl9iOnN1YigxLGJkYSljX2I9Y19iOnN1YigxLGJkYSllbHNlaWYobj09ZGRhKXRoZW4KYV9iPWFfYjpzdWIoY2RhLGFfYjpsZW4oKSliX2I9Yl9iOnN1YihjZGEsYl9iOmxlbigpKQpjX2I9Y19iOnN1YihjZGEsY19iOmxlbigpKWVuZDtiX2Fbbl09YV9iO2NfYVtuXT1iX2I7ZF9hW25dPWNfYiBlbHNlIHRhYmxlLnJlbW92ZShiX2EsbikKdGFibGUucmVtb3ZlKGNfYSxuKXRhYmxlLnJlbW92ZShkX2EsbillbmQgZW5kO19fYSxhX2E9YmFhLGRhYTtiYWEsY2FhLGRhYSxfYmE9bmlsLG5pbCxuaWwsbmlsO3JldHVybiBhZGEgZW5kCmxvY2FsIGZ1bmN0aW9uIGJjYShhZGEsYmRhKWxvY2FsIGNkYT17fQppZihhZGE6bGVuKCk+MCl0aGVuCmZvciBkZGEgaW4gYmMoYWRhLGJkYSlkbyBsb2NhbCBfX2IsYV9iPWFjKGFkYSxkZGEpCmlmCihfX2J+PW5pbClhbmQoYV9ifj1uaWwpdGhlbiB0YWJsZS5pbnNlcnQoY2RhLF9fYil0YWJsZS5pbnNlcnQoY2RhLGFfYikKbG9jYWwgYl9iPWNjKGFkYSwxLChfX2ItMSkpbG9jYWwgY19iPWNjKGFkYSxhX2IrMSxhZGE6bGVuKCkpYWRhPWJfYi4uICgiOiIpOnJlcChkZGE6bGVuKCkpLi4KY19iIGVuZCBlbmQgZW5kO3JldHVybiBjZGEgZW5kCmxvY2FsIGZ1bmN0aW9uIGNjYShhZGEsYmRhKWJkYT1iZGEgb3IgYV9hCmxvY2FsIGNkYT1iYlthZGEuZmdDb2xvcl06cmVwKGRfYVtiZGFdOmxlbigpKQpsb2NhbCBkZGE9YmJbYWRhLmJnQ29sb3JdOnJlcChjX2FbYmRhXTpsZW4oKSkKZm9yIF9fYixhX2IgaW4gcGFpcnMoYWFhKWRvIGxvY2FsIGJfYj1iY2EoYl9hW2JkYV0sYV9iWzFdKQppZigjYl9iPjApdGhlbgpmb3IgeD0xLCNiX2IvMiBkbwpsb2NhbCBjX2I9eCoyIC0xO2lmKGFfYlsyXX49bmlsKXRoZW4KY2RhPWNkYTpzdWIoMSxiX2JbY19iXS0xKS4uYmJbYV9iWzJdXTpyZXAoYl9iW2NfYisxXS0gKApiX2JbY19iXS0xKSkuLgpjZGE6c3ViKGJfYltjX2IrMV0rMSxjZGE6bGVuKCkpZW5kO2lmCihhX2JbM11+PW5pbCl0aGVuCmRkYT1kZGE6c3ViKDEsYl9iW2NfYl0tMSkuLgoKYmJbYV9iWzNdXTpyZXAoYl9iW2NfYisxXS0gKGJfYltjX2JdLTEpKS4uZGRhOnN1YihiX2JbY19iKzFdKzEsZGRhOmxlbigpKWVuZCBlbmQgZW5kIGVuZApmb3IgX19iLGFfYiBpbiBwYWlycyhfYWEpZG8KZm9yIGJfYixjX2IgaW4gcGFpcnMoYV9iKWRvIGxvY2FsIGRfYj1iY2EoYl9hW2JkYV0sY19iKQppZigjZF9iPjApdGhlbiBmb3IgeD0xLCNkX2IvMiBkbwpsb2NhbCBfYWI9eCoyIC0xCmNkYT1jZGE6c3ViKDEsZF9iW19hYl0tMSkuLgoKYmJbX19iXTpyZXAoZF9iW19hYisxXS0gKGRfYltfYWJdLTEpKS4uY2RhOnN1YihkX2JbX2FiKzFdKzEsY2RhOmxlbigpKWVuZCBlbmQgZW5kIGVuZDtkX2FbYmRhXT1jZGE7Y19hW2JkYV09ZGRhO2FkYTp1cGRhdGVEcmF3KCllbmQ7bG9jYWwgZnVuY3Rpb24gZGNhKGFkYSlmb3Igbj0xLCNiX2EgZG8gY2NhKGFkYSxuKWVuZCBlbmQKbG9jYWwgX2RhPXtnZXRUeXBlPWZ1bmN0aW9uKGFkYSlyZXR1cm4gYmQgZW5kLHNldEJhY2tncm91bmQ9ZnVuY3Rpb24oYWRhLGJkYSkKYWQuc2V0QmFja2dyb3VuZChhZGEsYmRhKWRjYShhZGEpcmV0dXJuIGFkYSBlbmQsc2V0Rm9yZWdyb3VuZD1mdW5jdGlvbihhZGEsYmRhKQphZC5zZXRGb3JlZ3JvdW5kKGFkYSxiZGEpZGNhKGFkYSlyZXR1cm4gYWRhIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYWRhLGJkYSkKYWQuc2V0VmFsdWVzQnlYTUxEYXRhKGFkYSxiZGEpCmlmKGJkYVsibGluZXMiXX49bmlsKXRoZW4gbG9jYWwgY2RhPWJkYVsibGluZXMiXVsibGluZSJdaWYKKGNkYS5wcm9wZXJ0aWVzfj1uaWwpdGhlbiBjZGE9e2NkYX1lbmQ7Zm9yIGRkYSxfX2IgaW4gcGFpcnMoY2RhKWRvCmFkYTphZGRMaW5lKF9fYjp2YWx1ZSgpKWVuZCBlbmQKaWYoYmRhWyJrZXl3b3JkcyJdfj1uaWwpdGhlbgpmb3IgY2RhLGRkYSBpbiBwYWlycyhiZGFbImtleXdvcmRzIl0pZG8KaWYoY29sb3JzW2NkYV1+PW5pbCl0aGVuCmxvY2FsIF9fYj1kZGE7aWYoX19iLnByb3BlcnRpZXN+PW5pbCl0aGVuIF9fYj17X19ifWVuZDtsb2NhbCBhX2I9e30KZm9yIGJfYixjX2IgaW4gcGFpcnMoX19iKWRvCmxvY2FsIGRfYj1jX2JbImtleXdvcmQiXWlmKGNfYlsia2V5d29yZCJdLnByb3BlcnRpZXN+PW5pbCl0aGVuCmRfYj17Y19iWyJrZXl3b3JkIl19ZW5kO2ZvciBfYWIsYWFiIGluIHBhaXJzKGRfYilkbwp0YWJsZS5pbnNlcnQoYV9iLGFhYjp2YWx1ZSgpKWVuZCBlbmQ7YWRhOmFkZEtleXdvcmRzKGNvbG9yc1tjZGFdLGFfYillbmQgZW5kIGVuZAppZihiZGFbInJ1bGVzIl1+PW5pbCl0aGVuCmlmKGJkYVsicnVsZXMiXVsicnVsZSJdfj1uaWwpdGhlbgpsb2NhbCBjZGE9YmRhWyJydWxlcyJdWyJydWxlIl1pZihiZGFbInJ1bGVzIl1bInJ1bGUiXS5wcm9wZXJ0aWVzfj1uaWwpdGhlbgpjZGE9e2JkYVsicnVsZXMiXVsicnVsZSJdfWVuZApmb3IgZGRhLF9fYiBpbiBwYWlycyhjZGEpZG8gaWYoY2IoInBhdHRlcm4iLF9fYil+PW5pbCl0aGVuCmFkYTphZGRSdWxlKGNiKCJwYXR0ZXJuIixfX2IpLGNvbG9yc1tjYigiZmciLF9fYildLGNvbG9yc1tjYigiYmciLF9fYildKWVuZCBlbmQgZW5kIGVuZCBlbmQsZ2V0TGluZXM9ZnVuY3Rpb24oYWRhKXJldHVybgpiX2EgZW5kLGdldExpbmU9ZnVuY3Rpb24oYWRhLGJkYSlyZXR1cm4gYl9hW2JkYV1lbmQsZWRpdExpbmU9ZnVuY3Rpb24oYWRhLGJkYSxjZGEpCmJfYVtiZGFdPWNkYSBvciBiX2FbYmRhXWNjYShhZGEsYmRhKWFkYTp1cGRhdGVEcmF3KClyZXR1cm4gYWRhIGVuZCxjbGVhcj1mdW5jdGlvbihhZGEpCmJfYT17IiJ9Y19hPXsiIn1kX2E9eyIifWJhYSxjYWEsZGFhLF9iYT1uaWwsbmlsLG5pbCxuaWw7Y2QsZGQsX19hLGFfYT0xLDEsMSwxCmFkYTp1cGRhdGVEcmF3KClyZXR1cm4gYWRhIGVuZCxhZGRMaW5lPWZ1bmN0aW9uKGFkYSxiZGEsY2RhKQppZgooYmRhfj1uaWwpdGhlbgppZigjYl9hPT0xKWFuZChiX2FbMV09PSIiKXRoZW4gYl9hWzFdPWJkYQpjX2FbMV09YmJbYWRhLmJnQ29sb3JdOnJlcChiZGE6bGVuKCkpZF9hWzFdPWJiW2FkYS5mZ0NvbG9yXTpyZXAoYmRhOmxlbigpKQpjY2EoYWRhLDEpcmV0dXJuIGFkYSBlbmQKaWYoY2Rhfj1uaWwpdGhlbiB0YWJsZS5pbnNlcnQoYl9hLGNkYSxiZGEpCnRhYmxlLmluc2VydChjX2EsY2RhLGJiW2FkYS5iZ0NvbG9yXTpyZXAoYmRhOmxlbigpKSkKdGFibGUuaW5zZXJ0KGRfYSxjZGEsYmJbYWRhLmZnQ29sb3JdOnJlcChiZGE6bGVuKCkpKWVsc2UgdGFibGUuaW5zZXJ0KGJfYSxiZGEpCnRhYmxlLmluc2VydChjX2EsYmJbYWRhLmJnQ29sb3JdOnJlcChiZGE6bGVuKCkpKQp0YWJsZS5pbnNlcnQoZF9hLGJiW2FkYS5mZ0NvbG9yXTpyZXAoYmRhOmxlbigpKSllbmQgZW5kO2NjYShhZGEsY2RhIG9yI2JfYSlhZGE6dXBkYXRlRHJhdygpcmV0dXJuIGFkYSBlbmQsYWRkS2V5d29yZHM9ZnVuY3Rpb24oYWRhLGJkYSxjZGEpaWYoCl9hYVtiZGFdPT1uaWwpdGhlbiBfYWFbYmRhXT17fWVuZDtmb3IgZGRhLF9fYiBpbiBwYWlycyhjZGEpZG8KdGFibGUuaW5zZXJ0KF9hYVtiZGFdLF9fYillbmQ7YWRhOnVwZGF0ZURyYXcoKXJldHVybiBhZGEgZW5kLGFkZFJ1bGU9ZnVuY3Rpb24oYWRhLGJkYSxjZGEsZGRhKQp0YWJsZS5pbnNlcnQoYWFhLHtiZGEsY2RhLGRkYX0pYWRhOnVwZGF0ZURyYXcoKXJldHVybiBhZGEgZW5kLGVkaXRSdWxlPWZ1bmN0aW9uKGFkYSxiZGEsY2RhLGRkYSlmb3IgX19iLGFfYiBpbgpwYWlycyhhYWEpZG8KaWYoYV9iWzFdPT1iZGEpdGhlbiBhYWFbX19iXVsyXT1jZGE7YWFhW19fYl1bM109ZGRhIGVuZCBlbmQ7YWRhOnVwZGF0ZURyYXcoKXJldHVybiBhZGEgZW5kLHJlbW92ZVJ1bGU9ZnVuY3Rpb24oYWRhLGJkYSkKZm9yIGNkYSxkZGEgaW4KcGFpcnMoYWFhKWRvIGlmKGRkYVsxXT09YmRhKXRoZW4gdGFibGUucmVtb3ZlKGFhYSxjZGEpZW5kIGVuZDthZGE6dXBkYXRlRHJhdygpcmV0dXJuIGFkYSBlbmQsc2V0S2V5d29yZHM9ZnVuY3Rpb24oYWRhLGJkYSxjZGEpCl9hYVtiZGFdPWNkYTthZGE6dXBkYXRlRHJhdygpcmV0dXJuIGFkYSBlbmQscmVtb3ZlTGluZT1mdW5jdGlvbihhZGEsYmRhKQppZigjYl9hPjEpdGhlbiB0YWJsZS5yZW1vdmUoYl9hLApiZGEgb3IjYl9hKQp0YWJsZS5yZW1vdmUoY19hLGJkYSBvciNjX2EpdGFibGUucmVtb3ZlKGRfYSxiZGEgb3IjZF9hKWVsc2UgYl9hPXsiIn1jX2E9eyIifWRfYT17IiJ9ZW5kO2FkYTp1cGRhdGVEcmF3KClyZXR1cm4gYWRhIGVuZCxnZXRUZXh0Q3Vyc29yPWZ1bmN0aW9uKGFkYSlyZXR1cm4KX19hLGFfYSBlbmQsZ2V0Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGFkYSlhZC5nZXRGb2N1c0hhbmRsZXIoYWRhKQppZihhZGEucGFyZW50fj1uaWwpdGhlbgpsb2NhbCBiZGEsY2RhPWFkYTpnZXRBbmNob3JQb3NpdGlvbigpaWYoYWRhLnBhcmVudH49bmlsKXRoZW4KYWRhLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxiZGErX19hLWRkLGNkYSthX2EtY2QsYWRhLmZnQ29sb3IpZW5kIGVuZCBlbmQsbG9zZUZvY3VzSGFuZGxlcj1mdW5jdGlvbihhZGEpCmFkLmxvc2VGb2N1c0hhbmRsZXIoYWRhKQppZihhZGEucGFyZW50fj1uaWwpdGhlbiBhZGEucGFyZW50OnNldEN1cnNvcihmYWxzZSllbmQgZW5kLGtleUhhbmRsZXI9ZnVuY3Rpb24oYWRhLGJkYSkKaWYKKGFkLmtleUhhbmRsZXIoYWRhLGV2ZW50LGJkYSkpdGhlbiBsb2NhbCBjZGEsZGRhPWFkYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgX19iLGFfYj1hZGE6Z2V0U2l6ZSgpCmlmKGJkYT09CmtleXMuYmFja3NwYWNlKXRoZW4KaWYoYl9hW2FfYV09PSIiKXRoZW4KaWYoYV9hPjEpdGhlbiB0YWJsZS5yZW1vdmUoYl9hLGFfYSkKdGFibGUucmVtb3ZlKGRfYSxhX2EpdGFibGUucmVtb3ZlKGNfYSxhX2EpCl9fYT1iX2FbYV9hLTFdOmxlbigpKzE7ZGQ9X19hLV9fYisxO2lmKGRkPDEpdGhlbiBkZD0xIGVuZDthX2E9YV9hLTEgZW5kIGVsc2VpZihfX2E8PTEpdGhlbgppZihhX2E+MSl0aGVuIF9fYT1iX2FbYV9hLTFdOmxlbigpKzEKZGQ9X19hLV9fYisxO2lmKGRkPDEpdGhlbiBkZD0xIGVuZDtiX2FbYV9hLTFdPWJfYVthX2EtMV0uLmJfYVthX2FdZF9hWwphX2EtMV09ZF9hW2FfYS0xXS4uZF9hW2FfYV1jX2FbYV9hLTFdPWNfYVthX2EtMV0uLgpjX2FbYV9hXXRhYmxlLnJlbW92ZShiX2EsYV9hKQp0YWJsZS5yZW1vdmUoZF9hLGFfYSl0YWJsZS5yZW1vdmUoY19hLGFfYSlhX2E9YV9hLTEgZW5kIGVsc2UgYl9hW2FfYV09Yl9hW2FfYV06c3ViKDEsX19hLTIpLi4KYl9hW2FfYV06c3ViKF9fYSxiX2FbYV9hXTpsZW4oKSkKZF9hW2FfYV09ZF9hW2FfYV06c3ViKDEsCl9fYS0yKS4uZF9hW2FfYV06c3ViKF9fYSxkX2FbYV9hXTpsZW4oKSljX2FbYV9hXT1jX2FbYV9hXTpzdWIoMSxfX2EtMikuLgpjX2FbYV9hXTpzdWIoX19hLGNfYVthX2FdOmxlbigpKWlmKF9fYT4xKXRoZW4KX19hPV9fYS0xIGVuZDtpZihkZD4xKXRoZW4gaWYoX19hPGRkKXRoZW4gZGQ9ZGQtMSBlbmQgZW5kIGVuZDtpZihhX2E8Y2QpdGhlbiBjZD1jZC0xIGVuZDtjY2EoYWRhKWFkYTpzZXRWYWx1ZSgiIillbmQKaWYoYmRhPT1rZXlzLmRlbGV0ZSl0aGVuCmlmKGNiYSgpKXRoZW4gYWNhKGFkYSllbHNlCmlmKF9fYT5iX2FbYV9hXTpsZW4oKSl0aGVuCmlmKApiX2FbYV9hKzFdfj1uaWwpdGhlbiBiX2FbYV9hXT1iX2FbYV9hXS4uYl9hW2FfYSsxXQp0YWJsZS5yZW1vdmUoYl9hLGFfYSsxKXRhYmxlLnJlbW92ZShjX2EsYV9hKzEpdGFibGUucmVtb3ZlKGRfYSxhX2ErMSllbmQgZWxzZSBiX2FbYV9hXT1iX2FbYV9hXTpzdWIoMSxfX2EtMSkuLgpiX2FbYV9hXTpzdWIoX19hKzEsYl9hW2FfYV06bGVuKCkpCmRfYVthX2FdPWRfYVthX2FdOnN1YigxLApfX2EtMSkuLmRfYVthX2FdOnN1YihfX2ErMSxkX2FbYV9hXTpsZW4oKSljX2FbYV9hXT1jX2FbYV9hXTpzdWIoMSxfX2EtMSkuLgpjX2FbYV9hXTpzdWIoX19hKzEsY19hW2FfYV06bGVuKCkpZW5kIGVuZDtjY2EoYWRhKWVuZAppZihiZGE9PWtleXMuZW50ZXIpdGhlbgp0YWJsZS5pbnNlcnQoYl9hLGFfYSsxLGJfYVthX2FdOnN1YihfX2EsYl9hW2FfYV06bGVuKCkpKQp0YWJsZS5pbnNlcnQoZF9hLGFfYSsxLGRfYVthX2FdOnN1YihfX2EsZF9hW2FfYV06bGVuKCkpKQp0YWJsZS5pbnNlcnQoY19hLGFfYSsxLGNfYVthX2FdOnN1YihfX2EsY19hW2FfYV06bGVuKCkpKWJfYVthX2FdPWJfYVthX2FdOnN1YigxLF9fYS0xKQpkX2FbYV9hXT1kX2FbYV9hXTpzdWIoMSxfX2EtMSljX2FbYV9hXT1jX2FbYV9hXTpzdWIoMSxfX2EtMSlhX2E9YV9hKzE7X19hPTE7ZGQ9MTtpZihhX2EtY2Q+PQphX2IpdGhlbiBjZD1jZCsxIGVuZDthZGE6c2V0VmFsdWUoIiIpZW5kCmlmKGJkYT09a2V5cy51cCl0aGVuCmlmKGFfYT4xKXRoZW4gYV9hPWFfYS0xO2lmKF9fYT5iX2FbYV9hXTpsZW4oKSsxKXRoZW4gX19hPQpiX2FbYV9hXTpsZW4oKSsxIGVuZAppZihkZD4xKXRoZW4gaWYoX19hPGRkKXRoZW4KZGQ9X19hLV9fYisxO2lmKGRkPDEpdGhlbiBkZD0xIGVuZCBlbmQgZW5kO2lmKGNkPjEpdGhlbiBpZihhX2E8Y2QpdGhlbiBjZD1jZC0xIGVuZCBlbmQgZW5kIGVuZAppZihiZGE9PWtleXMuZG93bil0aGVuCmlmKGFfYTwjYl9hKXRoZW4gYV9hPWFfYSsxO2lmCihfX2E+Yl9hW2FfYV06bGVuKCkrMSl0aGVuIF9fYT1iX2FbYV9hXTpsZW4oKSsxIGVuZAppZihkZD4xKXRoZW4gaWYKKF9fYTxkZCl0aGVuIGRkPV9fYS1fX2IrMTtpZihkZDwxKXRoZW4gZGQ9MSBlbmQgZW5kIGVuZDtpZihhX2E+PWNkK2FfYil0aGVuIGNkPWNkKzEgZW5kIGVuZCBlbmQKaWYoYmRhPT1rZXlzLnJpZ2h0KXRoZW4gX19hPV9fYSsxCmlmKGFfYTwjYl9hKXRoZW4gaWYKKF9fYT5iX2FbYV9hXTpsZW4oKSsxKXRoZW4gX19hPTE7YV9hPWFfYSsxIGVuZCBlbHNlaWYoX19hPmJfYVthX2FdOmxlbigpKXRoZW4gX19hPQpiX2FbYV9hXTpsZW4oKSsxIGVuZDtpZihfX2E8MSl0aGVuIF9fYT0xIGVuZAppZihfX2E8ZGQpb3IoX19hPj1fX2IrZGQpdGhlbiBkZD1fX2EtX19iKzEgZW5kO2lmKGRkPDEpdGhlbiBkZD0xIGVuZCBlbmQKaWYoYmRhPT1rZXlzLmxlZnQpdGhlbiBfX2E9X19hLTE7aWYoX19hPj0xKXRoZW4KaWYoX19hPGRkKW9yKF9fYT49X19iK2RkKXRoZW4gZGQ9X19hIGVuZCBlbmQKaWYoYV9hPjEpdGhlbiBpZihfX2E8MSl0aGVuIGFfYT1hX2EtMQpfX2E9Yl9hW2FfYV06bGVuKCkrMTtkZD1fX2EtX19iKzEgZW5kIGVuZDtpZihfX2E8MSl0aGVuIF9fYT0xIGVuZDtpZihkZDwxKXRoZW4gZGQ9MSBlbmQgZW5kCmlmIG5vdAooIChjZGErX19hLWRkPj1jZGEgYW5kIGNkYStfX2EtZGQ8Y2RhK19fYilhbmQoCmRkYSthX2EtY2Q+PWRkYSBhbmQgZGRhK2FfYS1jZDxkZGErYV9iKSl0aGVuIGRkPW1hdGgubWF4KDEsCmJfYVthX2FdOmxlbigpLV9fYisxKQpjZD1tYXRoLm1heCgxLGFfYS1hX2IrMSllbmQ7bG9jYWwgYl9iPQooX19hPD1iX2FbYV9hXTpsZW4oKWFuZCBfX2EtMSBvciBiX2FbYV9hXTpsZW4oKSktIChkZC0xKQppZihiX2I+CmFkYTpnZXRYKCkrX19iLTEpdGhlbiBiX2I9YWRhOmdldFgoKStfX2ItMSBlbmQKbG9jYWwgY19iPShhX2EtY2Q8YV9iIGFuZCBhX2EtY2Qgb3IgYV9hLWNkLTEpaWYoYl9iPDEpdGhlbiBiX2I9MCBlbmQKYWRhLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxjZGErYl9iLGRkYStjX2IsYWRhLmZnQ29sb3IpYWRhOnVwZGF0ZURyYXcoKXJldHVybiB0cnVlIGVuZCBlbmQsY2hhckhhbmRsZXI9ZnVuY3Rpb24oYWRhLGJkYSkKaWYKKGFkLmNoYXJIYW5kbGVyKGFkYSxiZGEpKXRoZW4gbG9jYWwgY2RhLGRkYT1hZGE6Z2V0QW5jaG9yUG9zaXRpb24oKWxvY2FsIF9fYixhX2I9YWRhOmdldFNpemUoKWJfYVthX2FdPWJfYVthX2FdOnN1YigxLApfX2EtMSkuLgpiZGEuLmJfYVthX2FdOnN1YihfX2EsYl9hW2FfYV06bGVuKCkpCmRfYVthX2FdPWRfYVthX2FdOnN1YigxLApfX2EtMSkuLmJiW2FkYS5mZ0NvbG9yXS4uCmRfYVthX2FdOnN1YihfX2EsZF9hW2FfYV06bGVuKCkpCmNfYVthX2FdPWNfYVthX2FdOnN1YigxLF9fYS0xKS4uYmJbYWRhLmJnQ29sb3JdLi4KY19hW2FfYV06c3ViKF9fYSxjX2FbYV9hXTpsZW4oKSlfX2E9X19hKzE7aWYoX19hPj1fX2IrZGQpdGhlbiBkZD1kZCsxIGVuZDtjY2EoYWRhKQphZGE6c2V0VmFsdWUoIiIpCmlmIG5vdAooIChjZGErX19hLWRkPj1jZGEgYW5kIGNkYStfX2EtZGQ8Y2RhK19fYilhbmQoCmRkYSthX2EtY2Q+PWRkYSBhbmQgZGRhK2FfYS1jZDxkZGErYV9iKSl0aGVuIGRkPW1hdGgubWF4KDEsCmJfYVthX2FdOmxlbigpLV9fYisxKQpjZD1tYXRoLm1heCgxLGFfYS1hX2IrMSllbmQ7bG9jYWwgYl9iPQooX19hPD1iX2FbYV9hXTpsZW4oKWFuZCBfX2EtMSBvciBiX2FbYV9hXTpsZW4oKSktIChkZC0xKQppZihiX2I+CmFkYTpnZXRYKCkrX19iLTEpdGhlbiBiX2I9YWRhOmdldFgoKStfX2ItMSBlbmQKbG9jYWwgY19iPShhX2EtY2Q8YV9iIGFuZCBhX2EtY2Qgb3IgYV9hLWNkLTEpaWYoYl9iPDEpdGhlbiBiX2I9MCBlbmQ7aWYoY2JhKCkpdGhlbiBhY2EoYWRhKWVuZDthZGEucGFyZW50OnNldEN1cnNvcih0cnVlLGNkYStiX2IsCmRkYStjX2IsYWRhLmZnQ29sb3IpCmFkYTp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQgZW5kLGRyYWdIYW5kbGVyPWZ1bmN0aW9uKGFkYSxiZGEsY2RhLGRkYSkKaWYKKGFkLmRyYWdIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSkpdGhlbgpsb2NhbCBfX2IsYV9iPWFkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGFkYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGJfYixjX2I9YWRhOmdldEFuY2hvclBvc2l0aW9uKClsb2NhbCBkX2IsX2FiPWFkYTpnZXRTaXplKCkKaWYoYl9hWwpkZGEtYV9iK2NkXX49bmlsKXRoZW4KaWYKKGJfYitkX2I+Yl9iK2NkYS0gKF9fYisxKStkZClhbmQoYl9iPGJfYitjZGEtX19iK2RkKXRoZW4KX19hPWNkYS1fX2IrZGQ7YV9hPWRkYS1hX2IrY2Q7Y2FhPV9fYTtfYmE9YV9hO2lmKF9fYT5iX2FbYV9hXTpsZW4oKSl0aGVuIF9fYT0KYl9hW2FfYV06bGVuKCkrMTtjYWE9X19hIGVuZDtpZihfX2E8ZGQpdGhlbiBkZD1fX2EtMTtpZgooZGQ8MSl0aGVuIGRkPTEgZW5kIGVuZDthZGEucGFyZW50OnNldEN1cnNvcih0cnVlLGJfYitfX2EtZGQsCmNfYithX2EtY2QsYWRhLmZnQ29sb3IpCmFkYTp1cGRhdGVEcmF3KCllbmQgZW5kO3JldHVybiB0cnVlIGVuZCBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihhZGEsYmRhLGNkYSxkZGEpCmlmCihhZC5zY3JvbGxIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSkpdGhlbgpsb2NhbCBfX2IsYV9iPWFkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGFkYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGJfYixjX2I9YWRhOmdldEFuY2hvclBvc2l0aW9uKClsb2NhbCBkX2IsX2FiPWFkYTpnZXRTaXplKCkKY2Q9Y2QrYmRhO2lmKGNkPiNiX2EtIChfYWItMSkpdGhlbiBjZD0jYl9hLSAoX2FiLTEpZW5kO2lmCihjZDwxKXRoZW4gY2Q9MSBlbmQKaWYKCihfX2IrX19hLWRkPj1fX2IgYW5kIF9fYitfX2EtZGQ8X19iK2RfYilhbmQoY19iK2FfYS1jZD49Y19iIGFuZCBjX2IrYV9hLWNkPGNfYitfYWIpdGhlbgphZGEucGFyZW50OnNldEN1cnNvcih0cnVlLGJfYitfX2EtZGQsY19iK2FfYS1jZCxhZGEuZmdDb2xvcillbHNlIGFkYS5wYXJlbnQ6c2V0Q3Vyc29yKGZhbHNlKWVuZDthZGE6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kIGVuZCxtb3VzZUhhbmRsZXI9ZnVuY3Rpb24oYWRhLGJkYSxjZGEsZGRhKQppZgooYWQubW91c2VIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSkpdGhlbgpsb2NhbCBfX2IsYV9iPWFkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGFkYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGJfYixjX2I9YWRhOmdldEFuY2hvclBvc2l0aW9uKCkKaWYKKGJfYVtkZGEtYV9iK2NkXX49bmlsKXRoZW4gX19hPWNkYS1fX2IrZGQ7YV9hPWRkYS1hX2IrY2Q7Y2FhPW5pbDtfYmE9bmlsO2JhYT1fX2E7ZGFhPWFfYQppZihfX2E+CmJfYVthX2FdOmxlbigpKXRoZW4gX19hPWJfYVthX2FdOmxlbigpKzE7YmFhPV9fYSBlbmQ7aWYoX19hPGRkKXRoZW4gZGQ9X19hLTE7aWYoZGQ8MSl0aGVuIGRkPTEgZW5kIGVuZAphZGE6dXBkYXRlRHJhdygpZW5kO2lmKGFkYS5wYXJlbnR+PW5pbCl0aGVuCmFkYS5wYXJlbnQ6c2V0Q3Vyc29yKHRydWUsYl9iK19fYS1kZCxjX2IrYV9hLWNkLGFkYS5mZ0NvbG9yKWVuZDtyZXR1cm4gdHJ1ZSBlbmQgZW5kLG1vdXNlVXBIYW5kbGVyPWZ1bmN0aW9uKGFkYSxiZGEsY2RhLGRkYSkKaWYKKGFkLm1vdXNlVXBIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSkpdGhlbgpsb2NhbCBfX2IsYV9iPWFkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGFkYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGJfYixjX2I9YWRhOmdldEFuY2hvclBvc2l0aW9uKCkKaWYKKGJfYVtkZGEtYV9iK2NkXX49bmlsKXRoZW4gY2FhPWNkYS1fX2IrZGQ7X2JhPWRkYS1hX2IrY2Q7aWYoY2FhPmJfYVtfYmFdOmxlbigpKXRoZW4gY2FhPQpiX2FbX2JhXTpsZW4oKSsxIGVuZDtpZihiYWE9PWNhYSlhbmQoZGFhPT1fYmEpdGhlbiBiYWEsY2FhLGRhYSxfYmE9Cm5pbCxuaWwsbmlsLG5pbCBlbmQKYWRhOnVwZGF0ZURyYXcoKWVuZDtyZXR1cm4gdHJ1ZSBlbmQgZW5kLGV2ZW50SGFuZGxlcj1mdW5jdGlvbihhZGEsYmRhLGNkYSxkZGEsX19iLGFfYikKYWQuZXZlbnRIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSxfX2IsYV9iKQppZihiZGE9PSJwYXN0ZSIpdGhlbgppZihhZGE6aXNGb2N1c2VkKCkpdGhlbiBsb2NhbCBiX2IsY19iPWFkYTpnZXRTaXplKCliX2FbYV9hXT1iX2FbYV9hXTpzdWIoMSwKX19hLTEpLi4KY2RhLi5iX2FbYV9hXTpzdWIoX19hLGJfYVthX2FdOmxlbigpKQpkX2FbYV9hXT1kX2FbYV9hXTpzdWIoMSwKX19hLTEpLi5iYlthZGEuZmdDb2xvcl06cmVwKGNkYTpsZW4oKSkuLgpkX2FbYV9hXTpzdWIoX19hLGRfYVthX2FdOmxlbigpKQpjX2FbYV9hXT1jX2FbYV9hXTpzdWIoMSxfX2EtMSkuLgoKYmJbYWRhLmJnQ29sb3JdOnJlcChjZGE6bGVuKCkpLi5jX2FbYV9hXTpzdWIoX19hLGNfYVthX2FdOmxlbigpKV9fYT1fX2ErY2RhOmxlbigpCmlmKF9fYT49Yl9iK2RkKXRoZW4gZGQ9KF9fYSsxKS1iX2IgZW5kO2xvY2FsIGRfYixfYWI9YWRhOmdldEFuY2hvclBvc2l0aW9uKCkKYWRhLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxkX2IrX19hLWRkLF9hYisKYV9hLWNkLGFkYS5mZ0NvbG9yKWNjYShhZGEpYWRhOnVwZGF0ZURyYXcoKWVuZCBlbmQgZW5kLHNldFNlbGVjdGlvbkNvbG9yPWZ1bmN0aW9uKGFkYSxiZGEsY2RhKWFiYT0KYmRhIG9yIGFiYTtiYmE9Y2RhIG9yIGJiYTtyZXR1cm4gYWRhIGVuZCxkcmF3PWZ1bmN0aW9uKGFkYSkKaWYKKGFkLmRyYXcoYWRhKSl0aGVuCmlmKGFkYS5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIGJkYSxjZGE9YWRhOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgZGRhLF9fYj1hZGE6Z2V0U2l6ZSgpCmZvciBuPTEsX19iIGRvIGxvY2FsIGFfYj0iImxvY2FsIGJfYj0iImxvY2FsIGNfYj0iIgppZihiX2FbbitjZC0xXX49bmlsKXRoZW4gYV9iPWJfYVtuK2NkLTFdY19iPWRfYVsKbitjZC0xXWJfYj1jX2FbbitjZC0xXWVuZDthX2I9YV9iOnN1YihkZCxkZGErZGQtMSkKYl9iPWJfYjpzdWIoZGQsZGRhK2RkLTEpY19iPWNfYjpzdWIoZGQsZGRhK2RkLTEpbG9jYWwgZF9iPWRkYS1hX2I6bGVuKClpZihkX2I8MCl0aGVuCmRfYj0wIGVuZDthX2I9YV9iLi5fYyhhZGEuYmdTeW1ib2wsZF9iKWJfYj1iX2IuLgpfYyhiYlthZGEuYmdDb2xvcl0sZF9iKQpjX2I9Y19iLi5fYyhiYlthZGEuZmdDb2xvcl0sZF9iKWFkYS5wYXJlbnQ6c2V0VGV4dChiZGEsY2RhK24tMSxhX2IpYWRhLnBhcmVudDpzZXRCRyhiZGEsCmNkYStuLTEsYl9iKQphZGEucGFyZW50OnNldEZHKGJkYSxjZGErbi0xLGNfYillbmQKaWYoYWRhOmlzRm9jdXNlZCgpKXRoZW4gbG9jYWwgYV9iLGJfYj1hZGE6Z2V0QW5jaG9yUG9zaXRpb24oKWVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGFkYSkKYWRhLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGFkYSlhZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsYWRhKQphZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9zY3JvbGwiLGFkYSlhZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9kcmFnIixhZGEpCmFkYS5wYXJlbnQ6YWRkRXZlbnQoImtleSIsYWRhKWFkYS5wYXJlbnQ6YWRkRXZlbnQoImNoYXIiLGFkYSkKYWRhLnBhcmVudDphZGRFdmVudCgib3RoZXJfZXZlbnQiLGFkYSkKaWYoYWQuaW5pdChhZGEpKXRoZW4KYWRhLmJnQ29sb3I9YWRhLnBhcmVudDpnZXRUaGVtZSgiVGV4dGZpZWxkQkciKWFkYS5mZ0NvbG9yPWFkYS5wYXJlbnQ6Z2V0VGhlbWUoIlRleHRmaWVsZFRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShfZGEsYWQpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJTY3JvbGxiYXIiXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoIk9iamVjdCIpCmxvY2FsIGJiPWRhKCJ1dGlscyIpLmdldFZhbHVlRnJvbVhNTApyZXR1cm4KZnVuY3Rpb24oY2IpbG9jYWwgZGI9YWIoY2IpbG9jYWwgX2M9IlNjcm9sbGJhciJkYi53aWR0aD0xO2RiLmhlaWdodD04O2RiOnNldFZhbHVlKDEpCmRiOnNldFpJbmRleCgyKWxvY2FsIGFjPSJ2ZXJ0aWNhbCJsb2NhbCBiYz0iICJsb2NhbCBjYztsb2NhbCBkYz0iXDEyNyJsb2NhbCBfZD1kYi5oZWlnaHQ7bG9jYWwgYWQ9MTtsb2NhbCBiZD0xCmxvY2FsIGZ1bmN0aW9uIGNkKF9fYSxhX2EsYl9hLGNfYSkKbG9jYWwgZF9hLF9hYT1fX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihfX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSlsb2NhbCBhYWEsYmFhPV9fYTpnZXRTaXplKCkKaWYoYWM9PSJob3Jpem9udGFsIil0aGVuCmZvciBfaW5kZXg9MCxhYWEgZG8KaWYKKGRfYStfaW5kZXg9PWJfYSlhbmQoX2FhPD1jX2EpYW5kKF9hYStiYWE+Y19hKXRoZW4KYWQ9bWF0aC5taW4oX2luZGV4KzEsYWFhLSAoYmQtMSkpX19hOnNldFZhbHVlKF9kL2FhYSogKGFkKSlfX2E6dXBkYXRlRHJhdygpZW5kIGVuZCBlbmQKaWYoYWM9PSJ2ZXJ0aWNhbCIpdGhlbgpmb3IgX2luZGV4PTAsYmFhIGRvCmlmCihfYWErX2luZGV4PT1jX2EpYW5kKGRfYTw9Yl9hKWFuZChkX2ErYWFhPmJfYSl0aGVuIGFkPW1hdGgubWluKF9pbmRleCsxLGJhYS0gKGJkLTEpKQpfX2E6c2V0VmFsdWUoX2QvYmFhKiAoYWQpKV9fYTp1cGRhdGVEcmF3KCllbmQgZW5kIGVuZCBlbmQKbG9jYWwgZGQ9e2dldFR5cGU9ZnVuY3Rpb24oX19hKXJldHVybiBfYyBlbmQsc2V0U3ltYm9sPWZ1bmN0aW9uKF9fYSxhX2EpYmM9YV9hOnN1YigxLDEpX19hOnVwZGF0ZURyYXcoKXJldHVybiBfX2EgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihfX2EsYV9hKQpkYi5zZXRWYWx1ZXNCeVhNTERhdGEoX19hLGFfYSkKaWYoYmIoIm1heFZhbHVlIixhX2Epfj1uaWwpdGhlbiBfZD1iYigibWF4VmFsdWUiLGFfYSllbmQ7aWYoYmIoImJhY2tncm91bmRTeW1ib2wiLGFfYSl+PW5pbCl0aGVuCmRjPWJiKCJiYWNrZ3JvdW5kU3ltYm9sIixhX2EpOnN1YigxLDEpZW5kO2lmKGJiKCJzeW1ib2wiLGFfYSl+PW5pbCl0aGVuCmJjPWJiKCJzeW1ib2wiLGFfYSk6c3ViKDEsMSllbmQ7aWYoYmIoImJhclR5cGUiLGFfYSl+PW5pbCl0aGVuCmFjPWJiKCJiYXJUeXBlIixhX2EpOmxvd2VyKCllbmQ7aWYoYmIoInN5bWJvbFNpemUiLGFfYSl+PW5pbCl0aGVuCl9fYTpzZXRTeW1ib2xTaXplKGJiKCJzeW1ib2xTaXplIixhX2EpKWVuZDtpZihiYigic3ltYm9sQ29sb3IiLGFfYSl+PW5pbCl0aGVuCmNjPWNvbG9yc1tiYigic3ltYm9sQ29sb3IiLGFfYSldZW5kO2lmKGJiKCJpbmRleCIsYV9hKX49bmlsKXRoZW4KX19hOnNldEluZGV4KGJiKCJpbmRleCIsYV9hKSllbmQgZW5kLHNldEluZGV4PWZ1bmN0aW9uKF9fYSxhX2EpCmFkPWFfYTtpZihhZDwxKXRoZW4gYWQ9MSBlbmQ7bG9jYWwgYl9hLGNfYT1fX2E6Z2V0U2l6ZSgpCmFkPW1hdGgubWluKGFkLCgKYWM9PSJ2ZXJ0aWNhbCJhbmQgY19hIG9yIGJfYSktIChiZC0xKSkKX19hOnNldFZhbHVlKF9kLyAoYWM9PSJ2ZXJ0aWNhbCJhbmQgY19hIG9yIGJfYSkqYWQpX19hOnVwZGF0ZURyYXcoKXJldHVybiBfX2EgZW5kLGdldEluZGV4PWZ1bmN0aW9uKF9fYSlyZXR1cm4KYWQgZW5kLHNldFN5bWJvbFNpemU9ZnVuY3Rpb24oX19hLGFfYSliZD10b251bWJlcihhX2Epb3IgMQpsb2NhbCBiX2EsY19hPV9fYTpnZXRTaXplKCkKaWYoYWM9PSJ2ZXJ0aWNhbCIpdGhlbgpfX2E6c2V0VmFsdWUoYWQtMSAqIChfZC8gKGNfYS0gKGJkLTEpKSktIChfZC8gKGNfYS0KKGJkLTEpKSkpZWxzZWlmKGFjPT0iaG9yaXpvbnRhbCIpdGhlbgpfX2E6c2V0VmFsdWUoYWQtMSAqIChfZC8gKGJfYS0gKGJkLTEpKSktIChfZC8gKGJfYS0gKApiZC0xKSkpKWVuZDtfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsc2V0TWF4VmFsdWU9ZnVuY3Rpb24oX19hLGFfYSkKX2Q9YV9hO19fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxzZXRCYWNrZ3JvdW5kU3ltYm9sPWZ1bmN0aW9uKF9fYSxhX2EpCmRjPXN0cmluZy5zdWIoYV9hLDEsMSlfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsc2V0U3ltYm9sQ29sb3I9ZnVuY3Rpb24oX19hLGFfYSljYz1hX2EKX19hOnVwZGF0ZURyYXcoKXJldHVybiBfX2EgZW5kLHNldEJhclR5cGU9ZnVuY3Rpb24oX19hLGFfYSlhYz1hX2E6bG93ZXIoKQpfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKF9fYSxhX2EsYl9hLGNfYSlpZihkYi5tb3VzZUhhbmRsZXIoX19hLGFfYSxiX2EsY19hKSl0aGVuCmNkKF9fYSxhX2EsYl9hLGNfYSlyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmFnSGFuZGxlcj1mdW5jdGlvbihfX2EsYV9hLGJfYSxjX2EpaWYKKGRiLmRyYWdIYW5kbGVyKF9fYSxhX2EsYl9hLGNfYSkpdGhlbiBjZChfX2EsYV9hLGJfYSxjX2EpcmV0dXJuIHRydWUgZW5kCnJldHVybiBmYWxzZSBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihfX2EsYV9hLGJfYSxjX2EpCmlmCihkYi5zY3JvbGxIYW5kbGVyKF9fYSxhX2EsYl9hLGNfYSkpdGhlbiBsb2NhbCBkX2EsX2FhPV9fYTpnZXRTaXplKClhZD1hZCthX2E7aWYoYWQ8MSl0aGVuIGFkPTEgZW5kCmFkPW1hdGgubWluKGFkLCgKYWM9PSJ2ZXJ0aWNhbCJhbmQgX2FhIG9yIGRfYSktIChiZC0xKSkKX19hOnNldFZhbHVlKF9kLyAoYWM9PSJ2ZXJ0aWNhbCJhbmQgX2FhIG9yIGRfYSkqYWQpX19hOnVwZGF0ZURyYXcoKWVuZCBlbmQsZHJhdz1mdW5jdGlvbihfX2EpCmlmCihkYi5kcmF3KF9fYSkpdGhlbgppZihfX2EucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBhX2EsYl9hPV9fYTpnZXRBbmNob3JQb3NpdGlvbigpCmxvY2FsIGNfYSxkX2E9X19hOmdldFNpemUoKQppZihhYz09Imhvcml6b250YWwiKXRoZW4KX19hLnBhcmVudDp3cml0ZVRleHQoYV9hLGJfYSxkYzpyZXAoYWQtMSksX19hLmJnQ29sb3IsX19hLmZnQ29sb3IpCl9fYS5wYXJlbnQ6d3JpdGVUZXh0KGFfYSthZC0xLGJfYSxiYzpyZXAoYmQpLGNjLGNjKQpfX2EucGFyZW50OndyaXRlVGV4dChhX2ErYWQrYmQtMSxiX2EsZGM6cmVwKGNfYS0gKGFkK2JkLTEpKSxfX2EuYmdDb2xvcixfX2EuZmdDb2xvcillbmQKaWYoYWM9PSJ2ZXJ0aWNhbCIpdGhlbgpmb3Igbj0wLGRfYS0xIGRvCmlmKGFkPT1uKzEpdGhlbgpmb3IgY3VySW5kZXhPZmZzZXQ9MCxtYXRoLm1pbihiZC0xLGRfYSlkbyBfX2EucGFyZW50OndyaXRlVGV4dChhX2EsYl9hK24rCmN1ckluZGV4T2Zmc2V0LGJjLGNjLGNjKWVuZCBlbHNlIGlmKG4rMSA8YWQpb3IobisxID5hZC0xICtiZCl0aGVuCl9fYS5wYXJlbnQ6d3JpdGVUZXh0KGFfYSxiX2ErbixkYyxfX2EuYmdDb2xvcixfX2EuZmdDb2xvcillbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQsaW5pdD1mdW5jdGlvbihfX2EpCl9fYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2NsaWNrIixfX2EpX19hLnBhcmVudDphZGRFdmVudCgibW91c2VfZHJhZyIsX19hKQpfX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9zY3JvbGwiLF9fYSkKaWYoZGIuaW5pdChfX2EpKXRoZW4KX19hLmJnQ29sb3I9X19hLnBhcmVudDpnZXRUaGVtZSgiU2Nyb2xsYmFyQkciKV9fYS5mZ0NvbG9yPV9fYS5wYXJlbnQ6Z2V0VGhlbWUoIlNjcm9sbGJhclRleHQiKQpjYz1fX2EucGFyZW50OmdldFRoZW1lKCJTY3JvbGxiYXJTeW1ib2xDb2xvciIpZW5kIGVuZH1yZXR1cm4gc2V0bWV0YXRhYmxlKGRkLGRiKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiUHJvZ3JhbSJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidEhleCIpCmxvY2FsIGNiPWRhKCJwcm9jZXNzIilsb2NhbCBkYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUw7bG9jYWwgX2M9c3RyaW5nLnN1YgpyZXR1cm4KZnVuY3Rpb24oYWMsYmMpbG9jYWwgY2M9YWIoYWMpCmxvY2FsIGRjPSJQcm9ncmFtImNjOnNldFpJbmRleCg1KWxvY2FsIF9kO2xvY2FsIGFkO2xvY2FsIGJkPXt9CmxvY2FsIGZ1bmN0aW9uIGNkKGJhYSxjYWEsZGFhLF9iYSxhYmEpbG9jYWwgYmJhLGNiYT0xLDEKbG9jYWwgZGJhLF9jYT1jb2xvcnMuYmxhY2ssY29sb3JzLndoaXRlO2xvY2FsIGFjYT1mYWxzZTtsb2NhbCBiY2E9ZmFsc2U7bG9jYWwgY2NhPXt9bG9jYWwgZGNhPXt9bG9jYWwgX2RhPXt9bG9jYWwgYWRhPXt9bG9jYWwgYmRhO2xvY2FsIGNkYT17fWZvciBpPTAsMTUgZG8gbG9jYWwgYWJiPTIgXmkKYWRhW2FiYl09e2JjOmdldEJhc2FsdEluc3RhbmNlKCkuZ2V0QmFzZVRlcm0oKS5nZXRQYWxldHRlQ29sb3VyKGFiYil9ZW5kO2xvY2FsIGZ1bmN0aW9uIGRkYSgpCmJkYT0oIiAiKTpyZXAoZGFhKQpmb3Igbj0wLDE1IGRvIGxvY2FsIGFiYj0yIF5uO2xvY2FsIGJiYj1iYlthYmJdY2RhW2FiYl09YmJiOnJlcChkYWEpZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBfX2IoKWRkYSgpbG9jYWwgYWJiPWJkYQpsb2NhbCBiYmI9Y2RhW2NvbG9ycy53aGl0ZV1sb2NhbCBjYmI9Y2RhW2NvbG9ycy5ibGFja10KZm9yIG49MSxfYmEgZG8KY2NhW25dPV9jKGNjYVtuXT09bmlsIGFuZCBhYmIgb3IgY2NhW25dLi5hYmI6c3ViKDEsCmRhYS1jY2Fbbl06bGVuKCkpLDEsZGFhKQpfZGFbbl09X2MoX2RhW25dPT1uaWwgYW5kIGJiYiBvciBfZGFbbl0uLgpiYmI6c3ViKDEsZGFhLV9kYVtuXTpsZW4oKSksMSxkYWEpCmRjYVtuXT1fYyhkY2Fbbl09PW5pbCBhbmQgY2JiIG9yIGRjYVtuXS4uCmNiYjpzdWIoMSxkYWEtZGNhW25dOmxlbigpKSwxLGRhYSllbmQ7Y2MudXBkYXRlRHJhdyhjYyllbmQ7X19iKClsb2NhbCBmdW5jdGlvbiBhX2IoKWlmCmJiYT49MSBhbmQgY2JhPj0xIGFuZCBiYmE8PWRhYSBhbmQgY2JhPD1fYmEgdGhlbiBlbHNlIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYl9iKGFiYixiYmIsY2JiKQpsb2NhbCBkYmI9YmJhO2xvY2FsIF9jYj1kYmIrI2FiYi0xCmlmIGNiYT49MSBhbmQgY2JhPD1fYmEgdGhlbgppZiBkYmI8PWRhYSBhbmQgX2NiPj0xIHRoZW4KaWYgZGJiPT0xIGFuZCBfY2I9PQpkYWEgdGhlbiBjY2FbY2JhXT1hYmI7X2RhW2NiYV09YmJiO2RjYVtjYmFdPWNiYiBlbHNlIGxvY2FsIGFjYixiY2IsY2NiCmlmIGRiYjwxIHRoZW4gbG9jYWwgX19jPQoxIC1kYmIrMTtsb2NhbCBhX2M9ZGFhLWRiYisxO2FjYj1fYyhhYmIsX19jLGFfYykKYmNiPV9jKGJiYixfX2MsYV9jKWNjYj1fYyhjYmIsX19jLGFfYyllbHNlaWYgX2NiPmRhYSB0aGVuIGxvY2FsIF9fYz1kYWEtZGJiKzE7YWNiPV9jKGFiYiwxLF9fYykKYmNiPV9jKGJiYiwxLF9fYyljY2I9X2MoY2JiLDEsX19jKWVsc2UgYWNiPWFiYjtiY2I9YmJiO2NjYj1jYmIgZW5kO2xvY2FsIGRjYj1jY2FbY2JhXWxvY2FsIF9kYj1fZGFbY2JhXWxvY2FsIGFkYj1kY2FbY2JhXWxvY2FsIGJkYixjZGIsZGRiCmlmIGRiYj4xIHRoZW4gbG9jYWwgX19jPWRiYi0xO2JkYj0KX2MoZGNiLDEsX19jKS4uYWNiO2NkYj1fYyhfZGIsMSxfX2MpLi5iY2IKZGRiPV9jKGFkYiwxLF9fYykuLmNjYiBlbHNlIGJkYj1hY2I7Y2RiPWJjYjtkZGI9Y2NiIGVuZAppZiBfY2I8ZGFhIHRoZW4gbG9jYWwgX19jPV9jYisxO2JkYj1iZGIuLl9jKGRjYixfX2MsZGFhKQpjZGI9Y2RiLi5fYyhfZGIsX19jLGRhYSlkZGI9ZGRiLi5fYyhhZGIsX19jLGRhYSllbmQ7Y2NhW2NiYV09YmRiO19kYVtjYmFdPWNkYjtkY2FbY2JhXT1kZGIgZW5kO19kOnVwZGF0ZURyYXcoKWVuZDtiYmE9X2NiKzE7aWYoYmNhKXRoZW4gYV9iKCllbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBjX2IoYWJiLGJiYixjYmIpCmlmKGNiYn49bmlsKXRoZW4gbG9jYWwgZGJiPWNjYVtiYmJdaWYoZGJifj1uaWwpdGhlbgpjY2FbYmJiXT1fYyhkYmI6c3ViKDEsYWJiLTEpLi5jYmIuLmRiYjpzdWIoYWJiKwooY2JiOmxlbigpKSxkYWEpLDEsZGFhKWVuZCBlbmQ7X2Q6dXBkYXRlRHJhdygpZW5kCmxvY2FsIGZ1bmN0aW9uIGRfYihhYmIsYmJiLGNiYikKaWYoY2Jifj1uaWwpdGhlbiBsb2NhbCBkYmI9ZGNhW2JiYl1pZihkYmJ+PW5pbCl0aGVuCmRjYVtiYmJdPV9jKGRiYjpzdWIoMSxhYmItMSkuLmNiYi4uZGJiOnN1YihhYmIrCihjYmI6bGVuKCkpLGRhYSksMSxkYWEpZW5kIGVuZDtfZDp1cGRhdGVEcmF3KCllbmQKbG9jYWwgZnVuY3Rpb24gX2FiKGFiYixiYmIsY2JiKQppZihjYmJ+PW5pbCl0aGVuIGxvY2FsIGRiYj1fZGFbYmJiXWlmKGRiYn49bmlsKXRoZW4KX2RhW2JiYl09X2MoZGJiOnN1YigxLGFiYi0xKS4uY2JiLi5kYmI6c3ViKGFiYisKKGNiYjpsZW4oKSksZGFhKSwxLGRhYSllbmQgZW5kO19kOnVwZGF0ZURyYXcoKWVuZApsb2NhbCBhYWI9ZnVuY3Rpb24oYWJiKQppZiB0eXBlKGFiYil+PSJudW1iZXIidGhlbgplcnJvcigiYmFkIGFyZ3VtZW50ICMxIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGFiYikuLiIpIiwyKWVsc2VpZiBiYlthYmJdPT1uaWwgdGhlbgplcnJvcigiSW52YWxpZCBjb2xvciAoZ290ICIuLmFiYi4uIikiLDIpZW5kO19jYT1hYmIgZW5kCmxvY2FsIGJhYj1mdW5jdGlvbihhYmIpCmlmIHR5cGUoYWJiKX49Im51bWJlciJ0aGVuCmVycm9yKCJiYWQgYXJndW1lbnQgIzEgKGV4cGVjdGVkIG51bWJlciwgZ290ICIuLnR5cGUoYWJiKS4uIikiLDIpZWxzZWlmIGJiW2FiYl09PW5pbCB0aGVuCmVycm9yKCJJbnZhbGlkIGNvbG9yIChnb3QgIi4uYWJiLi4iKSIsMillbmQ7ZGJhPWFiYiBlbmQKbG9jYWwgY2FiPWZ1bmN0aW9uKGFiYixiYmIsY2JiLGRiYilpZiB0eXBlKGFiYil+PSJudW1iZXIidGhlbgplcnJvcigiYmFkIGFyZ3VtZW50ICMxIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGFiYikuLiIpIiwyKWVuZAppZiBiYlthYmJdPT1uaWwgdGhlbiBlcnJvcigiSW52YWxpZCBjb2xvciAoZ290ICIuLgphYmIuLiIpIiwyKWVuZDtsb2NhbCBfY2IKaWYKdHlwZShiYmIpPT0ibnVtYmVyImFuZCBjYmI9PW5pbCBhbmQgZGJiPT1uaWwgdGhlbiBfY2I9e2NvbG91cnMucmdiOChiYmIpfWFkYVthYmJdPV9jYiBlbHNlIGlmCnR5cGUoYmJiKX49Im51bWJlciJ0aGVuCmVycm9yKCJiYWQgYXJndW1lbnQgIzIgKGV4cGVjdGVkIG51bWJlciwgZ290ICIuLnR5cGUoYmJiKS4uIikiLDIpZW5kO2lmIHR5cGUoY2JiKX49Im51bWJlciJ0aGVuCmVycm9yKAoiYmFkIGFyZ3VtZW50ICMzIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGNiYikuLiIpIiwyKWVuZDtpZiB0eXBlKGRiYil+PSJudW1iZXIidGhlbgplcnJvcigKImJhZCBhcmd1bWVudCAjNCAoZXhwZWN0ZWQgbnVtYmVyLCBnb3QgIi4udHlwZShkYmIpLi4iKSIsMillbmQ7X2NiPWFkYVthYmJdX2NiWzFdPWJiYgpfY2JbMl09Y2JiO19jYlszXT1kYmIgZW5kIGVuZApsb2NhbCBkYWI9ZnVuY3Rpb24oYWJiKWlmIHR5cGUoYWJiKX49Im51bWJlciJ0aGVuCmVycm9yKCJiYWQgYXJndW1lbnQgIzEgKGV4cGVjdGVkIG51bWJlciwgZ290ICIuLnR5cGUoYWJiKS4uIikiLDIpZW5kCmlmIGJiW2FiYl09PW5pbCB0aGVuIGVycm9yKCJJbnZhbGlkIGNvbG9yIChnb3QgIi4uCmFiYi4uIikiLDIpZW5kO2xvY2FsIGJiYj1hZGFbYWJiXXJldHVybiBiYmJbMV0sYmJiWzJdLGJiYlszXWVuZApsb2NhbCBfYmI9e3NldEN1cnNvclBvcz1mdW5jdGlvbihhYmIsYmJiKWlmIHR5cGUoYWJiKX49Im51bWJlciJ0aGVuCmVycm9yKCJiYWQgYXJndW1lbnQgIzEgKGV4cGVjdGVkIG51bWJlciwgZ290ICIuLnR5cGUoYWJiKS4uIikiLDIpZW5kO2lmIHR5cGUoYmJiKX49Im51bWJlciJ0aGVuCmVycm9yKAoiYmFkIGFyZ3VtZW50ICMyIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGJiYikuLiIpIiwyKWVuZDtiYmE9bWF0aC5mbG9vcihhYmIpCmNiYT1tYXRoLmZsb29yKGJiYilpZihiY2EpdGhlbiBhX2IoKWVuZCBlbmQsZ2V0Q3Vyc29yUG9zPWZ1bmN0aW9uKClyZXR1cm4KYmJhLGNiYSBlbmQsc2V0Q3Vyc29yQmxpbms9ZnVuY3Rpb24oYWJiKWlmIHR5cGUoYWJiKX49ImJvb2xlYW4idGhlbgplcnJvcigiYmFkIGFyZ3VtZW50ICMxIChleHBlY3RlZCBib29sZWFuLCBnb3QgIi4uCnR5cGUoYWJiKS4uIikiLDIpZW5kO2FjYT1hYmIgZW5kLGdldEN1cnNvckJsaW5rPWZ1bmN0aW9uKClyZXR1cm4KYWNhIGVuZCxnZXRQYWxldHRlQ29sb3I9ZGFiLGdldFBhbGV0dGVDb2xvdXI9ZGFiLHNldEJhY2tncm91bmRDb2xvcj1iYWIsc2V0QmFja2dyb3VuZENvbG91cj1iYWIsc2V0VGV4dENvbG9yPWFhYixzZXRUZXh0Q29sb3VyPWFhYixzZXRQYWxldHRlQ29sb3I9Y2FiLHNldFBhbGV0dGVDb2xvdXI9Y2FiLGdldEJhY2tncm91bmRDb2xvcj1mdW5jdGlvbigpcmV0dXJuIGRiYSBlbmQsZ2V0QmFja2dyb3VuZENvbG91cj1mdW5jdGlvbigpcmV0dXJuIGRiYSBlbmQsZ2V0U2l6ZT1mdW5jdGlvbigpCnJldHVybiBkYWEsX2JhIGVuZCxnZXRUZXh0Q29sb3I9ZnVuY3Rpb24oKXJldHVybiBfY2EgZW5kLGdldFRleHRDb2xvdXI9ZnVuY3Rpb24oKXJldHVybiBfY2EgZW5kLGJhc2FsdF9yZXNpemU9ZnVuY3Rpb24oYWJiLGJiYilkYWEsX2JhPWFiYixiYmI7X19iKCllbmQsYmFzYWx0X3JlcG9zaXRpb249ZnVuY3Rpb24oYWJiLGJiYikKYmFhLGNhYT1hYmIsYmJiIGVuZCxiYXNhbHRfc2V0VmlzaWJsZT1mdW5jdGlvbihhYmIpYmNhPWFiYiBlbmQsZHJhd0JhY2tncm91bmRCb3g9ZnVuY3Rpb24oYWJiLGJiYixjYmIsZGJiLF9jYilmb3Igbj0xLGRiYiBkbwpkX2IoYWJiLGJiYisgKG4tMSksYmJbX2NiXTpyZXAoY2JiKSllbmQgZW5kLGRyYXdGb3JlZ3JvdW5kQm94PWZ1bmN0aW9uKGFiYixiYmIsY2JiLGRiYixfY2IpCmZvciBuPTEsZGJiIGRvIF9hYihhYmIsCmJiYisgKG4tMSksYmJbX2NiXTpyZXAoY2JiKSllbmQgZW5kLGRyYXdUZXh0Qm94PWZ1bmN0aW9uKGFiYixiYmIsY2JiLGRiYixfY2IpZm9yIG49MSxkYmIgZG8KY19iKGFiYixiYmIrIChuLTEpLF9jYjpyZXAoY2JiKSllbmQgZW5kLHdyaXRlVGV4dD1mdW5jdGlvbihhYmIsYmJiLGNiYixkYmIsX2NiKQpkYmI9ZGJiIG9yIGRiYTtfY2I9X2NiIG9yIF9jYTtjX2IoYmFhLGJiYixjYmIpCmRfYihhYmIsYmJiLGJiW2RiYl06cmVwKGNiYjpsZW4oKSkpX2FiKGFiYixiYmIsYmJbX2NiXTpyZXAoY2JiOmxlbigpKSllbmQsYmFzYWx0X3VwZGF0ZT1mdW5jdGlvbigpCmlmKApiY349bmlsKXRoZW4gZm9yIG49MSxfYmEgZG8gYmM6c2V0VGV4dChiYWEsY2FhKyAobi0xKSxjY2Fbbl0pYmM6c2V0QkcoYmFhLGNhYSsKKG4tMSksZGNhW25dKQpiYzpzZXRGRyhiYWEsY2FhKyAobi0xKSxfZGFbbl0pZW5kIGVuZCBlbmQsc2Nyb2xsPWZ1bmN0aW9uKGFiYilpZgp0eXBlKGFiYil+PSJudW1iZXIidGhlbgplcnJvcigiYmFkIGFyZ3VtZW50ICMxIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGFiYikuLiIpIiwyKWVuZAppZiBhYmJ+PTAgdGhlbiBsb2NhbCBiYmI9YmRhCmxvY2FsIGNiYj1jZGFbX2NhXWxvY2FsIGRiYj1jZGFbZGJhXQpmb3IgbmV3WT0xLF9iYSBkbyBsb2NhbCBfY2I9bmV3WSthYmIKaWYgX2NiPj0xIGFuZCBfY2I8PV9iYSB0aGVuCmNjYVtuZXdZXT1jY2FbX2NiXWRjYVtuZXdZXT1kY2FbX2NiXV9kYVtuZXdZXT1fZGFbX2NiXWVsc2UgY2NhW25ld1ldPWJiYgpfZGFbbmV3WV09Y2JiO2RjYVtuZXdZXT1kYmIgZW5kIGVuZCBlbmQ7aWYoYmNhKXRoZW4gYV9iKCllbmQgZW5kLGlzQ29sb3I9ZnVuY3Rpb24oKXJldHVybgpiYzpnZXRCYXNhbHRJbnN0YW5jZSgpLmdldEJhc2VUZXJtKCkuaXNDb2xvcigpZW5kLGlzQ29sb3VyPWZ1bmN0aW9uKClyZXR1cm4KYmM6Z2V0QmFzYWx0SW5zdGFuY2UoKS5nZXRCYXNlVGVybSgpLmlzQ29sb3IoKWVuZCx3cml0ZT1mdW5jdGlvbihhYmIpCmFiYj10b3N0cmluZyhhYmIpaWYoYmNhKXRoZW4KYl9iKGFiYixiYltfY2FdOnJlcChhYmI6bGVuKCkpLGJiW2RiYV06cmVwKGFiYjpsZW4oKSkpZW5kIGVuZCxjbGVhckxpbmU9ZnVuY3Rpb24oKQppZgooYmNhKXRoZW4gY19iKDEsY2JhLCgiICIpOnJlcChkYWEpKQpkX2IoMSxjYmEsYmJbZGJhXTpyZXAoZGFhKSlfYWIoMSxjYmEsYmJbX2NhXTpyZXAoZGFhKSllbmQ7aWYoYmNhKXRoZW4gYV9iKCllbmQgZW5kLGNsZWFyPWZ1bmN0aW9uKCkKZm9yIG49MSxfYmEKZG8gY19iKDEsbiwoIiAiKTpyZXAoZGFhKSkKZF9iKDEsbixiYltkYmFdOnJlcChkYWEpKV9hYigxLG4sYmJbX2NhXTpyZXAoZGFhKSllbmQ7aWYoYmNhKXRoZW4gYV9iKCllbmQgZW5kLGJsaXQ9ZnVuY3Rpb24oYWJiLGJiYixjYmIpaWYKdHlwZShhYmIpfj0ic3RyaW5nInRoZW4KZXJyb3IoImJhZCBhcmd1bWVudCAjMSAoZXhwZWN0ZWQgc3RyaW5nLCBnb3QgIi4udHlwZShhYmIpLi4iKSIsMillbmQ7aWYgdHlwZShiYmIpfj0ic3RyaW5nInRoZW4KZXJyb3IoCiJiYWQgYXJndW1lbnQgIzIgKGV4cGVjdGVkIHN0cmluZywgZ290ICIuLnR5cGUoYmJiKS4uIikiLDIpZW5kO2lmIHR5cGUoY2JiKX49InN0cmluZyJ0aGVuCmVycm9yKAoiYmFkIGFyZ3VtZW50ICMzIChleHBlY3RlZCBzdHJpbmcsIGdvdCAiLi50eXBlKGNiYikuLiIpIiwyKWVuZAppZgojYmJifj0jYWJiIG9yI2NiYn49I2FiYiB0aGVuIGVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGgiLDIpZW5kO2lmKGJjYSl0aGVuIGJfYihhYmIsYmJiLGNiYillbmQgZW5kfXJldHVybiBfYmIgZW5kO2NjLndpZHRoPTMwO2NjLmhlaWdodD0xMjtsb2NhbCBkZD1jZCgxLDEsY2Mud2lkdGgsY2MuaGVpZ2h0KWxvY2FsIF9fYQpsb2NhbCBhX2E9ZmFsc2U7bG9jYWwgYl9hPXt9CmxvY2FsIGZ1bmN0aW9uIGNfYShiYWEpbG9jYWwgY2FhLGRhYT1kZC5nZXRDdXJzb3JQb3MoKQpsb2NhbCBfYmEsYWJhPWJhYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgYmJhLGNiYT1iYWE6Z2V0U2l6ZSgpCmlmKF9iYStjYWEtMSA+PTEgYW5kCl9iYStjYWEtMSA8PV9iYStiYmEtMSBhbmQgZGFhK2FiYS0xID49MSBhbmQKZGFhK2FiYS0xIDw9YWJhK2NiYS0xKXRoZW4KYmFhLnBhcmVudDpzZXRDdXJzb3IoCmJhYTppc0ZvY3VzZWQoKWFuZCBkZC5nZXRDdXJzb3JCbGluaygpLF9iYStjYWEtMSxkYWErYWJhLTEsZGQuZ2V0VGV4dENvbG9yKCkpZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBkX2EoYmFhLGNhYSwuLi4pbG9jYWwgZGFhLF9iYT1fX2E6cmVzdW1lKGNhYSwuLi4pCmlmKGRhYT09ZmFsc2UpYW5kKF9iYX49bmlsKWFuZAooX2Jhfj0iVGVybWluYXRlZCIpdGhlbgpsb2NhbCBhYmE9YmFhOnNlbmRFdmVudCgicHJvZ3JhbV9lcnJvciIsX2JhKQppZihhYmF+PWZhbHNlKXRoZW4gZXJyb3IoIkJhc2FsdCBQcm9ncmFtIC0gIi4uX2JhKWVuZCBlbmQKaWYoX19hOmdldFN0YXR1cygpPT0iZGVhZCIpdGhlbiBiYWE6c2VuZEV2ZW50KCJwcm9ncmFtX2RvbmUiKWVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gX2FhKGJhYSxjYWEsZGFhLF9iYSxhYmEpaWYoX19hPT1uaWwpdGhlbiByZXR1cm4gZmFsc2UgZW5kCmlmIG5vdChfX2E6aXNEZWFkKCkpdGhlbiBpZiBub3QoYV9hKXRoZW4KbG9jYWwgYmJhLGNiYT1iYWE6Z2V0QWJzb2x1dGVQb3NpdGlvbihiYWE6Z2V0QW5jaG9yUG9zaXRpb24oCm5pbCxuaWwsdHJ1ZSkpZF9hKGJhYSxjYWEsZGFhLF9iYS1iYmErMSxhYmEtY2JhKzEpCmNfYShiYWEpZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYWFhKGJhYSxjYWEsZGFhLF9iYSlpZihfX2E9PW5pbCl0aGVuIHJldHVybiBmYWxzZSBlbmQKaWYgbm90KF9fYTppc0RlYWQoKSl0aGVuIGlmIG5vdChhX2EpdGhlbiBpZihiYWEuZHJhdyl0aGVuCmRfYShiYWEsY2FhLGRhYSxfYmEpY19hKGJhYSllbmQgZW5kIGVuZCBlbmQKX2Q9e2dldFR5cGU9ZnVuY3Rpb24oYmFhKXJldHVybiBkYyBlbmQsc2hvdz1mdW5jdGlvbihiYWEpY2Muc2hvdyhiYWEpCmRkLnNldEJhY2tncm91bmRDb2xvcihiYWEuYmdDb2xvcilkZC5zZXRUZXh0Q29sb3IoYmFhLmZnQ29sb3IpCmRkLmJhc2FsdF9zZXRWaXNpYmxlKHRydWUpcmV0dXJuIGJhYSBlbmQsaGlkZT1mdW5jdGlvbihiYWEpCmNjLmhpZGUoYmFhKWRkLmJhc2FsdF9zZXRWaXNpYmxlKGZhbHNlKXJldHVybiBiYWEgZW5kLHNldFBvc2l0aW9uPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSkKY2Muc2V0UG9zaXRpb24oYmFhLGNhYSxkYWEsX2JhKQpkZC5iYXNhbHRfcmVwb3NpdGlvbihiYWE6Z2V0QW5jaG9yUG9zaXRpb24oKSlyZXR1cm4gYmFhIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYmFhLGNhYSkKY2Muc2V0VmFsdWVzQnlYTUxEYXRhKGJhYSxjYWEpaWYoZGIoInBhdGgiLGNhYSl+PW5pbCl0aGVuIGFkPWRiKCJwYXRoIixjYWEpZW5kCmlmKApkYigiZXhlY3V0ZSIsY2FhKX49bmlsKXRoZW4gaWYoZGIoImV4ZWN1dGUiLGNhYSkpdGhlbgppZihhZH49bmlsKXRoZW4gYmFhOmV4ZWN1dGUoYWQpZW5kIGVuZCBlbmQgZW5kLGdldEJhc2FsdFdpbmRvdz1mdW5jdGlvbigpcmV0dXJuCmRkIGVuZCxnZXRCYXNhbHRQcm9jZXNzPWZ1bmN0aW9uKClyZXR1cm4gX19hIGVuZCxzZXRTaXplPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSljYy5zZXRTaXplKGJhYSxjYWEsZGFhLF9iYSkKZGQuYmFzYWx0X3Jlc2l6ZShiYWE6Z2V0V2lkdGgoKSxiYWE6Z2V0SGVpZ2h0KCkpcmV0dXJuIGJhYSBlbmQsZ2V0U3RhdHVzPWZ1bmN0aW9uKGJhYSlpZihfX2F+PW5pbCl0aGVuIHJldHVybgpfX2E6Z2V0U3RhdHVzKCllbmQ7cmV0dXJuImluYWN0aXZlImVuZCxzZXRFbnZpcm9tZW50PWZ1bmN0aW9uKGJhYSxjYWEpYmQ9CmNhYSBvcnt9cmV0dXJuIGJhYSBlbmQsZXhlY3V0ZT1mdW5jdGlvbihiYWEsY2FhLC4uLilhZD1jYWEgb3IgYWQKX19hPWNiOm5ldyhhZCxkZCxiZCwuLi4pZGQuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9ycy5ibGFjaykKZGQuc2V0VGV4dENvbG9yKGNvbG9ycy53aGl0ZSlkZC5jbGVhcigpZGQuc2V0Q3Vyc29yUG9zKDEsMSkKZGQuc2V0QmFja2dyb3VuZENvbG9yKGJhYS5iZ0NvbG9yKWRkLnNldFRleHRDb2xvcihiYWEuZmdDb2xvcikKZGQuYmFzYWx0X3NldFZpc2libGUodHJ1ZSlkX2EoYmFhKWFfYT1mYWxzZQppZihiYWEucGFyZW50fj1uaWwpdGhlbgpiYWEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsYmFhKWJhYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3VwIixiYWEpCmJhYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2RyYWciLGJhYSliYWEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9zY3JvbGwiLGJhYSkKYmFhLnBhcmVudDphZGRFdmVudCgia2V5IixiYWEpYmFhLnBhcmVudDphZGRFdmVudCgia2V5X3VwIixiYWEpCmJhYS5wYXJlbnQ6YWRkRXZlbnQoImNoYXIiLGJhYSliYWEucGFyZW50OmFkZEV2ZW50KCJvdGhlcl9ldmVudCIsYmFhKWVuZDtyZXR1cm4gYmFhIGVuZCxzdG9wPWZ1bmN0aW9uKGJhYSkKaWYoCl9fYX49bmlsKXRoZW4KaWYgbm90KF9fYTppc0RlYWQoKSl0aGVuIGRfYShiYWEsInRlcm1pbmF0ZSIpaWYoX19hOmlzRGVhZCgpKXRoZW4KaWYoCmJhYS5wYXJlbnR+PW5pbCl0aGVuIGJhYS5wYXJlbnQ6c2V0Q3Vyc29yKGZhbHNlKWVuZCBlbmQgZW5kIGVuZDtiYWEucGFyZW50OnJlbW92ZUV2ZW50cyhiYWEpcmV0dXJuIGJhYSBlbmQscGF1c2U9ZnVuY3Rpb24oYmFhLGNhYSlhX2E9CmNhYSBvcihub3QgYV9hKQppZihfX2F+PW5pbCl0aGVuIGlmIG5vdChfX2E6aXNEZWFkKCkpdGhlbiBpZiBub3QoYV9hKXRoZW4KYmFhOmluamVjdEV2ZW50cyhiX2EpYl9hPXt9ZW5kIGVuZCBlbmQ7cmV0dXJuIGJhYSBlbmQsaXNQYXVzZWQ9ZnVuY3Rpb24oYmFhKXJldHVybgphX2EgZW5kLGluamVjdEV2ZW50PWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSxhYmEsYmJhLGNiYSkKaWYoX19hfj1uaWwpdGhlbgppZiBub3QoX19hOmlzRGVhZCgpKXRoZW4gaWYoYV9hPT1mYWxzZSlvcihjYmEpdGhlbgpkX2EoYmFhLGNhYSxkYWEsX2JhLGFiYSxiYmEpZWxzZQp0YWJsZS5pbnNlcnQoYl9hLHtldmVudD1jYWEsYXJncz17ZGFhLF9iYSxhYmEsYmJhfX0pZW5kIGVuZCBlbmQ7cmV0dXJuIGJhYSBlbmQsZ2V0UXVldWVkRXZlbnRzPWZ1bmN0aW9uKGJhYSlyZXR1cm4KYl9hIGVuZCx1cGRhdGVRdWV1ZWRFdmVudHM9ZnVuY3Rpb24oYmFhLGNhYSliX2E9Y2FhIG9yIGJfYTtyZXR1cm4gYmFhIGVuZCxpbmplY3RFdmVudHM9ZnVuY3Rpb24oYmFhLGNhYSlpZihfX2F+PW5pbCl0aGVuCmlmIG5vdAooX19hOmlzRGVhZCgpKXRoZW4gZm9yIGRhYSxfYmEgaW4gcGFpcnMoY2FhKWRvCmRfYShiYWEsX2JhLmV2ZW50LHRhYmxlLnVucGFjayhfYmEuYXJncykpZW5kIGVuZCBlbmQ7cmV0dXJuIGJhYSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSkKaWYKKGNjLm1vdXNlSGFuZGxlcihiYWEsY2FhLGRhYSxfYmEpKXRoZW4gX2FhKGJhYSwibW91c2VfY2xpY2siLGNhYSxkYWEsX2JhKXJldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLG1vdXNlVXBIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSkKaWYKKGNjLm1vdXNlVXBIYW5kbGVyKGJhYSxjYWEsZGFhLF9iYSkpdGhlbiBfYWEoYmFhLCJtb3VzZV91cCIsY2FhLGRhYSxfYmEpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihiYWEsY2FhLGRhYSxfYmEpCmlmCihjYy5zY3JvbGxIYW5kbGVyKGJhYSxjYWEsZGFhLF9iYSkpdGhlbiBfYWEoYmFhLCJtb3VzZV9zY3JvbGwiLGNhYSxkYWEsX2JhKXJldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGRyYWdIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSkKaWYKKGNjLmRyYWdIYW5kbGVyKGJhYSxjYWEsZGFhLF9iYSkpdGhlbiBfYWEoYmFhLCJtb3VzZV9kcmFnIixjYWEsZGFhLF9iYSlyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxrZXlIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsZGFhKWlmCihjYy5rZXlIYW5kbGVyKGJhYSxjYWEsZGFhKSl0aGVuIGFhYShiYWEsImtleSIsY2FhLGRhYSlyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuCmZhbHNlIGVuZCxrZXlVcEhhbmRsZXI9ZnVuY3Rpb24oYmFhLGNhYSlpZgooY2Mua2V5VXBIYW5kbGVyKGJhYSxjYWEpKXRoZW4gYWFhKGJhYSwia2V5X3VwIixjYWEpcmV0dXJuIHRydWUgZW5kCnJldHVybiBmYWxzZSBlbmQsY2hhckhhbmRsZXI9ZnVuY3Rpb24oYmFhLGNhYSlpZgooY2MuY2hhckhhbmRsZXIoYmFhLGNhYSkpdGhlbiBhYWEoYmFhLCJjaGFyIixjYWEpcmV0dXJuIHRydWUgZW5kCnJldHVybiBmYWxzZSBlbmQsZ2V0Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGJhYSkKY2MuZ2V0Rm9jdXNIYW5kbGVyKGJhYSkKaWYoX19hfj1uaWwpdGhlbgppZiBub3QoX19hOmlzRGVhZCgpKXRoZW4KaWYgbm90KGFfYSl0aGVuCmlmKGJhYS5wYXJlbnR+PW5pbCl0aGVuCmxvY2FsIGNhYSxkYWE9ZGQuZ2V0Q3Vyc29yUG9zKClsb2NhbCBfYmEsYWJhPWJhYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgYmJhLGNiYT1iYWE6Z2V0U2l6ZSgpCmlmCigKX2JhK2NhYS0xID49MSBhbmQgX2JhK2NhYS0xIDw9X2JhK2JiYS0xIGFuZApkYWErYWJhLTEgPj0xIGFuZCBkYWErYWJhLTEgPD1hYmErY2JhLTEpdGhlbgpiYWEucGFyZW50OnNldEN1cnNvcihkZC5nZXRDdXJzb3JCbGluaygpLF9iYStjYWEtMSxkYWErYWJhLTEsZGQuZ2V0VGV4dENvbG9yKCkpZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQsbG9zZUZvY3VzSGFuZGxlcj1mdW5jdGlvbihiYWEpCmNjLmxvc2VGb2N1c0hhbmRsZXIoYmFhKQppZihfX2F+PW5pbCl0aGVuIGlmIG5vdChfX2E6aXNEZWFkKCkpdGhlbiBpZihiYWEucGFyZW50fj1uaWwpdGhlbgpiYWEucGFyZW50OnNldEN1cnNvcihmYWxzZSllbmQgZW5kIGVuZCBlbmQsY3VzdG9tRXZlbnRIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsLi4uKQpjYy5jdXN0b21FdmVudEhhbmRsZXIoYmFhLGNhYSwuLi4paWYoX19hPT1uaWwpdGhlbiByZXR1cm4gZW5kCmlmKGNhYT09ImJhc2FsdF9yZXNpemUiKXRoZW4gbG9jYWwgZGFhLF9iYT1kZC5nZXRTaXplKCkKbG9jYWwgYWJhLGJiYT1iYWE6Z2V0U2l6ZSgpCmlmKGRhYX49YWJhKW9yKF9iYX49YmJhKXRoZW4gZGQuYmFzYWx0X3Jlc2l6ZShhYmEsYmJhKWlmIG5vdAooX19hOmlzRGVhZCgpKXRoZW4gZF9hKGJhYSwidGVybV9yZXNpemUiKWVuZCBlbmQKZGQuYmFzYWx0X3JlcG9zaXRpb24oYmFhOmdldEFuY2hvclBvc2l0aW9uKCkpZW5kIGVuZCxldmVudEhhbmRsZXI9ZnVuY3Rpb24oYmFhLGNhYSxkYWEsX2JhLGFiYSxiYmEpCmNjLmV2ZW50SGFuZGxlcihiYWEsY2FhLGRhYSxfYmEsYWJhLGJiYSlpZihfX2E9PW5pbCl0aGVuIHJldHVybiBlbmQKaWYgbm90KF9fYTppc0RlYWQoKSl0aGVuCmlmIG5vdChhX2EpdGhlbiBpZihjYWF+PSJ0ZXJtaW5hdGUiKXRoZW4KZF9hKGJhYSxjYWEsZGFhLF9iYSxhYmEsYmJhKWVuZAppZihiYWE6aXNGb2N1c2VkKCkpdGhlbgpsb2NhbCBjYmEsZGJhPWJhYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgX2NhLGFjYT1kZC5nZXRDdXJzb3JQb3MoKQppZihiYWEucGFyZW50fj1uaWwpdGhlbgpsb2NhbCBiY2EsY2NhPWJhYTpnZXRTaXplKCkKaWYKKGNiYStfY2EtMSA+PTEgYW5kIGNiYStfY2EtMSA8PWNiYStiY2EtMSBhbmQKYWNhK2RiYS0xID49MSBhbmQgYWNhK2RiYS0xIDw9ZGJhK2NjYS0xKXRoZW4KYmFhLnBhcmVudDpzZXRDdXJzb3IoZGQuZ2V0Q3Vyc29yQmxpbmsoKSxjYmErX2NhLTEsYWNhK2RiYS0xLGRkLmdldFRleHRDb2xvcigpKWVuZCBlbmQ7aWYoY2FhPT0idGVybWluYXRlIil0aGVuIGRfYShiYWEsY2FhKQpiYWEucGFyZW50OnNldEN1cnNvcihmYWxzZSlyZXR1cm4gdHJ1ZSBlbmQgZW5kIGVsc2UKdGFibGUuaW5zZXJ0KGJfYSx7ZXZlbnQ9Y2FhLGFyZ3M9e2RhYSxfYmEsYWJhLGJiYX19KWVuZCBlbmQgZW5kLGRyYXc9ZnVuY3Rpb24oYmFhKQppZgooY2MuZHJhdyhiYWEpKXRoZW4KaWYoYmFhLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgY2FhLGRhYT1iYWE6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBfYmEsYWJhPWRkLmdldEN1cnNvclBvcygpbG9jYWwgYmJhLGNiYT1iYWE6Z2V0U2l6ZSgpZGQuYmFzYWx0X3JlcG9zaXRpb24oY2FhLGRhYSkKZGQuYmFzYWx0X3VwZGF0ZSgpCmlmCihjYWErX2JhLTEgPj0xIGFuZCBjYWErX2JhLTEgPD1jYWErYmJhLTEgYW5kCmFiYStkYWEtMSA+PTEgYW5kIGFiYStkYWEtMSA8PWRhYStjYmEtMSl0aGVuCmJhYS5wYXJlbnQ6c2V0Q3Vyc29yKGJhYTppc0ZvY3VzZWQoKWFuZCBkZC5nZXRDdXJzb3JCbGluaygpLApjYWErX2JhLTEsYWJhK2RhYS0xLGRkLmdldFRleHRDb2xvcigpKWVuZCBlbmQgZW5kIGVuZCxvbkVycm9yPWZ1bmN0aW9uKGJhYSwuLi4pCmZvciBjYWEsZGFhIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKGRhYSk9PSJmdW5jdGlvbiIpdGhlbgpiYWE6cmVnaXN0ZXJFdmVudCgicHJvZ3JhbV9lcnJvciIsZGFhKWVuZCBlbmQ7aWYoYmFhLnBhcmVudH49bmlsKXRoZW4KYmFhLnBhcmVudDphZGRFdmVudCgib3RoZXJfZXZlbnQiLGJhYSllbmQ7cmV0dXJuIGJhYSBlbmQsb25Eb25lPWZ1bmN0aW9uKGJhYSwuLi4pCmZvciBjYWEsZGFhIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKGRhYSk9PSJmdW5jdGlvbiIpdGhlbgpiYWE6cmVnaXN0ZXJFdmVudCgicHJvZ3JhbV9kb25lIixkYWEpZW5kIGVuZDtpZihiYWEucGFyZW50fj1uaWwpdGhlbgpiYWEucGFyZW50OmFkZEV2ZW50KCJvdGhlcl9ldmVudCIsYmFhKWVuZDtyZXR1cm4gYmFhIGVuZCxpbml0PWZ1bmN0aW9uKGJhYSkKaWYKKGNjLmluaXQoYmFhKSl0aGVuIGJhYS5iZ0NvbG9yPWJhYS5wYXJlbnQ6Z2V0VGhlbWUoIlByb2dyYW1CRyIpZW5kIGVuZH1yZXR1cm4gc2V0bWV0YXRhYmxlKF9kLGNjKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiU3dpdGNoIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKQpsb2NhbCBiYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGNiKWxvY2FsIGRiPWFiKGNiKWxvY2FsIF9jPSJTd2l0Y2giZGIud2lkdGg9MjtkYi5oZWlnaHQ9MQpkYi5iZ0NvbG9yPWNvbG9ycy5saWdodEdyYXk7ZGIuZmdDb2xvcj1jb2xvcnMuZ3JheTtkYjpzZXRWYWx1ZShmYWxzZSlkYjpzZXRaSW5kZXgoNSkKbG9jYWwgYWM9Y29sb3JzLmJsYWNrO2xvY2FsIGJjPWNvbG9ycy5yZWQ7bG9jYWwgY2M9Y29sb3JzLmdyZWVuCmxvY2FsIGRjPXtnZXRUeXBlPWZ1bmN0aW9uKF9kKXJldHVybiBfYyBlbmQsc2V0U3ltYm9sQ29sb3I9ZnVuY3Rpb24oX2QsYWQpYWM9YWQKX2Q6dXBkYXRlRHJhdygpcmV0dXJuIF9kIGVuZCxzZXRBY3RpdmVCYWNrZ3JvdW5kPWZ1bmN0aW9uKF9kLGFkKWNjPWFkO19kOnVwZGF0ZURyYXcoKXJldHVybiBfZCBlbmQsc2V0SW5hY3RpdmVCYWNrZ3JvdW5kPWZ1bmN0aW9uKF9kLGFkKQpiYz1hZDtfZDp1cGRhdGVEcmF3KClyZXR1cm4gX2QgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihfZCxhZCkKZGIuc2V0VmFsdWVzQnlYTUxEYXRhKF9kLGFkKWlmKGJiKCJpbmFjdGl2ZUJHIixhZCl+PW5pbCl0aGVuCmJjPWNvbG9yc1tiYigiaW5hY3RpdmVCRyIsYWQpXWVuZDtpZihiYigiYWN0aXZlQkciLGFkKX49bmlsKXRoZW4KY2M9Y29sb3JzW2JiKCJhY3RpdmVCRyIsYWQpXWVuZDtpZihiYigic3ltYm9sQ29sb3IiLGFkKX49bmlsKXRoZW4KYWM9Y29sb3JzW2JiKCJzeW1ib2xDb2xvciIsYWQpXWVuZCBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKF9kLGFkLGJkLGNkKQppZgooZGIubW91c2VIYW5kbGVyKF9kLGFkLGJkLGNkKSl0aGVuCmxvY2FsIGRkLF9fYT1fZDpnZXRBYnNvbHV0ZVBvc2l0aW9uKF9kOmdldEFuY2hvclBvc2l0aW9uKCkpX2Q6c2V0VmFsdWUobm90IF9kOmdldFZhbHVlKCkpCl9kOnVwZGF0ZURyYXcoKXJldHVybiB0cnVlIGVuZCBlbmQsZHJhdz1mdW5jdGlvbihfZCkKaWYKKGRiLmRyYXcoX2QpKXRoZW4KaWYoX2QucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBhZCxiZD1fZDpnZXRBbmNob3JQb3NpdGlvbigpCmxvY2FsIGNkLGRkPV9kOmdldFNpemUoKQpfZC5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goYWQsYmQsY2QsZGQsX2QuYmdDb2xvcikKaWYoX2Q6Z2V0VmFsdWUoKSl0aGVuCl9kLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChhZCxiZCwxLGRkLGNjKV9kLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChhZCsxLGJkLDEsZGQsYWMpZWxzZQpfZC5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goYWQsYmQsMSxkZCxhYylfZC5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goYWQrMSxiZCwxLGRkLGJjKWVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKF9kKQpfZC5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2NsaWNrIixfZCkKaWYoZGIuaW5pdChfZCkpdGhlbiBfZC5iZ0NvbG9yPV9kLnBhcmVudDpnZXRUaGVtZSgiU3dpdGNoQkciKQpfZC5mZ0NvbG9yPV9kLnBhcmVudDpnZXRUaGVtZSgiU3dpdGNoVGV4dCIpYWM9X2QucGFyZW50OmdldFRoZW1lKCJTd2l0Y2hCR1N5bWJvbCIpCmJjPV9kLnBhcmVudDpnZXRUaGVtZSgiU3dpdGNoSW5hY3RpdmUiKWNjPV9kLnBhcmVudDpnZXRUaGVtZSgiU3dpdGNoQWN0aXZlIillbmQgZW5kfXJldHVybiBzZXRtZXRhdGFibGUoZGMsZGIpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJTbGlkZXIiXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoIk9iamVjdCIpCmxvY2FsIGJiPWRhKCJiYXNhbHRMb2dzIilsb2NhbCBjYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGRiKWxvY2FsIF9jPWFiKGRiKWxvY2FsIGFjPSJTbGlkZXIiCl9jLndpZHRoPTg7X2MuaGVpZ2h0PTE7X2M6c2V0VmFsdWUoMSlsb2NhbCBiYz0iaG9yaXpvbnRhbCJsb2NhbCBjYz0iICJsb2NhbCBkYztsb2NhbCBfZD0iXDE0MCIKbG9jYWwgYWQ9X2Mud2lkdGg7bG9jYWwgYmQ9MTtsb2NhbCBjZD0xCmxvY2FsIGZ1bmN0aW9uIGRkKGFfYSxiX2EsY19hLGRfYSkKbG9jYWwgX2FhLGFhYT1hX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihhX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSlsb2NhbCBiYWEsY2FhPWFfYTpnZXRTaXplKCkKaWYoYmM9PSJob3Jpem9udGFsIil0aGVuCmZvciBfaW5kZXg9MCxiYWEgZG8KaWYKKF9hYStfaW5kZXg9PWNfYSlhbmQoYWFhPD1kX2EpYW5kKGFhYStjYWE+ZF9hKXRoZW4KYmQ9bWF0aC5taW4oX2luZGV4KzEsYmFhLSAoY2QtMSkpYV9hOnNldFZhbHVlKGFkL2JhYSogKGJkKSlhX2E6dXBkYXRlRHJhdygpZW5kIGVuZCBlbmQKaWYoYmM9PSJ2ZXJ0aWNhbCIpdGhlbgpmb3IgX2luZGV4PTAsY2FhIGRvCmlmCihhYWErX2luZGV4PT1kX2EpYW5kKF9hYTw9Y19hKWFuZChfYWErYmFhPmNfYSl0aGVuIGJkPW1hdGgubWluKF9pbmRleCsxLGNhYS0gKGNkLTEpKQphX2E6c2V0VmFsdWUoYWQvY2FhKiAoYmQpKWFfYTp1cGRhdGVEcmF3KCllbmQgZW5kIGVuZCBlbmQKbG9jYWwgX19hPXtnZXRUeXBlPWZ1bmN0aW9uKGFfYSlyZXR1cm4gYWMgZW5kLHNldFN5bWJvbD1mdW5jdGlvbihhX2EsYl9hKWNjPWJfYTpzdWIoMSwxKWFfYTp1cGRhdGVEcmF3KClyZXR1cm4gYV9hIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYV9hLGJfYSkKX2Muc2V0VmFsdWVzQnlYTUxEYXRhKGFfYSxiX2EpCmlmKGNiKCJtYXhWYWx1ZSIsYl9hKX49bmlsKXRoZW4gYWQ9Y2IoIm1heFZhbHVlIixiX2EpZW5kO2lmKGNiKCJiYWNrZ3JvdW5kU3ltYm9sIixiX2Epfj1uaWwpdGhlbgpfZD1jYigiYmFja2dyb3VuZFN5bWJvbCIsYl9hKTpzdWIoMSwxKWVuZDtpZihjYigiYmFyVHlwZSIsYl9hKX49bmlsKXRoZW4KYmM9Y2IoImJhclR5cGUiLGJfYSk6bG93ZXIoKWVuZDtpZihjYigic3ltYm9sIixiX2Epfj1uaWwpdGhlbgpjYz1jYigic3ltYm9sIixiX2EpOnN1YigxLDEpZW5kO2lmKGNiKCJzeW1ib2xTaXplIixiX2Epfj1uaWwpdGhlbgphX2E6c2V0U3ltYm9sU2l6ZShjYigic3ltYm9sU2l6ZSIsYl9hKSllbmQ7aWYoY2IoInN5bWJvbENvbG9yIixiX2Epfj1uaWwpdGhlbgpkYz1jb2xvcnNbY2IoInN5bWJvbENvbG9yIixiX2EpXWVuZDtpZihjYigiaW5kZXgiLGJfYSl+PW5pbCl0aGVuCmFfYTpzZXRJbmRleChjYigiaW5kZXgiLGJfYSkpZW5kIGVuZCxzZXRJbmRleD1mdW5jdGlvbihhX2EsYl9hKQpiZD1iX2E7aWYoYmQ8MSl0aGVuIGJkPTEgZW5kO2xvY2FsIGNfYSxkX2E9YV9hOmdldFNpemUoKQpiZD1tYXRoLm1pbihiZCwoCmJjPT0idmVydGljYWwiYW5kIGRfYSBvciBjX2EpLSAoY2QtMSkpCmFfYTpzZXRWYWx1ZShhZC8gKGJjPT0idmVydGljYWwiYW5kIGRfYSBvciBjX2EpKmJkKWFfYTp1cGRhdGVEcmF3KClyZXR1cm4gYV9hIGVuZCxnZXRJbmRleD1mdW5jdGlvbihhX2EpcmV0dXJuCmJkIGVuZCxzZXRTeW1ib2xTaXplPWZ1bmN0aW9uKGFfYSxiX2EpY2Q9dG9udW1iZXIoYl9hKW9yIDEKaWYoYmM9PSJ2ZXJ0aWNhbCIpdGhlbgphX2E6c2V0VmFsdWUoYmQtMSAqIChhZC8gKGgtIChjZC0KMSkpKS0gKGFkLyAoaC0gKGNkLTEpKSkpZWxzZWlmKGJjPT0iaG9yaXpvbnRhbCIpdGhlbgphX2E6c2V0VmFsdWUoYmQtMSAqIChhZC8gKHctIChjZC0xKSkpLSAoYWQvCih3LSAoY2QtMSkpKSllbmQ7YV9hOnVwZGF0ZURyYXcoKXJldHVybiBhX2EgZW5kLHNldE1heFZhbHVlPWZ1bmN0aW9uKGFfYSxiX2EpCmFkPWJfYTtyZXR1cm4gYV9hIGVuZCxzZXRCYWNrZ3JvdW5kU3ltYm9sPWZ1bmN0aW9uKGFfYSxiX2EpX2Q9c3RyaW5nLnN1YihiX2EsMSwxKQphX2E6dXBkYXRlRHJhdygpcmV0dXJuIGFfYSBlbmQsc2V0U3ltYm9sQ29sb3I9ZnVuY3Rpb24oYV9hLGJfYSlkYz1iX2E7YV9hOnVwZGF0ZURyYXcoKQpyZXR1cm4gYV9hIGVuZCxzZXRCYXJUeXBlPWZ1bmN0aW9uKGFfYSxiX2EpYmM9Yl9hOmxvd2VyKClhX2E6dXBkYXRlRHJhdygpCnJldHVybiBhX2EgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihhX2EsYl9hLGNfYSxkX2EpaWYoX2MubW91c2VIYW5kbGVyKGFfYSxiX2EsY19hLGRfYSkpdGhlbgpkZChhX2EsYl9hLGNfYSxkX2EpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsZHJhZ0hhbmRsZXI9ZnVuY3Rpb24oYV9hLGJfYSxjX2EsZF9hKWlmCihfYy5kcmFnSGFuZGxlcihhX2EsYl9hLGNfYSxkX2EpKXRoZW4gZGQoYV9hLGJfYSxjX2EsZF9hKXJldHVybiB0cnVlIGVuZApyZXR1cm4gZmFsc2UgZW5kLHNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oYV9hLGJfYSxjX2EsZF9hKQppZgooX2Muc2Nyb2xsSGFuZGxlcihhX2EsYl9hLGNfYSxkX2EpKXRoZW4gbG9jYWwgX2FhLGFhYT1hX2E6Z2V0U2l6ZSgpYmQ9YmQrYl9hO2lmKGJkPDEpdGhlbiBiZD0xIGVuZApiZD1tYXRoLm1pbihiZCwoCmJjPT0idmVydGljYWwiYW5kIGFhYSBvciBfYWEpLSAoY2QtMSkpCmFfYTpzZXRWYWx1ZShhZC8gKGJjPT0idmVydGljYWwiYW5kIGFhYSBvciBfYWEpKmJkKWFfYTp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmF3PWZ1bmN0aW9uKGFfYSkKaWYKKF9jLmRyYXcoYV9hKSl0aGVuCmlmKGFfYS5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIGJfYSxjX2E9YV9hOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgZF9hLF9hYT1hX2E6Z2V0U2l6ZSgpCmlmKGJjPT0iaG9yaXpvbnRhbCIpdGhlbgphX2EucGFyZW50OndyaXRlVGV4dChiX2EsY19hLF9kOnJlcChiZC0xKSxhX2EuYmdDb2xvcixhX2EuZmdDb2xvcikKYV9hLnBhcmVudDp3cml0ZVRleHQoYl9hK2JkLTEsY19hLGNjOnJlcChjZCksZGMsZGMpCmFfYS5wYXJlbnQ6d3JpdGVUZXh0KGJfYStiZCtjZC0xLGNfYSxfZDpyZXAoZF9hLSAoYmQrY2QtMSkpLGFfYS5iZ0NvbG9yLGFfYS5mZ0NvbG9yKWVuZAppZihiYz09InZlcnRpY2FsIil0aGVuCmZvciBuPTAsX2FhLTEgZG8KaWYoYmQ9PW4rMSl0aGVuCmZvciBjdXJJbmRleE9mZnNldD0wLG1hdGgubWluKGNkLTEsX2FhKWRvIGFfYS5wYXJlbnQ6d3JpdGVUZXh0KGJfYSxjX2ErbisKY3VySW5kZXhPZmZzZXQsY2MsZGMsZGMpZW5kIGVsc2UgaWYobisxIDxiZClvcihuKzEgPmJkLTEgK2NkKXRoZW4KYV9hLnBhcmVudDp3cml0ZVRleHQoYl9hLGNfYStuLF9kLGFfYS5iZ0NvbG9yLGFfYS5mZ0NvbG9yKWVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGFfYSkKYV9hLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGFfYSlhX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9kcmFnIixhX2EpCmFfYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3Njcm9sbCIsYV9hKQppZihfYy5pbml0KGFfYSkpdGhlbgphX2EuYmdDb2xvcj1hX2EucGFyZW50OmdldFRoZW1lKCJTbGlkZXJCRyIpYV9hLmZnQ29sb3I9YV9hLnBhcmVudDpnZXRUaGVtZSgiU2xpZGVyVGV4dCIpCmRjPWFfYS5wYXJlbnQ6Z2V0VGhlbWUoIlNsaWRlclN5bWJvbENvbG9yIillbmQgZW5kfXJldHVybiBzZXRtZXRhdGFibGUoX19hLF9jKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiR3JhcGhpYyJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidEhleCIpCmxvY2FsIGNiPWRhKCJ1dGlscyIpLmdldFZhbHVlRnJvbVhNTDtsb2NhbCBkYj1kYSgiYmltZyIpbG9jYWwgX2M9ZGEoImltYWdlcyIpCmxvY2FsIGFjLGJjLGNjLGRjPXN0cmluZy5zdWIsc3RyaW5nLmxlbixtYXRoLm1heCxtYXRoLm1pbgpyZXR1cm4KZnVuY3Rpb24oX2QpbG9jYWwgYWQ9YWIoX2QpbG9jYWwgYmQ9IkdyYXBoaWMibG9jYWwgY2Q9ZGIoKWxvY2FsIGRkPWNkLmdldEZyYW1lT2JqZWN0KDEpbG9jYWwgX19hCmxvY2FsIGFfYT0xO2FkOnNldFpJbmRleCg1KWxvY2FsIGJfYSxjX2E9MCwwCmxvY2FsIGRfYT17Z2V0VHlwZT1mdW5jdGlvbihfYWEpcmV0dXJuIGJkIGVuZCxzZXRPZmZzZXQ9ZnVuY3Rpb24oX2FhLGFhYSxiYWEsY2FhKQppZihjYWEpdGhlbgpiX2E9Yl9hK2FhYSBvciAwO2NfYT1jX2ErYmFhIG9yIDAgZWxzZSBiX2E9YWFhIG9yIGJfYTtjX2E9YmFhIG9yIGNfYSBlbmQ7X2FhOnVwZGF0ZURyYXcoKXJldHVybiBfYWEgZW5kLGdldE9mZnNldD1mdW5jdGlvbihfYWEpcmV0dXJuCmJfYSxjX2EgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihfYWEsYWFhKWFkLnNldFZhbHVlc0J5WE1MRGF0YShfYWEsYWFhKXJldHVybiBfYWEgZW5kLHNlbGVjdEZyYW1lPWZ1bmN0aW9uKF9hYSxhYWEpaWYoCmNkLmdldEZyYW1lT2JqZWN0KGFhYSk9PW5pbCl0aGVuIGNkLmFkZEZyYW1lKGFhYSllbmQKZGQ9Y2QuZ2V0RnJhbWVPYmplY3QoYWFhKV9fYT1kZC5nZXRJbWFnZShhYWEpYV9hPWFhYTtfYWE6dXBkYXRlRHJhdygpZW5kLGFkZEZyYW1lPWZ1bmN0aW9uKF9hYSxhYWEpCmNkLmFkZEZyYW1lKGFhYSlyZXR1cm4gX2FhIGVuZCxnZXRGcmFtZU1ldGFkYXRhPWZ1bmN0aW9uKF9hYSxhYWEsYmFhKXJldHVybiBjZC5nZXRGcmFtZURhdGEoYWFhLGJhYSllbmQsc2V0RnJhbWVNZXRhZGF0YT1mdW5jdGlvbihfYWEsYWFhLGJhYSxjYWEpCmNkLnNldEZyYW1lRGF0YShhYWEsYmFhLGNhYSlyZXR1cm4gX2FhIGVuZCxnZXRNZXRhZGF0YT1mdW5jdGlvbihfYWEsYWFhKXJldHVybiBjZC5nZXRNZXRhZGF0YShhYWEpZW5kLHNldE1ldGFkYXRhPWZ1bmN0aW9uKF9hYSxhYWEsYmFhKXJldHVybgpjZC5zZXRNZXRhZGF0YShhYWEsYmFhKWVuZCxnZXRGcmFtZT1mdW5jdGlvbihfYWEsYWFhKXJldHVybiBjZC5nZXRGcmFtZShhYWEpZW5kLGdldEZyYW1lT2JqZWN0PWZ1bmN0aW9uKF9hYSxhYWEpcmV0dXJuCmNkLmdldEZyYW1lT2JqZWN0KGFhYSllbmQscmVtb3ZlRnJhbWU9ZnVuY3Rpb24oX2FhLGFhYSljZC5yZW1vdmVGcmFtZShhYWEpcmV0dXJuIF9hYSBlbmQsbW92ZUZyYW1lPWZ1bmN0aW9uKF9hYSxhYWEsYmFhKQpjZC5tb3ZlRnJhbWUoYWFhLGJhYSlyZXR1cm4gX2FhIGVuZCxnZXRGcmFtZXM9ZnVuY3Rpb24oX2FhKXJldHVybiBjZC5nZXRGcmFtZXMoKWVuZCxnZXRGcmFtZUNvdW50PWZ1bmN0aW9uKF9hYSlyZXR1cm4KI2NkLmdldEZyYW1lcygpZW5kLGdldFNlbGVjdGVkRnJhbWU9ZnVuY3Rpb24oX2FhKXJldHVybiBhX2EgZW5kLGJsaXQ9ZnVuY3Rpb24oX2FhLGFhYSxiYWEsY2FhLGRhYSxfYmEpCng9ZGFhIG9yIHg7eT1fYmEgb3IgeTtkZC5ibGl0KGFhYSxiYWEsY2FhLHgseSlfX2E9ZGQuZ2V0SW1hZ2UoKQpfYWE6dXBkYXRlRHJhdygpcmV0dXJuIF9hYSBlbmQsc2V0VGV4dD1mdW5jdGlvbihfYWEsYWFhLGJhYSxjYWEpCng9YmFhIG9yIHg7eT1jYWEgb3IgeTtkZC50ZXh0KGFhYSx4LHkpX19hPWRkLmdldEltYWdlKCkKX2FhOnVwZGF0ZURyYXcoKXJldHVybiBfYWEgZW5kLHNldEJnPWZ1bmN0aW9uKF9hYSxhYWEsYmFhLGNhYSl4PWJhYSBvciB4O3k9CmNhYSBvciB5O2RkLmJnKGFhYSx4LHkpX19hPWRkLmdldEltYWdlKCkKX2FhOnVwZGF0ZURyYXcoKXJldHVybiBfYWEgZW5kLHNldEZnPWZ1bmN0aW9uKF9hYSxhYWEsYmFhLGNhYSl4PWJhYSBvciB4O3k9Y2FhIG9yCnk7ZGQuZmcoYWFhLHgseSlfX2E9ZGQuZ2V0SW1hZ2UoKQpfYWE6dXBkYXRlRHJhdygpcmV0dXJuIF9hYSBlbmQsZ2V0SW1hZ2VTaXplPWZ1bmN0aW9uKF9hYSkKcmV0dXJuIGNkLmdldFNpemUoKWVuZCxzZXRJbWFnZVNpemU9ZnVuY3Rpb24oX2FhLGFhYSxiYWEpY2Quc2V0U2l6ZShhYWEsYmFhKV9fYT1kZC5nZXRJbWFnZSgpCl9hYTp1cGRhdGVEcmF3KClyZXR1cm4gX2FhIGVuZCxyZXNpemVJbWFnZT1mdW5jdGlvbihfYWEsYWFhLGJhYSkKbG9jYWwgY2FhPV9jLnJlc2l6ZUJJTUcoY2QuY3JlYXRlQmltZygpLGFhYSxiYWEpY2Q9ZGIoY2FhKWFfYT0xO2RkPWNkLmdldEZyYW1lT2JqZWN0KDEpX19hPWRkLmdldEltYWdlKCkKX2FhOnVwZGF0ZURyYXcoKXJldHVybiBfYWEgZW5kLGxvYWRJbWFnZT1mdW5jdGlvbihfYWEsYWFhKQppZgooZnMuZXhpc3RzKGFhYSkpdGhlbiBsb2NhbCBiYWE9X2MubG9hZEJJTUcoYWFhKWNkPWRiKGJhYSlhX2E9MQpkZD1jZC5nZXRGcmFtZU9iamVjdCgxKV9fYT1kZC5nZXRJbWFnZSgpX2FhOnVwZGF0ZURyYXcoKWVuZDtyZXR1cm4gX2FhIGVuZCxjbGVhcj1mdW5jdGlvbihfYWEpCmNkPWRiKClfX2E9bmlsO19hYTp1cGRhdGVEcmF3KClyZXR1cm4gX2FhIGVuZCxnZXRJbWFnZT1mdW5jdGlvbihfYWEpcmV0dXJuCmNkLmNyZWF0ZUJpbWcoKWVuZCxkcmF3PWZ1bmN0aW9uKF9hYSkKaWYoYWQuZHJhdyhfYWEpKXRoZW4KaWYoX2FhLnBhcmVudH49bmlsKXRoZW4KbG9jYWwgYWFhLGJhYT1fYWE6Z2V0QW5jaG9yUG9zaXRpb24oKWxvY2FsIGNhYSxkYWE9X2FhOmdldFNpemUoKQppZihfX2F+PW5pbCl0aGVuCmZvciBfYmEsYWJhIGluIHBhaXJzKF9fYSlkbyBpZgooX2JhPD1kYWEtY19hKWFuZChfYmErY19hPj0xKXRoZW4KX2FhLnBhcmVudDpibGl0KGFhYStiX2EsYmFhK19iYS0xICtjX2EsYWJhWzFdLGFiYVsyXSxhYmFbM10pZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQsaW5pdD1mdW5jdGlvbihfYWEpCmlmCihhZC5pbml0KF9hYSkpdGhlbiBfYWEuYmdDb2xvcj1fYWEucGFyZW50OmdldFRoZW1lKCJHcmFwaGljQkciKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShkX2EsYWQpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJJbWFnZSJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0IikKbG9jYWwgYmI9ZGEoInV0aWxzIikuZ2V0VmFsdWVGcm9tWE1MO2xvY2FsIGNiPWRhKCJpbWFnZXMiKWxvY2FsIGRiLF9jPXRhYmxlLnVucGFjayxzdHJpbmcuc3ViCnJldHVybgpmdW5jdGlvbihhYylsb2NhbCBiYz1hYihhYykKbG9jYWwgY2M9IkltYWdlImJjOnNldFpJbmRleCgyKWxvY2FsIGRjO2xvY2FsIF9kO2xvY2FsIGFkPTE7bG9jYWwgYmQ9ZmFsc2U7bG9jYWwgY2Q7bG9jYWwgZGQ9ZmFsc2U7YmMud2lkdGg9MjQKYmMuaGVpZ2h0PTgKbG9jYWwgZnVuY3Rpb24gX19hKGJfYSkKaWYoZGN+PW5pbCl0aGVuIGxvY2FsIGNfYT17fQpmb3IgZF9hLF9hYSBpbiBwYWlycyhjb2xvcnMpZG8gaWYodHlwZShfYWEpPT0ibnVtYmVyIil0aGVuCmNfYVtfYWFdPXt0ZXJtLm5hdGl2ZVBhbGV0dGVDb2xvcihfYWEpfWVuZCBlbmQ7aWYoZGMucGFsZXR0ZX49bmlsKXRoZW4KZm9yIGRfYSxfYWEgaW4gcGFpcnMoZGMucGFsZXR0ZSlkbyBjX2FbMiBeZF9hXT1fYWEgZW5kIGVuZDtpZihkY1tiX2Fdfj1uaWwpYW5kCihkY1tiX2FdLnBhbGV0dGV+PW5pbCl0aGVuCmZvciBkX2EsX2FhIGluIHBhaXJzKGRjW2JfYV0ucGFsZXR0ZSlkbyBjX2FbMiBeZF9hXT1fYWEgZW5kIGVuZDtyZXR1cm4gY19hIGVuZCBlbmQKbG9jYWwgYV9hPXtpbml0PWZ1bmN0aW9uKGJfYSlpZihiYy5pbml0KGJfYSkpdGhlbgpiX2EuYmdDb2xvcj1iX2EucGFyZW50OmdldFRoZW1lKCJJbWFnZUJHIillbmQgZW5kLGdldFR5cGU9ZnVuY3Rpb24oYl9hKXJldHVybgpjYyBlbmQsbG9hZEltYWdlPWZ1bmN0aW9uKGJfYSxjX2EsZF9hKWlmIG5vdChmcy5leGlzdHMoY19hKSl0aGVuCmVycm9yKCJObyB2YWxpZCBwYXRoOiAiLi5jX2EpZW5kO2RjPWNiLmxvYWRJbWFnZUFzQmltZyhjX2EsZF9hKQphZD0xO19kPWRjO2lmKGNkfj1uaWwpdGhlbiBvcy5jYW5jZWxUaW1lcihjZCllbmQKYl9hOnVwZGF0ZURyYXcoKXJldHVybiBiX2EgZW5kLHNldEltYWdlPWZ1bmN0aW9uKGJfYSxjX2EpCmRjPWNfYTtfZD1kYzthZD0xO2lmKGNkfj1uaWwpdGhlbiBvcy5jYW5jZWxUaW1lcihjZCllbmQKYl9hOnVwZGF0ZURyYXcoKXJldHVybiBiX2EgZW5kLHVzZVBhbGV0dGU9ZnVuY3Rpb24oYl9hLGNfYSlkZD0KY19hfj1uaWwgYW5kIGNfYSBvciB0cnVlO3JldHVybiBiX2EgZW5kLHBsYXk9ZnVuY3Rpb24oYl9hLGNfYSkKaWYoZGMuYW5pbWF0ZWQpdGhlbgpsb2NhbCBkX2E9CmRjW2FkXS5kdXJhdGlvbiBvciBkYy5zZWNvbmRzUGVyRnJhbWUgb3IgMC4yO2JfYS5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixiX2EpCmNkPW9zLnN0YXJ0VGltZXIoZF9hKWJkPWNfYSBvciBmYWxzZSBlbmQ7cmV0dXJuIGJfYSBlbmQsc2VsZWN0RnJhbWU9ZnVuY3Rpb24oYl9hLGNfYSlpZigKZGNbY19hXX49bmlsKXRoZW4gYWQ9Y19hO2lmKGNkfj1uaWwpdGhlbiBvcy5jYW5jZWxUaW1lcihjZCllbmQKYl9hOnVwZGF0ZURyYXcoKWVuZCBlbmQsZXZlbnRIYW5kbGVyPWZ1bmN0aW9uKGJfYSxjX2EsZF9hLC4uLikKYmMuZXZlbnRIYW5kbGVyKGJfYSxjX2EsZF9hLC4uLikKaWYoY19hPT0idGltZXIiKXRoZW4KaWYoZF9hPT1jZCl0aGVuCmlmKGRjW2FkKzFdfj1uaWwpdGhlbiBhZD1hZCsxO2xvY2FsIF9hYT0KZGNbYWRdLmR1cmF0aW9uIG9yIGRjLnNlY29uZHNQZXJGcmFtZSBvciAwLjIKY2Q9b3Muc3RhcnRUaW1lcihfYWEpZWxzZQppZihiZCl0aGVuIGFkPTEKbG9jYWwgX2FhPWRjW2FkXS5kdXJhdGlvbiBvciBkYy5zZWNvbmRzUGVyRnJhbWUgb3IgMC4yO2NkPW9zLnN0YXJ0VGltZXIoX2FhKWVuZCBlbmQ7Yl9hOnVwZGF0ZURyYXcoKWVuZCBlbmQgZW5kLGdldE1ldGFkYXRhPWZ1bmN0aW9uKGJfYSxjX2EpcmV0dXJuCmRjW2NfYV1lbmQsZ2V0SW1hZ2VTaXplPWZ1bmN0aW9uKGJfYSlyZXR1cm4gZGMud2lkdGgsZGMuaGVpZ2h0IGVuZCxyZXNpemVJbWFnZT1mdW5jdGlvbihiX2EsY19hLGRfYSkKX2Q9Y2IucmVzaXplQklNRyhkYyxjX2EsZF9hKWJfYTp1cGRhdGVEcmF3KClyZXR1cm4gYl9hIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYl9hLGNfYSkKYmMuc2V0VmFsdWVzQnlYTUxEYXRhKGJfYSxjX2EpCmlmKGJiKCJwYXRoIixjX2Epfj1uaWwpdGhlbiBiX2E6bG9hZEltYWdlKGJiKCJwYXRoIixjX2EpKWVuZDtyZXR1cm4gYl9hIGVuZCxkcmF3PWZ1bmN0aW9uKGJfYSkKaWYKKGJjLmRyYXcoYl9hKSl0aGVuCmlmKF9kfj1uaWwpdGhlbiBpZihkZCl0aGVuCmJfYTpnZXRCYXNlRnJhbWUoKTpzZXRUaGVtZUNvbG9yKF9fYShhZCkpZW5kO2xvY2FsIGNfYSxkX2E9Yl9hOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgX2FhLGFhYT1iX2E6Z2V0U2l6ZSgpCmZvciBiYWEsY2FhIGluIGlwYWlycyhfZFthZF0pZG8gbG9jYWwgZGFhLF9iYSxhYmE9ZGIoY2FhKWRhYT1fYyhkYWEsMSxfYWEpCl9iYT1fYyhfYmEsMSxfYWEpYWJhPV9jKGFiYSwxLF9hYSkKYl9hLnBhcmVudDpibGl0KGNfYSxkX2ErYmFhLTEsZGFhLF9iYSxhYmEpaWYoYmFhPT1hYWEpdGhlbiBicmVhayBlbmQgZW5kIGVuZCBlbmQgZW5kfXJldHVybiBzZXRtZXRhdGFibGUoYV9hLGJjKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiTGlzdCJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidXRpbHMiKQpsb2NhbCBjYj1iYi5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGRiKWxvY2FsIF9jPWFiKGRiKWxvY2FsIGFjPSJMaXN0Il9jLndpZHRoPTE2O19jLmhlaWdodD02O19jOnNldFpJbmRleCg1KWxvY2FsIGJjPXt9CmxvY2FsIGNjO2xvY2FsIGRjO2xvY2FsIF9kPXRydWU7bG9jYWwgYWQ9ImxlZnQibG9jYWwgYmQ9MDtsb2NhbCBjZD10cnVlCmxvY2FsIGRkPXtnZXRUeXBlPWZ1bmN0aW9uKF9fYSlyZXR1cm4gYWMgZW5kLGFkZEl0ZW09ZnVuY3Rpb24oX19hLGFfYSxiX2EsY19hLC4uLikKdGFibGUuaW5zZXJ0KGJjLHt0ZXh0PWFfYSxiZ0NvbD1iX2Egb3IgX19hLmJnQ29sb3IsZmdDb2w9CmNfYSBvciBfX2EuZmdDb2xvcixhcmdzPXsuLi59fSlpZigjYmM8PTEpdGhlbiBfX2E6c2V0VmFsdWUoYmNbMV0sZmFsc2UpZW5kCl9fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxzZXRPZmZzZXQ9ZnVuY3Rpb24oX19hLGFfYSkKYmQ9YV9hO19fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxnZXRPZmZzZXQ9ZnVuY3Rpb24oX19hKXJldHVybiBiZCBlbmQscmVtb3ZlSXRlbT1mdW5jdGlvbihfX2EsYV9hKQp0YWJsZS5yZW1vdmUoYmMsYV9hKV9fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxnZXRJdGVtPWZ1bmN0aW9uKF9fYSxhX2EpCnJldHVybiBiY1thX2FdZW5kLGdldEFsbD1mdW5jdGlvbihfX2EpcmV0dXJuIGJjIGVuZCxnZXRJdGVtSW5kZXg9ZnVuY3Rpb24oX19hKWxvY2FsIGFfYT1fX2E6Z2V0VmFsdWUoKWZvciBiX2EsY19hIGluIHBhaXJzKGJjKWRvIGlmCihjX2E9PWFfYSl0aGVuIHJldHVybiBiX2EgZW5kIGVuZCBlbmQsY2xlYXI9ZnVuY3Rpb24oX19hKQpiYz17fV9fYTpzZXRWYWx1ZSh7fSxmYWxzZSlfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsZ2V0SXRlbUNvdW50PWZ1bmN0aW9uKF9fYSlyZXR1cm4KI2JjIGVuZCxlZGl0SXRlbT1mdW5jdGlvbihfX2EsYV9hLGJfYSxjX2EsZF9hLC4uLil0YWJsZS5yZW1vdmUoYmMsYV9hKQp0YWJsZS5pbnNlcnQoYmMsYV9hLHt0ZXh0PWJfYSxiZ0NvbD1jX2Egb3IgX19hLmJnQ29sb3IsZmdDb2w9CmRfYSBvciBfX2EuZmdDb2xvcixhcmdzPXsuLi59fSlfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsc2VsZWN0SXRlbT1mdW5jdGlvbihfX2EsYV9hKV9fYTpzZXRWYWx1ZSgKYmNbYV9hXW9ye30sZmFsc2UpX19hOnVwZGF0ZURyYXcoKXJldHVybiBfX2EgZW5kLHNldFNlbGVjdGVkSXRlbT1mdW5jdGlvbihfX2EsYV9hLGJfYSxjX2EpY2M9CmFfYSBvciBfX2EuYmdDb2xvcjtkYz1iX2Egb3IgX19hLmZnQ29sb3I7X2Q9Y19hfj1uaWwgYW5kIGNfYSBvcgp0cnVlO19fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxzZXRTY3JvbGxhYmxlPWZ1bmN0aW9uKF9fYSxhX2EpCmNkPWFfYTtpZihhX2E9PW5pbCl0aGVuIGNkPXRydWUgZW5kO19fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oX19hLGFfYSkKX2Muc2V0VmFsdWVzQnlYTUxEYXRhKF9fYSxhX2EpaWYoY2IoInNlbGVjdGlvbkJHIixhX2Epfj1uaWwpdGhlbgpjYz1jb2xvcnNbY2IoInNlbGVjdGlvbkJHIixhX2EpXWVuZDtpZihjYigic2VsZWN0aW9uRkciLGFfYSl+PW5pbCl0aGVuCmRjPWNvbG9yc1tjYigic2VsZWN0aW9uRkciLGFfYSldZW5kO2lmKGNiKCJzY3JvbGxhYmxlIixhX2Epfj1uaWwpdGhlbgppZgooY2IoInNjcm9sbGFibGUiLGFfYSkpdGhlbiBfX2E6c2V0U2Nyb2xsYWJsZSh0cnVlKWVsc2UgX19hOnNldFNjcm9sbGFibGUoZmFsc2UpZW5kIGVuZDtpZigKY2IoIm9mZnNldCIsYV9hKX49bmlsKXRoZW4gYmQ9Y2IoIm9mZnNldCIsYV9hKWVuZAppZihhX2FbIml0ZW0iXX49Cm5pbCl0aGVuIGxvY2FsIGJfYT1hX2FbIml0ZW0iXQppZihiX2EucHJvcGVydGllc349bmlsKXRoZW4gYl9hPXtiX2F9ZW5kO2ZvciBjX2EsZF9hIGluIHBhaXJzKGJfYSlkbwpfX2E6YWRkSXRlbShjYigidGV4dCIsZF9hKSxjb2xvcnNbY2IoImJnIixkX2EpXSxjb2xvcnNbY2IoImZnIixkX2EpXSllbmQgZW5kO3JldHVybiBfX2EgZW5kLHNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oX19hLGFfYSxiX2EsY19hKQppZgooX2Muc2Nyb2xsSGFuZGxlcihfX2EsYV9hLGJfYSxjX2EpKXRoZW4KaWYoY2QpdGhlbiBsb2NhbCBkX2EsX2FhPV9fYTpnZXRTaXplKCliZD1iZCthX2E7aWYoYmQ8MCl0aGVuIGJkPTAgZW5kCmlmKGFfYT49MSl0aGVuIGlmKCNiYz5fYWEpdGhlbiBpZihiZD4KI2JjLV9hYSl0aGVuIGJkPSNiYy1fYWEgZW5kO2lmKGJkPj0jYmMpdGhlbiBiZD0jYmMtMSBlbmQgZWxzZSBiZD0KYmQtMSBlbmQgZW5kO19fYTp1cGRhdGVEcmF3KCllbmQ7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKF9fYSxhX2EsYl9hLGNfYSkKaWYKKF9jLm1vdXNlSGFuZGxlcihfX2EsYV9hLGJfYSxjX2EpKXRoZW4KbG9jYWwgZF9hLF9hYT1fX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihfX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSlsb2NhbCBhYWEsYmFhPV9fYTpnZXRTaXplKCkKaWYoI2JjPjApdGhlbiBmb3Igbj0xLGJhYSBkbwppZihiY1tuK2JkXX49bmlsKXRoZW4gaWYoZF9hPD1iX2EpYW5kCihkX2ErYWFhPmJfYSlhbmQoX2FhK24tMSA9PWNfYSl0aGVuCl9fYTpzZXRWYWx1ZShiY1tuK2JkXSlfX2E6dXBkYXRlRHJhdygpZW5kIGVuZCBlbmQgZW5kO3JldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGRyYWdIYW5kbGVyPWZ1bmN0aW9uKF9fYSxhX2EsYl9hLGNfYSlyZXR1cm4KX19hOm1vdXNlSGFuZGxlcihhX2EsYl9hLGNfYSllbmQsdG91Y2hIYW5kbGVyPWZ1bmN0aW9uKF9fYSxhX2EsYl9hKXJldHVybgpfX2E6bW91c2VIYW5kbGVyKDEsYV9hLGJfYSllbmQsZHJhdz1mdW5jdGlvbihfX2EpCmlmKF9jLmRyYXcoX19hKSl0aGVuCmlmCihfX2EucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBhX2EsYl9hPV9fYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgY19hLGRfYT1fX2E6Z2V0U2l6ZSgpaWYoCl9fYS5iZ0NvbG9yfj1mYWxzZSl0aGVuCl9fYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goYV9hLGJfYSxjX2EsZF9hLF9fYS5iZ0NvbG9yKWVuZApmb3Igbj0xLGRfYSBkbwppZihiY1tuK2JkXX49bmlsKXRoZW4KaWYoYmNbbitiZF09PQpfX2E6Z2V0VmFsdWUoKSl0aGVuCmlmKF9kKXRoZW4KX19hLnBhcmVudDp3cml0ZVRleHQoYV9hLGJfYStuLTEsYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiY1tuK2JkXS50ZXh0LGNfYSxhZCksY2MsZGMpZWxzZQpfX2EucGFyZW50OndyaXRlVGV4dChhX2EsYl9hK24tMSxiYi5nZXRUZXh0SG9yaXpvbnRhbEFsaWduKGJjW24rYmRdLnRleHQsY19hLGFkKSxiY1sKbitiZF0uYmdDb2wsYmNbbitiZF0uZmdDb2wpZW5kIGVsc2UKX19hLnBhcmVudDp3cml0ZVRleHQoYV9hLGJfYStuLTEsYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiY1tuK2JkXS50ZXh0LGNfYSxhZCksYmNbCm4rYmRdLmJnQ29sLGJjW24rYmRdLmZnQ29sKWVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kLGluaXQ9ZnVuY3Rpb24oX19hKQpfX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsX19hKV9fYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2RyYWciLF9fYSkKX19hLnBhcmVudDphZGRFdmVudCgibW91c2Vfc2Nyb2xsIixfX2EpCmlmKF9jLmluaXQoX19hKSl0aGVuIF9fYS5iZ0NvbG9yPV9fYS5wYXJlbnQ6Z2V0VGhlbWUoIkxpc3RCRyIpCl9fYS5mZ0NvbG9yPV9fYS5wYXJlbnQ6Z2V0VGhlbWUoIkxpc3RUZXh0IiljYz1fX2EucGFyZW50OmdldFRoZW1lKCJTZWxlY3Rpb25CRyIpCmRjPV9fYS5wYXJlbnQ6Z2V0VGhlbWUoIlNlbGVjdGlvblRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShkZCxfYyllbmQgZW5kCmFhWyJvYmplY3RzIl1bIkFuaW1hdGlvbiJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUwKbG9jYWwgYmI9ZGEoImJhc2FsdEV2ZW50IikKbG9jYWwgY2IsZGIsX2MsYWMsYmMsY2M9bWF0aC5mbG9vcixtYXRoLnNpbixtYXRoLmNvcyxtYXRoLnBpLG1hdGguc3FydCxtYXRoLnBvdwpsb2NhbCBkYz1mdW5jdGlvbihjYWIsZGFiLF9iYilyZXR1cm4gY2FiKyAoZGFiLWNhYikqX2JiIGVuZDtsb2NhbCBfZD1mdW5jdGlvbihjYWIpcmV0dXJuIGNhYiBlbmQKbG9jYWwgYWQ9ZnVuY3Rpb24oY2FiKXJldHVybiAxIC1jYWIgZW5kO2xvY2FsIGJkPWZ1bmN0aW9uKGNhYilyZXR1cm4gY2FiKmNhYipjYWIgZW5kO2xvY2FsIGNkPWZ1bmN0aW9uKGNhYilyZXR1cm4KYWQoYmQoYWQoY2FiKSkpZW5kO2xvY2FsIGRkPWZ1bmN0aW9uKGNhYilyZXR1cm4KZGMoYmQoY2FiKSxjZChjYWIpLGNhYillbmQ7bG9jYWwgX19hPWZ1bmN0aW9uKGNhYilyZXR1cm4KZGIoKGNhYiphYykvMillbmQ7bG9jYWwgYV9hPWZ1bmN0aW9uKGNhYilyZXR1cm4KYWQoX2MoKGNhYiphYykvMikpZW5kO2xvY2FsIGJfYT1mdW5jdGlvbihjYWIpcmV0dXJuCi0gKF9jKGFjKngpLTEpLzIgZW5kCmxvY2FsIGNfYT1mdW5jdGlvbihjYWIpCmxvY2FsIGRhYj0xLjcwMTU4O2xvY2FsIF9iYj1kYWIrMTtyZXR1cm4gX2JiKmNhYl4zIC1kYWIqY2FiXjIgZW5kO2xvY2FsIGRfYT1mdW5jdGlvbihjYWIpcmV0dXJuIGNhYl4zIGVuZApsb2NhbCBfYWE9ZnVuY3Rpb24oY2FiKWxvY2FsIGRhYj0oMiAqYWMpLzM7cmV0dXJuCgpjYWI9PTAgYW5kIDAgb3IoY2FiPT0xIGFuZCAxIG9yKC0yIF4gKDEwICpjYWItMTApKgpkYigoY2FiKjEwIC0xMC43NSkqZGFiKSkpZW5kCmxvY2FsIGZ1bmN0aW9uIGFhYShjYWIpcmV0dXJuIGNhYj09MCBhbmQgMCBvciAyIF4gKDEwICpjYWItMTApZW5kCmxvY2FsIGZ1bmN0aW9uIGJhYShjYWIpcmV0dXJuIGNhYj09MCBhbmQgMCBvciAyIF4gKDEwICpjYWItMTApZW5kCmxvY2FsIGZ1bmN0aW9uIGNhYShjYWIpbG9jYWwgZGFiPTEuNzAxNTg7bG9jYWwgX2JiPWRhYioxLjUyNTtyZXR1cm4KY2FiPDAuNSBhbmQoICgyICpjYWIpXjIgKgooIChfYmIrMSkqMiAqY2FiLV9iYikpLzIgb3IKKAooMiAqY2FiLTIpXjIgKiAoIChfYmIrMSkqIChjYWIqMiAtMikrX2JiKSsyKS8yIGVuZDtsb2NhbCBmdW5jdGlvbiBkYWEoY2FiKXJldHVybgpjYWI8MC41IGFuZCA0ICpjYWJeMyBvciAxIC0gKC0yICpjYWIrMileMyAvMiBlbmQKbG9jYWwgZnVuY3Rpb24gX2JhKGNhYikKbG9jYWwgZGFiPSgyICphYykvNC41CnJldHVybgpjYWI9PTAgYW5kIDAgb3IoY2FiPT0xIGFuZCAxIG9yCigKY2FiPDAuNSBhbmQtICgyIF4gKDIwICpjYWItMTApKgpkYigoMjAgKmNhYi0xMS4xMjUpKmRhYikpLzIgb3IKKDIgXiAoLTIwICpjYWIrMTApKmRiKCgyMCAqY2FiLTExLjEyNSkqZGFiKSkvMiArMSkpZW5kCmxvY2FsIGZ1bmN0aW9uIGFiYShjYWIpcmV0dXJuCmNhYj09MCBhbmQgMCBvcihjYWI9PTEgYW5kIDEgb3IKKApjYWI8MC41IGFuZCAyIF4gKDIwICpjYWItMTApLzIgb3IoMiAtMiBeICgtMjAgKmNhYisxMCkpLzIpKWVuZDtsb2NhbCBmdW5jdGlvbiBiYmEoY2FiKXJldHVybgpjYWI8MC41IGFuZCAyICpjYWJeMiBvciAxIC0gKC0yICpjYWIrMileMiAvMiBlbmQ7bG9jYWwgZnVuY3Rpb24gY2JhKGNhYilyZXR1cm4KY2FiPDAuNSBhbmQgOCAqCmNhYl40IG9yIDEgLSAoLTIgKmNhYisyKV40IC8yIGVuZDtsb2NhbCBmdW5jdGlvbiBkYmEoY2FiKXJldHVybgpjYWI8MC41IGFuZCAxNiAqCmNhYl41IG9yIDEgLSAoLTIgKmNhYisyKV41IC8yIGVuZDtsb2NhbCBmdW5jdGlvbiBfY2EoY2FiKQpyZXR1cm4gY2FiXjIgZW5kO2xvY2FsIGZ1bmN0aW9uIGFjYShjYWIpcmV0dXJuIGNhYl40IGVuZApsb2NhbCBmdW5jdGlvbiBiY2EoY2FiKXJldHVybiBjYWJeNSBlbmQ7bG9jYWwgZnVuY3Rpb24gY2NhKGNhYilsb2NhbCBkYWI9MS43MDE1ODtsb2NhbCBfYmI9ZGFiKzE7cmV0dXJuCjEgK19iYiogKGNhYi0xKV4zICtkYWIqIChjYWItMSleMiBlbmQ7bG9jYWwgZnVuY3Rpb24gZGNhKGNhYilyZXR1cm4gMSAtCigxIC1jYWIpXjMgZW5kCmxvY2FsIGZ1bmN0aW9uIF9kYShjYWIpbG9jYWwgZGFiPSgyICphYykvMztyZXR1cm4KCmNhYj09MCBhbmQgMCBvcihjYWI9PTEgYW5kIDEgb3IoCjIgXiAoLTEwICpjYWIpKmRiKChjYWIqMTAgLTAuNzUpKmRhYikrMSkpZW5kCmxvY2FsIGZ1bmN0aW9uIGFkYShjYWIpcmV0dXJuIGNhYj09MSBhbmQgMSBvciAxIC0yIF4gKC0xMCAqY2FiKWVuZDtsb2NhbCBmdW5jdGlvbiBiZGEoY2FiKXJldHVybiAxIC0gKDEgLWNhYikqICgxIC1jYWIpZW5kO2xvY2FsIGZ1bmN0aW9uIGNkYShjYWIpcmV0dXJuIDEgLSAoCjEgLWNhYileNCBlbmQ7bG9jYWwgZnVuY3Rpb24gZGRhKGNhYikKcmV0dXJuIDEgLSAoMSAtY2FiKV41IGVuZApsb2NhbCBmdW5jdGlvbiBfX2IoY2FiKXJldHVybiAxIC1iYygxIC1jYyhjYWIsMikpZW5kO2xvY2FsIGZ1bmN0aW9uIGFfYihjYWIpcmV0dXJuIGJjKDEgLWNjKGNhYi0xLDIpKWVuZApsb2NhbCBmdW5jdGlvbiBiX2IoY2FiKXJldHVybgoKY2FiPDAuNSBhbmQoMSAtYmMoCjEgLWNjKDIgKmNhYiwyKSkpLzIgb3IoYmMoMSAtY2MoLTIgKmNhYisyLDIpKSsxKS8yIGVuZApsb2NhbCBmdW5jdGlvbiBjX2IoY2FiKWxvY2FsIGRhYj03LjU2MjU7bG9jYWwgX2JiPTIuNzUKaWYoY2FiPDEgL19iYil0aGVuIHJldHVybiBkYWIqY2FiKmNhYiBlbHNlaWYoY2FiPDIgL19iYil0aGVuIGxvY2FsIGFiYj1jYWItCjEuNSAvX2JiO3JldHVybiBkYWIqYWJiKmFiYiswLjc1IGVsc2VpZihjYWI8Mi41IC9fYmIpdGhlbiBsb2NhbCBhYmI9Y2FiLQoyLjI1IC9fYmI7cmV0dXJuIGRhYiphYmIqYWJiKzAuOTM3NSBlbHNlCmxvY2FsIGFiYj1jYWItMi42MjUgL19iYjtyZXR1cm4gZGFiKmFiYiphYmIrMC45ODQzNzUgZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBkX2IoY2FiKXJldHVybiAxIC1jX2IoMSAtY2FiKWVuZDtsb2NhbCBmdW5jdGlvbiBfYWIoY2FiKXJldHVybgp4PDAuNSBhbmQoMSAtCmNfYigxIC0yICpjYWIpKS8yIG9yKDEgK2NfYigyICpjYWItMSkpLzIgZW5kCmxvY2FsIGFhYj17bGluZWFyPV9kLGxlcnA9ZGMsZmxpcD1hZCxlYXNlSW49YmQsZWFzZUluU2luZT1hX2EsZWFzZUluQmFjaz1jX2EsZWFzZUluQ3ViaWM9ZF9hLGVhc2VJbkVsYXN0aWM9X2FhLGVhc2VJbkV4cG89YmFhLGVhc2VJblF1YWQ9X2NhLGVhc2VJblF1YXJ0PWFjYSxlYXNlSW5RdWludD1iY2EsZWFzZUluQ2lyYz1fX2IsZWFzZUluQm91bmNlPWRfYixlYXNlT3V0PWNkLGVhc2VPdXRTaW5lPV9fYSxlYXNlT3V0QmFjaz1jY2EsZWFzZU91dEN1YmljPWRjYSxlYXNlT3V0RWxhc3RpYz1fZGEsZWFzZU91dEV4cG89YWRhLGVhc2VPdXRRdWFkPWJkYSxlYXNlT3V0UXVhcnQ9Y2RhLGVhc2VPdXRRdWludD1kZGEsZWFzZU91dENpcmM9YV9iLGVhc2VPdXRCb3VuY2U9Y19iLGVhc2VJbk91dD1kZCxlYXNlSW5PdXRTaW5lPWJfYSxlYXNlSW5PdXRCYWNrPWNhYSxlYXNlSW5PdXRDdWJpYz1kYWEsZWFzZUluT3V0RWxhc3RpYz1fYmEsZWFzZUluT3V0RXhwbz1hYmEsZWFzZUluT3V0UXVhZD1iYmEsZWFzZUluT3V0UXVhcnQ9Y2JhLGVhc2VJbk91dFF1aW50PWRiYSxlYXNlSW5PdXRDaXJjPWJfYixlYXNlSW5PdXRCb3VuY2U9X2FifWxvY2FsIGJhYj17fQpyZXR1cm4KZnVuY3Rpb24oY2FiKWxvY2FsIGRhYj17fWxvY2FsIF9iYj0iQW5pbWF0aW9uImxvY2FsIGFiYjtsb2NhbCBiYmI9e31sb2NhbCBjYmI9MDtsb2NhbCBkYmI9ZmFsc2U7bG9jYWwgX2NiPTE7bG9jYWwgYWNiPWZhbHNlCmxvY2FsIGJjYj1iYigpbG9jYWwgY2NiPTA7bG9jYWwgZGNiO2xvY2FsIF9kYj1mYWxzZTtsb2NhbCBhZGI9ZmFsc2U7bG9jYWwgYmRiPSJlYXNlT3V0ImxvY2FsIGNkYjtsb2NhbCBmdW5jdGlvbiBkZGIoY19jKWZvciBkX2MsX2FjIGluIHBhaXJzKGNfYylkbwpfYWMoZGFiLGJiYltfY2JdLnQsX2NiKWVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gX19jKGNfYylpZihfY2I9PTEpdGhlbgpjX2M6YW5pbWF0aW9uU3RhcnRIYW5kbGVyKCllbmQ7aWYoYmJiW19jYl1+PW5pbCl0aGVuIGRkYihiYmJbX2NiXS5mKQpjYmI9YmJiW19jYl0udCBlbmQ7X2NiPV9jYisxCmlmKGJiYltfY2JdPT1uaWwpdGhlbiBpZihhY2IpdGhlbiBfY2I9MTtjYmI9MCBlbHNlCmNfYzphbmltYXRpb25Eb25lSGFuZGxlcigpcmV0dXJuIGVuZCBlbmQ7aWYoYmJiW19jYl0udD4wKXRoZW4KYWJiPW9zLnN0YXJ0VGltZXIoYmJiW19jYl0udC1jYmIpZWxzZSBfX2MoY19jKWVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYV9jKGNfYyxkX2MpZm9yIG49MSwjYmJiIGRvCmlmKGJiYltuXS50PT1jX2MpdGhlbiB0YWJsZS5pbnNlcnQoYmJiW25dLmYsZF9jKXJldHVybiBlbmQgZW5kCmZvciBuPTEsI2JiYiBkbwppZihiYmJbbl0udD5jX2MpdGhlbiBpZgooYmJiW24tMV1+PW5pbCl0aGVuIGlmKGJiYltuLTFdLnQ8Y19jKXRoZW4KdGFibGUuaW5zZXJ0KGJiYixuLTEse3Q9Y19jLGY9e2RfY319KXJldHVybiBlbmQgZWxzZQp0YWJsZS5pbnNlcnQoYmJiLG4se3Q9Y19jLGY9e2RfY319KXJldHVybiBlbmQgZW5kIGVuZAppZigjYmJiPD0wKXRoZW4gdGFibGUuaW5zZXJ0KGJiYiwxLHt0PWNfYyxmPXtkX2N9fSlyZXR1cm4gZWxzZWlmKApiYmJbI2JiYl0udDxjX2MpdGhlbiB0YWJsZS5pbnNlcnQoYmJiLHt0PWNfYyxmPXtkX2N9fSllbmQgZW5kCmxvY2FsIGZ1bmN0aW9uIGJfYyhjX2MsZF9jLF9hYyxhYWMsYmFjLGNhYyxkYWMsX2JjKWxvY2FsIGFiYz1jZGI7bG9jYWwgYmJjLGNiYztsb2NhbCBkYmM9IiJpZihhYmMucGFyZW50fj1uaWwpdGhlbgpkYmM9YWJjLnBhcmVudDpnZXROYW1lKCllbmQ7ZGJjPWRiYy4uYWJjOmdldE5hbWUoKQphX2MoYWFjKzAuMDUsZnVuY3Rpb24oKQppZgooZGFjfj1uaWwpdGhlbiBpZihiYWJbZGFjXT09bmlsKXRoZW4gYmFiW2RhY109e31lbmQ7aWYoYmFiW2RhY11bZGJjXX49bmlsKXRoZW4KaWYoCmJhYltkYWNdW2RiY11+PV9iYyl0aGVuIGJhYltkYWNdW2RiY106Y2FuY2VsKCllbmQgZW5kO2JhYltkYWNdW2RiY109X2JjIGVuZDtiYmMsY2JjPWJhYyhhYmMpZW5kKQpmb3Igbj0wLjA1LF9hYyswLjAxLDAuMDUgZG8KYV9jKGFhYytuLGZ1bmN0aW9uKCkKbG9jYWwgX2NjPW1hdGguZmxvb3IoYWFiLmxlcnAoYmJjLGNfYyxhYWJbYmRiXShuL19hYykpKzAuNSkKbG9jYWwgYWNjPW1hdGguZmxvb3IoYWFiLmxlcnAoY2JjLGRfYyxhYWJbYmRiXShuL19hYykpKzAuNSljYWMoYWJjLF9jYyxhY2MpCmlmKGRhY349bmlsKXRoZW4gaWYobj49X2FjLTAuMDEpdGhlbiBpZihiYWJbZGFjXVtkYmNdPT1fYmMpdGhlbiBiYWJbZGFjXVtkYmNdPQpuaWwgZW5kIGVuZCBlbmQgZW5kKWVuZCBlbmQKZGFiPXtuYW1lPWNhYixnZXRUeXBlPWZ1bmN0aW9uKGNfYylyZXR1cm4gX2JiIGVuZCxnZXRCYXNlRnJhbWU9ZnVuY3Rpb24oY19jKWlmKGNfYy5wYXJlbnR+PW5pbCl0aGVuCnJldHVybiBjX2MucGFyZW50OmdldEJhc2VGcmFtZSgpZW5kO3JldHVybiBjX2MgZW5kLHNldE1vZGU9ZnVuY3Rpb24oY19jLGRfYykKYmRiPWRfYztyZXR1cm4gY19jIGVuZCxhZGRNb2RlPWZ1bmN0aW9uKGNfYyxkX2MsX2FjKWFhYltkX2NdPV9hYztyZXR1cm4gY19jIGVuZCxnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb249ZnVuY3Rpb24oY19jLGRfYyxfYWMpCmxvY2FsIGFhYz1mdW5jdGlvbihiYWMpCmlmKApiYWM6c3ViKDEsMSk9PSIjIil0aGVuCmxvY2FsIGNhYz1jX2M6Z2V0QmFzZUZyYW1lKCk6Z2V0RGVlcE9iamVjdChiYWM6c3ViKDIsYmFjOmxlbigpKSkKaWYoY2Fjfj1uaWwpYW5kKGNhYy5pbnRlcm5hbE9iamV0Q2FsbH49bmlsKXRoZW4gZF9jKGNfYyxmdW5jdGlvbigpCmNhYzppbnRlcm5hbE9iamV0Q2FsbCgpZW5kKWVuZCBlbHNlCmRfYyhjX2MsY19jOmdldEJhc2VGcmFtZSgpOmdldFZhcmlhYmxlKGJhYykpZW5kIGVuZDtpZih0eXBlKF9hYyk9PSJzdHJpbmciKXRoZW4gYWFjKF9hYyllbHNlaWYodHlwZShfYWMpPT0idGFibGUiKXRoZW4KZm9yIGJhYyxjYWMgaW4gcGFpcnMoX2FjKWRvIGFhYyhjYWMpZW5kIGVuZDtyZXR1cm4gY19jIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oY19jLGRfYylfZGI9CmFiKCJsb29wIixkX2MpPT10cnVlIGFuZCB0cnVlIG9yIGZhbHNlCmlmKAphYigib2JqZWN0IixkX2Mpfj1uaWwpdGhlbgpsb2NhbCBfYWM9Y19jOmdldEJhc2VGcmFtZSgpOmdldERlZXBPYmplY3QoYWIoIm9iamVjdCIsZF9jKSlpZihfYWM9PW5pbCl0aGVuCl9hYz1jX2M6Z2V0QmFzZUZyYW1lKCk6Z2V0VmFyaWFibGUoYWIoIm9iamVjdCIsZF9jKSllbmQKaWYoX2Fjfj1uaWwpdGhlbiBjX2M6c2V0T2JqZWN0KF9hYyllbmQgZW5kCmlmKGRfY1sibW92ZSJdfj1uaWwpdGhlbiBsb2NhbCBfYWM9YWIoIngiLGRfY1sibW92ZSJdKQpsb2NhbCBhYWM9YWIoInkiLGRfY1sibW92ZSJdKWxvY2FsIGJhYz1hYigiZHVyYXRpb24iLGRfY1sibW92ZSJdKQpsb2NhbCBjYWM9YWIoInRpbWUiLGRfY1sibW92ZSJdKWNfYzptb3ZlKF9hYyxhYWMsYmFjLGNhYyllbmQKaWYoZF9jWyJzaXplIl1+PW5pbCl0aGVuIGxvY2FsIF9hYz1hYigid2lkdGgiLGRfY1sic2l6ZSJdKQpsb2NhbCBhYWM9YWIoImhlaWdodCIsZF9jWyJzaXplIl0pbG9jYWwgYmFjPWFiKCJkdXJhdGlvbiIsZF9jWyJzaXplIl0pCmxvY2FsIGNhYz1hYigidGltZSIsZF9jWyJzaXplIl0pY19jOnNpemUoX2FjLGFhYyxiYWMsY2FjKWVuZAppZihkX2NbIm9mZnNldCJdfj1uaWwpdGhlbiBsb2NhbCBfYWM9YWIoIngiLGRfY1sib2Zmc2V0Il0pCmxvY2FsIGFhYz1hYigieSIsZF9jWyJvZmZzZXQiXSlsb2NhbCBiYWM9YWIoImR1cmF0aW9uIixkX2NbIm9mZnNldCJdKQpsb2NhbCBjYWM9YWIoInRpbWUiLGRfY1sib2Zmc2V0Il0pY19jOm9mZnNldChfYWMsYWFjLGJhYyxjYWMpZW5kCmlmKGRfY1sidGV4dENvbG9yIl1+PW5pbCl0aGVuCmxvY2FsIF9hYz1hYigiZHVyYXRpb24iLGRfY1sidGV4dENvbG9yIl0pbG9jYWwgYWFjPWFiKCJ0aW1lIixkX2NbInRleHRDb2xvciJdKWxvY2FsIGJhYz17fQpsb2NhbCBjYWM9ZF9jWyJ0ZXh0Q29sb3IiXVsiY29sb3IiXQppZihjYWN+PW5pbCl0aGVuIGlmKGNhYy5wcm9wZXJ0aWVzfj1uaWwpdGhlbiBjYWM9e2NhY31lbmQ7Zm9yIGRhYyxfYmMgaW4gcGFpcnMoY2FjKWRvCnRhYmxlLmluc2VydChiYWMsY29sb3JzW19iYzp2YWx1ZSgpXSllbmQgZW5kO2lmKF9hY349bmlsKWFuZCgjYmFjPjApdGhlbgpjX2M6Y2hhbmdlVGV4dENvbG9yKF9hYyxhYWMgb3IgMCx0YWJsZS51bnBhY2soYmFjKSllbmQgZW5kCmlmKGRfY1siYmFja2dyb3VuZCJdfj1uaWwpdGhlbgpsb2NhbCBfYWM9YWIoImR1cmF0aW9uIixkX2NbImJhY2tncm91bmQiXSlsb2NhbCBhYWM9YWIoInRpbWUiLGRfY1siYmFja2dyb3VuZCJdKWxvY2FsIGJhYz17fQpsb2NhbCBjYWM9ZF9jWyJiYWNrZ3JvdW5kIl1bImNvbG9yIl0KaWYoY2Fjfj1uaWwpdGhlbiBpZihjYWMucHJvcGVydGllc349bmlsKXRoZW4gY2FjPXtjYWN9ZW5kO2ZvciBkYWMsX2JjIGluIHBhaXJzKGNhYylkbwp0YWJsZS5pbnNlcnQoYmFjLGNvbG9yc1tfYmM6dmFsdWUoKV0pZW5kIGVuZDtpZihfYWN+PW5pbClhbmQoI2JhYz4wKXRoZW4KY19jOmNoYW5nZUJhY2tncm91bmQoX2FjLGFhYyBvciAwLHRhYmxlLnVucGFjayhiYWMpKWVuZCBlbmQKaWYoZF9jWyJ0ZXh0Il1+PW5pbCl0aGVuIGxvY2FsIF9hYz1hYigiZHVyYXRpb24iLGRfY1sidGV4dCJdKQpsb2NhbCBhYWM9YWIoInRpbWUiLGRfY1sidGV4dCJdKWxvY2FsIGJhYz17fWxvY2FsIGNhYz1kX2NbInRleHQiXVsidGV4dCJdCmlmKGNhY349bmlsKXRoZW4gaWYoY2FjLnByb3BlcnRpZXN+PW5pbCl0aGVuCmNhYz17Y2FjfWVuZDtmb3IgZGFjLF9iYyBpbiBwYWlycyhjYWMpZG8KdGFibGUuaW5zZXJ0KGJhYyxfYmM6dmFsdWUoKSllbmQgZW5kO2lmKF9hY349bmlsKWFuZCgjYmFjPjApdGhlbgpjX2M6Y2hhbmdlVGV4dChfYWMsYWFjIG9yIDAsdGFibGUudW5wYWNrKGJhYykpZW5kIGVuZDtpZihhYigib25Eb25lIixkX2Mpfj1uaWwpdGhlbgpjX2M6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGNfYy5vbkRvbmUsYWIoIm9uRG9uZSIsZF9jKSllbmQ7aWYoYWIoIm9uU3RhcnQiLGRfYyl+PW5pbCl0aGVuCmNfYzpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oY19jLm9uRG9uZSxhYigib25TdGFydCIsZF9jKSllbmQKaWYKKGFiKCJhdXRvRGVzdHJveSIsZF9jKX49bmlsKXRoZW4gaWYoYWIoImF1dG9EZXN0cm95IixkX2MpKXRoZW4gYWRiPXRydWUgZW5kIGVuZDtiZGI9YWIoIm1vZGUiLGRfYylvciBiZGIKaWYoYWIoInBsYXkiLGRfYyl+PW5pbCl0aGVuIGlmCihhYigicGxheSIsZF9jKSl0aGVuIGNfYzpwbGF5KF9kYillbmQgZW5kO3JldHVybiBjX2MgZW5kLGdldFpJbmRleD1mdW5jdGlvbihjX2MpcmV0dXJuCjEgZW5kLGdldE5hbWU9ZnVuY3Rpb24oY19jKXJldHVybiBjX2MubmFtZSBlbmQsc2V0T2JqZWN0PWZ1bmN0aW9uKGNfYyxkX2MpY2RiPWRfYztyZXR1cm4gY19jIGVuZCxtb3ZlPWZ1bmN0aW9uKGNfYyxkX2MsX2FjLGFhYyxiYWMsY2FjKWNkYj0KY2FjIG9yIGNkYgpiX2MoZF9jLF9hYyxhYWMsYmFjIG9yIDAsY2RiLmdldFBvc2l0aW9uLGNkYi5zZXRQb3NpdGlvbiwicG9zaXRpb24iLGNfYylyZXR1cm4gY19jIGVuZCxvZmZzZXQ9ZnVuY3Rpb24oY19jLGRfYyxfYWMsYWFjLGJhYyxjYWMpY2RiPQpjYWMgb3IgY2RiCmJfYyhkX2MsX2FjLGFhYyxiYWMgb3IgMCxjZGIuZ2V0T2Zmc2V0LGNkYi5zZXRPZmZzZXQsIm9mZnNldCIsY19jKXJldHVybiBjX2MgZW5kLHNpemU9ZnVuY3Rpb24oY19jLGRfYyxfYWMsYWFjLGJhYyxjYWMpY2RiPWNhYyBvcgpjZGIKYl9jKGRfYyxfYWMsYWFjLGJhYyBvciAwLGNkYi5nZXRTaXplLGNkYi5zZXRTaXplLCJzaXplIixjX2MpcmV0dXJuIGNfYyBlbmQsY2hhbmdlVGV4dD1mdW5jdGlvbihjX2MsZF9jLF9hYywuLi4pCmxvY2FsIGFhYz17Li4ufV9hYz1fYWMgb3IgMDtjZGI9b2JqIG9yIGNkYjtmb3Igbj0xLCNhYWMgZG8KYV9jKF9hYytuKiAoZF9jLyNhYWMpLGZ1bmN0aW9uKCkKY2RiLnNldFRleHQoY2RiLGFhY1tuXSllbmQpZW5kO3JldHVybiBjX2MgZW5kLGNoYW5nZUJhY2tncm91bmQ9ZnVuY3Rpb24oY19jLGRfYyxfYWMsLi4uKQpsb2NhbCBhYWM9ey4uLn1fYWM9X2FjIG9yIDA7Y2RiPW9iaiBvciBjZGI7Zm9yIG49MSwjYWFjIGRvCmFfYyhfYWMrbiogKGRfYy8jYWFjKSxmdW5jdGlvbigpCmNkYi5zZXRCYWNrZ3JvdW5kKGNkYixhYWNbbl0pZW5kKWVuZDtyZXR1cm4gY19jIGVuZCxjaGFuZ2VUZXh0Q29sb3I9ZnVuY3Rpb24oY19jLGRfYyxfYWMsLi4uKQpsb2NhbCBhYWM9ey4uLn1fYWM9X2FjIG9yIDA7Y2RiPW9iaiBvciBjZGI7Zm9yIG49MSwjYWFjIGRvCmFfYyhfYWMrbiogKGRfYy8jYWFjKSxmdW5jdGlvbigpCmNkYi5zZXRGb3JlZ3JvdW5kKGNkYixhYWNbbl0pZW5kKWVuZDtyZXR1cm4gY19jIGVuZCxhZGQ9ZnVuY3Rpb24oY19jLGRfYyxfYWMpCmRjYj1kX2MKYV9jKChfYWMgb3IgY2NiKSsKKGJiYlsjYmJiXX49bmlsIGFuZCBiYmJbI2JiYl0udCBvciAwKSxkX2MpcmV0dXJuIGNfYyBlbmQsd2FpdD1mdW5jdGlvbihjX2MsZF9jKWNjYj1kX2M7cmV0dXJuIGNfYyBlbmQscmVwPWZ1bmN0aW9uKGNfYyxkX2MpCmlmKApkY2J+PW5pbCl0aGVuIGZvciBuPTEsZF9jIG9yIDEgZG8KYV9jKCh3YWl0IG9yIGNjYikrCihiYmJbI2JiYl1+PW5pbCBhbmQgYmJiWyNiYmJdLnQgb3IgMCksZGNiKWVuZCBlbmQ7cmV0dXJuIGNfYyBlbmQsb25Eb25lPWZ1bmN0aW9uKGNfYyxkX2MpCmJjYjpyZWdpc3RlckV2ZW50KCJhbmltYXRpb25fZG9uZSIsZF9jKXJldHVybiBjX2MgZW5kLG9uU3RhcnQ9ZnVuY3Rpb24oY19jLGRfYykKYmNiOnJlZ2lzdGVyRXZlbnQoImFuaW1hdGlvbl9zdGFydCIsZF9jKXJldHVybiBjX2MgZW5kLHNldEF1dG9EZXN0cm95PWZ1bmN0aW9uKGNfYyxkX2MpCmFkYj1kX2N+PW5pbCBhbmQgZF9jIG9yIHRydWU7cmV0dXJuIGNfYyBlbmQsYW5pbWF0aW9uRG9uZUhhbmRsZXI9ZnVuY3Rpb24oY19jKQpiY2I6c2VuZEV2ZW50KCJhbmltYXRpb25fZG9uZSIsY19jKWNfYy5wYXJlbnQ6cmVtb3ZlRXZlbnQoIm90aGVyX2V2ZW50IixjX2MpaWYoYWRiKXRoZW4KY19jLnBhcmVudDpyZW1vdmVPYmplY3QoY19jKWNfYz1uaWwgZW5kIGVuZCxhbmltYXRpb25TdGFydEhhbmRsZXI9ZnVuY3Rpb24oY19jKQpiY2I6c2VuZEV2ZW50KCJhbmltYXRpb25fc3RhcnQiLGNfYyllbmQsY2xlYXI9ZnVuY3Rpb24oY19jKWJiYj17fWRjYj1uaWw7Y2NiPTA7X2NiPTE7Y2JiPTA7YWNiPWZhbHNlO3JldHVybiBjX2MgZW5kLHBsYXk9ZnVuY3Rpb24oY19jLGRfYykKY19jOmNhbmNlbCgpZGJiPXRydWU7YWNiPWRfYyBhbmQgdHJ1ZSBvciBmYWxzZTtfY2I9MTtjYmI9MAppZihiYmJbX2NiXX49bmlsKXRoZW4KaWYoCmJiYltfY2JdLnQ+MCl0aGVuIGFiYj1vcy5zdGFydFRpbWVyKGJiYltfY2JdLnQpZWxzZSBfX2MoY19jKWVuZCBlbHNlIGNfYzphbmltYXRpb25Eb25lSGFuZGxlcigpZW5kO2NfYy5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixjX2MpcmV0dXJuIGNfYyBlbmQsY2FuY2VsPWZ1bmN0aW9uKGNfYylpZigKYWJifj1uaWwpdGhlbiBvcy5jYW5jZWxUaW1lcihhYmIpYWNiPWZhbHNlIGVuZApkYmI9ZmFsc2U7Y19jLnBhcmVudDpyZW1vdmVFdmVudCgib3RoZXJfZXZlbnQiLGNfYylyZXR1cm4gY19jIGVuZCxpbnRlcm5hbE9iamV0Q2FsbD1mdW5jdGlvbihjX2MpCmNfYzpwbGF5KF9kYillbmQsZXZlbnRIYW5kbGVyPWZ1bmN0aW9uKGNfYyxkX2MsX2FjKWlmKGRiYil0aGVuCmlmKGRfYz09InRpbWVyIilhbmQoX2FjPT1hYmIpdGhlbiBpZihiYmJbX2NiXX49bmlsKXRoZW4KX19jKGNfYyllbHNlIGNfYzphbmltYXRpb25Eb25lSGFuZGxlcigpZW5kIGVuZCBlbmQgZW5kfWRhYi5fX2luZGV4PWRhYjtyZXR1cm4gZGFiIGVuZCBlbmQKYWFbIm9iamVjdHMiXVsiUmFkaW8iXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoIk9iamVjdCIpbG9jYWwgYmI9ZGEoInV0aWxzIikKbG9jYWwgY2I9YmIuZ2V0VmFsdWVGcm9tWE1MCnJldHVybgpmdW5jdGlvbihkYilsb2NhbCBfYz1hYihkYilsb2NhbCBhYz0iUmFkaW8iX2Mud2lkdGg9ODtfYzpzZXRaSW5kZXgoNSlsb2NhbCBiYz17fWxvY2FsIGNjO2xvY2FsIGRjCmxvY2FsIF9kO2xvY2FsIGFkO2xvY2FsIGJkO2xvY2FsIGNkO2xvY2FsIGRkPXRydWU7bG9jYWwgX19hPSJcNyJsb2NhbCBhX2E9ImxlZnQiCmxvY2FsIGJfYT17Z2V0VHlwZT1mdW5jdGlvbihjX2EpcmV0dXJuIGFjIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oY19hLGRfYSkKX2Muc2V0VmFsdWVzQnlYTUxEYXRhKGNfYSxkX2EpaWYoY2IoInNlbGVjdGlvbkJHIixkX2Epfj1uaWwpdGhlbgpjYz1jb2xvcnNbY2IoInNlbGVjdGlvbkJHIixkX2EpXWVuZDtpZihjYigic2VsZWN0aW9uRkciLGRfYSl+PW5pbCl0aGVuCmRjPWNvbG9yc1tjYigic2VsZWN0aW9uRkciLGRfYSldZW5kO2lmKGNiKCJib3hCRyIsZF9hKX49bmlsKXRoZW4KX2Q9Y29sb3JzW2NiKCJib3hCRyIsZF9hKV1lbmQ7aWYoY2IoImluYWN0aXZlQm94QkciLGRfYSl+PW5pbCl0aGVuCmJkPWNvbG9yc1tjYigiaW5hY3RpdmVCb3hCRyIsZF9hKV1lbmQ7aWYoY2IoImluYWN0aXZlQm94RkciLGRfYSl+PW5pbCl0aGVuCmNkPWNvbG9yc1tjYigiaW5hY3RpdmVCb3hGRyIsZF9hKV1lbmQ7aWYoY2IoImJveEZHIixkX2Epfj1uaWwpdGhlbgphZD1jb2xvcnNbY2IoImJveEZHIixkX2EpXWVuZDtpZihjYigic3ltYm9sIixkX2Epfj1uaWwpdGhlbgpfX2E9Y2IoInN5bWJvbCIsZF9hKWVuZAppZihkX2FbIml0ZW0iXX49bmlsKXRoZW4gbG9jYWwgX2FhPWRfYVsiaXRlbSJdaWYoCl9hYS5wcm9wZXJ0aWVzfj1uaWwpdGhlbiBfYWE9e19hYX1lbmQ7Zm9yIGFhYSxiYWEgaW4gcGFpcnMoX2FhKWRvCmNfYTphZGRJdGVtKGNiKCJ0ZXh0IixiYWEpLGNiKCJ4IixiYWEpLGNiKCJ5IixiYWEpLGNvbG9yc1tjYigiYmciLGJhYSldLGNvbG9yc1tjYigiZmciLGJhYSldKWVuZCBlbmQ7cmV0dXJuIGNfYSBlbmQsYWRkSXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsYmFhLGNhYSwuLi4pCnRhYmxlLmluc2VydChiYyx7eD0KX2FhIG9yIDEseT1hYWEgb3IgMSx0ZXh0PWRfYSxiZ0NvbD1iYWEgb3IgY19hLmJnQ29sb3IsZmdDb2w9Y2FhIG9yIGNfYS5mZ0NvbG9yLGFyZ3M9ey4uLn19KWlmKCNiYz09MSl0aGVuIGNfYTpzZXRWYWx1ZShiY1sxXSllbmQKY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLGdldEFsbD1mdW5jdGlvbihjX2EpcmV0dXJuCmJjIGVuZCxyZW1vdmVJdGVtPWZ1bmN0aW9uKGNfYSxkX2EpdGFibGUucmVtb3ZlKGJjLGRfYSljX2E6dXBkYXRlRHJhdygpCnJldHVybiBjX2EgZW5kLGdldEl0ZW09ZnVuY3Rpb24oY19hLGRfYSlyZXR1cm4gYmNbZF9hXWVuZCxnZXRJdGVtSW5kZXg9ZnVuY3Rpb24oY19hKQpsb2NhbCBkX2E9Y19hOmdldFZhbHVlKClmb3IgX2FhLGFhYSBpbiBwYWlycyhiYylkbyBpZihhYWE9PWRfYSl0aGVuIHJldHVybiBfYWEgZW5kIGVuZCBlbmQsY2xlYXI9ZnVuY3Rpb24oY19hKQpiYz17fWNfYTpzZXRWYWx1ZSh7fSxmYWxzZSljX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsZ2V0SXRlbUNvdW50PWZ1bmN0aW9uKGNfYSlyZXR1cm4KI2JjIGVuZCxlZGl0SXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsYmFhLGNhYSxkYWEsLi4uKXRhYmxlLnJlbW92ZShiYyxkX2EpCnRhYmxlLmluc2VydChiYyxkX2Ese3g9YWFhIG9yIDEseT1iYWEgb3IgMSx0ZXh0PV9hYSxiZ0NvbD0KY2FhIG9yIGNfYS5iZ0NvbG9yLGZnQ29sPWRhYSBvciBjX2EuZmdDb2xvcixhcmdzPXsuLi59fSljX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsc2VsZWN0SXRlbT1mdW5jdGlvbihjX2EsZF9hKWNfYTpzZXRWYWx1ZSgKYmNbZF9hXW9ye30sZmFsc2UpY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLHNldEFjdGl2ZVN5bWJvbD1mdW5jdGlvbihjX2EsZF9hKQpfX2E9ZF9hOnN1YigxLDEpY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLHNldFNlbGVjdGVkSXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsYmFhLGNhYSkKY2M9ZF9hIG9yIGNjO2RjPV9hYSBvciBkYztfZD1hYWEgb3IgX2Q7YWQ9YmFhIG9yIGFkCmRkPWNhYX49bmlsIGFuZCBjYWEgb3IgdHJ1ZTtjX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKGNfYSxkX2EsX2FhLGFhYSkKaWYoCiNiYz4wKXRoZW4KbG9jYWwgYmFhLGNhYT1jX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihjX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSkKZm9yIGRhYSxfYmEgaW4gcGFpcnMoYmMpZG8KaWYoYmFhK19iYS54LTEgPD1fYWEpYW5kKApiYWErX2JhLngtMSArX2JhLnRleHQ6bGVuKCkrMSA+PV9hYSlhbmQoCmNhYStfYmEueS0xID09YWFhKXRoZW4KY19hOnNldFZhbHVlKF9iYSkKbG9jYWwgYWJhPWNfYTpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudCgibW91c2VfY2xpY2siLGNfYSwibW91c2VfY2xpY2siLGRfYSxfYWEsYWFhKWlmKGFiYT09ZmFsc2UpdGhlbiByZXR1cm4gYWJhIGVuZDtpZihjX2EucGFyZW50fj1uaWwpdGhlbgpjX2EucGFyZW50OnNldEZvY3VzZWRPYmplY3QoY19hKWVuZDtjX2E6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmF3PWZ1bmN0aW9uKGNfYSkKaWYoCmNfYS5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIGRfYSxfYWE9Y19hOmdldEFuY2hvclBvc2l0aW9uKCkKZm9yIGFhYSxiYWEgaW4gcGFpcnMoYmMpZG8KaWYoYmFhPT0KY19hOmdldFZhbHVlKCkpdGhlbiBpZihhX2E9PSJsZWZ0Iil0aGVuCmNfYS5wYXJlbnQ6d3JpdGVUZXh0KGJhYS54K2RfYS0xLGJhYS55K19hYS0xLF9fYSxfZCxhZCkKY19hLnBhcmVudDp3cml0ZVRleHQoYmFhLngrMiArZF9hLTEsYmFhLnkrX2FhLTEsYmFhLnRleHQsY2MsZGMpZW5kIGVsc2UKY19hLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveCgKYmFhLngrZF9hLTEsYmFhLnkrX2FhLTEsMSwxLGJkIG9yIGNfYS5iZ0NvbG9yKQpjX2EucGFyZW50OndyaXRlVGV4dChiYWEueCsyICtkX2EtMSxiYWEueStfYWEtMSxiYWEudGV4dCxiYWEuYmdDb2wsYmFhLmZnQ29sKWVuZCBlbmQ7cmV0dXJuIHRydWUgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGNfYSkKY19hLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGNfYSkKaWYoX2MuaW5pdChjX2EpKXRoZW4KY19hLmJnQ29sb3I9Y19hLnBhcmVudDpnZXRUaGVtZSgiTWVudWJhckJHIiljX2EuZmdDb2xvcj1jX2EucGFyZW50OmdldFRoZW1lKCJNZW51YmFyRkciKQpjYz1jX2EucGFyZW50OmdldFRoZW1lKCJTZWxlY3Rpb25CRyIpZGM9Y19hLnBhcmVudDpnZXRUaGVtZSgiU2VsZWN0aW9uVGV4dCIpCl9kPWNfYS5wYXJlbnQ6Z2V0VGhlbWUoIk1lbnViYXJCRyIpYWQ9Y19hLnBhcmVudDpnZXRUaGVtZSgiTWVudWJhclRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShiX2EsX2MpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJNZW51YmFyIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ1dGlscyIpCmxvY2FsIGNiPWJiLmdldFZhbHVlRnJvbVhNTDtsb2NhbCBkYj1kYSgidEhleCIpCnJldHVybgpmdW5jdGlvbihfYylsb2NhbCBhYz1hYihfYylsb2NhbCBiYz0iTWVudWJhciJsb2NhbCBjYz17fWFjLndpZHRoPTMwO2FjLmhlaWdodD0xCmFjOnNldFpJbmRleCg1KWxvY2FsIGRjPXt9bG9jYWwgX2Q7bG9jYWwgYWQ7bG9jYWwgYmQ9dHJ1ZTtsb2NhbCBjZD0ibGVmdCJsb2NhbCBkZD0wO2xvY2FsIF9fYT0xO2xvY2FsIGFfYT1mYWxzZQpsb2NhbCBmdW5jdGlvbiBiX2EoKWxvY2FsIGNfYT0wO2xvY2FsIGRfYT0wCmxvY2FsIF9hYT1jYzpnZXRXaWR0aCgpCmZvciBuPTEsI2RjIGRvIGlmKGRfYStkY1tuXS50ZXh0OmxlbigpK19fYSoyID5fYWEpdGhlbgppZigKZF9hPF9hYSl0aGVuCmNfYT1jX2ErIChkY1tuXS50ZXh0OmxlbigpK19fYSoyIC0gKF9hYS1kX2EpKWVsc2UgY19hPWNfYStkY1tuXS50ZXh0OmxlbigpK19fYSoyIGVuZCBlbmQ7ZF9hPQpkX2ErZGNbbl0udGV4dDpsZW4oKStfX2EqMiBlbmQ7cmV0dXJuIGNfYSBlbmQKY2M9e2dldFR5cGU9ZnVuY3Rpb24oY19hKXJldHVybiBiYyBlbmQsYWRkSXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsLi4uKQp0YWJsZS5pbnNlcnQoZGMse3RleHQ9dG9zdHJpbmcoZF9hKSxiZ0NvbD1fYWEgb3IgY19hLmJnQ29sb3IsZmdDb2w9YWFhIG9yIGNfYS5mZ0NvbG9yLGFyZ3M9ey4uLn19KWlmKCNkYz09MSl0aGVuIGNfYTpzZXRWYWx1ZShkY1sxXSllbmQKY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLGdldEFsbD1mdW5jdGlvbihjX2EpcmV0dXJuCmRjIGVuZCxnZXRJdGVtSW5kZXg9ZnVuY3Rpb24oY19hKWxvY2FsIGRfYT1jX2E6Z2V0VmFsdWUoKWZvciBfYWEsYWFhIGluIHBhaXJzKGRjKWRvCmlmKGFhYT09ZF9hKXRoZW4gcmV0dXJuIF9hYSBlbmQgZW5kIGVuZCxjbGVhcj1mdW5jdGlvbihjX2EpCmRjPXt9Y19hOnNldFZhbHVlKHt9LGZhbHNlKWNfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxzZXRTcGFjZT1mdW5jdGlvbihjX2EsZF9hKV9fYT0KZF9hIG9yIF9fYTtjX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsc2V0T2Zmc2V0PWZ1bmN0aW9uKGNfYSxkX2EpZGQ9CmRfYSBvciAwO2lmKGRkPDApdGhlbiBkZD0wIGVuZDtsb2NhbCBfYWE9Yl9hKClpZihkZD5fYWEpdGhlbiBkZD1fYWEgZW5kCmNfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxnZXRPZmZzZXQ9ZnVuY3Rpb24oY19hKXJldHVybiBkZCBlbmQsc2V0U2Nyb2xsYWJsZT1mdW5jdGlvbihjX2EsZF9hKQphX2E9ZF9hO2lmKGRfYT09bmlsKXRoZW4gYV9hPXRydWUgZW5kO3JldHVybiBjX2EgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihjX2EsZF9hKQphYy5zZXRWYWx1ZXNCeVhNTERhdGEoY19hLGRfYSlpZihjYigic2VsZWN0aW9uQkciLGRfYSl+PW5pbCl0aGVuCl9kPWNvbG9yc1tjYigic2VsZWN0aW9uQkciLGRfYSldZW5kO2lmKGNiKCJzZWxlY3Rpb25GRyIsZF9hKX49bmlsKXRoZW4KYWQ9Y29sb3JzW2NiKCJzZWxlY3Rpb25GRyIsZF9hKV1lbmQ7aWYoY2IoInNjcm9sbGFibGUiLGRfYSl+PW5pbCl0aGVuCmlmCihjYigic2Nyb2xsYWJsZSIsZF9hKSl0aGVuIGNfYTpzZXRTY3JvbGxhYmxlKHRydWUpZWxzZSBjX2E6c2V0U2Nyb2xsYWJsZShmYWxzZSllbmQgZW5kCmlmKApjYigib2Zmc2V0IixkX2Epfj1uaWwpdGhlbiBjX2E6c2V0T2Zmc2V0KGNiKCJvZmZzZXQiLGRfYSkpZW5kCmlmKGNiKCJzcGFjZSIsZF9hKX49bmlsKXRoZW4gX19hPWNiKCJzcGFjZSIsZF9hKWVuZAppZihkX2FbIml0ZW0iXX49bmlsKXRoZW4gbG9jYWwgX2FhPWRfYVsiaXRlbSJdCmlmKF9hYS5wcm9wZXJ0aWVzfj1uaWwpdGhlbiBfYWE9e19hYX1lbmQ7Zm9yIGFhYSxiYWEgaW4gcGFpcnMoX2FhKWRvCmNfYTphZGRJdGVtKGNiKCJ0ZXh0IixiYWEpLGNvbG9yc1tjYigiYmciLGJhYSldLGNvbG9yc1tjYigiZmciLGJhYSldKWVuZCBlbmQ7cmV0dXJuIGNfYSBlbmQscmVtb3ZlSXRlbT1mdW5jdGlvbihjX2EsZF9hKQp0YWJsZS5yZW1vdmUoZGMsZF9hKWNfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxnZXRJdGVtPWZ1bmN0aW9uKGNfYSxkX2EpCnJldHVybiBkY1tkX2FdZW5kLGdldEl0ZW1Db3VudD1mdW5jdGlvbihjX2EpcmV0dXJuI2RjIGVuZCxlZGl0SXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsYmFhLC4uLil0YWJsZS5yZW1vdmUoZGMsZF9hKQp0YWJsZS5pbnNlcnQoZGMsZF9hLHt0ZXh0PV9hYSxiZ0NvbD0KYWFhIG9yIGNfYS5iZ0NvbG9yLGZnQ29sPWJhYSBvciBjX2EuZmdDb2xvcixhcmdzPXsuLi59fSljX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsc2VsZWN0SXRlbT1mdW5jdGlvbihjX2EsZF9hKWNfYTpzZXRWYWx1ZSgKZGNbZF9hXW9ye30sZmFsc2UpY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLHNldFNlbGVjdGVkSXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEpX2Q9CmRfYSBvciBjX2EuYmdDb2xvcjthZD1fYWEgb3IgY19hLmZnQ29sb3I7YmQ9YWFhCmNfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxtb3VzZUhhbmRsZXI9ZnVuY3Rpb24oY19hLGRfYSxfYWEsYWFhKQppZgooYWMubW91c2VIYW5kbGVyKGNfYSxkX2EsX2FhLGFhYSkpdGhlbgpsb2NhbCBiYWEsY2FhPWNfYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGNfYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGRhYSxfYmE9Y19hOmdldFNpemUoKWxvY2FsIGFiYT0wCmZvciBuPTEsI2RjIGRvCmlmKGRjW25dfj1uaWwpdGhlbgppZgooYmFhK2FiYTw9X2FhK2RkKWFuZChiYWErYWJhKwpkY1tuXS50ZXh0OmxlbigpKyAoX19hKjIpPl9hYStkZClhbmQoY2FhPT1hYWEpdGhlbgpjX2E6c2V0VmFsdWUoZGNbbl0pCmNfYTpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudChldmVudCxjX2EsZXZlbnQsMCxfYWEsYWFhLGRjW25dKWVuZDthYmE9YWJhK2RjW25dLnRleHQ6bGVuKCkrX19hKjIgZW5kIGVuZDtjX2E6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEpCmlmCihhYy5zY3JvbGxIYW5kbGVyKGNfYSxkX2EsX2FhLGFhYSkpdGhlbiBpZihhX2EpdGhlbiBkZD1kZCtkX2E7aWYoZGQ8MCl0aGVuIGRkPTAgZW5kO2xvY2FsIGJhYT1iX2EoKWlmKGRkPmJhYSl0aGVuIGRkPWJhYSBlbmQKY19hOnVwZGF0ZURyYXcoKWVuZDtyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmF3PWZ1bmN0aW9uKGNfYSkKaWYKKGFjLmRyYXcoY19hKSl0aGVuCmlmKGNfYS5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIGRfYSxfYWE9Y19hOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgYWFhLGJhYT1jX2E6Z2V0U2l6ZSgpaWYoY19hLmJnQ29sb3J+PWZhbHNlKXRoZW4KY19hLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChkX2EsX2FhLGFhYSxiYWEsY19hLmJnQ29sb3IpZW5kO2xvY2FsIGNhYT0iImxvY2FsIGRhYT0iImxvY2FsIF9iYT0iIgpmb3IgYWJhLGJiYSBpbiBwYWlycyhkYylkbwpsb2NhbCBjYmE9CigiICIpOnJlcChfX2EpLi5iYmEudGV4dC4uICgiICIpOnJlcChfX2EpY2FhPWNhYS4uY2JhCmlmKGJiYT09Y19hOmdldFZhbHVlKCkpdGhlbiBkYWE9ZGFhLi4KZGJbX2Qgb3IgYmJhLmJnQ29sIG9yIGNfYS5iZ0NvbG9yXTpyZXAoY2JhOmxlbigpKV9iYT1fYmEuLgpkYlsKYWQgb3IgYmJhLkZnQ29sIG9yIGNfYS5mZ0NvbG9yXTpyZXAoY2JhOmxlbigpKWVsc2UgZGFhPWRhYS4uCmRiW2JiYS5iZ0NvbCBvciBjX2EuYmdDb2xvcl06cmVwKGNiYTpsZW4oKSlfYmE9X2JhLi4KZGJbYmJhLkZnQ29sIG9yIGNfYS5mZ0NvbG9yXTpyZXAoY2JhOmxlbigpKWVuZCBlbmQKY19hLnBhcmVudDpzZXRUZXh0KGRfYSxfYWEsY2FhOnN1YihkZCsxLGFhYStkZCkpCmNfYS5wYXJlbnQ6c2V0QkcoZF9hLF9hYSxkYWE6c3ViKGRkKzEsYWFhK2RkKSkKY19hLnBhcmVudDpzZXRGRyhkX2EsX2FhLF9iYTpzdWIoZGQrMSxhYWErZGQpKWVuZCBlbmQgZW5kLGluaXQ9ZnVuY3Rpb24oY19hKQpjX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsY19hKWNfYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3Njcm9sbCIsY19hKQppZgooYWMuaW5pdChjX2EpKXRoZW4gY19hLmJnQ29sb3I9Y19hLnBhcmVudDpnZXRUaGVtZSgiTWVudWJhckJHIikKY19hLmZnQ29sb3I9Y19hLnBhcmVudDpnZXRUaGVtZSgiTWVudWJhclRleHQiKV9kPWNfYS5wYXJlbnQ6Z2V0VGhlbWUoIlNlbGVjdGlvbkJHIikKYWQ9Y19hLnBhcmVudDpnZXRUaGVtZSgiU2VsZWN0aW9uVGV4dCIpZW5kIGVuZH1yZXR1cm4gc2V0bWV0YXRhYmxlKGNjLGFjKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiQnV0dG9uIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ1dGlscyIpCmxvY2FsIGNiPWJiLmdldFZhbHVlRnJvbVhNTDtsb2NhbCBkYj1kYSgidEhleCIpCnJldHVybgpmdW5jdGlvbihfYylsb2NhbCBhYz1hYihfYylsb2NhbCBiYz0iQnV0dG9uImxvY2FsIGNjPSJjZW50ZXIibG9jYWwgZGM9ImNlbnRlciIKYWM6c2V0WkluZGV4KDUpYWM6c2V0VmFsdWUoIkJ1dHRvbiIpYWMud2lkdGg9MTI7YWMuaGVpZ2h0PTMKbG9jYWwgX2Q9e2luaXQ9ZnVuY3Rpb24oYWQpCmlmKGFjLmluaXQoYWQpKXRoZW4KYWQuYmdDb2xvcj1hZC5wYXJlbnQ6Z2V0VGhlbWUoIkJ1dHRvbkJHIilhZC5mZ0NvbG9yPWFkLnBhcmVudDpnZXRUaGVtZSgiQnV0dG9uVGV4dCIpZW5kIGVuZCxnZXRUeXBlPWZ1bmN0aW9uKGFkKXJldHVybiBiYyBlbmQsc2V0SG9yaXpvbnRhbEFsaWduPWZ1bmN0aW9uKGFkLGJkKQpjYz1iZDthZDp1cGRhdGVEcmF3KClyZXR1cm4gYWQgZW5kLHNldFZlcnRpY2FsQWxpZ249ZnVuY3Rpb24oYWQsYmQpZGM9YmQKYWQ6dXBkYXRlRHJhdygpcmV0dXJuIGFkIGVuZCxzZXRUZXh0PWZ1bmN0aW9uKGFkLGJkKWFjOnNldFZhbHVlKHRvc3RyaW5nKGJkKSkKYWQ6dXBkYXRlRHJhdygpcmV0dXJuIGFkIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYWQsYmQpCmFjLnNldFZhbHVlc0J5WE1MRGF0YShhZCxiZCkKaWYoY2IoInRleHQiLGJkKX49bmlsKXRoZW4gYWQ6c2V0VGV4dChjYigidGV4dCIsYmQpKWVuZDtpZihjYigiaG9yaXpvbnRhbEFsaWduIixiZCl+PW5pbCl0aGVuCmNjPWNiKCJob3Jpem9udGFsQWxpZ24iLGJkKWVuZDtpZihjYigidmVydGljYWxBbGlnbiIsYmQpfj1uaWwpdGhlbgpkYz1jYigidmVydGljYWxBbGlnbiIsYmQpZW5kO3JldHVybiBhZCBlbmQsZHJhdz1mdW5jdGlvbihhZCkKaWYKKGFjLmRyYXcoYWQpKXRoZW4KaWYoYWQucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBiZCxjZD1hZDpnZXRBbmNob3JQb3NpdGlvbigpCmxvY2FsIGRkLF9fYT1hZDpnZXRTaXplKClsb2NhbCBhX2E9YmIuZ2V0VGV4dFZlcnRpY2FsQWxpZ24oX19hLGRjKQpmb3Igbj0xLF9fYSBkbwppZihuPT1hX2EpdGhlbgpsb2NhbCBiX2E9YWQ6Z2V0VmFsdWUoKQphZC5wYXJlbnQ6c2V0VGV4dChiZCsgKGRkLzIgLWJfYTpsZW4oKS8yKSxjZCsgKG4tMSksYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiX2EsYl9hOmxlbigpLGNjKSkKYWQucGFyZW50OnNldEZHKGJkKyAoZGQvMiAtYl9hOmxlbigpLzIpLGNkKyAobi0xKSxiYi5nZXRUZXh0SG9yaXpvbnRhbEFsaWduKGRiW2FkLmZnQ29sb3JdOnJlcChiX2E6bGVuKCkpLGJfYTpsZW4oKSxjYykpZW5kIGVuZCBlbmQgZW5kIGVuZH1yZXR1cm4gc2V0bWV0YXRhYmxlKF9kLGFjKWVuZCBlbmQ7YWFbImxpYnJhcmllcyJdPXt9CmFhWyJsaWJyYXJpZXMiXVsiYmFzYWx0RHJhdyJdPWZ1bmN0aW9uKC4uLikKbG9jYWwgYWI9ZGEoInRIZXgiKWxvY2FsIGJiLGNiPXN0cmluZy5zdWIsc3RyaW5nLnJlcApyZXR1cm4KZnVuY3Rpb24oZGIpbG9jYWwgX2M9ZGIgb3IgdGVybS5jdXJyZW50KCkKbG9jYWwgYWM7bG9jYWwgYmMsY2M9X2MuZ2V0U2l6ZSgpbG9jYWwgZGM9e31sb2NhbCBfZD17fWxvY2FsIGFkPXt9bG9jYWwgYmQ9e31sb2NhbCBjZD17fWxvY2FsIGRkPXt9bG9jYWwgX19hO2xvY2FsIGFfYT17fWxvY2FsIGZ1bmN0aW9uIGJfYSgpCl9fYT1jYigiICIsYmMpCmZvciBuPTAsMTUgZG8gbG9jYWwgZGFhPTIgXm47bG9jYWwgX2JhPWFiW2RhYV1hX2FbZGFhXT1jYihfYmEsYmMpZW5kIGVuZDtiX2EoKQpsb2NhbCBmdW5jdGlvbiBjX2EoKWJfYSgpbG9jYWwgZGFhPV9fYQpsb2NhbCBfYmE9YV9hW2NvbG9ycy53aGl0ZV1sb2NhbCBhYmE9YV9hW2NvbG9ycy5ibGFja10KZm9yIGN1cnJlbnRZPTEsY2MgZG8KZGNbY3VycmVudFldPWJiKApkY1tjdXJyZW50WV09PW5pbCBhbmQgZGFhIG9yCmRjW2N1cnJlbnRZXS4uZGFhOnN1YigxLGJjLWRjW2N1cnJlbnRZXTpsZW4oKSksMSxiYykKYWRbY3VycmVudFldPWJiKGFkW2N1cnJlbnRZXT09bmlsIGFuZCBfYmEgb3IgYWRbY3VycmVudFldLi5fYmE6c3ViKDEsYmMtCmFkW2N1cnJlbnRZXTpsZW4oKSksMSxiYykKX2RbY3VycmVudFldPWJiKF9kW2N1cnJlbnRZXT09bmlsIGFuZCBhYmEgb3IgX2RbY3VycmVudFldLi5hYmE6c3ViKDEsYmMtCl9kW2N1cnJlbnRZXTpsZW4oKSksMSxiYyllbmQgZW5kO2NfYSgpCmxvY2FsIGZ1bmN0aW9uIGRfYShkYWEsX2JhLGFiYSkKaWYoX2JhPj0xKWFuZChfYmE8PWNjKXRoZW4KaWYKKGRhYSthYmE6bGVuKCk+MClhbmQoZGFhPD1iYyl0aGVuIGxvY2FsIGJiYT1kY1tfYmFdbG9jYWwgY2JhO2xvY2FsIGRiYT1kYWErI2FiYS0xCmlmKGRhYTwxKXRoZW4gbG9jYWwgX2NhPTEgLWRhYSsxCmxvY2FsIGFjYT1iYy1kYWErMTthYmE9YmIoYWJhLF9jYSxhY2EpZWxzZWlmKGRiYT5iYyl0aGVuIGxvY2FsIF9jYT1iYy1kYWErMTthYmE9YmIoYWJhLDEsX2NhKWVuZAppZihkYWE+MSl0aGVuIGxvY2FsIF9jYT1kYWEtMTtjYmE9YmIoYmJhLDEsX2NhKS4uYWJhIGVsc2UgY2JhPWFiYSBlbmQ7aWYgZGJhPGJjIHRoZW4gY2JhPWNiYS4uYmIoYmJhLGRiYSsxLGJjKWVuZApkY1tfYmFdPWNiYSBlbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBfYWEoZGFhLF9iYSxhYmEpCmlmKF9iYT49MSlhbmQoX2JhPD1jYyl0aGVuCmlmKGRhYSthYmE6bGVuKCk+MClhbmQoZGFhPD1iYyl0aGVuCmxvY2FsIGJiYT1fZFtfYmFdbG9jYWwgY2JhO2xvY2FsIGRiYT1kYWErI2FiYS0xCmlmKGRhYTwxKXRoZW4KYWJhPWJiKGFiYSwxIC1kYWErMSxiYy1kYWErMSllbHNlaWYoZGJhPmJjKXRoZW4gYWJhPWJiKGFiYSwxLGJjLWRhYSsxKWVuZAppZihkYWE+MSl0aGVuIGNiYT1iYihiYmEsMSxkYWEtMSkuLmFiYSBlbHNlIGNiYT1hYmEgZW5kO2lmIGRiYTxiYyB0aGVuIGNiYT1jYmEuLmJiKGJiYSxkYmErMSxiYyllbmQKX2RbX2JhXT1jYmEgZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYWFhKGRhYSxfYmEsYWJhKQppZihfYmE+PTEpYW5kKF9iYTw9Y2MpdGhlbgppZihkYWErYWJhOmxlbigpPjApYW5kKGRhYTw9YmMpdGhlbgpsb2NhbCBiYmE9YWRbX2JhXWxvY2FsIGNiYTtsb2NhbCBkYmE9ZGFhKyNhYmEtMQppZihkYWE8MSl0aGVuIGxvY2FsIF9jYT0xIC1kYWErMTtsb2NhbCBhY2E9YmMtZGFhKzEKYWJhPWJiKGFiYSxfY2EsYWNhKWVsc2VpZihkYmE+YmMpdGhlbiBsb2NhbCBfY2E9YmMtZGFhKzE7YWJhPWJiKGFiYSwxLF9jYSllbmQKaWYoZGFhPjEpdGhlbiBsb2NhbCBfY2E9ZGFhLTE7Y2JhPWJiKGJiYSwxLF9jYSkuLmFiYSBlbHNlIGNiYT1hYmEgZW5kO2lmIGRiYTxiYyB0aGVuIGNiYT1jYmEuLmJiKGJiYSxkYmErMSxiYyllbmQKYWRbX2JhXT1jYmEgZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYmFhKGRhYSxfYmEsYWJhLGJiYSxjYmEpCmlmKCNhYmE9PSNiYmEpb3IoI2FiYT09I2NiYSl0aGVuCmlmKF9iYT49MSlhbmQoX2JhPD1jYyl0aGVuCmlmKApkYWErYWJhOmxlbigpPjApYW5kKGRhYTw9YmMpdGhlbiBsb2NhbCBkYmE9ZGNbX2JhXWxvY2FsIF9jYT1hZFtfYmFdbG9jYWwgYWNhPV9kW19iYV0KbG9jYWwgYmNhLGNjYSxkY2E7bG9jYWwgX2RhPWRhYSsjYWJhLTEKaWYoZGFhPDEpdGhlbiBsb2NhbCBhZGE9MSAtZGFhKzE7bG9jYWwgYmRhPWJjLWRhYSsxCmFiYT1iYihhYmEsYWRhLGJkYSliYmE9YmIoYmJhLGFkYSxiZGEpY2JhPWJiKGNiYSxhZGEsYmRhKWVsc2VpZihfZGE+YmMpdGhlbiBsb2NhbCBhZGE9YmMtZGFhKzEKYWJhPWJiKGFiYSwxLGFkYSliYmE9YmIoYmJhLDEsYWRhKWNiYT1iYihjYmEsMSxhZGEpZW5kCmlmKGRhYT4xKXRoZW4gbG9jYWwgYWRhPWRhYS0xO2JjYT1iYihkYmEsMSxhZGEpLi5hYmEKY2NhPWJiKF9jYSwxLGFkYSkuLmJiYTtkY2E9YmIoYWNhLDEsYWRhKS4uY2JhIGVsc2UgYmNhPWFiYTtjY2E9YmJhO2RjYT1jYmEgZW5kCmlmIF9kYTxiYyB0aGVuIGJjYT1iY2EuLmJiKGRiYSxfZGErMSxiYykKY2NhPWNjYS4uYmIoX2NhLF9kYSsxLGJjKWRjYT1kY2EuLmJiKGFjYSxfZGErMSxiYyllbmQ7ZGNbX2JhXT1iY2E7YWRbX2JhXT1jY2E7X2RbX2JhXT1kY2EgZW5kIGVuZCBlbmQgZW5kCmxvY2FsIGNhYT17c2V0U2l6ZT1mdW5jdGlvbihkYWEsX2JhKWJjLGNjPWRhYSxfYmE7Y19hKCllbmQsc2V0TWlycm9yPWZ1bmN0aW9uKGRhYSlhYz1kYWEgZW5kLHNldEJHPWZ1bmN0aW9uKGRhYSxfYmEsYWJhKQpfYWEoZGFhLF9iYSxhYmEpZW5kLHNldFRleHQ9ZnVuY3Rpb24oZGFhLF9iYSxhYmEpZF9hKGRhYSxfYmEsYWJhKWVuZCxzZXRGRz1mdW5jdGlvbihkYWEsX2JhLGFiYSkKYWFhKGRhYSxfYmEsYWJhKWVuZCxibGl0PWZ1bmN0aW9uKGRhYSxfYmEsYWJhLGJiYSxjYmEpYmFhKGRhYSxfYmEsYWJhLGJiYSxjYmEpZW5kLGRyYXdCYWNrZ3JvdW5kQm94PWZ1bmN0aW9uKGRhYSxfYmEsYWJhLGJiYSxjYmEpCmZvciBuPTEsYmJhCmRvIF9hYShkYWEsX2JhKyAobi0xKSxjYihhYltjYmFdLGFiYSkpZW5kIGVuZCxkcmF3Rm9yZWdyb3VuZEJveD1mdW5jdGlvbihkYWEsX2JhLGFiYSxiYmEsY2JhKWZvciBuPTEsYmJhIGRvCmFhYShkYWEsX2JhKyAobi0xKSxjYihhYltjYmFdLGFiYSkpZW5kIGVuZCxkcmF3VGV4dEJveD1mdW5jdGlvbihkYWEsX2JhLGFiYSxiYmEsY2JhKQpmb3Igbj0xLGJiYSBkbyBkX2EoZGFhLApfYmErIChuLTEpLGNiKGNiYSxhYmEpKWVuZCBlbmQsd3JpdGVUZXh0PWZ1bmN0aW9uKGRhYSxfYmEsYWJhLGJiYSxjYmEpCmlmKGFiYX49bmlsKXRoZW4gZF9hKGRhYSxfYmEsYWJhKWlmCihiYmF+PW5pbClhbmQoYmJhfj1mYWxzZSl0aGVuCl9hYShkYWEsX2JhLGNiKGFiW2JiYV0sYWJhOmxlbigpKSllbmQ7aWYoY2Jhfj1uaWwpYW5kKGNiYX49ZmFsc2UpdGhlbgphYWEoZGFhLF9iYSxjYihhYltjYmFdLGFiYTpsZW4oKSkpZW5kIGVuZCBlbmQsdXBkYXRlPWZ1bmN0aW9uKCkKbG9jYWwgZGFhLF9iYT1fYy5nZXRDdXJzb3JQb3MoKWxvY2FsIGFiYT1mYWxzZQppZihfYy5nZXRDdXJzb3JCbGlua349bmlsKXRoZW4gYWJhPV9jLmdldEN1cnNvckJsaW5rKCllbmQ7X2Muc2V0Q3Vyc29yQmxpbmsoZmFsc2UpaWYoYWN+PW5pbCl0aGVuCmFjLnNldEN1cnNvckJsaW5rKGZhbHNlKWVuZApmb3Igbj0xLGNjIGRvIF9jLnNldEN1cnNvclBvcygxLG4pCl9jLmJsaXQoZGNbbl0sYWRbbl0sX2Rbbl0paWYoYWN+PW5pbCl0aGVuIGFjLnNldEN1cnNvclBvcygxLG4pCmFjLmJsaXQoZGNbbl0sYWRbbl0sX2Rbbl0pZW5kIGVuZDtfYy5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3JzLmJsYWNrKQpfYy5zZXRDdXJzb3JCbGluayhhYmEpX2Muc2V0Q3Vyc29yUG9zKGRhYSxfYmEpCmlmKGFjfj1uaWwpdGhlbgphYy5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3JzLmJsYWNrKWFjLnNldEN1cnNvckJsaW5rKGFiYSlhYy5zZXRDdXJzb3JQb3MoZGFhLF9iYSllbmQgZW5kLHNldFRlcm09ZnVuY3Rpb24oZGFhKQpfYz1kYWEgZW5kfXJldHVybiBjYWEgZW5kIGVuZAphYVsibGlicmFyaWVzIl1bInV0aWxzIl09ZnVuY3Rpb24oLi4uKQpsb2NhbCBhYixiYixjYj1zdHJpbmcuc3ViLHN0cmluZy5maW5kLHN0cmluZy5yZXZlcnNlCmxvY2FsIGZ1bmN0aW9uIGRiKGFkLGJkKWxvY2FsIGNkPXt9aWYgYWQ9PSIib3IgYmQ9PSIidGhlbiByZXR1cm4gY2QgZW5kO2xvY2FsIGRkPTEKbG9jYWwgX19hLGFfYT1iYihhZCxiZCxkZCl3aGlsZSBfX2EgZG8gdGFibGUuaW5zZXJ0KGNkLGFiKGFkLGRkLF9fYS0xKSlkZD1hX2ErMQpfX2EsYV9hPWJiKGFkLGJkLGRkKWVuZAp0YWJsZS5pbnNlcnQoY2QsYWIoYWQsZGQpKXJldHVybiBjZCBlbmQKbG9jYWwgX2M9e1swXT17OCw0LDMsNiw1fSx7NCwxNCw4LDd9LHs2LDEwLDgsN30sezksMTEsOCwwfSx7MSwxNCw4LDB9LHsxMywxMiw4LDB9LHsyLDEwLDgsMH0sezE1LDgsMTAsMTEsMTIsMTR9LHswLDcsMSw5LDIsMTN9LHszLDExLDgsN30sezIsNiw3LDE1fSx7OSwzLDcsMTV9LHsxMyw1LDcsMTV9LHs1LDEyLDgsN30sezEsNCw3LDE1fSx7NywxMCwxMSwxMiwxNH19bG9jYWwgYWMsYmMsY2M9e30se30se31mb3IgaT0wLDE1IGRvIGJjWzIgXmldPWkgZW5kCmRvIGxvY2FsIGFkPSIwMTIzNDU2Nzg5YWJjZGVmIgpmb3IgaT0xLDE2IGRvIGFjW2FkOnN1YihpLGkpXT0KaS0xO2FjW2ktMV09YWQ6c3ViKGksaSkKY2NbYWQ6c3ViKGksaSldPTIgXiAoaS0xKWNjWzIgXiAoaS0xKV09YWQ6c3ViKGksaSlsb2NhbCBiZD1fY1tpLTFdZm9yIGk9MSwjYmQgZG8KYmRbaV09MiBeYmRbaV1lbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBkYyhhZClsb2NhbCBiZD1fY1tiY1thZFsjYWRdWzFdXV0KZm9yIGo9MSwjYmQgZG8gbG9jYWwgY2Q9YmRbal1mb3IgaT0xLCNhZC0xIGRvIGlmCmFkW2ldWzFdPT1jZCB0aGVuIHJldHVybiBpIGVuZCBlbmQgZW5kO3JldHVybiAxIGVuZApsb2NhbCBmdW5jdGlvbiBfZChhZCxiZCkKaWYgbm90IGJkIHRoZW4gbG9jYWwgZGQ9e31iZD17fWZvciBpPTEsNiBkbyBsb2NhbCBfX2E9YWRbaV1sb2NhbCBhX2E9YmRbX19hXQpiZFtfX2FdLGRkW2ldPWFfYSBhbmQoYV9hKzEpb3IgMSxfX2EgZW5kO2FkPWRkIGVuZDtsb2NhbCBjZD17fWZvciBkZCxfX2EgaW4gcGFpcnMoYmQpZG8gY2RbI2NkKzFdPXtkZCxfX2F9ZW5kCmlmI2NkPjEgdGhlbgp3aGlsZQojY2Q+MiBkbwp0YWJsZS5zb3J0KGNkLGZ1bmN0aW9uKGRfYSxfYWEpcmV0dXJuIGRfYVsyXT5fYWFbMl1lbmQpbG9jYWwgX19hLGFfYT1kYyhjZCksI2NkO2xvY2FsIGJfYSxjX2E9Y2RbYV9hXVsxXSxjZFtfX2FdWzFdCmZvciBpPTEsNiBkbyBpZiBhZFtpXT09Yl9hIHRoZW4KYWRbaV09Y19hO2NkW19fYV1bMl09Y2RbX19hXVsyXSsxIGVuZCBlbmQ7Y2RbYV9hXT1uaWwgZW5kO2xvY2FsIGRkPTEyOApmb3IgaT0xLCNhZC0xIGRvIGlmIGFkW2ldfj1hZFs2XXRoZW4gZGQ9ZGQrMiBeIChpLTEpZW5kIGVuZDtyZXR1cm4gc3RyaW5nLmNoYXIoZGQpLApjY1tjZFsxXVsxXT09YWRbNl1hbmQgY2RbMl1bMV1vciBjZFsxXVsxXV0sY2NbYWRbNl1dZWxzZQpyZXR1cm4iXDEyOCIsY2NbYWRbMV1dLGNjW2FkWzFdXWVuZCBlbmQKcmV0dXJuCntnZXRUZXh0SG9yaXpvbnRhbEFsaWduPWZ1bmN0aW9uKGFkLGJkLGNkLGRkKWFkPWFiKGFkLDEsYmQpbG9jYWwgX19hPWJkLXN0cmluZy5sZW4oYWQpCmlmKGNkPT0icmlnaHQiKXRoZW4gYWQ9c3RyaW5nLnJlcCgKZGQgb3IiICIsX19hKS4uYWQgZWxzZWlmKGNkPT0iY2VudGVyIil0aGVuCmFkPXN0cmluZy5yZXAoZGQgb3IiICIsbWF0aC5mbG9vcigKX19hLzIpKS4uYWQuLgpzdHJpbmcucmVwKGRkIG9yIiAiLG1hdGguZmxvb3IoX19hLzIpKQphZD1hZC4uIChzdHJpbmcubGVuKGFkKTxiZCBhbmQoZGQgb3IiICIpb3IiIillbHNlIGFkPWFkLi5zdHJpbmcucmVwKGRkIG9yIiAiLF9fYSllbmQ7cmV0dXJuIGFkIGVuZCxnZXRUZXh0VmVydGljYWxBbGlnbj1mdW5jdGlvbihhZCxiZCkKbG9jYWwgY2Q9MAppZihiZD09ImNlbnRlciIpdGhlbiBjZD1tYXRoLmNlaWwoYWQvMilpZihjZDwxKXRoZW4gY2Q9MSBlbmQgZW5kO2lmKGJkPT0iYm90dG9tIil0aGVuIGNkPWFkIGVuZDtpZihjZDwxKXRoZW4gY2Q9MSBlbmQ7cmV0dXJuIGNkIGVuZCxycGFpcnM9ZnVuY3Rpb24oYWQpcmV0dXJuIGZ1bmN0aW9uKGJkLGNkKWNkPQpjZC0xO2lmIGNkfj0wIHRoZW4gcmV0dXJuIGNkLGJkW2NkXWVuZCBlbmQsYWQsCiNhZCsxIGVuZCx0YWJsZUNvdW50PWZ1bmN0aW9uKGFkKQpsb2NhbCBiZD0wO2lmKGFkfj1uaWwpdGhlbiBmb3IgY2QsZGQgaW4gcGFpcnMoYWQpZG8gYmQ9YmQrMSBlbmQgZW5kO3JldHVybiBiZCBlbmQsc3BsaXRTdHJpbmc9ZGIsY3JlYXRlVGV4dD1mdW5jdGlvbihhZCxiZCkKbG9jYWwgY2Q9ZGIoYWQsIlxuIilsb2NhbCBkZD17fQpmb3IgX19hLGFfYSBpbiBwYWlycyhjZClkbyBpZigjYV9hPT0wKXRoZW4gdGFibGUuaW5zZXJ0KGRkLCIiKWVuZAp3aGlsZSNhX2E+CmJkIGRvIGxvY2FsIGJfYT1iYihjYihhYihhX2EsMSxiZCkpLCIgIilpZiBub3QgYl9hIHRoZW4gYl9hPWJkIGVsc2UKYl9hPWJkLWJfYSsxIGVuZDtsb2NhbCBjX2E9YWIoYV9hLDEsYl9hKQp0YWJsZS5pbnNlcnQoZGQsY19hKWFfYT1hYihhX2EsYl9hKzEpZW5kO2lmI2FfYT4wIHRoZW4gdGFibGUuaW5zZXJ0KGRkLGFfYSllbmQgZW5kO3JldHVybiBkZCBlbmQsZ2V0VmFsdWVGcm9tWE1MPWZ1bmN0aW9uKGFkLGJkKQpsb2NhbCBjZDtpZih0eXBlKGJkKX49InRhYmxlIil0aGVuIHJldHVybiBlbmQ7aWYoYmRbYWRdfj1uaWwpdGhlbgppZgoodHlwZShiZFthZF0pPT0idGFibGUiKXRoZW4gaWYoYmRbYWRdLnZhbHVlfj1uaWwpdGhlbiBjZD1iZFthZF06dmFsdWUoKWVuZCBlbmQgZW5kO2lmKGNkPT1uaWwpdGhlbgpjZD1iZFsiQCIuLmFkXWVuZDtpZihjZD09InRydWUiKXRoZW4gY2Q9dHJ1ZSBlbHNlaWYoY2Q9PSJmYWxzZSIpdGhlbiBjZD1mYWxzZSBlbHNlaWYodG9udW1iZXIoY2Qpfj1uaWwpdGhlbgpjZD10b251bWJlcihjZCllbmQ7cmV0dXJuIGNkIGVuZCxudW1iZXJGcm9tU3RyaW5nPWZ1bmN0aW9uKGFkKXJldHVybiBsb2FkKAoicmV0dXJuICIuLmFkKSgpZW5kLHV1aWQ9ZnVuY3Rpb24oKQpsb2NhbCBhZD1tYXRoLnJhbmRvbQpsb2NhbCBmdW5jdGlvbiBiZCgpbG9jYWwgY2Q9J3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCdyZXR1cm4Kc3RyaW5nLmdzdWIoY2QsJ1t4eV0nLGZ1bmN0aW9uKGRkKWxvY2FsIF9fYT0KKGRkPT0neCcpYW5kIGFkKDAsMHhmKW9yIGFkKDgsMHhiKQpyZXR1cm4gc3RyaW5nLmZvcm1hdCgnJXgnLF9fYSllbmQpZW5kO3JldHVybiBiZCgpZW5kLGFycmF5PWZ1bmN0aW9uKGFkLGJkKXJldHVybgpsb2FkKAoicmV0dXJuIHsiLi4KKCJuaWwsIik6cmVwKGFkKS4uICgiWzBdPW5pbCwiKTpyZXAoYmQpLi4ifSIpKCllbmQsc2hyaW5rPWZ1bmN0aW9uKGFkLGJkKWxvY2FsIGNkLGRkLF9fYSxhX2E9e3t9LHt9LHt9fSwwLAojYWQrI2FkJTMsYmQgb3IgY29sb3Vycy5ibGFjaztmb3IgaT0xLCNhZCBkbyBpZgojYWRbaV0+ZGQgdGhlbiBkZD0jYWRbaV1lbmQgZW5kCmZvciB5PTAsX19hLTEsMyBkbwpsb2NhbCBiX2EsY19hLGRfYSxfYWE9e30se30se30sMQpmb3IgeD0wLGRkLTEsMiBkbyBsb2NhbCBhYWEsYmFhPXt9LHt9CmZvciB5eT0xLDMgZG8KZm9yIHh4PTEsMiBkbwphYWFbI2FhYSsxXT0oYWRbeSt5eV1hbmQgYWRbeSt5eV1beCt4eF0pYW5kCihhZFt5Kwp5eV1beCt4eF09PTAgYW5kIGFfYSBvciBhZFt5K3l5XVt4K3h4XSlvciBhX2E7YmFhW2FhYVsjYWFhXV09CmJhYVthYWFbI2FhYV1dYW5kKGJhYVthYWFbI2FhYV1dKzEpb3IgMSBlbmQgZW5kO2JfYVtfYWFdLGNfYVtfYWFdLGRfYVtfYWFdPV9kKGFhYSxiYWEpX2FhPV9hYSsxIGVuZApjZFsxXVsjY2RbMV0rMV0sY2RbMl1bI2NkWzJdKzFdLGNkWzNdWyNjZFszXSsxXT10YWJsZS5jb25jYXQoYl9hKSx0YWJsZS5jb25jYXQoY19hKSx0YWJsZS5jb25jYXQoZF9hKWVuZDtjZC53aWR0aCxjZC5oZWlnaHQ9I2NkWzFdWzFdLCNjZFsxXXJldHVybiBjZCBlbmR9ZW5kCmFhWyJsaWJyYXJpZXMiXVsiYmFzYWx0TG9ncyJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj0iImxvY2FsIGJiPSJiYXNhbHRMb2cudHh0ImxvY2FsIGNiPSJEZWJ1ZyIKZnMuZGVsZXRlKAphYn49IiJhbmQgYWIuLiIvIi4uYmIgb3IgYmIpCmxvY2FsIGRiPXtfX2NhbGw9ZnVuY3Rpb24oX2MsYWMsYmMpaWYoYWM9PW5pbCl0aGVuIHJldHVybiBlbmQKbG9jYWwgY2M9YWJ+PSIiYW5kIGFiLi4iLyIuLmJiIG9yIGJiCmxvY2FsIGRjPWZzLm9wZW4oY2MsZnMuZXhpc3RzKGNjKWFuZCJhIm9yInciKQpkYy53cml0ZUxpbmUoIltCYXNhbHRdWyIuLiAoYmMgYW5kIGJjIG9yIGNiKS4uIl06ICIuLnRvc3RyaW5nKGFjKSlkYy5jbG9zZSgpZW5kfXJldHVybiBzZXRtZXRhdGFibGUoe30sZGIpZW5kCmFhWyJsaWJyYXJpZXMiXVsibGF5b3V0Il09ZnVuY3Rpb24oLi4uKQpsb2NhbCBmdW5jdGlvbiBhYihjYilsb2NhbCBkYj17fWRiLl9fX3ZhbHVlPW5pbDtkYi5fX19uYW1lPWNiCmRiLl9fX2NoaWxkcmVuPXt9ZGIuX19fcHJvcHM9e31mdW5jdGlvbiBkYjp2YWx1ZSgpcmV0dXJuIHNlbGYuX19fdmFsdWUgZW5kO2Z1bmN0aW9uIGRiOnNldFZhbHVlKF9jKQpzZWxmLl9fX3ZhbHVlPV9jIGVuZDtmdW5jdGlvbiBkYjpuYW1lKClyZXR1cm4gc2VsZi5fX19uYW1lIGVuZDtmdW5jdGlvbiBkYjpzZXROYW1lKF9jKQpzZWxmLl9fX25hbWU9X2MgZW5kO2Z1bmN0aW9uIGRiOmNoaWxkcmVuKClyZXR1cm4gc2VsZi5fX19jaGlsZHJlbiBlbmQ7ZnVuY3Rpb24gZGI6bnVtQ2hpbGRyZW4oKXJldHVybgojc2VsZi5fX19jaGlsZHJlbiBlbmQKZnVuY3Rpb24gZGI6YWRkQ2hpbGQoX2MpCmlmCnNlbGZbX2M6bmFtZSgpXX49bmlsIHRoZW4gaWYKdHlwZShzZWxmW19jOm5hbWUoKV0ubmFtZSk9PSJmdW5jdGlvbiJ0aGVuIGxvY2FsIGFjPXt9dGFibGUuaW5zZXJ0KGFjLHNlbGZbX2M6bmFtZSgpXSkKc2VsZltfYzpuYW1lKCldPWFjIGVuZAp0YWJsZS5pbnNlcnQoc2VsZltfYzpuYW1lKCldLF9jKWVsc2Ugc2VsZltfYzpuYW1lKCldPV9jIGVuZDt0YWJsZS5pbnNlcnQoc2VsZi5fX19jaGlsZHJlbixfYyllbmQ7ZnVuY3Rpb24gZGI6cHJvcGVydGllcygpcmV0dXJuIHNlbGYuX19fcHJvcHMgZW5kO2Z1bmN0aW9uIGRiOm51bVByb3BlcnRpZXMoKQpyZXR1cm4jc2VsZi5fX19wcm9wcyBlbmQKZnVuY3Rpb24gZGI6YWRkUHJvcGVydHkoX2MsYWMpbG9jYWwgYmM9IkAiLi5fYwppZiBzZWxmW2JjXX49bmlsIHRoZW4gaWYKdHlwZShzZWxmW2JjXSk9PSJzdHJpbmcidGhlbiBsb2NhbCBjYz17fXRhYmxlLmluc2VydChjYyxzZWxmW2JjXSkKc2VsZltiY109Y2MgZW5kCnRhYmxlLmluc2VydChzZWxmW2JjXSxhYyllbHNlIHNlbGZbYmNdPWFjIGVuZAp0YWJsZS5pbnNlcnQoc2VsZi5fX19wcm9wcyx7bmFtZT1fYyx2YWx1ZT1zZWxmW19jXX0pZW5kO3JldHVybiBkYiBlbmQ7bG9jYWwgYmI9e30KZnVuY3Rpb24gYmI6VG9YbWxTdHJpbmcoY2IpY2I9c3RyaW5nLmdzdWIoY2IsIiYiLCImYW1wOyIpCmNiPXN0cmluZy5nc3ViKGNiLCI8IiwiJmx0OyIpY2I9c3RyaW5nLmdzdWIoY2IsIj4iLCImZ3Q7IikKY2I9c3RyaW5nLmdzdWIoY2IsIlwiIiwiJnF1b3Q7IikKY2I9c3RyaW5nLmdzdWIoY2IsIihbXiV3JSYlOyVwJVx0JSBdKSIsZnVuY3Rpb24oZGIpCnJldHVybiBzdHJpbmcuZm9ybWF0KCImI3glWDsiLHN0cmluZy5ieXRlKGRiKSllbmQpcmV0dXJuIGNiIGVuZApmdW5jdGlvbiBiYjpGcm9tWG1sU3RyaW5nKGNiKQpjYj1zdHJpbmcuZ3N1YihjYiwiJiN4KFsleF0rKSU7IixmdW5jdGlvbihkYikKcmV0dXJuIHN0cmluZy5jaGFyKHRvbnVtYmVyKGRiLDE2KSllbmQpCmNiPXN0cmluZy5nc3ViKGNiLCImIyhbMC05XSspJTsiLGZ1bmN0aW9uKGRiKXJldHVybiBzdHJpbmcuY2hhcih0b251bWJlcihkYiwxMCkpZW5kKWNiPXN0cmluZy5nc3ViKGNiLCImcXVvdDsiLCJcIiIpCmNiPXN0cmluZy5nc3ViKGNiLCImYXBvczsiLCInIiljYj1zdHJpbmcuZ3N1YihjYiwiJmd0OyIsIj4iKQpjYj1zdHJpbmcuZ3N1YihjYiwiJmx0OyIsIjwiKWNiPXN0cmluZy5nc3ViKGNiLCImYW1wOyIsIiYiKXJldHVybiBjYiBlbmQ7ZnVuY3Rpb24gYmI6UGFyc2VBcmdzKGNiLGRiKQpzdHJpbmcuZ3N1YihkYiwiKCV3Kyk9KFtcIiddKSguLSklMiIsZnVuY3Rpb24oX2MsYWMsYmMpCmNiOmFkZFByb3BlcnR5KF9jLHNlbGY6RnJvbVhtbFN0cmluZyhiYykpZW5kKWVuZApmdW5jdGlvbiBiYjpQYXJzZVhtbFRleHQoY2IpCmxvY2FsIGRiPXt9bG9jYWwgX2M9YWIoKXRhYmxlLmluc2VydChkYixfYylsb2NhbCBhYyxiYyxjYyxkYyxfZDtsb2NhbCBhZCxiZD0xLDEKd2hpbGUgdHJ1ZSBkbwphYyxiZCxiYyxjYyxkYyxfZD1zdHJpbmcuZmluZChjYiwiPCglLz8pKFsld186XSspKC4tKSglLz8pPiIsYWQpaWYgbm90IGFjIHRoZW4gYnJlYWsgZW5kO2xvY2FsIGRkPXN0cmluZy5zdWIoY2IsYWQsYWMtMSkKaWYgbm90CnN0cmluZy5maW5kKGRkLCJeJXMqJCIpdGhlbgpsb2NhbCBfX2E9KF9jOnZhbHVlKClvciIiKS4uc2VsZjpGcm9tWG1sU3RyaW5nKGRkKWRiWyNkYl06c2V0VmFsdWUoX19hKWVuZAppZiBfZD09Ii8idGhlbiBsb2NhbCBfX2E9YWIoY2Mpc2VsZjpQYXJzZUFyZ3MoX19hLGRjKQpfYzphZGRDaGlsZChfX2EpZWxzZWlmIGJjPT0iInRoZW4gbG9jYWwgX19hPWFiKGNjKXNlbGY6UGFyc2VBcmdzKF9fYSxkYykKdGFibGUuaW5zZXJ0KGRiLF9fYSlfYz1fX2EgZWxzZSBsb2NhbCBfX2E9dGFibGUucmVtb3ZlKGRiKV9jPWRiWyNkYl0KaWYjZGI8MSB0aGVuIGVycm9yKCJYbWxQYXJzZXI6IG5vdGhpbmcgdG8gY2xvc2Ugd2l0aCAiLi4KY2MpZW5kO2lmIF9fYTpuYW1lKCl+PWNjIHRoZW4KZXJyb3IoIlhtbFBhcnNlcjogdHJ5aW5nIHRvIGNsb3NlICIuLl9fYS5uYW1lLi4iIHdpdGggIi4uY2MpZW5kO19jOmFkZENoaWxkKF9fYSllbmQ7YWQ9YmQrMSBlbmQ7bG9jYWwgY2Q9c3RyaW5nLnN1YihjYixhZClpZiNkYj4xIHRoZW4KZXJyb3IoIlhtbFBhcnNlcjogdW5jbG9zZWQgIi4uZGJbI2RiXTpuYW1lKCkpZW5kO3JldHVybiBfYyBlbmQKZnVuY3Rpb24gYmI6bG9hZEZpbGUoY2IsZGIpaWYgbm90IGRiIHRoZW4gZGI9c3lzdGVtLlJlc291cmNlRGlyZWN0b3J5IGVuZApsb2NhbCBfYz1zeXN0ZW0ucGF0aEZvckZpbGUoY2IsZGIpbG9jYWwgYWMsYmM9aW8ub3BlbihfYywiciIpCmlmIGFjIGFuZCBub3QgYmMgdGhlbiBsb2NhbCBjYz1hYzpyZWFkKCIqYSIpCmlvLmNsb3NlKGFjKXJldHVybiBzZWxmOlBhcnNlWG1sVGV4dChjYyksbmlsIGVsc2UgcHJpbnQoYmMpcmV0dXJuIG5pbCBlbmQgZW5kO3JldHVybiBiYiBlbmQKYWFbImxpYnJhcmllcyJdWyJiaWdmb250Il09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJ0SGV4IikKbG9jYWwgYmI9e3siXDMyXDMyXDMyXDEzN1wxNTZcMTQ4XDE1OFwxNTlcMTQ4XDEzNVwxMzVcMTQ0XDE1OVwxMzlcMzJcMTM2XDE1N1wzMlwxNTlcMTM5XDMyXDMyXDE0M1wzMlwzMlwxNDNcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMTQ3XDE0OFwxNTBcMTMxXDE0OFwzMlwzMlwzMlwxNTFcMTQwXDE0OFwxNTFcMTQwXDE0NyIsIlwzMlwzMlwzMlwxNDlcMTMyXDE0OVwxMzZcMTU2XDE0OVwxNDRcMzJcMTMzXDEzOVwxNTlcMTI5XDE0M1wxNTlcMTMzXDE0M1wxNTlcMTMzXDEzOFwzMlwxMzNcMTM4XDMyXDEzM1wzMlwzMlwzMlwzMlwzMlwzMlwxNTBcMTUwXDEyOVwxMzdcMTU2XDEyOVwzMlwzMlwzMlwxMzNcMTMxXDEyOVwxMzNcMTMxXDEzMiIsIlwzMlwzMlwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMzJcMTI5XDMyXDMyXDMyXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwzMlwzMlwzMlwxNDNcMTQzXDE0M1wzMlwzMlwzMlwzMlwzMlwzMlwxMzBcMTI5XDMyXDEzMFwxMzVcMzJcMzJcMzJcMzJcMTMxXDMyXDMyXDEzMVwzMlwxMzEiLCJcMTM5XDE0NFwzMlwzMlwxNDNcMTQ4XDEzNVwxMzBcMTQ0XDE0OVwzMlwxNDlcMTUwXDE1MVwxNDlcMTU4XDE0MFwxMjlcMzJcMzJcMzJcMTM1XDEzMFwxNDRcMTM1XDEzMFwxNDRcMzJcMTQ5XDMyXDMyXDEzOVwzMlwxNTlcMTQ4XDMyXDMyXDMyXDMyXDE1OVwzMlwxNDRcMzJcMTQ4XDMyXDE0N1wxMzFcMTMyIiwiXDE1OVwxMzVcMTI5XDEzMVwxNDNcMTQ5XDE0M1wxMzhcMTQ0XDEzOFwzMlwxMzNcMTMwXDE0OVwxNDlcMTM3XDE1NVwxNDlcMTU5XDE0M1wxNDRcMTQ3XDEzMFwxMzJcMzJcMTQ5XDMyXDE0N1wxMzBcMTMyXDEzMVwxNTlcMTI5XDEzOVwxNTFcMTI5XDE0OFwzMlwzMlwxMzlcMTMxXDEzNVwxMzNcMzJcMTQ0XDEzMFwxNTFcMzIiLCJcMzJcMzJcMzJcMzJcMzJcMzJcMTMwXDEzNVwzMlwxMzBcMzJcMTI5XDMyXDEyOVwxMjlcMTMxXDEzMVwzMlwxMzBcMTMxXDEyOVwxNDBcMTQxXDEzMlwzMlwxMjlcMzJcMzJcMTI5XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDEzMVwxMzFcMTI5XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyIiwiXDMyXDMyXDMyXDMyXDE0OVwzMlwxNTlcMTU0XDEzM1wxMzNcMTMzXDE0NFwxNTJcMTQxXDEzMlwxMzNcMTUxXDEyOVwxMzZcMTUzXDMyXDMyXDE1NFwzMlwxNTlcMTM0XDEyOVwxMzBcMTM3XDE0NFwxNTlcMzJcMTQ0XDMyXDE0OFwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxNTFcMTI5IiwiXDMyXDMyXDMyXDMyXDEzM1wzMlwzMlwzMlwzMlwxNDVcMTQ1XDEzMlwxNDFcMTQwXDEzMlwxNTFcMTI5XDE0NFwxNTBcMTQ2XDEyOVwzMlwzMlwzMlwxMzhcMTQ0XDMyXDMyXDE1OVwxMzNcMTM2XDEzMVwxMzJcMTMxXDE1MVwxMjlcMzJcMTQ0XDMyXDEzMVwxMzFcMTI5XDMyXDE0NFwzMlwxNTFcMTI5XDMyIiwiXDMyXDMyXDMyXDMyXDEyOVwzMlwzMlwzMlwzMlwxMzBcMTMwXDMyXDMyXDEyOVwzMlwxMjlcMzJcMTI5XDEzMFwxMjlcMTI5XDMyXDMyXDMyXDMyXDEzMFwxMjlcMTMwXDEyOVwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxMzNcMzJcMzJcMzJcMzJcMzJcMTI5XDMyXDEyOVwzMlwzMiIsIlwxNTBcMTU2XDE0OFwxMzZcMTQ5XDMyXDEzNFwxMzFcMTQ4XDEzNFwxMzFcMTQ4XDE1OVwxMzRcMTQ5XDEzNlwxNDBcMTI5XDE1MlwxMzFcMzJcMTM1XDEzMVwxNDlcMTUwXDEzMVwxNDhcMTUwXDEzMVwxNDhcMzJcMTQ4XDMyXDMyXDE0OFwzMlwzMlwxNTJcMTI5XDE0M1wxNDNcMTQ0XDEzMFwxNTVcMzJcMTM0XDEzMVwxNDgiLCJcMTU3XDEyOVwxNDlcMzJcMTQ5XDMyXDE1MlwxMzFcMTQ0XDE0NFwxMzFcMTQ4XDE0MVwxNDBcMTQ5XDE0NFwzMlwxNDlcMTUxXDEzMVwxNDhcMzJcMTUwXDMyXDE1MFwxMzFcMTQ4XDEzMFwxNTZcMTMzXDMyXDE0NFwzMlwzMlwxNDRcMzJcMTMwXDE1NVwzMlwxNDNcMTQzXDE0NFwzMlwxNTJcMTI5XDMyXDEzNFwzMiIsIlwxMzBcMTMxXDMyXDEzMVwxMzFcMTI5XDEzMVwxMzFcMTI5XDEzMFwxMzFcMzJcMzJcMzJcMTI5XDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwzMlwxMjlcMzJcMTMwXDEzMVwzMlwxMzBcMTI5XDMyXDMyXDEyOVwzMlwzMlwxMzNcMzJcMzJcMzJcMTI5XDMyXDMyXDMyXDEzMFwzMlwzMlwzMlwxMjlcMzIiLCJcMTUwXDE0MFwxNTBcMTM3XDE0MFwxNDhcMTM2XDE0MFwxMzJcMTUwXDEzMVwxMzJcMTUxXDEzMVwxNDhcMTM2XDE0N1wxMjlcMTM2XDE0N1wxMjlcMTUwXDE1NlwxNDVcMTM4XDE0M1wxNDlcMTMwXDE1MVwzMlwzMlwzMlwxNDlcMTM4XDE1MlwxMjlcMTQ5XDMyXDMyXDE1N1wxNTJcMTQ5XDE1N1wxNDRcMTQ5XDE1MFwxMzFcMTQ4IiwiXDE0OVwxNDNcMTQyXDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ0XDE0OVwzMlwxNDlcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMzJcMTQ5XDMyXDE0NFwzMlwxNDlcMTQ5XDEzMFwxNDhcMTQ5XDMyXDMyXDE0OVwzMlwxNDlcMTQ5XDEzMFwxNDlcMTQ5XDMyXDE0OSIsIlwxMzBcMTMxXDEyOVwxMjlcMzJcMTI5XDEzMVwxMzFcMzJcMTMwXDEzMVwzMlwxMzFcMTMxXDMyXDEzMVwxMzFcMTI5XDEyOVwzMlwzMlwxMzBcMTMxXDMyXDEyOVwzMlwxMjlcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEyOVwzMlwxMjlcMTMxXDEzMVwxMjlcMTI5XDMyXDEyOVwxMjlcMzJcMTI5XDEzMFwxMzFcMzIiLCJcMTM2XDE0MFwxMzJcMTUwXDEzMVwxNDhcMTM2XDE0MFwxMzJcMTUzXDE0MFwxMjlcMTMxXDE1MVwxMjlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTM3XDE1MlwxMjlcMTM3XDE1MlwxMjlcMTMxXDE1NlwxMzNcMTQ5XDEzMVwzMlwxNTBcMzJcMzJcMTMwXDE0OFwzMlwxNTJcMTM3XDE0NFwzMlwzMlwzMiIsIlwxNDlcMzJcMzJcMTQ5XDE1OVwxMzNcMTQ5XDMyXDE0OVwxNDRcMzJcMTQ5XDMyXDE0OVwzMlwxNDlcMzJcMTQ5XDE1MFwxNTFcMTI5XDEzOFwxNTVcMTQ5XDE1MFwxMzBcMTQ4XDMyXDE0OVwzMlwxNTJcMTI5XDMyXDE0OVwzMlwzMlwzMlwxNTBcMzJcMzJcMTQ5XDMyXDMyXDMyXDMyXDMyXDMyXDMyIiwiXDEyOVwzMlwzMlwxMzBcMTI5XDEyOVwxMjlcMzJcMTI5XDEzMFwxMzFcMzJcMzJcMTI5XDMyXDEzMFwxMzFcMzJcMzJcMTI5XDMyXDEyOVwzMlwxMjlcMTI5XDMyXDEyOVwzMlwxMjlcMzJcMTMxXDEzMVwxMjlcMTMwXDEzMVwzMlwzMlwzMlwxMjlcMTMwXDEzMVwzMlwzMlwzMlwzMlwxNDBcMTQwXDEzMiIsIlwzMlwxNTRcMzJcMTU5XDE0M1wzMlwxNDlcMTQzXDMyXDE1OVwxNDNcMzJcMTU5XDE0NFwxNDlcMTU5XDE0M1wzMlwxNTlcMTM3XDE0NVwxNTlcMTQzXDE0NFwxNDlcMTQzXDMyXDMyXDE0NVwzMlwzMlwzMlwxNDVcMTQ5XDMyXDE0NFwzMlwxNDlcMzJcMTQzXDE1OVwzMlwxNDNcMTQzXDMyXDE1OVwxNDNcMzIiLCJcMzJcMzJcMzJcMTUyXDE0MFwxNDlcMTUxXDMyXDE0OVwxNDlcMzJcMTQ1XDE0OVwxMzBcMTQ5XDE1N1wxNDBcMTMzXDMyXDE0OVwzMlwxNTRcMTQzXDE0OVwxNTFcMzJcMTQ5XDMyXDE0OVwzMlwxNDRcMzJcMTQ5XDE0OVwxNTNcMzJcMzJcMTQ5XDMyXDE0OVwxMzNcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OSIsIlwzMlwzMlwzMlwxMzBcMTMxXDEyOVwxMzFcMTMxXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwxMjlcMTMwXDEzMVwxMjlcMzJcMTI5XDMyXDE0MFwxNDBcMTI5XDEyOVwzMlwxMjlcMzJcMTI5XDMyXDEzN1wxNDBcMTI5XDEzMFwzMlwxMjlcMzJcMTMwXDMyXDEyOVwzMlwxMjlcMTI5XDMyXDEyOVwxMzBcMTMxXDMyIiwiXDE0NFwxNDNcMzJcMTU5XDE0NFwxNDRcMTQ0XDE0M1wzMlwxNTlcMTQzXDE0NFwxNTlcMTM4XDMyXDE0NFwzMlwxNDRcMTQ0XDMyXDE0NFwxNDRcMzJcMTQ0XDE0NFwzMlwxNDRcMTQ0XDMyXDE0NFwxNDNcMTQzXDE0NFwzMlwxNTBcMTI5XDMyXDE0OVwzMlwxMzBcMTUwXDMyXDEzNFwxMzdcMTM0XDEzNFwxMzFcMTQ4IiwiXDEzNlwxNDNcMTMzXDE1NFwxNDFcMTQ5XDE1MVwzMlwxMjlcMTM3XDE0MFwxNDRcMzJcMTQ5XDMyXDE0OVwzMlwxNDlcMTU0XDE1OVwxMzNcMTQ5XDE0OFwxNDlcMTU3XDE1M1wzMlwxNTRcMTQzXDE0OVwxNTlcMTM0XDMyXDEzMFwxNDhcMzJcMzJcMTQ5XDMyXDMyXDE1MVwxMjlcMzJcMzJcMzJcMzJcMTM0XDMyIiwiXDEzM1wzMlwzMlwzMlwzMlwxMzNcMTI5XDMyXDMyXDEzMVwxMzFcMzJcMzJcMTMwXDMyXDEzMFwxMzFcMTI5XDMyXDEyOVwzMlwxMzBcMTMxXDEyOVwxMjlcMzJcMTI5XDE0MFwxNDBcMTI5XDEzMVwxMzFcMTI5XDMyXDEzMFwxMjlcMzJcMTI5XDMyXDEzMFwxMjlcMzJcMzJcMzJcMzJcMzJcMTI5XDMyIiwiXDMyXDMyXDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMzJcMzIiLCJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMiIsIlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMiIsIlwzMlwzMlwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDMyXDMyIiwiXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzIiLCJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyIiwiXDMyXDMyXDMyXDMyXDE0NVwzMlwxNTlcMTM5XDMyXDE1MVwxMzFcMTMyXDE1NVwxNDNcMTMyXDEzNFwxMzVcMTQ1XDMyXDE0OVwzMlwxNThcMTQwXDEyOVwxMzBcMTMwXDMyXDE1MlwxNDdcMTU1XDE1N1wxMzRcMzJcMzJcMTQ0XDE0NFwzMlwzMlwzMlwzMlwzMlwzMlwxNTJcMTMxXDE1NVwxMzFcMTMxXDEyOSIsIlwzMlwzMlwzMlwzMlwxNDlcMzJcMTQ5XDMyXDE0NVwxNDhcMTMxXDMyXDE0OVwzMlwxNDlcMTQwXDE1N1wxMzJcMzJcMTQ4XDMyXDEzN1wxNTVcMTQ5XDMyXDMyXDMyXDE0OVwxNTRcMTQ5XDEzN1wxNDJcMzJcMTUzXDE1M1wzMlwxMzFcMTMxXDE0OVwxMzFcMTMxXDEyOVwxNDlcMTM1XDE0NVwzMlwzMlwzMiIsIlwzMlwzMlwzMlwzMlwxMjlcMzJcMTMwXDEzNVwzMlwxMzFcMTMxXDEyOVwxMzRcMTMxXDEzMlwzMlwxMjlcMzJcMzJcMTI5XDMyXDEzMVwxMzFcMzJcMzJcMzJcMzJcMTMwXDEzMVwxMjlcMzJcMzJcMzJcMzJcMTI5XDEyOVwzMlwzMlwzMlwzMlwzMlwzMlwxMzBcMTMxXDEyOVwzMlwzMlwzMiIsIlwxNTBcMTUwXDMyXDMyXDE0OFwzMlwxMzRcMzJcMzJcMTMyXDMyXDMyXDEzNFwzMlwzMlwxNDRcMzJcMTQ0XDE1MFwxNTFcMTQ5XDMyXDMyXDMyXDMyXDMyXDMyXDE0NVwzMlwzMlwxNTJcMTQwXDE0NFwxNDRcMTQ0XDMyXDEzM1wxNTFcMTI5XDEzM1wxNTFcMTI5XDEzMlwxNTFcMTI5XDMyXDE0NVwzMiIsIlwxMzBcMTI5XDMyXDEzMVwxNTFcMTI5XDE0MVwzMlwzMlwxNDJcMzJcMzJcMzJcMzJcMzJcMTQ5XDMyXDE0OVwxMzBcMTQ5XDE0OVwzMlwxNDNcMzJcMzJcMzJcMzJcMTQyXDEzMlwzMlwxNTRcMTQzXDEzM1wxNTdcMTUzXDEzMlwxNTFcMTUwXDE0OFwxNTFcMTU4XDEzMlwxNTFcMTUwXDE0OFwxNDRcMTMwXDE0OCIsIlwzMlwzMlwzMlwxNDBcMTQwXDEzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxNTFcMTMxXDMyXDMyXDEyOVwxMjlcMzJcMzJcMzJcMzJcMTM0XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDEyOVwxMjlcMzJcMTI5XDMyXDEyOVwxMjlcMTMwXDEyOVwxMjlcMzJcMTI5XDEzMFwxMzFcMzIiLCJcMTU2XDE0M1wzMlwxNTlcMTQxXDEyOVwxNTNcMTQwXDEzMlwxNTNcMTM3XDMyXDE1N1wxNDFcMzJcMTU5XDE0MlwzMlwxNTBcMTUxXDEyOVwxNTBcMTMxXDEzMlwxNDBcMTQzXDE0NFwxNDNcMTQxXDE0NVwxMzdcMTQwXDE0OFwxNDFcMTQxXDE0NFwxNTdcMTQyXDMyXDE1OVwxNDBcMzJcMTUxXDEzNFwzMlwxNTdcMTQxXDMyIiwiXDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1MVwxNTFcMzJcMTU0XDE0M1wxMzJcMTU3XDE0MFwzMlwxNTdcMTQwXDMyXDE1N1wxNDBcMzJcMTU3XDE0MFwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzIiLCJcMTI5XDMyXDEyOVwxMjlcMzJcMTI5XDEyOVwzMlwxMjlcMTI5XDMyXDEyOVwxMjlcMzJcMTI5XDEyOVwzMlwxMjlcMTI5XDEzMVwxMjlcMzJcMTM0XDMyXDEzMVwxMzFcMTI5XDEzMVwxMzFcMTI5XDEzMVwxMzFcMTI5XDEzMVwxMzFcMTI5XDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzIiLCJcMTUxXDEzMVwxNDhcMTUyXDEzN1wxNDVcMTU1XDE0MFwxNDRcMTUyXDE0MlwxNDVcMTUzXDE0MFwxMzJcMTUzXDEzN1wzMlwxNTRcMTQyXDE0NFwxNTVcMTU5XDEzMlwxNTBcMTU2XDE0OFwxNDdcMzJcMTQ0XDE0NFwxMzBcMTQ1XDEzNlwxMzdcMzJcMTQ2XDEzMFwxNDRcMTQ0XDEzMFwxNDVcMTMwXDEzNlwzMlwxNTFcMTQwXDEzMiIsIlwxNTFcMzJcMTQ5XDE1MVwxNTVcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNTJcMTM3XDE0NFwxNTdcMTI5XDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDEzMFwxNTBcMzJcMzJcMTU3XDEyOVwxNDlcMzJcMTQ5IiwiXDEzMVwxMzFcMzJcMTI5XDMyXDEyOVwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMzJcMzJcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDMyXDEyOVwzMlwxMzBcMTMxXDMyXDEzM1wxMzFcMzIiLCJcMTU2XDE0M1wzMlwxNTlcMTQxXDEyOVwxNTNcMTQwXDEzMlwxNTNcMTM3XDMyXDE1N1wxNDFcMzJcMTU5XDE0MlwzMlwxNTlcMTU5XDE0NFwxNTJcMTQwXDE0NFwxNTZcMTQzXDMyXDE1OVwxNDFcMTI5XDE1M1wxNDBcMTMyXDE1N1wxNDFcMzJcMTMwXDE0NVwzMlwzMlwxNDdcMzJcMTM2XDE1M1wzMlwxMzBcMTQ2XDMyIiwiXDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE0OVwxNTdcMTM0XDE1NFwxNDNcMTMyXDE1N1wxNDBcMTMzXDE1N1wxNDBcMTMzXDE1N1wxNDBcMTMzXDE1N1wxNDBcMTMzXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMiIsIlwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMwXDEzMVwzMlwxMzRcMzJcMTMwXDEzMVwxMjlcMTMwXDEzMVwxMjlcMTMwXDEzMVwxMjlcMTMwXDEzMVwxMjlcMzJcMTI5XDMyXDMyXDEyOVwzMlwzMlwxMjlcMzJcMzJcMTI5XDMyIiwiXDE1OVwxMzRcMTQ0XDEzN1wxMzdcMzJcMTU2XDE0M1wzMlwxNTlcMTQxXDEyOVwxNTNcMTQwXDEzMlwxNTNcMTM3XDMyXDE1N1wxNDFcMzJcMzJcMTMyXDMyXDE1OVwxNDNcMzJcMTQ3XDMyXDE0NFwxNDRcMTMwXDE0NVwxMzZcMTM3XDMyXDE0NlwxMzBcMTQ0XDE0NFwxMzBcMTQ1XDEzMFwxMzhcMzJcMTQ2XDEzMFwxNDQiLCJcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxMzFcMTQ3XDEyOVwxMzhcMTM0XDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE1NFwxNDNcMTQ5XDMyXDE1N1wxMjlcMTU0XDE0M1wxNDkiLCJcMTMwXDEzMVwzMlwxMjlcMzJcMTI5XDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwzMlwzMlwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMTI5XDEzMFwxMzFcMTI5XDEzMFwxMzFcMTI5XDEzMFwxMzFcMTI5XDE0MFwxNDBcMTI5XDEzMFwxMzFcMzJcMTQwXDE0MFwxMjkifSx7IjAwMDExMDAwMDExMDExMDAwMDExMDAxMDEwMTAwMDAwMDAxMDAwMDAwMDEwMDEwMSIsIjAwMDAwMDExMDExMDAwMDAwMDAwMDAxMDEwMTAwMDAwMDAxMDAwMDAwMDEwMDEwMSIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjEwMDAxMDExMDEwMDAwMDAxMDAwMDExMDExMDAwMDAxMDEwMDAwMDEwMDAwMDExMCIsIjAwMDAwMDExMDAwMDAwMDAxMDExMDExMDAwMDExMDAwMDAwMDAwMDAwMDExMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDExMDExMDAwMDAxMDAwMDAwMDEwMDAwMDEwMDAwMDAwMDAwMDAwMDAxMCIsIjAwMDAwMDAwMDExMDExMDEwMDAxMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDEwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMDAwMDAwMDAwMDEwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAxMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAxMDExMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMTExMDExMDAwMDAwMDEwMDEwMDAxMDExMDAwMDAwMDEwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjExMDAwMDExMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDEwMDEwMDAxMDAwMDAwMCIsIjAwMDAxMDAwMDAwMDAwMDAwMDExMDExMDAwMDAwMDAwMDEwMDAxMDAxMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMDExMDAxMDExMDEwMDExMDExMDExMDAxMDAwMDAwMDEwMDAwMDExMDExMDExMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMDEwMDAxMDExMDExMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAxMDAwMDAwMCIsIjExMDExMDAwMDAwMDAwMDAwMDExMDAwMDExMDExMDEwMDAwMDAwMDAxMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDEwMDAxMTExMTAwMDEwMDAxMTExMTAwMDEwMDAxMTExMTAwMDEwMDAxMTExMSIsIjAwMDAwMDAwMDAwMDEwMDEwMDEwMDEwMDAxMTAxMTAxMTAxMTExMTExMTExMTExMSIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDEwMDAxMTExMTAwMDEwMDAxMTExMTAwMDEwMDAxMTExMTAwMDEwMDAxMTExMSIsIjAwMDAwMDAwMDAwMDEwMDEwMDEwMDEwMDAxMTAxMTAxMTAxMTExMTExMTExMTExMSIsIjEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMCIsIjAwMDAwMDExMDEwMDExMDExMDAwMDAxMDAwMDAxMTExMDAwMDAwMDAwMDAxMTAwMCIsIjAwMDAwMDAwMDEwMDAwMDAwMDAwMDAxMDAwMDAxMTAwMDExMDAwMDAwMDAwMTAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMDAwMDEwMDEwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAxMDAxMDExMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDExMDExMDExMDExMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjExMDExMDExMDExMDExMDExMDAwMDAwMDExMDExMDExMDExMDExMDExMDExMDExMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDExMDExMDAwMDExMDAxMDAwMDAwMDAwMDAwMDAwMDAxMDAxMCIsIjAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjExMDExMDExMDExMDExMDExMDExMDAwMDExMDExMDExMDExMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjExMDExMDExMDExMDExMDExMDExMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAxMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDExMDAwMDExMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCJ9fWxvY2FsIGNiPXt9bG9jYWwgZGI9e30KZG8gbG9jYWwgYmM9MDtsb2NhbCBjYz0jYmJbMV1sb2NhbCBkYz0jYmJbMV1bMV0KZm9yIGk9MSxjYywzIGRvCmZvciBqPTEsZGMsMyBkbwpsb2NhbCBfZD1zdHJpbmcuY2hhcihiYylsb2NhbCBhZD17fWFkWzFdPWJiWzFdW2ldOnN1YihqLGorMikKYWRbMl09YmJbMV1baSsxXTpzdWIoaixqKzIpYWRbM109YmJbMV1baSsyXTpzdWIoaixqKzIpbG9jYWwgYmQ9e31iZFsxXT1iYlsyXVtpXTpzdWIoaiwKaisyKWJkWzJdPWJiWzJdW2krMV06c3ViKGosaisyKWJkWzNdPWJiWzJdWwppKzJdOnN1YihqLGorMilkYltfZF09e2FkLGJkfWJjPWJjKzEgZW5kIGVuZDtjYlsxXT1kYiBlbmQKbG9jYWwgZnVuY3Rpb24gX2MoYmMsY2MpbG9jYWwgZGM9e1siMCJdPSIxIixbIjEiXT0iMCJ9aWYgYmM8PSNjYiB0aGVuIHJldHVybiB0cnVlIGVuZApmb3IgZj0jY2IrMSxiYyBkbyBsb2NhbCBfZD17fWxvY2FsIGFkPWNiWwpmLTFdCmZvciBjaGFyPTAsMjU1IGRvIGxvY2FsIGJkPXN0cmluZy5jaGFyKGNoYXIpbG9jYWwgY2Q9e31sb2NhbCBkZD17fQpsb2NhbCBfX2E9YWRbYmRdWzFdbG9jYWwgYV9hPWFkW2JkXVsyXQpmb3IgaT0xLCNfX2EgZG8gbG9jYWwgYl9hLGNfYSxkX2EsX2FhLGFhYSxiYWE9e30se30se30se30se30se30KZm9yIGo9MSwjX19hWzFdZG8KbG9jYWwgY2FhPWRiW19fYVtpXTpzdWIoaixqKV1bMV10YWJsZS5pbnNlcnQoYl9hLGNhYVsxXSkKdGFibGUuaW5zZXJ0KGNfYSxjYWFbMl0pdGFibGUuaW5zZXJ0KGRfYSxjYWFbM10pCmxvY2FsIGRhYT1kYltfX2FbaV06c3ViKGosaildWzJdCmlmIGFfYVtpXTpzdWIoaixqKT09IjEidGhlbgp0YWJsZS5pbnNlcnQoX2FhLChkYWFbMV06Z3N1YigiWzAxXSIsZGMpKSkKdGFibGUuaW5zZXJ0KGFhYSwoZGFhWzJdOmdzdWIoIlswMV0iLGRjKSkpCnRhYmxlLmluc2VydChiYWEsKGRhYVszXTpnc3ViKCJbMDFdIixkYykpKWVsc2UgdGFibGUuaW5zZXJ0KF9hYSxkYWFbMV0pCnRhYmxlLmluc2VydChhYWEsZGFhWzJdKXRhYmxlLmluc2VydChiYWEsZGFhWzNdKWVuZCBlbmQ7dGFibGUuaW5zZXJ0KGNkLHRhYmxlLmNvbmNhdChiX2EpKQp0YWJsZS5pbnNlcnQoY2QsdGFibGUuY29uY2F0KGNfYSkpdGFibGUuaW5zZXJ0KGNkLHRhYmxlLmNvbmNhdChkX2EpKQp0YWJsZS5pbnNlcnQoZGQsdGFibGUuY29uY2F0KF9hYSkpdGFibGUuaW5zZXJ0KGRkLHRhYmxlLmNvbmNhdChhYWEpKQp0YWJsZS5pbnNlcnQoZGQsdGFibGUuY29uY2F0KGJhYSkpZW5kO19kW2JkXT17Y2QsZGR9aWYgY2MgdGhlbiBjYz0iRm9udCIuLmYuLiJZZWxkIi4uY2hhcgpvcy5xdWV1ZUV2ZW50KGNjKW9zLnB1bGxFdmVudChjYyllbmQgZW5kO2NiW2ZdPV9kIGVuZDtyZXR1cm4gdHJ1ZSBlbmQKbG9jYWwgZnVuY3Rpb24gYWMoYmMsY2MsZGMsX2QsYWQpCmlmIG5vdCB0eXBlKGNjKT09InN0cmluZyJ0aGVuIGVycm9yKCJOb3QgYSBTdHJpbmciLDMpZW5kCmxvY2FsIGJkPXR5cGUoZGMpPT0ic3RyaW5nImFuZCBkYzpzdWIoMSwxKW9yIGFiW2RjXW9yCmVycm9yKCJXcm9uZyBGcm9udCBDb2xvciIsMykKbG9jYWwgY2Q9dHlwZShfZCk9PSJzdHJpbmciYW5kIF9kOnN1YigxLDEpb3IgYWJbX2Rdb3IKZXJyb3IoIldyb25nIEJhY2sgQ29sb3IiLDMpaWYoY2JbYmNdPT1uaWwpdGhlbiBfYygzLGZhbHNlKWVuZDtsb2NhbCBkZD1jYltiY11vcgplcnJvcigiV3JvbmcgZm9udCBzaXplIHNlbGVjdGVkIiwzKWlmIGNjPT0iInRoZW4KcmV0dXJue3siIn0seyIifSx7IiJ9fWVuZDtsb2NhbCBfX2E9e30KZm9yIGJhYSBpbiBjYzpnbWF0Y2goJy4nKWRvIHRhYmxlLmluc2VydChfX2EsYmFhKWVuZDtsb2NhbCBhX2E9e31sb2NhbCBiX2E9I2RkW19fYVsxXV1bMV0KZm9yIG5MaW5lPTEsYl9hIGRvIGxvY2FsIGJhYT17fQpmb3IgaT0xLCNfX2EgZG8gYmFhW2ldPWRkW19fYVtpXV1hbmQKZGRbX19hW2ldXVsxXVtuTGluZV1vciIiZW5kO2FfYVtuTGluZV09dGFibGUuY29uY2F0KGJhYSllbmQ7bG9jYWwgY19hPXt9bG9jYWwgZF9hPXt9bG9jYWwgX2FhPXtbIjAiXT1iZCxbIjEiXT1jZH1sb2NhbCBhYWE9e1siMCJdPWNkLFsiMSJdPWJkfQpmb3IgbkxpbmU9MSxiX2EgZG8KbG9jYWwgYmFhPXt9bG9jYWwgY2FhPXt9CmZvciBpPTEsI19fYSBkbwpsb2NhbCBkYWE9ZGRbX19hW2ldXWFuZCBkZFtfX2FbaV1dWzJdW25MaW5lXW9yIiIKYmFhW2ldPWRhYTpnc3ViKCJbMDFdIiwKYWQgYW5ke1siMCJdPWRjOnN1YihpLGkpLFsiMSJdPV9kOnN1YihpLGkpfW9yIF9hYSkKY2FhW2ldPWRhYTpnc3ViKCJbMDFdIiwKYWQgYW5ke1siMCJdPV9kOnN1YihpLGkpLFsiMSJdPWRjOnN1YihpLGkpfW9yIGFhYSllbmQ7Y19hW25MaW5lXT10YWJsZS5jb25jYXQoYmFhKQpkX2FbbkxpbmVdPXRhYmxlLmNvbmNhdChjYWEpZW5kO3JldHVybnthX2EsY19hLGRfYX1lbmQ7cmV0dXJuIGFjIGVuZAphYVsibGlicmFyaWVzIl1bImJhc2FsdE1vbiJdPWZ1bmN0aW9uKC4uLikKbG9jYWwgYWI9e1tjb2xvcnMud2hpdGVdPSIwIixbY29sb3JzLm9yYW5nZV09IjEiLFtjb2xvcnMubWFnZW50YV09IjIiLFtjb2xvcnMubGlnaHRCbHVlXT0iMyIsW2NvbG9ycy55ZWxsb3ddPSI0IixbY29sb3JzLmxpbWVdPSI1IixbY29sb3JzLnBpbmtdPSI2IixbY29sb3JzLmdyYXldPSI3IixbY29sb3JzLmxpZ2h0R3JheV09IjgiLFtjb2xvcnMuY3lhbl09IjkiLFtjb2xvcnMucHVycGxlXT0iYSIsW2NvbG9ycy5ibHVlXT0iYiIsW2NvbG9ycy5icm93bl09ImMiLFtjb2xvcnMuZ3JlZW5dPSJkIixbY29sb3JzLnJlZF09ImUiLFtjb2xvcnMuYmxhY2tdPSJmIn1sb2NhbCBiYixjYixkYixfYz10eXBlLHN0cmluZy5sZW4sc3RyaW5nLnJlcCxzdHJpbmcuc3ViCnJldHVybgpmdW5jdGlvbihhYylsb2NhbCBiYz17fQpmb3IgX2JhLGFiYSBpbiBwYWlycyhhYylkbwpiY1tfYmFdPXt9CmZvciBiYmEsY2JhIGluIHBhaXJzKGFiYSlkbyBsb2NhbCBkYmE9cGVyaXBoZXJhbC53cmFwKGNiYSlpZihkYmE9PW5pbCl0aGVuCmVycm9yKCJVbmFibGUgdG8gZmluZCBtb25pdG9yICIuLmNiYSllbmQ7YmNbX2JhXVtiYmFdPWRiYQpiY1tfYmFdW2JiYV0ubmFtZT1jYmEgZW5kIGVuZDtsb2NhbCBjYyxkYyxfZCxhZCxiZCxjZCxkZCxfX2E9MSwxLDEsMSwwLDAsMCwwO2xvY2FsIGFfYSxiX2E9ZmFsc2UsMQpsb2NhbCBjX2EsZF9hPWNvbG9ycy53aGl0ZSxjb2xvcnMuYmxhY2sKbG9jYWwgZnVuY3Rpb24gX2FhKClsb2NhbCBfYmEsYWJhPTAsMApmb3IgYmJhLGNiYSBpbiBwYWlycyhiYylkbyBsb2NhbCBkYmEsX2NhPTAsMApmb3IgYWNhLGJjYSBpbiBwYWlycyhjYmEpZG8gbG9jYWwgY2NhLGRjYT1iY2EuZ2V0U2l6ZSgpCmRiYT1kYmErY2NhO19jYT1kY2E+X2NhIGFuZCBkY2Egb3IgX2NhIGVuZDtfYmE9X2JhPmRiYSBhbmQgX2JhIG9yIGRiYTthYmE9YWJhK19jYSBlbmQ7ZGQsX19hPV9iYSxhYmEgZW5kO19hYSgpCmxvY2FsIGZ1bmN0aW9uIGFhYSgpbG9jYWwgX2JhPTA7bG9jYWwgYWJhLGJiYT0wLDAKZm9yIGNiYSxkYmEgaW4gcGFpcnMoYmMpZG8gbG9jYWwgX2NhPTA7bG9jYWwgYWNhPTAKZm9yIGJjYSxjY2EgaW4gcGFpcnMoZGJhKWRvCmxvY2FsIGRjYSxfZGE9Y2NhLmdldFNpemUoKWlmKGNjLV9jYT49MSlhbmQoY2MtX2NhPD1kY2EpdGhlbiBhYmE9YmNhIGVuZDtjY2Euc2V0Q3Vyc29yUG9zKApjYy1fY2EsZGMtX2JhKV9jYT1fY2ErZGNhCmlmKGFjYTxfZGEpdGhlbiBhY2E9X2RhIGVuZCBlbmQ7aWYoZGMtX2JhPj0xKWFuZChkYy1fYmE8PWFjYSl0aGVuIGJiYT1jYmEgZW5kCl9iYT1fYmErYWNhIGVuZDtfZCxhZD1hYmEsYmJhIGVuZDthYWEoKQpsb2NhbCBmdW5jdGlvbiBiYWEoX2JhLC4uLilsb2NhbCBhYmE9ey4uLn1yZXR1cm4KZnVuY3Rpb24oKWZvciBiYmEsY2JhIGluIHBhaXJzKGJjKWRvIGZvciBkYmEsX2NhIGluIHBhaXJzKGNiYSlkbwpfY2FbX2JhXSh0YWJsZS51bnBhY2soYWJhKSllbmQgZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gY2FhKCliYWEoInNldEN1cnNvckJsaW5rIixmYWxzZSkoKQppZiBub3QoYV9hKXRoZW4gcmV0dXJuIGVuZDtpZihiY1thZF09PW5pbCl0aGVuIHJldHVybiBlbmQ7bG9jYWwgX2JhPWJjW2FkXVtfZF0KaWYoX2JhPT1uaWwpdGhlbiByZXR1cm4gZW5kO19iYS5zZXRDdXJzb3JCbGluayhhX2EpZW5kCmxvY2FsIGZ1bmN0aW9uIGRhYShfYmEsYWJhLGJiYSlpZihiY1thZF09PW5pbCl0aGVuIHJldHVybiBlbmQ7bG9jYWwgY2JhPWJjW2FkXVtfZF0KaWYoY2JhPT1uaWwpdGhlbiByZXR1cm4gZW5kO2NiYS5ibGl0KF9iYSxhYmEsYmJhKWxvY2FsIGRiYSxfY2E9Y2JhLmdldFNpemUoKQppZgooY2IoX2JhKStjYz5kYmEpdGhlbiBsb2NhbCBhY2E9YmNbYWRdW19kKzFdaWYoYWNhfj1uaWwpdGhlbiBhY2EuYmxpdChfYmEsYWJhLGJiYSlfZD1fZCsxO2NjPWNjKwpjYihfYmEpZW5kIGVuZDthYWEoKWVuZApyZXR1cm4Ke2NsZWFyPWJhYSgiY2xlYXIiKSxzZXRDdXJzb3JCbGluaz1mdW5jdGlvbihfYmEpYV9hPV9iYTtjYWEoKWVuZCxnZXRDdXJzb3JCbGluaz1mdW5jdGlvbigpcmV0dXJuIGFfYSBlbmQsZ2V0Q3Vyc29yUG9zPWZ1bmN0aW9uKClyZXR1cm4gY2MsZGMgZW5kLHNldEN1cnNvclBvcz1mdW5jdGlvbihfYmEsYWJhKQpjYyxkYz1fYmEsYWJhO2FhYSgpY2FhKCllbmQsc2V0VGV4dFNjYWxlPWZ1bmN0aW9uKF9iYSkKYmFhKCJzZXRUZXh0U2NhbGUiLF9iYSkoKV9hYSgpYWFhKCliX2E9X2JhIGVuZCxnZXRUZXh0U2NhbGU9ZnVuY3Rpb24oKXJldHVybiBiX2EgZW5kLGJsaXQ9ZnVuY3Rpb24oX2JhLGFiYSxiYmEpCmRhYShfYmEsYWJhLGJiYSllbmQsd3JpdGU9ZnVuY3Rpb24oX2JhKV9iYT10b3N0cmluZyhfYmEpbG9jYWwgYWJhPWNiKF9iYSkKZGFhKF9iYSxkYihhYltjX2FdLGFiYSksZGIoYWJbZF9hXSxhYmEpKWVuZCxnZXRTaXplPWZ1bmN0aW9uKClyZXR1cm4gZGQsX19hIGVuZCxzZXRCYWNrZ3JvdW5kQ29sb3I9ZnVuY3Rpb24oX2JhKQpiYWEoInNldEJhY2tncm91bmRDb2xvciIsX2JhKSgpZF9hPV9iYSBlbmQsc2V0VGV4dENvbG9yPWZ1bmN0aW9uKF9iYSkKYmFhKCJzZXRUZXh0Q29sb3IiLF9iYSkoKWNfYT1fYmEgZW5kLGNhbGN1bGF0ZUNsaWNrPWZ1bmN0aW9uKF9iYSxhYmEsYmJhKWxvY2FsIGNiYT0wCmZvciBkYmEsX2NhIGluIHBhaXJzKGJjKWRvIGxvY2FsIGFjYT0wO2xvY2FsIGJjYT0wCmZvciBjY2EsZGNhIGluIHBhaXJzKF9jYSlkbwpsb2NhbCBfZGEsYWRhPWRjYS5nZXRTaXplKClpZihkY2EubmFtZT09X2JhKXRoZW4gcmV0dXJuIGFiYSthY2EsYmJhK2NiYSBlbmQKYWNhPWFjYStfZGE7aWYoYWRhPmJjYSl0aGVuIGJjYT1hZGEgZW5kIGVuZDtjYmE9Y2JhK2JjYSBlbmQ7cmV0dXJuIGFiYSxiYmEgZW5kfWVuZCBlbmQKYWFbImxpYnJhcmllcyJdWyJwcm9jZXNzIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPXt9bG9jYWwgYmI9e31sb2NhbCBjYj0wCmxvY2FsIGRiPWRvZmlsZSgicm9tL21vZHVsZXMvbWFpbi9jYy9yZXF1aXJlLmx1YSIpLm1ha2UKZnVuY3Rpb24gYmI6bmV3KF9jLGFjLGJjLC4uLilsb2NhbCBjYz17Li4ufQpsb2NhbCBkYz1zZXRtZXRhdGFibGUoe3BhdGg9X2N9LHtfX2luZGV4PXNlbGZ9KWRjLndpbmRvdz1hYzthYy5jdXJyZW50PXRlcm0uY3VycmVudDthYy5yZWRpcmVjdD10ZXJtLnJlZGlyZWN0CmRjLnByb2Nlc3NJZD1jYgppZih0eXBlKF9jKT09InN0cmluZyIpdGhlbgpkYy5jb3JvdXRpbmU9Y29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbigpCmxvY2FsIF9kPXNoZWxsLnJlc29sdmVQcm9ncmFtKF9jKWxvY2FsIGFkPXNldG1ldGF0YWJsZShiYyx7X19pbmRleD1fRU5WfSlhZC5zaGVsbD1zaGVsbAphZC5iYXNhbHRQcm9ncmFtPXRydWU7YWQucmVxdWlyZSxhZC5wYWNrYWdlPWRiKGFkLGZzLmdldERpcihfZCkpCmlmKGZzLmV4aXN0cyhfZCkpdGhlbgpsb2NhbCBiZD1mcy5vcGVuKF9kLCJyIilsb2NhbCBjZD1iZC5yZWFkQWxsKCliZC5jbG9zZSgpbG9jYWwgZGQ9bG9hZChjZCxfYywiYnQiLGFkKWlmKGRkfj1uaWwpdGhlbiByZXR1cm4KZGQodGFibGUudW5wYWNrKGNjKSllbmQgZW5kIGVuZCllbHNlaWYodHlwZShfYyk9PSJmdW5jdGlvbiIpdGhlbgpkYy5jb3JvdXRpbmU9Y29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbigpCl9jKHRhYmxlLnVucGFjayhjYykpZW5kKWVsc2UgcmV0dXJuIGVuZDthYltjYl09ZGM7Y2I9Y2IrMTtyZXR1cm4gZGMgZW5kCmZ1bmN0aW9uIGJiOnJlc3VtZShfYywuLi4pbG9jYWwgYWM9dGVybS5jdXJyZW50KCl0ZXJtLnJlZGlyZWN0KHNlbGYud2luZG93KQppZigKc2VsZi5maWx0ZXJ+PW5pbCl0aGVuIGlmKF9jfj1zZWxmLmZpbHRlcil0aGVuIHJldHVybiBlbmQ7c2VsZi5maWx0ZXI9bmlsIGVuZDtsb2NhbCBiYyxjYz1jb3JvdXRpbmUucmVzdW1lKHNlbGYuY29yb3V0aW5lLF9jLC4uLilpZiBiYyB0aGVuCnNlbGYuZmlsdGVyPWNjIGVsc2UgcHJpbnRFcnJvcihjYyllbmQ7dGVybS5yZWRpcmVjdChhYykKcmV0dXJuIGJjLGNjIGVuZApmdW5jdGlvbiBiYjppc0RlYWQoKQppZihzZWxmLmNvcm91dGluZX49bmlsKXRoZW4KaWYKKGNvcm91dGluZS5zdGF0dXMoc2VsZi5jb3JvdXRpbmUpPT0iZGVhZCIpdGhlbiB0YWJsZS5yZW1vdmUoYWIsc2VsZi5wcm9jZXNzSWQpcmV0dXJuIHRydWUgZW5kIGVsc2UgcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQKZnVuY3Rpb24gYmI6Z2V0U3RhdHVzKClpZihzZWxmLmNvcm91dGluZX49bmlsKXRoZW4KcmV0dXJuIGNvcm91dGluZS5zdGF0dXMoc2VsZi5jb3JvdXRpbmUpZW5kO3JldHVybiBuaWwgZW5kCmZ1bmN0aW9uIGJiOnN0YXJ0KCljb3JvdXRpbmUucmVzdW1lKHNlbGYuY29yb3V0aW5lKWVuZDtyZXR1cm4gYmIgZW5kCmFhWyJsaWJyYXJpZXMiXVsiYmFzYWx0RXZlbnQiXT1mdW5jdGlvbiguLi4pCnJldHVybgpmdW5jdGlvbigpbG9jYWwgYWI9e31sb2NhbCBiYj17fQpsb2NhbCBjYj17cmVnaXN0ZXJFdmVudD1mdW5jdGlvbihkYixfYyxhYylpZihhYltfY109PW5pbCl0aGVuIGFiW19jXT17fQpiYltfY109MSBlbmQ7YWJbX2NdW2JiW19jXV09YWM7YmJbX2NdPWJiW19jXSsxO3JldHVybgpiYltfY10tMSBlbmQscmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oZGIsX2MsYWMpYWJbX2NdW2FjW19jXV09Cm5pbCBlbmQsc2VuZEV2ZW50PWZ1bmN0aW9uKGRiLF9jLC4uLilsb2NhbCBhYwppZihhYltfY11+PW5pbCl0aGVuIGZvciBiYyxjYyBpbiBwYWlycyhhYltfY10pZG8KbG9jYWwgZGM9Y2MoLi4uKWlmKGRjPT1mYWxzZSl0aGVuIGFjPWRjIGVuZCBlbmQgZW5kO3JldHVybiBhYyBlbmR9Y2IuX19pbmRleD1jYjtyZXR1cm4gY2IgZW5kIGVuZAphYVsibGlicmFyaWVzIl1bImJpbWciXT1mdW5jdGlvbiguLi4pbG9jYWwgYWIsYmI9c3RyaW5nLnN1YixzdHJpbmcucmVwCmxvY2FsIGZ1bmN0aW9uIGNiKGRiLF9jKWxvY2FsIGFjLGJjPTAsMApsb2NhbCBjYyxkYyxfZD17fSx7fSx7fWxvY2FsIGFkLGJkPTEsMTtsb2NhbCBjZD17fQpsb2NhbCBmdW5jdGlvbiBkZCgpCmZvciB5PTEsYmMgZG8gaWYoY2NbeV09PW5pbCl0aGVuIGNjW3ldPWJiKCIgIixhYyllbHNlIGNjW3ldPWNjW3ldLi4KYmIoIiAiLGFjLSNjY1t5XSllbmQ7aWYKKGRjW3ldPT1uaWwpdGhlbiBkY1t5XT1iYigiMCIsYWMpZWxzZQpkY1t5XT1kY1t5XS4uYmIoIjAiLGFjLSNkY1t5XSllbmQKaWYoX2RbeV09PW5pbCl0aGVuIF9kW3ldPWJiKCJmIixhYyllbHNlIF9kW3ldPQpfZFt5XS4uYmIoImYiLGFjLSNfZFt5XSllbmQgZW5kIGVuZApsb2NhbCBfX2E9ZnVuY3Rpb24oZF9hLF9hYSxhYWEpYWQ9X2FhIG9yIGFkO2JkPWFhYSBvciBiZAppZihjY1tiZF09PW5pbCl0aGVuIGNjW2JkXT1iYigiICIsYWQtMSkuLmRfYS4uCmJiKCIgIixhYy0gKCNkX2ErYWQpKWVsc2UgY2NbYmRdPQphYihjY1tiZF0sMSxhZC0xKS4uCmJiKCIgIixhZC0jY2NbYmRdKS4uZF9hLi5hYihjY1tiZF0sYWQrI2RfYSxhYyllbmQ7aWYoI2NjW2JkXT5hYyl0aGVuIGFjPSNjY1tiZF1lbmQ7aWYoYmQ+YmMpdGhlbiBiYz1iZCBlbmQKX2MudXBkYXRlU2l6ZShhYyxiYyllbmQKbG9jYWwgYV9hPWZ1bmN0aW9uKGRfYSxfYWEsYWFhKWFkPV9hYSBvciBhZDtiZD1hYWEgb3IgYmQKaWYoX2RbYmRdPT1uaWwpdGhlbiBfZFtiZF09YmIoImYiLGFkLTEpLi5kX2EuLgpiYigiZiIsYWMtICgjZF9hK2FkKSllbHNlIF9kW2JkXT0KYWIoX2RbYmRdLDEsYWQtMSkuLgpiYigiZiIsYWQtI19kW2JkXSkuLmRfYS4uYWIoX2RbYmRdLGFkKyNkX2EsYWMpZW5kO2lmKCNfZFtiZF0+YWMpdGhlbiBhYz0jX2RbYmRdZW5kO2lmKGJkPmJjKXRoZW4gYmM9YmQgZW5kCl9jLnVwZGF0ZVNpemUoYWMsYmMpZW5kCmxvY2FsIGJfYT1mdW5jdGlvbihkX2EsX2FhLGFhYSlhZD1fYWEgb3IgYWQ7YmQ9YWFhIG9yIGJkCmlmKGRjW2JkXT09bmlsKXRoZW4gZGNbYmRdPWJiKCIwIixhZC0xKS4uZF9hLi4KYmIoIjAiLGFjLSAoI2RfYSthZCkpZWxzZSBkY1tiZF09CmFiKGRjW2JkXSwxLGFkLTEpLi4KYmIoIjAiLGFkLSNkY1tiZF0pLi5kX2EuLmFiKGRjW2JkXSxhZCsjZF9hLGFjKWVuZDtpZigjZGNbYmRdPmFjKXRoZW4gYWM9I2RjW2JkXWVuZDtpZihiZD5iYyl0aGVuIGJjPWJkIGVuZApfYy51cGRhdGVTaXplKGFjLGJjKWVuZApsb2NhbCBmdW5jdGlvbiBjX2EoZF9hKWNkPXt9Y2MsZGMsX2Q9e30se30se30KZm9yIF9hYSxhYWEgaW4gcGFpcnMoZGIpZG8gaWYodHlwZShfYWEpPT0ic3RyaW5nIil0aGVuIGNkW19hYV09YWFhIGVsc2UKY2NbX2FhXSxkY1tfYWFdLF9kW19hYV09YWFhWzFdLGFhYVsyXSxhYWFbM11lbmQgZW5kO19jLnVwZGF0ZVNpemUoYWMsYmMpZW5kO2lmKGRifj1uaWwpdGhlbiBhYz0jZGJbMV1bMV1iYz0jZGI7Y19hKGRiKWVuZApyZXR1cm4Ke3JlY2FsY3VsYXRlU2l6ZT1kZCxzZXRGcmFtZT1jX2EsZ2V0RnJhbWU9ZnVuY3Rpb24oKWxvY2FsIGRfYT17fQpmb3IgX2FhLGFhYSBpbgpwYWlycyhjYylkbyB0YWJsZS5pbnNlcnQoZF9hLHthYWEsZGNbX2FhXSxfZFtfYWFdfSllbmQ7Zm9yIF9hYSxhYWEgaW4gcGFpcnMoY2QpZG8gZF9hW19hYV09YWFhIGVuZDtyZXR1cm4gZF9hLGFjLGJjIGVuZCxnZXRJbWFnZT1mdW5jdGlvbigpCmxvY2FsIGRfYT17fWZvciBfYWEsYWFhIGluIHBhaXJzKGNjKWRvCnRhYmxlLmluc2VydChkX2Ese2FhYSxkY1tfYWFdLF9kW19hYV19KWVuZDtyZXR1cm4gZF9hIGVuZCxzZXRGcmFtZURhdGE9ZnVuY3Rpb24oZF9hLF9hYSkKaWYoCl9hYX49bmlsKXRoZW4gY2RbZF9hXT1fYWEgZWxzZSBpZih0eXBlKGRfYSk9PSJ0YWJsZSIpdGhlbiBjZD1kX2EgZW5kIGVuZCBlbmQsc2V0RnJhbWVJbWFnZT1mdW5jdGlvbihkX2EpCmZvciBfYWEsYWFhIGluIHBhaXJzKGRfYS50KWRvCmNjW19hYV09ZF9hLnRbX2FhXWRjW19hYV09ZF9hLmZnW19hYV1fZFtfYWFdPWRfYS5iZ1tfYWFdZW5kIGVuZCxnZXRGcmFtZUltYWdlPWZ1bmN0aW9uKCkKcmV0dXJue3Q9Y2MsZmc9ZGMsYmc9X2R9ZW5kLGdldEZyYW1lRGF0YT1mdW5jdGlvbihkX2EpcmV0dXJuKGRfYX49bmlsIGFuZCBjZFtkX2Fdb3IgY2QpZW5kLGJsaXQ9ZnVuY3Rpb24oZF9hLF9hYSxhYWEsYmFhLGNhYSkKX19hKGRfYSxiYWEsY2FhKWJfYShfYWEsYmFhLGNhYSlhX2EoYWFhLGJhYSxjYWEpZW5kLHRleHQ9X19hLGZnPWJfYSxiZz1hX2EsZ2V0U2l6ZT1mdW5jdGlvbigpcmV0dXJuCmFjLGJjIGVuZCxzZXRTaXplPWZ1bmN0aW9uKGRfYSxfYWEpbG9jYWwgYWFhLGJhYSxjYWE9e30se30se30KZm9yIF95PTEsX2FhIGRvCmlmKGNjW195XX49bmlsKXRoZW4gYWFhW195XT1hYihjY1tfeV0sMSxkX2EpLi5iYigiICIsCmRfYS1hYyllbHNlIGFhYVtfeV09YmIoIiAiLGRfYSllbmQ7aWYoZGNbX3ldfj1uaWwpdGhlbgpiYWFbX3ldPWFiKGRjW195XSwxLGRfYSkuLmJiKCIwIixkX2EtYWMpZWxzZSBiYWFbX3ldPWJiKCIwIixkX2EpZW5kO2lmCihfZFtfeV1+PW5pbCl0aGVuIGNhYVtfeV09YWIoX2RbX3ldLDEsZF9hKS4uYmIoImYiLGRfYS1hYyllbHNlCmNhYVtfeV09YmIoImYiLGRfYSllbmQgZW5kO2NjLGRjLF9kPWFhYSxiYWEsY2FhO2FjLGJjPWRfYSxfYWEgZW5kfWVuZApyZXR1cm4KZnVuY3Rpb24oZGIpbG9jYWwgX2M9e30KbG9jYWwgYWM9e2NyZWF0b3I9IkJpbWcgTGlicmFyeSBieSBOeW9yaUUiLGRhdGU9b3MuZGF0ZSgiISVZLSVtLSVkVCVUWiIpfWxvY2FsIGJjLGNjPTAsMDtsb2NhbCBkYz17fQpsb2NhbCBmdW5jdGlvbiBfZChjZCxkZCljZD1jZCBvciNfYysxCnRhYmxlLmluc2VydChfYyxjZCxjYihkZCxkYykpaWYoZGQ9PW5pbCl0aGVuIF9jW2NkXS5zZXRTaXplKGJjLGNjKWVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYWQoY2QpdGFibGUucmVtb3ZlKF9jLGNkIG9yI19jKWVuZApsb2NhbCBmdW5jdGlvbiBiZChjZCxkZCkKbG9jYWwgX19hPV9jW2NkXQppZihfX2F+PW5pbCl0aGVuIGxvY2FsIGFfYT1jZCtkZDtpZihhX2E+PTEpYW5kKGFfYTw9I19jKXRoZW4gdGFibGUucmVtb3ZlKF9jLGNkKQp0YWJsZS5pbnNlcnQoX2MsYV9hLF9fYSllbmQgZW5kIGVuZApkYz17dXBkYXRlU2l6ZT1mdW5jdGlvbihjZCxkZCxfX2EpbG9jYWwgYV9hPV9fYT09dHJ1ZSBhbmQgdHJ1ZSBvciBmYWxzZQppZihjZD5iYyl0aGVuIGFfYT10cnVlO2JjPWNkIGVuZDtpZihkZD5jYyl0aGVuIGFfYT10cnVlO2NjPWRkIGVuZAppZihhX2EpdGhlbiBmb3IgYl9hLGNfYSBpbiBwYWlycyhfYylkbyBjX2Euc2V0U2l6ZShiYyxjYykKY19hLnJlY2FsY3VsYXRlU2l6ZSgpZW5kIGVuZCBlbmQsdGV4dD1mdW5jdGlvbihjZCxkZCxfX2EsYV9hKQpsb2NhbCBiX2E9X2NbY2RdaWYoYl9hPT1uaWwpdGhlbiBiX2E9X2QoY2QpZW5kO2JfYS50ZXh0KGRkLF9fYSxhX2EpZW5kLGZnPWZ1bmN0aW9uKGNkLGRkLF9fYSxhX2EpCmxvY2FsIGJfYT1fY1tjZF1pZihiX2E9PW5pbCl0aGVuIGJfYT1fZChjZCllbmQ7Yl9hLmZnKGRkLF9fYSxhX2EpZW5kLGJnPWZ1bmN0aW9uKGNkLGRkLF9fYSxhX2EpCmxvY2FsIGJfYT1fY1tjZF1pZihiX2E9PW5pbCl0aGVuIGJfYT1fZChjZCllbmQ7Yl9hLmJnKGRkLF9fYSxhX2EpZW5kLGJsaXQ9ZnVuY3Rpb24oY2QsZGQsX19hLGFfYSxiX2EsY19hKQpsb2NhbCBkX2E9X2NbY2RdaWYoZF9hPT1uaWwpdGhlbiBkX2E9X2QoY2QpZW5kO2RfYS5ibGl0KGRkLF9fYSxhX2EsYl9hLGNfYSllbmQsc2V0U2l6ZT1mdW5jdGlvbihjZCxkZCkKYmM9Y2Q7Y2M9ZGQ7Zm9yIF9fYSxhX2EgaW4gcGFpcnMoX2MpZG8gYV9hLnNldFNpemUoY2QsZGQpZW5kIGVuZCxnZXRGcmFtZT1mdW5jdGlvbihjZClpZigKX2NbY2Rdfj1uaWwpdGhlbiByZXR1cm4gX2NbY2RdLmdldEZyYW1lKCllbmQgZW5kLGdldEZyYW1lT2JqZWN0cz1mdW5jdGlvbigpcmV0dXJuCl9jIGVuZCxnZXRGcmFtZXM9ZnVuY3Rpb24oKWxvY2FsIGNkPXt9Zm9yIGRkLF9fYSBpbiBwYWlycyhfYylkbyBsb2NhbCBhX2E9X19hLmdldEZyYW1lKCkKdGFibGUuaW5zZXJ0KGNkLGFfYSllbmQ7cmV0dXJuIGNkIGVuZCxnZXRGcmFtZU9iamVjdD1mdW5jdGlvbihjZClyZXR1cm4KX2NbY2RdZW5kLGFkZEZyYW1lPWZ1bmN0aW9uKGNkKWxvY2FsIGRkPWNiKClpZigjX2M8PTEpdGhlbgppZihhYy5hbmltYXRlZD09bmlsKXRoZW4gYWMuYW5pbWF0ZWQ9dHJ1ZSBlbmQKaWYoYWMuc2Vjb25kc1BlckZyYW1lPT1uaWwpdGhlbiBhYy5zZWNvbmRzUGVyRnJhbWU9MC4yIGVuZCBlbmQ7X2QoY2QpcmV0dXJuIGRkIGVuZCxyZW1vdmVGcmFtZT1mdW5jdGlvbihjZCkKYWQoY2QpCmlmKCNfYzw9MSl0aGVuIGlmKGFjLmFuaW1hdGVkPT1uaWwpdGhlbiBhYy5hbmltYXRlZD10cnVlIGVuZDtpZgooYWMuc2Vjb25kc1BlckZyYW1lPT1uaWwpdGhlbiBhYy5zZWNvbmRzUGVyRnJhbWU9MC4yIGVuZCBlbmQgZW5kLG1vdmVGcmFtZT1iZCxzZXRGcmFtZURhdGE9ZnVuY3Rpb24oY2QsZGQsX19hKQppZigKX2NbY2Rdfj1uaWwpdGhlbiBfY1tjZF0uc2V0RnJhbWVEYXRhKGRkLF9fYSllbmQgZW5kLGdldEZyYW1lRGF0YT1mdW5jdGlvbihjZCxkZClyZXR1cm4gX2NbY2Rdfj1uaWwgYW5kCl9jW2NkXS5nZXRGcmFtZURhdGEoZGQpZW5kLGdldFNpemU9ZnVuY3Rpb24oKXJldHVybgpiYyxjYyBlbmQsc2V0QW5pbWF0aW9uPWZ1bmN0aW9uKGNkKWFjLmFuaW1hdGlvbj1jZCBlbmQsc2V0TWV0YWRhdGE9ZnVuY3Rpb24oY2QsZGQpaWYoZGR+PW5pbCl0aGVuIGFjW2NkXT1kZCBlbHNlIGlmKAp0eXBlKGNkKT09InRhYmxlIil0aGVuIGFjPWNkIGVuZCBlbmQgZW5kLGdldE1ldGFkYXRhPWZ1bmN0aW9uKGNkKXJldHVybgpjZH49bmlsIGFuZCBhY1tjZF1vciBhYyBlbmQsY3JlYXRlQmltZz1mdW5jdGlvbigpCmxvY2FsIGNkPXt9CmZvciBkZCxfX2EgaW4gcGFpcnMoX2MpZG8gbG9jYWwgYV9hPV9fYS5nZXRGcmFtZSgpdGFibGUuaW5zZXJ0KGNkLGFfYSllbmQ7Zm9yIGRkLF9fYSBpbiBwYWlycyhhYylkbyBjZFtkZF09X19hIGVuZDtjZC53aWR0aD1iYztjZC5oZWlnaHQ9Y2M7cmV0dXJuIGNkIGVuZH0KaWYoZGJ+PW5pbCl0aGVuIGZvciBjZCxkZCBpbiBwYWlycyhkYilkbwppZih0eXBlKGNkKT09InN0cmluZyIpdGhlbiBhY1tjZF09ZGQgZWxzZSBfZChjZCxkZCllbmQgZW5kCmlmCihhYy53aWR0aD09bmlsKW9yKGFjLmhlaWdodD09bmlsKXRoZW4gZm9yIGNkLGRkIGluIHBhaXJzKF9jKWRvIGxvY2FsIF9fYSxhX2E9ZGQuZ2V0U2l6ZSgpaWYoX19hPmJjKXRoZW4gX19hPWJjIGVuZAppZihhX2E+Y2MpdGhlbiBhX2E9Y2MgZW5kIGVuZApkYy51cGRhdGVTaXplKGJjLGNjLHRydWUpZW5kIGVsc2UgX2QoMSllbmQ7cmV0dXJuIGRjIGVuZCBlbmQKYWFbImxpYnJhcmllcyJdWyJpbWFnZXMiXT1mdW5jdGlvbiguLi4pCmxvY2FsIGFiLGJiLGNiPXN0cmluZy5zdWIsbWF0aC5mbG9vcixzdHJpbmcucmVwCmxvY2FsIGZ1bmN0aW9uIGRiKGJkKWxvY2FsIGNkPXt7fX1sb2NhbCBkZD1mcy5vcGVuKGJkLCJyIikKaWYoZGR+PW5pbCl0aGVuIGZvciBfX2EgaW4gZGQucmVhZExpbmUgZG8KdGFibGUuaW5zZXJ0KGNkWzFdLHtjYigiICIsI19fYSksY2IoIiAiLAojX19hKSxfX2F9KWVuZDtkZC5jbG9zZSgpcmV0dXJuIGNkIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gX2MoYmQpcmV0dXJuIHBhaW50dXRpbHMubG9hZEltYWdlKGJkKSwibmZwImVuZApsb2NhbCBmdW5jdGlvbiBhYyhiZClsb2NhbCBjZD1mcy5vcGVuKGJkLCJyYiIpCmxvY2FsIGRkPXRleHR1dGlscy51bnNlcmlhbGl6ZShjZC5yZWFkQWxsKCkpY2QuY2xvc2UoKWlmKGRkfj1uaWwpdGhlbiByZXR1cm4gZGQsImJpbWciZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBiYyhiZCllbmQ7bG9jYWwgZnVuY3Rpb24gY2MoYmQpZW5kO2xvY2FsIGZ1bmN0aW9uIGRjKGJkLGNkKQppZihjZD09bmlsKXRoZW4gaWYoYmQ6ZmluZCgiLmJpbWciKSl0aGVuIHJldHVybiBhYyhiZCllbHNlaWYKKGJkOmZpbmQoIi5iYmYiKSl0aGVuIHJldHVybiBiYyhiZCllbHNlIHJldHVybiBfYyhiZCllbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBfZChiZCxjZClpZigKY2Q9PW5pbCl0aGVuCmlmKGJkOmZpbmQoIi5iaW1nIikpdGhlbiByZXR1cm4gYWMoYmQpZWxzZWlmKGJkOmZpbmQoIi5iYmYiKSl0aGVuIHJldHVybiBjYyhiZCllbHNlIHJldHVybiBkYihiZCllbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBhZChiZCxjZCxkZCkKbG9jYWwgX19hLGFfYT1iZC53aWR0aCBvciNiZFsxXVsxXVsxXSxiZC5oZWlnaHQgb3IjYmRbMV1sb2NhbCBiX2E9e30KZm9yIGNfYSxkX2EgaW4gcGFpcnMoYmQpZG8KaWYodHlwZShjX2EpPT0ibnVtYmVyIil0aGVuIGxvY2FsIF9hYT17fQpmb3IgeT0xLGRkIGRvIGxvY2FsIGFhYSxiYWEsY2FhPSIiLCIiLCIiCmxvY2FsIGRhYT1iYih5L2RkKmFfYSswLjUpCmlmKGRfYVtkYWFdfj1uaWwpdGhlbgpmb3IgeD0xLGNkIGRvIGxvY2FsIF9iYT1iYih4L2NkKl9fYSswLjUpYWFhPWFhYS4uCmFiKGRfYVtkYWFdWzFdLF9iYSxfYmEpCmJhYT1iYWEuLmFiKGRfYVtkYWFdWzJdLF9iYSxfYmEpY2FhPWNhYS4uYWIoZF9hW2RhYV1bM10sX2JhLF9iYSllbmQ7dGFibGUuaW5zZXJ0KF9hYSx7YWFhLGJhYSxjYWF9KWVuZCBlbmQ7dGFibGUuaW5zZXJ0KGJfYSxjX2EsX2FhKWVsc2UgYl9hW2NfYV09ZF9hIGVuZCBlbmQ7Yl9hLndpZHRoPWNkO2JfYS5oZWlnaHQ9ZGQ7cmV0dXJuIGJfYSBlbmQKcmV0dXJue2xvYWRORlA9X2MsbG9hZEJJTUc9YWMsbG9hZEltYWdlPWRjLHJlc2l6ZUJJTUc9YWQsbG9hZEltYWdlQXNCaW1nPV9kfWVuZAphYVsibGlicmFyaWVzIl1bIm1vZHVsZSJdPWZ1bmN0aW9uKC4uLilyZXR1cm4gZnVuY3Rpb24oYWIpbG9jYWwgYmIsY2I9cGNhbGwoZGEsYWIpCnJldHVybiBiYiBhbmQgY2Igb3IgbmlsIGVuZCBlbmQKYWFbImxpYnJhcmllcyJdWyJ0SGV4Il09ZnVuY3Rpb24oLi4uKQpyZXR1cm4Ke1tjb2xvcnMud2hpdGVdPSIwIixbY29sb3JzLm9yYW5nZV09IjEiLFtjb2xvcnMubWFnZW50YV09IjIiLFtjb2xvcnMubGlnaHRCbHVlXT0iMyIsW2NvbG9ycy55ZWxsb3ddPSI0IixbY29sb3JzLmxpbWVdPSI1IixbY29sb3JzLnBpbmtdPSI2IixbY29sb3JzLmdyYXldPSI3IixbY29sb3JzLmxpZ2h0R3JheV09IjgiLFtjb2xvcnMuY3lhbl09IjkiLFtjb2xvcnMucHVycGxlXT0iYSIsW2NvbG9ycy5ibHVlXT0iYiIsW2NvbG9ycy5icm93bl09ImMiLFtjb2xvcnMuZ3JlZW5dPSJkIixbY29sb3JzLnJlZF09ImUiLFtjb2xvcnMuYmxhY2tdPSJmIn1lbmQ7cmV0dXJuIGFhWyJtYWluIl0oKQ==";
  46.     ["ktlo.resources"] = base64.decode "bG9jYWwgYT17fWZ1bmN0aW9uIGEubG9hZChiKWxvY2FsIGM9aW8ub3BlbihiLCdyJylpZiBjIHRoZW4gbG9jYWwgZD1jOnJlYWQoJ2EnKWM6Y2xvc2UoKXJldHVybiBkIGVuZDtyZXR1cm4gYXNzZXJ0KFJFU09VUkNFUyBhbmQgUkVTT1VSQ0VTW2JdLCJyZXNvdXJjZSBcIiIuLmIuLiJcIiBub3QgZm91bmQiKWVuZDtyZXR1cm4gYQo=";
  47.     ["psg.keys"] = base64.decode "bG9jYWwgYmFzZTY0ID0gcmVxdWlyZSAna3Rsby5iYXNlNjQnCgpsb2NhbCBsaWIgPSB7fQoKbG9jYWwgZnVuY3Rpb24gaGFsZmluZyh2YWx1ZSkKCWxvY2FsIHNpemUgPSAoI3ZhbHVlKS8yCglsb2NhbCBtb3N0ID0gdmFsdWU6c3ViKDEsIHNpemUpCglsb2NhbCBsZWFzdCA9IHZhbHVlOnN1YihzaXplICsgMSkKCWxvY2FsIHJlc3VsdCA9IHt9Cglmb3IgaT0xLCBzaXplIGRvCgkJcmVzdWx0W2ldID0gc3RyaW5nLmNoYXIoYml0LmJ4b3IobW9zdDpieXRlKGkpLCBsZWFzdDpieXRlKGkpKSkKCWVuZAoJcmV0dXJuIHRhYmxlLmNvbmNhdChyZXN1bHQsICcnKQplbmQKCmxvY2FsIHplcm8gPSAoJzAnKTpieXRlKDEpCmxvY2FsIGEgPSAoJ0EnKTpieXRlKDEpCgpsb2NhbCBmdW5jdGlvbiBlbmNvZGVIZXhDb2RlKGNvZGUpCglsb2NhbCBzeW1ib2wKCWlmIGNvZGUgPCAxMCB0aGVuCgkJc3ltYm9sID0gemVybyArIGNvZGUKCWVsc2UKCQlzeW1ib2wgPSBhICsgY29kZQoJZW5kCglyZXR1cm4gc3RyaW5nLmNoYXIoc3ltYm9sKQplbmQKCmxvY2FsIGZ1bmN0aW9uIGVuY29kZUNoYXIoY2hhcikKCXJldHVybiBlbmNvZGVIZXhDb2RlKGJpdC5icnNoaWZ0KGNoYXIsIDQpKS4uZW5jb2RlSGV4Q29kZShiaXQuYmFuZChjaGFyLCAxNSkpCmVuZAoKbG9jYWwgZnVuY3Rpb24gZW5jb2RlSGV4KHN0cikKCWxvY2FsIHIgPSB7fQoJZm9yIGk9MSwgI3N0ciBkbwoJCXRhYmxlLmluc2VydChyLCBlbmNvZGVDaGFyKHN0cjpieXRlKGkpKSkKCWVuZAoJcmV0dXJuIHRhYmxlLmNvbmNhdChyLCAnJykKZW5kCgpmdW5jdGlvbiBsaWIuZmluZ2VycHJpbnQoa2V5KQoJcmV0dXJuIGVuY29kZUhleChoYWxmaW5nKGhhbGZpbmcoYmFzZTY0LmRlY29kZShrZXkpKSkpCmVuZAoKcmV0dXJuIGxpYgo=";
  48.     ["ktlo.rpc"] = base64.decode "bG9jYWwgam9iID0gcmVxdWlyZSAna3Rsby5qb2InCgpsb2NhbCBycGMgPSB7fQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbCBmdW5jdGlvbiBwcmVwYXJlQW5zd2VyKHNlcnZlciwgaWQsIHJlc3VsdCkKCXJldHVybiB7CgkJbWFnaWMgPSAicnBjIjsKCQlzZXJ2ZXIgPSBzZXJ2ZXI7CgkJa2luZCA9ICdyZXNwb25zZSc7CgkJaWQgPSBpZDsKCQlyZXN1bHQgPSByZXN1bHQ7Cgl9CmVuZAoKbG9jYWwgZnVuY3Rpb24gcHJlcGFyZVN1Y2Nlc3Moc2VydmVyLCBpZCwgLi4uKQoJcmV0dXJuIHByZXBhcmVBbnN3ZXIoc2VydmVyLCBpZCwgeyBzdGF0dXMgPSAnc3VjY2VzcycsIHZhbHVlID0gdGFibGUucGFjayguLi4pIH0pCmVuZAoKbG9jYWwgZnVuY3Rpb24gcHJlcGFyZUVycm9yKHNlcnZlciwgaWQsIGVycm9yKQoJcmV0dXJuIHByZXBhcmVBbnN3ZXIoc2VydmVyLCBpZCwgeyBzdGF0dXMgPSAnZmFpbHVyZScsIGVycm9yID0gZXJyb3IgfSkKZW5kCgpsb2NhbCBmdW5jdGlvbiBwcm9jZXNzUmVxdWVzdChjb21tYW5kcywgbWVzc2FnZSwgaG9zdG5hbWUpCglpZiB0eXBlKG1lc3NhZ2UpID09ICd0YWJsZScgYW5kIG1lc3NhZ2UubWFnaWMgPT0gInJwYyIgYW5kIG1lc3NhZ2Uua2luZCA9PSAncmVxdWVzdCcgYW5kIG1lc3NhZ2Uuc2VydmVyID09IGhvc3RuYW1lIHRoZW4KCQlsb2NhbCBtdHlwZSA9IG1lc3NhZ2UudHlwZQoJCWlmIG10eXBlID09ICdoZWxwJyB0aGVuCgkJCWxvY2FsIGhlbHAgPSB7fQoJCQlmb3IgY29tbWFuZCBpbiBwYWlycyhjb21tYW5kcykgZG8KCQkJCWhlbHBbY29tbWFuZF0gPSB7CgkJCQkJaGVscCA9IGNvbW1hbmQuaGVscDsKCQkJCX0KCQkJZW5kCgkJCXJldHVybiBwcmVwYXJlU3VjY2Vzcyhob3N0bmFtZSwgbWVzc2FnZS5pZCwgaGVscCkKCQllbHNlaWYgbXR5cGUgPT0gJ2NhbGwnIHRoZW4KCQkJbG9jYWwgY29tbWFuZCA9IGNvbW1hbmRzW21lc3NhZ2UuY29tbWFuZF0KCQkJaWYgY29tbWFuZCA9PSBuaWwgdGhlbgoJCQkJcmV0dXJuIHByZXBhcmVFcnJvcihob3N0bmFtZSwgbWVzc2FnZS5pZCwgInVua25vd24gcmVtb3RlIHByb2NlZHVyZSAnIi4ubWVzc2FnZS5jb21tYW5kLi4iJyIpCgkJCWVuZAoJCQlsb2NhbCByZXN1bHQgPSB7IHBjYWxsKGNvbW1hbmQucHJvY2VkdXJlLCB0YWJsZS51bnBhY2sobWVzc2FnZS5hcmd1bWVudHMpKSB9CgkJCWlmIHJlc3VsdFsxXSB0aGVuCgkJCQlyZXR1cm4gcHJlcGFyZVN1Y2Nlc3MoaG9zdG5hbWUsIG1lc3NhZ2UuaWQsIHRhYmxlLnVucGFjayhyZXN1bHQsIDIpKQoJCQllbHNlCgkJCQlyZXR1cm4gcHJlcGFyZUVycm9yKGhvc3RuYW1lLCBtZXNzYWdlLmlkLCByZXN1bHRbMl0pCgkJCWVuZAoJCWVsc2UKCQkJcmV0dXJuIHByZXBhcmVFcnJvcihob3N0bmFtZSwgbWVzc2FnZS5pZCwgInVuc3VwcG9ydGVkIHJwYyByZXF1ZXN0IHR5cGUgJyIuLm10eXBlLi4iJyIpCgkJZW5kCgllbmQKZW5kCgpmdW5jdGlvbiBycGMuc2VydmVyKGNvbW1hbmRzLCBoYW5kbGVyLCBob3N0bmFtZSkKCXJldHVybiBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXdoaWxlIHRydWUgZG8KCQkJaGFuZGxlcihmdW5jdGlvbihyZXF1ZXN0KQoJCQkJcmV0dXJuIHByb2Nlc3NSZXF1ZXN0KGNvbW1hbmRzLCByZXF1ZXN0LCBob3N0bmFtZSkKCQkJZW5kKQoJCWVuZAoJZW5kKQplbmQKCmxvY2FsIGRjYWxsID0gcGVyaXBoZXJhbC5jYWxsCgpsb2NhbCBmdW5jdGlvbiBtb2RlbVNlcnZlckhhbmRsZXJUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCwgZikKCWxvY2FsIHNpZGUsIHJjaGFubmVsLCByZXBseUNoYW5uZWwsIHJlcXVlc3QKCXJlcGVhdAoJCXNpZGUsIHJjaGFubmVsLCByZXBseUNoYW5uZWwsIHJlcXVlc3QgPSBzZWxlY3QoMiwgb3MucHVsbEV2ZW50KCJtb2RlbV9tZXNzYWdlIikpCgl1bnRpbCBzaWRlID09IG1vZGVtIGFuZCByY2hhbm5lbCA9PSBjaGFubmVsCglsb2NhbCByZXNwb25zZSA9IGYocmVxdWVzdCkKCWlmIHJlc3BvbnNlIHRoZW4KCQlkY2FsbChtb2RlbSwgJ3RyYW5zbWl0JywgcmVwbHlDaGFubmVsLCBjaGFubmVsLCByZXNwb25zZSkKCWVuZAplbmQKCmxvY2FsIGZ1bmN0aW9uIHdpdGhMaXN0ZW5pbmdDaGFubmVsKG1vZGVtLCBjaGFubmVsLCBhY3Rpb24pCgktLSBpZiBkY2FsbChtb2RlbSwgJ2lzT3BlbicsIGNoYW5uZWwpIHRoZW4KCS0tCSAgIGVycm9yKCJjaGFubmVsICMiLi5jaGFubmVsLi4iaXMgYWxyZWFkeSBvcGVuIiwgMikKCS0tIGVuZAoJZGNhbGwobW9kZW0sICdvcGVuJywgY2hhbm5lbCkKCXJldHVybiBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCWpvYi5ydW5uaW5nKCk6ZmlubmFsaXplKGZ1bmN0aW9uKCkKCQkJZGNhbGwobW9kZW0sICdjbG9zZScsIGNoYW5uZWwpCgkJZW5kKQoJCXJldHVybiBhY3Rpb24oKQoJZW5kKQplbmQKCmZ1bmN0aW9uIHJwYy5zZXJ2ZXJfbmV0d29yayhjb21tYW5kcywgbW9kZW0sIGNoYW5uZWwsIGhvc3RuYW1lKQoJaWYgdHlwZShtb2RlbSkgPT0gJ3RhYmxlJyB0aGVuCgkJbW9kZW0gPSBwZXJpcGhlcmFsLmdldE5hbWUobW9kZW0pCgllbmQKCXJldHVybiB3aXRoTGlzdGVuaW5nQ2hhbm5lbChtb2RlbSwgY2hhbm5lbCwgZnVuY3Rpb24oKQoJCWxvY2FsIHByb2Nlc3MgPSBmdW5jdGlvbihmKSBtb2RlbVNlcnZlckhhbmRsZXJUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCwgZikgZW5kCgkJcnBjLnNlcnZlcihjb21tYW5kcywgcHJvY2VzcywgaG9zdG5hbWUpCgllbmQpCmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBycGMuaXNfcmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpCglyZXR1cm4gdHlwZShyZXNwb25zZSkgPT0gJ3RhYmxlJyBhbmQgcmVzcG9uc2UubWFnaWMgPT0gInJwYyIgYW5kIHJlc3BvbnNlLmlkID09IHJlcXVlc3QuaWQgYW5kIHJlc3BvbnNlLmtpbmQgPT0gJ3Jlc3BvbnNlJyBhbmQgcmVzcG9uc2UucmVzdWx0IC0tIGFuZCByZXNwb25zZS5zZXJ2ZXIgPT0gcmVxdWVzdC5zZXJ2ZXIKZW5kCgpsb2NhbCBmdW5jdGlvbiBleGVjdXRlUmVtb3RlKGNsaWVudCwgbXR5cGUsIGZpbGwsIC4uLikKCWxvY2FsIGlkID0gbWF0aC5yYW5kb20oMTAwMDAwMDAwMDAwKQoJbG9jYWwgcmVxdWVzdCA9IHsKCQltYWdpYyA9ICJycGMiOwoJCXNlcnZlciA9IGNsaWVudC5zZXJ2ZXI7CgkJaWQgPSBpZDsKCQlraW5kID0gJ3JlcXVlc3QnOwoJCXR5cGUgPSBtdHlwZTsKCX0KCWZpbGwocmVxdWVzdCwgLi4uKQoJbG9jYWwgcmVzcG9uc2UgPSBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXJldHVybiBjbGllbnQuZXhjaGFuZ2UocmVxdWVzdCkucmVzdWx0CgllbmQpCglsb2NhbCBvaywgcmVzdWx0ID0gcmVzcG9uc2U6YXdhaXRfdGltZW91dChjbGllbnQudGltZW91dCkKCWlmIG5vdCBvayB0aGVuCgkJZXJyb3IoInRpbWVvdXQiLCAzKQoJZW5kCglpZiByZXN1bHQuc3RhdHVzID09ICdzdWNjZXNzJyB0aGVuCgkJcmV0dXJuIHRhYmxlLnVucGFjayhyZXN1bHQudmFsdWUpCgllbHNlCgkJZXJyb3IoInJwYzogIi4ucmVzdWx0LmVycm9yLCAzKQoJZW5kCmVuZAoKbG9jYWwgZnVuY3Rpb24gZmlsbENhbGwocmVxdWVzdCwgcHJvY2VkdXJlLCAuLi4pCglyZXF1ZXN0LmNvbW1hbmQgPSBwcm9jZWR1cmUKCXJlcXVlc3QuYXJndW1lbnRzID0gdGFibGUucGFjayguLi4pCmVuZAoKbG9jYWwgZnVuY3Rpb24gZXhlY3V0ZVJlbW90ZVByb2NlZHVyZShjbGllbnQsIHByb2NlZHVyZSwgLi4uKQoJcmV0dXJuIGV4ZWN1dGVSZW1vdGUoY2xpZW50LCAnY2FsbCcsIGZpbGxDYWxsLCBwcm9jZWR1cmUsIC4uLikKZW5kCgpsb2NhbCBmdW5jdGlvbiBmaWxsSGVscCgpZW5kCgpsb2NhbCBmdW5jdGlvbiBleGVjdXRlUmVtb3RlSGVscChjbGllbnQpCglyZXR1cm4gZXhlY3V0ZVJlbW90ZShjbGllbnQsICdoZWxwJywgZmlsbEhlbHApCmVuZAoKbG9jYWwgY2xpZW50X21ldGEgPSB7fQoKZnVuY3Rpb24gY2xpZW50X21ldGE6X19pbmRleChrZXkpCglyZXR1cm4gZnVuY3Rpb24oLi4uKQoJCXJldHVybiBleGVjdXRlUmVtb3RlUHJvY2VkdXJlKHJhd2dldChzZWxmLCAnX3N0YXRlJyksIGtleSwgLi4uKQoJZW5kCmVuZAoKZnVuY3Rpb24gY2xpZW50X21ldGE6X19wYWlycygpCglyZXR1cm4gbmV4dCwgZXhlY3V0ZVJlbW90ZUhlbHAocmF3Z2V0KHNlbGYsICdfc3RhdGUnKSksIG5pbAplbmQKCmZ1bmN0aW9uIHJwYy5jbGllbnQoZXhjaGFuZ2UsIHRpbWVvdXQsIGhvc3RuYW1lKQoJbG9jYWwgY2xpZW50ID0gewoJCV9zdGF0ZSA9IHsKCQkJZXhjaGFuZ2UgPSBleGNoYW5nZTsKCQkJdGltZW91dCA9IHRpbWVvdXQ7CgkJCXNlcnZlciA9IGhvc3RuYW1lOwoJCX07Cgl9CglyZXR1cm4gc2V0bWV0YXRhYmxlKGNsaWVudCwgY2xpZW50X21ldGEpCmVuZAoKbG9jYWwgZnVuY3Rpb24gcmFuZG9tQ2hhbm5lbChtb2RlbSkKCXdoaWxlIHRydWUgZG8KCQlsb2NhbCBjaGFubmVsID0gbWF0aC5yYW5kb20oNjU1MzUpCgkJaWYgbm90IGRjYWxsKG1vZGVtLCAnaXNPcGVuJywgY2hhbm5lbCkgdGhlbgoJCQlyZXR1cm4gY2hhbm5lbAoJCWVuZAoJZW5kCmVuZAoKbG9jYWwgZnVuY3Rpb24gZXhjaGFuZ2VOZXR3b3JrVGVtcGxhdGUobW9kZW0sIHNlcnZlckNoYW5uZWwsIHJlcXVlc3QpCglsb2NhbCByZXBseUNoYW5uZWwgPSByYW5kb21DaGFubmVsKG1vZGVtKQoJZGNhbGwobW9kZW0sICdvcGVuJywgcmVwbHlDaGFubmVsKQoJZGNhbGwobW9kZW0sICd0cmFuc21pdCcsIHNlcnZlckNoYW5uZWwsIHJlcGx5Q2hhbm5lbCwgcmVxdWVzdCkKCWpvYi5ydW5uaW5nKCk6ZmlubmFsaXplKGZ1bmN0aW9uKCkKCQlkY2FsbChtb2RlbSwgJ2Nsb3NlJywgcmVwbHlDaGFubmVsKQoJZW5kKQoJbG9jYWwgc2lkZSwgY2hhbm5lbCwgcmVzcG9uc2UKCXJlcGVhdAoJCV8sIHNpZGUsIGNoYW5uZWwsIF8sIHJlc3BvbnNlID0gb3MucHVsbEV2ZW50KCJtb2RlbV9tZXNzYWdlIikKCXVudGlsIHNpZGUgPT0gbW9kZW0gYW5kIGNoYW5uZWwgPT0gcmVwbHlDaGFubmVsIGFuZCBycGMuaXNfcmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpCglyZXR1cm4gcmVzcG9uc2UKZW5kCgpmdW5jdGlvbiBycGMuY2xpZW50X25ldHdvcmsobW9kZW0sIGNoYW5uZWwsIHRpbWVvdXQsIGhvc3RuYW1lKQoJaWYgdHlwZShtb2RlbSkgPT0gJ3RhYmxlJyB0aGVuCgkJbW9kZW0gPSBwZXJpcGhlcmFsLmdldE5hbWUobW9kZW0pCgllbmQKCXJldHVybiBycGMuY2xpZW50KGZ1bmN0aW9uIChyZXF1ZXN0KQoJCXJldHVybiBleGNoYW5nZU5ldHdvcmtUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCwgcmVxdWVzdCkKCWVuZCwgdGltZW91dCwgaG9zdG5hbWUpCmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBycGMuYnJvYWRjYXN0KHB1c2gsIGV2ZW50KQoJbG9jYWwgbWVzc2FnZSA9IHsKCQltYWdpYyA9ICJycGMiOwoJCWtpbmQgPSAnZXZlbnQnOwoJCWlkID0gbWF0aC5yYW5kb20oKTsKCQlkYXRhID0gZXZlbnQ7Cgl9CglwdXNoKG1lc3NhZ2UpCmVuZAoKbG9jYWwgZnVuY3Rpb24gbmV0d29ya0Jyb2FkY2FzdFB1c2hUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCwgbWVzc2FnZSkKCWRjYWxsKG1vZGVtLCAndHJhbnNtaXQnLCBjaGFubmVsLCAwLCBtZXNzYWdlKQplbmQKCmZ1bmN0aW9uIHJwYy5icm9hZGNhc3RfbmV0d29yayhtb2RlbSwgY2hhbm5lbCwgZXZlbnQpCglpZiB0eXBlKG1vZGVtKSA9PSAndGFibGUnIHRoZW4KCQltb2RlbSA9IHBlcmlwaGVyYWwuZ2V0TmFtZShtb2RlbSkKCWVuZAoJcnBjLmJyb2FkY2FzdChmdW5jdGlvbihtZXNzYWdlKQoJCXJldHVybiBuZXR3b3JrQnJvYWRjYXN0UHVzaFRlbXBsYXRlKG1vZGVtLCBjaGFubmVsLCBtZXNzYWdlKQoJZW5kLCBldmVudCkKZW5kCgpmdW5jdGlvbiBycGMuc3Vic2NyaWJlKHB1bGwsIGFjdGlvbikKCXJldHVybiBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXdoaWxlIHRydWUgZG8KCQkJbG9jYWwgbWVzc2FnZSwgbWV0YSA9IHB1bGwoKQoJCQlpZiB0eXBlKG1lc3NhZ2UpID09ICd0YWJsZScgYW5kIG1lc3NhZ2UubWFnaWMgPT0gJ3JwYycgYW5kIG1lc3NhZ2Uua2luZCA9PSAnZXZlbnQnIHRoZW4KCQkJCWpvYi5hc3luYyhmdW5jdGlvbigpIGFjdGlvbihtZXNzYWdlLmRhdGEsIG1ldGEpIGVuZCkKCQkJZW5kCgkJZW5kCgllbmQpCmVuZAoKbG9jYWwgZnVuY3Rpb24gbmV0d29ya1N1YnNjcmliZVB1bGxUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCkKCWxvY2FsIHNpZGUsIHJjaGFubmVsLCBtZXNzYWdlLCBkaXN0YW5jZQoJcmVwZWF0CgkJXywgc2lkZSwgcmNoYW5uZWwsIF8sIG1lc3NhZ2UsIGRpc3RhbmNlID0gb3MucHVsbEV2ZW50KCJtb2RlbV9tZXNzYWdlIikKCXVudGlsIHNpZGUgPT0gbW9kZW0gYW5kIHJjaGFubmVsID09IGNoYW5uZWwKCXJldHVybiBtZXNzYWdlLCB7ZGlzdGFuY2U9ZGlzdGFuY2V9CmVuZAoKZnVuY3Rpb24gcnBjLnN1YnNjcmliZV9uZXR3b3JrKG1vZGVtLCBjaGFubmVsLCBhY3Rpb24pCglpZiB0eXBlKG1vZGVtKSA9PSAndGFibGUnIHRoZW4KCQltb2RlbSA9IHBlcmlwaGVyYWwuZ2V0TmFtZShtb2RlbSkKCWVuZAoJcmV0dXJuIHdpdGhMaXN0ZW5pbmdDaGFubmVsKG1vZGVtLCBjaGFubmVsLCBmdW5jdGlvbigpCgkJcnBjLnN1YnNjcmliZShmdW5jdGlvbigpCgkJCXJldHVybiBuZXR3b3JrU3Vic2NyaWJlUHVsbFRlbXBsYXRlKG1vZGVtLCBjaGFubmVsKQoJCWVuZCwgYWN0aW9uKQoJZW5kKQplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuY3Rpb24gcnBjLnNpbXBsZV9jb21tYW5kcyhjb21tYW5kcykKCWxvY2FsIHJlc3VsdCA9IHt9Cglmb3IgaywgdiBpbiBwYWlycyhjb21tYW5kcykgZG8KCQlyZXN1bHRba10gPSB7IHByb2NlZHVyZSA9IHYgfQoJZW5kCglyZXR1cm4gcmVzdWx0CmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpyZXR1cm4gcnBjCg==";
  49.     ["psg.addresses"] = base64.decode "bG9jYWwgc2V0bWV0YXRhYmxlLCBpcGFpcnMsIHBhaXJzID0gc2V0bWV0YXRhYmxlLCBpcGFpcnMsIHBhaXJzCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmxvY2FsIGFkZHJlc3Nlc19pbmRleCA9IHt9Cgpsb2NhbCBhZGRyZXNzZXNfbWV0YSA9IHsKCV9faW5kZXggPSBhZGRyZXNzZXNfaW5kZXg7Cn0KCmxvY2FsIGZ1bmN0aW9uIGFkZHJlc3Nlc190b3N0cmluZyhhZGRyZXNzKQoJcmV0dXJuIHRhYmxlLmNvbmNhdChhZGRyZXNzLCAnLScpCmVuZAoKbG9jYWwgYWRkcmVzc2VzID0gewoJdG9zdHJpbmcgPSBhZGRyZXNzZXNfdG9zdHJpbmcKfQoKbG9jYWwgZnVuY3Rpb24gZ2FsYXh5X2tleShnYWxheHksIGFkZHJlc3MpCglyZXR1cm4gZ2FsYXh5Li4iOiIuLmFkZHJlc3Nlc190b3N0cmluZyhhZGRyZXNzKQplbmQKCmZ1bmN0aW9uIGFkZHJlc3Nlcy5jcmVhdGUoYWRkcmVzc2Jvb2spCglsb2NhbCBuYW1lQnlBZGRyZXNzID0ge30KCglmb3IgXywgcmVjb3JkIGluIGlwYWlycyhhZGRyZXNzYm9vay5pZGVudGl0eSBvciB7fSkgZG8KCQluYW1lQnlBZGRyZXNzW2FkZHJlc3Nlc190b3N0cmluZyhyZWNvcmQuYWRkcmVzcyldID0gcmVjb3JkLm5hbWUKCWVuZAoKCWZvciBfLCByZWNvcmQgaW4gaXBhaXJzKGFkZHJlc3Nib29rLnBvc2l0aW9uIG9yIHt9KSBkbwoJCWxvY2FsIGV4dHJhZ2FsYWN0aWMgPSByZWNvcmQuZXh0cmFnYWxhY3RpYwoJCWlmIGV4dHJhZ2FsYWN0aWMgdGhlbgoJCQluYW1lQnlBZGRyZXNzW2FkZHJlc3Nlc190b3N0cmluZyhleHRyYWdhbGFjdGljKV0gPSByZWNvcmQubmFtZQoJCWVuZAoJCWZvciBnYWxheHksIGFkZHJlc3MgaW4gcGFpcnMocmVjb3JkLmludGVyc3RlbGxhciBvciB7fSkgZG8KCQkJbG9jYWwga2V5ID0gZ2FsYXh5X2tleShnYWxheHksIGFkZHJlc3MpCgkJCW5hbWVCeUFkZHJlc3Nba2V5XSA9IHJlY29yZC5uYW1lCgkJZW5kCgllbmQKCglsb2NhbCBvYmogPSB7CgkJYWRkcmVzc2Jvb2sgPSBhZGRyZXNzYm9vazsKCQluYW1lQnlBZGRyZXNzID0gbmFtZUJ5QWRkcmVzczsKCX0KCXJldHVybiBzZXRtZXRhdGFibGUob2JqLCBhZGRyZXNzZXNfbWV0YSkKZW5kCgpmdW5jdGlvbiBhZGRyZXNzZXNfaW5kZXg6aW50ZXJzdGVsbGFyKGdhbGF4aWVzLCBzb2xhclN5c3RlbSkKCWxvY2FsIHJlc3VsdCA9IHt9Cglmb3IgXywgc29sYXIgaW4gaXBhaXJzKHNlbGYuYWRkcmVzc2Jvb2sucG9zaXRpb24gb3Ige30pIGRvCgkJaWYgc29sYXIua2V5IH49IHNvbGFyU3lzdGVtIHRoZW4KCQkJaWYgc29sYXIuaW50ZXJzdGVsbGFyIHRoZW4KCQkJCWZvciBfLCBnYWxheHkgaW4gaXBhaXJzKGdhbGF4aWVzKSBkbwoJCQkJCWxvY2FsIGFkZHJlc3MgPSBzb2xhci5pbnRlcnN0ZWxsYXJbZ2FsYXh5XQoJCQkJCWlmIGFkZHJlc3MgdGhlbgoJCQkJCQlsb2NhbCByZWNvcmQgPSB7CgkJCQkJCQluYW1lID0gc29sYXIubmFtZSBvciAiPz8/Pz8iLAoJCQkJCQkJYWRkcmVzcyA9IGFkZHJlc3MKCQkJCQkJfQoJCQkJCQl0YWJsZS5pbnNlcnQocmVzdWx0LCByZWNvcmQpCgkJCQkJCWJyZWFrCgkJCQkJZW5kCgkJCQllbmQKCQkJZW5kCgkJZW5kCgllbmQKCXJldHVybiByZXN1bHQKZW5kCgpmdW5jdGlvbiBhZGRyZXNzZXNfaW5kZXg6ZXh0cmFnYWxhY3RpYyhnYWxheGllcykKCWxvY2FsIHJlc3VsdCA9IHt9Cglmb3IgXywgc29sYXIgaW4gaXBhaXJzKHNlbGYuYWRkcmVzc2Jvb2sucG9zaXRpb24gb3Ige30pIGRvCgkJaWYgc29sYXIuZXh0cmFnYWxhY3RpYyB0aGVuCgkJCWxvY2FsIG5vdFNraXAgPSB0cnVlCgkJCWZvciBfLCBnYWxheHkgaW4gaXBhaXJzKGdhbGF4aWVzKSBkbwoJCQkJaWYgc29sYXIuaW50ZXJzdGVsbGFyW2dhbGF4eV0gdGhlbgoJCQkJCW5vdFNraXAgPSBmYWxzZQoJCQkJCWJyZWFrCgkJCQllbmQKCQkJZW5kCgkJCWlmIG5vdFNraXAgdGhlbgoJCQkJbG9jYWwgcmVjb3JkID0gewoJCQkJCW5hbWUgPSBzb2xhci5uYW1lIG9yICI/Pz8/PyIsCgkJCQkJYWRkcmVzcyA9IHNvbGFyLmV4dHJhZ2FsYWN0aWMKCQkJCX0KCQkJCXRhYmxlLmluc2VydChyZXN1bHQsIHJlY29yZCkKCQkJZW5kCgkJZW5kCgllbmQKCXJldHVybiByZXN1bHQKZW5kCgpsb2NhbCBmdW5jdGlvbiB0YWJsZUVxdWFscyhhLCBiKQoJaWYgI2EgPT0gI2IgdGhlbgoJCWZvciBpID0gMSwgI2EgZG8KCQkJaWYgYVtpXSB+PSBiW2ldIHRoZW4KCQkJCXJldHVybiBmYWxzZQoJCQllbmQKCQllbmQKCQlyZXR1cm4gdHJ1ZQoJZWxzZQoJCXJldHVybiBmYWxzZQoJZW5kCmVuZAoKZnVuY3Rpb24gYWRkcmVzc2VzX2luZGV4OmRpcmVjdChsb2NhbEFkZHJlc3MpCglsb2NhbCByZXN1bHQgPSB7fQoJZm9yIF8sIHJlY29yZCBpbiBpcGFpcnMoc2VsZi5hZGRyZXNzYm9vay5pZGVudGl0eSBvciB7fSkgZG8KCQlpZiBub3QgbG9jYWxBZGRyZXNzIG9yIG5vdCB0YWJsZUVxdWFscyhyZWNvcmQuYWRkcmVzcywgbG9jYWxBZGRyZXNzKSB0aGVuCgkJCXRhYmxlLmluc2VydChyZXN1bHQsIHJlY29yZCkKCQllbmQKCWVuZAoJcmV0dXJuIHJlc3VsdAplbmQKCmZ1bmN0aW9uIGFkZHJlc3Nlc19pbmRleDpnZXRuYW1lX2J5X2tleShrZXkpCglmb3IgXywgc29sYXIgaW4gaXBhaXJzKHNlbGYuYWRkcmVzc2Jvb2sucG9zaXRpb24gb3Ige30pIGRvCgkJbG9jYWwgbmFtZSA9IHNvbGFyLm5hbWUKCQlpZiBzb2xhci5rZXkgPT0ga2V5IGFuZCBuYW1lIHRoZW4KCQkJcmV0dXJuIG5hbWUKCQllbmQKCWVuZAoJcmV0dXJuIG5pbAplbmQKCmZ1bmN0aW9uIGFkZHJlc3Nlc19pbmRleDpnZXRuYW1lKGFkZHJlc3MsIGdhbGF4aWVzKQoJbG9jYWwgbiA9ICNhZGRyZXNzCglpZiBuID09IDYgdGhlbgoJCWlmIGdhbGF4aWVzIHRoZW4KCQkJZm9yIF8sIGdhbGF4eSBpbiBpcGFpcnMoZ2FsYXhpZXMpIGRvCgkJCQlsb2NhbCBrZXkgPSBnYWxheHlfa2V5KGdhbGF4eSwgYWRkcmVzcykKCQkJCWxvY2FsIG5hbWUgPSBzZWxmLm5hbWVCeUFkZHJlc3Nba2V5XQoJCQkJaWYgbmFtZSB0aGVuCgkJCQkJcmV0dXJuIG5hbWUKCQkJCWVuZAoJCQllbmQKCQllbmQKCQlyZXR1cm4gbmlsCgllbHNlCgkJcmV0dXJuIHNlbGYubmFtZUJ5QWRkcmVzc1thZGRyZXNzZXMudG9zdHJpbmcoYWRkcmVzcyldCgllbmQKZW5kCgpyZXR1cm4gYWRkcmVzc2VzCg==";
  50.     ["psg.keyring"] = base64.decode "CmxvY2FsIEFVVEhPUklaRURfS0VZU19GSUxFID0gImtleXJpbmcudHh0IgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbG9jYWwgYmFzZTY0ID0gcmVxdWlyZSAna3Rsby5iYXNlNjQnCgpsb2NhbCBmdW5jdGlvbiByZWFkX2tleShsaW5lKQoJbG9jYWwga2V5LCBuYW1lID0gbGluZTptYXRjaCAiXihbJXcrPS9dKyklcysoLispJCIKCWlmIGtleSB0aGVuCgkJcmV0dXJuIGtleSwgbmFtZQoJZWxzZQoJCXJldHVybiBsaW5lCgllbmQKZW5kCgpsb2NhbCBhdXRob3JpemVkS2V5cyA9IHt9CmRvCglsb2NhbCBmaWxlID0gaW8ub3BlbihBVVRIT1JJWkVEX0tFWVNfRklMRSwgJ3InKQoJaWYgZmlsZSB0aGVuCgkJZm9yIGxpbmUgaW4gZmlsZTpsaW5lcygnbCcpIGRvCgkJCWxvY2FsIGtleSwgbmFtZSA9IHJlYWRfa2V5KGxpbmUpCgkJCWF1dGhvcml6ZWRLZXlzW2Jhc2U2NC5kZWNvZGUoa2V5KV0gPSB7a2V5PWtleSwgbmFtZT1uYW1lfQoJCWVuZAoJCWZpbGU6Y2xvc2UoKQoJZW5kCmVuZAoKbG9jYWwga2V5cmluZyA9IHsKCWtleXMgPSBhdXRob3JpemVkS2V5czsKfQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmtleXJpbmcucmVhZF9rZXkgPSByZWFkX2tleQoKZnVuY3Rpb24ga2V5cmluZy5nZXRfYWxsKCkKCWxvY2FsIHJlc3VsdCA9IHt9Cglmb3IgXywga2V5IGluIHBhaXJzKGF1dGhvcml6ZWRLZXlzKSBkbwoJCXRhYmxlLmluc2VydChyZXN1bHQsIGtleSkKCWVuZAoJcmV0dXJuIHJlc3VsdAplbmQKCmxvY2FsIGZ1bmN0aW9uIHdyaXRlX2tleShmaWxlLCBrZXlpbmZvKQoJZmlsZTp3cml0ZShrZXlpbmZvLmtleSkKCWxvY2FsIG5hbWUgPSBrZXlpbmZvLm5hbWUKCWlmIG5hbWUgdGhlbgoJCWZpbGU6d3JpdGUoJyAnKQoJCWZpbGU6d3JpdGUobmFtZSkKCWVuZAoJZmlsZTp3cml0ZSgnXG4nKQplbmQKCmxvY2FsIGZ1bmN0aW9uIHNhdmVfa2V5cygpCglsb2NhbCBmaWxlID0gaW8ub3BlbihBVVRIT1JJWkVEX0tFWVNfRklMRSwgJ3cnKQoJaWYgbm90IGZpbGUgdGhlbgoJCWVycm9yKCJmaWxlICciLi5BVVRIT1JJWkVEX0tFWVNfRklMRS4uIicgY2Fubm90IGJlIG9wZW5lZCBmb3Igd3JpdGluZyIpCgllbmQKCWZvciBfLCBrZXlpbmZvIGluIHBhaXJzKGF1dGhvcml6ZWRLZXlzKSBkbwoJCXdyaXRlX2tleShmaWxlLCBrZXlpbmZvKQoJZW5kCglmaWxlOmNsb3NlKCkKZW5kCgpmdW5jdGlvbiBrZXlyaW5nLmV4aXN0cyhrZXkpCglsb2NhbCBkZWNvZGVkID0gYmFzZTY0LmRlY29kZShrZXkpCglyZXR1cm4gYXV0aG9yaXplZEtleXNbZGVjb2RlZF0KZW5kCgpmdW5jdGlvbiBrZXlyaW5nLnRydXN0KGtleSwgbmFtZSkKCWxvY2FsIGRlY29kZWQgPSBiYXNlNjQuZGVjb2RlKGtleSkKCWxvY2FsIG9sZCA9IGF1dGhvcml6ZWRLZXlzW2RlY29kZWRdCglpZiBvbGQgdGhlbgoJCWlmIG9sZC5uYW1lIH49IG5hbWUgdGhlbgoJCQlvbGQubmFtZSA9IG5hbWUKCQllbmQKCQlzYXZlX2tleXMoKQoJCXJldHVybiBmYWxzZQoJZW5kCglhdXRob3JpemVkS2V5c1tkZWNvZGVkXSA9IHsga2V5PWtleSwgbmFtZT1uYW1lIH0KCXNhdmVfa2V5cygpCglyZXR1cm4gdHJ1ZQplbmQKCmZ1bmN0aW9uIGtleXJpbmcuZm9yZ2V0KGtleSkKCWtleSA9IGJhc2U2NC5kZWNvZGUoa2V5KQoJaWYgbm90IGF1dGhvcml6ZWRLZXlzW2tleV0gdGhlbgoJCXJldHVybiBmYWxzZQoJZW5kCglhdXRob3JpemVkS2V5c1trZXldID0gbmlsCglzYXZlX2tleXMoKQoJcmV0dXJuIHRydWUKZW5kCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKcmV0dXJuIGtleXJpbmcK";
  51.     ["ktlo.job"] = base64.decode "bG9jYWwgY29uY3VycmVudCA9IHJlcXVpcmUgJ2t0bG8uY29uY3VycmVudCcKbG9jYWwgdGFzayA9IHJlcXVpcmUgJ2t0bG8udGFzaycKCmxvY2FsIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgZW5kaW5nKQoJcmV0dXJuIHN0cjpzdWIoLSNlbmRpbmcpID09IGVuZGluZwplbmQKCmxvY2FsIGZ1bmN0aW9uIGlzX3Rlcm1pbmF0ZWQoc3RyKQoJcmV0dXJuIGVuZHNXaXRoKHN0ciwgIlRlcm1pbmF0ZWQiKQplbmQKCmxvY2FsIGxpYnJhcnkgPSB7fQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbG9jYWwgam9iX21ldGhvZHMgPSB7fQoKam9iX21ldGhvZHMuc2VsZWN0b3IgPSB7fQoKZnVuY3Rpb24gam9iX21ldGhvZHMuc2VsZWN0b3IuaW1tZWRpYXRlKHNlbGYpCglsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQoJcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5pbW1lZGlhdGUoZnV0dXJlKQplbmQKCmZ1bmN0aW9uIGpvYl9tZXRob2RzLnNlbGVjdG9yLmVudGVyKHNlbGYpCglsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQoJcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5lbnRlcihmdXR1cmUpCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHMuc2VsZWN0b3IuY29uZGl0aW9uKHNlbGYsIGNvbnRleHQsIGV2ZW50KQoJbG9jYWwgZnV0dXJlID0gc2VsZi5mdXR1cmUKCXJldHVybiBmdXR1cmUuc2VsZWN0b3IuY29uZGl0aW9uKGZ1dHVyZSwgY29udGV4dCwgZXZlbnQpCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHMuc2VsZWN0b3IubGVhdmUoc2VsZiwgY29udGV4dCwgc2VsZWN0ZWQpCglsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQoJcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5sZWF2ZShmdXR1cmUsIGNvbnRleHQsIHNlbGVjdGVkKQplbmQKCmxvY2FsIGpvYl9tZXRhID0gewoJX19pbmRleCA9IGpvYl9tZXRob2RzOwoJX19jbGFzc2VzID0geyB3YWl0YWJsZSA9IHRydWUgfTsKCV9fbmFtZSA9ICd0YXNrJzsKfQoKbG9jYWwgZnVuY3Rpb24gam9iX3Jvb3Qoam9iKQoJbG9jYWwgcGFyZW50ID0gam9iLnBhcmVudAoJaWYgcGFyZW50IHRoZW4KCQlyZXR1cm4gam9iX3Jvb3QocGFyZW50KQoJZWxzZQoJCXJldHVybiBqb2IKCWVuZAplbmQKCmxvY2FsIGpvYl9jaGlsZF9kZWF0aAoKbG9jYWwgZnVuY3Rpb24gam9iX3Rlcm1pbmF0ZV9jb25kaXRpb24oam9iKQoJaWYgam9iLnRhc2suc3RhdHVzIH49ICdhbGl2ZScgYW5kIG5vdCBuZXh0KGpvYi5jaGlsZHJlbikgYW5kIG5vdCBqb2IuZnV0dXJlLmNvbXBsZXRlZCB0aGVuCgkJaWYgbm90IGpvYi5yZXN1bHQuY29tcGxldGVkIHRoZW4KCQkJam9iLnJlc3VsdDpjb21wbGV0ZShqb2IudGFzay5mdXR1cmU6Z2V0KCkpCgkJZW5kCgkJam9iLmZ1dHVyZTpjb21wbGV0ZShqb2IucmVzdWx0OmdldCgpKQoJCWxvY2FsIHN1Y2Nlc3MsIGVyciA9IGpvYi5mdXR1cmU6Z2V0KCk6dW5wYWNrKCkKCQlpZiBzdWNjZXNzIHRoZW4KCQkJam9iLnN0YXR1cyA9ICdkb25lJwoJCWVsc2UKCQkJaWYgaXNfdGVybWluYXRlZChlcnIpIHRoZW4KCQkJCWpvYi5zdGF0dXMgPSAnY2FuY2VsZWQnCgkJCWVsc2UKCQkJCWpvYi5zdGF0dXMgPSAnYmFkJwoJCQllbmQKCQllbmQKCQlpZiBqb2IucGFyZW50IHRoZW4KCQkJam9iX2NoaWxkX2RlYXRoKGpvYi5wYXJlbnQsIGpvYikKCQllbmQKCWVuZAplbmQKCmpvYl9jaGlsZF9kZWF0aCA9IGZ1bmN0aW9uKGpvYiwgY2hpbGQpCglpZiBjaGlsZC5zdGF0dXMgPT0gJ2JhZCcgdGhlbgoJCWlmIG5vdCBqb2IucmVzdWx0LmNvbXBsZXRlZCB0aGVuCgkJCWpvYi5yZXN1bHQ6Y29tcGxldGUoY2hpbGQuZnV0dXJlOmdldCgpKQoJCQktLSBpZ25vcmUgcGFyYWxsZWwgZXJyb3JzIGZvciBub3cKCQkJbG9jYWwgcm9vdCA9IGpvYl9yb290KGpvYikKCQkJbG9jYWwgdHJhY2VzID0gcm9vdC50cmFjZXMgb3Ige30KCQkJdGFibGUuaW5zZXJ0KHRyYWNlcywgY2hpbGQudGFzay50cmFjZWJhY2spCgkJCXJvb3QudHJhY2VzID0gdHJhY2VzCgkJZW5kCgkJam9iOmNhbmNlbCgpCgllbmQKCWpvYi5jaGlsZHJlbltjaGlsZF0gPSBuaWwKCWpvYl90ZXJtaW5hdGVfY29uZGl0aW9uKGpvYikKZW5kCgpsb2NhbCBmdW5jdGlvbiBqb2JfY3JlYXRlKHBvb2wsIGFjdGlvbikKCWFzc2VydChhY3Rpb24pCglsb2NhbCBqb2IKCWpvYiA9IHsKCQlzdGF0dXMgPSAnd29ya2luZyc7CgkJcmVzdWx0ID0gY29uY3VycmVudC5mdXR1cmUoKTsKCQlmdXR1cmUgPSBjb25jdXJyZW50LmZ1dHVyZSgpOwoJCWNoaWxkcmVuID0ge307CgkJdGFzayA9IHBvb2w6c3Bhd24oZnVuY3Rpb24oKQoJCQl0YXNrLmNvbnRleHQoKS5KT0IgPSBqb2IKCQkJcmV0dXJuIGFjdGlvbigpCgkJZW5kKTsKCX0KCXNldG1ldGF0YWJsZShqb2IsIGpvYl9tZXRhKQoJcG9vbDpzcGF3bl9pbW1vcnRhbChmdW5jdGlvbigpCgkJam9iLnRhc2s6d2FpdCgpCgkJaWYgam9iLnRhc2suc3RhdHVzID09ICdmYWlsZWQnIHRoZW4KCQkJam9iOmNhbmNlbCgpCgkJZW5kCgkJam9iX3Rlcm1pbmF0ZV9jb25kaXRpb24oam9iKQoJZW5kKTpzdGFydCgpCglyZXR1cm4gam9iCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHM6Zm9yayhhY3Rpb24pCglsb2NhbCBqb2IgPSBqb2JfY3JlYXRlKHNlbGYudGFzay5wb29sLCBhY3Rpb24pCglqb2IucGFyZW50ID0gc2VsZgoJc2VsZi5jaGlsZHJlbltqb2JdID0gdHJ1ZQoJcmV0dXJuIGpvYgplbmQKCmZ1bmN0aW9uIGpvYl9tZXRob2RzOmFzeW5jKGFjdGlvbikKCWxvY2FsIGpvYiA9IHNlbGY6Zm9yayhhY3Rpb24pCglqb2IudGFzazpzdGFydCgpCglyZXR1cm4gam9iCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHM6Y2FuY2VsX2NoaWxkcmVuKCkKCWZvciBjaGlsZCBpbiBwYWlycyhzZWxmLmNoaWxkcmVuKSBkbwoJCWNoaWxkOmNhbmNlbCgpCgllbmQKZW5kCgpmdW5jdGlvbiBqb2JfbWV0aG9kczpjYW5jZWwoKQoJc2VsZjpjYW5jZWxfY2hpbGRyZW4oKQoJc2VsZi50YXNrOnN0b3AoKQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gam9iX21ldGhvZHM6YXdhaXQoKQoJcmV0dXJuIHNlbGYuZnV0dXJlOmdldCgpOnVud3JhcCgpCmVuZAoKLS0tIEBhc3luYwpmdW5jdGlvbiBqb2JfbWV0aG9kczphd2FpdF90aW1lb3V0KHRpbWVvdXQpCglsb2NhbCByZXN1bHQgPSBjb25jdXJyZW50LnNlbGVjdChzZWxmLCBjb25jdXJyZW50LnRpbWVvdXQodGltZW91dCkpCglpZiByZXN1bHQgPT0gc2VsZiB0aGVuCgkJcmV0dXJuIHRydWUsIHNlbGY6YXdhaXQoKQoJZWxzZQoJCXNlbGY6Y2FuY2VsKCkKCQlyZXR1cm4gZmFsc2UKCWVuZAplbmQKCmZ1bmN0aW9uIGpvYl9tZXRob2RzOmZpbm5hbGl6ZShhY3Rpb24pCglsb2NhbCB0YXNrID0gc2VsZi50YXNrLnBvb2w6c3Bhd25faW1tb3J0YWwoZnVuY3Rpb24oKQoJCWNvbmN1cnJlbnQud2FpdChzZWxmKQoJCXJldHVybiBhY3Rpb24oKQoJZW5kKQoJdGFzazpzdGFydCgpCglyZXR1cm4gdGFzawplbmQKCmZ1bmN0aW9uIGxpYnJhcnkucnVuKGFjdGlvbikKCWxvY2FsIHBvb2wgPSB0YXNrLnBvb2woKQoJbG9jYWwgcm9vdCA9IGpvYl9jcmVhdGUocG9vbCwgYWN0aW9uKQoJcm9vdC50YXNrOnN0YXJ0KCkKCXBvb2w6cnVuKCkKCXJvb3QuZnV0dXJlOmdldCgpCglsb2NhbCB0cmFjZXMgPSByb290LnRyYWNlcyBvciB7fQoJbG9jYWwgdHJhY2ViYWNrID0gcm9vdC50YXNrLnRyYWNlYmFjawoJaWYgdHJhY2ViYWNrIHRoZW4KCQl0YWJsZS5pbnNlcnQodHJhY2VzLCB0cmFjZWJhY2spCgllbmQKCWlmIG5leHQodHJhY2VzKSB0aGVuCgkJbG9jYWwgZmlsZW5hbWUgPSBvcy5kYXRlKCJjcmFzaF8lWS0lbS0lZFQlSDolTTolU1oudHh0IikKCQlsb2NhbCBmaWxlID0gaW8ub3BlbihmaWxlbmFtZSwgJ3cnKQoJCWlmIGZpbGUgdGhlbgoJCQlmaWxlOndyaXRlKCJFUlJPUjogIikKCQkJZmlsZTp3cml0ZShzZWxlY3QoMiwgcm9vdC5mdXR1cmU6Z2V0KCk6dW5wYWNrKCkpKQoJCQlmaWxlOndyaXRlKCdcbicpCgkJCWZvciBpPSN0cmFjZXMsIDEsIC0xIGRvCgkJCQlsb2NhbCB0cmFjZSA9IHRyYWNlc1tpXQoJCQkJZmlsZTp3cml0ZSh0cmFjZSkKCQkJCWZpbGU6d3JpdGUoJ1xuJykKCQkJZW5kCgkJCWZpbGU6Y2xvc2UoKQoJCWVuZAoJZW5kCglyZXR1cm4gcm9vdDphd2FpdCgpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5ydW5uaW5nKCkKCXJldHVybiB0YXNrLmNvbnRleHQoKS5KT0IKZW5kCgpsb2NhbCBmdW5jdGlvbiBqb2JfcmVxdWlyZV9ydW5uaW5nKCkKCXJldHVybiBsaWJyYXJ5LnJ1bm5pbmcoKSBvciBlcnJvcigibm8gam9iIGluIGN1cnJlbnQgY29udGV4dCIsIDMpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5hc3luYyhhY3Rpb24pCglyZXR1cm4gam9iX3JlcXVpcmVfcnVubmluZygpOmFzeW5jKGFjdGlvbikKZW5kCgpmdW5jdGlvbiBsaWJyYXJ5LmNhbmNlbCgpCglyZXR1cm4gam9iX3JlcXVpcmVfcnVubmluZygpOmNhbmNlbCgpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5hbnkoLi4uKQoJbG9jYWwgcmVzdWx0ID0geyBjb25jdXJyZW50LnNlbGVjdCguLi4pIH0KCWZvciBfLCBqb2IgaW4gaXBhaXJzIHsgLi4uIH0gZG8KCQlqb2I6Y2FuY2VsKCkKCWVuZAoJcmV0dXJuIHRhYmxlLnVucGFjayhyZXN1bHQpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5jcml0aWNhbChhY3Rpb24pCglsb2NhbCBqb2IgPSBqb2JfcmVxdWlyZV9ydW5uaW5nKCkKCWxvY2FsIHQgPSBqb2IudGFzay5wb29sOnNwYXduX2ltbW9ydGFsKGZ1bmN0aW9uKCkKCQl0YXNrLmNvbnRleHQoKS5KT0IgPSBqb2IKCQlyZXR1cm4gYWN0aW9uKCkKCWVuZCkKCXQ6c3RhcnQoKQoJcmV0dXJuIHQ6am9pbigpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5yZXRyeSh0aW1lcywgYWN0aW9uLCAuLi4pCglsb2NhbCBlcnIKCWZvciBfPTEsIHRpbWVzIGRvCgkJbG9jYWwgciA9IHRhYmxlLnBhY2socGNhbGwoYWN0aW9uLCAuLi4pKQoJCWlmIHJbMV0gdGhlbgoJCQlyZXR1cm4gdGFibGUudW5wYWNrKHIsIDIpCgkJZWxzZQoJCQllcnIgPSByWzJdCgkJCWlmIGlzX3Rlcm1pbmF0ZWQoZXJyKSB0aGVuCgkJCQlicmVhawoJCQllbmQKCQllbmQKCWVuZAoJZXJyb3IoZXJyLCAwKQplbmQKCmxpYnJhcnkubGl2ZWRhdGEgPSB7fQoKZnVuY3Rpb24gbGlicmFyeS5saXZlZGF0YS5zdWJzY3JpYmUocHJvcGVydHksIGFjdGlvbikKCXJldHVybiBsaWJyYXJ5LmFzeW5jKGZ1bmN0aW9uKCkKCQlwcm9wZXJ0eTpjb2xsZWN0KGZ1bmN0aW9uKHZhbHVlKQoJCQlsaWJyYXJ5LmFzeW5jKGZ1bmN0aW9uKCkKCQkJCWFjdGlvbih2YWx1ZSkKCQkJZW5kKQoJCWVuZCkKCWVuZCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBleHRyYWN0X3ZhbHVlcyhwcm9wZXJ0aWVzKQoJbG9jYWwgdmFsdWVzID0ge30KCWZvciBpLCBwcm9wZXJ0eSBpbiBpcGFpcnMocHJvcGVydGllcykgZG8KCQl2YWx1ZXNbaV0gPSBwcm9wZXJ0eS52YWx1ZQoJZW5kCglyZXR1cm4gdGFibGUudW5wYWNrKHZhbHVlcykKZW5kCgpmdW5jdGlvbiBsaWJyYXJ5LmxpdmVkYXRhLmNvbWJpbmUoYWN0aW9uLCAuLi4pCglsb2NhbCBqb2IgPSBqb2JfcmVxdWlyZV9ydW5uaW5nKCkKCWxvY2FsIHByb3BlcnRpZXMgPSB0YWJsZS5wYWNrKC4uLikKCWxvY2FsIGluaXQgPSBhY3Rpb24oZXh0cmFjdF92YWx1ZXMocHJvcGVydGllcykpCglsb2NhbCByZXN1bHQgPSBjb25jdXJyZW50LnByb3BlcnR5KGluaXQpCglqb2I6YXN5bmMoZnVuY3Rpb24oKQoJCXdoaWxlIHRydWUgZG8KCQkJY29uY3VycmVudC5zZWxlY3QodGFibGUudW5wYWNrKHByb3BlcnRpZXMpKQoJCQlyZXN1bHQ6c2V0KGFjdGlvbihleHRyYWN0X3ZhbHVlcyhwcm9wZXJ0aWVzKSkpCgkJZW5kCgllbmQpCglyZXR1cm4gcmVzdWx0CmVuZAoKZnVuY3Rpb24gbGlicmFyeS5saXZlZGF0YS5kZXRlcm1pbmVzKHByb3BlcnR5LCBhY3Rpb24pCglsb2NhbCBqb2IKCXJldHVybiBsaWJyYXJ5LmxpdmVkYXRhLnN1YnNjcmliZShwcm9wZXJ0eSwgZnVuY3Rpb24odmFsdWUpCgkJaWYgam9iIHRoZW4KCQkJam9iOmNhbmNlbCgpCgkJZW5kCgkJaWYgdmFsdWUgdGhlbgoJCQlqb2IgPSBsaWJyYXJ5LmFzeW5jKGFjdGlvbikKCQllbmQKCWVuZCkKZW5kCgpyZXR1cm4gbGlicmFyeQo=";
  52.     ["psg.vault"] = base64.decode "bG9jYWwgUFVCTElDX0tFWV9GSUxFID0gInB1YmxpY19rZXkudHh0Igpsb2NhbCBQUklWQVRFX0tFWV9GSUxFID0gInByaXZhdGVfa2V5LnR4dCIKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmxvY2FsIHJhbmRvbSA9IHJlcXVpcmUgJ2NjcnlwdG9saWIucmFuZG9tJwpsb2NhbCBlZDI1NTE5ID0gcmVxdWlyZSAnY2NyeXB0b2xpYi5lZDI1NTE5Jwpsb2NhbCBibGFrZTMgPSByZXF1aXJlICdjY3J5cHRvbGliLmJsYWtlMycKbG9jYWwgYmFzZTY0ID0gcmVxdWlyZSAna3Rsby5iYXNlNjQnCmxvY2FsIGtleXJpbmcgPSByZXF1aXJlICdwc2cua2V5cmluZycKCnJhbmRvbS5pbml0V2l0aFRpbWluZygpCgpsb2NhbCBpc0VuY3J5cHJ0ZWQKCmxvY2FsIGZ1bmN0aW9uIHNhdmVfcHJpdmF0ZV9rZXkoa2V5SW5mbykKCWxvY2FsIGZpbGUgPSBpby5vcGVuKFBSSVZBVEVfS0VZX0ZJTEUsICd3JykKCWlmIG5vdCBmaWxlIHRoZW4KCQllcnJvcigiZmFpbGVkIHRvIG9wZW4gcHJpdmF0ZSBrZXkgZmlsZTogIi4uUFJJVkFURV9LRVlfRklMRSkKCWVuZAoJZmlsZTp3cml0ZSh0ZXh0dXRpbHMuc2VyaWFsaXNlKGtleUluZm8pKQoJZmlsZTpjbG9zZSgpCmVuZAoKbG9jYWwgZnVuY3Rpb24gb3Blbl9wcml2YXRlX2tleSgpCglsb2NhbCBmaWxlID0gYXNzZXJ0KGlvLm9wZW4oUFJJVkFURV9LRVlfRklMRSwgJ3InKSkKCWxvY2FsIGNvbnRlbnRTdHJpbmcgPSBmaWxlOnJlYWQoJ2EnKQoJZmlsZTpjbG9zZSgpCglyZXR1cm4gdGV4dHV0aWxzLnVuc2VyaWFsaXNlKGNvbnRlbnRTdHJpbmcpCmVuZAoKbG9jYWwgZnVuY3Rpb24gb3Blbl9wdWJsaWNfa2V5KCkKCWxvY2FsIGZpbGUgPSBpby5vcGVuKFBVQkxJQ19LRVlfRklMRSwgJ3InKQoJaWYgbm90IGZpbGUgdGhlbgoJCWVycm9yKCJmYWlsZWQgdG8gb3BlbiBwdWJsaWMga2V5IGZpbGU6ICIuLlBVQkxJQ19LRVlfRklMRSkKCWVuZAoJcmV0dXJuIGtleXJpbmcucmVhZF9rZXkoZmlsZTpyZWFkKCdsJykpCmVuZAoKbG9jYWwgZnVuY3Rpb24gc2F2ZV9wdWJsaWNfa2V5KGtleSwgbmFtZSkKCWxvY2FsIGZpbGUgPSBpby5vcGVuKFBVQkxJQ19LRVlfRklMRSwgJ3cnKQoJaWYgbm90IGZpbGUgdGhlbgoJCWVycm9yKCJmYWlsZWQgdG8gb3BlbiBwdWJsaWMga2V5IGZpbGU6ICIuLlBVQkxJQ19LRVlfRklMRSkKCWVuZAoJZmlsZTp3cml0ZShiYXNlNjQuZW5jb2RlKGtleSkpCglpZiBuYW1lIHRoZW4KCQlmaWxlOndyaXRlKCIgIikKCQlmaWxlOndyaXRlKG5hbWUpCgllbmQKCWZpbGU6d3JpdGUoIlxuIikKCWZpbGU6Y2xvc2UoKQplbmQKCmxvY2FsIHB1YmxpY0tleSwgbmFtZQppZiBub3QgZnMuZXhpc3RzKFBSSVZBVEVfS0VZX0ZJTEUpIHRoZW4KCWxvY2FsIHByaXZhdGVLZXkgPSByYW5kb20ucmFuZG9tKDMyKQoJbG9jYWwga2V5SW5mbyA9IHsKCQllbmNyeXB0ZWQgPSBmYWxzZTsKCQlrZXkgPSBiYXNlNjQuZW5jb2RlKHByaXZhdGVLZXkpOwoJfQoJcHVibGljS2V5ID0gZWQyNTUxOS5wdWJsaWNLZXkocHJpdmF0ZUtleSkKCXNhdmVfcHJpdmF0ZV9rZXkoa2V5SW5mbykKCXNhdmVfcHVibGljX2tleShwdWJsaWNLZXkpCglpc0VuY3J5cHJ0ZWQgPSBmYWxzZQplbHNlCglsb2NhbCBrZXkKCWtleSwgbmFtZSA9IG9wZW5fcHVibGljX2tleSgpCglwdWJsaWNLZXkgPSBiYXNlNjQuZGVjb2RlKGtleSkKCWlzRW5jcnlwcnRlZCA9IG9wZW5fcHJpdmF0ZV9rZXkoKS5lbmNyeXB0ZWQKZW5kCgpsb2NhbCB2YXVsdCA9IHt9CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiB2YXVsdC5nZW5fbm9uY2UoKQoJcmV0dXJuIGJhc2U2NC5lbmNvZGUocmFuZG9tLnJhbmRvbSgxNikpCmVuZAoKbG9jYWwgc2VyaWFsaXplT3B0cyA9IHsgY29tcGFjdCA9IHRydWUgfQoKZnVuY3Rpb24gdmF1bHQucHVibGljX2tleSgpCglyZXR1cm4gYmFzZTY0LmVuY29kZShwdWJsaWNLZXkpLCBuYW1lCmVuZAoKZnVuY3Rpb24gdmF1bHQudmVyaWZ5KG5vbmNlLCByZXNwb25zZSkKCWxvY2FsIG1lc3NhZ2VTdHJpbmcgPSByZXNwb25zZS5tZXNzYWdlCglsb2NhbCBtZXNzYWdlID0gdGV4dHV0aWxzLnVuc2VyaWFsaXNlKG1lc3NhZ2VTdHJpbmcpCglsb2NhbCBrZXkgPSBiYXNlNjQuZGVjb2RlKG1lc3NhZ2Uua2V5KQoJaWYgbWVzc2FnZS5ub25jZSB+PSBub25jZSB0aGVuCgkJcmV0dXJuIGZhbHNlLCAiaW52YWxpZCBub25jZSIKCWVuZAoJaWYgbm90IGtleXJpbmcua2V5c1trZXldIHRoZW4KCQlyZXR1cm4gZmFsc2UsICJ1bmtub3duIGhvc3Qga2V5IgoJZW5kCglpZiBub3QgZWQyNTUxOS52ZXJpZnkoa2V5LCBtZXNzYWdlU3RyaW5nLCBiYXNlNjQuZGVjb2RlKHJlc3BvbnNlLnNpZ25hdHVyZSkpIHRoZW4KCQlyZXR1cm4gZmFsc2UsICJpbnZhbGlkIHNpZ25hdHVyZSIKCWVuZAoJcmV0dXJuIHRydWUKZW5kCgpmdW5jdGlvbiB2YXVsdC5pc19lbmNyeXB0ZWQoKQoJcmV0dXJuIGlzRW5jcnlwcnRlZAplbmQKCmxvY2FsIGZ1bmN0aW9uIHNpbXBsZXN0X2NyeXB0KGEsIGIpCglhc3NlcnQoI2EgPT0gI2IsICIjYSB+PSAjYiIpCglsb2NhbCBuID0gI2EKCWxvY2FsIHJlc3VsdCA9IHt9Cglmb3IgaT0xLCBuIGRvCgkJcmVzdWx0W2ldID0gYml0LmJ4b3IoYTpieXRlKGkpLCBiOmJ5dGUoaSkpCgllbmQKCXJldHVybiBzdHJpbmcuY2hhcih0YWJsZS51bnBhY2socmVzdWx0KSkKZW5kCgpmdW5jdGlvbiB2YXVsdC5lbmNyeXB0X2tleShwYXNzd29yZCkKCWFzc2VydChub3QgaXNFbmNyeXBydGVkLCAiYWxyZWFkeSBlbmNyeXB0ZWQiKQoJbG9jYWwgY29udGVudCA9IG9wZW5fcHJpdmF0ZV9rZXkoKQoJbG9jYWwga2V5ID0gYmFzZTY0LmRlY29kZShjb250ZW50LmtleSkKCWxvY2FsIHNhbHQgPSByYW5kb20ucmFuZG9tKDE2KQoJbG9jYWwgaGFzaCA9IGJsYWtlMy5kaWdlc3Qoc2FsdC4ucGFzc3dvcmQpCglsb2NhbCBlbmNyeXB0ZWQgPSBzaW1wbGVzdF9jcnlwdChrZXksIGhhc2gpCglsb2NhbCBrZXlJbmZvID0gewoJCWVuY3J5cHRlZCA9IHRydWU7CgkJc2FsdCA9IGJhc2U2NC5lbmNvZGUoc2FsdCk7CgkJa2V5ID0gYmFzZTY0LmVuY29kZShlbmNyeXB0ZWQpOwoJfQoJc2F2ZV9wcml2YXRlX2tleShrZXlJbmZvKQoJaXNFbmNyeXBydGVkID0gdHJ1ZQplbmQKCmZ1bmN0aW9uIHZhdWx0LnByaXZhdGVfa2V5KHBhc3N3b3JkKQoJbG9jYWwgY29udGVudCA9IG9wZW5fcHJpdmF0ZV9rZXkoKQoJbG9jYWwgZW5jb2RlZEtleSA9IGJhc2U2NC5kZWNvZGUoY29udGVudC5rZXkpCglpZiBjb250ZW50LmVuY3J5cHRlZCB0aGVuCgkJaWYgbm90IHBhc3N3b3JkIHRoZW4KCQkJcmV0dXJuIG5pbCwgInBhc3N3b3JkIHJlcXVpcmVkIgoJCWVuZAoJCWxvY2FsIHNhbHQgPSBiYXNlNjQuZGVjb2RlKGNvbnRlbnQuc2FsdCkKCQlsb2NhbCBoYXNoID0gYmxha2UzLmRpZ2VzdChzYWx0Li5wYXNzd29yZCkKCQlsb2NhbCBkZWNyeXB0ZWQgPSBzaW1wbGVzdF9jcnlwdChlbmNvZGVkS2V5LCBoYXNoKQoJCWxvY2FsIGFjdHVhbFB1YmxpY0tleSA9IGVkMjU1MTkucHVibGljS2V5KGRlY3J5cHRlZCkKCQlpZiBwdWJsaWNLZXkgfj0gYWN0dWFsUHVibGljS2V5IHRoZW4KCQkJcmV0dXJuIG5pbCwgIndyb25nIHBhc3N3b3JkIgoJCWVuZAoJCXJldHVybiBkZWNyeXB0ZWQKCWVsc2UKCQlyZXR1cm4gZW5jb2RlZEtleQoJZW5kCmVuZAoKZnVuY3Rpb24gdmF1bHQuZGVjcnlwdF9rZXkocGFzc3dvcmQpCglhc3NlcnQoaXNFbmNyeXBydGVkLCAibm90IGVuY3J5cHRlZCIpCglsb2NhbCBrZXksIHJlYXNvbiA9IHZhdWx0LnByaXZhdGVfa2V5KHBhc3N3b3JkKQoJaWYgbm90IGtleSB0aGVuCgkJcmV0dXJuIGtleSwgcmVhc29uCgllbmQKCWxvY2FsIGtleUluZm8gPSB7CgkJZW5jcnlwdGVkID0gZmFsc2U7CgkJa2V5ID0gYmFzZTY0LmVuY29kZShrZXkpOwoJfQoJc2F2ZV9wcml2YXRlX2tleShrZXlJbmZvKQoJaXNFbmNyeXBydGVkID0gZmFsc2UKCXJldHVybiB0cnVlCmVuZAoKZnVuY3Rpb24gdmF1bHQubWFrZV9hdXRoX3JlcXVlc3QocHJpdmF0ZUtleSwgc2Vzc2lvbikKCWxvY2FsIG1lc3NhZ2UgPSB7CgkJc2Vzc2lvbiA9IHNlc3Npb247CgkJa2V5ID0gYmFzZTY0LmVuY29kZShwdWJsaWNLZXkpOwoJfQoJbG9jYWwgbWVzc2FnZVN0cmluZyA9IHRleHR1dGlscy5zZXJpYWxpc2UobWVzc2FnZSwgc2VyaWFsaXplT3B0cykKCWxvY2FsIHNpZ25hdHVyZSA9IGVkMjU1MTkuc2lnbihwcml2YXRlS2V5LCBwdWJsaWNLZXksIG1lc3NhZ2VTdHJpbmcpCglyZXR1cm4gewoJCW1lc3NhZ2UgPSBtZXNzYWdlU3RyaW5nOwoJCXNpZ25hdHVyZSA9IGJhc2U2NC5lbmNvZGUoc2lnbmF0dXJlKTsKCX0KZW5kCgpmdW5jdGlvbiB2YXVsdC5nZXRfbmFtZSgpCglyZXR1cm4gbmFtZQplbmQKCmZ1bmN0aW9uIHZhdWx0LnNldF9uYW1lKG5ld19uYW1lKQoJbmFtZSA9IG5ld19uYW1lCglzYXZlX3B1YmxpY19rZXkocHVibGljS2V5LCBuYW1lKQplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnJldHVybiB2YXVsdAo=";
  53.     ["ktlo.task"] = base64.decode "bG9jYWwgY29uY3VycmVudCA9IHJlcXVpcmUgJ2t0bG8uY29uY3VycmVudCcKbG9jYWwgY29udGFpbmVyID0gcmVxdWlyZSAna3Rsby5jb250YWluZXInCgpsb2NhbCBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIGVuZGluZykKCXJldHVybiBzdHI6c3ViKC0jZW5kaW5nKSA9PSBlbmRpbmcKZW5kCgpsb2NhbCBxdWV1ZUV2ZW50UmF3ID0gb3MucXVldWVFdmVudFJhdyBvciBvcy5xdWV1ZUV2ZW50Cm9zLnF1ZXVlRXZlbnRSYXcgPSBxdWV1ZUV2ZW50UmF3Cgpsb2NhbCBsaWJyYXJ5ID0ge30KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbCB0YXNrX21ldGhvZHMgPSB7fQoKdGFza19tZXRob2RzLnNlbGVjdG9yID0ge30KCmZ1bmN0aW9uIHRhc2tfbWV0aG9kcy5zZWxlY3Rvci5pbW1lZGlhdGUoc2VsZikKCWxvY2FsIGZ1dHVyZSA9IHNlbGYuZnV0dXJlCglyZXR1cm4gZnV0dXJlLnNlbGVjdG9yLmltbWVkaWF0ZShmdXR1cmUpCmVuZAoKZnVuY3Rpb24gdGFza19tZXRob2RzLnNlbGVjdG9yLmVudGVyKHNlbGYpCglsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQoJcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5lbnRlcihmdXR1cmUpCmVuZAoKZnVuY3Rpb24gdGFza19tZXRob2RzLnNlbGVjdG9yLmNvbmRpdGlvbihzZWxmLCBjb250ZXh0LCBldmVudCkKCWxvY2FsIGZ1dHVyZSA9IHNlbGYuZnV0dXJlCglyZXR1cm4gZnV0dXJlLnNlbGVjdG9yLmNvbmRpdGlvbihmdXR1cmUsIGNvbnRleHQsIGV2ZW50KQplbmQKCmZ1bmN0aW9uIHRhc2tfbWV0aG9kcy5zZWxlY3Rvci5sZWF2ZShzZWxmLCBjb250ZXh0LCBzZWxlY3RlZCkKCWxvY2FsIGZ1dHVyZSA9IHNlbGYuZnV0dXJlCglyZXR1cm4gZnV0dXJlLnNlbGVjdG9yLmxlYXZlKGZ1dHVyZSwgY29udGV4dCwgc2VsZWN0ZWQpCmVuZAoKdGFza19tZXRob2RzLndhaXQgPSBjb25jdXJyZW50LndhaXQKCmZ1bmN0aW9uIHRhc2tfbWV0aG9kczpqb2luKCkKCXJldHVybiBzZWxmLmZ1dHVyZTpnZXQoKTp1bndyYXAoKQplbmQKCmxvY2FsIGZ1bmN0aW9uIHRhc2tfY29udGludWUoc2VsZiwgZXZlbnQpCglpZiBzZWxmLnN0YXR1cyB+PSAnYWxpdmUnIHRoZW4KCQlyZXR1cm4KCWVuZAoJaWYgZXZlbnRbMV0gPT0gJ3Rlcm1pbmF0ZScgYW5kIHNlbGYuaW1tb3J0YWwgdGhlbgoJCXJldHVybgoJZW5kCglsb2NhbCB0aHJlYWQgPSBzZWxmLnRocmVhZAoJbG9jYWwgcHJldl90YXNrID0gX1RBU0sKCV9HLl9UQVNLID0gc2VsZgoJbG9jYWwgcmVzdWx0ID0gY29udGFpbmVyLnJlc3VsdC5yZXN1bWluZyh0aHJlYWQsIHRhYmxlLnVucGFjayhldmVudCkpCglfRy5fVEFTSyA9IHByZXZfdGFzawoJbG9jYWwgb2ssIGVyciA9IHJlc3VsdDp1bnBhY2soKQoJaWYgbm90IG9rIHRoZW4KCQlzZWxmLmZ1dHVyZTpjb21wbGV0ZShyZXN1bHQpCgkJaWYgZW5kc1dpdGgoZXJyLCAiVGVybWluYXRlZCIpIHRoZW4KCQkJc2VsZi5zdGF0dXMgPSAnc3RvcGVkJwoJCWVsc2UKCQkJc2VsZi5zdGF0dXMgPSAnZmFpbGVkJwoJCQlzZWxmLnRyYWNlYmFjayA9IGRlYnVnLnRyYWNlYmFjayh0aHJlYWQsIGVycikKCQllbmQKCWVsc2VpZiBjb3JvdXRpbmUuc3RhdHVzKHRocmVhZCkgPT0gJ2RlYWQnIHRoZW4KCQlzZWxmLmZ1dHVyZTpjb21wbGV0ZShyZXN1bHQpCgkJc2VsZi5zdGF0dXMgPSAnZGVhZCcKCWVsc2UKCQlsb2NhbCBuZXh0X2V2ZW50ID0gZXJyCgkJc2VsZi5ldmVudCA9IG5leHRfZXZlbnQKCQlpZiBuZXh0X2V2ZW50ID09ICd3YWtlJyB0aGVuCgkJCXRhYmxlLmluc2VydChzZWxmLnBvb2wub3JkZXJzLCB7dGFzaz1zZWxmLCBvcmRlcj0nd2FrZSd9KQoJCWVuZAoJZW5kCmVuZAoKZnVuY3Rpb24gdGFza19tZXRob2RzOnJlc3VtZShldmVudCkKCXNlbGY6c3RhcnQoKQoJbG9jYWwgZXZlbnROYW1lID0gZXZlbnRbMV0KCWlmIGV2ZW50TmFtZSA9PSAndGFza19zdG9wJyB0aGVuCgkJaWYgZXZlbnRbMl0gPT0gc2VsZi5pZCB0aGVuCgkJCXRhc2tfY29udGludWUoc2VsZiwgeyAndGVybWluYXRlJyB9KQoJCWVuZAoJCXJldHVybgoJZW5kCglpZiBldmVudE5hbWUgPT0gJ3Rlcm1pbmF0ZScgb3IgKG5vdCBzZWxmLmV2ZW50KSBvciBzZWxmLmV2ZW50ID09IGV2ZW50TmFtZSB0aGVuCgkJdGFza19jb250aW51ZShzZWxmLCBldmVudCkKCWVuZAplbmQKCmZ1bmN0aW9uIHRhc2tfbWV0aG9kczpzdG9wKCkKCWlmIHNlbGYuc3RhdHVzID09ICdhbGl2ZScgdGhlbgoJCXRhYmxlLmluc2VydChzZWxmLnBvb2wub3JkZXJzLCB7IHRhc2s9c2VsZiwgb3JkZXI9J3N0b3AnIH0pCgllbmQKZW5kCgpmdW5jdGlvbiB0YXNrX21ldGhvZHM6c3RhcnQoKQoJaWYgbm90IHNlbGYuc3RhcnRlZCB0aGVuCgkJc2VsZi5zdGFydGVkID0gdHJ1ZQoJCXRhc2tfY29udGludWUoc2VsZiwge30pCgllbmQKZW5kCgpsb2NhbCB0YXNrX21ldGEgPSB7CglfX2luZGV4ID0gdGFza19tZXRob2RzOwoJX19jbGFzc2VzID0geyB3YWl0YWJsZSA9IHRydWUgfTsKCV9fbmFtZSA9ICd0YXNrJzsKfQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmxvY2FsIHBvb2xfbWV0aG9kcyA9IHt9Cgpsb2NhbCB0YXNrSWRDb3VudGVyID0gMQoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnNwYXduKGFjdGlvbiwgaW1tb3J0YWwpCglsb2NhbCB0YXNrID0gewoJCWlkID0gdGFza0lkQ291bnRlcjsKCQlpbW1vcnRhbCA9IGltbW9ydGFsIG9yIGZhbHNlOwoJCXBvb2wgPSBzZWxmOwoJCWZ1dHVyZSA9IGNvbmN1cnJlbnQuZnV0dXJlKCk7CgkJdGhyZWFkID0gY29yb3V0aW5lLmNyZWF0ZShhY3Rpb24pOwoJCWV2ZW50ID0gbmlsOwoJCXN0YXR1cyA9ICdhbGl2ZSc7CgkJY29udGV4dCA9IHt9OwoJCXN0YXJ0ZWQgPSBmYWxzZTsKCX0KCXRhc2tJZENvdW50ZXIgPSB0YXNrSWRDb3VudGVyICsgMQoJc2V0bWV0YXRhYmxlKHRhc2ssIHRhc2tfbWV0YSkKCXRhYmxlLmluc2VydChzZWxmLnRhc2tzLCB0YXNrKQoJcmV0dXJuIHRhc2sKZW5kCgpmdW5jdGlvbiBwb29sX21ldGhvZHM6c3Bhd25faW1tb3J0YWwoYWN0aW9uKQoJcmV0dXJuIHNlbGY6c3Bhd24oYWN0aW9uLCB0cnVlKQplbmQKCmZ1bmN0aW9uIHBvb2xfbWV0aG9kczpyZXN1bWUoZXZlbnQpCglsb2NhbCBmaWx0ZXJlZCA9IHt9Cglsb2NhbCBwcm9jZXNzID0gc2VsZi50YXNrcwoJc2VsZi50YXNrcyA9IGZpbHRlcmVkCglmb3IgXywgdGFzayBpbiBpcGFpcnMocHJvY2VzcykgZG8KCQl0YXNrOnJlc3VtZShldmVudCkKCQlpZiB0YXNrLnN0YXR1cyA9PSAnYWxpdmUnIHRoZW4KCQkJdGFibGUuaW5zZXJ0KGZpbHRlcmVkLCB0YXNrKQoJCWVuZAoJZW5kCmVuZAoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnByb2Nlc3Nfb3JkZXJzX3F1ZXVlKCkKCXdoaWxlIG5leHQoc2VsZi5vcmRlcnMpIGRvCgkJbG9jYWwgcXVldWUgPSBzZWxmLm9yZGVycwoJCXNlbGYub3JkZXJzID0ge30KCQlmb3IgXywgcmVjb3JkIGluIGlwYWlycyhxdWV1ZSkgZG8KCQkJbG9jYWwgdGFzayA9IHJlY29yZC50YXNrCgkJCWxvY2FsIG9yZGVyID0gcmVjb3JkLm9yZGVyCgkJCWlmIG9yZGVyID09ICdzdG9wJyB0aGVuCgkJCQl0YXNrX2NvbnRpbnVlKHRhc2ssIHsgJ3Rlcm1pbmF0ZScgfSkKCQkJZWxzZWlmIG9yZGVyID09ICd3YWtlJyB0aGVuCgkJCQl0YXNrX2NvbnRpbnVlKHRhc2ssIHsgJ3dha2UnIH0pCgkJCWVuZAoJCWVuZAoJZW5kCmVuZAoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnByb2Nlc3NfaW50ZXJuYWxfZXZlbnRzKCkKCWxvY2FsIGV2ZW50cyA9IHNlbGYuZXZlbnRzCglpZiBuZXh0KGV2ZW50cykgdGhlbgoJCXNlbGYuZXZlbnRzID0ge30KCQlmb3IgXywgZXZlbnQgaW4gaXBhaXJzKGV2ZW50cykgZG8KCQkJc2VsZjpyZXN1bWUoZXZlbnQpCgkJZW5kCgllbmQKZW5kCgpmdW5jdGlvbiBwb29sX21ldGhvZHM6c3RlcCgpCglzZWxmOnByb2Nlc3Nfb3JkZXJzX3F1ZXVlKCkKCXNlbGY6cHJvY2Vzc19pbnRlcm5hbF9ldmVudHMoKQoJaWYgbmV4dChzZWxmLnRhc2tzKSB0aGVuCgkJaWYgbmV4dChzZWxmLmV2ZW50cykgdGhlbgoJCQlxdWV1ZUV2ZW50UmF3KCdldmVudF9iYXRjaCcpCgkJZW5kCgkJbG9jYWwgZXZlbnQgPSB7IG9zLnB1bGxFdmVudFJhdygpIH0KCQlpZiBldmVudFsxXSB+PSAnZXZlbnRfYmF0Y2gnIHRoZW4KCQkJc2VsZjpyZXN1bWUoZXZlbnQpCgkJZW5kCgllbmQKZW5kCgpmdW5jdGlvbiBwb29sX21ldGhvZHM6cnVuKCkKCXdoaWxlIG5leHQoc2VsZi50YXNrcykgZG8KCQlzZWxmOnN0ZXAoKQoJZW5kCmVuZAoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnF1ZXVlX2V2ZW50KGV2ZW50TmFtZSwgLi4uKQoJdGFibGUuaW5zZXJ0KHNlbGYuZXZlbnRzLCB7ZXZlbnROYW1lLCAuLi59KQplbmQKCmxvY2FsIHBvb2xfbWV0YSA9IHsKCV9faW5kZXggPSBwb29sX21ldGhvZHM7Cn0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBsaWJyYXJ5LnBvb2woKQoJbG9jYWwgcG9vbCA9IHsKCQl0YXNrcyA9IHt9OwoJCWV2ZW50cyA9IHt9OwoJCW9yZGVycyA9IHt9OwoJfQoJcmV0dXJuIHNldG1ldGF0YWJsZShwb29sLCBwb29sX21ldGEpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5ydW5uaW5nKCkKCXJldHVybiBfVEFTSwplbmQKCmZ1bmN0aW9uIGxpYnJhcnkuY29udGV4dCgpCglsb2NhbCB0YXNrID0gbGlicmFyeS5ydW5uaW5nKCkgb3IgZXJyb3IoImNvbnRleHQoKSBjYWxsZWQgb3V0c2lkZSBhbnkgdGFzayIsIDIpCglyZXR1cm4gdGFzay5jb250ZXh0CmVuZAoKZnVuY3Rpb24gbGlicmFyeS5hbnkoLi4uKQoJbG9jYWwgcmVzdWx0ID0geyBjb25jdXJyZW50LnNlbGVjdCguLi4pIH0KCWZvciBfLCB0YXNrIGluIGlwYWlycyB7IC4uLiB9IGRvCgkJdGFzazpzdG9wKCkKCWVuZAoJcmV0dXJuIHRhYmxlLnVucGFjayhyZXN1bHQpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS55aWVsZCgpCgljb3JvdXRpbmUueWllbGQoJ3dha2UnKQplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvcy5xdWV1ZUV2ZW50ID0gZnVuY3Rpb24oLi4uKQoJbG9jYWwgdGFzayA9IGxpYnJhcnkucnVubmluZygpCglpZiB0YXNrIHRoZW4KCQl0YXNrLnBvb2w6cXVldWVfZXZlbnQoLi4uKQoJZWxzZQoJCXF1ZXVlRXZlbnRSYXcoLi4uKQoJZW5kCmVuZAoKcmV0dXJuIGxpYnJhcnkK";
  54.     ["ktlo.concurrent"] = base64.decode "bG9jYWwgb3MsdGFibGUsbWF0aD1vcyx0YWJsZSxtYXRoO2xvY2FsIGEsYixjLGQ9b3MucHVsbEV2ZW50UmF3LG9zLnN0YXJ0VGltZXIsb3MuY2FuY2VsVGltZXIsb3MuZXBvY2g7bG9jYWwgZSxmLGcsaD10YWJsZS51bnBhY2ssdGFibGUucGFjayx0YWJsZS5yZW1vdmUsdGFibGUuaW5zZXJ0O2xvY2FsIGk9bWF0aC5mbG9vcjtsb2NhbCBzZXRtZXRhdGFibGUsc2VsZWN0LGVycm9yLHR5cGUscGFpcnM9c2V0bWV0YXRhYmxlLHNlbGVjdCxlcnJvcix0eXBlLHBhaXJzO2xvY2FsIGo9cmVxdWlyZSdrdGxvLmNoZWNrJ2xvY2FsIGs9ai5leHBlY3Q7bG9jYWwgZnVuY3Rpb24gbChtLG4pZm9yIG89MSwjbSBkbyBpZiBuPT1tW29ddGhlbiByZXR1cm4gbyBlbmQgZW5kO3JldHVybiBuaWwgZW5kO2xvY2FsIHA9e3dhaXRhYmxlPXRydWV9bG9jYWwgcT17fWxvY2FsIGZ1bmN0aW9uIHIocylrKDEscywnd2FpdGFibGUnKWxvY2FsIHQ9cy5zZWxlY3Rvcjtsb2NhbCB1PXt0LmltbWVkaWF0ZShzKX1pZiB1WzFddGhlbiByZXR1cm4gZSh1LDIpZW5kO2xvY2FsIHY9dC5lbnRlcihzKXJlcGVhdCBsb2NhbCB3PXthKCl9bG9jYWwgeD13WzFdaWYgeD09J3Rlcm1pbmF0ZSd0aGVuIHQubGVhdmUocyx2LGZhbHNlKWVycm9yKCJUZXJtaW5hdGVkIiwwKWVuZCB1bnRpbCB0LmNvbmRpdGlvbihzLHYsdylyZXR1cm4gdC5sZWF2ZShzLHYsdHJ1ZSllbmQ7cS53YWl0PXI7ZnVuY3Rpb24gcS5zZWxlY3QoLi4uKWZvciBvPTEsc2VsZWN0KCcjJywuLi4pZG8gayhvLHNlbGVjdChvLC4uLiksJ3dhaXRhYmxlJyllbmQ7bG9jYWwgeT17Li4ufWxvY2FsIHo9e31sb2NhbCBBPXt9bG9jYWwgQj0jeTtmb3Igbz0xLEIgZG8gbG9jYWwgcz15W29dbG9jYWwgdT17cy5zZWxlY3Rvci5pbW1lZGlhdGUocyl9aWYgdVsxXXRoZW4gcmV0dXJuIHMsZSh1LDIpZW5kIGVuZDtmb3Igbz0xLEIgZG8gbG9jYWwgcz15W29dbG9jYWwgdD1zLnNlbGVjdG9yO3pbb109dDtBW29dPXQuZW50ZXIocyllbmQ7bG9jYWwgQz1uaWw7cmVwZWF0IGxvY2FsIHc9ZihhKCkpbG9jYWwgeD13WzFdaWYgeD09J3Rlcm1pbmF0ZSd0aGVuIGZvciBvPTEsQiBkbyBsb2NhbCBzPXlbb11sb2NhbCB0PXpbb11sb2NhbCB2PUFbb110LmxlYXZlKHMsdixmYWxzZSllbmQ7ZXJyb3IoIlRlcm1pbmF0ZWQiLDApZW5kO2ZvciBvPTEsQiBkbyBsb2NhbCBzPXlbb11sb2NhbCB0PXpbb11sb2NhbCB2PUFbb11pZiB0LmNvbmRpdGlvbihzLHYsdyl0aGVuIEM9bzticmVhayBlbmQgZW5kIHVudGlsIEM7bG9jYWwgRDtmb3Igbz0xLEIgZG8gbG9jYWwgcz15W29dbG9jYWwgdD16W29dbG9jYWwgdj1BW29daWYgbz09QyB0aGVuIEQ9Zih0LmxlYXZlKHMsdix0cnVlKSllbHNlIHQubGVhdmUocyx2LGZhbHNlKWVuZCBlbmQ7cmV0dXJuIHlbQ10sZShEKWVuZDtsb2NhbCBmdW5jdGlvbiBFKClyZXR1cm4gZmFsc2UgZW5kO2xvY2FsIEY9e31sb2NhbCBHPTE7Ri5zZWxlY3Rvcj17aW1tZWRpYXRlPUUsZW50ZXI9ZnVuY3Rpb24oc2VsZilsb2NhbCBIPUc7Rz1HKzE7aChzZWxmLmNvbnN1bWVycyxIKXJldHVybiBIIGVuZCxjb25kaXRpb249ZnVuY3Rpb24oc2VsZixILHcpbG9jYWwgSSxKLEs9dGFibGUudW5wYWNrKHcpcmV0dXJuIEk9PSdub3RpZnlfd2FrZSdhbmQgSj09c2VsZi5pZCBhbmQoSz09SCBvciBub3QgSyllbmQsbGVhdmU9ZnVuY3Rpb24oc2VsZixILEMpaWYgbm90IEMgdGhlbiBsb2NhbCBMPXNlbGYuY29uc3VtZXJzO2xvY2FsIE09bChMLEgpaWYgTSB0aGVuIGcoTCxNKXJldHVybiBmYWxzZSBlbHNlIHJldHVybiB0cnVlIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZH1mdW5jdGlvbiBGOndhaXQoKWsoMSxzZWxmLCdub3RpZnknKXJldHVybiByKHNlbGYpZW5kO2Z1bmN0aW9uIEY6d2FrZSgpaygxLHNlbGYsJ25vdGlmeScpbG9jYWwgTD1zZWxmLmNvbnN1bWVycztsb2NhbCBOPWcoTCwxKWlmIE4gdGhlbiBvcy5xdWV1ZUV2ZW50KCJub3RpZnlfd2FrZSIsc2VsZi5pZCxOKXJldHVybiB0cnVlIGVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7ZnVuY3Rpb24gRjp3YWtlX2FsbCgpaygxLHNlbGYsJ25vdGlmeScpbG9jYWwgTz0jc2VsZi5jb25zdW1lcnM7aWYgTz4wIHRoZW4gc2VsZi5jb25zdW1lcnM9e31vcy5xdWV1ZUV2ZW50KCJub3RpZnlfd2FrZSIsc2VsZi5pZClyZXR1cm4gTyBlbHNlIHJldHVybiAwIGVuZCBlbmQ7bG9jYWwgUD17X19pbmRleD1GLF9fY2xhc3Nlcz1wLF9fbmFtZT0nbm90aWZ5J31sb2NhbCBRPTE7bG9jYWwgZnVuY3Rpb24gUigpbG9jYWwgSj1RO1E9USsxO2xvY2FsIFM9e2lkPUosY291bnQ9MCxjb25zdW1lcnM9e319cmV0dXJuIHNldG1ldGF0YWJsZShTLFApZW5kO3Eubm90aWZ5PVI7bG9jYWwgZnVuY3Rpb24gVChzZWxmKWxvY2FsIFM9c2VsZi5ub3RpZnk7cmV0dXJuIFMuc2VsZWN0b3IuZW50ZXIoUyllbmQ7bG9jYWwgZnVuY3Rpb24gVShzZWxmLFYsdylsb2NhbCBTPXNlbGYubm90aWZ5O3JldHVybiBTLnNlbGVjdG9yLmNvbmRpdGlvbihTLFYsdyllbmQ7bG9jYWwgZnVuY3Rpb24gVyhzZWxmLFYsQylsb2NhbCBTPXNlbGYubm90aWZ5O3JldHVybiBTLnNlbGVjdG9yLmxlYXZlKFMsVixDKWVuZDtsb2NhbCBmdW5jdGlvbiBYKHUsWSlyZXR1cm57aW1tZWRpYXRlPXUsZW50ZXI9VCxjb25kaXRpb249VSxsZWF2ZT1mdW5jdGlvbihzZWxmLHYsQylsb2NhbCBaPVcoc2VsZix2LEMpcmV0dXJuIFkoc2VsZixaLEMpZW5kfWVuZDtsb2NhbCBfPXt9ZnVuY3Rpb24gXzp0cnlfbG9jaygpaygxLHNlbGYsJ2xvY2thYmxlJylyZXR1cm4gc2VsZi5zZWxlY3Rvci5pbW1lZGlhdGUoc2VsZillbmQ7ZnVuY3Rpb24gXzpsb2NrKClrKDEsc2VsZiwnbG9ja2FibGUnKXIoc2VsZillbmQ7ZnVuY3Rpb24gXzp1bmxvY2soKWsoMSxzZWxmLCdsb2NrYWJsZScpZXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpZW5kO2Z1bmN0aW9uIF86d2l0aF9sb2NrKGEwLC4uLilrKDEsc2VsZiwnbG9ja2FibGUnKWsoMixhMCwnZnVuY3Rpb24nKXIoc2VsZilsb2NhbCBEPXtwY2FsbChhMCwuLi4pfXNlbGY6dW5sb2NrKClpZiBEWzFddGhlbiByZXR1cm4gZShELDIpZWxzZSBlcnJvcihEWzJdLDApZW5kIGVuZDtmdW5jdGlvbiBfOndpdGhfdHJ5X2xvY2soYTAsLi4uKWsoMSxzZWxmLCdsb2NrYWJsZScpaygyLGEwLCdmdW5jdGlvbicpbG9jYWwgYTE9c2VsZi5zZWxlY3Rvci5pbW1lZGlhdGUoc2VsZilpZiBhMSB0aGVuIGxvY2FsIEQ9e3BjYWxsKGEwLC4uLil9c2VsZjp1bmxvY2soKWlmIERbMV10aGVuIHJldHVybiB0cnVlLGUoRCwyKWVsc2UgZXJyb3IoRFsyXSwwKWVuZCBlbHNlIHJldHVybiBmYWxzZSBlbmQgZW5kO2Z1bmN0aW9uIF86d3JhcChhMClrKDEsc2VsZiwnbG9ja2FibGUnKWsoMixhMCwnZnVuY3Rpb24nKXJldHVybiBmdW5jdGlvbiguLi4pcmV0dXJuIHNlbGY6d2l0aF9sb2NrKGZ1bmN0aW9uKC4uLilyZXR1cm4gYTAoLi4uKWVuZCwuLi4pZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBhMihzZWxmLFosQylpZiBaIHRoZW4gc2VsZjp1bmxvY2soKWVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYTModSlyZXR1cm4gWCh1LGEyKWVuZDtsb2NhbCBhND17bG9ja2FibGU9dHJ1ZSx3YWl0YWJsZT10cnVlfWxvY2FsIGE1PXt9c2V0bWV0YXRhYmxlKGE1LHtfX2luZGV4PV99KWxvY2FsIGZ1bmN0aW9uIGE2KHNlbGYpaWYgc2VsZi5sb2NrZWQgdGhlbiByZXR1cm4gZmFsc2UgZWxzZSBzZWxmLmxvY2tlZD10cnVlO3JldHVybiB0cnVlIGVuZCBlbmQ7YTUuc2VsZWN0b3I9YTMoYTYpZnVuY3Rpb24gYTU6dW5sb2NrKClrKDEsc2VsZiwnbXV0ZXgnKWlmIG5vdCBzZWxmLmxvY2tlZCB0aGVuIGVycm9yKCJtdXRleCBub3QgbG9ja2VkIiwyKWVuZDtpZiBub3Qgc2VsZi5ub3RpZnk6d2FrZSgpdGhlbiBzZWxmLmxvY2tlZD1mYWxzZSBlbmQgZW5kO2xvY2FsIGE3PXtfX2luZGV4PWE1LF9fY2xhc3Nlcz1hNCxfX25hbWU9J211dGV4J31mdW5jdGlvbiBxLm11dGV4KClsb2NhbCBhOD17bG9ja2VkPWZhbHNlLG5vdGlmeT1SKCl9cmV0dXJuIHNldG1ldGF0YWJsZShhOCxhNyllbmQ7bG9jYWwgYTk9e31sb2NhbCBmdW5jdGlvbiBhYShzZWxmKWlmI3NlbGYucXVldWU+MCB0aGVuIHJldHVybiB0cnVlLGcoc2VsZi5xdWV1ZSwxKWVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYWIoc2VsZixaLEMpaWYgWiB0aGVuIHNlbGYubm90aWZ5Ondha2UoKWVuZDtpZiBDIHRoZW4gcmV0dXJuIGcoc2VsZi5xdWV1ZSwxKWVuZCBlbmQ7YTkuc2VsZWN0b3I9WChhYSxhYilmdW5jdGlvbiBhOTpzZW5kKG0paygxLHNlbGYsJ2NoYW5uZWwnKWgoc2VsZi5xdWV1ZSxtKXNlbGYubm90aWZ5Ondha2UoKWVuZDtmdW5jdGlvbiBhOTp0cnlfcmVjdigpaygxLHNlbGYsJ2NoYW5uZWwnKXJldHVybiBhYShzZWxmKWVuZDtmdW5jdGlvbiBhOTpyZWN2KClrKDEsc2VsZiwnY2hhbm5lbCcpcmV0dXJuIHIoc2VsZillbmQ7bG9jYWwgYWM9e19faW5kZXg9YTksX19jbGFzc2VzPXAsX19uYW1lPSdjaGFubmVsJ31mdW5jdGlvbiBxLmNoYW5uZWwoKWxvY2FsIGFkPXtxdWV1ZT17fSxub3RpZnk9UigpfXJldHVybiBzZXRtZXRhdGFibGUoYWQsYWMpZW5kO2xvY2FsIGFlPXt9bG9jYWwgZnVuY3Rpb24gYWYoc2VsZixaLEMpaWYgQyB0aGVuIHJldHVybiBzZWxmLnZhbHVlIGVuZCBlbmQ7YWUuc2VsZWN0b3I9WChFLGFmKWZ1bmN0aW9uIGFlOnNldChuKWsoMSxzZWxmLCdwcm9wZXJ0eScpaWYgc2VsZi52YWx1ZX49biB0aGVuIHNlbGYudmFsdWU9bjtzZWxmLm5vdGlmeTp3YWtlX2FsbCgpZW5kIGVuZDtmdW5jdGlvbiBhZTpjb2xsZWN0KGFnKWsoMSxzZWxmLCdwcm9wZXJ0eScpYWcoc2VsZi52YWx1ZSl3aGlsZSB0cnVlIGRvIGxvY2FsIG49cihzZWxmKWFnKG4pd2hpbGUgc2VsZi52YWx1ZX49biBkbyBuPXNlbGYudmFsdWU7YWcobillbmQgZW5kIGVuZDtmdW5jdGlvbiBhZTp3YWl0X3VudGlsKGFoKWsoMSxzZWxmLCdwcm9wZXJ0eScpbG9jYWwgbj1zZWxmLnZhbHVlO2lmIGFoKG4pdGhlbiByZXR1cm4gbiBlbmQ7d2hpbGUgdHJ1ZSBkbyBuPXIoc2VsZilpZiBhaChuKXRoZW4gcmV0dXJuIG4gZW5kIGVuZCBlbmQ7bG9jYWwgYWk9e19faW5kZXg9YWUsX19jbGFzc2VzPXAsX19uYW1lPSdwcm9wZXJ0eSd9ZnVuY3Rpb24gcS5wcm9wZXJ0eShhailsb2NhbCBhaz17dmFsdWU9YWosbm90aWZ5PVIoKX1yZXR1cm4gc2V0bWV0YXRhYmxlKGFrLGFpKWVuZDtsb2NhbCBmdW5jdGlvbiBhbChzZWxmKWlmIHNlbGYubG9ja2VkIHRoZW4gcmV0dXJuIGZhbHNlIGVsc2UgbG9jYWwgTz1zZWxmLmNvdW50O2lmIE89PTAgdGhlbiBzZWxmLndyaXRlLmxvY2tlZD10cnVlIGVuZDtzZWxmLmNvdW50PU8rMTtyZXR1cm4gdHJ1ZSBlbmQgZW5kO2xvY2FsIGFtPXt9YW0uc2VsZWN0b3I9YTMoYWwpZnVuY3Rpb24gYW06dW5sb2NrKClrKDEsc2VsZiwncmVhZF9tdXRleCcpbG9jYWwgTz1zZWxmLmNvdW50O2lmIE89PTAgdGhlbiBlcnJvcigibXV0ZXggaXMgbm90IGxvY2tlZCIsMillbmQ7c2VsZi5jb3VudD1PLTE7aWYgTz09MSB0aGVuIGxvY2FsIGFuPXNlbGYud3JpdGU7aWYgYW4ubm90aWZ5Ondha2UoKXRoZW4gc2VsZi5sb2NrZWQ9dHJ1ZSBlbmQgZW5kIGVuZDtzZXRtZXRhdGFibGUoYW0se19faW5kZXg9X30pbG9jYWwgYW89e19faW5kZXg9YW0sX19jbGFzc2VzPWE0LF9fbmFtZT0ncmVhZF9tdXRleCd9bG9jYWwgZnVuY3Rpb24gYXAoc2VsZilpZiBzZWxmLmxvY2tlZCB0aGVuIHJldHVybiBmYWxzZSBlbHNlIGxvY2FsIGFxPXNlbGYucmVhZDthcS5sb2NrZWQ9dHJ1ZTtzZWxmLmxvY2tlZD10cnVlO3JldHVybiB0cnVlIGVuZCBlbmQ7bG9jYWwgYXI9e31hci5zZWxlY3Rvcj1hMyhhcClmdW5jdGlvbiBhcjp1bmxvY2soKWsoMSxzZWxmLCd3cml0ZV9tdXRleCcpbG9jYWwgYXE9c2VsZi5yZWFkO2xvY2FsIE89YXEuY291bnQ7aWYgbm90IHNlbGYubG9ja2VkIG9yIE8+MCB0aGVuIGVycm9yKCJtdXRleCBpcyBub3QgbG9ja2VkIiwyKWVuZDtpZiBzZWxmLm5vdGlmeTp3YWtlKCl0aGVuIHJldHVybiBlbmQ7YXEubG9ja2VkPWZhbHNlO2xvY2FsIGFzPWFxLm5vdGlmeTp3YWtlX2FsbCgpaWYgYXM+MCB0aGVuIGFxLmNvdW50PWFzO3JldHVybiBlbmQ7c2VsZi5sb2NrZWQ9ZmFsc2UgZW5kO2xvY2FsIGF0PXtfX2luZGV4PWFyLF9fY2xhc3Nlcz1hNCxfX25hbWU9J3dyaXRlX211dGV4J31mdW5jdGlvbiBxLnJ3X211dGV4KClsb2NhbCBhcT17Y291bnQ9MCxsb2NrZWQ9ZmFsc2Usbm90aWZ5PVIoKSx3cml0ZT10cnVlfWxvY2FsIGFuPXtsb2NrZWQ9ZmFsc2Usbm90aWZ5PVIoKSxyZWFkPXRydWV9YXEud3JpdGU9YW47YW4ucmVhZD1hcTtzZXRtZXRhdGFibGUoYXEsYW8pc2V0bWV0YXRhYmxlKGFuLGF0KXJldHVybiBhbixhcSBlbmQ7bG9jYWwgZnVuY3Rpb24gYXUoKXJldHVybiBkKCd1dGMnKS8xMDAwIGVuZDtsb2NhbCBhdj17fWF2LnNlbGVjdG9yPXt9ZnVuY3Rpb24gYXYuc2VsZWN0b3IuaW1tZWRpYXRlKHNlbGYpbG9jYWwgYXc9YXUoKWxvY2FsIGF4PXNlbGYubWlsZXN0b25lO2lmIGF3Pj1heCB0aGVuIHNlbGYubWlsZXN0b25lPWF4K3NlbGYucGVyaW9kO3JldHVybiB0cnVlIGVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7ZnVuY3Rpb24gYXYuc2VsZWN0b3IuZW50ZXIoc2VsZilsb2NhbCBheT1zZWxmLm1pbGVzdG9uZS1hdSgpaWYgYXk8MCB0aGVuIGF5PTAgZW5kO3JldHVybiBiKGF5KWVuZDtmdW5jdGlvbiBhdi5zZWxlY3Rvci5jb25kaXRpb24oc2VsZixheix3KXJldHVybiB3WzFdPT0ndGltZXInYW5kIHdbMl09PWF6IGVuZDtmdW5jdGlvbiBhdi5zZWxlY3Rvci5sZWF2ZShzZWxmLGF6LEMpaWYgbm90IEMgdGhlbiBjKGF6KWVsc2Ugc2VsZi5taWxlc3RvbmU9c2VsZi5taWxlc3RvbmUrc2VsZi5wZXJpb2QgZW5kIGVuZDtmdW5jdGlvbiBhdjpzbGVlcCgpaygxLHNlbGYsJ3RpbWVyJylyZXR1cm4gcihzZWxmKWVuZDtmdW5jdGlvbiBhdjpza2lwX21pc3NlZCgpaygxLHNlbGYsJ3RpbWVyJylsb2NhbCBhdz1hdSgpbG9jYWwgYXg9c2VsZi5taWxlc3RvbmU7aWYgYXc8YXggdGhlbiByZXR1cm4gMCBlbmQ7bG9jYWwgYUE9c2VsZi5wZXJpb2Q7bG9jYWwgYUI9aSgoYXctYXgpL2FBKSsxO3NlbGYubWlsZXN0b25lPWF4K2FCKmFBO3JldHVybiBhQiBlbmQ7bG9jYWwgYUM9e19faW5kZXg9YXYsX19jbGFzc2VzPXAsX19uYW1lPSd0aW1lcid9ZnVuY3Rpb24gcS50aW1lcihhQSxhRClrKDEsYUEsJ251bWJlcicpaygyLGFELCdudW1iZXInLCduaWwnKWlmIG5vdCBhRCB0aGVuIGFEPWF1KCkrYUEgZW5kO2xvY2FsIGF6PXttaWxlc3RvbmU9YUQscGVyaW9kPWFBfXJldHVybiBzZXRtZXRhdGFibGUoYXosYUMpZW5kO2xvY2FsIGFFPXt9YUUuc2VsZWN0b3I9e31hRS5zZWxlY3Rvci5pbW1lZGlhdGU9RTtmdW5jdGlvbiBhRS5zZWxlY3Rvci5lbnRlcihzZWxmKXJldHVybiBiKHNlbGYuZGVsYXkpZW5kO2Z1bmN0aW9uIGFFLnNlbGVjdG9yLmNvbmRpdGlvbihzZWxmLGF6LHcpcmV0dXJuIHdbMV09PSd0aW1lcidhbmQgd1syXT09YXogZW5kO2Z1bmN0aW9uIGFFLnNlbGVjdG9yLmxlYXZlKHNlbGYsYXosQylpZiBub3QgQyB0aGVuIGMoYXopZW5kIGVuZDtsb2NhbCBhRj17X19pbmRleD1hRSxfX2NsYXNzZXM9cCxfX25hbWU9J3RpbWVvdXQnfWZ1bmN0aW9uIHEudGltZW91dChhRylrKDEsYUcsJ251bWJlcicpbG9jYWwgYUg9e2RlbGF5PWFHfXJldHVybiBzZXRtZXRhdGFibGUoYUgsYUYpZW5kO2xvY2FsIGFJPXt9YUkuc2VsZWN0b3I9e31hSS5zZWxlY3Rvci5pbW1lZGlhdGU9RTtmdW5jdGlvbiBhSS5zZWxlY3Rvci5lbnRlcigpcmV0dXJue31lbmQ7ZnVuY3Rpb24gYUkuc2VsZWN0b3IuY29uZGl0aW9uKHNlbGYsdix3KWxvY2FsIGFKPXNlbGYuZmlsdGVyKHcpaWYgYUogdGhlbiBmb3Igbz0xLCN3IGRvIHZbb109d1tvXWVuZCBlbmQ7cmV0dXJuIGFKIGVuZDtmdW5jdGlvbiBhSS5zZWxlY3Rvci5sZWF2ZShzZWxmLHYsQylpZiBDIHRoZW4gcmV0dXJuIHYgZW5kIGVuZDtmdW5jdGlvbiBhSTpsaXN0ZW4oKWsoMSxzZWxmLCdldmVudCcpcmV0dXJuIGUocihzZWxmKSllbmQ7bG9jYWwgYUs9e19faW5kZXg9YUksX19jbGFzc2VzPXAsX19uYW1lPSdldmVudCd9ZnVuY3Rpb24gcS5ldmVudChhTClrKDEsYUwsJ2Z1bmN0aW9uJywnc3RyaW5nJywndGFibGUnKWlmIHR5cGUoYUw9PSdzdHJpbmcnKXRoZW4gbG9jYWwgYU09YUw7YUw9ZnVuY3Rpb24odylyZXR1cm4gd1sxXT09YU0gZW5kIGVsc2VpZiB0eXBlKGFMKT09J3RhYmxlJ3RoZW4gbG9jYWwgYU49YUw7YUw9ZnVuY3Rpb24odylmb3IgYU8sbiBpbiBwYWlycyhhTilkbyBpZiB3W2FPXX49biB0aGVuIHJldHVybiBmYWxzZSBlbmQgZW5kO3JldHVybiB0cnVlIGVuZCBlbmQ7bG9jYWwgdz17ZmlsdGVyPWFMfXJldHVybiBzZXRtZXRhdGFibGUodyxhSyllbmQ7bG9jYWwgYVA9e31sb2NhbCBmdW5jdGlvbiBhUShzZWxmKWxvY2FsIGFSPXNlbGYuYXF1aXJlZDtsb2NhbCBPPXNlbGYuY291bnQ7aWYgYVI8TyB0aGVuIGFSPWFSKzE7c2VsZi5hcXVpcmVkPWFSO2lmIGFSPT1PIHRoZW4gc2VsZi5sb2NrZWQ9dHJ1ZSBlbmQ7cmV0dXJuIHRydWUgZWxzZSByZXR1cm4gZmFsc2UgZW5kIGVuZDthUC5zZWxlY3Rvcj1hMyhhUSlmdW5jdGlvbiBhUDp1bmxvY2soKWsoMSxzZWxmLCdzZW1hcGhvcmUnKWxvY2FsIGFSPXNlbGYuYXF1aXJlZDtpZiBhUj09MCB0aGVuIGVycm9yKCJzZW1hcGhvcmUgaXMgbm90IGxvY2tlZCIsMillbmQ7aWYgbm90IHNlbGYubm90aWZ5Ondha2UoKXRoZW4gc2VsZi5hcXVpcmVkPWFSLTE7c2VsZi5sb2NrZWQ9ZmFsc2UgZW5kIGVuZDtzZXRtZXRhdGFibGUoYVAse19faW5kZXg9X30pbG9jYWwgYVM9e19faW5kZXg9YVAsX19jbGFzc2VzPWE0LF9fbmFtZT0nc2VtYXBob3JlJ31mdW5jdGlvbiBxLnNlbWFwaG9yZShPKWsoMSxPLCdudW1iZXInKWxvY2FsIGFUPXtjb3VudD1pKE8pLGFxdWlyZWQ9MCxsb2NrZWQ9ZmFsc2Usbm90aWZ5PVIoKX1yZXR1cm4gc2V0bWV0YXRhYmxlKGFULGFTKWVuZDtsb2NhbCBhVT17fWxvY2FsIGZ1bmN0aW9uIGFWKHNlbGYpaWYgc2VsZi5jb21wbGV0ZWQgdGhlbiByZXR1cm4gdHJ1ZSxzZWxmLnZhbHVlIGVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYVcoc2VsZixaLEMpaWYgQyB0aGVuIHJldHVybiBzZWxmLnZhbHVlIGVuZCBlbmQ7YVUuc2VsZWN0b3I9WChhVixhVylmdW5jdGlvbiBhVTpnZXQoKWsoMSxzZWxmLCdmdXR1cmUnKXJldHVybiByKHNlbGYpZW5kO2Z1bmN0aW9uIGFVOmNvbXBsZXRlKG4paygxLHNlbGYsJ2Z1dHVyZScpaWYgc2VsZi5jb21wbGV0ZWQgdGhlbiBlcnJvcigiZnV0dXJlIGlzIGFscmVhZHkgY29tcGxldGVkIiwyKWVuZDtzZWxmLmNvbXBsZXRlZD10cnVlO3NlbGYudmFsdWU9bjtzZWxmLm5vdGlmeTp3YWtlX2FsbCgpZW5kO2xvY2FsIGFYPXtfX2luZGV4PWFVLF9fY2xhc3Nlcz1wLF9fbmFtZT0nZnV0dXJlJ31mdW5jdGlvbiBxLmZ1dHVyZSgpbG9jYWwgYVk9e2NvbXBsZXRlZD1mYWxzZSx2YWx1ZT1mYWxzZSxub3RpZnk9cS5ub3RpZnkoKX1yZXR1cm4gc2V0bWV0YXRhYmxlKGFZLGFYKWVuZDtyZXR1cm4gcQo=";
  55.     ["ktlo.container"] = base64.decode "bG9jYWwgdGFibGUsbWF0aCxzdHJpbmcsYT10YWJsZSxtYXRoLHN0cmluZyxyZXF1aXJlJ2t0bG8uY2hlY2snbG9jYWwgYixjLGQ9dGFibGUudW5wYWNrLHRhYmxlLmluc2VydCx0YWJsZS5jb25jYXQ7bG9jYWwgZXJyb3Isc2V0bWV0YXRhYmxlLHRvc3RyaW5nLHR5cGU9ZXJyb3Isc2V0bWV0YXRhYmxlLHRvc3RyaW5nLHR5cGU7bG9jYWwgZSxmPW1hdGguaHVnZSxtYXRoLmZsb29yO2xvY2FsIGcsaCxpPXN0cmluZy5tYXRjaCxzdHJpbmcuZ3N1YixzdHJpbmcuZm9ybWF0O2xvY2FsIGo9YS5leHBlY3Q7bG9jYWwgaz1jb3JvdXRpbmUucmVzdW1lO2xvY2FsIGw9e31sb2NhbCBtPXt9ZnVuY3Rpb24gbTp1bndyYXAoKWooMSxzZWxmLCdyZXN1bHQnKWxvY2FsIG49c2VsZi52YWx1ZTtpZiBzZWxmLnN1Y2Nlc3MgdGhlbiByZXR1cm4gYihuKWVsc2UgZXJyb3IobiwyKWVuZCBlbmQ7ZnVuY3Rpb24gbTp1bnBhY2soKWooMSxzZWxmLCdyZXN1bHQnKWxvY2FsIG49c2VsZi52YWx1ZTtpZiBzZWxmLnN1Y2Nlc3MgdGhlbiByZXR1cm4gdHJ1ZSxiKG4pZWxzZSByZXR1cm4gZmFsc2UsbiBlbmQgZW5kO2xvY2FsIG89e19faW5kZXg9bSxfX25hbWU9J3Jlc3VsdCd9bG9jYWwgZnVuY3Rpb24gcChxLG4pbG9jYWwgcj17c3VjY2Vzcz1xLHZhbHVlPW59cmV0dXJuIHNldG1ldGF0YWJsZShyLG8pZW5kO2xvY2FsIGZ1bmN0aW9uIHMoLi4uKXJldHVybiBwKHRydWUsey4uLn0pZW5kO2xvY2FsIGZ1bmN0aW9uIHQodSlyZXR1cm4gcChmYWxzZSx1KWVuZDtsb2NhbCBmdW5jdGlvbiB2KHcsLi4uKWlmIHcgdGhlbiByZXR1cm4gcyguLi4pZWxzZSByZXR1cm4gdCguLi4pZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiB4KHksLi4uKWooMSx5LCdmdW5jdGlvbicpcmV0dXJuIHYocGNhbGwoeSwuLi4pKWVuZDtsb2NhbCBmdW5jdGlvbiB6KEEsLi4uKWooMSxBLCd0aHJlYWQnKXJldHVybiB2KGsoQSwuLi4pKWVuZDtsLnJlc3VsdD17c3VjY2Vzcz1zLGZhaWx1cmU9dCxjYXRjaGluZz14LHJlc3VtaW5nPXoscGFjaz12fWxvY2FsIGZ1bmN0aW9uIEIobilpZiB0eXBlKG4pfj0nbnVtYmVyJ3RoZW4gcmV0dXJuIG5pbCBlbmQ7aWYgbj09ZSBvciBuPT0tZSBvciBufj1mKG4pdGhlbiByZXR1cm4nZmxvYXQnZW5kO3JldHVybidpbnRlZ2VyJ2VuZDtsb2NhbCBmdW5jdGlvbiBDKEQsbilpZiB0eXBlKG4pPT0nc3RyaW5nJ3RoZW4gbG9jYWwgRT1oKGkoIiVxIixuKSwiXFxcbiIsIlxcbiIpYyhELEUpZWxzZWlmIEIobik9PSdmbG9hdCd0aGVuIGlmIG5+PW4gdGhlbiBjKEQsIjAvMCIpZWxzZWlmIG49PWUgdGhlbiBjKEQsIjEvMCIpZWxzZWlmIG49PS1lIHRoZW4gYyhELCItMS8wIillbHNlIGMoRCx0b3N0cmluZyhuKSllbmQgZWxzZSBjKEQsdG9zdHJpbmcobikpZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBGKHNlbGYpbG9jYWwgRD17InsifWxvY2FsIEc9I3NlbGY7Zm9yIEg9MSxHIGRvIEMoRCxzZWxmW0hdKWMoRCwiLCIpZW5kO2ZvciBJLG4gaW4gcGFpcnMoc2VsZilkbyBpZiBub3QoQihJKT09J2ludGVnZXInYW5kIEk+PTEgYW5kIEk8PUcpdGhlbiBpZiB0eXBlKEkpPT0nc3RyaW5nJ2FuZCBnKEksJ15bXyVhXVtfJXddKiQnKXRoZW4gYyhELEkpZWxzZSBjKEQsIlsiKUMoRCxJKWMoRCwiXSIpZW5kO2MoRCwiPSIpQyhELG4pYyhELCIsIillbmQgZW5kO2lmI0Q9PTEgdGhlbiByZXR1cm4ie30iZW5kO0RbI0RdPSd9J3JldHVybiBkKEQpZW5kO2xvY2FsIGZ1bmN0aW9uIEooSyxMKWxvY2FsIE09e31mb3IgTixPIGluIHBhaXJzKEspZG8gbG9jYWwgUD1MW05daWYgUD09bmlsIG9yIE9+PVAgdGhlbiByZXR1cm4gZmFsc2UgZW5kO01bTl09dHJ1ZSBlbmQ7Zm9yIFEsUiBpbiBwYWlycyhMKWRvIGlmIG5vdCBNW1FddGhlbiByZXR1cm4gZmFsc2UgZW5kIGVuZDtyZXR1cm4gdHJ1ZSBlbmQ7bG9jYWwgUz17X190b3N0cmluZz1GLF9fZXE9Sn1sb2NhbCBUO2Z1bmN0aW9uIFQobixVKWooMSxuLCd0YWJsZScpaigyLFUsJ2Jvb2xlYW4nLCduaWwnKWxvY2FsIHI9c2V0bWV0YXRhYmxlKG4sUylpZiBVIHRoZW4gZm9yIFIsViBpbiBwYWlycyhuKWRvIGlmIHR5cGUoVik9PSd0YWJsZSd0aGVuIFQoVix0cnVlKWVuZCBlbmQgZW5kO3JldHVybiByIGVuZDtsLmRhdHVtPVQ7cmV0dXJuIGwK";
  56.     ["psg.modal"] = base64.decode "bG9jYWwgYmFzYWx0ID0gcmVxdWlyZSAnYmFzYWx0Jwpsb2NhbCBjb25jdXJyZW50ID0gcmVxdWlyZSAna3Rsby5jb25jdXJyZW50Jwpsb2NhbCByZXNvdXJjZXMgPSByZXF1aXJlICdrdGxvLnJlc291cmNlcycKbG9jYWwgam9iID0gcmVxdWlyZSAna3Rsby5qb2InCgpsb2NhbCBsaWJyYXJ5ID0ge30KCmxvY2FsIGZyYW1lcyA9IG5pbAoKbG9jYWwgZnVuY3Rpb24gZ2V0X2ZyYW1lcygpCglpZiBub3QgZnJhbWVzIHRoZW4KCQlsb2NhbCByb290ID0gYmFzYWx0LmdldEFjdGl2ZUZyYW1lKCkKCQlsb2NhbCBtYWluRnJhbWUgPSByb290OmdldE9iamVjdCgicm9vdCIpIG9yIHJvb3Q6Z2V0T2JqZWN0KCJtYWluIikKCQlmcmFtZXMgPSB7CgkJCVttYWluRnJhbWVdID0ge30KCQl9CgllbmQKCXJldHVybiBmcmFtZXMKZW5kCgotLS0gQHBhcmFtIHNldHVwIGZ1bihmcmFtZSwgZnV0dXJlOiBmdXR1cmUpCi0tLSBAcmV0dXJuIGFueQpsb2NhbCBmdW5jdGlvbiBvcGVuX21vZGFsX3dpbmRvdyhzZXR1cCkKCWxvY2FsIHJvb3QgPSBiYXNhbHQuZ2V0QWN0aXZlRnJhbWUoKQoJbG9jYWwgd2luZG93cyA9IGdldF9mcmFtZXMoKQoJZm9yIGZyYW1lLCBzdGFjayBpbiBwYWlycyh3aW5kb3dzKSBkbwoJCXRhYmxlLmluc2VydChzdGFjaywgZnJhbWU6aXNFbmFibGVkKCkpCgkJZnJhbWU6ZGlzYWJsZSgpCgllbmQKCWxvY2FsIGZ1dHVyZSA9IGNvbmN1cnJlbnQuZnV0dXJlKCkKCWxvY2FsIGZyYW1lID0gcm9vdDphZGRGcmFtZSgpCgl3aW5kb3dzW2ZyYW1lXSA9IHt9CglmcmFtZTpzZXRNb3ZhYmxlKHRydWUpCglzZXR1cChmcmFtZSwgZnV0dXJlKQoJbG9jYWwgb2ssIHJlc3VsdCA9IHBjYWxsKGZ1dHVyZS5nZXQsIGZ1dHVyZSkKCWZyYW1lOnJlbW92ZSgpCgl3aW5kb3dzW2ZyYW1lXSA9IG5pbAoJZm9yIG90aGVyRnJhbWUsIHN0YWNrIGluIHBhaXJzKHdpbmRvd3MpIGRvCgkJbG9jYWwgZW5hYmxlZCA9IHRhYmxlLnJlbW92ZShzdGFjaywgLTEpCgkJLS1pZiBlbmFibGVkIHRoZW4KCQkJb3RoZXJGcmFtZTplbmFibGUoKQoJCS0tZW5kCgllbmQKCWlmIG9rIHRoZW4KCQlyZXR1cm4gcmVzdWx0CgllbHNlCgkJZXJyb3IocmVzdWx0LCAwKQoJZW5kCmVuZAoKbGlicmFyeS5vcGVuID0gb3Blbl9tb2RhbF93aW5kb3cKCmxvY2FsIGZ1bmN0aW9uIHNldHVwX2ZyYW1lX3dpZHRoKGZyYW1lLCB3aWR0aCwgaGVpZ2h0LCBsYXlvdXQpCglmcmFtZTpzZXRTaXplKHdpZHRoLCBoZWlnaHQpCglmcmFtZTpzZXRQb3NpdGlvbigiKHBhcmVudC53IC0gc2VsZi53KS8yICsgMSIsICIocGFyZW50LmggLSBzZWxmLmgpLzIiKQoJZnJhbWU6YWRkTGF5b3V0RnJvbVN0cmluZyhyZXNvdXJjZXMubG9hZChsYXlvdXQpKQoJcmV0dXJuIGZyYW1lOmdldE9iamVjdCgid2luZG93IikKZW5kCgpsb2NhbCBmdW5jdGlvbiBzZXR1cF9mcmFtZShmcmFtZSwgaGVpZ2h0LCBsYXlvdXQpCglsb2NhbCB3aWR0aCA9IG1hdGgubWluKDMwLCBmcmFtZTpnZXRQYXJlbnQoKTpnZXRTaXplKCkgLSAyKQoJcmV0dXJuIHNldHVwX2ZyYW1lX3dpZHRoKGZyYW1lLCB3aWR0aCwgaGVpZ2h0LCBsYXlvdXQpCmVuZAoKLS0tIEBhc3luYwpmdW5jdGlvbiBsaWJyYXJ5LmFsZXJ0KHRleHQsIGFjY2VwdCwgY2FuY2VsKQoJaWYgdHlwZSh0ZXh0KSA9PSAndGFibGUnIHRoZW4KCQl0ZXh0ID0gdGFibGUuY29uY2F0KHRleHQsICdcbicpCgllbmQKCXJldHVybiBvcGVuX21vZGFsX3dpbmRvdyhmdW5jdGlvbihmcmFtZSwgZnV0dXJlKQoJCWxvY2FsIHdpbmRvdyA9IHNldHVwX2ZyYW1lKGZyYW1lLCAxMywgImFsZXJ0LnhtbCIpCgkJbG9jYWwgYWNjZXB0QnV0dG9uID0gd2luZG93OmdldE9iamVjdCgiYWNjZXB0IikKCQlhY2NlcHRCdXR0b246b25DbGljayhmdW5jdGlvbigpCgkJCWZ1dHVyZTpjb21wbGV0ZSh0cnVlKQoJCWVuZCkKCQlsb2NhbCBjYW5jZWxCdXR0b24gPSB3aW5kb3c6Z2V0T2JqZWN0KCJjYW5jZWwiKQoJCWNhbmNlbEJ1dHRvbjpvbkNsaWNrKGZ1bmN0aW9uKCkKCQkJZnV0dXJlOmNvbXBsZXRlKGZhbHNlKQoJCWVuZCkKCQlsb2NhbCBjb250ZW50ID0gd2luZG93OmdldE9iamVjdCgiY29udGVudCIpCgkJY29udGVudDpzZXRUZXh0KHRleHQpCgkJaWYgYWNjZXB0IHRoZW4KCQkJYWNjZXB0QnV0dG9uOnNob3coKQoJCQlhY2NlcHRCdXR0b246c2V0VGV4dChhY2NlcHQpCgkJZWxzZQoJCQlhY2NlcHRCdXR0b246aGlkZSgpCgkJZW5kCgkJY2FuY2VsQnV0dG9uOnNldFRleHQoY2FuY2VsKQoJZW5kKQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5tZXNzYWdlKHRpdGxlLCBtZXNzYWdlKQoJb3Blbl9tb2RhbF93aW5kb3coZnVuY3Rpb24oZnJhbWUsIGZ1dHVyZSkKCQlsb2NhbCB3aW5kb3cgPSBzZXR1cF9mcmFtZShmcmFtZSwgMTEsICJtZXNzYWdlLnhtbCIpCgkJd2luZG93OmdldE9iamVjdCgidGl0bGUiKTpzZXRUZXh0KHRpdGxlKQoJCXdpbmRvdzpnZXRPYmplY3QoImNvbnRlbnQiKTpzZXRUZXh0KG1lc3NhZ2UpCgkJd2luZG93OmdldE9iamVjdCgiY2xvc2UiKTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQkJZnV0dXJlOmNvbXBsZXRlKG5pbCkKCQllbmQpCgllbmQpCmVuZAoKbG9jYWwgZnVuY3Rpb24gc2V0dXBfcGFzc3dkKGZyYW1lLCBmdXR1cmUpCglsb2NhbCB3aW5kb3cgPSBzZXR1cF9mcmFtZShmcmFtZSwgOCwgInBhc3N3ZC54bWwiKQoJbG9jYWwgaW5wdXQgPSB3aW5kb3c6Z2V0T2JqZWN0KCJwYXNzd29yZCIpCglsb2NhbCBkb25lID0gd2luZG93OmdldE9iamVjdCgiZG9uZSIpCglsb2NhbCBjYW5jZWwgPSB3aW5kb3c6Z2V0T2JqZWN0KCJjYW5jZWwiKQoJZG9uZTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQlmdXR1cmU6Y29tcGxldGUoaW5wdXQ6Z2V0VmFsdWUoKSkKCWVuZCkKCWNhbmNlbDpvbkNsaWNrKGZ1bmN0aW9uKCkKCQlmdXR1cmU6Y29tcGxldGUobmlsKQoJZW5kKQoJaW5wdXQ6c2V0Rm9jdXMoKQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5wYXNzd2QoKQoJcmV0dXJuIG9wZW5fbW9kYWxfd2luZG93KHNldHVwX3Bhc3N3ZCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBzZXR1cF9jaHBhc3MoZnJhbWUsIGZ1dHVyZSkKCWxvY2FsIHdpbmRvdyA9IHNldHVwX2ZyYW1lKGZyYW1lLCAxMiwgImNocGFzcy54bWwiKQoJbG9jYWwgbWVzc2FnZSA9IHdpbmRvdzpnZXRPYmplY3QoIm1lc3NhZ2UiKQoJbG9jYWwgaW5wdXQgPSB3aW5kb3c6Z2V0T2JqZWN0KCJwYXNzd29yZCIpCglsb2NhbCBjb25maXJtRWxlbWVudCA9IHdpbmRvdzpnZXRPYmplY3QoImNvbmZpcm0iKQoJbG9jYWwgZG9uZSA9IHdpbmRvdzpnZXRPYmplY3QoImRvbmUiKQoJbG9jYWwgY2FuY2VsID0gd2luZG93OmdldE9iamVjdCgiY2FuY2VsIikKCWRvbmU6b25DbGljayhmdW5jdGlvbigpCgkJbG9jYWwgcGFzc3dvcmQgPSBpbnB1dDpnZXRWYWx1ZSgpCgkJbG9jYWwgY29uZmlybSA9IGNvbmZpcm1FbGVtZW50OmdldFZhbHVlKCkKCQlpZiBwYXNzd29yZCB+PSBjb25maXJtIHRoZW4KCQkJbWVzc2FnZTpzZXRUZXh0KCJQYXNzd29yZHMgbm90IGVxdWFsISIpCgkJCXJldHVybgoJCWVuZAoJCWZ1dHVyZTpjb21wbGV0ZShwYXNzd29yZCkKCWVuZCkKCWNhbmNlbDpvbkNsaWNrKGZ1bmN0aW9uKCkKCQlmdXR1cmU6Y29tcGxldGUobmlsKQoJZW5kKQoJaW5wdXQ6b25DbGljayhmdW5jdGlvbigpCgkJbWVzc2FnZTpzZXRUZXh0KCIiKQoJZW5kKQoJY29uZmlybUVsZW1lbnQ6b25DbGljayhmdW5jdGlvbigpCgkJbWVzc2FnZTpzZXRUZXh0KCIiKQoJZW5kKQoJaW5wdXQ6c2V0Rm9jdXMoKQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5jaHBhc3MoKQoJcmV0dXJuIG9wZW5fbW9kYWxfd2luZG93KHNldHVwX2NocGFzcykKZW5kCgotLS0gQHBhcmFtIGluaXQgaW50ZWdlcgotLS0gQHJldHVybiBpbnRlZ2VyCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5udW1iZXIoaW5pdCkKCXJldHVybiBvcGVuX21vZGFsX3dpbmRvdyhmdW5jdGlvbihmcmFtZSwgZnV0dXJlKQoJCWxvY2FsIHdpbmRvdyA9IHNldHVwX2ZyYW1lX3dpZHRoKGZyYW1lLCAyMywgMTYsICJudW1iZXIueG1sIikKCQlsb2NhbCBpbnB1dCA9IHdpbmRvdzpnZXRPYmplY3QoImlucHV0IikKCQlpbnB1dDpzZXRWYWx1ZSh0b3N0cmluZyhpbml0KSkKCQlsb2NhbCBkaWdpdHMgPSB3aW5kb3c6Z2V0T2JqZWN0KCJkaWdpdHMiKQoJCWZvciBpPTAsIDkgZG8KCQkJbG9jYWwgZGlnaXQgPSBkaWdpdHM6Z2V0T2JqZWN0KCJkIi4uaSkKCQkJZGlnaXQ6b25DbGljayhmdW5jdGlvbigpCgkJCQlpbnB1dDpzZXRWYWx1ZSh0b3N0cmluZyh0b251bWJlcihpbnB1dDpnZXRWYWx1ZSgpLi5pKSkpCgkJCQlpbnB1dDpzZXRGb2N1cygpCgkJCWVuZCkKCQllbmQKCQlsb2NhbCBjb250cm9sID0gd2luZG93OmdldE9iamVjdCgiY29udHJvbCIpCgkJY29udHJvbDpnZXRPYmplY3QoImVyYXNlIik6b25DbGljayhmdW5jdGlvbigpCgkJCWxvY2FsIHZhbHVlID0gdG9zdHJpbmcoaW5wdXQ6Z2V0VmFsdWUoKSkKCQkJaWYgI3ZhbHVlIH49IDAgdGhlbgoJCQkJaW5wdXQ6c2V0VmFsdWUodmFsdWU6c3ViKDEsIC0yKSkKCQkJZW5kCgkJCWlucHV0OnNldEZvY3VzKCkKCQllbmQpCgkJY29udHJvbDpnZXRPYmplY3QoImRvbmUiKTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQkJbG9jYWwgdmFsdWUgPSBpbnB1dDpnZXRWYWx1ZSgpCgkJCWZ1dHVyZTpjb21wbGV0ZSh0b251bWJlcih2YWx1ZSkgb3IgMCkKCQllbmQpCgkJY29udHJvbDpnZXRPYmplY3QoImJhY2siKTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQkJZnV0dXJlOmNvbXBsZXRlKG5pbCkKCQllbmQpCgkJaW5wdXQ6c2V0Rm9jdXMoKQoJZW5kKQplbmQKCmxvY2FsIGZ1bmN0aW9uIHNldHVwX2FkZHJlc3MoaW5pdEFkZHJlc3MsIGZyYW1lLCBmdXR1cmUpCglsb2NhbCB3aW5kb3cgPSBzZXR1cF9mcmFtZV93aWR0aChmcmFtZSwgMjcsIDIwLCAiYWRkcmVzcy54bWwiKQoJbG9jYWwgc3ltYm9scyA9IHdpbmRvdzpnZXRPYmplY3QoInN5bWJvbHMiKQoJbG9jYWwgaW5wdXQgPSB3aW5kb3c6Z2V0T2JqZWN0KCJpbnB1dCIpCglsb2NhbCBjb250cm9sID0gd2luZG93OmdldE9iamVjdCgiY29udHJvbCIpCglsb2NhbCBkb25lID0gY29udHJvbDpnZXRPYmplY3QoImRvbmUiKQoJZG9uZTpkaXNhYmxlKCkKCWxvY2FsIGFkZHJlc3MgPSB7fQoJbG9jYWwgZnVuY3Rpb24gdXBkYXRlX2FkZHJlc3MobmV3QWRkcmVzcykKCQlhZGRyZXNzID0gbmV3QWRkcmVzcwoJCWZvciBpPTEsIDggZG8KCQkJbG9jYWwgc3ltYm9sID0gYWRkcmVzc1tpXQoJCQlsb2NhbCBkaXNwbGF5ID0gc3ltYm9sczpnZXRPYmplY3QoInMiLi5pKQoJCQlpZiBzeW1ib2wgdGhlbgoJCQkJZGlzcGxheTpzZXRUZXh0KHN0cmluZy5mb3JtYXQoIiUwMmQiLCBzeW1ib2wpKQoJCQllbHNlCgkJCQlkaXNwbGF5OnNldFRleHQoIiIpCgkJCWVuZAoJCWVuZAoJCWlmICNhZGRyZXNzID49IDYgdGhlbgoJCQlkb25lOnNldEJhY2tncm91bmQoY29sb3JzLmdyZWVuKQoJCQlkb25lOmVuYWJsZSgpCgkJZWxzZQoJCQlkb25lOnNldEJhY2tncm91bmQoY29sb3JzLmdyYXkpCgkJCWRvbmU6ZGlzYWJsZSgpCgkJZW5kCgllbmQKCWxvY2FsIGZ1bmN0aW9uIGlucHV0X3N5bWJvbChidXR0b24pCgkJbG9jYWwgc3ltYm9sID0gdG9udW1iZXIoYnV0dG9uOmdldFZhbHVlKCkpCgkJbG9jYWwgbGVuZ3RoID0gI2FkZHJlc3MKCQlpZiBsZW5ndGggPCA4IHRoZW4KCQkJZm9yIGk9MSwgbGVuZ3RoIGRvCgkJCQlpZiBhZGRyZXNzW2ldID09IHN5bWJvbCB0aGVuCgkJCQkJcmV0dXJuCgkJCQllbmQKCQkJZW5kCgkJCWxvY2FsIG5ld0FkZHJlc3MgPSB7IHRhYmxlLnVucGFjayhhZGRyZXNzKSB9CgkJCW5ld0FkZHJlc3NbbGVuZ3RoICsgMV0gPSBzeW1ib2wKCQkJdXBkYXRlX2FkZHJlc3MobmV3QWRkcmVzcykKCQllbmQKCWVuZAoJZm9yIGk9MSwgNDcgZG8KCQlpbnB1dDpnZXRPYmplY3QoInYiLi5pKTpvbkNsaWNrKGlucHV0X3N5bWJvbCkKCWVuZAoJaW5wdXQ6Z2V0T2JqZWN0KCJlcmFzZSIpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCWxvY2FsIGxlbmd0aCA9ICNhZGRyZXNzCgkJaWYgbGVuZ3RoID4gMCB0aGVuCgkJCWxvY2FsIG5ld0FkZHJlc3MgPSB7IHRhYmxlLnVucGFjayhhZGRyZXNzLCAxLCBsZW5ndGggLSAxKSB9CgkJCXVwZGF0ZV9hZGRyZXNzKG5ld0FkZHJlc3MpCgkJZW5kCgllbmQpCglkb25lOm9uQ2xpY2soZnVuY3Rpb24oKQoJCWZ1dHVyZTpjb21wbGV0ZShhZGRyZXNzKQoJZW5kKQoJY29udHJvbDpnZXRPYmplY3QoImJhY2siKTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQlmdXR1cmU6Y29tcGxldGUobmlsKQoJZW5kKQoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQlsb2NhbCBldmVudCA9IGNvbmN1cnJlbnQuZXZlbnQoJ3Bhc3RlJykKCQl3aGlsZSB0cnVlIGRvCgkJCWxvY2FsIHN1YmplY3QsIGRhdGEgPSBjb25jdXJyZW50LnNlbGVjdChmdXR1cmUsIGV2ZW50KQoJCQlpZiBzdWJqZWN0ID09IGZ1dHVyZSB0aGVuCgkJCQlicmVhawoJCQllbmQKCQkJbG9jYWwgbmV3QWRkcmVzcyA9IHsgdGFibGUudW5wYWNrKGFkZHJlc3MpIH0KCQkJbG9jYWwgc3ltYm9scyA9IHt9CgkJCWZvciBfLCBzeW1ib2wgaW4gaXBhaXJzKG5ld0FkZHJlc3MpIGRvCgkJCQlzeW1ib2xzW3N5bWJvbF0gPSB0cnVlCgkJCWVuZAoJCQlmb3IgdmFsdWUgaW4gZGF0YVsyXTpnbWF0Y2goIiVkKyIpIGRvCgkJCQlsb2NhbCBzeW1ib2wgPSBhc3NlcnQodG9udW1iZXIodmFsdWUpKQoJCQkJaWYgc3ltYm9sID4gMCBhbmQgc3ltYm9sIDwgNDggYW5kIG5vdCBzeW1ib2xzW3N5bWJvbF0gdGhlbgoJCQkJCXN5bWJvbHNbc3ltYm9sXSA9IHRydWUKCQkJCQl0YWJsZS5pbnNlcnQobmV3QWRkcmVzcywgc3ltYm9sKQoJCQkJCWlmICNuZXdBZGRyZXNzID49IDggdGhlbgoJCQkJCQlicmVhawoJCQkJCWVuZAoJCQkJZW5kCgkJCWVuZAoJCQl1cGRhdGVfYWRkcmVzcyhuZXdBZGRyZXNzKQoJCWVuZAoJZW5kKQoJdXBkYXRlX2FkZHJlc3MoaW5pdEFkZHJlc3Mgb3Ige30pCmVuZAoKLS0tIEByZXR1cm4gaW50ZWdlcltdCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5hZGRyZXNzKGluaXQpCglyZXR1cm4gb3Blbl9tb2RhbF93aW5kb3coZnVuY3Rpb24gKC4uLikgc2V0dXBfYWRkcmVzcyhpbml0LCAuLi4pIGVuZCkKZW5kCgotLS0gQHBhcmFtIGluaXQ/IHN0cmluZwotLS0gQHJldHVybiBzdHJpbmcKLS0tIEBhc3luYwpmdW5jdGlvbiBsaWJyYXJ5LnRleHQoaW5pdCkKCXJldHVybiBvcGVuX21vZGFsX3dpbmRvdyhmdW5jdGlvbihmcmFtZSwgZnV0dXJlKQoJCWxvY2FsIHdpbmRvdyA9IHNldHVwX2ZyYW1lKGZyYW1lLCA4LCAidGV4dC54bWwiKQoJCWxvY2FsIGlucHV0ID0gd2luZG93OmdldE9iamVjdCgiaW5wdXQiKQoJCWlmIGluaXQgdGhlbgoJCQlpbnB1dDpzZXRWYWx1ZShpbml0KQoJCWVuZAoJCWxvY2FsIGNvbnRyb2wgPSB3aW5kb3c6Z2V0T2JqZWN0KCJjb250cm9sIikKCQljb250cm9sOmdldE9iamVjdCgiZG9uZSIpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCQlsb2NhbCB2YWx1ZSA9IGlucHV0OmdldFZhbHVlKCkKCQkJZnV0dXJlOmNvbXBsZXRlKHZhbHVlKQoJCWVuZCkKCQljb250cm9sOmdldE9iamVjdCgiYmFjayIpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCQlmdXR1cmU6Y29tcGxldGUobmlsKQoJCWVuZCkKCQlpbnB1dDpzZXRGb2N1cygpCgllbmQpCmVuZAoKcmV0dXJuIGxpYnJhcnkK";
  57.     ["ktlo.check"] = base64.decode "bG9jYWwgdHlwZSxzZWxlY3QscmF3Z2V0LHRvc3RyaW5nLGVycm9yLGRlYnVnLHRhYmxlPXR5cGUsc2VsZWN0LHJhd2dldCx0b3N0cmluZyxlcnJvcixkZWJ1Zyx0YWJsZTtsb2NhbCBhPWRlYnVnLmdldG1ldGF0YWJsZTtsb2NhbCBiLGM9dGFibGUuY29uY2F0LHRhYmxlLnJlbW92ZTtsb2NhbCBkPXt9bG9jYWwgZnVuY3Rpb24gZShmLGcpaWYgZ349InRhYmxlImFuZCBnfj0idXNlcmRhdGEidGhlbiByZXR1cm4gZyBlbmQ7bG9jYWwgaD1hKGYpaWYgbm90IGggdGhlbiByZXR1cm4gZyBlbmQ7bG9jYWwgaT1yYXdnZXQoaCwiX19uYW1lIilpZiB0eXBlKGkpPT0ic3RyaW5nInRoZW4gcmV0dXJuIGkgZWxzZSByZXR1cm4gZyBlbmQgZW5kO2xvY2FsIGZ1bmN0aW9uIGooLi4uKWxvY2FsIGs9ey4uLn1mb3IgbD0jaywxLC0xIGRvIGlmIGtbbF09PSJuaWwidGhlbiBjKGssbCllbmQgZW5kO2lmI2s8PTEgdGhlbiByZXR1cm4gdG9zdHJpbmcoLi4uKWVsc2UgcmV0dXJuIGIoaywiLCAiLDEsI2stMSkuLiIgb3IgIi4ua1sja11lbmQgZW5kO2xvY2FsIGZ1bmN0aW9uIG0oZixuLG8paWYgbj09byB0aGVuIHJldHVybiB0cnVlIGVuZDtpZiBufj0idGFibGUiYW5kIG5+PSJ1c2VyZGF0YSJ0aGVuIHJldHVybiBmYWxzZSBlbmQ7bG9jYWwgaD1hKGYpaWYgbm90IGggdGhlbiByZXR1cm4gZmFsc2UgZW5kO2xvY2FsIGk9cmF3Z2V0KGgsIl9fbmFtZSIpaWYgaT09byB0aGVuIHJldHVybiB0cnVlIGVuZDtsb2NhbCBwPWguX19jbGFzc2VzO2lmIG5vdCBwIHRoZW4gcmV0dXJuIGZhbHNlIGVuZDtpZiBwW29ddGhlbiByZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZDtmdW5jdGlvbiBkLmV4cGVjdChxLGYsLi4uKWxvY2FsIG49dHlwZShmKWZvciBsPTEsc2VsZWN0KCIjIiwuLi4pZG8gbG9jYWwgbz1zZWxlY3QobCwuLi4paWYgbShmLG4sbyl0aGVuIHJldHVybiBmIGVuZCBlbmQ7bG9jYWwgZz1lKGYsbilsb2NhbCBpO2xvY2FsIHIscz1wY2FsbChkZWJ1Zy5nZXRpbmZvLDMsIm5TIilpZiByIGFuZCBzLm5hbWUgYW5kIHMubmFtZX49IiJhbmQgcy53aGF0fj0iQyJ0aGVuIGk9cy5uYW1lIGVuZDtsb2NhbCB0PWooLi4uKWlmIGkgdGhlbiBlcnJvcigoImJhZCBhcmd1bWVudCAjJWQgdG8gJyVzJyAoJXMgZXhwZWN0ZWQsIGdvdCAlcykiKTpmb3JtYXQocSxpLHQsZyksMyllbHNlIGVycm9yKCgiYmFkIGFyZ3VtZW50ICMlZCAoJXMgZXhwZWN0ZWQsIGdvdCAlcykiKTpmb3JtYXQocSx0LGcpLDMpZW5kIGVuZDtyZXR1cm4gZAo=";
  58.     ["psg.feedback"] = base64.decode "cmV0dXJue1swXT0ibm9uZSIsWy0xXT0idW5rbm93biIsWzFdPSJzeW1ib2xfZW5jb2RlZCIsWy0yXT0ic3ltYm9sX2luX2FkZHJlc3MiLFstM109InN5bWJvbF9vdXRfb2ZfYm91bmRzIixbLTRdPSJlbmNvZGVfd2hlbl9jb25uZWN0ZWQiLFsyXT0iY29ubmVjdGlvbl9lc3RhYmxpc2hlZC5zeXN0ZW1fd2lkZSIsWzNdPSJjb25uZWN0aW9uX2VzdGFibGlzaGVkLmludGVyc3RlbGxhciIsWzRdPSJjb25uZWN0aW9uX2VzdGFibGlzaGVkLmludGVyZ2FsYWN0aWMiLFstNV09ImluY29tcGxldGVfYWRkcmVzcyIsWy02XT0iaW52YWxpZF9hZGRyZXNzIixbLTddPSJub3RfZW5vdWdoX3Bvd2VyIixbLThdPSJzZWxmX29ic3RydWN0ZWQiLFstOV09InRhcmdldF9vYnN0cnVjdGVkIixbLTEwXT0ic2VsZl9kaWFsIixbLTExXT0ic2FtZV9zeXN0ZW1fZGlhbCIsWy0xMl09ImFscmVhZHlfY29ubmVjdGVkIixbLTEzXT0ibm9fZ2FsYXh5IixbLTE0XT0ibm9fZGltZW5zaW9ucyIsWy0xNV09Im5vX3N0YXJnYXRlcyIsWy0xNl09InRhcmdldF9yZXN0cmljdGVkIixbLTE3XT0iaW52YWxpZF84X2NoZXZyb25fYWRkcmVzcyIsWy0xOF09ImludmFsaWRfc3lzdGVtX3dpZGVfY29ubmVjdGlvbiIsWy0xOV09IndoaXRlbGlzdGVkX3RhcmdldCIsWy0yMF09IndoaXRlbGlzdGVkX3NlbGYiLFstMjFdPSJibGFja2xpc3RlZF90YXJnZXQiLFstMjJdPSJibGFja2xpc3RlZF9zZWxmIixbN109ImNvbm5lY3Rpb25fZW5kZWQuZGlzY29ubmVjdCIsWzhdPSJjb25uZWN0aW9uX2VuZGVkLnBvaW50X29mX29yaWdpbiIsWzldPSJjb25uZWN0aW9uX2VuZGVkLnN0YXJnYXRlX25ldHdvcmsiLFsxMF09ImNvbm5lY3Rpb25fZW5kZWQuYXV0b2Nsb3NlIixbLTIzXT0iZXhjZWVkZWRfY29ubmVjdGlvbl90aW1lIixbLTI0XT0icmFuX291dF9vZl9wb3dlciIsWy0yNV09ImNvbm5lY3Rpb25fcmVyb3V0ZWQiLFstMjZdPSJ3cm9uZ19kaXNjb25uZWN0X3NpZGUiLFstMjddPSJjb25uZWN0aW9uX2Zvcm1pbmciLFstMjhdPSJzdGFyZ2F0ZV9kZXN0cm95ZWQiLFstMjldPSJjb3VsZF9ub3RfcmVhY2hfdGFyZ2V0X3N0YXJnYXRlIixbLTMwXT0iaW50ZXJydXB0ZWRfYnlfaW5jb21pbmdfY29ubmVjdGlvbiIsWzExXT0iY2hldnJvbl9vcGVuZWQiLFsxMl09InJvdGF0aW5nIixbLTMxXT0icm90YXRpb25fYmxvY2tlZCIsWy0zMl09Im5vdF9yb3RhdGluZyIsWzEzXT0icm90YXRpb25fc3RvcHBlZCIsWy0zM109ImNoZXZyb25fYWxyZWFkeV9vcGVuZWQiLFstMzRdPSJjaGV2cm9uX2FscmVhZHlfY2xvc2VkIixbLTM1XT0iY2hldnJvbl9ub3RfcmFpc2VkIixbLTM2XT0iY2Fubm90X2VuY29kZV9wb2ludF9vZl9vcmlnaW4ifQo=";
  59.     ["psg.addressbook"] = base64.decode "bG9jYWwgREVGQVVMVF9MT0NBVElPTiA9ICJmaWxlOmFkZHJlc3Nlcy5jb25mIgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbCBhZGRyZXNzID0gcmVxdWlyZSAncHNnLmFkZHJlc3MnCgpzZXR0aW5ncy5kZWZpbmUoInBzZy5hZGRyZXNzZXNMb2NhdGlvbiIsIHsKCWRlc2NyaXB0aW9uID0gIlN0YXJnYXRlIGFkZHJlc3NlcyBmaWxlIGxvY2F0aW9uIiwKCWRlZmF1bHQgPSBERUZBVUxUX0xPQ0FUSU9OLAoJdHlwZSA9ICJzdHJpbmciLAp9KQoKbG9jYWwgbUxvY2F0aW9uID0gc2V0dGluZ3MuZ2V0KCJwc2cuYWRkcmVzc2VzTG9jYXRpb24iLCBERUZBVUxUX0xPQ0FUSU9OKQoKbG9jYWwgbGlicmFyeSA9IHt9CgpmdW5jdGlvbiBsaWJyYXJ5LmdldF9sb2NhdGlvbigpCglyZXR1cm4gbUxvY2F0aW9uCmVuZAoKbG9jYWwgZnVuY3Rpb24gcmVzb2x2ZV9sb2NhdGlvbl9mcm9tKGxvY2F0aW9uKQoJaWYgbG9jYXRpb246c3ViKDEsIDUpID09ICJmaWxlOiIgdGhlbgoJCXJldHVybiAnZmlsZScsIGxvY2F0aW9uOnN1Yig2KQoJZWxzZWlmIGxvY2F0aW9uOnN1YigxLCA1KSA9PSAiaHR0cDoiIG9yIGxvY2F0aW9uOnN1YigxLCA2KSA9PSAiaHR0cHM6IiB0aGVuCgkJcmV0dXJuICd3ZWInLCBsb2NhdGlvbgoJZWxzZQoJCWVycm9yKCJ1bnN1cHBvcnRlZCBsb2NhdGlvbjogIi4ubG9jYXRpb24pCgllbmQKZW5kCgpmdW5jdGlvbiBsaWJyYXJ5LnNldF9sb2NhdGlvbih2YWx1ZSkKCXJlc29sdmVfbG9jYXRpb25fZnJvbSh2YWx1ZSkKCW1Mb2NhdGlvbiA9IHZhbHVlCglzZXR0aW5ncy5zZXQoInBzZy5hZGRyZXNzZXNMb2NhdGlvbiIsIHZhbHVlKQoJc2V0dGluZ3Muc2F2ZSgpCmVuZAoKbG9jYWwgZnVuY3Rpb24gcmVzb2x2ZV9sb2NhdGlvbigpCglyZXR1cm4gcmVzb2x2ZV9sb2NhdGlvbl9mcm9tKG1Mb2NhdGlvbikKZW5kCgpsb2NhbCBmdW5jdGlvbiB0cmFuc2Zvcm1BZGRyZXNzKG9iamVjdCkKCWlmIG9iamVjdCA9PSBuaWwgdGhlbgoJCXJldHVybiBuaWwKCWVuZAoJaWYgdHlwZShvYmplY3QpID09ICJ0YWJsZSIgdGhlbgoJCXJldHVybiBhZGRyZXNzLmNyZWF0ZSh0YWJsZS51bnBhY2sob2JqZWN0KSkKCWVsc2UKCQlyZXR1cm4gYWRkcmVzcy5wYXJzZShvYmplY3QpCgllbmQKZW5kCgpsb2NhbCBmdW5jdGlvbiB0cmFuc2Zvcm1BZGRyZXNzYm9vayhhZGRyZXNzZXMpCglsb2NhbCBpZGVudGl0eSA9IHt9CglpZiBhZGRyZXNzZXMuaWRlbnRpdHkgdGhlbgoJCWZvciBpLCByZWNvcmQgaW4gaXBhaXJzKGFkZHJlc3Nlcy5pZGVudGl0eSkgZG8KCQkJaWRlbnRpdHlbaV0gPSB7CgkJCQluYW1lID0gcmVjb3JkLm5hbWU7CgkJCQlhZGRyZXNzID0gdHJhbnNmb3JtQWRkcmVzcyhyZWNvcmQuYWRkcmVzcyk7CgkJCX0KCQllbmQKCWVuZAoJbG9jYWwgcG9zaXRpb24gPSB7fQoJaWYgYWRkcmVzc2VzLnBvc2l0aW9uIHRoZW4KCQlmb3IgaSwgcmVjb3JkIGluIGlwYWlycyhhZGRyZXNzZXMucG9zaXRpb24pIGRvCgkJCWxvY2FsIGludGVyc3RlbGxhciA9IHt9CgkJCWlmIHJlY29yZC5pbnRlcnN0ZWxsYXIgdGhlbgoJCQkJZm9yIGdhbGF4eSwgYWRkciBpbiBwYWlycyhyZWNvcmQuaW50ZXJzdGVsbGFyKSBkbwoJCQkJCWludGVyc3RlbGxhcltnYWxheHldID0gdHJhbnNmb3JtQWRkcmVzcyhhZGRyKQoJCQkJZW5kCgkJCWVuZAoJCQlwb3NpdGlvbltpXSA9IHsKCQkJCW5hbWUgPSByZWNvcmQubmFtZTsKCQkJCWtleSA9IHJlY29yZC5rZXk7CgkJCQlpbnRlcnN0ZWxsYXIgPSBpbnRlcnN0ZWxsYXI7CgkJCQlleHRyYWdhbGFjdGljID0gdHJhbnNmb3JtQWRkcmVzcyhyZWNvcmQuZXh0cmFnYWxhY3RpYyk7CgkJCX0KCQllbmQKCWVuZAoJcmV0dXJuIHsKCQlwb3NpdGlvbiA9IHBvc2l0aW9uLAoJCWlkZW50aXR5ID0gaWRlbnRpdHksCgl9CmVuZAoKbGlicmFyeS5yZXNvbHZlX2xvY2F0aW9uID0gcmVzb2x2ZV9sb2NhdGlvbgoKLS0tIEBhc3luYwotLS0gQHJldHVybiBwc2cuYWRkcmVzc2Jvb2s/LCBzdHJpbmc/CmZ1bmN0aW9uIGxpYnJhcnkubG9hZCgpCglsb2NhbCBraW5kLCBsb2NhdGlvbiA9IHJlc29sdmVfbG9jYXRpb24oKQoJbG9jYWwgYWRkcmVzc2VzU3RyaW5nCglpZiBraW5kID09ICdmaWxlJyB0aGVuCgkJbG9jYWwgZmlsZSA9IGFzc2VydChpby5vcGVuKGxvY2F0aW9uKSkKCQlhZGRyZXNzZXNTdHJpbmcgPSBmaWxlOnJlYWQoImEiKQoJCWZpbGU6Y2xvc2UoKQoJZWxzZWlmIGtpbmQgPT0gJ3dlYicgdGhlbgoJCWxvY2FsIGZpbGUgPSBhc3NlcnQoaHR0cC5nZXQobG9jYXRpb24pKQoJCWFkZHJlc3Nlc1N0cmluZyA9IGZpbGUucmVhZEFsbCgpCgkJZmlsZS5jbG9zZSgpCgllbmQKCWxvY2FsIHIsIGVyciA9IHRleHR1dGlscy51bnNlcmlhbGlzZShhZGRyZXNzZXNTdHJpbmcpCglpZiBub3QgciB0aGVuCgkJbG9jYWwgeiwgZXJyMiA9IHRleHR1dGlscy51bnNlcmlhbGlzZUpTT04oYWRkcmVzc2VzU3RyaW5nKQoJCWlmIG5vdCB6IHRoZW4KCQkJcmV0dXJuIG5pbCwgZXJyCgkJZW5kCgkJciA9IHoKCWVuZAoJcmV0dXJuIHRyYW5zZm9ybUFkZHJlc3Nib29rKHIpCmVuZAoKbG9jYWwgZnVuY3Rpb24gdHJhbnNmb3JtQmFja0FkZHJlc3Nib29rKGFkZHJlc3NlcykKCWxvY2FsIHBvc2l0aW9uCglpZiBuZXh0KGFkZHJlc3Nlcy5wb3NpdGlvbikgdGhlbgoJCXBvc2l0aW9uID0ge30KCQlmb3IgaSwgcmVjb3JkIGluIGlwYWlycyhhZGRyZXNzZXMucG9zaXRpb24pIGRvCgkJCWxvY2FsIGludGVyc3RlbGxhcgoJCQlpZiBuZXh0KHJlY29yZC5pbnRlcnN0ZWxsYXIpIHRoZW4KCQkJCWludGVyc3RlbGxhciA9IHt9CgkJCQlmb3IgZ2FsYXh5LCBhZGRyIGluIHBhaXJzKHJlY29yZC5pbnRlcnN0ZWxsYXIpIGRvCgkJCQkJaW50ZXJzdGVsbGFyW2dhbGF4eV0gPSB0b3N0cmluZyhhZGRyKQoJCQkJZW5kCgkJCWVuZAoJCQlwb3NpdGlvbltpXSA9IHsKCQkJCW5hbWUgPSByZWNvcmQubmFtZTsKCQkJCWtleSA9IHJlY29yZC5rZXk7CgkJCQlpbnRlcnN0ZWxsYXIgPSBpbnRlcnN0ZWxsYXI7CgkJCQlleHRyYWdhbGFjdGljID0gcmVjb3JkLmV4dHJhZ2FsYWN0aWMgYW5kIHRvc3RyaW5nKHJlY29yZC5leHRyYWdhbGFjdGljKTsKCQkJfQoJCWVuZAoJZW5kCglsb2NhbCBpZGVudGl0eQoJaWYgbmV4dChhZGRyZXNzZXMuaWRlbnRpdHkpIHRoZW4KCQlpZGVudGl0eSA9IHt9CgkJZm9yIGksIHJlY29yZCBpbiBpcGFpcnMoYWRkcmVzc2VzLmlkZW50aXR5KSBkbwoJCQlpZGVudGl0eVtpXSA9IHsKCQkJCW5hbWUgPSByZWNvcmQubmFtZTsKCQkJCWFkZHJlc3MgPSByZWNvcmQuYWRkcmVzcyBhbmQgdG9zdHJpbmcocmVjb3JkLmFkZHJlc3MpOwoJCQl9CgkJZW5kCgllbmQKCXJldHVybiB7CgkJcG9zaXRpb24gPSBwb3NpdGlvbjsKCQlpZGVudGl0eSA9IGlkZW50aXR5OwoJfQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5zYXZlKGFkZHJlc3NlcykKCWFkZHJlc3NlcyA9IHRyYW5zZm9ybUJhY2tBZGRyZXNzYm9vayhhZGRyZXNzZXMpCglsb2NhbCBraW5kLCBsb2NhdGlvbiA9IHJlc29sdmVfbG9jYXRpb24oKQoJaWYga2luZCA9PSAnZmlsZScgdGhlbgoJCWxvY2FsIGNvbnRlbnQKCQlpZiBsb2NhdGlvbjpzdWIoLTUpID09ICIuanNvbiIgdGhlbgoJCQljb250ZW50ID0gdGV4dHV0aWxzLnNlcmlhbGlzZUpTT04oYWRkcmVzc2VzKQoJCWVsc2UKCQkJY29udGVudCA9IHRleHR1dGlscy5zZXJpYWxpc2UoYWRkcmVzc2VzKQoJCWVuZAoJCWxvY2FsIGZpbGUgPSBhc3NlcnQoaW8ub3Blbihsb2NhdGlvbiwgInciKSkKCQlmaWxlOndyaXRlKGNvbnRlbnQpCgkJZmlsZTp3cml0ZSgnXG4nKQoJCWZpbGU6Y2xvc2UoKQoJCXJldHVybiB0cnVlCgllbHNlaWYga2luZCA9PSAnd2ViJyB0aGVuCgkJcmV0dXJuIGZhbHNlLCAidW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiBzYXZpbmcgdG8gd2ViIGxvY2F0aW9uIgoJZW5kCmVuZAoKcmV0dXJuIGxpYnJhcnkK";
  60.     ["psg.address"] = base64.decode "bG9jYWwgdGFibGUsbWF0aCxzdHJpbmc9dGFibGUsbWF0aCxzdHJpbmc7bG9jYWwgYSxiPXRhYmxlLmNvbmNhdCx0YWJsZS5wYWNrO2xvY2FsIHR5cGUsdG9udW1iZXIsZXJyb3I9dHlwZSx0b251bWJlcixlcnJvcjtsb2NhbCBjPWRlYnVnLmdldG1ldGF0YWJsZTtsb2NhbCBkLGU9c3RyaW5nLnJlcCxzdHJpbmcubWF0Y2g7bG9jYWwgZj17fWxvY2FsIGc9e19fdG9zdHJpbmc9ZnVuY3Rpb24oc2VsZilyZXR1cm4iLSIuLmEoc2VsZiwiLSIpLi4iLSJlbmQsX19lcT1mdW5jdGlvbihzZWxmLGgpbG9jYWwgaT1jKGgpaWYgaS5fX25hbWV+PSdhZGRyZXNzJ3RoZW4gcmV0dXJuIGZhbHNlIGVuZDtsb2NhbCBqPXNlbGYubjtpZiBqfj1oLm4gdGhlbiByZXR1cm4gZmFsc2UgZW5kO2ZvciBrPTEsaiBkbyBpZiBzZWxmW2tdfj1oW2tddGhlbiByZXR1cm4gZmFsc2UgZW5kIGVuZDtyZXR1cm4gdHJ1ZSBlbmQsX19uYW1lPSdhZGRyZXNzJ31sb2NhbCBmdW5jdGlvbiBsKC4uLilsb2NhbCBtPWIoLi4uKWxvY2FsIG49bS5uO2xvY2FsIG87aWYgbj09NiB0aGVuIG89J2ludGVyc3RlbGxhcidlbHNlaWYgbj09NyB0aGVuIG89J2V4dHJhZ2FsYWN0aWMnZWxzZWlmIG49PTggdGhlbiBvPSdzeXN0ZW13aWRlJ2Vsc2UgZXJyb3IoInVuZXhwZWN0ZWQgc3ltYm9sIGNvdW50IGluIGFkZHJlc3MgKDYsIDcsIG9yIDggc3ltYm9scyBleHBlY3RlZCwgZ290ICIuLm4uLiIpIiwyKWVuZDtsb2NhbCBwPXt9Zm9yIGs9MSwjbSBkbyBsb2NhbCBxPXRvbnVtYmVyKG1ba10paWYgdHlwZShxKX49J251bWJlcid0aGVuIGVycm9yKCJlYWNoIHN5bWJvbCBtdXN0IGJlIGFuIGludGVnZXIgbnVtYmVyIiwyKWVuZDtxPW1hdGguZmxvb3IocSlpZiBxPDEgb3IgcT40NyB0aGVuIGVycm9yKCJzeW1ib2wgIyIuLmsuLiIgaXMgb3V0IG9mIGV4cGVjdGVkIHJhbmdlIFsxOzQ3XTogIi4ucSwyKWVuZDtpZiBwW3FddGhlbiBlcnJvcigic3ltYm9sICciLi5xLi4iJyBhcHBlcmVkIHNldmVyYWwgdGltZXMgaW4gYWRkcmVzcyIsMillbmQ7cFtxXT10cnVlO21ba109cSBlbmQ7bS5raW5kPW87cmV0dXJuIHNldG1ldGF0YWJsZShtLGcpZW5kO2xvY2FsIGZ1bmN0aW9uIHIoailyZXR1cm4iXi0iLi5kKCIoJWQrKS0iLGopLi4iJCJlbmQ7bG9jYWwgcz1yKDYpbG9jYWwgdD1yKDcpbG9jYWwgdT1yKDgpbG9jYWwgZnVuY3Rpb24gdiguLi4paWYuLi50aGVuIHJldHVybiBsKC4uLillbmQgZW5kO2xvY2FsIGZ1bmN0aW9uIHcoeCwuLi4pZm9yIGs9MSxzZWxlY3QoJyMnLC4uLilkbyBsb2NhbCB5PXNlbGVjdChrLC4uLilsb2NhbCBtPXYoZSh4LHkpKWlmIG0gdGhlbiByZXR1cm4gbSBlbmQgZW5kO2Vycm9yKCJub3QgYW4gYWRkcmVzcyBzdHJpbmciLDIpZW5kO2xvY2FsIGZ1bmN0aW9uIHooeClyZXR1cm4gdyh4LHMsdCx1KWVuZDtsb2NhbCBmdW5jdGlvbiBBKHgpaWYgeD09J2ludGVyc3RlbGxhcid0aGVuIHJldHVybiA2IGVsc2VpZiB4PT0nZXh0cmFnYWxhY3RpYyd0aGVuIHJldHVybiA3IGVsc2VpZiB4PT0nc3lzdGVtd2lkZSd0aGVuIHJldHVybiA4IGVsc2UgZXJyb3IoInVua25vd24gYWRkcmVzcyB0eXBlOiAiLi54LDIpZW5kIGVuZDtyZXR1cm57Y3JlYXRlPWwscGFyc2U9eixzaXplb2Y9QX0K";
  61. }
  62. local function loader(module)
  63.     if module == 'ktlo.base64' then
  64.         return function() return base64 end
  65.     else
  66.         local text = modules[module]
  67.         if not text then
  68.             return nil, "not embedded in program"
  69.         end
  70.         modules[module] = nil
  71.         return load(text, "@[included]/"..module..".lua", 't', _ENV)
  72.     end
  73. end
  74. table.insert(package.loaders, loader)
  75. _G.RESOURCES = {
  76.     ["psg.xml"] = base64.decode "PGZyYW1lIGlkPSJyb290Ij4KICAgIDxsYWJlbCB4PSIocGFyZW50LncgLSBzZWxmLncpLzIiIHk9InBhcmVudC5oLzIiIHRleHQ9Ik5vIHN0YXJnYXRlIGZvdW5kIi8+CiAgICA8YnV0dG9uIHg9InBhcmVudC53IC0gNiIgeT0icGFyZW50LmggLSAzIiB3aWR0aD0iNiIgdGV4dD0iS2V5cyIgb25DbGljaz0ib3BlblZhdWx0Ii8+CiAgICA8YnV0dG9uIGlkPSJlZGl0QWRkcnNBIiB2aXNpYmxlPSJmYWxzZSIgeD0iMiIgeT0icGFyZW50LmggLSA0IiB3aWR0aD0iNiIgaGVpZ2h0PSIxIiBiZz0ib3JhbmdlIiB0ZXh0PSJFZGl0IiBvbkNsaWNrPSJlZGl0QWRkcmVzc2Jvb2siLz4KICAgIDxsYWJlbCBpZD0idmVyc2lvbiIgeD0iKHBhcmVudC53IC0gc2VsZi53KS8yIiB5PSJwYXJlbnQuaCIgZmc9ImdyYXkiLz4KICAgIDxmcmFtZSBpZD0ibWFpbiIgdmlzaWJsZT0iZmFsc2UiPgogICAgICAgIDxtZW51YmFyIG9uQ2hhbmdlPSJzZWxlY3RGcmFtZSIgd2lkdGg9InBhcmVudC53Ij4KICAgICAgICAgICAgPGl0ZW0gdGV4dD0iQWRkcmVzc2Jvb2siLz4KICAgICAgICAgICAgPGl0ZW0gdGV4dD0iRGlhbCIvPgogICAgICAgICAgICA8aXRlbSB0ZXh0PSJTdGF0cyIvPgogICAgICAgIDwvbWVudWJhcj4KICAgICAgICA8ZnJhbWUgaWQ9ImFkZHJlc3Nib29rIiB5PSIyIiBoZWlnaHQ9InBhcmVudC5oIC0gMSI+CiAgICAgICAgICAgIDxtZW51YmFyIGlkPSJhZGRyZXNzVHlwZSIgeD0iMiIgeT0iMiIgd2lkdGg9InBhcmVudC53IC0gMiIgb25DaGFuZ2U9ImxvYWRBZGRyZXNzZXMiPgogICAgICAgICAgICAgICAgPGl0ZW0gdGV4dD0iU29sYXIiLz4KICAgICAgICAgICAgICAgIDxpdGVtIHRleHQ9IkdhbGFjdGljIi8+CiAgICAgICAgICAgICAgICA8aXRlbSB0ZXh0PSJEaXJlY3QiLz4KICAgICAgICAgICAgPC9tZW51YmFyPgogICAgICAgICAgICA8bGlzdCBpZD0ibGlzdCIgeD0iYWRkcmVzc1R5cGUueCIgeT0iYWRkcmVzc1R5cGUueSArIGFkZHJlc3NUeXBlLmgiIHdpZHRoPSJhZGRyZXNzVHlwZS53IC0gMSIgaGVpZ2h0PSJwYXJlbnQuaCAtIDciLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0idXAiIHg9Imxpc3QueCArIGxpc3QudyIgeT0ibGlzdC55IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB0ZXh0PSIeIiBvbkNsaWNrPSJzY3JvbGxVcCIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJkb3duIiB4PSJsaXN0LnggKyBsaXN0LnciIHk9Imxpc3QueSArIGxpc3QuaCAtIDEiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHRleHQ9Ih8iIG9uQ2xpY2s9InNjcm9sbERvd24iLz4KICAgICAgICAgICAgPHBhbmUgaWQ9InNjcm9sbGVyIiB4PSJ1cC54IiB5PSJ1cC55ICsgdXAuaCIgd2lkdGg9IjEiIGhlaWdodD0iZG93bi55IC0gdXAueSIgYmc9ImJsYWNrIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9ImVkaXRBZGRyc0IiIHZpc2libGU9ImZhbHNlIiB4PSIyIiB5PSJsaXN0LnkgKyBsaXN0LmgiIHdpZHRoPSI2IiBoZWlnaHQ9IjEiIGJnPSJvcmFuZ2UiIHRleHQ9IkVkaXQiIG9uQ2xpY2s9ImVkaXRBZGRyZXNzYm9vayIvPgogICAgICAgICAgICA8Y2hlY2tib3ggaWQ9ImZhc3QiIHg9IjIiIHk9Imxpc3QueSArIGxpc3QuaCArIDIiIGJnPSJjeWFuIiBvbkNoYW5nZT0ib25GYXN0Ii8+CiAgICAgICAgICAgIDxsYWJlbCB4PSJmYXN0LnggKyBmYXN0LncgKyAxIiB5PSJmYXN0LnkiIHRleHQ9IkZhc3QiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZGlhbCIgeD0ibGlzdC54ICsgbGlzdC53IC8gMiAtIHNlbGYudy8yIiB5PSJsaXN0LnkgKyBsaXN0LmggKyAxIiB3aWR0aD0iMTAiIHRleHQ9IkRpYWwiIG9uQ2xpY2s9ImRpYWwiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0idmF1bHQiIHg9ImRpYWwueCArIGRpYWwudyArIDEiIHk9Imxpc3QueSArIGxpc3QuaCArIDEiIHdpZHRoPSI2IiB0ZXh0PSJLZXlzIiBvbkNsaWNrPSJvcGVuVmF1bHQiLz4KICAgICAgICA8L2ZyYW1lPgogICAgICAgIDxmcmFtZSBpZD0iZGhkIiB5PSIyIiBoZWlnaHQ9InBhcmVudC5oIC0gMSIgdmlzaWJsZT0iZmFsc2UiPgogICAgICAgICAgICA8cGFuZSBpZD0iZGlhbFBhbmUiIHg9IjIiIHk9IjIiIHdpZHRoPSJwYXJlbnQudyAtIDIiIGhlaWdodD0iMyIgYmc9ImN5YW4iLz4KICAgICAgICAgICAgPGxhYmVsIGlkPSJuYW1lIiB4PSIocGFyZW50LncgLSBzZWxmLncpLzIiIHk9ImRpYWxQYW5lLnkiIHRleHQ9IiIvPgogICAgICAgICAgICA8bGFiZWwgaWQ9ImRpYWxBZGRyZXNzIiB4PSIocGFyZW50LncgLSBzZWxmLncpLzIiIHk9ImRpYWxQYW5lLnkgKyAxIiB0ZXh0PSIiLz4KICAgICAgICAgICAgPGxhYmVsIGlkPSJidWZmZXJBZGRyZXNzIiB4PSJkaWFsQWRkcmVzcy54ICsgZGlhbEFkZHJlc3MudyIgeT0iZGlhbFBhbmUueSArIDEiIGZnPSJ5ZWxsb3ciIHRleHQ9IiIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzMSIgeD0icGFyZW50LncvMiAtIDExIiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDEiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjEiIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzMiIgeD0icGFyZW50LncvMiAtIDgiIHk9ImRpYWxQYW5lLnkgKyBkaWFsUGFuZS5oICsgMSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMiIgb25DbGljaz0iZW5nYWdlIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InMzIiB4PSJwYXJlbnQudy8yIC0gNSIgeT0iZGlhbFBhbmUueSArIGRpYWxQYW5lLmggKyAxIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIzIiBvbkNsaWNrPSJlbmdhZ2UiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iczQiIHg9InBhcmVudC53LzIgLSAyIiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDEiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjQiIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzNSIgeD0icGFyZW50LncvMiArIDEiIHk9ImRpYWxQYW5lLnkgKyBkaWFsUGFuZS5oICsgMSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iNSIgb25DbGljaz0iZW5nYWdlIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InM2IiB4PSJwYXJlbnQudy8yICsgNCIgeT0iZGlhbFBhbmUueSArIGRpYWxQYW5lLmggKyAxIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSI2IiBvbkNsaWNrPSJlbmdhZ2UiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iczciIHg9InBhcmVudC53LzIgKyA3IiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDEiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjciIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzOCIgeD0icGFyZW50LncvMiArIDEwIiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDEiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjgiIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzOSIgeD0icGFyZW50LncvMiAtIDExIiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDMiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjkiIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzMTAiIHg9InBhcmVudC53LzIgLSA4IiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDMiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjEwIiBvbkNsaWNrPSJlbmdhZ2UiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iczExIiB4PSJwYXJlbnQudy8yIC0gNSIgeT0iZGlhbFBhbmUueSArIGRpYWxQYW5lLmggKyAzIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIxMSIgb25DbGljaz0iZW5nYWdlIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InMxMiIgeD0icGFyZW50LncvMiAtIDIiIHk9ImRpYWxQYW5lLnkgKyBkaWFsUGFuZS5oICsgMyIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMTIiIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzMTMiIHg9InBhcmVudC53LzIgKyAxIiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDMiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjEzIiBvbkNsaWNrPSJlbmdhZ2UiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iczE0IiB4PSJwYXJlbnQudy8yICsgNCIgeT0iZGlhbFBhbmUueSArIGRpYWxQYW5lLmggKyAzIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIxNCIgb25DbGljaz0iZW5nYWdlIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InMxNSIgeD0icGFyZW50LncvMiArIDciIHk9ImRpYWxQYW5lLnkgKyBkaWFsUGFuZS5oICsgMyIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMTUiIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzMTYiIHg9InBhcmVudC53LzIgKyAxMCIgeT0iZGlhbFBhbmUueSArIGRpYWxQYW5lLmggKyAzIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIxNiIgb25DbGljaz0iZW5nYWdlIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InMxNyIgeD0icGFyZW50LncvMiAtIDExIiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDUiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjE3IiBvbkNsaWNrPSJlbmdhZ2UiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iczE4IiB4PSJwYXJlbnQudy8yIC0gOCIgeT0iZGlhbFBhbmUueSArIGRpYWxQYW5lLmggKyA1IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIxOCIgb25DbGljaz0iZW5nYWdlIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InMxOSIgeD0icGFyZW50LncvMiAtIDUiIHk9ImRpYWxQYW5lLnkgKyBkaWFsUGFuZS5oICsgNSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMTkiIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzMjAiIHg9InBhcmVudC53LzIgLSAyIiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDUiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjIwIiBvbkNsaWNrPSJlbmdhZ2UiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iczIxIiB4PSJwYXJlbnQudy8yICsgMSIgeT0iZGlhbFBhbmUueSArIGRpYWxQYW5lLmggKyA1IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIyMSIgb25DbGljaz0iZW5nYWdlIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InMyMiIgeD0icGFyZW50LncvMiArIDQiIHk9ImRpYWxQYW5lLnkgKyBkaWFsUGFuZS5oICsgNSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMjIiIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzMjMiIHg9InBhcmVudC53LzIgKyA3IiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDUiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjIzIiBvbkNsaWNrPSJlbmdhZ2UiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iczI0IiB4PSJwYXJlbnQudy8yICsgMTAiIHk9ImRpYWxQYW5lLnkgKyBkaWFsUGFuZS5oICsgNSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMjQiIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzMjUiIHg9InBhcmVudC53LzIgLSAxMSIgeT0iZGlhbFBhbmUueSArIGRpYWxQYW5lLmggKyA3IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIyNSIgb25DbGljaz0iZW5nYWdlIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InMyNiIgeD0icGFyZW50LncvMiAtIDgiIHk9ImRpYWxQYW5lLnkgKyBkaWFsUGFuZS5oICsgNyIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMjYiIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzMjciIHg9InBhcmVudC53LzIgLSA1IiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDciIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjI3IiBvbkNsaWNrPSJlbmdhZ2UiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iczI4IiB4PSJwYXJlbnQudy8yIC0gMiIgeT0iZGlhbFBhbmUueSArIGRpYWxQYW5lLmggKyA3IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIyOCIgb25DbGljaz0iZW5nYWdlIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InMyOSIgeD0icGFyZW50LncvMiArIDEiIHk9ImRpYWxQYW5lLnkgKyBkaWFsUGFuZS5oICsgNyIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMjkiIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzMzAiIHg9InBhcmVudC53LzIgKyA0IiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDciIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjMwIiBvbkNsaWNrPSJlbmdhZ2UiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iczMxIiB4PSJwYXJlbnQudy8yICsgNyIgeT0iZGlhbFBhbmUueSArIGRpYWxQYW5lLmggKyA3IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIzMSIgb25DbGljaz0iZW5nYWdlIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InMzMiIgeD0icGFyZW50LncvMiArIDEwIiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDciIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjMyIiBvbkNsaWNrPSJlbmdhZ2UiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iczMzIiB4PSJwYXJlbnQudy8yIC0gOCIgeT0iZGlhbFBhbmUueSArIGRpYWxQYW5lLmggKyA5IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIzMyIgb25DbGljaz0iZW5nYWdlIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InMzNCIgeD0icGFyZW50LncvMiAtIDUiIHk9ImRpYWxQYW5lLnkgKyBkaWFsUGFuZS5oICsgOSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMzQiIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzMzUiIHg9InBhcmVudC53LzIgLSAyIiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDkiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjM1IiBvbkNsaWNrPSJlbmdhZ2UiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iczM2IiB4PSJwYXJlbnQudy8yICsgMSIgeT0iZGlhbFBhbmUueSArIGRpYWxQYW5lLmggKyA5IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIzNiIgb25DbGljaz0iZW5nYWdlIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InMzNyIgeD0icGFyZW50LncvMiArIDQiIHk9ImRpYWxQYW5lLnkgKyBkaWFsUGFuZS5oICsgOSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMzciIG9uQ2xpY2s9ImVuZ2FnZSIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJzMzgiIHg9InBhcmVudC53LzIgKyA3IiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDkiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjM4IiBvbkNsaWNrPSJlbmdhZ2UiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0icG9vIiB4PSJwYXJlbnQudy8yIC0gc2VsZi53IiB5PSJkaWFsUGFuZS55ICsgZGlhbFBhbmUuaCArIDExIiB3aWR0aD0iOSIgdGV4dD0iUG9PIiBvbkNsaWNrPSJlbmdhZ2VQb28iLz4KICAgICAgICAgICAgPGJ1dHRvbiB4PSJwYXJlbnQudy8yICsgMSIgeT0iZGlhbFBhbmUueSArIGRpYWxQYW5lLmggKyAxMSIgd2lkdGg9IjkiIHRleHQ9IlJlc2V0IiBvbkNsaWNrPSJyZXNldCIvPgogICAgICAgIDwvZnJhbWU+CiAgICAgICAgPGZyYW1lIGlkPSJzdGF0cyIgeT0iMiIgaGVpZ2h0PSJwYXJlbnQuaCAtIDEiIHZpc2libGU9ImZhbHNlIj4KICAgICAgICAgICAgPG1lbnViYXIgb25DaGFuZ2U9InNlbGVjdFN1YkZyYW1lIiB3aWR0aD0icGFyZW50LnciPgogICAgICAgICAgICAgICAgPGl0ZW0gdGV4dD0iR2VuZXJhbCIvPgogICAgICAgICAgICAgICAgPGl0ZW0gdGV4dD0iRW5lcmd5Ii8+CiAgICAgICAgICAgICAgICA8aXRlbSB0ZXh0PSJTdGF0dXMiLz4KICAgICAgICAgICAgPC9tZW51YmFyPgogICAgICAgICAgICA8ZnJhbWUgaWQ9ImdlbmVyYWwiIHk9IjIiIGhlaWdodD0icGFyZW50LmggLSAxIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0ibG9jYWxBZGRyZXNzTGFiZWwiIHg9IjIiIHk9IjIiIHRleHQ9IkxvY2FsIEFkZHJlc3MiLz4KICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0ibG9jYWxBZGRyZXNzIiB4PSIyIiB5PSJsb2NhbEFkZHJlc3NMYWJlbC55ICsgMSIgd2lkdGg9InBhcmVudC53IC0gMiIgYmc9ImN5YW4iIHRleHQ9Ik4vQSIvPgogICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJnZW5lcmF0aW9uTGFiZWwiIHg9IjIiIHk9ImxvY2FsQWRkcmVzcy55ICsgMiIgdGV4dD0iR2VuZXJhdGlvbiIvPgogICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJnZW5lcmF0aW9uIiB4PSJnZW5lcmF0aW9uTGFiZWwueCArIGdlbmVyYXRpb25MYWJlbC53ICsgMSIgeT0iZ2VuZXJhdGlvbkxhYmVsLnkiIHRleHQ9Ik4vQSIgZmc9ImJsdWUiLz4KICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0idHlwZUxhYmVsIiB4PSIyIiB5PSJnZW5lcmF0aW9uLnkgKyAyIiB0ZXh0PSJUeXBlIi8+CiAgICAgICAgICAgICAgICA8bGFiZWwgaWQ9InR5cGUiIHg9IjIiIHk9InR5cGVMYWJlbC55ICsgMSIgd2lkdGg9InBhcmVudC53IC0gMiIgYmc9ImN5YW4iIHRleHQ9Ik4vQSIvPgogICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJ2YXJpYW50TGFiZWwiIHg9IjIiIHk9InR5cGUueSArIDIiIHRleHQ9IlZhcmlhbnQiLz4KICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0idmFyaWFudCIgeD0iMiIgeT0idmFyaWFudExhYmVsLnkgKyAxIiB3aWR0aD0icGFyZW50LncgLSAyIiBiZz0iY3lhbiIgdGV4dD0iTi9BIi8+CiAgICAgICAgICAgICAgICA8bGFiZWwgaWQ9InJlc0ZlZENvZGVMYWJlbCIgeD0iMiIgeT0idmFyaWFudC55ICsgMiIgdGV4dD0iUmVjZW50IEZlZWRiYWNrIENvZGUiLz4KICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0iZmVlZGJhY2tDb2RlIiB4PSJyZXNGZWRDb2RlTGFiZWwueCArIHJlc0ZlZENvZGVMYWJlbC53ICsgMSIgeT0icmVzRmVkQ29kZUxhYmVsLnkiIHRleHQ9Ik4vQSIgZmc9ImJsdWUiLz4KICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0icmVzRmVkTXNnTGFiZWwiIHg9IjIiIHk9ImZlZWRiYWNrQ29kZS55ICsgMiIgdGV4dD0iUmVjZW50IEZlZWRiYWNrIE1lc3NhZ2UiLz4KICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0iZmVlZGJhY2tNZXNzYWdlIiB4PSIyIiB5PSJyZXNGZWRNc2dMYWJlbC55ICsgMSIgd2lkdGg9InBhcmVudC53IC0gMiIgYmc9ImN5YW4iIHRleHQ9Ik4vQSIvPgogICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJ2ZXJzaW9uIiB4PSIocGFyZW50LncgLSBzZWxmLncpLzIiIHk9InBhcmVudC5oIiBmZz0iZ3JheSIvPgogICAgICAgICAgICA8L2ZyYW1lPgogICAgICAgICAgICA8ZnJhbWUgaWQ9ImVuZXJneSIgeT0iMiIgaGVpZ2h0PSJwYXJlbnQuaCAtIDEiIHZpc2libGU9ImZhbHNlIj4KICAgICAgICAgICAgICAgIDxmcmFtZSBpZD0iaW50ZXJmYWNlIiB4PSIyIiB5PSIyIiB3aWR0aD0icGFyZW50LncgLSAyIiBoZWlnaHQ9IjYiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCB4PSIocGFyZW50LncgLSBzZWxmLncpLzIiIHk9IjEiIHRleHQ9IkludGVyZmFjZSIgZmc9ImdyYXkiLz4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgeT0iMiIgdGV4dD0iRW5lcmd5Ii8+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJlbmVyZ3kiIHg9IjEwIiB5PSIyIiB0ZXh0PSJOL0EiIGZnPSJibHVlIi8+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHk9IjQiIHRleHQ9IkNhcGFjaXR5Ii8+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJjYXBhY2l0eSIgeD0iMTAiIHk9IjQiIHRleHQ9Ik4vQSIgZmc9ImJsdWUiLz4KICAgICAgICAgICAgICAgICAgICA8cHJvZ3Jlc3NiYXIgaWQ9InByb2dyZXNzIiB5PSI2IiB3aWR0aD0icGFyZW50LnciIGJnPSJyZWQiIHByb2dyZXNzQ29sb3I9ImdyZWVuIi8+CiAgICAgICAgICAgICAgICA8L2ZyYW1lPgogICAgICAgICAgICAgICAgPGZyYW1lIGlkPSJzdGFyZ2F0ZSIgeD0iMiIgeT0iOSIgd2lkdGg9InBhcmVudC53IC0gMiIgaGVpZ2h0PSI2Ij4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgeD0iKHBhcmVudC53IC0gc2VsZi53KS8yIiB5PSIxIiB0ZXh0PSJTdGFyZ2F0ZSIgZmc9ImdyYXkiLz4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgeT0iMiIgdGV4dD0iRW5lcmd5Ii8+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJlbmVyZ3kiIHg9IjgiIHk9IjIiIHRleHQ9Ik4vQSIgZmc9ImJsdWUiLz4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgeT0iNCIgdGV4dD0iVGFyZ2V0Ii8+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJ0YXJnZXQiIHg9IjgiIHk9IjQiIHRleHQ9Ik4vQSIgZmc9ImJsdWUiLz4KICAgICAgICAgICAgICAgICAgICA8cHJvZ3Jlc3NiYXIgaWQ9InByb2dyZXNzIiB5PSI2IiB3aWR0aD0icGFyZW50LnciIGJnPSJyZWQiIHByb2dyZXNzQ29sb3I9ImdyZWVuIi8+CiAgICAgICAgICAgICAgICA8L2ZyYW1lPgogICAgICAgICAgICA8L2ZyYW1lPgogICAgICAgICAgICA8ZnJhbWUgaWQ9InN0YXR1cyIgeT0iMiIgaGVpZ2h0PSJwYXJlbnQuaCAtIDEiIHZpc2libGU9ImZhbHNlIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0iaXNDb25uZWN0ZWRMYWJlbCIgeD0iMiIgeT0iMiIgdGV4dD0iQ29ubmVjdGVkIi8+CiAgICAgICAgICAgICAgICA8Y2hlY2tib3ggaWQ9ImlzQ29ubmVjdGVkIiB4PSJpc0Nvbm5lY3RlZExhYmVsLnggKyBpc0Nvbm5lY3RlZExhYmVsLncgKyAxIiB5PSJpc0Nvbm5lY3RlZExhYmVsLnkiIGJnPSJjeWFuIiBlbmFibGVkPSJmYWxzZSIvPgogICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJpc1dvcm1ob2xlTGFiZWwiIHg9ImlzQ29ubmVjdGVkLnggKyBpc0Nvbm5lY3RlZC53ICsgMiIgeT0iaXNDb25uZWN0ZWQueSIgdGV4dD0iV29ybWhvbGUiLz4KICAgICAgICAgICAgICAgIDxjaGVja2JveCBpZD0iaXNXb3JtaG9sZSIgeD0iaXNXb3JtaG9sZUxhYmVsLnggKyBpc1dvcm1ob2xlTGFiZWwudyArIDEiIHk9ImlzV29ybWhvbGVMYWJlbC55IiBiZz0iY3lhbiIgZW5hYmxlZD0iZmFsc2UiLz4KICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0iaXNEaWFsaW5nT3V0TGFiZWwiIHg9IjIiIHk9ImlzV29ybWhvbGVMYWJlbC55ICsgMiIgdGV4dD0iRGlhbGluZyBPdXQiLz4KICAgICAgICAgICAgICAgIDxjaGVja2JveCBpZD0iaXNEaWFsaW5nT3V0IiB4PSJpc0RpYWxpbmdPdXRMYWJlbC54ICsgaXNEaWFsaW5nT3V0TGFiZWwudyArIDEiIHk9ImlzRGlhbGluZ091dExhYmVsLnkiIGJnPSJjeWFuIiBlbmFibGVkPSJmYWxzZSIvPgogICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJvcGVuVGltZUxhYmVsIiB4PSIyIiB5PSJpc0RpYWxpbmdPdXRMYWJlbC55ICsgMiIgdGV4dD0iT3BlbiBUaW1lIi8+CiAgICAgICAgICAgICAgICA8bGFiZWwgaWQ9Im9wZW5UaW1lIiB4PSJvcGVuVGltZUxhYmVsLnggKyBvcGVuVGltZUxhYmVsLncgKyAxIiB5PSJvcGVuVGltZUxhYmVsLnkiIGZnPSJibHVlIiB0ZXh0PSJOL0EiLz4KICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0iY2hldnJvbnNMYWJlbCIgeD0iMiIgeT0ib3BlblRpbWVMYWJlbC55ICsgMiIgdGV4dD0iQ2hldnJvbnMgRW5nYWdlZCIvPgogICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJjaGV2cm9ucyIgeD0iY2hldnJvbnNMYWJlbC54ICsgY2hldnJvbnNMYWJlbC53ICsgMSIgeT0iY2hldnJvbnNMYWJlbC55IiBmZz0iYmx1ZSIgdGV4dD0iTi9BIi8+CiAgICAgICAgICAgICAgICA8bGFiZWwgaWQ9ImNvbm5lY3RlZEFkZHJlc3NMYWJlbCIgeD0iMiIgeT0iY2hldnJvbnNMYWJlbC55ICsgMiIgdGV4dD0iQ29ubmVjdGVkIEFkZHJlc3MiLz4KICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0iY29ubmVjdGVkTmFtZSIgeD0iMiIgeT0iY29ubmVjdGVkQWRkcmVzc0xhYmVsLnkgKyAxIiB3aWR0aD0icGFyZW50LncgIC0gMiIgYmc9ImN5YW4iIHRleHQ9Ik4vQSIvPgogICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJjb25uZWN0ZWRBZGRyZXNzIiB4PSIyIiB5PSJjb25uZWN0ZWROYW1lLnkgKyAxIiB3aWR0aD0icGFyZW50LncgIC0gMiIgYmc9ImN5YW4iIHRleHQ9Ik4vQSIvPgogICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJtZXNzYWdlTGFiZWwiIHg9IihwYXJlbnQudyAtIHNlbGYudykvMiIgeT0iY29ubmVjdGVkQWRkcmVzcy55ICsgMiIgZmc9ImdyYXkiIHRleHQ9Ik1lc3NhZ2UiLz4KICAgICAgICAgICAgICAgIDx0ZXh0ZmllbGQgaWQ9Im1lc3NhZ2UiIHg9IjIiIHk9Im1lc3NhZ2VMYWJlbC55ICsgMSIgd2lkdGg9InBhcmVudC53IC0gMiIgaGVpZ2h0PSIyIi8+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHg9InBhcmVudC53IC0gc2VsZi53IC0gMSIgeT0ibWVzc2FnZS55ICsgbWVzc2FnZS5oIiB3aWR0aD0iNiIgaGVpZ2h0PSIxIiB0ZXh0PSJTZW5kIiBvbkNsaWNrPSJ0ZWxsIi8+CiAgICAgICAgICAgIDwvZnJhbWU+CiAgICAgICAgPC9mcmFtZT4KICAgIDwvZnJhbWU+CjwvZnJhbWU+Cg==";
  77.     ["alert.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciIGJnPSJvcmFuZ2UiPgogICAgPHBhbmUgd2lkdGg9InBhcmVudC53IiBoZWlnaHQ9IjEiIGJnPSJyZWQiIC8+CiAgICA8bGFiZWwgeD0icGFyZW50LncvMi1zZWxmLncvMiIgZmc9IndoaXRlIiB0ZXh0PSJBdHRlbnRpb24hIiAvPgogICAgPGxhYmVsIGlkPSJjb250ZW50IiB4PSIyIiB5PSIzIiB3aWR0aD0icGFyZW50LncgLSAyIiBoZWlnaHQ9InBhcmVudC5oIC0gNyIgZmc9ImJsYWNrIiBiZz0icGluayIgLz4KICAgIDxidXR0b24gaWQ9ImFjY2VwdCIgeD0iMyIgeT0icGFyZW50LmgtMyIgd2lkdGg9IjkiIGJnPSJncmVlbiIgdGV4dD0iIiAvPgogICAgPGJ1dHRvbiBpZD0iY2FuY2VsIiB4PSJwYXJlbnQudyAtIHNlbGYudyAtIDEiIHk9InBhcmVudC5oLTMiIHdpZHRoPSI5IiBiZz0iYmx1ZSIgdGV4dD0iIiAvPgo8L2ZyYW1lPg==";
  78.     ["message.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciIGJnPSJsaW1lIj4KICAgIDxwYW5lIHdpZHRoPSJwYXJlbnQudyIgaGVpZ2h0PSIxIiBiZz0iYmx1ZSIgLz4KICAgIDxsYWJlbCBpZD0idGl0bGUiIHg9IihwYXJlbnQudyAtIHNlbGYudykvMiIgZmc9IndoaXRlIiB0ZXh0PSIiIC8+CiAgICA8YnV0dG9uIGlkPSJjbG9zZSIgeD0icGFyZW50LnciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGJnPSJyZWQiIGZnPSJ3aGl0ZSIgdGV4dD0iWCIgLz4KICAgIDxsYWJlbCBpZD0iY29udGVudCIgeD0iMiIgeT0iMyIgd2lkdGg9InBhcmVudC53IC0gMiIgaGVpZ2h0PSJwYXJlbnQuaCAtIDQiIGJnPSJ3aGl0ZSIKICAgICAgICBmZz0iYmxhY2siIC8+CjwvZnJhbWU+";
  79.     ["passwd.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciIGJnPSJvcmFuZ2UiPgogICAgPHBhbmUgd2lkdGg9InBhcmVudC53IiBoZWlnaHQ9IjEiIGJnPSJyZWQiIC8+CiAgICA8bGFiZWwgeD0icGFyZW50LncvMi1zZWxmLncvMiIgZmc9IndoaXRlIiB0ZXh0PSJJbnB1dCBQYXNzd29yZCIgLz4KICAgIDxpbnB1dCBpZD0icGFzc3dvcmQiIHg9IjIiIHk9IjMiIHdpZHRoPSJwYXJlbnQudyAtIDIiIGJnPSJ3aGl0ZSIgdHlwZT0icGFzc3dvcmQiIC8+CiAgICA8YnV0dG9uIGlkPSJkb25lIiB4PSIzIiB5PSJwYXJlbnQuaC0zIiB3aWR0aD0iOSIgYmc9ImdyZWVuIiB0ZXh0PSJEb25lIiAvPgogICAgPGJ1dHRvbiBpZD0iY2FuY2VsIiB4PSJwYXJlbnQudyAtIHNlbGYudyAtIDEiIHk9InBhcmVudC5oLTMiIHdpZHRoPSI5IiBiZz0iYmx1ZSIgdGV4dD0iQ2FuY2VsIiAvPgo8L2ZyYW1lPg==";
  80.     ["chpass.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciIGJnPSJsaWdodEJsdWUiPgogICAgPHBhbmUgd2lkdGg9InBhcmVudC53IiBoZWlnaHQ9IjEiIGJnPSJibHVlIiAvPgogICAgPGxhYmVsIHg9InBhcmVudC53LzItc2VsZi53LzIiIGZnPSJ3aGl0ZSIgdGV4dD0iQ2hhbmdlIFBhc3N3b3JkIiAvPgogICAgPGxhYmVsIGlkPSJtZXNzYWdlIiB4PSIyIiB5PSIzIiBmZz0icmVkIiB0ZXh0PSIiIC8+CiAgICA8bGFiZWwgeD0iMiIgeT0iNSIgdGV4dD0iTmV3IiAvPgogICAgPGlucHV0IGlkPSJwYXNzd29yZCIgeD0iMTAiIHk9IjUiIHdpZHRoPSJwYXJlbnQudyAtIHNlbGYueCIgYmc9IndoaXRlIiB0eXBlPSJwYXNzd29yZCIgLz4KICAgIDxsYWJlbCB4PSIyIiB5PSI3IiB0ZXh0PSJDb25maXJtIiAvPgogICAgPGlucHV0IGlkPSJjb25maXJtIiB4PSIxMCIgeT0iNyIgd2lkdGg9InBhcmVudC53IC0gc2VsZi54IiBiZz0id2hpdGUiIHR5cGU9InBhc3N3b3JkIiAvPgogICAgPGJ1dHRvbiBpZD0iZG9uZSIgeD0iMyIgeT0icGFyZW50LmgtMyIgd2lkdGg9IjkiIGJnPSJncmVlbiIgdGV4dD0iRG9uZSIgLz4KICAgIDxidXR0b24gaWQ9ImNhbmNlbCIgeD0icGFyZW50LncgLSBzZWxmLncgLSAxIiB5PSJwYXJlbnQuaC0zIiB3aWR0aD0iOSIgYmc9ImN5YW4iIHRleHQ9IkNhbmNlbCIgLz4KPC9mcmFtZT4=";
  81.     ["text.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciIGJnPSJsaWdodEJsdWUiPgogICAgPHBhbmUgd2lkdGg9InBhcmVudC53IiBoZWlnaHQ9IjEiIGJnPSJibHVlIiAvPgogICAgPGxhYmVsIHg9InBhcmVudC53LzItc2VsZi53LzIiIHRleHQ9IklucHV0IFRleHQiIGZnPSJ3aGl0ZSIvPgogICAgPGlucHV0IGlkPSJpbnB1dCIgeD0iMiIgeT0iMyIgd2lkdGg9InBhcmVudC53IC0gMiIgYmc9IndoaXRlIi8+CiAgICA8ZnJhbWUgaWQ9ImNvbnRyb2wiIHg9IihwYXJlbnQudyAtIHNlbGYudykvMiArIDEiIHk9IjUiIHdpZHRoPSIxNyIgaGVpZ2h0PSIzIiBiZz0ibGlnaHRCbHVlIj4KICAgICAgICA8YnV0dG9uIGlkPSJkb25lIiB4PSIxIiB3aWR0aD0iNyIgdGV4dD0iRG9uZSIgYmc9ImdyZWVuIiAvPgogICAgICAgIDxidXR0b24gaWQ9ImJhY2siIHg9IjEwIiB3aWR0aD0iNyIgdGV4dD0iQmFjayIgYmc9InJlZCIgLz4KICAgIDwvZnJhbWU+CjwvZnJhbWU+";
  82.     ["vault.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciPgogICAgPGxhYmVsIGlkPSJob3N0S2V5TGFiZWwiIHg9IjIiIHk9IjIiIHRleHQ9Ik15IGtleToiLz4KICAgIDxsYWJlbCBpZD0iaG9zdEtleSIgeD0iaG9zdEtleUxhYmVsLnggKyBob3N0S2V5TGFiZWwudyArIDEiIHk9IjIiIHdpZHRoPSIxNiIgYmc9ImdyYXkiIGZnPSJ3aGl0ZSIvPgogICAgPGxhYmVsIHg9IjQiIHk9IjMiIHRleHQ9Ik5hbWU6Ii8+CiAgICA8bGFiZWwgaWQ9Imhvc3ROYW1lIiB4PSJob3N0S2V5TGFiZWwueCArIGhvc3RLZXlMYWJlbC53ICsgMSIgeT0iMyIgd2lkdGg9IjE2IiBiZz0iZ3JheSIgZmc9IndoaXRlIi8+CiAgICA8bGlzdCBpZD0ibGlzdCIgeD0iMiIgeT0iaG9zdE5hbWUueSArIDIiIHdpZHRoPSJwYXJlbnQudyAtIDMiIGhlaWdodD0icGFyZW50LmggLSAxMyIvPgogICAgPGJ1dHRvbiBpZD0idXAiIHg9Imxpc3QueCArIGxpc3QudyIgeT0ibGlzdC55IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB0ZXh0PSIeIiBvbkNsaWNrPSJzY3JvbGxVcCIvPgogICAgPGJ1dHRvbiBpZD0iZG93biIgeD0ibGlzdC54ICsgbGlzdC53IiB5PSJsaXN0LnkgKyBsaXN0LmggLSAxIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB0ZXh0PSIfIiBvbkNsaWNrPSJzY3JvbGxEb3duIi8+CiAgICA8cGFuZSBpZD0ic2Nyb2xsZXIiIHg9InVwLngiIHk9InVwLnkgKyB1cC5oIiB3aWR0aD0iMSIgaGVpZ2h0PSJkb3duLnkgLSB1cC55IiBiZz0iYmxhY2siLz4KICAgIDxidXR0b24gaWQ9InJlZ2lzdGVyIiB4PSIyIiB5PSJwYXJlbnQuaCAtIDciIHdpZHRoPSI3IiBiZz0iZ3JlZW4iIHRleHQ9IkFkZCIvPgogICAgPGJ1dHRvbiBpZD0iZm9yZ2V0IiB4PSIxMCIgeT0icGFyZW50LmggLSA3IiB3aWR0aD0iNyIgYmc9InJlZCIgdGV4dD0iRGVsIi8+CiAgICA8YnV0dG9uIGlkPSJwYXNzd29yZCIgeD0iMiIgeT0icGFyZW50LmggLSAzIiB3aWR0aD0iMTQiLz4KICAgIDxidXR0b24gaWQ9ImV4aXQiIHg9InBhcmVudC53IC0gc2VsZi53IiB5PSJwYXJlbnQuaCAtIDMiIHRleHQ9IkJhY2siIHdpZHRoPSI2Ii8+CjwvZnJhbWU+Cg==";
  83.     ["asn.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciPgogICAgPG1lbnViYXIgaWQ9InNlbGVjdExpc3QiIHg9IjIiIHk9IjIiIHdpZHRoPSJwYXJlbnQudyAtIDIiPgogICAgICAgIDxpdGVtIHRleHQ9IlBvc2l0aW9uIi8+CiAgICAgICAgPGl0ZW0gdGV4dD0iSWRlbnRpdHkiLz4KICAgIDwvbWVudWJhcj4KICAgIDxsaXN0IGlkPSJwb3NpdGlvbiIgeD0iMiIgeT0iMyIgd2lkdGg9InBhcmVudC53IC0gMyIgaGVpZ2h0PSJwYXJlbnQuaCAtIDciLz4KICAgIDxsaXN0IGlkPSJpZGVudGl0eSIgeD0iMiIgeT0iMyIgd2lkdGg9InBhcmVudC53IC0gMyIgaGVpZ2h0PSJwYXJlbnQuaCAtIDciIHZpc2libGU9ImZhbHNlIi8+CiAgICA8YnV0dG9uIGlkPSJ1cCIgeD0icGFyZW50LncgLSAxIiB5PSIzIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB0ZXh0PSIeIi8+CiAgICA8YnV0dG9uIGlkPSJkb3duIiB4PSJwYXJlbnQudyAtIDEiIHk9InBhcmVudC5oIC0gNSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdGV4dD0iHyIvPgogICAgPHBhbmUgeD0icGFyZW50LncgLSAxIiB5PSI0IiB3aWR0aD0iMSIgaGVpZ2h0PSJwYXJlbnQuaCAtIDkiIGJnPSJibGFjayIvPgogICAgPGJ1dHRvbiBpZD0ibW92ZVVwIiB4PSJwYXJlbnQudy8yIC0gNyIgeT0icGFyZW50LmggLSA0IiB3aWR0aD0iNiIgaGVpZ2h0PSIxIiBiZz0ib3JhbmdlIiB0ZXh0PSIeIHVwIB4iLz4KICAgIDxidXR0b24gaWQ9Im1vdmVEb3duIiB4PSJwYXJlbnQudy8yICsgMiIgeT0icGFyZW50LmggLSA0IiB3aWR0aD0iNiIgaGVpZ2h0PSIxIiBiZz0iYmx1ZSIgdGV4dD0iH2Rvd24fIi8+CiAgICA8YnV0dG9uIGlkPSJhZGRSZWNvcmQiIHg9IjIiIHk9InBhcmVudC5oIC0gMiIgd2lkdGg9InBhcmVudC53LzMgLSAyIiBoZWlnaHQ9IjEiIGJnPSJncmVlbiIgdGV4dD0iQWRkIi8+CiAgICA8YnV0dG9uIGlkPSJlZGl0UmVjb3JkIiB4PSJwYXJlbnQudy8zICsgMSIgeT0icGFyZW50LmggLSAyIiB3aWR0aD0icGFyZW50LncvMyAtIDIiIGhlaWdodD0iMSIgYmc9InllbGxvdyIgdGV4dD0iRWRpdCIvPgogICAgPGJ1dHRvbiBpZD0iZGVsZXRlUmVjb3JkIiB4PSIyKnBhcmVudC53LzMgKyAxIiB5PSJwYXJlbnQuaCAtIDIiIHdpZHRoPSJwYXJlbnQudy8zIC0gMiIgaGVpZ2h0PSIxIiBiZz0icmVkIiB0ZXh0PSJEZWxldGUiLz4KICAgIDxidXR0b24gaWQ9InNhdmUiIHg9IjEiIHk9InBhcmVudC5oIiB3aWR0aD0icGFyZW50LncvMi41IiBoZWlnaHQ9IjEiIGJnPSJsaW1lIiB0ZXh0PSJTYXZlIi8+CiAgICA8YnV0dG9uIGlkPSJleGl0IiB4PSJwYXJlbnQudyAtIHBhcmVudC53LzIuNSArIDEiIHk9InBhcmVudC5oIiB3aWR0aD0icGFyZW50LncvMi41IiBoZWlnaHQ9IjEiIGJnPSJwaW5rIiB0ZXh0PSJDYW5jZWwiLz4KPC9mcmFtZT4K";
  84.     ["position.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciPgogICAgPGxhYmVsIHg9IjIiIHk9IjIiIHRleHQ9Ik5hbWUiLz4KICAgIDxpbnB1dCBpZD0ibmFtZSIgeD0iOCIgeT0iMiIgd2lkdGg9InBhcmVudC53IC0gOCIvPgogICAgPGxhYmVsIHg9IjIiIHk9IjQiIHRleHQ9IlNvbGFyIHN5c3RlbSBrZXkiLz4KICAgIDxpbnB1dCBpZD0ia2V5IiB4PSIyIiB5PSI1IiB3aWR0aD0icGFyZW50LncgLSAyIi8+CiAgICA8bGFiZWwgeD0iMiIgeT0iNyIgdGV4dD0iRXh0cmFnYWxhY3RpYyBhZGRyZXNzIi8+CiAgICA8aW5wdXQgaWQ9ImV4dHJhZ2FsYWN0aWMiIHg9IjIiIHk9IjgiIHdpZHRoPSJwYXJlbnQudyAtIDIiLz4KICAgIDxsYWJlbCB4PSIyIiB5PSIxMCIgdGV4dD0iSW50ZXJzdGVsbGFyIGFkZHJlc3NlcyIvPgogICAgPGxpc3QgaWQ9Imxpc3QiIHg9IjIiIHk9IjExIiBoZWlnaHQ9InBhcmVudC5oIC0gMTYiIHdpZHRoPSJwYXJlbnQudyAtIDMiLz4KICAgIDxidXR0b24geD0icGFyZW50LncgLSAxIiB5PSIxMSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdGV4dD0iHiIgb25DbGljaz0icGFyZW50U2Nyb2xsVXAiLz4KICAgIDxidXR0b24geD0icGFyZW50LncgLSAxIiB5PSJwYXJlbnQuaCAtIDYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHRleHQ9Ih8iIG9uQ2xpY2s9InBhcmVudFNjcm9sbERvd24iLz4KICAgIDxwYW5lIHg9InBhcmVudC53IC0gMSIgeT0iMTIiIHdpZHRoPSIxIiBoZWlnaHQ9InBhcmVudC5oIC0gMTgiIGJnPSJibGFjayIvPgogICAgPGJ1dHRvbiBpZD0iYWRkIiB4PSIyIiB5PSJwYXJlbnQuaCAtIDUiIHdpZHRoPSJwYXJlbnQudy8zIC0gMiIgaGVpZ2h0PSIxIiBiZz0iZ3JlZW4iIHRleHQ9ImFkZCIvPgogICAgPGJ1dHRvbiBpZD0iZWRpdCIgeD0icGFyZW50LncvMyArIDEiIHk9InBhcmVudC5oIC0gNSIgd2lkdGg9InBhcmVudC53LzMgLSAyIiBoZWlnaHQ9IjEiIGJnPSJ5ZWxsb3ciIHRleHQ9ImVkaXQiLz4KICAgIDxidXR0b24gaWQ9ImRlbGV0ZSIgeD0iMipwYXJlbnQudy8zICsgMSIgeT0icGFyZW50LmggLSA1IiB3aWR0aD0icGFyZW50LncvMyAtIDIiIGhlaWdodD0iMSIgYmc9InJlZCIgdGV4dD0iZGVsZXRlIi8+CiAgICA8YnV0dG9uIGlkPSJzdWJtaXQiIHg9IjIiIHk9InBhcmVudC5oIC0gMyIgd2lkdGg9InBhcmVudC53LzIgLSAyIiBiZz0ibGltZSIgdGV4dD0iU3VibWl0Ii8+CiAgICA8YnV0dG9uIGlkPSJjYW5jZWwiIHg9InBhcmVudC53LzIgKyAxIiB5PSJwYXJlbnQuaCAtIDMiIHdpZHRoPSJwYXJlbnQudy8yIC0gMiIgYmc9InBpbmsiIHRleHQ9IkNhbmNlbCIvPgo8L2ZyYW1lPgo=";
  85.     ["record.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciIGJnPSJsaWdodEJsdWUiPgogICAgPHBhbmUgd2lkdGg9InBhcmVudC53IiBiZz0iYmx1ZSIvPgogICAgPGxhYmVsIHg9IihwYXJlbnQudyAtIHNlbGYudykvMiIgZmc9IndoaXRlIiB0ZXh0PSJBZGRyZXNzIEZvcm0iLz4KICAgIDxsYWJlbCB4PSIyIiB5PSIzIiB0ZXh0PSJOYW1lIi8+CiAgICA8aW5wdXQgaWQ9Im5hbWUiIHg9IjIiIHk9IjQiIGJnPSJjeWFuIiB3aWR0aD0icGFyZW50LncgLSAyIi8+CiAgICA8bGFiZWwgeD0iMiIgeT0iNiIgdGV4dD0iQWRkcmVzcyIvPgogICAgPGlucHV0IGlkPSJhZGRyZXNzIiB4PSIyIiB5PSI3IiBiZz0iY3lhbiIgd2lkdGg9InBhcmVudC53IC0gMiIvPgogICAgPGJ1dHRvbiBpZD0ic3VibWl0IiB4PSIyIiB5PSJwYXJlbnQuaCAtIDMiIHdpZHRoPSJwYXJlbnQudy8yIC0gMiIgYmc9ImxpbWUiIHRleHQ9IlN1Ym1pdCIvPgogICAgPGJ1dHRvbiBpZD0iY2FuY2VsIiB4PSJwYXJlbnQudy8yICsgMSIgeT0icGFyZW50LmggLSAzIiB3aWR0aD0icGFyZW50LncvMiAtIDIiIGJnPSJwaW5rIiB0ZXh0PSJDYW5jZWwiLz4KPC9mcmFtZT4K";
  86. }
  87. local entrypoint = "bG9jYWwgVElNRU9VVCA9IDIKbG9jYWwgQ0hBTk5FTF9FVkVOVCA9IDQ3CmxvY2FsIENIQU5ORUxfQ09NTUFORCA9IDQ2Cgpsb2NhbCB0aGVtZSA9IHsKCUZyYW1lQkcgPSBjb2xvcnMubGlnaHRHcmF5LAoJRnJhbWVGRyA9IGNvbG9ycy5ibGFjaywKCVNlbGVjdGlvblRleHQgPSBjb2xvcnMud2hpdGUsCn0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmxvY2FsIGJhc2FsdCA9IHJlcXVpcmUgJ2Jhc2FsdCcKbG9jYWwgYWRkcmVzc2VzID0gcmVxdWlyZSAncHNnLmFkZHJlc3NlcycKbG9jYWwgYWRkcmVzc2Jvb2sgPSByZXF1aXJlICdwc2cuYWRkcmVzc2Jvb2snCmxvY2FsIGpvYiA9IHJlcXVpcmUgJ2t0bG8uam9iJwpsb2NhbCBycGMgPSByZXF1aXJlICdrdGxvLnJwYycKbG9jYWwga2V5cmluZyA9IHJlcXVpcmUgJ3BzZy5rZXlyaW5nJwpsb2NhbCB2YXVsdCA9IHJlcXVpcmUgJ3BzZy52YXVsdCcKbG9jYWwga2V5cyA9IHJlcXVpcmUgJ3BzZy5rZXlzJwpsb2NhbCBjb25jdXJyZW50ID0gcmVxdWlyZSAna3Rsby5jb25jdXJyZW50Jwpsb2NhbCByZXNvdXJjZXMgPSByZXF1aXJlICdrdGxvLnJlc291cmNlcycKbG9jYWwgY29udGFpbmVyID0gcmVxdWlyZSAna3Rsby5jb250YWluZXInCmxvY2FsIG1vZGFsID0gcmVxdWlyZSAncHNnLm1vZGFsJwpsb2NhbCBmZWVkYmFjayA9IHJlcXVpcmUgJ3BzZy5mZWVkYmFjaycKCmxvY2FsIHZlcnNpb24gPSBWRVJTSU9OIG9yICJkZXYiCgpsb2NhbCBtb2RlbSA9IHBlcmlwaGVyYWwuZmluZCgibW9kZW0iLCBmdW5jdGlvbihfLCBtb2RlbSkgcmV0dXJuIG1vZGVtLmlzV2lyZWxlc3MoKSBlbmQpIG9yIHBlcmlwaGVyYWwuZmluZCgibW9kZW0iKQppZiBub3QgbW9kZW0gdGhlbgoJZXJyb3IgIk5vIG1vZGVtIGZvdW5kOyBleGl0aW5nLi4uIgplbmQKCnNldHRpbmdzLmRlZmluZSgicHNnLmZhc3REaWFsTW9kZSIsIHsKCWRlc2NyaXB0aW9uID0gIkRpYWwgYXMgZmFzdCBhcyBwb3NzaWJsZSIsCglkZWZhdWx0ID0gZmFsc2UsCgl0eXBlID0gImJvb2xlYW4iLAp9KQoKbG9jYWwgZmFzdERpYWxNb2RlSW5pdCA9IHNldHRpbmdzLmdldCgicHNnLmZhc3REaWFsTW9kZSIsIGZhbHNlKQpsb2NhbCBmYXN0RGlhbE1vZGUgPSBmYXN0RGlhbE1vZGVJbml0Cgpsb2NhbCBzdGFyZ2F0ZSA9IHJwYy5jbGllbnRfbmV0d29yayhtb2RlbSwgQ0hBTk5FTF9DT01NQU5ELCBUSU1FT1VUKQoKbG9jYWwgb3RoZXJzaWRlUmVzcG9uc2VzID0gY29uY3VycmVudC5jaGFubmVsKCkKCmxvY2FsIGZ1bmN0aW9uIG90aGVyc2lkZUV4Y2hhbmdlcihyZXF1ZXN0KQoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQlsb2NhbCBtZXNzYWdlID0gdG9zdHJpbmcoY29udGFpbmVyLmRhdHVtKHJlcXVlc3QsIHRydWUpKQoJCXBjYWxsKHN0YXJnYXRlLnRlbGwsIG1lc3NhZ2UpCgllbmQpCgl3aGlsZSB0cnVlIGRvCgkJbG9jYWwgcmVzcG9uc2UgPSBvdGhlcnNpZGVSZXNwb25zZXM6cmVjdigpCgkJaWYgcnBjLmlzX3Jlc3BvbnNlKHJlcXVlc3QsIHJlc3BvbnNlKSB0aGVuCgkJCXJldHVybiByZXNwb25zZQoJCWVuZAoJZW5kCmVuZAoKbG9jYWwgb3RoZXJzaWRlID0gcnBjLmNsaWVudChvdGhlcnNpZGVFeGNoYW5nZXIsIFRJTUVPVVQpCgpiYXNhbHQuc2V0VmFyaWFibGUoImFkZHJlc3NMZW5ndGgiLCAwKQoKbG9jYWwgYWRkcmVzc2VzU3RhdGUgPSBjb25jdXJyZW50LnByb3BlcnR5KGFkZHJlc3Nlcy5jcmVhdGUoYWRkcmVzc2Jvb2subG9hZCgpKSkKCmxvY2FsIHN0YXRzUHJvcGVydHkgPSBjb25jdXJyZW50LnByb3BlcnR5KG5pbCkKCmxvY2FsIG1vZGFsTXV0ZXggPSBjb25jdXJyZW50Lm11dGV4KCkKbG9jYWwgbW9kYWxNdXRleFZhdWx0ID0gY29uY3VycmVudC5tdXRleCgpCgpsb2NhbCBmdW5jdGlvbiBzeW5jaFBhc3N3b3JkQnV0dG9uVGV4dChwYXNzd29yZEJ1dHRvbkVsZW1lbnQpCglsb2NhbCBwYXNzd29yZEJ1dHRvblRleHQKCWlmIHZhdWx0LmlzX2VuY3J5cHRlZCgpIHRoZW4KCQlwYXNzd29yZEJ1dHRvblRleHQgPSAiRGVsIHBhc3N3b3JkIgoJZWxzZQoJCXBhc3N3b3JkQnV0dG9uVGV4dCA9ICJTZXQgcGFzc3dvcmQiCgllbmQKCXBhc3N3b3JkQnV0dG9uRWxlbWVudDpzZXRUZXh0KHBhc3N3b3JkQnV0dG9uVGV4dCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBzZXRIb3N0TmFtZShlbGVtZW50KQoJbG9jYWwgbmFtZSA9IGVsZW1lbnQ6Z2V0VmFsdWUoKQoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQlsb2NhbCBuZXdOYW1lID0gbW9kYWxNdXRleFZhdWx0OndpdGhfbG9jayhtb2RhbC50ZXh0LCBuYW1lKQoJCWlmIG5ld05hbWUgdGhlbgoJCQllbGVtZW50OnNldFRleHQobmV3TmFtZSkKCQkJaWYgbmV3TmFtZSA9PSAiIiB0aGVuCgkJCQluZXdOYW1lID0gbmlsCgkJCWVuZAoJCQl2YXVsdC5zZXRfbmFtZShuZXdOYW1lKQoJCWVuZAoJZW5kKQplbmQKCmxvY2FsIGZ1bmN0aW9uIGdldExvY2FsQWRkcmVzcyhzdGF0cykKCWxvY2FsIGxvY2FsQWRkcmVzcyA9IHN0YXRzLmxvY2FsQWRkcmVzcwoJaWYgbG9jYWxBZGRyZXNzIHRoZW4KCQlyZXR1cm4gbG9jYWxBZGRyZXNzCgllbmQKCWxvY2FsIGFkdmFuY2VkID0gc3RhdHMuYWR2YW5jZWQKCWlmIGFkdmFuY2VkIHRoZW4KCQlyZXR1cm4gYWR2YW5jZWQubG9jYWxBZGRyZXNzCgllbmQKZW5kCgpsb2NhbCBmdW5jdGlvbiB2YXVsdFNldHVwKGZyYW1lLCBmdXR1cmUpCglmcmFtZTphZGRMYXlvdXRGcm9tU3RyaW5nKHJlc291cmNlcy5sb2FkKCJ2YXVsdC54bWwiKSkKCWxvY2FsIHdpbmRvdyA9IGZyYW1lOmdldE9iamVjdCgnd2luZG93JykKCXdpbmRvdzpnZXRPYmplY3QoJ2V4aXQnKTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQlmdXR1cmU6Y29tcGxldGUoKQoJZW5kKQoJbG9jYWwgcGFzc3dvcmRCdXR0b24gPSB3aW5kb3c6Z2V0T2JqZWN0KCdwYXNzd29yZCcpCglzeW5jaFBhc3N3b3JkQnV0dG9uVGV4dChwYXNzd29yZEJ1dHRvbikKCWxvY2FsIGhvc3ROYW1lID0gd2luZG93OmdldE9iamVjdCgnaG9zdE5hbWUnKQoJaG9zdE5hbWU6b25DbGljayhzZXRIb3N0TmFtZSkKCWhvc3ROYW1lOnNldFRleHQodmF1bHQuZ2V0X25hbWUoKSBvciAiIikKCWxvY2FsIGF1dGhLZXlzTGlzdCA9IHdpbmRvdzpnZXRPYmplY3QoJ2xpc3QnKQoJbG9jYWwgZnVuY3Rpb24gYWRkS2V5VG9LZXlyaW5nTGlzdChrZXksIG5hbWUpCgkJbG9jYWwgZmluZ2VycHJpbnQgPSBrZXlzLmZpbmdlcnByaW50KGtleSkKCQlsb2NhbCB0ZXh0CgkJaWYgbmFtZSB0aGVuCgkJCXRleHQgPSBuYW1lLi4nICcuLmZpbmdlcnByaW50CgkJZWxzZQoJCQl0ZXh0ID0gZmluZ2VycHJpbnQKCQllbmQKCQlhdXRoS2V5c0xpc3Q6YWRkSXRlbSh0ZXh0LCBuaWwsIG5pbCwgeyBrZXk9a2V5LCBuYW1lPW5hbWUgfSkKCWVuZAoJbG9jYWwgaG9zdEtleUVsZW1lbnQgPSB3aW5kb3c6Z2V0T2JqZWN0KCdob3N0S2V5JykKCWhvc3RLZXlFbGVtZW50OnNldFRleHQoa2V5cy5maW5nZXJwcmludCh2YXVsdC5wdWJsaWNfa2V5KCkpKQoJbG9jYWwgYXV0aEtleXMgPSBrZXlyaW5nLmdldF9hbGwoKQoJZm9yIF8sIGtleSBpbiBpcGFpcnMoYXV0aEtleXMpIGRvCgkJYWRkS2V5VG9LZXlyaW5nTGlzdChrZXkua2V5LCBrZXkubmFtZSkKCWVuZAoJd2luZG93OmdldE9iamVjdCgncmVnaXN0ZXInKTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQlsb2NhbCBzdGF0cyA9IHN0YXRzUHJvcGVydHkudmFsdWUKCQlpZiBzdGF0cyB0aGVuCgkJCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJCQlsb2NhbCBob3N0S2V5ID0gc3RhcmdhdGUucmVnaXN0ZXIodmF1bHQucHVibGljX2tleSgpLCB2YXVsdC5nZXRfbmFtZSgpKQoJCQkJbG9jYWwgbG9jYWxBZGRyZXNzID0gZ2V0TG9jYWxBZGRyZXNzKHN0YXRzKQoJCQkJbG9jYWwgbmFtZQoJCQkJaWYgbG9jYWxBZGRyZXNzIHRoZW4KCQkJCQluYW1lID0gYWRkcmVzc2VzU3RhdGUudmFsdWU6Z2V0bmFtZShsb2NhbEFkZHJlc3MpCgkJCQllbmQKCQkJCW5hbWUgPSBuYW1lIG9yIGFkZHJlc3Nlc1N0YXRlLnZhbHVlOmdldG5hbWVfYnlfa2V5KHN0YXRzLnNvbGFyU3lzdGVtKQoJCQkJaWYga2V5cmluZy50cnVzdChob3N0S2V5LCBuYW1lKSB0aGVuCgkJCQkJYWRkS2V5VG9LZXlyaW5nTGlzdChob3N0S2V5LCBuYW1lKQoJCQkJZW5kCgkJCWVuZCkKCQllbmQKCWVuZCkKCXdpbmRvdzpnZXRPYmplY3QoJ2ZvcmdldCcpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCWxvY2FsIGkgPSBhdXRoS2V5c0xpc3Q6Z2V0SXRlbUluZGV4KCkKCQlpZiBpIHRoZW4KCQkJbG9jYWwgaXRlbSA9IGF1dGhLZXlzTGlzdDpnZXRJdGVtKGkpCgkJCWtleXJpbmcuZm9yZ2V0KGl0ZW0uYXJnc1sxXS5rZXkpCgkJCWF1dGhLZXlzTGlzdDpyZW1vdmVJdGVtKGkpCgkJZW5kCgllbmQpCglwYXNzd29yZEJ1dHRvbjpvbkNsaWNrKGZ1bmN0aW9uKGJ1dHRvbikKCQlqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCQlpZiB2YXVsdC5pc19lbmNyeXB0ZWQoKSB0aGVuCgkJCQlsb2NhbCBwYXNzd29yZCA9IG1vZGFsTXV0ZXhWYXVsdDp3aXRoX2xvY2sobW9kYWwucGFzc3dkKQoJCQkJaWYgbm90IHBhc3N3b3JkIHRoZW4KCQkJCQlyZXR1cm4KCQkJCWVuZAoJCQkJbG9jYWwgb2ssIHJlYXNvbiA9IHZhdWx0LmRlY3J5cHRfa2V5KHBhc3N3b3JkKQoJCQkJaWYgbm90IG9rIHRoZW4KCQkJCQltb2RhbE11dGV4VmF1bHQ6d2l0aF9sb2NrKG1vZGFsLmFsZXJ0LCB7IkZhaWxlZCB0byBkZWNyeXB0OiIsIHJlYXNvbn0sIG5pbCwgIk9LIikKCQkJCQlyZXR1cm4KCQkJCWVuZAoJCQkJc3luY2hQYXNzd29yZEJ1dHRvblRleHQoYnV0dG9uKQoJCQllbHNlCgkJCQlsb2NhbCBwYXNzd29yZCA9IG1vZGFsTXV0ZXhWYXVsdDp3aXRoX2xvY2sobW9kYWwuY2hwYXNzKQoJCQkJaWYgbm90IHBhc3N3b3JkIHRoZW4KCQkJCQlyZXR1cm4KCQkJCWVuZAoJCQkJdmF1bHQuZW5jcnlwdF9rZXkocGFzc3dvcmQpCgkJCQlzeW5jaFBhc3N3b3JkQnV0dG9uVGV4dChidXR0b24pCgkJCWVuZAoJCWVuZCkKCWVuZCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBzY3JvbGxMaXN0KGxpc3QsIGluY3JlbWVudCkKCWxvY2FsIG9mZnNldCA9IGxpc3Q6Z2V0T2Zmc2V0KCkKCWlmIGluY3JlbWVudCA8IDAgYW5kIG9mZnNldCA8PSAwIHRoZW4KCQlyZXR1cm4KCWVuZAoJaWYgaW5jcmVtZW50ID4gMCBhbmQgb2Zmc2V0ID4gIyhsaXN0OmdldEFsbCgpKSAtIGxpc3Q6Z2V0SGVpZ2h0KCkgdGhlbgoJCXJldHVybgoJZW5kCglsaXN0OnNldE9mZnNldChvZmZzZXQgKyBpbmNyZW1lbnQpCmVuZAoKbG9jYWwgZnVuY3Rpb24gc2Nyb2xsKGJ1dHRvbiwgaW5jcmVtZW50KQoJbG9jYWwgbGlzdCA9IGJ1dHRvbjpnZXRQYXJlbnQoKTpnZXRPYmplY3QoImxpc3QiKQoJc2Nyb2xsTGlzdChsaXN0LCBpbmNyZW1lbnQpCmVuZAoKbG9jYWwgZnVuY3Rpb24gc2Nyb2xsUGFyZW50TGlzdChidXR0b24sIGluY3JlbWVudCkKCWxvY2FsIGxpc3QgPSBidXR0b246Z2V0UGFyZW50KCk6Z2V0T2JqZWN0KCJsaXN0IikKCXNjcm9sbExpc3QobGlzdCwgaW5jcmVtZW50KQplbmQKCmxvY2FsIGZ1bmN0aW9uIHNlbGVjdEZyb20oYmFyLCAuLi4pCglsb2NhbCBpbmRleCA9IGJhcjpnZXRJdGVtSW5kZXgoKQoJZm9yIGk9MSwgc2VsZWN0KCcjJywgLi4uKSBkbwoJCWxvY2FsIHRhYiA9IHNlbGVjdChpLCAuLi4pCgkJaWYgdGFiIHRoZW4KCQkJaWYgaSA9PSBpbmRleCB0aGVuCgkJCQl0YWI6c2hvdygpCgkJCWVsc2UKCQkJCXRhYjpoaWRlKCkKCQkJZW5kCgkJZW5kCgllbmQKCWxvY2FsIHRhYiA9IHNlbGVjdChpbmRleCwgLi4uKQoJcmV0dXJuIHRhYgplbmQKCmxvY2FsIGZ1bmN0aW9uIGFzblNldHVwKGZyYW1lLCBmdXR1cmUpCglsb2NhbCBhZGRyZXNzID0gcmVxdWlyZSAncHNnLmFkZHJlc3MnCglmcmFtZTphZGRMYXlvdXRGcm9tU3RyaW5nKHJlc291cmNlcy5sb2FkKCJhc24ueG1sIikpCglsb2NhbCB3aW5kb3cgPSBmcmFtZTpnZXRPYmplY3QoJ3dpbmRvdycpCgl3aW5kb3c6Z2V0T2JqZWN0KCdleGl0Jyk6b25DbGljayhmdW5jdGlvbigpCgkJZnV0dXJlOmNvbXBsZXRlKG5pbCkKCWVuZCkKCWxvY2FsIHBvc2l0aW9uTGlzdCA9IHdpbmRvdzpnZXRPYmplY3QoJ3Bvc2l0aW9uJykKCWxvY2FsIGlkZW50aXR5TGlzdCA9IHdpbmRvdzpnZXRPYmplY3QoJ2lkZW50aXR5JykKCWxvY2FsIGFjdGl2ZUxpc3QgPSBwb3NpdGlvbkxpc3QKCXdpbmRvdzpnZXRPYmplY3QoJ3NlbGVjdExpc3QnKTpvbkNoYW5nZShmdW5jdGlvbihiYXIpCgkJYWN0aXZlTGlzdCA9IHNlbGVjdEZyb20oCgkJCWJhciwKCQkJcG9zaXRpb25MaXN0LAoJCQlpZGVudGl0eUxpc3QKCQkpCgllbmQpCglsb2NhbCBtb2RhbE11dGV4ID0gY29uY3VycmVudC5tdXRleCgpCglsb2NhbCBtb2RhbE11dGV4UG9zaXRpb24gPSBjb25jdXJyZW50Lm11dGV4KCkKCglsb2NhbCBmdW5jdGlvbiBnZXRJbnB1dE9yTmlsKGlucHV0KQoJCWxvY2FsIHZhbHVlID0gaW5wdXQ6Z2V0VmFsdWUoKQoJCWlmIHZhbHVlID09ICIiIHRoZW4KCQkJcmV0dXJuIG5pbAoJCWVsc2UKCQkJcmV0dXJuIHZhbHVlCgkJZW5kCgllbmQKCWxvY2FsIGZ1bmN0aW9uIGFkZHJlc3NGb3JtKG11dGV4LCByZWNvcmQsIGtpbmQpCgkJcmVjb3JkID0gcmVjb3JkIG9yIHt9CgkJcmV0dXJuIG1vZGFsLm9wZW4oZnVuY3Rpb24oZnJhbWUsIGZ1dHVyZSkKCQkJbG9jYWwgd2lkdGggPSBtYXRoLm1pbigzMCwgZnJhbWU6Z2V0UGFyZW50KCk6Z2V0U2l6ZSgpIC0gMikKCQkJZnJhbWU6c2V0U2l6ZSh3aWR0aCwgMTIpCgkJCWZyYW1lOnNldFBvc2l0aW9uKCIocGFyZW50LncgLSBzZWxmLncpLzIgKyAxIiwgIihwYXJlbnQuaCAtIHNlbGYuaCkvMiIpCgkJCWZyYW1lOmFkZExheW91dEZyb21TdHJpbmcocmVzb3VyY2VzLmxvYWQgInJlY29yZC54bWwiKQoJCQlsb2NhbCB3aW5kb3cgPSBmcmFtZTpnZXRPYmplY3QoIndpbmRvdyIpCgkJCWxvY2FsIG5hbWVJbnB1dCA9IHdpbmRvdzpnZXRPYmplY3QoIm5hbWUiKQoJCQluYW1lSW5wdXQ6c2V0VmFsdWUocmVjb3JkLm5hbWUgb3IgIiIpCgkJCWxvY2FsIGFkZHJlc3NJbnB1dCA9IHdpbmRvdzpnZXRPYmplY3QoImFkZHJlc3MiKQoJCQlhZGRyZXNzSW5wdXQ6c2V0VmFsdWUocmVjb3JkLmFkZHJlc3MgYW5kIHRvc3RyaW5nKHJlY29yZC5hZGRyZXNzKSBvciAiIikKCgkJCXdpbmRvdzpnZXRPYmplY3QoInN1Ym1pdCIpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCQkJbG9jYWwgb2ssIHZhbHVlID0gcGNhbGwoYWRkcmVzcy5wYXJzZSwgYWRkcmVzc0lucHV0OmdldFZhbHVlKCkpCgkJCQlpZiBub3Qgb2sgdGhlbgoJCQkJCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJCQkJCW11dGV4OndpdGhfbG9jayhtb2RhbC5hbGVydCwgIkludmFsaWQgYWRkcmVzczpcbiIuLnZhbHVlLCBuaWwsICJPSyIpCgkJCQkJZW5kKQoJCQkJCXJldHVybgoJCQkJZW5kCgkJCQlpZiB2YWx1ZS5raW5kIH49IGtpbmQgdGhlbgoJCQkJCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJCQkJCW11dGV4OndpdGhfbG9jaygKCQkJCQkJCW1vZGFsLmFsZXJ0LAoJCQkJCQkJIkludmFsaWQgYWRkcmVzczpcbmV4cGVjdGVkICIuLmtpbmQuLiIgKCIuLmFkZHJlc3Muc2l6ZW9mKGtpbmQpLi4iIHN5bWJvbHMpLCBidXQgZ290ICIKCQkJCQkJCS4udmFsdWUua2luZC4uIiAoIi4udmFsdWUubi4uIiBzeW1ib2xzKSIsIG5pbCwgIk9LIgoJCQkJCQkpCgkJCQkJZW5kKQoJCQkJCXJldHVybgoJCQkJZW5kCgkJCQlmdXR1cmU6Y29tcGxldGUgewoJCQkJCW5hbWUgPSBuYW1lSW5wdXQ6Z2V0VmFsdWUoKTsKCQkJCQlhZGRyZXNzID0gdmFsdWU7CgkJCQl9CgkJCWVuZCkKCQkJd2luZG93OmdldE9iamVjdCgiY2FuY2VsIik6b25DbGljayhmdW5jdGlvbigpCgkJCQlmdXR1cmU6Y29tcGxldGUobmlsKQoJCQllbmQpCgkJZW5kKQoJZW5kCgoJbG9jYWwgZnVuY3Rpb24gcG9zaXRpb25Gb3JtKHBvc2l0aW9uKQoJCXBvc2l0aW9uID0gcG9zaXRpb24gb3IgeyBpbnRlcnN0ZWxsYXIgPSB7fSB9CgkJcmV0dXJuIG1vZGFsTXV0ZXg6d2l0aF9sb2NrKG1vZGFsLm9wZW4sIGZ1bmN0aW9uKGZyYW1lLCBmdXR1cmUpCgkJCWxvY2FsIHJlY29yZE11dGV4ID0gY29uY3VycmVudC5tdXRleCgpCgkJCWZyYW1lOmFkZExheW91dEZyb21TdHJpbmcocmVzb3VyY2VzLmxvYWQgInBvc2l0aW9uLnhtbCIpCgkJCWxvY2FsIHdpbmRvdyA9IGZyYW1lOmdldE9iamVjdCgid2luZG93IikKCQkJbG9jYWwgbmFtZUlucHV0ID0gd2luZG93OmdldE9iamVjdCgibmFtZSIpCgkJCW5hbWVJbnB1dDpzZXRWYWx1ZShwb3NpdGlvbi5uYW1lIG9yICIiKQoJCQlsb2NhbCBrZXlJbnB1dCA9IHdpbmRvdzpnZXRPYmplY3QoImtleSIpCgkJCWtleUlucHV0OnNldFZhbHVlKHBvc2l0aW9uLmtleSBvciAiIikKCQkJbG9jYWwgZXh0cmFnYWxhY3RpY0lucHV0ID0gd2luZG93OmdldE9iamVjdCgiZXh0cmFnYWxhY3RpYyIpCgkJCWV4dHJhZ2FsYWN0aWNJbnB1dDpzZXRWYWx1ZShwb3NpdGlvbi5leHRyYWdhbGFjdGljIGFuZCB0b3N0cmluZyhwb3NpdGlvbi5leHRyYWdhbGFjdGljKSBvciAiIikKCQkJbG9jYWwgaW50ZXJzdGVsbGFyTGlzdCA9IHdpbmRvdzpnZXRPYmplY3QoImxpc3QiKQoJCQlsb2NhbCBmdW5jdGlvbiBpbnRlcnN0ZWxsYXJJdGVtKGdhbGF4eSwgYWRkcikKCQkJCXJldHVybiBnYWxheHkuLiIgIi4udG9zdHJpbmcoYWRkciksIG5pbCwgbmlsLCB7IGdhbGF4eSA9IGdhbGF4eSwgYWRkcmVzcyA9IGFkZHIgfQoJCQllbmQKCQkJbG9jYWwgZnVuY3Rpb24gYWRkSW50ZXJzdGVsbGFyKGdhbGF4eSwgYWRkcikKCQkJCWludGVyc3RlbGxhckxpc3Q6YWRkSXRlbShpbnRlcnN0ZWxsYXJJdGVtKGdhbGF4eSwgYWRkcikpCgkJCWVuZAoJCQlmb3IgZ2FsYXh5LCBhZGRyIGluIHBhaXJzKHBvc2l0aW9uLmludGVyc3RlbGxhcikgZG8KCQkJCWFkZEludGVyc3RlbGxhcihnYWxheHksIGFkZHIpCgkJCWVuZAoJCQl3aW5kb3c6Z2V0T2JqZWN0KCJhZGQiKTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQkJCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJCQkJbG9jYWwgcmVjb3JkID0gbW9kYWxNdXRleFBvc2l0aW9uOndpdGhfbG9jayhhZGRyZXNzRm9ybSwgcmVjb3JkTXV0ZXgsIG5pbCwgJ2ludGVyc3RlbGxhcicpCgkJCQkJaWYgcmVjb3JkIHRoZW4KCQkJCQkJYWRkSW50ZXJzdGVsbGFyKHJlY29yZC5uYW1lLCByZWNvcmQuYWRkcmVzcykKCQkJCQllbmQKCQkJCWVuZCkKCQkJZW5kKQoJCQl3aW5kb3c6Z2V0T2JqZWN0KCJlZGl0Iik6b25DbGljayhmdW5jdGlvbigpCgkJCQlsb2NhbCBpbmRleCA9IGludGVyc3RlbGxhckxpc3Q6Z2V0SXRlbUluZGV4KCkKCQkJCWlmIG5vdCBpbmRleCBvciBpbmRleCA8PSAwIHRoZW4KCQkJCQlyZXR1cm4KCQkJCWVuZAoJCQkJbG9jYWwgaXRlbSA9IGludGVyc3RlbGxhckxpc3Q6Z2V0SXRlbShpbmRleCkKCQkJCWxvY2FsIHJlY29yZCA9IGl0ZW0uYXJnc1sxXQoJCQkJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQkJCQlsb2NhbCBuZXdSZWNvcmQgPSBtb2RhbE11dGV4UG9zaXRpb246d2l0aF9sb2NrKAoJCQkJCQlhZGRyZXNzRm9ybSwgcmVjb3JkTXV0ZXgsIHtuYW1lID0gcmVjb3JkLmdhbGF4eSwgYWRkcmVzcyA9IHJlY29yZC5hZGRyZXNzfSwgJ2ludGVyc3RlbGxhcicKCQkJCQkpCgkJCQkJaWYgbmV3UmVjb3JkIHRoZW4KCQkJCQkJaW50ZXJzdGVsbGFyTGlzdDplZGl0SXRlbShpbmRleCwgaW50ZXJzdGVsbGFySXRlbShuZXdSZWNvcmQubmFtZSwgbmV3UmVjb3JkLmFkZHJlc3MpKQoJCQkJCWVuZAoJCQkJZW5kKQoJCQllbmQpCgkJCXdpbmRvdzpnZXRPYmplY3QoImRlbGV0ZSIpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCQkJbG9jYWwgaW5kZXggPSBpbnRlcnN0ZWxsYXJMaXN0OmdldEl0ZW1JbmRleCgpCgkJCQlpZiBub3QgaW5kZXggb3IgaW5kZXggPD0gMCB0aGVuCgkJCQkJcmV0dXJuCgkJCQllbmQKCQkJCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJCQkJbG9jYWwgaXNTdXJlID0gbW9kYWxNdXRleFBvc2l0aW9uOndpdGhfbG9jayhtb2RhbC5hbGVydCwgIkFyZSB5b3Ugc3VyZT8iLCAiWWVzIiwgIk5vIikKCQkJCQlpZiBpc1N1cmUgdGhlbgoJCQkJCQlpbnRlcnN0ZWxsYXJMaXN0OnJlbW92ZUl0ZW0oaW5kZXgpCgkJCQkJZW5kCgkJCQllbmQpCgkJCWVuZCkKCgkJCXdpbmRvdzpnZXRPYmplY3QoInN1Ym1pdCIpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCQkJbG9jYWwgZXh0cmFnYWxhY3RpYyA9IGdldElucHV0T3JOaWwoZXh0cmFnYWxhY3RpY0lucHV0KQoJCQkJaWYgZXh0cmFnYWxhY3RpYyB0aGVuCgkJCQkJbG9jYWwgb2ssIHZhbHVlID0gcGNhbGwoYWRkcmVzcy5wYXJzZSwgZXh0cmFnYWxhY3RpYykKCQkJCQlpZiBub3Qgb2sgdGhlbgoJCQkJCQlqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCQkJCQkJbW9kYWxNdXRleFBvc2l0aW9uOndpdGhfbG9jaygKCQkJCQkJCQltb2RhbC5hbGVydCwKCQkJCQkJCQkiSW52YWxpZCBleHRyYWdhbGFjdGljIGFkZHJlc3M6XG4iLi52YWx1ZSwgbmlsLCAiT0siCgkJCQkJCQkpCgkJCQkJCWVuZCkKCQkJCQkJcmV0dXJuCgkJCQkJZW5kCgkJCQkJaWYgdmFsdWUua2luZCB+PSAnZXh0cmFnYWxhY3RpYycgdGhlbgoJCQkJCQlqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCQkJCQkJbW9kYWxNdXRleFBvc2l0aW9uOndpdGhfbG9jaygKCQkJCQkJCQltb2RhbC5hbGVydCwKCQkJCQkJCQkiSW52YWxpZCBleHRyYWdhbGFjdGljIGFkZHJlc3M6XG5leHBlY3RlZCBleHRyYWdhbGFjdGljIGFkZHJlc3MgKDcgc3ltYm9scyksIGJ1dCBnb3QgIgoJCQkJCQkJCS4udmFsdWUua2luZC4uIiAoIi4udmFsdWUubi4uIiBzeW1ib2xzKSIsIG5pbCwgIk9LIgoJCQkJCQkJKQoJCQkJCQllbmQpCgkJCQkJCXJldHVybgoJCQkJCWVuZAoJCQkJCWV4dHJhZ2FsYWN0aWMgPSB2YWx1ZQoJCQkJZW5kCgkJCQlsb2NhbCBpbnRlcnN0ZWxsYXIgPSB7fQoJCQkJbG9jYWwgY291bnQgPSBpbnRlcnN0ZWxsYXJMaXN0OmdldEl0ZW1Db3VudCgpCgkJCQlmb3IgaT0xLCBjb3VudCBkbwoJCQkJCWxvY2FsIGl0ZW0gPSBpbnRlcnN0ZWxsYXJMaXN0OmdldEl0ZW0oaSkKCQkJCQlsb2NhbCByZWNvcmQgPSBpdGVtLmFyZ3NbMV0KCQkJCQlpbnRlcnN0ZWxsYXJbcmVjb3JkLmdhbGF4eV0gPSByZWNvcmQuYWRkcmVzcwoJCQkJZW5kCgkJCQlmdXR1cmU6Y29tcGxldGUgewoJCQkJCW5hbWUgPSBnZXRJbnB1dE9yTmlsKG5hbWVJbnB1dCk7CgkJCQkJa2V5ID0gZ2V0SW5wdXRPck5pbChrZXlJbnB1dCk7CgkJCQkJaW50ZXJzdGVsbGFyID0gaW50ZXJzdGVsbGFyOwoJCQkJCWV4dHJhZ2FsYWN0aWMgPSBleHRyYWdhbGFjdGljOwoJCQkJfQoJCQllbmQpCgkJCXdpbmRvdzpnZXRPYmplY3QoImNhbmNlbCIpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCQkJZnV0dXJlOmNvbXBsZXRlKG5pbCkKCQkJZW5kKQoJCWVuZCkKCWVuZAoJbG9jYWwgZnVuY3Rpb24gbGlzdEl0ZW0ocmVjb3JkKQoJCXJldHVybiByZWNvcmQubmFtZSBvciByZWNvcmQua2V5IG9yICI/Pz8iLCBuaWwsIG5pbCwgcmVjb3JkCgllbmQKCXdpbmRvdzpnZXRPYmplY3QoJ2FkZFJlY29yZCcpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJCWxvY2FsIHJlY29yZAoJCQlpZiBhY3RpdmVMaXN0ID09IHBvc2l0aW9uTGlzdCB0aGVuCgkJCQlyZWNvcmQgPSBwb3NpdGlvbkZvcm0obmlsKQoJCQllbHNlCgkJCQlyZWNvcmQgPSBtb2RhbE11dGV4OndpdGhfbG9jayhhZGRyZXNzRm9ybSwgbW9kYWxNdXRleFBvc2l0aW9uLCBuaWwsICdzeXN0ZW13aWRlJykKCQkJZW5kCgkJCWlmIHJlY29yZCB0aGVuCgkJCQlhY3RpdmVMaXN0OmFkZEl0ZW0obGlzdEl0ZW0ocmVjb3JkKSkKCQkJZW5kCgkJZW5kKQoJZW5kKQoJd2luZG93OmdldE9iamVjdCgnZWRpdFJlY29yZCcpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCWxvY2FsIGluZGV4ID0gYWN0aXZlTGlzdDpnZXRJdGVtSW5kZXgoKQoJCWlmIG5vdCBpbmRleCBvciBpbmRleCA8PSAwIHRoZW4KCQkJcmV0dXJuCgkJZW5kCgkJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQkJbG9jYWwgcmVjb3JkID0gYWN0aXZlTGlzdDpnZXRJdGVtKGluZGV4KS5hcmdzWzFdCgkJCWlmIGFjdGl2ZUxpc3QgPT0gcG9zaXRpb25MaXN0IHRoZW4KCQkJCXJlY29yZCA9IHBvc2l0aW9uRm9ybShyZWNvcmQpCgkJCWVsc2UKCQkJCXJlY29yZCA9IG1vZGFsTXV0ZXg6d2l0aF9sb2NrKGFkZHJlc3NGb3JtLCBtb2RhbE11dGV4UG9zaXRpb24sIHJlY29yZCwgJ3N5c3RlbXdpZGUnKQoJCQllbmQKCQkJaWYgcmVjb3JkIHRoZW4KCQkJCWFjdGl2ZUxpc3Q6ZWRpdEl0ZW0oaW5kZXgsIGxpc3RJdGVtKHJlY29yZCkpCgkJCWVuZAoJCWVuZCkKCWVuZCkKCXdpbmRvdzpnZXRPYmplY3QoJ2RlbGV0ZVJlY29yZCcpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCWxvY2FsIGluZGV4ID0gYWN0aXZlTGlzdDpnZXRJdGVtSW5kZXgoKQoJCWlmIG5vdCBpbmRleCBvciBpbmRleCA8PSAwIHRoZW4KCQkJcmV0dXJuCgkJZW5kCgkJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQkJbG9jYWwgaXNTdXJlID0gbW9kYWxNdXRleDp3aXRoX2xvY2sobW9kYWwuYWxlcnQsICJBcmUgeW91IHN1cmU/IiwgIlllcyIsICJObyIpCgkJCWlmIGlzU3VyZSB0aGVuCgkJCQlhY3RpdmVMaXN0OnJlbW92ZUl0ZW0oaW5kZXgpCgkJCWVuZAoJCWVuZCkKCWVuZCkKCWxvY2FsIGZ1bmN0aW9uIGVkaXRMaXN0SXRlbShsaXN0LCBpbmRleCwgaXRlbSkKCQlsaXN0OmVkaXRJdGVtKGluZGV4LCBpdGVtLnRleHQsIGl0ZW0uYmdDb2wsIGl0ZW0uZmdDb2wsIHRhYmxlLnVucGFjayhpdGVtLmFyZ3MpKQoJZW5kCglsb2NhbCBmdW5jdGlvbiBzd2FwTGlzdEl0ZW1zKGxpc3QsIGEsIGIpCgkJbG9jYWwgYUl0ZW0gPSBsaXN0OmdldEl0ZW0oYSkKCQlsb2NhbCBiSXRlbSA9IGxpc3Q6Z2V0SXRlbShiKQoJCWVkaXRMaXN0SXRlbShsaXN0LCBhLCBiSXRlbSkKCQllZGl0TGlzdEl0ZW0obGlzdCwgYiwgYUl0ZW0pCgllbmQKCXdpbmRvdzpnZXRPYmplY3QoJ21vdmVVcCcpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCWxvY2FsIGluZGV4ID0gYWN0aXZlTGlzdDpnZXRJdGVtSW5kZXgoKQoJCWlmIG5vdCBpbmRleCBvciBpbmRleCA8PSAwIHRoZW4KCQkJcmV0dXJuCgkJZW5kCgkJaWYgaW5kZXggPT0gMSB0aGVuCgkJCXJldHVybgoJCWVuZAoJCXN3YXBMaXN0SXRlbXMoYWN0aXZlTGlzdCwgaW5kZXggLSAxLCBpbmRleCkKCQlhY3RpdmVMaXN0OnNlbGVjdEl0ZW0oaW5kZXggLSAxKQoJZW5kKQoJd2luZG93OmdldE9iamVjdCgnbW92ZURvd24nKTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQlsb2NhbCBpbmRleCA9IGFjdGl2ZUxpc3Q6Z2V0SXRlbUluZGV4KCkKCQlpZiBub3QgaW5kZXggb3IgaW5kZXggPD0gMCB0aGVuCgkJCXJldHVybgoJCWVuZAoJCWlmIGluZGV4ID09IGFjdGl2ZUxpc3Q6Z2V0SXRlbUNvdW50KCkgdGhlbgoJCQlyZXR1cm4KCQllbmQKCQlzd2FwTGlzdEl0ZW1zKGFjdGl2ZUxpc3QsIGluZGV4LCBpbmRleCArIDEpCgkJYWN0aXZlTGlzdDpzZWxlY3RJdGVtKGluZGV4ICsgMSkKCWVuZCkKCXdpbmRvdzpnZXRPYmplY3QoJ3VwJyk6b25DbGljayhmdW5jdGlvbigpCgkJc2Nyb2xsTGlzdChhY3RpdmVMaXN0LCAtMSkKCWVuZCkKCXdpbmRvdzpnZXRPYmplY3QoJ2Rvd24nKTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQlzY3JvbGxMaXN0KGFjdGl2ZUxpc3QsIDEpCgllbmQpCglsb2NhbCBmdW5jdGlvbiB0cmFuc2Zvcm1MaXN0KGxpc3QpCgkJbG9jYWwgcmVzdWx0ID0ge30KCQlmb3IgaSwgaXRlbSBpbiBpcGFpcnMobGlzdDpnZXRBbGwoKSkgZG8KCQkJcmVzdWx0W2ldID0gaXRlbS5hcmdzWzFdCgkJZW5kCgkJcmV0dXJuIHJlc3VsdAoJZW5kCgl3aW5kb3c6Z2V0T2JqZWN0KCdzYXZlJyk6b25DbGljayhmdW5jdGlvbigpCgkJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQkJbG9jYWwgb2ssIGVyciA9IHBjYWxsKGZ1bmN0aW9uKCkKCQkJCWxvY2FsIHJlc3VsdCA9IHsKCQkJCQlwb3NpdGlvbiA9IHRyYW5zZm9ybUxpc3QocG9zaXRpb25MaXN0KTsKCQkJCQlpZGVudGl0eSA9IHRyYW5zZm9ybUxpc3QoaWRlbnRpdHlMaXN0KTsKCQkJCX0KCQkJCWFkZHJlc3Nib29rLnNhdmUocmVzdWx0KQoJCQkJcmV0dXJuIHJlc3VsdAoJCQllbmQpCgkJCWlmIG5vdCBvayB0aGVuCgkJCQltb2RhbE11dGV4OndpdGhfbG9jayhtb2RhbC5hbGVydCwgIlNhdmluZyBmYWlsZWQ6XG4iLi5lcnIsIG5pbCwgIk9LIikKCQkJZWxzZQoJCQkJZnV0dXJlOmNvbXBsZXRlKGVycikKCQkJZW5kCgkJZW5kKQoJZW5kKQoJZG8KCQlsb2NhbCBhZGRyZXNzZXNWYWwgPSBhZGRyZXNzZXNTdGF0ZS52YWx1ZS5hZGRyZXNzYm9vawoJCWZvciBfLCByZWNvcmQgaW4gaXBhaXJzKGFkZHJlc3Nlc1ZhbC5wb3NpdGlvbikgZG8KCQkJcG9zaXRpb25MaXN0OmFkZEl0ZW0obGlzdEl0ZW0ocmVjb3JkKSkKCQllbmQKCQlmb3IgXywgcmVjb3JkIGluIGlwYWlycyhhZGRyZXNzZXNWYWwuaWRlbnRpdHkpIGRvCgkJCWlkZW50aXR5TGlzdDphZGRJdGVtKGxpc3RJdGVtKHJlY29yZCkpCgkJZW5kCgllbmQKZW5kCgpsb2NhbCBhZGRyZXNzZXNUeXBlTWVudWJhcgpsb2NhbCBhZGRyZXNzZXNMaXN0Cgpsb2NhbCBjdXJyZW50QWRkcmVzc2VzID0ge30KCmxvY2FsIGZ1bmN0aW9uIGRvbShwYXRoKQoJbG9jYWwgY3VycmVudCA9IGJhc2FsdC5nZXRBY3RpdmVGcmFtZSgpCglmb3IgXywgc2VnbWVudCBpbiBpcGFpcnMocGF0aCkgZG8KCQljdXJyZW50ID0gY3VycmVudDpnZXRPYmplY3Qoc2VnbWVudCkKCWVuZAoJcmV0dXJuIGN1cnJlbnQKZW5kCgpsb2NhbCBmdW5jdGlvbiBsb2FkQWRkcmVzc2VzKCkKCWxvY2FsIHN0YXRzID0gc3RhdHNQcm9wZXJ0eS52YWx1ZQoJaWYgc3RhdHMgdGhlbgoJCWxvY2FsIGluZGV4ID0gYWRkcmVzc2VzVHlwZU1lbnViYXI6Z2V0SXRlbUluZGV4KCkKCQlsb2NhbCBuZXdBZGRyZXNzZXMKCQlsb2NhbCBhZGRyZXNzZXNWYWwgPSBhZGRyZXNzZXNTdGF0ZS52YWx1ZQoJCWlmIGluZGV4ID09IDEgdGhlbiAtLSBpbnRlcnN0ZWxsYXIKCQkJbmV3QWRkcmVzc2VzID0gYWRkcmVzc2VzVmFsOmludGVyc3RlbGxhcihzdGF0cy5nYWxheGllcywgc3RhdHMuc29sYXJTeXN0ZW0pCgkJZWxzZWlmIGluZGV4ID09IDIgdGhlbiAtLSBleHRyYWdhbGFjdGljCgkJCW5ld0FkZHJlc3NlcyA9IGFkZHJlc3Nlc1ZhbDpleHRyYWdhbGFjdGljKHN0YXRzLmdhbGF4aWVzKQoJCWVsc2UgLS0gZGlyZWN0CgkJCW5ld0FkZHJlc3NlcyA9IGFkZHJlc3Nlc1ZhbDpkaXJlY3QoKHN0YXRzLmFkdmFuY2VkIG9yIHt9KS5sb2NhbEFkZHJlc3MpCgkJZW5kCgkJY3VycmVudEFkZHJlc3NlcyA9IG5ld0FkZHJlc3NlcwoJCWFkZHJlc3Nlc0xpc3Q6Y2xlYXIoKQoJCWFkZHJlc3Nlc0xpc3Q6c2V0T2Zmc2V0KDApCgkJZm9yIF8sIHJlY29yZCBpbiBpcGFpcnMoY3VycmVudEFkZHJlc3NlcykgZG8KCQkJYWRkcmVzc2VzTGlzdDphZGRJdGVtKHJlY29yZC5uYW1lKQoJCWVuZAoJZW5kCmVuZAoKYmFzYWx0LnNldFZhcmlhYmxlKCJsb2FkQWRkcmVzc2VzIiwgbG9hZEFkZHJlc3NlcykKCmxvY2FsIGZ1bmN0aW9uIHNlbGVjdEZyYW1lKHNlbGYpCglsb2NhbCBpbmRleCA9IHNlbGY6Z2V0SXRlbUluZGV4KCkKCWxvY2FsIHRhYnMgPSB7CgkJZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdhZGRyZXNzYm9vaycgfSwKCQlkb20geyAncm9vdCcsICdtYWluJywgJ2RoZCcgfSwKCQlkb20geyAncm9vdCcsICdtYWluJywgJ3N0YXRzJyB9LAoJfQoJZm9yIGksIHRhYiBpbiBpcGFpcnModGFicykgZG8KCQlpZiBpID09IGluZGV4IHRoZW4KCQkJdGFiOnNob3coKQoJCWVsc2UKCQkJdGFiOmhpZGUoKQoJCWVuZAoJZW5kCmVuZAoKYmFzYWx0LnNldFZhcmlhYmxlKCJzZWxlY3RGcmFtZSIsIHNlbGVjdEZyYW1lKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJzZWxlY3RTdWJGcmFtZSIsIGZ1bmN0aW9uKHNlbGYpCglsb2NhbCBpbmRleCA9IHNlbGY6Z2V0SXRlbUluZGV4KCkKCWxvY2FsIHRhYnMgPSB7CgkJZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdzdGF0cycsICdnZW5lcmFsJyB9LAoJCWRvbSB7ICdyb290JywgJ21haW4nLCAnc3RhdHMnLCAnZW5lcmd5JyB9LAoJCWRvbSB7ICdyb290JywgJ21haW4nLCAnc3RhdHMnLCAnc3RhdHVzJyB9LAoJfQoJZm9yIGksIHRhYiBpbiBpcGFpcnModGFicykgZG8KCQlpZiBpID09IGluZGV4IHRoZW4KCQkJdGFiOnNob3coKQoJCWVsc2UKCQkJdGFiOmhpZGUoKQoJCWVuZAoJZW5kCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgic2Nyb2xsVXAiLCBmdW5jdGlvbihidXR0b24pCglzY3JvbGwoYnV0dG9uLCAtMSkKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJzY3JvbGxEb3duIiwgZnVuY3Rpb24oYnV0dG9uKQoJc2Nyb2xsKGJ1dHRvbiwgMSkKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJwYXJlbnRTY3JvbGxVcCIsIGZ1bmN0aW9uKGJ1dHRvbikKCXNjcm9sbFBhcmVudExpc3QoYnV0dG9uLCAtMSkKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJwYXJlbnRTY3JvbGxEb3duIiwgZnVuY3Rpb24oYnV0dG9uKQoJc2Nyb2xsUGFyZW50TGlzdChidXR0b24sIDEpCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgib25GYXN0IiwgZnVuY3Rpb24oZWxlbWVudCkKCWZhc3REaWFsTW9kZSA9IGVsZW1lbnQ6Z2V0VmFsdWUoKQoJc2V0dGluZ3Muc2V0KCJwc2cuZmFzdERpYWxNb2RlIiwgZmFzdERpYWxNb2RlKQoJc2V0dGluZ3Muc2F2ZSgpCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgiZGlhbCIsIGZ1bmN0aW9uKCkKCWxvY2FsIHN0YXRzID0gc3RhdHNQcm9wZXJ0eS52YWx1ZQoJaWYgc3RhdHMgdGhlbgoJCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJCWlmIHN0YXRzLmJhc2ljLmlzQ29ubmVjdGVkIHRoZW4KCQkJCXN0YXJnYXRlLmRpc2Nvbm5lY3QoKQoJCQllbHNlCgkJCQlsb2NhbCBpbmRleCA9IGFkZHJlc3Nlc0xpc3Q6Z2V0SXRlbUluZGV4KCkKCQkJCWlmIGluZGV4ID4gMCB0aGVuCgkJCQkJbG9jYWwgZGlhbEFkZHJlc3MgPSBjdXJyZW50QWRkcmVzc2VzW2luZGV4XS5hZGRyZXNzCgkJCQkJc3RhcmdhdGUuZGlhbChkaWFsQWRkcmVzcywgbm90IGZhc3REaWFsTW9kZSkKCQkJCWVuZAoJCQllbmQKCQllbmQpCgllbmQKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJvcGVuVmF1bHQiLCBmdW5jdGlvbigpCglqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCW1vZGFsTXV0ZXg6d2l0aF9sb2NrKG1vZGFsLm9wZW4sIHZhdWx0U2V0dXApCgllbmQpCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgiZWRpdEFkZHJlc3Nib29rIiwgZnVuY3Rpb24oKQoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQlsb2NhbCBuZXdBZGRyZXNzZXMgPSBtb2RhbE11dGV4OndpdGhfbG9jayhtb2RhbC5vcGVuLCBhc25TZXR1cCkKCQlpZiBuZXdBZGRyZXNzZXMgdGhlbgoJCQlhZGRyZXNzZXNTdGF0ZTpzZXQoYWRkcmVzc2VzLmNyZWF0ZShuZXdBZGRyZXNzZXMpKQoJCWVuZAoJZW5kKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoImVuZ2FnZSIsIGZ1bmN0aW9uKHNlbGYpCglsb2NhbCBzeW1ib2wgPSB0b251bWJlcihzZWxmOmdldFZhbHVlKCkpCglqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCWlmIHNlbGY6Z2V0QmFja2dyb3VuZCgpID09IGNvbG9ycy5ncmF5IHRoZW4KCQkJc3RhcmdhdGUuZW5nYWdlKHN5bWJvbCkKCQllbmQKCWVuZCkKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJlbmdhZ2VQb28iLCBmdW5jdGlvbigpCglsb2NhbCBzdGF0cyA9IHN0YXRzUHJvcGVydHkudmFsdWUKCWlmIHN0YXRzIGFuZCBub3Qgc3RhdHMucG9vUHJlc3NlZCB0aGVuCgkJam9iLmFzeW5jKGZ1bmN0aW9uKCkgc3RhcmdhdGUuZW5nYWdlKDApIGVuZCkKCWVuZAplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoInJlc2V0IiwgZnVuY3Rpb24oKQoJam9iLmFzeW5jKHN0YXJnYXRlLmRpc2Nvbm5lY3QpCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgidGVsbCIsIGZ1bmN0aW9uKCkKCWxvY2FsIG1lc3NhZ2UgPSBkb20geyAncm9vdCcsICdtYWluJywgJ3N0YXRzJywgJ3N0YXR1cycsICdtZXNzYWdlJyB9Cglsb2NhbCB2YWx1ZSA9IHRhYmxlLmNvbmNhdChtZXNzYWdlOmdldExpbmVzKCksICdcbicpCglqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXN0YXJnYXRlLnRlbGwodmFsdWUpCgllbmQpCmVuZCkKCmpvYi5ydW4oZnVuY3Rpb24oKQoKbG9jYWwgc2VydmVySWRQcm9wZXJ0eSA9IGpvYi5saXZlZGF0YS5jb21iaW5lKGZ1bmN0aW9uKHN0YXRzKQoJaWYgc3RhdHMgdGhlbgoJCXJldHVybiBzdGF0cy5pZAoJZWxzZQoJCXJldHVybiBuaWwKCWVuZAplbmQsIHN0YXRzUHJvcGVydHkpCgpiYXNhbHQuY3JlYXRlRnJhbWUoKQoJOnNldFRoZW1lKHRoZW1lKQoJOmFkZExheW91dEZyb21TdHJpbmcocmVzb3VyY2VzLmxvYWQoInBzZy54bWwiKSkKCmxvY2FsIG1haW5GcmFtZSA9IGRvbSB7ICdyb290JywgJ21haW4nIH0KCmFkZHJlc3Nlc1R5cGVNZW51YmFyID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdhZGRyZXNzYm9vaycsICdhZGRyZXNzVHlwZScgfQphZGRyZXNzZXNMaXN0ID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdhZGRyZXNzYm9vaycsICdsaXN0JyB9CmxvY2FsIGRpYWxCdXR0b24gPSBkb20geyAncm9vdCcsICdtYWluJywgJ2FkZHJlc3Nib29rJywgJ2RpYWwnIH0KCmxvY2FsIGZ1bmN0aW9uIHVwZGF0ZURpYWxCdXR0b25UZXh0KHN0YXRzKQoJbG9jYWwgdGV4dAoJaWYgc3RhdHMuYmFzaWMuaXNDb25uZWN0ZWQgdGhlbgoJCWlmIHN0YXRzLmJhc2ljLmlzV29ybWhvbGVPcGVuIHRoZW4KCQkJdGV4dCA9ICJEaXNjb25uZWN0IgoJCWVsc2UKCQkJdGV4dCA9ICJEaWFsaW5nLi4uIgoJCWVuZAoJZWxzZQoJCXRleHQgPSAiRGlhbCIKCWVuZAoJZGlhbEJ1dHRvbjpzZXRUZXh0KHRleHQpCmVuZAoKbG9jYWwgZGlhbEZyYW1lID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdkaGQnIH0KbG9jYWwgZGlhbE5hbWVMYWJlbCA9IGRpYWxGcmFtZTpnZXRPYmplY3QoJ25hbWUnKQpsb2NhbCBkaWFsQWRkcmVzcyA9IGRpYWxGcmFtZTpnZXRPYmplY3QoJ2RpYWxBZGRyZXNzJykKbG9jYWwgYnVmZmVyQWRkcmVzcyA9IGRpYWxGcmFtZTpnZXRPYmplY3QoJ2J1ZmZlckFkZHJlc3MnKQpsb2NhbCBwb29CdXR0b24gPSBkaWFsRnJhbWU6Z2V0T2JqZWN0KCdwb28nKQoKbG9jYWwgZnVuY3Rpb24gdXBkYXRlRGlhbEFkZHJlc3Moc3RhdHMpCglsb2NhbCBkaWFsQWRkcmVzc1RleHQsIGJ1ZmZlckFkZHJlc3NUZXh0Cglsb2NhbCBkaWFsZWRBZGRyZXNzID0gc3RhdHMuZGlhbGVkQWRkcmVzcwoJZGlhbEFkZHJlc3NUZXh0ID0gYWRkcmVzc2VzLnRvc3RyaW5nKGRpYWxlZEFkZHJlc3MpCglidWZmZXJBZGRyZXNzVGV4dCA9IGFkZHJlc3Nlcy50b3N0cmluZyhzdGF0cy5hZGRyZXNzQnVmZmVyKQoJaWYgZGlhbEFkZHJlc3NUZXh0IH49ICIiIGFuZCBidWZmZXJBZGRyZXNzVGV4dCB+PSAiIiB0aGVuCgkJYnVmZmVyQWRkcmVzc1RleHQgPSAiLSIuLmJ1ZmZlckFkZHJlc3NUZXh0CgllbmQKCWxvY2FsIHRvdGFsV2lkdGggPSAjZGlhbEFkZHJlc3NUZXh0ICsgI2J1ZmZlckFkZHJlc3NUZXh0CglkaWFsQWRkcmVzczpzZXRUZXh0KGRpYWxBZGRyZXNzVGV4dCkKCWRpYWxBZGRyZXNzOnNldFBvc2l0aW9uKCIocGFyZW50LncgLSAiLi50b3RhbFdpZHRoLi4iKS8yIikKCWJ1ZmZlckFkZHJlc3M6c2V0VGV4dChidWZmZXJBZGRyZXNzVGV4dCkKCWlmIG5vdCBuZXh0KGRpYWxlZEFkZHJlc3MpIHRoZW4KCQlkaWFsTmFtZUxhYmVsOnNldFRleHQoIiIpCgllbHNlaWYgc3RhdHMuYmFzaWMuaXNXb3JtaG9sZU9wZW4gb3Igc3RhdHMuYmFzaWMuaXNEaWFsaW5nT3V0IHRoZW4KCQlkaWFsTmFtZUxhYmVsOnNldFRleHQoYWRkcmVzc2VzU3RhdGUudmFsdWU6Z2V0bmFtZShkaWFsZWRBZGRyZXNzLCBzdGF0cy5nYWxheGllcykgb3IgIiIpCgllbmQKZW5kCgotLSBzdGF0cyBiZWdpbgoKbG9jYWwgdmVyc2lvbkxhYmVsID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdzdGF0cycsICdnZW5lcmFsJywgJ3ZlcnNpb24nIH0KCmxvY2FsIGxvY2FsQWRkcmVzc0xhYmVsID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdzdGF0cycsICdnZW5lcmFsJywgJ2xvY2FsQWRkcmVzcycgfQpsb2NhbCBnZW5lcmF0aW9uTGFiZWwgPSBkb20geyAncm9vdCcsICdtYWluJywgJ3N0YXRzJywgJ2dlbmVyYWwnLCAnZ2VuZXJhdGlvbicgfQpsb2NhbCB0eXBlTGFiZWwgPSBkb20geyAncm9vdCcsICdtYWluJywgJ3N0YXRzJywgJ2dlbmVyYWwnLCAndHlwZScgfQpsb2NhbCB2YXJpYW50TGFiZWwgPSBkb20geyAncm9vdCcsICdtYWluJywgJ3N0YXRzJywgJ2dlbmVyYWwnLCAndmFyaWFudCcgfQpsb2NhbCBmZWVkYmFja0NvZGVMYWJlbCA9IGRvbSB7ICdyb290JywgJ21haW4nLCAnc3RhdHMnLCAnZ2VuZXJhbCcsICdmZWVkYmFja0NvZGUnIH0KbG9jYWwgZmVlZGJhY2tNZXNzYWdlTGFiZWwgPSBkb20geyAncm9vdCcsICdtYWluJywgJ3N0YXRzJywgJ2dlbmVyYWwnLCAnZmVlZGJhY2tNZXNzYWdlJyB9Cgpsb2NhbCBlbmVyZ3lMYWJlbCA9IGRvbSB7ICdyb290JywgJ21haW4nLCAnc3RhdHMnLCAnZW5lcmd5JywgJ2ludGVyZmFjZScsICdlbmVyZ3knIH0KbG9jYWwgZW5lcmd5Q2FwYWNpdHlMYWJlbCA9IGRvbSB7ICdyb290JywgJ21haW4nLCAnc3RhdHMnLCAnZW5lcmd5JywgJ2ludGVyZmFjZScsICdjYXBhY2l0eScgfQpsb2NhbCBlbmVyZ3lJbnRlcmZhY2VQcm9ncmVzc2JhciA9IGRvbSB7ICdyb290JywgJ21haW4nLCAnc3RhdHMnLCAnZW5lcmd5JywgJ2ludGVyZmFjZScsICdwcm9ncmVzcycgfQpsb2NhbCBzdGFyZ2F0ZUVuZXJneUxhYmVsID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdzdGF0cycsICdlbmVyZ3knLCAnc3RhcmdhdGUnLCAnZW5lcmd5JyB9CmxvY2FsIHRhcmdldEVuZXJneUxhYmVsID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdzdGF0cycsICdlbmVyZ3knLCAnc3RhcmdhdGUnLCAndGFyZ2V0JyB9CmxvY2FsIGVuZXJneVByb2dyZXNzYmFyID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdzdGF0cycsICdlbmVyZ3knLCAnc3RhcmdhdGUnLCAncHJvZ3Jlc3MnIH0KCmxvY2FsIGlzQ29ubmVjdGVkQ2hlY2tib3ggPSBkb20geyAncm9vdCcsICdtYWluJywgJ3N0YXRzJywgJ3N0YXR1cycsICdpc0Nvbm5lY3RlZCcgfQpsb2NhbCBpc1dvcm1ob2xlQ2hlY2tib3ggPSBkb20geyAncm9vdCcsICdtYWluJywgJ3N0YXRzJywgJ3N0YXR1cycsICdpc1dvcm1ob2xlJyB9CmxvY2FsIGlzRGlhbGluZ091dENoZWNrYm94ID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdzdGF0cycsICdzdGF0dXMnLCAnaXNEaWFsaW5nT3V0JyB9CmxvY2FsIG9wZW5UaW1lTGFiZWwgPSBkb20geyAncm9vdCcsICdtYWluJywgJ3N0YXRzJywgJ3N0YXR1cycsICdvcGVuVGltZScgfQpsb2NhbCBjaGV2cm9uc0xhYmVsID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdzdGF0cycsICdzdGF0dXMnLCAnY2hldnJvbnMnIH0KbG9jYWwgY29ubmVjdGVkTmFtZUxhYmVsID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdzdGF0cycsICdzdGF0dXMnLCAnY29ubmVjdGVkTmFtZScgfQpsb2NhbCBjb25uZWN0ZWRBZGRyZXNzTGFiZWwgPSBkb20geyAncm9vdCcsICdtYWluJywgJ3N0YXRzJywgJ3N0YXR1cycsICdjb25uZWN0ZWRBZGRyZXNzJyB9Cgpsb2NhbCBmdW5jdGlvbiB1cGRhdGVDb25uZWN0ZWRBZGRyZXNkcyhzdGF0cykKCWxvY2FsIGFkZHJlc3MgPSBzdGF0cy5hZHZhbmNlZC5jb25uZWN0ZWRBZGRyZXNzCglpZiBub3QgbmV4dChhZGRyZXNzKSB0aGVuCgkJY29ubmVjdGVkTmFtZUxhYmVsOnNldFRleHQoIiIpCgllbHNlaWYgc3RhdHMuYmFzaWMuaXNXb3JtaG9sZU9wZW4gb3Igc3RhdHMuYmFzaWMuaXNEaWFsaW5nT3V0IHRoZW4KCQljb25uZWN0ZWROYW1lTGFiZWw6c2V0VGV4dChhZGRyZXNzZXNTdGF0ZS52YWx1ZTpnZXRuYW1lKGFkZHJlc3MsIHN0YXRzLmdhbGF4aWVzKSBvciAiIikKCWVuZAoJY29ubmVjdGVkQWRkcmVzc0xhYmVsOnNldFRleHQoYWRkcmVzc2VzLnRvc3RyaW5nKGFkZHJlc3MpKQplbmQKCmxvY2FsIGZ1bmN0aW9uIHBvcHVsYXRlTG9va3VwVGFibGUobG9va3VwLCBkYXRhKQoJZm9yIF8sIHZhbHVlIGluIGlwYWlycyhkYXRhKSBkbwoJCWxvb2t1cFt2YWx1ZV0gPSB0cnVlCgllbmQKZW5kCgpsb2NhbCBtYXhTeW1ib2xCeVN0YXJnYXRlID0gewoJWyJzZ2pvdXJuZXk6dW5pdmVyc2Vfc3RhcmdhdGUiXSA9IDM1Owp9Cgpsb2NhbCBmdW5jdGlvbiB1cGRhdGVEaWFsQnV0dG9ucyhzdGF0cykKCWxvY2FsIGxvb2t1cCA9IHt9Cglwb3B1bGF0ZUxvb2t1cFRhYmxlKGxvb2t1cCwgc3RhdHMuZGlhbGVkQWRkcmVzcykKCXBvcHVsYXRlTG9va3VwVGFibGUobG9va3VwLCBzdGF0cy5hZGRyZXNzQnVmZmVyKQoJbG9jYWwgbWF4U3ltYm9sID0gbWF4U3ltYm9sQnlTdGFyZ2F0ZVtzdGF0cy5iYXNpYy50eXBlXSBvciAzOAoJZm9yIGk9MSwgbWF4U3ltYm9sIGRvCgkJbG9jYWwgYnV0dG9uID0gZGlhbEZyYW1lOmdldE9iamVjdCgicyIuLmkpCgkJbG9jYWwgY29sb3IgPSBsb29rdXBbaV0gYW5kIGNvbG9ycy5vcmFuZ2Ugb3IgY29sb3JzLmdyYXkKCQlidXR0b246c2V0QmFja2dyb3VuZChjb2xvcikKCWVuZAoJZm9yIGk9bWF4U3ltYm9sICsgMSwgMzggZG8KCQlsb2NhbCBidXR0b24gPSBkaWFsRnJhbWU6Z2V0T2JqZWN0KCJzIi4uaSkKCQlidXR0b246c2V0QmFja2dyb3VuZChjb2xvcnMuYmxhY2spCgllbmQKCWxvY2FsIGNvbG9yID0gc3RhdHMucG9vUHJlc3NlZCBhbmQgY29sb3JzLm9yYW5nZSBvciBjb2xvcnMuZ3JheQoJcG9vQnV0dG9uOnNldEJhY2tncm91bmQoY29sb3IpCmVuZAoKbG9jYWwgZnVuY3Rpb24gdXBkYXRlU3RhdHMoc3RhdHMpCgl2ZXJzaW9uTGFiZWw6c2V0VGV4dCgicHNnICIuLnZlcnNpb24uLiI7IHNncyAiLi4oc3RhdHMudmVyc2lvbiBvciAiPyIpKQoJZ2VuZXJhdGlvbkxhYmVsOnNldFRleHQodG9zdHJpbmcoc3RhdHMuYmFzaWMuZ2VuZXJhdGlvbikpCgl0eXBlTGFiZWw6c2V0VGV4dCh0b3N0cmluZyhzdGF0cy5iYXNpYy50eXBlKSkKCXZhcmlhbnRMYWJlbDpzZXRUZXh0KHRvc3RyaW5nKHN0YXRzLmJhc2ljLnZhcmlhbnQpKQoJbG9jYWwgbG9jYWxBZGRyZXNzID0gZ2V0TG9jYWxBZGRyZXNzKHN0YXRzKQoJaWYgbG9jYWxBZGRyZXNzIHRoZW4KCQlsb2NhbEFkZHJlc3NMYWJlbDpzZXRUZXh0KGFkZHJlc3Nlcy50b3N0cmluZyhsb2NhbEFkZHJlc3MpKQoJZWxzZQoJCWxvY2FsQWRkcmVzc0xhYmVsOnNldFRleHQoIk4vQSIpCgllbmQKCWZlZWRiYWNrQ29kZUxhYmVsOnNldFRleHQodG9zdHJpbmcoc3RhdHMuYmFzaWMucmVjZW50RmVlZGJhY2tDb2RlKSkKCWlmIHN0YXRzLmNyeXN0YWwgdGhlbgoJCWZlZWRiYWNrTWVzc2FnZUxhYmVsOnNldFRleHQoc3RhdHMuY3J5c3RhbC5yZWNlbnRGZWVkYmFja05hbWUpCgllbHNlCgkJZmVlZGJhY2tNZXNzYWdlTGFiZWw6c2V0VGV4dChmZWVkYmFja1tzdGF0cy5iYXNpYy5yZWNlbnRGZWVkYmFja0NvZGVdIG9yICJOL0EiKQoJZW5kCgoJZW5lcmd5TGFiZWw6c2V0VGV4dCh0b3N0cmluZyhzdGF0cy5iYXNpYy5lbmVyZ3kpLi4iIEZFIikKCXN0YXJnYXRlRW5lcmd5TGFiZWw6c2V0VGV4dCh0b3N0cmluZyhzdGF0cy5iYXNpYy5zdGFyZ2F0ZUVuZXJneSkuLiIgRkUiKQoJdGFyZ2V0RW5lcmd5TGFiZWw6c2V0VGV4dCh0b3N0cmluZyhzdGF0cy5iYXNpYy5lbmVyZ3lUYXJnZXQpLi4iIEZFIikKCWlmIHN0YXRzLmJhc2ljLnN0YXJnYXRlRW5lcmd5ID4gc3RhdHMuYmFzaWMuZW5lcmd5VGFyZ2V0IHRoZW4KCQllbmVyZ3lQcm9ncmVzc2JhcjpzZXRQcm9ncmVzcygxMDApCgllbHNlCgkJZW5lcmd5UHJvZ3Jlc3NiYXI6c2V0UHJvZ3Jlc3Moc3RhdHMuYmFzaWMuc3RhcmdhdGVFbmVyZ3kvc3RhdHMuYmFzaWMuZW5lcmd5VGFyZ2V0KjEwMCkKCWVuZAoJbG9jYWwgZW5lcmd5Q2FwYWNpdHkgPSBzdGF0cy5iYXNpYy5lbmVyZ3lDYXBhY2l0eTsKCWlmIGVuZXJneUNhcGFjaXR5IHRoZW4KCQllbmVyZ3lDYXBhY2l0eUxhYmVsOnNldFRleHQodG9zdHJpbmcoZW5lcmd5Q2FwYWNpdHkpLi4iIEZFIikKCQllbmVyZ3lJbnRlcmZhY2VQcm9ncmVzc2JhcjpzZXRQcm9ncmVzcyhzdGF0cy5iYXNpYy5lbmVyZ3kvZW5lcmd5Q2FwYWNpdHkqMTAwKQoJZWxzZQoJCWVuZXJneUNhcGFjaXR5TGFiZWw6c2V0VGV4dCgiTi9BIikKCQllbmVyZ3lJbnRlcmZhY2VQcm9ncmVzc2JhcjpzZXRQcm9ncmVzcygwKQoJZW5kCgoJaXNDb25uZWN0ZWRDaGVja2JveDpzZXRWYWx1ZShzdGF0cy5iYXNpYy5pc0Nvbm5lY3RlZCkKCWlzV29ybWhvbGVDaGVja2JveDpzZXRWYWx1ZShzdGF0cy5iYXNpYy5pc1dvcm1ob2xlT3BlbikKCWlzRGlhbGluZ091dENoZWNrYm94OnNldFZhbHVlKHN0YXRzLmJhc2ljLmlzRGlhbGluZ091dCkKCW9wZW5UaW1lTGFiZWw6c2V0VmFsdWUodG9zdHJpbmcoc3RhdHMuYmFzaWMub3BlblRpbWUpLi4iIHRpY2tzIikKCWNoZXZyb25zTGFiZWw6c2V0VGV4dCh0b3N0cmluZyhzdGF0cy5iYXNpYy5jaGV2cm9uc0VuZ2FnZWQpKQoJaWYgc3RhdHMuYWR2YW5jZWQgdGhlbgoJCXVwZGF0ZUNvbm5lY3RlZEFkZHJlc2RzKHN0YXRzKQoJZWxzZQoJCWNvbm5lY3RlZEFkZHJlc3NMYWJlbDpzZXRUZXh0KCJOL0EiKQoJCWNvbm5lY3RlZE5hbWVMYWJlbDpzZXRUZXh0KCIiKQoJZW5kCmVuZAoKam9iLmxpdmVkYXRhLnN1YnNjcmliZShzdGF0c1Byb3BlcnR5LCBmdW5jdGlvbihzdGF0cykKCWlmIHN0YXRzIHRoZW4KCQl1cGRhdGVEaWFsQnV0dG9ucyhzdGF0cykKCQl1cGRhdGVTdGF0cyhzdGF0cykKCQl1cGRhdGVEaWFsQWRkcmVzcyhzdGF0cykKCQl1cGRhdGVEaWFsQnV0dG9uVGV4dChzdGF0cykKCQltYWluRnJhbWU6c2hvdygpCgllbHNlCgkJbWFpbkZyYW1lOmhpZGUoKQoJZW5kCmVuZCkKCi0tIHN0YXRzIGVuZAoKbG9jYWwgc2hvdWxkQXV0aG9yaXplUHJvcGVydHkgPSBqb2IubGl2ZWRhdGEuY29tYmluZShmdW5jdGlvbihzdGF0cykKCWlmIG5vdCBzdGF0cyB0aGVuCgkJcmV0dXJuIG5pbAoJZW5kCglsb2NhbCBiYXNpYyA9IHN0YXRzLmJhc2ljCglpZiBiYXNpYy5pc1dvcm1ob2xlT3BlbiBhbmQgYmFzaWMuaXNEaWFsaW5nT3V0IHRoZW4KCQlyZXR1cm4gc3RhdHMuaWQKCWVsc2UKCQlyZXR1cm4gbmlsCgllbmQKZW5kLCBzdGF0c1Byb3BlcnR5KQoKam9iLmxpdmVkYXRhLnN1YnNjcmliZShzZXJ2ZXJJZFByb3BlcnR5LCBmdW5jdGlvbihpZCkKCWxvYWRBZGRyZXNzZXMoKQoJc3RhcmdhdGUuX3N0YXRlLnNlcnZlciA9IGlkCmVuZCkKCmpvYi5saXZlZGF0YS5zdWJzY3JpYmUoYWRkcmVzc2VzU3RhdGUsIGZ1bmN0aW9uKCkKCWxvYWRBZGRyZXNzZXMoKQplbmQpCgpsb2NhbCBsYXN0Sm9iID0gam9iLmFzeW5jKGZ1bmN0aW9uKCllbmQpCgpqb2IubGl2ZWRhdGEuc3Vic2NyaWJlKHNob3VsZEF1dGhvcml6ZVByb3BlcnR5LCBmdW5jdGlvbihzaG91bGRBdXRob3JpemUpCglsYXN0Sm9iOmNhbmNlbCgpCglpZiBzaG91bGRBdXRob3JpemUgdGhlbgoJCWxhc3RKb2IgPSBqb2IucnVubmluZygpCgkJbG9jYWwgbm9uY2UgPSB2YXVsdC5nZW5fbm9uY2UoKQoJCWxvY2FsIG9rLCByZXNwb25zZSA9IHBjYWxsKGpvYi5yZXRyeSwgNSwgb3RoZXJzaWRlLmluZm8sIG5vbmNlKQoJCWlmIG9rIHRoZW4KCQkJbG9jYWwgdmFsaWQsIHJlYXNvbiA9IHZhdWx0LnZlcmlmeShub25jZSwgcmVzcG9uc2UpCgkJCWxvY2FsIG1lc3NhZ2UgPSB0ZXh0dXRpbHMudW5zZXJpYWxpc2UocmVzcG9uc2UubWVzc2FnZSkKCQkJbG9jYWwgaXNJcmlzQ2xvc2VkID0gbWVzc2FnZS5wYXlsb2FkLmlzSXJpc0Nsb3NlZAoJCQlpZiB2YWxpZCBhbmQgbm90IGlzSXJpc0Nsb3NlZCB0aGVuCgkJCQlyZXR1cm4KCQkJZW5kCgkJCWxvY2FsIHZlcmlmaWNhdGlvbk1lc3NhZ2UKCQkJaWYgdmFsaWQgdGhlbgoJCQkJdmVyaWZpY2F0aW9uTWVzc2FnZSA9ICJLbm93biBkZXN0aW5hdGlvbiIKCQkJZWxzZQoJCQkJdmVyaWZpY2F0aW9uTWVzc2FnZSA9ICJXQVJOOiAiLi5yZWFzb24KCQkJZW5kCgkJCWxvY2FsIGlyaXNNZXNzYWdlCgkJCWxvY2FsIGFjY2VwdFRleHQKCQkJaWYgaXNJcmlzQ2xvc2VkIHRoZW4KCQkJCWlyaXNNZXNzYWdlID0gIklyaXMgaXMgY2xvc2VkISIKCQkJCWFjY2VwdFRleHQgPSAiT3BlbiBpcmlzIgoJCQllbHNlCgkJCQlpcmlzTWVzc2FnZSA9ICJJcmlzIGlzIG9wZW5lZCwgdHJ1c3Q/IgoJCQkJYWNjZXB0VGV4dCA9IGZhbHNlCgkJCWVuZAoJCQlsb2NhbCBkb09wZW4gPSBtb2RhbE11dGV4OndpdGhfbG9jayhtb2RhbC5hbGVydCwKCQkJCXsKCQkJCQkiRGVzdDogIi4uIGtleXMuZmluZ2VycHJpbnQobWVzc2FnZS5rZXkpOwoJCQkJCXZlcmlmaWNhdGlvbk1lc3NhZ2U7CgkJCQkJaXJpc01lc3NhZ2U7CgkJCQl9LAoJCQkJYWNjZXB0VGV4dCwgIkNhbmNlbCIKCQkJKQoJCQlpZiBkb09wZW4gdGhlbgoJCQkJbG9jYWwga2V5ID0gdmF1bHQucHJpdmF0ZV9rZXkoKQoJCQkJaWYgbm90IGtleSB0aGVuCgkJCQkJd2hpbGUgdHJ1ZSBkbwoJCQkJCQlsb2NhbCBwYXNzd29yZCA9IG1vZGFsTXV0ZXg6d2l0aF9sb2NrKG1vZGFsLnBhc3N3ZCkKCQkJCQkJaWYgbm90IHBhc3N3b3JkIHRoZW4KCQkJCQkJCXJldHVybgoJCQkJCQllbmQKCQkJCQkJa2V5LCByZWFzb24gPSB2YXVsdC5wcml2YXRlX2tleShwYXNzd29yZCkKCQkJCQkJaWYga2V5IHRoZW4KCQkJCQkJCWJyZWFrCgkJCQkJCWVuZAoJCQkJCQltb2RhbE11dGV4OndpdGhfbG9jayhtb2RhbC5hbGVydCwge3JlYXNvbn0sIG5pbCwgIlJldHJ5IikKCQkJCQllbmQKCQkJCWVuZAoJCQkJbG9jYWwgcmVxdWVzdCA9IHZhdWx0Lm1ha2VfYXV0aF9yZXF1ZXN0KGtleSwgbWVzc2FnZS5zZXNzaW9uKQoJCQkJb2ssIHJlYXNvbiA9IG90aGVyc2lkZS5hdXRoKHJlcXVlc3QpCgkJCQlpZiBub3Qgb2sgdGhlbgoJCQkJCW1vZGFsTXV0ZXg6d2l0aF9sb2NrKG1vZGFsLmFsZXJ0LCB7Ik5PVCBBVVRIT1JJWkVEOiIsIHJlYXNvbn0sIGZhbHNlLCAiT0siKQoJCQkJZWxzZQoJCQkJCW1vZGFsTXV0ZXg6d2l0aF9sb2NrKG1vZGFsLmFsZXJ0LCB7IkF1dGhvcml6ZWQhIn0sIGZhbHNlLCAiT0siKQoJCQkJZW5kCgkJCWVuZAoJCWVsc2VpZiByZXNwb25zZTpzdWIoLTEwKSA9PSAiVGVybWluYXRlZCIgdGhlbgoJCQllcnJvcigiVGVybWluYXRlZCIsIDApCgkJZWxzZQoJCQltb2RhbE11dGV4OndpdGhfbG9jayhtb2RhbC5hbGVydCwgeyJObyByZXNwb25zZSEiLCAiSXJpcyBzdGF0ZSBpcyB1bmtub3duISJ9LCBmYWxzZSwgIk9LIikKCQllbmQKCWVuZAplbmQpCgpsb2NhbCBmdW5jdGlvbiBzcGF3bkhhbHRUaW1lb3V0KCkKCXJldHVybiBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXNsZWVwKFRJTUVPVVQpCgkJc3RhdHNQcm9wZXJ0eTpzZXQobmlsKQoJZW5kKQplbmQKCmxvY2FsIGhhbHRKb2IgPSBzcGF3bkhhbHRUaW1lb3V0KCkKCmxvY2FsIG1lc3NhZ2VzU2VtYXBob3JlID0gY29uY3VycmVudC5zZW1hcGhvcmUoMTApCgpycGMuc3Vic2NyaWJlX25ldHdvcmsobW9kZW0sIENIQU5ORUxfRVZFTlQsIGZ1bmN0aW9uKGV2ZW50LCBtZXRhKQoJbG9jYWwgZGlzdGFuY2UgPSBtZXRhLmRpc3RhbmNlCglpZiBub3QgZGlzdGFuY2UgdGhlbgoJCS0tIGlnbm9yZSBlbmRlciBtb2RlbSBtZXNzYWdlcwoJCXJldHVybgoJZW5kCglsb2NhbCB0eXBlID0gZXZlbnQudHlwZQoJbG9jYWwgZGF0YSA9IGV2ZW50LmRhdGEKCWlmIHR5cGUgPT0gJ2Rpc2NvdmVyJyB0aGVuCgkJbG9jYWwgc3RhdHMgPSBzdGF0c1Byb3BlcnR5LnZhbHVlCgkJaWYgc3RhdHMgYW5kIHN0YXRzLmlkIH49IGRhdGEuaWQgYW5kIGRpc3RhbmNlID4gc3RhdHMuZGlzdGFuY2UgdGhlbgoJCQktLSBwcmVmZXIgY2xvc2VzdCBQU0cgc2VydmVyCgkJCXJldHVybgoJCWVuZAoJCWhhbHRKb2I6Y2FuY2VsKCkKCQloYWx0Sm9iID0gc3Bhd25IYWx0VGltZW91dCgpCgkJZGF0YS5kaXN0YW5jZSA9IGRpc3RhbmNlCgkJc3RhdHNQcm9wZXJ0eTpzZXQoZGF0YSkKCWVsc2VpZiB0eXBlID09ICdtZXNzYWdlJyB0aGVuCgkJbG9jYWwgbWVzc2FnZSA9IGRhdGEKCQlsb2NhbCBkZWNvZGVkID0gdGV4dHV0aWxzLnVuc2VyaWFsaXNlKG1lc3NhZ2UpCgkJaWYgX0cudHlwZShkZWNvZGVkKSA9PSAndGFibGUnIGFuZCBkZWNvZGVkLm1hZ2ljID09ICdycGMnIHRoZW4KCQkJb3RoZXJzaWRlUmVzcG9uc2VzOnNlbmQoZGVjb2RlZCkKCQllbHNlCgkJCW1lc3NhZ2VzU2VtYXBob3JlOndpdGhfdHJ5X2xvY2sobW9kYWxNdXRleC53aXRoX2xvY2ssIG1vZGFsTXV0ZXgsIG1vZGFsLm1lc3NhZ2UsICJSZWNlaXZlZCBNZXNzYWdlIiwgbWVzc2FnZSkKCQllbmQKCWVuZAplbmQpCgpqb2IuYXN5bmMoYmFzYWx0LmF1dG9VcGRhdGUpCgpkbwoJbG9jYWwgZmFzdEVsZW1lbnQgPSBkb20geyAncm9vdCcsICdtYWluJywgJ2FkZHJlc3Nib29rJywgJ2Zhc3QnIH0KCWZhc3RFbGVtZW50OnNldFZhbHVlKGZhc3REaWFsTW9kZUluaXQpCglkb20geyAncm9vdCcsICd2ZXJzaW9uJyB9OnNldFRleHQodmVyc2lvbikKCWlmIGFkZHJlc3Nib29rLnJlc29sdmVfbG9jYXRpb24oKSA9PSAnZmlsZScgdGhlbgoJCShkb20geyAncm9vdCcsICdlZGl0QWRkcnNBJyB9KTpzaG93KCk7CgkJKGRvbSB7ICdyb290JywgJ21haW4nLCAnYWRkcmVzc2Jvb2snLCAnZWRpdEFkZHJzQicgfSk6c2hvdygpCgllbmQKZW5kCgplbmQpCg=="
  88. return load(base64.decode(entrypoint), "@/"..shell.getRunningProgram(), 't', _ENV)(...)
  89. ]]):gsub("<$<", "[["):gsub(">$>", "]]")
  90. local entrypoint = base64.decode "cHJpbnQoIkluc3RhbGxpbmcgUFNHLi4uIikKcHJpbnQoIkNoZWNraW5nIHBlcmlwaGVyYWxzLi4uIikKaWYgbm90IHBlcmlwaGVyYWwuZmluZCgibW9kZW0iKSB0aGVuCglwcmludCgiTW9kZW0gbm90IGZvdW5kISIpCgl0eXBlWSgpCmVuZApwcmludCgiUGVyaXBoZXJhbHMgT0siKQoKcHJpbnQoIlNwZWNpZnkgYW4gVVJMIHRoYXQgcG9pbnRzIHRvIGFkZHJlc3NlcyBmaWxlOiAiKQoKbG9jYWwgREVGQVVMVF9MT0NBVElPTiA9ICJmaWxlOmFkZHJlc3Nlcy5jb25mIgpsb2NhbCBhZGRyZXNzZXNMb2NhdGlvbiA9IHJlYWQobmlsLCBuaWwsIG5pbCwgc2V0dGluZ3MuZ2V0KCJwc2cuYWRkcmVzc2VzTG9jYXRpb24iLCBERUZBVUxUX0xPQ0FUSU9OKSkKCnNldHRpbmdzLnNldCgicHNnLmFkZHJlc3Nlc0xvY2F0aW9uIiwgYWRkcmVzc2VzTG9jYXRpb24pCnNldHRpbmdzLnNhdmUoKQoKcHJpbnQoIlVucGFja2luZyBmaWxlcy4uLiIpCmlmIG5vdCBmcy5leGlzdHMoImFkZHJlc3Nlcy5jb25mIikgYW5kIERFRkFVTFRfTE9DQVRJT04gPT0gYWRkcmVzc2VzTG9jYXRpb24gdGhlbgoJc2F2ZUV4dHJhKCJhZGRyZXNzZXMuY29uZiIpCmVuZApzYXZlUHJvZ3JhbSgpCgpwcmludCgiRmlsZXMgdW5wYWNrZWQhIikKCnByaW50KCJZb3VyIGNvcHkgb2YgUG9ja2V0IFN0YXJnYXRlIiwgVkVSU0lPTiwgImlzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQhIikKcHJpbnQoIllvdSBjYW4gbW9kaWZ5IFwiYWRkcmVzc2VzLmNvbmZcIiBub3cuIikKcHJpbnQoIkV4ZWN1dGUgXCJwc2dcIiBjb21tYW5kIGluIG9yZGVyIHRvIHJ1biBQb2NrZXQgU3RhcmdhdGUuIikK"
  91. return load(entrypoint, "@[included]/installer.lua", 't', _ENV)(...)
  92.  
Comments
Add Comment
Please, Sign In to add comment