Skip to content

Instantly share code, notes, and snippets.

@JohnRSim
Created July 12, 2024 14:58
Show Gist options
  • Save JohnRSim/6443190dedf6f9b78da882ed612c008c to your computer and use it in GitHub Desktop.
Save JohnRSim/6443190dedf6f9b78da882ed612c008c to your computer and use it in GitHub Desktop.
This file has been truncated, but you can view the full file.
var WebComponentDemo=function(L){"use strict";var RZ=Object.defineProperty;var yZ=(L,C,B)=>C in L?RZ(L,C,{enumerable:!0,configurable:!0,writable:!0,value:B}):L[C]=B;var s=(L,C,B)=>yZ(L,typeof C!="symbol"?C+"":C,B);function C(){}function B(Z,l){for(const b in l)Z[b]=l[b];return Z}function yl(Z){return Z()}function ul(){return Object.create(null)}function v(Z){Z.forEach(yl)}function bl(Z){return typeof Z=="function"}function E(Z,l){return Z!=Z?l==l:Z!==l||Z&&typeof Z=="object"||typeof Z=="function"}function xl(Z){return Object.keys(Z).length===0}function dl(Z,l,b,d){if(Z){const X=Yl(Z,l,b,d);return Z[0](X)}}function Yl(Z,l,b,d){return Z[1]&&d?B(b.ctx.slice(),Z[1](d(l))):b.ctx}function Xl(Z,l,b,d){if(Z[2]&&d){const X=Z[2](d(b));if(l.dirty===void 0)return X;if(typeof X=="object"){const m=[],c=Math.max(l.dirty.length,X.length);for(let G=0;G<c;G+=1)m[G]=l.dirty[G]|X[G];return m}return l.dirty|X}return l.dirty}function ml(Z,l,b,d,X,m){if(X){const c=Yl(l,b,d,m);Z.p(c,X)}}function cl(Z){if(Z.ctx.length>32){const l=[],b=Z.ctx.length/32;for(let d=0;d<b;d++)l[d]=-1;return l}return-1}function kl(Z){return Z&&bl(Z.destroy)?Z.destroy:C}function Y(Z,l){Z.appendChild(l)}function zl(Z,l,b){const d=Bl(Z);if(!d.getElementById(l)){const X=h("style");X.id=l,X.textContent=b,Tl(d,X)}}function Bl(Z){if(!Z)return document;const l=Z.getRootNode?Z.getRootNode():Z.ownerDocument;return l&&l.host?l:Z.ownerDocument}function Tl(Z,l){return Y(Z.head||Z,l),l.sheet}function H(Z,l,b){Z.insertBefore(l,b||null)}function K(Z){Z.parentNode&&Z.parentNode.removeChild(Z)}function h(Z){return document.createElement(Z)}function pl(Z){return document.createTextNode(Z)}function F(){return pl(" ")}function Ul(){return pl("")}function Gl(Z,l,b,d){return Z.addEventListener(l,b,d),()=>Z.removeEventListener(l,b,d)}function y(Z,l,b){b==null?Z.removeAttribute(l):Z.getAttribute(l)!==b&&Z.setAttribute(l,b)}function tl(Z){return Array.from(Z.childNodes)}function hl(Z,l,b,d){b==null?Z.style.removeProperty(l):Z.style.setProperty(l,b,"")}function Ml(Z){const l={};return Z.childNodes.forEach(b=>{l[b.slot||"default"]=!0}),l}let w;function Q(Z){w=Z}function il(){if(!w)throw new Error("Function called outside component initialization");return w}function vl(Z){il().$$.on_mount.push(Z)}function wl(Z){il().$$.on_destroy.push(Z)}const T=[],U=[];let t=[];const Cl=[],Ql=Promise.resolve();let Vl=!1;function Pl(){Vl||(Vl=!0,Ql.then(gl))}function Wl(Z){t.push(Z)}const Il=new Set;let M=0;function gl(){if(M!==0)return;const Z=w;do{try{for(;M<T.length;){const l=T[M];M++,Q(l),jl(l.$$)}}catch(l){throw T.length=0,M=0,l}for(Q(null),T.length=0,M=0;U.length;)U.pop()();for(let l=0;l<t.length;l+=1){const b=t[l];Il.has(b)||(Il.add(b),b())}t.length=0}while(T.length);for(;Cl.length;)Cl.pop()();Vl=!1,Il.clear(),Q(Z)}function jl(Z){if(Z.fragment!==null){Z.update(),v(Z.before_update);const l=Z.dirty;Z.dirty=[-1],Z.fragment&&Z.fragment.p(Z.ctx,l),Z.after_update.forEach(Wl)}}function el(Z){const l=[],b=[];t.forEach(d=>Z.indexOf(d)===-1?l.push(d):b.push(d)),b.forEach(d=>d()),t=l}const A=new Set;let El;function S(Z,l){Z&&Z.i&&(A.delete(Z),Z.i(l))}function x(Z,l,b,d){if(Z&&Z.o){if(A.has(Z))return;A.add(Z),El.c.push(()=>{A.delete(Z)}),Z.o(l)}}function Rl(Z){Z&&Z.c()}function f(Z,l,b){const{fragment:d,after_update:X}=Z.$$;d&&d.m(l,b),Wl(()=>{const m=Z.$$.on_mount.map(yl).filter(bl);Z.$$.on_destroy?Z.$$.on_destroy.push(...m):v(m),Z.$$.on_mount=[]}),X.forEach(Wl)}function D(Z,l){const b=Z.$$;b.fragment!==null&&(el(b.after_update),v(b.on_destroy),b.fragment&&b.fragment.d(l),b.on_destroy=b.fragment=null,b.ctx=[])}function Al(Z,l){Z.$$.dirty[0]===-1&&(T.push(Z),Pl(),Z.$$.dirty.fill(0)),Z.$$.dirty[l/31|0]|=1<<l%31}function O(Z,l,b,d,X,m,c=null,G=[-1]){const W=w;Q(Z);const I=Z.$$={fragment:null,ctx:[],props:m,update:C,not_equal:X,bound:ul(),on_mount:[],on_destroy:[],on_disconnect:[],before_update:[],after_update:[],context:new Map(l.context||(W?W.$$.context:[])),callbacks:ul(),dirty:G,skip_bound:!1,root:l.target||W.$$.root};c&&c(I.root);let p=!1;if(I.ctx=b?b(Z,l.props||{},(R,N,...g)=>{const a=g.length?g[0]:N;return I.ctx&&X(I.ctx[R],I.ctx[R]=a)&&(!I.skip_bound&&I.bound[R]&&I.bound[R](a),p&&Al(Z,R)),N}):[],I.update(),p=!0,v(I.before_update),I.fragment=d?d(I.ctx):!1,l.target){if(l.hydrate){const R=tl(l.target);I.fragment&&I.fragment.l(R),R.forEach(K)}else I.fragment&&I.fragment.c();l.intro&&S(Z.$$.fragment),f(Z,l.target,l.anchor),gl()}Q(W)}let al;typeof HTMLElement=="function"&&(al=class extends HTMLElement{constructor(l,b,d){super();s(this,"$$ctor");s(this,"$$s");s(this,"$$c");s(this,"$$cn",!1);s(this,"$$d",{});s(this,"$$r",!1);s(this,"$$p_d",{});s(this,"$$l",{});s(this,"$$l_u",new Map);this.$$ctor=l,this.$$s=b,d&&this.attachShadow({mode:"open"})}addEventListener(l,b,d){if(this.$$l[l]=this.$$l[l]||[],this.$$l[l].push(b),this.$$c){const X=this.$$c.$on(l,b);this.$$l_u.set(b,X)}super.addEventListener(l,b,d)}removeEventListener(l,b,d){if(super.removeEventListener(l,b,d),this.$$c){const X=this.$$l_u.get(b);X&&(X(),this.$$l_u.delete(b))}}async connectedCallback(){if(this.$$cn=!0,!this.$$c){let l=function(m){return()=>{let c;return{c:function(){c=h("slot"),m!=="default"&&y(c,"name",m)},m:function(I,p){H(I,c,p)},d:function(I){I&&K(c)}}}};if(await Promise.resolve(),!this.$$cn||this.$$c)return;const b={},d=Ml(this);for(const m of this.$$s)m in d&&(b[m]=[l(m)]);for(const m of this.attributes){const c=this.$$g_p(m.name);c in this.$$d||(this.$$d[c]=r(c,m.value,this.$$p_d,"toProp"))}for(const m in this.$$p_d)!(m in this.$$d)&&this[m]!==void 0&&(this.$$d[m]=this[m],delete this[m]);this.$$c=new this.$$ctor({target:this.shadowRoot||this,props:{...this.$$d,$$slots:b,$$scope:{ctx:[]}}});const X=()=>{this.$$r=!0;for(const m in this.$$p_d)if(this.$$d[m]=this.$$c.$$.ctx[this.$$c.$$.props[m]],this.$$p_d[m].reflect){const c=r(m,this.$$d[m],this.$$p_d,"toAttribute");c==null?this.removeAttribute(this.$$p_d[m].attribute||m):this.setAttribute(this.$$p_d[m].attribute||m,c)}this.$$r=!1};this.$$c.$$.after_update.push(X),X();for(const m in this.$$l)for(const c of this.$$l[m]){const G=this.$$c.$on(m,c);this.$$l_u.set(c,G)}this.$$l={}}}attributeChangedCallback(l,b,d){var X;this.$$r||(l=this.$$g_p(l),this.$$d[l]=r(l,d,this.$$p_d,"toProp"),(X=this.$$c)==null||X.$set({[l]:this.$$d[l]}))}disconnectedCallback(){this.$$cn=!1,Promise.resolve().then(()=>{!this.$$cn&&this.$$c&&(this.$$c.$destroy(),this.$$c=void 0)})}$$g_p(l){return Object.keys(this.$$p_d).find(b=>this.$$p_d[b].attribute===l||!this.$$p_d[b].attribute&&b.toLowerCase()===l)||l}});function r(Z,l,b,d){var m;const X=(m=b[Z])==null?void 0:m.type;if(l=X==="Boolean"&&typeof l!="boolean"?l!=null:l,!d||!b[Z])return l;if(d==="toAttribute")switch(X){case"Object":case"Array":return l==null?null:JSON.stringify(l);case"Boolean":return l?"":null;case"Number":return l??null;default:return l}else switch(X){case"Object":case"Array":return l&&JSON.parse(l);case"Boolean":return l;case"Number":return l!=null?+l:l;default:return l}}function q(Z,l,b,d,X,m){let c=class extends al{constructor(){super(Z,b,X),this.$$p_d=l}static get observedAttributes(){return Object.keys(l).map(G=>(l[G].attribute||G).toLowerCase())}};return Object.keys(l).forEach(G=>{Object.defineProperty(c.prototype,G,{get(){return this.$$c&&G in this.$$c?this.$$c[G]:this.$$d[G]},set(W){var I;W=r(G,W,l),this.$$d[G]=W,(I=this.$$c)==null||I.$set({[G]:W})}})}),d.forEach(G=>{Object.defineProperty(c.prototype,G,{get(){var W;return(W=this.$$c)==null?void 0:W[G]}})}),Z.element=c,c}class ${constructor(){s(this,"$$");s(this,"$$set")}$destroy(){D(this,1),this.$destroy=C}$on(l,b){if(!bl(b))return C;const d=this.$$.callbacks[l]||(this.$$.callbacks[l]=[]);return d.push(b),()=>{const X=d.indexOf(b);X!==-1&&d.splice(X,1)}}$set(l){this.$$set&&!xl(l)&&(this.$$.skip_bound=!0,this.$$set(l),this.$$.skip_bound=!1)}}const fl="4";typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(fl);function Dl(Z){let l,b,d,X,m;const c=Z[1].default,G=dl(c,Z,Z[0],null);return{c(){l=h("div"),b=h("h1"),b.textContent="Development",d=F(),X=h("div"),G&&G.c(),y(b,"class","mb-4 text-black"),y(X,"class","rounded-xl p-4 bg-white text-black"),y(l,"class","p-4")},m(W,I){H(W,l,I),Y(l,b),Y(l,d),Y(l,X),G&&G.m(X,null),m=!0},p(W,[I]){G&&G.p&&(!m||I&1)&&ml(G,c,W,W[0],m?Xl(c,W[0],I,null):cl(W[0]),null)},i(W){m||(S(G,W),m=!0)},o(W){x(G,W),m=!1},d(W){W&&K(l),G&&G.d(W)}}}function Ol(Z,l,b){let{$$slots:d={},$$scope:X}=l;return Z.$$set=m=>{"$$scope"in m&&b(0,X=m.$$scope)},[X,d]}class sl extends ${constructor(l){super(),O(this,l,Ol,Dl,E,{})}}q(sl,{},["default"],[],!0);const rl='*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.left-0{left:0}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.top-0{top:0}.top-2{top:.5rem}.z-10{z-index:10}.mb-1{margin-bottom:.25rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.block{display:block}.inline{display:inline}.flex{display:flex}.h-1{height:.25rem}.w-full{width:100%}.flex-col{flex-direction:column}.gap-y-2{row-gap:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.bg-sky-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity))}.bg-sky-950{--tw-bg-opacity: 1;background-color:rgb(8 47 73 / var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.p-4{padding:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.font-bold{font-weight:700}.font-semibold{font-weight:600}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}';function ql(Z){let l;const b=Z[1].default,d=dl(b,Z,Z[2],null);return{c(){d&&d.c()},m(X,m){d&&d.m(X,m),l=!0},p(X,m){d&&d.p&&(!l||m&4)&&ml(d,b,X,X[2],l?Xl(b,X[2],m,null):cl(X[2]),null)},i(X){l||(S(d,X),l=!0)},o(X){x(d,X),l=!1},d(X){d&&d.d(X)}}}function $l(Z){let l,b;return l=new sl({props:{$$slots:{default:[_l]},$$scope:{ctx:Z}}}),{c(){Rl(l.$$.fragment)},m(d,X){f(l,d,X),b=!0},p(d,X){const m={};X&4&&(m.$$scope={dirty:X,ctx:d}),l.$set(m)},i(d){b||(S(l.$$.fragment,d),b=!0)},o(d){x(l.$$.fragment,d),b=!1},d(d){D(l,d)}}}function _l(Z){let l;const b=Z[1].default,d=dl(b,Z,Z[2],null);return{c(){d&&d.c()},m(X,m){d&&d.m(X,m),l=!0},p(X,m){d&&d.p&&(!l||m&4)&&ml(d,b,X,X[2],l?Xl(b,X[2],m,null):cl(X[2]),null)},i(X){l||(S(d,X),l=!0)},o(X){x(d,X),l=!1},d(X){d&&d.d(X)}}}function lZ(Z){let l,b,d,X,m,c;const G=[$l,ql],W=[];function I(p,R){return 1}return b=I(),d=W[b]=G[b](Z),{c(){l=h("div"),d.c()},m(p,R){H(p,l,R),W[b].m(l,null),X=!0,m||(c=kl(Z[0].call(null,l)),m=!0)},p(p,[R]){d.p(p,R)},i(p){X||(S(d),X=!0)},o(p){x(d),X=!1},d(p){p&&K(l),W[b].d(),m=!1,c()}}}function ZZ(Z,l,b){let{$$slots:d={},$$scope:X}=l;function m(c){const G=document.createElement("style");G.innerHTML=rl,c.append(G)}return Z.$$set=c=>{"$$scope"in c&&b(2,X=c.$$scope)},[m,d,X]}class Jl extends ${constructor(l){super(),O(this,l,ZZ,lZ,E,{})}}q(Jl,{},["default"],[],!0);function bZ(Z){zl(Z,"svelte-tj792k",".modal.svelte-tj792k{display:none;position:fixed;z-index:20;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgba(0,0,0,0.4)}.modal-content.svelte-tj792k{background-color:#fefefe;margin:15% auto;padding:20px;border:1px solid #888;width:80%}.close.svelte-tj792k{color:#aaa;float:right;font-size:28px;font-weight:bold}.close.svelte-tj792k:hover,.close.svelte-tj792k:focus{color:black;text-decoration:none;cursor:pointer}.highlight{background-color:yellow;cursor:pointer}")}function Kl(Z){let l,b;return{c(){l=h("div"),b=h("div"),y(b,"class","h-1 bg-sky-950"),hl(b,"width",Z[5]+"%"),y(l,"class","fixed h-1 top-0 left-0 right-0 bg-sky-100")},m(d,X){H(d,l,X),Y(l,b)},p(d,X){X&32&&hl(b,"width",d[5]+"%")},d(d){d&&K(l)}}}function dZ(Z){let l,b,d,X,m,c,G,W,I,p,R,N,g,a,J,k,_,n,P,o,j,z,e,ll,i=Z[5]<100&&!Z[0]&&Kl(Z);return{c(){l=h("button"),l.textContent="Enable Translation Mode",b=F(),d=h("div"),X=h("div"),m=h("span"),m.textContent="×",c=F(),G=h("h2"),G.textContent="Edit Translation",W=F(),I=h("div"),p=h("div"),R=h("label"),R.textContent="Original:",N=F(),g=h("div"),a=F(),J=h("div"),k=h("label"),k.textContent="Update Translation:",_=F(),n=h("input"),P=F(),o=h("button"),o.textContent="Save",j=F(),i&&i.c(),z=Ul(),y(l,"class","fixed top-2 right-2 z-10 border px-4 py-2 rounded-md font-bold"),y(l,"id","enableTranslationModeButton"),y(m,"class","close absolute top-0 right-3 svelte-tj792k"),y(G,"class","font-bold mb-3"),y(R,"for","originalText"),y(R,"class","block font-semibold mb-1 ml-1 text-sm"),y(g,"class","border rounded-md px-4 py-2 bg-gray-100"),y(g,"id","originalText"),y(k,"for","translationInput"),y(k,"class","block font-semibold mb-1 ml-1 text-sm"),y(n,"class","w-full border rounded-md px-4 py-2"),y(n,"type","text"),y(n,"id","translationInput"),y(I,"class","mb-3 flex flex-col gap-y-2"),y(o,"class","bg-black rounded-md px-4 py-2 text-white"),y(o,"id","saveTranslationButton"),y(X,"class","modal-content relative rounded-md svelte-tj792k"),y(d,"id","translationModal"),y(d,"class","modal svelte-tj792k")},m(V,u){H(V,l,u),Z[9](l),H(V,b,u),H(V,d,u),Y(d,X),Y(X,m),Y(X,c),Y(X,G),Y(X,W),Y(X,I),Y(I,p),Y(p,R),Y(p,N),Y(p,g),Z[10](g),Y(I,a),Y(I,J),Y(J,k),Y(J,_),Y(J,n),Z[11](n),Y(X,P),Y(X,o),Z[12](d),H(V,j,u),i&&i.m(V,u),H(V,z,u),e||(ll=[Gl(l,"click",Z[6]),Gl(m,"click",Z[8]),Gl(o,"click",Z[7])],e=!0)},p(V,[u]){V[5]<100&&!V[0]?i?i.p(V,u):(i=Kl(V),i.c(),i.m(z.parentNode,z)):i&&(i.d(1),i=null)},i:C,o:C,d(V){V&&(K(l),K(b),K(d),K(j),K(z)),Z[9](null),Z[10](null),Z[11](null),Z[12](null),i&&i.d(V),e=!1,v(ll)}}}function Ll(Z){console.log("Get all text nodes");let l=[];function b(d){d.nodeType===Node.ELEMENT_NODE&&d.tagName.toLowerCase()==="script"||(d.nodeType===Node.TEXT_NODE?d.nodeValue.trim()!==""&&(l.push(d),d.parentElement&&!d.parentElement.dataset.originalText&&(d.parentElement.dataset.originalText=d.nodeValue)):d.childNodes.forEach(b))}return b(Z),l}function Hl(Z,l){console.log("Updating translations on page"),Z.forEach(b=>{const d=b.nodeValue.trim();Fl(b)&&l[d]&&(b.nodeValue=l[d])})}function XZ(Z,l){console.log("Updating translations on page");let b=!1;Z.forEach(d=>{const X=d.nodeValue.trim();Fl(d)&&!l.hasOwnProperty(X)&&(l[X]="",b=!0)}),b&&localStorage.setItem("translations",JSON.stringify(l))}function Fl(Z){return Z.nodeType===Node.TEXT_NODE&&Z.nodeValue.trim().length>0}function mZ(Z,l,b){let d,X,m,c,G=[],W,I=0;const p=localStorage.getItem("translations");let R=p?JSON.parse(p):{},N=!1,g=null,a,J=null;vl(async()=>{if(console.log("bb-i18n initialised"),!a){console.log("initialising pipeline");const V=await Promise.resolve().then(()=>IZ);a=new V.default;const u=Zl=>{switch(console.log(Zl.data.status),Zl.data.status){case"initiate":b(0,J=!1);break;case"progress":b(5,I=Zl.data.progress);break;case"ready":b(0,J=!0);break;case"complete":R=Zl.data.translations,localStorage.setItem("translations",JSON.stringify(R)),Hl(W,R);break}};a.addEventListener("message",u)}W=Ll(document.body),XZ(W,R),Hl(W,R),k(R)}),wl(()=>{a&&(console.log("Terminated pipelineWorker"),a.terminate())});function k(V){console.log("Requesting translations",V),a.postMessage({translations:V})}function _(){G.forEach(V=>{V.classList.remove("highlight"),V.removeEventListener("click",P)}),G=[]}function n(){console.log("Toggle Translation Mode"),N=!N,N?(b(1,d.textContent="Disable Translation Mode",d),W=Ll(document.body),W.forEach(V=>{const u=V.parentElement;u&&!u.classList.contains("highlight")&&!u.closest(".modal")&&(u.classList.add("highlight"),u.addEventListener("click",P),G.push(u))})):(b(1,d.textContent="Enable Translation Mode",d),_())}function P(V){if(V.target.closest(".modal"))return;const u=V.target.dataset.originalText||V.target.textContent.trim();g=V.target,b(2,X.textContent=u,X),b(3,m.value=R[u]||"",m),b(4,c.style.display="block",c)}function o(){console.log("saveTranslation");const V=X.textContent.trim(),u=m.value.trim();u?(R[V]=u,g.textContent=u):(delete R[V],g.textContent=V),localStorage.setItem("translations",JSON.stringify(R)),b(4,c.style.display="none",c)}function j(){b(4,c.style.display="none",c)}function z(V){U[V?"unshift":"push"](()=>{d=V,b(1,d)})}function e(V){U[V?"unshift":"push"](()=>{X=V,b(2,X)})}function ll(V){U[V?"unshift":"push"](()=>{m=V,b(3,m)})}function i(V){U[V?"unshift":"push"](()=>{c=V,b(4,c)})}return Z.$$.update=()=>{Z.$$.dirty&1&&J&&console.log("ready",J)},[J,d,X,m,c,I,n,o,j,z,e,ll,i]}class Nl extends ${constructor(l){super(),O(this,l,mZ,dZ,E,{},bZ)}}q(Nl,{},[],[],!0);function cZ(Z){let l,b;return l=new Nl({}),{c(){Rl(l.$$.fragment)},m(d,X){f(l,d,X),b=!0},i(d){b||(S(l.$$.fragment,d),b=!0)},o(d){x(l.$$.fragment,d),b=!1},d(d){D(l,d)}}}function GZ(Z){let l,b;return l=new Jl({props:{$$slots:{default:[cZ]},$$scope:{ctx:Z}}}),{c(){Rl(l.$$.fragment)},m(d,X){f(l,d,X),b=!0},p(d,[X]){const m={};X&1&&(m.$$scope={dirty:X,ctx:d}),l.$set(m)},i(d){b||(S(l.$$.fragment,d),b=!0)},o(d){x(l.$$.fragment,d),b=!1},d(d){D(l,d)}}}class Sl extends ${constructor(l){super(),O(this,l,null,GZ,E,{})}}customElements.define("bb-i18n",q(Sl,{},[],[],!0));const nl="dmFyIGZuPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgbW49KG50LGMsdCk9PmMgaW4gbnQ/Zm4obnQsYyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dH0pOm50W2NdPXQ7dmFyIEs9KG50LGMsdCk9Pm1uKG50LHR5cGVvZiBjIT0ic3ltYm9sIj9jKyIiOmMsdCk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBudDtmdW5jdGlvbiBfbWVyZ2VOYW1lc3BhY2VzKGMsdCl7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihyKXtyJiZ0eXBlb2YgciE9InN0cmluZyImJiFBcnJheS5pc0FycmF5KHIpJiZPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe2lmKG8hPT0iZGVmYXVsdCImJiEobyBpbiBjKSl7dmFyIHU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLG8pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLG8sdS5nZXQ/dTp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcltvXX19KX19KX0pLE9iamVjdC5mcmVlemUoYyl9ZnVuY3Rpb24gZGlzcGF0Y2hDYWxsYmFjayhjLHQpe2MmJmModCl9ZnVuY3Rpb24gcmV2ZXJzZURpY3Rpb25hcnkoYyl7cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhjKS5tYXAoKFt0LHJdKT0+W3IsdF0pKX1mdW5jdGlvbiBlc2NhcGVSZWdFeHAoYyl7cmV0dXJuIGMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csIlxcJCYiKX1jb25zdCBDYWxsYWJsZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe2xldCBjPWZ1bmN0aW9uKC4uLnQpe3JldHVybiBjLl9jYWxsKC4uLnQpfTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKGMsbmV3LnRhcmdldC5wcm90b3R5cGUpfV9jYWxsKC4uLmMpe3Rocm93IEVycm9yKCJNdXN0IGltcGxlbWVudCBfY2FsbCBtZXRob2QgaW4gc3ViY2xhc3MiKX19O2Z1bmN0aW9uIGlzVHlwZWRBcnJheShjKXt2YXIgdCxyLG87cmV0dXJuKChvPShyPSh0PWM9PW51bGw/dm9pZCAwOmMucHJvdG90eXBlKT09bnVsbD92b2lkIDA6dC5fX3Byb3RvX18pPT1udWxsP3ZvaWQgMDpyLmNvbnN0cnVjdG9yKT09bnVsbD92b2lkIDA6by5uYW1lKT09PSJUeXBlZEFycmF5In1mdW5jdGlvbiBpc0ludGVncmFsTnVtYmVyKGMpe3JldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGMpfHx0eXBlb2YgYz09ImJpZ2ludCJ9ZnVuY3Rpb24gZXhpc3RzKGMpe3JldHVybiBjIT1udWxsfWZ1bmN0aW9uIGNhbGN1bGF0ZURpbWVuc2lvbnMoYyl7Y29uc3QgdD1bXTtsZXQgcj1jO2Zvcig7QXJyYXkuaXNBcnJheShyKTspdC5wdXNoKHIubGVuZ3RoKSxyPXJbMF07cmV0dXJuIHR9ZnVuY3Rpb24gcG9wKGMsdCxyPXZvaWQgMCl7Y29uc3Qgbz1jW3RdO2lmKG8hPT12b2lkIDApcmV0dXJuIGRlbGV0ZSBjW3RdLG87aWYocj09PXZvaWQgMCl0aHJvdyBFcnJvcihgS2V5ICR7dH0gZG9lcyBub3QgZXhpc3QgaW4gb2JqZWN0LmApO3JldHVybiByfWZ1bmN0aW9uIG1lcmdlQXJyYXlzKC4uLmMpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGMpfWZ1bmN0aW9uIHByb2R1Y3QoLi4uYyl7cmV0dXJuIGMucmVkdWNlKCh0LHIpPT50LmZsYXRNYXAobz0+ci5tYXAodT0+W28sdV0pKSl9ZnVuY3Rpb24gY2FsY3VsYXRlUmVmbGVjdE9mZnNldChjLHQpe3JldHVybiBNYXRoLmFicygoYyt0KSUoMip0KS10KX12YXIgc2hhcnA9e30sT05OWF9OT0RFPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGRlZmF1bHQ6c2hhcnB9KTtmdW5jdGlvbiBnZXREZWZhdWx0RXhwb3J0RnJvbUNqcyhjKXtyZXR1cm4gYyYmYy5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYywiZGVmYXVsdCIpP2MuZGVmYXVsdDpjfWZ1bmN0aW9uIGdldEF1Z21lbnRlZE5hbWVzcGFjZShjKXtpZihjLl9fZXNNb2R1bGUpcmV0dXJuIGM7dmFyIHQ9Yy5kZWZhdWx0O2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXt2YXIgcj1mdW5jdGlvbiBvKCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBvP1JlZmxlY3QuY29uc3RydWN0KHQsYXJndW1lbnRzLHRoaXMuY29uc3RydWN0b3IpOnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtyLnByb3RvdHlwZT10LnByb3RvdHlwZX1lbHNlIHI9e307cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxPYmplY3Qua2V5cyhjKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe3ZhciB1PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYyxvKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocixvLHUuZ2V0P3U6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNbb119fSl9KSxyfXZhciBvcnRXZWJfbWluJDE9e2V4cG9ydHM6e319O2NvbnN0IGJhY2tlbmRzPXt9LGJhY2tlbmRzU29ydGVkQnlQcmlvcml0eT1bXSxyZWdpc3RlckJhY2tlbmQ9KGMsdCxyKT0+e2lmKHQmJnR5cGVvZiB0LmluaXQ9PSJmdW5jdGlvbiImJnR5cGVvZiB0LmNyZWF0ZVNlc3Npb25IYW5kbGVyPT0iZnVuY3Rpb24iKXtjb25zdCBvPWJhY2tlbmRzW2NdO2lmKG89PT12b2lkIDApYmFja2VuZHNbY109e2JhY2tlbmQ6dCxwcmlvcml0eTpyfTtlbHNle2lmKG8ucHJpb3JpdHk+cilyZXR1cm47aWYoby5wcmlvcml0eT09PXImJm8uYmFja2VuZCE9PXQpdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgcmVnaXN0ZXIgYmFja2VuZCAiJHtjfSIgdXNpbmcgcHJpb3JpdHkgJHtyfWApfWlmKHI+PTApe2NvbnN0IHU9YmFja2VuZHNTb3J0ZWRCeVByaW9yaXR5LmluZGV4T2YoYyk7dSE9PS0xJiZiYWNrZW5kc1NvcnRlZEJ5UHJpb3JpdHkuc3BsaWNlKHUsMSk7Zm9yKGxldCBoPTA7aDxiYWNrZW5kc1NvcnRlZEJ5UHJpb3JpdHkubGVuZ3RoO2grKylpZihiYWNrZW5kc1tiYWNrZW5kc1NvcnRlZEJ5UHJpb3JpdHlbaF1dLnByaW9yaXR5PD1yKXtiYWNrZW5kc1NvcnRlZEJ5UHJpb3JpdHkuc3BsaWNlKGgsMCxjKTtyZXR1cm59YmFja2VuZHNTb3J0ZWRCeVByaW9yaXR5LnB1c2goYyl9cmV0dXJufXRocm93IG5ldyBUeXBlRXJyb3IoIm5vdCBhIHZhbGlkIGJhY2tlbmQiKX0scmVzb2x2ZUJhY2tlbmQ9YXN5bmMgYz0+e2NvbnN0IHQ9Yy5sZW5ndGg9PT0wP2JhY2tlbmRzU29ydGVkQnlQcmlvcml0eTpjLHI9W107Zm9yKGNvbnN0IG8gb2YgdCl7Y29uc3QgdT1iYWNrZW5kc1tvXTtpZih1KXtpZih1LmluaXRpYWxpemVkKXJldHVybiB1LmJhY2tlbmQ7aWYodS5hYm9ydGVkKWNvbnRpbnVlO2NvbnN0IGg9ISF1LmluaXRQcm9taXNlO3RyeXtyZXR1cm4gaHx8KHUuaW5pdFByb21pc2U9dS5iYWNrZW5kLmluaXQoKSksYXdhaXQgdS5pbml0UHJvbWlzZSx1LmluaXRpYWxpemVkPSEwLHUuYmFja2VuZH1jYXRjaChhKXtofHxyLnB1c2goe25hbWU6byxlcnI6YX0pLHUuYWJvcnRlZD0hMH1maW5hbGx5e2RlbGV0ZSB1LmluaXRQcm9taXNlfX19dGhyb3cgbmV3IEVycm9yKGBubyBhdmFpbGFibGUgYmFja2VuZCBmb3VuZC4gRVJSOiAke3IubWFwKG89PmBbJHtvLm5hbWV9XSAke28uZXJyfWApLmpvaW4oIiwgIil9YCl9O2NsYXNzIEVudkltcGx7Y29uc3RydWN0b3IoKXt0aGlzLndhc209e30sdGhpcy53ZWJnbD17fSx0aGlzLmxvZ0xldmVsSW50ZXJuYWw9Indhcm5pbmcifXNldCBsb2dMZXZlbCh0KXtpZih0IT09dm9pZCAwKXtpZih0eXBlb2YgdCE9InN0cmluZyJ8fFsidmVyYm9zZSIsImluZm8iLCJ3YXJuaW5nIiwiZXJyb3IiLCJmYXRhbCJdLmluZGV4T2YodCk9PT0tMSl0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvZ2dpbmcgbGV2ZWw6ICR7dH1gKTt0aGlzLmxvZ0xldmVsSW50ZXJuYWw9dH19Z2V0IGxvZ0xldmVsKCl7cmV0dXJuIHRoaXMubG9nTGV2ZWxJbnRlcm5hbH19Y29uc3QgZW52JDI9bmV3IEVudkltcGwsaXNCaWdJbnQ2NEFycmF5QXZhaWxhYmxlPXR5cGVvZiBCaWdJbnQ2NEFycmF5PCJ1IiYmdHlwZW9mIEJpZ0ludDY0QXJyYXkuZnJvbT09ImZ1bmN0aW9uIixpc0JpZ1VpbnQ2NEFycmF5QXZhaWxhYmxlPXR5cGVvZiBCaWdVaW50NjRBcnJheTwidSImJnR5cGVvZiBCaWdVaW50NjRBcnJheS5mcm9tPT0iZnVuY3Rpb24iLE5VTUVSSUNfVEVOU09SX1RZUEVfVE9fVFlQRURBUlJBWV9NQVA9bmV3IE1hcChbWyJmbG9hdDMyIixGbG9hdDMyQXJyYXldLFsidWludDgiLFVpbnQ4QXJyYXldLFsiaW50OCIsSW50OEFycmF5XSxbInVpbnQxNiIsVWludDE2QXJyYXldLFsiaW50MTYiLEludDE2QXJyYXldLFsiaW50MzIiLEludDMyQXJyYXldLFsiYm9vbCIsVWludDhBcnJheV0sWyJmbG9hdDY0IixGbG9hdDY0QXJyYXldLFsidWludDMyIixVaW50MzJBcnJheV1dKSxOVU1FUklDX1RFTlNPUl9UWVBFREFSUkFZX1RPX1RZUEVfTUFQPW5ldyBNYXAoW1tGbG9hdDMyQXJyYXksImZsb2F0MzIiXSxbVWludDhBcnJheSwidWludDgiXSxbSW50OEFycmF5LCJpbnQ4Il0sW1VpbnQxNkFycmF5LCJ1aW50MTYiXSxbSW50MTZBcnJheSwiaW50MTYiXSxbSW50MzJBcnJheSwiaW50MzIiXSxbRmxvYXQ2NEFycmF5LCJmbG9hdDY0Il0sW1VpbnQzMkFycmF5LCJ1aW50MzIiXV0pO2lzQmlnSW50NjRBcnJheUF2YWlsYWJsZSYmKE5VTUVSSUNfVEVOU09SX1RZUEVfVE9fVFlQRURBUlJBWV9NQVAuc2V0KCJpbnQ2NCIsQmlnSW50NjRBcnJheSksTlVNRVJJQ19URU5TT1JfVFlQRURBUlJBWV9UT19UWVBFX01BUC5zZXQoQmlnSW50NjRBcnJheSwiaW50NjQiKSksaXNCaWdVaW50NjRBcnJheUF2YWlsYWJsZSYmKE5VTUVSSUNfVEVOU09SX1RZUEVfVE9fVFlQRURBUlJBWV9NQVAuc2V0KCJ1aW50NjQiLEJpZ1VpbnQ2NEFycmF5KSxOVU1FUklDX1RFTlNPUl9UWVBFREFSUkFZX1RPX1RZUEVfTUFQLnNldChCaWdVaW50NjRBcnJheSwidWludDY0IikpO2NvbnN0IGNhbGN1bGF0ZVNpemU9Yz0+e2xldCB0PTE7Zm9yKGxldCByPTA7cjxjLmxlbmd0aDtyKyspe2NvbnN0IG89Y1tyXTtpZih0eXBlb2YgbyE9Im51bWJlciJ8fCFOdW1iZXIuaXNTYWZlSW50ZWdlcihvKSl0aHJvdyBuZXcgVHlwZUVycm9yKGBkaW1zWyR7cn1dIG11c3QgYmUgYW4gaW50ZWdlciwgZ290OiAke299YCk7aWYobzwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBkaW1zWyR7cn1dIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290OiAke299YCk7dCo9b31yZXR1cm4gdH07bGV0IFRlbnNvciQyPWNsYXNzIGx0e2NvbnN0cnVjdG9yKHQscixvKXtsZXQgdSxoLGE7aWYodHlwZW9mIHQ9PSJzdHJpbmciKWlmKHU9dCxhPW8sdD09PSJzdHJpbmciKXtpZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHN0cmluZyB0ZW5zb3IncyBkYXRhIG11c3QgYmUgYSBzdHJpbmcgYXJyYXkuIik7aD1yfWVsc2V7Y29uc3QgZj1OVU1FUklDX1RFTlNPUl9UWVBFX1RPX1RZUEVEQVJSQVlfTUFQLmdldCh0KTtpZihmPT09dm9pZCAwKXRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHRlbnNvciB0eXBlOiAke3R9LmApO2lmKEFycmF5LmlzQXJyYXkocikpaD1mLmZyb20ocik7ZWxzZSBpZihyIGluc3RhbmNlb2YgZiloPXI7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKGBBICR7dX0gdGVuc29yJ3MgZGF0YSBtdXN0IGJlIHR5cGUgb2YgJHtmfWApfWVsc2UgaWYoYT1yLEFycmF5LmlzQXJyYXkodCkpe2lmKHQubGVuZ3RoPT09MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJUZW5zb3IgdHlwZSBjYW5ub3QgYmUgaW5mZXJyZWQgZnJvbSBhbiBlbXB0eSBhcnJheS4iKTtjb25zdCBmPXR5cGVvZiB0WzBdO2lmKGY9PT0ic3RyaW5nIil1PSJzdHJpbmciLGg9dDtlbHNlIGlmKGY9PT0iYm9vbGVhbiIpdT0iYm9vbCIsaD1VaW50OEFycmF5LmZyb20odCk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZSBvZiBkYXRhIGFycmF5OiAke2Z9LmApfWVsc2V7Y29uc3QgZj1OVU1FUklDX1RFTlNPUl9UWVBFREFSUkFZX1RPX1RZUEVfTUFQLmdldCh0LmNvbnN0cnVjdG9yKTtpZihmPT09dm9pZCAwKXRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGUgZm9yIHRlbnNvciBkYXRhOiAke3QuY29uc3RydWN0b3J9LmApO3U9ZixoPXR9aWYoYT09PXZvaWQgMClhPVtoLmxlbmd0aF07ZWxzZSBpZighQXJyYXkuaXNBcnJheShhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHRlbnNvcidzIGRpbXMgbXVzdCBiZSBhIG51bWJlciBhcnJheSIpO2NvbnN0IHA9Y2FsY3VsYXRlU2l6ZShhKTtpZihwIT09aC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBUZW5zb3IncyBzaXplKCR7cH0pIGRvZXMgbm90IG1hdGNoIGRhdGEgbGVuZ3RoKCR7aC5sZW5ndGh9KS5gKTt0aGlzLmRpbXM9YSx0aGlzLnR5cGU9dSx0aGlzLmRhdGE9aCx0aGlzLnNpemU9cH1zdGF0aWMgYnVmZmVyVG9UZW5zb3IodCxyKXtpZih0PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgYnVmZmVyIG11c3QgYmUgZGVmaW5lZCIpO2lmKHIuaGVpZ2h0PT09dm9pZCAwfHxyLndpZHRoPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgaGVpZ2h0IGFuZCB3aWR0aCBtdXN0IGJlIGRlZmluZWQiKTtjb25zdHtoZWlnaHQ6byx3aWR0aDp1fT1yLGg9ci5ub3JtO2xldCBhLHA7aD09PXZvaWQgMHx8aC5tZWFuPT09dm9pZCAwP2E9MjU1OmE9aC5tZWFuLGg9PT12b2lkIDB8fGguYmlhcz09PXZvaWQgMD9wPTA6cD1oLmJpYXM7Y29uc3QgZj1yLmJpdG1hcEZvcm1hdCE9PXZvaWQgMD9yLmJpdG1hcEZvcm1hdDoiUkdCQSIsZD1yLnRlbnNvckZvcm1hdCE9PXZvaWQgMCYmci50ZW5zb3JGb3JtYXQhPT12b2lkIDA/ci50ZW5zb3JGb3JtYXQ6IlJHQiIsbD1vKnUsbj1kPT09IlJHQkEiP25ldyBGbG9hdDMyQXJyYXkobCo0KTpuZXcgRmxvYXQzMkFycmF5KGwqMyk7bGV0IGU9NCxpPTAscz0xLG09MixnPTMsXz0wLGI9bCx5PWwqMixUPS0xO2Y9PT0iUkdCIiYmKGU9MyxpPTAscz0xLG09MixnPS0xKSxkPT09IlJHQkEiP1Q9bCozOmQ9PT0iUkJHIj8oXz0wLHk9bCxiPWwqMik6ZD09PSJCR1IiJiYoeT0wLGI9bCxfPWwqMik7Zm9yKGxldCB4PTA7eDxsO3grKyxpKz1lLG0rPWUscys9ZSxnKz1lKW5bXysrXT0odFtpXStwKS9hLG5bYisrXT0odFtzXStwKS9hLG5beSsrXT0odFttXStwKS9hLFQhPT0tMSYmZyE9PS0xJiYobltUKytdPSh0W2ddK3ApL2EpO3JldHVybiBkPT09IlJHQkEiP25ldyBsdCgiZmxvYXQzMiIsbixbMSw0LG8sdV0pOm5ldyBsdCgiZmxvYXQzMiIsbixbMSwzLG8sdV0pfXN0YXRpYyBhc3luYyBmcm9tSW1hZ2UodCxyKXtjb25zdCBvPXR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50PCJ1IiYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQsdT10eXBlb2YgSW1hZ2VEYXRhPCJ1IiYmdCBpbnN0YW5jZW9mIEltYWdlRGF0YSxoPXR5cGVvZiBJbWFnZUJpdG1hcDwidSImJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCxhPXR5cGVvZiBTdHJpbmc8InUiJiYodCBpbnN0YW5jZW9mIFN0cmluZ3x8dHlwZW9mIHQ9PSJzdHJpbmciKTtsZXQgcCxmPXt9O2lmKG8pe2NvbnN0IGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksbD1kLmdldENvbnRleHQoIjJkIik7aWYobCE9bnVsbCl7bGV0IG49dC5uYXR1cmFsSGVpZ2h0LGU9dC5uYXR1cmFsV2lkdGg7aWYociE9PXZvaWQgMCYmci5yZXNpemVkSGVpZ2h0IT09dm9pZCAwJiZyLnJlc2l6ZWRXaWR0aCE9PXZvaWQgMCYmKG49ci5yZXNpemVkSGVpZ2h0LGU9ci5yZXNpemVkV2lkdGgpLHIhPT12b2lkIDApe2lmKGY9cixyLnRlbnNvckZvcm1hdCE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIkltYWdlIGlucHV0IGNvbmZpZyBmb3JtYXQgbXVzdCBiZSBSR0JBIGZvciBIVE1MSW1hZ2VFbGVtZW50Iik7aWYoZi50ZW5zb3JGb3JtYXQ9IlJHQkEiLHIuaGVpZ2h0IT09dm9pZCAwJiZyLmhlaWdodCE9PW4pdGhyb3cgbmV3IEVycm9yKCJJbWFnZSBpbnB1dCBjb25maWcgaGVpZ2h0IGRvZXNuJ3QgbWF0Y2ggSFRNTEltYWdlRWxlbWVudCBoZWlnaHQiKTtpZihmLmhlaWdodD1uLHIud2lkdGghPT12b2lkIDAmJnIud2lkdGghPT1lKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgaW5wdXQgY29uZmlnIHdpZHRoIGRvZXNuJ3QgbWF0Y2ggSFRNTEltYWdlRWxlbWVudCB3aWR0aCIpO2Yud2lkdGg9ZX1lbHNlIGYudGVuc29yRm9ybWF0PSJSR0JBIixmLmhlaWdodD1uLGYud2lkdGg9ZTtkLndpZHRoPWUsZC5oZWlnaHQ9bixsLmRyYXdJbWFnZSh0LDAsMCxlLG4pLHA9bC5nZXRJbWFnZURhdGEoMCwwLGUsbikuZGF0YX1lbHNlIHRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpfWVsc2UgaWYodSl7Y29uc3QgZD0iUkdCQSI7bGV0IGwsbjtpZihyIT09dm9pZCAwJiZyLnJlc2l6ZWRXaWR0aCE9PXZvaWQgMCYmci5yZXNpemVkSGVpZ2h0IT09dm9pZCAwPyhsPXIucmVzaXplZEhlaWdodCxuPXIucmVzaXplZFdpZHRoKToobD10LmhlaWdodCxuPXQud2lkdGgpLHIhPT12b2lkIDApe2lmKGY9cixyLmJpdG1hcEZvcm1hdCE9PXZvaWQgMCYmci5iaXRtYXBGb3JtYXQhPT1kKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgaW5wdXQgY29uZmlnIGZvcm1hdCBtdXN0IGJlIFJHQkEgZm9yIEltYWdlRGF0YSIpO2YuYml0bWFwRm9ybWF0PSJSR0JBIn1lbHNlIGYuYml0bWFwRm9ybWF0PSJSR0JBIjtpZihmLmhlaWdodD1sLGYud2lkdGg9bixyIT09dm9pZCAwKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2Uud2lkdGg9bixlLmhlaWdodD1sO2NvbnN0IGk9ZS5nZXRDb250ZXh0KCIyZCIpO2lmKGkhPW51bGwpaS5wdXRJbWFnZURhdGEodCwwLDApLHA9aS5nZXRJbWFnZURhdGEoMCwwLG4sbCkuZGF0YTtlbHNlIHRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpfWVsc2UgcD10LmRhdGF9ZWxzZSBpZihoKXtpZihyPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiUGxlYXNlIHByb3ZpZGUgaW1hZ2UgY29uZmlnIHdpdGggZm9ybWF0IGZvciBJbWFnZWJpdG1hcCIpO2lmKHIuYml0bWFwRm9ybWF0IT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgaW5wdXQgY29uZmlnIGZvcm1hdCBtdXN0IGJlIGRlZmluZWQgZm9yIEltYWdlQml0bWFwIik7Y29uc3QgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpO2lmKGQhPW51bGwpe2NvbnN0IGw9dC5oZWlnaHQsbj10LndpZHRoO2lmKGQuZHJhd0ltYWdlKHQsMCwwLG4sbCkscD1kLmdldEltYWdlRGF0YSgwLDAsbixsKS5kYXRhLHIhPT12b2lkIDApe2lmKHIuaGVpZ2h0IT09dm9pZCAwJiZyLmhlaWdodCE9PWwpdGhyb3cgbmV3IEVycm9yKCJJbWFnZSBpbnB1dCBjb25maWcgaGVpZ2h0IGRvZXNuJ3QgbWF0Y2ggSW1hZ2VCaXRtYXAgaGVpZ2h0Iik7aWYoZi5oZWlnaHQ9bCxyLndpZHRoIT09dm9pZCAwJiZyLndpZHRoIT09bil0aHJvdyBuZXcgRXJyb3IoIkltYWdlIGlucHV0IGNvbmZpZyB3aWR0aCBkb2Vzbid0IG1hdGNoIEltYWdlQml0bWFwIHdpZHRoIik7Zi53aWR0aD1ufWVsc2UgZi5oZWlnaHQ9bCxmLndpZHRoPW47cmV0dXJuIGx0LmJ1ZmZlclRvVGVuc29yKHAsZil9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgYWNjZXNzIGltYWdlIGRhdGEiKX1lbHNle2lmKGEpcmV0dXJuIG5ldyBQcm9taXNlKChkLGwpPT57Y29uc3Qgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxlPW4uZ2V0Q29udGV4dCgiMmQiKTtpZighdHx8IWUpcmV0dXJuIGwoKTtjb25zdCBpPW5ldyBJbWFnZTtpLmNyb3NzT3JpZ2luPSJBbm9ueW1vdXMiLGkuc3JjPXQsaS5vbmxvYWQ9KCk9PntuLndpZHRoPWkud2lkdGgsbi5oZWlnaHQ9aS5oZWlnaHQsZS5kcmF3SW1hZ2UoaSwwLDAsbi53aWR0aCxuLmhlaWdodCk7Y29uc3Qgcz1lLmdldEltYWdlRGF0YSgwLDAsbi53aWR0aCxuLmhlaWdodCk7aWYociE9PXZvaWQgMCl7aWYoci5oZWlnaHQhPT12b2lkIDAmJnIuaGVpZ2h0IT09bi5oZWlnaHQpdGhyb3cgbmV3IEVycm9yKCJJbWFnZSBpbnB1dCBjb25maWcgaGVpZ2h0IGRvZXNuJ3QgbWF0Y2ggSW1hZ2VCaXRtYXAgaGVpZ2h0Iik7aWYoZi5oZWlnaHQ9bi5oZWlnaHQsci53aWR0aCE9PXZvaWQgMCYmci53aWR0aCE9PW4ud2lkdGgpdGhyb3cgbmV3IEVycm9yKCJJbWFnZSBpbnB1dCBjb25maWcgd2lkdGggZG9lc24ndCBtYXRjaCBJbWFnZUJpdG1hcCB3aWR0aCIpO2Yud2lkdGg9bi53aWR0aH1lbHNlIGYuaGVpZ2h0PW4uaGVpZ2h0LGYud2lkdGg9bi53aWR0aDtkKGx0LmJ1ZmZlclRvVGVuc29yKHMuZGF0YSxmKSl9fSk7dGhyb3cgbmV3IEVycm9yKCJJbnB1dCBkYXRhIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQgLSBhYm9ydGVkIHRlbnNvciBjcmVhdGlvbiIpfWlmKHAhPT12b2lkIDApcmV0dXJuIGx0LmJ1ZmZlclRvVGVuc29yKHAsZik7dGhyb3cgbmV3IEVycm9yKCJJbnB1dCBkYXRhIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQgLSBhYm9ydGVkIHRlbnNvciBjcmVhdGlvbiIpfXRvSW1hZ2VEYXRhKHQpe3ZhciByLG87Y29uc3QgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpO2xldCBoO2lmKHUhPW51bGwpe2NvbnN0IGE9dGhpcy5kaW1zWzNdLHA9dGhpcy5kaW1zWzJdLGY9dGhpcy5kaW1zWzFdLGQ9dCE9PXZvaWQgMCYmdC5mb3JtYXQhPT12b2lkIDA/dC5mb3JtYXQ6IlJHQiIsbD10IT09dm9pZCAwJiYoKHI9dC5ub3JtKT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIubWVhbikhPT12b2lkIDA/dC5ub3JtLm1lYW46MjU1LG49dCE9PXZvaWQgMCYmKChvPXQubm9ybSk9PT1udWxsfHxvPT09dm9pZCAwP3ZvaWQgMDpvLmJpYXMpIT09dm9pZCAwP3Qubm9ybS5iaWFzOjAsZT1wKmE7aWYodCE9PXZvaWQgMCl7aWYodC5oZWlnaHQhPT12b2lkIDAmJnQuaGVpZ2h0IT09cCl0aHJvdyBuZXcgRXJyb3IoIkltYWdlIG91dHB1dCBjb25maWcgaGVpZ2h0IGRvZXNuJ3QgbWF0Y2ggdGVuc29yIGhlaWdodCIpO2lmKHQud2lkdGghPT12b2lkIDAmJnQud2lkdGghPT1hKXRocm93IG5ldyBFcnJvcigiSW1hZ2Ugb3V0cHV0IGNvbmZpZyB3aWR0aCBkb2Vzbid0IG1hdGNoIHRlbnNvciB3aWR0aCIpO2lmKHQuZm9ybWF0IT09dm9pZCAwJiZmPT09NCYmdC5mb3JtYXQhPT0iUkdCQSJ8fGY9PT0zJiZ0LmZvcm1hdCE9PSJSR0IiJiZ0LmZvcm1hdCE9PSJCR1IiKXRocm93IG5ldyBFcnJvcigiVGVuc29yIGZvcm1hdCBkb2Vzbid0IG1hdGNoIGlucHV0IHRlbnNvciBkaW1zIil9Y29uc3QgaT00O2xldCBzPTAsbT0xLGc9MixfPTMsYj0wLHk9ZSxUPWUqMix3PS0xO2Q9PT0iUkdCQSI/KGI9MCx5PWUsVD1lKjIsdz1lKjMpOmQ9PT0iUkdCIj8oYj0wLHk9ZSxUPWUqMik6ZD09PSJSQkciJiYoYj0wLFQ9ZSx5PWUqMiksaD11LmNyZWF0ZUltYWdlRGF0YShhLHApO2ZvcihsZXQgeD0wO3g8cCphO3MrPWksbSs9aSxnKz1pLF8rPWkseCsrKWguZGF0YVtzXT0odGhpcy5kYXRhW2IrK10tbikqbCxoLmRhdGFbbV09KHRoaXMuZGF0YVt5KytdLW4pKmwsaC5kYXRhW2ddPSh0aGlzLmRhdGFbVCsrXS1uKSpsLGguZGF0YVtfXT13PT09LTE/MjU1Oih0aGlzLmRhdGFbdysrXS1uKSpsfWVsc2UgdGhyb3cgbmV3IEVycm9yKCJDYW4gbm90IGFjY2VzcyBpbWFnZSBkYXRhIik7cmV0dXJuIGh9cmVzaGFwZSh0KXtyZXR1cm4gbmV3IGx0KHRoaXMudHlwZSx0aGlzLmRhdGEsdCl9fTtjb25zdCBUZW5zb3IkMT1UZW5zb3IkMjtsZXQgSW5mZXJlbmNlU2Vzc2lvbiQyPWNsYXNzIGRue2NvbnN0cnVjdG9yKHQpe3RoaXMuaGFuZGxlcj10fWFzeW5jIHJ1bih0LHIsbyl7Y29uc3QgdT17fTtsZXQgaD17fTtpZih0eXBlb2YgdCE9Im9iamVjdCJ8fHQ9PT1udWxsfHx0IGluc3RhbmNlb2YgVGVuc29yJDF8fEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2ZlZWRzJyBtdXN0IGJlIGFuIG9iamVjdCB0aGF0IHVzZSBpbnB1dCBuYW1lcyBhcyBrZXlzIGFuZCBPbm54VmFsdWUgYXMgY29ycmVzcG9uZGluZyB2YWx1ZXMuIik7bGV0IGE9ITA7aWYodHlwZW9mIHI9PSJvYmplY3QiKXtpZihyPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmV4cGVjdGVkIGFyZ3VtZW50WzFdOiBjYW5ub3QgYmUgbnVsbC4iKTtpZihyIGluc3RhbmNlb2YgVGVuc29yJDEpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2ZldGNoZXMnIGNhbm5vdCBiZSBhIFRlbnNvciIpO2lmKEFycmF5LmlzQXJyYXkocikpe2lmKHIubGVuZ3RoPT09MCl0aHJvdyBuZXcgVHlwZUVycm9yKCInZmV0Y2hlcycgY2Fubm90IGJlIGFuIGVtcHR5IGFycmF5LiIpO2E9ITE7Zm9yKGNvbnN0IGQgb2Ygcil7aWYodHlwZW9mIGQhPSJzdHJpbmciKXRocm93IG5ldyBUeXBlRXJyb3IoIidmZXRjaGVzJyBtdXN0IGJlIGEgc3RyaW5nIGFycmF5IG9yIGFuIG9iamVjdC4iKTtpZih0aGlzLm91dHB1dE5hbWVzLmluZGV4T2YoZCk9PT0tMSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJ2ZldGNoZXMnIGNvbnRhaW5zIGludmFsaWQgb3V0cHV0IG5hbWU6ICR7ZH0uYCk7dVtkXT1udWxsfWlmKHR5cGVvZiBvPT0ib2JqZWN0IiYmbyE9PW51bGwpaD1vO2Vsc2UgaWYodHlwZW9mIG88InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNle2xldCBkPSExO2NvbnN0IGw9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocik7Zm9yKGNvbnN0IG4gb2YgdGhpcy5vdXRwdXROYW1lcylpZihsLmluZGV4T2YobikhPT0tMSl7Y29uc3QgZT1yW25dOyhlPT09bnVsbHx8ZSBpbnN0YW5jZW9mIFRlbnNvciQxKSYmKGQ9ITAsYT0hMSx1W25dPWUpfWlmKGQpe2lmKHR5cGVvZiBvPT0ib2JqZWN0IiYmbyE9PW51bGwpaD1vO2Vsc2UgaWYodHlwZW9mIG88InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGg9cn19ZWxzZSBpZih0eXBlb2YgcjwidSIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5leHBlY3RlZCBhcmd1bWVudFsxXTogbXVzdCBiZSAnZmV0Y2hlcycgb3IgJ29wdGlvbnMnLiIpO2Zvcihjb25zdCBkIG9mIHRoaXMuaW5wdXROYW1lcylpZih0eXBlb2YgdFtkXT4idSIpdGhyb3cgbmV3IEVycm9yKGBpbnB1dCAnJHtkfScgaXMgbWlzc2luZyBpbiAnZmVlZHMnLmApO2lmKGEpZm9yKGNvbnN0IGQgb2YgdGhpcy5vdXRwdXROYW1lcyl1W2RdPW51bGw7Y29uc3QgcD1hd2FpdCB0aGlzLmhhbmRsZXIucnVuKHQsdSxoKSxmPXt9O2Zvcihjb25zdCBkIGluIHApT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwocCxkKSYmKGZbZF09bmV3IFRlbnNvciQxKHBbZF0udHlwZSxwW2RdLmRhdGEscFtkXS5kaW1zKSk7cmV0dXJuIGZ9c3RhdGljIGFzeW5jIGNyZWF0ZSh0LHIsbyx1KXtsZXQgaCxhPXt9O2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7aWYoaD10LHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwpYT1yO2Vsc2UgaWYodHlwZW9mIHI8InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGlmKHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtpZihoPXQsdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbClhPXI7ZWxzZSBpZih0eXBlb2YgcjwidSIpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ29wdGlvbnMnIG11c3QgYmUgYW4gb2JqZWN0LiIpfWVsc2UgaWYodCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHx0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXI8InUiJiZ0IGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpe2NvbnN0IG49dDtsZXQgZT0wLGk9dC5ieXRlTGVuZ3RoO2lmKHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwpYT1yO2Vsc2UgaWYodHlwZW9mIHI9PSJudW1iZXIiKXtpZihlPXIsIU51bWJlci5pc1NhZmVJbnRlZ2VyKGUpKXRocm93IG5ldyBSYW5nZUVycm9yKCInYnl0ZU9mZnNldCcgbXVzdCBiZSBhbiBpbnRlZ2VyLiIpO2lmKGU8MHx8ZT49bi5ieXRlTGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKGAnYnl0ZU9mZnNldCcgaXMgb3V0IG9mIHJhbmdlIFswLCAke24uYnl0ZUxlbmd0aH0pLmApO2lmKGk9dC5ieXRlTGVuZ3RoLWUsdHlwZW9mIG89PSJudW1iZXIiKXtpZihpPW8sIU51bWJlci5pc1NhZmVJbnRlZ2VyKGkpKXRocm93IG5ldyBSYW5nZUVycm9yKCInYnl0ZUxlbmd0aCcgbXVzdCBiZSBhbiBpbnRlZ2VyLiIpO2lmKGk8PTB8fGUraT5uLmJ5dGVMZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCdieXRlTGVuZ3RoJyBpcyBvdXQgb2YgcmFuZ2UgKDAsICR7bi5ieXRlTGVuZ3RoLWV9XS5gKTtpZih0eXBlb2YgdT09Im9iamVjdCImJnUhPT1udWxsKWE9dTtlbHNlIGlmKHR5cGVvZiB1PCJ1Iil0aHJvdyBuZXcgVHlwZUVycm9yKCInb3B0aW9ucycgbXVzdCBiZSBhbiBvYmplY3QuIil9ZWxzZSBpZih0eXBlb2YgbzwidSIpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2J5dGVMZW5ndGgnIG11c3QgYmUgYSBudW1iZXIuIil9ZWxzZSBpZih0eXBlb2YgcjwidSIpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ29wdGlvbnMnIG11c3QgYmUgYW4gb2JqZWN0LiIpO2g9bmV3IFVpbnQ4QXJyYXkobixlLGkpfWVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5leHBlY3RlZCBhcmd1bWVudFswXTogbXVzdCBiZSAncGF0aCcgb3IgJ2J1ZmZlcicuIik7Y29uc3QgZj0oYS5leGVjdXRpb25Qcm92aWRlcnN8fFtdKS5tYXAobj0+dHlwZW9mIG49PSJzdHJpbmciP246bi5uYW1lKSxsPWF3YWl0KGF3YWl0IHJlc29sdmVCYWNrZW5kKGYpKS5jcmVhdGVTZXNzaW9uSGFuZGxlcihoLGEpO3JldHVybiBuZXcgZG4obCl9c3RhcnRQcm9maWxpbmcoKXt0aGlzLmhhbmRsZXIuc3RhcnRQcm9maWxpbmcoKX1lbmRQcm9maWxpbmcoKXt0aGlzLmhhbmRsZXIuZW5kUHJvZmlsaW5nKCl9Z2V0IGlucHV0TmFtZXMoKXtyZXR1cm4gdGhpcy5oYW5kbGVyLmlucHV0TmFtZXN9Z2V0IG91dHB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuaGFuZGxlci5vdXRwdXROYW1lc319O2NvbnN0IEluZmVyZW5jZVNlc3Npb24kMT1JbmZlcmVuY2VTZXNzaW9uJDI7dmFyIGxpYj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxJbmZlcmVuY2VTZXNzaW9uOkluZmVyZW5jZVNlc3Npb24kMSxUZW5zb3I6VGVuc29yJDEsZW52OmVudiQyLHJlZ2lzdGVyQmFja2VuZH0pLHJlcXVpcmUkJDA9Z2V0QXVnbWVudGVkTmFtZXNwYWNlKGxpYik7LyohCiogT05OWCBSdW50aW1lIFdlYiB2MS4xNC4wCiogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgoqLyhmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGMsdCl7bW9kdWxlLmV4cG9ydHM9dChyZXF1aXJlJCQwKX0pKHNlbGYsX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTY3MF9fPT4oKCk9Pnt2YXIgX193ZWJwYWNrX21vZHVsZXNfXz17MzQ3NDooYyx0LHIpPT57dmFyIG8sdT0obz0obz10eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOnZvaWQgMCl8fCIvaW5kZXguanMiLGZ1bmN0aW9uKGgpe2Z1bmN0aW9uIGEoKXtyZXR1cm4gRy5idWZmZXIhPUomJkFlKEcuYnVmZmVyKSxsZX1mdW5jdGlvbiBwKCl7cmV0dXJuIEcuYnVmZmVyIT1KJiZBZShHLmJ1ZmZlcikseGV9ZnVuY3Rpb24gZigpe3JldHVybiBHLmJ1ZmZlciE9SiYmQWUoRy5idWZmZXIpLHdlfWZ1bmN0aW9uIGQoKXtyZXR1cm4gRy5idWZmZXIhPUomJkFlKEcuYnVmZmVyKSxpZX1mdW5jdGlvbiBsKCl7cmV0dXJuIEcuYnVmZmVyIT1KJiZBZShHLmJ1ZmZlciksVGV9dmFyIG4sZSxpO2g9aHx8e30sbnx8KG49aCE9PXZvaWQgMD9oOnt9KSxuLnJlYWR5PW5ldyBQcm9taXNlKGZ1bmN0aW9uKFMsQSl7ZT1TLGk9QX0pO3ZhciBzLG0sZyxfLGIseSxUPU9iamVjdC5hc3NpZ24oe30sbiksdz0iLi90aGlzLnByb2dyYW0iLHg9KFMsQSk9Pnt0aHJvdyBBfSxFPXR5cGVvZiB3aW5kb3c9PSJvYmplY3QiLFA9dHlwZW9mIGltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiIsdj10eXBlb2YgcHJvY2Vzcz09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT0ib2JqZWN0IiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZT09InN0cmluZyIsTT1uLkVOVklST05NRU5UX0lTX1BUSFJFQUR8fCExLCQ9IiI7ZnVuY3Rpb24geihTKXtyZXR1cm4gbi5sb2NhdGVGaWxlP24ubG9jYXRlRmlsZShTLCQpOiQrU31pZih2KXtsZXQgUzskPVA/cig5MDgpLmRpcm5hbWUoJCkrIi8iOiIvLyIseT0oKT0+e2J8fChfPXIoMTM4NCksYj1yKDkwOCkpfSxzPWZ1bmN0aW9uKEEsayl7cmV0dXJuIHkoKSxBPWIubm9ybWFsaXplKEEpLF8ucmVhZEZpbGVTeW5jKEEsaz92b2lkIDA6InV0ZjgiKX0sZz1BPT4oKEE9cyhBLCEwKSkuYnVmZmVyfHwoQT1uZXcgVWludDhBcnJheShBKSksQSksbT0oQSxrLEwpPT57eSgpLEE9Yi5ub3JtYWxpemUoQSksXy5yZWFkRmlsZShBLGZ1bmN0aW9uKFYscSl7Vj9MKFYpOmsocS5idWZmZXIpfSl9LDE8cHJvY2Vzcy5hcmd2Lmxlbmd0aCYmKHc9cHJvY2Vzcy5hcmd2WzFdLnJlcGxhY2UoL1xcL2csIi8iKSkscHJvY2Vzcy5hcmd2LnNsaWNlKDIpLHByb2Nlc3Mub24oInVuY2F1Z2h0RXhjZXB0aW9uIixmdW5jdGlvbihBKXtpZighKEEgaW5zdGFuY2VvZiBaZSkpdGhyb3cgQX0pLHByb2Nlc3Mub24oInVuaGFuZGxlZFJlamVjdGlvbiIsZnVuY3Rpb24oQSl7dGhyb3cgQX0pLHg9KEEsayk9PntpZihxZSgpKXRocm93IHByb2Nlc3MuZXhpdENvZGU9QSxrO2sgaW5zdGFuY2VvZiBaZXx8RigiZXhpdGluZyBkdWUgdG8gZXhjZXB0aW9uOiAiK2spLHByb2Nlc3MuZXhpdChBKX0sbi5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIn07dHJ5e1M9cig5OTI1KX1jYXRjaChBKXt0aHJvdyBjb25zb2xlLmVycm9yKCdUaGUgIndvcmtlcl90aHJlYWRzIiBtb2R1bGUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIG5vZGUuanMgYnVpbGQgLSBwZXJoYXBzIGEgbmV3ZXIgdmVyc2lvbiBpcyBuZWVkZWQ/JyksQX1yLmcuV29ya2VyPVMuV29ya2VyfWVsc2UoRXx8UCkmJihQPyQ9c2VsZi5sb2NhdGlvbi5ocmVmOnR5cGVvZiBkb2N1bWVudDwidSImJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQmJigkPWRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjKSxvJiYoJD1vKSwkPSQuaW5kZXhPZigiYmxvYjoiKSE9PTA/JC5zdWJzdHIoMCwkLnJlcGxhY2UoL1s/I10uKi8sIiIpLmxhc3RJbmRleE9mKCIvIikrMSk6IiIsdnx8KHM9Uz0+e3ZhciBBPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gQS5vcGVuKCJHRVQiLFMsITEpLEEuc2VuZChudWxsKSxBLnJlc3BvbnNlVGV4dH0sUCYmKGc9Uz0+e3ZhciBBPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gQS5vcGVuKCJHRVQiLFMsITEpLEEucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsQS5zZW5kKG51bGwpLG5ldyBVaW50OEFycmF5KEEucmVzcG9uc2UpfSksbT0oUyxBLGspPT57dmFyIEw9bmV3IFhNTEh0dHBSZXF1ZXN0O0wub3BlbigiR0VUIixTLCEwKSxMLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLEwub25sb2FkPSgpPT57TC5zdGF0dXM9PTIwMHx8TC5zdGF0dXM9PTAmJkwucmVzcG9uc2U/QShMLnJlc3BvbnNlKTprKCl9LEwub25lcnJvcj1rLEwuc2VuZChudWxsKX0pKTt2JiZ0eXBlb2YgcGVyZm9ybWFuY2U+InUiJiYoci5nLnBlcmZvcm1hbmNlPXIoNjk1MykucGVyZm9ybWFuY2UpO3ZhciBCPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksTj1jb25zb2xlLndhcm4uYmluZChjb25zb2xlKTt2JiYoeSgpLEI9Uz0+Xy53cml0ZVN5bmMoMSxTK2AKYCksTj1TPT5fLndyaXRlU3luYygyLFMrYApgKSk7dmFyIEQsST1uLnByaW50fHxCLEY9bi5wcmludEVycnx8TjtPYmplY3QuYXNzaWduKG4sVCksVD1udWxsLG4udGhpc1Byb2dyYW0mJih3PW4udGhpc1Byb2dyYW0pLG4ucXVpdCYmKHg9bi5xdWl0KSxuLndhc21CaW5hcnkmJihEPW4ud2FzbUJpbmFyeSk7dmFyIFg9bi5ub0V4aXRSdW50aW1lfHwhMTt0eXBlb2YgV2ViQXNzZW1ibHkhPSJvYmplY3QiJiZtZSgibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCIpO3ZhciBHLGVlLEosbGUseGUsd2UsaWUsVGUsYmU9ITEsSWU9dHlwZW9mIFRleHREZWNvZGVyPCJ1Ij9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDA7ZnVuY3Rpb24gTGUoUyxBLGspe3ZhciBMPShBPj4+PTApK2s7Zm9yKGs9QTtTW2tdJiYhKGs+PUwpOykrK2s7aWYoMTY8ay1BJiZTLmJ1ZmZlciYmSWUpcmV0dXJuIEllLmRlY29kZShTLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyP1Muc2xpY2UoQSxrKTpTLnN1YmFycmF5KEEsaykpO2ZvcihMPSIiO0E8azspe3ZhciBWPVNbQSsrXTtpZigxMjgmVil7dmFyIHE9NjMmU1tBKytdO2lmKCgyMjQmVik9PTE5MilMKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgzMSZWKTw8NnxxKTtlbHNle3ZhciBaPTYzJlNbQSsrXTs2NTUzNj4oVj0oMjQwJlYpPT0yMjQ/KDE1JlYpPDwxMnxxPDw2fFo6KDcmVik8PDE4fHE8PDEyfFo8PDZ8NjMmU1tBKytdKT9MKz1TdHJpbmcuZnJvbUNoYXJDb2RlKFYpOihWLT02NTUzNixMKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fFY+PjEwLDU2MzIwfDEwMjMmVikpfX1lbHNlIEwrPVN0cmluZy5mcm9tQ2hhckNvZGUoVil9cmV0dXJuIEx9ZnVuY3Rpb24gRWUoUyxBKXtyZXR1cm4oUz4+Pj0wKT9MZShwKCksUyxBKToiIn1mdW5jdGlvbiBrZShTLEEsayxMKXtpZighKDA8TCkpcmV0dXJuIDA7dmFyIFY9az4+Pj0wO0w9aytMLTE7Zm9yKHZhciBxPTA7cTxTLmxlbmd0aDsrK3Epe3ZhciBaPVMuY2hhckNvZGVBdChxKTtpZig1NTI5Njw9WiYmNTczNDM+PVomJihaPTY1NTM2KygoMTAyMyZaKTw8MTApfDEwMjMmUy5jaGFyQ29kZUF0KCsrcSkpLDEyNz49Wil7aWYoaz49TClicmVhaztBW2srKz4+PjBdPVp9ZWxzZXtpZigyMDQ3Pj1aKXtpZihrKzE+PUwpYnJlYWs7QVtrKys+Pj4wXT0xOTJ8Wj4+Nn1lbHNle2lmKDY1NTM1Pj1aKXtpZihrKzI+PUwpYnJlYWs7QVtrKys+Pj4wXT0yMjR8Wj4+MTJ9ZWxzZXtpZihrKzM+PUwpYnJlYWs7QVtrKys+Pj4wXT0yNDB8Wj4+MTgsQVtrKys+Pj4wXT0xMjh8Wj4+MTImNjN9QVtrKys+Pj4wXT0xMjh8Wj4+NiY2M31BW2srKz4+PjBdPTEyOHw2MyZafX1yZXR1cm4gQVtrPj4+MF09MCxrLVZ9ZnVuY3Rpb24gRGUoUyl7Zm9yKHZhciBBPTAsaz0wO2s8Uy5sZW5ndGg7KytrKXt2YXIgTD1TLmNoYXJDb2RlQXQoayk7MTI3Pj1MP0ErKzoyMDQ3Pj1MP0ErPTI6NTUyOTY8PUwmJjU3MzQzPj1MPyhBKz00LCsrayk6QSs9M31yZXR1cm4gQX1mdW5jdGlvbiBBZShTKXtKPVMsbi5IRUFQOD1sZT1uZXcgSW50OEFycmF5KFMpLG4uSEVBUDE2PW5ldyBJbnQxNkFycmF5KFMpLG4uSEVBUDMyPXdlPW5ldyBJbnQzMkFycmF5KFMpLG4uSEVBUFU4PXhlPW5ldyBVaW50OEFycmF5KFMpLG4uSEVBUFUxNj1uZXcgVWludDE2QXJyYXkoUyksbi5IRUFQVTMyPWllPW5ldyBVaW50MzJBcnJheShTKSxuLkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShTKSxuLkhFQVBGNjQ9VGU9bmV3IEZsb2F0NjRBcnJheShTKX1NJiYoSj1uLmJ1ZmZlcik7dmFyIFNlPW4uSU5JVElBTF9NRU1PUll8fDE2Nzc3MjE2O2lmKE0pRz1uLndhc21NZW1vcnksSj1uLmJ1ZmZlcjtlbHNlIGlmKG4ud2FzbU1lbW9yeSlHPW4ud2FzbU1lbW9yeTtlbHNlIGlmKCEoKEc9bmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7aW5pdGlhbDpTZS82NTUzNixtYXhpbXVtOjY1NTM2LHNoYXJlZDohMH0pKS5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcikpdGhyb3cgRigicmVxdWVzdGVkIGEgc2hhcmVkIFdlYkFzc2VtYmx5Lk1lbW9yeSBidXQgdGhlIHJldHVybmVkIGJ1ZmZlciBpcyBub3QgYSBTaGFyZWRBcnJheUJ1ZmZlciwgaW5kaWNhdGluZyB0aGF0IHdoaWxlIHRoZSBicm93c2VyIGhhcyBTaGFyZWRBcnJheUJ1ZmZlciBpdCBkb2VzIG5vdCBoYXZlIFdlYkFzc2VtYmx5IHRocmVhZHMgc3VwcG9ydCAtIHlvdSBtYXkgbmVlZCB0byBzZXQgYSBmbGFnIiksdiYmY29uc29sZS5sb2coIihvbiBub2RlIHlvdSBtYXkgbmVlZDogLS1leHBlcmltZW50YWwtd2FzbS10aHJlYWRzIC0tZXhwZXJpbWVudGFsLXdhc20tYnVsay1tZW1vcnkgYW5kIGFsc28gdXNlIGEgcmVjZW50IHZlcnNpb24pIiksRXJyb3IoImJhZCBtZW1vcnkiKTtHJiYoSj1HLmJ1ZmZlciksU2U9Si5ieXRlTGVuZ3RoLEFlKEopO3ZhciBCZSx6ZT1bXSxqZT1bXSxZZT1bXSxRZT1bXTtmdW5jdGlvbiBxZSgpe3JldHVybiBYfHwhMX1mdW5jdGlvbiBHZSgpe3ZhciBTPW4ucHJlUnVuLnNoaWZ0KCk7emUudW5zaGlmdChTKX12YXIgTWUsVmU9MCxLZT1udWxsO2Z1bmN0aW9uIG1lKFMpe3Rocm93IE0/cG9zdE1lc3NhZ2Uoe2NtZDoib25BYm9ydCIsYXJnOlN9KTpuLm9uQWJvcnQmJm4ub25BYm9ydChTKSxGKFM9IkFib3J0ZWQoIitTKyIpIiksYmU9ITAsUz1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKFMrIi4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4iKSxpKFMpLFN9ZnVuY3Rpb24gcHQoKXtyZXR1cm4gTWUuc3RhcnRzV2l0aCgiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCIpfWZ1bmN0aW9uIHV0KCl7dmFyIFM9TWU7dHJ5e2lmKFM9PU1lJiZEKXJldHVybiBuZXcgVWludDhBcnJheShEKTtpZihnKXJldHVybiBnKFMpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1jYXRjaChBKXttZShBKX19TWU9Im9ydC13YXNtLXRocmVhZGVkLndhc20iLHB0KCl8fChNZT16KE1lKSk7dmFyIE90PXt9O2Z1bmN0aW9uIFplKFMpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPSJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIrUysiKSIsdGhpcy5zdGF0dXM9U31mdW5jdGlvbiBjdChTKXsoUz1vZS5WYltTXSl8fG1lKCksb2UubWMoUyl9ZnVuY3Rpb24gZHQoUyl7dmFyIEE9b2UuQ2MoKTtpZighQSlyZXR1cm4gNjtvZS5hYy5wdXNoKEEpLG9lLlZiW1MuVWJdPUEsQS5VYj1TLlViO3ZhciBrPXtjbWQ6InJ1biIsc3RhcnRfcm91dGluZTpTLkljLGFyZzpTLnpjLHB0aHJlYWRfcHRyOlMuVWJ9O3JldHVybiBBLiRiPSgpPT57ay50aW1lPXBlcmZvcm1hbmNlLm5vdygpLEEucG9zdE1lc3NhZ2UoayxTLk5jKX0sQS5sb2FkZWQmJihBLiRiKCksZGVsZXRlIEEuJGIpLDB9ZnVuY3Rpb24gUmUoUyl7aWYoTSlyZXR1cm4gdGUoMSwxLFMpO3FlKCl8fChvZS5vYygpLG4ub25FeGl0JiZuLm9uRXhpdChTKSxiZT0hMCkseChTLG5ldyBaZShTKSl9ZnVuY3Rpb24gaXQoUyxBKXtpZighQSYmTSl0aHJvdyBJdChTKSwidW53aW5kIjtxZSgpfHxNfHwoV3QoKSxydChZZSkscXQoMCksTnRbMV0ubGVuZ3RoJiZMdCgxLDEwKSxOdFsyXS5sZW5ndGgmJkx0KDIsMTApLG9lLm9jKCkpLFJlKFMpfXZhciBvZT17WWI6W10sYWM6W10scWM6W10sVmI6e30sZmM6ZnVuY3Rpb24oKXtNJiZvZS5FYygpfSxQYzpmdW5jdGlvbigpe30sRWM6ZnVuY3Rpb24oKXtvZS5yZWNlaXZlT2JqZWN0VHJhbnNmZXI9b2UuR2Msb2UudGhyZWFkSW5pdFRMUz1vZS5wYyxvZS5zZXRFeGl0U3RhdHVzPW9lLm5jLFg9ITF9LG5jOmZ1bmN0aW9uKCl7fSxvYzpmdW5jdGlvbigpe2Zvcih2YXIgUyBvZiBPYmplY3QudmFsdWVzKG9lLlZiKSlvZS5tYyhTKTtmb3IoUyBvZiBvZS5ZYilTLnRlcm1pbmF0ZSgpO29lLlliPVtdfSxtYzpmdW5jdGlvbihTKXt2YXIgQT1TLlViO2RlbGV0ZSBvZS5WYltBXSxvZS5ZYi5wdXNoKFMpLG9lLmFjLnNwbGljZShvZS5hYy5pbmRleE9mKFMpLDEpLFMuVWI9MCxSdChBKX0sR2M6ZnVuY3Rpb24oKXt9LHBjOmZ1bmN0aW9uKCl7b2UucWMuZm9yRWFjaChTPT5TKCkpfSxGYzpmdW5jdGlvbihTLEEpe1Mub25tZXNzYWdlPWs9Pnt2YXIgTD0oaz1rLmRhdGEpLmNtZDtpZihTLlViJiYob2UuQmM9Uy5VYiksay50YXJnZXRUaHJlYWQmJmsudGFyZ2V0VGhyZWFkIT1DdCgpKXt2YXIgVj1vZS5WYltrLlFjXTtWP1YucG9zdE1lc3NhZ2UoayxrLnRyYW5zZmVyTGlzdCk6RignSW50ZXJuYWwgZXJyb3IhIFdvcmtlciBzZW50IGEgbWVzc2FnZSAiJytMKyciIHRvIHRhcmdldCBwdGhyZWFkICcray50YXJnZXRUaHJlYWQrIiwgYnV0IHRoYXQgdGhyZWFkIG5vIGxvbmdlciBleGlzdHMhIil9ZWxzZSBMPT09InByb2Nlc3NQcm94eWluZ1F1ZXVlIj9SKGsucXVldWUpOkw9PT0ic3Bhd25UaHJlYWQiP2R0KGspOkw9PT0iY2xlYW51cFRocmVhZCI/Y3Qoay50aHJlYWQpOkw9PT0ia2lsbFRocmVhZCI/KGs9ay50aHJlYWQsTD1vZS5WYltrXSxkZWxldGUgb2UuVmJba10sTC50ZXJtaW5hdGUoKSxSdChrKSxvZS5hYy5zcGxpY2Uob2UuYWMuaW5kZXhPZihMKSwxKSxMLlViPTApOkw9PT0iY2FuY2VsVGhyZWFkIj9vZS5WYltrLnRocmVhZF0ucG9zdE1lc3NhZ2Uoe2NtZDoiY2FuY2VsIn0pOkw9PT0ibG9hZGVkIj8oUy5sb2FkZWQ9ITAsQSYmQShTKSxTLiRiJiYoUy4kYigpLGRlbGV0ZSBTLiRiKSk6TD09PSJwcmludCI/SSgiVGhyZWFkICIray50aHJlYWRJZCsiOiAiK2sudGV4dCk6TD09PSJwcmludEVyciI/RigiVGhyZWFkICIray50aHJlYWRJZCsiOiAiK2sudGV4dCk6TD09PSJhbGVydCI/YWxlcnQoIlRocmVhZCAiK2sudGhyZWFkSWQrIjogIitrLnRleHQpOmsudGFyZ2V0PT09InNldGltbWVkaWF0ZSI/Uy5wb3N0TWVzc2FnZShrKTpMPT09Im9uQWJvcnQiP24ub25BYm9ydCYmbi5vbkFib3J0KGsuYXJnKTpMJiZGKCJ3b3JrZXIgc2VudCBhbiB1bmtub3duIGNvbW1hbmQgIitMKTtvZS5CYz12b2lkIDB9LFMub25lcnJvcj1rPT57dGhyb3cgRigid29ya2VyIHNlbnQgYW4gZXJyb3IhICIray5maWxlbmFtZSsiOiIray5saW5lbm8rIjogIitrLm1lc3NhZ2UpLGt9LHYmJihTLm9uKCJtZXNzYWdlIixmdW5jdGlvbihrKXtTLm9ubWVzc2FnZSh7ZGF0YTprfSl9KSxTLm9uKCJlcnJvciIsZnVuY3Rpb24oayl7Uy5vbmVycm9yKGspfSksUy5vbigiZGV0YWNoZWRFeGl0IixmdW5jdGlvbigpe30pKSxTLnBvc3RNZXNzYWdlKHtjbWQ6ImxvYWQiLHVybE9yQmxvYjpuLm1haW5TY3JpcHRVcmxPckJsb2J8fG8sd2FzbU1lbW9yeTpHLHdhc21Nb2R1bGU6ZWV9KX0seWM6ZnVuY3Rpb24oKXt2YXIgUz16KCJvcnQtd2FzbS10aHJlYWRlZC53b3JrZXIuanMiKTtvZS5ZYi5wdXNoKG5ldyBXb3JrZXIoUykpfSxDYzpmdW5jdGlvbigpe3JldHVybiBvZS5ZYi5sZW5ndGg9PTAmJihvZS55YygpLG9lLkZjKG9lLlliWzBdKSksb2UuWWIucG9wKCl9fTtmdW5jdGlvbiBydChTKXtmb3IoOzA8Uy5sZW5ndGg7KVMuc2hpZnQoKShuKX1mdW5jdGlvbiBNdChTKXt2YXIgQT1oZSgpO3JldHVybiBTPVMoKSxkZShBKSxTfWZ1bmN0aW9uIEl0KFMpe2lmKE0pcmV0dXJuIHRlKDIsMCxTKTt0cnl7aXQoUyl9Y2F0Y2goQSl7QSBpbnN0YW5jZW9mIFplfHxBPT0idW53aW5kInx8eCgxLEEpfX1uLlBUaHJlYWQ9b2Usbi5lc3RhYmxpc2hTdGFja1NwYWNlPWZ1bmN0aW9uKCl7dmFyIFM9Q3QoKSxBPWYoKVtTKzQ0Pj4yPj4+MF07Uz1mKClbUys0OD4+Mj4+PjBdLFF0KEEsQS1TKSxkZShBKX07dmFyIEplPVtdO2Z1bmN0aW9uIHZlKFMpe3ZhciBBPUplW1NdO3JldHVybiBBfHwoUz49SmUubGVuZ3RoJiYoSmUubGVuZ3RoPVMrMSksSmVbU109QT1CZS5nZXQoUykpLEF9bi5pbnZva2VFbnRyeVBvaW50PWZ1bmN0aW9uKFMsQSl7Uz12ZShTKShBKSxxZSgpP29lLm5jKFMpOlh0KFMpfTt2YXIgb3QsZnQsc3Q9W10sdWU9MCxzZT0wO2Z1bmN0aW9uIGFlKFMpe3RoaXMuWmI9Uyx0aGlzLlNiPVMtMjQsdGhpcy54Yz1mdW5jdGlvbihBKXtkKClbdGhpcy5TYis0Pj4yPj4+MF09QX0sdGhpcy5iYz1mdW5jdGlvbigpe3JldHVybiBkKClbdGhpcy5TYis0Pj4yPj4+MF19LHRoaXMud2M9ZnVuY3Rpb24oQSl7ZCgpW3RoaXMuU2IrOD4+Mj4+PjBdPUF9LHRoaXMuRGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpW3RoaXMuU2IrOD4+Mj4+PjBdfSx0aGlzLnJjPWZ1bmN0aW9uKCl7ZigpW3RoaXMuU2I+PjI+Pj4wXT0wfSx0aGlzLmhjPWZ1bmN0aW9uKEEpe0E9QT8xOjAsYSgpW3RoaXMuU2IrMTI+PjA+Pj4wXT1BfSx0aGlzLnVjPWZ1bmN0aW9uKCl7cmV0dXJuIGEoKVt0aGlzLlNiKzEyPj4wPj4+MF0hPTB9LHRoaXMuaWM9ZnVuY3Rpb24oQSl7QT1BPzE6MCxhKClbdGhpcy5TYisxMz4+MD4+PjBdPUF9LHRoaXMua2M9ZnVuY3Rpb24oKXtyZXR1cm4gYSgpW3RoaXMuU2IrMTM+PjA+Pj4wXSE9MH0sdGhpcy5mYz1mdW5jdGlvbihBLGspe3RoaXMuY2MoMCksdGhpcy54YyhBKSx0aGlzLndjKGspLHRoaXMucmMoKSx0aGlzLmhjKCExKSx0aGlzLmljKCExKX0sdGhpcy5zYz1mdW5jdGlvbigpe0F0b21pY3MuYWRkKGYoKSx0aGlzLlNiPj4yLDEpfSx0aGlzLkhjPWZ1bmN0aW9uKCl7cmV0dXJuIEF0b21pY3Muc3ViKGYoKSx0aGlzLlNiPj4yLDEpPT09MX0sdGhpcy5jYz1mdW5jdGlvbihBKXtkKClbdGhpcy5TYisxNj4+Mj4+PjBdPUF9LHRoaXMudGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpW3RoaXMuU2IrMTY+PjI+Pj4wXX0sdGhpcy52Yz1mdW5jdGlvbigpe2lmKFp0KHRoaXMuYmMoKSkpcmV0dXJuIGQoKVt0aGlzLlpiPj4yPj4+MF07dmFyIEE9dGhpcy50YygpO3JldHVybiBBIT09MD9BOnRoaXMuWmJ9fWZ1bmN0aW9uIG10KFMpe3JldHVybiBHdChuZXcgYWUoUykuU2IpfWZ1bmN0aW9uIGF0KFMsQSxrLEwpe3JldHVybiBNP3RlKDMsMSxTLEEsayxMKTpndChTLEEsayxMKX1mdW5jdGlvbiBndChTLEEsayxMKXtpZih0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXI+InUiKXJldHVybiBGKCJDdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgU2hhcmVkQXJyYXlCdWZmZXIsIHB0aHJlYWRzIGFyZSBub3QgYXZhaWxhYmxlISIpLDY7dmFyIFY9W107cmV0dXJuIE0mJlYubGVuZ3RoPT09MD9hdChTLEEsayxMKTooUz17SWM6ayxVYjpTLHpjOkwsTmM6Vn0sTT8oUy5PYz0ic3Bhd25UaHJlYWQiLHBvc3RNZXNzYWdlKFMsViksMCk6ZHQoUykpfWZ1bmN0aW9uIF90KFMsQSxrKXtyZXR1cm4gTT90ZSg0LDEsUyxBLGspOjB9ZnVuY3Rpb24gYnQoUyxBKXtpZihNKXJldHVybiB0ZSg1LDEsUyxBKX1mdW5jdGlvbiB5dChTLEEpe2lmKE0pcmV0dXJuIHRlKDYsMSxTLEEpfWZ1bmN0aW9uIHd0KFMsQSxrKXtpZihNKXJldHVybiB0ZSg3LDEsUyxBLGspfWZ1bmN0aW9uIFR0KFMsQSxrKXtyZXR1cm4gTT90ZSg4LDEsUyxBLGspOjB9ZnVuY3Rpb24gdnQoUyxBKXtpZihNKXJldHVybiB0ZSg5LDEsUyxBKX1mdW5jdGlvbiB4dChTLEEsayl7aWYoTSlyZXR1cm4gdGUoMTAsMSxTLEEsayl9ZnVuY3Rpb24gU3QoUyxBLGssTCl7aWYoTSlyZXR1cm4gdGUoMTEsMSxTLEEsayxMKX1mdW5jdGlvbiBFdChTLEEsayxMKXtpZihNKXJldHVybiB0ZSgxMiwxLFMsQSxrLEwpfWZ1bmN0aW9uIFB0KFMsQSxrLEwpe2lmKE0pcmV0dXJuIHRlKDEzLDEsUyxBLGssTCl9ZnVuY3Rpb24gQXQoUyl7aWYoTSlyZXR1cm4gdGUoMTQsMSxTKX1mdW5jdGlvbiBPKFMsQSl7aWYoTSlyZXR1cm4gdGUoMTUsMSxTLEEpfWZ1bmN0aW9uIEMoUyxBLGspe2lmKE0pcmV0dXJuIHRlKDE2LDEsUyxBLGspfWZ1bmN0aW9uIFIoUyl7QXRvbWljcy5zdG9yZShmKCksUz4+MiwxKSxDdCgpJiZLdChTKSxBdG9taWNzLmNvbXBhcmVFeGNoYW5nZShmKCksUz4+MiwxLDApfWZ1bmN0aW9uIGooUyl7cmV0dXJuIGQoKVtTPj4+Ml0rNDI5NDk2NzI5NipmKClbUys0Pj4+Ml19ZnVuY3Rpb24gVShTLEEsayxMLFYscSl7cmV0dXJuIE0/dGUoMTcsMSxTLEEsayxMLFYscSk6LTUyfWZ1bmN0aW9uIFkoUyxBLGssTCxWLHEpe2lmKE0pcmV0dXJuIHRlKDE4LDEsUyxBLGssTCxWLHEpfWZ1bmN0aW9uIFEoUyl7dmFyIEE9RGUoUykrMSxrPSR0KEEpO3JldHVybiBrJiZrZShTLGEoKSxrLEEpLGt9ZnVuY3Rpb24gbmUoUyxBLGspe2Z1bmN0aW9uIEwoZ2Upe3JldHVybihnZT1nZS50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXCgoW0EtWmEteiBdKylcKSQvKSk/Z2VbMV06IkdNVCJ9aWYoTSlyZXR1cm4gdGUoMTksMSxTLEEsayk7dmFyIFY9bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLHE9bmV3IERhdGUoViwwLDEpLFo9bmV3IERhdGUoViw2LDEpO1Y9cS5nZXRUaW1lem9uZU9mZnNldCgpO3ZhciByZT1aLmdldFRpbWV6b25lT2Zmc2V0KCksZmU9TWF0aC5tYXgoVixyZSk7ZigpW1M+PjI+Pj4wXT02MCpmZSxmKClbQT4+Mj4+PjBdPSsoViE9cmUpLFM9TChxKSxBPUwoWiksUz1RKFMpLEE9UShBKSxyZTxWPyhkKClbaz4+Mj4+PjBdPVMsZCgpW2srND4+Mj4+PjBdPUEpOihkKClbaz4+Mj4+PjBdPUEsZCgpW2srND4+Mj4+PjBdPVMpfWZ1bmN0aW9uIHRlKFMsQSl7dmFyIGs9YXJndW1lbnRzLmxlbmd0aC0yLEw9YXJndW1lbnRzO3JldHVybiBNdCgoKT0+e2Zvcih2YXIgVj1CdCg4KmspLHE9Vj4+MyxaPTA7WjxrO1orKyl7dmFyIHJlPUxbMitaXTtsKClbcStaPj4+MF09cmV9cmV0dXJuIFl0KFMsayxWLEEpfSl9bi5leGVjdXRlTm90aWZpZWRQcm94eWluZ1F1ZXVlPVIsZnQ9dj8oKT0+e3ZhciBTPXByb2Nlc3MuaHJ0aW1lKCk7cmV0dXJuIDFlMypTWzBdK1NbMV0vMWU2fTpNPygpPT5wZXJmb3JtYW5jZS5ub3coKS1uLl9fcGVyZm9ybWFuY2Vfbm93X2Nsb2NrX2RyaWZ0OigpPT5wZXJmb3JtYW5jZS5ub3coKTt2YXIgY2UsUGU9W10sJGU9e307ZnVuY3Rpb24gTmUoKXtpZighY2Upe3ZhciBTLEE9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzoodHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJm5hdmlnYXRvci5sYW5ndWFnZXMmJm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fCJDIikucmVwbGFjZSgiLSIsIl8iKSsiLlVURi04IixfOnd8fCIuL3RoaXMucHJvZ3JhbSJ9O2ZvcihTIGluICRlKSRlW1NdPT09dm9pZCAwP2RlbGV0ZSBBW1NdOkFbU109JGVbU107dmFyIGs9W107Zm9yKFMgaW4gQSlrLnB1c2goUysiPSIrQVtTXSk7Y2U9a31yZXR1cm4gY2V9ZnVuY3Rpb24gVyhTLEEpe2lmKE0pcmV0dXJuIHRlKDIwLDEsUyxBKTt2YXIgaz0wO3JldHVybiBOZSgpLmZvckVhY2goZnVuY3Rpb24oTCxWKXt2YXIgcT1BK2s7Zm9yKFY9ZCgpW1MrNCpWPj4yPj4+MF09cSxxPTA7cTxMLmxlbmd0aDsrK3EpYSgpW1YrKz4+MD4+PjBdPUwuY2hhckNvZGVBdChxKTthKClbVj4+MD4+PjBdPTAsays9TC5sZW5ndGgrMX0pLDB9ZnVuY3Rpb24gX2UoUyxBKXtpZihNKXJldHVybiB0ZSgyMSwxLFMsQSk7dmFyIGs9TmUoKTtkKClbUz4+Mj4+PjBdPWsubGVuZ3RoO3ZhciBMPTA7cmV0dXJuIGsuZm9yRWFjaChmdW5jdGlvbihWKXtMKz1WLmxlbmd0aCsxfSksZCgpW0E+PjI+Pj4wXT1MLDB9ZnVuY3Rpb24gT2UoUyl7cmV0dXJuIE0/dGUoMjIsMSxTKTo1Mn1mdW5jdGlvbiBXZShTLEEsayxMKXtyZXR1cm4gTT90ZSgyMywxLFMsQSxrLEwpOjUyfWZ1bmN0aW9uIGV0KFMsQSxrLEwsVil7cmV0dXJuIE0/dGUoMjQsMSxTLEEsayxMLFYpOjcwfXZhciBOdD1bbnVsbCxbXSxbXV07ZnVuY3Rpb24gTHQoUyxBKXt2YXIgaz1OdFtTXTtBPT09MHx8QT09PTEwPygoUz09PTE/STpGKShMZShrLDApKSxrLmxlbmd0aD0wKTprLnB1c2goQSl9ZnVuY3Rpb24genQoUyxBLGssTCl7aWYoTSlyZXR1cm4gdGUoMjUsMSxTLEEsayxMKTtmb3IodmFyIFY9MCxxPTA7cTxrO3ErKyl7dmFyIFo9ZCgpW0E+PjI+Pj4wXSxyZT1kKClbQSs0Pj4yPj4+MF07QSs9ODtmb3IodmFyIGZlPTA7ZmU8cmU7ZmUrKylMdChTLHAoKVtaK2ZlPj4+MF0pO1YrPXJlfXJldHVybiBkKClbTD4+Mj4+PjBdPVYsMH12YXIgVWU9MDtmdW5jdGlvbiBrdChTKXtyZXR1cm4gUyU0PT0wJiYoUyUxMDAhPTB8fFMlNDAwPT0wKX12YXIganQ9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxWdD1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2Z1bmN0aW9uIFV0KFMsQSxrLEwpe2Z1bmN0aW9uIFYoSCx5ZSxDZSl7Zm9yKEg9dHlwZW9mIEg9PSJudW1iZXIiP0gudG9TdHJpbmcoKTpIfHwiIjtILmxlbmd0aDx5ZTspSD1DZVswXStIO3JldHVybiBIfWZ1bmN0aW9uIHEoSCx5ZSl7cmV0dXJuIFYoSCx5ZSwiMCIpfWZ1bmN0aW9uIFooSCx5ZSl7ZnVuY3Rpb24gQ2UoaHQpe3JldHVybiAwPmh0Py0xOjA8aHQ/MTowfXZhciB0dDtyZXR1cm4odHQ9Q2UoSC5nZXRGdWxsWWVhcigpLXllLmdldEZ1bGxZZWFyKCkpKT09PTAmJih0dD1DZShILmdldE1vbnRoKCkteWUuZ2V0TW9udGgoKSkpPT09MCYmKHR0PUNlKEguZ2V0RGF0ZSgpLXllLmdldERhdGUoKSkpLHR0fWZ1bmN0aW9uIHJlKEgpe3N3aXRjaChILmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKEguZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIEg7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZShILmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKEguZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUoSC5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZShILmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZShILmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uIGZlKEgpe3ZhciB5ZT1ILldiO2ZvcihIPW5ldyBEYXRlKG5ldyBEYXRlKEguWGIrMTkwMCwwLDEpLmdldFRpbWUoKSk7MDx5ZTspe3ZhciBDZT1ILmdldE1vbnRoKCksdHQ9KGt0KEguZ2V0RnVsbFllYXIoKSk/anQ6VnQpW0NlXTtpZighKHllPnR0LUguZ2V0RGF0ZSgpKSl7SC5zZXREYXRlKEguZ2V0RGF0ZSgpK3llKTticmVha315ZS09dHQtSC5nZXREYXRlKCkrMSxILnNldERhdGUoMSksMTE+Q2U/SC5zZXRNb250aChDZSsxKTooSC5zZXRNb250aCgwKSxILnNldEZ1bGxZZWFyKEguZ2V0RnVsbFllYXIoKSsxKSl9cmV0dXJuIENlPW5ldyBEYXRlKEguZ2V0RnVsbFllYXIoKSsxLDAsNCkseWU9cmUobmV3IERhdGUoSC5nZXRGdWxsWWVhcigpLDAsNCkpLENlPXJlKENlKSwwPj1aKHllLEgpPzA+PVooQ2UsSCk/SC5nZXRGdWxsWWVhcigpKzE6SC5nZXRGdWxsWWVhcigpOkguZ2V0RnVsbFllYXIoKS0xfXZhciBnZT1mKClbTCs0MD4+Mj4+PjBdO2Zvcih2YXIgRmUgaW4gTD17TGM6ZigpW0w+PjI+Pj4wXSxLYzpmKClbTCs0Pj4yPj4+MF0sZGM6ZigpW0wrOD4+Mj4+PjBdLGpjOmYoKVtMKzEyPj4yPj4+MF0sZWM6ZigpW0wrMTY+PjI+Pj4wXSxYYjpmKClbTCsyMD4+Mj4+PjBdLFRiOmYoKVtMKzI0Pj4yPj4+MF0sV2I6ZigpW0wrMjg+PjI+Pj4wXSxSYzpmKClbTCszMj4+Mj4+PjBdLEpjOmYoKVtMKzM2Pj4yPj4+MF0sTWM6Z2U/RWUoZ2UpOiIifSxrPUVlKGspLGdlPXsiJWMiOiIlYSAlYiAlZCAlSDolTTolUyAlWSIsIiVEIjoiJW0vJWQvJXkiLCIlRiI6IiVZLSVtLSVkIiwiJWgiOiIlYiIsIiVyIjoiJUk6JU06JVMgJXAiLCIlUiI6IiVIOiVNIiwiJVQiOiIlSDolTTolUyIsIiV4IjoiJW0vJWQvJXkiLCIlWCI6IiVIOiVNOiVTIiwiJUVjIjoiJWMiLCIlRUMiOiIlQyIsIiVFeCI6IiVtLyVkLyV5IiwiJUVYIjoiJUg6JU06JVMiLCIlRXkiOiIleSIsIiVFWSI6IiVZIiwiJU9kIjoiJWQiLCIlT2UiOiIlZSIsIiVPSCI6IiVIIiwiJU9JIjoiJUkiLCIlT20iOiIlbSIsIiVPTSI6IiVNIiwiJU9TIjoiJVMiLCIlT3UiOiIldSIsIiVPVSI6IiVVIiwiJU9WIjoiJVYiLCIlT3ciOiIldyIsIiVPVyI6IiVXIiwiJU95IjoiJXkifSlrPWsucmVwbGFjZShuZXcgUmVnRXhwKEZlLCJnIiksZ2VbRmVdKTt2YXIgWGU9IlN1bmRheSBNb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5Ii5zcGxpdCgiICIpLEhlPSJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyIi5zcGxpdCgiICIpO2ZvcihGZSBpbiBnZT17IiVhIjpmdW5jdGlvbihIKXtyZXR1cm4gWGVbSC5UYl0uc3Vic3RyaW5nKDAsMyl9LCIlQSI6ZnVuY3Rpb24oSCl7cmV0dXJuIFhlW0guVGJdfSwiJWIiOmZ1bmN0aW9uKEgpe3JldHVybiBIZVtILmVjXS5zdWJzdHJpbmcoMCwzKX0sIiVCIjpmdW5jdGlvbihIKXtyZXR1cm4gSGVbSC5lY119LCIlQyI6ZnVuY3Rpb24oSCl7cmV0dXJuIHEoKEguWGIrMTkwMCkvMTAwfDAsMil9LCIlZCI6ZnVuY3Rpb24oSCl7cmV0dXJuIHEoSC5qYywyKX0sIiVlIjpmdW5jdGlvbihIKXtyZXR1cm4gVihILmpjLDIsIiAiKX0sIiVnIjpmdW5jdGlvbihIKXtyZXR1cm4gZmUoSCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMil9LCIlRyI6ZnVuY3Rpb24oSCl7cmV0dXJuIGZlKEgpfSwiJUgiOmZ1bmN0aW9uKEgpe3JldHVybiBxKEguZGMsMil9LCIlSSI6ZnVuY3Rpb24oSCl7cmV0dXJuKEg9SC5kYyk9PTA/SD0xMjoxMjxIJiYoSC09MTIpLHEoSCwyKX0sIiVqIjpmdW5jdGlvbihIKXtmb3IodmFyIHllPTAsQ2U9MDtDZTw9SC5lYy0xO3llKz0oa3QoSC5YYisxOTAwKT9qdDpWdClbQ2UrK10pO3JldHVybiBxKEguamMreWUsMyl9LCIlbSI6ZnVuY3Rpb24oSCl7cmV0dXJuIHEoSC5lYysxLDIpfSwiJU0iOmZ1bmN0aW9uKEgpe3JldHVybiBxKEguS2MsMil9LCIlbiI6ZnVuY3Rpb24oKXtyZXR1cm5gCmB9LCIlcCI6ZnVuY3Rpb24oSCl7cmV0dXJuIDA8PUguZGMmJjEyPkguZGM/IkFNIjoiUE0ifSwiJVMiOmZ1bmN0aW9uKEgpe3JldHVybiBxKEguTGMsMil9LCIldCI6ZnVuY3Rpb24oKXtyZXR1cm4iCSJ9LCIldSI6ZnVuY3Rpb24oSCl7cmV0dXJuIEguVGJ8fDd9LCIlVSI6ZnVuY3Rpb24oSCl7cmV0dXJuIHEoTWF0aC5mbG9vcigoSC5XYis3LUguVGIpLzcpLDIpfSwiJVYiOmZ1bmN0aW9uKEgpe3ZhciB5ZT1NYXRoLmZsb29yKChILldiKzctKEguVGIrNiklNykvNyk7aWYoMj49KEguVGIrMzcxLUguV2ItMiklNyYmeWUrKyx5ZSl5ZT09NTMmJigoQ2U9KEguVGIrMzcxLUguV2IpJTcpPT00fHxDZT09MyYma3QoSC5YYil8fCh5ZT0xKSk7ZWxzZXt5ZT01Mjt2YXIgQ2U9KEguVGIrNy1ILldiLTEpJTc7KENlPT00fHxDZT09NSYma3QoSC5YYiU0MDAtMSkpJiZ5ZSsrfXJldHVybiBxKHllLDIpfSwiJXciOmZ1bmN0aW9uKEgpe3JldHVybiBILlRifSwiJVciOmZ1bmN0aW9uKEgpe3JldHVybiBxKE1hdGguZmxvb3IoKEguV2IrNy0oSC5UYis2KSU3KS83KSwyKX0sIiV5IjpmdW5jdGlvbihIKXtyZXR1cm4oSC5YYisxOTAwKS50b1N0cmluZygpLnN1YnN0cmluZygyKX0sIiVZIjpmdW5jdGlvbihIKXtyZXR1cm4gSC5YYisxOTAwfSwiJXoiOmZ1bmN0aW9uKEgpe3ZhciB5ZT0wPD0oSD1ILkpjKTtyZXR1cm4gSD1NYXRoLmFicyhIKS82MCwoeWU/IisiOiItIikrKCIwMDAwIisoSC82MCoxMDArSCU2MCkpLnNsaWNlKC00KX0sIiVaIjpmdW5jdGlvbihIKXtyZXR1cm4gSC5NY30sIiUlIjpmdW5jdGlvbigpe3JldHVybiIlIn19LGs9ay5yZXBsYWNlKC8lJS9nLCJcMFwwIiksZ2Upay5pbmNsdWRlcyhGZSkmJihrPWsucmVwbGFjZShuZXcgUmVnRXhwKEZlLCJnIiksZ2VbRmVdKEwpKSk7cmV0dXJuIEZlPWZ1bmN0aW9uKEgpe3ZhciB5ZT1BcnJheShEZShIKSsxKTtyZXR1cm4ga2UoSCx5ZSwwLHllLmxlbmd0aCkseWV9KGs9ay5yZXBsYWNlKC9cMFwwL2csIiUiKSksRmUubGVuZ3RoPkE/MDooZnVuY3Rpb24oSCx5ZSl7YSgpLnNldChILHllPj4+MCl9KEZlLFMpLEZlLmxlbmd0aC0xKX1vZS5mYygpO3ZhciBobj1bbnVsbCxSZSxJdCxhdCxfdCxidCx5dCx3dCxUdCx2dCx4dCxTdCxFdCxQdCxBdCxPLEMsVSxZLG5lLFcsX2UsT2UsV2UsZXQsenRdLHBuPXtiOmZ1bmN0aW9uKFMpe3JldHVybiAkdChTKzI0KSsyNH0sbjpmdW5jdGlvbihTKXtyZXR1cm4oUz1uZXcgYWUoUykpLnVjKCl8fChTLmhjKCEwKSx1ZS0tKSxTLmljKCExKSxzdC5wdXNoKFMpLFMuc2MoKSxTLnZjKCl9LG1hOmZ1bmN0aW9uKFMpe3Rocm93IEYoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biwgdGhpcyBpcyBub3QgcHJvcGVybHkgc3VwcG9ydGVkIC0gYWJvcnRpbmciKSxiZT0hMCxTfSx4OmZ1bmN0aW9uKCl7cGUoMCk7dmFyIFM9c3QucG9wKCk7aWYoUy5IYygpJiYhUy5rYygpKXt2YXIgQT1TLkRjKCk7QSYmdmUoQSkoUy5aYiksbXQoUy5aYil9c2U9MH0sZTpmdW5jdGlvbigpe3ZhciBTPXNlO2lmKCFTKXJldHVybiBVZT0wO3ZhciBBPW5ldyBhZShTKTtBLmNjKFMpO3ZhciBrPUEuYmMoKTtpZighaylyZXR1cm4gVWU9MCxTO2Zvcih2YXIgTD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLFY9MDtWPEwubGVuZ3RoO1YrKyl7dmFyIHE9TFtWXTtpZihxPT09MHx8cT09PWspYnJlYWs7aWYoRnQocSxrLEEuU2IrMTYpKXJldHVybiBVZT1xLFN9cmV0dXJuIFVlPWssU30sbDpmdW5jdGlvbigpe3ZhciBTPXNlO2lmKCFTKXJldHVybiBVZT0wO3ZhciBBPW5ldyBhZShTKTtBLmNjKFMpO3ZhciBrPUEuYmMoKTtpZighaylyZXR1cm4gVWU9MCxTO2Zvcih2YXIgTD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLFY9MDtWPEwubGVuZ3RoO1YrKyl7dmFyIHE9TFtWXTtpZihxPT09MHx8cT09PWspYnJlYWs7aWYoRnQocSxrLEEuU2IrMTYpKXJldHVybiBVZT1xLFN9cmV0dXJuIFVlPWssU30saDpmdW5jdGlvbigpe3ZhciBTPXNlO2lmKCFTKXJldHVybiBVZT0wO3ZhciBBPW5ldyBhZShTKTtBLmNjKFMpO3ZhciBrPUEuYmMoKTtpZighaylyZXR1cm4gVWU9MCxTO2Zvcih2YXIgTD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLFY9MDtWPEwubGVuZ3RoO1YrKyl7dmFyIHE9TFtWXTtpZihxPT09MHx8cT09PWspYnJlYWs7aWYoRnQocSxrLEEuU2IrMTYpKXJldHVybiBVZT1xLFN9cmV0dXJuIFVlPWssU30sdDptdCxNOmZ1bmN0aW9uKCl7dmFyIFM9c3QucG9wKCk7U3x8bWUoIm5vIGV4Y2VwdGlvbiB0byB0aHJvdyIpO3ZhciBBPVMuWmI7dGhyb3cgUy5rYygpfHwoc3QucHVzaChTKSxTLmljKCEwKSxTLmhjKCExKSx1ZSsrKSxzZT1BLEF9LGM6ZnVuY3Rpb24oUyxBLGspe3Rocm93IG5ldyBhZShTKS5mYyhBLGspLHNlPVMsdWUrKyxTfSxwYTpmdW5jdGlvbigpe3JldHVybiB1ZX0sRmE6ZnVuY3Rpb24oUyl7SHQoUywhUCwxLCFFKSxvZS5wYygpfSxUOmZ1bmN0aW9uKFMpe00/cG9zdE1lc3NhZ2Uoe2NtZDoiY2xlYW51cFRocmVhZCIsdGhyZWFkOlN9KTpjdChTKX0seGE6Z3QsajpmdW5jdGlvbihTKXt0aHJvdyBzZXx8KHNlPVMpLFN9LEg6X3QsTWE6YnQsdWE6eXQsd2E6d3Qsb2E6VHQsS2E6dnQsQ2E6eHQsSmE6U3QsVjpFdCx2YTpQdCxzYTpBdCxMYTpPLHRhOkMsVGE6ZnVuY3Rpb24oKXt9LFg6ZnVuY3Rpb24oKXttZSgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgZW5hYmxlIGR5bmFtaWMgbGlua2luZywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKX0sVWE6ZnVuY3Rpb24oKXttZSgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgZW5hYmxlIGR5bmFtaWMgbGlua2luZywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKX0sVzpmdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpfSx5YTpmdW5jdGlvbigpe3JldHVybiAyMDk3MTUyfSxPYTpmdW5jdGlvbigpe3JldHVybiEwfSx6YTpmdW5jdGlvbihTLEEsayxMKXtpZihTPT1BKXNldFRpbWVvdXQoKCk9PlIoTCkpO2Vsc2UgaWYoTSlwb3N0TWVzc2FnZSh7dGFyZ2V0VGhyZWFkOlMsY21kOiJwcm9jZXNzUHJveHlpbmdRdWV1ZSIscXVldWU6TH0pO2Vsc2V7aWYoIShTPW9lLlZiW1NdKSlyZXR1cm47Uy5wb3N0TWVzc2FnZSh7Y21kOiJwcm9jZXNzUHJveHlpbmdRdWV1ZSIscXVldWU6TH0pfXJldHVybiAxfSxFYTpmdW5jdGlvbigpe3JldHVybi0xfSxQYTpmdW5jdGlvbihTLEEpe1M9bmV3IERhdGUoMWUzKmooUykpLGYoKVtBPj4yPj4+MF09Uy5nZXRVVENTZWNvbmRzKCksZigpW0ErND4+Mj4+PjBdPVMuZ2V0VVRDTWludXRlcygpLGYoKVtBKzg+PjI+Pj4wXT1TLmdldFVUQ0hvdXJzKCksZigpW0ErMTI+PjI+Pj4wXT1TLmdldFVUQ0RhdGUoKSxmKClbQSsxNj4+Mj4+PjBdPVMuZ2V0VVRDTW9udGgoKSxmKClbQSsyMD4+Mj4+PjBdPVMuZ2V0VVRDRnVsbFllYXIoKS0xOTAwLGYoKVtBKzI0Pj4yPj4+MF09Uy5nZXRVVENEYXkoKSxTPShTLmdldFRpbWUoKS1EYXRlLlVUQyhTLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApKS84NjRlNXwwLGYoKVtBKzI4Pj4yPj4+MF09U30sUWE6ZnVuY3Rpb24oUyxBKXtTPW5ldyBEYXRlKDFlMypqKFMpKSxmKClbQT4+Mj4+PjBdPVMuZ2V0U2Vjb25kcygpLGYoKVtBKzQ+PjI+Pj4wXT1TLmdldE1pbnV0ZXMoKSxmKClbQSs4Pj4yPj4+MF09Uy5nZXRIb3VycygpLGYoKVtBKzEyPj4yPj4+MF09Uy5nZXREYXRlKCksZigpW0ErMTY+PjI+Pj4wXT1TLmdldE1vbnRoKCksZigpW0ErMjA+PjI+Pj4wXT1TLmdldEZ1bGxZZWFyKCktMTkwMCxmKClbQSsyND4+Mj4+PjBdPVMuZ2V0RGF5KCk7dmFyIGs9bmV3IERhdGUoUy5nZXRGdWxsWWVhcigpLDAsMSksTD0oUy5nZXRUaW1lKCktay5nZXRUaW1lKCkpLzg2NGU1fDA7ZigpW0ErMjg+PjI+Pj4wXT1MLGYoKVtBKzM2Pj4yPj4+MF09LTYwKlMuZ2V0VGltZXpvbmVPZmZzZXQoKSxMPW5ldyBEYXRlKFMuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCksUz0wfChMIT0oaz1rLmdldFRpbWV6b25lT2Zmc2V0KCkpJiZTLmdldFRpbWV6b25lT2Zmc2V0KCk9PU1hdGgubWluKGssTCkpLGYoKVtBKzMyPj4yPj4+MF09U30sUmE6ZnVuY3Rpb24oUyl7dmFyIEE9bmV3IERhdGUoZigpW1MrMjA+PjI+Pj4wXSsxOTAwLGYoKVtTKzE2Pj4yPj4+MF0sZigpW1MrMTI+PjI+Pj4wXSxmKClbUys4Pj4yPj4+MF0sZigpW1MrND4+Mj4+PjBdLGYoKVtTPj4yPj4+MF0sMCksaz1mKClbUyszMj4+Mj4+PjBdLEw9QS5nZXRUaW1lem9uZU9mZnNldCgpLFY9bmV3IERhdGUoQS5nZXRGdWxsWWVhcigpLDAsMSkscT1uZXcgRGF0ZShBLmdldEZ1bGxZZWFyKCksNiwxKS5nZXRUaW1lem9uZU9mZnNldCgpLFo9Vi5nZXRUaW1lem9uZU9mZnNldCgpLHJlPU1hdGgubWluKFoscSk7cmV0dXJuIDA+az9mKClbUyszMj4+Mj4+PjBdPSsocSE9WiYmcmU9PUwpOjA8ayE9KHJlPT1MKSYmKHE9TWF0aC5tYXgoWixxKSxBLnNldFRpbWUoQS5nZXRUaW1lKCkrNmU0KigoMDxrP3JlOnEpLUwpKSksZigpW1MrMjQ+PjI+Pj4wXT1BLmdldERheSgpLGs9KEEuZ2V0VGltZSgpLVYuZ2V0VGltZSgpKS84NjRlNXwwLGYoKVtTKzI4Pj4yPj4+MF09ayxmKClbUz4+Mj4+PjBdPUEuZ2V0U2Vjb25kcygpLGYoKVtTKzQ+PjI+Pj4wXT1BLmdldE1pbnV0ZXMoKSxmKClbUys4Pj4yPj4+MF09QS5nZXRIb3VycygpLGYoKVtTKzEyPj4yPj4+MF09QS5nZXREYXRlKCksZigpW1MrMTY+PjI+Pj4wXT1BLmdldE1vbnRoKCksQS5nZXRUaW1lKCkvMWUzfDB9LEFhOlUsQmE6WSxTYTpmdW5jdGlvbiBTKEEsayxMKXtTLkFjfHwoUy5BYz0hMCxuZShBLGssTCkpfSx5OmZ1bmN0aW9uKCl7bWUoIiIpfSxVOmZ1bmN0aW9uKCl7aWYoIXYmJiFQKXt2YXIgUz0iQmxvY2tpbmcgb24gdGhlIG1haW4gdGhyZWFkIGlzIHZlcnkgZGFuZ2Vyb3VzLCBzZWUgaHR0cHM6Ly9lbXNjcmlwdGVuLm9yZy9kb2NzL3BvcnRpbmcvcHRocmVhZHMuaHRtbCNibG9ja2luZy1vbi10aGUtbWFpbi1icm93c2VyLXRocmVhZCI7b3R8fChvdD17fSksb3RbU118fChvdFtTXT0xLHYmJihTPSJ3YXJuaW5nOiAiK1MpLEYoUykpfX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sQjpmdCxJYTpmdW5jdGlvbihTLEEsayl7cCgpLmNvcHlXaXRoaW4oUz4+PjAsQT4+PjAsQStrPj4+MCl9LEY6ZnVuY3Rpb24oKXtyZXR1cm4gdj9yKDM5OTMpLmNwdXMoKS5sZW5ndGg6bmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3l9LERhOmZ1bmN0aW9uKFMsQSxrKXtQZS5sZW5ndGg9QSxrPj49Mztmb3IodmFyIEw9MDtMPEE7TCsrKVBlW0xdPWwoKVtrK0w+Pj4wXTtyZXR1cm4oMD5TP090Wy1TLTFdOmhuW1NdKS5hcHBseShudWxsLFBlKX0scWE6ZnVuY3Rpb24oUyl7dmFyIEE9cCgpLmxlbmd0aDtpZigoUz4+Pj0wKTw9QXx8NDI5NDkwMTc2MDxTKXJldHVybiExO2Zvcih2YXIgaz0xOzQ+PWs7ayo9Mil7dmFyIEw9QSooMSsuMi9rKTtMPU1hdGgubWluKEwsUysxMDA2NjMyOTYpO3ZhciBWPU1hdGg7TD1NYXRoLm1heChTLEwpLFY9Vi5taW4uY2FsbChWLDQyOTQ5MDE3NjAsTCsoNjU1MzYtTCU2NTUzNiklNjU1MzYpO2U6e3RyeXtHLmdyb3coVi1KLmJ5dGVMZW5ndGgrNjU1MzU+Pj4xNiksQWUoRy5idWZmZXIpO3ZhciBxPTE7YnJlYWsgZX1jYXRjaHt9cT12b2lkIDB9aWYocSlyZXR1cm4hMH1yZXR1cm4hMX0sTmE6ZnVuY3Rpb24oKXt0aHJvdyJ1bndpbmQifSxHYTpXLEhhOl9lLEo6aXQsSTpPZSxTOldlLGdhOmV0LFI6enQsZDpmdW5jdGlvbigpe3JldHVybiBVZX0sbmE6ZnVuY3Rpb24gUyhBLGspe1MubGN8fChTLmxjPWZ1bmN0aW9uKCl7aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXt2YXIgVj1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4oKT0+KGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoViksVlswXSl9aWYodil0cnl7dmFyIHE9cihPYmplY3QoZnVuY3Rpb24oKXt2YXIgWj1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnY3J5cHRvJyIpO3Rocm93IFouY29kZT0iTU9EVUxFX05PVF9GT1VORCIsWn0oKSkpO3JldHVybigpPT5xLnJhbmRvbUJ5dGVzKDEpWzBdfWNhdGNoe31yZXR1cm4oKT0+bWUoInJhbmRvbURldmljZSIpfSgpKTtmb3IodmFyIEw9MDtMPGs7TCsrKWEoKVtBK0w+PjA+Pj4wXT1TLmxjKCk7cmV0dXJuIDB9LGlhOmZ1bmN0aW9uKFMsQSxrKXt2YXIgTD1oZSgpO3RyeXtyZXR1cm4gdmUoUykoQSxrKX1jYXRjaChWKXtpZihkZShMKSxWIT09ViswKXRocm93IFY7cGUoMSwwKX19LGphOmZ1bmN0aW9uKFMsQSxrKXt2YXIgTD1oZSgpO3RyeXtyZXR1cm4gdmUoUykoQSxrKX1jYXRjaChWKXtpZihkZShMKSxWIT09ViswKXRocm93IFY7cGUoMSwwKX19LEs6ZnVuY3Rpb24oUyl7dmFyIEE9aGUoKTt0cnl7cmV0dXJuIHZlKFMpKCl9Y2F0Y2goayl7aWYoZGUoQSksayE9PWsrMCl0aHJvdyBrO3BlKDEsMCl9fSxmOmZ1bmN0aW9uKFMsQSl7dmFyIGs9aGUoKTt0cnl7cmV0dXJuIHZlKFMpKEEpfWNhdGNoKEwpe2lmKGRlKGspLEwhPT1MKzApdGhyb3cgTDtwZSgxLDApfX0sUDpmdW5jdGlvbihTLEEsayl7dmFyIEw9aGUoKTt0cnl7cmV0dXJuIHZlKFMpKEEsayl9Y2F0Y2goVil7aWYoZGUoTCksViE9PVYrMCl0aHJvdyBWO3BlKDEsMCl9fSxROmZ1bmN0aW9uKFMsQSxrKXt2YXIgTD1oZSgpO3RyeXtyZXR1cm4gdmUoUykoQSxrKX1jYXRjaChWKXtpZihkZShMKSxWIT09ViswKXRocm93IFY7cGUoMSwwKX19LGs6ZnVuY3Rpb24oUyxBLGspe3ZhciBMPWhlKCk7dHJ5e3JldHVybiB2ZShTKShBLGspfWNhdGNoKFYpe2lmKGRlKEwpLFYhPT1WKzApdGhyb3cgVjtwZSgxLDApfX0scDpmdW5jdGlvbihTLEEsayxMKXt2YXIgVj1oZSgpO3RyeXtyZXR1cm4gdmUoUykoQSxrLEwpfWNhdGNoKHEpe2lmKGRlKFYpLHEhPT1xKzApdGhyb3cgcTtwZSgxLDApfX0scTpmdW5jdGlvbihTLEEsayxMLFYpe3ZhciBxPWhlKCk7dHJ5e3JldHVybiB2ZShTKShBLGssTCxWKX1jYXRjaChaKXtpZihkZShxKSxaIT09WiswKXRocm93IFo7cGUoMSwwKX19LE46ZnVuY3Rpb24oUyxBLGssTCxWLHEpe3ZhciBaPWhlKCk7dHJ5e3JldHVybiB2ZShTKShBLGssTCxWLHEpfWNhdGNoKHJlKXtpZihkZShaKSxyZSE9PXJlKzApdGhyb3cgcmU7cGUoMSwwKX19LHM6ZnVuY3Rpb24oUyxBLGssTCxWLHEpe3ZhciBaPWhlKCk7dHJ5e3JldHVybiB2ZShTKShBLGssTCxWLHEpfWNhdGNoKHJlKXtpZihkZShaKSxyZSE9PXJlKzApdGhyb3cgcmU7cGUoMSwwKX19LHc6ZnVuY3Rpb24oUyxBLGssTCxWLHEsWil7dmFyIHJlPWhlKCk7dHJ5e3JldHVybiB2ZShTKShBLGssTCxWLHEsWil9Y2F0Y2goZmUpe2lmKGRlKHJlKSxmZSE9PWZlKzApdGhyb3cgZmU7cGUoMSwwKX19LEw6ZnVuY3Rpb24oUyxBLGssTCxWLHEsWixyZSl7dmFyIGZlPWhlKCk7dHJ5e3JldHVybiB2ZShTKShBLGssTCxWLHEsWixyZSl9Y2F0Y2goZ2Upe2lmKGRlKGZlKSxnZSE9PWdlKzApdGhyb3cgZ2U7cGUoMSwwKX19LEU6ZnVuY3Rpb24oUyxBLGssTCxWLHEsWixyZSxmZSxnZSxGZSxYZSl7dmFyIEhlPWhlKCk7dHJ5e3JldHVybiB2ZShTKShBLGssTCxWLHEsWixyZSxmZSxnZSxGZSxYZSl9Y2F0Y2goSCl7aWYoZGUoSGUpLEghPT1IKzApdGhyb3cgSDtwZSgxLDApfX0sYWE6ZnVuY3Rpb24oUyxBLGssTCxWLHEsWixyZSl7dmFyIGZlPWhlKCk7dHJ5e3JldHVybiBsbihTLEEsayxMLFYscSxaLHJlKX1jYXRjaChnZSl7aWYoZGUoZmUpLGdlIT09Z2UrMCl0aHJvdyBnZTtwZSgxLDApfX0sXzpmdW5jdGlvbihTLEEsayxMLFYscSxaKXt2YXIgcmU9aGUoKTt0cnl7cmV0dXJuIGVuKFMsQSxrLEwsVixxLFopfWNhdGNoKGZlKXtpZihkZShyZSksZmUhPT1mZSswKXRocm93IGZlO3BlKDEsMCl9fSxaOmZ1bmN0aW9uKFMsQSxrLEwsVil7dmFyIHE9aGUoKTt0cnl7cmV0dXJuIHVuKFMsQSxrLEwsVil9Y2F0Y2goWil7aWYoZGUocSksWiE9PVorMCl0aHJvdyBaO3BlKDEsMCl9fSxjYTpmdW5jdGlvbihTLEEsayxMKXt2YXIgVj1oZSgpO3RyeXtyZXR1cm4gc24oUyxBLGssTCl9Y2F0Y2gocSl7aWYoZGUoVikscSE9PXErMCl0aHJvdyBxO3BlKDEsMCl9fSwkOmZ1bmN0aW9uKFMpe3ZhciBBPWhlKCk7dHJ5e3JldHVybiBKdChTKX1jYXRjaChrKXtpZihkZShBKSxrIT09ayswKXRocm93IGs7cGUoMSwwKX19LGJhOmZ1bmN0aW9uKFMsQSl7dmFyIGs9aGUoKTt0cnl7cmV0dXJuIGFuKFMsQSl9Y2F0Y2goTCl7aWYoZGUoayksTCE9PUwrMCl0aHJvdyBMO3BlKDEsMCl9fSxZOmZ1bmN0aW9uKFMsQSxrKXt2YXIgTD1oZSgpO3RyeXtyZXR1cm4gdG4oUyxBLGspfWNhdGNoKFYpe2lmKGRlKEwpLFYhPT1WKzApdGhyb3cgVjtwZSgxLDApfX0sZzpmdW5jdGlvbihTKXt2YXIgQT1oZSgpO3RyeXt2ZShTKSgpfWNhdGNoKGspe2lmKGRlKEEpLGshPT1rKzApdGhyb3cgaztwZSgxLDApfX0scjpmdW5jdGlvbihTLEEpe3ZhciBrPWhlKCk7dHJ5e3ZlKFMpKEEpfWNhdGNoKEwpe2lmKGRlKGspLEwhPT1MKzApdGhyb3cgTDtwZSgxLDApfX0saTpmdW5jdGlvbihTLEEsayl7dmFyIEw9aGUoKTt0cnl7dmUoUykoQSxrKX1jYXRjaChWKXtpZihkZShMKSxWIT09ViswKXRocm93IFY7cGUoMSwwKX19LGhhOmZ1bmN0aW9uKFMsQSxrLEwpe3ZhciBWPWhlKCk7dHJ5e3ZlKFMpKEEsayxMKX1jYXRjaChxKXtpZihkZShWKSxxIT09cSswKXRocm93IHE7cGUoMSwwKX19LG06ZnVuY3Rpb24oUyxBLGssTCl7dmFyIFY9aGUoKTt0cnl7dmUoUykoQSxrLEwpfWNhdGNoKHEpe2lmKGRlKFYpLHEhPT1xKzApdGhyb3cgcTtwZSgxLDApfX0sdjpmdW5jdGlvbihTLEEsayxMLFYpe3ZhciBxPWhlKCk7dHJ5e3ZlKFMpKEEsayxMLFYpfWNhdGNoKFope2lmKGRlKHEpLFohPT1aKzApdGhyb3cgWjtwZSgxLDApfX0sdTpmdW5jdGlvbihTLEEsayxMLFYscSl7dmFyIFo9aGUoKTt0cnl7dmUoUykoQSxrLEwsVixxKX1jYXRjaChyZSl7aWYoZGUoWikscmUhPT1yZSswKXRocm93IHJlO3BlKDEsMCl9fSxPOmZ1bmN0aW9uKFMsQSxrLEwsVixxLFope3ZhciByZT1oZSgpO3RyeXt2ZShTKShBLGssTCxWLHEsWil9Y2F0Y2goZmUpe2lmKGRlKHJlKSxmZSE9PWZlKzApdGhyb3cgZmU7cGUoMSwwKX19LEE6ZnVuY3Rpb24oUyxBLGssTCxWLHEsWixyZSl7dmFyIGZlPWhlKCk7dHJ5e3ZlKFMpKEEsayxMLFYscSxaLHJlKX1jYXRjaChnZSl7aWYoZGUoZmUpLGdlIT09Z2UrMCl0aHJvdyBnZTtwZSgxLDApfX0sa2E6ZnVuY3Rpb24oUyxBLGssTCxWLHEsWixyZSxmZSl7dmFyIGdlPWhlKCk7dHJ5e3ZlKFMpKEEsayxMLFYscSxaLHJlLGZlKX1jYXRjaChGZSl7aWYoZGUoZ2UpLEZlIT09RmUrMCl0aHJvdyBGZTtwZSgxLDApfX0sQzpmdW5jdGlvbihTLEEsayxMLFYscSxaLHJlLGZlLGdlLEZlKXt2YXIgWGU9aGUoKTt0cnl7dmUoUykoQSxrLEwsVixxLFoscmUsZmUsZ2UsRmUpfWNhdGNoKEhlKXtpZihkZShYZSksSGUhPT1IZSswKXRocm93IEhlO3BlKDEsMCl9fSxEOmZ1bmN0aW9uKFMsQSxrLEwsVixxLFoscmUsZmUsZ2UsRmUsWGUsSGUsSCx5ZSxDZSl7dmFyIHR0PWhlKCk7dHJ5e3ZlKFMpKEEsayxMLFYscSxaLHJlLGZlLGdlLEZlLFhlLEhlLEgseWUsQ2UpfWNhdGNoKGh0KXtpZihkZSh0dCksaHQhPT1odCswKXRocm93IGh0O3BlKDEsMCl9fSxmYTpmdW5jdGlvbihTLEEsayxMLFYscSxaLHJlKXt2YXIgZmU9aGUoKTt0cnl7bm4oUyxBLGssTCxWLHEsWixyZSl9Y2F0Y2goZ2Upe2lmKGRlKGZlKSxnZSE9PWdlKzApdGhyb3cgZ2U7cGUoMSwwKX19LGRhOmZ1bmN0aW9uKFMsQSxrLEwsVixxLFoscmUsZmUsZ2UsRmUsWGUpe3ZhciBIZT1oZSgpO3RyeXtvbihTLEEsayxMLFYscSxaLHJlLGZlLGdlLEZlLFhlKX1jYXRjaChIKXtpZihkZShIZSksSCE9PUgrMCl0aHJvdyBIO3BlKDEsMCl9fSxlYTpmdW5jdGlvbihTLEEsayxMLFYscSl7dmFyIFo9aGUoKTt0cnl7cm4oUyxBLGssTCxWLHEpfWNhdGNoKHJlKXtpZihkZShaKSxyZSE9PXJlKzApdGhyb3cgcmU7cGUoMSwwKX19LG86ZnVuY3Rpb24oUyl7cmV0dXJuIFN9LGE6R3x8bi53YXNtTWVtb3J5LEc6ZnVuY3Rpb24oUyl7VWU9U30sbGE6VXQsejpmdW5jdGlvbihTLEEsayxMKXtyZXR1cm4gVXQoUyxBLGssTCl9fTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBTKFYscSl7bi5hc209Vi5leHBvcnRzLG9lLnFjLnB1c2gobi5hc20uc2IpLEJlPW4uYXNtLnViLGplLnVuc2hpZnQobi5hc20uVmEpLGVlPXEsTXx8KFZlLS0sbi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZuLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoVmUpLFZlPT0wJiZLZSYmKFY9S2UsS2U9bnVsbCxWKCkpKX1mdW5jdGlvbiBBKFYpe1MoVi5pbnN0YW5jZSxWLm1vZHVsZSl9ZnVuY3Rpb24gayhWKXtyZXR1cm4gZnVuY3Rpb24oKXtpZighRCYmKEV8fFApKXtpZih0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiImJiFNZS5zdGFydHNXaXRoKCJmaWxlOi8vIikpcmV0dXJuIGZldGNoKE1lLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihxKXtpZighcS5vayl0aHJvdyJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciK01lKyInIjtyZXR1cm4gcS5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gdXQoKX0pO2lmKG0pcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHEsWil7bShNZSxmdW5jdGlvbihyZSl7cShuZXcgVWludDhBcnJheShyZSkpfSxaKX0pfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHV0KCl9KX0oKS50aGVuKGZ1bmN0aW9uKHEpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShxLEwpfSkudGhlbihmdW5jdGlvbihxKXtyZXR1cm4gcX0pLnRoZW4oVixmdW5jdGlvbihxKXtGKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiK3EpLG1lKHEpfSl9dmFyIEw9e2E6cG59O2lmKE18fChWZSsrLG4ubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmbi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKFZlKSksbi5pbnN0YW50aWF0ZVdhc20pdHJ5e3JldHVybiBuLmluc3RhbnRpYXRlV2FzbShMLFMpfWNhdGNoKFYpe3JldHVybiBGKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK1YpLCExfShEfHx0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmchPSJmdW5jdGlvbiJ8fHB0KCl8fE1lLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKXx8dnx8dHlwZW9mIGZldGNoIT0iZnVuY3Rpb24iP2soQSk6ZmV0Y2goTWUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKFYpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhWLEwpLnRoZW4oQSxmdW5jdGlvbihxKXtyZXR1cm4gRigid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrcSksRigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSxrKEEpfSl9KSkuY2F0Y2goaSl9KSgpLG4uX19fd2FzbV9jYWxsX2N0b3JzPWZ1bmN0aW9uKCl7cmV0dXJuKG4uX19fd2FzbV9jYWxsX2N0b3JzPW4uYXNtLlZhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LG4uX09ydEluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4obi5fT3J0SW5pdD1uLmFzbS5XYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxuLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybihuLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz1uLmFzbS5YYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxuLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj1mdW5jdGlvbigpe3JldHVybihuLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj1uLmFzbS5ZYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxuLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9ZnVuY3Rpb24oKXtyZXR1cm4obi5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PW4uYXNtLlphKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LG4uX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybihuLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9bi5hc20uX2EpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sbi5fT3J0Q3JlYXRlU2Vzc2lvbj1mdW5jdGlvbigpe3JldHVybihuLl9PcnRDcmVhdGVTZXNzaW9uPW4uYXNtLiRhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LG4uX09ydFJlbGVhc2VTZXNzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuKG4uX09ydFJlbGVhc2VTZXNzaW9uPW4uYXNtLmFiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LG4uX09ydEdldElucHV0Q291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4obi5fT3J0R2V0SW5wdXRDb3VudD1uLmFzbS5iYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxuLl9PcnRHZXRPdXRwdXRDb3VudD1mdW5jdGlvbigpe3JldHVybihuLl9PcnRHZXRPdXRwdXRDb3VudD1uLmFzbS5jYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxuLl9PcnRHZXRJbnB1dE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4obi5fT3J0R2V0SW5wdXROYW1lPW4uYXNtLmRiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LG4uX09ydEdldE91dHB1dE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4obi5fT3J0R2V0T3V0cHV0TmFtZT1uLmFzbS5lYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxuLl9PcnRGcmVlPWZ1bmN0aW9uKCl7cmV0dXJuKG4uX09ydEZyZWU9bi5hc20uZmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sbi5fT3J0Q3JlYXRlVGVuc29yPWZ1bmN0aW9uKCl7cmV0dXJuKG4uX09ydENyZWF0ZVRlbnNvcj1uLmFzbS5nYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxuLl9PcnRHZXRUZW5zb3JEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuKG4uX09ydEdldFRlbnNvckRhdGE9bi5hc20uaGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sbi5fT3J0UmVsZWFzZVRlbnNvcj1mdW5jdGlvbigpe3JldHVybihuLl9PcnRSZWxlYXNlVGVuc29yPW4uYXNtLmliKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LG4uX09ydENyZWF0ZVJ1bk9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4obi5fT3J0Q3JlYXRlUnVuT3B0aW9ucz1uLmFzbS5qYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxuLl9PcnRBZGRSdW5Db25maWdFbnRyeT1mdW5jdGlvbigpe3JldHVybihuLl9PcnRBZGRSdW5Db25maWdFbnRyeT1uLmFzbS5rYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxuLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybihuLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1uLmFzbS5sYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxuLl9PcnRSdW49ZnVuY3Rpb24oKXtyZXR1cm4obi5fT3J0UnVuPW4uYXNtLm1iKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LG4uX09ydEVuZFByb2ZpbGluZz1mdW5jdGlvbigpe3JldHVybihuLl9PcnRFbmRQcm9maWxpbmc9bi5hc20ubmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIEN0PW4uX3B0aHJlYWRfc2VsZj1mdW5jdGlvbigpe3JldHVybihDdD1uLl9wdGhyZWFkX3NlbGY9bi5hc20ub2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sJHQ9bi5fbWFsbG9jPWZ1bmN0aW9uKCl7cmV0dXJuKCR0PW4uX21hbGxvYz1uLmFzbS5wYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxHdD1uLl9mcmVlPWZ1bmN0aW9uKCl7cmV0dXJuKEd0PW4uX2ZyZWU9bi5hc20ucWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0scXQ9bi5fZmZsdXNoPWZ1bmN0aW9uKCl7cmV0dXJuKHF0PW4uX2ZmbHVzaD1uLmFzbS5yYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfTtuLl9fZW1zY3JpcHRlbl90bHNfaW5pdD1mdW5jdGlvbigpe3JldHVybihuLl9fZW1zY3JpcHRlbl90bHNfaW5pdD1uLmFzbS5zYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgV3Q9bi5fX19mdW5jc19vbl9leGl0PWZ1bmN0aW9uKCl7cmV0dXJuKFd0PW4uX19fZnVuY3Nfb25fZXhpdD1uLmFzbS50YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxIdD1uLl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD1mdW5jdGlvbigpe3JldHVybihIdD1uLl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD1uLmFzbS52YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfTtuLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZD1mdW5jdGlvbigpe3JldHVybihuLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZD1uLmFzbS53YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgRHQsWXQ9bi5fZW1zY3JpcHRlbl9ydW5faW5fbWFpbl9ydW50aW1lX3RocmVhZF9qcz1mdW5jdGlvbigpe3JldHVybihZdD1uLl9lbXNjcmlwdGVuX3J1bl9pbl9tYWluX3J1bnRpbWVfdGhyZWFkX2pzPW4uYXNtLnhiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEt0PW4uX19lbXNjcmlwdGVuX3Byb3h5X2V4ZWN1dGVfdGFza19xdWV1ZT1mdW5jdGlvbigpe3JldHVybihLdD1uLl9fZW1zY3JpcHRlbl9wcm94eV9leGVjdXRlX3Rhc2tfcXVldWU9bi5hc20ueWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUnQ9bi5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2ZyZWVfZGF0YT1mdW5jdGlvbigpe3JldHVybihSdD1uLl9fZW1zY3JpcHRlbl90aHJlYWRfZnJlZV9kYXRhPW4uYXNtLnpiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFh0PW4uX19lbXNjcmlwdGVuX3RocmVhZF9leGl0PWZ1bmN0aW9uKCl7cmV0dXJuKFh0PW4uX19lbXNjcmlwdGVuX3RocmVhZF9leGl0PW4uYXNtLkFiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHBlPW4uX3NldFRocmV3PWZ1bmN0aW9uKCl7cmV0dXJuKHBlPW4uX3NldFRocmV3PW4uYXNtLkJiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFF0PW4uX2Vtc2NyaXB0ZW5fc3RhY2tfc2V0X2xpbWl0cz1mdW5jdGlvbigpe3JldHVybihRdD1uLl9lbXNjcmlwdGVuX3N0YWNrX3NldF9saW1pdHM9bi5hc20uQ2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0saGU9bi5zdGFja1NhdmU9ZnVuY3Rpb24oKXtyZXR1cm4oaGU9bi5zdGFja1NhdmU9bi5hc20uRGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZGU9bi5zdGFja1Jlc3RvcmU9ZnVuY3Rpb24oKXtyZXR1cm4oZGU9bi5zdGFja1Jlc3RvcmU9bi5hc20uRWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sQnQ9bi5zdGFja0FsbG9jPWZ1bmN0aW9uKCl7cmV0dXJuKEJ0PW4uc3RhY2tBbGxvYz1uLmFzbS5GYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxGdD1uLl9fX2N4YV9jYW5fY2F0Y2g9ZnVuY3Rpb24oKXtyZXR1cm4oRnQ9bi5fX19jeGFfY2FuX2NhdGNoPW4uYXNtLkdiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFp0PW4uX19fY3hhX2lzX3BvaW50ZXJfdHlwZT1mdW5jdGlvbigpe3JldHVybihadD1uLl9fX2N4YV9pc19wb2ludGVyX3R5cGU9bi5hc20uSGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sSnQ9bi5keW5DYWxsX2o9ZnVuY3Rpb24oKXtyZXR1cm4oSnQ9bi5keW5DYWxsX2o9bi5hc20uSWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZW49bi5keW5DYWxsX2lpaWlpaj1mdW5jdGlvbigpe3JldHVybihlbj1uLmR5bkNhbGxfaWlpaWlqPW4uYXNtLkpiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHRuPW4uZHluQ2FsbF9qaWk9ZnVuY3Rpb24oKXtyZXR1cm4odG49bi5keW5DYWxsX2ppaT1uLmFzbS5LYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxubj1uLmR5bkNhbGxfdmlpaWlpaj1mdW5jdGlvbigpe3JldHVybihubj1uLmR5bkNhbGxfdmlpaWlpaj1uLmFzbS5MYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxybj1uLmR5bkNhbGxfdmpqaT1mdW5jdGlvbigpe3JldHVybihybj1uLmR5bkNhbGxfdmpqaT1uLmFzbS5NYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxvbj1uLmR5bkNhbGxfdmlpaWpqamlpPWZ1bmN0aW9uKCl7cmV0dXJuKG9uPW4uZHluQ2FsbF92aWlpampqaWk9bi5hc20uTmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sc249bi5keW5DYWxsX2lpaj1mdW5jdGlvbigpe3JldHVybihzbj1uLmR5bkNhbGxfaWlqPW4uYXNtLk9iKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGFuPW4uZHluQ2FsbF9qaT1mdW5jdGlvbigpe3JldHVybihhbj1uLmR5bkNhbGxfamk9bi5hc20uUGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sbG49bi5keW5DYWxsX2lpaWlpaWo9ZnVuY3Rpb24oKXtyZXR1cm4obG49bi5keW5DYWxsX2lpaWlpaWo9bi5hc20uUWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdW49bi5keW5DYWxsX2lpaWo9ZnVuY3Rpb24oKXtyZXR1cm4odW49bi5keW5DYWxsX2lpaWo9bi5hc20uUmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07ZnVuY3Rpb24gY24oKXtmdW5jdGlvbiBTKCl7aWYoIUR0JiYoRHQ9ITAsbi5jYWxsZWRSdW49ITAsIWJlKSYmKE18fHJ0KGplKSxlKG4pLG4ub25SdW50aW1lSW5pdGlhbGl6ZWQmJm4ub25SdW50aW1lSW5pdGlhbGl6ZWQoKSwhTSkpe2lmKG4ucG9zdFJ1bilmb3IodHlwZW9mIG4ucG9zdFJ1bj09ImZ1bmN0aW9uIiYmKG4ucG9zdFJ1bj1bbi5wb3N0UnVuXSk7bi5wb3N0UnVuLmxlbmd0aDspe3ZhciBBPW4ucG9zdFJ1bi5zaGlmdCgpO1FlLnVuc2hpZnQoQSl9cnQoUWUpfX1pZighKDA8VmUpKWlmKE0pZShuKSxNfHxydChqZSkscG9zdE1lc3NhZ2Uoe2NtZDoibG9hZGVkIn0pO2Vsc2V7aWYobi5wcmVSdW4pZm9yKHR5cGVvZiBuLnByZVJ1bj09ImZ1bmN0aW9uIiYmKG4ucHJlUnVuPVtuLnByZVJ1bl0pO24ucHJlUnVuLmxlbmd0aDspR2UoKTtydCh6ZSksMDxWZXx8KG4uc2V0U3RhdHVzPyhuLnNldFN0YXR1cygiUnVubmluZy4uLiIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5zZXRTdGF0dXMoIiIpfSwxKSxTKCl9LDEpKTpTKCkpfX1pZihuLlVURjhUb1N0cmluZz1FZSxuLnN0cmluZ1RvVVRGOD1mdW5jdGlvbihTLEEsayl7cmV0dXJuIGtlKFMscCgpLEEsayl9LG4ubGVuZ3RoQnl0ZXNVVEY4PURlLG4ua2VlcFJ1bnRpbWVBbGl2ZT1xZSxuLndhc21NZW1vcnk9RyxuLnN0YWNrU2F2ZT1oZSxuLnN0YWNrUmVzdG9yZT1kZSxuLnN0YWNrQWxsb2M9QnQsbi5FeGl0U3RhdHVzPVplLG4uUFRocmVhZD1vZSxLZT1mdW5jdGlvbiBTKCl7RHR8fGNuKCksRHR8fChLZT1TKX0sbi5wcmVJbml0KWZvcih0eXBlb2Ygbi5wcmVJbml0PT0iZnVuY3Rpb24iJiYobi5wcmVJbml0PVtuLnByZUluaXRdKTswPG4ucHJlSW5pdC5sZW5ndGg7KW4ucHJlSW5pdC5wb3AoKSgpO3JldHVybiBjbigpLGgucmVhZHl9KTtjLmV4cG9ydHM9dX0sOTMyOihjLHQscik9Pnt2YXIgbyx1PShvPShvPXR5cGVvZiBkb2N1bWVudDwidSImJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwKXx8Ii9pbmRleC5qcyIsZnVuY3Rpb24oaCl7dmFyIGEscCxmO2g9aHx8e30sYXx8KGE9aCE9PXZvaWQgMD9oOnt9KSxhLnJlYWR5PW5ldyBQcm9taXNlKGZ1bmN0aW9uKE8sQyl7cD1PLGY9Q30pO3ZhciBkLGwsbixlLGkscyxtPU9iamVjdC5hc3NpZ24oe30sYSksZz0iLi90aGlzLnByb2dyYW0iLF89KE8sQyk9Pnt0aHJvdyBDfSxiPXR5cGVvZiB3aW5kb3c9PSJvYmplY3QiLHk9dHlwZW9mIGltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiIsVD10eXBlb2YgcHJvY2Vzcz09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT0ib2JqZWN0IiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZT09InN0cmluZyIsdz0iIjtUPyh3PXk/cig5MDgpLmRpcm5hbWUodykrIi8iOiIvLyIscz0oKT0+e2l8fChlPXIoMTM4NCksaT1yKDkwOCkpfSxkPWZ1bmN0aW9uKE8sQyl7cmV0dXJuIHMoKSxPPWkubm9ybWFsaXplKE8pLGUucmVhZEZpbGVTeW5jKE8sQz92b2lkIDA6InV0ZjgiKX0sbj1PPT4oKE89ZChPLCEwKSkuYnVmZmVyfHwoTz1uZXcgVWludDhBcnJheShPKSksTyksbD0oTyxDLFIpPT57cygpLE89aS5ub3JtYWxpemUoTyksZS5yZWFkRmlsZShPLGZ1bmN0aW9uKGosVSl7aj9SKGopOkMoVS5idWZmZXIpfSl9LDE8cHJvY2Vzcy5hcmd2Lmxlbmd0aCYmKGc9cHJvY2Vzcy5hcmd2WzFdLnJlcGxhY2UoL1xcL2csIi8iKSkscHJvY2Vzcy5hcmd2LnNsaWNlKDIpLHByb2Nlc3Mub24oInVuY2F1Z2h0RXhjZXB0aW9uIixmdW5jdGlvbihPKXtpZighKE8gaW5zdGFuY2VvZiBqZSkpdGhyb3cgT30pLHByb2Nlc3Mub24oInVuaGFuZGxlZFJlamVjdGlvbiIsZnVuY3Rpb24oTyl7dGhyb3cgT30pLF89KE8sQyk9PntpZih2fHwwPEllKXRocm93IHByb2Nlc3MuZXhpdENvZGU9TyxDO0MgaW5zdGFuY2VvZiBqZXx8UCgiZXhpdGluZyBkdWUgdG8gZXhjZXB0aW9uOiAiK0MpLHByb2Nlc3MuZXhpdChPKX0sYS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIn0pOihifHx5KSYmKHk/dz1zZWxmLmxvY2F0aW9uLmhyZWY6dHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKHc9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLG8mJih3PW8pLHc9dy5pbmRleE9mKCJibG9iOiIpIT09MD93LnN1YnN0cigwLHcucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKToiIixkPU89Pnt2YXIgQz1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIEMub3BlbigiR0VUIixPLCExKSxDLnNlbmQobnVsbCksQy5yZXNwb25zZVRleHR9LHkmJihuPU89Pnt2YXIgQz1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIEMub3BlbigiR0VUIixPLCExKSxDLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLEMuc2VuZChudWxsKSxuZXcgVWludDhBcnJheShDLnJlc3BvbnNlKX0pLGw9KE8sQyxSKT0+e3ZhciBqPW5ldyBYTUxIdHRwUmVxdWVzdDtqLm9wZW4oIkdFVCIsTywhMCksai5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixqLm9ubG9hZD0oKT0+e2ouc3RhdHVzPT0yMDB8fGouc3RhdHVzPT0wJiZqLnJlc3BvbnNlP0Moai5yZXNwb25zZSk6UigpfSxqLm9uZXJyb3I9UixqLnNlbmQobnVsbCl9KTt2YXIgeCxFPWEucHJpbnR8fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksUD1hLnByaW50RXJyfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGEsbSksbT1udWxsLGEudGhpc1Byb2dyYW0mJihnPWEudGhpc1Byb2dyYW0pLGEucXVpdCYmKF89YS5xdWl0KSxhLndhc21CaW5hcnkmJih4PWEud2FzbUJpbmFyeSk7dmFyIHY9YS5ub0V4aXRSdW50aW1lfHwhMTt0eXBlb2YgV2ViQXNzZW1ibHkhPSJvYmplY3QiJiZBZSgibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCIpO3ZhciBNLCQseixCLE4sRCxJPSExLEY9dHlwZW9mIFRleHREZWNvZGVyPCJ1Ij9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDA7ZnVuY3Rpb24gWChPLEMsUil7dmFyIGo9KEM+Pj49MCkrUjtmb3IoUj1DO09bUl0mJiEoUj49aik7KSsrUjtpZigxNjxSLUMmJk8uYnVmZmVyJiZGKXJldHVybiBGLmRlY29kZShPLnN1YmFycmF5KEMsUikpO2ZvcihqPSIiO0M8Ujspe3ZhciBVPU9bQysrXTtpZigxMjgmVSl7dmFyIFk9NjMmT1tDKytdO2lmKCgyMjQmVSk9PTE5MilqKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgzMSZVKTw8NnxZKTtlbHNle3ZhciBRPTYzJk9bQysrXTs2NTUzNj4oVT0oMjQwJlUpPT0yMjQ/KDE1JlUpPDwxMnxZPDw2fFE6KDcmVSk8PDE4fFk8PDEyfFE8PDZ8NjMmT1tDKytdKT9qKz1TdHJpbmcuZnJvbUNoYXJDb2RlKFUpOihVLT02NTUzNixqKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fFU+PjEwLDU2MzIwfDEwMjMmVSkpfX1lbHNlIGorPVN0cmluZy5mcm9tQ2hhckNvZGUoVSl9cmV0dXJuIGp9ZnVuY3Rpb24gRyhPLEMpe3JldHVybihPPj4+PTApP1goQixPLEMpOiIifWZ1bmN0aW9uIGVlKE8sQyxSLGope2lmKCEoMDxqKSlyZXR1cm4gMDt2YXIgVT1SPj4+PTA7aj1SK2otMTtmb3IodmFyIFk9MDtZPE8ubGVuZ3RoOysrWSl7dmFyIFE9Ty5jaGFyQ29kZUF0KFkpO2lmKDU1Mjk2PD1RJiY1NzM0Mz49USYmKFE9NjU1MzYrKCgxMDIzJlEpPDwxMCl8MTAyMyZPLmNoYXJDb2RlQXQoKytZKSksMTI3Pj1RKXtpZihSPj1qKWJyZWFrO0NbUisrPj4+MF09UX1lbHNle2lmKDIwNDc+PVEpe2lmKFIrMT49ailicmVhaztDW1IrKz4+PjBdPTE5MnxRPj42fWVsc2V7aWYoNjU1MzU+PVEpe2lmKFIrMj49ailicmVhaztDW1IrKz4+PjBdPTIyNHxRPj4xMn1lbHNle2lmKFIrMz49ailicmVhaztDW1IrKz4+PjBdPTI0MHxRPj4xOCxDW1IrKz4+PjBdPTEyOHxRPj4xMiY2M31DW1IrKz4+PjBdPTEyOHxRPj42JjYzfUNbUisrPj4+MF09MTI4fDYzJlF9fXJldHVybiBDW1I+Pj4wXT0wLFItVX1mdW5jdGlvbiBKKE8pe2Zvcih2YXIgQz0wLFI9MDtSPE8ubGVuZ3RoOysrUil7dmFyIGo9Ty5jaGFyQ29kZUF0KFIpOzEyNz49aj9DKys6MjA0Nz49aj9DKz0yOjU1Mjk2PD1qJiY1NzM0Mz49aj8oQys9NCwrK1IpOkMrPTN9cmV0dXJuIEN9ZnVuY3Rpb24gbGUoKXt2YXIgTz1NLmJ1ZmZlcjskPU8sYS5IRUFQOD16PW5ldyBJbnQ4QXJyYXkoTyksYS5IRUFQMTY9bmV3IEludDE2QXJyYXkoTyksYS5IRUFQMzI9Tj1uZXcgSW50MzJBcnJheShPKSxhLkhFQVBVOD1CPW5ldyBVaW50OEFycmF5KE8pLGEuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkoTyksYS5IRUFQVTMyPUQ9bmV3IFVpbnQzMkFycmF5KE8pLGEuSEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KE8pLGEuSEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KE8pfXZhciB4ZSx3ZT1bXSxpZT1bXSxUZT1bXSxiZT1bXSxJZT0wO2Z1bmN0aW9uIExlKCl7dmFyIE89YS5wcmVSdW4uc2hpZnQoKTt3ZS51bnNoaWZ0KE8pfXZhciBFZSxrZT0wLERlPW51bGw7ZnVuY3Rpb24gQWUoTyl7dGhyb3cgYS5vbkFib3J0JiZhLm9uQWJvcnQoTyksUChPPSJBYm9ydGVkKCIrTysiKSIpLEk9ITAsTz1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKE8rIi4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4iKSxmKE8pLE99ZnVuY3Rpb24gU2UoKXtyZXR1cm4gRWUuc3RhcnRzV2l0aCgiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCIpfWlmKEVlPSJvcnQtd2FzbS53YXNtIiwhU2UoKSl7dmFyIEJlPUVlO0VlPWEubG9jYXRlRmlsZT9hLmxvY2F0ZUZpbGUoQmUsdyk6dytCZX1mdW5jdGlvbiB6ZSgpe3ZhciBPPUVlO3RyeXtpZihPPT1FZSYmeClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeCk7aWYobilyZXR1cm4gbihPKTt0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9Y2F0Y2goQyl7QWUoQyl9fWZ1bmN0aW9uIGplKE8pe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPSJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIrTysiKSIsdGhpcy5zdGF0dXM9T31mdW5jdGlvbiBZZShPKXtmb3IoOzA8Ty5sZW5ndGg7KU8uc2hpZnQoKShhKX12YXIgUWU9W10scWU9MCxHZT0wO2Z1bmN0aW9uIE1lKE8pe3RoaXMuRGI9Tyx0aGlzLnpiPU8tMjQsdGhpcy5VYj1mdW5jdGlvbihDKXtEW3RoaXMuemIrND4+Mj4+PjBdPUN9LHRoaXMuRWI9ZnVuY3Rpb24oKXtyZXR1cm4gRFt0aGlzLnpiKzQ+PjI+Pj4wXX0sdGhpcy5TYj1mdW5jdGlvbihDKXtEW3RoaXMuemIrOD4+Mj4+PjBdPUN9LHRoaXMuV2I9ZnVuY3Rpb24oKXtyZXR1cm4gRFt0aGlzLnpiKzg+PjI+Pj4wXX0sdGhpcy5UYj1mdW5jdGlvbigpe05bdGhpcy56Yj4+Mj4+PjBdPTB9LHRoaXMuSWI9ZnVuY3Rpb24oQyl7elt0aGlzLnpiKzEyPj4wPj4+MF09Qz8xOjB9LHRoaXMuUGI9ZnVuY3Rpb24oKXtyZXR1cm4gelt0aGlzLnpiKzEyPj4wPj4+MF0hPTB9LHRoaXMuSmI9ZnVuY3Rpb24oQyl7elt0aGlzLnpiKzEzPj4wPj4+MF09Qz8xOjB9LHRoaXMuTGI9ZnVuY3Rpb24oKXtyZXR1cm4gelt0aGlzLnpiKzEzPj4wPj4+MF0hPTB9LHRoaXMuUmI9ZnVuY3Rpb24oQyxSKXt0aGlzLkZiKDApLHRoaXMuVWIoQyksdGhpcy5TYihSKSx0aGlzLlRiKCksdGhpcy5JYighMSksdGhpcy5KYighMSl9LHRoaXMuTmI9ZnVuY3Rpb24oKXtOW3RoaXMuemI+PjI+Pj4wXSs9MX0sdGhpcy5YYj1mdW5jdGlvbigpe3ZhciBDPU5bdGhpcy56Yj4+Mj4+PjBdO3JldHVybiBOW3RoaXMuemI+PjI+Pj4wXT1DLTEsQz09PTF9LHRoaXMuRmI9ZnVuY3Rpb24oQyl7RFt0aGlzLnpiKzE2Pj4yPj4+MF09Q30sdGhpcy5PYj1mdW5jdGlvbigpe3JldHVybiBEW3RoaXMuemIrMTY+PjI+Pj4wXX0sdGhpcy5RYj1mdW5jdGlvbigpe2lmKGd0KHRoaXMuRWIoKSkpcmV0dXJuIERbdGhpcy5EYj4+Mj4+PjBdO3ZhciBDPXRoaXMuT2IoKTtyZXR1cm4gQyE9PTA/Qzp0aGlzLkRifX1mdW5jdGlvbiBWZShPKXtyZXR1cm4gb3QobmV3IE1lKE8pLnpiKX12YXIgS2U9W107ZnVuY3Rpb24gbWUoTyl7dmFyIEM9S2VbT107cmV0dXJuIEN8fChPPj1LZS5sZW5ndGgmJihLZS5sZW5ndGg9TysxKSxLZVtPXT1DPXhlLmdldChPKSksQ31mdW5jdGlvbiBwdChPKXt2YXIgQz1KKE8pKzEsUj12ZShDKTtyZXR1cm4gUiYmZWUoTyx6LFIsQyksUn12YXIgdXQ9e307ZnVuY3Rpb24gT3QoKXtpZighWmUpe3ZhciBPLEM9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzoodHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJm5hdmlnYXRvci5sYW5ndWFnZXMmJm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fCJDIikucmVwbGFjZSgiLSIsIl8iKSsiLlVURi04IixfOmd8fCIuL3RoaXMucHJvZ3JhbSJ9O2ZvcihPIGluIHV0KXV0W09dPT09dm9pZCAwP2RlbGV0ZSBDW09dOkNbT109dXRbT107dmFyIFI9W107Zm9yKE8gaW4gQylSLnB1c2goTysiPSIrQ1tPXSk7WmU9Un1yZXR1cm4gWmV9dmFyIFplLGN0PVtudWxsLFtdLFtdXTtmdW5jdGlvbiBkdChPLEMpe3ZhciBSPWN0W09dO0M9PT0wfHxDPT09MTA/KChPPT09MT9FOlApKFgoUiwwKSksUi5sZW5ndGg9MCk6Ui5wdXNoKEMpfXZhciBSZT0wO2Z1bmN0aW9uIGl0KE8pe3JldHVybiBPJTQ9PTAmJihPJTEwMCE9MHx8TyU0MDA9PTApfXZhciBvZT1bMzEsMjksMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLHJ0PVszMSwyOCwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV07ZnVuY3Rpb24gTXQoTyxDLFIsail7ZnVuY3Rpb24gVShXLF9lLE9lKXtmb3IoVz10eXBlb2YgVz09Im51bWJlciI/Vy50b1N0cmluZygpOld8fCIiO1cubGVuZ3RoPF9lOylXPU9lWzBdK1c7cmV0dXJuIFd9ZnVuY3Rpb24gWShXLF9lKXtyZXR1cm4gVShXLF9lLCIwIil9ZnVuY3Rpb24gUShXLF9lKXtmdW5jdGlvbiBPZShldCl7cmV0dXJuIDA+ZXQ/LTE6MDxldD8xOjB9dmFyIFdlO3JldHVybihXZT1PZShXLmdldEZ1bGxZZWFyKCktX2UuZ2V0RnVsbFllYXIoKSkpPT09MCYmKFdlPU9lKFcuZ2V0TW9udGgoKS1fZS5nZXRNb250aCgpKSk9PT0wJiYoV2U9T2UoVy5nZXREYXRlKCktX2UuZ2V0RGF0ZSgpKSksV2V9ZnVuY3Rpb24gbmUoVyl7c3dpdGNoKFcuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoVy5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gVztjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKFcuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoVy5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZShXLmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKFcuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKFcuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24gdGUoVyl7dmFyIF9lPVcuQmI7Zm9yKFc9bmV3IERhdGUobmV3IERhdGUoVy5DYisxOTAwLDAsMSkuZ2V0VGltZSgpKTswPF9lOyl7dmFyIE9lPVcuZ2V0TW9udGgoKSxXZT0oaXQoVy5nZXRGdWxsWWVhcigpKT9vZTpydClbT2VdO2lmKCEoX2U+V2UtVy5nZXREYXRlKCkpKXtXLnNldERhdGUoVy5nZXREYXRlKCkrX2UpO2JyZWFrfV9lLT1XZS1XLmdldERhdGUoKSsxLFcuc2V0RGF0ZSgxKSwxMT5PZT9XLnNldE1vbnRoKE9lKzEpOihXLnNldE1vbnRoKDApLFcuc2V0RnVsbFllYXIoVy5nZXRGdWxsWWVhcigpKzEpKX1yZXR1cm4gT2U9bmV3IERhdGUoVy5nZXRGdWxsWWVhcigpKzEsMCw0KSxfZT1uZShuZXcgRGF0ZShXLmdldEZ1bGxZZWFyKCksMCw0KSksT2U9bmUoT2UpLDA+PVEoX2UsVyk/MD49UShPZSxXKT9XLmdldEZ1bGxZZWFyKCkrMTpXLmdldEZ1bGxZZWFyKCk6Vy5nZXRGdWxsWWVhcigpLTF9dmFyIGNlPU5bais0MD4+Mj4+PjBdO2Zvcih2YXIgUGUgaW4gaj17JGI6TltqPj4yPj4+MF0sWmI6TltqKzQ+PjI+Pj4wXSxHYjpOW2orOD4+Mj4+PjBdLEtiOk5baisxMj4+Mj4+PjBdLEhiOk5baisxNj4+Mj4+PjBdLENiOk5baisyMD4+Mj4+PjBdLEFiOk5baisyND4+Mj4+PjBdLEJiOk5baisyOD4+Mj4+PjBdLGJjOk5baiszMj4+Mj4+PjBdLFliOk5baiszNj4+Mj4+PjBdLGFjOmNlP0coY2UpOiIifSxSPUcoUiksY2U9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9KVI9Ui5yZXBsYWNlKG5ldyBSZWdFeHAoUGUsImciKSxjZVtQZV0pO3ZhciAkZT0iU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXkiLnNwbGl0KCIgIiksTmU9IkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIiLnNwbGl0KCIgIik7Zm9yKFBlIGluIGNlPXsiJWEiOmZ1bmN0aW9uKFcpe3JldHVybiAkZVtXLkFiXS5zdWJzdHJpbmcoMCwzKX0sIiVBIjpmdW5jdGlvbihXKXtyZXR1cm4gJGVbVy5BYl19LCIlYiI6ZnVuY3Rpb24oVyl7cmV0dXJuIE5lW1cuSGJdLnN1YnN0cmluZygwLDMpfSwiJUIiOmZ1bmN0aW9uKFcpe3JldHVybiBOZVtXLkhiXX0sIiVDIjpmdW5jdGlvbihXKXtyZXR1cm4gWSgoVy5DYisxOTAwKS8xMDB8MCwyKX0sIiVkIjpmdW5jdGlvbihXKXtyZXR1cm4gWShXLktiLDIpfSwiJWUiOmZ1bmN0aW9uKFcpe3JldHVybiBVKFcuS2IsMiwiICIpfSwiJWciOmZ1bmN0aW9uKFcpe3JldHVybiB0ZShXKS50b1N0cmluZygpLnN1YnN0cmluZygyKX0sIiVHIjpmdW5jdGlvbihXKXtyZXR1cm4gdGUoVyl9LCIlSCI6ZnVuY3Rpb24oVyl7cmV0dXJuIFkoVy5HYiwyKX0sIiVJIjpmdW5jdGlvbihXKXtyZXR1cm4oVz1XLkdiKT09MD9XPTEyOjEyPFcmJihXLT0xMiksWShXLDIpfSwiJWoiOmZ1bmN0aW9uKFcpe2Zvcih2YXIgX2U9MCxPZT0wO09lPD1XLkhiLTE7X2UrPShpdChXLkNiKzE5MDApP29lOnJ0KVtPZSsrXSk7cmV0dXJuIFkoVy5LYitfZSwzKX0sIiVtIjpmdW5jdGlvbihXKXtyZXR1cm4gWShXLkhiKzEsMil9LCIlTSI6ZnVuY3Rpb24oVyl7cmV0dXJuIFkoVy5aYiwyKX0sIiVuIjpmdW5jdGlvbigpe3JldHVybmAKYH0sIiVwIjpmdW5jdGlvbihXKXtyZXR1cm4gMDw9Vy5HYiYmMTI+Vy5HYj8iQU0iOiJQTSJ9LCIlUyI6ZnVuY3Rpb24oVyl7cmV0dXJuIFkoVy4kYiwyKX0sIiV0IjpmdW5jdGlvbigpe3JldHVybiIJIn0sIiV1IjpmdW5jdGlvbihXKXtyZXR1cm4gVy5BYnx8N30sIiVVIjpmdW5jdGlvbihXKXtyZXR1cm4gWShNYXRoLmZsb29yKChXLkJiKzctVy5BYikvNyksMil9LCIlViI6ZnVuY3Rpb24oVyl7dmFyIF9lPU1hdGguZmxvb3IoKFcuQmIrNy0oVy5BYis2KSU3KS83KTtpZigyPj0oVy5BYiszNzEtVy5CYi0yKSU3JiZfZSsrLF9lKV9lPT01MyYmKChPZT0oVy5BYiszNzEtVy5CYiklNyk9PTR8fE9lPT0zJiZpdChXLkNiKXx8KF9lPTEpKTtlbHNle19lPTUyO3ZhciBPZT0oVy5BYis3LVcuQmItMSklNzsoT2U9PTR8fE9lPT01JiZpdChXLkNiJTQwMC0xKSkmJl9lKyt9cmV0dXJuIFkoX2UsMil9LCIldyI6ZnVuY3Rpb24oVyl7cmV0dXJuIFcuQWJ9LCIlVyI6ZnVuY3Rpb24oVyl7cmV0dXJuIFkoTWF0aC5mbG9vcigoVy5CYis3LShXLkFiKzYpJTcpLzcpLDIpfSwiJXkiOmZ1bmN0aW9uKFcpe3JldHVybihXLkNiKzE5MDApLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpfSwiJVkiOmZ1bmN0aW9uKFcpe3JldHVybiBXLkNiKzE5MDB9LCIleiI6ZnVuY3Rpb24oVyl7dmFyIF9lPTA8PShXPVcuWWIpO3JldHVybiBXPU1hdGguYWJzKFcpLzYwLChfZT8iKyI6Ii0iKSsoIjAwMDAiKyhXLzYwKjEwMCtXJTYwKSkuc2xpY2UoLTQpfSwiJVoiOmZ1bmN0aW9uKFcpe3JldHVybiBXLmFjfSwiJSUiOmZ1bmN0aW9uKCl7cmV0dXJuIiUifX0sUj1SLnJlcGxhY2UoLyUlL2csIlwwXDAiKSxjZSlSLmluY2x1ZGVzKFBlKSYmKFI9Ui5yZXBsYWNlKG5ldyBSZWdFeHAoUGUsImciKSxjZVtQZV0oaikpKTtyZXR1cm4gUGU9ZnVuY3Rpb24oVyl7dmFyIF9lPUFycmF5KEooVykrMSk7cmV0dXJuIGVlKFcsX2UsMCxfZS5sZW5ndGgpLF9lfShSPVIucmVwbGFjZSgvXDBcMC9nLCIlIikpLFBlLmxlbmd0aD5DPzA6KHouc2V0KFBlLE8+Pj4wKSxQZS5sZW5ndGgtMSl9dmFyIEl0PXthOmZ1bmN0aW9uKE8pe3JldHVybiB2ZShPKzI0KSsyNH0sbTpmdW5jdGlvbihPKXtyZXR1cm4oTz1uZXcgTWUoTykpLlBiKCl8fChPLkliKCEwKSxxZS0tKSxPLkpiKCExKSxRZS5wdXNoKE8pLE8uTmIoKSxPLlFiKCl9LGlhOmZ1bmN0aW9uKE8pe3Rocm93IFAoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biwgdGhpcyBpcyBub3QgcHJvcGVybHkgc3VwcG9ydGVkIC0gYWJvcnRpbmciKSxJPSEwLE99LHc6ZnVuY3Rpb24oKXt1ZSgwKTt2YXIgTz1RZS5wb3AoKTtpZihPLlhiKCkmJiFPLkxiKCkpe3ZhciBDPU8uV2IoKTtDJiZtZShDKShPLkRiKSxWZShPLkRiKX1HZT0wfSxkOmZ1bmN0aW9uKCl7dmFyIE89R2U7aWYoIU8pcmV0dXJuIFJlPTA7dmFyIEM9bmV3IE1lKE8pO0MuRmIoTyk7dmFyIFI9Qy5FYigpO2lmKCFSKXJldHVybiBSZT0wLE87Zm9yKHZhciBqPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksVT0wO1U8ai5sZW5ndGg7VSsrKXt2YXIgWT1qW1VdO2lmKFk9PT0wfHxZPT09UilicmVhaztpZihhdChZLFIsQy56YisxNikpcmV0dXJuIFJlPVksT31yZXR1cm4gUmU9UixPfSxrOmZ1bmN0aW9uKCl7dmFyIE89R2U7aWYoIU8pcmV0dXJuIFJlPTA7dmFyIEM9bmV3IE1lKE8pO0MuRmIoTyk7dmFyIFI9Qy5FYigpO2lmKCFSKXJldHVybiBSZT0wLE87Zm9yKHZhciBqPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksVT0wO1U8ai5sZW5ndGg7VSsrKXt2YXIgWT1qW1VdO2lmKFk9PT0wfHxZPT09UilicmVhaztpZihhdChZLFIsQy56YisxNikpcmV0dXJuIFJlPVksT31yZXR1cm4gUmU9UixPfSxnOmZ1bmN0aW9uKCl7dmFyIE89R2U7aWYoIU8pcmV0dXJuIFJlPTA7dmFyIEM9bmV3IE1lKE8pO0MuRmIoTyk7dmFyIFI9Qy5FYigpO2lmKCFSKXJldHVybiBSZT0wLE87Zm9yKHZhciBqPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksVT0wO1U8ai5sZW5ndGg7VSsrKXt2YXIgWT1qW1VdO2lmKFk9PT0wfHxZPT09UilicmVhaztpZihhdChZLFIsQy56YisxNikpcmV0dXJuIFJlPVksT31yZXR1cm4gUmU9UixPfSxzOlZlLEw6ZnVuY3Rpb24oKXt2YXIgTz1RZS5wb3AoKTtPfHxBZSgibm8gZXhjZXB0aW9uIHRvIHRocm93Iik7dmFyIEM9Ty5EYjt0aHJvdyBPLkxiKCl8fChRZS5wdXNoKE8pLE8uSmIoITApLE8uSWIoITEpLHFlKyspLEdlPUMsQ30sYjpmdW5jdGlvbihPLEMsUil7dGhyb3cgbmV3IE1lKE8pLlJiKEMsUiksR2U9TyxxZSsrLE99LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHFlfSxpOmZ1bmN0aW9uKE8pe3Rocm93IEdlfHwoR2U9TyksT30sSDpmdW5jdGlvbigpe3JldHVybiAwfSxCYTpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3JldHVybiAwfSx6YTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt9LHlhOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7fSxxYTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt9LEFhOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe30sSGE6ZnVuY3Rpb24oKXt9LEphOmZ1bmN0aW9uKCl7QWUoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIGVuYWJsZSBkeW5hbWljIGxpbmtpbmcsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIil9LElhOmZ1bmN0aW9uKCl7QWUoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIGVuYWJsZSBkeW5hbWljIGxpbmtpbmcsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIil9LFM6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX0sQ2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sRGE6ZnVuY3Rpb24oTyxDKXtPPW5ldyBEYXRlKDFlMyooRFtPPj4+Ml0rNDI5NDk2NzI5NipOW08rND4+PjJdKSksTltDPj4yPj4+MF09Ty5nZXRVVENTZWNvbmRzKCksTltDKzQ+PjI+Pj4wXT1PLmdldFVUQ01pbnV0ZXMoKSxOW0MrOD4+Mj4+PjBdPU8uZ2V0VVRDSG91cnMoKSxOW0MrMTI+PjI+Pj4wXT1PLmdldFVUQ0RhdGUoKSxOW0MrMTY+PjI+Pj4wXT1PLmdldFVUQ01vbnRoKCksTltDKzIwPj4yPj4+MF09Ty5nZXRVVENGdWxsWWVhcigpLTE5MDAsTltDKzI0Pj4yPj4+MF09Ty5nZXRVVENEYXkoKSxOW0MrMjg+PjI+Pj4wXT0oTy5nZXRUaW1lKCktRGF0ZS5VVEMoTy5nZXRVVENGdWxsWWVhcigpLDAsMSwwLDAsMCwwKSkvODY0ZTV8MH0sRWE6ZnVuY3Rpb24oTyxDKXtPPW5ldyBEYXRlKDFlMyooRFtPPj4+Ml0rNDI5NDk2NzI5NipOW08rND4+PjJdKSksTltDPj4yPj4+MF09Ty5nZXRTZWNvbmRzKCksTltDKzQ+PjI+Pj4wXT1PLmdldE1pbnV0ZXMoKSxOW0MrOD4+Mj4+PjBdPU8uZ2V0SG91cnMoKSxOW0MrMTI+PjI+Pj4wXT1PLmdldERhdGUoKSxOW0MrMTY+PjI+Pj4wXT1PLmdldE1vbnRoKCksTltDKzIwPj4yPj4+MF09Ty5nZXRGdWxsWWVhcigpLTE5MDAsTltDKzI0Pj4yPj4+MF09Ty5nZXREYXkoKTt2YXIgUj1uZXcgRGF0ZShPLmdldEZ1bGxZZWFyKCksMCwxKTtOW0MrMjg+PjI+Pj4wXT0oTy5nZXRUaW1lKCktUi5nZXRUaW1lKCkpLzg2NGU1fDAsTltDKzM2Pj4yPj4+MF09LTYwKk8uZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgaj1uZXcgRGF0ZShPLmdldEZ1bGxZZWFyKCksNiwxKS5nZXRUaW1lem9uZU9mZnNldCgpO1I9Ui5nZXRUaW1lem9uZU9mZnNldCgpLE5bQyszMj4+Mj4+PjBdPTB8KGohPVImJk8uZ2V0VGltZXpvbmVPZmZzZXQoKT09TWF0aC5taW4oUixqKSl9LEZhOmZ1bmN0aW9uKE8pe3ZhciBDPW5ldyBEYXRlKE5bTysyMD4+Mj4+PjBdKzE5MDAsTltPKzE2Pj4yPj4+MF0sTltPKzEyPj4yPj4+MF0sTltPKzg+PjI+Pj4wXSxOW08rND4+Mj4+PjBdLE5bTz4+Mj4+PjBdLDApLFI9TltPKzMyPj4yPj4+MF0saj1DLmdldFRpbWV6b25lT2Zmc2V0KCksVT1uZXcgRGF0ZShDLmdldEZ1bGxZZWFyKCksMCwxKSxZPW5ldyBEYXRlKEMuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCksUT1VLmdldFRpbWV6b25lT2Zmc2V0KCksbmU9TWF0aC5taW4oUSxZKTtyZXR1cm4gMD5SP05bTyszMj4+Mj4+PjBdPSsoWSE9USYmbmU9PWopOjA8UiE9KG5lPT1qKSYmKFk9TWF0aC5tYXgoUSxZKSxDLnNldFRpbWUoQy5nZXRUaW1lKCkrNmU0KigoMDxSP25lOlkpLWopKSksTltPKzI0Pj4yPj4+MF09Qy5nZXREYXkoKSxOW08rMjg+PjI+Pj4wXT0oQy5nZXRUaW1lKCktVS5nZXRUaW1lKCkpLzg2NGU1fDAsTltPPj4yPj4+MF09Qy5nZXRTZWNvbmRzKCksTltPKzQ+PjI+Pj4wXT1DLmdldE1pbnV0ZXMoKSxOW08rOD4+Mj4+PjBdPUMuZ2V0SG91cnMoKSxOW08rMTI+PjI+Pj4wXT1DLmdldERhdGUoKSxOW08rMTY+PjI+Pj4wXT1DLmdldE1vbnRoKCksQy5nZXRUaW1lKCkvMWUzfDB9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuLTUyfSx0YTpmdW5jdGlvbigpe30sR2E6ZnVuY3Rpb24gTyhDLFIsail7Ty5WYnx8KE8uVmI9ITAsZnVuY3Rpb24oVSxZLFEpe2Z1bmN0aW9uIG5lKE5lKXtyZXR1cm4oTmU9TmUudG9UaW1lU3RyaW5nKCkubWF0Y2goL1woKFtBLVphLXogXSspXCkkLykpP05lWzFdOiJHTVQifXZhciB0ZT1uZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksY2U9bmV3IERhdGUodGUsMCwxKSxQZT1uZXcgRGF0ZSh0ZSw2LDEpO3RlPWNlLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyICRlPVBlLmdldFRpbWV6b25lT2Zmc2V0KCk7TltVPj4yPj4+MF09NjAqTWF0aC5tYXgodGUsJGUpLE5bWT4+Mj4+PjBdPSsodGUhPSRlKSxVPW5lKGNlKSxZPW5lKFBlKSxVPXB0KFUpLFk9cHQoWSksJGU8dGU/KERbUT4+Mj4+PjBdPVUsRFtRKzQ+PjI+Pj4wXT1ZKTooRFtRPj4yPj4+MF09WSxEW1ErND4+Mj4+PjBdPVUpfShDLFIsaikpfSxCOmZ1bmN0aW9uKCl7QWUoIiIpfSxtYTpmdW5jdGlvbigpe3JldHVybiA0Mjk0OTAxNzYwfSxJOlQ/KCk9Pnt2YXIgTz1wcm9jZXNzLmhydGltZSgpO3JldHVybiAxZTMqT1swXStPWzFdLzFlNn06KCk9PnBlcmZvcm1hbmNlLm5vdygpLHhhOmZ1bmN0aW9uKE8sQyxSKXtCLmNvcHlXaXRoaW4oTz4+PjAsQz4+PjAsQytSPj4+MCl9LEc6ZnVuY3Rpb24oTyl7dmFyIEM9Qi5sZW5ndGg7aWYoNDI5NDkwMTc2MDwoTz4+Pj0wKSlyZXR1cm4hMTtmb3IodmFyIFI9MTs0Pj1SO1IqPTIpe3ZhciBqPUMqKDErLjIvUik7aj1NYXRoLm1pbihqLE8rMTAwNjYzMjk2KTt2YXIgVT1NYXRoO2o9TWF0aC5tYXgoTyxqKSxVPVUubWluLmNhbGwoVSw0Mjk0OTAxNzYwLGorKDY1NTM2LWolNjU1MzYpJTY1NTM2KTtlOnt0cnl7TS5ncm93KFUtJC5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTYpLGxlKCk7dmFyIFk9MTticmVhayBlfWNhdGNoe31ZPXZvaWQgMH1pZihZKXJldHVybiEwfXJldHVybiExfSx2YTpmdW5jdGlvbihPLEMpe3ZhciBSPTA7cmV0dXJuIE90KCkuZm9yRWFjaChmdW5jdGlvbihqLFUpe3ZhciBZPUMrUjtmb3IoVT1EW08rNCpVPj4yPj4+MF09WSxZPTA7WTxqLmxlbmd0aDsrK1kpeltVKys+PjA+Pj4wXT1qLmNoYXJDb2RlQXQoWSk7eltVPj4wPj4+MF09MCxSKz1qLmxlbmd0aCsxfSksMH0sd2E6ZnVuY3Rpb24oTyxDKXt2YXIgUj1PdCgpO0RbTz4+Mj4+PjBdPVIubGVuZ3RoO3ZhciBqPTA7cmV0dXJuIFIuZm9yRWFjaChmdW5jdGlvbihVKXtqKz1VLmxlbmd0aCsxfSksRFtDPj4yPj4+MF09aiwwfSxiYTpmdW5jdGlvbihPKXt2fHwwPEllfHwoc3QoKSxZZShUZSksZnQoMCksY3RbMV0ubGVuZ3RoJiZkdCgxLDEwKSxjdFsyXS5sZW5ndGgmJmR0KDIsMTApKSx2fHwwPEllfHwoYS5vbkV4aXQmJmEub25FeGl0KE8pLEk9ITApLF8oTyxuZXcgamUoTykpfSxFOmZ1bmN0aW9uKCl7cmV0dXJuIDUyfSxROmZ1bmN0aW9uKCl7cmV0dXJuIDUyfSxjYTpmdW5jdGlvbigpe3JldHVybiA3MH0sUDpmdW5jdGlvbihPLEMsUixqKXtmb3IodmFyIFU9MCxZPTA7WTxSO1krKyl7dmFyIFE9RFtDPj4yPj4+MF0sbmU9RFtDKzQ+PjI+Pj4wXTtDKz04O2Zvcih2YXIgdGU9MDt0ZTxuZTt0ZSsrKWR0KE8sQltRK3RlPj4+MF0pO1UrPW5lfXJldHVybiBEW2o+PjI+Pj4wXT1VLDB9LGM6ZnVuY3Rpb24oKXtyZXR1cm4gUmV9LGphOmZ1bmN0aW9uIE8oQyxSKXtPLk1ifHwoTy5NYj1mdW5jdGlvbigpe2lmKHR5cGVvZiBjcnlwdG89PSJvYmplY3QiJiZ0eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIil7dmFyIFU9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuKCk9PihjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKFUpLFVbMF0pfWlmKFQpdHJ5e3ZhciBZPXIoT2JqZWN0KGZ1bmN0aW9uKCl7dmFyIFE9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJ2NyeXB0byciKTt0aHJvdyBRLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLFF9KCkpKTtyZXR1cm4oKT0+WS5yYW5kb21CeXRlcygxKVswXX1jYXRjaHt9cmV0dXJuKCk9PkFlKCJyYW5kb21EZXZpY2UiKX0oKSk7Zm9yKHZhciBqPTA7ajxSO2orKyl6W0Mraj4+MD4+PjBdPU8uTWIoKTtyZXR1cm4gMH0sZWE6ZnVuY3Rpb24oTyxDLFIpe3ZhciBqPXNlKCk7dHJ5e3JldHVybiBtZShPKShDLFIpfWNhdGNoKFUpe2lmKGFlKGopLFUhPT1VKzApdGhyb3cgVTt1ZSgxLDApfX0sZmE6ZnVuY3Rpb24oTyxDLFIpe3ZhciBqPXNlKCk7dHJ5e3JldHVybiBtZShPKShDLFIpfWNhdGNoKFUpe2lmKGFlKGopLFUhPT1VKzApdGhyb3cgVTt1ZSgxLDApfX0sSjpmdW5jdGlvbihPKXt2YXIgQz1zZSgpO3RyeXtyZXR1cm4gbWUoTykoKX1jYXRjaChSKXtpZihhZShDKSxSIT09UiswKXRocm93IFI7dWUoMSwwKX19LGU6ZnVuY3Rpb24oTyxDKXt2YXIgUj1zZSgpO3RyeXtyZXR1cm4gbWUoTykoQyl9Y2F0Y2goail7aWYoYWUoUiksaiE9PWorMCl0aHJvdyBqO3VlKDEsMCl9fSxOOmZ1bmN0aW9uKE8sQyxSKXt2YXIgaj1zZSgpO3RyeXtyZXR1cm4gbWUoTykoQyxSKX1jYXRjaChVKXtpZihhZShqKSxVIT09VSswKXRocm93IFU7dWUoMSwwKX19LE86ZnVuY3Rpb24oTyxDLFIpe3ZhciBqPXNlKCk7dHJ5e3JldHVybiBtZShPKShDLFIpfWNhdGNoKFUpe2lmKGFlKGopLFUhPT1VKzApdGhyb3cgVTt1ZSgxLDApfX0sajpmdW5jdGlvbihPLEMsUil7dmFyIGo9c2UoKTt0cnl7cmV0dXJuIG1lKE8pKEMsUil9Y2F0Y2goVSl7aWYoYWUoaiksVSE9PVUrMCl0aHJvdyBVO3VlKDEsMCl9fSxvOmZ1bmN0aW9uKE8sQyxSLGope3ZhciBVPXNlKCk7dHJ5e3JldHVybiBtZShPKShDLFIsail9Y2F0Y2goWSl7aWYoYWUoVSksWSE9PVkrMCl0aHJvdyBZO3VlKDEsMCl9fSxwOmZ1bmN0aW9uKE8sQyxSLGosVSl7dmFyIFk9c2UoKTt0cnl7cmV0dXJuIG1lKE8pKEMsUixqLFUpfWNhdGNoKFEpe2lmKGFlKFkpLFEhPT1RKzApdGhyb3cgUTt1ZSgxLDApfX0sTTpmdW5jdGlvbihPLEMsUixqLFUsWSl7dmFyIFE9c2UoKTt0cnl7cmV0dXJuIG1lKE8pKEMsUixqLFUsWSl9Y2F0Y2gobmUpe2lmKGFlKFEpLG5lIT09bmUrMCl0aHJvdyBuZTt1ZSgxLDApfX0scjpmdW5jdGlvbihPLEMsUixqLFUsWSl7dmFyIFE9c2UoKTt0cnl7cmV0dXJuIG1lKE8pKEMsUixqLFUsWSl9Y2F0Y2gobmUpe2lmKGFlKFEpLG5lIT09bmUrMCl0aHJvdyBuZTt1ZSgxLDApfX0sdjpmdW5jdGlvbihPLEMsUixqLFUsWSxRKXt2YXIgbmU9c2UoKTt0cnl7cmV0dXJuIG1lKE8pKEMsUixqLFUsWSxRKX1jYXRjaCh0ZSl7aWYoYWUobmUpLHRlIT09dGUrMCl0aHJvdyB0ZTt1ZSgxLDApfX0sSzpmdW5jdGlvbihPLEMsUixqLFUsWSxRLG5lKXt2YXIgdGU9c2UoKTt0cnl7cmV0dXJuIG1lKE8pKEMsUixqLFUsWSxRLG5lKX1jYXRjaChjZSl7aWYoYWUodGUpLGNlIT09Y2UrMCl0aHJvdyBjZTt1ZSgxLDApfX0sRDpmdW5jdGlvbihPLEMsUixqLFUsWSxRLG5lLHRlLGNlLFBlLCRlKXt2YXIgTmU9c2UoKTt0cnl7cmV0dXJuIG1lKE8pKEMsUixqLFUsWSxRLG5lLHRlLGNlLFBlLCRlKX1jYXRjaChXKXtpZihhZShOZSksVyE9PVcrMCl0aHJvdyBXO3VlKDEsMCl9fSxYOmZ1bmN0aW9uKE8sQyxSLGosVSxZLFEsbmUpe3ZhciB0ZT1zZSgpO3RyeXtyZXR1cm4gRXQoTyxDLFIsaixVLFksUSxuZSl9Y2F0Y2goY2Upe2lmKGFlKHRlKSxjZSE9PWNlKzApdGhyb3cgY2U7dWUoMSwwKX19LFY6ZnVuY3Rpb24oTyxDLFIsaixVLFksUSl7dmFyIG5lPXNlKCk7dHJ5e3JldHVybiBidChPLEMsUixqLFUsWSxRKX1jYXRjaCh0ZSl7aWYoYWUobmUpLHRlIT09dGUrMCl0aHJvdyB0ZTt1ZSgxLDApfX0sVTpmdW5jdGlvbihPLEMsUixqLFUpe3ZhciBZPXNlKCk7dHJ5e3JldHVybiBQdChPLEMsUixqLFUpfWNhdGNoKFEpe2lmKGFlKFkpLFEhPT1RKzApdGhyb3cgUTt1ZSgxLDApfX0sWjpmdW5jdGlvbihPLEMsUixqKXt2YXIgVT1zZSgpO3RyeXtyZXR1cm4geHQoTyxDLFIsail9Y2F0Y2goWSl7aWYoYWUoVSksWSE9PVkrMCl0aHJvdyBZO3VlKDEsMCl9fSxXOmZ1bmN0aW9uKE8pe3ZhciBDPXNlKCk7dHJ5e3JldHVybiBfdChPKX1jYXRjaChSKXtpZihhZShDKSxSIT09UiswKXRocm93IFI7dWUoMSwwKX19LFk6ZnVuY3Rpb24oTyxDKXt2YXIgUj1zZSgpO3RyeXtyZXR1cm4gU3QoTyxDKX1jYXRjaChqKXtpZihhZShSKSxqIT09aiswKXRocm93IGo7dWUoMSwwKX19LFQ6ZnVuY3Rpb24oTyxDLFIpe3ZhciBqPXNlKCk7dHJ5e3JldHVybiB5dChPLEMsUil9Y2F0Y2goVSl7aWYoYWUoaiksVSE9PVUrMCl0aHJvdyBVO3VlKDEsMCl9fSxmOmZ1bmN0aW9uKE8pe3ZhciBDPXNlKCk7dHJ5e21lKE8pKCl9Y2F0Y2goUil7aWYoYWUoQyksUiE9PVIrMCl0aHJvdyBSO3VlKDEsMCl9fSxxOmZ1bmN0aW9uKE8sQyl7dmFyIFI9c2UoKTt0cnl7bWUoTykoQyl9Y2F0Y2goail7aWYoYWUoUiksaiE9PWorMCl0aHJvdyBqO3VlKDEsMCl9fSxoOmZ1bmN0aW9uKE8sQyxSKXt2YXIgaj1zZSgpO3RyeXttZShPKShDLFIpfWNhdGNoKFUpe2lmKGFlKGopLFUhPT1VKzApdGhyb3cgVTt1ZSgxLDApfX0sZGE6ZnVuY3Rpb24oTyxDLFIsail7dmFyIFU9c2UoKTt0cnl7bWUoTykoQyxSLGopfWNhdGNoKFkpe2lmKGFlKFUpLFkhPT1ZKzApdGhyb3cgWTt1ZSgxLDApfX0sbDpmdW5jdGlvbihPLEMsUixqKXt2YXIgVT1zZSgpO3RyeXttZShPKShDLFIsail9Y2F0Y2goWSl7aWYoYWUoVSksWSE9PVkrMCl0aHJvdyBZO3VlKDEsMCl9fSx0OmZ1bmN0aW9uKE8sQyxSLGosVSl7dmFyIFk9c2UoKTt0cnl7bWUoTykoQyxSLGosVSl9Y2F0Y2goUSl7aWYoYWUoWSksUSE9PVErMCl0aHJvdyBRO3VlKDEsMCl9fSx1OmZ1bmN0aW9uKE8sQyxSLGosVSxZKXt2YXIgUT1zZSgpO3RyeXttZShPKShDLFIsaixVLFkpfWNhdGNoKG5lKXtpZihhZShRKSxuZSE9PW5lKzApdGhyb3cgbmU7dWUoMSwwKX19LHg6ZnVuY3Rpb24oTyxDLFIsaixVLFksUSl7dmFyIG5lPXNlKCk7dHJ5e21lKE8pKEMsUixqLFUsWSxRKX1jYXRjaCh0ZSl7aWYoYWUobmUpLHRlIT09dGUrMCl0aHJvdyB0ZTt1ZSgxLDApfX0sejpmdW5jdGlvbihPLEMsUixqLFUsWSxRLG5lKXt2YXIgdGU9c2UoKTt0cnl7bWUoTykoQyxSLGosVSxZLFEsbmUpfWNhdGNoKGNlKXtpZihhZSh0ZSksY2UhPT1jZSswKXRocm93IGNlO3VlKDEsMCl9fSxnYTpmdW5jdGlvbihPLEMsUixqLFUsWSxRLG5lLHRlKXt2YXIgY2U9c2UoKTt0cnl7bWUoTykoQyxSLGosVSxZLFEsbmUsdGUpfWNhdGNoKFBlKXtpZihhZShjZSksUGUhPT1QZSswKXRocm93IFBlO3VlKDEsMCl9fSxBOmZ1bmN0aW9uKE8sQyxSLGosVSxZLFEsbmUsdGUsY2UsUGUpe3ZhciAkZT1zZSgpO3RyeXttZShPKShDLFIsaixVLFksUSxuZSx0ZSxjZSxQZSl9Y2F0Y2goTmUpe2lmKGFlKCRlKSxOZSE9PU5lKzApdGhyb3cgTmU7dWUoMSwwKX19LEM6ZnVuY3Rpb24oTyxDLFIsaixVLFksUSxuZSx0ZSxjZSxQZSwkZSxOZSxXLF9lLE9lKXt2YXIgV2U9c2UoKTt0cnl7bWUoTykoQyxSLGosVSxZLFEsbmUsdGUsY2UsUGUsJGUsTmUsVyxfZSxPZSl9Y2F0Y2goZXQpe2lmKGFlKFdlKSxldCE9PWV0KzApdGhyb3cgZXQ7dWUoMSwwKX19LGFhOmZ1bmN0aW9uKE8sQyxSLGosVSxZLFEsbmUpe3ZhciB0ZT1zZSgpO3RyeXt3dChPLEMsUixqLFUsWSxRLG5lKX1jYXRjaChjZSl7aWYoYWUodGUpLGNlIT09Y2UrMCl0aHJvdyBjZTt1ZSgxLDApfX0sXzpmdW5jdGlvbihPLEMsUixqLFUsWSxRLG5lLHRlLGNlLFBlLCRlKXt2YXIgTmU9c2UoKTt0cnl7dnQoTyxDLFIsaixVLFksUSxuZSx0ZSxjZSxQZSwkZSl9Y2F0Y2goVyl7aWYoYWUoTmUpLFchPT1XKzApdGhyb3cgVzt1ZSgxLDApfX0sJDpmdW5jdGlvbihPLEMsUixqLFUsWSl7dmFyIFE9c2UoKTt0cnl7VHQoTyxDLFIsaixVLFkpfWNhdGNoKG5lKXtpZihhZShRKSxuZSE9PW5lKzApdGhyb3cgbmU7dWUoMSwwKX19LG46ZnVuY3Rpb24oTyl7cmV0dXJuIE99LEY6ZnVuY3Rpb24oTyl7UmU9T30saGE6TXQseTpmdW5jdGlvbihPLEMsUixqKXtyZXR1cm4gTXQoTyxDLFIsail9fTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBPKFUpe2EuYXNtPVUuZXhwb3J0cyxNPWEuYXNtLkthLGxlKCkseGU9YS5hc20uaWIsaWUudW5zaGlmdChhLmFzbS5MYSksa2UtLSxhLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmEubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhrZSksa2U9PTAmJkRlJiYoVT1EZSxEZT1udWxsLFUoKSl9ZnVuY3Rpb24gQyhVKXtPKFUuaW5zdGFuY2UpfWZ1bmN0aW9uIFIoVSl7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIXgmJihifHx5KSl7aWYodHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iJiYhRWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpKXJldHVybiBmZXRjaChFZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24oWSl7aWYoIVkub2spdGhyb3ciZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIitFZSsiJyI7cmV0dXJuIFkuYXJyYXlCdWZmZXIoKX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIHplKCl9KTtpZihsKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihZLFEpe2woRWUsZnVuY3Rpb24obmUpe1kobmV3IFVpbnQ4QXJyYXkobmUpKX0sUSl9KX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiB6ZSgpfSl9KCkudGhlbihmdW5jdGlvbihZKXtyZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoWSxqKX0pLnRoZW4oZnVuY3Rpb24oWSl7cmV0dXJuIFl9KS50aGVuKFUsZnVuY3Rpb24oWSl7UCgiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIitZKSxBZShZKX0pfXZhciBqPXthOkl0fTtpZihrZSsrLGEubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKGtlKSxhLmluc3RhbnRpYXRlV2FzbSl0cnl7cmV0dXJuIGEuaW5zdGFudGlhdGVXYXNtKGosTyl9Y2F0Y2goVSl7cmV0dXJuIFAoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIrVSksITF9KHh8fHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyE9ImZ1bmN0aW9uInx8U2UoKXx8RWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpfHxUfHx0eXBlb2YgZmV0Y2ghPSJmdW5jdGlvbiI/UihDKTpmZXRjaChFZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24oVSl7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKFUsaikudGhlbihDLGZ1bmN0aW9uKFkpe3JldHVybiBQKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIitZKSxQKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpLFIoQyl9KX0pKS5jYXRjaChmKX0pKCksYS5fX193YXNtX2NhbGxfY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm4oYS5fX193YXNtX2NhbGxfY3RvcnM9YS5hc20uTGEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYS5fT3J0SW5pdD1mdW5jdGlvbigpe3JldHVybihhLl9PcnRJbml0PWEuYXNtLk1hKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGEuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuKGEuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPWEuYXNtLk5hKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGEuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuKGEuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPWEuYXNtLk9hKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGEuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT1mdW5jdGlvbigpe3JldHVybihhLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9YS5hc20uUGEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYS5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuKGEuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1hLmFzbS5RYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxhLl9PcnRDcmVhdGVTZXNzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuKGEuX09ydENyZWF0ZVNlc3Npb249YS5hc20uUmEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYS5fT3J0UmVsZWFzZVNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4oYS5fT3J0UmVsZWFzZVNlc3Npb249YS5hc20uU2EpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYS5fT3J0R2V0SW5wdXRDb3VudD1mdW5jdGlvbigpe3JldHVybihhLl9PcnRHZXRJbnB1dENvdW50PWEuYXNtLlRhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGEuX09ydEdldE91dHB1dENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuKGEuX09ydEdldE91dHB1dENvdW50PWEuYXNtLlVhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGEuX09ydEdldElucHV0TmFtZT1mdW5jdGlvbigpe3JldHVybihhLl9PcnRHZXRJbnB1dE5hbWU9YS5hc20uVmEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYS5fT3J0R2V0T3V0cHV0TmFtZT1mdW5jdGlvbigpe3JldHVybihhLl9PcnRHZXRPdXRwdXROYW1lPWEuYXNtLldhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGEuX09ydEZyZWU9ZnVuY3Rpb24oKXtyZXR1cm4oYS5fT3J0RnJlZT1hLmFzbS5YYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxhLl9PcnRDcmVhdGVUZW5zb3I9ZnVuY3Rpb24oKXtyZXR1cm4oYS5fT3J0Q3JlYXRlVGVuc29yPWEuYXNtLllhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGEuX09ydEdldFRlbnNvckRhdGE9ZnVuY3Rpb24oKXtyZXR1cm4oYS5fT3J0R2V0VGVuc29yRGF0YT1hLmFzbS5aYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxhLl9PcnRSZWxlYXNlVGVuc29yPWZ1bmN0aW9uKCl7cmV0dXJuKGEuX09ydFJlbGVhc2VUZW5zb3I9YS5hc20uX2EpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYS5fT3J0Q3JlYXRlUnVuT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybihhLl9PcnRDcmVhdGVSdW5PcHRpb25zPWEuYXNtLiRhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGEuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PWZ1bmN0aW9uKCl7cmV0dXJuKGEuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PWEuYXNtLmFiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGEuX09ydFJlbGVhc2VSdW5PcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuKGEuX09ydFJlbGVhc2VSdW5PcHRpb25zPWEuYXNtLmJiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGEuX09ydFJ1bj1mdW5jdGlvbigpe3JldHVybihhLl9PcnRSdW49YS5hc20uY2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYS5fT3J0RW5kUHJvZmlsaW5nPWZ1bmN0aW9uKCl7cmV0dXJuKGEuX09ydEVuZFByb2ZpbGluZz1hLmFzbS5kYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgSmUsdmU9YS5fbWFsbG9jPWZ1bmN0aW9uKCl7cmV0dXJuKHZlPWEuX21hbGxvYz1hLmFzbS5lYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxvdD1hLl9mcmVlPWZ1bmN0aW9uKCl7cmV0dXJuKG90PWEuX2ZyZWU9YS5hc20uZmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZnQ9YS5fZmZsdXNoPWZ1bmN0aW9uKCl7cmV0dXJuKGZ0PWEuX2ZmbHVzaD1hLmFzbS5nYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxzdD1hLl9fX2Z1bmNzX29uX2V4aXQ9ZnVuY3Rpb24oKXtyZXR1cm4oc3Q9YS5fX19mdW5jc19vbl9leGl0PWEuYXNtLmhiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHVlPWEuX3NldFRocmV3PWZ1bmN0aW9uKCl7cmV0dXJuKHVlPWEuX3NldFRocmV3PWEuYXNtLmpiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHNlPWEuc3RhY2tTYXZlPWZ1bmN0aW9uKCl7cmV0dXJuKHNlPWEuc3RhY2tTYXZlPWEuYXNtLmtiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGFlPWEuc3RhY2tSZXN0b3JlPWZ1bmN0aW9uKCl7cmV0dXJuKGFlPWEuc3RhY2tSZXN0b3JlPWEuYXNtLmxiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LG10PWEuc3RhY2tBbGxvYz1mdW5jdGlvbigpe3JldHVybihtdD1hLnN0YWNrQWxsb2M9YS5hc20ubWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYXQ9YS5fX19jeGFfY2FuX2NhdGNoPWZ1bmN0aW9uKCl7cmV0dXJuKGF0PWEuX19fY3hhX2Nhbl9jYXRjaD1hLmFzbS5uYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxndD1hLl9fX2N4YV9pc19wb2ludGVyX3R5cGU9ZnVuY3Rpb24oKXtyZXR1cm4oZ3Q9YS5fX19jeGFfaXNfcG9pbnRlcl90eXBlPWEuYXNtLm9iKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LF90PWEuZHluQ2FsbF9qPWZ1bmN0aW9uKCl7cmV0dXJuKF90PWEuZHluQ2FsbF9qPWEuYXNtLnBiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGJ0PWEuZHluQ2FsbF9paWlpaWo9ZnVuY3Rpb24oKXtyZXR1cm4oYnQ9YS5keW5DYWxsX2lpaWlpaj1hLmFzbS5xYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx5dD1hLmR5bkNhbGxfamlpPWZ1bmN0aW9uKCl7cmV0dXJuKHl0PWEuZHluQ2FsbF9qaWk9YS5hc20ucmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sd3Q9YS5keW5DYWxsX3ZpaWlpaWo9ZnVuY3Rpb24oKXtyZXR1cm4od3Q9YS5keW5DYWxsX3ZpaWlpaWo9YS5hc20uc2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sVHQ9YS5keW5DYWxsX3Zqamk9ZnVuY3Rpb24oKXtyZXR1cm4oVHQ9YS5keW5DYWxsX3Zqamk9YS5hc20udGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdnQ9YS5keW5DYWxsX3ZpaWlqamppaT1mdW5jdGlvbigpe3JldHVybih2dD1hLmR5bkNhbGxfdmlpaWpqamlpPWEuYXNtLnViKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHh0PWEuZHluQ2FsbF9paWo9ZnVuY3Rpb24oKXtyZXR1cm4oeHQ9YS5keW5DYWxsX2lpaj1hLmFzbS52YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxTdD1hLmR5bkNhbGxfamk9ZnVuY3Rpb24oKXtyZXR1cm4oU3Q9YS5keW5DYWxsX2ppPWEuYXNtLndiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEV0PWEuZHluQ2FsbF9paWlpaWlqPWZ1bmN0aW9uKCl7cmV0dXJuKEV0PWEuZHluQ2FsbF9paWlpaWlqPWEuYXNtLnhiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFB0PWEuZHluQ2FsbF9paWlqPWZ1bmN0aW9uKCl7cmV0dXJuKFB0PWEuZHluQ2FsbF9paWlqPWEuYXNtLnliKS5hcHBseShudWxsLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIEF0KCl7ZnVuY3Rpb24gTygpe2lmKCFKZSYmKEplPSEwLGEuY2FsbGVkUnVuPSEwLCFJKSl7aWYoWWUoaWUpLHAoYSksYS5vblJ1bnRpbWVJbml0aWFsaXplZCYmYS5vblJ1bnRpbWVJbml0aWFsaXplZCgpLGEucG9zdFJ1bilmb3IodHlwZW9mIGEucG9zdFJ1bj09ImZ1bmN0aW9uIiYmKGEucG9zdFJ1bj1bYS5wb3N0UnVuXSk7YS5wb3N0UnVuLmxlbmd0aDspe3ZhciBDPWEucG9zdFJ1bi5zaGlmdCgpO2JlLnVuc2hpZnQoQyl9WWUoYmUpfX1pZighKDA8a2UpKXtpZihhLnByZVJ1bilmb3IodHlwZW9mIGEucHJlUnVuPT0iZnVuY3Rpb24iJiYoYS5wcmVSdW49W2EucHJlUnVuXSk7YS5wcmVSdW4ubGVuZ3RoOylMZSgpO1llKHdlKSwwPGtlfHwoYS5zZXRTdGF0dXM/KGEuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXthLnNldFN0YXR1cygiIil9LDEpLE8oKX0sMSkpOk8oKSl9fWlmKGEuVVRGOFRvU3RyaW5nPUcsYS5zdHJpbmdUb1VURjg9ZnVuY3Rpb24oTyxDLFIpe3JldHVybiBlZShPLEIsQyxSKX0sYS5sZW5ndGhCeXRlc1VURjg9SixhLnN0YWNrU2F2ZT1zZSxhLnN0YWNrUmVzdG9yZT1hZSxhLnN0YWNrQWxsb2M9bXQsRGU9ZnVuY3Rpb24gTygpe0plfHxBdCgpLEplfHwoRGU9Tyl9LGEucHJlSW5pdClmb3IodHlwZW9mIGEucHJlSW5pdD09ImZ1bmN0aW9uIiYmKGEucHJlSW5pdD1bYS5wcmVJbml0XSk7MDxhLnByZUluaXQubGVuZ3RoOylhLnByZUluaXQucG9wKCkoKTtyZXR1cm4gQXQoKSxoLnJlYWR5fSk7Yy5leHBvcnRzPXV9LDQ1Mzc6Yz0+e2MuZXhwb3J0cz1mdW5jdGlvbih0LHIpe2Zvcih2YXIgbz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSx1PTAsaD0yLGE9ITA7aDxhcmd1bWVudHMubGVuZ3RoOylvW3UrK109YXJndW1lbnRzW2grK107cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHAsZil7b1t1XT1mdW5jdGlvbihkKXtpZihhKWlmKGE9ITEsZClmKGQpO2Vsc2V7Zm9yKHZhciBsPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLG49MDtuPGwubGVuZ3RoOylsW24rK109YXJndW1lbnRzW25dO3AuYXBwbHkobnVsbCxsKX19O3RyeXt0LmFwcGx5KHJ8fG51bGwsbyl9Y2F0Y2goZCl7YSYmKGE9ITEsZihkKSl9fSl9fSw3NDE5OihjLHQpPT57dmFyIHI9dDtyLmxlbmd0aD1mdW5jdGlvbihwKXt2YXIgZj1wLmxlbmd0aDtpZighZilyZXR1cm4gMDtmb3IodmFyIGQ9MDstLWYlND4xJiZwLmNoYXJBdChmKT09PSI9IjspKytkO3JldHVybiBNYXRoLmNlaWwoMypwLmxlbmd0aCkvNC1kfTtmb3IodmFyIG89bmV3IEFycmF5KDY0KSx1PW5ldyBBcnJheSgxMjMpLGg9MDtoPDY0Oyl1W29baF09aDwyNj9oKzY1Omg8NTI/aCs3MTpoPDYyP2gtNDpoLTU5fDQzXT1oKys7ci5lbmNvZGU9ZnVuY3Rpb24ocCxmLGQpe2Zvcih2YXIgbCxuPW51bGwsZT1bXSxpPTAscz0wO2Y8ZDspe3ZhciBtPXBbZisrXTtzd2l0Y2gocyl7Y2FzZSAwOmVbaSsrXT1vW20+PjJdLGw9KDMmbSk8PDQscz0xO2JyZWFrO2Nhc2UgMTplW2krK109b1tsfG0+PjRdLGw9KDE1Jm0pPDwyLHM9MjticmVhaztjYXNlIDI6ZVtpKytdPW9bbHxtPj42XSxlW2krK109b1s2MyZtXSxzPTB9aT44MTkxJiYoKG58fChuPVtdKSkucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKSksaT0wKX1yZXR1cm4gcyYmKGVbaSsrXT1vW2xdLGVbaSsrXT02MSxzPT09MSYmKGVbaSsrXT02MSkpLG4/KGkmJm4ucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlLnNsaWNlKDAsaSkpKSxuLmpvaW4oIiIpKTpTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlLnNsaWNlKDAsaSkpfTt2YXIgYT0iaW52YWxpZCBlbmNvZGluZyI7ci5kZWNvZGU9ZnVuY3Rpb24ocCxmLGQpe2Zvcih2YXIgbCxuPWQsZT0wLGk9MDtpPHAubGVuZ3RoOyl7dmFyIHM9cC5jaGFyQ29kZUF0KGkrKyk7aWYocz09PTYxJiZlPjEpYnJlYWs7aWYoKHM9dVtzXSk9PT12b2lkIDApdGhyb3cgRXJyb3IoYSk7c3dpdGNoKGUpe2Nhc2UgMDpsPXMsZT0xO2JyZWFrO2Nhc2UgMTpmW2QrK109bDw8MnwoNDgmcyk+PjQsbD1zLGU9MjticmVhaztjYXNlIDI6ZltkKytdPSgxNSZsKTw8NHwoNjAmcyk+PjIsbD1zLGU9MzticmVhaztjYXNlIDM6ZltkKytdPSgzJmwpPDw2fHMsZT0wfX1pZihlPT09MSl0aHJvdyBFcnJvcihhKTtyZXR1cm4gZC1ufSxyLnRlc3Q9ZnVuY3Rpb24ocCl7cmV0dXJuL14oPzpbQS1aYS16MC05Ky9dezR9KSooPzpbQS1aYS16MC05Ky9dezJ9PT18W0EtWmEtejAtOSsvXXszfT0pPyQvLnRlc3QocCl9fSw5MjExOmM9PntmdW5jdGlvbiB0KCl7dGhpcy5fbGlzdGVuZXJzPXt9fWMuZXhwb3J0cz10LHQucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHIsbyx1KXtyZXR1cm4odGhpcy5fbGlzdGVuZXJzW3JdfHwodGhpcy5fbGlzdGVuZXJzW3JdPVtdKSkucHVzaCh7Zm46byxjdHg6dXx8dGhpc30pLHRoaXN9LHQucHJvdG90eXBlLm9mZj1mdW5jdGlvbihyLG8pe2lmKHI9PT12b2lkIDApdGhpcy5fbGlzdGVuZXJzPXt9O2Vsc2UgaWYobz09PXZvaWQgMCl0aGlzLl9saXN0ZW5lcnNbcl09W107ZWxzZSBmb3IodmFyIHU9dGhpcy5fbGlzdGVuZXJzW3JdLGg9MDtoPHUubGVuZ3RoOyl1W2hdLmZuPT09bz91LnNwbGljZShoLDEpOisraDtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihyKXt2YXIgbz10aGlzLl9saXN0ZW5lcnNbcl07aWYobyl7Zm9yKHZhciB1PVtdLGg9MTtoPGFyZ3VtZW50cy5sZW5ndGg7KXUucHVzaChhcmd1bWVudHNbaCsrXSk7Zm9yKGg9MDtoPG8ubGVuZ3RoOylvW2hdLmZuLmFwcGx5KG9baCsrXS5jdHgsdSl9cmV0dXJuIHRoaXN9fSw5NDU6Yz0+e2Z1bmN0aW9uIHQoYSl7cmV0dXJuIHR5cGVvZiBGbG9hdDMyQXJyYXk8InUiP2Z1bmN0aW9uKCl7dmFyIHA9bmV3IEZsb2F0MzJBcnJheShbLTBdKSxmPW5ldyBVaW50OEFycmF5KHAuYnVmZmVyKSxkPWZbM109PT0xMjg7ZnVuY3Rpb24gbChzLG0sZyl7cFswXT1zLG1bZ109ZlswXSxtW2crMV09ZlsxXSxtW2crMl09ZlsyXSxtW2crM109ZlszXX1mdW5jdGlvbiBuKHMsbSxnKXtwWzBdPXMsbVtnXT1mWzNdLG1bZysxXT1mWzJdLG1bZysyXT1mWzFdLG1bZyszXT1mWzBdfWZ1bmN0aW9uIGUocyxtKXtyZXR1cm4gZlswXT1zW21dLGZbMV09c1ttKzFdLGZbMl09c1ttKzJdLGZbM109c1ttKzNdLHBbMF19ZnVuY3Rpb24gaShzLG0pe3JldHVybiBmWzNdPXNbbV0sZlsyXT1zW20rMV0sZlsxXT1zW20rMl0sZlswXT1zW20rM10scFswXX1hLndyaXRlRmxvYXRMRT1kP2w6bixhLndyaXRlRmxvYXRCRT1kP246bCxhLnJlYWRGbG9hdExFPWQ/ZTppLGEucmVhZEZsb2F0QkU9ZD9pOmV9KCk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBwKGQsbCxuLGUpe3ZhciBpPWw8MD8xOjA7aWYoaSYmKGw9LWwpLGw9PT0wKWQoMS9sPjA/MDoyMTQ3NDgzNjQ4LG4sZSk7ZWxzZSBpZihpc05hTihsKSlkKDIxNDMyODkzNDQsbixlKTtlbHNlIGlmKGw+MzQwMjgyMzQ2NjM4NTI4ODZlMjIpZCgoaTw8MzF8MjEzOTA5NTA0MCk+Pj4wLG4sZSk7ZWxzZSBpZihsPDExNzU0OTQzNTA4MjIyODc1ZS01NClkKChpPDwzMXxNYXRoLnJvdW5kKGwvMTQwMTI5ODQ2NDMyNDgxN2UtNjApKT4+PjAsbixlKTtlbHNle3ZhciBzPU1hdGguZmxvb3IoTWF0aC5sb2cobCkvTWF0aC5MTjIpO2QoKGk8PDMxfHMrMTI3PDwyM3w4Mzg4NjA3Jk1hdGgucm91bmQobCpNYXRoLnBvdygyLC1zKSo4Mzg4NjA4KSk+Pj4wLG4sZSl9fWZ1bmN0aW9uIGYoZCxsLG4pe3ZhciBlPWQobCxuKSxpPTIqKGU+PjMxKSsxLHM9ZT4+PjIzJjI1NSxtPTgzODg2MDcmZTtyZXR1cm4gcz09PTI1NT9tP05hTjppKigxLzApOnM9PT0wPzE0MDEyOTg0NjQzMjQ4MTdlLTYwKmkqbTppKk1hdGgucG93KDIscy0xNTApKihtKzgzODg2MDgpfWEud3JpdGVGbG9hdExFPXAuYmluZChudWxsLHIpLGEud3JpdGVGbG9hdEJFPXAuYmluZChudWxsLG8pLGEucmVhZEZsb2F0TEU9Zi5iaW5kKG51bGwsdSksYS5yZWFkRmxvYXRCRT1mLmJpbmQobnVsbCxoKX0oKSx0eXBlb2YgRmxvYXQ2NEFycmF5PCJ1Ij9mdW5jdGlvbigpe3ZhciBwPW5ldyBGbG9hdDY0QXJyYXkoWy0wXSksZj1uZXcgVWludDhBcnJheShwLmJ1ZmZlciksZD1mWzddPT09MTI4O2Z1bmN0aW9uIGwocyxtLGcpe3BbMF09cyxtW2ddPWZbMF0sbVtnKzFdPWZbMV0sbVtnKzJdPWZbMl0sbVtnKzNdPWZbM10sbVtnKzRdPWZbNF0sbVtnKzVdPWZbNV0sbVtnKzZdPWZbNl0sbVtnKzddPWZbN119ZnVuY3Rpb24gbihzLG0sZyl7cFswXT1zLG1bZ109Zls3XSxtW2crMV09Zls2XSxtW2crMl09Zls1XSxtW2crM109Zls0XSxtW2crNF09ZlszXSxtW2crNV09ZlsyXSxtW2crNl09ZlsxXSxtW2crN109ZlswXX1mdW5jdGlvbiBlKHMsbSl7cmV0dXJuIGZbMF09c1ttXSxmWzFdPXNbbSsxXSxmWzJdPXNbbSsyXSxmWzNdPXNbbSszXSxmWzRdPXNbbSs0XSxmWzVdPXNbbSs1XSxmWzZdPXNbbSs2XSxmWzddPXNbbSs3XSxwWzBdfWZ1bmN0aW9uIGkocyxtKXtyZXR1cm4gZls3XT1zW21dLGZbNl09c1ttKzFdLGZbNV09c1ttKzJdLGZbNF09c1ttKzNdLGZbM109c1ttKzRdLGZbMl09c1ttKzVdLGZbMV09c1ttKzZdLGZbMF09c1ttKzddLHBbMF19YS53cml0ZURvdWJsZUxFPWQ/bDpuLGEud3JpdGVEb3VibGVCRT1kP246bCxhLnJlYWREb3VibGVMRT1kP2U6aSxhLnJlYWREb3VibGVCRT1kP2k6ZX0oKTpmdW5jdGlvbigpe2Z1bmN0aW9uIHAoZCxsLG4sZSxpLHMpe3ZhciBtPWU8MD8xOjA7aWYobSYmKGU9LWUpLGU9PT0wKWQoMCxpLHMrbCksZCgxL2U+MD8wOjIxNDc0ODM2NDgsaSxzK24pO2Vsc2UgaWYoaXNOYU4oZSkpZCgwLGkscytsKSxkKDIxNDY5NTkzNjAsaSxzK24pO2Vsc2UgaWYoZT4xNzk3NjkzMTM0ODYyMzE1N2UyOTIpZCgwLGkscytsKSxkKChtPDwzMXwyMTQ2NDM1MDcyKT4+PjAsaSxzK24pO2Vsc2V7dmFyIGc7aWYoZTwyMjI1MDczODU4NTA3MjAxNGUtMzI0KWQoKGc9ZS81ZS0zMjQpPj4+MCxpLHMrbCksZCgobTw8MzF8Zy80Mjk0OTY3Mjk2KT4+PjAsaSxzK24pO2Vsc2V7dmFyIF89TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMik7Xz09PTEwMjQmJihfPTEwMjMpLGQoNDUwMzU5OTYyNzM3MDQ5NiooZz1lKk1hdGgucG93KDIsLV8pKT4+PjAsaSxzK2wpLGQoKG08PDMxfF8rMTAyMzw8MjB8MTA0ODU3NipnJjEwNDg1NzUpPj4+MCxpLHMrbil9fX1mdW5jdGlvbiBmKGQsbCxuLGUsaSl7dmFyIHM9ZChlLGkrbCksbT1kKGUsaStuKSxnPTIqKG0+PjMxKSsxLF89bT4+PjIwJjIwNDcsYj00Mjk0OTY3Mjk2KigxMDQ4NTc1Jm0pK3M7cmV0dXJuIF89PT0yMDQ3P2I/TmFOOmcqKDEvMCk6Xz09PTA/NWUtMzI0KmcqYjpnKk1hdGgucG93KDIsXy0xMDc1KSooYis0NTAzNTk5NjI3MzcwNDk2KX1hLndyaXRlRG91YmxlTEU9cC5iaW5kKG51bGwsciwwLDQpLGEud3JpdGVEb3VibGVCRT1wLmJpbmQobnVsbCxvLDQsMCksYS5yZWFkRG91YmxlTEU9Zi5iaW5kKG51bGwsdSwwLDQpLGEucmVhZERvdWJsZUJFPWYuYmluZChudWxsLGgsNCwwKX0oKSxhfWZ1bmN0aW9uIHIoYSxwLGYpe3BbZl09MjU1JmEscFtmKzFdPWE+Pj44JjI1NSxwW2YrMl09YT4+PjE2JjI1NSxwW2YrM109YT4+PjI0fWZ1bmN0aW9uIG8oYSxwLGYpe3BbZl09YT4+PjI0LHBbZisxXT1hPj4+MTYmMjU1LHBbZisyXT1hPj4+OCYyNTUscFtmKzNdPTI1NSZhfWZ1bmN0aW9uIHUoYSxwKXtyZXR1cm4oYVtwXXxhW3ArMV08PDh8YVtwKzJdPDwxNnxhW3ArM108PDI0KT4+PjB9ZnVuY3Rpb24gaChhLHApe3JldHVybihhW3BdPDwyNHxhW3ArMV08PDE2fGFbcCsyXTw8OHxhW3ArM10pPj4+MH1jLmV4cG9ydHM9dCh0KX0sNzE5OTptb2R1bGU9PntmdW5jdGlvbiBpbnF1aXJlKG1vZHVsZU5hbWUpe3RyeXt2YXIgbW9kPWV2YWwoInF1aXJlIi5yZXBsYWNlKC9eLywicmUiKSkobW9kdWxlTmFtZSk7aWYobW9kJiYobW9kLmxlbmd0aHx8T2JqZWN0LmtleXMobW9kKS5sZW5ndGgpKXJldHVybiBtb2R9Y2F0Y2goYyl7fXJldHVybiBudWxsfW1vZHVsZS5leHBvcnRzPWlucXVpcmV9LDY2NjI6Yz0+e2MuZXhwb3J0cz1mdW5jdGlvbih0LHIsbyl7dmFyIHU9b3x8ODE5MixoPXU+Pj4xLGE9bnVsbCxwPXU7cmV0dXJuIGZ1bmN0aW9uKGYpe2lmKGY8MXx8Zj5oKXJldHVybiB0KGYpO3ArZj51JiYoYT10KHUpLHA9MCk7dmFyIGQ9ci5jYWxsKGEscCxwKz1mKTtyZXR1cm4gNyZwJiYocD0xKyg3fHApKSxkfX19LDQ5OTc6KGMsdCk9Pnt2YXIgcj10O3IubGVuZ3RoPWZ1bmN0aW9uKG8pe2Zvcih2YXIgdT0wLGg9MCxhPTA7YTxvLmxlbmd0aDsrK2EpKGg9by5jaGFyQ29kZUF0KGEpKTwxMjg/dSs9MTpoPDIwNDg/dSs9MjooNjQ1MTImaCk9PTU1Mjk2JiYoNjQ1MTImby5jaGFyQ29kZUF0KGErMSkpPT01NjMyMD8oKythLHUrPTQpOnUrPTM7cmV0dXJuIHV9LHIucmVhZD1mdW5jdGlvbihvLHUsaCl7aWYoaC11PDEpcmV0dXJuIiI7Zm9yKHZhciBhLHA9bnVsbCxmPVtdLGQ9MDt1PGg7KShhPW9bdSsrXSk8MTI4P2ZbZCsrXT1hOmE+MTkxJiZhPDIyND9mW2QrK109KDMxJmEpPDw2fDYzJm9bdSsrXTphPjIzOSYmYTwzNjU/KGE9KCg3JmEpPDwxOHwoNjMmb1t1KytdKTw8MTJ8KDYzJm9bdSsrXSk8PDZ8NjMmb1t1KytdKS02NTUzNixmW2QrK109NTUyOTYrKGE+PjEwKSxmW2QrK109NTYzMjArKDEwMjMmYSkpOmZbZCsrXT0oMTUmYSk8PDEyfCg2MyZvW3UrK10pPDw2fDYzJm9bdSsrXSxkPjgxOTEmJigocHx8KHA9W10pKS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGYpKSxkPTApO3JldHVybiBwPyhkJiZwLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZi5zbGljZSgwLGQpKSkscC5qb2luKCIiKSk6U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZi5zbGljZSgwLGQpKX0sci53cml0ZT1mdW5jdGlvbihvLHUsaCl7Zm9yKHZhciBhLHAsZj1oLGQ9MDtkPG8ubGVuZ3RoOysrZCkoYT1vLmNoYXJDb2RlQXQoZCkpPDEyOD91W2grK109YTphPDIwNDg/KHVbaCsrXT1hPj42fDE5Mix1W2grK109NjMmYXwxMjgpOig2NDUxMiZhKT09NTUyOTYmJig2NDUxMiYocD1vLmNoYXJDb2RlQXQoZCsxKSkpPT01NjMyMD8oYT02NTUzNisoKDEwMjMmYSk8PDEwKSsoMTAyMyZwKSwrK2QsdVtoKytdPWE+PjE4fDI0MCx1W2grK109YT4+MTImNjN8MTI4LHVbaCsrXT1hPj42JjYzfDEyOCx1W2grK109NjMmYXwxMjgpOih1W2grK109YT4+MTJ8MjI0LHVbaCsrXT1hPj42JjYzfDEyOCx1W2grK109NjMmYXwxMjgpO3JldHVybiBoLWZ9fSwzNDQyOihjLHQpPT57dC5fX2VzTW9kdWxlPSEwO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh1KXtpZighdSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGFyZ3VtZW50OyBgdmFsdWVgIGhhcyBubyB2YWx1ZS4iKTt0aGlzLnZhbHVlPW8uRU1QVFksdSYmby5pc0d1aWQodSkmJih0aGlzLnZhbHVlPXUpfXJldHVybiBvLmlzR3VpZD1mdW5jdGlvbih1KXt2YXIgaD11LnRvU3RyaW5nKCk7cmV0dXJuIHUmJih1IGluc3RhbmNlb2Ygb3x8by52YWxpZGF0b3IudGVzdChoKSl9LG8uY3JlYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKFtvLmdlbigyKSxvLmdlbigxKSxvLmdlbigxKSxvLmdlbigxKSxvLmdlbigzKV0uam9pbigiLSIpKX0sby5jcmVhdGVFbXB0eT1mdW5jdGlvbigpe3JldHVybiBuZXcgbygiZW1wdHlndWlkIil9LG8ucGFyc2U9ZnVuY3Rpb24odSl7cmV0dXJuIG5ldyBvKHUpfSxvLnJhdz1mdW5jdGlvbigpe3JldHVybltvLmdlbigyKSxvLmdlbigxKSxvLmdlbigxKSxvLmdlbigxKSxvLmdlbigzKV0uam9pbigiLSIpfSxvLmdlbj1mdW5jdGlvbih1KXtmb3IodmFyIGg9IiIsYT0wO2E8dTthKyspaCs9KDY1NTM2KigxK01hdGgucmFuZG9tKCkpfDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSk7cmV0dXJuIGh9LG8ucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih1KXtyZXR1cm4gby5pc0d1aWQodSkmJnRoaXMudmFsdWU9PT11LnRvU3RyaW5nKCl9LG8ucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZT09PW8uRU1QVFl9LG8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9LG8ucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt2YWx1ZTp0aGlzLnZhbHVlfX0sby52YWxpZGF0b3I9bmV3IFJlZ0V4cCgiXlthLXowLTldezh9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezEyfSQiLCJpIiksby5FTVBUWT0iMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIixvfSgpO3QuR3VpZD1yfSwzNzIwOmM9PntjLmV4cG9ydHM9cjt2YXIgdD1udWxsO3RyeXt0PW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDEzLDIsOTYsMCwxLDEyNyw5Niw0LDEyNywxMjcsMTI3LDEyNywxLDEyNywzLDcsNiwwLDEsMSwxLDEsMSw2LDYsMSwxMjcsMSw2NSwwLDExLDcsNTAsNiwzLDEwOSwxMTcsMTA4LDAsMSw1LDEwMCwxMDUsMTE4LDk1LDExNSwwLDIsNSwxMDAsMTA1LDExOCw5NSwxMTcsMCwzLDUsMTE0LDEwMSwxMDksOTUsMTE1LDAsNCw1LDExNCwxMDEsMTA5LDk1LDExNywwLDUsOCwxMDMsMTAxLDExNiw5NSwxMDQsMTA1LDEwMywxMDQsMCwwLDEwLDE5MSwxLDYsNCwwLDM1LDAsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI2LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNywzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjgsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI5LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEzMCwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMV0pKSx7fSkuZXhwb3J0c31jYXRjaHt9ZnVuY3Rpb24gcih2LE0sJCl7dGhpcy5sb3c9MHx2LHRoaXMuaGlnaD0wfE0sdGhpcy51bnNpZ25lZD0hISR9ZnVuY3Rpb24gbyh2KXtyZXR1cm4odiYmdi5fX2lzTG9uZ19fKT09PSEwfXIucHJvdG90eXBlLl9faXNMb25nX18sT2JqZWN0LmRlZmluZVByb3BlcnR5KHIucHJvdG90eXBlLCJfX2lzTG9uZ19fIix7dmFsdWU6ITB9KSxyLmlzTG9uZz1vO3ZhciB1PXt9LGg9e307ZnVuY3Rpb24gYSh2LE0pe3ZhciAkLHosQjtyZXR1cm4gTT8oQj0wPD0odj4+Pj0wKSYmdjwyNTYpJiYoej1oW3ZdKT96OigkPWYodiwoMHx2KTwwPy0xOjAsITApLEImJihoW3ZdPSQpLCQpOihCPS0xMjg8PSh2fD0wKSYmdjwxMjgpJiYoej11W3ZdKT96OigkPWYodix2PDA/LTE6MCwhMSksQiYmKHVbdl09JCksJCl9ZnVuY3Rpb24gcCh2LE0pe2lmKGlzTmFOKHYpKXJldHVybiBNP186ZztpZihNKXtpZih2PDApcmV0dXJuIF87aWYodj49aSlyZXR1cm4geH1lbHNle2lmKHY8PS1zKXJldHVybiBFO2lmKHYrMT49cylyZXR1cm4gd31yZXR1cm4gdjwwP3AoLXYsTSkubmVnKCk6Zih2JWV8MCx2L2V8MCxNKX1mdW5jdGlvbiBmKHYsTSwkKXtyZXR1cm4gbmV3IHIodixNLCQpfXIuZnJvbUludD1hLHIuZnJvbU51bWJlcj1wLHIuZnJvbUJpdHM9Zjt2YXIgZD1NYXRoLnBvdztmdW5jdGlvbiBsKHYsTSwkKXtpZih2Lmxlbmd0aD09PTApdGhyb3cgRXJyb3IoImVtcHR5IHN0cmluZyIpO2lmKHY9PT0iTmFOInx8dj09PSJJbmZpbml0eSJ8fHY9PT0iK0luZmluaXR5Inx8dj09PSItSW5maW5pdHkiKXJldHVybiBnO2lmKHR5cGVvZiBNPT0ibnVtYmVyIj8oJD1NLE09ITEpOk09ISFNLCgkPSR8fDEwKTwyfHwzNjwkKXRocm93IFJhbmdlRXJyb3IoInJhZGl4Iik7dmFyIHo7aWYoKHo9di5pbmRleE9mKCItIikpPjApdGhyb3cgRXJyb3IoImludGVyaW9yIGh5cGhlbiIpO2lmKHo9PT0wKXJldHVybiBsKHYuc3Vic3RyaW5nKDEpLE0sJCkubmVnKCk7Zm9yKHZhciBCPXAoZCgkLDgpKSxOPWcsRD0wO0Q8di5sZW5ndGg7RCs9OCl7dmFyIEk9TWF0aC5taW4oOCx2Lmxlbmd0aC1EKSxGPXBhcnNlSW50KHYuc3Vic3RyaW5nKEQsRCtJKSwkKTtpZihJPDgpe3ZhciBYPXAoZCgkLEkpKTtOPU4ubXVsKFgpLmFkZChwKEYpKX1lbHNlIE49KE49Ti5tdWwoQikpLmFkZChwKEYpKX1yZXR1cm4gTi51bnNpZ25lZD1NLE59ZnVuY3Rpb24gbih2LE0pe3JldHVybiB0eXBlb2Ygdj09Im51bWJlciI/cCh2LE0pOnR5cGVvZiB2PT0ic3RyaW5nIj9sKHYsTSk6Zih2Lmxvdyx2LmhpZ2gsdHlwZW9mIE09PSJib29sZWFuIj9NOnYudW5zaWduZWQpfXIuZnJvbVN0cmluZz1sLHIuZnJvbVZhbHVlPW47dmFyIGU9NDI5NDk2NzI5NixpPWUqZSxzPWkvMixtPWEoMTw8MjQpLGc9YSgwKTtyLlpFUk89Zzt2YXIgXz1hKDAsITApO3IuVVpFUk89Xzt2YXIgYj1hKDEpO3IuT05FPWI7dmFyIHk9YSgxLCEwKTtyLlVPTkU9eTt2YXIgVD1hKC0xKTtyLk5FR19PTkU9VDt2YXIgdz1mKC0xLDIxNDc0ODM2NDcsITEpO3IuTUFYX1ZBTFVFPXc7dmFyIHg9ZigtMSwtMSwhMCk7ci5NQVhfVU5TSUdORURfVkFMVUU9eDt2YXIgRT1mKDAsLTIxNDc0ODM2NDgsITEpO3IuTUlOX1ZBTFVFPUU7dmFyIFA9ci5wcm90b3R5cGU7UC50b0ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVuc2lnbmVkP3RoaXMubG93Pj4+MDp0aGlzLmxvd30sUC50b051bWJlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVuc2lnbmVkPyh0aGlzLmhpZ2g+Pj4wKSplKyh0aGlzLmxvdz4+PjApOnRoaXMuaGlnaCplKyh0aGlzLmxvdz4+PjApfSxQLnRvU3RyaW5nPWZ1bmN0aW9uKHYpe2lmKCh2PXZ8fDEwKTwyfHwzNjx2KXRocm93IFJhbmdlRXJyb3IoInJhZGl4Iik7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4iMCI7aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKHRoaXMuZXEoRSkpe3ZhciBNPXAodiksJD10aGlzLmRpdihNKSx6PSQubXVsKE0pLnN1Yih0aGlzKTtyZXR1cm4gJC50b1N0cmluZyh2KSt6LnRvSW50KCkudG9TdHJpbmcodil9cmV0dXJuIi0iK3RoaXMubmVnKCkudG9TdHJpbmcodil9Zm9yKHZhciBCPXAoZCh2LDYpLHRoaXMudW5zaWduZWQpLE49dGhpcyxEPSIiOzspe3ZhciBJPU4uZGl2KEIpLEY9KE4uc3ViKEkubXVsKEIpKS50b0ludCgpPj4+MCkudG9TdHJpbmcodik7aWYoKE49SSkuaXNaZXJvKCkpcmV0dXJuIEYrRDtmb3IoO0YubGVuZ3RoPDY7KUY9IjAiK0Y7RD0iIitGK0R9fSxQLmdldEhpZ2hCaXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGlnaH0sUC5nZXRIaWdoQml0c1Vuc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGlnaD4+PjB9LFAuZ2V0TG93Qml0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvd30sUC5nZXRMb3dCaXRzVW5zaWduZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3c+Pj4wfSxQLmdldE51bUJpdHNBYnM9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gdGhpcy5lcShFKT82NDp0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTtmb3IodmFyIHY9dGhpcy5oaWdoIT0wP3RoaXMuaGlnaDp0aGlzLmxvdyxNPTMxO00+MCYmISh2JjE8PE0pO00tLSk7cmV0dXJuIHRoaXMuaGlnaCE9MD9NKzMzOk0rMX0sUC5pc1plcm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaWdoPT09MCYmdGhpcy5sb3c9PT0wfSxQLmVxej1QLmlzWmVybyxQLmlzTmVnYXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy51bnNpZ25lZCYmdGhpcy5oaWdoPDB9LFAuaXNQb3NpdGl2ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVuc2lnbmVkfHx0aGlzLmhpZ2g+PTB9LFAuaXNPZGQ9ZnVuY3Rpb24oKXtyZXR1cm4oMSZ0aGlzLmxvdyk9PTF9LFAuaXNFdmVuPWZ1bmN0aW9uKCl7cmV0dXJuKDEmdGhpcy5sb3cpPT0wfSxQLmVxdWFscz1mdW5jdGlvbih2KXtyZXR1cm4gbyh2KXx8KHY9bih2KSksKHRoaXMudW5zaWduZWQ9PT12LnVuc2lnbmVkfHx0aGlzLmhpZ2g+Pj4zMSE9MXx8di5oaWdoPj4+MzEhPTEpJiZ0aGlzLmhpZ2g9PT12LmhpZ2gmJnRoaXMubG93PT09di5sb3d9LFAuZXE9UC5lcXVhbHMsUC5ub3RFcXVhbHM9ZnVuY3Rpb24odil7cmV0dXJuIXRoaXMuZXEodil9LFAubmVxPVAubm90RXF1YWxzLFAubmU9UC5ub3RFcXVhbHMsUC5sZXNzVGhhbj1mdW5jdGlvbih2KXtyZXR1cm4gdGhpcy5jb21wKHYpPDB9LFAubHQ9UC5sZXNzVGhhbixQLmxlc3NUaGFuT3JFcXVhbD1mdW5jdGlvbih2KXtyZXR1cm4gdGhpcy5jb21wKHYpPD0wfSxQLmx0ZT1QLmxlc3NUaGFuT3JFcXVhbCxQLmxlPVAubGVzc1RoYW5PckVxdWFsLFAuZ3JlYXRlclRoYW49ZnVuY3Rpb24odil7cmV0dXJuIHRoaXMuY29tcCh2KT4wfSxQLmd0PVAuZ3JlYXRlclRoYW4sUC5ncmVhdGVyVGhhbk9yRXF1YWw9ZnVuY3Rpb24odil7cmV0dXJuIHRoaXMuY29tcCh2KT49MH0sUC5ndGU9UC5ncmVhdGVyVGhhbk9yRXF1YWwsUC5nZT1QLmdyZWF0ZXJUaGFuT3JFcXVhbCxQLmNvbXBhcmU9ZnVuY3Rpb24odil7aWYobyh2KXx8KHY9bih2KSksdGhpcy5lcSh2KSlyZXR1cm4gMDt2YXIgTT10aGlzLmlzTmVnYXRpdmUoKSwkPXYuaXNOZWdhdGl2ZSgpO3JldHVybiBNJiYhJD8tMTohTSYmJD8xOnRoaXMudW5zaWduZWQ/di5oaWdoPj4+MD50aGlzLmhpZ2g+Pj4wfHx2LmhpZ2g9PT10aGlzLmhpZ2gmJnYubG93Pj4+MD50aGlzLmxvdz4+PjA/LTE6MTp0aGlzLnN1Yih2KS5pc05lZ2F0aXZlKCk/LTE6MX0sUC5jb21wPVAuY29tcGFyZSxQLm5lZ2F0ZT1mdW5jdGlvbigpe3JldHVybiF0aGlzLnVuc2lnbmVkJiZ0aGlzLmVxKEUpP0U6dGhpcy5ub3QoKS5hZGQoYil9LFAubmVnPVAubmVnYXRlLFAuYWRkPWZ1bmN0aW9uKHYpe28odil8fCh2PW4odikpO3ZhciBNPXRoaXMuaGlnaD4+PjE2LCQ9NjU1MzUmdGhpcy5oaWdoLHo9dGhpcy5sb3c+Pj4xNixCPTY1NTM1JnRoaXMubG93LE49di5oaWdoPj4+MTYsRD02NTUzNSZ2LmhpZ2gsST12Lmxvdz4+PjE2LEY9MCxYPTAsRz0wLGVlPTA7cmV0dXJuIEcrPShlZSs9QisoNjU1MzUmdi5sb3cpKT4+PjE2LFgrPShHKz16K0kpPj4+MTYsRis9KFgrPSQrRCk+Pj4xNixGKz1NK04sZigoRyY9NjU1MzUpPDwxNnwoZWUmPTY1NTM1KSwoRiY9NjU1MzUpPDwxNnwoWCY9NjU1MzUpLHRoaXMudW5zaWduZWQpfSxQLnN1YnRyYWN0PWZ1bmN0aW9uKHYpe3JldHVybiBvKHYpfHwodj1uKHYpKSx0aGlzLmFkZCh2Lm5lZygpKX0sUC5zdWI9UC5zdWJ0cmFjdCxQLm11bHRpcGx5PWZ1bmN0aW9uKHYpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIGc7aWYobyh2KXx8KHY9bih2KSksdClyZXR1cm4gZih0Lm11bCh0aGlzLmxvdyx0aGlzLmhpZ2gsdi5sb3csdi5oaWdoKSx0LmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCk7aWYodi5pc1plcm8oKSlyZXR1cm4gZztpZih0aGlzLmVxKEUpKXJldHVybiB2LmlzT2RkKCk/RTpnO2lmKHYuZXEoRSkpcmV0dXJuIHRoaXMuaXNPZGQoKT9FOmc7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHYuaXNOZWdhdGl2ZSgpP3RoaXMubmVnKCkubXVsKHYubmVnKCkpOnRoaXMubmVnKCkubXVsKHYpLm5lZygpO2lmKHYuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLm11bCh2Lm5lZygpKS5uZWcoKTtpZih0aGlzLmx0KG0pJiZ2Lmx0KG0pKXJldHVybiBwKHRoaXMudG9OdW1iZXIoKSp2LnRvTnVtYmVyKCksdGhpcy51bnNpZ25lZCk7dmFyIE09dGhpcy5oaWdoPj4+MTYsJD02NTUzNSZ0aGlzLmhpZ2gsej10aGlzLmxvdz4+PjE2LEI9NjU1MzUmdGhpcy5sb3csTj12LmhpZ2g+Pj4xNixEPTY1NTM1JnYuaGlnaCxJPXYubG93Pj4+MTYsRj02NTUzNSZ2LmxvdyxYPTAsRz0wLGVlPTAsSj0wO3JldHVybiBlZSs9KEorPUIqRik+Pj4xNixHKz0oZWUrPXoqRik+Pj4xNixlZSY9NjU1MzUsRys9KGVlKz1CKkkpPj4+MTYsWCs9KEcrPSQqRik+Pj4xNixHJj02NTUzNSxYKz0oRys9eipJKT4+PjE2LEcmPTY1NTM1LFgrPShHKz1CKkQpPj4+MTYsWCs9TSpGKyQqSSt6KkQrQipOLGYoKGVlJj02NTUzNSk8PDE2fChKJj02NTUzNSksKFgmPTY1NTM1KTw8MTZ8KEcmPTY1NTM1KSx0aGlzLnVuc2lnbmVkKX0sUC5tdWw9UC5tdWx0aXBseSxQLmRpdmlkZT1mdW5jdGlvbih2KXtpZihvKHYpfHwodj1uKHYpKSx2LmlzWmVybygpKXRocm93IEVycm9yKCJkaXZpc2lvbiBieSB6ZXJvIik7dmFyIE0sJCx6O2lmKHQpcmV0dXJuIHRoaXMudW5zaWduZWR8fHRoaXMuaGlnaCE9PS0yMTQ3NDgzNjQ4fHx2LmxvdyE9PS0xfHx2LmhpZ2ghPT0tMT9mKCh0aGlzLnVuc2lnbmVkP3QuZGl2X3U6dC5kaXZfcykodGhpcy5sb3csdGhpcy5oaWdoLHYubG93LHYuaGlnaCksdC5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpOnRoaXM7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gdGhpcy51bnNpZ25lZD9fOmc7aWYodGhpcy51bnNpZ25lZCl7aWYodi51bnNpZ25lZHx8KHY9di50b1Vuc2lnbmVkKCkpLHYuZ3QodGhpcykpcmV0dXJuIF87aWYodi5ndCh0aGlzLnNocnUoMSkpKXJldHVybiB5O3o9X31lbHNle2lmKHRoaXMuZXEoRSkpcmV0dXJuIHYuZXEoYil8fHYuZXEoVCk/RTp2LmVxKEUpP2I6KE09dGhpcy5zaHIoMSkuZGl2KHYpLnNobCgxKSkuZXEoZyk/di5pc05lZ2F0aXZlKCk/YjpUOigkPXRoaXMuc3ViKHYubXVsKE0pKSx6PU0uYWRkKCQuZGl2KHYpKSk7aWYodi5lcShFKSlyZXR1cm4gdGhpcy51bnNpZ25lZD9fOmc7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHYuaXNOZWdhdGl2ZSgpP3RoaXMubmVnKCkuZGl2KHYubmVnKCkpOnRoaXMubmVnKCkuZGl2KHYpLm5lZygpO2lmKHYuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLmRpdih2Lm5lZygpKS5uZWcoKTt6PWd9Zm9yKCQ9dGhpczskLmd0ZSh2KTspe009TWF0aC5tYXgoMSxNYXRoLmZsb29yKCQudG9OdW1iZXIoKS92LnRvTnVtYmVyKCkpKTtmb3IodmFyIEI9TWF0aC5jZWlsKE1hdGgubG9nKE0pL01hdGguTE4yKSxOPUI8PTQ4PzE6ZCgyLEItNDgpLEQ9cChNKSxJPUQubXVsKHYpO0kuaXNOZWdhdGl2ZSgpfHxJLmd0KCQpOylJPShEPXAoTS09Tix0aGlzLnVuc2lnbmVkKSkubXVsKHYpO0QuaXNaZXJvKCkmJihEPWIpLHo9ei5hZGQoRCksJD0kLnN1YihJKX1yZXR1cm4gen0sUC5kaXY9UC5kaXZpZGUsUC5tb2R1bG89ZnVuY3Rpb24odil7cmV0dXJuIG8odil8fCh2PW4odikpLHQ/ZigodGhpcy51bnNpZ25lZD90LnJlbV91OnQucmVtX3MpKHRoaXMubG93LHRoaXMuaGlnaCx2Lmxvdyx2LmhpZ2gpLHQuZ2V0X2hpZ2goKSx0aGlzLnVuc2lnbmVkKTp0aGlzLnN1Yih0aGlzLmRpdih2KS5tdWwodikpfSxQLm1vZD1QLm1vZHVsbyxQLnJlbT1QLm1vZHVsbyxQLm5vdD1mdW5jdGlvbigpe3JldHVybiBmKH50aGlzLmxvdyx+dGhpcy5oaWdoLHRoaXMudW5zaWduZWQpfSxQLmFuZD1mdW5jdGlvbih2KXtyZXR1cm4gbyh2KXx8KHY9bih2KSksZih0aGlzLmxvdyZ2Lmxvdyx0aGlzLmhpZ2gmdi5oaWdoLHRoaXMudW5zaWduZWQpfSxQLm9yPWZ1bmN0aW9uKHYpe3JldHVybiBvKHYpfHwodj1uKHYpKSxmKHRoaXMubG93fHYubG93LHRoaXMuaGlnaHx2LmhpZ2gsdGhpcy51bnNpZ25lZCl9LFAueG9yPWZ1bmN0aW9uKHYpe3JldHVybiBvKHYpfHwodj1uKHYpKSxmKHRoaXMubG93XnYubG93LHRoaXMuaGlnaF52LmhpZ2gsdGhpcy51bnNpZ25lZCl9LFAuc2hpZnRMZWZ0PWZ1bmN0aW9uKHYpe3JldHVybiBvKHYpJiYodj12LnRvSW50KCkpLCh2Jj02Myk9PTA/dGhpczp2PDMyP2YodGhpcy5sb3c8PHYsdGhpcy5oaWdoPDx2fHRoaXMubG93Pj4+MzItdix0aGlzLnVuc2lnbmVkKTpmKDAsdGhpcy5sb3c8PHYtMzIsdGhpcy51bnNpZ25lZCl9LFAuc2hsPVAuc2hpZnRMZWZ0LFAuc2hpZnRSaWdodD1mdW5jdGlvbih2KXtyZXR1cm4gbyh2KSYmKHY9di50b0ludCgpKSwodiY9NjMpPT0wP3RoaXM6djwzMj9mKHRoaXMubG93Pj4+dnx0aGlzLmhpZ2g8PDMyLXYsdGhpcy5oaWdoPj52LHRoaXMudW5zaWduZWQpOmYodGhpcy5oaWdoPj52LTMyLHRoaXMuaGlnaD49MD8wOi0xLHRoaXMudW5zaWduZWQpfSxQLnNocj1QLnNoaWZ0UmlnaHQsUC5zaGlmdFJpZ2h0VW5zaWduZWQ9ZnVuY3Rpb24odil7aWYobyh2KSYmKHY9di50b0ludCgpKSwodiY9NjMpPT0wKXJldHVybiB0aGlzO3ZhciBNPXRoaXMuaGlnaDtyZXR1cm4gdjwzMj9mKHRoaXMubG93Pj4+dnxNPDwzMi12LE0+Pj52LHRoaXMudW5zaWduZWQpOmYodj09PTMyP006TT4+PnYtMzIsMCx0aGlzLnVuc2lnbmVkKX0sUC5zaHJ1PVAuc2hpZnRSaWdodFVuc2lnbmVkLFAuc2hyX3U9UC5zaGlmdFJpZ2h0VW5zaWduZWQsUC50b1NpZ25lZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVuc2lnbmVkP2YodGhpcy5sb3csdGhpcy5oaWdoLCExKTp0aGlzfSxQLnRvVW5zaWduZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnNpZ25lZD90aGlzOmYodGhpcy5sb3csdGhpcy5oaWdoLCEwKX0sUC50b0J5dGVzPWZ1bmN0aW9uKHYpe3JldHVybiB2P3RoaXMudG9CeXRlc0xFKCk6dGhpcy50b0J5dGVzQkUoKX0sUC50b0J5dGVzTEU9ZnVuY3Rpb24oKXt2YXIgdj10aGlzLmhpZ2gsTT10aGlzLmxvdztyZXR1cm5bMjU1Jk0sTT4+PjgmMjU1LE0+Pj4xNiYyNTUsTT4+PjI0LDI1NSZ2LHY+Pj44JjI1NSx2Pj4+MTYmMjU1LHY+Pj4yNF19LFAudG9CeXRlc0JFPWZ1bmN0aW9uKCl7dmFyIHY9dGhpcy5oaWdoLE09dGhpcy5sb3c7cmV0dXJuW3Y+Pj4yNCx2Pj4+MTYmMjU1LHY+Pj44JjI1NSwyNTUmdixNPj4+MjQsTT4+PjE2JjI1NSxNPj4+OCYyNTUsMjU1Jk1dfSxyLmZyb21CeXRlcz1mdW5jdGlvbih2LE0sJCl7cmV0dXJuICQ/ci5mcm9tQnl0ZXNMRSh2LE0pOnIuZnJvbUJ5dGVzQkUodixNKX0sci5mcm9tQnl0ZXNMRT1mdW5jdGlvbih2LE0pe3JldHVybiBuZXcgcih2WzBdfHZbMV08PDh8dlsyXTw8MTZ8dlszXTw8MjQsdls0XXx2WzVdPDw4fHZbNl08PDE2fHZbN108PDI0LE0pfSxyLmZyb21CeXRlc0JFPWZ1bmN0aW9uKHYsTSl7cmV0dXJuIG5ldyByKHZbNF08PDI0fHZbNV08PDE2fHZbNl08PDh8dls3XSx2WzBdPDwyNHx2WzFdPDwxNnx2WzJdPDw4fHZbM10sTSl9fSwxNDQ2OihjLHQscik9Pnt2YXIgbyx1LGgsYT1yKDIxMDApLHA9YS5SZWFkZXIsZj1hLldyaXRlcixkPWEudXRpbCxsPWEucm9vdHMuZGVmYXVsdHx8KGEucm9vdHMuZGVmYXVsdD17fSk7bC5vbm54PSgoaD17fSkuVmVyc2lvbj0obz17fSwodT1PYmplY3QuY3JlYXRlKG8pKVtvWzBdPSJfU1RBUlRfVkVSU0lPTiJdPTAsdVtvWzFdPSJJUl9WRVJTSU9OXzIwMTdfMTBfMTAiXT0xLHVbb1syXT0iSVJfVkVSU0lPTl8yMDE3XzEwXzMwIl09Mix1W29bM109IklSX1ZFUlNJT05fMjAxN18xMV8zIl09Myx1W29bNF09IklSX1ZFUlNJT05fMjAxOV8xXzIyIl09NCx1W29bNV09IklSX1ZFUlNJT04iXT01LHUpLGguQXR0cmlidXRlUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGUpe2lmKHRoaXMuZmxvYXRzPVtdLHRoaXMuaW50cz1bXSx0aGlzLnN0cmluZ3M9W10sdGhpcy50ZW5zb3JzPVtdLHRoaXMuZ3JhcGhzPVtdLGUpZm9yKHZhciBpPU9iamVjdC5rZXlzKGUpLHM9MDtzPGkubGVuZ3RoOysrcyllW2lbc11dIT1udWxsJiYodGhpc1tpW3NdXT1lW2lbc11dKX1yZXR1cm4gbi5wcm90b3R5cGUubmFtZT0iIixuLnByb3RvdHlwZS5yZWZBdHRyTmFtZT0iIixuLnByb3RvdHlwZS5kb2NTdHJpbmc9IiIsbi5wcm90b3R5cGUudHlwZT0wLG4ucHJvdG90eXBlLmY9MCxuLnByb3RvdHlwZS5pPWQuTG9uZz9kLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLG4ucHJvdG90eXBlLnM9ZC5uZXdCdWZmZXIoW10pLG4ucHJvdG90eXBlLnQ9bnVsbCxuLnByb3RvdHlwZS5nPW51bGwsbi5wcm90b3R5cGUuZmxvYXRzPWQuZW1wdHlBcnJheSxuLnByb3RvdHlwZS5pbnRzPWQuZW1wdHlBcnJheSxuLnByb3RvdHlwZS5zdHJpbmdzPWQuZW1wdHlBcnJheSxuLnByb3RvdHlwZS50ZW5zb3JzPWQuZW1wdHlBcnJheSxuLnByb3RvdHlwZS5ncmFwaHM9ZC5lbXB0eUFycmF5LG4uY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbihlKX0sbi5lbmNvZGU9ZnVuY3Rpb24oZSxpKXtpZihpfHwoaT1mLmNyZWF0ZSgpKSxlLm5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmaS51aW50MzIoMTApLnN0cmluZyhlLm5hbWUpLGUuZiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZiIpJiZpLnVpbnQzMigyMSkuZmxvYXQoZS5mKSxlLmkhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImkiKSYmaS51aW50MzIoMjQpLmludDY0KGUuaSksZS5zIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJzIikmJmkudWludDMyKDM0KS5ieXRlcyhlLnMpLGUudCE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidCIpJiZsLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUudCxpLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKSxlLmchPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImciKSYmbC5vbm54LkdyYXBoUHJvdG8uZW5jb2RlKGUuZyxpLnVpbnQzMig1MCkuZm9yaygpKS5sZGVsaW0oKSxlLmZsb2F0cyE9bnVsbCYmZS5mbG9hdHMubGVuZ3RoKXtpLnVpbnQzMig1OCkuZm9yaygpO2Zvcih2YXIgcz0wO3M8ZS5mbG9hdHMubGVuZ3RoOysrcylpLmZsb2F0KGUuZmxvYXRzW3NdKTtpLmxkZWxpbSgpfWlmKGUuaW50cyE9bnVsbCYmZS5pbnRzLmxlbmd0aCl7Zm9yKGkudWludDMyKDY2KS5mb3JrKCkscz0wO3M8ZS5pbnRzLmxlbmd0aDsrK3MpaS5pbnQ2NChlLmludHNbc10pO2kubGRlbGltKCl9aWYoZS5zdHJpbmdzIT1udWxsJiZlLnN0cmluZ3MubGVuZ3RoKWZvcihzPTA7czxlLnN0cmluZ3MubGVuZ3RoOysrcylpLnVpbnQzMig3NCkuYnl0ZXMoZS5zdHJpbmdzW3NdKTtpZihlLnRlbnNvcnMhPW51bGwmJmUudGVuc29ycy5sZW5ndGgpZm9yKHM9MDtzPGUudGVuc29ycy5sZW5ndGg7KytzKWwub25ueC5UZW5zb3JQcm90by5lbmNvZGUoZS50ZW5zb3JzW3NdLGkudWludDMyKDgyKS5mb3JrKCkpLmxkZWxpbSgpO2lmKGUuZ3JhcGhzIT1udWxsJiZlLmdyYXBocy5sZW5ndGgpZm9yKHM9MDtzPGUuZ3JhcGhzLmxlbmd0aDsrK3MpbC5vbm54LkdyYXBoUHJvdG8uZW5jb2RlKGUuZ3JhcGhzW3NdLGkudWludDMyKDkwKS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiBlLmRvY1N0cmluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJmkudWludDMyKDEwNikuc3RyaW5nKGUuZG9jU3RyaW5nKSxlLnR5cGUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInR5cGUiKSYmaS51aW50MzIoMTYwKS5pbnQzMihlLnR5cGUpLGUucmVmQXR0ck5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInJlZkF0dHJOYW1lIikmJmkudWludDMyKDE3MCkuc3RyaW5nKGUucmVmQXR0ck5hbWUpLGl9LG4uZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsaSl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsaSkubGRlbGltKCl9LG4uZGVjb2RlPWZ1bmN0aW9uKGUsaSl7ZSBpbnN0YW5jZW9mIHB8fChlPXAuY3JlYXRlKGUpKTtmb3IodmFyIHM9aT09PXZvaWQgMD9lLmxlbjplLnBvcytpLG09bmV3IGwub25ueC5BdHRyaWJ1dGVQcm90bztlLnBvczxzOyl7dmFyIGc9ZS51aW50MzIoKTtzd2l0Y2goZz4+PjMpe2Nhc2UgMTptLm5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDIxOm0ucmVmQXR0ck5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDEzOm0uZG9jU3RyaW5nPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAyMDptLnR5cGU9ZS5pbnQzMigpO2JyZWFrO2Nhc2UgMjptLmY9ZS5mbG9hdCgpO2JyZWFrO2Nhc2UgMzptLmk9ZS5pbnQ2NCgpO2JyZWFrO2Nhc2UgNDptLnM9ZS5ieXRlcygpO2JyZWFrO2Nhc2UgNTptLnQ9bC5vbm54LlRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgNjptLmc9bC5vbm54LkdyYXBoUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSA3OmlmKG0uZmxvYXRzJiZtLmZsb2F0cy5sZW5ndGh8fChtLmZsb2F0cz1bXSksKDcmZyk9PTIpZm9yKHZhciBfPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8XzspbS5mbG9hdHMucHVzaChlLmZsb2F0KCkpO2Vsc2UgbS5mbG9hdHMucHVzaChlLmZsb2F0KCkpO2JyZWFrO2Nhc2UgODppZihtLmludHMmJm0uaW50cy5sZW5ndGh8fChtLmludHM9W10pLCg3JmcpPT0yKWZvcihfPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8XzspbS5pbnRzLnB1c2goZS5pbnQ2NCgpKTtlbHNlIG0uaW50cy5wdXNoKGUuaW50NjQoKSk7YnJlYWs7Y2FzZSA5Om0uc3RyaW5ncyYmbS5zdHJpbmdzLmxlbmd0aHx8KG0uc3RyaW5ncz1bXSksbS5zdHJpbmdzLnB1c2goZS5ieXRlcygpKTticmVhaztjYXNlIDEwOm0udGVuc29ycyYmbS50ZW5zb3JzLmxlbmd0aHx8KG0udGVuc29ycz1bXSksbS50ZW5zb3JzLnB1c2gobC5vbm54LlRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDExOm0uZ3JhcGhzJiZtLmdyYXBocy5sZW5ndGh8fChtLmdyYXBocz1bXSksbS5ncmFwaHMucHVzaChsLm9ubnguR3JhcGhQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmZyl9fXJldHVybiBtfSxuLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHB8fChlPW5ldyBwKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxuLnZlcmlmeT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXJldHVybiJvYmplY3QgZXhwZWN0ZWQiO2lmKGUubmFtZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiYhZC5pc1N0cmluZyhlLm5hbWUpKXJldHVybiJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKGUucmVmQXR0ck5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInJlZkF0dHJOYW1lIikmJiFkLmlzU3RyaW5nKGUucmVmQXR0ck5hbWUpKXJldHVybiJyZWZBdHRyTmFtZTogc3RyaW5nIGV4cGVjdGVkIjtpZihlLmRvY1N0cmluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFkLmlzU3RyaW5nKGUuZG9jU3RyaW5nKSlyZXR1cm4iZG9jU3RyaW5nOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKGUudHlwZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidHlwZSIpKXN3aXRjaChlLnR5cGUpe2RlZmF1bHQ6cmV0dXJuInR5cGU6IGVudW0gdmFsdWUgZXhwZWN0ZWQiO2Nhc2UgMDpjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmNhc2UgNjpjYXNlIDc6Y2FzZSA4OmNhc2UgOTpjYXNlIDEwOn1pZihlLmYhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImYiKSYmdHlwZW9mIGUuZiE9Im51bWJlciIpcmV0dXJuImY6IG51bWJlciBleHBlY3RlZCI7aWYoZS5pIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJpIikmJiEoZC5pc0ludGVnZXIoZS5pKXx8ZS5pJiZkLmlzSW50ZWdlcihlLmkubG93KSYmZC5pc0ludGVnZXIoZS5pLmhpZ2gpKSlyZXR1cm4iaTogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjtpZihlLnMhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInMiKSYmIShlLnMmJnR5cGVvZiBlLnMubGVuZ3RoPT0ibnVtYmVyInx8ZC5pc1N0cmluZyhlLnMpKSlyZXR1cm4iczogYnVmZmVyIGV4cGVjdGVkIjtpZihlLnQhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInQiKSYmKHM9bC5vbm54LlRlbnNvclByb3RvLnZlcmlmeShlLnQpKSlyZXR1cm4idC4iK3M7aWYoZS5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJnIikmJihzPWwub25ueC5HcmFwaFByb3RvLnZlcmlmeShlLmcpKSlyZXR1cm4iZy4iK3M7aWYoZS5mbG9hdHMhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImZsb2F0cyIpKXtpZighQXJyYXkuaXNBcnJheShlLmZsb2F0cykpcmV0dXJuImZsb2F0czogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgaT0wO2k8ZS5mbG9hdHMubGVuZ3RoOysraSlpZih0eXBlb2YgZS5mbG9hdHNbaV0hPSJudW1iZXIiKXJldHVybiJmbG9hdHM6IG51bWJlcltdIGV4cGVjdGVkIn1pZihlLmludHMhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImludHMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnRzKSlyZXR1cm4iaW50czogYXJyYXkgZXhwZWN0ZWQiO2ZvcihpPTA7aTxlLmludHMubGVuZ3RoOysraSlpZighKGQuaXNJbnRlZ2VyKGUuaW50c1tpXSl8fGUuaW50c1tpXSYmZC5pc0ludGVnZXIoZS5pbnRzW2ldLmxvdykmJmQuaXNJbnRlZ2VyKGUuaW50c1tpXS5oaWdoKSkpcmV0dXJuImludHM6IGludGVnZXJ8TG9uZ1tdIGV4cGVjdGVkIn1pZihlLnN0cmluZ3MhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInN0cmluZ3MiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5zdHJpbmdzKSlyZXR1cm4ic3RyaW5nczogYXJyYXkgZXhwZWN0ZWQiO2ZvcihpPTA7aTxlLnN0cmluZ3MubGVuZ3RoOysraSlpZighKGUuc3RyaW5nc1tpXSYmdHlwZW9mIGUuc3RyaW5nc1tpXS5sZW5ndGg9PSJudW1iZXIifHxkLmlzU3RyaW5nKGUuc3RyaW5nc1tpXSkpKXJldHVybiJzdHJpbmdzOiBidWZmZXJbXSBleHBlY3RlZCJ9aWYoZS50ZW5zb3JzIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJ0ZW5zb3JzIikpe2lmKCFBcnJheS5pc0FycmF5KGUudGVuc29ycykpcmV0dXJuInRlbnNvcnM6IGFycmF5IGV4cGVjdGVkIjtmb3IoaT0wO2k8ZS50ZW5zb3JzLmxlbmd0aDsrK2kpaWYocz1sLm9ubnguVGVuc29yUHJvdG8udmVyaWZ5KGUudGVuc29yc1tpXSkpcmV0dXJuInRlbnNvcnMuIitzfWlmKGUuZ3JhcGhzIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJncmFwaHMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5ncmFwaHMpKXJldHVybiJncmFwaHM6IGFycmF5IGV4cGVjdGVkIjtmb3IoaT0wO2k8ZS5ncmFwaHMubGVuZ3RoOysraSl7dmFyIHM7aWYocz1sLm9ubnguR3JhcGhQcm90by52ZXJpZnkoZS5ncmFwaHNbaV0pKXJldHVybiJncmFwaHMuIitzfX1yZXR1cm4gbnVsbH0sbi5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBsLm9ubnguQXR0cmlidXRlUHJvdG8pcmV0dXJuIGU7dmFyIGk9bmV3IGwub25ueC5BdHRyaWJ1dGVQcm90bztzd2l0Y2goZS5uYW1lIT1udWxsJiYoaS5uYW1lPVN0cmluZyhlLm5hbWUpKSxlLnJlZkF0dHJOYW1lIT1udWxsJiYoaS5yZWZBdHRyTmFtZT1TdHJpbmcoZS5yZWZBdHRyTmFtZSkpLGUuZG9jU3RyaW5nIT1udWxsJiYoaS5kb2NTdHJpbmc9U3RyaW5nKGUuZG9jU3RyaW5nKSksZS50eXBlKXtjYXNlIlVOREVGSU5FRCI6Y2FzZSAwOmkudHlwZT0wO2JyZWFrO2Nhc2UiRkxPQVQiOmNhc2UgMTppLnR5cGU9MTticmVhaztjYXNlIklOVCI6Y2FzZSAyOmkudHlwZT0yO2JyZWFrO2Nhc2UiU1RSSU5HIjpjYXNlIDM6aS50eXBlPTM7YnJlYWs7Y2FzZSJURU5TT1IiOmNhc2UgNDppLnR5cGU9NDticmVhaztjYXNlIkdSQVBIIjpjYXNlIDU6aS50eXBlPTU7YnJlYWs7Y2FzZSJGTE9BVFMiOmNhc2UgNjppLnR5cGU9NjticmVhaztjYXNlIklOVFMiOmNhc2UgNzppLnR5cGU9NzticmVhaztjYXNlIlNUUklOR1MiOmNhc2UgODppLnR5cGU9ODticmVhaztjYXNlIlRFTlNPUlMiOmNhc2UgOTppLnR5cGU9OTticmVhaztjYXNlIkdSQVBIUyI6Y2FzZSAxMDppLnR5cGU9MTB9aWYoZS5mIT1udWxsJiYoaS5mPU51bWJlcihlLmYpKSxlLmkhPW51bGwmJihkLkxvbmc/KGkuaT1kLkxvbmcuZnJvbVZhbHVlKGUuaSkpLnVuc2lnbmVkPSExOnR5cGVvZiBlLmk9PSJzdHJpbmciP2kuaT1wYXJzZUludChlLmksMTApOnR5cGVvZiBlLmk9PSJudW1iZXIiP2kuaT1lLmk6dHlwZW9mIGUuaT09Im9iamVjdCImJihpLmk9bmV3IGQuTG9uZ0JpdHMoZS5pLmxvdz4+PjAsZS5pLmhpZ2g+Pj4wKS50b051bWJlcigpKSksZS5zIT1udWxsJiYodHlwZW9mIGUucz09InN0cmluZyI/ZC5iYXNlNjQuZGVjb2RlKGUucyxpLnM9ZC5uZXdCdWZmZXIoZC5iYXNlNjQubGVuZ3RoKGUucykpLDApOmUucy5sZW5ndGgmJihpLnM9ZS5zKSksZS50IT1udWxsKXtpZih0eXBlb2YgZS50IT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnQ6IG9iamVjdCBleHBlY3RlZCIpO2kudD1sLm9ubnguVGVuc29yUHJvdG8uZnJvbU9iamVjdChlLnQpfWlmKGUuZyE9bnVsbCl7aWYodHlwZW9mIGUuZyE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5nOiBvYmplY3QgZXhwZWN0ZWQiKTtpLmc9bC5vbm54LkdyYXBoUHJvdG8uZnJvbU9iamVjdChlLmcpfWlmKGUuZmxvYXRzKXtpZighQXJyYXkuaXNBcnJheShlLmZsb2F0cykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5mbG9hdHM6IGFycmF5IGV4cGVjdGVkIik7aS5mbG9hdHM9W107Zm9yKHZhciBzPTA7czxlLmZsb2F0cy5sZW5ndGg7KytzKWkuZmxvYXRzW3NdPU51bWJlcihlLmZsb2F0c1tzXSl9aWYoZS5pbnRzKXtpZighQXJyYXkuaXNBcnJheShlLmludHMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uaW50czogYXJyYXkgZXhwZWN0ZWQiKTtmb3IoaS5pbnRzPVtdLHM9MDtzPGUuaW50cy5sZW5ndGg7KytzKWQuTG9uZz8oaS5pbnRzW3NdPWQuTG9uZy5mcm9tVmFsdWUoZS5pbnRzW3NdKSkudW5zaWduZWQ9ITE6dHlwZW9mIGUuaW50c1tzXT09InN0cmluZyI/aS5pbnRzW3NdPXBhcnNlSW50KGUuaW50c1tzXSwxMCk6dHlwZW9mIGUuaW50c1tzXT09Im51bWJlciI/aS5pbnRzW3NdPWUuaW50c1tzXTp0eXBlb2YgZS5pbnRzW3NdPT0ib2JqZWN0IiYmKGkuaW50c1tzXT1uZXcgZC5Mb25nQml0cyhlLmludHNbc10ubG93Pj4+MCxlLmludHNbc10uaGlnaD4+PjApLnRvTnVtYmVyKCkpfWlmKGUuc3RyaW5ncyl7aWYoIUFycmF5LmlzQXJyYXkoZS5zdHJpbmdzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnN0cmluZ3M6IGFycmF5IGV4cGVjdGVkIik7Zm9yKGkuc3RyaW5ncz1bXSxzPTA7czxlLnN0cmluZ3MubGVuZ3RoOysrcyl0eXBlb2YgZS5zdHJpbmdzW3NdPT0ic3RyaW5nIj9kLmJhc2U2NC5kZWNvZGUoZS5zdHJpbmdzW3NdLGkuc3RyaW5nc1tzXT1kLm5ld0J1ZmZlcihkLmJhc2U2NC5sZW5ndGgoZS5zdHJpbmdzW3NdKSksMCk6ZS5zdHJpbmdzW3NdLmxlbmd0aCYmKGkuc3RyaW5nc1tzXT1lLnN0cmluZ3Nbc10pfWlmKGUudGVuc29ycyl7aWYoIUFycmF5LmlzQXJyYXkoZS50ZW5zb3JzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnRlbnNvcnM6IGFycmF5IGV4cGVjdGVkIik7Zm9yKGkudGVuc29ycz1bXSxzPTA7czxlLnRlbnNvcnMubGVuZ3RoOysrcyl7aWYodHlwZW9mIGUudGVuc29yc1tzXSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by50ZW5zb3JzOiBvYmplY3QgZXhwZWN0ZWQiKTtpLnRlbnNvcnNbc109bC5vbm54LlRlbnNvclByb3RvLmZyb21PYmplY3QoZS50ZW5zb3JzW3NdKX19aWYoZS5ncmFwaHMpe2lmKCFBcnJheS5pc0FycmF5KGUuZ3JhcGhzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLmdyYXBoczogYXJyYXkgZXhwZWN0ZWQiKTtmb3IoaS5ncmFwaHM9W10scz0wO3M8ZS5ncmFwaHMubGVuZ3RoOysrcyl7aWYodHlwZW9mIGUuZ3JhcGhzW3NdIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLmdyYXBoczogb2JqZWN0IGV4cGVjdGVkIik7aS5ncmFwaHNbc109bC5vbm54LkdyYXBoUHJvdG8uZnJvbU9iamVjdChlLmdyYXBoc1tzXSl9fXJldHVybiBpfSxuLnRvT2JqZWN0PWZ1bmN0aW9uKGUsaSl7aXx8KGk9e30pO3ZhciBzPXt9O2lmKChpLmFycmF5c3x8aS5kZWZhdWx0cykmJihzLmZsb2F0cz1bXSxzLmludHM9W10scy5zdHJpbmdzPVtdLHMudGVuc29ycz1bXSxzLmdyYXBocz1bXSksaS5kZWZhdWx0cyl7aWYocy5uYW1lPSIiLHMuZj0wLGQuTG9uZyl7dmFyIG09bmV3IGQuTG9uZygwLDAsITEpO3MuaT1pLmxvbmdzPT09U3RyaW5nP20udG9TdHJpbmcoKTppLmxvbmdzPT09TnVtYmVyP20udG9OdW1iZXIoKTptfWVsc2Ugcy5pPWkubG9uZ3M9PT1TdHJpbmc/IjAiOjA7aS5ieXRlcz09PVN0cmluZz9zLnM9IiI6KHMucz1bXSxpLmJ5dGVzIT09QXJyYXkmJihzLnM9ZC5uZXdCdWZmZXIocy5zKSkpLHMudD1udWxsLHMuZz1udWxsLHMuZG9jU3RyaW5nPSIiLHMudHlwZT1pLmVudW1zPT09U3RyaW5nPyJVTkRFRklORUQiOjAscy5yZWZBdHRyTmFtZT0iIn1pZihlLm5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKHMubmFtZT1lLm5hbWUpLGUuZiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZiIpJiYocy5mPWkuanNvbiYmIWlzRmluaXRlKGUuZik/U3RyaW5nKGUuZik6ZS5mKSxlLmkhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImkiKSYmKHR5cGVvZiBlLmk9PSJudW1iZXIiP3MuaT1pLmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLmkpOmUuaTpzLmk9aS5sb25ncz09PVN0cmluZz9kLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5pKTppLmxvbmdzPT09TnVtYmVyP25ldyBkLkxvbmdCaXRzKGUuaS5sb3c+Pj4wLGUuaS5oaWdoPj4+MCkudG9OdW1iZXIoKTplLmkpLGUucyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgicyIpJiYocy5zPWkuYnl0ZXM9PT1TdHJpbmc/ZC5iYXNlNjQuZW5jb2RlKGUucywwLGUucy5sZW5ndGgpOmkuYnl0ZXM9PT1BcnJheT9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnMpOmUucyksZS50IT1udWxsJiZlLmhhc093blByb3BlcnR5KCJ0IikmJihzLnQ9bC5vbm54LlRlbnNvclByb3RvLnRvT2JqZWN0KGUudCxpKSksZS5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJnIikmJihzLmc9bC5vbm54LkdyYXBoUHJvdG8udG9PYmplY3QoZS5nLGkpKSxlLmZsb2F0cyYmZS5mbG9hdHMubGVuZ3RoKXtzLmZsb2F0cz1bXTtmb3IodmFyIGc9MDtnPGUuZmxvYXRzLmxlbmd0aDsrK2cpcy5mbG9hdHNbZ109aS5qc29uJiYhaXNGaW5pdGUoZS5mbG9hdHNbZ10pP1N0cmluZyhlLmZsb2F0c1tnXSk6ZS5mbG9hdHNbZ119aWYoZS5pbnRzJiZlLmludHMubGVuZ3RoKWZvcihzLmludHM9W10sZz0wO2c8ZS5pbnRzLmxlbmd0aDsrK2cpdHlwZW9mIGUuaW50c1tnXT09Im51bWJlciI/cy5pbnRzW2ddPWkubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuaW50c1tnXSk6ZS5pbnRzW2ddOnMuaW50c1tnXT1pLmxvbmdzPT09U3RyaW5nP2QuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmludHNbZ10pOmkubG9uZ3M9PT1OdW1iZXI/bmV3IGQuTG9uZ0JpdHMoZS5pbnRzW2ddLmxvdz4+PjAsZS5pbnRzW2ddLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuaW50c1tnXTtpZihlLnN0cmluZ3MmJmUuc3RyaW5ncy5sZW5ndGgpZm9yKHMuc3RyaW5ncz1bXSxnPTA7ZzxlLnN0cmluZ3MubGVuZ3RoOysrZylzLnN0cmluZ3NbZ109aS5ieXRlcz09PVN0cmluZz9kLmJhc2U2NC5lbmNvZGUoZS5zdHJpbmdzW2ddLDAsZS5zdHJpbmdzW2ddLmxlbmd0aCk6aS5ieXRlcz09PUFycmF5P0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuc3RyaW5nc1tnXSk6ZS5zdHJpbmdzW2ddO2lmKGUudGVuc29ycyYmZS50ZW5zb3JzLmxlbmd0aClmb3Iocy50ZW5zb3JzPVtdLGc9MDtnPGUudGVuc29ycy5sZW5ndGg7KytnKXMudGVuc29yc1tnXT1sLm9ubnguVGVuc29yUHJvdG8udG9PYmplY3QoZS50ZW5zb3JzW2ddLGkpO2lmKGUuZ3JhcGhzJiZlLmdyYXBocy5sZW5ndGgpZm9yKHMuZ3JhcGhzPVtdLGc9MDtnPGUuZ3JhcGhzLmxlbmd0aDsrK2cpcy5ncmFwaHNbZ109bC5vbm54LkdyYXBoUHJvdG8udG9PYmplY3QoZS5ncmFwaHNbZ10saSk7cmV0dXJuIGUuZG9jU3RyaW5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmKHMuZG9jU3RyaW5nPWUuZG9jU3RyaW5nKSxlLnR5cGUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInR5cGUiKSYmKHMudHlwZT1pLmVudW1zPT09U3RyaW5nP2wub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlW2UudHlwZV06ZS50eXBlKSxlLnJlZkF0dHJOYW1lIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJyZWZBdHRyTmFtZSIpJiYocy5yZWZBdHRyTmFtZT1lLnJlZkF0dHJOYW1lKSxzfSxuLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLGEudXRpbC50b0pTT05PcHRpb25zKX0sbi5BdHRyaWJ1dGVUeXBlPWZ1bmN0aW9uKCl7dmFyIGU9e30saT1PYmplY3QuY3JlYXRlKGUpO3JldHVybiBpW2VbMF09IlVOREVGSU5FRCJdPTAsaVtlWzFdPSJGTE9BVCJdPTEsaVtlWzJdPSJJTlQiXT0yLGlbZVszXT0iU1RSSU5HIl09MyxpW2VbNF09IlRFTlNPUiJdPTQsaVtlWzVdPSJHUkFQSCJdPTUsaVtlWzZdPSJGTE9BVFMiXT02LGlbZVs3XT0iSU5UUyJdPTcsaVtlWzhdPSJTVFJJTkdTIl09OCxpW2VbOV09IlRFTlNPUlMiXT05LGlbZVsxMF09IkdSQVBIUyJdPTEwLGl9KCksbn0oKSxoLlZhbHVlSW5mb1Byb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihlKXtpZihlKWZvcih2YXIgaT1PYmplY3Qua2V5cyhlKSxzPTA7czxpLmxlbmd0aDsrK3MpZVtpW3NdXSE9bnVsbCYmKHRoaXNbaVtzXV09ZVtpW3NdXSl9cmV0dXJuIG4ucHJvdG90eXBlLm5hbWU9IiIsbi5wcm90b3R5cGUudHlwZT1udWxsLG4ucHJvdG90eXBlLmRvY1N0cmluZz0iIixuLmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IG4oZSl9LG4uZW5jb2RlPWZ1bmN0aW9uKGUsaSl7cmV0dXJuIGl8fChpPWYuY3JlYXRlKCkpLGUubmFtZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiZpLnVpbnQzMigxMCkuc3RyaW5nKGUubmFtZSksZS50eXBlIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJ0eXBlIikmJmwub25ueC5UeXBlUHJvdG8uZW5jb2RlKGUudHlwZSxpLnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKSxlLmRvY1N0cmluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJmkudWludDMyKDI2KS5zdHJpbmcoZS5kb2NTdHJpbmcpLGl9LG4uZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsaSl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsaSkubGRlbGltKCl9LG4uZGVjb2RlPWZ1bmN0aW9uKGUsaSl7ZSBpbnN0YW5jZW9mIHB8fChlPXAuY3JlYXRlKGUpKTtmb3IodmFyIHM9aT09PXZvaWQgMD9lLmxlbjplLnBvcytpLG09bmV3IGwub25ueC5WYWx1ZUluZm9Qcm90bztlLnBvczxzOyl7dmFyIGc9ZS51aW50MzIoKTtzd2l0Y2goZz4+PjMpe2Nhc2UgMTptLm5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDI6bS50eXBlPWwub25ueC5UeXBlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSAzOm0uZG9jU3RyaW5nPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmZyl9fXJldHVybiBtfSxuLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHB8fChlPW5ldyBwKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxuLnZlcmlmeT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXJldHVybiJvYmplY3QgZXhwZWN0ZWQiO2lmKGUubmFtZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiYhZC5pc1N0cmluZyhlLm5hbWUpKXJldHVybiJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKGUudHlwZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidHlwZSIpKXt2YXIgaT1sLm9ubnguVHlwZVByb3RvLnZlcmlmeShlLnR5cGUpO2lmKGkpcmV0dXJuInR5cGUuIitpfXJldHVybiBlLmRvY1N0cmluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFkLmlzU3RyaW5nKGUuZG9jU3RyaW5nKT8iZG9jU3RyaW5nOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LG4uZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgbC5vbm54LlZhbHVlSW5mb1Byb3RvKXJldHVybiBlO3ZhciBpPW5ldyBsLm9ubnguVmFsdWVJbmZvUHJvdG87aWYoZS5uYW1lIT1udWxsJiYoaS5uYW1lPVN0cmluZyhlLm5hbWUpKSxlLnR5cGUhPW51bGwpe2lmKHR5cGVvZiBlLnR5cGUhPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguVmFsdWVJbmZvUHJvdG8udHlwZTogb2JqZWN0IGV4cGVjdGVkIik7aS50eXBlPWwub25ueC5UeXBlUHJvdG8uZnJvbU9iamVjdChlLnR5cGUpfXJldHVybiBlLmRvY1N0cmluZyE9bnVsbCYmKGkuZG9jU3RyaW5nPVN0cmluZyhlLmRvY1N0cmluZykpLGl9LG4udG9PYmplY3Q9ZnVuY3Rpb24oZSxpKXtpfHwoaT17fSk7dmFyIHM9e307cmV0dXJuIGkuZGVmYXVsdHMmJihzLm5hbWU9IiIscy50eXBlPW51bGwscy5kb2NTdHJpbmc9IiIpLGUubmFtZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiYocy5uYW1lPWUubmFtZSksZS50eXBlIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJ0eXBlIikmJihzLnR5cGU9bC5vbm54LlR5cGVQcm90by50b09iamVjdChlLnR5cGUsaSkpLGUuZG9jU3RyaW5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmKHMuZG9jU3RyaW5nPWUuZG9jU3RyaW5nKSxzfSxuLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLGEudXRpbC50b0pTT05PcHRpb25zKX0sbn0oKSxoLk5vZGVQcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oZSl7aWYodGhpcy5pbnB1dD1bXSx0aGlzLm91dHB1dD1bXSx0aGlzLmF0dHJpYnV0ZT1bXSxlKWZvcih2YXIgaT1PYmplY3Qua2V5cyhlKSxzPTA7czxpLmxlbmd0aDsrK3MpZVtpW3NdXSE9bnVsbCYmKHRoaXNbaVtzXV09ZVtpW3NdXSl9cmV0dXJuIG4ucHJvdG90eXBlLmlucHV0PWQuZW1wdHlBcnJheSxuLnByb3RvdHlwZS5vdXRwdXQ9ZC5lbXB0eUFycmF5LG4ucHJvdG90eXBlLm5hbWU9IiIsbi5wcm90b3R5cGUub3BUeXBlPSIiLG4ucHJvdG90eXBlLmRvbWFpbj0iIixuLnByb3RvdHlwZS5hdHRyaWJ1dGU9ZC5lbXB0eUFycmF5LG4ucHJvdG90eXBlLmRvY1N0cmluZz0iIixuLmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IG4oZSl9LG4uZW5jb2RlPWZ1bmN0aW9uKGUsaSl7aWYoaXx8KGk9Zi5jcmVhdGUoKSksZS5pbnB1dCE9bnVsbCYmZS5pbnB1dC5sZW5ndGgpZm9yKHZhciBzPTA7czxlLmlucHV0Lmxlbmd0aDsrK3MpaS51aW50MzIoMTApLnN0cmluZyhlLmlucHV0W3NdKTtpZihlLm91dHB1dCE9bnVsbCYmZS5vdXRwdXQubGVuZ3RoKWZvcihzPTA7czxlLm91dHB1dC5sZW5ndGg7KytzKWkudWludDMyKDE4KS5zdHJpbmcoZS5vdXRwdXRbc10pO2lmKGUubmFtZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiZpLnVpbnQzMigyNikuc3RyaW5nKGUubmFtZSksZS5vcFR5cGUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm9wVHlwZSIpJiZpLnVpbnQzMigzNCkuc3RyaW5nKGUub3BUeXBlKSxlLmF0dHJpYnV0ZSE9bnVsbCYmZS5hdHRyaWJ1dGUubGVuZ3RoKWZvcihzPTA7czxlLmF0dHJpYnV0ZS5sZW5ndGg7KytzKWwub25ueC5BdHRyaWJ1dGVQcm90by5lbmNvZGUoZS5hdHRyaWJ1dGVbc10saS51aW50MzIoNDIpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIGUuZG9jU3RyaW5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmaS51aW50MzIoNTApLnN0cmluZyhlLmRvY1N0cmluZyksZS5kb21haW4hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiZpLnVpbnQzMig1OCkuc3RyaW5nKGUuZG9tYWluKSxpfSxuLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLGkpe3JldHVybiB0aGlzLmVuY29kZShlLGkpLmxkZWxpbSgpfSxuLmRlY29kZT1mdW5jdGlvbihlLGkpe2UgaW5zdGFuY2VvZiBwfHwoZT1wLmNyZWF0ZShlKSk7Zm9yKHZhciBzPWk9PT12b2lkIDA/ZS5sZW46ZS5wb3MraSxtPW5ldyBsLm9ubnguTm9kZVByb3RvO2UucG9zPHM7KXt2YXIgZz1lLnVpbnQzMigpO3N3aXRjaChnPj4+Myl7Y2FzZSAxOm0uaW5wdXQmJm0uaW5wdXQubGVuZ3RofHwobS5pbnB1dD1bXSksbS5pbnB1dC5wdXNoKGUuc3RyaW5nKCkpO2JyZWFrO2Nhc2UgMjptLm91dHB1dCYmbS5vdXRwdXQubGVuZ3RofHwobS5vdXRwdXQ9W10pLG0ub3V0cHV0LnB1c2goZS5zdHJpbmcoKSk7YnJlYWs7Y2FzZSAzOm0ubmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNDptLm9wVHlwZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNzptLmRvbWFpbj1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNTptLmF0dHJpYnV0ZSYmbS5hdHRyaWJ1dGUubGVuZ3RofHwobS5hdHRyaWJ1dGU9W10pLG0uYXR0cmlidXRlLnB1c2gobC5vbm54LkF0dHJpYnV0ZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDY6bS5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZnKX19cmV0dXJuIG19LG4uZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgcHx8KGU9bmV3IHAoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LG4udmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpcmV0dXJuIm9iamVjdCBleHBlY3RlZCI7aWYoZS5pbnB1dCE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5wdXQiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnB1dCkpcmV0dXJuImlucHV0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciBpPTA7aTxlLmlucHV0Lmxlbmd0aDsrK2kpaWYoIWQuaXNTdHJpbmcoZS5pbnB1dFtpXSkpcmV0dXJuImlucHV0OiBzdHJpbmdbXSBleHBlY3RlZCJ9aWYoZS5vdXRwdXQhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm91dHB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLm91dHB1dCkpcmV0dXJuIm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiO2ZvcihpPTA7aTxlLm91dHB1dC5sZW5ndGg7KytpKWlmKCFkLmlzU3RyaW5nKGUub3V0cHV0W2ldKSlyZXR1cm4ib3V0cHV0OiBzdHJpbmdbXSBleHBlY3RlZCJ9aWYoZS5uYW1lIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJiFkLmlzU3RyaW5nKGUubmFtZSkpcmV0dXJuIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYoZS5vcFR5cGUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm9wVHlwZSIpJiYhZC5pc1N0cmluZyhlLm9wVHlwZSkpcmV0dXJuIm9wVHlwZTogc3RyaW5nIGV4cGVjdGVkIjtpZihlLmRvbWFpbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJiFkLmlzU3RyaW5nKGUuZG9tYWluKSlyZXR1cm4iZG9tYWluOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKGUuYXR0cmlidXRlIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJhdHRyaWJ1dGUiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGUpKXJldHVybiJhdHRyaWJ1dGU6IGFycmF5IGV4cGVjdGVkIjtmb3IoaT0wO2k8ZS5hdHRyaWJ1dGUubGVuZ3RoOysraSl7dmFyIHM9bC5vbm54LkF0dHJpYnV0ZVByb3RvLnZlcmlmeShlLmF0dHJpYnV0ZVtpXSk7aWYocylyZXR1cm4iYXR0cmlidXRlLiIrc319cmV0dXJuIGUuZG9jU3RyaW5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmIWQuaXNTdHJpbmcoZS5kb2NTdHJpbmcpPyJkb2NTdHJpbmc6IHN0cmluZyBleHBlY3RlZCI6bnVsbH0sbi5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBsLm9ubnguTm9kZVByb3RvKXJldHVybiBlO3ZhciBpPW5ldyBsLm9ubnguTm9kZVByb3RvO2lmKGUuaW5wdXQpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5wdXQpKXRocm93IFR5cGVFcnJvcigiLm9ubnguTm9kZVByb3RvLmlucHV0OiBhcnJheSBleHBlY3RlZCIpO2kuaW5wdXQ9W107Zm9yKHZhciBzPTA7czxlLmlucHV0Lmxlbmd0aDsrK3MpaS5pbnB1dFtzXT1TdHJpbmcoZS5pbnB1dFtzXSl9aWYoZS5vdXRwdXQpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk5vZGVQcm90by5vdXRwdXQ6IGFycmF5IGV4cGVjdGVkIik7Zm9yKGkub3V0cHV0PVtdLHM9MDtzPGUub3V0cHV0Lmxlbmd0aDsrK3MpaS5vdXRwdXRbc109U3RyaW5nKGUub3V0cHV0W3NdKX1pZihlLm5hbWUhPW51bGwmJihpLm5hbWU9U3RyaW5nKGUubmFtZSkpLGUub3BUeXBlIT1udWxsJiYoaS5vcFR5cGU9U3RyaW5nKGUub3BUeXBlKSksZS5kb21haW4hPW51bGwmJihpLmRvbWFpbj1TdHJpbmcoZS5kb21haW4pKSxlLmF0dHJpYnV0ZSl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGUpKXRocm93IFR5cGVFcnJvcigiLm9ubnguTm9kZVByb3RvLmF0dHJpYnV0ZTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IoaS5hdHRyaWJ1dGU9W10scz0wO3M8ZS5hdHRyaWJ1dGUubGVuZ3RoOysrcyl7aWYodHlwZW9mIGUuYXR0cmlidXRlW3NdIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk5vZGVQcm90by5hdHRyaWJ1dGU6IG9iamVjdCBleHBlY3RlZCIpO2kuYXR0cmlidXRlW3NdPWwub25ueC5BdHRyaWJ1dGVQcm90by5mcm9tT2JqZWN0KGUuYXR0cmlidXRlW3NdKX19cmV0dXJuIGUuZG9jU3RyaW5nIT1udWxsJiYoaS5kb2NTdHJpbmc9U3RyaW5nKGUuZG9jU3RyaW5nKSksaX0sbi50b09iamVjdD1mdW5jdGlvbihlLGkpe2l8fChpPXt9KTt2YXIgcz17fTtpZigoaS5hcnJheXN8fGkuZGVmYXVsdHMpJiYocy5pbnB1dD1bXSxzLm91dHB1dD1bXSxzLmF0dHJpYnV0ZT1bXSksaS5kZWZhdWx0cyYmKHMubmFtZT0iIixzLm9wVHlwZT0iIixzLmRvY1N0cmluZz0iIixzLmRvbWFpbj0iIiksZS5pbnB1dCYmZS5pbnB1dC5sZW5ndGgpe3MuaW5wdXQ9W107Zm9yKHZhciBtPTA7bTxlLmlucHV0Lmxlbmd0aDsrK20pcy5pbnB1dFttXT1lLmlucHV0W21dfWlmKGUub3V0cHV0JiZlLm91dHB1dC5sZW5ndGgpZm9yKHMub3V0cHV0PVtdLG09MDttPGUub3V0cHV0Lmxlbmd0aDsrK20pcy5vdXRwdXRbbV09ZS5vdXRwdXRbbV07aWYoZS5uYW1lIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihzLm5hbWU9ZS5uYW1lKSxlLm9wVHlwZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgib3BUeXBlIikmJihzLm9wVHlwZT1lLm9wVHlwZSksZS5hdHRyaWJ1dGUmJmUuYXR0cmlidXRlLmxlbmd0aClmb3Iocy5hdHRyaWJ1dGU9W10sbT0wO208ZS5hdHRyaWJ1dGUubGVuZ3RoOysrbSlzLmF0dHJpYnV0ZVttXT1sLm9ubnguQXR0cmlidXRlUHJvdG8udG9PYmplY3QoZS5hdHRyaWJ1dGVbbV0saSk7cmV0dXJuIGUuZG9jU3RyaW5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmKHMuZG9jU3RyaW5nPWUuZG9jU3RyaW5nKSxlLmRvbWFpbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJihzLmRvbWFpbj1lLmRvbWFpbiksc30sbi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxhLnV0aWwudG9KU09OT3B0aW9ucyl9LG59KCksaC5Nb2RlbFByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihlKXtpZih0aGlzLm9wc2V0SW1wb3J0PVtdLHRoaXMubWV0YWRhdGFQcm9wcz1bXSxlKWZvcih2YXIgaT1PYmplY3Qua2V5cyhlKSxzPTA7czxpLmxlbmd0aDsrK3MpZVtpW3NdXSE9bnVsbCYmKHRoaXNbaVtzXV09ZVtpW3NdXSl9cmV0dXJuIG4ucHJvdG90eXBlLmlyVmVyc2lvbj1kLkxvbmc/ZC5Mb25nLmZyb21CaXRzKDAsMCwhMSk6MCxuLnByb3RvdHlwZS5vcHNldEltcG9ydD1kLmVtcHR5QXJyYXksbi5wcm90b3R5cGUucHJvZHVjZXJOYW1lPSIiLG4ucHJvdG90eXBlLnByb2R1Y2VyVmVyc2lvbj0iIixuLnByb3RvdHlwZS5kb21haW49IiIsbi5wcm90b3R5cGUubW9kZWxWZXJzaW9uPWQuTG9uZz9kLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLG4ucHJvdG90eXBlLmRvY1N0cmluZz0iIixuLnByb3RvdHlwZS5ncmFwaD1udWxsLG4ucHJvdG90eXBlLm1ldGFkYXRhUHJvcHM9ZC5lbXB0eUFycmF5LG4uY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbihlKX0sbi5lbmNvZGU9ZnVuY3Rpb24oZSxpKXtpZihpfHwoaT1mLmNyZWF0ZSgpKSxlLmlyVmVyc2lvbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiaXJWZXJzaW9uIikmJmkudWludDMyKDgpLmludDY0KGUuaXJWZXJzaW9uKSxlLnByb2R1Y2VyTmFtZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgicHJvZHVjZXJOYW1lIikmJmkudWludDMyKDE4KS5zdHJpbmcoZS5wcm9kdWNlck5hbWUpLGUucHJvZHVjZXJWZXJzaW9uIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJwcm9kdWNlclZlcnNpb24iKSYmaS51aW50MzIoMjYpLnN0cmluZyhlLnByb2R1Y2VyVmVyc2lvbiksZS5kb21haW4hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiZpLnVpbnQzMigzNCkuc3RyaW5nKGUuZG9tYWluKSxlLm1vZGVsVmVyc2lvbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgibW9kZWxWZXJzaW9uIikmJmkudWludDMyKDQwKS5pbnQ2NChlLm1vZGVsVmVyc2lvbiksZS5kb2NTdHJpbmchPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiZpLnVpbnQzMig1MCkuc3RyaW5nKGUuZG9jU3RyaW5nKSxlLmdyYXBoIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJncmFwaCIpJiZsLm9ubnguR3JhcGhQcm90by5lbmNvZGUoZS5ncmFwaCxpLnVpbnQzMig1OCkuZm9yaygpKS5sZGVsaW0oKSxlLm9wc2V0SW1wb3J0IT1udWxsJiZlLm9wc2V0SW1wb3J0Lmxlbmd0aClmb3IodmFyIHM9MDtzPGUub3BzZXRJbXBvcnQubGVuZ3RoOysrcylsLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLmVuY29kZShlLm9wc2V0SW1wb3J0W3NdLGkudWludDMyKDY2KS5mb3JrKCkpLmxkZWxpbSgpO2lmKGUubWV0YWRhdGFQcm9wcyE9bnVsbCYmZS5tZXRhZGF0YVByb3BzLmxlbmd0aClmb3Iocz0wO3M8ZS5tZXRhZGF0YVByb3BzLmxlbmd0aDsrK3MpbC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUubWV0YWRhdGFQcm9wc1tzXSxpLnVpbnQzMigxMTQpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIGl9LG4uZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsaSl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsaSkubGRlbGltKCl9LG4uZGVjb2RlPWZ1bmN0aW9uKGUsaSl7ZSBpbnN0YW5jZW9mIHB8fChlPXAuY3JlYXRlKGUpKTtmb3IodmFyIHM9aT09PXZvaWQgMD9lLmxlbjplLnBvcytpLG09bmV3IGwub25ueC5Nb2RlbFByb3RvO2UucG9zPHM7KXt2YXIgZz1lLnVpbnQzMigpO3N3aXRjaChnPj4+Myl7Y2FzZSAxOm0uaXJWZXJzaW9uPWUuaW50NjQoKTticmVhaztjYXNlIDg6bS5vcHNldEltcG9ydCYmbS5vcHNldEltcG9ydC5sZW5ndGh8fChtLm9wc2V0SW1wb3J0PVtdKSxtLm9wc2V0SW1wb3J0LnB1c2gobC5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAyOm0ucHJvZHVjZXJOYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAzOm0ucHJvZHVjZXJWZXJzaW9uPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA0Om0uZG9tYWluPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA1Om0ubW9kZWxWZXJzaW9uPWUuaW50NjQoKTticmVhaztjYXNlIDY6bS5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztjYXNlIDc6bS5ncmFwaD1sLm9ubnguR3JhcGhQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDE0Om0ubWV0YWRhdGFQcm9wcyYmbS5tZXRhZGF0YVByb3BzLmxlbmd0aHx8KG0ubWV0YWRhdGFQcm9wcz1bXSksbS5tZXRhZGF0YVByb3BzLnB1c2gobC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3JmcpfX1yZXR1cm4gbX0sbi5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBwfHwoZT1uZXcgcChlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sbi52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbClyZXR1cm4ib2JqZWN0IGV4cGVjdGVkIjtpZihlLmlyVmVyc2lvbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiaXJWZXJzaW9uIikmJiEoZC5pc0ludGVnZXIoZS5pclZlcnNpb24pfHxlLmlyVmVyc2lvbiYmZC5pc0ludGVnZXIoZS5pclZlcnNpb24ubG93KSYmZC5pc0ludGVnZXIoZS5pclZlcnNpb24uaGlnaCkpKXJldHVybiJpclZlcnNpb246IGludGVnZXJ8TG9uZyBleHBlY3RlZCI7aWYoZS5vcHNldEltcG9ydCE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgib3BzZXRJbXBvcnQiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5vcHNldEltcG9ydCkpcmV0dXJuIm9wc2V0SW1wb3J0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciBpPTA7aTxlLm9wc2V0SW1wb3J0Lmxlbmd0aDsrK2kpaWYocz1sLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLnZlcmlmeShlLm9wc2V0SW1wb3J0W2ldKSlyZXR1cm4ib3BzZXRJbXBvcnQuIitzfWlmKGUucHJvZHVjZXJOYW1lIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJwcm9kdWNlck5hbWUiKSYmIWQuaXNTdHJpbmcoZS5wcm9kdWNlck5hbWUpKXJldHVybiJwcm9kdWNlck5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYoZS5wcm9kdWNlclZlcnNpb24hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInByb2R1Y2VyVmVyc2lvbiIpJiYhZC5pc1N0cmluZyhlLnByb2R1Y2VyVmVyc2lvbikpcmV0dXJuInByb2R1Y2VyVmVyc2lvbjogc3RyaW5nIGV4cGVjdGVkIjtpZihlLmRvbWFpbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJiFkLmlzU3RyaW5nKGUuZG9tYWluKSlyZXR1cm4iZG9tYWluOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKGUubW9kZWxWZXJzaW9uIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJtb2RlbFZlcnNpb24iKSYmIShkLmlzSW50ZWdlcihlLm1vZGVsVmVyc2lvbil8fGUubW9kZWxWZXJzaW9uJiZkLmlzSW50ZWdlcihlLm1vZGVsVmVyc2lvbi5sb3cpJiZkLmlzSW50ZWdlcihlLm1vZGVsVmVyc2lvbi5oaWdoKSkpcmV0dXJuIm1vZGVsVmVyc2lvbjogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjtpZihlLmRvY1N0cmluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFkLmlzU3RyaW5nKGUuZG9jU3RyaW5nKSlyZXR1cm4iZG9jU3RyaW5nOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKGUuZ3JhcGghPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImdyYXBoIikmJihzPWwub25ueC5HcmFwaFByb3RvLnZlcmlmeShlLmdyYXBoKSkpcmV0dXJuImdyYXBoLiIrcztpZihlLm1ldGFkYXRhUHJvcHMhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm1ldGFkYXRhUHJvcHMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5tZXRhZGF0YVByb3BzKSlyZXR1cm4ibWV0YWRhdGFQcm9wczogYXJyYXkgZXhwZWN0ZWQiO2ZvcihpPTA7aTxlLm1ldGFkYXRhUHJvcHMubGVuZ3RoOysraSl7dmFyIHM7aWYocz1sLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by52ZXJpZnkoZS5tZXRhZGF0YVByb3BzW2ldKSlyZXR1cm4ibWV0YWRhdGFQcm9wcy4iK3N9fXJldHVybiBudWxsfSxuLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGwub25ueC5Nb2RlbFByb3RvKXJldHVybiBlO3ZhciBpPW5ldyBsLm9ubnguTW9kZWxQcm90bztpZihlLmlyVmVyc2lvbiE9bnVsbCYmKGQuTG9uZz8oaS5pclZlcnNpb249ZC5Mb25nLmZyb21WYWx1ZShlLmlyVmVyc2lvbikpLnVuc2lnbmVkPSExOnR5cGVvZiBlLmlyVmVyc2lvbj09InN0cmluZyI/aS5pclZlcnNpb249cGFyc2VJbnQoZS5pclZlcnNpb24sMTApOnR5cGVvZiBlLmlyVmVyc2lvbj09Im51bWJlciI/aS5pclZlcnNpb249ZS5pclZlcnNpb246dHlwZW9mIGUuaXJWZXJzaW9uPT0ib2JqZWN0IiYmKGkuaXJWZXJzaW9uPW5ldyBkLkxvbmdCaXRzKGUuaXJWZXJzaW9uLmxvdz4+PjAsZS5pclZlcnNpb24uaGlnaD4+PjApLnRvTnVtYmVyKCkpKSxlLm9wc2V0SW1wb3J0KXtpZighQXJyYXkuaXNBcnJheShlLm9wc2V0SW1wb3J0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8ub3BzZXRJbXBvcnQ6IGFycmF5IGV4cGVjdGVkIik7aS5vcHNldEltcG9ydD1bXTtmb3IodmFyIHM9MDtzPGUub3BzZXRJbXBvcnQubGVuZ3RoOysrcyl7aWYodHlwZW9mIGUub3BzZXRJbXBvcnRbc10hPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5vcHNldEltcG9ydDogb2JqZWN0IGV4cGVjdGVkIik7aS5vcHNldEltcG9ydFtzXT1sLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLmZyb21PYmplY3QoZS5vcHNldEltcG9ydFtzXSl9fWlmKGUucHJvZHVjZXJOYW1lIT1udWxsJiYoaS5wcm9kdWNlck5hbWU9U3RyaW5nKGUucHJvZHVjZXJOYW1lKSksZS5wcm9kdWNlclZlcnNpb24hPW51bGwmJihpLnByb2R1Y2VyVmVyc2lvbj1TdHJpbmcoZS5wcm9kdWNlclZlcnNpb24pKSxlLmRvbWFpbiE9bnVsbCYmKGkuZG9tYWluPVN0cmluZyhlLmRvbWFpbikpLGUubW9kZWxWZXJzaW9uIT1udWxsJiYoZC5Mb25nPyhpLm1vZGVsVmVyc2lvbj1kLkxvbmcuZnJvbVZhbHVlKGUubW9kZWxWZXJzaW9uKSkudW5zaWduZWQ9ITE6dHlwZW9mIGUubW9kZWxWZXJzaW9uPT0ic3RyaW5nIj9pLm1vZGVsVmVyc2lvbj1wYXJzZUludChlLm1vZGVsVmVyc2lvbiwxMCk6dHlwZW9mIGUubW9kZWxWZXJzaW9uPT0ibnVtYmVyIj9pLm1vZGVsVmVyc2lvbj1lLm1vZGVsVmVyc2lvbjp0eXBlb2YgZS5tb2RlbFZlcnNpb249PSJvYmplY3QiJiYoaS5tb2RlbFZlcnNpb249bmV3IGQuTG9uZ0JpdHMoZS5tb2RlbFZlcnNpb24ubG93Pj4+MCxlLm1vZGVsVmVyc2lvbi5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLGUuZG9jU3RyaW5nIT1udWxsJiYoaS5kb2NTdHJpbmc9U3RyaW5nKGUuZG9jU3RyaW5nKSksZS5ncmFwaCE9bnVsbCl7aWYodHlwZW9mIGUuZ3JhcGghPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5ncmFwaDogb2JqZWN0IGV4cGVjdGVkIik7aS5ncmFwaD1sLm9ubnguR3JhcGhQcm90by5mcm9tT2JqZWN0KGUuZ3JhcGgpfWlmKGUubWV0YWRhdGFQcm9wcyl7aWYoIUFycmF5LmlzQXJyYXkoZS5tZXRhZGF0YVByb3BzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8ubWV0YWRhdGFQcm9wczogYXJyYXkgZXhwZWN0ZWQiKTtmb3IoaS5tZXRhZGF0YVByb3BzPVtdLHM9MDtzPGUubWV0YWRhdGFQcm9wcy5sZW5ndGg7KytzKXtpZih0eXBlb2YgZS5tZXRhZGF0YVByb3BzW3NdIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8ubWV0YWRhdGFQcm9wczogb2JqZWN0IGV4cGVjdGVkIik7aS5tZXRhZGF0YVByb3BzW3NdPWwub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmZyb21PYmplY3QoZS5tZXRhZGF0YVByb3BzW3NdKX19cmV0dXJuIGl9LG4udG9PYmplY3Q9ZnVuY3Rpb24oZSxpKXtpfHwoaT17fSk7dmFyIHM9e307aWYoKGkuYXJyYXlzfHxpLmRlZmF1bHRzKSYmKHMub3BzZXRJbXBvcnQ9W10scy5tZXRhZGF0YVByb3BzPVtdKSxpLmRlZmF1bHRzKXtpZihkLkxvbmcpe3ZhciBtPW5ldyBkLkxvbmcoMCwwLCExKTtzLmlyVmVyc2lvbj1pLmxvbmdzPT09U3RyaW5nP20udG9TdHJpbmcoKTppLmxvbmdzPT09TnVtYmVyP20udG9OdW1iZXIoKTptfWVsc2Ugcy5pclZlcnNpb249aS5sb25ncz09PVN0cmluZz8iMCI6MDtzLnByb2R1Y2VyTmFtZT0iIixzLnByb2R1Y2VyVmVyc2lvbj0iIixzLmRvbWFpbj0iIixkLkxvbmc/KG09bmV3IGQuTG9uZygwLDAsITEpLHMubW9kZWxWZXJzaW9uPWkubG9uZ3M9PT1TdHJpbmc/bS50b1N0cmluZygpOmkubG9uZ3M9PT1OdW1iZXI/bS50b051bWJlcigpOm0pOnMubW9kZWxWZXJzaW9uPWkubG9uZ3M9PT1TdHJpbmc/IjAiOjAscy5kb2NTdHJpbmc9IiIscy5ncmFwaD1udWxsfWlmKGUuaXJWZXJzaW9uIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJpclZlcnNpb24iKSYmKHR5cGVvZiBlLmlyVmVyc2lvbj09Im51bWJlciI/cy5pclZlcnNpb249aS5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5pclZlcnNpb24pOmUuaXJWZXJzaW9uOnMuaXJWZXJzaW9uPWkubG9uZ3M9PT1TdHJpbmc/ZC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuaXJWZXJzaW9uKTppLmxvbmdzPT09TnVtYmVyP25ldyBkLkxvbmdCaXRzKGUuaXJWZXJzaW9uLmxvdz4+PjAsZS5pclZlcnNpb24uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5pclZlcnNpb24pLGUucHJvZHVjZXJOYW1lIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJwcm9kdWNlck5hbWUiKSYmKHMucHJvZHVjZXJOYW1lPWUucHJvZHVjZXJOYW1lKSxlLnByb2R1Y2VyVmVyc2lvbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgicHJvZHVjZXJWZXJzaW9uIikmJihzLnByb2R1Y2VyVmVyc2lvbj1lLnByb2R1Y2VyVmVyc2lvbiksZS5kb21haW4hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiYocy5kb21haW49ZS5kb21haW4pLGUubW9kZWxWZXJzaW9uIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJtb2RlbFZlcnNpb24iKSYmKHR5cGVvZiBlLm1vZGVsVmVyc2lvbj09Im51bWJlciI/cy5tb2RlbFZlcnNpb249aS5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5tb2RlbFZlcnNpb24pOmUubW9kZWxWZXJzaW9uOnMubW9kZWxWZXJzaW9uPWkubG9uZ3M9PT1TdHJpbmc/ZC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUubW9kZWxWZXJzaW9uKTppLmxvbmdzPT09TnVtYmVyP25ldyBkLkxvbmdCaXRzKGUubW9kZWxWZXJzaW9uLmxvdz4+PjAsZS5tb2RlbFZlcnNpb24uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5tb2RlbFZlcnNpb24pLGUuZG9jU3RyaW5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmKHMuZG9jU3RyaW5nPWUuZG9jU3RyaW5nKSxlLmdyYXBoIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJncmFwaCIpJiYocy5ncmFwaD1sLm9ubnguR3JhcGhQcm90by50b09iamVjdChlLmdyYXBoLGkpKSxlLm9wc2V0SW1wb3J0JiZlLm9wc2V0SW1wb3J0Lmxlbmd0aCl7cy5vcHNldEltcG9ydD1bXTtmb3IodmFyIGc9MDtnPGUub3BzZXRJbXBvcnQubGVuZ3RoOysrZylzLm9wc2V0SW1wb3J0W2ddPWwub25ueC5PcGVyYXRvclNldElkUHJvdG8udG9PYmplY3QoZS5vcHNldEltcG9ydFtnXSxpKX1pZihlLm1ldGFkYXRhUHJvcHMmJmUubWV0YWRhdGFQcm9wcy5sZW5ndGgpZm9yKHMubWV0YWRhdGFQcm9wcz1bXSxnPTA7ZzxlLm1ldGFkYXRhUHJvcHMubGVuZ3RoOysrZylzLm1ldGFkYXRhUHJvcHNbZ109bC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS5tZXRhZGF0YVByb3BzW2ddLGkpO3JldHVybiBzfSxuLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLGEudXRpbC50b0pTT05PcHRpb25zKX0sbn0oKSxoLlN0cmluZ1N0cmluZ0VudHJ5UHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGUpe2lmKGUpZm9yKHZhciBpPU9iamVjdC5rZXlzKGUpLHM9MDtzPGkubGVuZ3RoOysrcyllW2lbc11dIT1udWxsJiYodGhpc1tpW3NdXT1lW2lbc11dKX1yZXR1cm4gbi5wcm90b3R5cGUua2V5PSIiLG4ucHJvdG90eXBlLnZhbHVlPSIiLG4uY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbihlKX0sbi5lbmNvZGU9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gaXx8KGk9Zi5jcmVhdGUoKSksZS5rZXkhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImtleSIpJiZpLnVpbnQzMigxMCkuc3RyaW5nKGUua2V5KSxlLnZhbHVlIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpJiZpLnVpbnQzMigxOCkuc3RyaW5nKGUudmFsdWUpLGl9LG4uZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsaSl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsaSkubGRlbGltKCl9LG4uZGVjb2RlPWZ1bmN0aW9uKGUsaSl7ZSBpbnN0YW5jZW9mIHB8fChlPXAuY3JlYXRlKGUpKTtmb3IodmFyIHM9aT09PXZvaWQgMD9lLmxlbjplLnBvcytpLG09bmV3IGwub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvO2UucG9zPHM7KXt2YXIgZz1lLnVpbnQzMigpO3N3aXRjaChnPj4+Myl7Y2FzZSAxOm0ua2V5PWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAyOm0udmFsdWU9ZS5zdHJpbmcoKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZnKX19cmV0dXJuIG19LG4uZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgcHx8KGU9bmV3IHAoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LG4udmVyaWZ5PWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsPyJvYmplY3QgZXhwZWN0ZWQiOmUua2V5IT1udWxsJiZlLmhhc093blByb3BlcnR5KCJrZXkiKSYmIWQuaXNTdHJpbmcoZS5rZXkpPyJrZXk6IHN0cmluZyBleHBlY3RlZCI6ZS52YWx1ZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKSYmIWQuaXNTdHJpbmcoZS52YWx1ZSk/InZhbHVlOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LG4uZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgbC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8pcmV0dXJuIGU7dmFyIGk9bmV3IGwub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvO3JldHVybiBlLmtleSE9bnVsbCYmKGkua2V5PVN0cmluZyhlLmtleSkpLGUudmFsdWUhPW51bGwmJihpLnZhbHVlPVN0cmluZyhlLnZhbHVlKSksaX0sbi50b09iamVjdD1mdW5jdGlvbihlLGkpe2l8fChpPXt9KTt2YXIgcz17fTtyZXR1cm4gaS5kZWZhdWx0cyYmKHMua2V5PSIiLHMudmFsdWU9IiIpLGUua2V5IT1udWxsJiZlLmhhc093blByb3BlcnR5KCJrZXkiKSYmKHMua2V5PWUua2V5KSxlLnZhbHVlIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpJiYocy52YWx1ZT1lLnZhbHVlKSxzfSxuLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLGEudXRpbC50b0pTT05PcHRpb25zKX0sbn0oKSxoLlRlbnNvckFubm90YXRpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGUpe2lmKHRoaXMucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcz1bXSxlKWZvcih2YXIgaT1PYmplY3Qua2V5cyhlKSxzPTA7czxpLmxlbmd0aDsrK3MpZVtpW3NdXSE9bnVsbCYmKHRoaXNbaVtzXV09ZVtpW3NdXSl9cmV0dXJuIG4ucHJvdG90eXBlLnRlbnNvck5hbWU9IiIsbi5wcm90b3R5cGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcz1kLmVtcHR5QXJyYXksbi5jcmVhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBuKGUpfSxuLmVuY29kZT1mdW5jdGlvbihlLGkpe2lmKGl8fChpPWYuY3JlYXRlKCkpLGUudGVuc29yTmFtZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidGVuc29yTmFtZSIpJiZpLnVpbnQzMigxMCkuc3RyaW5nKGUudGVuc29yTmFtZSksZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzIT1udWxsJiZlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMubGVuZ3RoKWZvcih2YXIgcz0wO3M8ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aDsrK3MpbC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lc1tzXSxpLnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gaX0sbi5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gdGhpcy5lbmNvZGUoZSxpKS5sZGVsaW0oKX0sbi5kZWNvZGU9ZnVuY3Rpb24oZSxpKXtlIGluc3RhbmNlb2YgcHx8KGU9cC5jcmVhdGUoZSkpO2Zvcih2YXIgcz1pPT09dm9pZCAwP2UubGVuOmUucG9zK2ksbT1uZXcgbC5vbm54LlRlbnNvckFubm90YXRpb247ZS5wb3M8czspe3ZhciBnPWUudWludDMyKCk7c3dpdGNoKGc+Pj4zKXtjYXNlIDE6bS50ZW5zb3JOYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAyOm0ucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyYmbS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aHx8KG0ucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcz1bXSksbS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLnB1c2gobC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3JmcpfX1yZXR1cm4gbX0sbi5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBwfHwoZT1uZXcgcChlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sbi52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbClyZXR1cm4ib2JqZWN0IGV4cGVjdGVkIjtpZihlLnRlbnNvck5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInRlbnNvck5hbWUiKSYmIWQuaXNTdHJpbmcoZS50ZW5zb3JOYW1lKSlyZXR1cm4idGVuc29yTmFtZTogc3RyaW5nIGV4cGVjdGVkIjtpZihlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzKSlyZXR1cm4icXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgaT0wO2k8ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aDsrK2kpe3ZhciBzPWwub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbaV0pO2lmKHMpcmV0dXJuInF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMuIitzfX1yZXR1cm4gbnVsbH0sbi5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBsLm9ubnguVGVuc29yQW5ub3RhdGlvbilyZXR1cm4gZTt2YXIgaT1uZXcgbC5vbm54LlRlbnNvckFubm90YXRpb247aWYoZS50ZW5zb3JOYW1lIT1udWxsJiYoaS50ZW5zb3JOYW1lPVN0cmluZyhlLnRlbnNvck5hbWUpKSxlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMpe2lmKCFBcnJheS5pc0FycmF5KGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JBbm5vdGF0aW9uLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM6IGFycmF5IGV4cGVjdGVkIik7aS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdO2Zvcih2YXIgcz0wO3M8ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aDsrK3Mpe2lmKHR5cGVvZiBlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbc10hPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yQW5ub3RhdGlvbi5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzOiBvYmplY3QgZXhwZWN0ZWQiKTtpLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbc109bC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZnJvbU9iamVjdChlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbc10pfX1yZXR1cm4gaX0sbi50b09iamVjdD1mdW5jdGlvbihlLGkpe2l8fChpPXt9KTt2YXIgcz17fTtpZigoaS5hcnJheXN8fGkuZGVmYXVsdHMpJiYocy5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdKSxpLmRlZmF1bHRzJiYocy50ZW5zb3JOYW1lPSIiKSxlLnRlbnNvck5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInRlbnNvck5hbWUiKSYmKHMudGVuc29yTmFtZT1lLnRlbnNvck5hbWUpLGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyYmZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aCl7cy5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdO2Zvcih2YXIgbT0wO208ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aDsrK20pcy5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW21dPWwub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnRvT2JqZWN0KGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lc1ttXSxpKX1yZXR1cm4gc30sbi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxhLnV0aWwudG9KU09OT3B0aW9ucyl9LG59KCksaC5HcmFwaFByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihlKXtpZih0aGlzLm5vZGU9W10sdGhpcy5pbml0aWFsaXplcj1bXSx0aGlzLmlucHV0PVtdLHRoaXMub3V0cHV0PVtdLHRoaXMudmFsdWVJbmZvPVtdLHRoaXMucXVhbnRpemF0aW9uQW5ub3RhdGlvbj1bXSxlKWZvcih2YXIgaT1PYmplY3Qua2V5cyhlKSxzPTA7czxpLmxlbmd0aDsrK3MpZVtpW3NdXSE9bnVsbCYmKHRoaXNbaVtzXV09ZVtpW3NdXSl9cmV0dXJuIG4ucHJvdG90eXBlLm5vZGU9ZC5lbXB0eUFycmF5LG4ucHJvdG90eXBlLm5hbWU9IiIsbi5wcm90b3R5cGUuaW5pdGlhbGl6ZXI9ZC5lbXB0eUFycmF5LG4ucHJvdG90eXBlLmRvY1N0cmluZz0iIixuLnByb3RvdHlwZS5pbnB1dD1kLmVtcHR5QXJyYXksbi5wcm90b3R5cGUub3V0cHV0PWQuZW1wdHlBcnJheSxuLnByb3RvdHlwZS52YWx1ZUluZm89ZC5lbXB0eUFycmF5LG4ucHJvdG90eXBlLnF1YW50aXphdGlvbkFubm90YXRpb249ZC5lbXB0eUFycmF5LG4uY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbihlKX0sbi5lbmNvZGU9ZnVuY3Rpb24oZSxpKXtpZihpfHwoaT1mLmNyZWF0ZSgpKSxlLm5vZGUhPW51bGwmJmUubm9kZS5sZW5ndGgpZm9yKHZhciBzPTA7czxlLm5vZGUubGVuZ3RoOysrcylsLm9ubnguTm9kZVByb3RvLmVuY29kZShlLm5vZGVbc10saS51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7aWYoZS5uYW1lIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJmkudWludDMyKDE4KS5zdHJpbmcoZS5uYW1lKSxlLmluaXRpYWxpemVyIT1udWxsJiZlLmluaXRpYWxpemVyLmxlbmd0aClmb3Iocz0wO3M8ZS5pbml0aWFsaXplci5sZW5ndGg7KytzKWwub25ueC5UZW5zb3JQcm90by5lbmNvZGUoZS5pbml0aWFsaXplcltzXSxpLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtpZihlLmRvY1N0cmluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJmkudWludDMyKDgyKS5zdHJpbmcoZS5kb2NTdHJpbmcpLGUuaW5wdXQhPW51bGwmJmUuaW5wdXQubGVuZ3RoKWZvcihzPTA7czxlLmlucHV0Lmxlbmd0aDsrK3MpbC5vbm54LlZhbHVlSW5mb1Byb3RvLmVuY29kZShlLmlucHV0W3NdLGkudWludDMyKDkwKS5mb3JrKCkpLmxkZWxpbSgpO2lmKGUub3V0cHV0IT1udWxsJiZlLm91dHB1dC5sZW5ndGgpZm9yKHM9MDtzPGUub3V0cHV0Lmxlbmd0aDsrK3MpbC5vbm54LlZhbHVlSW5mb1Byb3RvLmVuY29kZShlLm91dHB1dFtzXSxpLnVpbnQzMig5OCkuZm9yaygpKS5sZGVsaW0oKTtpZihlLnZhbHVlSW5mbyE9bnVsbCYmZS52YWx1ZUluZm8ubGVuZ3RoKWZvcihzPTA7czxlLnZhbHVlSW5mby5sZW5ndGg7KytzKWwub25ueC5WYWx1ZUluZm9Qcm90by5lbmNvZGUoZS52YWx1ZUluZm9bc10saS51aW50MzIoMTA2KS5mb3JrKCkpLmxkZWxpbSgpO2lmKGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbiE9bnVsbCYmZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uLmxlbmd0aClmb3Iocz0wO3M8ZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uLmxlbmd0aDsrK3MpbC5vbm54LlRlbnNvckFubm90YXRpb24uZW5jb2RlKGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbltzXSxpLnVpbnQzMigxMTQpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIGl9LG4uZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsaSl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsaSkubGRlbGltKCl9LG4uZGVjb2RlPWZ1bmN0aW9uKGUsaSl7ZSBpbnN0YW5jZW9mIHB8fChlPXAuY3JlYXRlKGUpKTtmb3IodmFyIHM9aT09PXZvaWQgMD9lLmxlbjplLnBvcytpLG09bmV3IGwub25ueC5HcmFwaFByb3RvO2UucG9zPHM7KXt2YXIgZz1lLnVpbnQzMigpO3N3aXRjaChnPj4+Myl7Y2FzZSAxOm0ubm9kZSYmbS5ub2RlLmxlbmd0aHx8KG0ubm9kZT1bXSksbS5ub2RlLnB1c2gobC5vbm54Lk5vZGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAyOm0ubmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNTptLmluaXRpYWxpemVyJiZtLmluaXRpYWxpemVyLmxlbmd0aHx8KG0uaW5pdGlhbGl6ZXI9W10pLG0uaW5pdGlhbGl6ZXIucHVzaChsLm9ubnguVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTA6bS5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztjYXNlIDExOm0uaW5wdXQmJm0uaW5wdXQubGVuZ3RofHwobS5pbnB1dD1bXSksbS5pbnB1dC5wdXNoKGwub25ueC5WYWx1ZUluZm9Qcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAxMjptLm91dHB1dCYmbS5vdXRwdXQubGVuZ3RofHwobS5vdXRwdXQ9W10pLG0ub3V0cHV0LnB1c2gobC5vbm54LlZhbHVlSW5mb1Byb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDEzOm0udmFsdWVJbmZvJiZtLnZhbHVlSW5mby5sZW5ndGh8fChtLnZhbHVlSW5mbz1bXSksbS52YWx1ZUluZm8ucHVzaChsLm9ubnguVmFsdWVJbmZvUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTQ6bS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uJiZtLnF1YW50aXphdGlvbkFubm90YXRpb24ubGVuZ3RofHwobS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdKSxtLnF1YW50aXphdGlvbkFubm90YXRpb24ucHVzaChsLm9ubnguVGVuc29yQW5ub3RhdGlvbi5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmZyl9fXJldHVybiBtfSxuLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHB8fChlPW5ldyBwKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxuLnZlcmlmeT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXJldHVybiJvYmplY3QgZXhwZWN0ZWQiO2lmKGUubm9kZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgibm9kZSIpKXtpZighQXJyYXkuaXNBcnJheShlLm5vZGUpKXJldHVybiJub2RlOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciBpPTA7aTxlLm5vZGUubGVuZ3RoOysraSlpZihzPWwub25ueC5Ob2RlUHJvdG8udmVyaWZ5KGUubm9kZVtpXSkpcmV0dXJuIm5vZGUuIitzfWlmKGUubmFtZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiYhZC5pc1N0cmluZyhlLm5hbWUpKXJldHVybiJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKGUuaW5pdGlhbGl6ZXIhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImluaXRpYWxpemVyIikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5pdGlhbGl6ZXIpKXJldHVybiJpbml0aWFsaXplcjogYXJyYXkgZXhwZWN0ZWQiO2ZvcihpPTA7aTxlLmluaXRpYWxpemVyLmxlbmd0aDsrK2kpaWYocz1sLm9ubnguVGVuc29yUHJvdG8udmVyaWZ5KGUuaW5pdGlhbGl6ZXJbaV0pKXJldHVybiJpbml0aWFsaXplci4iK3N9aWYoZS5kb2NTdHJpbmchPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhZC5pc1N0cmluZyhlLmRvY1N0cmluZykpcmV0dXJuImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjtpZihlLmlucHV0IT1udWxsJiZlLmhhc093blByb3BlcnR5KCJpbnB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLmlucHV0KSlyZXR1cm4iaW5wdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IoaT0wO2k8ZS5pbnB1dC5sZW5ndGg7KytpKWlmKHM9bC5vbm54LlZhbHVlSW5mb1Byb3RvLnZlcmlmeShlLmlucHV0W2ldKSlyZXR1cm4iaW5wdXQuIitzfWlmKGUub3V0cHV0IT1udWxsJiZlLmhhc093blByb3BlcnR5KCJvdXRwdXQiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5vdXRwdXQpKXJldHVybiJvdXRwdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IoaT0wO2k8ZS5vdXRwdXQubGVuZ3RoOysraSlpZihzPWwub25ueC5WYWx1ZUluZm9Qcm90by52ZXJpZnkoZS5vdXRwdXRbaV0pKXJldHVybiJvdXRwdXQuIitzfWlmKGUudmFsdWVJbmZvIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZUluZm8iKSl7aWYoIUFycmF5LmlzQXJyYXkoZS52YWx1ZUluZm8pKXJldHVybiJ2YWx1ZUluZm86IGFycmF5IGV4cGVjdGVkIjtmb3IoaT0wO2k8ZS52YWx1ZUluZm8ubGVuZ3RoOysraSlpZihzPWwub25ueC5WYWx1ZUluZm9Qcm90by52ZXJpZnkoZS52YWx1ZUluZm9baV0pKXJldHVybiJ2YWx1ZUluZm8uIitzfWlmKGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgicXVhbnRpemF0aW9uQW5ub3RhdGlvbiIpKXtpZighQXJyYXkuaXNBcnJheShlLnF1YW50aXphdGlvbkFubm90YXRpb24pKXJldHVybiJxdWFudGl6YXRpb25Bbm5vdGF0aW9uOiBhcnJheSBleHBlY3RlZCI7Zm9yKGk9MDtpPGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGg7KytpKXt2YXIgcztpZihzPWwub25ueC5UZW5zb3JBbm5vdGF0aW9uLnZlcmlmeShlLnF1YW50aXphdGlvbkFubm90YXRpb25baV0pKXJldHVybiJxdWFudGl6YXRpb25Bbm5vdGF0aW9uLiIrc319cmV0dXJuIG51bGx9LG4uZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgbC5vbm54LkdyYXBoUHJvdG8pcmV0dXJuIGU7dmFyIGk9bmV3IGwub25ueC5HcmFwaFByb3RvO2lmKGUubm9kZSl7aWYoIUFycmF5LmlzQXJyYXkoZS5ub2RlKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8ubm9kZTogYXJyYXkgZXhwZWN0ZWQiKTtpLm5vZGU9W107Zm9yKHZhciBzPTA7czxlLm5vZGUubGVuZ3RoOysrcyl7aWYodHlwZW9mIGUubm9kZVtzXSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLm5vZGU6IG9iamVjdCBleHBlY3RlZCIpO2kubm9kZVtzXT1sLm9ubnguTm9kZVByb3RvLmZyb21PYmplY3QoZS5ub2RlW3NdKX19aWYoZS5uYW1lIT1udWxsJiYoaS5uYW1lPVN0cmluZyhlLm5hbWUpKSxlLmluaXRpYWxpemVyKXtpZighQXJyYXkuaXNBcnJheShlLmluaXRpYWxpemVyKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8uaW5pdGlhbGl6ZXI6IGFycmF5IGV4cGVjdGVkIik7Zm9yKGkuaW5pdGlhbGl6ZXI9W10scz0wO3M8ZS5pbml0aWFsaXplci5sZW5ndGg7KytzKXtpZih0eXBlb2YgZS5pbml0aWFsaXplcltzXSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLmluaXRpYWxpemVyOiBvYmplY3QgZXhwZWN0ZWQiKTtpLmluaXRpYWxpemVyW3NdPWwub25ueC5UZW5zb3JQcm90by5mcm9tT2JqZWN0KGUuaW5pdGlhbGl6ZXJbc10pfX1pZihlLmRvY1N0cmluZyE9bnVsbCYmKGkuZG9jU3RyaW5nPVN0cmluZyhlLmRvY1N0cmluZykpLGUuaW5wdXQpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5wdXQpKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5pbnB1dDogYXJyYXkgZXhwZWN0ZWQiKTtmb3IoaS5pbnB1dD1bXSxzPTA7czxlLmlucHV0Lmxlbmd0aDsrK3Mpe2lmKHR5cGVvZiBlLmlucHV0W3NdIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8uaW5wdXQ6IG9iamVjdCBleHBlY3RlZCIpO2kuaW5wdXRbc109bC5vbm54LlZhbHVlSW5mb1Byb3RvLmZyb21PYmplY3QoZS5pbnB1dFtzXSl9fWlmKGUub3V0cHV0KXtpZighQXJyYXkuaXNBcnJheShlLm91dHB1dCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiKTtmb3IoaS5vdXRwdXQ9W10scz0wO3M8ZS5vdXRwdXQubGVuZ3RoOysrcyl7aWYodHlwZW9mIGUub3V0cHV0W3NdIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8ub3V0cHV0OiBvYmplY3QgZXhwZWN0ZWQiKTtpLm91dHB1dFtzXT1sLm9ubnguVmFsdWVJbmZvUHJvdG8uZnJvbU9iamVjdChlLm91dHB1dFtzXSl9fWlmKGUudmFsdWVJbmZvKXtpZighQXJyYXkuaXNBcnJheShlLnZhbHVlSW5mbykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnZhbHVlSW5mbzogYXJyYXkgZXhwZWN0ZWQiKTtmb3IoaS52YWx1ZUluZm89W10scz0wO3M8ZS52YWx1ZUluZm8ubGVuZ3RoOysrcyl7aWYodHlwZW9mIGUudmFsdWVJbmZvW3NdIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8udmFsdWVJbmZvOiBvYmplY3QgZXhwZWN0ZWQiKTtpLnZhbHVlSW5mb1tzXT1sLm9ubnguVmFsdWVJbmZvUHJvdG8uZnJvbU9iamVjdChlLnZhbHVlSW5mb1tzXSl9fWlmKGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbil7aWYoIUFycmF5LmlzQXJyYXkoZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8ucXVhbnRpemF0aW9uQW5ub3RhdGlvbjogYXJyYXkgZXhwZWN0ZWQiKTtmb3IoaS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdLHM9MDtzPGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGg7KytzKXtpZih0eXBlb2YgZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uW3NdIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8ucXVhbnRpemF0aW9uQW5ub3RhdGlvbjogb2JqZWN0IGV4cGVjdGVkIik7aS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uW3NdPWwub25ueC5UZW5zb3JBbm5vdGF0aW9uLmZyb21PYmplY3QoZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uW3NdKX19cmV0dXJuIGl9LG4udG9PYmplY3Q9ZnVuY3Rpb24oZSxpKXtpfHwoaT17fSk7dmFyIHM9e307aWYoKGkuYXJyYXlzfHxpLmRlZmF1bHRzKSYmKHMubm9kZT1bXSxzLmluaXRpYWxpemVyPVtdLHMuaW5wdXQ9W10scy5vdXRwdXQ9W10scy52YWx1ZUluZm89W10scy5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdKSxpLmRlZmF1bHRzJiYocy5uYW1lPSIiLHMuZG9jU3RyaW5nPSIiKSxlLm5vZGUmJmUubm9kZS5sZW5ndGgpe3Mubm9kZT1bXTtmb3IodmFyIG09MDttPGUubm9kZS5sZW5ndGg7KyttKXMubm9kZVttXT1sLm9ubnguTm9kZVByb3RvLnRvT2JqZWN0KGUubm9kZVttXSxpKX1pZihlLm5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKHMubmFtZT1lLm5hbWUpLGUuaW5pdGlhbGl6ZXImJmUuaW5pdGlhbGl6ZXIubGVuZ3RoKWZvcihzLmluaXRpYWxpemVyPVtdLG09MDttPGUuaW5pdGlhbGl6ZXIubGVuZ3RoOysrbSlzLmluaXRpYWxpemVyW21dPWwub25ueC5UZW5zb3JQcm90by50b09iamVjdChlLmluaXRpYWxpemVyW21dLGkpO2lmKGUuZG9jU3RyaW5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmKHMuZG9jU3RyaW5nPWUuZG9jU3RyaW5nKSxlLmlucHV0JiZlLmlucHV0Lmxlbmd0aClmb3Iocy5pbnB1dD1bXSxtPTA7bTxlLmlucHV0Lmxlbmd0aDsrK20pcy5pbnB1dFttXT1sLm9ubnguVmFsdWVJbmZvUHJvdG8udG9PYmplY3QoZS5pbnB1dFttXSxpKTtpZihlLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoKWZvcihzLm91dHB1dD1bXSxtPTA7bTxlLm91dHB1dC5sZW5ndGg7KyttKXMub3V0cHV0W21dPWwub25ueC5WYWx1ZUluZm9Qcm90by50b09iamVjdChlLm91dHB1dFttXSxpKTtpZihlLnZhbHVlSW5mbyYmZS52YWx1ZUluZm8ubGVuZ3RoKWZvcihzLnZhbHVlSW5mbz1bXSxtPTA7bTxlLnZhbHVlSW5mby5sZW5ndGg7KyttKXMudmFsdWVJbmZvW21dPWwub25ueC5WYWx1ZUluZm9Qcm90by50b09iamVjdChlLnZhbHVlSW5mb1ttXSxpKTtpZihlLnF1YW50aXphdGlvbkFubm90YXRpb24mJmUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGgpZm9yKHMucXVhbnRpemF0aW9uQW5ub3RhdGlvbj1bXSxtPTA7bTxlLnF1YW50aXphdGlvbkFubm90YXRpb24ubGVuZ3RoOysrbSlzLnF1YW50aXphdGlvbkFubm90YXRpb25bbV09bC5vbm54LlRlbnNvckFubm90YXRpb24udG9PYmplY3QoZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uW21dLGkpO3JldHVybiBzfSxuLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLGEudXRpbC50b0pTT05PcHRpb25zKX0sbn0oKSxoLlRlbnNvclByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihlKXtpZih0aGlzLmRpbXM9W10sdGhpcy5mbG9hdERhdGE9W10sdGhpcy5pbnQzMkRhdGE9W10sdGhpcy5zdHJpbmdEYXRhPVtdLHRoaXMuaW50NjREYXRhPVtdLHRoaXMuZXh0ZXJuYWxEYXRhPVtdLHRoaXMuZG91YmxlRGF0YT1bXSx0aGlzLnVpbnQ2NERhdGE9W10sZSlmb3IodmFyIGk9T2JqZWN0LmtleXMoZSkscz0wO3M8aS5sZW5ndGg7KytzKWVbaVtzXV0hPW51bGwmJih0aGlzW2lbc11dPWVbaVtzXV0pfXJldHVybiBuLnByb3RvdHlwZS5kaW1zPWQuZW1wdHlBcnJheSxuLnByb3RvdHlwZS5kYXRhVHlwZT0wLG4ucHJvdG90eXBlLnNlZ21lbnQ9bnVsbCxuLnByb3RvdHlwZS5mbG9hdERhdGE9ZC5lbXB0eUFycmF5LG4ucHJvdG90eXBlLmludDMyRGF0YT1kLmVtcHR5QXJyYXksbi5wcm90b3R5cGUuc3RyaW5nRGF0YT1kLmVtcHR5QXJyYXksbi5wcm90b3R5cGUuaW50NjREYXRhPWQuZW1wdHlBcnJheSxuLnByb3RvdHlwZS5uYW1lPSIiLG4ucHJvdG90eXBlLmRvY1N0cmluZz0iIixuLnByb3RvdHlwZS5yYXdEYXRhPWQubmV3QnVmZmVyKFtdKSxuLnByb3RvdHlwZS5leHRlcm5hbERhdGE9ZC5lbXB0eUFycmF5LG4ucHJvdG90eXBlLmRhdGFMb2NhdGlvbj0wLG4ucHJvdG90eXBlLmRvdWJsZURhdGE9ZC5lbXB0eUFycmF5LG4ucHJvdG90eXBlLnVpbnQ2NERhdGE9ZC5lbXB0eUFycmF5LG4uY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbihlKX0sbi5lbmNvZGU9ZnVuY3Rpb24oZSxpKXtpZihpfHwoaT1mLmNyZWF0ZSgpKSxlLmRpbXMhPW51bGwmJmUuZGltcy5sZW5ndGgpe2kudWludDMyKDEwKS5mb3JrKCk7Zm9yKHZhciBzPTA7czxlLmRpbXMubGVuZ3RoOysrcylpLmludDY0KGUuZGltc1tzXSk7aS5sZGVsaW0oKX1pZihlLmRhdGFUeXBlIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkYXRhVHlwZSIpJiZpLnVpbnQzMigxNikuaW50MzIoZS5kYXRhVHlwZSksZS5zZWdtZW50IT1udWxsJiZlLmhhc093blByb3BlcnR5KCJzZWdtZW50IikmJmwub25ueC5UZW5zb3JQcm90by5TZWdtZW50LmVuY29kZShlLnNlZ21lbnQsaS51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCksZS5mbG9hdERhdGEhPW51bGwmJmUuZmxvYXREYXRhLmxlbmd0aCl7Zm9yKGkudWludDMyKDM0KS5mb3JrKCkscz0wO3M8ZS5mbG9hdERhdGEubGVuZ3RoOysrcylpLmZsb2F0KGUuZmxvYXREYXRhW3NdKTtpLmxkZWxpbSgpfWlmKGUuaW50MzJEYXRhIT1udWxsJiZlLmludDMyRGF0YS5sZW5ndGgpe2ZvcihpLnVpbnQzMig0MikuZm9yaygpLHM9MDtzPGUuaW50MzJEYXRhLmxlbmd0aDsrK3MpaS5pbnQzMihlLmludDMyRGF0YVtzXSk7aS5sZGVsaW0oKX1pZihlLnN0cmluZ0RhdGEhPW51bGwmJmUuc3RyaW5nRGF0YS5sZW5ndGgpZm9yKHM9MDtzPGUuc3RyaW5nRGF0YS5sZW5ndGg7KytzKWkudWludDMyKDUwKS5ieXRlcyhlLnN0cmluZ0RhdGFbc10pO2lmKGUuaW50NjREYXRhIT1udWxsJiZlLmludDY0RGF0YS5sZW5ndGgpe2ZvcihpLnVpbnQzMig1OCkuZm9yaygpLHM9MDtzPGUuaW50NjREYXRhLmxlbmd0aDsrK3MpaS5pbnQ2NChlLmludDY0RGF0YVtzXSk7aS5sZGVsaW0oKX1pZihlLm5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmaS51aW50MzIoNjYpLnN0cmluZyhlLm5hbWUpLGUucmF3RGF0YSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgicmF3RGF0YSIpJiZpLnVpbnQzMig3NCkuYnl0ZXMoZS5yYXdEYXRhKSxlLmRvdWJsZURhdGEhPW51bGwmJmUuZG91YmxlRGF0YS5sZW5ndGgpe2ZvcihpLnVpbnQzMig4MikuZm9yaygpLHM9MDtzPGUuZG91YmxlRGF0YS5sZW5ndGg7KytzKWkuZG91YmxlKGUuZG91YmxlRGF0YVtzXSk7aS5sZGVsaW0oKX1pZihlLnVpbnQ2NERhdGEhPW51bGwmJmUudWludDY0RGF0YS5sZW5ndGgpe2ZvcihpLnVpbnQzMig5MCkuZm9yaygpLHM9MDtzPGUudWludDY0RGF0YS5sZW5ndGg7KytzKWkudWludDY0KGUudWludDY0RGF0YVtzXSk7aS5sZGVsaW0oKX1pZihlLmRvY1N0cmluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJmkudWludDMyKDk4KS5zdHJpbmcoZS5kb2NTdHJpbmcpLGUuZXh0ZXJuYWxEYXRhIT1udWxsJiZlLmV4dGVybmFsRGF0YS5sZW5ndGgpZm9yKHM9MDtzPGUuZXh0ZXJuYWxEYXRhLmxlbmd0aDsrK3MpbC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUuZXh0ZXJuYWxEYXRhW3NdLGkudWludDMyKDEwNikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gZS5kYXRhTG9jYXRpb24hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRhdGFMb2NhdGlvbiIpJiZpLnVpbnQzMigxMTIpLmludDMyKGUuZGF0YUxvY2F0aW9uKSxpfSxuLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLGkpe3JldHVybiB0aGlzLmVuY29kZShlLGkpLmxkZWxpbSgpfSxuLmRlY29kZT1mdW5jdGlvbihlLGkpe2UgaW5zdGFuY2VvZiBwfHwoZT1wLmNyZWF0ZShlKSk7Zm9yKHZhciBzPWk9PT12b2lkIDA/ZS5sZW46ZS5wb3MraSxtPW5ldyBsLm9ubnguVGVuc29yUHJvdG87ZS5wb3M8czspe3ZhciBnPWUudWludDMyKCk7c3dpdGNoKGc+Pj4zKXtjYXNlIDE6aWYobS5kaW1zJiZtLmRpbXMubGVuZ3RofHwobS5kaW1zPVtdKSwoNyZnKT09Milmb3IodmFyIF89ZS51aW50MzIoKStlLnBvcztlLnBvczxfOyltLmRpbXMucHVzaChlLmludDY0KCkpO2Vsc2UgbS5kaW1zLnB1c2goZS5pbnQ2NCgpKTticmVhaztjYXNlIDI6bS5kYXRhVHlwZT1lLmludDMyKCk7YnJlYWs7Y2FzZSAzOm0uc2VnbWVudD1sLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudC5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDQ6aWYobS5mbG9hdERhdGEmJm0uZmxvYXREYXRhLmxlbmd0aHx8KG0uZmxvYXREYXRhPVtdKSwoNyZnKT09Milmb3IoXz1lLnVpbnQzMigpK2UucG9zO2UucG9zPF87KW0uZmxvYXREYXRhLnB1c2goZS5mbG9hdCgpKTtlbHNlIG0uZmxvYXREYXRhLnB1c2goZS5mbG9hdCgpKTticmVhaztjYXNlIDU6aWYobS5pbnQzMkRhdGEmJm0uaW50MzJEYXRhLmxlbmd0aHx8KG0uaW50MzJEYXRhPVtdKSwoNyZnKT09Milmb3IoXz1lLnVpbnQzMigpK2UucG9zO2UucG9zPF87KW0uaW50MzJEYXRhLnB1c2goZS5pbnQzMigpKTtlbHNlIG0uaW50MzJEYXRhLnB1c2goZS5pbnQzMigpKTticmVhaztjYXNlIDY6bS5zdHJpbmdEYXRhJiZtLnN0cmluZ0RhdGEubGVuZ3RofHwobS5zdHJpbmdEYXRhPVtdKSxtLnN0cmluZ0RhdGEucHVzaChlLmJ5dGVzKCkpO2JyZWFrO2Nhc2UgNzppZihtLmludDY0RGF0YSYmbS5pbnQ2NERhdGEubGVuZ3RofHwobS5pbnQ2NERhdGE9W10pLCg3JmcpPT0yKWZvcihfPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8XzspbS5pbnQ2NERhdGEucHVzaChlLmludDY0KCkpO2Vsc2UgbS5pbnQ2NERhdGEucHVzaChlLmludDY0KCkpO2JyZWFrO2Nhc2UgODptLm5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDEyOm0uZG9jU3RyaW5nPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA5Om0ucmF3RGF0YT1lLmJ5dGVzKCk7YnJlYWs7Y2FzZSAxMzptLmV4dGVybmFsRGF0YSYmbS5leHRlcm5hbERhdGEubGVuZ3RofHwobS5leHRlcm5hbERhdGE9W10pLG0uZXh0ZXJuYWxEYXRhLnB1c2gobC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTQ6bS5kYXRhTG9jYXRpb249ZS5pbnQzMigpO2JyZWFrO2Nhc2UgMTA6aWYobS5kb3VibGVEYXRhJiZtLmRvdWJsZURhdGEubGVuZ3RofHwobS5kb3VibGVEYXRhPVtdKSwoNyZnKT09Milmb3IoXz1lLnVpbnQzMigpK2UucG9zO2UucG9zPF87KW0uZG91YmxlRGF0YS5wdXNoKGUuZG91YmxlKCkpO2Vsc2UgbS5kb3VibGVEYXRhLnB1c2goZS5kb3VibGUoKSk7YnJlYWs7Y2FzZSAxMTppZihtLnVpbnQ2NERhdGEmJm0udWludDY0RGF0YS5sZW5ndGh8fChtLnVpbnQ2NERhdGE9W10pLCg3JmcpPT0yKWZvcihfPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8XzspbS51aW50NjREYXRhLnB1c2goZS51aW50NjQoKSk7ZWxzZSBtLnVpbnQ2NERhdGEucHVzaChlLnVpbnQ2NCgpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZnKX19cmV0dXJuIG19LG4uZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgcHx8KGU9bmV3IHAoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LG4udmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpcmV0dXJuIm9iamVjdCBleHBlY3RlZCI7aWYoZS5kaW1zIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkaW1zIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZGltcykpcmV0dXJuImRpbXM6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIGk9MDtpPGUuZGltcy5sZW5ndGg7KytpKWlmKCEoZC5pc0ludGVnZXIoZS5kaW1zW2ldKXx8ZS5kaW1zW2ldJiZkLmlzSW50ZWdlcihlLmRpbXNbaV0ubG93KSYmZC5pc0ludGVnZXIoZS5kaW1zW2ldLmhpZ2gpKSlyZXR1cm4iZGltczogaW50ZWdlcnxMb25nW10gZXhwZWN0ZWQifWlmKGUuZGF0YVR5cGUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRhdGFUeXBlIikmJiFkLmlzSW50ZWdlcihlLmRhdGFUeXBlKSlyZXR1cm4iZGF0YVR5cGU6IGludGVnZXIgZXhwZWN0ZWQiO2lmKGUuc2VnbWVudCE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgic2VnbWVudCIpJiYocz1sLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudC52ZXJpZnkoZS5zZWdtZW50KSkpcmV0dXJuInNlZ21lbnQuIitzO2lmKGUuZmxvYXREYXRhIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJmbG9hdERhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5mbG9hdERhdGEpKXJldHVybiJmbG9hdERhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IoaT0wO2k8ZS5mbG9hdERhdGEubGVuZ3RoOysraSlpZih0eXBlb2YgZS5mbG9hdERhdGFbaV0hPSJudW1iZXIiKXJldHVybiJmbG9hdERhdGE6IG51bWJlcltdIGV4cGVjdGVkIn1pZihlLmludDMyRGF0YSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiaW50MzJEYXRhIikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50MzJEYXRhKSlyZXR1cm4iaW50MzJEYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKGk9MDtpPGUuaW50MzJEYXRhLmxlbmd0aDsrK2kpaWYoIWQuaXNJbnRlZ2VyKGUuaW50MzJEYXRhW2ldKSlyZXR1cm4iaW50MzJEYXRhOiBpbnRlZ2VyW10gZXhwZWN0ZWQifWlmKGUuc3RyaW5nRGF0YSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgic3RyaW5nRGF0YSIpKXtpZighQXJyYXkuaXNBcnJheShlLnN0cmluZ0RhdGEpKXJldHVybiJzdHJpbmdEYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKGk9MDtpPGUuc3RyaW5nRGF0YS5sZW5ndGg7KytpKWlmKCEoZS5zdHJpbmdEYXRhW2ldJiZ0eXBlb2YgZS5zdHJpbmdEYXRhW2ldLmxlbmd0aD09Im51bWJlciJ8fGQuaXNTdHJpbmcoZS5zdHJpbmdEYXRhW2ldKSkpcmV0dXJuInN0cmluZ0RhdGE6IGJ1ZmZlcltdIGV4cGVjdGVkIn1pZihlLmludDY0RGF0YSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiaW50NjREYXRhIikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50NjREYXRhKSlyZXR1cm4iaW50NjREYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKGk9MDtpPGUuaW50NjREYXRhLmxlbmd0aDsrK2kpaWYoIShkLmlzSW50ZWdlcihlLmludDY0RGF0YVtpXSl8fGUuaW50NjREYXRhW2ldJiZkLmlzSW50ZWdlcihlLmludDY0RGF0YVtpXS5sb3cpJiZkLmlzSW50ZWdlcihlLmludDY0RGF0YVtpXS5oaWdoKSkpcmV0dXJuImludDY0RGF0YTogaW50ZWdlcnxMb25nW10gZXhwZWN0ZWQifWlmKGUubmFtZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiYhZC5pc1N0cmluZyhlLm5hbWUpKXJldHVybiJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKGUuZG9jU3RyaW5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmIWQuaXNTdHJpbmcoZS5kb2NTdHJpbmcpKXJldHVybiJkb2NTdHJpbmc6IHN0cmluZyBleHBlY3RlZCI7aWYoZS5yYXdEYXRhIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJyYXdEYXRhIikmJiEoZS5yYXdEYXRhJiZ0eXBlb2YgZS5yYXdEYXRhLmxlbmd0aD09Im51bWJlciJ8fGQuaXNTdHJpbmcoZS5yYXdEYXRhKSkpcmV0dXJuInJhd0RhdGE6IGJ1ZmZlciBleHBlY3RlZCI7aWYoZS5leHRlcm5hbERhdGEhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImV4dGVybmFsRGF0YSIpKXtpZighQXJyYXkuaXNBcnJheShlLmV4dGVybmFsRGF0YSkpcmV0dXJuImV4dGVybmFsRGF0YTogYXJyYXkgZXhwZWN0ZWQiO2ZvcihpPTA7aTxlLmV4dGVybmFsRGF0YS5sZW5ndGg7KytpKXt2YXIgcztpZihzPWwub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLmV4dGVybmFsRGF0YVtpXSkpcmV0dXJuImV4dGVybmFsRGF0YS4iK3N9fWlmKGUuZGF0YUxvY2F0aW9uIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkYXRhTG9jYXRpb24iKSlzd2l0Y2goZS5kYXRhTG9jYXRpb24pe2RlZmF1bHQ6cmV0dXJuImRhdGFMb2NhdGlvbjogZW51bSB2YWx1ZSBleHBlY3RlZCI7Y2FzZSAwOmNhc2UgMTp9aWYoZS5kb3VibGVEYXRhIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb3VibGVEYXRhIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZG91YmxlRGF0YSkpcmV0dXJuImRvdWJsZURhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IoaT0wO2k8ZS5kb3VibGVEYXRhLmxlbmd0aDsrK2kpaWYodHlwZW9mIGUuZG91YmxlRGF0YVtpXSE9Im51bWJlciIpcmV0dXJuImRvdWJsZURhdGE6IG51bWJlcltdIGV4cGVjdGVkIn1pZihlLnVpbnQ2NERhdGEhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInVpbnQ2NERhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS51aW50NjREYXRhKSlyZXR1cm4idWludDY0RGF0YTogYXJyYXkgZXhwZWN0ZWQiO2ZvcihpPTA7aTxlLnVpbnQ2NERhdGEubGVuZ3RoOysraSlpZighKGQuaXNJbnRlZ2VyKGUudWludDY0RGF0YVtpXSl8fGUudWludDY0RGF0YVtpXSYmZC5pc0ludGVnZXIoZS51aW50NjREYXRhW2ldLmxvdykmJmQuaXNJbnRlZ2VyKGUudWludDY0RGF0YVtpXS5oaWdoKSkpcmV0dXJuInVpbnQ2NERhdGE6IGludGVnZXJ8TG9uZ1tdIGV4cGVjdGVkIn1yZXR1cm4gbnVsbH0sbi5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBsLm9ubnguVGVuc29yUHJvdG8pcmV0dXJuIGU7dmFyIGk9bmV3IGwub25ueC5UZW5zb3JQcm90bztpZihlLmRpbXMpe2lmKCFBcnJheS5pc0FycmF5KGUuZGltcykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5kaW1zOiBhcnJheSBleHBlY3RlZCIpO2kuZGltcz1bXTtmb3IodmFyIHM9MDtzPGUuZGltcy5sZW5ndGg7KytzKWQuTG9uZz8oaS5kaW1zW3NdPWQuTG9uZy5mcm9tVmFsdWUoZS5kaW1zW3NdKSkudW5zaWduZWQ9ITE6dHlwZW9mIGUuZGltc1tzXT09InN0cmluZyI/aS5kaW1zW3NdPXBhcnNlSW50KGUuZGltc1tzXSwxMCk6dHlwZW9mIGUuZGltc1tzXT09Im51bWJlciI/aS5kaW1zW3NdPWUuZGltc1tzXTp0eXBlb2YgZS5kaW1zW3NdPT0ib2JqZWN0IiYmKGkuZGltc1tzXT1uZXcgZC5Mb25nQml0cyhlLmRpbXNbc10ubG93Pj4+MCxlLmRpbXNbc10uaGlnaD4+PjApLnRvTnVtYmVyKCkpfWlmKGUuZGF0YVR5cGUhPW51bGwmJihpLmRhdGFUeXBlPTB8ZS5kYXRhVHlwZSksZS5zZWdtZW50IT1udWxsKXtpZih0eXBlb2YgZS5zZWdtZW50IT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLnNlZ21lbnQ6IG9iamVjdCBleHBlY3RlZCIpO2kuc2VnbWVudD1sLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudC5mcm9tT2JqZWN0KGUuc2VnbWVudCl9aWYoZS5mbG9hdERhdGEpe2lmKCFBcnJheS5pc0FycmF5KGUuZmxvYXREYXRhKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLmZsb2F0RGF0YTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IoaS5mbG9hdERhdGE9W10scz0wO3M8ZS5mbG9hdERhdGEubGVuZ3RoOysrcylpLmZsb2F0RGF0YVtzXT1OdW1iZXIoZS5mbG9hdERhdGFbc10pfWlmKGUuaW50MzJEYXRhKXtpZighQXJyYXkuaXNBcnJheShlLmludDMyRGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5pbnQzMkRhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKGkuaW50MzJEYXRhPVtdLHM9MDtzPGUuaW50MzJEYXRhLmxlbmd0aDsrK3MpaS5pbnQzMkRhdGFbc109MHxlLmludDMyRGF0YVtzXX1pZihlLnN0cmluZ0RhdGEpe2lmKCFBcnJheS5pc0FycmF5KGUuc3RyaW5nRGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5zdHJpbmdEYXRhOiBhcnJheSBleHBlY3RlZCIpO2ZvcihpLnN0cmluZ0RhdGE9W10scz0wO3M8ZS5zdHJpbmdEYXRhLmxlbmd0aDsrK3MpdHlwZW9mIGUuc3RyaW5nRGF0YVtzXT09InN0cmluZyI/ZC5iYXNlNjQuZGVjb2RlKGUuc3RyaW5nRGF0YVtzXSxpLnN0cmluZ0RhdGFbc109ZC5uZXdCdWZmZXIoZC5iYXNlNjQubGVuZ3RoKGUuc3RyaW5nRGF0YVtzXSkpLDApOmUuc3RyaW5nRGF0YVtzXS5sZW5ndGgmJihpLnN0cmluZ0RhdGFbc109ZS5zdHJpbmdEYXRhW3NdKX1pZihlLmludDY0RGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnQ2NERhdGEpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uaW50NjREYXRhOiBhcnJheSBleHBlY3RlZCIpO2ZvcihpLmludDY0RGF0YT1bXSxzPTA7czxlLmludDY0RGF0YS5sZW5ndGg7KytzKWQuTG9uZz8oaS5pbnQ2NERhdGFbc109ZC5Mb25nLmZyb21WYWx1ZShlLmludDY0RGF0YVtzXSkpLnVuc2lnbmVkPSExOnR5cGVvZiBlLmludDY0RGF0YVtzXT09InN0cmluZyI/aS5pbnQ2NERhdGFbc109cGFyc2VJbnQoZS5pbnQ2NERhdGFbc10sMTApOnR5cGVvZiBlLmludDY0RGF0YVtzXT09Im51bWJlciI/aS5pbnQ2NERhdGFbc109ZS5pbnQ2NERhdGFbc106dHlwZW9mIGUuaW50NjREYXRhW3NdPT0ib2JqZWN0IiYmKGkuaW50NjREYXRhW3NdPW5ldyBkLkxvbmdCaXRzKGUuaW50NjREYXRhW3NdLmxvdz4+PjAsZS5pbnQ2NERhdGFbc10uaGlnaD4+PjApLnRvTnVtYmVyKCkpfWlmKGUubmFtZSE9bnVsbCYmKGkubmFtZT1TdHJpbmcoZS5uYW1lKSksZS5kb2NTdHJpbmchPW51bGwmJihpLmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxlLnJhd0RhdGEhPW51bGwmJih0eXBlb2YgZS5yYXdEYXRhPT0ic3RyaW5nIj9kLmJhc2U2NC5kZWNvZGUoZS5yYXdEYXRhLGkucmF3RGF0YT1kLm5ld0J1ZmZlcihkLmJhc2U2NC5sZW5ndGgoZS5yYXdEYXRhKSksMCk6ZS5yYXdEYXRhLmxlbmd0aCYmKGkucmF3RGF0YT1lLnJhd0RhdGEpKSxlLmV4dGVybmFsRGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS5leHRlcm5hbERhdGEpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uZXh0ZXJuYWxEYXRhOiBhcnJheSBleHBlY3RlZCIpO2ZvcihpLmV4dGVybmFsRGF0YT1bXSxzPTA7czxlLmV4dGVybmFsRGF0YS5sZW5ndGg7KytzKXtpZih0eXBlb2YgZS5leHRlcm5hbERhdGFbc10hPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uZXh0ZXJuYWxEYXRhOiBvYmplY3QgZXhwZWN0ZWQiKTtpLmV4dGVybmFsRGF0YVtzXT1sLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5mcm9tT2JqZWN0KGUuZXh0ZXJuYWxEYXRhW3NdKX19c3dpdGNoKGUuZGF0YUxvY2F0aW9uKXtjYXNlIkRFRkFVTFQiOmNhc2UgMDppLmRhdGFMb2NhdGlvbj0wO2JyZWFrO2Nhc2UiRVhURVJOQUwiOmNhc2UgMTppLmRhdGFMb2NhdGlvbj0xfWlmKGUuZG91YmxlRGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS5kb3VibGVEYXRhKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLmRvdWJsZURhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKGkuZG91YmxlRGF0YT1bXSxzPTA7czxlLmRvdWJsZURhdGEubGVuZ3RoOysrcylpLmRvdWJsZURhdGFbc109TnVtYmVyKGUuZG91YmxlRGF0YVtzXSl9aWYoZS51aW50NjREYXRhKXtpZighQXJyYXkuaXNBcnJheShlLnVpbnQ2NERhdGEpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8udWludDY0RGF0YTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IoaS51aW50NjREYXRhPVtdLHM9MDtzPGUudWludDY0RGF0YS5sZW5ndGg7KytzKWQuTG9uZz8oaS51aW50NjREYXRhW3NdPWQuTG9uZy5mcm9tVmFsdWUoZS51aW50NjREYXRhW3NdKSkudW5zaWduZWQ9ITA6dHlwZW9mIGUudWludDY0RGF0YVtzXT09InN0cmluZyI/aS51aW50NjREYXRhW3NdPXBhcnNlSW50KGUudWludDY0RGF0YVtzXSwxMCk6dHlwZW9mIGUudWludDY0RGF0YVtzXT09Im51bWJlciI/aS51aW50NjREYXRhW3NdPWUudWludDY0RGF0YVtzXTp0eXBlb2YgZS51aW50NjREYXRhW3NdPT0ib2JqZWN0IiYmKGkudWludDY0RGF0YVtzXT1uZXcgZC5Mb25nQml0cyhlLnVpbnQ2NERhdGFbc10ubG93Pj4+MCxlLnVpbnQ2NERhdGFbc10uaGlnaD4+PjApLnRvTnVtYmVyKCEwKSl9cmV0dXJuIGl9LG4udG9PYmplY3Q9ZnVuY3Rpb24oZSxpKXtpfHwoaT17fSk7dmFyIHM9e307aWYoKGkuYXJyYXlzfHxpLmRlZmF1bHRzKSYmKHMuZGltcz1bXSxzLmZsb2F0RGF0YT1bXSxzLmludDMyRGF0YT1bXSxzLnN0cmluZ0RhdGE9W10scy5pbnQ2NERhdGE9W10scy5kb3VibGVEYXRhPVtdLHMudWludDY0RGF0YT1bXSxzLmV4dGVybmFsRGF0YT1bXSksaS5kZWZhdWx0cyYmKHMuZGF0YVR5cGU9MCxzLnNlZ21lbnQ9bnVsbCxzLm5hbWU9IiIsaS5ieXRlcz09PVN0cmluZz9zLnJhd0RhdGE9IiI6KHMucmF3RGF0YT1bXSxpLmJ5dGVzIT09QXJyYXkmJihzLnJhd0RhdGE9ZC5uZXdCdWZmZXIocy5yYXdEYXRhKSkpLHMuZG9jU3RyaW5nPSIiLHMuZGF0YUxvY2F0aW9uPWkuZW51bXM9PT1TdHJpbmc/IkRFRkFVTFQiOjApLGUuZGltcyYmZS5kaW1zLmxlbmd0aCl7cy5kaW1zPVtdO2Zvcih2YXIgbT0wO208ZS5kaW1zLmxlbmd0aDsrK20pdHlwZW9mIGUuZGltc1ttXT09Im51bWJlciI/cy5kaW1zW21dPWkubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuZGltc1ttXSk6ZS5kaW1zW21dOnMuZGltc1ttXT1pLmxvbmdzPT09U3RyaW5nP2QuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmRpbXNbbV0pOmkubG9uZ3M9PT1OdW1iZXI/bmV3IGQuTG9uZ0JpdHMoZS5kaW1zW21dLmxvdz4+PjAsZS5kaW1zW21dLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuZGltc1ttXX1pZihlLmRhdGFUeXBlIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkYXRhVHlwZSIpJiYocy5kYXRhVHlwZT1lLmRhdGFUeXBlKSxlLnNlZ21lbnQhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInNlZ21lbnQiKSYmKHMuc2VnbWVudD1sLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudC50b09iamVjdChlLnNlZ21lbnQsaSkpLGUuZmxvYXREYXRhJiZlLmZsb2F0RGF0YS5sZW5ndGgpZm9yKHMuZmxvYXREYXRhPVtdLG09MDttPGUuZmxvYXREYXRhLmxlbmd0aDsrK20pcy5mbG9hdERhdGFbbV09aS5qc29uJiYhaXNGaW5pdGUoZS5mbG9hdERhdGFbbV0pP1N0cmluZyhlLmZsb2F0RGF0YVttXSk6ZS5mbG9hdERhdGFbbV07aWYoZS5pbnQzMkRhdGEmJmUuaW50MzJEYXRhLmxlbmd0aClmb3Iocy5pbnQzMkRhdGE9W10sbT0wO208ZS5pbnQzMkRhdGEubGVuZ3RoOysrbSlzLmludDMyRGF0YVttXT1lLmludDMyRGF0YVttXTtpZihlLnN0cmluZ0RhdGEmJmUuc3RyaW5nRGF0YS5sZW5ndGgpZm9yKHMuc3RyaW5nRGF0YT1bXSxtPTA7bTxlLnN0cmluZ0RhdGEubGVuZ3RoOysrbSlzLnN0cmluZ0RhdGFbbV09aS5ieXRlcz09PVN0cmluZz9kLmJhc2U2NC5lbmNvZGUoZS5zdHJpbmdEYXRhW21dLDAsZS5zdHJpbmdEYXRhW21dLmxlbmd0aCk6aS5ieXRlcz09PUFycmF5P0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuc3RyaW5nRGF0YVttXSk6ZS5zdHJpbmdEYXRhW21dO2lmKGUuaW50NjREYXRhJiZlLmludDY0RGF0YS5sZW5ndGgpZm9yKHMuaW50NjREYXRhPVtdLG09MDttPGUuaW50NjREYXRhLmxlbmd0aDsrK20pdHlwZW9mIGUuaW50NjREYXRhW21dPT0ibnVtYmVyIj9zLmludDY0RGF0YVttXT1pLmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLmludDY0RGF0YVttXSk6ZS5pbnQ2NERhdGFbbV06cy5pbnQ2NERhdGFbbV09aS5sb25ncz09PVN0cmluZz9kLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5pbnQ2NERhdGFbbV0pOmkubG9uZ3M9PT1OdW1iZXI/bmV3IGQuTG9uZ0JpdHMoZS5pbnQ2NERhdGFbbV0ubG93Pj4+MCxlLmludDY0RGF0YVttXS5oaWdoPj4+MCkudG9OdW1iZXIoKTplLmludDY0RGF0YVttXTtpZihlLm5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKHMubmFtZT1lLm5hbWUpLGUucmF3RGF0YSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgicmF3RGF0YSIpJiYocy5yYXdEYXRhPWkuYnl0ZXM9PT1TdHJpbmc/ZC5iYXNlNjQuZW5jb2RlKGUucmF3RGF0YSwwLGUucmF3RGF0YS5sZW5ndGgpOmkuYnl0ZXM9PT1BcnJheT9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnJhd0RhdGEpOmUucmF3RGF0YSksZS5kb3VibGVEYXRhJiZlLmRvdWJsZURhdGEubGVuZ3RoKWZvcihzLmRvdWJsZURhdGE9W10sbT0wO208ZS5kb3VibGVEYXRhLmxlbmd0aDsrK20pcy5kb3VibGVEYXRhW21dPWkuanNvbiYmIWlzRmluaXRlKGUuZG91YmxlRGF0YVttXSk/U3RyaW5nKGUuZG91YmxlRGF0YVttXSk6ZS5kb3VibGVEYXRhW21dO2lmKGUudWludDY0RGF0YSYmZS51aW50NjREYXRhLmxlbmd0aClmb3Iocy51aW50NjREYXRhPVtdLG09MDttPGUudWludDY0RGF0YS5sZW5ndGg7KyttKXR5cGVvZiBlLnVpbnQ2NERhdGFbbV09PSJudW1iZXIiP3MudWludDY0RGF0YVttXT1pLmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLnVpbnQ2NERhdGFbbV0pOmUudWludDY0RGF0YVttXTpzLnVpbnQ2NERhdGFbbV09aS5sb25ncz09PVN0cmluZz9kLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS51aW50NjREYXRhW21dKTppLmxvbmdzPT09TnVtYmVyP25ldyBkLkxvbmdCaXRzKGUudWludDY0RGF0YVttXS5sb3c+Pj4wLGUudWludDY0RGF0YVttXS5oaWdoPj4+MCkudG9OdW1iZXIoITApOmUudWludDY0RGF0YVttXTtpZihlLmRvY1N0cmluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihzLmRvY1N0cmluZz1lLmRvY1N0cmluZyksZS5leHRlcm5hbERhdGEmJmUuZXh0ZXJuYWxEYXRhLmxlbmd0aClmb3Iocy5leHRlcm5hbERhdGE9W10sbT0wO208ZS5leHRlcm5hbERhdGEubGVuZ3RoOysrbSlzLmV4dGVybmFsRGF0YVttXT1sLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by50b09iamVjdChlLmV4dGVybmFsRGF0YVttXSxpKTtyZXR1cm4gZS5kYXRhTG9jYXRpb24hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRhdGFMb2NhdGlvbiIpJiYocy5kYXRhTG9jYXRpb249aS5lbnVtcz09PVN0cmluZz9sLm9ubnguVGVuc29yUHJvdG8uRGF0YUxvY2F0aW9uW2UuZGF0YUxvY2F0aW9uXTplLmRhdGFMb2NhdGlvbiksc30sbi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxhLnV0aWwudG9KU09OT3B0aW9ucyl9LG4uRGF0YVR5cGU9ZnVuY3Rpb24oKXt2YXIgZT17fSxpPU9iamVjdC5jcmVhdGUoZSk7cmV0dXJuIGlbZVswXT0iVU5ERUZJTkVEIl09MCxpW2VbMV09IkZMT0FUIl09MSxpW2VbMl09IlVJTlQ4Il09MixpW2VbM109IklOVDgiXT0zLGlbZVs0XT0iVUlOVDE2Il09NCxpW2VbNV09IklOVDE2Il09NSxpW2VbNl09IklOVDMyIl09NixpW2VbN109IklOVDY0Il09NyxpW2VbOF09IlNUUklORyJdPTgsaVtlWzldPSJCT09MIl09OSxpW2VbMTBdPSJGTE9BVDE2Il09MTAsaVtlWzExXT0iRE9VQkxFIl09MTEsaVtlWzEyXT0iVUlOVDMyIl09MTIsaVtlWzEzXT0iVUlOVDY0Il09MTMsaVtlWzE0XT0iQ09NUExFWDY0Il09MTQsaVtlWzE1XT0iQ09NUExFWDEyOCJdPTE1LGlbZVsxNl09IkJGTE9BVDE2Il09MTYsaX0oKSxuLlNlZ21lbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGkpe2lmKGkpZm9yKHZhciBzPU9iamVjdC5rZXlzKGkpLG09MDttPHMubGVuZ3RoOysrbSlpW3NbbV1dIT1udWxsJiYodGhpc1tzW21dXT1pW3NbbV1dKX1yZXR1cm4gZS5wcm90b3R5cGUuYmVnaW49ZC5Mb25nP2QuTG9uZy5mcm9tQml0cygwLDAsITEpOjAsZS5wcm90b3R5cGUuZW5kPWQuTG9uZz9kLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUuY3JlYXRlPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcgZShpKX0sZS5lbmNvZGU9ZnVuY3Rpb24oaSxzKXtyZXR1cm4gc3x8KHM9Zi5jcmVhdGUoKSksaS5iZWdpbiE9bnVsbCYmaS5oYXNPd25Qcm9wZXJ0eSgiYmVnaW4iKSYmcy51aW50MzIoOCkuaW50NjQoaS5iZWdpbiksaS5lbmQhPW51bGwmJmkuaGFzT3duUHJvcGVydHkoImVuZCIpJiZzLnVpbnQzMigxNikuaW50NjQoaS5lbmQpLHN9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGkscyl7cmV0dXJuIHRoaXMuZW5jb2RlKGkscykubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGkscyl7aSBpbnN0YW5jZW9mIHB8fChpPXAuY3JlYXRlKGkpKTtmb3IodmFyIG09cz09PXZvaWQgMD9pLmxlbjppLnBvcytzLGc9bmV3IGwub25ueC5UZW5zb3JQcm90by5TZWdtZW50O2kucG9zPG07KXt2YXIgXz1pLnVpbnQzMigpO3N3aXRjaChfPj4+Myl7Y2FzZSAxOmcuYmVnaW49aS5pbnQ2NCgpO2JyZWFrO2Nhc2UgMjpnLmVuZD1pLmludDY0KCk7YnJlYWs7ZGVmYXVsdDppLnNraXBUeXBlKDcmXyl9fXJldHVybiBnfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihpKXtyZXR1cm4gaSBpbnN0YW5jZW9mIHB8fChpPW5ldyBwKGkpKSx0aGlzLmRlY29kZShpLGkudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihpKXtyZXR1cm4gdHlwZW9mIGkhPSJvYmplY3QifHxpPT09bnVsbD8ib2JqZWN0IGV4cGVjdGVkIjppLmJlZ2luIT1udWxsJiZpLmhhc093blByb3BlcnR5KCJiZWdpbiIpJiYhKGQuaXNJbnRlZ2VyKGkuYmVnaW4pfHxpLmJlZ2luJiZkLmlzSW50ZWdlcihpLmJlZ2luLmxvdykmJmQuaXNJbnRlZ2VyKGkuYmVnaW4uaGlnaCkpPyJiZWdpbjogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjppLmVuZCE9bnVsbCYmaS5oYXNPd25Qcm9wZXJ0eSgiZW5kIikmJiEoZC5pc0ludGVnZXIoaS5lbmQpfHxpLmVuZCYmZC5pc0ludGVnZXIoaS5lbmQubG93KSYmZC5pc0ludGVnZXIoaS5lbmQuaGlnaCkpPyJlbmQ6IGludGVnZXJ8TG9uZyBleHBlY3RlZCI6bnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGkpe2lmKGkgaW5zdGFuY2VvZiBsLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudClyZXR1cm4gaTt2YXIgcz1uZXcgbC5vbm54LlRlbnNvclByb3RvLlNlZ21lbnQ7cmV0dXJuIGkuYmVnaW4hPW51bGwmJihkLkxvbmc/KHMuYmVnaW49ZC5Mb25nLmZyb21WYWx1ZShpLmJlZ2luKSkudW5zaWduZWQ9ITE6dHlwZW9mIGkuYmVnaW49PSJzdHJpbmciP3MuYmVnaW49cGFyc2VJbnQoaS5iZWdpbiwxMCk6dHlwZW9mIGkuYmVnaW49PSJudW1iZXIiP3MuYmVnaW49aS5iZWdpbjp0eXBlb2YgaS5iZWdpbj09Im9iamVjdCImJihzLmJlZ2luPW5ldyBkLkxvbmdCaXRzKGkuYmVnaW4ubG93Pj4+MCxpLmJlZ2luLmhpZ2g+Pj4wKS50b051bWJlcigpKSksaS5lbmQhPW51bGwmJihkLkxvbmc/KHMuZW5kPWQuTG9uZy5mcm9tVmFsdWUoaS5lbmQpKS51bnNpZ25lZD0hMTp0eXBlb2YgaS5lbmQ9PSJzdHJpbmciP3MuZW5kPXBhcnNlSW50KGkuZW5kLDEwKTp0eXBlb2YgaS5lbmQ9PSJudW1iZXIiP3MuZW5kPWkuZW5kOnR5cGVvZiBpLmVuZD09Im9iamVjdCImJihzLmVuZD1uZXcgZC5Mb25nQml0cyhpLmVuZC5sb3c+Pj4wLGkuZW5kLmhpZ2g+Pj4wKS50b051bWJlcigpKSksc30sZS50b09iamVjdD1mdW5jdGlvbihpLHMpe3N8fChzPXt9KTt2YXIgbT17fTtpZihzLmRlZmF1bHRzKXtpZihkLkxvbmcpe3ZhciBnPW5ldyBkLkxvbmcoMCwwLCExKTttLmJlZ2luPXMubG9uZ3M9PT1TdHJpbmc/Zy50b1N0cmluZygpOnMubG9uZ3M9PT1OdW1iZXI/Zy50b051bWJlcigpOmd9ZWxzZSBtLmJlZ2luPXMubG9uZ3M9PT1TdHJpbmc/IjAiOjA7ZC5Mb25nPyhnPW5ldyBkLkxvbmcoMCwwLCExKSxtLmVuZD1zLmxvbmdzPT09U3RyaW5nP2cudG9TdHJpbmcoKTpzLmxvbmdzPT09TnVtYmVyP2cudG9OdW1iZXIoKTpnKTptLmVuZD1zLmxvbmdzPT09U3RyaW5nPyIwIjowfXJldHVybiBpLmJlZ2luIT1udWxsJiZpLmhhc093blByb3BlcnR5KCJiZWdpbiIpJiYodHlwZW9mIGkuYmVnaW49PSJudW1iZXIiP20uYmVnaW49cy5sb25ncz09PVN0cmluZz9TdHJpbmcoaS5iZWdpbik6aS5iZWdpbjptLmJlZ2luPXMubG9uZ3M9PT1TdHJpbmc/ZC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGkuYmVnaW4pOnMubG9uZ3M9PT1OdW1iZXI/bmV3IGQuTG9uZ0JpdHMoaS5iZWdpbi5sb3c+Pj4wLGkuYmVnaW4uaGlnaD4+PjApLnRvTnVtYmVyKCk6aS5iZWdpbiksaS5lbmQhPW51bGwmJmkuaGFzT3duUHJvcGVydHkoImVuZCIpJiYodHlwZW9mIGkuZW5kPT0ibnVtYmVyIj9tLmVuZD1zLmxvbmdzPT09U3RyaW5nP1N0cmluZyhpLmVuZCk6aS5lbmQ6bS5lbmQ9cy5sb25ncz09PVN0cmluZz9kLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaS5lbmQpOnMubG9uZ3M9PT1OdW1iZXI/bmV3IGQuTG9uZ0JpdHMoaS5lbmQubG93Pj4+MCxpLmVuZC5oaWdoPj4+MCkudG9OdW1iZXIoKTppLmVuZCksbX0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxhLnV0aWwudG9KU09OT3B0aW9ucyl9LGV9KCksbi5EYXRhTG9jYXRpb249ZnVuY3Rpb24oKXt2YXIgZT17fSxpPU9iamVjdC5jcmVhdGUoZSk7cmV0dXJuIGlbZVswXT0iREVGQVVMVCJdPTAsaVtlWzFdPSJFWFRFUk5BTCJdPTEsaX0oKSxufSgpLGguVGVuc29yU2hhcGVQcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oZSl7aWYodGhpcy5kaW09W10sZSlmb3IodmFyIGk9T2JqZWN0LmtleXMoZSkscz0wO3M8aS5sZW5ndGg7KytzKWVbaVtzXV0hPW51bGwmJih0aGlzW2lbc11dPWVbaVtzXV0pfXJldHVybiBuLnByb3RvdHlwZS5kaW09ZC5lbXB0eUFycmF5LG4uY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbihlKX0sbi5lbmNvZGU9ZnVuY3Rpb24oZSxpKXtpZihpfHwoaT1mLmNyZWF0ZSgpKSxlLmRpbSE9bnVsbCYmZS5kaW0ubGVuZ3RoKWZvcih2YXIgcz0wO3M8ZS5kaW0ubGVuZ3RoOysrcylsLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24uZW5jb2RlKGUuZGltW3NdLGkudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiBpfSxuLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLGkpe3JldHVybiB0aGlzLmVuY29kZShlLGkpLmxkZWxpbSgpfSxuLmRlY29kZT1mdW5jdGlvbihlLGkpe2UgaW5zdGFuY2VvZiBwfHwoZT1wLmNyZWF0ZShlKSk7Zm9yKHZhciBzPWk9PT12b2lkIDA/ZS5sZW46ZS5wb3MraSxtPW5ldyBsLm9ubnguVGVuc29yU2hhcGVQcm90bztlLnBvczxzOyl7dmFyIGc9ZS51aW50MzIoKTtnPj4+Mz09MT8obS5kaW0mJm0uZGltLmxlbmd0aHx8KG0uZGltPVtdKSxtLmRpbS5wdXNoKGwub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbi5kZWNvZGUoZSxlLnVpbnQzMigpKSkpOmUuc2tpcFR5cGUoNyZnKX1yZXR1cm4gbX0sbi5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBwfHwoZT1uZXcgcChlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sbi52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbClyZXR1cm4ib2JqZWN0IGV4cGVjdGVkIjtpZihlLmRpbSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZGltIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZGltKSlyZXR1cm4iZGltOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciBpPTA7aTxlLmRpbS5sZW5ndGg7KytpKXt2YXIgcz1sLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24udmVyaWZ5KGUuZGltW2ldKTtpZihzKXJldHVybiJkaW0uIitzfX1yZXR1cm4gbnVsbH0sbi5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBsLm9ubnguVGVuc29yU2hhcGVQcm90bylyZXR1cm4gZTt2YXIgaT1uZXcgbC5vbm54LlRlbnNvclNoYXBlUHJvdG87aWYoZS5kaW0pe2lmKCFBcnJheS5pc0FycmF5KGUuZGltKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclNoYXBlUHJvdG8uZGltOiBhcnJheSBleHBlY3RlZCIpO2kuZGltPVtdO2Zvcih2YXIgcz0wO3M8ZS5kaW0ubGVuZ3RoOysrcyl7aWYodHlwZW9mIGUuZGltW3NdIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclNoYXBlUHJvdG8uZGltOiBvYmplY3QgZXhwZWN0ZWQiKTtpLmRpbVtzXT1sLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24uZnJvbU9iamVjdChlLmRpbVtzXSl9fXJldHVybiBpfSxuLnRvT2JqZWN0PWZ1bmN0aW9uKGUsaSl7aXx8KGk9e30pO3ZhciBzPXt9O2lmKChpLmFycmF5c3x8aS5kZWZhdWx0cykmJihzLmRpbT1bXSksZS5kaW0mJmUuZGltLmxlbmd0aCl7cy5kaW09W107Zm9yKHZhciBtPTA7bTxlLmRpbS5sZW5ndGg7KyttKXMuZGltW21dPWwub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbi50b09iamVjdChlLmRpbVttXSxpKX1yZXR1cm4gc30sbi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxhLnV0aWwudG9KU09OT3B0aW9ucyl9LG4uRGltZW5zaW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShzKXtpZihzKWZvcih2YXIgbT1PYmplY3Qua2V5cyhzKSxnPTA7ZzxtLmxlbmd0aDsrK2cpc1ttW2ddXSE9bnVsbCYmKHRoaXNbbVtnXV09c1ttW2ddXSl9dmFyIGk7cmV0dXJuIGUucHJvdG90eXBlLmRpbVZhbHVlPWQuTG9uZz9kLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUucHJvdG90eXBlLmRpbVBhcmFtPSIiLGUucHJvdG90eXBlLmRlbm90YXRpb249IiIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ2YWx1ZSIse2dldDpkLm9uZU9mR2V0dGVyKGk9WyJkaW1WYWx1ZSIsImRpbVBhcmFtIl0pLHNldDpkLm9uZU9mU2V0dGVyKGkpfSksZS5jcmVhdGU9ZnVuY3Rpb24ocyl7cmV0dXJuIG5ldyBlKHMpfSxlLmVuY29kZT1mdW5jdGlvbihzLG0pe3JldHVybiBtfHwobT1mLmNyZWF0ZSgpKSxzLmRpbVZhbHVlIT1udWxsJiZzLmhhc093blByb3BlcnR5KCJkaW1WYWx1ZSIpJiZtLnVpbnQzMig4KS5pbnQ2NChzLmRpbVZhbHVlKSxzLmRpbVBhcmFtIT1udWxsJiZzLmhhc093blByb3BlcnR5KCJkaW1QYXJhbSIpJiZtLnVpbnQzMigxOCkuc3RyaW5nKHMuZGltUGFyYW0pLHMuZGVub3RhdGlvbiE9bnVsbCYmcy5oYXNPd25Qcm9wZXJ0eSgiZGVub3RhdGlvbiIpJiZtLnVpbnQzMigyNikuc3RyaW5nKHMuZGVub3RhdGlvbiksbX0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24ocyxtKXtyZXR1cm4gdGhpcy5lbmNvZGUocyxtKS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24ocyxtKXtzIGluc3RhbmNlb2YgcHx8KHM9cC5jcmVhdGUocykpO2Zvcih2YXIgZz1tPT09dm9pZCAwP3MubGVuOnMucG9zK20sXz1uZXcgbC5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uO3MucG9zPGc7KXt2YXIgYj1zLnVpbnQzMigpO3N3aXRjaChiPj4+Myl7Y2FzZSAxOl8uZGltVmFsdWU9cy5pbnQ2NCgpO2JyZWFrO2Nhc2UgMjpfLmRpbVBhcmFtPXMuc3RyaW5nKCk7YnJlYWs7Y2FzZSAzOl8uZGVub3RhdGlvbj1zLnN0cmluZygpO2JyZWFrO2RlZmF1bHQ6cy5za2lwVHlwZSg3JmIpfX1yZXR1cm4gX30sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24ocyl7cmV0dXJuIHMgaW5zdGFuY2VvZiBwfHwocz1uZXcgcChzKSksdGhpcy5kZWNvZGUocyxzLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24ocyl7aWYodHlwZW9mIHMhPSJvYmplY3QifHxzPT09bnVsbClyZXR1cm4ib2JqZWN0IGV4cGVjdGVkIjt2YXIgbT17fTtpZihzLmRpbVZhbHVlIT1udWxsJiZzLmhhc093blByb3BlcnR5KCJkaW1WYWx1ZSIpJiYobS52YWx1ZT0xLCEoZC5pc0ludGVnZXIocy5kaW1WYWx1ZSl8fHMuZGltVmFsdWUmJmQuaXNJbnRlZ2VyKHMuZGltVmFsdWUubG93KSYmZC5pc0ludGVnZXIocy5kaW1WYWx1ZS5oaWdoKSkpKXJldHVybiJkaW1WYWx1ZTogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjtpZihzLmRpbVBhcmFtIT1udWxsJiZzLmhhc093blByb3BlcnR5KCJkaW1QYXJhbSIpKXtpZihtLnZhbHVlPT09MSlyZXR1cm4idmFsdWU6IG11bHRpcGxlIHZhbHVlcyI7aWYobS52YWx1ZT0xLCFkLmlzU3RyaW5nKHMuZGltUGFyYW0pKXJldHVybiJkaW1QYXJhbTogc3RyaW5nIGV4cGVjdGVkIn1yZXR1cm4gcy5kZW5vdGF0aW9uIT1udWxsJiZzLmhhc093blByb3BlcnR5KCJkZW5vdGF0aW9uIikmJiFkLmlzU3RyaW5nKHMuZGVub3RhdGlvbik/ImRlbm90YXRpb246IHN0cmluZyBleHBlY3RlZCI6bnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKHMpe2lmKHMgaW5zdGFuY2VvZiBsLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24pcmV0dXJuIHM7dmFyIG09bmV3IGwub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbjtyZXR1cm4gcy5kaW1WYWx1ZSE9bnVsbCYmKGQuTG9uZz8obS5kaW1WYWx1ZT1kLkxvbmcuZnJvbVZhbHVlKHMuZGltVmFsdWUpKS51bnNpZ25lZD0hMTp0eXBlb2Ygcy5kaW1WYWx1ZT09InN0cmluZyI/bS5kaW1WYWx1ZT1wYXJzZUludChzLmRpbVZhbHVlLDEwKTp0eXBlb2Ygcy5kaW1WYWx1ZT09Im51bWJlciI/bS5kaW1WYWx1ZT1zLmRpbVZhbHVlOnR5cGVvZiBzLmRpbVZhbHVlPT0ib2JqZWN0IiYmKG0uZGltVmFsdWU9bmV3IGQuTG9uZ0JpdHMocy5kaW1WYWx1ZS5sb3c+Pj4wLHMuZGltVmFsdWUuaGlnaD4+PjApLnRvTnVtYmVyKCkpKSxzLmRpbVBhcmFtIT1udWxsJiYobS5kaW1QYXJhbT1TdHJpbmcocy5kaW1QYXJhbSkpLHMuZGVub3RhdGlvbiE9bnVsbCYmKG0uZGVub3RhdGlvbj1TdHJpbmcocy5kZW5vdGF0aW9uKSksbX0sZS50b09iamVjdD1mdW5jdGlvbihzLG0pe218fChtPXt9KTt2YXIgZz17fTtyZXR1cm4gbS5kZWZhdWx0cyYmKGcuZGVub3RhdGlvbj0iIikscy5kaW1WYWx1ZSE9bnVsbCYmcy5oYXNPd25Qcm9wZXJ0eSgiZGltVmFsdWUiKSYmKHR5cGVvZiBzLmRpbVZhbHVlPT0ibnVtYmVyIj9nLmRpbVZhbHVlPW0ubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKHMuZGltVmFsdWUpOnMuZGltVmFsdWU6Zy5kaW1WYWx1ZT1tLmxvbmdzPT09U3RyaW5nP2QuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzLmRpbVZhbHVlKTptLmxvbmdzPT09TnVtYmVyP25ldyBkLkxvbmdCaXRzKHMuZGltVmFsdWUubG93Pj4+MCxzLmRpbVZhbHVlLmhpZ2g+Pj4wKS50b051bWJlcigpOnMuZGltVmFsdWUsbS5vbmVvZnMmJihnLnZhbHVlPSJkaW1WYWx1ZSIpKSxzLmRpbVBhcmFtIT1udWxsJiZzLmhhc093blByb3BlcnR5KCJkaW1QYXJhbSIpJiYoZy5kaW1QYXJhbT1zLmRpbVBhcmFtLG0ub25lb2ZzJiYoZy52YWx1ZT0iZGltUGFyYW0iKSkscy5kZW5vdGF0aW9uIT1udWxsJiZzLmhhc093blByb3BlcnR5KCJkZW5vdGF0aW9uIikmJihnLmRlbm90YXRpb249cy5kZW5vdGF0aW9uKSxnfSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLGEudXRpbC50b0pTT05PcHRpb25zKX0sZX0oKSxufSgpLGguVHlwZVByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihpKXtpZihpKWZvcih2YXIgcz1PYmplY3Qua2V5cyhpKSxtPTA7bTxzLmxlbmd0aDsrK20paVtzW21dXSE9bnVsbCYmKHRoaXNbc1ttXV09aVtzW21dXSl9dmFyIGU7cmV0dXJuIG4ucHJvdG90eXBlLnRlbnNvclR5cGU9bnVsbCxuLnByb3RvdHlwZS5kZW5vdGF0aW9uPSIiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSwidmFsdWUiLHtnZXQ6ZC5vbmVPZkdldHRlcihlPVsidGVuc29yVHlwZSJdKSxzZXQ6ZC5vbmVPZlNldHRlcihlKX0pLG4uY3JlYXRlPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcgbihpKX0sbi5lbmNvZGU9ZnVuY3Rpb24oaSxzKXtyZXR1cm4gc3x8KHM9Zi5jcmVhdGUoKSksaS50ZW5zb3JUeXBlIT1udWxsJiZpLmhhc093blByb3BlcnR5KCJ0ZW5zb3JUeXBlIikmJmwub25ueC5UeXBlUHJvdG8uVGVuc29yLmVuY29kZShpLnRlbnNvclR5cGUscy51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCksaS5kZW5vdGF0aW9uIT1udWxsJiZpLmhhc093blByb3BlcnR5KCJkZW5vdGF0aW9uIikmJnMudWludDMyKDUwKS5zdHJpbmcoaS5kZW5vdGF0aW9uKSxzfSxuLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihpLHMpe3JldHVybiB0aGlzLmVuY29kZShpLHMpLmxkZWxpbSgpfSxuLmRlY29kZT1mdW5jdGlvbihpLHMpe2kgaW5zdGFuY2VvZiBwfHwoaT1wLmNyZWF0ZShpKSk7Zm9yKHZhciBtPXM9PT12b2lkIDA/aS5sZW46aS5wb3MrcyxnPW5ldyBsLm9ubnguVHlwZVByb3RvO2kucG9zPG07KXt2YXIgXz1pLnVpbnQzMigpO3N3aXRjaChfPj4+Myl7Y2FzZSAxOmcudGVuc29yVHlwZT1sLm9ubnguVHlwZVByb3RvLlRlbnNvci5kZWNvZGUoaSxpLnVpbnQzMigpKTticmVhaztjYXNlIDY6Zy5kZW5vdGF0aW9uPWkuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDppLnNraXBUeXBlKDcmXyl9fXJldHVybiBnfSxuLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihpKXtyZXR1cm4gaSBpbnN0YW5jZW9mIHB8fChpPW5ldyBwKGkpKSx0aGlzLmRlY29kZShpLGkudWludDMyKCkpfSxuLnZlcmlmeT1mdW5jdGlvbihpKXtpZih0eXBlb2YgaSE9Im9iamVjdCJ8fGk9PT1udWxsKXJldHVybiJvYmplY3QgZXhwZWN0ZWQiO2lmKGkudGVuc29yVHlwZSE9bnVsbCYmaS5oYXNPd25Qcm9wZXJ0eSgidGVuc29yVHlwZSIpKXt2YXIgcz1sLm9ubnguVHlwZVByb3RvLlRlbnNvci52ZXJpZnkoaS50ZW5zb3JUeXBlKTtpZihzKXJldHVybiJ0ZW5zb3JUeXBlLiIrc31yZXR1cm4gaS5kZW5vdGF0aW9uIT1udWxsJiZpLmhhc093blByb3BlcnR5KCJkZW5vdGF0aW9uIikmJiFkLmlzU3RyaW5nKGkuZGVub3RhdGlvbik/ImRlbm90YXRpb246IHN0cmluZyBleHBlY3RlZCI6bnVsbH0sbi5mcm9tT2JqZWN0PWZ1bmN0aW9uKGkpe2lmKGkgaW5zdGFuY2VvZiBsLm9ubnguVHlwZVByb3RvKXJldHVybiBpO3ZhciBzPW5ldyBsLm9ubnguVHlwZVByb3RvO2lmKGkudGVuc29yVHlwZSE9bnVsbCl7aWYodHlwZW9mIGkudGVuc29yVHlwZSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8udGVuc29yVHlwZTogb2JqZWN0IGV4cGVjdGVkIik7cy50ZW5zb3JUeXBlPWwub25ueC5UeXBlUHJvdG8uVGVuc29yLmZyb21PYmplY3QoaS50ZW5zb3JUeXBlKX1yZXR1cm4gaS5kZW5vdGF0aW9uIT1udWxsJiYocy5kZW5vdGF0aW9uPVN0cmluZyhpLmRlbm90YXRpb24pKSxzfSxuLnRvT2JqZWN0PWZ1bmN0aW9uKGkscyl7c3x8KHM9e30pO3ZhciBtPXt9O3JldHVybiBzLmRlZmF1bHRzJiYobS5kZW5vdGF0aW9uPSIiKSxpLnRlbnNvclR5cGUhPW51bGwmJmkuaGFzT3duUHJvcGVydHkoInRlbnNvclR5cGUiKSYmKG0udGVuc29yVHlwZT1sLm9ubnguVHlwZVByb3RvLlRlbnNvci50b09iamVjdChpLnRlbnNvclR5cGUscykscy5vbmVvZnMmJihtLnZhbHVlPSJ0ZW5zb3JUeXBlIikpLGkuZGVub3RhdGlvbiE9bnVsbCYmaS5oYXNPd25Qcm9wZXJ0eSgiZGVub3RhdGlvbiIpJiYobS5kZW5vdGF0aW9uPWkuZGVub3RhdGlvbiksbX0sbi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxhLnV0aWwudG9KU09OT3B0aW9ucyl9LG4uVGVuc29yPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaShzKXtpZihzKWZvcih2YXIgbT1PYmplY3Qua2V5cyhzKSxnPTA7ZzxtLmxlbmd0aDsrK2cpc1ttW2ddXSE9bnVsbCYmKHRoaXNbbVtnXV09c1ttW2ddXSl9cmV0dXJuIGkucHJvdG90eXBlLmVsZW1UeXBlPTAsaS5wcm90b3R5cGUuc2hhcGU9bnVsbCxpLmNyZWF0ZT1mdW5jdGlvbihzKXtyZXR1cm4gbmV3IGkocyl9LGkuZW5jb2RlPWZ1bmN0aW9uKHMsbSl7cmV0dXJuIG18fChtPWYuY3JlYXRlKCkpLHMuZWxlbVR5cGUhPW51bGwmJnMuaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikmJm0udWludDMyKDgpLmludDMyKHMuZWxlbVR5cGUpLHMuc2hhcGUhPW51bGwmJnMuaGFzT3duUHJvcGVydHkoInNoYXBlIikmJmwub25ueC5UZW5zb3JTaGFwZVByb3RvLmVuY29kZShzLnNoYXBlLG0udWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpLG19LGkuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKHMsbSl7cmV0dXJuIHRoaXMuZW5jb2RlKHMsbSkubGRlbGltKCl9LGkuZGVjb2RlPWZ1bmN0aW9uKHMsbSl7cyBpbnN0YW5jZW9mIHB8fChzPXAuY3JlYXRlKHMpKTtmb3IodmFyIGc9bT09PXZvaWQgMD9zLmxlbjpzLnBvcyttLF89bmV3IGwub25ueC5UeXBlUHJvdG8uVGVuc29yO3MucG9zPGc7KXt2YXIgYj1zLnVpbnQzMigpO3N3aXRjaChiPj4+Myl7Y2FzZSAxOl8uZWxlbVR5cGU9cy5pbnQzMigpO2JyZWFrO2Nhc2UgMjpfLnNoYXBlPWwub25ueC5UZW5zb3JTaGFwZVByb3RvLmRlY29kZShzLHMudWludDMyKCkpO2JyZWFrO2RlZmF1bHQ6cy5za2lwVHlwZSg3JmIpfX1yZXR1cm4gX30saS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24ocyl7cmV0dXJuIHMgaW5zdGFuY2VvZiBwfHwocz1uZXcgcChzKSksdGhpcy5kZWNvZGUocyxzLnVpbnQzMigpKX0saS52ZXJpZnk9ZnVuY3Rpb24ocyl7aWYodHlwZW9mIHMhPSJvYmplY3QifHxzPT09bnVsbClyZXR1cm4ib2JqZWN0IGV4cGVjdGVkIjtpZihzLmVsZW1UeXBlIT1udWxsJiZzLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpJiYhZC5pc0ludGVnZXIocy5lbGVtVHlwZSkpcmV0dXJuImVsZW1UeXBlOiBpbnRlZ2VyIGV4cGVjdGVkIjtpZihzLnNoYXBlIT1udWxsJiZzLmhhc093blByb3BlcnR5KCJzaGFwZSIpKXt2YXIgbT1sLm9ubnguVGVuc29yU2hhcGVQcm90by52ZXJpZnkocy5zaGFwZSk7aWYobSlyZXR1cm4ic2hhcGUuIittfXJldHVybiBudWxsfSxpLmZyb21PYmplY3Q9ZnVuY3Rpb24ocyl7aWYocyBpbnN0YW5jZW9mIGwub25ueC5UeXBlUHJvdG8uVGVuc29yKXJldHVybiBzO3ZhciBtPW5ldyBsLm9ubnguVHlwZVByb3RvLlRlbnNvcjtpZihzLmVsZW1UeXBlIT1udWxsJiYobS5lbGVtVHlwZT0wfHMuZWxlbVR5cGUpLHMuc2hhcGUhPW51bGwpe2lmKHR5cGVvZiBzLnNoYXBlIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5UZW5zb3Iuc2hhcGU6IG9iamVjdCBleHBlY3RlZCIpO20uc2hhcGU9bC5vbm54LlRlbnNvclNoYXBlUHJvdG8uZnJvbU9iamVjdChzLnNoYXBlKX1yZXR1cm4gbX0saS50b09iamVjdD1mdW5jdGlvbihzLG0pe218fChtPXt9KTt2YXIgZz17fTtyZXR1cm4gbS5kZWZhdWx0cyYmKGcuZWxlbVR5cGU9MCxnLnNoYXBlPW51bGwpLHMuZWxlbVR5cGUhPW51bGwmJnMuaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikmJihnLmVsZW1UeXBlPXMuZWxlbVR5cGUpLHMuc2hhcGUhPW51bGwmJnMuaGFzT3duUHJvcGVydHkoInNoYXBlIikmJihnLnNoYXBlPWwub25ueC5UZW5zb3JTaGFwZVByb3RvLnRvT2JqZWN0KHMuc2hhcGUsbSkpLGd9LGkucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsYS51dGlsLnRvSlNPTk9wdGlvbnMpfSxpfSgpLG59KCksaC5PcGVyYXRvclNldElkUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGUpe2lmKGUpZm9yKHZhciBpPU9iamVjdC5rZXlzKGUpLHM9MDtzPGkubGVuZ3RoOysrcyllW2lbc11dIT1udWxsJiYodGhpc1tpW3NdXT1lW2lbc11dKX1yZXR1cm4gbi5wcm90b3R5cGUuZG9tYWluPSIiLG4ucHJvdG90eXBlLnZlcnNpb249ZC5Mb25nP2QuTG9uZy5mcm9tQml0cygwLDAsITEpOjAsbi5jcmVhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBuKGUpfSxuLmVuY29kZT1mdW5jdGlvbihlLGkpe3JldHVybiBpfHwoaT1mLmNyZWF0ZSgpKSxlLmRvbWFpbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJmkudWludDMyKDEwKS5zdHJpbmcoZS5kb21haW4pLGUudmVyc2lvbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidmVyc2lvbiIpJiZpLnVpbnQzMigxNikuaW50NjQoZS52ZXJzaW9uKSxpfSxuLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLGkpe3JldHVybiB0aGlzLmVuY29kZShlLGkpLmxkZWxpbSgpfSxuLmRlY29kZT1mdW5jdGlvbihlLGkpe2UgaW5zdGFuY2VvZiBwfHwoZT1wLmNyZWF0ZShlKSk7Zm9yKHZhciBzPWk9PT12b2lkIDA/ZS5sZW46ZS5wb3MraSxtPW5ldyBsLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvO2UucG9zPHM7KXt2YXIgZz1lLnVpbnQzMigpO3N3aXRjaChnPj4+Myl7Y2FzZSAxOm0uZG9tYWluPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAyOm0udmVyc2lvbj1lLmludDY0KCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmZyl9fXJldHVybiBtfSxuLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHB8fChlPW5ldyBwKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxuLnZlcmlmeT1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbD8ib2JqZWN0IGV4cGVjdGVkIjplLmRvbWFpbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJiFkLmlzU3RyaW5nKGUuZG9tYWluKT8iZG9tYWluOiBzdHJpbmcgZXhwZWN0ZWQiOmUudmVyc2lvbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidmVyc2lvbiIpJiYhKGQuaXNJbnRlZ2VyKGUudmVyc2lvbil8fGUudmVyc2lvbiYmZC5pc0ludGVnZXIoZS52ZXJzaW9uLmxvdykmJmQuaXNJbnRlZ2VyKGUudmVyc2lvbi5oaWdoKSk/InZlcnNpb246IGludGVnZXJ8TG9uZyBleHBlY3RlZCI6bnVsbH0sbi5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBsLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvKXJldHVybiBlO3ZhciBpPW5ldyBsLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvO3JldHVybiBlLmRvbWFpbiE9bnVsbCYmKGkuZG9tYWluPVN0cmluZyhlLmRvbWFpbikpLGUudmVyc2lvbiE9bnVsbCYmKGQuTG9uZz8oaS52ZXJzaW9uPWQuTG9uZy5mcm9tVmFsdWUoZS52ZXJzaW9uKSkudW5zaWduZWQ9ITE6dHlwZW9mIGUudmVyc2lvbj09InN0cmluZyI/aS52ZXJzaW9uPXBhcnNlSW50KGUudmVyc2lvbiwxMCk6dHlwZW9mIGUudmVyc2lvbj09Im51bWJlciI/aS52ZXJzaW9uPWUudmVyc2lvbjp0eXBlb2YgZS52ZXJzaW9uPT0ib2JqZWN0IiYmKGkudmVyc2lvbj1uZXcgZC5Mb25nQml0cyhlLnZlcnNpb24ubG93Pj4+MCxlLnZlcnNpb24uaGlnaD4+PjApLnRvTnVtYmVyKCkpKSxpfSxuLnRvT2JqZWN0PWZ1bmN0aW9uKGUsaSl7aXx8KGk9e30pO3ZhciBzPXt9O2lmKGkuZGVmYXVsdHMpaWYocy5kb21haW49IiIsZC5Mb25nKXt2YXIgbT1uZXcgZC5Mb25nKDAsMCwhMSk7cy52ZXJzaW9uPWkubG9uZ3M9PT1TdHJpbmc/bS50b1N0cmluZygpOmkubG9uZ3M9PT1OdW1iZXI/bS50b051bWJlcigpOm19ZWxzZSBzLnZlcnNpb249aS5sb25ncz09PVN0cmluZz8iMCI6MDtyZXR1cm4gZS5kb21haW4hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiYocy5kb21haW49ZS5kb21haW4pLGUudmVyc2lvbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidmVyc2lvbiIpJiYodHlwZW9mIGUudmVyc2lvbj09Im51bWJlciI/cy52ZXJzaW9uPWkubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUudmVyc2lvbik6ZS52ZXJzaW9uOnMudmVyc2lvbj1pLmxvbmdzPT09U3RyaW5nP2QuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLnZlcnNpb24pOmkubG9uZ3M9PT1OdW1iZXI/bmV3IGQuTG9uZ0JpdHMoZS52ZXJzaW9uLmxvdz4+PjAsZS52ZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpOmUudmVyc2lvbiksc30sbi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxhLnV0aWwudG9KU09OT3B0aW9ucyl9LG59KCksaCksYy5leHBvcnRzPWx9LDIxMDA6KGMsdCxyKT0+e2MuZXhwb3J0cz1yKDk0ODIpfSw5NDgyOihjLHQscik9Pnt2YXIgbz10O2Z1bmN0aW9uIHUoKXtvLnV0aWwuX2NvbmZpZ3VyZSgpLG8uV3JpdGVyLl9jb25maWd1cmUoby5CdWZmZXJXcml0ZXIpLG8uUmVhZGVyLl9jb25maWd1cmUoby5CdWZmZXJSZWFkZXIpfW8uYnVpbGQ9Im1pbmltYWwiLG8uV3JpdGVyPXIoMTE3Myksby5CdWZmZXJXcml0ZXI9cigzMTU1KSxvLlJlYWRlcj1yKDE0MDgpLG8uQnVmZmVyUmVhZGVyPXIoNTkzKSxvLnV0aWw9cig5NjkzKSxvLnJwYz1yKDU5OTQpLG8ucm9vdHM9cig1MDU0KSxvLmNvbmZpZ3VyZT11LHUoKX0sMTQwODooYyx0LHIpPT57Yy5leHBvcnRzPWY7dmFyIG8sdT1yKDk2OTMpLGg9dS5Mb25nQml0cyxhPXUudXRmODtmdW5jdGlvbiBwKG0sZyl7cmV0dXJuIFJhbmdlRXJyb3IoImluZGV4IG91dCBvZiByYW5nZTogIittLnBvcysiICsgIisoZ3x8MSkrIiA+ICIrbS5sZW4pfWZ1bmN0aW9uIGYobSl7dGhpcy5idWY9bSx0aGlzLnBvcz0wLHRoaXMubGVuPW0ubGVuZ3RofXZhciBkLGw9dHlwZW9mIFVpbnQ4QXJyYXk8InUiP2Z1bmN0aW9uKG0pe2lmKG0gaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheS5pc0FycmF5KG0pKXJldHVybiBuZXcgZihtKTt0aHJvdyBFcnJvcigiaWxsZWdhbCBidWZmZXIiKX06ZnVuY3Rpb24obSl7aWYoQXJyYXkuaXNBcnJheShtKSlyZXR1cm4gbmV3IGYobSk7dGhyb3cgRXJyb3IoImlsbGVnYWwgYnVmZmVyIil9LG49ZnVuY3Rpb24oKXtyZXR1cm4gdS5CdWZmZXI/ZnVuY3Rpb24obSl7cmV0dXJuKGYuY3JlYXRlPWZ1bmN0aW9uKGcpe3JldHVybiB1LkJ1ZmZlci5pc0J1ZmZlcihnKT9uZXcgbyhnKTpsKGcpfSkobSl9Omx9O2Z1bmN0aW9uIGUoKXt2YXIgbT1uZXcgaCgwLDApLGc9MDtpZighKHRoaXMubGVuLXRoaXMucG9zPjQpKXtmb3IoO2c8MzsrK2cpe2lmKHRoaXMucG9zPj10aGlzLmxlbil0aHJvdyBwKHRoaXMpO2lmKG0ubG89KG0ubG98KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDw3KmcpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIG19cmV0dXJuIG0ubG89KG0ubG98KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvcysrXSk8PDcqZyk+Pj4wLG19Zm9yKDtnPDQ7KytnKWlmKG0ubG89KG0ubG98KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDw3KmcpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIG07aWYobS5sbz0obS5sb3woMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDI4KT4+PjAsbS5oaT0obS5oaXwoMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk+PjQpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIG07aWYoZz0wLHRoaXMubGVuLXRoaXMucG9zPjQpe2Zvcig7Zzw1OysrZylpZihtLmhpPShtLmhpfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8NypnKzMpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIG19ZWxzZSBmb3IoO2c8NTsrK2cpe2lmKHRoaXMucG9zPj10aGlzLmxlbil0aHJvdyBwKHRoaXMpO2lmKG0uaGk9KG0uaGl8KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDw3KmcrMyk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gbX10aHJvdyBFcnJvcigiaW52YWxpZCB2YXJpbnQgZW5jb2RpbmciKX1mdW5jdGlvbiBpKG0sZyl7cmV0dXJuKG1bZy00XXxtW2ctM108PDh8bVtnLTJdPDwxNnxtW2ctMV08PDI0KT4+PjB9ZnVuY3Rpb24gcygpe2lmKHRoaXMucG9zKzg+dGhpcy5sZW4pdGhyb3cgcCh0aGlzLDgpO3JldHVybiBuZXcgaChpKHRoaXMuYnVmLHRoaXMucG9zKz00KSxpKHRoaXMuYnVmLHRoaXMucG9zKz00KSl9Zi5jcmVhdGU9bigpLGYucHJvdG90eXBlLl9zbGljZT11LkFycmF5LnByb3RvdHlwZS5zdWJhcnJheXx8dS5BcnJheS5wcm90b3R5cGUuc2xpY2UsZi5wcm90b3R5cGUudWludDMyPShkPTQyOTQ5NjcyOTUsZnVuY3Rpb24oKXtpZihkPSgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4fHwoZD0oZHwoMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDcpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpfHwoZD0oZHwoMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDE0KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXx8KGQ9KGR8KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDwyMSk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOCl8fChkPShkfCgxNSZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDwyOCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOCkpcmV0dXJuIGQ7aWYoKHRoaXMucG9zKz01KT50aGlzLmxlbil0aHJvdyB0aGlzLnBvcz10aGlzLmxlbixwKHRoaXMsMTApO3JldHVybiBkfSksZi5wcm90b3R5cGUuaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gMHx0aGlzLnVpbnQzMigpfSxmLnByb3RvdHlwZS5zaW50MzI9ZnVuY3Rpb24oKXt2YXIgbT10aGlzLnVpbnQzMigpO3JldHVybiBtPj4+MV4tKDEmbSl8MH0sZi5wcm90b3R5cGUuYm9vbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVpbnQzMigpIT09MH0sZi5wcm90b3R5cGUuZml4ZWQzMj1mdW5jdGlvbigpe2lmKHRoaXMucG9zKzQ+dGhpcy5sZW4pdGhyb3cgcCh0aGlzLDQpO3JldHVybiBpKHRoaXMuYnVmLHRoaXMucG9zKz00KX0sZi5wcm90b3R5cGUuc2ZpeGVkMzI9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys0PnRoaXMubGVuKXRocm93IHAodGhpcyw0KTtyZXR1cm4gMHxpKHRoaXMuYnVmLHRoaXMucG9zKz00KX0sZi5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys0PnRoaXMubGVuKXRocm93IHAodGhpcyw0KTt2YXIgbT11LmZsb2F0LnJlYWRGbG9hdExFKHRoaXMuYnVmLHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsbX0sZi5wcm90b3R5cGUuZG91YmxlPWZ1bmN0aW9uKCl7aWYodGhpcy5wb3MrOD50aGlzLmxlbil0aHJvdyBwKHRoaXMsNCk7dmFyIG09dS5mbG9hdC5yZWFkRG91YmxlTEUodGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxtfSxmLnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbigpe3ZhciBtPXRoaXMudWludDMyKCksZz10aGlzLnBvcyxfPXRoaXMucG9zK207aWYoXz50aGlzLmxlbil0aHJvdyBwKHRoaXMsbSk7cmV0dXJuIHRoaXMucG9zKz1tLEFycmF5LmlzQXJyYXkodGhpcy5idWYpP3RoaXMuYnVmLnNsaWNlKGcsXyk6Zz09PV8/bmV3IHRoaXMuYnVmLmNvbnN0cnVjdG9yKDApOnRoaXMuX3NsaWNlLmNhbGwodGhpcy5idWYsZyxfKX0sZi5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKCl7dmFyIG09dGhpcy5ieXRlcygpO3JldHVybiBhLnJlYWQobSwwLG0ubGVuZ3RoKX0sZi5wcm90b3R5cGUuc2tpcD1mdW5jdGlvbihtKXtpZih0eXBlb2YgbT09Im51bWJlciIpe2lmKHRoaXMucG9zK20+dGhpcy5sZW4pdGhyb3cgcCh0aGlzLG0pO3RoaXMucG9zKz1tfWVsc2UgZG8gaWYodGhpcy5wb3M+PXRoaXMubGVuKXRocm93IHAodGhpcyk7d2hpbGUoMTI4JnRoaXMuYnVmW3RoaXMucG9zKytdKTtyZXR1cm4gdGhpc30sZi5wcm90b3R5cGUuc2tpcFR5cGU9ZnVuY3Rpb24obSl7c3dpdGNoKG0pe2Nhc2UgMDp0aGlzLnNraXAoKTticmVhaztjYXNlIDE6dGhpcy5za2lwKDgpO2JyZWFrO2Nhc2UgMjp0aGlzLnNraXAodGhpcy51aW50MzIoKSk7YnJlYWs7Y2FzZSAzOmZvcig7KG09NyZ0aGlzLnVpbnQzMigpKSE9NDspdGhpcy5za2lwVHlwZShtKTticmVhaztjYXNlIDU6dGhpcy5za2lwKDQpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImludmFsaWQgd2lyZSB0eXBlICIrbSsiIGF0IG9mZnNldCAiK3RoaXMucG9zKX1yZXR1cm4gdGhpc30sZi5fY29uZmlndXJlPWZ1bmN0aW9uKG0pe289bSxmLmNyZWF0ZT1uKCksby5fY29uZmlndXJlKCk7dmFyIGc9dS5Mb25nPyJ0b0xvbmciOiJ0b051bWJlciI7dS5tZXJnZShmLnByb3RvdHlwZSx7aW50NjQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHRoaXMpW2ddKCExKX0sdWludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzKVtnXSghMCl9LHNpbnQ2NDpmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcykuenpEZWNvZGUoKVtnXSghMSl9LGZpeGVkNjQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5jYWxsKHRoaXMpW2ddKCEwKX0sc2ZpeGVkNjQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5jYWxsKHRoaXMpW2ddKCExKX19KX19LDU5MzooYyx0LHIpPT57Yy5leHBvcnRzPWg7dmFyIG89cigxNDA4KTsoaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWg7dmFyIHU9cig5NjkzKTtmdW5jdGlvbiBoKGEpe28uY2FsbCh0aGlzLGEpfWguX2NvbmZpZ3VyZT1mdW5jdGlvbigpe3UuQnVmZmVyJiYoaC5wcm90b3R5cGUuX3NsaWNlPXUuQnVmZmVyLnByb3RvdHlwZS5zbGljZSl9LGgucHJvdG90eXBlLnN0cmluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMudWludDMyKCk7cmV0dXJuIHRoaXMuYnVmLnV0ZjhTbGljZT90aGlzLmJ1Zi51dGY4U2xpY2UodGhpcy5wb3MsdGhpcy5wb3M9TWF0aC5taW4odGhpcy5wb3MrYSx0aGlzLmxlbikpOnRoaXMuYnVmLnRvU3RyaW5nKCJ1dGYtOCIsdGhpcy5wb3MsdGhpcy5wb3M9TWF0aC5taW4odGhpcy5wb3MrYSx0aGlzLmxlbikpfSxoLl9jb25maWd1cmUoKX0sNTA1NDpjPT57Yy5leHBvcnRzPXt9fSw1OTk0OihjLHQscik9Pnt0LlNlcnZpY2U9cig3OTQ4KX0sNzk0ODooYyx0LHIpPT57Yy5leHBvcnRzPXU7dmFyIG89cig5NjkzKTtmdW5jdGlvbiB1KGgsYSxwKXtpZih0eXBlb2YgaCE9ImZ1bmN0aW9uIil0aHJvdyBUeXBlRXJyb3IoInJwY0ltcGwgbXVzdCBiZSBhIGZ1bmN0aW9uIik7by5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzKSx0aGlzLnJwY0ltcGw9aCx0aGlzLnJlcXVlc3REZWxpbWl0ZWQ9ISFhLHRoaXMucmVzcG9uc2VEZWxpbWl0ZWQ9ISFwfSh1LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8uRXZlbnRFbWl0dGVyLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXUsdS5wcm90b3R5cGUucnBjQ2FsbD1mdW5jdGlvbiBoKGEscCxmLGQsbCl7aWYoIWQpdGhyb3cgVHlwZUVycm9yKCJyZXF1ZXN0IG11c3QgYmUgc3BlY2lmaWVkIik7dmFyIG49dGhpcztpZighbClyZXR1cm4gby5hc1Byb21pc2UoaCxuLGEscCxmLGQpO2lmKG4ucnBjSW1wbCl0cnl7cmV0dXJuIG4ucnBjSW1wbChhLHBbbi5yZXF1ZXN0RGVsaW1pdGVkPyJlbmNvZGVEZWxpbWl0ZWQiOiJlbmNvZGUiXShkKS5maW5pc2goKSxmdW5jdGlvbihlLGkpe2lmKGUpcmV0dXJuIG4uZW1pdCgiZXJyb3IiLGUsYSksbChlKTtpZihpIT09bnVsbCl7aWYoIShpIGluc3RhbmNlb2YgZikpdHJ5e2k9ZltuLnJlc3BvbnNlRGVsaW1pdGVkPyJkZWNvZGVEZWxpbWl0ZWQiOiJkZWNvZGUiXShpKX1jYXRjaChzKXtyZXR1cm4gbi5lbWl0KCJlcnJvciIscyxhKSxsKHMpfXJldHVybiBuLmVtaXQoImRhdGEiLGksYSksbChudWxsLGkpfW4uZW5kKCEwKX0pfWNhdGNoKGUpe3JldHVybiBuLmVtaXQoImVycm9yIixlLGEpLHZvaWQgc2V0VGltZW91dChmdW5jdGlvbigpe2woZSl9LDApfWVsc2Ugc2V0VGltZW91dChmdW5jdGlvbigpe2woRXJyb3IoImFscmVhZHkgZW5kZWQiKSl9LDApfSx1LnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24oaCl7cmV0dXJuIHRoaXMucnBjSW1wbCYmKGh8fHRoaXMucnBjSW1wbChudWxsLG51bGwsbnVsbCksdGhpcy5ycGNJbXBsPW51bGwsdGhpcy5lbWl0KCJlbmQiKS5vZmYoKSksdGhpc319LDE5NDU6KGMsdCxyKT0+e2MuZXhwb3J0cz11O3ZhciBvPXIoOTY5Myk7ZnVuY3Rpb24gdShmLGQpe3RoaXMubG89Zj4+PjAsdGhpcy5oaT1kPj4+MH12YXIgaD11Lnplcm89bmV3IHUoMCwwKTtoLnRvTnVtYmVyPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGguenpFbmNvZGU9aC56ekRlY29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxoLmxlbmd0aD1mdW5jdGlvbigpe3JldHVybiAxfTt2YXIgYT11Lnplcm9IYXNoPSJcMFwwXDBcMFwwXDBcMFwwIjt1LmZyb21OdW1iZXI9ZnVuY3Rpb24oZil7aWYoZj09PTApcmV0dXJuIGg7dmFyIGQ9ZjwwO2QmJihmPS1mKTt2YXIgbD1mPj4+MCxuPShmLWwpLzQyOTQ5NjcyOTY+Pj4wO3JldHVybiBkJiYobj1+bj4+PjAsbD1+bD4+PjAsKytsPjQyOTQ5NjcyOTUmJihsPTAsKytuPjQyOTQ5NjcyOTUmJihuPTApKSksbmV3IHUobCxuKX0sdS5mcm9tPWZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBmPT0ibnVtYmVyIilyZXR1cm4gdS5mcm9tTnVtYmVyKGYpO2lmKG8uaXNTdHJpbmcoZikpe2lmKCFvLkxvbmcpcmV0dXJuIHUuZnJvbU51bWJlcihwYXJzZUludChmLDEwKSk7Zj1vLkxvbmcuZnJvbVN0cmluZyhmKX1yZXR1cm4gZi5sb3d8fGYuaGlnaD9uZXcgdShmLmxvdz4+PjAsZi5oaWdoPj4+MCk6aH0sdS5wcm90b3R5cGUudG9OdW1iZXI9ZnVuY3Rpb24oZil7aWYoIWYmJnRoaXMuaGk+Pj4zMSl7dmFyIGQ9MSt+dGhpcy5sbz4+PjAsbD1+dGhpcy5oaT4+PjA7cmV0dXJuIGR8fChsPWwrMT4+PjApLC0oZCs0Mjk0OTY3Mjk2KmwpfXJldHVybiB0aGlzLmxvKzQyOTQ5NjcyOTYqdGhpcy5oaX0sdS5wcm90b3R5cGUudG9Mb25nPWZ1bmN0aW9uKGYpe3JldHVybiBvLkxvbmc/bmV3IG8uTG9uZygwfHRoaXMubG8sMHx0aGlzLmhpLCEhZik6e2xvdzowfHRoaXMubG8saGlnaDowfHRoaXMuaGksdW5zaWduZWQ6ISFmfX07dmFyIHA9U3RyaW5nLnByb3RvdHlwZS5jaGFyQ29kZUF0O3UuZnJvbUhhc2g9ZnVuY3Rpb24oZil7cmV0dXJuIGY9PT1hP2g6bmV3IHUoKHAuY2FsbChmLDApfHAuY2FsbChmLDEpPDw4fHAuY2FsbChmLDIpPDwxNnxwLmNhbGwoZiwzKTw8MjQpPj4+MCwocC5jYWxsKGYsNCl8cC5jYWxsKGYsNSk8PDh8cC5jYWxsKGYsNik8PDE2fHAuY2FsbChmLDcpPDwyNCk+Pj4wKX0sdS5wcm90b3R5cGUudG9IYXNoPWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoMjU1JnRoaXMubG8sdGhpcy5sbz4+PjgmMjU1LHRoaXMubG8+Pj4xNiYyNTUsdGhpcy5sbz4+PjI0LDI1NSZ0aGlzLmhpLHRoaXMuaGk+Pj44JjI1NSx0aGlzLmhpPj4+MTYmMjU1LHRoaXMuaGk+Pj4yNCl9LHUucHJvdG90eXBlLnp6RW5jb2RlPWZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5oaT4+MzE7cmV0dXJuIHRoaXMuaGk9KCh0aGlzLmhpPDwxfHRoaXMubG8+Pj4zMSleZik+Pj4wLHRoaXMubG89KHRoaXMubG88PDFeZik+Pj4wLHRoaXN9LHUucHJvdG90eXBlLnp6RGVjb2RlPWZ1bmN0aW9uKCl7dmFyIGY9LSgxJnRoaXMubG8pO3JldHVybiB0aGlzLmxvPSgodGhpcy5sbz4+PjF8dGhpcy5oaTw8MzEpXmYpPj4+MCx0aGlzLmhpPSh0aGlzLmhpPj4+MV5mKT4+PjAsdGhpc30sdS5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5sbyxkPSh0aGlzLmxvPj4+Mjh8dGhpcy5oaTw8NCk+Pj4wLGw9dGhpcy5oaT4+PjI0O3JldHVybiBsPT09MD9kPT09MD9mPDE2Mzg0P2Y8MTI4PzE6MjpmPDIwOTcxNTI/Mzo0OmQ8MTYzODQ/ZDwxMjg/NTo2OmQ8MjA5NzE1Mj83Ojg6bDwxMjg/OToxMH19LDk2OTM6ZnVuY3Rpb24oYyx0LHIpe3ZhciBvPXQ7ZnVuY3Rpb24gdShhLHAsZil7Zm9yKHZhciBkPU9iamVjdC5rZXlzKHApLGw9MDtsPGQubGVuZ3RoOysrbClhW2RbbF1dIT09dm9pZCAwJiZmfHwoYVtkW2xdXT1wW2RbbF1dKTtyZXR1cm4gYX1mdW5jdGlvbiBoKGEpe2Z1bmN0aW9uIHAoZixkKXtpZighKHRoaXMgaW5zdGFuY2VvZiBwKSlyZXR1cm4gbmV3IHAoZixkKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibWVzc2FnZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBmfX0pLEVycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMscCk6T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInN0YWNrIix7dmFsdWU6bmV3IEVycm9yKCkuc3RhY2t8fCIifSksZCYmdSh0aGlzLGQpfXJldHVybihwLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHAucHJvdG90eXBlLCJuYW1lIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9fSkscC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lKyI6ICIrdGhpcy5tZXNzYWdlfSxwfW8uYXNQcm9taXNlPXIoNDUzNyksby5iYXNlNjQ9cig3NDE5KSxvLkV2ZW50RW1pdHRlcj1yKDkyMTEpLG8uZmxvYXQ9cig5NDUpLG8uaW5xdWlyZT1yKDcxOTkpLG8udXRmOD1yKDQ5OTcpLG8ucG9vbD1yKDY2NjIpLG8uTG9uZ0JpdHM9cigxOTQ1KSxvLmlzTm9kZT0hIShyLmchPT12b2lkIDAmJnIuZyYmci5nLnByb2Nlc3MmJnIuZy5wcm9jZXNzLnZlcnNpb25zJiZyLmcucHJvY2Vzcy52ZXJzaW9ucy5ub2RlKSxvLmdsb2JhbD1vLmlzTm9kZSYmci5nfHx0eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93fHx0eXBlb2Ygc2VsZjwidSImJnNlbGZ8fHRoaXMsby5lbXB0eUFycmF5PU9iamVjdC5mcmVlemU/T2JqZWN0LmZyZWV6ZShbXSk6W10sby5lbXB0eU9iamVjdD1PYmplY3QuZnJlZXplP09iamVjdC5mcmVlemUoe30pOnt9LG8uaXNJbnRlZ2VyPU51bWJlci5pc0ludGVnZXJ8fGZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09Im51bWJlciImJmlzRmluaXRlKGEpJiZNYXRoLmZsb29yKGEpPT09YX0sby5pc1N0cmluZz1mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PSJzdHJpbmcifHxhIGluc3RhbmNlb2YgU3RyaW5nfSxvLmlzT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0eXBlb2YgYT09Im9iamVjdCJ9LG8uaXNzZXQ9by5pc1NldD1mdW5jdGlvbihhLHApe3ZhciBmPWFbcF07cmV0dXJuIShmPT1udWxsfHwhYS5oYXNPd25Qcm9wZXJ0eShwKSkmJih0eXBlb2YgZiE9Im9iamVjdCJ8fChBcnJheS5pc0FycmF5KGYpP2YubGVuZ3RoOk9iamVjdC5rZXlzKGYpLmxlbmd0aCk+MCl9LG8uQnVmZmVyPWZ1bmN0aW9uKCl7dHJ5e3ZhciBhPW8uaW5xdWlyZSgiYnVmZmVyIikuQnVmZmVyO3JldHVybiBhLnByb3RvdHlwZS51dGY4V3JpdGU/YTpudWxsfWNhdGNoe3JldHVybiBudWxsfX0oKSxvLl9CdWZmZXJfZnJvbT1udWxsLG8uX0J1ZmZlcl9hbGxvY1Vuc2FmZT1udWxsLG8ubmV3QnVmZmVyPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09Im51bWJlciI/by5CdWZmZXI/by5fQnVmZmVyX2FsbG9jVW5zYWZlKGEpOm5ldyBvLkFycmF5KGEpOm8uQnVmZmVyP28uX0J1ZmZlcl9mcm9tKGEpOnR5cGVvZiBVaW50OEFycmF5PiJ1Ij9hOm5ldyBVaW50OEFycmF5KGEpfSxvLkFycmF5PXR5cGVvZiBVaW50OEFycmF5PCJ1Ij9VaW50OEFycmF5OkFycmF5LG8uTG9uZz1vLmdsb2JhbC5kY29kZUlPJiZvLmdsb2JhbC5kY29kZUlPLkxvbmd8fG8uZ2xvYmFsLkxvbmd8fG8uaW5xdWlyZSgibG9uZyIpLG8ua2V5MlJlPS9edHJ1ZXxmYWxzZXwwfDEkLyxvLmtleTMyUmU9L14tPyg/OjB8WzEtOV1bMC05XSopJC8sby5rZXk2NFJlPS9eKD86W1xceDAwLVxceGZmXXs4fXwtPyg/OjB8WzEtOV1bMC05XSopKSQvLG8ubG9uZ1RvSGFzaD1mdW5jdGlvbihhKXtyZXR1cm4gYT9vLkxvbmdCaXRzLmZyb20oYSkudG9IYXNoKCk6by5Mb25nQml0cy56ZXJvSGFzaH0sby5sb25nRnJvbUhhc2g9ZnVuY3Rpb24oYSxwKXt2YXIgZj1vLkxvbmdCaXRzLmZyb21IYXNoKGEpO3JldHVybiBvLkxvbmc/by5Mb25nLmZyb21CaXRzKGYubG8sZi5oaSxwKTpmLnRvTnVtYmVyKCEhcCl9LG8ubWVyZ2U9dSxvLmxjRmlyc3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkrYS5zdWJzdHJpbmcoMSl9LG8ubmV3RXJyb3I9aCxvLlByb3RvY29sRXJyb3I9aCgiUHJvdG9jb2xFcnJvciIpLG8ub25lT2ZHZXR0ZXI9ZnVuY3Rpb24oYSl7Zm9yKHZhciBwPXt9LGY9MDtmPGEubGVuZ3RoOysrZilwW2FbZl1dPTE7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBkPU9iamVjdC5rZXlzKHRoaXMpLGw9ZC5sZW5ndGgtMTtsPi0xOy0tbClpZihwW2RbbF1dPT09MSYmdGhpc1tkW2xdXSE9PXZvaWQgMCYmdGhpc1tkW2xdXSE9PW51bGwpcmV0dXJuIGRbbF19fSxvLm9uZU9mU2V0dGVyPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihwKXtmb3IodmFyIGY9MDtmPGEubGVuZ3RoOysrZilhW2ZdIT09cCYmZGVsZXRlIHRoaXNbYVtmXV19fSxvLnRvSlNPTk9wdGlvbnM9e2xvbmdzOlN0cmluZyxlbnVtczpTdHJpbmcsYnl0ZXM6U3RyaW5nLGpzb246ITB9LG8uX2NvbmZpZ3VyZT1mdW5jdGlvbigpe3ZhciBhPW8uQnVmZmVyO2E/KG8uX0J1ZmZlcl9mcm9tPWEuZnJvbSE9PVVpbnQ4QXJyYXkuZnJvbSYmYS5mcm9tfHxmdW5jdGlvbihwLGYpe3JldHVybiBuZXcgYShwLGYpfSxvLl9CdWZmZXJfYWxsb2NVbnNhZmU9YS5hbGxvY1Vuc2FmZXx8ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBhKHApfSk6by5fQnVmZmVyX2Zyb209by5fQnVmZmVyX2FsbG9jVW5zYWZlPW51bGx9fSwxMTczOihjLHQscik9PntjLmV4cG9ydHM9bjt2YXIgbyx1PXIoOTY5MyksaD11LkxvbmdCaXRzLGE9dS5iYXNlNjQscD11LnV0Zjg7ZnVuY3Rpb24gZihiLHksVCl7dGhpcy5mbj1iLHRoaXMubGVuPXksdGhpcy5uZXh0PXZvaWQgMCx0aGlzLnZhbD1UfWZ1bmN0aW9uIGQoKXt9ZnVuY3Rpb24gbChiKXt0aGlzLmhlYWQ9Yi5oZWFkLHRoaXMudGFpbD1iLnRhaWwsdGhpcy5sZW49Yi5sZW4sdGhpcy5uZXh0PWIuc3RhdGVzfWZ1bmN0aW9uIG4oKXt0aGlzLmxlbj0wLHRoaXMuaGVhZD1uZXcgZihkLDAsMCksdGhpcy50YWlsPXRoaXMuaGVhZCx0aGlzLnN0YXRlcz1udWxsfXZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuIHUuQnVmZmVyP2Z1bmN0aW9uKCl7cmV0dXJuKG4uY3JlYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvfSkoKX06ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG59fTtmdW5jdGlvbiBpKGIseSxUKXt5W1RdPTI1NSZifWZ1bmN0aW9uIHMoYix5KXt0aGlzLmxlbj1iLHRoaXMubmV4dD12b2lkIDAsdGhpcy52YWw9eX1mdW5jdGlvbiBtKGIseSxUKXtmb3IoO2IuaGk7KXlbVCsrXT0xMjcmYi5sb3wxMjgsYi5sbz0oYi5sbz4+Pjd8Yi5oaTw8MjUpPj4+MCxiLmhpPj4+PTc7Zm9yKDtiLmxvPjEyNzspeVtUKytdPTEyNyZiLmxvfDEyOCxiLmxvPWIubG8+Pj43O3lbVCsrXT1iLmxvfWZ1bmN0aW9uIGcoYix5LFQpe3lbVF09MjU1JmIseVtUKzFdPWI+Pj44JjI1NSx5W1QrMl09Yj4+PjE2JjI1NSx5W1QrM109Yj4+PjI0fW4uY3JlYXRlPWUoKSxuLmFsbG9jPWZ1bmN0aW9uKGIpe3JldHVybiBuZXcgdS5BcnJheShiKX0sdS5BcnJheSE9PUFycmF5JiYobi5hbGxvYz11LnBvb2wobi5hbGxvYyx1LkFycmF5LnByb3RvdHlwZS5zdWJhcnJheSkpLG4ucHJvdG90eXBlLl9wdXNoPWZ1bmN0aW9uKGIseSxUKXtyZXR1cm4gdGhpcy50YWlsPXRoaXMudGFpbC5uZXh0PW5ldyBmKGIseSxUKSx0aGlzLmxlbis9eSx0aGlzfSxzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGYucHJvdG90eXBlKSxzLnByb3RvdHlwZS5mbj1mdW5jdGlvbihiLHksVCl7Zm9yKDtiPjEyNzspeVtUKytdPTEyNyZifDEyOCxiPj4+PTc7eVtUXT1ifSxuLnByb3RvdHlwZS51aW50MzI9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubGVuKz0odGhpcy50YWlsPXRoaXMudGFpbC5uZXh0PW5ldyBzKChiPj4+PTApPDEyOD8xOmI8MTYzODQ/MjpiPDIwOTcxNTI/MzpiPDI2ODQzNTQ1Nj80OjUsYikpLmxlbix0aGlzfSxuLnByb3RvdHlwZS5pbnQzMj1mdW5jdGlvbihiKXtyZXR1cm4gYjwwP3RoaXMuX3B1c2gobSwxMCxoLmZyb21OdW1iZXIoYikpOnRoaXMudWludDMyKGIpfSxuLnByb3RvdHlwZS5zaW50MzI9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMudWludDMyKChiPDwxXmI+PjMxKT4+PjApfSxuLnByb3RvdHlwZS51aW50NjQ9ZnVuY3Rpb24oYil7dmFyIHk9aC5mcm9tKGIpO3JldHVybiB0aGlzLl9wdXNoKG0seS5sZW5ndGgoKSx5KX0sbi5wcm90b3R5cGUuaW50NjQ9bi5wcm90b3R5cGUudWludDY0LG4ucHJvdG90eXBlLnNpbnQ2ND1mdW5jdGlvbihiKXt2YXIgeT1oLmZyb20oYikuenpFbmNvZGUoKTtyZXR1cm4gdGhpcy5fcHVzaChtLHkubGVuZ3RoKCkseSl9LG4ucHJvdG90eXBlLmJvb2w9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX3B1c2goaSwxLGI/MTowKX0sbi5wcm90b3R5cGUuZml4ZWQzMj1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fcHVzaChnLDQsYj4+PjApfSxuLnByb3RvdHlwZS5zZml4ZWQzMj1uLnByb3RvdHlwZS5maXhlZDMyLG4ucHJvdG90eXBlLmZpeGVkNjQ9ZnVuY3Rpb24oYil7dmFyIHk9aC5mcm9tKGIpO3JldHVybiB0aGlzLl9wdXNoKGcsNCx5LmxvKS5fcHVzaChnLDQseS5oaSl9LG4ucHJvdG90eXBlLnNmaXhlZDY0PW4ucHJvdG90eXBlLmZpeGVkNjQsbi5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX3B1c2godS5mbG9hdC53cml0ZUZsb2F0TEUsNCxiKX0sbi5wcm90b3R5cGUuZG91YmxlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9wdXNoKHUuZmxvYXQud3JpdGVEb3VibGVMRSw4LGIpfTt2YXIgXz11LkFycmF5LnByb3RvdHlwZS5zZXQ/ZnVuY3Rpb24oYix5LFQpe3kuc2V0KGIsVCl9OmZ1bmN0aW9uKGIseSxUKXtmb3IodmFyIHc9MDt3PGIubGVuZ3RoOysrdyl5W1Qrd109Ylt3XX07bi5wcm90b3R5cGUuYnl0ZXM9ZnVuY3Rpb24oYil7dmFyIHk9Yi5sZW5ndGg+Pj4wO2lmKCF5KXJldHVybiB0aGlzLl9wdXNoKGksMSwwKTtpZih1LmlzU3RyaW5nKGIpKXt2YXIgVD1uLmFsbG9jKHk9YS5sZW5ndGgoYikpO2EuZGVjb2RlKGIsVCwwKSxiPVR9cmV0dXJuIHRoaXMudWludDMyKHkpLl9wdXNoKF8seSxiKX0sbi5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKGIpe3ZhciB5PXAubGVuZ3RoKGIpO3JldHVybiB5P3RoaXMudWludDMyKHkpLl9wdXNoKHAud3JpdGUseSxiKTp0aGlzLl9wdXNoKGksMSwwKX0sbi5wcm90b3R5cGUuZm9yaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlcz1uZXcgbCh0aGlzKSx0aGlzLmhlYWQ9dGhpcy50YWlsPW5ldyBmKGQsMCwwKSx0aGlzLmxlbj0wLHRoaXN9LG4ucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVzPyh0aGlzLmhlYWQ9dGhpcy5zdGF0ZXMuaGVhZCx0aGlzLnRhaWw9dGhpcy5zdGF0ZXMudGFpbCx0aGlzLmxlbj10aGlzLnN0YXRlcy5sZW4sdGhpcy5zdGF0ZXM9dGhpcy5zdGF0ZXMubmV4dCk6KHRoaXMuaGVhZD10aGlzLnRhaWw9bmV3IGYoZCwwLDApLHRoaXMubGVuPTApLHRoaXN9LG4ucHJvdG90eXBlLmxkZWxpbT1mdW5jdGlvbigpe3ZhciBiPXRoaXMuaGVhZCx5PXRoaXMudGFpbCxUPXRoaXMubGVuO3JldHVybiB0aGlzLnJlc2V0KCkudWludDMyKFQpLFQmJih0aGlzLnRhaWwubmV4dD1iLm5leHQsdGhpcy50YWlsPXksdGhpcy5sZW4rPVQpLHRoaXN9LG4ucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLmhlYWQubmV4dCx5PXRoaXMuY29uc3RydWN0b3IuYWxsb2ModGhpcy5sZW4pLFQ9MDtiOyliLmZuKGIudmFsLHksVCksVCs9Yi5sZW4sYj1iLm5leHQ7cmV0dXJuIHl9LG4uX2NvbmZpZ3VyZT1mdW5jdGlvbihiKXtvPWIsbi5jcmVhdGU9ZSgpLG8uX2NvbmZpZ3VyZSgpfX0sMzE1NTooYyx0LHIpPT57Yy5leHBvcnRzPWg7dmFyIG89cigxMTczKTsoaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWg7dmFyIHU9cig5NjkzKTtmdW5jdGlvbiBoKCl7by5jYWxsKHRoaXMpfWZ1bmN0aW9uIGEocCxmLGQpe3AubGVuZ3RoPDQwP3UudXRmOC53cml0ZShwLGYsZCk6Zi51dGY4V3JpdGU/Zi51dGY4V3JpdGUocCxkKTpmLndyaXRlKHAsZCl9aC5fY29uZmlndXJlPWZ1bmN0aW9uKCl7aC5hbGxvYz11Ll9CdWZmZXJfYWxsb2NVbnNhZmUsaC53cml0ZUJ5dGVzQnVmZmVyPXUuQnVmZmVyJiZ1LkJ1ZmZlci5wcm90b3R5cGUgaW5zdGFuY2VvZiBVaW50OEFycmF5JiZ1LkJ1ZmZlci5wcm90b3R5cGUuc2V0Lm5hbWU9PT0ic2V0Ij9mdW5jdGlvbihwLGYsZCl7Zi5zZXQocCxkKX06ZnVuY3Rpb24ocCxmLGQpe2lmKHAuY29weSlwLmNvcHkoZixkLDAscC5sZW5ndGgpO2Vsc2UgZm9yKHZhciBsPTA7bDxwLmxlbmd0aDspZltkKytdPXBbbCsrXX19LGgucHJvdG90eXBlLmJ5dGVzPWZ1bmN0aW9uKHApe3UuaXNTdHJpbmcocCkmJihwPXUuX0J1ZmZlcl9mcm9tKHAsImJhc2U2NCIpKTt2YXIgZj1wLmxlbmd0aD4+PjA7cmV0dXJuIHRoaXMudWludDMyKGYpLGYmJnRoaXMuX3B1c2goaC53cml0ZUJ5dGVzQnVmZmVyLGYscCksdGhpc30saC5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKHApe3ZhciBmPXUuQnVmZmVyLmJ5dGVMZW5ndGgocCk7cmV0dXJuIHRoaXMudWludDMyKGYpLGYmJnRoaXMuX3B1c2goYSxmLHApLHRoaXN9LGguX2NvbmZpZ3VyZSgpfSw3NzE0OihjLHQscik9Pnt0LlI9dm9pZCAwO2NvbnN0IG89cig2OTE5KSx1PXIoNzQ0OCk7dC5SPW5ldyBjbGFzc3thc3luYyBpbml0KCl7fWFzeW5jIGNyZWF0ZVNlc3Npb25IYW5kbGVyKGgsYSl7Y29uc3QgcD1uZXcgby5TZXNzaW9uKGEpO3JldHVybiBhd2FpdCBwLmxvYWRNb2RlbChoKSxuZXcgdS5Pbm54anNTZXNzaW9uSGFuZGxlcihwKX19fSw0MjAwOihjLHQscik9Pnt0LmM4PXQuclg9dm9pZCAwO2NvbnN0IG89cigxNjcwKSx1PXIoNTM4MSksaD1yKDIxNTcpLGE9cigyMzA2KTt0LnJYPSgpPT57aWYoKHR5cGVvZiBvLmVudi53YXNtLmluaXRUaW1lb3V0IT0ibnVtYmVyInx8by5lbnYud2FzbS5pbml0VGltZW91dDwwKSYmKG8uZW52Lndhc20uaW5pdFRpbWVvdXQ9MCksdHlwZW9mIG8uZW52Lndhc20uc2ltZCE9ImJvb2xlYW4iJiYoby5lbnYud2FzbS5zaW1kPSEwKSx0eXBlb2Ygby5lbnYud2FzbS5wcm94eSE9ImJvb2xlYW4iJiYoby5lbnYud2FzbS5wcm94eT0hMSksdHlwZW9mIG8uZW52Lndhc20ubnVtVGhyZWFkcyE9Im51bWJlciJ8fCFOdW1iZXIuaXNJbnRlZ2VyKG8uZW52Lndhc20ubnVtVGhyZWFkcyl8fG8uZW52Lndhc20ubnVtVGhyZWFkczw9MCl7Y29uc3QgcD10eXBlb2YgbmF2aWdhdG9yPiJ1Ij8oMCx1LmNwdXMpKCkubGVuZ3RoOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5O28uZW52Lndhc20ubnVtVGhyZWFkcz1NYXRoLm1pbig0LE1hdGguY2VpbCgocHx8MSkvMikpfX0sdC5jOD1uZXcgY2xhc3N7YXN5bmMgaW5pdCgpeygwLHQuclgpKCksYXdhaXQoMCxoLmluaXRXYXNtKSgpfWFzeW5jIGNyZWF0ZVNlc3Npb25IYW5kbGVyKHAsZil7Y29uc3QgZD1uZXcgYS5Pbm54cnVudGltZVdlYkFzc2VtYmx5U2Vzc2lvbkhhbmRsZXI7cmV0dXJuIGF3YWl0IGQubG9hZE1vZGVsKHAsZiksUHJvbWlzZS5yZXNvbHZlKGQpfX19LDYwMTg6ZnVuY3Rpb24oYyx0LHIpe3ZhciBvPXRoaXMmJnRoaXMuX19jcmVhdGVCaW5kaW5nfHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihhLHAsZixkKXtkPT09dm9pZCAwJiYoZD1mKTt2YXIgbD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHAsZik7bCYmISgiZ2V0ImluIGw/IXAuX19lc01vZHVsZTpsLndyaXRhYmxlfHxsLmNvbmZpZ3VyYWJsZSl8fChsPXtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBwW2ZdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGQsbCl9OmZ1bmN0aW9uKGEscCxmLGQpe2Q9PT12b2lkIDAmJihkPWYpLGFbZF09cFtmXX0pLHU9dGhpcyYmdGhpcy5fX2V4cG9ydFN0YXJ8fGZ1bmN0aW9uKGEscCl7Zm9yKHZhciBmIGluIGEpZj09PSJkZWZhdWx0Inx8T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHAsZil8fG8ocCxhLGYpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdShyKDE2NzApLHQpO2NvbnN0IGg9cigxNjcwKTt7Y29uc3QgYT1yKDc3MTQpLlI7KDAsaC5yZWdpc3RlckJhY2tlbmQpKCJ3ZWJnbCIsYSwtMTApfXtjb25zdCBhPXIoNDIwMCkuYzg7KDAsaC5yZWdpc3RlckJhY2tlbmQpKCJjcHUiLGEsMTApLCgwLGgucmVnaXN0ZXJCYWNrZW5kKSgid2FzbSIsYSwxMCksKDAsaC5yZWdpc3RlckJhY2tlbmQpKCJ4bm5wYWNrIixhLDkpfX0sMjQ2OihjLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5PXZvaWQgMDtjbGFzcyBye2NvbnN0cnVjdG9yKHUpe09iamVjdC5hc3NpZ24odGhpcyx1KX1nZXQgY2FjaGVLZXkoKXtyZXR1cm4gdGhpcy5fY2FjaGVLZXl8fCh0aGlzLl9jYWNoZUtleT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKS5zb3J0KCkubWFwKHU9PmAke3RoaXNbdV19YCkuam9pbigiOyIpKSx0aGlzLl9jYWNoZUtleX19dC5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXk9bz0+bmV3IHIobyl9LDc3Nzg6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkF0dHJpYnV0ZT12b2lkIDA7Y29uc3Qgbz1yKDE0NDYpLHU9cig5Mzk1KSxoPXIoOTE2MiksYT1yKDI1MTcpO3ZhciBwPXUub25ueHJ1bnRpbWUuZXhwZXJpbWVudGFsLmZicztjbGFzcyBme2NvbnN0cnVjdG9yKGwpe2lmKHRoaXMuX2F0dHJpYnV0ZXM9bmV3IE1hcCxsIT1udWxsKXtmb3IoY29uc3QgbiBvZiBsKW4gaW5zdGFuY2VvZiBvLm9ubnguQXR0cmlidXRlUHJvdG8/dGhpcy5fYXR0cmlidXRlcy5zZXQobi5uYW1lLFtmLmdldFZhbHVlKG4pLGYuZ2V0VHlwZShuKV0pOm4gaW5zdGFuY2VvZiBwLkF0dHJpYnV0ZSYmdGhpcy5fYXR0cmlidXRlcy5zZXQobi5uYW1lKCksW2YuZ2V0VmFsdWUobiksZi5nZXRUeXBlKG4pXSk7aWYodGhpcy5fYXR0cmlidXRlcy5zaXplPGwubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZHVwbGljYXRlZCBhdHRyaWJ1dGUgbmFtZXMiKX19c2V0KGwsbixlKXt0aGlzLl9hdHRyaWJ1dGVzLnNldChsLFtlLG5dKX1kZWxldGUobCl7dGhpcy5fYXR0cmlidXRlcy5kZWxldGUobCl9Z2V0RmxvYXQobCxuKXtyZXR1cm4gdGhpcy5nZXQobCwiZmxvYXQiLG4pfWdldEludChsLG4pe3JldHVybiB0aGlzLmdldChsLCJpbnQiLG4pfWdldFN0cmluZyhsLG4pe3JldHVybiB0aGlzLmdldChsLCJzdHJpbmciLG4pfWdldFRlbnNvcihsLG4pe3JldHVybiB0aGlzLmdldChsLCJ0ZW5zb3IiLG4pfWdldEZsb2F0cyhsLG4pe3JldHVybiB0aGlzLmdldChsLCJmbG9hdHMiLG4pfWdldEludHMobCxuKXtyZXR1cm4gdGhpcy5nZXQobCwiaW50cyIsbil9Z2V0U3RyaW5ncyhsLG4pe3JldHVybiB0aGlzLmdldChsLCJzdHJpbmdzIixuKX1nZXRUZW5zb3JzKGwsbil7cmV0dXJuIHRoaXMuZ2V0KGwsInRlbnNvcnMiLG4pfWdldChsLG4sZSl7Y29uc3QgaT10aGlzLl9hdHRyaWJ1dGVzLmdldChsKTtpZihpPT09dm9pZCAwKXtpZihlIT09dm9pZCAwKXJldHVybiBlO3Rocm93IG5ldyBFcnJvcihgcmVxdWlyZWQgYXR0cmlidXRlIG5vdCBmb3VuZDogJHtsfWApfWlmKGlbMV0hPT1uKXRocm93IG5ldyBFcnJvcihgdHlwZSBtaXNtYXRjaDogZXhwZWN0ZWQgJHtufSBidXQgZ290ICR7aVsxXX1gKTtyZXR1cm4gaVswXX1zdGF0aWMgZ2V0VHlwZShsKXtjb25zdCBuPWwgaW5zdGFuY2VvZiBvLm9ubnguQXR0cmlidXRlUHJvdG8/bC50eXBlOmwudHlwZSgpO3N3aXRjaChuKXtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkZMT0FUOnJldHVybiJmbG9hdCI7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlQ6cmV0dXJuImludCI7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkc6cmV0dXJuInN0cmluZyI7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5URU5TT1I6cmV0dXJuInRlbnNvciI7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5GTE9BVFM6cmV0dXJuImZsb2F0cyI7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlRTOnJldHVybiJpbnRzIjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlNUUklOR1M6cmV0dXJuInN0cmluZ3MiO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuVEVOU09SUzpyZXR1cm4idGVuc29ycyI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGF0dHJpYnV0ZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0OiAke28ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlW25dfWApfX1zdGF0aWMgZ2V0VmFsdWUobCl7Y29uc3Qgbj1sIGluc3RhbmNlb2Ygby5vbm54LkF0dHJpYnV0ZVByb3RvP2wudHlwZTpsLnR5cGUoKTtpZihuPT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuR1JBUEh8fG49PT1vLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5HUkFQSFMpdGhyb3cgbmV3IEVycm9yKCJncmFwaCBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQiKTtjb25zdCBlPXRoaXMuZ2V0VmFsdWVOb0NoZWNrKGwpO2lmKG49PT1vLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlQmJmEuTG9uZ1V0aWwuaXNMb25nKGUpKXJldHVybiBhLkxvbmdVdGlsLmxvbmdUb051bWJlcihlKTtpZihuPT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuSU5UUyl7Y29uc3QgaT1lLHM9bmV3IEFycmF5KGkubGVuZ3RoKTtmb3IobGV0IG09MDttPGkubGVuZ3RoO20rKyl7Y29uc3QgZz1pW21dO3NbbV09YS5Mb25nVXRpbC5sb25nVG9OdW1iZXIoZyl9cmV0dXJuIHN9aWYobj09PW8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUilyZXR1cm4gbCBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz9oLlRlbnNvci5mcm9tUHJvdG8oZSk6aC5UZW5zb3IuZnJvbU9ydFRlbnNvcihlKTtpZihuPT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuVEVOU09SUyl7aWYobCBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bylyZXR1cm4gZS5tYXAoaT0+aC5UZW5zb3IuZnJvbVByb3RvKGkpKTtpZihsIGluc3RhbmNlb2YgcC5BdHRyaWJ1dGUpcmV0dXJuIGUubWFwKGk9PmguVGVuc29yLmZyb21PcnRUZW5zb3IoaSkpfWlmKG49PT1vLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkcmJmwgaW5zdGFuY2VvZiBvLm9ubnguQXR0cmlidXRlUHJvdG8pe2NvbnN0IGk9ZTtyZXR1cm4oMCxhLmRlY29kZVV0ZjhTdHJpbmcpKGkpfXJldHVybiBuPT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuU1RSSU5HUyYmbCBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz9lLm1hcChhLmRlY29kZVV0ZjhTdHJpbmcpOmV9c3RhdGljIGdldFZhbHVlTm9DaGVjayhsKXtyZXR1cm4gbCBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz90aGlzLmdldFZhbHVlTm9DaGVja0Zyb21Pbm54Rm9ybWF0KGwpOnRoaXMuZ2V0VmFsdWVOb0NoZWNrRnJvbU9ydEZvcm1hdChsKX1zdGF0aWMgZ2V0VmFsdWVOb0NoZWNrRnJvbU9ubnhGb3JtYXQobCl7c3dpdGNoKGwudHlwZSl7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5GTE9BVDpyZXR1cm4gbC5mO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuSU5UOnJldHVybiBsLmk7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkc6cmV0dXJuIGwucztjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUjpyZXR1cm4gbC50O2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuR1JBUEg6cmV0dXJuIGwuZztjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkZMT0FUUzpyZXR1cm4gbC5mbG9hdHM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlRTOnJldHVybiBsLmludHM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkdTOnJldHVybiBsLnN0cmluZ3M7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5URU5TT1JTOnJldHVybiBsLnRlbnNvcnM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5HUkFQSFM6cmV0dXJuIGwuZ3JhcGhzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBhdHRyaWJ1dGUgdHlwZTogJHtvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZVtsLnR5cGVdfWApfX1zdGF0aWMgZ2V0VmFsdWVOb0NoZWNrRnJvbU9ydEZvcm1hdChsKXtzd2l0Y2gobC50eXBlKCkpe2Nhc2UgcC5BdHRyaWJ1dGVUeXBlLkZMT0FUOnJldHVybiBsLmYoKTtjYXNlIHAuQXR0cmlidXRlVHlwZS5JTlQ6cmV0dXJuIGwuaSgpO2Nhc2UgcC5BdHRyaWJ1dGVUeXBlLlNUUklORzpyZXR1cm4gbC5zKCk7Y2FzZSBwLkF0dHJpYnV0ZVR5cGUuVEVOU09SOnJldHVybiBsLnQoKTtjYXNlIHAuQXR0cmlidXRlVHlwZS5HUkFQSDpyZXR1cm4gbC5nKCk7Y2FzZSBwLkF0dHJpYnV0ZVR5cGUuRkxPQVRTOnJldHVybiBsLmZsb2F0c0FycmF5KCk7Y2FzZSBwLkF0dHJpYnV0ZVR5cGUuSU5UUzp7Y29uc3Qgbj1bXTtmb3IobGV0IGU9MDtlPGwuaW50c0xlbmd0aCgpO2UrKyluLnB1c2gobC5pbnRzKGUpKTtyZXR1cm4gbn1jYXNlIHAuQXR0cmlidXRlVHlwZS5TVFJJTkdTOntjb25zdCBuPVtdO2ZvcihsZXQgZT0wO2U8bC5zdHJpbmdzTGVuZ3RoKCk7ZSsrKW4ucHVzaChsLnN0cmluZ3MoZSkpO3JldHVybiBufWNhc2UgcC5BdHRyaWJ1dGVUeXBlLlRFTlNPUlM6e2NvbnN0IG49W107Zm9yKGxldCBlPTA7ZTxsLnRlbnNvcnNMZW5ndGgoKTtlKyspbi5wdXNoKGwudGVuc29ycyhlKSk7cmV0dXJuIG59ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGF0dHJpYnV0ZSB0eXBlOiAke3AuQXR0cmlidXRlVHlwZVtsLnR5cGUoKV19YCl9fX10LkF0dHJpYnV0ZT1mfSw3MDkxOihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZXNvbHZlQmFja2VuZD10LmJhY2tlbmQ9dm9pZCAwO2NvbnN0IG89cig1MDM4KSx1PW5ldyBNYXA7YXN5bmMgZnVuY3Rpb24gaChhKXtjb25zdCBwPXQuYmFja2VuZDtpZihwW2FdIT09dm9pZCAwJiZmdW5jdGlvbihmKXtjb25zdCBkPWY7cmV0dXJuImluaXRpYWxpemUiaW4gZCYmdHlwZW9mIGQuaW5pdGlhbGl6ZT09ImZ1bmN0aW9uIiYmImNyZWF0ZVNlc3Npb25IYW5kbGVyImluIGQmJnR5cGVvZiBkLmNyZWF0ZVNlc3Npb25IYW5kbGVyPT0iZnVuY3Rpb24iJiYiZGlzcG9zZSJpbiBkJiZ0eXBlb2YgZC5kaXNwb3NlPT0iZnVuY3Rpb24ifShwW2FdKSl7Y29uc3QgZj1wW2FdO2xldCBkPWYuaW5pdGlhbGl6ZSgpO2lmKHR5cGVvZiBkPT0ib2JqZWN0IiYmInRoZW4iaW4gZCYmKGQ9YXdhaXQgZCksZClyZXR1cm4gdS5zZXQoYSxmKSxmfX10LmJhY2tlbmQ9e3dlYmdsOm5ldyBvLldlYkdMQmFja2VuZH0sdC5yZXNvbHZlQmFja2VuZD1hc3luYyBmdW5jdGlvbiBhKHApe2lmKCFwKXJldHVybiBhKFsid2ViZ2wiXSk7e2NvbnN0IGY9dHlwZW9mIHA9PSJzdHJpbmciP1twXTpwO2Zvcihjb25zdCBkIG9mIGYpe2NvbnN0IGw9dS5nZXQoZCk7aWYobClyZXR1cm4gbDtjb25zdCBuPWF3YWl0IGgoZCk7aWYobilyZXR1cm4gbn19dGhyb3cgbmV3IEVycm9yKCJubyBhdmFpbGFibGUgYmFja2VuZCB0byB1c2UiKX19LDUwMzg6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LldlYkdMQmFja2VuZD12b2lkIDA7Y29uc3Qgbz1yKDE2NzApLHU9cig2MjMxKSxoPXIoNjQxNiksYT1yKDczMDUpO3QuV2ViR0xCYWNrZW5kPWNsYXNze2dldCBjb250ZXh0SWQoKXtyZXR1cm4gby5lbnYud2ViZ2wuY29udGV4dElkfXNldCBjb250ZXh0SWQocCl7by5lbnYud2ViZ2wuY29udGV4dElkPXB9Z2V0IG1hdG11bE1heEJhdGNoU2l6ZSgpe3JldHVybiBvLmVudi53ZWJnbC5tYXRtdWxNYXhCYXRjaFNpemV9c2V0IG1hdG11bE1heEJhdGNoU2l6ZShwKXtvLmVudi53ZWJnbC5tYXRtdWxNYXhCYXRjaFNpemU9cH1nZXQgdGV4dHVyZUNhY2hlTW9kZSgpe3JldHVybiBvLmVudi53ZWJnbC50ZXh0dXJlQ2FjaGVNb2RlfXNldCB0ZXh0dXJlQ2FjaGVNb2RlKHApe28uZW52LndlYmdsLnRleHR1cmVDYWNoZU1vZGU9cH1nZXQgcGFjaygpe3JldHVybiBvLmVudi53ZWJnbC5wYWNrfXNldCBwYWNrKHApe28uZW52LndlYmdsLnBhY2s9cH1nZXQgYXN5bmMoKXtyZXR1cm4gby5lbnYud2ViZ2wuYXN5bmN9c2V0IGFzeW5jKHApe28uZW52LndlYmdsLmFzeW5jPXB9aW5pdGlhbGl6ZSgpe3RyeXtyZXR1cm4gdGhpcy5nbENvbnRleHQ9KDAsYS5jcmVhdGVXZWJHTENvbnRleHQpKHRoaXMuY29udGV4dElkKSx0eXBlb2YgdGhpcy5tYXRtdWxNYXhCYXRjaFNpemUhPSJudW1iZXIiJiYodGhpcy5tYXRtdWxNYXhCYXRjaFNpemU9MTYpLHR5cGVvZiB0aGlzLnRleHR1cmVDYWNoZU1vZGUhPSJzdHJpbmciJiYodGhpcy50ZXh0dXJlQ2FjaGVNb2RlPSJmdWxsIiksdHlwZW9mIHRoaXMucGFjayE9ImJvb2xlYW4iJiYodGhpcy5wYWNrPSExKSx0eXBlb2YgdGhpcy5hc3luYyE9ImJvb2xlYW4iJiYodGhpcy5hc3luYz0hMSksdS5Mb2dnZXIuc2V0V2l0aEVudihvLmVudiksdS5Mb2dnZXIudmVyYm9zZSgiV2ViR0xCYWNrZW5kIixgQ3JlYXRlZCBXZWJHTENvbnRleHQ6ICR7dHlwZW9mIHRoaXMuZ2xDb250ZXh0fSB3aXRoIG1hdG11bE1heEJhdGNoU2l6ZTogJHt0aGlzLm1hdG11bE1heEJhdGNoU2l6ZX07IHRleHR1cmVDYWNoZU1vZGU6ICR7dGhpcy50ZXh0dXJlQ2FjaGVNb2RlfTsgcGFjazogJHt0aGlzLnBhY2t9OyBhc3luYzogJHt0aGlzLmFzeW5jfS5gKSwhMH1jYXRjaChwKXtyZXR1cm4gdS5Mb2dnZXIud2FybmluZygiV2ViR0xCYWNrZW5kIixgVW5hYmxlIHRvIGluaXRpYWxpemUgV2ViR0xCYWNrZW5kLiAke3B9YCksITF9fWNyZWF0ZVNlc3Npb25IYW5kbGVyKHApe3JldHVybiBuZXcgaC5XZWJHTFNlc3Npb25IYW5kbGVyKHRoaXMscCl9ZGlzcG9zZSgpe3RoaXMuZ2xDb250ZXh0LmRpc3Bvc2UoKX19fSw1MTA3OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Db29yZHNHbHNsTGliPXZvaWQgMDtjb25zdCBvPXIoMjUxNyksdT1yKDg1MjApLGg9cig1MDYwKSxhPXIoNzg1OSkscD1yKDkzOTApO2NsYXNzIGYgZXh0ZW5kcyB1Lkdsc2xMaWJ7Y29uc3RydWN0b3IobCl7c3VwZXIobCl9Z2V0RnVuY3Rpb25zKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5vZmZzZXRUb0Nvb3JkcygpKSx0aGlzLmNvb3Jkc1RvT2Zmc2V0KCkpLHRoaXMudG9WZWMoKSksdGhpcy52YWx1ZUZyb20oKSksdGhpcy5nZXRDb21tb25VdGlsRnVuY3MoKSksdGhpcy5nZXRJbnB1dHNTYW1wbGluZ1NuaXBwZXRzKCkpLHRoaXMuZ2V0T3V0cHV0U2FtcGxpbmdTbmlwcGV0KCkpfWdldEN1c3RvbVR5cGVzKCl7cmV0dXJue319b2Zmc2V0VG9Db29yZHMoKXtyZXR1cm57b2Zmc2V0VG9Db29yZHM6bmV3IHUuR2xzbExpYlJvdXRpbmUoYAogICAgICB2ZWMyIG9mZnNldFRvQ29vcmRzKGludCBvZmZzZXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgIGludCB0ID0gb2Zmc2V0IC8gd2lkdGg7CiAgICAgICAgaW50IHMgPSBvZmZzZXQgLSB0KndpZHRoOwogICAgICAgIHZlYzIgY29vcmRzID0gKHZlYzIocyx0KSArIHZlYzIoMC41LDAuNSkpIC8gdmVjMih3aWR0aCwgaGVpZ2h0KTsKICAgICAgICByZXR1cm4gY29vcmRzOwogICAgICB9CiAgICAgIGApfX1jb29yZHNUb09mZnNldCgpe3JldHVybntjb29yZHNUb09mZnNldDpuZXcgdS5HbHNsTGliUm91dGluZShgCiAgICAgIGludCBjb29yZHNUb09mZnNldCh2ZWMyIGNvb3JkcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgZmxvYXQgcyA9IGNvb3Jkcy5zICogZmxvYXQod2lkdGgpOwogICAgICAgIGZsb2F0IHQgPSBjb29yZHMudCAqIGZsb2F0KGhlaWdodCk7CiAgICAgICAgaW50IG9mZnNldCA9IGludCh0KSAqIHdpZHRoICsgaW50KHMpOwogICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgIH0KICAgICAgYCl9fWdldE91dHB1dFNhbXBsaW5nU25pcHBldCgpe2NvbnN0IGw9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQ7cmV0dXJuIGwuaXNQYWNrZWQ/dGhpcy5nZXRQYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQobCk6dGhpcy5nZXRVbnBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChsKX1nZXRQYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQobCl7Y29uc3Qgbj1sLnVucGFja2VkU2hhcGUsZT1bbC53aWR0aCxsLmhlaWdodF0saT17fSxzPSJnZXRPdXRwdXRDb29yZHMiO3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAwOmlbc109dGhpcy5nZXRPdXRwdXRTY2FsYXJDb29yZHMoKTticmVhaztjYXNlIDE6aVtzXT10aGlzLmdldE91dHB1dFBhY2tlZDFEQ29vcmRzKG4sZSk7YnJlYWs7Y2FzZSAyOmlbc109dGhpcy5nZXRPdXRwdXRQYWNrZWQyRENvb3JkcyhuLGUpO2JyZWFrO2Nhc2UgMzppW3NdPXRoaXMuZ2V0T3V0cHV0UGFja2VkM0RDb29yZHMobixlKTticmVhaztkZWZhdWx0Omlbc109dGhpcy5nZXRPdXRwdXRQYWNrZWRORENvb3JkcyhuLGUpfWNvbnN0IG09YAogICAgICB2b2lkIHNldE91dHB1dCh2ZWM0IHZhbCkgewogICAgICAgICR7KDAsaC5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLm91dHB1dH0gPSB2YWw7CiAgICAgIH0KICAgIGA7cmV0dXJuIGkuZmxvYXRUZXh0dXJlU2V0UkdCQT1uZXcgdS5HbHNsTGliUm91dGluZShtKSxpfWdldFVucGFja2VkT3V0cHV0U2FtcGxpbmdTbmlwcGV0KGwpe2NvbnN0IG49bC51bnBhY2tlZFNoYXBlLGU9W2wud2lkdGgsbC5oZWlnaHRdLGk9e30scz0iZ2V0T3V0cHV0Q29vcmRzIjtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMDppW3NdPXRoaXMuZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCk7YnJlYWs7Y2FzZSAxOmlbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDFEQ29vcmRzKG4sZSk7YnJlYWs7Y2FzZSAyOmlbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDJEQ29vcmRzKG4sZSk7YnJlYWs7Y2FzZSAzOmlbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDNEQ29vcmRzKG4sZSk7YnJlYWs7Y2FzZSA0Omlbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDREQ29vcmRzKG4sZSk7YnJlYWs7Y2FzZSA1Omlbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDVEQ29vcmRzKG4sZSk7YnJlYWs7Y2FzZSA2Omlbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDZEQ29vcmRzKG4sZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG91dHB1dCBkaW1lbnNpb25hbGl0eTogJHtuLmxlbmd0aH1gKX1jb25zdCBtPWAKICAgICAgICB2b2lkIHNldE91dHB1dChmbG9hdCB2YWwpIHsKICAgICAgICAgICR7KDAsaC5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLm91dHB1dH0gPSB2ZWM0KHZhbCwgMCwgMCwgMCk7CiAgICAgICAgfQogICAgYDtyZXR1cm4gaS5mbG9hdFRleHR1cmVTZXRSPW5ldyB1Lkdsc2xMaWJSb3V0aW5lKG0pLGl9Z2V0T3V0cHV0U2NhbGFyQ29vcmRzKCl7cmV0dXJuIG5ldyB1Lkdsc2xMaWJSb3V0aW5lKGAKICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgYCl9Z2V0T3V0cHV0UGFja2VkMURDb29yZHMobCxuKXtjb25zdCBlPW47bGV0IGk9IiI7cmV0dXJuIGVbMF09PT0xPyhpPWAKICAgICAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7CiAgICAgICAgICAgIHJldHVybiAyICogaW50KFRleENvb3Jkcy55ICogJHtlWzFdfS4wKTsKICAgICAgICAgIH0KICAgICAgICBgLG5ldyB1Lkdsc2xMaWJSb3V0aW5lKGkpKTplWzFdPT09MT8oaT1gCiAgICAgICAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkgewogICAgICAgICAgICByZXR1cm4gMiAqIGludChUZXhDb29yZHMueCAqICR7ZVswXX0uMCk7CiAgICAgICAgICB9CiAgICAgICAgYCxuZXcgdS5HbHNsTGliUm91dGluZShpKSk6KGk9YAogICAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7CiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtlWzBdfSwgJHtlWzFdfSkpOwogICAgICAgICAgcmV0dXJuIDIgKiAocmVzVGV4UkMueSAqICR7ZVswXX0gKyByZXNUZXhSQy54KTsKICAgICAgICB9CiAgICAgIGAsbmV3IHUuR2xzbExpYlJvdXRpbmUoaSkpfWdldE91dHB1dFBhY2tlZDJEQ29vcmRzKGwsbil7bGV0IGU9IiI7aWYoby5BcnJheVV0aWwuYXJyYXlzRXF1YWwobCxuKSlyZXR1cm4gZT1gCiAgICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkgewogICAgICAgICAgcmV0dXJuIDIgKiBpdmVjMihUZXhDb29yZHMueHkgKiB2ZWMyKCR7blswXX0sICR7blsxXX0pKTsKICAgICAgICB9CiAgICAgIGAsbmV3IHUuR2xzbExpYlJvdXRpbmUoZSk7Y29uc3QgaT1uLHM9TWF0aC5jZWlsKGxbMV0vMik7cmV0dXJuIGU9YAogICAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHsKICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7aVswXX0sICR7aVsxXX0pKTsKCiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHtpWzBdfSArIHJlc1RleFJDLng7CgogICAgICAgICAgLy8gcmV2ZXJzZSByIGFuZCBjIG9yZGVyIGZvciBwYWNrZWQgdGV4dHVyZQogICAgICAgICAgaW50IHIgPSBpbW9kKGluZGV4LCAke3N9KSAqIDI7CiAgICAgICAgICBpbnQgYyA9IDIgKiAoaW5kZXggLyAke3N9KTsKCiAgICAgICAgICByZXR1cm4gaXZlYzIociwgYyk7CiAgICAgICAgfQogICAgICBgLG5ldyB1Lkdsc2xMaWJSb3V0aW5lKGUpfWdldE91dHB1dFBhY2tlZDNEQ29vcmRzKGwsbil7Y29uc3QgZT1bblswXSxuWzFdXSxpPU1hdGguY2VpbChsWzJdLzIpLHM9aSpNYXRoLmNlaWwobFsxXS8yKSxtPWAKICAgICAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7CiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke2VbMF19LCAke2VbMV19KSk7CiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHtlWzBdfSArIHJlc1RleFJDLng7CgogICAgICAgICAgaW50IGIgPSBpbmRleCAvICR7c307CiAgICAgICAgICBpbmRleCAtPSBiICogJHtzfTsKCiAgICAgICAgICAvLyByZXZlcnNlIHIgYW5kIGMgb3JkZXIgZm9yIHBhY2tlZCB0ZXh0dXJlCiAgICAgICAgICBpbnQgciA9IGltb2QoaW5kZXgsICR7aX0pICogMjsKICAgICAgICAgIGludCBjID0gMiAqIChpbmRleCAvICR7aX0pOwoKICAgICAgICAgIHJldHVybiBpdmVjMyhiLCByLCBjKTsKICAgICAgICB9CiAgICAgIGA7cmV0dXJuIG5ldyB1Lkdsc2xMaWJSb3V0aW5lKG0pfWdldE91dHB1dFBhY2tlZE5EQ29vcmRzKGwsbil7Y29uc3QgZT1bblswXSxuWzFdXSxpPU1hdGguY2VpbChsW2wubGVuZ3RoLTFdLzIpLHM9aSpNYXRoLmNlaWwobFtsLmxlbmd0aC0yXS8yKTtsZXQgbT1zLGc9IiIsXz0iYiwgciwgYyI7Zm9yKGxldCB5PTI7eTxsLmxlbmd0aC0xO3krKyltKj1sW2wubGVuZ3RoLXktMV0sZz1gCiAgICAgIGludCBiJHt5fSA9IGluZGV4IC8gJHttfTsKICAgICAgaW5kZXggLT0gYiR7eX0gKiAke219OwogICAgYCtnLF89YGIke3l9LCBgK187Y29uc3QgYj1gCiAgICAgIGl2ZWMke2wubGVuZ3RofSBnZXRPdXRwdXRDb29yZHMoKSB7CiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7ZVswXX0sICR7ZVsxXX0pKTsKICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHtlWzBdfSArIHJlc1RleFJDLng7CgogICAgICAgICR7Z30KCiAgICAgICAgaW50IGIgPSBpbmRleCAvICR7c307CiAgICAgICAgaW5kZXggLT0gYiAqICR7c307CgogICAgICAgIC8vIHJldmVyc2UgciBhbmQgYyBvcmRlciBmb3IgcGFja2VkIHRleHR1cmUKICAgICAgICBpbnQgciA9IGltb2QoaW5kZXgsICR7aX0pICogMjsKICAgICAgICBpbnQgYyA9IDIgKiAoaW5kZXggLyAke2l9KTsKCiAgICAgICAgcmV0dXJuIGl2ZWMke2wubGVuZ3RofSgke199KTsKICAgICAgfQogICAgYDtyZXR1cm4gbmV3IHUuR2xzbExpYlJvdXRpbmUoYil9Z2V0T3V0cHV0VW5wYWNrZWQxRENvb3JkcyhsLG4pe2NvbnN0IGU9YAogICAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7CiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke25bMF19LCAke25bMV19KSk7CiAgICAgICAgICByZXR1cm4gcmVzVGV4UkMueSAqICR7blswXX0gKyByZXNUZXhSQy54OwogICAgICAgIH0KICAgICAgYDtyZXR1cm4gbmV3IHUuR2xzbExpYlJvdXRpbmUoZSl9Z2V0T3V0cHV0VW5wYWNrZWQyRENvb3JkcyhsLG4pe2NvbnN0IGU9YAogICAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHsKICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7blswXX0sICR7blsxXX0pKTsKICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke25bMF19ICsgcmVzVGV4UkMueDsKICAgICAgICAgIGludCByID0gaW5kZXggLyAke2xbMV19OwogICAgICAgICAgaW50IGMgPSBpbmRleCAtIHIgKiAke2xbMV19OwogICAgICAgICAgcmV0dXJuIGl2ZWMyKHIsIGMpOwogICAgICAgIH0KICAgICAgYDtyZXR1cm4gbmV3IHUuR2xzbExpYlJvdXRpbmUoZSl9Z2V0T3V0cHV0VW5wYWNrZWQzRENvb3JkcyhsLG4pe2xldCBlPSIiO2NvbnN0IGk9bC5sZW5ndGg7bGV0IHM9bnVsbDtpPDImJihzPVtdKSxzPW5ldyBBcnJheShpLTEpLHNbaS0yXT1sW2ktMV07Zm9yKGxldCBfPWktMztfPj0wOy0tXylzW19dPXNbXysxXSpsW18rMV07Y29uc3QgbT1bInIiLCJjIiwiZCJdLGc9cy5tYXAoKF8sYik9PmBpbnQgJHttW2JdfSA9IGluZGV4IC8gJHtffTsgJHtiPT09cy5sZW5ndGgtMT9gaW50ICR7bVtiKzFdfSA9IGluZGV4IC0gJHttW2JdfSAqICR7X31gOmBpbmRleCAtPSAke21bYl19ICogJHtffWB9O2ApLmpvaW4oIiIpO3JldHVybiBlPWAKICAgICAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7CiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke25bMF19LCAke25bMV19KSk7CiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHtuWzBdfSArIHJlc1RleFJDLng7CiAgICAgICAgICAke2d9CiAgICAgICAgICByZXR1cm4gaXZlYzMociwgYywgZCk7CiAgICAgICAgfQogICAgICBgLG5ldyB1Lkdsc2xMaWJSb3V0aW5lKGUpfWdldE91dHB1dFVucGFja2VkNERDb29yZHMobCxuKXtsZXQgZT0iIjtjb25zdCBpPWwubGVuZ3RoO2xldCBzPW51bGw7aTwyJiYocz1bXSkscz1uZXcgQXJyYXkoaS0xKSxzW2ktMl09bFtpLTFdO2ZvcihsZXQgXz1pLTM7Xz49MDstLV8pc1tfXT1zW18rMV0qbFtfKzFdO2NvbnN0IG09WyJyIiwiYyIsImQiLCJkMiJdLGc9cy5tYXAoKF8sYik9PmBpbnQgJHttW2JdfSA9IGluZGV4IC8gJHtffTsgJHtiPT09cy5sZW5ndGgtMT9gaW50ICR7bVtiKzFdfSA9IGluZGV4IC0gJHttW2JdfSAqICR7X31gOmBpbmRleCAtPSAke21bYl19ICogJHtffWB9O2ApLmpvaW4oIiIpO3JldHVybiBlPWAKICAgICAgaXZlYzQgZ2V0T3V0cHV0Q29vcmRzKCkgewogICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtuWzBdfSwgJHtuWzFdfSkpOwogICAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueSAqICR7blswXX0gKyByZXNUZXhSQy54OwogICAgICAgICAgJHtnfQogICAgICAgICAgcmV0dXJuIGl2ZWM0KHIsIGMsIGQsIGQyKTsKICAgICAgICB9CiAgICAgIGAsbmV3IHUuR2xzbExpYlJvdXRpbmUoZSl9Z2V0T3V0cHV0VW5wYWNrZWQ1RENvb3JkcyhsLG4pe2xldCBlPSIiO2NvbnN0IGk9bC5sZW5ndGg7bGV0IHM9bnVsbDtpPDImJihzPVtdKSxzPW5ldyBBcnJheShpLTEpLHNbaS0yXT1sW2ktMV07Zm9yKGxldCBfPWktMztfPj0wOy0tXylzW19dPXNbXysxXSpsW18rMV07Y29uc3QgbT1bInIiLCJjIiwiZCIsImQyIiwiZDMiXSxnPXMubWFwKChfLGIpPT5gaW50ICR7bVtiXX0gPSBpbmRleCAvICR7X307ICR7Yj09PXMubGVuZ3RoLTE/YGludCAke21bYisxXX0gPSBpbmRleCAtICR7bVtiXX0gKiAke199YDpgaW5kZXggLT0gJHttW2JdfSAqICR7X31gfTtgKS5qb2luKCIiKTtyZXR1cm4gZT1gCiAgICAgIGl2ZWM1IGdldE91dHB1dENvb3JkcygpIHsKICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7blswXX0sICR7blsxXX0pKTsKICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke25bMF19ICsgcmVzVGV4UkMueDsKICAgICAgICAgICR7Z30KICAgICAgICAgIHJldHVybiBpdmVjNShyLCBjLCBkLCBkMiwgZDMpOwogICAgICAgIH0KICAgICAgYCxuZXcgdS5HbHNsTGliUm91dGluZShlKX1nZXRPdXRwdXRVbnBhY2tlZDZEQ29vcmRzKGwsbil7bGV0IGU9IiI7Y29uc3QgaT1sLmxlbmd0aDtsZXQgcz1udWxsO2k8MiYmKHM9W10pLHM9bmV3IEFycmF5KGktMSksc1tpLTJdPWxbaS0xXTtmb3IobGV0IF89aS0zO18+PTA7LS1fKXNbX109c1tfKzFdKmxbXysxXTtjb25zdCBtPVsiciIsImMiLCJkIiwiZDIiLCJkMyIsImQ0Il0sZz1zLm1hcCgoXyxiKT0+YGludCAke21bYl19ID0gaW5kZXggLyAke199OyAke2I9PT1zLmxlbmd0aC0xP2BpbnQgJHttW2IrMV19ID0gaW5kZXggLSAke21bYl19ICogJHtffWA6YGluZGV4IC09ICR7bVtiXX0gKiAke199YH07YCkuam9pbigiIik7cmV0dXJuIGU9YAogICAgIGl2ZWM2IGdldE91dHB1dENvb3JkcygpIHsKICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke25bMF19LCAke25bMV19KSk7CiAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke25bMF19ICsgcmVzVGV4UkMueDsKICAgICAgICAgJHtnfQogICAgICAgICByZXR1cm4gaXZlYzYociwgYywgZCwgZDIsIGQzLCBkNCk7CiAgICAgICB9CiAgICAgYCxuZXcgdS5HbHNsTGliUm91dGluZShlKX1nZXRDb21tb25VdGlsRnVuY3MoKXtjb25zdCBsPXt9O2xldCBuPSJ1dkZyb21GbGF0IjtsW25dPW5ldyB1Lkdsc2xMaWJSb3V0aW5lKGAKICAgIHZlYzIgdXZGcm9tRmxhdChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsIGludCBpbmRleCkgewogICAgICBpbnQgdGV4QyA9IGluZGV4IC8gdGV4TnVtUjsKICAgICAgaW50IHRleFIgPSBpbmRleCAtIHRleEMgKiB0ZXhOdW1SOwogICAgICAvLyBUT0RPOiBzd2FwIHRleFIsIHRleEMgb3JkZXIgaW4gZm9sbG93aW5nIGZ1bmN0aW9uIHNvIHJvdyBpcyBjb3JyZXNwb25kaW5nIHRvIHUgYW5kIGNvbHVtbiBpcyBjb3JyZXNwb25kaW5nIHRvCiAgICAgIC8vICAgICAgIHYuCiAgICAgIHJldHVybiAodmVjMih0ZXhSLCB0ZXhDKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bVIsIHRleE51bUMpOwogICAgfQogICAgYCksbj0icGFja2VkVVZmcm9tMUQiLGxbbl09bmV3IHUuR2xzbExpYlJvdXRpbmUoYAogICAgICB2ZWMyIHBhY2tlZFVWZnJvbTFEKGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IGluZGV4KSB7CiAgICAgICAgaW50IHRleGVsSW5kZXggPSBpbmRleCAvIDI7CiAgICAgICAgaW50IHRleFIgPSB0ZXhlbEluZGV4IC8gdGV4TnVtQzsKICAgICAgICBpbnQgdGV4QyA9IHRleGVsSW5kZXggLSB0ZXhSICogdGV4TnVtQzsKICAgICAgICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTsKICAgICAgfQogICAgICBgKSxuPSJwYWNrZWRVVmZyb20yRCIsbFtuXT1uZXcgdS5HbHNsTGliUm91dGluZShgCiAgICAgIHZlYzIgcGFja2VkVVZmcm9tMkQoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLCBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93LCBpbnQgcm93LCBpbnQgY29sKSB7CiAgICAgICAgaW50IHRleGVsSW5kZXggPSAocm93IC8gMikgKiB0ZXhlbHNJbkxvZ2ljYWxSb3cgKyAoY29sIC8gMik7CiAgICAgICAgaW50IHRleFIgPSB0ZXhlbEluZGV4IC8gdGV4TnVtQzsKICAgICAgICBpbnQgdGV4QyA9IHRleGVsSW5kZXggLSB0ZXhSICogdGV4TnVtQzsKICAgICAgICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTsKICAgICAgfQogICAgICBgKSxuPSJwYWNrZWRVVmZyb20zRCIsbFtuXT1uZXcgdS5HbHNsTGliUm91dGluZShgCiAgICAgIHZlYzIgcGFja2VkVVZmcm9tM0QoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLAogICAgICAgICAgaW50IHRleGVsc0luQmF0Y2gsIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3csIGludCBiLAogICAgICAgICAgaW50IHJvdywgaW50IGNvbCkgewogICAgICAgIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpOwogICAgICAgIGludCB0ZXhSID0gaW5kZXggLyB0ZXhOdW1DOwogICAgICAgIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogdGV4TnVtQzsKICAgICAgICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTsKICAgICAgfQogICAgICBgKSxuPSJzYW1wbGVUZXh0dXJlIjtjb25zdCBlPSgwLGguZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKTtyZXR1cm4gbFtuXT1uZXcgdS5HbHNsTGliUm91dGluZShgCiAgICAgICAgZmxvYXQgc2FtcGxlVGV4dHVyZShzYW1wbGVyMkQgdGV4dHVyZVNhbXBsZXIsIHZlYzIgdXYpIHsKICAgICAgICAgICAgcmV0dXJuICR7ZS50ZXh0dXJlMkR9KHRleHR1cmVTYW1wbGVyLCB1dikucjsKICAgICAgICB9YCksbH1nZXRJbnB1dHNTYW1wbGluZ1NuaXBwZXRzKCl7Y29uc3QgbD17fSxuPXRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0O3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaW5wdXROYW1lcy5mb3JFYWNoKChlLGkpPT57Y29uc3Qgcz10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tpXSxtPSgwLHAuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lKShlKTtzLmlzUGFja2VkP2xbbV09dGhpcy5nZXRQYWNrZWRTYW1wbGVyRnJvbUlucHV0KG0sZSxzKTpsW21dPXRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyRnJvbUlucHV0KG0sZSxzKTtjb25zdCBnPSgwLHAuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lQXRPdXRDb29yZHMpKGUpO3MudW5wYWNrZWRTaGFwZS5sZW5ndGg8PW4udW5wYWNrZWRTaGFwZS5sZW5ndGgmJihzLmlzUGFja2VkP2xbZ109dGhpcy5nZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMoZyxzLG4sZSk6bFtnXT10aGlzLmdldFVucGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKGcscyxuLGUpKX0pLGx9Z2V0UGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKGwsbixlLGkpe2NvbnN0IHM9bi51bnBhY2tlZFNoYXBlLG09ZS51bnBhY2tlZFNoYXBlLGc9aSxfPSgwLHAuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lKShnKSxiPXMubGVuZ3RoLHk9bS5sZW5ndGgsVD1vLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyhzLG0pLHc9KDAscC5nZXRDb29yZHNEYXRhVHlwZSkoeSkseD15LWI7bGV0IEU7Y29uc3QgUD0oMCxwLmdldEdsQ2hhbm5lbHMpKCk7RT1iPT09MD8iIjp5PDImJlQubGVuZ3RoPj0xPyJjb29yZHMgPSAwOyI6VC5tYXAoTj0+YGNvb3Jkcy4ke1BbTit4XX0gPSAwO2ApLmpvaW4oYApgKTtsZXQgdj0iIjt2PXk8MiYmYj4wPyJjb29yZHMiOnMubWFwKChOLEQpPT5gY29vcmRzLiR7UFtEK3hdfWApLmpvaW4oIiwgIik7bGV0IE09InJldHVybiBvdXRwdXRWYWx1ZTsiO2NvbnN0ICQ9by5TaGFwZVV0aWwuc2l6ZShzKT09PTEsej1vLlNoYXBlVXRpbC5zaXplKG0pPT09MTtpZihiIT09MXx8JHx8eil7aWYoJCYmIXopTT15PT09MT9gCiAgICAgICAgICByZXR1cm4gdmVjNChvdXRwdXRWYWx1ZS54LCBvdXRwdXRWYWx1ZS54LCAwLiwgMC4pOwogICAgICAgIGA6YAogICAgICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCk7CiAgICAgICAgYDtlbHNlIGlmKFQubGVuZ3RoKXtjb25zdCBOPWItMixEPWItMTtULmluZGV4T2YoTik+LTEmJlQuaW5kZXhPZihEKT4tMT9NPSJyZXR1cm4gdmVjNChvdXRwdXRWYWx1ZS54KTsiOlQuaW5kZXhPZihOKT4tMT9NPSJyZXR1cm4gdmVjNChvdXRwdXRWYWx1ZS54LCBvdXRwdXRWYWx1ZS55LCBvdXRwdXRWYWx1ZS54LCBvdXRwdXRWYWx1ZS55KTsiOlQuaW5kZXhPZihEKT4tMSYmKE09InJldHVybiB2ZWM0KG91dHB1dFZhbHVlLnh4LCBvdXRwdXRWYWx1ZS56eik7Iil9fWVsc2UgTT1gCiAgICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueHksIG91dHB1dFZhbHVlLnh5KTsKICAgICAgYDtjb25zdCBCPWAKICAgICAgdmVjNCAke2x9KCkgewogICAgICAgICR7d30gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7CiAgICAgICAgCiAgICAgICAgaW50IGxhc3REaW0gPSBjb29yZHMuJHtQW3ktMV19OwogICAgICAgIGNvb3Jkcy4ke1BbeS0xXX0gPSBjb29yZHMuJHtQW3ktMl19OwogICAgICAgIGNvb3Jkcy4ke1BbeS0yXX0gPSBsYXN0RGltOwogICAgICAKICAgICAgICAke0V9CiAgICAgICAgdmVjNCBvdXRwdXRWYWx1ZSA9ICR7X30oJHt2fSk7CiAgICAgICAgJHtNfQogICAgICB9CiAgICBgO3JldHVybiBuZXcgdS5HbHNsTGliUm91dGluZShCLFsiY29vcmRpbmF0ZXMuZ2V0T3V0cHV0Q29vcmRzIl0pfWdldFVucGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKGwsbixlLGkpe2NvbnN0IHM9W2Uud2lkdGgsZS5oZWlnaHRdLG09W24ud2lkdGgsbi5oZWlnaHRdLGc9bi51bnBhY2tlZFNoYXBlLmxlbmd0aCxfPWUudW5wYWNrZWRTaGFwZS5sZW5ndGgsYj1uLnVucGFja2VkU2hhcGUseT1lLnVucGFja2VkU2hhcGUsVD0oMCxwLmdlbmVyYXRlU2hhZGVyRnVuY05hbWVGcm9tSW5wdXRTYW1wbGVyTmFtZSkoaSk7aWYoZz09PV8mJm8uQXJyYXlVdGlsLmFycmF5c0VxdWFsKG0scykpe2NvbnN0IHo9YAogICAgICAgICAgZmxvYXQgJHtsfSgpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHtpfSwgVGV4Q29vcmRzKTsKICAgICAgICAgIH0KICAgICAgICBgO3JldHVybiBuZXcgdS5HbHNsTGliUm91dGluZSh6LFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1jb25zdCB3PSgwLHAuZ2V0Q29vcmRzRGF0YVR5cGUpKF8pLHg9by5Ccm9hZGNhc3RVdGlsLmdldEJyb2FkY2FzdERpbXMoYix5KSxFPV8tZztsZXQgUDtjb25zdCB2PSgwLHAuZ2V0R2xDaGFubmVscykoKTtQPWc9PT0wPyIiOl88MiYmeC5sZW5ndGg+PTE/ImNvb3JkcyA9IDA7Ijp4Lm1hcCh6PT5gY29vcmRzLiR7dlt6K0VdfSA9IDA7YCkuam9pbihgCmApO2xldCBNPSIiO009XzwyJiZnPjA/ImNvb3JkcyI6bi51bnBhY2tlZFNoYXBlLm1hcCgoeixCKT0+YGNvb3Jkcy4ke3ZbQitFXX1gKS5qb2luKCIsICIpO2NvbnN0ICQ9YAogICAgICAgIGZsb2F0ICR7bH0oKSB7CiAgICAgICAgICAke3d9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpOwogICAgICAgICAgJHtQfQogICAgICAgICAgcmV0dXJuICR7VH0oJHtNfSk7CiAgICAgICAgfQogICAgICBgO3JldHVybiBuZXcgdS5HbHNsTGliUm91dGluZSgkLFsiY29vcmRpbmF0ZXMuZ2V0T3V0cHV0Q29vcmRzIl0pfWdldFBhY2tlZFNhbXBsZXJGcm9tSW5wdXQobCxuLGUpe3N3aXRjaChlLnVucGFja2VkU2hhcGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHRoaXMuZ2V0UGFja2VkU2FtcGxlclNjYWxhcihsLG4pO2Nhc2UgMTpyZXR1cm4gdGhpcy5nZXRQYWNrZWRTYW1wbGVyMUQobCxuLGUpO2Nhc2UgMjpyZXR1cm4gdGhpcy5nZXRQYWNrZWRTYW1wbGVyMkQobCxuLGUpO2Nhc2UgMzpyZXR1cm4gdGhpcy5nZXRQYWNrZWRTYW1wbGVyM0QobCxuLGUpO2RlZmF1bHQ6cmV0dXJuIHRoaXMuZ2V0UGFja2VkU2FtcGxlck5EKGwsbixlKX19Z2V0VW5wYWNrZWRTYW1wbGVyRnJvbUlucHV0KGwsbixlKXtjb25zdCBpPWUudW5wYWNrZWRTaGFwZTtzd2l0Y2goaS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXJTY2FsYXIobCxuLGUpO2Nhc2UgMTpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXIxRChsLG4sZSk7Y2FzZSAyOnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlcjJEKGwsbixlKTtjYXNlIDM6cmV0dXJuIHRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyM0QobCxuLGUpO2Nhc2UgNDpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXI0RChsLG4sZSk7Y2FzZSA1OnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlcjVEKGwsbixlKTtjYXNlIDY6cmV0dXJuIHRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyNkQobCxuLGUpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkaW1lbnNpb24gJHtpLmxlbmd0aH0tRGApfX1nZXRQYWNrZWRTYW1wbGVyU2NhbGFyKGwsbil7Y29uc3QgZT1gCiAgICAgICAgICB2ZWM0ICR7bH0oKSB7CiAgICAgICAgICAgIHJldHVybiAkeygwLGguZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKS50ZXh0dXJlMkR9KCR7bn0sIGhhbGZDUik7CiAgICAgICAgICB9CiAgICAgICAgYDtyZXR1cm4gbmV3IHUuR2xzbExpYlJvdXRpbmUoZSl9Z2V0UGFja2VkU2FtcGxlcjFEKGwsbixlKXtjb25zdCBpPVtlLndpZHRoLGUuaGVpZ2h0XSxzPVtpWzFdLGlbMF1dLG09KDAsaC5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLGc9YHZlYzQgJHtsfShpbnQgaW5kZXgpIHsKICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTFEKAogICAgICAke3NbMF19LCAke3NbMV19LCBpbmRleCk7CiAgICAgIHJldHVybiAke20udGV4dHVyZTJEfSgke259LCB1dik7CiAgICB9YDtyZXR1cm4gbmV3IHUuR2xzbExpYlJvdXRpbmUoZyxbImNvb3JkaW5hdGVzLnBhY2tlZFVWZnJvbTFEIl0pfWdldFBhY2tlZFNhbXBsZXIyRChsLG4sZSl7Y29uc3QgaT1lLnVucGFja2VkU2hhcGUscz1bZS53aWR0aCxlLmhlaWdodF0sbT0oMCxoLmdldEdsc2wpKHRoaXMuY29udGV4dC5nbENvbnRleHQudmVyc2lvbiksZz1zWzBdLF89c1sxXTtpZihzIT1udWxsJiZvLkFycmF5VXRpbC5hcnJheXNFcXVhbChpLHMpKXtjb25zdCB3PWB2ZWM0ICR7bH0oaW50IHJvdywgaW50IGNvbCkgewogICAgICAgIHZlYzIgdXYgPSAodmVjMihjb2wsIHJvdykgKyBoYWxmQ1IpIC8gdmVjMigke199LjAsICR7Z30uMCk7CiAgICAgICAgcmV0dXJuICR7bS50ZXh0dXJlMkR9KCR7bn0sIHV2KTsKICAgICAgfWA7cmV0dXJuIG5ldyB1Lkdsc2xMaWJSb3V0aW5lKHcpfWNvbnN0IGI9cyx5PU1hdGguY2VpbChpWzFdLzIpLFQ9YHZlYzQgJHtsfShpbnQgcm93LCBpbnQgY29sKSB7CiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20yRCgke2JbMV19LCAke2JbMF19LCAke3l9LCByb3csIGNvbCk7CiAgICAgIHJldHVybiAke20udGV4dHVyZTJEfSgke259LCB1dik7CiAgICB9YDtyZXR1cm4gbmV3IHUuR2xzbExpYlJvdXRpbmUoVCxbImNvb3JkaW5hdGVzLnBhY2tlZFVWZnJvbTJEIl0pfWdldFBhY2tlZFNhbXBsZXIzRChsLG4sZSl7Y29uc3QgaT1lLnVucGFja2VkU2hhcGUscz1bZS53aWR0aCxlLmhlaWdodF0sbT1bc1swXSxzWzFdXSxnPSgwLGguZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKTtpZihpWzBdPT09MSl7Y29uc3Qgdz1pLnNsaWNlKDEpLHg9WzEsMl0sRT0oMCxwLnNxdWVlemVJbnB1dFNoYXBlKShpLHcpLFA9WyJiIiwicm93IiwiY29sIl0sdj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKTt2LnVucGFja2VkU2hhcGU9RTtjb25zdCBNPXRoaXMuZ2V0UGFja2VkU2FtcGxlckZyb21JbnB1dChsLG4sdiksJD1gJHtNLnJvdXRpbmVCb2R5fQogICAgICB2ZWM0ICR7bH0oaW50IGIsIGludCByb3csIGludCBjb2wpIHsKICAgICAgICByZXR1cm4gJHtsfSgkeygwLHAuZ2V0U3F1ZWV6ZWRQYXJhbXMpKFAseCl9KTsKICAgICAgfSBgO3JldHVybiBuZXcgdS5HbHNsTGliUm91dGluZSgkLE0uZGVwZW5kZW5jaWVzKX1jb25zdCBfPW1bMF0sYj1tWzFdLHk9TWF0aC5jZWlsKGlbMl0vMiksVD1gdmVjNCAke2x9KGludCBiLCBpbnQgcm93LCBpbnQgY29sKSB7CiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20zRCgKICAgICAgICAke2J9LCAke199LCAke3kqTWF0aC5jZWlsKGlbMV0vMil9LCAke3l9LCBiLCByb3csIGNvbCk7CiAgICAgIHJldHVybiAke2cudGV4dHVyZTJEfSgke259LCB1dik7fWA7cmV0dXJuIG5ldyB1Lkdsc2xMaWJSb3V0aW5lKFQsWyJjb29yZGluYXRlcy5wYWNrZWRVVmZyb20zRCJdKX1nZXRQYWNrZWRTYW1wbGVyTkQobCxuLGUpe2NvbnN0IGk9ZS51bnBhY2tlZFNoYXBlLHM9aS5sZW5ndGgsbT1bZS53aWR0aCxlLmhlaWdodF0sZz0oMCxoLmdldEdsc2wpKHRoaXMuY29udGV4dC5nbENvbnRleHQudmVyc2lvbiksXz1bbVswXSxtWzFdXSxiPV9bMV0seT1fWzBdLFQ9TWF0aC5jZWlsKGlbcy0xXS8yKTtsZXQgdz1UKk1hdGguY2VpbChpW3MtMl0vMikseD0iaW50IGIsIGludCByb3csIGludCBjb2wiLEU9YGIgKiAke3d9ICsgKHJvdyAvIDIpICogJHtUfSArIChjb2wgLyAyKWA7Zm9yKGxldCB2PTI7djxzLTE7disrKXg9YGludCBiJHt2fSwgYCt4LHcqPWlbcy12LTFdLEU9YGIke3Z9ICogJHt3fSArIGArRTtjb25zdCBQPWB2ZWM0ICR7bH0oJHt4fSkgewogICAgICBpbnQgaW5kZXggPSAke0V9OwogICAgICBpbnQgdGV4UiA9IGluZGV4IC8gJHt5fTsKICAgICAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiAke3l9OwogICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMigke3l9LCAke2J9KTsKICAgICAgcmV0dXJuICR7Zy50ZXh0dXJlMkR9KCR7bn0sIHV2KTsKICAgIH1gO3JldHVybiBuZXcgdS5HbHNsTGliUm91dGluZShQKX1nZXRVbnBhY2tlZFNhbXBsZXJTY2FsYXIobCxuLGUpe2NvbnN0W2ksc109W2Uud2lkdGgsZS5oZWlnaHRdO2lmKGk9PT0xJiZzPT09MSl7Y29uc3QgZz1gCiAgICAgICAgICBmbG9hdCAke2x9KCkgewogICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke259LCBoYWxmQ1IpOwogICAgICAgICAgfQogICAgICAgIGA7cmV0dXJuIG5ldyB1Lkdsc2xMaWJSb3V0aW5lKGcsWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWNvbnN0IG09YAogICAgICAgIGZsb2F0ICR7bH0oKSB7CiAgICAgICAgICBpbnQgb2Zmc2V0XyR7bn0gPSBjb29yZHNUb09mZnNldChUZXhDb29yZHMsICR7aX0sICR7c30pOwogICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtpfSwgJHtzfSwgb2Zmc2V0XyR7bn0pOwogICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHtufSwgdXYpOwogICAgICAgIH0KICAgICAgYDtyZXR1cm4gbmV3IHUuR2xzbExpYlJvdXRpbmUobSxbImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiLCJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIiwiY29vcmRpbmF0ZXMuY29vcmRzVG9PZmZzZXQiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyMUQobCxuLGUpe2NvbnN0IGk9ZS53aWR0aCxzPWUuaGVpZ2h0O2lmKHM9PT0xJiZpPT09MSl7Y29uc3QgZz1gCiAgICAgICAgZmxvYXQgJHtsfShpbnQgaW5kZXgpIHsKICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7bn0sIGhhbGZDUik7CiAgICAgICAgfQogICAgICBgO3JldHVybiBuZXcgdS5HbHNsTGliUm91dGluZShnLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1pZihzPT09MSl7Y29uc3QgZz1gCiAgICAgICAgICBmbG9hdCAke2x9KGludCBpbmRleCkgewogICAgICAgICAgICB2ZWMyIHV2ID0gdmVjMigoZmxvYXQoaW5kZXgpICsgMC41KSAvICR7aX0uMCwgMC41KTsKICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHtufSwgdXYpOwogICAgICAgICAgfQogICAgICAgIGA7cmV0dXJuIG5ldyB1Lkdsc2xMaWJSb3V0aW5lKGcsWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWlmKGk9PT0xKXtjb25zdCBnPWAKICAgICAgICAgIGZsb2F0ICR7bH0oaW50IGluZGV4KSB7CiAgICAgICAgICAgIHZlYzIgdXYgPSB2ZWMyKDAuNSwgKGZsb2F0KGluZGV4KSArIDAuNSkgLyAke3N9LjApOwogICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke259LCB1dik7CiAgICAgICAgICB9CiAgICAgICAgYDtyZXR1cm4gbmV3IHUuR2xzbExpYlJvdXRpbmUoZyxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9Y29uc3QgbT1gCiAgICAgICAgZmxvYXQgJHtsfShpbnQgaW5kZXgpIHsKICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7aX0sICR7c30sIGluZGV4KTsKICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7bn0sIHV2KTsKICAgICAgICB9CiAgICAgIGA7cmV0dXJuIG5ldyB1Lkdsc2xMaWJSb3V0aW5lKG0sWyJjb29yZGluYXRlcy51dkZyb21GbGF0IiwiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1nZXRVbnBhY2tlZFNhbXBsZXIyRChsLG4sZSl7Y29uc3QgaT1lLnVucGFja2VkU2hhcGUscz1bZS5oZWlnaHQsZS53aWR0aF07aWYocyE9bnVsbCYmby5BcnJheVV0aWwuYXJyYXlzRXF1YWwoaSxzKSl7Y29uc3Qgdz1gCiAgICAgICAgICBmbG9hdCAke2x9KGludCByb3csIGludCBjb2wpIHsKICAgICAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHJvdywgY29sKSArIGhhbGZDUikgLyB2ZWMyKCR7c1sxXX0uMCwgJHtzWzBdfS4wKTsKICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHtufSwgdXYpOwogICAgICAgICAgfQogICAgICAgIGA7cmV0dXJuIG5ldyB1Lkdsc2xMaWJSb3V0aW5lKHcsWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWNvbnN0e25ld1NoYXBlOm0sa2VwdERpbXM6Z309KDAsYS5zcXVlZXplU2hhcGUpKGkpLF89bTtpZihfLmxlbmd0aDxpLmxlbmd0aCl7Y29uc3Qgdz0oMCxwLnNxdWVlemVJbnB1dFNoYXBlKShpLF8pLHg9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSk7eC51bnBhY2tlZFNoYXBlPXc7Y29uc3QgRT1bImNvbCIsInJvdyJdLFA9YAogICAgICAgICAgJHt0aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChsLG4seCkucm91dGluZUJvZHl9CiAgICAgICAgICBmbG9hdCAke2x9KGludCByb3csIGludCBjb2wpIHsKICAgICAgICAgICAgcmV0dXJuICR7bH0oJHsoMCxwLmdldFNxdWVlemVkUGFyYW1zKShFLGcpfSk7CiAgICAgICAgICB9CiAgICAgICAgYDtyZXR1cm4gbmV3IHUuR2xzbExpYlJvdXRpbmUoUCxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9Y29uc3QgYj1zWzFdLHk9c1swXTtpZih5PT09MSl7Y29uc3Qgdz1gCiAgICAgICAgICBmbG9hdCAke2x9KGludCByb3csIGludCBjb2wpIHsKICAgICAgICAgICAgaW50IG9mZnNldF8ke259ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2J9LCAke3l9KTsKICAgICAgICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgb2Zmc2V0XyR7bn0pLCB2ZWMzKCR7aVsxXX0sIDEsIDEpKTsKICAgICAgICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoaW5kZXggKyAwLjUpIC8gJHtifS4wKTsKICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHtufSwgdXYpOwogICAgICAgICAgfQogICAgICAgIGA7cmV0dXJuIG5ldyB1Lkdsc2xMaWJSb3V0aW5lKHcsWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIiwiY29vcmRpbmF0ZXMuY29vcmRzVG9PZmZzZXQiXSl9aWYoYj09PTEpe2NvbnN0IHc9YAogICAgICAgICAgZmxvYXQgJHtsfShpbnQgcm93LCBpbnQgY29sKSB7CiAgICAgICAgICAgIGludCBvZmZzZXRfJHtufSA9IGNvb3Jkc1RvT2Zmc2V0KFRleENvb3JkcywgJHtifSwgJHt5fSk7CiAgICAgICAgICAgIGZsb2F0IGluZGV4ID0gZG90KHZlYzMocm93LCBjb2wsIG9mZnNldF8ke259KSwgdmVjMygke2lbMV19LCAxLCAxKSk7CiAgICAgICAgICAgIHZlYzIgdXYgPSB2ZWMyKChpbmRleCArIDAuNSkgLyAke3l9LjAsIDAuNSk7CiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7bn0sIHV2KTsKICAgICAgICAgIH0KICAgICAgICBgO3JldHVybiBuZXcgdS5HbHNsTGliUm91dGluZSh3LFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLmNvb3Jkc1RvT2Zmc2V0Il0pfWNvbnN0IFQ9YAogICAgICAgIGZsb2F0ICR7bH0oaW50IHJvdywgaW50IGNvbCkgewogICAgICAgICAgaW50IGluZGV4ID0gY29sICogJHtpWzFdfSArIHJvdzsKICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7Yn0sICR7eX0sIGluZGV4KTsKICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7bn0sIHV2KTsKICAgICAgICB9CiAgICAgIGA7cmV0dXJuIG5ldyB1Lkdsc2xMaWJSb3V0aW5lKFQsWyJjb29yZGluYXRlcy51dkZyb21GbGF0IiwiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLmNvb3Jkc1RvT2Zmc2V0Il0pfWdldFVucGFja2VkU2FtcGxlcjNEKGwsbixlKXtjb25zdCBpPWUudW5wYWNrZWRTaGFwZSxzPWlbMV0qaVsyXSxtPWlbMl0se25ld1NoYXBlOmcsa2VwdERpbXM6X309KDAsYS5zcXVlZXplU2hhcGUpKGkpLGI9ZztpZihiLmxlbmd0aDxpLmxlbmd0aCl7Y29uc3QgVD0oMCxwLnNxdWVlemVJbnB1dFNoYXBlKShpLGIpLHc9WyJiYXRjaCIsImNvbCIsInJvdyJdLHg9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSk7eC51bnBhY2tlZFNoYXBlPVQ7Y29uc3QgRT10aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChsLG4seCksUD1fLnJldmVyc2UoKSx2PWAKICAgICAgICAgICR7RS5yb3V0aW5lQm9keX0KICAgICAgICAgIGZsb2F0ICR7bH0oaW50IGJhdGNoLCBpbnQgcm93LCBpbnQgY29sKSB7CiAgICAgICAgICAgIHJldHVybiAke2x9KCR7KDAscC5nZXRTcXVlZXplZFBhcmFtcykodyxQKX0pOwogICAgICAgICAgfQogICAgICAgIGA7cmV0dXJuIG5ldyB1Lkdsc2xMaWJSb3V0aW5lKHYsRS5kZXBlbmRlbmNpZXMpfWNvbnN0IHk9YAogICAgICAgICAgZmxvYXQgJHtsfShpbnQgZGVwdGgsIGludCByb3csIGludCBjb2wpIHsKICAgICAgICAgICAgLy8gRXhwbGljaXRseSB1c2UgaW50ZWdlciBvcGVyYXRpb25zIGFzIGRvdCgpIG9ubHkgd29ya3Mgb24gZmxvYXRzLgogICAgICAgICAgICBpbnQgaW5kZXggPSBkZXB0aCAqICR7c30gKyBjb2wgKiAke219ICsgcm93OwogICAgICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke2Uud2lkdGh9LCAke2UuaGVpZ2h0fSwgaW5kZXgpOwogICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke259LCB1dik7CiAgICAgICAgICB9CiAgICAgIGA7cmV0dXJuIG5ldyB1Lkdsc2xMaWJSb3V0aW5lKHksWyJjb29yZGluYXRlcy51dkZyb21GbGF0IiwiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLmNvb3Jkc1RvT2Zmc2V0Il0pfWdldFVucGFja2VkU2FtcGxlcjREKGwsbixlKXtjb25zdCBpPWUudW5wYWNrZWRTaGFwZSxzPWlbM10sbT1pWzJdKnMsZz1gCiAgICAgICAgZmxvYXQgJHtsfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHsKICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICR7aVsxXSptfSArIGNvbCAqICR7bX0gKwogICAgICAgICAgICAgIGRlcHRoMiAqICR7c30gKyBkZXB0aDsKICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7ZS53aWR0aH0sICR7ZS5oZWlnaHR9LCBpbmRleCk7CiAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke259LCB1dik7CiAgICAgICAgfQogICAgICBgO3JldHVybiBuZXcgdS5HbHNsTGliUm91dGluZShnLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyNUQobCxuLGUpe2NvbnN0IGk9ZS51bnBhY2tlZFNoYXBlLHM9aVs0XSxtPWlbM10qcyxnPWlbMl0qbSxfPWlbMV0qZyx7bmV3U2hhcGU6YixrZXB0RGltczp5fT0oMCxhLnNxdWVlemVTaGFwZSkoaSk7aWYoYi5sZW5ndGg8aS5sZW5ndGgpe2NvbnN0IHc9KDAscC5zcXVlZXplSW5wdXRTaGFwZSkoaSxiKSx4PVsicm93IiwiY29sIiwiZGVwdGgiLCJkZXB0aDIiLCJkZXB0aDMiXSxFPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZSkpO0UudW5wYWNrZWRTaGFwZT13O2NvbnN0IFA9YAogICAgICAgICAgJHt0aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChsLG4sRSkucm91dGluZUJvZHl9CiAgICAgICAgICBmbG9hdCAke2x9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykgewogICAgICAgICAgICByZXR1cm4gJHtsfSgkeygwLHAuZ2V0U3F1ZWV6ZWRQYXJhbXMpKHgseSl9KTsKICAgICAgICAgIH0KICAgICAgICBgO3JldHVybiBuZXcgdS5HbHNsTGliUm91dGluZShQLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiXSl9Y29uc3QgVD1gCiAgICAgICAgZmxvYXQgJHtsfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHsKICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICR7X30gKyBjb2wgKiAke2d9ICsgZGVwdGggKiAke219ICsKICAgICAgICAgIGRlcHRoMyAqICR7c30gKyBkZXB0aDI7CiAgICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke2Uud2lkdGh9LCAke2UuaGVpZ2h0fSwgaW5kZXgpOwogICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHtufSwgdXYpOwogICAgICAgIH0KICAgICAgYDtyZXR1cm4gbmV3IHUuR2xzbExpYlJvdXRpbmUoVCxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy51dkZyb21GbGF0Il0pfWdldFVucGFja2VkU2FtcGxlcjZEKGwsbixlKXtjb25zdCBpPWUudW5wYWNrZWRTaGFwZSxzPWlbNV0sbT1pWzRdKnMsZz1pWzNdKm0sXz1pWzJdKmcsYj1pWzFdKl8se25ld1NoYXBlOnksa2VwdERpbXM6VH09KDAsYS5zcXVlZXplU2hhcGUpKGkpO2lmKHkubGVuZ3RoPGkubGVuZ3RoKXtjb25zdCB4PSgwLHAuc3F1ZWV6ZUlucHV0U2hhcGUpKGkseSksRT1bInJvdyIsImNvbCIsImRlcHRoIiwiZGVwdGgyIiwiZGVwdGgzIiwiZGVwdGg0Il0sUD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKTtQLnVucGFja2VkU2hhcGU9eDtjb25zdCB2PWAKICAgICAgICAgICAgJHt0aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChsLG4sUCkucm91dGluZUJvZHl9CiAgICAgICAgICAgIGZsb2F0ICR7bH0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLAogICAgICAgICAgICAgIGludCBkZXB0aDIsIGludCBkZXB0aDMsIGludCBkZXB0aDQpIHsKICAgICAgICAgICAgICByZXR1cm4gJHtsfSgkeygwLHAuZ2V0U3F1ZWV6ZWRQYXJhbXMpKEUsVCl9KTsKICAgICAgICAgICAgfQogICAgICAgICAgYDtyZXR1cm4gbmV3IHUuR2xzbExpYlJvdXRpbmUodixbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy51dkZyb21GbGF0Il0pfWNvbnN0IHc9YAogICAgICAgICAgZmxvYXQgJHtsfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsCiAgICAgICAgICAgIGludCBkZXB0aDIsIGludCBkZXB0aDMsIGludCBkZXB0aDQpIHsKICAgICAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHtifSArIGNvbCAqICR7X30gKyBkZXB0aCAqICR7Z30gKwogICAgICAgICAgICBkZXB0aDIgKiAke219ICsgZGVwdGgzICogJHtzfSArIGRlcHRoNDsKICAgICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtlLndpZHRofSwgJHtlLmhlaWdodH0sIGluZGV4KTsKICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHtufSwgdXYpOwogICAgICAgICAgfQogICAgICAgIGA7cmV0dXJuIG5ldyB1Lkdsc2xMaWJSb3V0aW5lKHcsWyJjb29yZGluYXRlcy51dkZyb21GbGF0IiwiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLmNvb3Jkc1RvT2Zmc2V0Il0pfXRvVmVjKCl7Y29uc3QgbD10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dCxuPWwuc2hhcGUubGVuZ3RoLGU9bC5zdHJpZGVzLGk9bC53aWR0aCxzPWwuaGVpZ2h0LG09W107Zm9yKGxldCBfPTA7XzxuLTE7KytfKW0ucHVzaChgCiAgICAgICAgY1ske199XSA9IG9mZnNldCAvICR7ZVtfXX07YCksbS5wdXNoKGAKICAgICAgICBvZmZzZXQgLT0gY1ske199XSAqICR7ZVtfXX07YCk7bS5wdXNoKGAKICAgICAgICBjWyR7bi0xfV0gPSBvZmZzZXQ7YCk7Y29uc3QgZz1gCiAgICAgIHZvaWQgdG9WZWModmVjMiB0ZXhDb29yZHMsIG91dCBpbnQgY1ske259XSkgewogICAgICAgIGludCBvZmZzZXQgPSBjb29yZHNUb09mZnNldCh0ZXhDb29yZHMsICR7aX0sICR7c30pOwogICAgICAgICR7bS5qb2luKCIiKX0KICAgICAgfQogICAgICB2b2lkIHRvVmVjKGludCBvZmZzZXQsIG91dCBpbnQgY1ske259XSkgewogICAgICAgICR7bS5qb2luKCIiKX0KICAgICAgfQogICAgYDtyZXR1cm57dG9WZWM6bmV3IHUuR2xzbExpYlJvdXRpbmUoZyxbImNvb3JkaW5hdGVzLmNvb3Jkc1RvT2Zmc2V0Il0pfX12YWx1ZUZyb20oKXtjb25zdCBsPXt9O3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaW5wdXROYW1lcy5mb3JFYWNoKChuLGUpPT57Y29uc3QgaT10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tlXSxzPShpLnVucGFja2VkU2hhcGUubGVuZ3RoPjA/aS51bnBhY2tlZFNoYXBlOmkuc2hhcGUpLmxlbmd0aDtsZXQgbT1gXyR7bn1gO2xbbV09bmV3IHUuR2xzbExpYlJvdXRpbmUodGhpcy5nZXRWYWx1ZUZyb21TaW5nbGUobixzLGkud2lkdGgsaS5oZWlnaHQsITEpLFtgc2hhcGVVdGlscy5pbmRpY2VzVG9PZmZzZXQke219YCwiY29vcmRpbmF0ZXMub2Zmc2V0VG9Db29yZHMiLCJmcmFnY29sb3IuZ2V0Q29sb3JBc0Zsb2F0Il0pLG0rPSJfVCIsbFttXT1uZXcgdS5HbHNsTGliUm91dGluZSh0aGlzLmdldFZhbHVlRnJvbVNpbmdsZShuLHMsaS53aWR0aCxpLmhlaWdodCwhMCksW2BzaGFwZVV0aWxzLmluZGljZXNUb09mZnNldCR7bX1gLCJjb29yZGluYXRlcy5vZmZzZXRUb0Nvb3JkcyIsImZyYWdjb2xvci5nZXRDb2xvckFzRmxvYXQiXSl9KSxsfWdldFZhbHVlRnJvbVNpbmdsZShsLG4sZSxpLHMpe2xldCBtPWBfJHtsfWA7cmV0dXJuIHMmJihtKz0iX1QiKSxgCiAgICAgICAgZmxvYXQgJHttfShpbnQgbVske259XSkgewogICAgICAgICAgaW50IG9mZnNldCA9IGluZGljZXNUb09mZnNldCR7bX0obSk7CiAgICAgICAgICB2ZWMyIGNvb3JkcyA9IG9mZnNldFRvQ29vcmRzKG9mZnNldCwgJHtlfSwgJHtpfSk7CiAgICAgICAgICBmbG9hdCB2YWx1ZSA9IGdldENvbG9yQXNGbG9hdCgkeygwLGguZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKS50ZXh0dXJlMkR9KCR7bH0sIGNvb3JkcykpOwogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgICBgfWdldFBhY2tlZFZhbHVlRnJvbShsLG4sZSxpLHMpe2xldCBtPWBfJHtsfV9QYWNrYDtyZXR1cm4gcyYmKG0rPSJfVCIpLGAKICAgICAgICB2ZWM0ICR7bX0oaW50IG1bJHtufV0pIHsKICAgICAgICAgIGludCBvZmZzZXQgPSBpbmRpY2VzVG9PZmZzZXRfJHtsfShtKTsKICAgICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke2V9LCAke2l9KTsKICAgICAgICAgIHJldHVybiAkeygwLGguZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKS50ZXh0dXJlMkR9KCR7bH0sIGNvb3Jkcyk7CiAgICAgICAgfQogICAgICAgIGB9fXQuQ29vcmRzR2xzbExpYj1mfSw4NTIwOihjLHQpPT57dmFyIHI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuVG9wb2xvZ2ljYWxTb3J0R2xzbFJvdXRpbmVzPXQuR2xzbExpYlJvdXRpbmVOb2RlPXQuR2xzbExpYlJvdXRpbmU9dC5HbHNsTGliPXQuR2xzbENvbnRleHQ9dC5GdW5jdGlvblR5cGU9dm9pZCAwLChyPXQuRnVuY3Rpb25UeXBlfHwodC5GdW5jdGlvblR5cGU9e30pKVtyLlZhbHVlQmFzZWQ9MF09IlZhbHVlQmFzZWQiLHJbci5Qb3NpdGlvbmFsPTFdPSJQb3NpdGlvbmFsIix0Lkdsc2xDb250ZXh0PWNsYXNze2NvbnN0cnVjdG9yKG8sdSxoLGEpe3RoaXMuZ2xDb250ZXh0PW8sdGhpcy5wcm9ncmFtSW5mbz11LHRoaXMuaW5wdXRUZXh0dXJlTGF5b3V0cz1oLHRoaXMub3V0cHV0VGV4dHVyZUxheW91dD1hfX0sdC5HbHNsTGliPWNsYXNze2NvbnN0cnVjdG9yKG8pe3RoaXMuY29udGV4dD1vfX0sdC5HbHNsTGliUm91dGluZT1jbGFzc3tjb25zdHJ1Y3RvcihvLHUpe3RoaXMucm91dGluZUJvZHk9byx0aGlzLmRlcGVuZGVuY2llcz11fX0sdC5HbHNsTGliUm91dGluZU5vZGU9Y2xhc3N7Y29uc3RydWN0b3Iobyx1LGgpe3RoaXMubmFtZT1vLHRoaXMuZGVwZW5kZW5jaWVzPWh8fFtdLHUmJih0aGlzLnJvdXRpbmVCb2R5PXUpfWFkZERlcGVuZGVuY3kobyl7byYmdGhpcy5kZXBlbmRlbmNpZXMucHVzaChvKX19LHQuVG9wb2xvZ2ljYWxTb3J0R2xzbFJvdXRpbmVzPWNsYXNze3N0YXRpYyByZXR1cm5PcmRlcmVkTm9kZXMobyl7aWYoIW98fG8ubGVuZ3RoPT09MClyZXR1cm5bXTtpZihvLmxlbmd0aD09PTEpcmV0dXJuIG87Y29uc3QgdT1uZXcgU2V0LGg9bmV3IFNldCxhPW5ldyBBcnJheTtyZXR1cm4gdGhpcy5jcmVhdGVPcmRlcmVkTm9kZXMobyx1LGgsYSksYX1zdGF0aWMgY3JlYXRlT3JkZXJlZE5vZGVzKG8sdSxoLGEpe2ZvcihsZXQgcD0wO3A8by5sZW5ndGg7KytwKXRoaXMuZGZzVHJhdmVyc2Uob1twXSx1LGgsYSl9c3RhdGljIGRmc1RyYXZlcnNlKG8sdSxoLGEpe2lmKCFvfHxoLmhhcyhvLm5hbWUpKXJldHVybjtpZih1LmhhcyhvLm5hbWUpKXRocm93IG5ldyBFcnJvcigiQ3ljbGljIGRlcGVuZGVuY3kgZGV0ZWN0ZWQuIENhbid0IHRvcG9sb2dpY2FsbHkgc29ydCByb3V0aW5lcyBuZWVkZWQgZm9yIHNoYWRlci4iKTt1LmFkZChvLm5hbWUpO2NvbnN0IHA9by5kZXBlbmRlbmNpZXM7aWYocCYmcC5sZW5ndGg+MClmb3IobGV0IGY9MDtmPHAubGVuZ3RoOysrZil0aGlzLmRmc1RyYXZlcnNlKHBbZl0sdSxoLGEpO2EucHVzaChvKSxoLmFkZChvLm5hbWUpLHUuZGVsZXRlKG8ubmFtZSl9fX0sNzM0MTooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRW5jb2RpbmdHbHNsTGliPXZvaWQgMDtjb25zdCBvPXIoODUyMCk7Y2xhc3MgdSBleHRlbmRzIG8uR2xzbExpYntjb25zdHJ1Y3RvcihhKXtzdXBlcihhKX1nZXRGdW5jdGlvbnMoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMuZW5jb2RlRmxvYXQzMigpKSx0aGlzLmRlY29kZUZsb2F0MzIoKSl9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm57fX1lbmNvZGVGbG9hdDMyKCl7cmV0dXJue2VuY29kZTpuZXcgby5HbHNsTGliUm91dGluZShgaGlnaHAgdmVjNCBlbmNvZGUoaGlnaHAgZmxvYXQgZikgewogICAgICAgIHJldHVybiB2ZWM0KGYsIDAuMCwgMC4wLCAwLjApOwogICAgICB9CiAgICAgICAgYCl9fWRlY29kZUZsb2F0MzIoKXtyZXR1cm57ZGVjb2RlOm5ldyBvLkdsc2xMaWJSb3V0aW5lKGBoaWdocCBmbG9hdCBkZWNvZGUoaGlnaHAgdmVjNCByZ2JhKSB7CiAgICAgICAgcmV0dXJuIHJnYmEucjsKICAgICAgfQogICAgICAgIGApfX1lbmNvZGVVaW50OCgpe2NvbnN0IGE9dS5pc0xpdHRsZUVuZGlhbigpPyJyZ2JhLnJnYmE9cmdiYS5hYmdyOyI6IiI7cmV0dXJue2VuY29kZTpuZXcgby5HbHNsTGliUm91dGluZShgCiAgICAgIGhpZ2hwIHZlYzQgZW5jb2RlKGhpZ2hwIGZsb2F0IGYpIHsKICAgICAgICBoaWdocCBmbG9hdCBGID0gYWJzKGYpOwogICAgICAgIGhpZ2hwIGZsb2F0IFNpZ24gPSBzdGVwKDAuMCwtZik7CiAgICAgICAgaGlnaHAgZmxvYXQgRXhwb25lbnQgPSBmbG9vcihsb2cyKEYpKTsKICAgICAgICBoaWdocCBmbG9hdCBNYW50aXNzYSA9IChleHAyKC0gRXhwb25lbnQpICogRik7CiAgICAgICAgRXhwb25lbnQgPSBmbG9vcihsb2cyKEYpICsgMTI3LjApICsgZmxvb3IobG9nMihNYW50aXNzYSkpOwogICAgICAgIGhpZ2hwIHZlYzQgcmdiYTsKICAgICAgICByZ2JhWzBdID0gMTI4LjAgKiBTaWduICArIGZsb29yKEV4cG9uZW50KmV4cDIoLTEuMCkpOwogICAgICAgIHJnYmFbMV0gPSAxMjguMCAqIG1vZChFeHBvbmVudCwyLjApICsgbW9kKGZsb29yKE1hbnRpc3NhKjEyOC4wKSwxMjguMCk7CiAgICAgICAgcmdiYVsyXSA9IGZsb29yKG1vZChmbG9vcihNYW50aXNzYSpleHAyKDIzLjAgLTguMCkpLGV4cDIoOC4wKSkpOwogICAgICAgIHJnYmFbM10gPSBmbG9vcihleHAyKDIzLjApKm1vZChNYW50aXNzYSxleHAyKC0xNS4wKSkpOwogICAgICAgICR7YX0KICAgICAgICByZ2JhID0gcmdiYSAvIDI1NS4wOyAvLyB2YWx1ZXMgbmVlZCB0byBiZSBub3JtYWxpemVkIHRvIFswLDFdCiAgICAgICAgcmV0dXJuIHJnYmE7CiAgICB9CiAgICAgICAgYCl9fWRlY29kZVVpbnQ4KCl7Y29uc3QgYT11LmlzTGl0dGxlRW5kaWFuKCk/InJnYmEucmdiYT1yZ2JhLmFiZ3I7IjoiIjtyZXR1cm57ZGVjb2RlOm5ldyBvLkdsc2xMaWJSb3V0aW5lKGAKICAgICAgICBoaWdocCBmbG9hdCBkZWNvZGUoaGlnaHAgdmVjNCByZ2JhKSB7CiAgICAgICAgICByZ2JhID0gcmdiYSAqIDI1NS4wOyAvLyB2YWx1ZXMgbmVlZCB0byBiZSBkZS1ub3JtYWxpemVkIGZyb20gWzAsMV0gdG8gWzAsMjU1XQogICAgICAgICAgJHthfQogICAgICAgICAgaGlnaHAgZmxvYXQgU2lnbiA9IDEuMCAtIHN0ZXAoMTI4LjAscmdiYVswXSkqMi4wOwogICAgICAgICAgaGlnaHAgZmxvYXQgRXhwb25lbnQgPSAyLjAgKiBtb2QocmdiYVswXSwxMjguMCkgKyBzdGVwKDEyOC4wLHJnYmFbMV0pIC0gMTI3LjA7CiAgICAgICAgICBoaWdocCBmbG9hdCBNYW50aXNzYSA9IG1vZChyZ2JhWzFdLDEyOC4wKSo2NTUzNi4wICsgcmdiYVsyXSoyNTYuMCArcmdiYVszXSArIGZsb2F0KDB4ODAwMDAwKTsKICAgICAgICAgIGhpZ2hwIGZsb2F0IFJlc3VsdCA9ICBTaWduICogZXhwMihFeHBvbmVudCkgKiAoTWFudGlzc2EgKiBleHAyKC0yMy4wICkpOwogICAgICAgICAgcmV0dXJuIFJlc3VsdDsKICAgICAgfQogICAgICAgIGApfX1zdGF0aWMgaXNMaXR0bGVFbmRpYW4oKXtjb25zdCBhPW5ldyBBcnJheUJ1ZmZlcig0KSxwPW5ldyBVaW50MzJBcnJheShhKSxmPW5ldyBVaW50OEFycmF5KGEpO2lmKHBbMF09MzczNTkyODU1OSxmWzBdPT09MjM5KXJldHVybiEwO2lmKGZbMF09PT0yMjIpcmV0dXJuITE7dGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGVuZGlhbm5lc3MiKX19dC5FbmNvZGluZ0dsc2xMaWI9dX0sOTg5NDooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRnJhZ0NvbG9yR2xzbExpYj12b2lkIDA7Y29uc3Qgbz1yKDg1MjApLHU9cig1MDYwKTtjbGFzcyBoIGV4dGVuZHMgby5HbHNsTGlie2NvbnN0cnVjdG9yKHApe3N1cGVyKHApfWdldEZ1bmN0aW9ucygpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5zZXRGcmFnQ29sb3IoKSksdGhpcy5nZXRDb2xvckFzRmxvYXQoKSl9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm57fX1zZXRGcmFnQ29sb3IoKXtjb25zdCBwPSgwLHUuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKTtyZXR1cm57c2V0RnJhZ0NvbG9yOm5ldyBvLkdsc2xMaWJSb3V0aW5lKGAKICAgICAgICB2b2lkIHNldEZyYWdDb2xvcihmbG9hdCB2YWx1ZSkgewogICAgICAgICAgICAke3Aub3V0cHV0fSA9IGVuY29kZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGAsWyJlbmNvZGluZy5lbmNvZGUiXSl9fWdldENvbG9yQXNGbG9hdCgpe3JldHVybntnZXRDb2xvckFzRmxvYXQ6bmV3IG8uR2xzbExpYlJvdXRpbmUoYAogICAgICAgIGZsb2F0IGdldENvbG9yQXNGbG9hdCh2ZWM0IGNvbG9yKSB7CiAgICAgICAgICAgIHJldHVybiBkZWNvZGUoY29sb3IpOwogICAgICAgIH0KICAgICAgICBgLFsiZW5jb2RpbmcuZGVjb2RlIl0pfX19dC5GcmFnQ29sb3JHbHNsTGliPWh9LDI4NDg6KGMsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZXBsYWNlSW5saW5lcz12b2lkIDA7Y29uc3Qgcj0vQGlubGluZVtcc1xuXHJdKyhcdyspW1xzXG5ccl0rKFswLTlhLXpBLVpfXSspXHMqXCgoW14pXSopXClccyp7KChbXn1dfFtcblxyXSkqKX0vZ207dC5yZXBsYWNlSW5saW5lcz1mdW5jdGlvbihvKXtjb25zdCB1PXt9O2xldCBoO2Zvcig7KGg9ci5leGVjKG8pKSE9PW51bGw7KXtjb25zdCBhPWhbM10uc3BsaXQoIiwiKS5tYXAocD0+e2NvbnN0IGY9cC50cmltKCkuc3BsaXQoIiAiKTtyZXR1cm4gZiYmZi5sZW5ndGg9PT0yP3t0eXBlOmZbMF0sbmFtZTpmWzFdfTpudWxsfSkuZmlsdGVyKHA9PnAhPT1udWxsKTt1W2hbMl1dPXtwYXJhbXM6YSxib2R5OmhbNF19fWZvcihjb25zdCBhIGluIHUpe2NvbnN0IHA9IihcXHcrKT9cXHMrKFtfMC05YS16QS1aXSspXFxzKz1cXHMrX19GVU5DX19cXCgoLiopXFwpXFxzKjsiLnJlcGxhY2UoIl9fRlVOQ19fIixhKSxmPW5ldyBSZWdFeHAocCwiZ20iKTtmb3IoOyhoPWYuZXhlYyhvKSkhPT1udWxsOyl7Y29uc3QgZD1oWzFdLGw9aFsyXSxuPWhbM10uc3BsaXQoIiwiKSxlPWQ/YCR7ZH0gJHtsfTtgOiIiO2xldCBpPXVbYV0uYm9keSxzPSIiO3VbYV0ucGFyYW1zLmZvckVhY2goKGcsXyk9PntnJiYocys9YCR7Zy50eXBlfSAke2cubmFtZX0gPSAke25bX119OwpgKX0pLGk9YCR7c30KICR7aX1gLGk9aS5yZXBsYWNlKCJyZXR1cm4iLGAke2x9ID0gYCk7Y29uc3QgbT1gCiAgICAgICR7ZX0KICAgICAgewogICAgICAgICR7aX0KICAgICAgfQogICAgICBgO289by5yZXBsYWNlKGhbMF0sbSl9fXJldHVybiBvLnJlcGxhY2UociwiIil9fSw4ODc5OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5HbHNsUHJlcHJvY2Vzc29yPXZvaWQgMDtjb25zdCBvPXIoODUyMCksdT1yKDI4NDgpLGg9cig1NDgzKSxhPXIoNTA2MCk7dC5HbHNsUHJlcHJvY2Vzc29yPWNsYXNze2NvbnN0cnVjdG9yKHAsZixkLGwpe3RoaXMubGlicz17fSx0aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoPXt9LHRoaXMuY29udGV4dD1uZXcgby5HbHNsQ29udGV4dChwLGYsZCxsKSxPYmplY3Qua2V5cyhoLmdsc2xSZWdpc3RyeSkuZm9yRWFjaChlPT57Y29uc3QgaT1uZXcgaC5nbHNsUmVnaXN0cnlbZV0odGhpcy5jb250ZXh0KTt0aGlzLmxpYnNbZV09aX0pO2NvbnN0IG49dGhpcy5nbHNsTGliUm91dGluZURlcGVuZGVuY3lHcmFwaDtmb3IoY29uc3QgZSBpbiB0aGlzLmxpYnMpe2NvbnN0IGk9dGhpcy5saWJzW2VdLmdldEZ1bmN0aW9ucygpO2Zvcihjb25zdCBzIGluIGkpe2NvbnN0IG09ZSsiLiIrcztsZXQgZztuW21dPyhnPW5bbV0sZy5yb3V0aW5lQm9keT1pW3NdLnJvdXRpbmVCb2R5KTooZz1uZXcgby5HbHNsTGliUm91dGluZU5vZGUobSxpW3NdLnJvdXRpbmVCb2R5KSxuW21dPWcpO2NvbnN0IF89aVtzXS5kZXBlbmRlbmNpZXM7aWYoXylmb3IobGV0IGI9MDtiPF8ubGVuZ3RoOysrYilpZihuW19bYl1dKWcuYWRkRGVwZW5kZW5jeShuW19bYl1dKTtlbHNle2NvbnN0IHk9bmV3IG8uR2xzbExpYlJvdXRpbmVOb2RlKF9bYl0pO25bX1tiXV09eSxnLmFkZERlcGVuZGVuY3koeSl9fX19cHJlcHJvY2Vzcygpe2NvbnN0IHA9dGhpcy5jb250ZXh0LnByb2dyYW1JbmZvO2xldCBmPXAuc2hhZGVyU291cmNlO3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaGFzTWFpbnx8KGY9YCR7Zn0KICAgICAgJHsoMCxhLmdldERlZmF1bHRGcmFnU2hhZGVyTWFpbikodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uLHRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0LnNoYXBlLmxlbmd0aCl9YCksZj0oMCx1LnJlcGxhY2VJbmxpbmVzKShmKSxgJHsoMCxhLmdldEZyYWdTaGFkZXJQcmVhbWJsZSkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKX0KICAgICR7dGhpcy5nZXRVbmlmb3JtcyhwLmlucHV0TmFtZXMscC52YXJpYWJsZXMpfQogICAgJHt0aGlzLmdldEltcG9ydHMoZil9CiAgICAke2Z9YH1nZXRJbXBvcnRzKHApe2NvbnN0IGY9dGhpcy5zZWxlY3RHbHNsTGliUm91dGluZXNUb0JlSW5jbHVkZWQocCk7aWYoZi5sZW5ndGg9PT0wKXJldHVybiIiO2xldCBkPSIiO2ZvcihsZXQgbD0wO2w8Zi5sZW5ndGg7KytsKXtpZighZltsXS5yb3V0aW5lQm9keSl0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgYm9keSBmb3IgdGhlIEdsc2wgTGlicmFyeSByb3V0aW5lOiAke2ZbbF0ubmFtZX1gKTtkKz1mW2xdLnJvdXRpbmVCb2R5K2AKYH1yZXR1cm4gZH1zZWxlY3RHbHNsTGliUm91dGluZXNUb0JlSW5jbHVkZWQocCl7Y29uc3QgZj1bXTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5nbHNsTGliUm91dGluZURlcGVuZGVuY3lHcmFwaCkuZm9yRWFjaChkPT57Y29uc3QgbD1kLnNwbGl0KCIuIilbMV07cC5pbmRleE9mKGwpIT09LTEmJmYucHVzaCh0aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoW2RdKX0pLG8uVG9wb2xvZ2ljYWxTb3J0R2xzbFJvdXRpbmVzLnJldHVybk9yZGVyZWROb2RlcyhmKX1nZXRVbmlmb3JtcyhwLGYpe2NvbnN0IGQ9W107aWYocClmb3IoY29uc3QgbCBvZiBwKWQucHVzaChgdW5pZm9ybSBzYW1wbGVyMkQgJHtsfTtgKTtpZihmKWZvcihjb25zdCBsIG9mIGYpZC5wdXNoKGB1bmlmb3JtICR7bC50eXBlfSAke2wubmFtZX0ke2wuYXJyYXlMZW5ndGg/YFske2wuYXJyYXlMZW5ndGh9XWA6IiJ9O2ApO3JldHVybiBkLmpvaW4oYApgKX19fSw1NDgzOihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5nbHNsUmVnaXN0cnk9dm9pZCAwO2NvbnN0IG89cig1MTA3KSx1PXIoNzM0MSksaD1yKDk4OTQpLGE9cigyNjU1KSxwPXIoMzg5MSk7dC5nbHNsUmVnaXN0cnk9e2VuY29kaW5nOnUuRW5jb2RpbmdHbHNsTGliLGZyYWdjb2xvcjpoLkZyYWdDb2xvckdsc2xMaWIsdmVjOnAuVmVjR2xzbExpYixzaGFwZVV0aWxzOmEuU2hhcGVVdGlsc0dsc2xMaWIsY29vcmRpbmF0ZXM6by5Db29yZHNHbHNsTGlifX0sMjY1NTooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuU2hhcGVVdGlsc0dsc2xMaWI9dm9pZCAwO2NvbnN0IG89cig4NTIwKTtjbGFzcyB1IGV4dGVuZHMgby5HbHNsTGlie2NvbnN0cnVjdG9yKGEpe3N1cGVyKGEpfWdldEZ1bmN0aW9ucygpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5iY2FzdEluZGV4KCkpLHRoaXMuYmNhc3RNYXRtdWxJbmRleCgpKSx0aGlzLm9mZnNldFRvSW5kaWNlcygpKSx0aGlzLmluZGljZXNUb09mZnNldCgpKSx0aGlzLmluY3JlbWVudEluZGljZXMoKSl9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm57fX1iY2FzdEluZGV4KCl7Y29uc3QgYT10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dC5zaGFwZS5sZW5ndGgscD17fTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgoZixkKT0+e2NvbnN0IGw9dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbZF0udW5wYWNrZWRTaGFwZTtpZihsLmxlbmd0aDw9YSl7Y29uc3Qgbj1sLmxlbmd0aCxlPWEtbixpPWBiY2FzdEluZGljZXNfJHtmfWA7bGV0IHM9IiI7Zm9yKGxldCBnPTA7ZzxuOysrZylzKz1gCiAgICAgICAgICByZWFsSW5kaWNlc1ske2d9XSA9IGludCggbW9kKGZsb2F0KGJjYXN0ZWRJbmRpY2VzWyR7ZStnfV0pLCAke2xbZ119LjApICk7CiAgICAgICAgICBgO2NvbnN0IG09YAogICAgICAgIHZvaWQgJHtpfSAoaW50IGJjYXN0ZWRJbmRpY2VzWyR7YX1dLCBvdXQgaW50IHJlYWxJbmRpY2VzWyR7bn1dKSB7CiAgICAgICAgICAke3N9CiAgICAgICAgfQogICAgICAgIGA7cFtpXT1uZXcgby5HbHNsTGliUm91dGluZShtKX19KSxwfWJjYXN0TWF0bXVsSW5kZXgoKXtjb25zdCBhPXRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0LnNoYXBlLmxlbmd0aCxwPXt9O3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaW5wdXROYW1lcy5mb3JFYWNoKChmLGQpPT57Y29uc3QgbD10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tkXS5zaGFwZTtpZighKGwubGVuZ3RoPDJ8fGwubGVuZ3RoPmEpKXtjb25zdCBuPWwubGVuZ3RoLGU9YS1uLGk9YGJjYXN0TWF0bXVsSW5kaWNlc18ke2Z9YDtsZXQgcz0iIjtmb3IobGV0IGc9MDtnPG4tMjsrK2cpcys9YAogICAgICAgICAgcmVhbEluZGljZXNbJHtnfV0gPSBpbnQoIG1vZChmbG9hdChiY2FzdGVkSW5kaWNlc1ske2UrZ31dKSwgJHtsW2ddfS4wKSApOwogICAgICAgICAgYDtjb25zdCBtPWAKICAgICAgICB2b2lkICR7aX0oaW50IGJjYXN0ZWRJbmRpY2VzWyR7YX1dLCBvdXQgaW50IHJlYWxJbmRpY2VzWyR7bn1dKSB7CiAgICAgICAgICAke3N9CiAgICAgICAgICByZWFsSW5kaWNlc1ske24tMX1dID0gYmNhc3RlZEluZGljZXNbJHthLTF9XTsKICAgICAgICAgIHJlYWxJbmRpY2VzWyR7bi0yfV0gPSBiY2FzdGVkSW5kaWNlc1ske2EtMn1dOwogICAgICAgIH0KICAgICAgICBgO3BbaV09bmV3IG8uR2xzbExpYlJvdXRpbmUobSl9fSkscH1pbmRpY2VzVG9PZmZzZXQoKXtjb25zdCBhPXt9O3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaW5wdXROYW1lcy5mb3JFYWNoKChwLGYpPT57Y29uc3QgZD10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tmXS5zaGFwZSxsPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW2ZdLnN0cmlkZXMsbj1kLmxlbmd0aDtsZXQgZT1gaW5kaWNlc1RvT2Zmc2V0XyR7cH1gO2FbZV09bmV3IG8uR2xzbExpYlJvdXRpbmUodS5pbmRleFRvT2Zmc2V0U2luZ2xlKGUsbixsKSksZT1gaW5kaWNlc1RvT2Zmc2V0XyR7cH1fVGAsYVtlXT1uZXcgby5HbHNsTGliUm91dGluZSh1LmluZGV4VG9PZmZzZXRTaW5nbGUoZSxuLGwuc2xpY2UoKS5yZXZlcnNlKCkpKX0pLGF9c3RhdGljIGluZGV4VG9PZmZzZXRTaW5nbGUoYSxwLGYpe2xldCBkPSIiO2ZvcihsZXQgbD1wLTE7bD49MDstLWwpZCs9YAogICAgICAgIG9mZnNldCArPSBpbmRpY2VzWyR7bH1dICogJHtmW2xdfTsKICAgICAgICBgO3JldHVybmAKICAgICAgaW50ICR7YX0oaW50IGluZGljZXNbJHtwfV0pIHsKICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKICAgICAgICAke2R9CiAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgfQogICAgICBgfW9mZnNldFRvSW5kaWNlcygpe2NvbnN0IGE9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKHAsZik9Pntjb25zdCBkPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW2ZdLnNoYXBlLGw9dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbZl0uc3RyaWRlcyxuPWQubGVuZ3RoO2xldCBlPWBvZmZzZXRUb0luZGljZXNfJHtwfWA7YVtlXT1uZXcgby5HbHNsTGliUm91dGluZSh1Lm9mZnNldFRvSW5kaWNlc1NpbmdsZShlLG4sbCkpLGU9YG9mZnNldFRvSW5kaWNlc18ke3B9X1RgLGFbZV09bmV3IG8uR2xzbExpYlJvdXRpbmUodS5vZmZzZXRUb0luZGljZXNTaW5nbGUoZSxuLGwuc2xpY2UoKS5yZXZlcnNlKCkpKX0pLGF9c3RhdGljIG9mZnNldFRvSW5kaWNlc1NpbmdsZShhLHAsZil7Y29uc3QgZD1bXTtmb3IobGV0IGw9MDtsPHAtMTsrK2wpZC5wdXNoKGAKICAgICAgaW5kaWNlc1ske2x9XSA9IG9mZnNldCAvICR7ZltsXX07YCksZC5wdXNoKGAKICAgICAgICBvZmZzZXQgLT0gaW5kaWNlc1ske2x9XSAqICR7ZltsXX07YCk7cmV0dXJuIGQucHVzaChgCiAgICAgIGluZGljZXNbJHtwLTF9XSA9IG9mZnNldDtgKSxgCiAgICAgIHZvaWQgJHthfShpbnQgb2Zmc2V0LCBvdXQgaW50IGluZGljZXNbJHtwfV0pIHsKICAgICAgICAke2Quam9pbigiIil9CiAgICAgIH0KICAgICAgYH1pbmNyZW1lbnRJbmRpY2VzKCl7Y29uc3QgYT17fTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgocCxmKT0+e2NvbnN0IGQ9dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbZl0uc2hhcGUsbD1kLmxlbmd0aCxuPWBpbmNyZW1lbnRJbmRpY2VzXyR7cH1gO2xldCBlPSIiO2ZvcihsZXQgcz0wO3M8bDsrK3MpZSs9YAogICAgICAgIHNoYXBlWyR7c31dID0gJHtkW3NdfTtgO2NvbnN0IGk9YAogICAgICAgIHZvaWQgJHtufShpbnQgYXhpcywgb3V0IGludCBpbmRpY2VzWyR7bH1dKSB7CiAgICAgICAgICBpbnQgc2hhcGVbJHtsfV07CiAgICAgICAgICAke2V9OwogICAgICAgICAgZm9yKGludCBpID0gJHtsfSAtMSA7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICAgIGlmKGkgPiBheGlzKSBjb250aW51ZTsKICAgICAgICAgICAgaW5kaWNlc1tpXSArPSAxOwogICAgICAgICAgICBpZihpbmRpY2VzW2ldIDwgc2hhcGVbaV0pIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbmRpY2VzW2ldID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYDthW25dPW5ldyBvLkdsc2xMaWJSb3V0aW5lKGkpfSksYX19dC5TaGFwZVV0aWxzR2xzbExpYj11fSw1MDYwOihjLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0RGVmYXVsdEZyYWdTaGFkZXJNYWluPXQuZ2V0RnJhZ1NoYWRlclByZWFtYmxlPXQuZ2V0VmVydGV4U2hhZGVyU291cmNlPXQuZ2V0R2xzbD12b2lkIDA7Y29uc3Qgcj17dmVyc2lvbjoiIixhdHRyaWJ1dGU6ImF0dHJpYnV0ZSIsdmFyeWluZ1ZlcnRleDoidmFyeWluZyIsdmFyeWluZ0ZyYWc6InZhcnlpbmciLHRleHR1cmUyRDoidGV4dHVyZTJEIixvdXRwdXQ6ImdsX0ZyYWdDb2xvciIsb3V0cHV0RGVjbGFyYXRpb246IiJ9LG89e3ZlcnNpb246IiN2ZXJzaW9uIDMwMCBlcyIsYXR0cmlidXRlOiJpbiIsdmFyeWluZ1ZlcnRleDoib3V0Iix2YXJ5aW5nRnJhZzoiaW4iLHRleHR1cmUyRDoidGV4dHVyZSIsb3V0cHV0OiJvdXRwdXRDb2xvciIsb3V0cHV0RGVjbGFyYXRpb246Im91dCB2ZWM0IG91dHB1dENvbG9yOyJ9O2Z1bmN0aW9uIHUoaCl7cmV0dXJuIGg9PT0xP3I6b310LmdldEdsc2w9dSx0LmdldFZlcnRleFNoYWRlclNvdXJjZT1mdW5jdGlvbihoKXtjb25zdCBhPXUoaCk7cmV0dXJuYCR7YS52ZXJzaW9ufQogICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICR7YS5hdHRyaWJ1dGV9IHZlYzMgcG9zaXRpb247CiAgICAgICR7YS5hdHRyaWJ1dGV9IHZlYzIgdGV4dHVyZUNvb3JkOwoKICAgICAgJHthLnZhcnlpbmdWZXJ0ZXh9IHZlYzIgVGV4Q29vcmRzOwoKICAgICAgdm9pZCBtYWluKCkKICAgICAgewogICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAxLjApOwogICAgICAgICAgVGV4Q29vcmRzID0gdGV4dHVyZUNvb3JkOwogICAgICB9YH0sdC5nZXRGcmFnU2hhZGVyUHJlYW1ibGU9ZnVuY3Rpb24oaCl7Y29uc3QgYT11KGgpO3JldHVybmAke2EudmVyc2lvbn0KICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgIHByZWNpc2lvbiBoaWdocCBpbnQ7CiAgICBwcmVjaXNpb24gaGlnaHAgc2FtcGxlcjJEOwogICAgJHthLnZhcnlpbmdGcmFnfSB2ZWMyIFRleENvb3JkczsKICAgICR7YS5vdXRwdXREZWNsYXJhdGlvbn0KICAgIGNvbnN0IHZlYzIgaGFsZkNSID0gdmVjMigwLjUsIDAuNSk7CgogICAgLy8gQ3VzdG9tIHZlY3RvciB0eXBlcyB0byBoYW5kbGUgaGlnaGVyIGRpbWVuYWxpdGllcy4KICAgIHN0cnVjdCBpdmVjNQogICAgewogICAgICBpbnQgeDsKICAgICAgaW50IHk7CiAgICAgIGludCB6OwogICAgICBpbnQgdzsKICAgICAgaW50IHU7CiAgICB9OwoKICAgIHN0cnVjdCBpdmVjNgogICAgewogICAgICBpbnQgeDsKICAgICAgaW50IHk7CiAgICAgIGludCB6OwogICAgICBpbnQgdzsKICAgICAgaW50IHU7CiAgICAgIGludCB2OwogICAgfTsKCiAgICBpbnQgaW1vZChpbnQgeCwgaW50IHkpIHsKICAgICAgcmV0dXJuIHggLSB5ICogKHggLyB5KTsKICAgIH0KCiAgICBgfSx0LmdldERlZmF1bHRGcmFnU2hhZGVyTWFpbj1mdW5jdGlvbihoLGEpe3JldHVybmAKICB2b2lkIG1haW4oKSB7CiAgICBpbnQgaW5kaWNlc1ske2F9XTsKICAgIHRvVmVjKFRleENvb3JkcywgaW5kaWNlcyk7CiAgICB2ZWM0IHJlc3VsdCA9IHZlYzQocHJvY2VzcyhpbmRpY2VzKSk7CiAgICAke3UoaCkub3V0cHV0fSA9IHJlc3VsdDsKICB9CiAgYH19LDM4OTE6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlZlY0dsc2xMaWI9dm9pZCAwO2NvbnN0IG89cig4NTIwKTtjbGFzcyB1IGV4dGVuZHMgby5HbHNsTGlie2NvbnN0cnVjdG9yKGEpe3N1cGVyKGEpfWdldEN1c3RvbVR5cGVzKCl7cmV0dXJue319Z2V0RnVuY3Rpb25zKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5iaW5hcnlWZWNGdW5jdGlvbnMoKSksdGhpcy5jb3B5VmVjKCkpLHRoaXMuc2V0VmVjSXRlbSgpKSx0aGlzLmdldFZlY0l0ZW0oKSl9YmluYXJ5VmVjRnVuY3Rpb25zKCl7Y29uc3QgYT10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dC5zaGFwZS5sZW5ndGgscD17YWRkOiIrPSIsc3ViOiItPSIsbXVsOiIqPSIsZGl2OiIvPSJ9LGY9e307Zm9yKGNvbnN0IGQgaW4gcCl7Y29uc3QgbD1gJHtkfVZlY2A7bGV0IG49IiI7Zm9yKGxldCBpPTA7aTxhOysraSluKz1gCiAgICAgICAgICBkZXN0WyR7aX1dICR7cFtkXX0gc3JjWyR7aX1dOwogICAgICAgICAgYDtjb25zdCBlPWAKICAgICAgICB2b2lkICR7bH0oaW50IHNyY1ske2F9XSwgb3V0IGludCBkZXN0WyR7YX1dKSB7CiAgICAgICAgICAke259CiAgICAgICAgfQogICAgICAgIGA7ZltsXT1uZXcgby5HbHNsTGliUm91dGluZShlKX1yZXR1cm4gZn1jb3B5VmVjKCl7Y29uc3QgYT10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dC5zaGFwZS5sZW5ndGg7bGV0IHA9IiI7Zm9yKGxldCBkPTA7ZDxhOysrZClwKz1gCiAgICAgICAgZGVzdFske2R9XSA9IHNyY1ske2R9XTsKICAgICAgICBgO2NvbnN0IGY9YAogICAgICB2b2lkIGNvcHlWZWMoaW50IHNyY1ske2F9XSwgb3V0IGludCBkZXN0WyR7YX1dKSB7CiAgICAgICAgJHtwfQogICAgICB9CiAgICAgIGA7cmV0dXJue2NvcHlWZWM6bmV3IG8uR2xzbExpYlJvdXRpbmUoZil9fXNldFZlY0l0ZW0oKXtjb25zdCBhPXRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0LnNoYXBlLmxlbmd0aDtsZXQgcD1gCiAgICAgICAgaWYoaW5kZXggPCAwKQogICAgICAgICAgICBpbmRleCA9JHthfSArIGluZGV4OwogICAgICAgIGlmIChpbmRleCA9PSAwKQogICAgICAgICAgICBtWzBdID0gdmFsdWU7CiAgICAgICAgYDtmb3IobGV0IGQ9MTtkPGEtMTsrK2QpcCs9YAogICAgICAgIGVsc2UgaWYgKGluZGV4ID09ICR7ZH0pCiAgICAgICAgICAgIG1bJHtkfV0gPSB2YWx1ZTsKICAgICAgICAgICAgYDtwKz1gCiAgICAgICAgZWxzZQogICAgICAgICAgICBtWyR7YS0xfV0gPSB2YWx1ZTsKICAgICAgICBgO2NvbnN0IGY9YAogICAgICB2b2lkIHNldFZlY0l0ZW0ob3V0IGludCBtWyR7YX1dLCBpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgICAgICR7cH0KICAgICAgfQogICAgICAgIGA7cmV0dXJue3NldFZlY0l0ZW06bmV3IG8uR2xzbExpYlJvdXRpbmUoZil9fWdldFZlY0l0ZW0oKXtjb25zdCBhPXRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0LnNoYXBlLmxlbmd0aDtsZXQgcD1gCiAgICAgICAgaWYoaW5kZXggPCAwKQogICAgICAgICAgICBpbmRleCA9ICR7YX0gKyBpbmRleDsKICAgICAgICBpZiAoaW5kZXggPT0gMCkKICAgICAgICAgICAgcmV0dXJuIG1bMF07CiAgICAgIGA7Zm9yKGxldCBkPTE7ZDxhLTE7KytkKXArPWAKICAgICAgICBlbHNlIGlmIChpbmRleCA9PSAke2R9KQogICAgICAgICAgICByZXR1cm4gbVske2R9XTsKICAgICAgYDtwKz1gCiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gbVske2EtMX1dOwogICAgICAgIGA7Y29uc3QgZj1gCiAgICAgIGludCBnZXRWZWNJdGVtKGludCBtWyR7YX1dLCBpbnQgaW5kZXgpIHsKICAgICAgICAke3B9CiAgICAgIH0KICAgIGA7cmV0dXJue2dldFZlY0l0ZW06bmV3IG8uR2xzbExpYlJvdXRpbmUoZil9fX10LlZlY0dsc2xMaWI9dX0sODMxNjooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuV2ViR0xJbmZlcmVuY2VIYW5kbGVyPXZvaWQgMDtjb25zdCBvPXIoNjIzMSksdT1yKDkxNjIpLGg9cigyNTE3KSxhPXIoMjQwMykscD1yKDcwMTkpLGY9cig4NzEwKSxkPXIoNTYxMSksbD1yKDQwNTcpLG49cigyMDM5KTt0LldlYkdMSW5mZXJlbmNlSGFuZGxlcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnNlc3Npb249ZSx0aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZT1uZXcgTWFwfWNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodChlLGkpe3JldHVybigwLGwuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KSh0aGlzLnNlc3Npb24ubGF5b3V0U3RyYXRlZ3ksZSxpKX1leGVjdXRlUHJvZ3JhbShlLGkpe2lmKGkubGVuZ3RoPGUuaW5wdXROYW1lcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBzaXplIG11c3RuJ3QgYmUgbGVzcyB0aGFuICR7ZS5pbnB1dE5hbWVzLmxlbmd0aH0uYCk7aWYoZS5pbnB1dE5hbWVzLmxlbmd0aCE9PWUuaW5wdXRUeXBlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJpbnB1dCBuYW1lcyBzaXplIGRvZXMgbm90IG1hdGNoIGlucHV0IHR5cGVzIik7Y29uc3Qgcz1bXTtmb3IobGV0IFQ9MDtUPGUuaW5wdXROYW1lcy5sZW5ndGg7KytUKXNbVF09dGhpcy5nZXRPckNyZWF0ZVRleHR1cmVEYXRhKGlbVF0sZS5pbnB1dFR5cGVzW1RdKTtjb25zdCBtPSgoVCx3KT0+e2NvbnN0IHg9dy5tYXAoUD0+YCR7UC51bnBhY2tlZFNoYXBlLmpvaW4oIiwiKX07JHtQLndpZHRofXgke1AuaGVpZ2h0fWApLmpvaW4oIl8iKTtsZXQgRT1ULm5hbWU7cmV0dXJuIFQuY2FjaGVIaW50JiYoRSs9IlsiK1QuY2FjaGVIaW50KyJdIiksRSs9IjoiK3gsRX0pKGUscyk7bGV0IGc9dGhpcy5zZXNzaW9uLnByb2dyYW1NYW5hZ2VyLmdldEFydGlmYWN0KG0pO2NvbnN0IF89Zz9nLnByb2dyYW1JbmZvOnR5cGVvZiBlLmdldD09ImZ1bmN0aW9uIj9lLmdldCgpOmUsYj0oMCxsLmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tVGV4dHVyZVR5cGUpKHRoaXMuc2Vzc2lvbi5sYXlvdXRTdHJhdGVneSxfLm91dHB1dC5kaW1zLF8ub3V0cHV0LnRleHR1cmVUeXBlKSx5PXRoaXMuY3JlYXRlVGV4dHVyZURhdGEoYixfLm91dHB1dC50eXBlKTtyZXR1cm4gZ3x8KGc9dGhpcy5zZXNzaW9uLnByb2dyYW1NYW5hZ2VyLmJ1aWxkKF8scyx5KSx0aGlzLnNlc3Npb24ucHJvZ3JhbU1hbmFnZXIuc2V0QXJ0aWZhY3QobSxnKSksdGhpcy5ydW5Qcm9ncmFtKGcscyx5KSx5fXJ1bihlLGkpe3JldHVybiB0aGlzLmV4ZWN1dGVQcm9ncmFtKGUsaSkudGVuc29yfXJ1blByb2dyYW0oZSxpLHMpe2ZvcihsZXQgbT0wO208aS5sZW5ndGg7KyttKWlmKCEhaVttXS5pc1BhY2tlZCE9KGUucHJvZ3JhbUluZm8uaW5wdXRUeXBlc1ttXT09PW4uVGV4dHVyZVR5cGUucGFja2VkKSl0aHJvdyBuZXcgRXJyb3IoYGlucHV0WyR7bX1dIHByb3BlcnR5IHBhY2tlZCBpbmNvbnNpc3RlbnRgKTtpZighIXMuaXNQYWNrZWQhPShlLnByb2dyYW1JbmZvLm91dHB1dC50ZXh0dXJlVHlwZT09PW4uVGV4dHVyZVR5cGUucGFja2VkKSl0aHJvdyBuZXcgRXJyb3IoIm91dHB1dCBwcm9wZXJ0eSBwYWNrZWQgaW5jb25zaXN0ZW50Iik7dGhpcy5zZXNzaW9uLnByb2dyYW1NYW5hZ2VyLnJ1bihlLGkscyl9Z2V0T3JDcmVhdGVUZXh0dXJlRGF0YShlLGkpe2xldCBzPXRoaXMuZ2V0VGV4dHVyZURhdGEoZS5kYXRhSWQsaT09PW4uVGV4dHVyZVR5cGUucGFja2VkKTtpZighcyYmKHM9dGhpcy5nZXRUZXh0dXJlRGF0YShlLmRhdGFJZCxpIT09bi5UZXh0dXJlVHlwZS5wYWNrZWQpLHMpKXJldHVybiBpPT09bi5UZXh0dXJlVHlwZS5wYWNrZWQ/dGhpcy5wYWNrKHMpOnRoaXMudW5wYWNrKHMpO2lmKCFzKXtjb25zdCBtPSgwLGwuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZSkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGUuZGltcyxpKTtpZihpPT09bi5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKXtjb25zdCBiPWUuZGltcztpZihiLmxlbmd0aD09PTQpe2NvbnN0IHk9W2JbMF0sTWF0aC5jZWlsKGJbMV0qYlsyXSpiWzNdLzQpXSxUPSgwLGwuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZSkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LHksaSk7bGV0IHc9ZS5udW1iZXJEYXRhO2lmKGJbMV0qYlsyXSpiWzNdJTQhPTApe2NvbnN0IHg9YlswXSxFPWJbMV0qYlsyXSpiWzNdLFA9TWF0aC5jZWlsKEUqMS80KSo0O3c9bmV3IEZsb2F0MzJBcnJheSh4KlApO2ZvcihsZXQgdj0wO3Y8eDsrK3Ype2NvbnN0IE09dipFLCQ9dipQK3YlMSpFO3cuc2V0KGUubnVtYmVyRGF0YS5zdWJhcnJheShNLE0rRSksJCl9fXJldHVybiB0aGlzLmNyZWF0ZVRleHR1cmVEYXRhKFQsZS50eXBlLHcsZSwxKX19aWYoaT09PW4uVGV4dHVyZVR5cGUucGFja2VkKXtjb25zdCBnPSgwLGwuY3JlYXRlVGV4dHVyZUxheW91dEZyb21TaGFwZSkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGUuZGltcywxLFtdLHtyZXZlcnNlV0g6ITB9KSxfPXRoaXMuY3JlYXRlVGV4dHVyZURhdGEoZyxlLnR5cGUsZS5udW1iZXJEYXRhLGUsMSk7cz10aGlzLnBhY2soXyl9ZWxzZSBzPXRoaXMuY3JlYXRlVGV4dHVyZURhdGEobSxlLnR5cGUsZS5udW1iZXJEYXRhLGUsMSl9cmV0dXJuIHN9Y3JlYXRlVGV4dHVyZURhdGFGcm9tTGF5b3V0QmluZFRlbnNvcihlLGkscyxtKXtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YShlLGkscyxtLDEpfWNyZWF0ZVRleHR1cmVEYXRhKGUsaSxzLG0sZyl7by5Mb2dnZXIudmVyYm9zZSgiSW5mZXJlbmNlSGFuZGxlciIsYENyZWF0aW5nIFRleHR1cmVEYXRhOiBsYXlvdXQ6WyR7SlNPTi5zdHJpbmdpZnkoZSl9XWApO2NvbnN0IF89dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLmNyZWF0ZVRleHR1cmVGcm9tTGF5b3V0KGksZSxzLGcpO3JldHVybiB0aGlzLmNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUoZSxpLF8sbSl9cmVzaGFwZVVucGFja2VkKGUsaSl7Y29uc3Qgcz10aGlzLmdldE9yQ3JlYXRlVGV4dHVyZURhdGEoZSxuLlRleHR1cmVUeXBlLnVucGFja2VkKSxtPXtjaGFubmVsczpzLmNoYW5uZWxzLGhlaWdodDpzLmhlaWdodCx3aWR0aDpzLndpZHRoLHNoYXBlOmkubGVuZ3RoIT09MD9pOlsxXSxzdHJpZGVzOmguU2hhcGVVdGlsLmNvbXB1dGVTdHJpZGVzKGkpLHVucGFja2VkU2hhcGU6aX07cmV0dXJuIHRoaXMuY3JlYXRlVGV4dHVyZURhdGFGcm9tVGV4dHVyZShtLGUudHlwZSxzLnRleHR1cmUpLnRlbnNvcn1yZXNoYXBlUGFja2VkKGUsaSl7Y29uc3Qgcz10aGlzLmdldE9yQ3JlYXRlVGV4dHVyZURhdGEoZSxuLlRleHR1cmVUeXBlLnBhY2tlZCk7aWYoKDAscC5pc1Jlc2hhcGVDaGVhcCkoZS5kaW1zLGkpKXtjb25zdCB5PXtjaGFubmVsczpzLmNoYW5uZWxzLGhlaWdodDpzLmhlaWdodCx3aWR0aDpzLndpZHRoLHNoYXBlOmkubGVuZ3RoIT09MD9pOlsxXSxzdHJpZGVzOmguU2hhcGVVdGlsLmNvbXB1dGVTdHJpZGVzKGkpLHVucGFja2VkU2hhcGU6aSxpc1BhY2tlZDohMH07cmV0dXJuIHRoaXMuY3JlYXRlVGV4dHVyZURhdGFGcm9tVGV4dHVyZSh5LGUudHlwZSxzLnRleHR1cmUpLnRlbnNvcn1jb25zdCBtPSgwLHAucHJvY2Vzc0RpbXMzRCkoZS5kaW1zKSxnPSgwLHAucHJvY2Vzc0RpbXMzRCkoaSksXz10aGlzLnJlc2hhcGVQYWNrZWQoZSxtKSxiPXRoaXMucnVuKCgwLHAuY3JlYXRlUGFja2VkUmVzaGFwZTNEUHJvZ3JhbUluZm9Mb2FkZXIpKHRoaXMsXyxnKSxbX10pO3JldHVybiB0aGlzLnJlc2hhcGVQYWNrZWQoYixpKX1jYXN0KGUsaSl7Y29uc3Qgcz10aGlzLmdldE9yQ3JlYXRlVGV4dHVyZURhdGEoZSxuLlRleHR1cmVUeXBlLnVucGFja2VkKTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YUZyb21UZXh0dXJlKHMsaSxzLnRleHR1cmUpLnRlbnNvcn1jcmVhdGVUZXh0dXJlRGF0YUZyb21UZXh0dXJlKGUsaSxzLG0sZyl7Y29uc3QgXz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse3RlbnNvcjptfHxuZXcgdS5UZW5zb3IoZS51bnBhY2tlZFNoYXBlLGksYj0+dGhpcy5yZWFkVGV4dHVyZShfKSxhc3luYyBiPT50aGlzLnJlYWRUZXh0dXJlQXN5bmMoXyksdm9pZCAwLGcpLHRleHR1cmU6c30pO3JldHVybiB0aGlzLnNldFRleHR1cmVEYXRhKF8udGVuc29yLmRhdGFJZCxfLGUuaXNQYWNrZWQpLF99Z2V0VGV4dHVyZURhdGEoZSxpPSExKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIoZSk/dGhpcy5zZXNzaW9uLmdldFRleHR1cmVEYXRhKGUsaSk6aT90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUuZ2V0KGUpOnRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmdldChlKX1zZXRUZXh0dXJlRGF0YShlLGkscz0hMSl7dGhpcy5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIoZSk/dGhpcy5zZXNzaW9uLnNldFRleHR1cmVEYXRhKGUsaSxzKToocz90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU6dGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUpLnNldChlLGkpfWlzVGV4dHVyZUxheW91dENhY2hlZChlLGk9ITEpe3JldHVybiEhdGhpcy5nZXRUZXh0dXJlRGF0YShlLmRhdGFJZCxpKX1kaXNwb3NlKCl7dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLmNsZWFyQWN0aXZlVGV4dHVyZXMoKSx0aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUuZm9yRWFjaChlPT50aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUoZSkpLHRoaXMucGFja2VkVGV4dHVyZURhdGFDYWNoZT1uZXcgTWFwLHRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmZvckVhY2goZT0+dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLnJlbGVhc2VUZXh0dXJlKGUpKSx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZT1uZXcgTWFwfXJlYWRUZXh0dXJlKGUpe3JldHVybiBlLmlzUGFja2VkP3RoaXMucmVhZFRleHR1cmUodGhpcy51bnBhY2soZSkpOnRoaXMuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC5pc0Zsb2F0MzJEb3dubG9hZFN1cHBvcnRlZD90aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVhZFRleHR1cmUoZSxlLnRlbnNvci50eXBlLGUuY2hhbm5lbHMpOnRoaXMuc2Vzc2lvbi50ZXh0dXJlTWFuYWdlci5yZWFkVWludDhUZXh0dXJlQXNGbG9hdCgoMCxmLmVuY29kZUFzVWludDgpKHRoaXMsZSkpfWFzeW5jIHJlYWRUZXh0dXJlQXN5bmMoZSl7cmV0dXJuIGUuaXNQYWNrZWQ/dGhpcy5yZWFkVGV4dHVyZUFzeW5jKHRoaXMudW5wYWNrKGUpKTp0aGlzLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQuaXNGbG9hdDMyRG93bmxvYWRTdXBwb3J0ZWQ/dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLnJlYWRUZXh0dXJlQXN5bmMoZSxlLnRlbnNvci50eXBlLGUuY2hhbm5lbHMpOnRoaXMuc2Vzc2lvbi50ZXh0dXJlTWFuYWdlci5yZWFkVWludDhUZXh0dXJlQXNGbG9hdCgoMCxmLmVuY29kZUFzVWludDgpKHRoaXMsZSkpfXBhY2soZSl7cmV0dXJuIHRoaXMuZXhlY3V0ZVByb2dyYW0oKDAsYS5jcmVhdGVQYWNrUHJvZ3JhbUluZm9Mb2FkZXIpKHRoaXMsZS50ZW5zb3IpLFtlLnRlbnNvcl0pfXVucGFjayhlKXtyZXR1cm4gdGhpcy5leGVjdXRlUHJvZ3JhbSgoMCxkLmNyZWF0ZVVucGFja1Byb2dyYW1JbmZvTG9hZGVyKSh0aGlzLGUudGVuc29yKSxbZS50ZW5zb3JdKX19fSwxNjQwOmZ1bmN0aW9uKGMsdCxyKXt2YXIgbz10aGlzJiZ0aGlzLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oRyxlZSxKLGxlKXtsZT09PXZvaWQgMCYmKGxlPUopO3ZhciB4ZT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGVlLEopO3hlJiYhKCJnZXQiaW4geGU/IWVlLl9fZXNNb2R1bGU6eGUud3JpdGFibGV8fHhlLmNvbmZpZ3VyYWJsZSl8fCh4ZT17ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZWVbSl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEcsbGUseGUpfTpmdW5jdGlvbihHLGVlLEosbGUpe2xlPT09dm9pZCAwJiYobGU9SiksR1tsZV09ZWVbSl19KSx1PXRoaXMmJnRoaXMuX19zZXRNb2R1bGVEZWZhdWx0fHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihHLGVlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoRywiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6ZWV9KX06ZnVuY3Rpb24oRyxlZSl7Ry5kZWZhdWx0PWVlfSksaD10aGlzJiZ0aGlzLl9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24oRyl7aWYoRyYmRy5fX2VzTW9kdWxlKXJldHVybiBHO3ZhciBlZT17fTtpZihHIT1udWxsKWZvcih2YXIgSiBpbiBHKUohPT0iZGVmYXVsdCImJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHLEopJiZvKGVlLEcsSik7cmV0dXJuIHUoZWUsRyksZWV9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LldFQkdMX09QX1JFU09MVkVfUlVMRVM9dm9pZCAwO2NvbnN0IGE9cigyODk4KSxwPWgocig3ODM5KSksZj1yKDQxOTYpLGQ9cigyMDY5KSxsPXIoODEzOCksbj1yKDk2NjMpLGU9cig1MTkzKSxpPXIoNzk5Mikscz1yKDEyNTMpLG09cig0Nzc2KSxnPXIoNjU3MiksXz1yKDMzNDYpLGI9cig1NjIzKSx5PXIoMjg3MCksVD1yKDIxNDMpLHc9cig0OTM5KSx4PXIoNzE4KSxFPXIoMjI2OCksUD1yKDgxMTcpLHY9cigyMjc4KSxNPXIoNTUyNCksJD1yKDU5NzUpLHo9cigzOTMzKSxCPXIoNjU1OCksTj1yKDU3MjMpLEQ9cigzNzM4KSxJPWgocig0OTA5KSksRj1yKDg0MjgpLFg9cig5NzkzKTt0LldFQkdMX09QX1JFU09MVkVfUlVMRVM9W1siQWJzIiwiIiwiNisiLEkuYWJzXSxbIkFjb3MiLCIiLCI3KyIsSS5hY29zXSxbIkFkZCIsIiIsIjcrIixwLmFkZF0sWyJBbmQiLCIiLCI3KyIscC5hbmRdLFsiQXNpbiIsIiIsIjcrIixJLmFzaW5dLFsiQXRhbiIsIiIsIjcrIixJLmF0YW5dLFsiQXZlcmFnZVBvb2wiLCIiLCI3KyIsVC5hdmVyYWdlUG9vbCxULnBhcnNlQXZlcmFnZVBvb2xBdHRyaWJ1dGVzXSxbIkJhdGNoTm9ybWFsaXphdGlvbiIsIiIsIjcrIixhLmJhdGNoTm9ybWFsaXphdGlvbixhLnBhcnNlQmF0Y2hOb3JtYWxpemF0aW9uQXR0cmlidXRlc10sWyJDYXN0IiwiIiwiNisiLGYuY2FzdCxmLnBhcnNlQ2FzdEF0dHJpYnV0ZXNdLFsiQ2VpbCIsIiIsIjYrIixJLmNlaWxdLFsiQ2xpcCIsIiIsIjYtMTAiLEkuY2xpcCxJLnBhcnNlQ2xpcEF0dHJpYnV0ZXNdLFsiQ2xpcCIsIiIsIjExKyIsSS5jbGlwVjExXSxbIkNvbmNhdCIsIiIsIjQrIixkLmNvbmNhdCxkLnBhcnNlQ29uY2F0QXR0cmlidXRlc10sWyJDb252IiwiIiwiMSsiLGwuY29udixsLnBhcnNlQ29udkF0dHJpYnV0ZXNdLFsiQ29udlRyYW5zcG9zZSIsIiIsIjErIixuLmNvbnZUcmFuc3Bvc2Usbi5wYXJzZUNvbnZUcmFuc3Bvc2VBdHRyaWJ1dGVzXSxbIkNvcyIsIiIsIjcrIixJLmNvc10sWyJEaXYiLCIiLCI3KyIscC5kaXZdLFsiRHJvcG91dCIsIiIsIjcrIixJLmlkZW50aXR5XSxbIkRlcHRoVG9TcGFjZSIsIiIsIjErIixlLmRlcHRoVG9TcGFjZSxlLnBhcnNlRGVwdGhUb1NwYWNlQXR0cmlidXRlc10sWyJFcXVhbCIsIiIsIjcrIixwLmVxdWFsXSxbIkVsdSIsIiIsIjYrIixJLmVsdSxJLnBhcnNlRWx1QXR0cmlidXRlc10sWyJFeHAiLCIiLCI2KyIsSS5leHBdLFsiRmxhdHRlbiIsIiIsIjErIixpLmZsYXR0ZW4saS5wYXJzZUZsYXR0ZW5BdHRyaWJ1dGVzXSxbIkZsb29yIiwiIiwiNisiLEkuZmxvb3JdLFsiRnVzZWRDb252IiwiY29tLm1pY3Jvc29mdCIsIjErIixsLmNvbnYsbC5wYXJzZUNvbnZBdHRyaWJ1dGVzXSxbIkdhdGhlciIsIiIsIjErIixzLmdhdGhlcixzLnBhcnNlR2F0aGVyQXR0cmlidXRlc10sWyJHZW1tIiwiIiwiNy0xMCIsbS5nZW1tLG0ucGFyc2VHZW1tQXR0cmlidXRlc1Y3XSxbIkdlbW0iLCIiLCIxMSsiLG0uZ2VtbSxtLnBhcnNlR2VtbUF0dHJpYnV0ZXNWMTFdLFsiR2xvYmFsQXZlcmFnZVBvb2wiLCIiLCIxKyIsVC5nbG9iYWxBdmVyYWdlUG9vbCxULnBhcnNlR2xvYmFsQXZlcmFnZVBvb2xBdHRyaWJ1dGVzXSxbIkdsb2JhbE1heFBvb2wiLCIiLCIxKyIsVC5nbG9iYWxNYXhQb29sXSxbIkdyZWF0ZXIiLCIiLCI3KyIscC5ncmVhdGVyXSxbIklkZW50aXR5IiwiIiwiMSsiLEkuaWRlbnRpdHldLFsiSW1hZ2VTY2FsZXIiLCIiLCIxKyIsZy5pbWFnZVNjYWxlcixnLnBhcnNlSW1hZ2VTY2FsZXJBdHRyaWJ1dGVzXSxbIkluc3RhbmNlTm9ybWFsaXphdGlvbiIsIiIsIjYrIixfLmluc3RhbmNlTm9ybWFsaXphdGlvbixfLnBhcnNlSW5zdGFuY2VOb3JtYWxpemF0aW9uQXR0cmlidXRlc10sWyJMZWFreVJlbHUiLCIiLCI2KyIsSS5sZWFreVJlbHUsSS5wYXJzZUxlYWt5UmVsdUF0dHJpYnV0ZXNdLFsiTGVzcyIsIiIsIjcrIixwLmxlc3NdLFsiTG9nIiwiIiwiNisiLEkubG9nXSxbIk1hdE11bCIsIiIsIjErIixiLm1hdE11bCxiLnBhcnNlTWF0TXVsQXR0cmlidXRlc10sWyJNYXhQb29sIiwiIiwiMSsiLFQubWF4UG9vbCxULnBhcnNlTWF4UG9vbEF0dHJpYnV0ZXNdLFsiTXVsIiwiIiwiNysiLHAubXVsXSxbIk5lZyIsIiIsIjYrIixJLm5lZ10sWyJOb3QiLCIiLCIxKyIsSS5ub3RdLFsiT3IiLCIiLCI3KyIscC5vcl0sWyJQYWQiLCIiLCIyLTEwIix5LnBhZFYyLHkucGFyc2VQYWRBdHRyaWJ1dGVzVjJdLFsiUGFkIiwiIiwiMTErIix5LnBhZFYxMSx5LnBhcnNlUGFkQXR0cmlidXRlc1YxMV0sWyJQb3ciLCIiLCI3KyIscC5wb3ddLFsiUFJlbHUiLCIiLCI3KyIscC5wUmVsdV0sWyJSZWR1Y2VMb2dTdW0iLCIiLCIxKyIsdy5yZWR1Y2VMb2dTdW0sdy5wYXJzZVJlZHVjZUF0dHJpYnV0ZXNdLFsiUmVkdWNlTWF4IiwiIiwiMSsiLHcucmVkdWNlTWF4LHcucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZU1lYW4iLCIiLCIxKyIsdy5yZWR1Y2VNZWFuLHcucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZU1pbiIsIiIsIjErIix3LnJlZHVjZU1pbix3LnBhcnNlUmVkdWNlQXR0cmlidXRlc10sWyJSZWR1Y2VQcm9kIiwiIiwiMSsiLHcucmVkdWNlUHJvZCx3LnBhcnNlUmVkdWNlQXR0cmlidXRlc10sWyJSZWR1Y2VTdW0iLCIiLCIxLTEyIix3LnJlZHVjZVN1bSx3LnBhcnNlUmVkdWNlQXR0cmlidXRlc10sWyJSZWR1Y2VTdW1TcXVhcmUiLCIiLCIxKyIsdy5yZWR1Y2VMb2dTdW1TcXVhcmUsdy5wYXJzZVJlZHVjZUF0dHJpYnV0ZXNdLFsiUmVsdSIsIiIsIjYrIixJLnJlbHVdLFsiUmVzaGFwZSIsIiIsIjUrIix4LnJlc2hhcGVdLFsiUmVzaXplIiwiIiwiMTAiLEUucmVzaXplLEUucGFyc2VSZXNpemVBdHRyaWJ1dGVzVjEwXSxbIlJlc2l6ZSIsIiIsIjExKyIsRS5yZXNpemUsRS5wYXJzZVJlc2l6ZUF0dHJpYnV0ZXNWMTFdLFsiU2hhcGUiLCIiLCIxKyIsUC5zaGFwZV0sWyJTaWdtb2lkIiwiIiwiNisiLEkuc2lnbW9pZF0sWyJTaW4iLCIiLCI3KyIsSS5zaW5dLFsiU2xpY2UiLCIiLCIxMCsiLHYuc2xpY2VWMTBdLFsiU2xpY2UiLCIiLCIxLTkiLHYuc2xpY2Usdi5wYXJzZVNsaWNlQXR0cmlidXRlc10sWyJTb2Z0bWF4IiwiIiwiMS0xMiIsTS5zb2Z0bWF4LE0ucGFyc2VTb2Z0bWF4QXR0cmlidXRlc10sWyJTb2Z0bWF4IiwiIiwiMTMrIixNLnNvZnRtYXhWMTMsTS5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzVjEzXSxbIlNwbGl0IiwiIiwiMi0xMiIsJC5zcGxpdCwkLnBhcnNlU3BsaXRBdHRyaWJ1dGVzXSxbIlNxcnQiLCIiLCI2KyIsSS5zcXJ0XSxbIlNxdWVlemUiLCIiLCIxLTEyIix6LnNxdWVlemUsei5wYXJzZVNxdWVlemVBdHRyaWJ1dGVzXSxbIlNxdWVlemUiLCIiLCIxMysiLHouc3F1ZWV6ZVYxM10sWyJTdWIiLCIiLCI3KyIscC5zdWJdLFsiU3VtIiwiIiwiNisiLEIuc3VtXSxbIlRhbiIsIiIsIjcrIixJLnRhbl0sWyJUYW5oIiwiIiwiNisiLEkudGFuaF0sWyJUaWxlIiwiIiwiNisiLE4udGlsZV0sWyJUcmFuc3Bvc2UiLCIiLCIxKyIsRC50cmFuc3Bvc2UsRC5wYXJzZVRyYW5zcG9zZUF0dHJpYnV0ZXNdLFsiVXBzYW1wbGUiLCIiLCI3LTgiLFgudXBzYW1wbGUsWC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlc1Y3XSxbIlVwc2FtcGxlIiwiIiwiOSIsWC51cHNhbXBsZSxYLnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzVjldLFsiVW5zcXVlZXplIiwiIiwiMS0xMiIsRi51bnNxdWVlemUsRi5wYXJzZVVuc3F1ZWV6ZUF0dHJpYnV0ZXNdLFsiVW5zcXVlZXplIiwiIiwiMTMrIixGLnVuc3F1ZWV6ZVYxM10sWyJYb3IiLCIiLCI3KyIscC54b3JdXX0sMjg5ODooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VCYXRjaE5vcm1hbGl6YXRpb25BdHRyaWJ1dGVzPXQuYmF0Y2hOb3JtYWxpemF0aW9uPXZvaWQgMDtjb25zdCBvPXIoMjQ2KSx1PXIoNTA2MCksaD1yKDIwMzkpLGE9e25hbWU6IkJhdGNoTm9ybWFsaXphdGlvbiIsaW5wdXROYW1lczpbIkEiLCJTY2FsZSIsIkIiLCJNZWFuIiwiVmFyaWFuY2UiXSxpbnB1dFR5cGVzOltoLlRleHR1cmVUeXBlLnVucGFja2VkLGguVGV4dHVyZVR5cGUudW5wYWNrZWQsaC5UZXh0dXJlVHlwZS51bnBhY2tlZCxoLlRleHR1cmVUeXBlLnVucGFja2VkLGguVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LmJhdGNoTm9ybWFsaXphdGlvbj0oZCxsLG4pPT4oZihsKSxbZC5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtjYWNoZUhpbnQ6bi5jYWNoZUtleSxnZXQ6KCk9PnAoZCxsLG4pfSksbCldKSx0LnBhcnNlQmF0Y2hOb3JtYWxpemF0aW9uQXR0cmlidXRlcz1kPT57Y29uc3QgbD1kLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImVwc2lsb24iLDFlLTUpLG49ZC5hdHRyaWJ1dGVzLmdldEZsb2F0KCJtb21lbnR1bSIsLjkpLGU9ZC5hdHRyaWJ1dGVzLmdldEludCgic3BhdGlhbCIsMSk7cmV0dXJuKDAsby5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtlcHNpbG9uOmwsbW9tZW50dW06bixzcGF0aWFsOmV9KX07Y29uc3QgcD0oZCxsLG4pPT57Y29uc3QgZT0oMCx1LmdldEdsc2wpKGQuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSxpPWxbMF0uZGltcy5sZW5ndGgsW3MsbV09ZC5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQobFsxXS5kaW1zLGguVGV4dHVyZVR5cGUudW5wYWNrZWQpLGc9YAogIGZsb2F0IHByb2Nlc3MoaW50WyR7aX1dIGluZGljZXMpIHsKICAgIHZlYzIgcG9zaXRpb24gPSBvZmZzZXRUb0Nvb3JkcyhpbmRpY2VzWzFdLCAke3N9LCAke219KTsKICAgIGZsb2F0IHNjYWxlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ZS50ZXh0dXJlMkR9KFNjYWxlLCBwb3NpdGlvbikpOwogICAgZmxvYXQgbWVhbiA9IGdldENvbG9yQXNGbG9hdCgke2UudGV4dHVyZTJEfShNZWFuLCBwb3NpdGlvbikpOwogICAgZmxvYXQgdmFyaWFuY2UgPSBnZXRDb2xvckFzRmxvYXQoJHtlLnRleHR1cmUyRH0oVmFyaWFuY2UsIHBvc2l0aW9uKSk7CiAgICBmbG9hdCBiID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ZS50ZXh0dXJlMkR9KEIsIHBvc2l0aW9uKSk7CgogICAgcmV0dXJuIHNjYWxlICogKCAoX0EoaW5kaWNlcykgLSBtZWFuKSAvIHNxcnQodmFyaWFuY2UgKyBmbG9hdCgke24uZXBzaWxvbn0pKSApICsgYjsKICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtvdXRwdXQ6e2RpbXM6bFswXS5kaW1zLHR5cGU6bFswXS50eXBlLHRleHR1cmVUeXBlOmguVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpnfSl9LGY9ZD0+e2lmKCFkfHxkLmxlbmd0aCE9PTUpdGhyb3cgbmV3IEVycm9yKCJCYXRjaE5vcm1hbGl6YXRpb24gcmVxdWlyZXMgNSBpbnB1dHMuIik7Y29uc3QgbD1kWzBdLG49ZFsxXSxlPWRbMl0saT1kWzNdLHM9ZFs0XTtpZihsLmRpbXMubGVuZ3RoPDN8fG4uZGltcy5sZW5ndGghPT0xfHxlLmRpbXMubGVuZ3RoIT09MXx8aS5kaW1zLmxlbmd0aCE9PTF8fHMuZGltcy5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZihuLmRpbXNbMF0hPT1sLmRpbXNbMV18fGUuZGltc1swXSE9PWwuZGltc1sxXXx8aS5kaW1zWzBdIT09bC5kaW1zWzFdfHxzLmRpbXNbMF0hPT1sLmRpbXNbMV0pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0IHNoYXBlLiIpO2lmKGwudHlwZSE9PSJmbG9hdDMyIiYmbC50eXBlIT09ImZsb2F0NjQifHxuLnR5cGUhPT0iZmxvYXQzMiImJm4udHlwZSE9PSJmbG9hdDY0Inx8ZS50eXBlIT09ImZsb2F0MzIiJiZlLnR5cGUhPT0iZmxvYXQ2NCJ8fGkudHlwZSE9PSJmbG9hdDMyIiYmaS50eXBlIT09ImZsb2F0NjQifHxzLnR5cGUhPT0iZmxvYXQzMiImJnMudHlwZSE9PSJmbG9hdDY0Iil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5wdXQgdGVuc29yIHR5cGVzLiIpfX0sNzgzOTooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQueG9yPXQuc3ViPXQucFJlbHU9dC5wb3c9dC5vcj10Lm11bD10Lmxlc3M9dC5ncmVhdGVyPXQuZXF1YWw9dC5kaXY9dC5hbmQ9dC5hZGQ9dC5nbHNsUFJlbHU9dC5nbHNsUG93PXQuZ2xzbFhvcj10Lmdsc2xPcj10Lmdsc2xBbmQ9dC5nbHNsTGVzcz10Lmdsc2xHcmVhdGVyPXQuZ2xzbEVxdWFsPXQuZ2xzbFN1Yj10Lmdsc2xNdWw9dC5nbHNsRGl2PXQuZ2xzbEFkZD12b2lkIDA7Y29uc3Qgbz1yKDI1MTcpLHU9cig4NTIwKSxoPXIoNTA2MCksYT1yKDIwMzkpO2Z1bmN0aW9uIHAoKXtjb25zdCB3PSJhZGRfIjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHt3fShmbG9hdCBhLCBmbG9hdCBiKSB7CiAgICByZXR1cm4gYSArIGI7CiAgfQogIHZlYzQgJHt3fSh2ZWM0IHYxLCB2ZWM0IHYyKSB7CiAgICByZXR1cm4gdjEgKyB2MjsKICB9CiAgYCxuYW1lOncsdHlwZTp1LkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiBmKCl7Y29uc3Qgdz0iZGl2XyI7cmV0dXJue2JvZHk6YAogIGZsb2F0ICR7d30oZmxvYXQgYSwgZmxvYXQgYikgewogICAgcmV0dXJuIGEgLyBiOwogIH0KICB2ZWM0ICR7d30odmVjNCB2MSwgdmVjNCB2MikgewogICAgcmV0dXJuIHYxIC8gdjI7CiAgfQogIGAsbmFtZTp3LHR5cGU6dS5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gZCgpe2NvbnN0IHc9Im11bF8iO3JldHVybntib2R5OmAKICBmbG9hdCAke3d9KGZsb2F0IGEsIGZsb2F0IGIpIHsKICAgIHJldHVybiBhICogYjsKICB9CiAgdmVjNCAke3d9KHZlYzQgdjEsIHZlYzQgdjIpIHsKICAgIHJldHVybiB2MSAqIHYyOwogIH0KICBgLG5hbWU6dyx0eXBlOnUuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGwoKXtjb25zdCB3PSJzdWJfIjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHt3fShmbG9hdCBhLCBmbG9hdCBiKSB7CiAgICByZXR1cm4gYSAtIGI7CiAgfQogIHZlYzQgJHt3fSh2ZWM0IHYxLCB2ZWM0IHYyKSB7CiAgICByZXR1cm4gdjEgLSB2MjsKICB9CiAgYCxuYW1lOncsdHlwZTp1LkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiBuKCl7Y29uc3Qgdz0iZXF1YWxfIjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHt3fShmbG9hdCBhLCBmbG9hdCBiKSB7CiAgICByZXR1cm4gZmxvYXQoYSA9PSBiKTsKICB9CiAgdmVjNCAke3d9KHZlYzQgdjEsIHZlYzQgdjIpIHsKICAgIHJldHVybiB2ZWM0KGVxdWFsKHYxLCB2MikpOwogIH0KICBgLG5hbWU6dyx0eXBlOnUuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGUoKXtjb25zdCB3PSJncmVhdGVyXyI7cmV0dXJue2JvZHk6YAogIGZsb2F0ICR7d30oZmxvYXQgYSwgZmxvYXQgYikgewogICAgcmV0dXJuIGZsb2F0KGEgPiBiKTsKICB9CiAgdmVjNCAke3d9KHZlYzQgdjEsIHZlYzQgdjIpIHsKICAgIHJldHVybiB2ZWM0KCB2MS5yID4gdjIuciAsCiAgICAgIHYxLmcgPiB2Mi5nLAogICAgICB2MS5iID4gdjIuYiwKICAgICAgdjEuYSA+IHYyLmEgKTsKICB9CiAgYCxuYW1lOncsdHlwZTp1LkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiBpKCl7Y29uc3Qgdz0ibGVzc18iO3JldHVybntib2R5OmAKICBmbG9hdCAke3d9KGZsb2F0IGEsIGZsb2F0IGIpIHsKICAgIHJldHVybiBmbG9hdChhIDwgYik7CiAgfQogIHZlYzQgJHt3fSh2ZWM0IHYxLCB2ZWM0IHYyKSB7CiAgICByZXR1cm4gdmVjNCggdjEuciA8IHYyLnIgLAogICAgICAgICAgICAgICAgdjEuZyA8IHYyLmcsCiAgICAgICAgICAgICAgICB2MS5iIDwgdjIuYiwKICAgICAgICAgICAgICAgIHYxLmEgPCB2Mi5hICk7CiAgfQogIGAsbmFtZTp3LHR5cGU6dS5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gcygpe2NvbnN0IHc9ImFuZF8iO3JldHVybntib2R5OmAKICBmbG9hdCAke3d9KGZsb2F0IGEsIGZsb2F0IGIpIHsKICAgIHJldHVybiBmbG9hdCggYm9vbChhKSAmJiBib29sKGIpICk7CiAgfQogIHZlYzQgJHt3fSh2ZWM0IHYxLCB2ZWM0IHYyKSB7CiAgICBidmVjNCBiMSA9IGJ2ZWM0KHYxKTsKICAgIGJ2ZWM0IGIyID0gYnZlYzQodjIpOwogICAgcmV0dXJuIHZlYzQoIGIxLnIgJiYgYjIuciAsCiAgICAgICAgICAgICAgICBiMS5nICYmIGIyLmcsCiAgICAgICAgICAgICAgICBiMS5iICYmIGIyLmIsCiAgICAgICAgICAgICAgICBiMS5hICYmIGIyLmEgKTsKICB9CiAgYCxuYW1lOncsdHlwZTp1LkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiBtKCl7Y29uc3Qgdz0ib3JfIjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHt3fShmbG9hdCBhLCBmbG9hdCBiKSB7CiAgICByZXR1cm4gZmxvYXQoIGJvb2woYSkgfHwgYm9vbChiKSApOwogIH0KICB2ZWM0ICR7d30odmVjNCB2MSwgdmVjNCB2MikgewogICAgYnZlYzQgYjEgPSBidmVjNCh2MSk7CiAgICBidmVjNCBiMiA9IGJ2ZWM0KHYyKTsKICAgIHJldHVybiB2ZWM0KCBiMS5yIHx8IGIyLnIgLAogICAgICAgICAgICAgICAgYjEuZyB8fCBiMi5nLAogICAgICAgICAgICAgICAgYjEuYiB8fCBiMi5iLAogICAgICAgICAgICAgICAgYjEuYSB8fCBiMi5hICk7CiAgfQogIGAsbmFtZTp3LHR5cGU6dS5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gZygpe2NvbnN0IHc9Inhvcl8iO3JldHVybntib2R5OmAKICBmbG9hdCAke3d9KGZsb2F0IGEsIGZsb2F0IGIpIHsKICAgIHJldHVybiBmbG9hdCggYm9vbChhKSBeXiBib29sKGIpICk7CiAgfQogIHZlYzQgJHt3fSh2ZWM0IHYxLCB2ZWM0IHYyKSB7CiAgICBidmVjNCBiMSA9IGJ2ZWM0KHYxKTsKICAgIGJ2ZWM0IGIyID0gYnZlYzQodjIpOwogICAgcmV0dXJuIHZlYzQoIGIxLnIgXl4gYjIuciAsCiAgICAgICAgICAgICAgICBiMS5nIF5eIGIyLmcsCiAgICAgICAgICAgICAgICBiMS5iIF5eIGIyLmIsCiAgICAgICAgICAgICAgICBiMS5hIF5eIGIyLmEgKTsKICB9CiAgYCxuYW1lOncsdHlwZTp1LkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiBfKCl7cmV0dXJuIGZ1bmN0aW9uKHcpe2NvbnN0IHg9YCR7d31fYDtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHt4fShmbG9hdCBhLCBmbG9hdCBiKSB7CiAgICByZXR1cm4gJHt3fShhLCBiKTsKICB9CiAgdmVjNCAke3h9KHZlYzQgdjEsIHZlYzQgdjIpIHsKICAgIHJldHVybiAke3d9KHYxLCB2Mik7CiAgfQogIGAsbmFtZTp4LHR5cGU6dS5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19KCJwb3ciKX1mdW5jdGlvbiBiKCl7Y29uc3Qgdz0icHJlbHVfIjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHt3fShmbG9hdCBhLCBmbG9hdCBiKSB7CiAgICByZXR1cm4gYSA8IDAuMCA/IGEgKiBiOiBhOwogIH0KICB2ZWM0ICR7d30odmVjNCB2MSwgdmVjNCB2MikgewogICAgcmV0dXJuIHZlYzQoCiAgICAgIHYxLnIgPCAwLjAgPyB2MS5yICogdjIucjogdjEuciwKICAgICAgdjEuZyA8IDAuMCA/IHYxLmcgKiB2Mi5nOiB2MS5nLAogICAgICB2MS5iIDwgMC4wID8gdjEuYiAqIHYyLmI6IHYxLmIsCiAgICAgIHYxLmEgPCAwLjAgPyB2MS5hICogdjIuYTogdjEuYQogICAgICApOwogIH0KICBgLG5hbWU6dyx0eXBlOnUuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fXQuZ2xzbEFkZD1wLHQuZ2xzbERpdj1mLHQuZ2xzbE11bD1kLHQuZ2xzbFN1Yj1sLHQuZ2xzbEVxdWFsPW4sdC5nbHNsR3JlYXRlcj1lLHQuZ2xzbExlc3M9aSx0Lmdsc2xBbmQ9cyx0Lmdsc2xPcj1tLHQuZ2xzbFhvcj1nLHQuZ2xzbFBvdz1fLHQuZ2xzbFBSZWx1PWI7Y29uc3QgeT0odyx4LEUsUD14WzBdLnR5cGUsdik9Pntjb25zdCBNPXcuc2Vzc2lvbi5wYWNrP2EuVGV4dHVyZVR5cGUucGFja2VkOmEuVGV4dHVyZVR5cGUudW5wYWNrZWQ7cmV0dXJue25hbWU6RS5uYW1lLGlucHV0TmFtZXM6WyJBIiwiQiJdLGlucHV0VHlwZXM6W00sTV0sY2FjaGVIaW50OnYsZ2V0OigpPT5UKHcseCxFLFApfX0sVD0odyx4LEUsUD14WzBdLnR5cGUpPT57Y29uc3Qgdj13LnNlc3Npb24ucGFjaz9hLlRleHR1cmVUeXBlLnBhY2tlZDphLlRleHR1cmVUeXBlLnVucGFja2VkLE09IW8uU2hhcGVVdGlsLmFyZUVxdWFsKHhbMF0uZGltcyx4WzFdLmRpbXMpO2xldCAkPXhbMF0uZGltcztjb25zdCB6PXcuc2Vzc2lvbi5wYWNrO2lmKE0pe2NvbnN0IEQ9by5Ccm9hZGNhc3RVdGlsLmNhbGNTaGFwZSh4WzBdLmRpbXMseFsxXS5kaW1zLCExKTtpZighRCl0aHJvdyBuZXcgRXJyb3IoIkNhbid0IHBlcmZvcm0gYmluYXJ5IG9wIG9uIHRoZSBnaXZlbiB0ZW5zb3JzIik7JD1EO2NvbnN0IEk9JC5sZW5ndGgsRj14WzBdLmRpbXMubGVuZ3RoIT09MD94WzBdLmRpbXMubGVuZ3RoOjEsWD14WzFdLmRpbXMubGVuZ3RoIT09MD94WzFdLmRpbXMubGVuZ3RoOjEsRz14WzBdLmRpbXMubGVuZ3RoIT09MD8iYmNhc3RJbmRpY2VzX0EoaW5kaWNlcywgYWluZGljZXMpOyI6ImFpbmRpY2VzWzBdID0gMDsiLGVlPXhbMV0uZGltcy5sZW5ndGghPT0wPyJiY2FzdEluZGljZXNfQihpbmRpY2VzLCBiaW5kaWNlcyk7IjoiYmluZGljZXNbMF0gPSAwOyIsSj0oMCxoLmdldEdsc2wpKHcuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSxsZT16P2AKICAgICAgJHtFLmJvZHl9CiAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICB2ZWM0IGEgPSBnZXRBQXRPdXRDb29yZHMoKTsKICAgICAgICB2ZWM0IGIgPSBnZXRCQXRPdXRDb29yZHMoKTsKICAgICAgICB2ZWM0IHJlc3VsdCA9ICR7RS5uYW1lfShhLCBiKTsKICAgICAgICAke0oub3V0cHV0fSA9IHJlc3VsdDsKICAgICAgfWA6YAogICAgICAke0UuYm9keX0KICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske0l9XSkgewogICAgICAgIGludCBhaW5kaWNlc1ske0Z9XTsKICAgICAgICBpbnQgYmluZGljZXNbJHtYfV07CiAgICAgICAgJHtHfQogICAgICAgICR7ZWV9CiAgICAgICAgcmV0dXJuICR7RS5uYW1lfShfQShhaW5kaWNlcyksIF9CKGJpbmRpY2VzKSk7CiAgICAgIH1gO3JldHVybntuYW1lOkUubmFtZSxpbnB1dE5hbWVzOlsiQSIsIkIiXSxpbnB1dFR5cGVzOlt2LHZdLG91dHB1dDp7ZGltczokLHR5cGU6UCx0ZXh0dXJlVHlwZTp2fSxzaGFkZXJTb3VyY2U6bGUsaGFzTWFpbjp6fX1jb25zdCBCPSgwLGguZ2V0R2xzbCkody5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLE49YAogICAgJHtFLmJvZHl9CiAgICB2b2lkIG1haW4oKSB7CiAgICAgIHZlYzQgdjEgPSAke0IudGV4dHVyZTJEfShBLCBUZXhDb29yZHMpOwogICAgICB2ZWM0IHYyID0gJHtCLnRleHR1cmUyRH0oQiwgVGV4Q29vcmRzKTsKICAgICAgdmVjNCByZXN1bHQgPSAke0UubmFtZX0odjEsIHYyKTsKICAgICAgJHtCLm91dHB1dH0gPSByZXN1bHQ7CiAgICB9CiAgICBgO3JldHVybntuYW1lOkUubmFtZSxpbnB1dE5hbWVzOlsiQSIsIkIiXSxpbnB1dFR5cGVzOlt2LHZdLG91dHB1dDp7ZGltczp4WzBdLmRpbXMsdHlwZTpQLHRleHR1cmVUeXBlOnZ9LHNoYWRlclNvdXJjZTpOLGhhc01haW46ITB9fTt0LmFkZD0odyx4KT0+W3cucnVuKHkodyx4LHAoKSkseCldLHQuYW5kPSh3LHgpPT5bdy5ydW4oeSh3LHgscygpLCJib29sIikseCldLHQuZGl2PSh3LHgpPT5bdy5ydW4oeSh3LHgsZigpKSx4KV0sdC5lcXVhbD0odyx4KT0+W3cucnVuKHkodyx4LG4oKSwiYm9vbCIpLHgpXSx0LmdyZWF0ZXI9KHcseCk9Plt3LnJ1bih5KHcseCxlKCksImJvb2wiKSx4KV0sdC5sZXNzPSh3LHgpPT5bdy5ydW4oeSh3LHgsaSgpLCJib29sIikseCldLHQubXVsPSh3LHgpPT5bdy5ydW4oeSh3LHgsZCgpKSx4KV0sdC5vcj0odyx4KT0+W3cucnVuKHkodyx4LG0oKSwiYm9vbCIpLHgpXSx0LnBvdz0odyx4KT0+W3cucnVuKHkodyx4LF8oKSkseCldLHQucFJlbHU9KHcseCk9Plt3LnJ1bih5KHcseCxiKCkpLHgpXSx0LnN1Yj0odyx4KT0+W3cucnVuKHkodyx4LGwoKSkseCldLHQueG9yPSh3LHgpPT5bdy5ydW4oeSh3LHgsZygpLCJib29sIikseCldfSw0MTk2OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUNhc3RBdHRyaWJ1dGVzPXQuY2FzdD12b2lkIDA7Y29uc3Qgbz1yKDI1MTcpO3QuY2FzdD0oaCxhLHApPT4odShhKSxbaC5jYXN0KGFbMF0scCldKSx0LnBhcnNlQ2FzdEF0dHJpYnV0ZXM9aD0+by5Qcm90b1V0aWwudGVuc29yRGF0YVR5cGVGcm9tUHJvdG8oaC5hdHRyaWJ1dGVzLmdldEludCgidG8iKSk7Y29uc3QgdT1oPT57aWYoIWh8fGgubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIkNhc3QgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZihoWzBdLnR5cGU9PT0ic3RyaW5nIil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX19LDExNjM6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVBhY2tlZENvbmNhdFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCBvPXIoNTA2MCksdT1yKDIwMzkpLGg9cig5MzkwKSxhPXIoMjgyNyk7dC5jcmVhdGVQYWNrZWRDb25jYXRQcm9ncmFtSW5mb0xvYWRlcj0oZixkLGwpPT57Y29uc3Qgbj0oZT1kLmxlbmd0aCxpPWwuY2FjaGVLZXkse25hbWU6IkNvbmNhdCAocGFja2VkKSIsaW5wdXROYW1lczpBcnJheS5mcm9tKHtsZW5ndGg6ZX0sKHMsbSk9PmBYJHttfWApLGlucHV0VHlwZXM6QXJyYXkoZSkuZmlsbCh1LlRleHR1cmVUeXBlLnBhY2tlZCksY2FjaGVIaW50Oml9KTt2YXIgZSxpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbikse2dldDooKT0+KChzLG0sZyxfKT0+e2NvbnN0IGI9Z1swXS5kaW1zLnNsaWNlKCk7aWYoXz49Yi5sZW5ndGh8fF88LTEqYi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJheGlzIHNwZWNpZmllZCBmb3IgY29uY2F0IGRvZXNuJ3QgbWF0Y2ggaW5wdXQgZGltZW5zaW9uYWxpdHkiKTtfPDAmJihfPWIubGVuZ3RoK18pO2NvbnN0IHk9Yi5zbGljZSgwKTtmb3IobGV0IEc9MTtHPGcubGVuZ3RoO0crKyl7Y29uc3QgZWU9Z1tHXS5kaW1zLnNsaWNlKCk7Zm9yKGxldCBKPTA7SjxiLmxlbmd0aDtKKyspaWYoSj09PV8peVtfXSs9ZWVbSl07ZWxzZSBpZihiW0pdIT09ZWVbSl0pdGhyb3cgbmV3IEVycm9yKCJub24gY29uY2F0IGRpbWVuc2lvbnMgbXVzdCBtYXRjaCIpfWNvbnN0IFQ9eS5sZW5ndGgsdz0oMCxhLmdldENoYW5uZWxzKSgiY29vcmRzIixUKSx4PSgwLGguZ2V0Q29vcmRzRGF0YVR5cGUpKFQpLEU9KDAsYS51bnBhY2tGcm9tQ2hhbm5lbCkoKSxQPWcubWFwKEc9PkcuZGltcyksdj0oMCxoLmdldEdsQ2hhbm5lbHMpKFQpLE09bmV3IEFycmF5KFAubGVuZ3RoLTEpO01bMF09UFswXVtfXTtmb3IobGV0IEc9MTtHPE0ubGVuZ3RoO0crKylNW0ddPU1bRy0xXStQW0ddW19dO2NvbnN0ICQ9dltfXSx6PXYuc2xpY2UoLTIpLEI9di5qb2luKCk7bGV0IE49YGlmICgkeyR9IDwgJHtNWzBdfSkgewogICAgICAgIHJldHVybiBnZXRDaGFubmVsKAogICAgICAgICAgICBnZXRYMCgke0J9KSwgdmVjMigke3ouam9pbigpfSkpOwogICAgICAgIH1gO2ZvcihsZXQgRz0xO0c8TS5sZW5ndGg7RysrKXtjb25zdCBlZT1NW0ctMV07Tis9YAogICAgICAgICAgICBpZiAoJHskfSA8ICR7TVtHXX0gICYmICR7JH0gPj0gJHtNW0ctMV19KSB7CiAgICAgICAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoCiAgICAgICAgICAgICAgICBnZXRYJHtHfSgke3AodiwkLGVlKX0pLAogICAgICAgICAgICAgICAgdmVjMigke3AoeiwkLGVlKX0pKTsKICAgICAgICAgICAgfWB9Y29uc3QgRD1NLmxlbmd0aCxJPU1bTS5sZW5ndGgtMV07Tis9YAogICAgICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbCgKICAgICAgICAgICAgICBnZXRYJHtEfSgke3AodiwkLEkpfSksCiAgICAgICAgICAgICAgdmVjMigke3AoeiwkLEkpfSkpO2A7Y29uc3QgRj0oMCxvLmdldEdsc2wpKHMuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSxYPWAKICAgICAgICAgICR7RX0KICAgICAgICAgIGZsb2F0IGdldFZhbHVlKCR7di5tYXAoRz0+ImludCAiK0cpfSkgewogICAgICAgICAgICAke059CiAgICAgICAgICB9CgogICAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICAke3h9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpOwogICAgICAgICAgICBpbnQgbGFzdERpbSA9IGNvb3Jkcy4ke3ZbVC0xXX07CiAgICAgICAgICAgIGNvb3Jkcy4ke3ZbVC0xXX0gPSBjb29yZHMuJHt2W1QtMl19OwogICAgICAgICAgICBjb29yZHMuJHt2W1QtMl19ID0gbGFzdERpbTsKCiAgICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNChnZXRWYWx1ZSgke3d9KSwgMC4sIDAuLCAwLik7CgogICAgICAgICAgICAke3dbVC0xXX0gPSAke3dbVC0xXX0gKyAxOwogICAgICAgICAgICBpZiAoJHt3W1QtMV19IDwgJHt5W1QtMV19KSB7CiAgICAgICAgICAgICAgcmVzdWx0LmcgPSBnZXRWYWx1ZSgke3d9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHt3W1QtMl19ID0gJHt3W1QtMl19ICsgMTsKICAgICAgICAgICAgaWYgKCR7d1tULTJdfSA8ICR7eVtULTJdfSkgewogICAgICAgICAgICAgIHJlc3VsdC5hID0gZ2V0VmFsdWUoJHt3fSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR7d1tULTFdfSA9ICR7d1tULTFdfSAtIDE7CiAgICAgICAgICAgIGlmICgke3dbVC0yXX0gPCAke3lbVC0yXX0gJiYKICAgICAgICAgICAgICAgICR7d1tULTFdfSA8ICR7eVtULTFdfSkgewogICAgICAgICAgICAgIHJlc3VsdC5iID0gZ2V0VmFsdWUoJHt3fSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHtGLm91dHB1dH0gPSByZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG0pLHtvdXRwdXQ6e2RpbXM6eSx0eXBlOmdbMF0udHlwZSx0ZXh0dXJlVHlwZTp1LlRleHR1cmVUeXBlLnBhY2tlZH0sc2hhZGVyU291cmNlOlgsaGFzTWFpbjohMH0pfSkoZixuLGQsbC5heGlzKX0pfTtjb25zdCBwPShmLGQsbCk9Pntjb25zdCBuPWYuaW5kZXhPZihkKTtyZXR1cm4gZi5tYXAoKGUsaSk9Pmk9PT1uP2Ake2V9IC0gJHtsfWA6ZSkuam9pbigpfX0sMjA2OTooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VDb25jYXRBdHRyaWJ1dGVzPXQuY29uY2F0PXZvaWQgMDtjb25zdCBvPXIoMjQ2KSx1PXIoMjAzOSksaD1yKDExNjMpO3QuY29uY2F0PShlLGkscyk9PihuKGkpLGUuc2Vzc2lvbi5wYWNrJiZpWzBdLmRpbXMubGVuZ3RoPjE/W2UucnVuKCgwLGguY3JlYXRlUGFja2VkQ29uY2F0UHJvZ3JhbUluZm9Mb2FkZXIpKGUsaSxzKSxpKV06W2UucnVuKGEoZSxpLHMpLGkpXSk7Y29uc3QgYT0oZSxpLHMpPT57Y29uc3QgbT0oZz1pLmxlbmd0aCxfPXMuY2FjaGVLZXkse25hbWU6IkNvbmNhdCIsaW5wdXROYW1lczpBcnJheS5mcm9tKHtsZW5ndGg6Z30sKGIseSk9PmBYJHt5fWApLGlucHV0VHlwZXM6QXJyYXkoZykuZmlsbCh1LlRleHR1cmVUeXBlLnVucGFja2VkKSxjYWNoZUhpbnQ6X30pO3ZhciBnLF87cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxtKSx7Z2V0OigpPT4oKGIseSxULHcpPT57Y29uc3QgeD1UWzBdLmRpbXMuc2xpY2UoKTtpZih3Pj14Lmxlbmd0aHx8dzwtMSp4Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImF4aXMgc3BlY2lmaWVkIGZvciBjb25jYXQgZG9lc24ndCBtYXRjaCBpbnB1dCBkaW1lbnNpb25hbGl0eSIpO3c8MCYmKHc9eC5sZW5ndGgrdyk7Y29uc3QgRT14LnNsaWNlKDApO2ZvcihsZXQgQj0xO0I8VC5sZW5ndGg7QisrKXtjb25zdCBOPVRbQl0uZGltcy5zbGljZSgpO2ZvcihsZXQgRD0wO0Q8eC5sZW5ndGg7RCsrKWlmKEQ9PT13KUVbd10rPU5bRF07ZWxzZSBpZih4W0RdIT09TltEXSl0aHJvdyBuZXcgRXJyb3IoIm5vbiBjb25jYXQgZGltZW5zaW9ucyBtdXN0IG1hdGNoIil9Y29uc3QgUD1FLmxlbmd0aCx2PW5ldyBBcnJheShULmxlbmd0aCk7bGV0IE09MDtmb3IobGV0IEI9MDtCPHYubGVuZ3RoOysrQilNKz1UW0JdLmRpbXNbd10sdltCXT1NO2xldCAkPSIiOyQ9VC5sZW5ndGg8NT9wKHYpOmYodik7Y29uc3Qgej1gCiAgICAgICAgJHtkKFQubGVuZ3RoLFApfQogICAgICAgICR7bCh2KX0KICAgICAgICAkeyR9CiAgICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske1B9XSkgewogICAgICAgICAgaW50IHRleHR1cmVJbmRleCA9IGdldFRleHR1cmVXaGVyZURhdGFSZXNpZGVzIChpbmRpY2VzWyR7d31dKTsKCiAgICAgICAgICBpZih0ZXh0dXJlSW5kZXggIT0gMCkgewogICAgICAgICAgICBpbmRpY2VzWyR7d31dID0gaW5kaWNlc1ske3d9XSAtIGludChnZXRTaXplSW5Db25jYXRBeGlzVmFsdWVGcm9tSW5kZXgodGV4dHVyZUluZGV4LWludCgxKSkpOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiBmZXRjaERhdGFGcm9tQ29ycmVjdFRleHR1cmUodGV4dHVyZUluZGV4LCBpbmRpY2VzKTsKICAgICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHkpLHtvdXRwdXQ6e2RpbXM6RSx0eXBlOlRbMF0udHlwZSx0ZXh0dXJlVHlwZTp1LlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6en0pfSkoMCxtLGkscy5heGlzKX0pfSxwPWU9PmBpbnQgZ2V0VGV4dHVyZVdoZXJlRGF0YVJlc2lkZXMoaW50IGluZGV4KSB7CiAgICAgICR7ZS5tYXAoKGkscyk9PmBpZihpbmRleDwke2l9KSB7cmV0dXJuICR7c307fQpgKS5qb2luKCIiKX0KICAgIH1gLGY9ZT0+cChlKSxkPShlLGkpPT57Y29uc3Qgcz1bYGZsb2F0IGZldGNoRGF0YUZyb21Db3JyZWN0VGV4dHVyZShpbnQgdGV4dHVyZUluZGV4LCBpbnQgaW5kaWNlc1ske2l9XSkge2BdO2ZvcihsZXQgbT0wO208ZTsrK20pbT09PTA/cy5wdXNoKGAJaWYgKHRleHR1cmVJbmRleCA9PSAke219KSB7IHJldHVybiBfWCR7bX0oaW5kaWNlcyk7IH1gKTptPT09ZS0xP3MucHVzaChgCWVsc2UgeyByZXR1cm4gX1gke219KGluZGljZXMpOyB9YCk6cy5wdXNoKGAJZWxzZSBpZiAodGV4dHVyZUluZGV4ID09ICR7bX0pIHsgcmV0dXJuIF9YJHttfShpbmRpY2VzKTsgfWApO3JldHVybiBzLnB1c2goIgl9Iikscy5qb2luKGAKYCl9LGw9ZT0+e2NvbnN0IGk9WyJpbnQgZ2V0U2l6ZUluQ29uY2F0QXhpc1ZhbHVlRnJvbUluZGV4KGludCBpbmRleCkgeyJdO2ZvcihsZXQgcz0wO3M8ZS5sZW5ndGg7KytzKXM9PT0wP2kucHVzaChgCWlmIChpbmRleCA9PSAke3N9KSB7IHJldHVybiAke2Vbc119OyB9YCk6cz09PWUubGVuZ3RoLTE/aS5wdXNoKGAJZWxzZSB7IHJldHVybiAke2Vbc119OyB9YCk6aS5wdXNoKGAJZWxzZSBpZiAoaW5kZXggPT0gJHtzfSkgeyByZXR1cm4gJHtlW3NdfTsgfWApO3JldHVybiBpLnB1c2goIgl9IiksaS5qb2luKGAKYCl9O3QucGFyc2VDb25jYXRBdHRyaWJ1dGVzPWU9PigwLG8uY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7YXhpczplLmF0dHJpYnV0ZXMuZ2V0SW50KCJheGlzIil9KTtjb25zdCBuPWU9PntpZighZXx8ZS5sZW5ndGg8MSl0aHJvdyBuZXcgRXJyb3IoInRvbyBmZXcgaW5wdXRzIik7Y29uc3QgaT1lWzBdLnR5cGUscz1lWzBdLmRpbXMubGVuZ3RoO2lmKGk9PT0ic3RyaW5nIil0aHJvdyBuZXcgRXJyb3IoInN0cmluZyB0ZW5zb3IgaXMgbm90IHN1cHBvcnRlZCB5ZXQiKTtmb3IoY29uc3QgbSBvZiBlKXtpZihtLnR5cGUhPT1pKXRocm93IG5ldyBFcnJvcigiaW5wdXQgdGVuc29ycyBzaG91bGQgYmUgb25lIHR5cGUiKTtpZihtLmRpbXMubGVuZ3RoIT09cyl0aHJvdyBuZXcgRXJyb3IoImlucHV0IHRlbnNvcnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgc2hhcGUiKX19fSw0NzcwOihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVVbnBhY2tlZEdyb3VwZWRDb252UHJvZ3JhbUluZm9Mb2FkZXI9dm9pZCAwO2NvbnN0IG89cig2MjMxKSx1PXIoNTA2MCksaD1yKDIwMzkpLGE9cig4MTM4KSxwPXIoMjgyMyk7dC5jcmVhdGVVbnBhY2tlZEdyb3VwZWRDb252UHJvZ3JhbUluZm9Mb2FkZXI9KGYsZCxsKT0+e2NvbnN0IG49KGU9ZC5sZW5ndGg+MixpPWwuY2FjaGVLZXkse25hbWU6Ikdyb3VwZWRDb252IixpbnB1dE5hbWVzOmU/WyJYIiwiVyIsIkJpYXMiXTpbIlgiLCJXIl0saW5wdXRUeXBlczplP1toLlRleHR1cmVUeXBlLnVucGFja2VkLGguVGV4dHVyZVR5cGUudW5wYWNrZWQsaC5UZXh0dXJlVHlwZS51bnBhY2tlZF06W2guVGV4dHVyZVR5cGUudW5wYWNrZWQsaC5UZXh0dXJlVHlwZS51bnBhY2tlZF0sY2FjaGVIaW50Oml9KTt2YXIgZSxpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbikse2dldDooKT0+KChzLG0sZyxfKT0+e2NvbnN0IGI9bS5sZW5ndGg+Mj8idmFsdWUgKz0gZ2V0QmlhcyhvdXRwdXRfY2hhbm5lbCk7IjoiIix5PW1bMF0uZGltcy5zbGljZSgpLFQ9bVsxXS5kaW1zLnNsaWNlKCksdz1UWzBdL18uZ3JvdXA7by5Mb2dnZXIudmVyYm9zZSgiR3JvdXBlZENvbnYiLGBhdXRwUGFkOiR7Xy5hdXRvUGFkfSwgZGlsYXRpb25zOiR7Xy5kaWxhdGlvbnN9LCBncm91cDoke18uZ3JvdXB9LCBrZXJuZWxTaGFwZToke18ua2VybmVsU2hhcGV9LCBwYWRzOiR7Xy5wYWRzfSwgc3RyaWRlczoke18uc3RyaWRlc31gKTtjb25zdCB4PSgwLGEuY2FsY3VsYXRlT3V0cHV0U2hhcGUpKHksVCxfLmRpbGF0aW9ucyxfLnBhZHMsXy5zdHJpZGVzKSxFPSgwLHUuZ2V0R2xzbCkocy5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLHthY3RpdmF0aW9uRnVuY3Rpb246UCxhcHBseUFjdGl2YXRpb246dn09KDAscC5nZXRBY3RpdmF0aW9uU25pcHBldCkoXyksTT1gCiAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7Xy5zdHJpZGVzWzBdfSwgJHtfLnN0cmlkZXNbMV19KTsKICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtfLnBhZHNbMF19LCAke18ucGFkc1sxXX0pOwogICR7UH0KICB2b2lkIG1haW4oKSB7CiAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTsKICAgIGludCBiYXRjaCA9IGNvb3Jkcy54OwogICAgaW50IG91dHB1dF9jaGFubmVsID0gY29vcmRzLnk7CiAgICBpdmVjMiB4UkNDb3JuZXIgPSBjb29yZHMuencgKiBzdHJpZGVzIC0gcGFkczsKICAgIGludCBncm91cF9pZCA9IG91dHB1dF9jaGFubmVsIC8gJHt3fTsKCiAgICBmbG9hdCB2YWx1ZSA9IDAuMDsKICAgIGZvciAoaW50IHdJbkNoYW5uZWwgPSAwOyB3SW5DaGFubmVsIDwgJHtUWzFdfTsgd0luQ2hhbm5lbCsrKSB7CiAgICAgIGludCBpbnB1dF9jaGFubmVsID0gZ3JvdXBfaWQgKiAke1RbMV19ICsgd0luQ2hhbm5lbDsKICAgICAgZm9yIChpbnQgd0hlaWdodCA9IDA7IHdIZWlnaHQgPCAke1RbMl19OyB3SGVpZ2h0KyspIHsKICAgICAgICBpbnQgeEhlaWdodCA9IHhSQ0Nvcm5lci54ICsgd0hlaWdodCAqICR7Xy5kaWxhdGlvbnNbMF19OwoKICAgICAgICBpZiAoeEhlaWdodCA8IDAgfHwgeEhlaWdodCA+PSAke3lbMl19KSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGZvciAoaW50IHdXaWR0aCA9IDA7IHdXaWR0aCA8ICR7VFszXX07IHdXaWR0aCsrKSB7CiAgICAgICAgICBpbnQgeFdpZHRoID0geFJDQ29ybmVyLnkgKyB3V2lkdGggKiAke18uZGlsYXRpb25zWzFdfTsKICAgICAgICAgIGlmICh4V2lkdGggPCAwIHx8IHhXaWR0aCA+PSAke3lbM119KSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQoKICAgICAgICAgIGZsb2F0IHhWYWwgPSBnZXRYKGJhdGNoLCBpbnB1dF9jaGFubmVsLCB4V2lkdGgsIHhIZWlnaHQpOwogICAgICAgICAgZmxvYXQgd1ZhbCA9IGdldFcob3V0cHV0X2NoYW5uZWwsIHdJbkNoYW5uZWwsIHdXaWR0aCwgd0hlaWdodCk7CiAgICAgICAgICB2YWx1ZSArPSB4VmFsKndWYWw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAke2J9CiAgICAke3Z9CiAgICAke0Uub3V0cHV0fSA9IHZlYzQodmFsdWUsIC4wLCAuMCwgLjApOwogIH0KYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGcpLHtvdXRwdXQ6e2RpbXM6eCx0eXBlOm1bMF0udHlwZSx0ZXh0dXJlVHlwZTpoLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6TSxoYXNNYWluOiEwfSl9KShmLGQsbixsKX0pfX0sMTM4NjooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY29udjJEUGFja2VkPXQuY29udjJEUGFja2VkUG9pbnR3aXNlPXZvaWQgMDtjb25zdCBvPXIoODEzOCksdT1yKDg1NTUpLGg9cig3MDgpO3QuY29udjJEUGFja2VkUG9pbnR3aXNlPShhLHAsZik9Pntjb25zdCBkPXBbMF0uZGltcyxsPXBbMV0uZGltcyxuPSgwLG8uY2FsY3VsYXRlT3V0cHV0U2hhcGUpKGQsbCxmLmRpbGF0aW9ucyxmLnBhZHMsZi5zdHJpZGVzKSxlPWEucmVzaGFwZVBhY2tlZChwWzBdLFtkWzFdLGRbMl0qZFszXV0pLGk9YS5yZXNoYXBlUGFja2VkKHBbMV0sW2xbMF0sbFsxXV0pLHM9cC5sZW5ndGg+Mj9baSxlLHBbMl1dOltpLGVdLG09YS5ydW4oKDAsaC5jcmVhdGVQYWNrZWRNYXRtdWxQcm9ncmFtSW5mb0xvYWRlcikoYSxzLGYpLHMpO3JldHVybiBhLnJlc2hhcGVQYWNrZWQobSxuKX0sdC5jb252MkRQYWNrZWQ9KGEscCxmKT0+e2NvbnN0IGQ9cFswXS5kaW1zLGw9cFsxXS5kaW1zLG49KDAsby5jYWxjdWxhdGVPdXRwdXRTaGFwZSkoZCxsLGYuZGlsYXRpb25zLGYucGFkcyxmLnN0cmlkZXMpLGU9YS5ydW4oKDAsdS5jcmVhdGVQYWNrZWRJbTJDb2xQcm9ncmFtSW5mb0xvYWRlcikoYSxwWzBdLHBbMV0sbixmKSxbcFswXV0pLGk9YS5yZXNoYXBlUGFja2VkKHBbMV0sW2xbMF0sbFsxXSpsWzJdKmxbM11dKSxzPXAubGVuZ3RoPT09Mz9baSxlLHBbMl1dOltpLGVdLG09YS5ydW4oKDAsaC5jcmVhdGVQYWNrZWRNYXRtdWxQcm9ncmFtSW5mb0xvYWRlcikoYSxzLGYpLHMpO3JldHVybiBhLnJlc2hhcGVQYWNrZWQobSxuKX19LDk2NjM6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlQ29udlRyYW5zcG9zZUF0dHJpYnV0ZXM9dC5jb252VHJhbnNwb3NlPXZvaWQgMDtjb25zdCBvPXIoMjQ2KSx1PXIoNTA2MCksaD1yKDIwMzkpLGE9cigyODIzKSxwPShpLHMsbSxnLF8sYik9PihpLTEpKnMrbSsoZy0xKSpfKzEtYixmPShpLHMsbSxnLF8pPT57Y29uc3QgYj1NYXRoLmZsb29yKGkvMik7cz09PSJTQU1FX1VQUEVSIj8obVtnXT1iLG1bX109aS1iKTpzPT09IlNBTUVfTE9XRVIiJiYobVtnXT1pLWIsbVtfXT1iKX07dC5jb252VHJhbnNwb3NlPShpLHMsbSk9PihlKHMsbSksZChpLHMsbSkpO2NvbnN0IGQ9KGkscyxtKT0+e2NvbnN0IGc9bihtLHMpO3JldHVybltsKGkscyxnKV19LGw9KGkscyxtKT0+aS5ydW4oKChnLF8sYik9Pntjb25zdCB5PShUPV8ubGVuZ3RoPjIsdz1iLmNhY2hlS2V5LHtuYW1lOiJDb252VHJhbnNwb3NlIixpbnB1dE5hbWVzOlQ/WyJYIiwiVyIsIkIiXTpbIlgiLCJXIl0saW5wdXRUeXBlczpUP1toLlRleHR1cmVUeXBlLnVucGFja2VkLGguVGV4dHVyZVR5cGUudW5wYWNrZWQsaC5UZXh0dXJlVHlwZS51bnBhY2tlZF06W2guVGV4dHVyZVR5cGUudW5wYWNrZWQsaC5UZXh0dXJlVHlwZS51bnBhY2tlZF0sY2FjaGVIaW50Ond9KTt2YXIgVCx3O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30seSkse2dldDooKT0+KCh4LEUsUCx2KT0+e2NvbnN0IE09RS5sZW5ndGg+Mj8iZ2V0QihvdXRwdXRfY2hhbm5lbCkiOiIwLjAiLCQ9RVswXS5kaW1zLHo9RVsxXS5kaW1zLEI9elsxXSxOPXpbMF0vdi5ncm91cCxEPVtFWzBdLmRpbXNbMF0sRVsxXS5kaW1zWzFdKnYuZ3JvdXAsLi4udi5vdXRwdXRTaGFwZV0sST0oMCx1LmdldEdsc2wpKHguc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOkYsYXBwbHlBY3RpdmF0aW9uOlh9PSgwLGEuZ2V0QWN0aXZhdGlvblNuaXBwZXQpKHYpLEc9YAogIGNvbnN0IGl2ZWMyIHN0cmlkZXMgPSBpdmVjMigke3Yuc3RyaWRlc1swXX0sICR7di5zdHJpZGVzWzFdfSk7CiAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7di5wYWRzWzBdfSwgJHt2LnBhZHNbMV19KTsKICAke0Z9CiAgdm9pZCBtYWluKCkgewogICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7CiAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDsKICAgIGludCBvdXRwdXRfY2hhbm5lbCA9IGNvb3Jkcy55OwoKICAgIGl2ZWMyIGxvYyA9IGNvb3Jkcy56dyArIHBhZHM7CgogICAgaW50IGdyb3VwX2lkID0gb3V0cHV0X2NoYW5uZWwgLyAke0J9OwogICAgaW50IHdPdXRDaGFubmVsID0gb3V0cHV0X2NoYW5uZWwgLSBncm91cF9pZCAqICR7Qn07CgogICAgZmxvYXQgdmFsdWUgPSAke019OwogICAgZm9yIChpbnQgaW5DaGFubmVsT2Zmc2V0ID0gMDsgaW5DaGFubmVsT2Zmc2V0IDwgJHtOfTsgaW5DaGFubmVsT2Zmc2V0KyspIHsKICAgICAgaW50IGlucHV0X2NoYW5uZWwgPSBncm91cF9pZCAqICR7Tn0gKyBpbkNoYW5uZWxPZmZzZXQ7CiAgICAgIGZvciAoaW50IHdXT2ZmID0gMDsgd1dPZmYgPCAke3pbMl19OyB3V09mZisrKSB7CiAgICAgICAgZm9yIChpbnQgd0hPZmYgPSAwOyB3SE9mZiA8ICR7elszXX07IHdIT2ZmKyspIHsKICAgICAgICAgIGl2ZWMyIHdPZmYgPSBpdmVjMih3V09mZiAqICR7di5kaWxhdGlvbnNbMF19LCB3SE9mZiAqICR7di5kaWxhdGlvbnNbMV19KTsKICAgICAgICAgIGl2ZWMyIHdMb2MgPSBsb2MgLSB3T2ZmOwogICAgICAgICAgaXZlYzIgd0xvY0luID0gd0xvYyAvIHN0cmlkZXM7CiAgICAgICAgICBpZiAoCiAgICAgICAgICAgIHdMb2NJbiAqIHN0cmlkZXMgPT0gd0xvYyAmJgogICAgICAgICAgICB3TG9jSW4ueCA+PSAwICYmIHdMb2NJbi54IDwgJHskWzJdfSAmJgogICAgICAgICAgICB3TG9jSW4ueSA+PSAwICYmIHdMb2NJbi55IDwgJHskWzNdfQogICAgICAgICAgKSB7CiAgICAgICAgICAgIGZsb2F0IHhWYWwgPSBnZXRYKGJhdGNoLCBpbnB1dF9jaGFubmVsLCB3TG9jSW4ueSwgd0xvY0luLngpOwogICAgICAgICAgICBmbG9hdCB3VmFsID0gZ2V0VyhpbnB1dF9jaGFubmVsLCB3T3V0Q2hhbm5lbCwgd0hPZmYsIHdXT2ZmKTsKICAgICAgICAgICAgdmFsdWUgKz0geFZhbCAqIHdWYWw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAke1h9CiAgICAke0kub3V0cHV0fSA9IHZlYzQodmFsdWUsIC4wLCAuMCwgLjApOwogIH0KYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LFApLHtvdXRwdXQ6e2RpbXM6RCx0eXBlOkVbMF0udHlwZSx0ZXh0dXJlVHlwZTpoLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6RyxoYXNNYWluOiEwfSl9KShnLF8seSxiKX0pfSkoaSxzLG0pLHMpLG49KGkscyk9Pntjb25zdCBtPWkua2VybmVsU2hhcGUuc2xpY2UoKTtpZihpLmtlcm5lbFNoYXBlLmxlbmd0aD09PTApZm9yKGxldCB5PTI7eTxzWzFdLmRpbXMubGVuZ3RoOysreSltLnB1c2goc1sxXS5kaW1zW3ldKTtjb25zdCBnPWkucGFkcy5zbGljZSgpLF89aS5vdXRwdXRTaGFwZS5zbGljZSgpOygoeSxULHcseCxFLFAsdixNKT0+e2NvbnN0ICQ9eS5sZW5ndGgtMix6PU0ubGVuZ3RoPT09MDtmb3IobGV0IEI9MDtCPCQ7KytCKXtjb25zdCBOPXo/eVtCKzJdKlBbQl06TVtCXSxEPXAoeVtCKzJdLFBbQl0sRVtCXSxUW0JdLHdbQl0sTik7ZihELHgsRSxCLEIrJCkseiYmTS5wdXNoKFBbQl0qKHlbQisyXS0xKSt2W0JdKyhUW0JdLTEpKndbQl0rMS1FW0JdLUVbQiskXSl9fSkoc1swXS5kaW1zLG0saS5kaWxhdGlvbnMsaS5hdXRvUGFkLGcsaS5zdHJpZGVzLGkub3V0cHV0UGFkZGluZyxfKTtjb25zdCBiPU9iamVjdC5hc3NpZ24oe30saSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oYix7a2VybmVsU2hhcGU6bSxwYWRzOmcsb3V0cHV0U2hhcGU6XyxjYWNoZUtleTppLmNhY2hlS2V5fSksYn07dC5wYXJzZUNvbnZUcmFuc3Bvc2VBdHRyaWJ1dGVzPWk9Pntjb25zdCBzPWkuYXR0cmlidXRlcyxtPSgwLGEucGFyc2VJbnRlcm5hbEFjdGl2YXRpb25BdHRyaWJ1dGVzKShzKSxnPXMuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLF89cy5nZXRJbnRzKCJkaWxhdGlvbnMiLFsxLDFdKSxiPXMuZ2V0SW50KCJncm91cCIsMSkseT1zLmdldEludHMoImtlcm5lbF9zaGFwZSIsW10pLFQ9cy5nZXRJbnRzKCJvdXRwdXRfcGFkZGluZyIsWzAsMF0pLHc9cy5nZXRJbnRzKCJvdXRwdXRfc2hhcGUiLFtdKSx4PXMuZ2V0SW50cygicGFkcyIsWzAsMCwwLDBdKSxFPXMuZ2V0SW50cygic3RyaWRlcyIsWzEsMV0pO3JldHVybigwLG8uY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KShPYmplY3QuYXNzaWduKHthdXRvUGFkOmcsZGlsYXRpb25zOl8sZ3JvdXA6YixrZXJuZWxTaGFwZTp5LG91dHB1dFBhZGRpbmc6VCxvdXRwdXRTaGFwZTp3LHBhZHM6eCxzdHJpZGVzOkV9LG0pKX07Y29uc3QgZT0oaSxzKT0+e2lmKCFpfHxpLmxlbmd0aCE9PTImJmkubGVuZ3RoIT09Myl0aHJvdyBuZXcgRXJyb3IoIkNvbnYgcmVxdWlyZXMgMiBvciAzIGlucHV0cyIpO2lmKGlbMF0uZGltcy5sZW5ndGghPT00fHxpWzFdLmRpbXMubGVuZ3RoIT09NCl0aHJvdyBuZXcgRXJyb3IoImN1cnJlbnRseSBvbmx5IHN1cHBvcnQgMi1kaW1lbnNpb25hbCBjb252Iik7aWYoaVswXS5kaW1zWzFdIT09aVsxXS5kaW1zWzBdKXRocm93IG5ldyBFcnJvcigiRklMVEVSX0lOX0NIQU5ORUwgc2hvdWxkIGJlIGVxdWFsIHRvIERBVEFfQ0hBTk5FTCIpO2NvbnN0IG09aVsxXS5kaW1zWzFdKnMuZ3JvdXA7aWYoaS5sZW5ndGg9PT0zJiYoaVsyXS5kaW1zLmxlbmd0aCE9PTF8fGlbMl0uZGltc1swXSE9PW0pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiaWFzIik7Y29uc3QgZz1pWzBdLmRpbXMubGVuZ3RoLTI7aWYocy5kaWxhdGlvbnMubGVuZ3RoIT09Zyl0aHJvdyBuZXcgRXJyb3IoYGRpbGF0aW9ucyBzaG91bGQgYmUgJHtnfURgKTtpZihzLnN0cmlkZXMubGVuZ3RoIT09Zyl0aHJvdyBuZXcgRXJyb3IoYHN0cmlkZXMgc2hvdWxkIGJlICR7Z31EYCk7aWYocy5wYWRzLmxlbmd0aCE9PTIqZyl0aHJvdyBuZXcgRXJyb3IoYHBhZHMgc2hvdWxkIGJlICR7MipnfURgKTtpZihzLm91dHB1dFBhZGRpbmcubGVuZ3RoIT09Zyl0aHJvdyBuZXcgRXJyb3IoYG91dHB1dF9wYWRkaW5nIHNob3VsZCBiZSAke2d9RGApO2lmKHMua2VybmVsU2hhcGUubGVuZ3RoIT09MCYmcy5rZXJuZWxTaGFwZS5sZW5ndGghPT1pWzFdLmRpbXMubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGtlcm5lbCBzaGFwZSIpO2lmKHMub3V0cHV0U2hhcGUubGVuZ3RoIT09MCYmcy5vdXRwdXRTaGFwZS5sZW5ndGghPT1pWzBdLmRpbXMubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG91dHB1dCBzaGFwZSIpO2lmKGlbMF0udHlwZSE9PSJmbG9hdDMyInx8aVsxXS50eXBlIT09ImZsb2F0MzIiKXRocm93IG5ldyBFcnJvcigiQ29udlRyYW5zcG9zZSBpbnB1dChYLFcpIHNob3VsZCBiZSBmbG9hdCB0ZW5zb3IiKTtpZihpLmxlbmd0aD09PTMmJmlbMl0udHlwZSE9PSJmbG9hdDMyIil0aHJvdyBuZXcgRXJyb3IoIkNvbnZUcmFuc3Bvc2UgaW5wdXQoYmlhcykgc2hvdWxkIGJlIGZsb2F0IHRlbnNvciIpfX0sODEzODooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VDb252QXR0cmlidXRlcz10LmNvbnY9dC5jYWxjdWxhdGVPdXRwdXRTaGFwZT12b2lkIDA7Y29uc3Qgbz1yKDI0NiksdT1yKDI1MTcpLGg9cig0NzcwKSxhPXIoMTM4NikscD1yKDk4MjgpLGY9cigyODIzKSxkPXIoMzI0OCksbD1yKDU2MjMpO3QuY2FsY3VsYXRlT3V0cHV0U2hhcGU9KGcsXyxiLHksVCk9Pntjb25zdCB3PWdbMF0seD1nLnNsaWNlKDIpLEU9eC5sZW5ndGgsUD1fWzBdLHY9Xy5zbGljZSgyKS5tYXAoKCQseik9PiQrKCQtMSkqKGJbel0tMSkpLE09eC5tYXAoKCQseik9PiQreVt6XSt5W3orRV0pLm1hcCgoJCx6KT0+TWF0aC5mbG9vcigoJC12W3pdK1Rbel0pL1Rbel0pKTtyZXR1cm5bdyxQXS5jb25jYXQoLi4uTSl9LHQuY29udj0oZyxfLGIpPT4obShfLGIpLG4oZyxfLGIpKTtjb25zdCBuPShnLF8sYik9Pntjb25zdCB5PXMoYixfKSxUPWcuc2Vzc2lvbi5wYWNrLHc9eS5rZXJuZWxTaGFwZVswXT09PTEmJnkua2VybmVsU2hhcGVbMV09PT0xO3JldHVybiB5Lmdyb3VwPjE/W2cucnVuKCgwLGguY3JlYXRlVW5wYWNrZWRHcm91cGVkQ29udlByb2dyYW1JbmZvTG9hZGVyKShnLF8seSksXyldOncmJlQ/W2UoZyxfLHkpXTpUJiZfWzBdLmRpbXMubGVuZ3RoPT09NCYmX1swXS5kaW1zWzBdPT09MSYmIXc/WygwLGEuY29udjJEUGFja2VkKShnLF8seSldOltpKGcsXyx5KV19LGU9KGcsXyxiKT0+e2NvbnN0IHk9X1swXS5kaW1zLFQ9X1sxXS5kaW1zLHc9KDAsdC5jYWxjdWxhdGVPdXRwdXRTaGFwZSkoeSxULGIuZGlsYXRpb25zLGIucGFkcyxiLnN0cmlkZXMpLHg9Zy5yZXNoYXBlVW5wYWNrZWQoX1swXSxbeVsxXSx5WzJdKnlbM11dKSxFPWcucmVzaGFwZVVucGFja2VkKF9bMV0sW1RbMF0sVFsxXV0pLFA9Xy5sZW5ndGg+Mj9bRSx4LF9bMl1dOltFLHhdLHY9Zy5ydW4oKDAsbC5jcmVhdGVNYXRtdWxQcm9ncmFtSW5mb0xvYWRlcikoUCxiKSxQKTtyZXR1cm4gZy5yZXNoYXBlVW5wYWNrZWQodix3KX0saT0oZyxfLGIpPT57Y29uc3QgeT1fWzBdLmRpbXMsVD1fWzFdLmRpbXMsdz0oMCx0LmNhbGN1bGF0ZU91dHB1dFNoYXBlKSh5LFQsYi5kaWxhdGlvbnMsYi5wYWRzLGIuc3RyaWRlcykseD1nLnJ1bigoMCxkLmNyZWF0ZUltMkNvbFByb2dyYW1JbmZvTG9hZGVyKShnLF9bMF0sX1sxXSx3LGIpLFtfWzBdXSksRT1fLmxlbmd0aD09PTM/W3gsX1sxXSxfWzJdXTpbeCxfWzFdXTtyZXR1cm4gZy5ydW4oKDAscC5jcmVhdGVEb3RQcm9kdWN0UHJvZ3JhbUluZm9Mb2FkZXIpKGcsXyx3LGIpLEUpfSxzPShnLF8pPT57Y29uc3QgYj1nLmtlcm5lbFNoYXBlLnNsaWNlKCk7aWYoZy5rZXJuZWxTaGFwZS5sZW5ndGg9PT0wKWZvcihsZXQgdz0yO3c8X1sxXS5kaW1zLmxlbmd0aDsrK3cpYi5wdXNoKF9bMV0uZGltc1t3XSk7Y29uc3QgeT1nLnBhZHMuc2xpY2UoKTt1LlBvb2xDb252VXRpbC5hZGp1c3RQYWRzQmFzZWRPbkF1dG9QYWQoX1swXS5kaW1zLGcuc3RyaWRlcyxnLmRpbGF0aW9ucyxiLHksZy5hdXRvUGFkKTtjb25zdCBUPU9iamVjdC5hc3NpZ24oe30sZyk7cmV0dXJuIE9iamVjdC5hc3NpZ24oVCx7a2VybmVsU2hhcGU6YixwYWRzOnksY2FjaGVLZXk6Zy5jYWNoZUtleX0pLFR9O3QucGFyc2VDb252QXR0cmlidXRlcz1nPT57Y29uc3QgXz1nLmF0dHJpYnV0ZXMsYj0oMCxmLnBhcnNlSW50ZXJuYWxBY3RpdmF0aW9uQXR0cmlidXRlcykoXykseT1fLmdldFN0cmluZygiYXV0b19wYWQiLCJOT1RTRVQiKSxUPV8uZ2V0SW50cygiZGlsYXRpb25zIixbMSwxXSksdz1fLmdldEludCgiZ3JvdXAiLDEpLHg9Xy5nZXRJbnRzKCJrZXJuZWxfc2hhcGUiLFtdKSxFPV8uZ2V0SW50cygicGFkcyIsWzAsMCwwLDBdKSxQPV8uZ2V0SW50cygic3RyaWRlcyIsWzEsMV0pO3JldHVybigwLG8uY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KShPYmplY3QuYXNzaWduKHthdXRvUGFkOnksZGlsYXRpb25zOlQsZ3JvdXA6dyxrZXJuZWxTaGFwZTp4LHBhZHM6RSxzdHJpZGVzOlB9LGIpKX07Y29uc3QgbT0oZyxfKT0+e2lmKCFnfHxnLmxlbmd0aCE9PTImJmcubGVuZ3RoIT09Myl0aHJvdyBuZXcgRXJyb3IoIkNvbnYgcmVxdWlyZXMgMiBvciAzIGlucHV0cyIpO2lmKGdbMF0uZGltcy5sZW5ndGghPT00fHxnWzFdLmRpbXMubGVuZ3RoIT09NCl0aHJvdyBuZXcgRXJyb3IoImN1cnJlbnRseSBvbmx5IHN1cHBvcnQgMi1kaW1lbnNpb25hbCBjb252Iik7aWYoZ1swXS5kaW1zWzFdIT09Z1sxXS5kaW1zWzFdKl8uZ3JvdXApdGhyb3cgbmV3IEVycm9yKCJGSUxURVJfSU5fQ0hBTk5FTCBzaG91bGQgYmUgZXF1YWwgdG8gREFUQV9DSEFOTkVMIik7aWYoZy5sZW5ndGg9PT0zJiYoZ1syXS5kaW1zLmxlbmd0aCE9PTF8fGdbMV0uZGltc1swXSE9PWdbMl0uZGltc1swXSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJpYXMiKTtjb25zdCBiPWdbMF0uZGltcy5sZW5ndGgtMjtpZihfLmRpbGF0aW9ucy5sZW5ndGghPT1iKXRocm93IG5ldyBFcnJvcihgZGlsYXRpb25zIHNob3VsZCBiZSAke2J9RGApO2lmKF8uc3RyaWRlcy5sZW5ndGghPT1iKXRocm93IG5ldyBFcnJvcihgc3RyaWRlcyBzaG91bGQgYmUgJHtifURgKTtpZihfLnBhZHMubGVuZ3RoIT09MipiKXRocm93IG5ldyBFcnJvcihgcGFkcyBzaG91bGQgYmUgJHsyKmJ9RGApO2lmKF8ua2VybmVsU2hhcGUubGVuZ3RoIT09MCYmXy5rZXJuZWxTaGFwZS5sZW5ndGghPT1nWzFdLmRpbXMubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGtlcm5lbCBzaGFwZSIpO2lmKGdbMF0udHlwZSE9PSJmbG9hdDMyInx8Z1sxXS50eXBlIT09ImZsb2F0MzIiKXRocm93IG5ldyBFcnJvcigiQ29udiBpbnB1dChYLFcpIHNob3VsZCBiZSBmbG9hdCB0ZW5zb3IiKTtpZihnLmxlbmd0aD09PTMmJmdbMl0udHlwZSE9PSJmbG9hdDMyIil0aHJvdyBuZXcgRXJyb3IoIkNvbnYgaW5wdXQoYmlhcykgc2hvdWxkIGJlIGZsb2F0IHRlbnNvciIpfX0sNTE5MzooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VEZXB0aFRvU3BhY2VBdHRyaWJ1dGVzPXQuZGVwdGhUb1NwYWNlPXZvaWQgMDtjb25zdCBvPXIoMzczOCk7dC5kZXB0aFRvU3BhY2U9KGgsYSxwKT0+e3UoYSk7Y29uc3QgZj1wLmJsb2Nrc2l6ZSxkPWYqZixsPXAubW9kZT09PSJEQ1IiP1swLDMsNCwxLDUsMl06WzAsMSw0LDIsNSwzXSxuPXAubW9kZT09PSJEQ1IiP1thWzBdLmRpbXNbMF0sZixmLGFbMF0uZGltc1sxXS9kLGFbMF0uZGltc1syXSxhWzBdLmRpbXNbM11dOlthWzBdLmRpbXNbMF0sYVswXS5kaW1zWzFdL2QsZixmLGFbMF0uZGltc1syXSxhWzBdLmRpbXNbM11dLGU9aC5yZXNoYXBlVW5wYWNrZWQoYVswXSxuKSxpPXtwZXJtOmwsY2FjaGVLZXk6YCR7bH1gfSxbc109KDAsby50cmFuc3Bvc2UpKGgsW2VdLGkpLG09W2FbMF0uZGltc1swXSxhWzBdLmRpbXNbMV0vZCxhWzBdLmRpbXNbMl0qZixhWzBdLmRpbXNbM10qZl07cmV0dXJuW2gucmVzaGFwZVVucGFja2VkKHMsbSldfSx0LnBhcnNlRGVwdGhUb1NwYWNlQXR0cmlidXRlcz1oPT57Y29uc3QgYT1oLmF0dHJpYnV0ZXMuZ2V0SW50KCJibG9ja3NpemUiKTtpZihhPDEpdGhyb3cgbmV3IEVycm9yKGBibG9ja3NpemUgbXVzdCBiZSA+PSAxLCBidXQgZ290IDogJHthfSBmb3IgRGVwdGhUb1NwYWNlYCk7Y29uc3QgcD1oLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJtb2RlIiwiRENSIik7aWYocCE9PSJEQ1IiJiZwIT09IkNSRCIpdGhyb3cgbmV3IEVycm9yKGB1bnJlY29nbml6ZWQgbW9kZTogJHtwfSBmb3IgRGVwdGhUb1NwYWNlYCk7cmV0dXJue21vZGU6cCxibG9ja3NpemU6YX19O2NvbnN0IHU9aD0+e2lmKGgubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoYERlcHRoVG9TcGFjZSBleHBlY3QgMSBpbnB1dHMsIGJ1dCBnb3QgJHtoLmxlbmd0aH1gKTtpZihoWzBdLnR5cGU9PT0ic3RyaW5nInx8aFswXS5kaW1zLmxlbmd0aCE9PTQpdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVwdGhUb1NwYWNlIGlucHV0IHNob3VsZCBiZSBhIDQtRCBudW1lcmljIHRlbnNvciIpfX0sOTgyODooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCBvPXIoMjUxNyksdT1yKDUwNjApLGg9cigyMDM5KSxhPXIoMjgyMykscD1yKDMyNDgpO3QuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyPShmLGQsbCxuKT0+e2NvbnN0IGU9KChpLHMpPT4oe25hbWU6IkNvbnZEb3RQcm9kdWN0IixpbnB1dE5hbWVzOmk/WyJJbTJDb2wiLCJLIiwiQiJdOlsiSW0yQ29sIiwiSyJdLGlucHV0VHlwZXM6aT9baC5UZXh0dXJlVHlwZS51bnBhY2tlZCxoLlRleHR1cmVUeXBlLnBhY2tlZExhc3REaW1lbnNpb24saC5UZXh0dXJlVHlwZS51bnBhY2tlZF06W2guVGV4dHVyZVR5cGUudW5wYWNrZWQsaC5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uXSxjYWNoZUtleTpzLmFjdGl2YXRpb25DYWNoZUtleX0pKShkLmxlbmd0aD4yLG4pO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse2dldDooKT0+KChpLHMsbSxnLF8pPT57Y29uc3QgYj1tWzBdLmRpbXMseT1tWzFdLmRpbXMsVD1beVswXSxNYXRoLmNlaWwoYlsxXSp5WzJdKnlbM10vNCldLHc9KDAscC5jYWxjdWxhdGVJbTJDb2xEaW1zKShiLHksZyksW3gsRV09aS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQoVCxoLlRleHR1cmVUeXBlLnBhY2tlZExhc3REaW1lbnNpb24pLFA9by5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXModyksW3YsTV09aS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodyxoLlRleHR1cmVUeXBlLnBhY2tlZExhc3REaW1lbnNpb24pLCQ9Zy5sZW5ndGgsej1tLmxlbmd0aDwzPyIwLjAiOiJfQihiKSIsQj1NYXRoLmNlaWwoYlsxXSp5WzJdKnlbM10vNCkse2FjdGl2YXRpb25GdW5jdGlvbjpOLGFwcGx5QWN0aXZhdGlvbjpEfT0oMCxhLmdldEFjdGl2YXRpb25TbmlwcGV0KShfKSxJPSgwLHUuZ2V0R2xzbCkoaS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLEY9YAoke059CmZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHskfV0pIHsKICBpbnQgYlsxXTsKICBiWzBdID0gaW5kaWNlc1sxXTsKICBpbnQgaW0yY29sWzRdOwogIGltMmNvbFswXSA9IGluZGljZXNbMF07CiAgaW0yY29sWzFdID0gaW5kaWNlc1syXTsKICBpbTJjb2xbMl0gPSBpbmRpY2VzWzNdOwogIGludCBpbTJjb2xPZmZzZXQgPSBpbTJjb2xbMF0gKiAke1BbMF19ICsgaW0yY29sWzFdICogJHtQWzFdfSArIGltMmNvbFsyXSAqICR7UFsyXX07CiAgaW50IGtlcm5lbE9mZnNldCA9IGluZGljZXNbMV0gKiAke1RbMV19OwogIGZsb2F0IHZhbHVlID0gJHt6fTsKICBmb3IgKGludCBpID0gMDsgaSA8ICR7Qn07ICsraSkgewogICAgdmVjMiBpbTJjb2xDb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhpbTJjb2xPZmZzZXQsICR7dn0sICR7TX0pOwogICAgdmVjMiBrZXJuZWxDb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhrZXJuZWxPZmZzZXQsICR7eH0sICR7RX0pOwogICAgdmFsdWUgKz0gZG90KCR7SS50ZXh0dXJlMkR9KEltMkNvbCwgaW0yY29sQ29vcmRzKSwgJHtJLnRleHR1cmUyRH0oSywga2VybmVsQ29vcmRzKSk7CiAgICArK2ltMmNvbE9mZnNldDsKICAgICsra2VybmVsT2Zmc2V0OwogIH0KICAke0R9CiAgcmV0dXJuIHZhbHVlOwp9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtvdXRwdXQ6e2RpbXM6Zyx0eXBlOm1bMF0udHlwZSx0ZXh0dXJlVHlwZTpoLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6Rn0pfSkoZixlLGQsbCxuKX0pfX0sNzk5MjooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VGbGF0dGVuQXR0cmlidXRlcz10LmZsYXR0ZW49dm9pZCAwO2NvbnN0IG89cigyNTE3KTt0LmZsYXR0ZW49KGgsYSxwKT0+e3UoYSxwKTtjb25zdCBmPW8uU2hhcGVVdGlsLmZsYXR0ZW5TaGFwZShhWzBdLmRpbXMscCk7cmV0dXJuW2gucmVzaGFwZVVucGFja2VkKGFbMF0sZildfSx0LnBhcnNlRmxhdHRlbkF0dHJpYnV0ZXM9aD0+aC5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIsMSk7Y29uc3QgdT0oaCxhKT0+e2lmKCFofHxoLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJGbGF0dGVuIHJlcXVpcmVzIDEgaW5wdXQuIik7Y29uc3QgcD1oWzBdLmRpbXMubGVuZ3RoO2lmKHA9PT0wKXRocm93IG5ldyBFcnJvcigic2NhbGFyIHRlbnNvciBpcyBub3Qgc3VwcG9ydGVkLiIpO2lmKGE8LXB8fGE+cCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXhpcyIpO2lmKGhbMF0udHlwZT09PSJzdHJpbmciKXRocm93IG5ldyBFcnJvcigic3RyaW5nIHRlbnNvciBpcyBub3Qgc3VwcG9ydGVkLiIpfX0sMjgyMzooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VJbnRlcm5hbEFjdGl2YXRpb25BdHRyaWJ1dGVzPXQuZ2V0QWN0aXZhdGlvblNuaXBwZXQ9dm9pZCAwO2NvbnN0IG89cigyNTE3KSx1PXIoNDkwOSk7dC5nZXRBY3RpdmF0aW9uU25pcHBldD1mdW5jdGlvbihoKXtsZXQgYTtzd2l0Y2goaC5hY3RpdmF0aW9uKXtjYXNlIlJlbHUiOmE9KDAsdS5nbHNsUmVsdSkoKTticmVhaztjYXNlIlNpZ21vaWQiOmE9KDAsdS5nbHNsU2lnbW9pZCkoKTticmVhaztjYXNlIkNsaXAiOmE9KDAsdS5nbHNsQ2xpcCkoaC5jbGlwTWluLGguY2xpcE1heCk7YnJlYWs7ZGVmYXVsdDpyZXR1cm57YWN0aXZhdGlvbkZ1bmN0aW9uOiIiLGFwcGx5QWN0aXZhdGlvbjoiIn19Y29uc3QgcD1hLm5hbWU7cmV0dXJue2FjdGl2YXRpb25GdW5jdGlvbjphLmJvZHksYXBwbHlBY3RpdmF0aW9uOmB2YWx1ZSA9ICR7cH1fKHZhbHVlKTtgfX0sdC5wYXJzZUludGVybmFsQWN0aXZhdGlvbkF0dHJpYnV0ZXM9aD0+e2NvbnN0IGE9aC5nZXRTdHJpbmcoImFjdGl2YXRpb24iLCIiKTtpZihhPT09IkNsaXAiKXtjb25zdFtwLGZdPWguZ2V0RmxvYXRzKCJhY3RpdmF0aW9uX3BhcmFtcyIsW28uTUlOX0NMSVAsby5NQVhfQ0xJUF0pO3JldHVybnthY3RpdmF0aW9uOmEsY2xpcE1heDpmLGNsaXBNaW46cCxhY3RpdmF0aW9uQ2FjaGVLZXk6YCR7YX06JHtwfSwke2Z9YH19cmV0dXJue2FjdGl2YXRpb246YSxhY3RpdmF0aW9uQ2FjaGVLZXk6YX19fSwxMjUzOihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUdhdGhlckF0dHJpYnV0ZXM9dC5nYXRoZXI9dm9pZCAwO2NvbnN0IG89cigyNDYpLHU9cig3ODIpLGg9cigyNTE3KSxhPXIoMjAzOSk7dC5nYXRoZXI9KGwsbixlKT0+KGQobixlLmF4aXMpLFtsLnJ1bihmKGwsbixlKSxuKV0pLHQucGFyc2VHYXRoZXJBdHRyaWJ1dGVzPWw9PigwLG8uY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7YXhpczpsLmF0dHJpYnV0ZXMuZ2V0SW50KCJheGlzIiwwKX0pO2NvbnN0IHA9e25hbWU6IkdhdGhlciIsaW5wdXROYW1lczpbIkEiLCJCIl0saW5wdXRUeXBlczpbYS5UZXh0dXJlVHlwZS51bnBhY2tlZCxhLlRleHR1cmVUeXBlLnVucGFja2VkXX0sZj0obCxuLGUpPT57Y29uc3QgaT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scCkse2NhY2hlSGludDplLmNhY2hlS2V5fSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7Z2V0OigpPT4oKHMsbSxnLF8pPT57Y29uc3QgYj1nWzBdLmRpbXMuc2xpY2UoKSx5PWdbMV0uZGltcy5zbGljZSgpLFQ9bmV3IEFycmF5KGIubGVuZ3RoK3kubGVuZ3RoLTEpO189aC5TaGFwZVV0aWwubm9ybWFsaXplQXhpcyhfLGIubGVuZ3RoKTtjb25zdCB3PVtdO2ZvcihsZXQgRT0wO0U8VC5sZW5ndGg7RSsrKUU8Xz8oVFtFXT1iW0VdLHcucHVzaChgaW5wdXRJZHhbJHtFfV0gPSBvdXRwdXRJZHhbJHtFfV07YCkpOkU8Xyt5Lmxlbmd0aD8oVFtFXT15W0UtX10sdy5wdXNoKGBpbmRleERhdGFJZHhbJHtFLV99XSA9IG91dHB1dElkeFske0V9XTtgKSk6KFRbRV09YltFLXkubGVuZ3RoKzFdLHcucHVzaChgaW5wdXRJZHhbJHtFLXkubGVuZ3RoKzF9XSA9IG91dHB1dElkeFske0V9XTtgKSk7Y29uc3QgeD1gCiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IG91dHB1dElkeFske1QubGVuZ3RofHwxfV0pIHsKICAgICAgICBpbnQgaW5wdXRJZHhbJHtiLmxlbmd0aH1dOwogICAgICAgIGludCBpbmRleERhdGFJZHhbJHt5Lmxlbmd0aHx8MX1dOwogICAgICAgIGluZGV4RGF0YUlkeFswXSA9IDA7CiAgICAgICAgJHt3LmpvaW4oYAogICAgICAgIGApfQogICAgICAgIGludCBpZHggPSBpbnQoX0IoaW5kZXhEYXRhSWR4KSk7CiAgICAgICAgaW5wdXRJZHhbJHtffV0gPSBpZHggPCAwID8gaWR4ICsgJHtiW19dfSA6IGlkeDsKICAgICAgICByZXR1cm4gX0EoaW5wdXRJZHgpOwogICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG0pLHtvdXRwdXQ6e2RpbXM6VCx0eXBlOmdbMF0udHlwZSx0ZXh0dXJlVHlwZTphLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6eH0pfSkoMCxpLG4sZS5heGlzKX0pfSxkPShsLG4pPT57aWYoIWx8fGwubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3IoIkdhdGhlciByZXF1aXJlcyAyIGlucHV0cy4iKTtjb25zdCBlPWxbMF0uZGltcy5sZW5ndGg7aWYoZTwxKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZihuPC1lfHxuPmUtMSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXhpcy4iKTtpZih1Lk5VTUJFUl9UWVBFUy5pbmRleE9mKGxbMF0udHlwZSk9PT0tMSl0aHJvdyBuZXcgRXJyb3IoIkludmFpZCBpbnB1dCB0eXBlLiIpO2lmKGxbMV0udHlwZSE9PSJpbnQzMiImJmxbMV0udHlwZSE9PSJpbnQxNiIpdGhyb3cgbmV3IEVycm9yKCJJbnZhaWQgaW5wdXQgdHlwZS4iKX19LDQ3NzY6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlR2VtbUF0dHJpYnV0ZXNWMTE9dC5wYXJzZUdlbW1BdHRyaWJ1dGVzVjc9dC5nZW1tPXZvaWQgMDtjb25zdCBvPXIoMjQ2KSx1PXIoMjUxNyksaD1yKDIwMzkpO3QuZ2VtbT0obCxuLGUpPT4oZChuLGUpLFtsLnJ1bihwKG4sZSksbildKTtjb25zdCBhPShsLG4pPT57Y29uc3QgZT1sLmF0dHJpYnV0ZXMuZ2V0SW50KCJ0cmFuc0EiLDApIT09MCxpPWwuYXR0cmlidXRlcy5nZXRJbnQoInRyYW5zQiIsMCkhPT0wLHM9bC5hdHRyaWJ1dGVzLmdldEZsb2F0KCJhbHBoYSIsMSksbT1sLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImJldGEiLDEpO3JldHVybigwLG8uY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7dHJhbnNBOmUsdHJhbnNCOmksYWxwaGE6cyxiZXRhOm0saXNPcHRpb25hbEM6bn0pfTt0LnBhcnNlR2VtbUF0dHJpYnV0ZXNWNz1sPT5hKGwsITEpLHQucGFyc2VHZW1tQXR0cmlidXRlc1YxMT1sPT5hKGwsITApO2NvbnN0IHA9KGwsbik9Pntjb25zdCBlPXtuYW1lOiJHZW1tIixpbnB1dE5hbWVzOmwubGVuZ3RoPT09Mz9bIkEiLCJCIiwiQyJdOlsiQSIsIkIiXSxpbnB1dFR5cGVzOmwubGVuZ3RoPT09Mz9baC5UZXh0dXJlVHlwZS51bnBhY2tlZCxoLlRleHR1cmVUeXBlLnVucGFja2VkLGguVGV4dHVyZVR5cGUudW5wYWNrZWRdOltoLlRleHR1cmVUeXBlLnVucGFja2VkLGguVGV4dHVyZVR5cGUudW5wYWNrZWRdLGtleTpuLmNhY2hlS2V5fTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHtnZXQ6KCk9PmYoZSxsLG4pfSl9LGY9KGwsbixlKT0+e2NvbnN0IGk9blswXS5kaW1zLnNsaWNlKCkscz1uWzFdLmRpbXMuc2xpY2UoKSxbbSxnXT11LkdlbW1VdGlsLmdldFNoYXBlT2ZHZW1tUmVzdWx0KGksZS50cmFuc0EscyxlLnRyYW5zQixuLmxlbmd0aD09PTM/blsyXS5kaW1zOnZvaWQgMCksXz1bbSxnXTtpZighXyl0aHJvdyBuZXcgRXJyb3IoIkNhbid0IHVzZSBnZW1tIG9uIHRoZSBnaXZlbiB0ZW5zb3JzIik7bGV0IGI9aVtpLmxlbmd0aC0xXSx5PSIiO2UudHJhbnNBJiYoYj1pWzBdKSxlLnRyYW5zQSYmZS50cmFuc0I/eT0idmFsdWUgKz0gX0FfVChhKSAqIF9CX1QoYik7IjplLnRyYW5zQSYmIWUudHJhbnNCP3k9InZhbHVlICs9IF9BX1QoYSkgKiBfQihiKTsiOiFlLnRyYW5zQSYmZS50cmFuc0I/eT0idmFsdWUgKz0gX0EoYSkgKiBfQl9UKGIpOyI6ZS50cmFuc0F8fGUudHJhbnNCfHwoeT0idmFsdWUgKz0gX0EoYSkgKiBfQihiKTsiKTtjb25zdCBUPV8ubGVuZ3RoLHc9YAogICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7VH1dKSB7CiAgICAgICAgICBpbnQgYVske1R9XTsKICAgICAgICAgIGludCBiWyR7VH1dOwogICAgICAgICAgJHtuLmxlbmd0aD09PTM/YGludCBjWyR7blsyXS5kaW1zLmxlbmd0aH1dO2A6IiJ9CgogICAgICAgICAgY29weVZlYyhpbmRpY2VzLCBhKTsKICAgICAgICAgIGNvcHlWZWMoaW5kaWNlcywgYik7CiAgICAgICAgICAke24ubGVuZ3RoPT09Mz8iYmNhc3RJbmRpY2VzX0MoaW5kaWNlcywgYyk7IjoiIn0KCiAgICAgICAgICBmbG9hdCB2YWx1ZSA9IDAuMDsKICAgICAgICAgIGZvciAoaW50IGs9MDsgazwke2J9OyArK2spIHsKICAgICAgICAgICAgICBhWyR7VC0xfV0gPSBrOwogICAgICAgICAgICAgIGJbJHtULTJ9XSA9IGs7CiAgICAgICAgICAgICAgJHt5fQogICAgICAgICAgfQoKICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiBhbHBoYTsKICAgICAgICAgICR7bi5sZW5ndGg9PT0zPyJ2YWx1ZSArPSBiZXRhICogX0MoYyk7IjoiIn0KICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxsKSx7b3V0cHV0OntkaW1zOl8sdHlwZTpuWzBdLnR5cGUsdGV4dHVyZVR5cGU6aC5UZXh0dXJlVHlwZS51bnBhY2tlZH0sdmFyaWFibGVzOlt7bmFtZToiYWxwaGEiLHR5cGU6ImZsb2F0IixkYXRhOmUuYWxwaGF9LHtuYW1lOiJiZXRhIix0eXBlOiJmbG9hdCIsZGF0YTplLmJldGF9XSxzaGFkZXJTb3VyY2U6d30pfSxkPShsLG4pPT57aWYoIWwpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBpcyBtaXNzaW5nIik7aWYobi5pc09wdGlvbmFsQyYmKGwubGVuZ3RoPDJ8fGwubGVuZ3RoPjMpKXRocm93IG5ldyBFcnJvcigiSW52YWlkIGlucHV0IHNoYXBlLiIpO2lmKCFuLmlzT3B0aW9uYWxDJiZsLmxlbmd0aCE9PTMpdGhyb3cgbmV3IEVycm9yKCJHZW1tIHJlcXVpcmVzIDMgaW5wdXRzIik7aWYobC5sZW5ndGg9PT0zJiZsWzJdLmRpbXMubGVuZ3RoIT09MSYmbFsyXS5kaW1zLmxlbmd0aCE9PTIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHNoYXBlIG9mIEMiKTtpZihsWzBdLnR5cGUhPT0iZmxvYXQzMiImJmxbMF0udHlwZSE9PSJmbG9hdDY0Inx8bFsxXS50eXBlIT09ImZsb2F0MzIiJiZsWzFdLnR5cGUhPT0iZmxvYXQ2NCJ8fGwubGVuZ3RoPT09MyYmbFsyXS50eXBlIT09ImZsb2F0MzIiJiZsWzJdLnR5cGUhPT0iZmxvYXQ2NCIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7aWYobFswXS50eXBlIT09bFsxXS50eXBlfHxsLmxlbmd0aD09PTMmJmxbMF0udHlwZSE9PWxbMl0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHR5cGVzIGFyZSBtaXNtYXRjaGVkIil9fSw4NTU1OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVQYWNrZWRJbTJDb2xQcm9ncmFtSW5mb0xvYWRlcj12b2lkIDA7Y29uc3Qgbz1yKDUwNjApLHU9cigyMDM5KSxoPXIoMjgyNyk7dC5jcmVhdGVQYWNrZWRJbTJDb2xQcm9ncmFtSW5mb0xvYWRlcj0oYSxwLGYsZCxsKT0+e2NvbnN0IG49KGU9bC5jYWNoZUtleSx7bmFtZToiSW0yQ29sIChwYWNrZWQpIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W3UuVGV4dHVyZVR5cGUucGFja2VkXSxjYWNoZUhpbnQ6ZX0pO3ZhciBlO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbikse2dldDooKT0+KChpLHMsbSxnLF8sYik9Pntjb25zdCB5PW0uZGltcyxUPWcuZGltcyx3PV8ubGVuZ3RoLHg9W1RbMV0qVFsyXSpUWzNdLF9bMl0qX1szXV0sRT1UWzJdKlRbM10sUD0oMCxoLnVucGFja0Zyb21DaGFubmVsKSgpLHY9KDAsby5nZXRHbHNsKShpLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbik7bGV0IE09IiI7Zm9yKGxldCB6PTA7ejw9MTt6KyspZm9yKGxldCBCPTA7Qjw9MTtCKyspTSs9YAogICAgICAgICAgICBibG9ja0luZGV4ID0gcmMueCArICR7Qn07CiAgICAgICAgICAgIHBvcyA9IHJjLnkgKyAke3p9OwoKICAgICAgICAgICAgaWYoYmxvY2tJbmRleCA8ICR7eFsxXX0gJiYgcG9zIDwgJHt4WzBdfSkgewogICAgICAgICAgICAgIG9mZnNldFkgPSBpbnQoYmxvY2tJbmRleCAvICgke19bdy0xXX0pKSAqICR7Yi5zdHJpZGVzWzBdfSAtCiAgICAgICAgICAgICAgICAke2IucGFkc1swXX07CiAgICAgICAgICAgICAgZDAgPSBvZmZzZXRZICsgJHtiLmRpbGF0aW9uc1swXX0gKiAoaW1vZChwb3MsICR7RX0pIC8gJHtUWzJdfSk7CgogICAgICAgICAgICAgIGlmKGQwIDwgJHt5WzJdfSAmJiBkMCA+PSAwKSB7CiAgICAgICAgICAgICAgICBvZmZzZXRYID0gaW1vZChibG9ja0luZGV4LCAke19bdy0xXX0pICogJHtiLnN0cmlkZXNbMV19IC0KICAgICAgICAgICAgICAgICAgJHtiLnBhZHNbMV19OwogICAgICAgICAgICAgICAgZDEgPSBvZmZzZXRYICsgJHtiLmRpbGF0aW9uc1sxXX0gKiBpbW9kKGltb2QocG9zLCAke0V9KSwgJHtUWzJdfSk7CgogICAgICAgICAgICAgICAgaWYoZDEgPCAke3lbM119ICYmIGQxID49IDApIHsKCiAgICAgICAgICAgICAgICAgIGNoID0gaW50KGZsb2F0KHBvcykvICR7RX0uKTsKICAgICAgICAgICAgICAgICAgICBpbm5lckRpbXMgPSB2ZWMyKGQwLCBkMSk7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0WyR7Mip6K0J9XSA9IGdldENoYW5uZWwoCiAgICAgICAgICAgICAgICAgICAgICBnZXRBKDAsIGNoLCBpbnQoaW5uZXJEaW1zLngpLAogICAgICAgICAgICAgICAgICAgICAgaW50KGlubmVyRGltcy55KSksIGlubmVyRGltcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgYDtjb25zdCAkPWAKICAgICAgJHtQfQoKICAgICAgdm9pZCBtYWluKCkgewogICAgICAgIGl2ZWMyIHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7CiAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4wKTsKICAgICAgICAgIGludCBibG9ja0luZGV4LCBwb3MsIG9mZnNldFksIGQwLCBvZmZzZXRYLCBkMSwgY2g7CiAgICAgICAgICB2ZWMyIGlubmVyRGltczsKICAgICAgICAgICR7TX0KICAgICAgICAgICR7di5vdXRwdXR9ID0gcmVzdWx0OwogICAgICB9CiAgICAgICAgICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7b3V0cHV0OntkaW1zOngsdHlwZTptLnR5cGUsdGV4dHVyZVR5cGU6dS5UZXh0dXJlVHlwZS5wYWNrZWR9LHNoYWRlclNvdXJjZTokLGhhc01haW46ITB9KX0pKGEsbixwLGYsZCxsKX0pfX0sMzI0ODooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY2FsY3VsYXRlSW0yQ29sRGltcz10LmNyZWF0ZUltMkNvbFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCBvPXIoMjAzOSk7dC5jcmVhdGVJbTJDb2xQcm9ncmFtSW5mb0xvYWRlcj0odSxoLGEscCxmKT0+e2NvbnN0IGQ9KGw9Zi5jYWNoZUtleSx7bmFtZToiSW0yQ29sIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWRdLGNhY2hlSGludDpsfSk7dmFyIGw7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxkKSx7Z2V0OigpPT4oKG4sZSxpLHMsbSxnKT0+e2NvbnN0IF89aS5kaW1zLGI9cy5kaW1zLHk9bS5sZW5ndGgsVD0oMCx0LmNhbGN1bGF0ZUltMkNvbERpbXMpKF8sYixtLDQpLHc9YAogICAgICAgIGNvbnN0IGludCBYQyA9ICR7X1sxXX07CiAgICAgICAgY29uc3QgaW50IFhIID0gJHtfWzJdfTsKICAgICAgICBjb25zdCBpbnQgWFcgPSAke19bM119OwogICAgICAgIGNvbnN0IGludCBLSCA9ICR7Zy5rZXJuZWxTaGFwZVswXX07CiAgICAgICAgY29uc3QgaW50IEtXID0gJHtnLmtlcm5lbFNoYXBlWzFdfTsKICAgICAgICBjb25zdCBpbnQgZGlsYXRpb25IID0gJHtnLmRpbGF0aW9uc1swXX07CiAgICAgICAgY29uc3QgaW50IGRpbGF0aW9uVyA9ICR7Zy5kaWxhdGlvbnNbMV19OwogICAgICAgIGNvbnN0IGludCBzdHJpZGVIID0gJHtnLnN0cmlkZXNbMF19OwogICAgICAgIGNvbnN0IGludCBzdHJpZGVXID0gJHtnLnN0cmlkZXNbMV19OwogICAgICAgIGNvbnN0IGludCBwYWRIID0gJHtnLnBhZHNbMF19OwogICAgICAgIGNvbnN0IGludCBwYWRXID0gJHtnLnBhZHNbMV19OwogICAgICAgIGNvbnN0IGludCBLSEtXID0gS0gqS1c7CiAgICAgICAgY29uc3QgaW50IFhDS0hLVyA9IFhDICogS0hLVzsKICAgICAgICBjb25zdCBpbnQgb3V0cHV0Q2hhbm5lbHMgPSA0OwogICAgICAgIHZlYzQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske3l9XSkgewogICAgICAgICAgaW50IGIgID0gaW5kaWNlc1swXTsgLy8gYmF0Y2ggc2l6ZQogICAgICAgICAgaW50IG9oID0gaW5kaWNlc1sxXSAqIHN0cmlkZUggLSBwYWRIOyAvL291dHB1dCBoZWlnaHQKICAgICAgICAgIGludCBvdyA9IGluZGljZXNbMl0gKiBzdHJpZGVXIC0gcGFkVzsgLy9vdXRwdXQgd2lkdGgKICAgICAgICAgIGludCBwID0gaW5kaWNlc1szXSAqIG91dHB1dENoYW5uZWxzOyAvL3BhdGNoCiAgICAgICAgICB2ZWM0IHZhbHVlID0gdmVjNCgwLjApOwogICAgICAgICAgZm9yKGludCBpPTA7IGkgPCBvdXRwdXRDaGFubmVsczsgKytpKSB7CiAgICAgICAgICAgIGlmKHAgPCBYQ0tIS1cpIHsKICAgICAgICAgICAgICBpbnQgcGF0Y2hDID0gcCAvIEtIS1c7CiAgICAgICAgICAgICAgaW50IHBhdGNoSCA9IChwIC0gcGF0Y2hDKktIS1cpIC8gS1c7CiAgICAgICAgICAgICAgaW50IHBhdGNoVyA9IChwIC0gcGF0Y2hDKktIS1cpIC0gcGF0Y2hIICogS1c7CiAgICAgICAgICAgICAgaW50IHhoMiA9IG9oICsgcGF0Y2hIICogZGlsYXRpb25IOwogICAgICAgICAgICAgIGludCB4dzIgPSBvdyArIHBhdGNoVyAqIGRpbGF0aW9uVzsKICAgICAgICAgICAgICBpbnQgeFske18ubGVuZ3RofV07CiAgICAgICAgICAgICAgeFswXSA9IGI7CiAgICAgICAgICAgICAgeFsxXSA9IHBhdGNoQzsKICAgICAgICAgICAgICB4WzJdID0geGgyOwogICAgICAgICAgICAgIHhbM10gPSB4dzI7CiAgICAgICAgICAgICAgaWYoeGgyID49IDAgJiYKICAgICAgICAgICAgICAgICAgeGgyIDwgWEggJiYKICAgICAgICAgICAgICAgICAgeHcyID49IDAgJiYKICAgICAgICAgICAgICAgICAgeHcyIDwgWFcpIHsKICAgICAgICAgICAgICAgIHZhbHVlW2ldID0gX1goeCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICsrcDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHtvdXRwdXQ6e2RpbXM6VCx0eXBlOmkudHlwZSx0ZXh0dXJlVHlwZTpvLlRleHR1cmVUeXBlLnBhY2tlZExhc3REaW1lbnNpb259LHNoYWRlclNvdXJjZTp3fSl9KSgwLGQsaCxhLHAsZil9KX0sdC5jYWxjdWxhdGVJbTJDb2xEaW1zPSh1LGgsYSxwPTQpPT5bYVswXSxhWzJdLGFbM10sTWF0aC5jZWlsKHVbMV0qaFsyXSpoWzNdL3ApXX0sNjU3MjooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VJbWFnZVNjYWxlckF0dHJpYnV0ZXM9dC5pbWFnZVNjYWxlcj12b2lkIDA7Y29uc3Qgbz1yKDI0NiksdT1yKDIwMzkpO3QuaW1hZ2VTY2FsZXI9KGQsbCxuKT0+KGYobCksW2QucnVuKGEoZCxsLG4pLGwpXSksdC5wYXJzZUltYWdlU2NhbGVyQXR0cmlidXRlcz1kPT57Y29uc3QgbD1kLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoInNjYWxlIiksbj1kLmF0dHJpYnV0ZXMuZ2V0RmxvYXRzKCJiaWFzIik7cmV0dXJuKDAsby5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtzY2FsZTpsLGJpYXM6bn0pfTtjb25zdCBoPXtuYW1lOiJJbWFnZVNjYWxlciIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOlt1LlRleHR1cmVUeXBlLnVucGFja2VkXX0sYT0oZCxsLG4pPT57Y29uc3QgZT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saCkse2NhY2hlSGludDpuLmNhY2hlS2V5fSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7Z2V0OigpPT4oKGkscyxtLGcpPT57Y29uc3QgXz1tWzBdLmRpbXMuc2xpY2UoKSxiPV8ubGVuZ3RoLHk9YAogICAgICAke3AoZy5iaWFzLmxlbmd0aCl9CiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtifV0pIHsKICAgICAgICByZXR1cm4gX1goaW5kaWNlcykgKiBzY2FsZSArIGdldEJpYXMoYmlhcywgaW5kaWNlc1sxXSk7CiAgICAgIH1gO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scykse291dHB1dDp7ZGltczpfLHR5cGU6bVswXS50eXBlLHRleHR1cmVUeXBlOnUuVGV4dHVyZVR5cGUudW5wYWNrZWR9LHZhcmlhYmxlczpbe25hbWU6ImJpYXMiLHR5cGU6ImZsb2F0IixhcnJheUxlbmd0aDpnLmJpYXMubGVuZ3RoLGRhdGE6Zy5iaWFzfSx7bmFtZToic2NhbGUiLHR5cGU6ImZsb2F0IixkYXRhOmcuc2NhbGV9XSxzaGFkZXJTb3VyY2U6eX0pfSkoMCxlLGwsbil9KX0scD1kPT57Y29uc3QgbD1bYGZsb2F0IGdldEJpYXMoZmxvYXQgYmlhc1ske2R9XSwgaW50IGNoYW5uZWwpIHtgXTtmb3IobGV0IG49MDtuPGQ7KytuKW49PT0wP2wucHVzaChgCWlmIChjaGFubmVsID09ICR7bn0pIHsgcmV0dXJuIGJpYXNbJHtufV07IH1gKTpuPT09ZC0xP2wucHVzaChgCWVsc2UgeyByZXR1cm4gYmlhc1ske259XTsgfWApOmwucHVzaChgCWVsc2UgaWYgKGNoYW5uZWwgPT0gJHtufSkgeyByZXR1cm4gYmlhc1ske259XTsgfWApO3JldHVybiBsLnB1c2goIgl9IiksbC5qb2luKGAKYCl9LGY9ZD0+e2lmKCFkfHxkLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJJbWFnZVNjYWxlciByZXF1aXJlcyAxIGlucHV0LiIpO2lmKGRbMF0uZGltcy5sZW5ndGghPT00KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZihkWzBdLnR5cGUhPT0iZmxvYXQzMiImJmRbMF0udHlwZSE9PSJmbG9hdDY0Iil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX19LDMzNDY6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlSW5zdGFuY2VOb3JtYWxpemF0aW9uQXR0cmlidXRlcz10Lmluc3RhbmNlTm9ybWFsaXphdGlvbj12b2lkIDA7Y29uc3Qgbz1yKDUwNjApLHU9cigyMDM5KTt0Lmluc3RhbmNlTm9ybWFsaXphdGlvbj0obCxuLGUpPT57ZChuKTtjb25zdCBpPWwucnVuKGEoblswXSksbik7cmV0dXJuW2wucnVuKGYobCxuWzBdLGUsaS5kaW1zKSxbblswXSxpLG5bMV0sblsyXV0pXX0sdC5wYXJzZUluc3RhbmNlTm9ybWFsaXphdGlvbkF0dHJpYnV0ZXM9bD0+bC5hdHRyaWJ1dGVzLmdldEZsb2F0KCJlcHNpbG9uIiwxZS01KTtjb25zdCBoPXtuYW1lOiJJbnN0YW5jZU5vcm1hbGl6YXRpb25fTWVhbkFuZFZhcmlhbmNlIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W3UuVGV4dHVyZVR5cGUudW5wYWNrZWRdfSxhPWw9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxoKSx7Z2V0OigpPT4oKG4sZSk9Pntjb25zdCBpPWUuZGltcy5zbGljZSgpLHM9aVsxXSxtPWlbMl0qaVszXSxnPVtpWzBdLHNdLF89YAogICAgICB2ZWM0IHByb2Nlc3MoaW50WzJdIGluZGljZXMpIHsKICAgICAgICB2ZWM0IHYgPSB2ZWM0KDAuMCk7CiAgICAgICAgaW50IGFbNF07CiAgICAgICAgYVswXSA9IGluZGljZXNbMF07CiAgICAgICAgYVsxXSA9IGluZGljZXNbMV07CiAgICAgICAgZmxvYXQgdGVtcCA9IDAuMDsKICAgICAgICBmb3IoaW50IGEyPTA7IGEyPCR7aVsyXX07IGEyKyspIHsKICAgICAgICAgIGFbMl0gPSBhMjsKICAgICAgICAgIGZvcihpbnQgYTM9MDsgYTM8JHtpWzNdfTsgYTMrKykgewogICAgICAgICAgICBhWzNdID0gYTM7CiAgICAgICAgICAgIGZsb2F0IHggPSBfWChhKTsKICAgICAgICAgICAgdGVtcCArPSB4OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmbG9hdCBtZWFuID0gdGVtcCAvIGZsb2F0KCR7bX0pOwogICAgICAgIHRlbXAgPSAwLjA7CiAgICAgICAgZm9yKGludCBhMj0wOyBhMjwke2lbMl19OyBhMisrKSB7CiAgICAgICAgICBhWzJdID0gYTI7CiAgICAgICAgICBmb3IoaW50IGEzPTA7IGEzPCR7aVszXX07IGEzKyspIHsKICAgICAgICAgICAgYVszXSA9IGEzOwogICAgICAgICAgICBmbG9hdCB4ID0gX1goYSk7CiAgICAgICAgICAgIHRlbXAgKz0gKHggLSBtZWFuKSAqICh4IC0gbWVhbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHYuciA9IG1lYW47CiAgICAgICAgdi5nID0gdGVtcCAvIGZsb2F0KCR7bX0pOwoKICAgICAgICByZXR1cm4gdjsKICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7b3V0cHV0OntkaW1zOmcsdHlwZTplLnR5cGUsdGV4dHVyZVR5cGU6dS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9ufSxzaGFkZXJTb3VyY2U6X30pfSkoaCxsKX0pLHA9e25hbWU6Ikluc3RhbmNlTm9ybWFsaXphdGlvbl9Db21wdXRlT3V0cHV0IixpbnB1dE5hbWVzOlsiWCIsIk1lYW5BbmRWYXJpYW5jZSIsIlNjYWxlIiwiQiJdLGlucHV0VHlwZXM6W3UuVGV4dHVyZVR5cGUudW5wYWNrZWQsdS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uLHUuVGV4dHVyZVR5cGUudW5wYWNrZWQsdS5UZXh0dXJlVHlwZS51bnBhY2tlZF19LGY9KGwsbixlLGkpPT57Y29uc3Qgcz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scCkse2NhY2hlSGludDpgJHtlfWB9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtnZXQ6KCk9PigobSxnLF8sYix5KT0+e2NvbnN0IFQ9KDAsby5nZXRHbHNsKShtLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksW3cseF09bS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQoeSx1LlRleHR1cmVUeXBlLnBhY2tlZExhc3REaW1lbnNpb24pLFtFLFBdPVt3LzQseF0sdj1gCiAgICAgIHZlYzQgZ2V0X01lYW5BbmRWYXJpYW5jZShpbnRbMl0gbXYpIHsKICAgICAgICBpbnQgb2Zmc2V0ID0gaW5kaWNlc1RvT2Zmc2V0X01lYW5BbmRWYXJpYW5jZShtdik7CiAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhvZmZzZXQsICR7RX0sICR7UH0pOwogICAgICAgIHJldHVybiAke1QudGV4dHVyZTJEfShNZWFuQW5kVmFyaWFuY2UsIGNvb3Jkcyk7CiAgICAgIH0KCiAgICAgIGZsb2F0IHByb2Nlc3MoaW50WzRdIGluZGljZXMpIHsKICAgICAgICBpbnQgbXZbMl07CiAgICAgICAgbXZbMF0gPSBpbmRpY2VzWzBdOwogICAgICAgIG12WzFdID0gaW5kaWNlc1sxXTsKICAgICAgICB2ZWM0IG1lYW5fYW5kX3ZhcmlhbmNlID0gZ2V0X01lYW5BbmRWYXJpYW5jZShtdik7CiAgICAgICAgZmxvYXQgbWVhbiA9IG1lYW5fYW5kX3ZhcmlhbmNlLnI7CiAgICAgICAgZmxvYXQgdmFyaWFuY2UgPSBtZWFuX2FuZF92YXJpYW5jZS5nOwoKICAgICAgICBpbnQgc2JbMV07CiAgICAgICAgc2JbMF0gPSBpbmRpY2VzWzFdOwogICAgICAgIGZsb2F0IHNjYWxlID0gX1NjYWxlKHNiKTsKICAgICAgICBmbG9hdCBiID0gX0Ioc2IpOwoKICAgICAgICByZXR1cm4gc2NhbGUgKiAoX1goaW5kaWNlcykgLSBtZWFuKSAvIHNxcnQodmFyaWFuY2UgKyBlcHNpbG9uKSArIGI7CiAgICAgIH1gO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZykse291dHB1dDp7ZGltczpfLmRpbXMsdHlwZTpfLnR5cGUsdGV4dHVyZVR5cGU6dS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sdmFyaWFibGVzOlt7bmFtZToiZXBzaWxvbiIsdHlwZToiZmxvYXQiLGRhdGE6Yn1dLHNoYWRlclNvdXJjZTp2fSl9KShsLHMsbixlLGkpfSl9LGQ9bD0+e2lmKCFsfHxsLmxlbmd0aCE9PTMpdGhyb3cgbmV3IEVycm9yKCJJbnN0YW5jZU5vcm1hbGl6YXRpb24gcmVxdWlyZXMgMyBpbnB1dHMuIik7Y29uc3Qgbj1sWzBdLGU9bFsxXSxpPWxbMl07aWYobi5kaW1zLmxlbmd0aDwzfHxlLmRpbXMubGVuZ3RoIT09MXx8aS5kaW1zLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHNoYXBlLiIpO2lmKGUuZGltc1swXSE9PW4uZGltc1sxXXx8aS5kaW1zWzBdIT09bi5kaW1zWzFdKXRocm93IG5ldyBFcnJvcigiSW5wdXQgc2hhcGVzIGFyZSBtaXNtYXRjaGVkLiIpO2lmKG4udHlwZSE9PSJmbG9hdDMyIiYmbi50eXBlIT09ImZsb2F0NjQifHxlLnR5cGUhPT0iZmxvYXQzMiImJmUudHlwZSE9PSJmbG9hdDY0Inx8aS50eXBlIT09ImZsb2F0MzIiJiZpLnR5cGUhPT0iZmxvYXQ2NCIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7aWYobFswXS5kaW1zLmxlbmd0aCE9PTQpdGhyb3cgbmV3IEVycm9yKCJPbmx5IHN1cHBvcnQgNC1EIGlucHV0IHNoYXBlLiIpfX0sNzA4OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVQYWNrZWRNYXRtdWxQcm9ncmFtSW5mb0xvYWRlcj12b2lkIDA7Y29uc3Qgbz1yKDI1MTcpLHU9cig1MDYwKSxoPXIoMjAzOSksYT1yKDkzOTApLHA9cigyODIzKSxmPXIoNTYyMyk7dC5jcmVhdGVQYWNrZWRNYXRtdWxQcm9ncmFtSW5mb0xvYWRlcj0oZCxsLG4pPT57Y29uc3QgZT0oaT1sLmxlbmd0aD4yLHM9bi5hY3RpdmF0aW9uQ2FjaGVLZXkse25hbWU6Ik1hdE11bCAocGFja2VkKSIsaW5wdXROYW1lczppP1siQSIsIkIiLCJCaWFzIl06WyJBIiwiQiJdLGlucHV0VHlwZXM6aT9baC5UZXh0dXJlVHlwZS5wYWNrZWQsaC5UZXh0dXJlVHlwZS5wYWNrZWQsaC5UZXh0dXJlVHlwZS5wYWNrZWRdOltoLlRleHR1cmVUeXBlLnBhY2tlZCxoLlRleHR1cmVUeXBlLnBhY2tlZF0sY2FjaGVIaW50OnN9KTt2YXIgaSxzO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse2dldDooKT0+KChtLGcsXyxiKT0+e2NvbnN0IHk9Xy5sZW5ndGg+MixUPXk/InZhbHVlICs9IGdldEJpYXNGb3JNYXRtdWwoKTsiOiIiLHc9X1swXS5kaW1zLHg9X1sxXS5kaW1zLEU9by5Ccm9hZGNhc3RVdGlsLmNhbGNTaGFwZSh3LHgsITApLFA9IW8uU2hhcGVVdGlsLmFyZUVxdWFsKF9bMF0uZGltcyxfWzFdLmRpbXMpO2lmKCFFKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgdXNlIG1hdG11bCBvbiB0aGUgZ2l2ZW4gdGVuc29ycyIpO2NvbnN0IHY9d1t3Lmxlbmd0aC0xXSxNPU1hdGguY2VpbCh2LzIpLCQ9dy5sZW5ndGgsej14Lmxlbmd0aCxCPSgwLHUuZ2V0R2xzbCkobS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLE49KDAsYS5nZXRDb29yZHNEYXRhVHlwZSkoRS5sZW5ndGgpLEQ9RS5sZW5ndGgsST0oMCxhLmdldEdsQ2hhbm5lbHMpKCkse2FjdGl2YXRpb25GdW5jdGlvbjpGLGFwcGx5QWN0aXZhdGlvbjpYfT0oMCxwLmdldEFjdGl2YXRpb25TbmlwcGV0KShiKSxHPXk/YCR7KDAsZi5nZXRCaWFzRm9yTWF0bXVsKShOLEksX1syXS5kaW1zLEUsITApfWA6IiIsZWU9UD9gJHtmdW5jdGlvbih3ZSxpZSxUZSxiZSl7bGV0IEllPVtdLExlPVtdO2NvbnN0IEVlPVRlWzBdLmRpbXMsa2U9VGVbMV0uZGltcyxEZT1FZS5sZW5ndGgsQWU9a2UubGVuZ3RoLFNlPWJlLmxlbmd0aCxCZT1TZS1EZSx6ZT1TZS1BZTtJZT1FZS5tYXAoKE1lLFZlKT0+YGNvb3Jkcy4ke2llW1ZlK0JlXX1gKSxJZVtEZS0xXT0iaSoyIixJZS5qb2luKCIsICIpLExlPWtlLm1hcCgoTWUsVmUpPT5gY29vcmRzLiR7aWVbVmUremVdfWApLExlW0FlLTJdPSJpKjIiLExlLmpvaW4oIiwgIik7Y29uc3QgamU9by5Ccm9hZGNhc3RVdGlsLmdldEJyb2FkY2FzdERpbXMoRWUsYmUpLFllPW8uQnJvYWRjYXN0VXRpbC5nZXRCcm9hZGNhc3REaW1zKGtlLGJlKSxRZT1qZS5tYXAoTWU9PmBjb29yZHMuJHtpZVtNZStCZV19ID0gMDtgKS5qb2luKGAKYCkscWU9WWUubWFwKE1lPT5gY29vcmRzLiR7aWVbTWUremVdfSA9IDA7YCkuam9pbihgCmApLEdlPWBpbnQgbGFzdERpbSA9IGNvb3Jkcy4ke2llW1NlLTFdfTsKICBjb29yZHMuJHtpZVtTZS0xXX0gPSBjb29yZHMuJHtpZVtTZS0yXX07CiAgY29vcmRzLiR7aWVbU2UtMl19ID0gbGFzdERpbTtgO3JldHVybmAKdmVjNCBnZXRBQXRPdXRDb29yZHNNYXRtdWwoaW50IGkpIHsKICAke3dlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTsKICAke0dlfQogICR7UWV9CiAgdmVjNCBvdXRwdXRWYWx1ZSA9IGdldEEoJHtJZX0pOwogIHJldHVybiBvdXRwdXRWYWx1ZTsKfQoKdmVjNCBnZXRCQXRPdXRDb29yZHNNYXRtdWwoaW50IGkpIHsKICAke3dlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTsKICAke0dlfQogICR7cWV9CiAgdmVjNCBvdXRwdXRWYWx1ZSA9IGdldEIoJHtMZX0pOwogIHJldHVybiBvdXRwdXRWYWx1ZTsKfWB9KE4sSSxfLEUpfWA6IiIsSj1QPyJnZXRBQXRPdXRDb29yZHNNYXRtdWwoaSkiOmBnZXRBKCR7ZnVuY3Rpb24od2UsaWUpe2xldCBUZT0iIjtmb3IobGV0IGJlPTA7YmU8aWUtMjtiZSsrKVRlKz1gcmMuJHt3ZVtiZV19LCBgO3JldHVybiBUZSs9YHJjLiR7d2VbaWUtMl19LCBpKjJgLFRlfShJLCQpfSlgLGxlPVA/ImdldEJBdE91dENvb3Jkc01hdG11bChpKSI6YGdldEIoJHtmdW5jdGlvbih3ZSxpZSl7bGV0IFRlPSIiO2ZvcihsZXQgYmU9MDtiZTxpZS0yO2JlKyspVGUrPWByYy4ke3dlW2JlXX0sIGA7cmV0dXJuIFRlKz1gaSoyLCByYy4ke3dlW2llLTFdfWAsVGV9KEkseil9KWAseGU9YAogICAgICAgICAgICAke2VlfQogICAgICAgICAgICAke0d9CiAgICAgICAgICAgICR7Rn0KICAgICAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICAgICR7UD8iIjpgJHtOfSByYyA9CiAgICAgICAgICBnZXRPdXRwdXRDb29yZHMoKTsgaW50IGxhc3REaW0gPSByYy4ke0lbRC0xXX07IHJjLiR7SVtELTFdfSA9CiAgICAgICAgICByYy4ke0lbRC0yXX07IHJjLiR7SVtELTJdfSA9IGxhc3REaW07CiAgICAgIGB9CgogICAgICAgICAgICAgIHZlYzQgdmFsdWUgPSB2ZWM0KDApOwogICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtNfTsgaSsrKSB7CiAgICAgICAgICAgICAgICB2ZWM0IGEgPSAke0p9OwogICAgICAgICAgICAgICAgdmVjNCBiID0gJHtsZX07CgogICAgICAgICAgICAgICAgdmFsdWUgKz0gKGEucnJiYiAqIGIucmdyZyk7CiAgICAgICAgICAgICAgICB2YWx1ZSArPSAoYS5nZ2FhICogYi5iYWJhKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJHtUfQogICAgICAgICAgICAgICR7WH0KICAgICAgICAgICAgICAke0Iub3V0cHV0fSA9IHZhbHVlOwogICAgICAgICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGcpLHtvdXRwdXQ6e2RpbXM6RSx0eXBlOl9bMF0udHlwZSx0ZXh0dXJlVHlwZTpoLlRleHR1cmVUeXBlLnBhY2tlZH0sc2hhZGVyU291cmNlOnhlLGhhc01haW46ITB9KX0pKGQsZSxsLG4pfSl9fSw1NjIzOihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5nZXRCaWFzRm9yTWF0bXVsPXQuY3JlYXRlTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXI9dC5wYXJzZU1hdE11bEF0dHJpYnV0ZXM9dC5tYXRNdWw9dm9pZCAwO2NvbnN0IG89cigyNTE3KSx1PXIoMjAzOSksaD1yKDkzOTApLGE9cigyODIzKSxwPXIoNzA4KTtmdW5jdGlvbiBmKG4sZSl7Y29uc3QgaT0ocz1uLmxlbmd0aD4yLG09ZS5hY3RpdmF0aW9uQ2FjaGVLZXkse25hbWU6Ik1hdE11bCIsaW5wdXROYW1lczpzP1siQSIsIkIiLCJCaWFzIl06WyJBIiwiQiJdLGlucHV0VHlwZXM6cz9bdS5UZXh0dXJlVHlwZS51bnBhY2tlZCx1LlRleHR1cmVUeXBlLnVucGFja2VkLHUuVGV4dHVyZVR5cGUudW5wYWNrZWRdOlt1LlRleHR1cmVUeXBlLnVucGFja2VkLHUuVGV4dHVyZVR5cGUudW5wYWNrZWRdLGNhY2hlSGludDptfSk7dmFyIHMsbTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkpLHtnZXQ6KCk9PmZ1bmN0aW9uKGcsXyxiKXtjb25zdCB5PV9bMF0uZGltcyxUPV9bMV0uZGltcyx3PW8uQnJvYWRjYXN0VXRpbC5jYWxjU2hhcGUoeSxULCEwKTtpZighdyl0aHJvdyBuZXcgRXJyb3IoIkNhbid0IHVzZSBtYXRtdWwgb24gdGhlIGdpdmVuIHRlbnNvcnMiKTtjb25zdCB4PSgwLGguZ2V0Q29vcmRzRGF0YVR5cGUpKHcubGVuZ3RoKSxFPSgwLGguZ2V0R2xDaGFubmVscykoKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOlAsYXBwbHlBY3RpdmF0aW9uOnZ9PSgwLGEuZ2V0QWN0aXZhdGlvblNuaXBwZXQpKGIpLE09Xy5sZW5ndGg+MiwkPU0/InZhbHVlICs9IGdldEJpYXNGb3JNYXRtdWwoKTsiOiIiLHo9TT9gJHtsKHgsRSxfWzJdLmRpbXMsdywhMSl9YDoiIixCPXcubGVuZ3RoLE49eS5sZW5ndGgsRD1ULmxlbmd0aCxJPWAKICAgICR7UH0KICAgICR7en0KICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtCfV0pIHsKICAgICAgICBpbnQgYVske059XTsKICAgICAgICBpbnQgYlske0R9XTsKICAgICAgICBiY2FzdE1hdG11bEluZGljZXNfQShpbmRpY2VzLCBhKTsKICAgICAgICBiY2FzdE1hdG11bEluZGljZXNfQihpbmRpY2VzLCBiKTsKCiAgICAgICAgZmxvYXQgdmFsdWU7CiAgICAgICAgZm9yIChpbnQgaz0wOyBrPCR7eVt5Lmxlbmd0aC0xXX07ICsraykgewogICAgICAgICAgICBhWyR7Ti0xfV0gPSBrOwogICAgICAgICAgICBiWyR7RC0yfV0gPSBrOwogICAgICAgICAgICB2YWx1ZSArPSBfQShhKSAqIF9CKGIpOwogICAgICAgIH0KICAgICAgICAkeyR9CiAgICAgICAgJHt2fQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH1gO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZykse291dHB1dDp7ZGltczp3LHR5cGU6X1swXS50eXBlLHRleHR1cmVUeXBlOnUuVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpJfSl9KGksbixlKX0pfXQubWF0TXVsPShuLGUsaSk9PihkKGUpLG4uc2Vzc2lvbi5wYWNrP1tuLnJ1bigoMCxwLmNyZWF0ZVBhY2tlZE1hdG11bFByb2dyYW1JbmZvTG9hZGVyKShuLGUsaSksZSldOltuLnJ1bihmKGUsaSksZSldKSx0LnBhcnNlTWF0TXVsQXR0cmlidXRlcz1uPT4oMCxhLnBhcnNlSW50ZXJuYWxBY3RpdmF0aW9uQXR0cmlidXRlcykobi5hdHRyaWJ1dGVzKSx0LmNyZWF0ZU1hdG11bFByb2dyYW1JbmZvTG9hZGVyPWY7Y29uc3QgZD1uPT57aWYoIW58fG4ubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3IoIk1hdE11bCByZXF1aXJlcyAyIGlucHV0cy4iKTtpZihuWzBdLmRpbXNbblswXS5kaW1zLmxlbmd0aC0xXSE9PW5bMV0uZGltc1tuWzFdLmRpbXMubGVuZ3RoLTJdKXRocm93IG5ldyBFcnJvcigic2hhcmVkIGRpbWVuc2lvbiBkb2VzIG5vdCBtYXRjaC4iKTtpZihuWzBdLnR5cGUhPT0iZmxvYXQzMiImJm5bMF0udHlwZSE9PSJmbG9hdDY0Inx8blsxXS50eXBlIT09ImZsb2F0MzIiJiZuWzFdLnR5cGUhPT0iZmxvYXQ2NCIpdGhyb3cgbmV3IEVycm9yKCJpbnB1dHMgc2hvdWxkIGJlIGZsb2F0IHR5cGUiKTtpZihuWzBdLnR5cGUhPT1uWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dHMgdHlwZXMgc2hvdWxkIG1hdGNoIil9O2Z1bmN0aW9uIGwobixlLGkscyxtKXtsZXQgZz0iIjtjb25zdCBfPWkubGVuZ3RoLGI9cy5sZW5ndGgseT1iLV87Zz1iPDImJl8+MD8iY29vcmRzIjppLm1hcCgoeCxFKT0+YGNvb3Jkcy4ke2VbRSt5XX1gKS5qb2luKCIsICIpO2NvbnN0IFQ9by5Ccm9hZGNhc3RVdGlsLmdldEJyb2FkY2FzdERpbXMoaSxzKS5tYXAoeD0+YGNvb3Jkcy4ke2VbeCt5XX0gPSAwO2ApLmpvaW4oYApgKTtsZXQgdz0idmVjNChvdXRwdXRWYWx1ZS54eCwgb3V0cHV0VmFsdWUueXkpIjtyZXR1cm4gby5TaGFwZVV0aWwuc2l6ZShpKT09PTEmJih3PSJ2ZWM0KG91dHB1dFZhbHVlLngpIiksbT9gCnZlYzQgZ2V0Qmlhc0Zvck1hdG11bCgpIHsKICAke259IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpOwogICR7VH0KICB2ZWM0IG91dHB1dFZhbHVlID0gZ2V0Qmlhcygke2d9KTsKICByZXR1cm4gJHt3fTsKfWA6YApmbG9hdCBnZXRCaWFzRm9yTWF0bXVsKCkgewogICR7bn0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7CiAgJHtUfQogIHJldHVybiBnZXRCaWFzKGNvb3Jkcy54KTsKfWB9dC5nZXRCaWFzRm9yTWF0bXVsPWx9LDI0MDM6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVBhY2tQcm9ncmFtSW5mb0xvYWRlcj12b2lkIDA7Y29uc3Qgbz1yKDUwNjApLHU9cigyMDM5KSxoPXIoOTM5MCksYT1yKDI4MjcpLHA9e25hbWU6InBhY2siLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbdS5UZXh0dXJlVHlwZS51bnBhY2tlZFJldmVyc2VkXX07dC5jcmVhdGVQYWNrUHJvZ3JhbUluZm9Mb2FkZXI9KGYsZCk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxwKSx7Z2V0OigpPT4oKGwsbik9Pntjb25zdCBlPSgwLG8uZ2V0R2xzbCkobC5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLGk9bi5kaW1zLHM9aS5sZW5ndGgsbT1uLmRpbXMubGVuZ3RoLGc9KDAsaC5nZXRDb29yZHNEYXRhVHlwZSkobSksXz0oMCxhLmdldENoYW5uZWxzKSgicmMiLG0pLGI9KHk9bSxUPV8sdz1pW2kubGVuZ3RoLTJdLHg9aVtpLmxlbmd0aC0xXSx5PT09MHx8eT09PTE/IiI6YAogICAgaW50IHIgPSAke1RbeS0yXX07CiAgICBpbnQgYyA9ICR7VFt5LTFdfTsKICAgIGludCBycDEgPSAke1RbeS0yXX0gKyAxOwogICAgaW50IGNwMSA9ICR7VFt5LTFdfSArIDE7CiAgICBib29sIHJFZGdlID0gcnAxID49ICR7eH07CiAgICBib29sIGNFZGdlID0gY3AxID49ICR7d307CiAgICBgKTt2YXIgeSxULHcseDtsZXQgRTtFPXM9PT0wP1sxLDFdOnM9PT0xP1tpWzBdLDFdOltpW20tMV0saVttLTJdXTtjb25zdCBQPWZ1bmN0aW9uKCQseixCKXtpZigkPT09MClyZXR1cm4iZmFsc2UiO2lmKCQ9PT0xKXJldHVybmByYyA+ICR7elswXX1gO2xldCBOPSIiO2ZvcihsZXQgRD0kLTI7RDwkO0QrKylOKz1gJHtCW0RdfSA+PSAke3pbRC0kKzJdfWAsRDwkLTEmJihOKz0ifHwiKTtyZXR1cm4gTn0obSxFLF8pLHY9ZnVuY3Rpb24oJCx6KXtjb25zdCBCPSQubGVuZ3RoO2lmKEI9PT0wKXJldHVybiJnZXRBKCksIDAsIDAsIDAiO2lmKEI9PT0xKXJldHVybmBnZXRBKHJjKSwKICAgICAgICAgICAgcmMgKyAxID49ICR7JFswXX0gPyAwLiA6IGdldEEocmMgKyAxKSwKICAgICAgICAgICAgMCwgMGA7bGV0IE49IiI7aWYoQj4yKWZvcihsZXQgRD0wO0Q8Qi0yOysrRClOKz1gJHt6W0RdfSxgO3JldHVybmBnZXRBKCR7Tn1yLCBjKSwKICAgICAgICAgIHJFZGdlID8gMC4gOiBnZXRBKCR7Tn1ycDEsIGMpLAogICAgICAgICAgY0VkZ2UgPyAwLiA6IGdldEEoJHtOfXIsIGNwMSksCiAgICAgICAgICByRWRnZSB8fCBjRWRnZSA/IDAuIDogZ2V0QSgke059cnAxLCBjcDEpYH0oaSxfKSxNPWAKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAke2d9IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7CgogICAgICAgICAgaWYoJHtQfSkgewogICAgICAgICAgICAke2Uub3V0cHV0fSA9IHZlYzQoMCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAke2J9CgogICAgICAgICAgICAke2Uub3V0cHV0fSA9IHZlYzQoJHt2fSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scCkse2hhc01haW46ITAsb3V0cHV0OntkaW1zOm4uZGltcyx0eXBlOm4udHlwZSx0ZXh0dXJlVHlwZTp1LlRleHR1cmVUeXBlLnBhY2tlZH0sc2hhZGVyU291cmNlOk19KX0pKGYsZCl9KX0sMjgyNzooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQudW5wYWNrRnJvbUNoYW5uZWw9dC5nZXRDaGFubmVscz10LmdldFZlY0NoYW5uZWxzPXZvaWQgMDtjb25zdCBvPXIoOTM5MCk7ZnVuY3Rpb24gdShoLGEpe3JldHVybigwLG8uZ2V0R2xDaGFubmVscykoYSkubWFwKHA9PmAke2h9LiR7cH1gKX10LmdldFZlY0NoYW5uZWxzPXUsdC5nZXRDaGFubmVscz1mdW5jdGlvbihoLGEpe3JldHVybiBhPT09MT9baF06dShoLGEpfSx0LnVucGFja0Zyb21DaGFubmVsPWZ1bmN0aW9uKCl7cmV0dXJuYAogICAgZmxvYXQgZ2V0Q2hhbm5lbCh2ZWM0IGZyYWcsIGludCBkaW0pIHsKICAgICAgaW50IG1vZENvb3JkID0gaW1vZChkaW0sIDIpOwogICAgICByZXR1cm4gbW9kQ29vcmQgPT0gMCA/IGZyYWcuciA6IGZyYWcuZzsKICAgIH0KCiAgICBmbG9hdCBnZXRDaGFubmVsKHZlYzQgZnJhZywgdmVjMiBpbm5lckRpbXMpIHsKICAgICAgdmVjMiBtb2RDb29yZCA9IG1vZChpbm5lckRpbXMsIDIuKTsKICAgICAgcmV0dXJuIG1vZENvb3JkLnggPT0gMC4gPwogICAgICAgIChtb2RDb29yZC55ID09IDAuID8gZnJhZy5yIDogZnJhZy5nKSA6CiAgICAgICAgKG1vZENvb3JkLnkgPT0gMC4gPyBmcmFnLmIgOiBmcmFnLmEpOwogICAgfQogIGB9fSwyODcwOihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZVBhZEF0dHJpYnV0ZXNWMTE9dC5wYWRWMTE9dC5wYXJzZVBhZEF0dHJpYnV0ZXNWMj10LnBhZFYyPXZvaWQgMDtjb25zdCBvPXIoMjQ2KSx1PXIoMjUxNyksaD1yKDUwNjApLGE9cigyMDM5KSxwPXtuYW1lOiJQYWQiLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbYS5UZXh0dXJlVHlwZS51bnBhY2tlZF19O3QucGFkVjI9KGcsXyxiKT0+KGwoXyksW2cucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxwKSx7Y2FjaGVIaW50OmIuY2FjaGVLZXksZ2V0OigpPT5kKGcsX1swXSxiKX0pLF8pXSksdC5wYXJzZVBhZEF0dHJpYnV0ZXNWMj1nPT57Y29uc3QgXz1nLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJtb2RlIiwiY29uc3RhbnQiKSxiPWcuYXR0cmlidXRlcy5nZXRGbG9hdCgidmFsdWUiLDApLHk9Zy5hdHRyaWJ1dGVzLmdldEludHMoInBhZHMiKTtyZXR1cm4oMCxvLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21vZGU6Xyx2YWx1ZTpiLHBhZHM6eX0pfSx0LnBhZFYxMT0oZyxfLGIpPT57bihfKTtjb25zdCB5PWYoZyxfLGIpO3JldHVybigwLHQucGFkVjIpKGcsW19bMF1dLHkpfSx0LnBhcnNlUGFkQXR0cmlidXRlc1YxMT1nPT5nLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJtb2RlIiwiY29uc3RhbnQiKTtjb25zdCBmPShnLF8sYik9PntpZighZy5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIoX1sxXS5kYXRhSWQpfHxfLmxlbmd0aD49MyYmIWcuc2Vzc2lvbi5pc0luaXRpYWxpemVyKF9bMl0uZGF0YUlkKSl0aHJvdyBuZXcgRXJyb3IoImR5bmFtaWMgcGFkIGF0dHJpYnV0ZXMgYXJlIG5vdCBhbGxvd2VkIik7Y29uc3QgeT1BcnJheS5mcm9tKF9bMV0uaW50ZWdlckRhdGEpLFQ9Xy5sZW5ndGg+PTM/X1syXS5mbG9hdERhdGFbMF06MDtyZXR1cm4oMCxvLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21vZGU6YixwYWRzOnksdmFsdWU6VH0pfSxkPShnLF8sYik9Pntjb25zdCB5PXUuU2hhcGVVdGlsLnBhZFNoYXBlKF8uZGltcy5zbGljZSgpLGIucGFkcyksVD15Lmxlbmd0aCx3PWAKICAgICAgJHtlKGcsXyxiKX0KICAgICAgZmxvYXQgcHJvY2VzcyhpbnRbJHtUfV0gaW5kaWNlcykgewogICAgICAgICAgcmV0dXJuIHBhZEEoaW5kaWNlcyk7CiAgICAgIH1gO3JldHVybntuYW1lOiJQYWQiLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbYS5UZXh0dXJlVHlwZS51bnBhY2tlZF0sb3V0cHV0OntkaW1zOnksdHlwZTpfLnR5cGUsdGV4dHVyZVR5cGU6YS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnd9fSxsPWc9PntpZighZ3x8Zy5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigiUGFkIHJlcXVpcmVzIDEgaW5wdXQiKTtpZihnWzBdLnR5cGUhPT0iZmxvYXQzMiImJmdbMF0udHlwZSE9PSJmbG9hdDY0Iil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0sbj1nPT57aWYoIWd8fGcubGVuZ3RoIT09MiYmZy5sZW5ndGghPT0zKXRocm93IG5ldyBFcnJvcigiUGFkIHJlcXVpcmVzIDIgb3IgMyBpbnB1dHMiKTtpZihnWzFdLnR5cGUhPT0iaW50MzIiKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGcubGVuZ3RoPj0zJiZnWzJdLnR5cGU9PT0ic3RyaW5nIil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0sZT0oZyxfLGIpPT57Y29uc3QgeT0oMCxoLmdldEdsc2wpKGcuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSxbVCx3XT1nLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodChfLmRpbXMsYS5UZXh0dXJlVHlwZS51bnBhY2tlZCkseD11LlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyhfLmRpbXMpO3N3aXRjaChiLm1vZGUpe2Nhc2UiY29uc3RhbnQiOnJldHVybiBpKHksXy5kaW1zLHgsVCx3LGIucGFkcyxiLnZhbHVlKTtjYXNlInJlZmxlY3QiOnJldHVybiBzKHksXy5kaW1zLHgsVCx3LGIucGFkcyk7Y2FzZSJlZGdlIjpyZXR1cm4gbSh5LF8uZGltcyx4LFQsdyxiLnBhZHMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG1vZGUiKX19LGk9KGcsXyxiLHksVCx3LHgpPT57Y29uc3QgRT1fLmxlbmd0aDtsZXQgUD0iIjtmb3IobGV0IHY9RS0xO3Y+PTA7LS12KVArPWAKICAgICAgICBrID0gbVske3Z9XSAtICR7d1t2XX07CiAgICAgICAgaWYgKGsgPCAwKSAgcmV0dXJuIGNvbnN0YW50OwogICAgICAgIGlmIChrID49ICR7X1t2XX0pIHJldHVybiBjb25zdGFudDsKICAgICAgICBvZmZzZXQgKz0gayAqICR7Ylt2XX07CiAgICAgICAgYDtyZXR1cm5gCiAgICAgIGZsb2F0IHBhZEEoaW50IG1bJHtFfV0pIHsKICAgICAgICBjb25zdCBmbG9hdCBjb25zdGFudCA9IGZsb2F0KCR7eH0pOwogICAgICAgIGludCBvZmZzZXQgPSAwOwogICAgICAgIGludCBrID0gMDsKICAgICAgICAke1B9CiAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhvZmZzZXQsICR7eX0sICR7VH0pOwogICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7Zy50ZXh0dXJlMkR9KEEsIGNvb3JkcykpOwogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICBgfSxzPShnLF8sYix5LFQsdyk9Pntjb25zdCB4PV8ubGVuZ3RoO2xldCBFPSIiO2ZvcihsZXQgUD14LTE7UD49MDstLVApRSs9YAogICAgICAgIGsgPSBtWyR7UH1dIC0gJHt3W1BdfTsKICAgICAgICBpZiAoayA8IDApIHsgayA9IC1rOyB9CiAgICAgICAgewogICAgICAgICAgY29uc3QgaW50IF8ybl8xID0gJHsyKihfW1BdLTEpfTsKICAgICAgICAgIGsgPSBpbnQoIG1vZCggZmxvYXQoayksIGZsb2F0KF8ybl8xKSApICkgOwogICAgICAgICAgaWYoayA+PSAke19bUF19KSB7IGsgPSBfMm5fMSAtIGs7IH0KICAgICAgICB9CiAgICAgICAgb2Zmc2V0ICs9IGsgKiAke2JbUF19OwogICAgICAgIGA7cmV0dXJuYAogICAgICBmbG9hdCBwYWRBKGludCBtWyR7eH1dKSB7CiAgICAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgICAgaW50IGsgPSAwOwogICAgICAgICR7RX0KICAgICAgICB2ZWMyIGNvb3JkcyA9IG9mZnNldFRvQ29vcmRzKG9mZnNldCwgJHt5fSwgJHtUfSk7CiAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRDb2xvckFzRmxvYXQoJHtnLnRleHR1cmUyRH0oQSwgY29vcmRzKSk7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICAgIGB9LG09KGcsXyxiLHksVCx3KT0+e2NvbnN0IHg9Xy5sZW5ndGg7bGV0IEU9IiI7Zm9yKGxldCBQPXgtMTtQPj0wOy0tUClFKz1gCiAgICAgICAgayA9IG1bJHtQfV0gLSAke3dbUF19OwogICAgICAgIGlmIChrIDwgMCkgIGsgPSAwOwogICAgICAgIGlmIChrID49ICR7X1tQXX0pIGsgPSAke19bUF0tMX07CiAgICAgICAgb2Zmc2V0ICs9IGsgKiAke2JbUF19OwogICAgICBgO3JldHVybmAKICAgICAgZmxvYXQgcGFkQShpbnQgbVske3h9XSkgewogICAgICAgIGludCBvZmZzZXQgPSAwOwogICAgICAgIGludCBrID0gMDsKICAgICAgICAke0V9CiAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhvZmZzZXQsICR7eX0sICR7VH0pOwogICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7Zy50ZXh0dXJlMkR9KEEsIGNvb3JkcykpOwogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICBgfX0sMjE0MzooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2xvYmFsTWF4UG9vbD10LnBhcnNlTWF4UG9vbEF0dHJpYnV0ZXM9dC5tYXhQb29sPXQucGFyc2VHbG9iYWxBdmVyYWdlUG9vbEF0dHJpYnV0ZXM9dC5nbG9iYWxBdmVyYWdlUG9vbD10LnBhcnNlQXZlcmFnZVBvb2xBdHRyaWJ1dGVzPXQuYXZlcmFnZVBvb2w9dm9pZCAwO2NvbnN0IG89cigyNDYpLHU9cigyNTE3KSxoPXIoMjAzOSk7dC5hdmVyYWdlUG9vbD0obSxnLF8pPT57bihnKTtjb25zdCBiPXtuYW1lOiJBdmVyYWdlUG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltoLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6Xy5jYWNoZUtleX07cmV0dXJuW20ucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxiKSx7Z2V0OigpPT5hKGcsYiwhMSxfKX0pLGcpXX0sdC5wYXJzZUF2ZXJhZ2VQb29sQXR0cmlidXRlcz1tPT57Y29uc3QgZz1tLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLF89bS5hdHRyaWJ1dGVzLmdldEludCgiY2VpbF9tb2RlIiwwKSxiPW0uYXR0cmlidXRlcy5nZXRJbnQoImNvdW50X2luY2x1ZGVfcGFkIiwwKSE9PTAseT1tLmF0dHJpYnV0ZXMuZ2V0SW50cygia2VybmVsX3NoYXBlIiksVD1tLmF0dHJpYnV0ZXMuZ2V0SW50cygic3RyaWRlcyIsW10pLHc9bS5hdHRyaWJ1dGVzLmdldEludHMoInBhZHMiLFtdKTtpZihfIT09MCl0aHJvdyBuZXcgRXJyb3IoInVzaW5nIGNlaWwoKSBpbiBzaGFwZSBjb21wdXRhdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgQXZlcmFnZVBvb2wiKTtyZXR1cm4oMCxvLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F1dG9QYWQ6ZyxjZWlsTW9kZTpfLGNvdW50SW5jbHVkZVBhZDpiLGtlcm5lbFNoYXBlOnksc3RyaWRlczpULHBhZHM6d30pfTtjb25zdCBhPShtLGcsXyxiKT0+e2NvbnN0W3ksVF09ZihtLGIsXyksdz11LlNoYXBlVXRpbC5zaXplKHkua2VybmVsU2hhcGUpO2xldCB4PSIiO3kuY291bnRJbmNsdWRlUGFkP3grPWB2YWx1ZSAvPSBmbG9hdCgke3d9KTtgOngrPWB2YWx1ZSAvPSBmbG9hdCgke3d9IC0gcGFkKTtgO2NvbnN0IEU9YAogICAgICAgICR7ZShtWzBdLmRpbXMseSwidmFsdWUgKz0gX1goeCk7Iix4LCIwLjAiKX0KICAgICAgYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGcpLHtvdXRwdXQ6e2RpbXM6VCx0eXBlOm1bMF0udHlwZSx0ZXh0dXJlVHlwZTpoLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6RX0pfTt0Lmdsb2JhbEF2ZXJhZ2VQb29sPShtLGcsXyk9PntuKGcpO2NvbnN0IGI9e25hbWU6Ikdsb2JhbEF2ZXJhZ2VQb29sIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W2guVGV4dHVyZVR5cGUudW5wYWNrZWRdLGNhY2hlSGludDpgJHtfLmNvdW50SW5jbHVkZVBhZH1gfTtyZXR1cm5bbS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGIpLHtnZXQ6KCk9PmEoZyxiLCEwLF8pfSksZyldfSx0LnBhcnNlR2xvYmFsQXZlcmFnZVBvb2xBdHRyaWJ1dGVzPW09Pntjb25zdCBnPW0uYXR0cmlidXRlcy5nZXRJbnQoImNvdW50X2luY2x1ZGVfcGFkIiwwKSE9PTA7cmV0dXJuKDAsby5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHthdXRvUGFkOiIiLGNlaWxNb2RlOjAsY291bnRJbmNsdWRlUGFkOmcsa2VybmVsU2hhcGU6W10sc3RyaWRlczpbXSxwYWRzOltdfSl9LHQubWF4UG9vbD0obSxnLF8pPT57bihnKTtjb25zdCBiPXtuYW1lOiJNYXhQb29sIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W2guVGV4dHVyZVR5cGUudW5wYWNrZWRdLGNhY2hlSGludDpfLmNhY2hlS2V5fTtyZXR1cm5bbS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGIpLHtnZXQ6KCk9PnAoZyxiLCExLF8pfSksZyldfSx0LnBhcnNlTWF4UG9vbEF0dHJpYnV0ZXM9bT0+e2NvbnN0IGc9bS5hdHRyaWJ1dGVzLmdldFN0cmluZygiYXV0b19wYWQiLCJOT1RTRVQiKSxfPW0uYXR0cmlidXRlcy5nZXRJbnQoImNlaWxfbW9kZSIsMCksYj1tLmF0dHJpYnV0ZXMuZ2V0SW50cygia2VybmVsX3NoYXBlIikseT1tLmF0dHJpYnV0ZXMuZ2V0SW50cygic3RyaWRlcyIsW10pLFQ9bS5hdHRyaWJ1dGVzLmdldEludHMoInBhZHMiLFtdKSx3PW0uYXR0cmlidXRlcy5nZXRJbnQoInN0b3JhZ2Vfb3JkZXIiLDApLHg9bS5hdHRyaWJ1dGVzLmdldEludHMoImRpbGF0aW9ucyIsW10pO2lmKHchPT0wKXRocm93IG5ldyBFcnJvcigiY29sdW1uIG1ham9yIHN0b3JhZ2Ugb3JkZXIgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE1heFBvb2wiKTtpZihfIT09MCl0aHJvdyBuZXcgRXJyb3IoInVzaW5nIGNlaWwoKSBpbiBzaGFwZSBjb21wdXRhdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTWF4UG9vbCIpO3JldHVybigwLG8uY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7YXV0b1BhZDpnLGNlaWxNb2RlOl8sY291bnRJbmNsdWRlUGFkOiExLGtlcm5lbFNoYXBlOmIsc3RyaWRlczp5LHBhZHM6VCxzdG9yYWdlT3JkZXI6dyxkaWxhdGlvbnM6eH0pfTtjb25zdCBwPShtLGcsXyxiKT0+e2NvbnN0W3ksVF09ZihtLGIsXyksdz1gCiAgICAgICR7ZShtWzBdLmRpbXMseSxgCiAgICAgIHZhbHVlID0gbWF4KF9YKHgpLCB2YWx1ZSk7CiAgICBgLCIiLCItMWU1Iil9CiAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZykse291dHB1dDp7ZGltczpULHR5cGU6bVswXS50eXBlLHRleHR1cmVUeXBlOmguVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTp3fSl9LGY9KG0sZyxfKT0+e2NvbnN0IGI9bVswXS5kaW1zLnNsaWNlKCkseT1PYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChnLCJkaWxhdGlvbnMiKSxUPWcua2VybmVsU2hhcGUuc2xpY2UoKSx3PWcuc3RyaWRlcy5zbGljZSgpLHg9eT9nLmRpbGF0aW9ucy5zbGljZSgpOltdLEU9Zy5wYWRzLnNsaWNlKCk7dS5Qb29sQ29udlV0aWwuYWRqdXN0UG9vbEF0dHJpYnV0ZXMoXyxiLFQsdyx4LEUpO2NvbnN0IFA9dS5Qb29sQ29udlV0aWwuY29tcHV0ZVBvb2xPdXRwdXRTaGFwZShfLGIsdyx4LFQsRSxnLmF1dG9QYWQpLHY9T2JqZWN0LmFzc2lnbih7fSxnKTtyZXR1cm4geT9PYmplY3QuYXNzaWduKHYse2tlcm5lbFNoYXBlOlQsc3RyaWRlczp3LHBhZHM6RSxkaWxhdGlvbnM6eCxjYWNoZUtleTpnLmNhY2hlS2V5fSk6T2JqZWN0LmFzc2lnbih2LHtrZXJuZWxTaGFwZTpULHN0cmlkZXM6dyxwYWRzOkUsY2FjaGVLZXk6Zy5jYWNoZUtleX0pLFt2LFBdfSxkPXthdXRvUGFkOiIiLGNlaWxNb2RlOjAsY291bnRJbmNsdWRlUGFkOiExLGtlcm5lbFNoYXBlOltdLHN0cmlkZXM6W10scGFkczpbXSxzdG9yYWdlT3JkZXI6MCxkaWxhdGlvbnM6W10sY2FjaGVLZXk6IiJ9LGw9e25hbWU6Ikdsb2JhbE1heFBvb2wiLGlucHV0TmFtZXM6WyJYIl0saW5wdXRUeXBlczpbaC5UZXh0dXJlVHlwZS51bnBhY2tlZF19O3QuZ2xvYmFsTWF4UG9vbD0obSxnKT0+KG4oZyksW20ucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxsKSx7Z2V0OigpPT5wKGcsbCwhMCxkKX0pLGcpXSk7Y29uc3Qgbj1tPT57aWYoIW18fG0ubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIlBvb2wgb3BzIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYobVswXS50eXBlIT09ImZsb2F0MzIiJiZtWzBdLnR5cGUhPT0iZmxvYXQ2NCIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIil9LGU9KG0sZyxfLGIseSk9Pntjb25zdCBUPW0ubGVuZ3RoO2lmKGcua2VybmVsU2hhcGUubGVuZ3RoPD0yKXtjb25zdCB3PWcua2VybmVsU2hhcGVbZy5rZXJuZWxTaGFwZS5sZW5ndGgtMV0seD1nLnN0cmlkZXNbZy5zdHJpZGVzLmxlbmd0aC0xXSxFPWcucGFkc1tnLnBhZHMubGVuZ3RoLzItMV0sUD1nLnBhZHNbZy5wYWRzLmxlbmd0aC0xXSx2PW1bVC0xXTtsZXQgTT0iIiwkPSIiLHo9IiI7aWYoTT1FK1AhPT0wP2AKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt3fTsgaSsrKSB7CiAgICAgICAgICAgIHhbJHtUfSAtIDFdID0gaW5kaWNlc1ske1R9IC0gMV0gKiAke3h9IC0gJHtFfSArIGk7CiAgICAgICAgICAgIGlmICh4WyR7VH0gLSAxXSA8IDAgfHwgeFske1R9IC0gMV0gPj0gJHt2fSkgewogICAgICAgICAgICAgIHBhZCsrOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR7X30KICAgICAgICAgIH1gOmAKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt3fTsgaSsrKSB7CiAgICAgICAgICAgIHhbJHtUfSAtIDFdID0gaW5kaWNlc1ske1R9IC0gMV0gKiAke3h9IC0gJHtFfSArIGk7CiAgICAgICAgICAgICR7X30KICAgICAgICAgIH1gLGcua2VybmVsU2hhcGUubGVuZ3RoPT09Mil7Y29uc3QgQj1nLmtlcm5lbFNoYXBlW2cua2VybmVsU2hhcGUubGVuZ3RoLTJdLE49Zy5zdHJpZGVzW2cuc3RyaWRlcy5sZW5ndGgtMl0sRD1nLnBhZHNbZy5wYWRzLmxlbmd0aC8yLTJdLEk9Zy5wYWRzW2cucGFkcy5sZW5ndGgtMl0sRj1tW1QtMl07JD1EK0khPT0wP2AKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAke0J9OyBqKyspIHsKICAgICAgICAgICAgICB4WyR7VH0gLSAyXSA9IGluZGljZXNbJHtUfSAtIDJdICogJHtOfSAtICR7RH0gKyBqOwogICAgICAgICAgICAgIGlmICh4WyR7VH0gLSAyXSA8IDAgfHwgeFske1R9IC0gMl0gPj0gJHtGfSkgewogICAgICAgICAgICAgICAgcGFkKz0gJHt3fTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgIGA6YAogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8ICR7Qn07IGorKykgewogICAgICAgICAgICAgIHhbJHtUfSAtIDJdID0gaW5kaWNlc1ske1R9IC0gMl0gKiAke059IC0gJHtEfSArIGo7CiAgICAgICAgICAgIGAsej1gCiAgICAgICAgICB9CiAgICAgICAgYH1yZXR1cm5gCiAgICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske1R9XSkgewogICAgICAgICAgaW50IHhbJHtUfV07CiAgICAgICAgICBjb3B5VmVjKGluZGljZXMsIHgpOwoKICAgICAgICAgIGZsb2F0IHZhbHVlID0gJHt5fTsKICAgICAgICAgIGludCBwYWQgPSAwOwogICAgICAgICAgJHskfQogICAgICAgICAgJHtNfQogICAgICAgICAgJHt6fQogICAgICAgICAgJHtifQogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgYH17Y29uc3Qgdz11LlNoYXBlVXRpbC5zaXplKGcua2VybmVsU2hhcGUpLHg9dS5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXMoZy5rZXJuZWxTaGFwZSksRT14Lmxlbmd0aCxQPWcucGFkcy5sZW5ndGgsdj1zKEUpLE09aShtLCJpbnB1dERpbXMiKSwkPWkoZy5wYWRzLCJwYWRzIiksej1pKHgsImtlcm5lbFN0cmlkZXMiKSxCPWkoZy5zdHJpZGVzLCJzdHJpZGVzIik7bGV0IE49IiI7cmV0dXJuIE49Zy5wYWRzLnJlZHVjZSgoRCxJKT0+RCtJKT9gCiAgICAgICAgICAgIGlmICh4W2pdID49IGlucHV0RGltc1tqXSB8fCB4W2pdIDwgMCkgewogICAgICAgICAgICAgIHBhZCsrOwogICAgICAgICAgICAgIGlzUGFkID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCFpc1BhZCkgewogICAgICAgICAgICAke199CiAgICAgICAgICB9YDpgCiAgICAgICAgICB9CiAgICAgICAgICAke199CiAgICAgICAgYCxgCiAgICAgICAgJHt2fQogICAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtUfV0pIHsKICAgICAgICAgIGludCB4WyR7VH1dOwogICAgICAgICAgY29weVZlYyhpbmRpY2VzLCB4KTsKICAgICAgICAgIGludCBvZmZzZXRbJHtFfV07CiAgICAgICAgICBpbnQgcGFkc1ske1B9XTsKICAgICAgICAgIGludCBpbnB1dERpbXNbJHtUfV07CiAgICAgICAgICBpbnQga2VybmVsU3RyaWRlc1ske0V9XTsKICAgICAgICAgIGludCBzdHJpZGVzWyR7RX1dOwogICAgICAgICAgJHskfQogICAgICAgICAgJHtNfQogICAgICAgICAgJHtCfQogICAgICAgICAgJHt6fQoKICAgICAgICAgIGZsb2F0IHZhbHVlID0gJHt5fTsKICAgICAgICAgIGludCBwYWQgPSAwOwogICAgICAgICAgYm9vbCBpc1BhZCA9IGZhbHNlOwogICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke3d9OyBpKyspIHsKICAgICAgICAgICAgb2Zmc2V0VG9JbmRpY2VzKGksIGtlcm5lbFN0cmlkZXMsIG9mZnNldCk7CiAgICAgICAgICAgIGlzUGFkID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAke1R9IC0gJHtFfTsgaiA8ICR7VH07IGorKykgewogICAgICAgICAgICAgIHhbal0gPSBpbmRpY2VzW2pdICogc3RyaWRlc1tqIC0gJHtUfSArICR7RX1dCiAgICAgICAgICAgICAgICArIG9mZnNldFtqIC0gJHtUfSArICR7RX1dIC0gcGFkc1tqIC0gMl07CiAgICAgICAgICAgICAgJHtOfQogICAgICAgICAgfQogICAgICAgICAgJHtifQoKICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgIGB9fSxpPShtLGcpPT57bGV0IF89IiI7Zm9yKGxldCBiPTA7YjxtLmxlbmd0aDtiKyspXys9YAogICAgICAke2d9WyR7Yn1dID0gJHttW2JdfTsKICAgIGA7cmV0dXJuIF99LHM9bT0+YAogIHZvaWQgb2Zmc2V0VG9JbmRpY2VzKGludCBvZmZzZXQsIGludFske219XSBzdHJpZGVzLCBvdXQgaW50WyR7bX1dIGluZGljZXMpIHsKICAgIGlmICgke219ID09IDApIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke219IC0gMTsgKytpKSB7CiAgICAgIGluZGljZXNbaV0gPSBvZmZzZXQgLyBzdHJpZGVzW2ldOwogICAgICBvZmZzZXQgLT0gaW5kaWNlc1tpXSAqIHN0cmlkZXNbaV07CiAgICB9CiAgICBpbmRpY2VzWyR7bX0gLSAxXSA9IG9mZnNldDsKICB9YH0sNDkzOTooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucmVkdWNlTG9nU3VtU3F1YXJlPXQucmVkdWNlTG9nU3VtPXQucmVkdWNlUHJvZD10LnJlZHVjZU1pbj10LnJlZHVjZU1heD10LnJlZHVjZU1lYW49dC5yZWR1Y2VTdW09dC5wYXJzZVJlZHVjZUF0dHJpYnV0ZXM9dm9pZCAwO2NvbnN0IG89cigyNDYpLHU9cig3ODIpLGg9cigyNTE3KSxhPXIoMjAzOSkscD0obCxuLGUsaSxzKT0+e2Qobik7Y29uc3QgbT17bmFtZTppLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbYS5UZXh0dXJlVHlwZS51bnBhY2tlZF19O3JldHVybltsLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbSkse2NhY2hlSGludDplLmNhY2hlS2V5LGdldDooKT0+ZihsLG4sZSxpLHMsbSl9KSxuKV19O3QucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzPWw9Pntjb25zdCBuPWwuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIixbXSksZT1sLmF0dHJpYnV0ZXMuZ2V0SW50KCJrZWVwZGltcyIsMSk9PT0xO3JldHVybigwLG8uY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7YXhlczpuLGtlZXBEaW1zOmV9KX07Y29uc3QgZj0obCxuLGUsaSxzLG0pPT57Y29uc3QgZz1bXSxfPW5bMF0uZGltcy5sZW5ndGh8fDEsYj1bXSx5PWguU2hhcGVVdGlsLm5vcm1hbGl6ZUF4ZXMoZS5heGVzLG5bMF0uZGltcy5sZW5ndGgpLFQ9cyhuLHkpO2xldCB3PVRbMV07Zm9yKGxldCBFPTA7RTxuWzBdLmRpbXMubGVuZ3RoO0UrKyl5LmluZGV4T2YoRSk+PTB8fHkubGVuZ3RoPT09MD8oZS5rZWVwRGltcyYmZy5wdXNoKDEpLHc9YAogICAgICAgICAgZm9yKGludCBqJHtFfSA9IDA7IGoke0V9IDwgJHtuWzBdLmRpbXNbRV19OyBqJHtFfSsrKSB7CiAgICAgICAgICAgIGlucHV0SWR4WyR7RX1dID0gaiR7RX07CiAgICAgICAgICAgICR7d30KICAgICAgICAgIH1gKTooYi5wdXNoKGBpbnB1dElkeFske0V9XSA9IG91dHB1dElkeFske2cubGVuZ3RofV07YCksZy5wdXNoKG5bMF0uZGltc1tFXSkpO2NvbnN0IHg9YAogICAgICBmbG9hdCBwcm9jZXNzKGludCBvdXRwdXRJZHhbJHtnLmxlbmd0aHx8MX1dKSB7CiAgICAgICAgZmxvYXQgdmFsdWU7ICAgICAgICAgICAgICAgICAvLyBmaW5hbCByZXN1bHQKICAgICAgICBpbnQgaW5wdXRJZHhbJHtffV07ICAgICAgLy8gYWRkcmVzc2luZyBpbnB1dCBkYXRhCiAgICAgICAgJHtiLmpvaW4oYApgKX0KICAgICAgICAke1RbMF19ICAgICAgIC8vIGluaXQgb3BzIGZvciByZWR1Y2UgbWF4L21pbgogICAgICAgICR7d30KICAgICAgICAke1RbMl19ICAgICAgIC8vIGZpbmFsIGNvbXB1dGF0aW9uIGZvciByZWR1Y2UgbWVhbgogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxtKSx7b3V0cHV0OntkaW1zOmcsdHlwZTpuWzBdLnR5cGUsdGV4dHVyZVR5cGU6YS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnh9KX0sZD1sPT57aWYoIWx8fGwubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIlJlZHVjZSBvcCByZXF1aXJlcyAxIGlucHV0LiIpO2lmKHUuTlVNQkVSX1RZUEVTLmluZGV4T2YobFswXS50eXBlKT09PS0xKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt0LnJlZHVjZVN1bT0obCxuLGUpPT5wKGwsbixlLCJSZWR1Y2VTdW0iLCgpPT5bInZhbHVlID0gMC4wOyIsInZhbHVlICs9IF9BKGlucHV0SWR4KTsiLCIiXSksdC5yZWR1Y2VNZWFuPShsLG4sZSk9PnAobCxuLGUsIlJlZHVjZU1lYW4iLChpLHMpPT57bGV0IG09MTtmb3IobGV0IGc9MDtnPGlbMF0uZGltcy5sZW5ndGg7ZysrKShzLmluZGV4T2YoZyk+PTB8fHMubGVuZ3RoPT09MCkmJihtKj1pWzBdLmRpbXNbZ10pO3JldHVyblsidmFsdWUgPSAwLjA7IiwidmFsdWUgKz0gX0EoaW5wdXRJZHgpOyIsYHZhbHVlIC89ICR7bX0uO2BdfSksdC5yZWR1Y2VNYXg9KGwsbixlKT0+cChsLG4sZSwiUmVkdWNlTWF4IiwoaSxzKT0+e2NvbnN0IG09W107Zm9yKGxldCBnPTA7ZzxpWzBdLmRpbXMubGVuZ3RoO2crKykocy5pbmRleE9mKGcpPj0wfHxzLmxlbmd0aD09PTApJiZtLnB1c2goYGlucHV0SWR4WyR7Z31dID0gMDtgKTtyZXR1cm5bYCR7bS5qb2luKGAKYCl9CnZhbHVlID0gX0EoaW5wdXRJZHgpO2AsInZhbHVlID0gbWF4KHZhbHVlLCBfQShpbnB1dElkeCkpOyIsIiJdfSksdC5yZWR1Y2VNaW49KGwsbixlKT0+cChsLG4sZSwiUmVkdWNlTWluIiwoaSxzKT0+e2NvbnN0IG09W107Zm9yKGxldCBnPTA7ZzxpWzBdLmRpbXMubGVuZ3RoO2crKykocy5pbmRleE9mKGcpPj0wfHxzLmxlbmd0aD09PTApJiZtLnB1c2goYGlucHV0SWR4WyR7Z31dID0gMDtgKTtyZXR1cm5bYCR7bS5qb2luKGAKYCl9CnZhbHVlID0gX0EoaW5wdXRJZHgpO2AsInZhbHVlID0gbWluKHZhbHVlLCBfQShpbnB1dElkeCkpOyIsIiJdfSksdC5yZWR1Y2VQcm9kPShsLG4sZSk9PnAobCxuLGUsIlJlZHVjZVByb2QiLCgpPT5bInZhbHVlID0gMS4wOyIsInZhbHVlICo9IF9BKGlucHV0SWR4KTsiLCIiXSksdC5yZWR1Y2VMb2dTdW09KGwsbixlKT0+cChsLG4sZSwiUmVkdWNlTG9nU3VtIiwoKT0+WyJ2YWx1ZSA9IDAuMDsiLCJ2YWx1ZSArPSBfQShpbnB1dElkeCk7IiwidmFsdWUgPSBsb2codmFsdWUpOyJdKSx0LnJlZHVjZUxvZ1N1bVNxdWFyZT0obCxuLGUpPT5wKGwsbixlLCJSZWR1Y2VMb2dTdW1TcXVhcmUiLCgpPT5bImZsb2F0IHQ7IHZhbHVlID0gMC4wOyIsInQgPSBfQShpbnB1dElkeCk7IHZhbHVlICs9IHQgKiB0OyIsIiJdKX0sNzAxOTooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuaXNSZXNoYXBlQ2hlYXA9dC5wcm9jZXNzRGltczNEPXQuY3JlYXRlUGFja2VkUmVzaGFwZTNEUHJvZ3JhbUluZm9Mb2FkZXI9dm9pZCAwO2NvbnN0IG89cigyNTE3KSx1PXIoNTA2MCksaD1yKDIwMzkpLGE9cigyODI3KTt0LmNyZWF0ZVBhY2tlZFJlc2hhcGUzRFByb2dyYW1JbmZvTG9hZGVyPShwLGYsZCk9Pntjb25zdCBsPShuPT4oe25hbWU6IlJlc2hhcGUgKHBhY2tlZCkiLGlucHV0VHlwZXM6W2guVGV4dHVyZVR5cGUucGFja2VkXSxpbnB1dE5hbWVzOlsiQSJdLGNhY2hlSGludDpgJHtufWB9KSkoZCk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxsKSx7Z2V0OigpPT4oKG4sZSxpLHMpPT57Y29uc3QgbT1lLmRpbXMsZz1zO2xldCBfPSIiO2ZvcihsZXQgVD0wO1Q8NDtUKyspe2xldCB3PSIiO3N3aXRjaChUKXtjYXNlIDA6dz0ib3V0cHV0Q29vcmRzID0gcmM7IjticmVhaztjYXNlIDE6dz0ib3V0cHV0Q29vcmRzID0gaXZlYzMocmMueCwgcmMueSsxLCByYy56KTsiO2JyZWFrO2Nhc2UgMjp3PSJvdXRwdXRDb29yZHMgPSBpdmVjMyhyYy54LCByYy55LCByYy56KzEpOyI7YnJlYWs7Y2FzZSAzOnc9Im91dHB1dENvb3JkcyA9IGl2ZWMzKHJjLngsIHJjLnkrMSwgcmMueisxKTsiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yfV8rPWAKICAgICAgICAke3d9CiAgICAgICAgJHtUPjA/ImlmKG91dHB1dENvb3Jkcy55IDwgcm93cyAmJiBvdXRwdXRDb29yZHMueiA8IGNvbHMpeyI6IiJ9CiAgICAgICAgICBpbnQgZmxhdHRlbmVkSW5kZXggPSBnZXRGbGF0dGVuZWRJbmRleChvdXRwdXRDb29yZHMpOwoKICAgICAgICAgIGl2ZWMzIGlucHV0UkMgPSBpbnB1dENvb3Jkc0Zyb21SZXNoYXBlZE91dENvb3JkcyhmbGF0dGVuZWRJbmRleCk7CiAgICAgICAgICB2ZWMyIGlubmVyRGltcyA9IHZlYzIoZmxvYXQoaW5wdXRSQy55KSxmbG9hdChpbnB1dFJDLnopKTsKCiAgICAgICAgICByZXN1bHRbJHtUfV0gPSBnZXRDaGFubmVsKGdldEEoaW5wdXRSQy54LCBpbnB1dFJDLnksIGlucHV0UkMueiksIGlubmVyRGltcyk7CgogICAgICAgICR7VD4wPyJ9IjoiIn0KICAgICAgYH1jb25zdCBiPSgwLHUuZ2V0R2xzbCkobi5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLHk9YAogICAgICAke2Z1bmN0aW9uKFQpe2NvbnN0IHc9by5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXMoVCkseD1bImIiLCJyIiwiYyJdLEU9ImluZGV4IjtyZXR1cm5gCiAgICBpdmVjMyBpbnB1dENvb3Jkc0Zyb21SZXNoYXBlZE91dENvb3JkcyhpbnQgaW5kZXgpIHsKICAgICAgJHt3Lm1hcCgoUCx2KT0+YGludCAke3hbdl19ID0gJHtFfSAvICR7UH07ICR7dj09PXcubGVuZ3RoLTE/YGludCAke3hbdisxXX0gPSAke0V9IC0gJHt4W3ZdfSAqICR7UH1gOmBpbmRleCAtPSAke3hbdl19ICogJHtQfWB9O2ApLmpvaW4oIiIpfQogICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7CiAgICB9CiAgYH0obSl9CiAgICAgICR7ZnVuY3Rpb24oVCl7Y29uc3Qgdz1vLlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyhUKTtyZXR1cm5gCiAgaW50IGdldEZsYXR0ZW5lZEluZGV4KGl2ZWMzIGNvb3JkcykgewogICAgLy8gcmV2ZXJzZSB5LCB6IG9yZGVyCiAgICByZXR1cm4gY29vcmRzLnggKiAke3dbMF19ICsgY29vcmRzLnogKiAke3dbMV19ICsgY29vcmRzLnk7CiAgfQpgfShnKX0KICAgICAgJHsoMCxhLnVucGFja0Zyb21DaGFubmVsKSgpfQoKICAgICAgdm9pZCBtYWluKCkgewogICAgICAgIGl2ZWMzIHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7CgogICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLjApOwoKICAgICAgICBpdmVjMyBvdXRwdXRDb29yZHM7CiAgICAgICAgaW50IHJvd3MgPSAke2dbMl19OwogICAgICAgIGludCBjb2xzID0gJHtnWzFdfTsKCiAgICAgICAgJHtffQogICAgICAgICR7Yi5vdXRwdXR9ID0gcmVzdWx0OwogICAgICB9CiAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSkse291dHB1dDp7ZGltczpnLHR5cGU6ZS50eXBlLHRleHR1cmVUeXBlOmguVGV4dHVyZVR5cGUucGFja2VkfSxzaGFkZXJTb3VyY2U6eSxoYXNNYWluOiEwfSl9KShwLGYsbCxkKX0pfSx0LnByb2Nlc3NEaW1zM0Q9ZnVuY3Rpb24ocCl7aWYocC5sZW5ndGg9PT0wKXJldHVyblsxLDEsMV07bGV0IGY9MTtmb3IobGV0IGQ9MDtkPHAubGVuZ3RoLTI7KytkKWYqPXBbZF07cmV0dXJuW2YscC5sZW5ndGg+MT9wW3AubGVuZ3RoLTJdOjEscFtwLmxlbmd0aC0xXV19LHQuaXNSZXNoYXBlQ2hlYXA9ZnVuY3Rpb24ocCxmKXtsZXQgZD0hMTtyZXR1cm4gZD1wLmxlbmd0aD09PTB8fGYubGVuZ3RoPT09MHx8KHAubGVuZ3RoPDJ8fGYubGVuZ3RoPDI/cFtwLmxlbmd0aC0xXT09PWZbZi5sZW5ndGgtMV06cFtwLmxlbmd0aC0xXT09PWZbZi5sZW5ndGgtMV0mJnBbcC5sZW5ndGgtMl09PT1mW2YubGVuZ3RoLTJdKSxkfX0sNzE4OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZXNoYXBlPXZvaWQgMDtjb25zdCBvPXIoMjUxNyk7dC5yZXNoYXBlPSh1LGgpPT57Y29uc3QgYT1vLlNoYXBlVXRpbC5jYWxjdWxhdGVSZXNoYXBlZERpbXMoaFswXS5kaW1zLGhbMV0uaW50ZWdlckRhdGEpO3JldHVybiB1LnNlc3Npb24ucGFjaz9bdS5yZXNoYXBlUGFja2VkKGhbMF0sYSldOlt1LnJlc2hhcGVVbnBhY2tlZChoWzBdLGEpXX19LDIyNjg6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMT10LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMD10LnJlc2l6ZT12b2lkIDA7Y29uc3Qgbz1yKDUwNjApLHU9cigyMDM5KSxoPXIoOTM5MCksYT1yKDI4MjcpLHA9cig5NzkzKSxmPXtuYW1lOiJSZXNpemUiLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbdS5UZXh0dXJlVHlwZS5wYWNrZWRdfTt0LnJlc2l6ZT0oaSxzLG0pPT4oKDAscC52YWxpZGF0ZUlucHV0cykocyxtKSxbaS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGYpLHtjYWNoZUhpbnQ6bS5jYWNoZUtleSxnZXQ6KCk9PmQoaSxzLG0pfSkscyldKSx0LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMD1pPT4oMCxwLnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzKShpLDEwKSx0LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMT1pPT4oMCxwLnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzKShpLDExKTtjb25zdCBkPShpLHMsbSk9Pntjb25zdCBnPSgwLG8uZ2V0R2xzbCkoaS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFtfLGJdPWwocyxtKTtpZihfLmV2ZXJ5KE49Pk49PT0xKSYmbS5jb29yZGluYXRlVHJhbnNmb3JtTW9kZSE9PSJ0Zl9jcm9wX2FuZF9yZXNpemUiKXJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZikse291dHB1dDp7ZGltczpiLHR5cGU6c1swXS50eXBlLHRleHR1cmVUeXBlOnUuVGV4dHVyZVR5cGUucGFja2VkfSxoYXNNYWluOiEwLHNoYWRlclNvdXJjZTpgdm9pZCBtYWluKCkgewogICAgICAgICAgICAgICAgICAgIHZlYzQgdiA9ICR7Zy50ZXh0dXJlMkR9KFgsIFRleENvb3Jkcyk7CiAgICAgICAgICAgICAgICAgICAgJHtnLm91dHB1dH0gPSB2OwogICAgICAgICAgICAgICAgfWB9KTtjb25zdCB5PWIubGVuZ3RoO2lmKHk8Mil0aHJvdyBuZXcgRXJyb3IoYG91dHB1dCBkaW1lbnNpb24gc2hvdWxkIGJlIGF0IGxlYXN0IDIsIGJ1dCBnb3QgJHt5fWApO2NvbnN0IFQ9Ylt5LTJdLHc9Ylt5LTFdLHg9c1swXS5kaW1zO2lmKHkhPT14Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYG91dHB1dCBkaW1lbnNpb24gc2hvdWxkIG1hdGNoIGlucHV0ICR7eC5sZW5ndGh9LCBidXQgZ290ICR7eX1gKTtjb25zdCBFPXhbeS0yXSxQPXhbeS0xXSx2PV9beS0yXSxNPV9beS0xXTtsZXQgJD0iIjtpZihtLm1vZGUhPT0ibGluZWFyIil0aHJvdyBuZXcgRXJyb3IoYHJlc2l6ZSAocGFja2VkKSBkb2VzIG5vdCBzdXBwb3J0IG1vZGU6ICcke20ubW9kZX0nYCk7c3dpdGNoKG0uY29vcmRpbmF0ZVRyYW5zZm9ybU1vZGUpe2Nhc2UiYXN5bW1ldHJpYyI6JD1gCiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWM0KGNvb3JkcykgLyBzY2FsZVdIV0g7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYDticmVhaztjYXNlImhhbGZfcGl4ZWwiOiQ9YAogICAgICAgICAgICAgICAgICAgIHZlYzQgZ2V0U291cmNlRnJhY0luZGV4KGl2ZWM0IGNvb3JkcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZlYzQoY29vcmRzKSArIDAuNSkgLyBzY2FsZVdIV0ggLSAwLjU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYDticmVhaztjYXNlInB5dG9yY2hfaGFsZl9waXhlbCI6JD1gCiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgZmNvb3JkcyA9IHZlYzQoY29vcmRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlYzQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3d9LjAgPiAxLjAgPyAoZmNvb3Jkcy54ICsgMC41KSAvIHNjYWxlV0hXSC54IC0gMC41IDogMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtUfS4wID4gMS4wID8gKGZjb29yZHMueSArIDAuNSkgLyBzY2FsZVdIV0gueSAtIDAuNSA6IDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7d30uMCA+IDEuMCA/IChmY29vcmRzLnogKyAwLjUpIC8gc2NhbGVXSFdILnogLSAwLjUgOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke1R9LjAgPiAxLjAgPyAoZmNvb3Jkcy53ICsgMC41KSAvIHNjYWxlV0hXSC53IC0gMC41IDogMC4wCiAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBgO2JyZWFrO2Nhc2UiYWxpZ25fY29ybmVycyI6JD1gCiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgcmVzaXplZCA9IHZlYzQoJHt3fS4wIC0gMS4wLCAke1R9LjAgLSAxLjAsICR7d30uMCAtIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7VH0uMCAtIDEuMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgb3JpZ2luYWwgPSB2ZWM0KCR7UH0uMCAtIDEuMCwgJHtFfS4wIC0gMS4wLCAke1B9LjAgLSAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0V9LjAgLSAxLjApOwogICAgICAgICAgICAgICAgICAgICAgICB2ZWM0IG5ld19zY2FsZSA9IG9yaWdpbmFsIC8gcmVzaXplZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlYzQoY29vcmRzKSAqIG5ld19zY2FsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBgO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGByZXNpemUgKHBhY2tlZCkgZG9lcyBub3Qgc3VwcG9ydCBjb29yZGluYXRlVHJhbnNmb3JtTW9kZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJHttLmNvb3JkaW5hdGVUcmFuc2Zvcm1Nb2RlfSdgKX1jb25zdCB6PSgwLGguZ2V0Q29vcmRzRGF0YVR5cGUpKHkpLEI9YAogICAgICAgICAgICBjb25zdCB2ZWMyIGlucHV0V0ggPSB2ZWMyKCR7RX0uMCwgJHtQfS4wKTsKICAgICAgICAgICAgY29uc3QgdmVjNCBzY2FsZVdIV0ggPSB2ZWM0KGZsb2F0KCR7dn0pLCBmbG9hdCgke019KSwgZmxvYXQoJHt2fSksIGZsb2F0KCR7TX0pKTsKICAgICAgICAgICAgJHsoMCxhLnVucGFja0Zyb21DaGFubmVsKSgpfQogICAgICAgICAgICAkeyR9CiAgICAgICAgICAgIGZsb2F0IGdldEFWYWx1ZShpbnQgeDEwLCBpbnQgciwgaW50IGMsIGludCBkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChnZXRBKHgxMCwgciwgYywgZCksIHZlYzIoYywgZCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgICAgICR7en0gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTsKCiAgICAgICAgICAgICAgICBpbnQgYmF0Y2ggPSByY1swXTsKICAgICAgICAgICAgICAgIGludCBkZXB0aCA9IHJjWzFdOwoKICAgICAgICAgICAgICAgIC8vIHJldHJpZXZlIHRoZSA0IGNvb3JkaW5hdGVzIHRoYXQgaXMgdXNlZCBpbiB0aGUgNCBwYWNrZWQgb3V0cHV0IHZhbHVlcy4KICAgICAgICAgICAgICAgIGl2ZWM0IGNvb3JkcyA9IGl2ZWM0KHJjLnd6LCByYy53ICsgMSwgcmMueiArIDEpOwoKICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgc291cmNlIGluZGV4IGluIGZyYWN0aW9uCiAgICAgICAgICAgICAgICB2ZWM0IHNvdXJjZUZyYWMgPSBnZXRTb3VyY2VGcmFjSW5kZXgoY29vcmRzKTsKCiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBvZiB0aGUgNCB2YWx1ZXMgdGhhdCB3aWxsIGJlIHBhY2tlZCBpbnRvIG9uZSB0ZXhlbC4KICAgICAgICAgICAgICAgIGl2ZWM0IHgwMCA9IGl2ZWM0KG1heChzb3VyY2VGcmFjLnh5LCB2ZWMyKDAuMCkpLCBtaW4oaW5wdXRXSCAtIDEuMCwgY2VpbChzb3VyY2VGcmFjLnh5KSkpOwogICAgICAgICAgICAgICAgaXZlYzQgeDAxID0gaXZlYzQobWF4KHNvdXJjZUZyYWMueHcsIHZlYzIoMC4wKSksIG1pbihpbnB1dFdIIC0gMS4wLCBjZWlsKHNvdXJjZUZyYWMueHcpKSk7CiAgICAgICAgICAgICAgICBpdmVjNCB4MTAgPSBpdmVjNChtYXgoc291cmNlRnJhYy56eSwgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy56eSkpKTsKICAgICAgICAgICAgICAgIGl2ZWM0IHgxMSA9IGl2ZWM0KG1heChzb3VyY2VGcmFjLnp3LCB2ZWMyKDAuMCkpLCBtaW4oaW5wdXRXSCAtIDEuMCwgY2VpbChzb3VyY2VGcmFjLnp3KSkpOwoKICAgICAgICAgICAgICAgIGJvb2wgaGFzTmV4dFJvdyA9IHJjLncgPCAke1QtMX07CiAgICAgICAgICAgICAgICBib29sIGhhc05leHRDb2wgPSByYy56IDwgJHt3LTF9OwoKICAgICAgICAgICAgICAgIC8vIHBhY2sgeDAwLCB4MDEsIHgxMCwgeDExJ3MgdG9wLWxlZnQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlCiAgICAgICAgICAgICAgICB2ZWM0IHRvcExlZnQgPSB2ZWM0KAogICAgICAgICAgICAgICAgICAgIGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMC54LCB4MDAueSksCiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMS54LCB4MDEueSkgOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dFJvdyA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMC54LCB4MTAueSkgOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTEueCwgeDExLnkpIDogMC4wKTsKCiAgICAgICAgICAgICAgICAvLyBwYWNrIHgwMCwgeDAxLCB4MTAsIHgxMSdzIHRvcC1yaWdodCBjb3JuZXIgaW50byBvbmUgdmVjNCBzdHJ1Y3R1cmUKICAgICAgICAgICAgICAgIHZlYzQgdG9wUmlnaHQgPSB2ZWM0KAogICAgICAgICAgICAgICAgICAgIGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMC54LCB4MDAudyksCiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMS54LCB4MDEudykgOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dFJvdyA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMC54LCB4MTAudykgOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTEueCwgeDExLncpIDogMC4wKTsKCiAgICAgICAgICAgICAgICAvLyBwYWNrIHgwMCwgeDAxLCB4MTAsIHgxMSdzIGJvdHRvbS1sZWZ0IGNvcm5lciBpbnRvIG9uZSB2ZWM0IHN0cnVjdHVyZQogICAgICAgICAgICAgICAgdmVjNCBib3R0b21MZWZ0ID0gdmVjNCgKICAgICAgICAgICAgICAgICAgICBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MDAueiwgeDAwLnkpLAogICAgICAgICAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MDEueiwgeDAxLnkpIDogMC4wLAogICAgICAgICAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTAueiwgeDEwLnkpIDogMC4wLAogICAgICAgICAgICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDExLnosIHgxMS55KSA6IDAuMCk7CgogICAgICAgICAgICAgICAgLy8gcGFjayB4MDAsIHgwMSwgeDEwLCB4MTEncyBib3R0b20tcmlnaHQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlCiAgICAgICAgICAgICAgICB2ZWM0IGJvdHRvbVJpZ2h0ID0gdmVjNCgKICAgICAgICAgICAgICAgICAgICBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MDAueiwgeDAwLncpLAogICAgICAgICAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MDEueiwgeDAxLncpIDogMC4wLAogICAgICAgICAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTAueiwgeDEwLncpIDogMC4wLAogICAgICAgICAgICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDExLnosIHgxMS53KSA6IDAuMCk7CgogICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBpbnRlcnBvbGF0aW9uIGZyYWN0aW9uIG9uIHUgYW5kIHYgZGlyZWN0aW9uCiAgICAgICAgICAgICAgICB2ZWM0IGZyYWMgPSB2ZWM0KHNvdXJjZUZyYWMpIC0gZmxvb3Ioc291cmNlRnJhYyk7CiAgICAgICAgICAgICAgICB2ZWM0IGNsYW1wRnJhYyA9IGNsYW1wKGZyYWMsIHZlYzQoMC4wKSwgdmVjNCgxLjApKTsKCiAgICAgICAgICAgICAgICB2ZWM0IHRvcCA9IG1peCh0b3BMZWZ0LCB0b3BSaWdodCwgY2xhbXBGcmFjLnl3eXcpOwogICAgICAgICAgICAgICAgdmVjNCBib3R0b20gPSBtaXgoYm90dG9tTGVmdCwgYm90dG9tUmlnaHQsIGNsYW1wRnJhYy55d3l3KTsKICAgICAgICAgICAgICAgIHZlYzQgbmV3VmFsdWUgPSBtaXgodG9wLCBib3R0b20sIGNsYW1wRnJhYy54eHp6KTsKCiAgICAgICAgICAgICAgICAke2cub3V0cHV0fSA9IHZlYzQobmV3VmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGYpLHtvdXRwdXQ6e2RpbXM6Yix0eXBlOnNbMF0udHlwZSx0ZXh0dXJlVHlwZTp1LlRleHR1cmVUeXBlLnBhY2tlZH0saGFzTWFpbjohMCxzaGFkZXJTb3VyY2U6Qn0pfSxsPShpLHMpPT57Y29uc3QgbT1pWzBdLmRpbXM7bGV0IGcsXz1zLnNjYWxlcztpZihfLmxlbmd0aD09PTApe2NvbnN0IHk9aVtzLnNjYWxlc0lucHV0SWR4XTtpZih5JiZ5LnNpemUhPT0wKXtpZihpW3Muc2l6ZXNJbnB1dElkeF0pdGhyb3cgbmV3IEVycm9yKCJPbmx5IG9uZSBvZiBzY2FsZXMgb3Igc2l6ZXMgbXVzdCBiZSBwcm92aWRlZCBhcyBpbnB1dC4iKTtfPW4oeSxzLm1vZGUscy5pc1Jlc2l6ZSl9ZWxzZXtjb25zdCBUPWlbcy5zaXplc0lucHV0SWR4XTtpZighVHx8VC5zaXplPT09MCl0aHJvdyBuZXcgRXJyb3IoIkVpdGhlciBzY2FsZXMgb3Igc2l6ZXMgTVVTVCBiZSBwcm92aWRlZCBhcyBpbnB1dC4iKTtnPUFycmF5LmZyb20oVC5pbnRlZ2VyRGF0YSksXz1lKGcsbSxzLm1vZGUscy5pc1Jlc2l6ZSl9fWVsc2UgaWYoaVtzLnNpemVzSW5wdXRJZHhdKXRocm93IG5ldyBFcnJvcigiT25seSBvbmUgb2Ygc2NhbGVzIG9yIHNpemVzIG11c3QgYmUgcHJvdmlkZWQgYXMgaW5wdXQuIik7Y29uc3QgYj1nfHxtLm1hcCgoeSxUKT0+TWF0aC5mbG9vcih5Kl9bVF0pKTtyZXR1cm5bXyxiXX0sbj0oaSxzLG0pPT57Y29uc3QgZz1BcnJheS5mcm9tKGkuZmxvYXREYXRhKTtyZXR1cm4oMCxwLnNjYWxlc1ZhbGlkYXRpb24pKGcscyxtKSxnfSxlPShpLHMsbSxnKT0+e2NvbnN0IF89cy5sZW5ndGgsYj1uZXcgQXJyYXkoXyk7Zm9yKGxldCB5PTAsVD1fO3k8VDt5KyspaWYoc1t5XT09PTApe2lmKGlbeV0hPT0wKXRocm93IG5ldyBFcnJvcigiSW5wdXQgZGltIGlzIHplcm8gYnV0IHJlcXVpcmVkIG91dHB1dCBkaW0gaXMgbm9uLXplcm8uIik7Ylt5XT0xfWVsc2UgYlt5XT1pW3ldL3NbeV07cmV0dXJuKDAscC5zY2FsZXNWYWxpZGF0aW9uKShiLG0sZyksYn19LDgxMTc6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNoYXBlPXZvaWQgMDtjb25zdCBvPXIoOTE2Mik7dC5zaGFwZT0oaCxhKT0+KHUoYSksW25ldyBvLlRlbnNvcihbYVswXS5kaW1zLmxlbmd0aF0sImludDMyIix2b2lkIDAsdm9pZCAwLG5ldyBJbnQzMkFycmF5KGFbMF0uZGltcykpXSk7Y29uc3QgdT1oPT57aWYoIWh8fGgubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIHJlcXVpcmVzIDEgaW5wdXQuIil9fSwyMjc4OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5zbGljZVYxMD10LnBhcnNlU2xpY2VBdHRyaWJ1dGVzPXQuc2xpY2U9dm9pZCAwO2NvbnN0IG89cigyNDYpLHU9cig3ODIpLGg9cigyNTE3KSxhPXIoMjAzOSkscD17bmFtZToiU2xpY2UiLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbYS5UZXh0dXJlVHlwZS51bnBhY2tlZF19O3Quc2xpY2U9KGUsaSxzKT0+KGQoaSksW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxwKSx7Y2FjaGVIaW50OnMuY2FjaGVLZXksZ2V0OigpPT5mKGUsaVswXSxzKX0pLGkpXSksdC5wYXJzZVNsaWNlQXR0cmlidXRlcz1lPT57Y29uc3QgaT1lLmF0dHJpYnV0ZXMuZ2V0SW50cygic3RhcnRzIikscz1lLmF0dHJpYnV0ZXMuZ2V0SW50cygiZW5kcyIpLG09ZS5hdHRyaWJ1dGVzLmdldEludHMoImF4ZXMiLFtdKTtyZXR1cm4oMCxvLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3N0YXJ0czppLGVuZHM6cyxheGVzOm19KX07Y29uc3QgZj0oZSxpLHMpPT57Y29uc3QgbT1zLmF4ZXMubGVuZ3RoPT09MD9pLmRpbXMuc2xpY2UoMCkubWFwKCh4LEUpPT5FKTpzLmF4ZXMsZz1oLlNoYXBlVXRpbC5ub3JtYWxpemVBeGVzKG0saS5kaW1zLmxlbmd0aCksXz1zLnN0YXJ0cy5tYXAoKHgsRSk9Png+aS5kaW1zW2dbRV1dLTE/aS5kaW1zW2dbRV1dOmguU2hhcGVVdGlsLm5vcm1hbGl6ZUF4aXMoeCxpLmRpbXNbZ1tFXV0pKSxiPXMuZW5kcy5tYXAoKHgsRSk9Png+aS5kaW1zW2dbRV1dLTE/aS5kaW1zW2dbRV1dOmguU2hhcGVVdGlsLm5vcm1hbGl6ZUF4aXMoeCxpLmRpbXNbZ1tFXV0pKSx5PWkuZGltcy5zbGljZSgpLFQ9W107Zm9yKGxldCB4PTA7eDxnLmxlbmd0aDt4KyspeVtnW3hdXT1iW3hdLV9beF0sX1t4XT4wJiZULnB1c2goYG91dHB1dElkeFske2dbeF19XSArPSAke19beF19O2ApO2NvbnN0IHc9YAogICAgICBmbG9hdCBwcm9jZXNzKGludCBvdXRwdXRJZHhbJHt5Lmxlbmd0aH1dKSB7CiAgICAgICAgJHtULmpvaW4oYAogICAgICBgKX0KICAgICAgICByZXR1cm4gX0Eob3V0cHV0SWR4KTsKICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxwKSx7b3V0cHV0OntkaW1zOnksdHlwZTppLnR5cGUsdGV4dHVyZVR5cGU6YS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnd9KX0sZD1lPT57aWYoIWV8fGUubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIlNsaWNlIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYodS5OVU1CRVJfVFlQRVMuaW5kZXhPZihlWzBdLnR5cGUpPT09LTEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIil9O3Quc2xpY2VWMTA9KGUsaSk9PntuKGkpO2NvbnN0IHM9bChlLGkpO3JldHVybltlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scCkse2NhY2hlSGludDpzLmNhY2hlS2V5LGdldDooKT0+ZihlLGlbMF0scyl9KSxbaVswXV0pXX07Y29uc3QgbD0oZSxpKT0+e2lmKCFlLnNlc3Npb24uaXNJbml0aWFsaXplcihpWzFdLmRhdGFJZCl8fCFlLnNlc3Npb24uaXNJbml0aWFsaXplcihpWzJdLmRhdGFJZCl8fGkubGVuZ3RoPj00JiYhZS5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIoaVszXS5kYXRhSWQpfHxpLmxlbmd0aD49NSYmIWUuc2Vzc2lvbi5pc0luaXRpYWxpemVyKGlbNF0uZGF0YUlkKSl0aHJvdyBuZXcgRXJyb3IoImR5bmFtaWMgc2xpY2UgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtpZihpLmxlbmd0aD49NSYmaVs0XS5pbnRlZ2VyRGF0YS5zb21lKF89Pl8hPT0xKSl0aHJvdyBuZXcgRXJyb3IoImN1cnJlbnRseSBub24tMSBzdGVwcyBpcyBub3Qgc3VwcG9ydGVkIGZvciBTbGljZSIpO2NvbnN0IHM9QXJyYXkuZnJvbShpWzFdLmludGVnZXJEYXRhKSxtPUFycmF5LmZyb20oaVsyXS5pbnRlZ2VyRGF0YSksZz1pLmxlbmd0aD49ND9BcnJheS5mcm9tKGlbM10uaW50ZWdlckRhdGEpOltdO3JldHVybntzdGFydHM6cyxlbmRzOm0sYXhlczpnLGNhY2hlS2V5OmAke2d9OyR7c307JHttfWB9fSxuPWU9PntpZighZXx8ZS5sZW5ndGg8M3x8ZS5sZW5ndGg+NSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgbnVtYmVyLiIpO2lmKGVbMV0udHlwZSE9PSJpbnQzMiJ8fGVbMV0uZGltcy5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGVbMl0udHlwZSE9PSJpbnQzMiJ8fGVbMl0uZGltcy5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj00JiYoZVszXS50eXBlIT09ImludDMyInx8ZVszXS5kaW1zLmxlbmd0aCE9PTEpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj01JiYoZVs0XS50eXBlIT09ImludDMyInx8ZVs0XS5kaW1zLmxlbmd0aCE9PTEpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfX0sNTUyNDooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuc29mdG1heFYxMz10LnBhcnNlU29mdG1heEF0dHJpYnV0ZXNWMTM9dC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzPXQuc29mdG1heD12b2lkIDA7Y29uc3Qgbz1yKDI0NiksdT1yKDI1MTcpLGg9cig1MDYwKSxhPXIoMjAzOSkscD1yKDM3MzgpLGY9e25hbWU6IlNvZnRtYXhDb21wdXRlTWF4IixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W2EuVGV4dHVyZVR5cGUudW5wYWNrZWRdfSxkPXtuYW1lOiJTb2Z0bWF4Q29tcHV0ZVNjYWxlIixpbnB1dE5hbWVzOlsiQSIsIk1heCJdLGlucHV0VHlwZXM6W2EuVGV4dHVyZVR5cGUudW5wYWNrZWQsYS5UZXh0dXJlVHlwZS51bnBhY2tlZF19LGw9e25hbWU6IlNvZnRNYXgiLGlucHV0TmFtZXM6WyJBIiwiTWF4IiwiTm9ybSJdLGlucHV0VHlwZXM6W2EuVGV4dHVyZVR5cGUudW5wYWNrZWQsYS5UZXh0dXJlVHlwZS51bnBhY2tlZCxhLlRleHR1cmVUeXBlLnVucGFja2VkXX07dC5zb2Z0bWF4PShnLF8sYik9PnttKF8pO2NvbnN0IHk9X1swXS5kaW1zLnNsaWNlKCksVD11LlNoYXBlVXRpbC5ub3JtYWxpemVBeGlzKGIuYXhpcyx5Lmxlbmd0aCksdz11LlNoYXBlVXRpbC5zaXplVG9EaW1lbnNpb24oeSxUKSx4PXUuU2hhcGVVdGlsLnNpemVGcm9tRGltZW5zaW9uKHksVCk7cmV0dXJuIG4oZyxfLGIsdyx4KX0sdC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzPWc9PigwLG8uY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7YXhpczpnLmF0dHJpYnV0ZXMuZ2V0SW50KCJheGlzIiwxKX0pLHQucGFyc2VTb2Z0bWF4QXR0cmlidXRlc1YxMz1nPT4oMCxvLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6Zy5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIsLTEpfSksdC5zb2Z0bWF4VjEzPShnLF8sYik9PnttKF8pO2NvbnN0IHk9X1swXS5kaW1zLnNsaWNlKCksVD11LlNoYXBlVXRpbC5ub3JtYWxpemVBeGlzKGIuYXhpcyx5Lmxlbmd0aCksdz15Lmxlbmd0aCx4PVQhPT13LTEsRT1bXTtsZXQgUCx2PVtdLE09W107eCYmKHY9QXJyYXkuZnJvbSh7bGVuZ3RoOnd9KS5tYXAoKE4sRCk9PkQpLHZbVF09dy0xLHZbdy0xXT1ULHYubWFwKE49PkUucHVzaCh5W05dKSksUD0oMCxvLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3Blcm06dn0pLE09KDAscC50cmFuc3Bvc2UpKGcsXyxQKSk7Y29uc3QgJD14P3UuU2hhcGVVdGlsLnNpemVUb0RpbWVuc2lvbihFLHctMSk6dS5TaGFwZVV0aWwuc2l6ZVRvRGltZW5zaW9uKHksdy0xKSx6PXg/dS5TaGFwZVV0aWwuc2l6ZUZyb21EaW1lbnNpb24oRSx3LTEpOnUuU2hhcGVVdGlsLnNpemVGcm9tRGltZW5zaW9uKHksdy0xKSxCPW4oZyx4P006XyxiLCQseik7cmV0dXJuIHg/KDAscC50cmFuc3Bvc2UpKGcsQixQKTpCfTtjb25zdCBuPShnLF8sYix5LFQpPT57Y29uc3Qgdz1lKGcsX1swXSx5LFQsW3ldKSx4PWcucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxmKSx7Y2FjaGVIaW50OmIuY2FjaGVLZXksZ2V0OigpPT53fSksXyksRT1pKGcsX1swXSx5LFQsdy5vdXRwdXQuZGltcyxbeV0pLFA9Zy5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLHtjYWNoZUhpbnQ6Yi5jYWNoZUtleSxnZXQ6KCk9PkV9KSxbX1swXSx4XSksdj1zKGcsX1swXSx5LFQsdy5vdXRwdXQuZGltcyxFLm91dHB1dC5kaW1zKTtyZXR1cm5bZy5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGwpLHtjYWNoZUhpbnQ6Yi5jYWNoZUtleSxnZXQ6KCk9PnZ9KSxbX1swXSx4LFBdKV19LGU9KGcsXyxiLHksVCk9Pntjb25zdFt3LHhdPWcuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KF8uZGltcyxhLlRleHR1cmVUeXBlLnVucGFja2VkKSxFPVQubGVuZ3RoO2lmKGI8MXx8eTwxKXRocm93IG5ldyBFcnJvcigiTG9naWNhbCByb3cgY291bnQgTiBhbmQgZmVhdHVyZSBjb3VudCBEIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEiKTtpZihULmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJEaW1lbnNpb25hbGl0eSBvZiB0aGUgb3V0cHV0IHNob3VsZCBiZSAxIik7aWYoVFswXSE9PWIpdGhyb3cgbmV3IEVycm9yKCJTaGFwZSBvZiB0aGUgb3V0cHV0IHNob3VsZCBiZSBlcXVhbCB0byBsb2dpY2FsIHJvdyBjb3VudCIpO2NvbnN0IFA9KDAsaC5nZXRHbHNsKShnLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksdj1gCiAgICAgIGZsb2F0IHByb2Nlc3MoaW50WyR7RX1dIGluZGljZXMpIHsKICAgICAgICBpbnQgbG9naWNhbF9yb3dfc3RhcnRfb2Zmc2V0ID0gaW5kaWNlc1swXSAqICR7eX07CgogICAgICAgIGZsb2F0IG1heCA9IGdldENvbG9yQXNGbG9hdCgke1AudGV4dHVyZTJEfShBLCBvZmZzZXRUb0Nvb3Jkcyhsb2dpY2FsX3Jvd19zdGFydF9vZmZzZXQsICR7d30sCiAgICAgICAgJHt4fSApKSk7CiAgICAgICAgZm9yKGludCBpPTE7IGk8JHt5fTsgKytpKQogICAgICAgIHsKICAgICAgICAgIGZsb2F0IGN1cnJlbnQgPSBnZXRDb2xvckFzRmxvYXQoJHtQLnRleHR1cmUyRH0oQSwgb2Zmc2V0VG9Db29yZHMobG9naWNhbF9yb3dfc3RhcnRfb2Zmc2V0ICsgaSwKICAgICAgICAgICAgJHt3fSwgJHt4fSkpKTsKICAgICAgICAgIGlmKGN1cnJlbnQgPiBtYXgpCiAgICAgICAgICBtYXggPSBjdXJyZW50OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG1heDsKICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxmKSx7b3V0cHV0OntkaW1zOlQsdHlwZTpfLnR5cGUsdGV4dHVyZVR5cGU6YS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnZ9KX0saT0oZyxfLGIseSxULHcpPT57Y29uc3RbeCxFXT1nLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodChfLmRpbXMsYS5UZXh0dXJlVHlwZS51bnBhY2tlZCksUD13Lmxlbmd0aDtpZihiPDF8fHk8MSl0aHJvdyBuZXcgRXJyb3IoIkxvZ2ljYWwgcm93IGNvdW50IE4gYW5kIGZlYXR1cmUgY291bnQgRCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIik7aWYody5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigiRGltZW5zaW9uYWxpdHkgb2YgdGhlIG91dHB1dCBzaG91bGQgYmUgMSIpO2lmKHdbMF0hPT1iKXRocm93IG5ldyBFcnJvcigiU2hhcGUgb2YgdGhlIG91dHB1dCBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtpZihULmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJEaW1lbnNpb25hbGl0eSBvZiB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgc2hvdWxkIGJlIDEiKTtpZihUWzBdIT09Yil0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtjb25zdCB2PWAKICAgICAgZmxvYXQgcHJvY2VzcyhpbnRbJHtQfV0gaW5kaWNlcykgewogICAgICAgIGludCBsb2dpY2FsX3Jvd19zdGFydF9vZmZzZXQgPSBpbmRpY2VzWzBdICogJHt5fTsKCiAgICAgICAgZmxvYXQgbm9ybV9mYWN0b3IgPSAwLjA7CiAgICAgICAgZmxvYXQgbWF4ID0gX01heChpbmRpY2VzKTsKICAgICAgICBmb3IoaW50IGk9MDsgaTwke3l9OyArK2kpCiAgICAgICAgewogICAgICAgICAgbm9ybV9mYWN0b3IgKz0gZXhwKGdldENvbG9yQXNGbG9hdCgkeygwLGguZ2V0R2xzbCkoZy5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLnRleHR1cmUyRH0oQSwgb2Zmc2V0VG9Db29yZHMobG9naWNhbF9yb3dfc3RhcnRfb2Zmc2V0ICsgaSwKICAgICAgICAgICAgJHt4fSwgJHtFfSkpKSAtIG1heCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbm9ybV9mYWN0b3I7CiAgICAgIH1gO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse291dHB1dDp7ZGltczp3LHR5cGU6Xy50eXBlLHRleHR1cmVUeXBlOmEuVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTp2fSl9LHM9KGcsXyxiLHksVCx3KT0+e2NvbnN0W3gsRV09Zy5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQoXy5kaW1zLGEuVGV4dHVyZVR5cGUudW5wYWNrZWQpLFA9Xy5kaW1zLmxlbmd0aDtpZihiPDF8fHk8MSl0aHJvdyBuZXcgRXJyb3IoIkxvZ2ljYWwgcm93IGNvdW50IE4gYW5kIGZlYXR1cmUgY291bnQgRCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIik7aWYoVC5sZW5ndGghPT0xfHx3Lmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJEaW1lbnNpb25hbGl0eSBvZiB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgc2hvdWxkIGJlIDEiKTtpZihUWzBdIT09Ynx8d1swXSE9PWIpdGhyb3cgbmV3IEVycm9yKCJTaGFwZSBvZiB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgc2hvdWxkIGJlIGVxdWFsIHRvIGxvZ2ljYWwgcm93IGNvdW50Iik7Y29uc3Qgdj1gCiAgICAgIGZsb2F0IHByb2Nlc3MoaW50WyR7UH1dIGluZGljZXMpIHsKCiAgICAgIC8vIGdldCBvZmZzZXQgb2YgY3VycmVudCBsb2dpY2FsIHRlbnNvciBpbmRleCBmcm9tIHRoZSAyLUQgdGV4dHVyZSBjb29yZGluYXRlcyAoVGV4Q29vcmRzKQogICAgICBpbnQgb2Zmc2V0ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke3h9LCAke0V9KTsKCiAgICAgIC8vZGV0ZXJtaW5lIHRoZSBsb2dpY2FsIHJvdyBmb3IgdGhpcyBpbmRleAogICAgICBpbnQgbG9naWNhbF9yb3dfaW5kZXhbMV07CiAgICAgIGxvZ2ljYWxfcm93X2luZGV4WzBdID0gb2Zmc2V0IC8gJHt5fTsKCiAgICAgIGZsb2F0IG5vcm1fZmFjdG9yID0gX05vcm0obG9naWNhbF9yb3dfaW5kZXgpOwoKICAgICAgLy8gYXZvaWQgcG9zc2libGUgZGl2aXNpb24gYnkgMAogICAgICAvLyBpZiBub3JtX2ZhY29yIGlzIDAsIGFsbCBlbGVtZW50cyBhcmUgemVybwogICAgICAvLyBpZiBzbywgcmV0dXJuIDAKICAgICAgaWYobm9ybV9mYWN0b3IgPT0gMC4wKQogICAgICAgIHJldHVybiAwLjA7CgogICAgICByZXR1cm4gZXhwKF9BKGluZGljZXMpIC0gX01heChsb2dpY2FsX3Jvd19pbmRleCkpIC8gbm9ybV9mYWN0b3I7CiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGwpLHtvdXRwdXQ6e2RpbXM6Xy5kaW1zLHR5cGU6Xy50eXBlLHRleHR1cmVUeXBlOmEuVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTp2fSl9LG09Zz0+e2lmKCFnfHxnLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJTb2Z0bWF4IHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoZ1swXS50eXBlIT09ImZsb2F0MzIiJiZnWzBdLnR5cGUhPT0iZmxvYXQ2NCIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUiKX19LDU5NzU6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlU3BsaXRBdHRyaWJ1dGVzPXQuc3BsaXQ9dm9pZCAwO2NvbnN0IG89cigyNDYpLHU9cigyNTE3KSxoPXIoMjAzOSksYT17bmFtZToiU3BsaXQiLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbaC5UZXh0dXJlVHlwZS51bnBhY2tlZF19O3Quc3BsaXQ9KGwsbixlKT0+e2Qobik7Y29uc3QgaT11LlNoYXBlVXRpbC5ub3JtYWxpemVBeGlzKGUuYXhpcyxuWzBdLmRpbXMubGVuZ3RoKSxzPXAobCxuLGksZSksbT1bXTtmb3IobGV0IGc9MDtnPHM7KytnKW0ucHVzaChsLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpgJHtlLmNhY2hlS2V5fTske2d9YCxnZXQ6KCk9PmYobCxuWzBdLGUsaSxnKX0pLG4pKTtyZXR1cm4gbX0sdC5wYXJzZVNwbGl0QXR0cmlidXRlcz1sPT57Y29uc3Qgbj1sLmF0dHJpYnV0ZXMuZ2V0SW50KCJheGlzIiwwKSxlPWwuYXR0cmlidXRlcy5nZXRJbnRzKCJzcGxpdCIsW10pLGk9bC5vdXRwdXRzLmxlbmd0aDtyZXR1cm4oMCxvLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6bixzcGxpdDplLG51bU91dHB1dHM6aX0pfTtjb25zdCBwPShsLG4sZSxpKT0+e2NvbnN0WyxzXT11LlNwbGl0VXRpbC5zcGxpdFNoYXBlKG5bMF0uZGltcyxlLGkuc3BsaXQsaS5udW1PdXRwdXRzKTtyZXR1cm4gcy5sZW5ndGh9LGY9KGwsbixlLGkscyk9Pntjb25zdFttLGddPXUuU3BsaXRVdGlsLnNwbGl0U2hhcGUobi5kaW1zLGksZS5zcGxpdCxlLm51bU91dHB1dHMpLF89Z1tzXSxiPW1bc10seT1gCiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtiLmxlbmd0aH1dKSB7CiAgICAgICAgaW5kaWNlc1ske2l9XSArPSAke199OwogICAgICAgIHJldHVybiBfQShpbmRpY2VzKTsKICAgICAgfQogICAgYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtjYWNoZUhpbnQ6YCR7ZS5jYWNoZUtleX06JHtzfWAsb3V0cHV0OntkaW1zOmIsdHlwZTpuLnR5cGUsdGV4dHVyZVR5cGU6aC5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnl9KX0sZD1sPT57aWYoIWx8fGwubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIlNwbGl0IHJlcXVpcmVzIG9uZSBpbnB1dC4iKTtpZihsWzBdLnR5cGUhPT0iaW50OCImJmxbMF0udHlwZSE9PSJ1aW50OCImJmxbMF0udHlwZSE9PSJpbnQxNiImJmxbMF0udHlwZSE9PSJ1aW50MTYiJiZsWzBdLnR5cGUhPT0iaW50MzIiJiZsWzBdLnR5cGUhPT0idWludDMyIiYmbFswXS50eXBlIT09ImZsb2F0MzIiJiZsWzBdLnR5cGUhPT0iZmxvYXQ2NCImJmxbMF0udHlwZSE9PSJib29sIil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX19LDM5MzM6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlU3F1ZWV6ZUF0dHJpYnV0ZXM9dC5zcXVlZXplVjEzPXQuc3F1ZWV6ZT12b2lkIDA7Y29uc3Qgbz1yKDI1MTcpO3Quc3F1ZWV6ZT0oYSxwLGYpPT57dShwKTtjb25zdCBkPW8uU2hhcGVVdGlsLnNxdWVlemVTaGFwZShwWzBdLmRpbXMsZik7cmV0dXJuW2EucmVzaGFwZVVucGFja2VkKHBbMF0sZCldfSx0LnNxdWVlemVWMTM9KGEscCk9PihoKHApLCgwLHQuc3F1ZWV6ZSkoYSxbcFswXV0sQXJyYXkuZnJvbShwWzFdLmludGVnZXJEYXRhKSkpLHQucGFyc2VTcXVlZXplQXR0cmlidXRlcz1hPT5hLmF0dHJpYnV0ZXMuZ2V0SW50cygiYXhlcyIpO2NvbnN0IHU9YT0+e2lmKCFhfHxhLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJTcXVlZXplIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoYVswXS50eXBlPT09InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0IHRlbnNvciB0eXBlcy4iKX0saD1hPT57aWYoIWF8fGEubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3IoIlNxdWVlemUgcmVxdWlyZXMgMiBpbnB1dHMuIik7aWYoYVsxXS50eXBlIT09ImludDMyIil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX19LDY1NTg6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnN1bT12b2lkIDA7Y29uc3Qgbz1yKDUwNjApLHU9cigyMDM5KTt0LnN1bT0ocCxmKT0+e2EoZik7Y29uc3QgZD17bmFtZToiU3VtIixpbnB1dE5hbWVzOmYubWFwKChsLG4pPT5gWCR7bn1gKSxpbnB1dFR5cGVzOm5ldyBBcnJheShmLmxlbmd0aCkuZmlsbCh1LlRleHR1cmVUeXBlLnVucGFja2VkKX07cmV0dXJuW3AucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxkKSx7Z2V0OigpPT5oKHAsZixkKX0pLGYpXX07Y29uc3QgaD0ocCxmLGQpPT57Y29uc3QgbD0oMCxvLmdldEdsc2wpKHAuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSxuPWZbMF0uZGltcy5zbGljZSgpLGU9YAogICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgdmVjNCByZXN1bHQgPSAke2YubWFwKChpLHMpPT5gJHtsLnRleHR1cmUyRH0oWCR7c30sVGV4Q29vcmRzKWApLmpvaW4oIiArICIpfTsKICAgICAgICAke2wub3V0cHV0fSA9IHJlc3VsdDsKICAgICAgfQogICAgYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLHtvdXRwdXQ6e2RpbXM6bix0eXBlOmZbMF0udHlwZSx0ZXh0dXJlVHlwZTp1LlRleHR1cmVUeXBlLnVucGFja2VkfSxoYXNNYWluOiEwLHNoYWRlclNvdXJjZTplfSl9LGE9cD0+e2lmKCFwfHxwLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJTdW0gcmVxdWlyZXMgaW5wdXRzLiIpO2NvbnN0IGY9cFswXS5kaW1zLmxlbmd0aDtmb3IobGV0IGQ9MTtkPHAubGVuZ3RoO2QrKyl7aWYoZiE9PXBbZF0uZGltcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBzaGFwZXMgYXJlIG1pc21hdGNoZWQuIik7Zm9yKGxldCBsPTA7bDxmO2wrKylpZihwWzBdLmRpbXNbbF0hPT1wW2RdLmRpbXNbbF0pdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBzaGFwZXMgYXJlIG5vdCBtYXRjaGVkLiIpfWlmKHBbMF0udHlwZSE9PSJmbG9hdDMyIiYmcFswXS50eXBlIT09ImZsb2F0NjQiKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2ZvcihsZXQgZD0xO2Q8cC5sZW5ndGg7ZCsrKWlmKHBbMF0udHlwZSE9PXBbZF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHR5cGVzIGFyZSBub3QgbWF0Y2hlZC4iKX19LDU3MjM6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnRpbGU9dm9pZCAwO2NvbnN0IG89cig3ODIpLHU9cigyMDM5KTt0LnRpbGU9KHAsZik9PnthKGYpO2NvbnN0IGQ9e25hbWU6IlRpbGUiLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbdS5UZXh0dXJlVHlwZS51bnBhY2tlZF19O3JldHVybltwLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse2dldDooKT0+aChwLGYsZCl9KSxmKV19O2NvbnN0IGg9KHAsZixkKT0+e2NvbnN0IGw9ZlswXS5kaW1zLnNsaWNlKCksbj1uZXcgQXJyYXkobC5sZW5ndGgpLGU9W107Zm9yKGxldCBtPTA7bTxsLmxlbmd0aDttKyspblttXT1sW21dKmZbMV0ubnVtYmVyRGF0YVttXSxlLnB1c2goYGlucHV0SWR4WyR7bX1dID0gaW50KG1vZChmbG9hdChvdXRwdXRJZHhbJHttfV0pLCAke2xbbV19LikpO2ApO2NvbnN0IGk9bi5sZW5ndGgscz1gCiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IG91dHB1dElkeFske2l9XSkgewogICAgICAgIGludCBpbnB1dElkeFske2l9XTsKICAgICAgICAke2Uuam9pbihgCmApfQogICAgICAgIHJldHVybiBfQShpbnB1dElkeCk7CiAgICAgIH0KICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxkKSx7b3V0cHV0OntkaW1zOm4sdHlwZTpmWzBdLnR5cGUsdGV4dHVyZVR5cGU6dS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnN9KX0sYT1wPT57aWYoIXB8fHAubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3IoIlRpbGUgcmVxdWlyZXMgMiBpbnB1dC4iKTtpZihwWzFdLmRpbXMubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzZWNvbmQgaW5wdXQgc2hhcGUgbXVzdCAxIGRpbWVuc2lvbi4iKTtpZihwWzFdLmRpbXNbMF0hPT1wWzBdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZihvLk5VTUJFUl9UWVBFUy5pbmRleE9mKHBbMF0udHlwZSk9PT0tMSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKTtpZihwWzFdLnR5cGUhPT0iaW50MzIiJiZwWzFdLnR5cGUhPT0iaW50MTYiKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCByZXBlYXQgdHlwZS4iKX19LDM3Mzg6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlVHJhbnNwb3NlQXR0cmlidXRlcz10LnRyYW5zcG9zZT12b2lkIDA7Y29uc3Qgbz1yKDI0NiksdT1yKDI1MTcpLGg9cigyMDM5KSxhPXtuYW1lOiJUcmFuc3Bvc2UiLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbaC5UZXh0dXJlVHlwZS51bnBhY2tlZF19O3QudHJhbnNwb3NlPShlLGkscyk9PihuKGkpLFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpzLmNhY2hlS2V5LGdldDooKT0+cChlLGlbMF0scy5wZXJtKX0pLGkpXSksdC5wYXJzZVRyYW5zcG9zZUF0dHJpYnV0ZXM9ZT0+KDAsby5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtwZXJtOmUuYXR0cmlidXRlcy5nZXRJbnRzKCJwZXJtIixbXSl9KTtjb25zdCBwPShlLGkscyk9Pntjb25zdCBtPWkuZGltcztzPWYobSxzKTtjb25zdCBnPWQobSxzKSxfPW0ubGVuZ3RoLGI9YAogICAgICAke2woInBlcm0iLHMsXyl9CiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtffV0pIHsKICAgICAgICBpbnQgYVske199XTsKICAgICAgICBwZXJtKGEsIGluZGljZXMpOwogICAgICAgIHJldHVybiBfQShhKTsKICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7b3V0cHV0OntkaW1zOmcsdHlwZTppLnR5cGUsdGV4dHVyZVR5cGU6aC5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmJ9KX0sZj0oZSxpKT0+KGkmJmkubGVuZ3RoIT09ZS5sZW5ndGgmJihpPVsuLi5lLmtleXMoKV0ucmV2ZXJzZSgpKSxpKSxkPShlLGkpPT4oaT1mKGUsaSksdS5TaGFwZVV0aWwuc29ydEJhc2VkT25QZXJtKGUsaSkpLGw9KGUsaSxzKT0+e2NvbnN0IG09W107bS5wdXNoKGB2b2lkICR7ZX0ob3V0IGludCBhWyR7c31dLCBpbnQgc3JjWyR7c31dKSB7YCk7Zm9yKGxldCBnPTA7ZzxzOysrZyltLnB1c2goYAlhWyR7aVtnXX1dPXNyY1ske2d9XTtgKTtyZXR1cm4gbS5wdXNoKCIJfSIpLG0uam9pbihgCmApfSxuPWU9PntpZighZXx8ZS5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigiVHJhbnNwb3NlIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoZVswXS50eXBlIT09ImZsb2F0MzIiJiZlWzBdLnR5cGUhPT0iZmxvYXQ2NCIpdGhyb3cgbmV3IEVycm9yKCJpbnB1dCBzaG91bGQgYmUgZmxvYXQgdGVuc29yIil9fSw4NzEwOihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5lbmNvZGVBc1VpbnQ4PXZvaWQgMDtjb25zdCBvPXIoNTA2MCksdT1yKDIwMzkpO3QuZW5jb2RlQXNVaW50OD0oaCxhKT0+e2NvbnN0IHA9YS5zaGFwZSxmPSgwLG8uZ2V0R2xzbCkoaC5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLGQ9YAogICAgY29uc3QgZmxvYXQgRkxPQVRfTUFYID0gMS43MDE0MTE4NGUzODsKICAgIGNvbnN0IGZsb2F0IEZMT0FUX01JTiA9IDEuMTc1NDk0MzVlLTM4OwoKICAgIGJvb2wgaXNOYU4oZmxvYXQgdmFsKSB7CiAgICAgIHJldHVybiAodmFsIDwgMS4wIHx8IDAuMCA8IHZhbCB8fCB2YWwgPT0gMC4wKSA/IGZhbHNlIDogdHJ1ZTsKICAgIH0KCiAgICBoaWdocCB2ZWM0IGVuY29kZUFzVWludDgoaGlnaHAgZmxvYXQgdikgewogICAgICBpZiAoaXNOYU4odikpIHsKICAgICAgICByZXR1cm4gdmVjNCgyNTUsIDI1NSwgMjU1LCAyNTUpOwogICAgICB9CgogICAgICBoaWdocCBmbG9hdCBhdiA9IGFicyh2KTsKCiAgICAgIGlmKGF2IDwgRkxPQVRfTUlOKSB7CiAgICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsIDAuMCwgMC4wKTsKICAgICAgfSBlbHNlIGlmKHYgPiBGTE9BVF9NQVgpIHsKICAgICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgMTI4LjAsIDEyNy4wKSAvIDI1NS4wOwogICAgICB9IGVsc2UgaWYodiA8IC1GTE9BVF9NQVgpIHsKICAgICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgIDEyOC4wLCAyNTUuMCkgLyAyNTUuMDsKICAgICAgfQoKICAgICAgaGlnaHAgdmVjNCBjID0gdmVjNCgwLDAsMCwwKTsKCiAgICAgIGhpZ2hwIGZsb2F0IGUgPSBmbG9vcihsb2cyKGF2KSk7CiAgICAgIGhpZ2hwIGZsb2F0IG0gPSBleHAyKGZyYWN0KGxvZzIoYXYpKSkgLSAxLjA7CgogICAgICBjWzJdID0gZmxvb3IoMTI4LjAgKiBtKTsKICAgICAgbSAtPSBjWzJdIC8gMTI4LjA7CiAgICAgIGNbMV0gPSBmbG9vcigzMjc2OC4wICogbSk7CiAgICAgIG0gLT0gY1sxXSAvIDMyNzY4LjA7CiAgICAgIGNbMF0gPSBmbG9vcig4Mzg4NjA4LjAgKiBtKTsKCiAgICAgIGhpZ2hwIGZsb2F0IGViaWFzID0gZSArIDEyNy4wOwogICAgICBjWzNdID0gZmxvb3IoZWJpYXMgLyAyLjApOwogICAgICBlYmlhcyAtPSBjWzNdICogMi4wOwogICAgICBjWzJdICs9IGZsb29yKGViaWFzKSAqIDEyOC4wOwoKICAgICAgY1szXSArPSAxMjguMCAqIHN0ZXAoMC4wLCAtdik7CgogICAgICByZXR1cm4gYyAvIDI1NS4wOwogICAgfQoKICAgIHZvaWQgbWFpbigpIHsKICAgICAgZmxvYXQgdmFsdWUgPSAke2YudGV4dHVyZTJEfShYLFRleENvb3JkcykucjsKICAgICAgJHtmLm91dHB1dH0gPSBlbmNvZGVBc1VpbnQ4KHZhbHVlKTsKICAgIH1gLGw9e25hbWU6IlVpbnQ4RW5jb2RlIixpbnB1dFR5cGVzOlt1LlRleHR1cmVUeXBlLnVucGFja2VkXSxpbnB1dE5hbWVzOlsiWCJdLG91dHB1dDp7ZGltczpwLHR5cGU6YS50ZW5zb3IudHlwZSx0ZXh0dXJlVHlwZTp1LlRleHR1cmVUeXBlLmRvd25sb2FkVWludDhBc0Zsb2F0fSxzaGFkZXJTb3VyY2U6ZCxoYXNNYWluOiEwfTtyZXR1cm4gaC5leGVjdXRlUHJvZ3JhbShsLFthLnRlbnNvcl0pfX0sNDkwOTooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQudGFuaD10LnRhbj10LnNxcnQ9dC5zaW49dC5zaWdtb2lkPXQucmVsdT10Lm5vdD10Lm5lZz10LmxvZz10LnBhcnNlTGVha3lSZWx1QXR0cmlidXRlcz10LmxlYWt5UmVsdT10LmlkZW50aXR5PXQuZmxvb3I9dC5leHA9dC5wYXJzZUVsdUF0dHJpYnV0ZXM9dC5lbHU9dC5jb3M9dC5jZWlsPXQuY2xpcFYxMT10LnBhcnNlQ2xpcEF0dHJpYnV0ZXM9dC5jbGlwPXQuYXRhbj10LmFzaW49dC5hY29zPXQuYWJzPXQuZ2xzbFRhbmg9dC5nbHNsVGFuPXQuZ2xzbFNxcnQ9dC5nbHNsU2lnbW9pZD10Lmdsc2xSZWx1PXQuZ2xzbFNpbj10Lmdsc2xOb3Q9dC5nbHNsTmVnPXQuZ2xzbExvZz10Lmdsc2xMZWFreVJlbHU9dC5nbHNsSWRlbnRpdHk9dC5nbHNsQ2xpcD10Lmdsc2xGbG9vcj10Lmdsc2xFeHA9dC5nbHNsRWx1PXQuZ2xzbENvcz10Lmdsc2xDZWlsPXQuZ2xzbEF0YW49dC5nbHNsQXNpbj10Lmdsc2xBY29zPXQuZ2xzbEFicz12b2lkIDA7Y29uc3Qgbz1yKDI0NiksdT1yKDI1MTcpLGg9cig4NTIwKSxhPXIoNTA2MCkscD1yKDIwMzkpO2Z1bmN0aW9uIGYoKXtyZXR1cm4gQigiYWJzIil9ZnVuY3Rpb24gZCgpe3JldHVybiBCKCJhY29zIil9ZnVuY3Rpb24gbCgpe3JldHVybiBCKCJhc2luIil9ZnVuY3Rpb24gbigpe3JldHVybiBCKCJhdGFuIil9ZnVuY3Rpb24gZSgpe3JldHVybiBCKCJjZWlsIil9ZnVuY3Rpb24gaSgpe3JldHVybiBCKCJjb3MiKX1mdW5jdGlvbiBzKEkpe2NvbnN0IEY9ImVsdSI7cmV0dXJue2JvZHk6YAogIGNvbnN0IGZsb2F0IGFscGhhID0gZmxvYXQoJHtJfSk7CgogIGZsb2F0ICR7Rn1fKGZsb2F0IGEpIHsKICAgIHJldHVybiBhID49IDAuMCA/IGE6IChleHAoYSkgLSAxLjApICogYWxwaGE7CiAgfQogIHZlYzQgJHtGfV8odmVjNCB2KSB7CiAgICByZXR1cm4gdmVjNCgke0Z9Xyh2LngpLCAke0Z9Xyh2LnkpLCAke0Z9Xyh2LnopLCAke0Z9Xyh2LncpKTsKICB9CiAgYCxuYW1lOkYsdHlwZTpoLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiBtKCl7cmV0dXJuIEIoImV4cCIpfWZ1bmN0aW9uIGcoKXtyZXR1cm4gQigiZmxvb3IiKX1mdW5jdGlvbiBfKEksRil7Y29uc3QgWD0iY2xpcCI7cmV0dXJue2JvZHk6YAogIGNvbnN0IGZsb2F0IG1pbiA9IGZsb2F0KCR7SX0pOwogIGNvbnN0IGZsb2F0IG1heCA9IGZsb2F0KCR7Rn0pOwoKICBmbG9hdCAke1h9XyhmbG9hdCBhKSB7CiAgICByZXR1cm4gY2xhbXAoYSwgbWluLCBtYXgpOwogIH0KICB2ZWM0ICR7WH1fKHZlYzQgdikgewogICAgcmV0dXJuIGNsYW1wKHYsIG1pbiwgbWF4KTsKICB9CiAgYCxuYW1lOlgsdHlwZTpoLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiBiKCl7Y29uc3QgST0iaW5kZW50aXR5IjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHtJfV8oZmxvYXQgYSkgewogICAgcmV0dXJuIGE7CiAgfQogIHZlYzQgJHtJfV8odmVjNCB2KSB7CiAgICByZXR1cm4gdjsKICB9CiAgYCxuYW1lOkksdHlwZTpoLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiB5KEkpe2NvbnN0IEY9ImxlYWt5UmVsdSI7cmV0dXJue2JvZHk6YAogIGNvbnN0IGZsb2F0IGFscGhhID0gZmxvYXQoJHtJfSk7CgogIGZsb2F0ICR7Rn1fKGZsb2F0IGEpIHsKICAgIHJldHVybiBhIDwgMC4wID8gYSAqIGFscGhhIDogYTsKICB9CiAgdmVjNCAke0Z9Xyh2ZWM0IHYpIHsKICAgIHJldHVybiB2ZWM0KCR7Rn1fKHYueCksICR7Rn1fKHYueSksICR7Rn1fKHYueiksICR7Rn1fKHYudykpOwogIH0KICBgLG5hbWU6Rix0eXBlOmguRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIFQoKXtyZXR1cm4gQigibG9nIil9ZnVuY3Rpb24gdygpe2NvbnN0IEk9Im5lZyI7cmV0dXJue2JvZHk6YAogIGZsb2F0ICR7SX1fKGZsb2F0IGEpIHsKICAgIHJldHVybiAtYTsKICB9CiAgdmVjNCAke0l9Xyh2ZWM0IHYpIHsKICAgIHJldHVybiAtdjsKICB9CiAgYCxuYW1lOkksdHlwZTpoLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiB4KCl7Y29uc3QgST0ibm90IjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHtJfV8oZmxvYXQgYSkgewogICAgcmV0dXJuIGZsb2F0KCAhIGJvb2woYSkgKTsKICB9CiAgYm9vbCAke0l9Xyhib29sIGEpIHsKICAgIHJldHVybiAhYTsKICB9CiAgdmVjNCAke0l9Xyh2ZWM0IHYpIHsKICAgIHJldHVybiB2ZWM0KCFib29sKHYueCksICFib29sKHYueSksICFib29sKHYueiksICFib29sKHYudykpOwogIH0KICBidmVjNCAke0l9XyhidmVjNCB2KSB7CiAgICByZXR1cm4gYnZlYzQoIXYueCwgIXYueSwgIXYueiwgIXYudyk7CiAgfQogIGAsbmFtZTpJLHR5cGU6aC5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gRSgpe3JldHVybiBCKCJzaW4iKX1mdW5jdGlvbiBQKCl7Y29uc3QgST0icmVsdSI7cmV0dXJue2JvZHk6YAogIGZsb2F0ICR7SX1fKGZsb2F0IGEpIHsKICAgIHJldHVybiBtYXgoIGEsIDAuMCApOwogIH0KICB2ZWM0ICR7SX1fKHZlYzQgdikgewogICAgcmV0dXJuIG1heCggdiwgMC4wICk7CiAgfQogIGAsbmFtZTpJLHR5cGU6aC5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gdigpe2NvbnN0IEk9InNpZ21vaWQiO3JldHVybntib2R5OmAKICBmbG9hdCAke0l9XyhmbG9hdCBhKSB7CiAgICByZXR1cm4gMS4wIC8gKDEuMCArIGV4cCgtYSkpOwogIH0KICB2ZWM0ICR7SX1fKHZlYzQgdikgewogICAgcmV0dXJuIDEuMCAvICgxLjAgKyBleHAoLXYpKTsKICB9CiAgYCxuYW1lOkksdHlwZTpoLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiBNKCl7cmV0dXJuIEIoInNxcnQiKX1mdW5jdGlvbiAkKCl7cmV0dXJuIEIoInRhbiIpfWZ1bmN0aW9uIHooKXtjb25zdCBJPSJ0YW5oIjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHtJfV8oZmxvYXQgYSkgewogICAgYSA9IGNsYW1wKGEsIC0xMC4sIDEwLik7CiAgICBhID0gZXhwKDIuKmEpOwogICAgcmV0dXJuIChhIC0gMS4pIC8gKGEgKyAxLik7CiAgfQogIHZlYzQgJHtJfV8odmVjNCB2KSB7CiAgICB2ID0gY2xhbXAodiwgLTEwLiwgMTAuKTsKICAgIHYgPSBleHAoMi4qdik7CiAgICByZXR1cm4gKHYgLSAxLikgLyAodiArIDEuKTsKICB9CiAgYCxuYW1lOkksdHlwZTpoLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiBCKEkpe3JldHVybntib2R5OmAKICBmbG9hdCAke0l9XyhmbG9hdCBhKSB7CiAgICByZXR1cm4gJHtJfShhKTsKICB9CiAgdmVjNCAke0l9Xyh2ZWM0IHYpIHsKICAgIHJldHVybiAke0l9KHYpOwogIH0KICBgLG5hbWU6SSx0eXBlOmguRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fXQuZ2xzbEFicz1mLHQuZ2xzbEFjb3M9ZCx0Lmdsc2xBc2luPWwsdC5nbHNsQXRhbj1uLHQuZ2xzbENlaWw9ZSx0Lmdsc2xDb3M9aSx0Lmdsc2xFbHU9cyx0Lmdsc2xFeHA9bSx0Lmdsc2xGbG9vcj1nLHQuZ2xzbENsaXA9Xyx0Lmdsc2xJZGVudGl0eT1iLHQuZ2xzbExlYWt5UmVsdT15LHQuZ2xzbExvZz1ULHQuZ2xzbE5lZz13LHQuZ2xzbE5vdD14LHQuZ2xzbFNpbj1FLHQuZ2xzbFJlbHU9UCx0Lmdsc2xTaWdtb2lkPXYsdC5nbHNsU3FydD1NLHQuZ2xzbFRhbj0kLHQuZ2xzbFRhbmg9ejtjb25zdCBOPShJLEYsWCxHKT0+e2NvbnN0IGVlPUkuc2Vzc2lvbi5wYWNrP3AuVGV4dHVyZVR5cGUucGFja2VkOnAuVGV4dHVyZVR5cGUudW5wYWNrZWQsSj17bmFtZTpYLm5hbWUsaW5wdXRUeXBlczpbZWVdLGlucHV0TmFtZXM6WyJBIl0sY2FjaGVIaW50Okd9O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sSikse2dldDooKT0+KChsZSx4ZSx3ZSxpZSk9Pntjb25zdCBUZT1sZS5zZXNzaW9uLnBhY2s/cC5UZXh0dXJlVHlwZS5wYWNrZWQ6cC5UZXh0dXJlVHlwZS51bnBhY2tlZCxiZT0oMCxhLmdldEdsc2wpKGxlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbik7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx4ZSkse291dHB1dDp7ZGltczp3ZS5kaW1zLHR5cGU6d2UudHlwZSx0ZXh0dXJlVHlwZTpUZX0sc2hhZGVyU291cmNlOmAKICAgICAke2llLmJvZHl9CiAgICAgdm9pZCBtYWluKCkgewogICAgICAgdmVjNCB2ID0gJHtiZS50ZXh0dXJlMkR9KEEsIFRleENvb3Jkcyk7CiAgICAgICB2ID0gJHtpZS5uYW1lfV8odik7CiAgICAgICAke2JlLm91dHB1dH0gPSB2OwogICAgIH0KICAgICBgLGhhc01haW46ITB9KX0pKEksSixGLFgpfSl9O3QuYWJzPShJLEYpPT5bSS5ydW4oTihJLEZbMF0sZigpKSxGKV0sdC5hY29zPShJLEYpPT5bSS5ydW4oTihJLEZbMF0sZCgpKSxGKV0sdC5hc2luPShJLEYpPT5bSS5ydW4oTihJLEZbMF0sbCgpKSxGKV0sdC5hdGFuPShJLEYpPT5bSS5ydW4oTihJLEZbMF0sbigpKSxGKV0sdC5jbGlwPShJLEYsWCk9PltJLnJ1bihOKEksRlswXSxfKFgubWluLFgubWF4KSxYLmNhY2hlS2V5KSxGKV0sdC5wYXJzZUNsaXBBdHRyaWJ1dGVzPUk9PigwLG8uY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7bWluOkkuYXR0cmlidXRlcy5nZXRGbG9hdCgibWluIix1Lk1JTl9DTElQKSxtYXg6SS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJtYXgiLHUuTUFYX0NMSVApfSksdC5jbGlwVjExPShJLEYpPT57Y29uc3QgWD1EKEksRik7cmV0dXJuKDAsdC5jbGlwKShJLFtGWzBdXSxYKX07Y29uc3QgRD0oSSxGKT0+e2lmKEYubGVuZ3RoPj0zJiYoIUkuc2Vzc2lvbi5pc0luaXRpYWxpemVyKEZbMV0uZGF0YUlkKXx8IUkuc2Vzc2lvbi5pc0luaXRpYWxpemVyKEZbMl0uZGF0YUlkKSkpdGhyb3cgbmV3IEVycm9yKCJkeW5hbWljIGNsaXAgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtjb25zdCBYPUYubGVuZ3RoPj0zP0ZbMV0ubnVtYmVyRGF0YVswXTp1Lk1JTl9DTElQLEc9Ri5sZW5ndGg+PTM/RlsyXS5udW1iZXJEYXRhWzBdOnUuTUFYX0NMSVA7cmV0dXJuKDAsby5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHttaW46WCxtYXg6R30pfTt0LmNlaWw9KEksRik9PltJLnJ1bihOKEksRlswXSxlKCkpLEYpXSx0LmNvcz0oSSxGKT0+W0kucnVuKE4oSSxGWzBdLGkoKSksRildLHQuZWx1PShJLEYsWCk9PltJLnJ1bihOKEksRlswXSxzKFguYWxwaGEpLFguY2FjaGVLZXkpLEYpXSx0LnBhcnNlRWx1QXR0cmlidXRlcz1JPT4oMCxvLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2FscGhhOkkuYXR0cmlidXRlcy5nZXRGbG9hdCgiYWxwaGEiLDEpfSksdC5leHA9KEksRik9PltJLnJ1bihOKEksRlswXSxtKCkpLEYpXSx0LmZsb29yPShJLEYpPT5bSS5ydW4oTihJLEZbMF0sZygpKSxGKV0sdC5pZGVudGl0eT0oSSxGKT0+W0kucnVuKE4oSSxGWzBdLGIoKSksRildLHQubGVha3lSZWx1PShJLEYsWCk9PltJLnJ1bihOKEksRlswXSx5KFguYWxwaGEpLFguY2FjaGVLZXkpLEYpXSx0LnBhcnNlTGVha3lSZWx1QXR0cmlidXRlcz1JPT4oMCxvLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2FscGhhOkkuYXR0cmlidXRlcy5nZXRGbG9hdCgiYWxwaGEiLC4wMSl9KSx0LmxvZz0oSSxGKT0+W0kucnVuKE4oSSxGWzBdLFQoKSksRildLHQubmVnPShJLEYpPT5bSS5ydW4oTihJLEZbMF0sdygpKSxGKV0sdC5ub3Q9KEksRik9PltJLnJ1bihOKEksRlswXSx4KCkpLEYpXSx0LnJlbHU9KEksRik9PltJLnJ1bihOKEksRlswXSxQKCkpLEYpXSx0LnNpZ21vaWQ9KEksRik9PltJLnJ1bihOKEksRlswXSx2KCkpLEYpXSx0LnNpbj0oSSxGKT0+W0kucnVuKE4oSSxGWzBdLEUoKSksRildLHQuc3FydD0oSSxGKT0+W0kucnVuKE4oSSxGWzBdLE0oKSksRildLHQudGFuPShJLEYpPT5bSS5ydW4oTihJLEZbMF0sJCgpKSxGKV0sdC50YW5oPShJLEYpPT5bSS5ydW4oTihJLEZbMF0seigpKSxGKV19LDU2MTE6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVVucGFja1Byb2dyYW1JbmZvTG9hZGVyPXQuY3JlYXRlVW5wYWNrUHJvZ3JhbUluZm89dm9pZCAwO2NvbnN0IG89cig1MDYwKSx1PXIoMjAzOSksaD1yKDkzOTApLGE9cigyODI3KSxwPXtuYW1lOiJ1bnBhY2siLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbdS5UZXh0dXJlVHlwZS5wYWNrZWRdfTt0LmNyZWF0ZVVucGFja1Byb2dyYW1JbmZvPShmLGQpPT57Y29uc3QgbD1kLmRpbXMubGVuZ3RoLG49KDAsYS5nZXRDaGFubmVscykoInJjIixsKSxlPW4uc2xpY2UoLTIpLGk9KDAsaC5nZXRDb29yZHNEYXRhVHlwZSkobCkscz0oMCxhLnVucGFja0Zyb21DaGFubmVsKSgpLG09ZC5kaW1zLmxlbmd0aD09PTA/IiI6ZnVuY3Rpb24oYix5KXtpZihiPT09MSlyZXR1cm4icmMiO2xldCBUPSIiO2ZvcihsZXQgdz0wO3c8Yjt3KyspVCs9eVt3XSx3PGItMSYmKFQrPSIsIik7cmV0dXJuIFR9KGwsbiksZz1sPD0xPyJyYyI6YHZlYzIoJHtlLmpvaW4oIiwiKX0pYCxfPWAKICAgICR7c30KICAgIHZvaWQgbWFpbigpIHsKICAgICAgJHtpfSByYyA9IGdldE91dHB1dENvb3JkcygpOwoKICAgICAgIC8vIFNhbXBsZSB0aGUgdGV4dHVyZSB3aXRoIHRoZSBjb29yZHMgdG8gZ2V0IHRoZSByZ2JhIGNoYW5uZWwgdmFsdWUuCiAgICAgICB2ZWM0IHBhY2tlZElucHV0ID0gZ2V0QSgke219KTsKCiAgICAgICAkeygwLG8uZ2V0R2xzbCkoZi5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLm91dHB1dH0gPSB2ZWM0KGdldENoYW5uZWwocGFja2VkSW5wdXQsICR7Z30pLCAwLCAwLCAwKTsKICAgICB9CiAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxwKSx7aGFzTWFpbjohMCxvdXRwdXQ6e2RpbXM6ZC5kaW1zLHR5cGU6ZC50eXBlLHRleHR1cmVUeXBlOnUuVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpffSl9LHQuY3JlYXRlVW5wYWNrUHJvZ3JhbUluZm9Mb2FkZXI9KGYsZCk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxwKSx7Z2V0OigpPT4oMCx0LmNyZWF0ZVVucGFja1Byb2dyYW1JbmZvKShmLGQpfSl9LDg0Mjg6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlVW5zcXVlZXplQXR0cmlidXRlcz10LnVuc3F1ZWV6ZVYxMz10LnVuc3F1ZWV6ZT12b2lkIDA7Y29uc3Qgbz1yKDI1MTcpO3QudW5zcXVlZXplPShhLHAsZik9Pnt1KHApO2NvbnN0IGQ9by5TaGFwZVV0aWwudW5zcXVlZXplU2hhcGUocFswXS5kaW1zLGYpO3JldHVyblthLnJlc2hhcGVVbnBhY2tlZChwWzBdLGQpXX0sdC51bnNxdWVlemVWMTM9KGEscCk9PihoKHApLCgwLHQudW5zcXVlZXplKShhLFtwWzBdXSxBcnJheS5mcm9tKHBbMV0uaW50ZWdlckRhdGEpKSksdC5wYXJzZVVuc3F1ZWV6ZUF0dHJpYnV0ZXM9YT0+YS5hdHRyaWJ1dGVzLmdldEludHMoImF4ZXMiKTtjb25zdCB1PWE9PntpZighYXx8YS5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigiVW5zcXVlZXplIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoYVswXS50eXBlPT09InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0IHRlbnNvciB0eXBlcy4iKX0saD1hPT57aWYoIWF8fGEubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3IoIlVuc3F1ZWV6ZSByZXF1aXJlcyAyIGlucHV0cy4iKTtpZihhWzFdLnR5cGUhPT0iaW50MzIiKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfX0sOTc5MzooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuc2NhbGVzVmFsaWRhdGlvbj10LnZhbGlkYXRlSW5wdXRzPXQucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXM9dC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlc1Y5PXQucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXNWNz10LnVwc2FtcGxlPXZvaWQgMDtjb25zdCBvPXIoMjQ2KSx1PXIoNTA2MCksaD1yKDIwMzkpLGE9e25hbWU6IlVwc2FtcGxlIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W2guVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnVwc2FtcGxlPShmLGQsbCk9PigoMCx0LnZhbGlkYXRlSW5wdXRzKShkLGwpLFtmLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpsLmNhY2hlS2V5LGdldDooKT0+cChmLGQsbCl9KSxkKV0pLHQucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXNWNz1mPT4oMCx0LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzKShmLDcpLHQucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXNWOT1mPT4oMCx0LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzKShmLDkpLHQucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXM9KGYsZCk9Pntjb25zdCBsPWQ+PTEwLG49Zi5hdHRyaWJ1dGVzLmdldFN0cmluZygibW9kZSIsIm5lYXJlc3QiKTtpZihuIT09Im5lYXJlc3QiJiZuIT09ImxpbmVhciImJihkPDExfHxuIT09ImN1YmljIikpdGhyb3cgbmV3IEVycm9yKGB1bnJlY29nbml6ZWQgbW9kZTogJHtufWApO2xldCBlPVtdO2Q8OSYmKGU9Zi5hdHRyaWJ1dGVzLmdldEZsb2F0cygic2NhbGVzIiksKDAsdC5zY2FsZXNWYWxpZGF0aW9uKShlLG4sbCkpO2NvbnN0IGk9Zi5hdHRyaWJ1dGVzLmdldEZsb2F0KCJleHRyYXBvbGF0aW9uX3ZhbHVlIiwwKSxzPWQ+MTA/Zi5hdHRyaWJ1dGVzLmdldFN0cmluZygiY29vcmRpbmF0ZV90cmFuc2Zvcm1hdGlvbl9tb2RlIiwiaGFsZl9waXhlbCIpOiJhc3ltbWV0cmljIjtpZihbImFzeW1tZXRyaWMiLCJweXRvcmNoX2hhbGZfcGl4ZWwiLCJ0Zl9oYWxmX3BpeGVsX2Zvcl9ubiIsImFsaWduX2Nvcm5lcnMiLCJ0Zl9jcm9wX2FuZF9yZXNpemUiLCJoYWxmX3BpeGVsIl0uaW5kZXhPZihzKT09PS0xKXRocm93IG5ldyBFcnJvcihgY29vcmRpbmF0ZV90cmFuc2Zvcm1fbW9kZSAnJHtzfScgaXMgbm90IHN1cHBvcnRlZGApO2NvbnN0IG09cz09PSJ0Zl9jcm9wX2FuZF9yZXNpemUiLGc9bSxfPW49PT0ibmVhcmVzdCImJmQ+PTExP2YuYXR0cmlidXRlcy5nZXRTdHJpbmcoIm5lYXJlc3RfbW9kZSIsInJvdW5kX3ByZWZlcl9mbG9vciIpOiIiO2lmKFsicm91bmRfcHJlZmVyX2Zsb29yIiwicm91bmRfcHJlZmVyX2NlaWwiLCJmbG9vciIsImNlaWwiLCIiXS5pbmRleE9mKF8pPT09LTEpdGhyb3cgbmV3IEVycm9yKGBuZWFyZXN0X21vZGUgJyR7X30nIGlzIG5vdCBzdXBwb3J0ZWRgKTtjb25zdCBiPWYuYXR0cmlidXRlcy5nZXRGbG9hdCgiY3ViaWNfY29lZmZfYSIsLS43NSkseT1mLmF0dHJpYnV0ZXMuZ2V0SW50KCJleGNsdWRlX291dHNpZGUiLDApIT09MDtpZih5JiZuIT09ImN1YmljIil0aHJvdyBuZXcgRXJyb3IoImV4Y2x1ZGVfb3V0c2lkZSBjYW4gYmUgc2V0IHRvIDEgb25seSB3aGVuIG1vZGUgaXMgQ1VCSUMuIik7Y29uc3QgVD1kPDExfHxuPT09Im5lYXJlc3QiJiZzPT09ImFzeW1tZXRyaWMiJiZfPT09ImZsb29yIjtsZXQgdz0wLHg9MCxFPTA7cmV0dXJuIGQ+MTA/Zi5pbnB1dHMubGVuZ3RoPjI/KHc9MSx4PTIsRT0zKTooeD0xLEU9Mik6ZD09PTkmJih4PTEpLCgwLG8uY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7b3BzZXQ6ZCxpc1Jlc2l6ZTpsLG1vZGU6bixzY2FsZXM6ZSxleHRyYXBvbGF0aW9uVmFsdWU6aSxjb29yZGluYXRlVHJhbnNmb3JtTW9kZTpzLHVzZUV4dHJhcG9sYXRpb246ZyxuZWVkUm9pSW5wdXQ6bSxuZWFyZXN0TW9kZTpfLGN1YmljQ29lZmZpY2llbnRBOmIsZXhjbHVkZU91dHNpZGU6eSx1c2VOZWFyZXN0MnhPcHRpbWl6YXRpb246VCxyb2lJbnB1dElkeDp3LHNjYWxlc0lucHV0SWR4Ongsc2l6ZXNJbnB1dElkeDpFfSl9O2NvbnN0IHA9KGYsZCxsKT0+e2NvbnN0IG49KDAsdS5nZXRHbHNsKShmLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksW2UsaV09Zi5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQoZFswXS5kaW1zLGguVGV4dHVyZVR5cGUudW5wYWNrZWQpLHM9ZFswXS5kaW1zLm1hcCgoRSxQKT0+TWF0aC5mbG9vcihFKmwuc2NhbGVzW1BdKSksW20sZ109Zi5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQocyxoLlRleHR1cmVUeXBlLnVucGFja2VkKSxfPXMubGVuZ3RoLGI9bmV3IEFycmF5KF8pLHk9bmV3IEFycmF5KF8pO2xldCBUPWAKICAgICAgaW50IG91dHB1dF9waXRjaGVzWyR7X31dOwogICAgICBpbnQgaW5wdXRfcGl0Y2hlc1ske199XTsKICAgICAgYDtmb3IobGV0IEU9Xy0xO0U+PTA7RS0tKWJbRV09RT09PV8tMT8xOmJbRSsxXSpzW0UrMV0seVtFXT1FPT09Xy0xPzE6eVtFKzFdKmRbMF0uZGltc1tFKzFdLFQrPWAKICAgICAgICBvdXRwdXRfcGl0Y2hlc1ske0V9XSA9ICR7YltFXX07CiAgICAgICAgaW5wdXRfcGl0Y2hlc1ske0V9XSA9ICR7eVtFXX07CiAgICAgICAgYDtjb25zdCB3PWAKICAgICAgZmxvYXQgZ2V0SW5wdXRGbG9hdChpbnQgaW5kZXgpIHsKICAgICAgICB2ZWMyIGNvb3JkcyA9IG9mZnNldFRvQ29vcmRzKGluZGV4LCAke2V9LCAke2l9KTsKICAgICAgICBmbG9hdCB2YWx1ZSA9IGdldENvbG9yQXNGbG9hdCgke24udGV4dHVyZTJEfShYLCBjb29yZHMpKTsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KICAgICAgYCx4PWwubW9kZT09PSJuZWFyZXN0Ij9gCiAgICAke3d9CiAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7X31dKSB7CiAgICAgIGludCBpbnB1dF9pbmRleCA9IDA7CiAgICAgIGludCBvdXRwdXRfaW5kZXggPSBjb29yZHNUb09mZnNldChUZXhDb29yZHMsICR7bX0sICR7Z30pOwoKICAgICAgJHtUfQoKICAgICAgaW50IGQsIG07CiAgICAgIGZvciAoaW50IGRpbSA9IDA7IGRpbSA8ICR7X307ICsrZGltKSB7CiAgICAgICAgZCA9IG91dHB1dF9pbmRleCAvIG91dHB1dF9waXRjaGVzW2RpbV07CiAgICAgICAgbSA9IG91dHB1dF9pbmRleCAtIGQgKiBvdXRwdXRfcGl0Y2hlc1tkaW1dOwogICAgICAgIG91dHB1dF9pbmRleCA9IG07CgogICAgICAgIGlmIChzY2FsZXNbZGltXSAhPSAxICYmIGQgPiAwKSB7CiAgICAgICAgICBpbnQgZDIgPSBkIC8gc2NhbGVzW2RpbV07CiAgICAgICAgICBtID0gZCAtIGQyICogc2NhbGVzW2RpbV07CiAgICAgICAgICBkID0gZDI7CiAgICAgICAgfQogICAgICAgIGlucHV0X2luZGV4ICs9IGlucHV0X3BpdGNoZXNbZGltXSAqIGQ7CiAgICAgIH0KCiAgICAgIHJldHVybiBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4KTsKICAgIH1gOl89PT00P2AKICAgICR7d30KICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbNF0pIHsKICAgICAgaW50IGlucHV0X2luZGV4ID0gMDsKICAgICAgaW50IG91dHB1dF9pbmRleCA9IGNvb3Jkc1RvT2Zmc2V0KFRleENvb3JkcywgJHttfSwgJHtnfSk7CgogICAgICAke1R9CgogICAgICBpbnQgbTsKICAgICAgaW50IGluZGV4X29mX2RpbTAsIGluZGV4X29mX2RpbTEsIGluZGV4X29mX2RpbTIsIGluZGV4X29mX2RpbTM7CiAgICAgIGluZGV4X29mX2RpbTAgPSBvdXRwdXRfaW5kZXggLyBvdXRwdXRfcGl0Y2hlc1swXTsKICAgICAgbSA9IG91dHB1dF9pbmRleCAtIGluZGV4X29mX2RpbTAgKiBvdXRwdXRfcGl0Y2hlc1swXTsKICAgICAgaW5kZXhfb2ZfZGltMSA9IG0gLyBvdXRwdXRfcGl0Y2hlc1sxXTsKICAgICAgbSA9IG0gLSBpbmRleF9vZl9kaW0xICogb3V0cHV0X3BpdGNoZXNbMV07CiAgICAgIGluZGV4X29mX2RpbTIgPSBtIC8gb3V0cHV0X3BpdGNoZXNbMl07CiAgICAgIG0gPSBtIC0gaW5kZXhfb2ZfZGltMiAqIG91dHB1dF9waXRjaGVzWzJdOwogICAgICBpbmRleF9vZl9kaW0zID0gbTsKCiAgICAgIGludCBpbmRleF9vZl9pbnB1dF9kaW0yLCBpbmRleF9vZl9pbnB1dF9kaW0zLCB4X29mZnNldCwgeV9vZmZzZXQ7CiAgICAgIGluZGV4X29mX2lucHV0X2RpbTIgPSBpbmRleF9vZl9kaW0yIC8gc2NhbGVzWzJdOwogICAgICB5X29mZnNldCA9IGluZGV4X29mX2RpbTIgLSBpbmRleF9vZl9pbnB1dF9kaW0yICogc2NhbGVzWzJdOwogICAgICBpbmRleF9vZl9pbnB1dF9kaW0zID0gaW5kZXhfb2ZfZGltMyAvIHNjYWxlc1szXTsKICAgICAgeF9vZmZzZXQgPSBpbmRleF9vZl9kaW0zIC0gaW5kZXhfb2ZfaW5wdXRfZGltMyAqIHNjYWxlc1szXTsKCiAgICAgIGlucHV0X2luZGV4ID0gaW5kZXhfb2ZfZGltMCAqIGlucHV0X3BpdGNoZXNbMF0gKwogICAgICAgICAgICBpbmRleF9vZl9kaW0xICogaW5wdXRfcGl0Y2hlc1sxXSArCiAgICAgICAgICAgIGluZGV4X29mX2lucHV0X2RpbTIgKiBpbnB1dF9waXRjaGVzWzJdICsKICAgICAgICAgICAgaW5kZXhfb2ZfaW5wdXRfZGltMzsKCiAgICAgIGZsb2F0IHgwMCA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXgpOwogICAgICBmbG9hdCB4MTAsIHgwMSwgeDExOwoKICAgICAgYm9vbCBlbmRfb2ZfZGltMiA9IGZhbHNlOwogICAgICBpZiAoaW5kZXhfb2ZfaW5wdXRfZGltMiA9PSAoJHtkWzBdLmRpbXNbMl19IC0gMSkpIHsKICAgICAgICAvLyBJdCdzIHRoZSBlbmQgaW4gZGltZW5zaW9uIDIKICAgICAgICB4MDEgPSB4MDA7CiAgICAgICAgZW5kX29mX2RpbTIgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHgwMSA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyBpbnB1dF9waXRjaGVzWzJdKTsKICAgICAgfQoKICAgICAgaWYgKGluZGV4X29mX2lucHV0X2RpbTMgPT0gKGlucHV0X3BpdGNoZXNbMl0gLSAxKSkgewogICAgICAgIC8vIEl0J3MgdGhlIGVuZCBpbiBkaW1lbnNpb24gMwogICAgICAgIHgxMCA9IHgwMDsKICAgICAgICB4MTEgPSB4MDE7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgeDEwID0gZ2V0SW5wdXRGbG9hdChpbnB1dF9pbmRleCArIDEpOwogICAgICAgIHgxMSA9IGVuZF9vZl9kaW0yID8geDEwIDogZ2V0SW5wdXRGbG9hdChpbnB1dF9pbmRleCArIGlucHV0X3BpdGNoZXNbMl0gKyAxKTsKICAgICAgfQoKICAgICAgZmxvYXQgeTAgPSB4MDAgKyBmbG9hdCh5X29mZnNldCkgKiAoeDAxIC0geDAwKSAvIGZsb2F0KHNjYWxlc1syXSk7CiAgICAgIGZsb2F0IHkxID0geDEwICsgZmxvYXQoeV9vZmZzZXQpICogKHgxMSAtIHgxMCkgLyBmbG9hdChzY2FsZXNbMl0pOwogICAgICByZXR1cm4geTAgKyBmbG9hdCh4X29mZnNldCkgKiAoeTEgLSB5MCkgLyBmbG9hdChzY2FsZXNbM10pOwogICAgfWA6YAogICAgJHt3fQogICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1syXSkgewogICAgICBpbnQgaW5wdXRfaW5kZXggPSAwOwogICAgICBpbnQgb3V0cHV0X2luZGV4ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke219LCAke2d9KTsKCiAgICAgICR7VH0KCiAgICAgIGludCBtOwogICAgICBpbnQgaW5kZXhfb2ZfZGltMCwgaW5kZXhfb2ZfZGltMTsKICAgICAgaW5kZXhfb2ZfZGltMCA9IG91dHB1dF9pbmRleCAvIG91dHB1dF9waXRjaGVzWzBdOwogICAgICBtID0gb3V0cHV0X2luZGV4IC0gaW5kZXhfb2ZfZGltMCAqIG91dHB1dF9waXRjaGVzWzBdOwogICAgICBpbmRleF9vZl9kaW0xID0gbTsKCiAgICAgIGludCBpbmRleF9vZl9pbnB1dF9kaW0wLCBpbmRleF9vZl9pbnB1dF9kaW0xLCB4X29mZnNldCwgeV9vZmZzZXQ7CiAgICAgIGluZGV4X29mX2lucHV0X2RpbTAgPSBpbmRleF9vZl9kaW0wIC8gc2NhbGVzWzBdOwogICAgICB5X29mZnNldCA9IGluZGV4X29mX2RpbTAgLSBpbmRleF9vZl9pbnB1dF9kaW0wICogc2NhbGVzWzBdOwogICAgICBpbmRleF9vZl9pbnB1dF9kaW0xID0gaW5kZXhfb2ZfZGltMSAvIHNjYWxlc1sxXTsKICAgICAgeF9vZmZzZXQgPSBpbmRleF9vZl9kaW0xIC0gaW5kZXhfb2ZfaW5wdXRfZGltMSAqIHNjYWxlc1sxXTsKCiAgICAgIGlucHV0X2luZGV4ID0gaW5kZXhfb2ZfaW5wdXRfZGltMCAqIGlucHV0X3BpdGNoZXNbMF0gKyBpbmRleF9vZl9pbnB1dF9kaW0xOwoKICAgICAgZmxvYXQgeDAwID0gZ2V0SW5wdXRGbG9hdChpbnB1dF9pbmRleCk7CiAgICAgIGZsb2F0IHgxMCwgeDAxLCB4MTE7CgogICAgICBib29sIGVuZF9vZl9kaW0wID0gZmFsc2U7CiAgICAgIGlmIChpbmRleF9vZl9pbnB1dF9kaW0wID09ICgke2RbMF0uZGltc1swXX0gLSAxKSkgewogICAgICAgIC8vIEl0J3MgdGhlIGVuZCBpbiBkaW1lbnNpb24gMAogICAgICAgIHgwMSA9IHgwMDsKICAgICAgICBlbmRfb2ZfZGltMCA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgeDAxID0gZ2V0SW5wdXRGbG9hdChpbnB1dF9pbmRleCArIGlucHV0X3BpdGNoZXNbMF0pOwogICAgICB9CgogICAgICBpZiAoaW5kZXhfb2ZfaW5wdXRfZGltMSA9PSAoaW5wdXRfcGl0Y2hlc1swXSAtIDEpKSB7CiAgICAgICAgLy8gSXQncyB0aGUgZW5kIGluIGRpbWVuc2lvbiAxCiAgICAgICAgeDEwID0geDAwOwogICAgICAgIHgxMSA9IHgwMTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICB4MTAgPSBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4ICsgMSk7CiAgICAgICAgeDExID0gZW5kX29mX2RpbTAgPyB4MTAgOiBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4ICsgaW5wdXRfcGl0Y2hlc1swXSArIDEpOwogICAgICB9CgogICAgICBmbG9hdCB5MCA9IHgwMCArIGZsb2F0KHlfb2Zmc2V0KSAqICh4MDEgLSB4MDApIC8gZmxvYXQoc2NhbGVzWzBdKTsKICAgICAgZmxvYXQgeTEgPSB4MTAgKyBmbG9hdCh5X29mZnNldCkgKiAoeDExIC0geDEwKSAvIGZsb2F0KHNjYWxlc1swXSk7CiAgICAgIHJldHVybiB5MCArIGZsb2F0KHhfb2Zmc2V0KSAqICh5MSAtIHkwKSAvIGZsb2F0KHNjYWxlc1sxXSk7CiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtvdXRwdXQ6e2RpbXM6cyx0eXBlOmRbMF0udHlwZSx0ZXh0dXJlVHlwZTpoLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6eCx2YXJpYWJsZXM6W3tuYW1lOiJzY2FsZXMiLHR5cGU6ImludCIsYXJyYXlMZW5ndGg6bC5zY2FsZXMubGVuZ3RoLGRhdGE6bC5zY2FsZXMubWFwKEU9Pk1hdGguY2VpbChFKSl9XX0pfTt0LnZhbGlkYXRlSW5wdXRzPShmLGQpPT57aWYoIWZ8fGQub3BzZXQ8OSYmZi5sZW5ndGghPT0xfHxkLm9wc2V0Pj05JiZkLm9wc2V0PDExJiZmLmxlbmd0aCE9PTJ8fGQub3BzZXQ+PTExJiZmLmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dHMuIik7aWYoZC5zY2FsZXMubGVuZ3RoPjAmJmZbMF0uZGltcy5sZW5ndGghPT1kLnNjYWxlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHNoYXBlLiIpO2lmKGZbMF0udHlwZT09PSJzdHJpbmciKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0ZW5zb3IgdHlwZXMuIil9LHQuc2NhbGVzVmFsaWRhdGlvbj0oZixkLGwpPT57aWYobCl7Zm9yKGNvbnN0IG4gb2YgZilpZihuPD0wKXRocm93IG5ldyBFcnJvcigiU2NhbGUgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwLiIpfWVsc2UgZm9yKGNvbnN0IG4gb2YgZilpZihuPDEpdGhyb3cgbmV3IEVycm9yKCJTY2FsZSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuIik7aWYoIShkIT09ImxpbmVhciImJmQhPT0iY3ViaWMifHxmLmxlbmd0aD09PTJ8fGYubGVuZ3RoPT09NCYmZlswXT09PTEmJmZbMV09PT0xKSl0aHJvdyBuZXcgRXJyb3IoYCdMaW5lYXInIG1vZGUgYW5kICdDdWJpYycgbW9kZSBvbmx5IHN1cHBvcnQgMi1EIGlucHV0cyAoJ0JpbGluZWFyJywgJ0JpY3ViaWMnKSAgICAgICAgIG9yIDQtRCBpbnB1dHMgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBvdXRlcm1vc3QgMiBzY2FsZSB2YWx1ZXMgYmVpbmcgMSAgICAgICAgIGluIHRoZSAke2w/IlJlc2l6ZSI6IlVwc2FtcGxlIn0gb3BlYXJ0b3IuYCl9fSwxOTU4OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Qcm9ncmFtTWFuYWdlcj12b2lkIDA7Y29uc3Qgbz1yKDE2NzApLHU9cig2MjMxKSxoPXIoODg3OSksYT1yKDUwNjApO3QuUHJvZ3JhbU1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IocCxmLGQpe3RoaXMucHJvZmlsZXI9cCx0aGlzLmdsQ29udGV4dD1mLHRoaXMudGV4dHVyZUxheW91dFN0cmF0ZWd5PWQsdGhpcy5yZXBvPW5ldyBNYXAsdGhpcy5hdHRyaWJ1dGVzQm91bmQ9ITF9Z2V0QXJ0aWZhY3QocCl7cmV0dXJuIHRoaXMucmVwby5nZXQocCl9c2V0QXJ0aWZhY3QocCxmKXt0aGlzLnJlcG8uc2V0KHAsZil9cnVuKHAsZixkKXt2YXIgbDt0aGlzLnByb2ZpbGVyLmV2ZW50KCJvcCIsYFByb2dyYW1NYW5hZ2VyLnJ1biAkeyhsPXAucHJvZ3JhbUluZm8ubmFtZSkhPT1udWxsJiZsIT09dm9pZCAwP2w6InVua25vd24ga2VybmVsIn1gLCgpPT57dmFyIG47Y29uc3QgZT10aGlzLmdsQ29udGV4dC5nbCxpPXAucHJvZ3JhbTtlLnVzZVByb2dyYW0oaSk7dHJ5e3RoaXMuYmluZE91dHB1dChkKSx0aGlzLmF0dHJpYnV0ZXNCb3VuZHx8dGhpcy5iaW5kQXR0cmlidXRlcyhwLmF0dHJpYkxvY2F0aW9ucyksdGhpcy5iaW5kVW5pZm9ybXMocC51bmlmb3JtTG9jYXRpb25zLChuPXAucHJvZ3JhbUluZm8udmFyaWFibGVzKSE9PW51bGwmJm4hPT12b2lkIDA/bjpbXSxmKX1jYXRjaChzKXt0aHJvdyB1LkxvZ2dlci5lcnJvcigiUHJvZ3JhbU1hbmFnZXIiLHAucHJvZ3JhbUluZm8uc2hhZGVyU291cmNlKSxzfXRoaXMucHJvZmlsZXIuZXZlbnQoImJhY2tlbmQiLCJHbENvbnRleHQuZHJhdygpIiwoKT0+e3RoaXMuZ2xDb250ZXh0LmRyYXcoKX0pfSx0aGlzLmdsQ29udGV4dCl9ZGlzcG9zZSgpe3RoaXMudmVydGV4U2hhZGVyJiZ0aGlzLmdsQ29udGV4dC5kZWxldGVTaGFkZXIodGhpcy52ZXJ0ZXhTaGFkZXIpLHRoaXMucmVwby5mb3JFYWNoKHA9PnRoaXMuZ2xDb250ZXh0LmRlbGV0ZVByb2dyYW0ocC5wcm9ncmFtKSl9YnVpbGQocCxmLGQpe3JldHVybiB0aGlzLnByb2ZpbGVyLmV2ZW50KCJiYWNrZW5kIiwiUHJvZ3JhbU1hbmFnZXIuYnVpbGQiLCgpPT57Y29uc3QgbD1uZXcgaC5HbHNsUHJlcHJvY2Vzc29yKHRoaXMuZ2xDb250ZXh0LHAsZixkKSxuPWwucHJlcHJvY2VzcygpLGU9dGhpcy5jb21waWxlKG4pO3JldHVybntwcm9ncmFtSW5mbzpwLHByb2dyYW06ZSx1bmlmb3JtTG9jYXRpb25zOnRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9ucyhlLGwuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLGwuY29udGV4dC5wcm9ncmFtSW5mby52YXJpYWJsZXMpLGF0dHJpYkxvY2F0aW9uczp0aGlzLmdldEF0dHJpYkxvY2F0aW9ucyhlKX19KX1jb21waWxlKHApe2lmKCF0aGlzLnZlcnRleFNoYWRlcil7dS5Mb2dnZXIudmVyYm9zZSgiUHJvcmdyYW1NYW5hZ2VyIiwiQ29tcGlsaW5nIGFuZCBjYWNoaW5nIFZlcnRleCBzaGFkZXIgZm9yIHRoZSBmaXJzdCB0aW1lIik7Y29uc3QgbD0oMCxhLmdldFZlcnRleFNoYWRlclNvdXJjZSkodGhpcy5nbENvbnRleHQudmVyc2lvbik7dGhpcy52ZXJ0ZXhTaGFkZXI9dGhpcy5nbENvbnRleHQuY29tcGlsZVNoYWRlcihsLHRoaXMuZ2xDb250ZXh0LmdsLlZFUlRFWF9TSEFERVIpfW8uZW52LmRlYnVnJiZ1LkxvZ2dlci52ZXJib3NlKCJQcm9yZ3JhbU1hbmFnZXIiLGBGcmFnU2hhZGVyOgoke3B9CmApO2NvbnN0IGY9dGhpcy5nbENvbnRleHQuY29tcGlsZVNoYWRlcihwLHRoaXMuZ2xDb250ZXh0LmdsLkZSQUdNRU5UX1NIQURFUiksZD10aGlzLmdsQ29udGV4dC5jcmVhdGVQcm9ncmFtKHRoaXMudmVydGV4U2hhZGVyLGYpO3JldHVybiB0aGlzLmdsQ29udGV4dC5kZWxldGVTaGFkZXIoZiksZH1iaW5kT3V0cHV0KHApe2NvbnN0IGY9cC53aWR0aCxkPXAuaGVpZ2h0O3UuTG9nZ2VyLnZlcmJvc2UoIlByb3JncmFtTWFuYWdlciIsYEJpbmRpbmcgb3V0cHV0IHRleHR1cmUgdG8gRnJhbWVidWZmZXI6IHcvaD0ke2Z9LyR7ZH0sIHNoYXBlPSR7cC5zaGFwZX0sIHR5cGU9JHtwLnRlbnNvci50eXBlfWApLHRoaXMuZ2xDb250ZXh0LmF0dGFjaEZyYW1lYnVmZmVyKHAudGV4dHVyZSxmLGQpfWJpbmRBdHRyaWJ1dGVzKHApe2NvbnN0IGY9cC5wb3NpdGlvbixkPXAudGV4dHVyZUNvb3JkO3RoaXMuZ2xDb250ZXh0LnNldFZlcnRleEF0dHJpYnV0ZXMoZixkKSx0aGlzLmF0dHJpYnV0ZXNCb3VuZD0hMH1iaW5kVW5pZm9ybXMocCxmLGQpe3ZhciBsO2NvbnN0IG49dGhpcy5nbENvbnRleHQuZ2w7bGV0IGU9MDtmb3IoY29uc3R7bmFtZTppLHR5cGU6cyxsb2NhdGlvbjptLGFycmF5TGVuZ3RoOmd9b2YgcCl7Y29uc3QgXz0obD1mLmZpbmQoYj0+Yi5uYW1lPT09aSkpPT09bnVsbHx8bD09PXZvaWQgMD92b2lkIDA6bC5kYXRhO2lmKHMhPT0ic2FtcGxlcjJEIiYmIV8pdGhyb3cgbmV3IEVycm9yKGB2YXJpYWJsZSAnJHtpfScgZG9lcyBub3QgaGF2ZSBkYXRhIGRlZmluZWQgaW4gcHJvZ3JhbSBpbmZvYCk7c3dpdGNoKHMpe2Nhc2Uic2FtcGxlcjJEIjp0aGlzLmJpbmRUZXh0dXJlKGRbZV0sbSxlKSxlKys7YnJlYWs7Y2FzZSJmbG9hdCI6Zz9uLnVuaWZvcm0xZnYobSxfKTpuLnVuaWZvcm0xZihtLF8pO2JyZWFrO2Nhc2UiaW50IjpnP24udW5pZm9ybTFpdihtLF8pOm4udW5pZm9ybTFpKG0sXyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuaWZvcm0gbm90IGltcGxlbWVudGVkOiAke3N9YCl9fX1iaW5kVGV4dHVyZShwLGYsZCl7dGhpcy5nbENvbnRleHQuYmluZFRleHR1cmVUb1VuaWZvcm0ocC50ZXh0dXJlLGQsZil9Z2V0QXR0cmliTG9jYXRpb25zKHApe3JldHVybntwb3NpdGlvbjp0aGlzLmdldEF0dHJpYkxvY2F0aW9uKHAsInBvc2l0aW9uIiksdGV4dHVyZUNvb3JkOnRoaXMuZ2V0QXR0cmliTG9jYXRpb24ocCwidGV4dHVyZUNvb3JkIil9fWdldFVuaWZvcm1Mb2NhdGlvbnMocCxmLGQpe2NvbnN0IGw9W107aWYoZilmb3IoY29uc3QgbiBvZiBmKWwucHVzaCh7bmFtZTpuLHR5cGU6InNhbXBsZXIyRCIsbG9jYXRpb246dGhpcy5nZXRVbmlmb3JtTG9jYXRpb24ocCxuKX0pO2lmKGQpZm9yKGNvbnN0IG4gb2YgZClsLnB1c2goT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4pLHtsb2NhdGlvbjp0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbihwLG4ubmFtZSl9KSk7cmV0dXJuIGx9Z2V0VW5pZm9ybUxvY2F0aW9uKHAsZil7Y29uc3QgZD10aGlzLmdsQ29udGV4dC5nbC5nZXRVbmlmb3JtTG9jYXRpb24ocCxmKTtpZihkPT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoYFVuaWZvcm0gJHtmfSBub3QgZm91bmQuYCk7cmV0dXJuIGR9Z2V0QXR0cmliTG9jYXRpb24ocCxmKXtyZXR1cm4gdGhpcy5nbENvbnRleHQuZ2wuZ2V0QXR0cmliTG9jYXRpb24ocCxmKX19fSw2NDE2OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5XZWJHTFNlc3Npb25IYW5kbGVyPXZvaWQgMDtjb25zdCBvPXIoNjIzMSksdT1yKDEwNDcpLGg9cig4MzE2KSxhPXIoMTY0MCkscD1yKDE5NTgpLGY9cig3ODU5KSxkPXIoNTcwMik7dC5XZWJHTFNlc3Npb25IYW5kbGVyPWNsYXNze2NvbnN0cnVjdG9yKGwsbil7dGhpcy5iYWNrZW5kPWwsdGhpcy5jb250ZXh0PW4sdGhpcy5sYXlvdXRTdHJhdGVneT1uZXcgZi5QcmVmZXJMb2dpY2FsU3RyYXRlZ3kobC5nbENvbnRleHQubWF4VGV4dHVyZVNpemUpLHRoaXMucHJvZ3JhbU1hbmFnZXI9bmV3IHAuUHJvZ3JhbU1hbmFnZXIodGhpcy5jb250ZXh0LnByb2ZpbGVyLGwuZ2xDb250ZXh0LHRoaXMubGF5b3V0U3RyYXRlZ3kpLHRoaXMudGV4dHVyZU1hbmFnZXI9bmV3IGQuVGV4dHVyZU1hbmFnZXIobC5nbENvbnRleHQsdGhpcy5sYXlvdXRTdHJhdGVneSx0aGlzLmNvbnRleHQucHJvZmlsZXIse3JldXNlVGV4dHVyZXM6bC50ZXh0dXJlQ2FjaGVNb2RlPT09ImZ1bGwifSksdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlPW5ldyBNYXAsdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnBhY2s9bC5wYWNrLHRoaXMucGFjazJ1bnBhY2tNYXA9bmV3IE1hcCx0aGlzLnVucGFjazJwYWNrTWFwPW5ldyBNYXB9Y3JlYXRlSW5mZXJlbmNlSGFuZGxlcigpe3JldHVybiBuZXcgaC5XZWJHTEluZmVyZW5jZUhhbmRsZXIodGhpcyl9b25HcmFwaEluaXRpYWxpemVkKGwpe2NvbnN0IG49bC5nZXRWYWx1ZXMoKS5maWx0ZXIoZT0+ZS5mcm9tPT09LTEmJmUudGVuc29yKS5tYXAoZT0+ZS50ZW5zb3IuZGF0YUlkKTt0aGlzLmluaXRpYWxpemVycz1uZXcgU2V0KG4pfWlzSW5pdGlhbGl6ZXIobCl7cmV0dXJuISF0aGlzLmluaXRpYWxpemVycyYmdGhpcy5pbml0aWFsaXplcnMuaGFzKGwpfWFkZEluaXRpYWxpemVyKGwpe3RoaXMuaW5pdGlhbGl6ZXJzLmFkZChsKX1nZXRUZXh0dXJlRGF0YShsLG4pe3JldHVybiBuP3RoaXMucGFja2VkVGV4dHVyZURhdGFDYWNoZS5nZXQobCk6dGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUuZ2V0KGwpfXNldFRleHR1cmVEYXRhKGwsbixlPSExKXtvLkxvZ2dlci52ZXJib3NlKCJXZWJHTFNlc3Npb25IYW5kbGVyIiwiU3RvcmluZyBUZXh0dXJlIGRhdGEgaW4gY2FjaGUiKSxlP3RoaXMucGFja2VkVGV4dHVyZURhdGFDYWNoZS5zZXQobCxuKTp0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZS5zZXQobCxuKX1kaXNwb3NlKCl7dGhpcy5wcm9ncmFtTWFuYWdlci5kaXNwb3NlKCksdGhpcy50ZXh0dXJlTWFuYWdlci5jbGVhckFjdGl2ZVRleHR1cmVzKCksdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmZvckVhY2gobD0+dGhpcy50ZXh0dXJlTWFuYWdlci5yZWxlYXNlVGV4dHVyZShsLCEwKSksdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlPW5ldyBNYXAsdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUuZm9yRWFjaChsPT50aGlzLnRleHR1cmVNYW5hZ2VyLnJlbGVhc2VUZXh0dXJlKGwsITApKSx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZT1uZXcgTWFwfXJlc29sdmUobCxuLGUpe2NvbnN0IGk9KDAsdS5yZXNvbHZlT3BlcmF0b3IpKGwsbixhLldFQkdMX09QX1JFU09MVkVfUlVMRVMpO3JldHVybntpbXBsOmkub3BJbXBsLGNvbnRleHQ6aS5vcEluaXQ/aS5vcEluaXQobCxlKTpsfX19fSw3NzY5OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5VaW50OERhdGFFbmNvZGVyPXQuUkdCQUZsb2F0RGF0YUVuY29kZXI9dC5SZWRGbG9hdDMyRGF0YUVuY29kZXI9dm9pZCAwO2NvbnN0IG89cig2MjMxKTt0LlJlZEZsb2F0MzJEYXRhRW5jb2Rlcj1jbGFzc3tjb25zdHJ1Y3Rvcih1LGg9MSl7aWYoaD09PTEpdGhpcy5pbnRlcm5hbEZvcm1hdD11LlIzMkYsdGhpcy5mb3JtYXQ9dS5SRUQsdGhpcy50ZXh0dXJlVHlwZT11LkZMT0FULHRoaXMuY2hhbm5lbFNpemU9aDtlbHNle2lmKGghPT00KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICR7aH1gKTt0aGlzLmludGVybmFsRm9ybWF0PXUuUkdCQTMyRix0aGlzLmZvcm1hdD11LlJHQkEsdGhpcy50ZXh0dXJlVHlwZT11LkZMT0FULHRoaXMuY2hhbm5lbFNpemU9aH19ZW5jb2RlKHUsaCl7bGV0IGEscDtyZXR1cm4gdS5jb25zdHJ1Y3RvciE9PUZsb2F0MzJBcnJheSYmKG8uTG9nZ2VyLndhcm5pbmcoIkVuY29kZXIiLCJkYXRhIHdhcyBub3Qgb2YgdHlwZSBGbG9hdDMyOyBjcmVhdGluZyBuZXcgRmxvYXQzMkFycmF5IikscD1uZXcgRmxvYXQzMkFycmF5KHUpKSxoKnRoaXMuY2hhbm5lbFNpemU+dS5sZW5ndGg/KG8uTG9nZ2VyLndhcm5pbmcoIkVuY29kZXIiLCJTb3VyY2UgZGF0YSB0b28gc21hbGwuIEFsbG9jYXRpbmcgbGFyZ2VyIGFycmF5IikscD11LGE9dGhpcy5hbGxvY2F0ZShoKnRoaXMuY2hhbm5lbFNpemUpLHAuZm9yRWFjaCgoZixkKT0+YVtkXT1mKSk6KHA9dSxhPXApLGF9YWxsb2NhdGUodSl7cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoNCp1KX1kZWNvZGUodSxoKXtyZXR1cm4gdGhpcy5jaGFubmVsU2l6ZT09PTE/dS5maWx0ZXIoKGEscCk9PnAlND09MCkuc3ViYXJyYXkoMCxoKTp1LnN1YmFycmF5KDAsaCl9fSx0LlJHQkFGbG9hdERhdGFFbmNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKHUsaD0xLGEpe2lmKGghPT0xJiZoIT09NCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzOiAke2h9YCk7dGhpcy5pbnRlcm5hbEZvcm1hdD11LlJHQkEsdGhpcy5mb3JtYXQ9dS5SR0JBLHRoaXMuY2hhbm5lbFNpemU9aCx0aGlzLnRleHR1cmVUeXBlPWF8fHUuRkxPQVR9ZW5jb2RlKHUsaCl7bGV0IGE9dTtyZXR1cm4gdGhpcy5jaGFubmVsU2l6ZT09PTEmJihvLkxvZ2dlci52ZXJib3NlKCJFbmNvZGVyIiwiRXhwbG9kaW5nIGludG8gYSBsYXJnZXIgYXJyYXkiKSxhPXRoaXMuYWxsb2NhdGUoaCksdS5mb3JFYWNoKChwLGYpPT5hWzQqZl09cCkpLGF9YWxsb2NhdGUodSl7cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoNCp1KX1kZWNvZGUodSxoKXtyZXR1cm4gdGhpcy5jaGFubmVsU2l6ZT09PTE/dS5maWx0ZXIoKGEscCk9PnAlND09MCkuc3ViYXJyYXkoMCxoKTp1LnN1YmFycmF5KDAsaCl9fSx0LlVpbnQ4RGF0YUVuY29kZXI9Y2xhc3N7Y29uc3RydWN0b3IodSxoPTEpe2lmKHRoaXMuY2hhbm5lbFNpemU9NCxoPT09MSl0aGlzLmludGVybmFsRm9ybWF0PXUuQUxQSEEsdGhpcy5mb3JtYXQ9dS5BTFBIQSx0aGlzLnRleHR1cmVUeXBlPXUuVU5TSUdORURfQllURSx0aGlzLmNoYW5uZWxTaXplPWg7ZWxzZXtpZihoIT09NCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzOiAke2h9YCk7dGhpcy5pbnRlcm5hbEZvcm1hdD11LlJHQkEsdGhpcy5mb3JtYXQ9dS5SR0JBLHRoaXMudGV4dHVyZVR5cGU9dS5VTlNJR05FRF9CWVRFLHRoaXMuY2hhbm5lbFNpemU9aH19ZW5jb2RlKHUsaCl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHUuYnVmZmVyLHUuYnl0ZU9mZnNldCx1LmJ5dGVMZW5ndGgpfWFsbG9jYXRlKHUpe3JldHVybiBuZXcgVWludDhBcnJheSh1KnRoaXMuY2hhbm5lbFNpemUpfWRlY29kZSh1LGgpe2lmKHUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiB1LnN1YmFycmF5KDAsaCk7dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFycmF5IHR5cGU6ICR7dS5jb25zdHJ1Y3Rvcn1gKX19fSw3ODU5OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5nZXRCYXRjaERpbT10LnNpemVUb1NxdWFyaXNoU2hhcGU9dC5nZXRSb3dzQ29scz10LnNpemVGcm9tU2hhcGU9dC5pc0ludD10LnBhcnNlQXhpc1BhcmFtPXQuc3F1ZWV6ZVNoYXBlPXQuUHJlZmVyTG9naWNhbFN0cmF0ZWd5PXQuQWx3YXlzS2VlcE9yaWdpbmFsU2l6ZVN0cmF0ZWd5PXZvaWQgMDtjb25zdCBvPXIoNjIzMSksdT1yKDI1MTcpO2Z1bmN0aW9uIGgobCxuKXtjb25zdCBlPVtdLGk9W10scz1uIT1udWxsJiZBcnJheS5pc0FycmF5KG4pJiZuLmxlbmd0aD09PTAsbT1uPT1udWxsfHxzP251bGw6YShuLGwpLnNvcnQoKTtsZXQgZz0wO2ZvcihsZXQgXz0wO188bC5sZW5ndGg7KytfKXtpZihtIT1udWxsKXtpZihtW2ddPT09XyYmbFtfXSE9PTEpdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBzcXVlZXplIGF4aXMgJHtffSBzaW5jZSBpdHMgZGltICcke2xbX119JyBpcyBub3QgMWApOyhtW2ddPT1udWxsfHxtW2ddPl8pJiZsW19dPT09MSYmKGUucHVzaChsW19dKSxpLnB1c2goXykpLG1bZ108PV8mJmcrK31sW19dIT09MSYmKGUucHVzaChsW19dKSxpLnB1c2goXykpfXJldHVybntuZXdTaGFwZTplLGtlcHREaW1zOml9fWZ1bmN0aW9uIGEobCxuKXtjb25zdCBlPW4ubGVuZ3RoO3JldHVybiBsPWw9PW51bGw/bi5tYXAoKGkscyk9PnMpOltdLmNvbmNhdChsKSwoMCx1LmFzc2VydCkobC5ldmVyeShpPT5pPj0tZSYmaTxlKSwoKT0+YEFsbCB2YWx1ZXMgaW4gYXhpcyBwYXJhbSBtdXN0IGJlIGluIHJhbmdlIFstJHtlfSwgJHtlfSkgYnV0IGdvdCBheGlzICR7bH1gKSwoMCx1LmFzc2VydCkobC5ldmVyeShwKSwoKT0+YEFsbCB2YWx1ZXMgaW4gYXhpcyBwYXJhbSBtdXN0IGJlIGludGVnZXJzIGJ1dCBnb3QgYXhpcyAke2x9YCksbC5tYXAoaT0+aTwwP2UraTppKX1mdW5jdGlvbiBwKGwpe3JldHVybiBsJTE9PTB9ZnVuY3Rpb24gZihsKXtpZihsLmxlbmd0aD09PTApcmV0dXJuIDE7bGV0IG49bFswXTtmb3IobGV0IGU9MTtlPGwubGVuZ3RoO2UrKyluKj1sW2VdO3JldHVybiBufWZ1bmN0aW9uIGQobCl7Y29uc3Qgbj1NYXRoLmNlaWwoTWF0aC5zcXJ0KGwpKTtyZXR1cm5bbixNYXRoLmNlaWwobC9uKV19dC5BbHdheXNLZWVwT3JpZ2luYWxTaXplU3RyYXRlZ3k9Y2xhc3N7Y29uc3RydWN0b3IobCl7dGhpcy5tYXhUZXh0dXJlU2l6ZT1sfWNvbXB1dGVUZXh0dXJlV0gobCxuKXtpZihsLmxlbmd0aD09PTApcmV0dXJuWzEsMV07Y29uc3QgZT10aGlzLm1heFRleHR1cmVTaXplO2lmKG4mJm4uYnJlYWtBeGlzIT09dm9pZCAwKXtjb25zdCBtPW4uYnJlYWtBeGlzPj1sLmxlbmd0aD8xOmwuc2xpY2Uobi5icmVha0F4aXMpLnJlZHVjZSgoXyxiKT0+XypiKSxnPW4uYnJlYWtBeGlzPD0wPzE6bC5zbGljZSgwLG4uYnJlYWtBeGlzKS5yZWR1Y2UoKF8sYik9Pl8qYik7aWYoIShtPmV8fGc+ZSkpcmV0dXJuW20sZ107by5Mb2dnZXIudmVyYm9zZSgiVGV4dHVyZUxheW91dCIsYEdpdmVuIHdpZHRoL2hlaWdodCBwcmVmZXJlbmNlcyB3ZXJlIHVuYXR0YWluYWJsZTogc2hhcGU6JHtsfSwgYnJlYWtBeGlzOiR7bi5icmVha0F4aXN9YCl9Y29uc3QgaT1sLnJlZHVjZSgobSxnKT0+bSpnKTtsZXQgcz1NYXRoLmZsb29yKE1hdGguc3FydChpKSk7Zm9yKDtzPGUmJnM8aSYmaSVzIT0wO3MrKyk7aWYocz49ZXx8aSVzIT0wKXRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIGRpbWVuc2lvbnMgYXJlIG91dHNpZGUgdGhpcyBHUFUncyBib3VuZGFyaWVzOiAke2x9YCk7cmV0dXJuW3MsaS9zXX19LHQuUHJlZmVyTG9naWNhbFN0cmF0ZWd5PWNsYXNze2NvbnN0cnVjdG9yKGwpe3RoaXMubWF4VGV4dHVyZVNpemU9bH1jb21wdXRlVGV4dHVyZVdIKGwsbil7Y29uc3QgZT10aGlzLmNvbXB1dGVUZXh0dXJlKGwsbik7cmV0dXJuIG4mJm4uaXNQYWNrZWQmJihlWzBdLz0yLGVbMV0vPTIpLG4mJm4ucmV2ZXJzZVdIP1tlWzFdLGVbMF1dOmV9Y29tcHV0ZVRleHR1cmUobCxuKXtjb25zdCBlPW4mJm4uaXNQYWNrZWQ7aWYobC5sZW5ndGg9PT0wKXJldHVybiBlP1syLDJdOlsxLDFdO2xldCBpPXRoaXMubWF4VGV4dHVyZVNpemU7aWYobiYmbi5icmVha0F4aXMhPT12b2lkIDApe2NvbnN0IGc9bi5icmVha0F4aXM+PWwubGVuZ3RoPzE6bC5zbGljZShuLmJyZWFrQXhpcykucmVkdWNlKChiLHkpPT5iKnkpLF89bi5icmVha0F4aXM8PTA/MTpsLnNsaWNlKDAsbi5icmVha0F4aXMpLnJlZHVjZSgoYix5KT0+Yip5KTtpZighKGc+aXx8Xz5pKSlyZXR1cm5bZyxfXTtvLkxvZ2dlci52ZXJib3NlKCJUZXh0dXJlTGF5b3V0IixgR2l2ZW4gd2lkdGgvaGVpZ2h0IHByZWZlcmVuY2VzIHdlcmUgdW5hdHRhaW5hYmxlOiBzaGFwZToke2x9LCBicmVha0F4aXM6JHtuLmJyZWFrQXhpc31gKX1sZXQgcz1sLnNsaWNlKDApO2UmJihpKj0yLHM9cy5tYXAoKGcsXyk9Pl8+PXMubGVuZ3RoLTI/c1tfXSUyPT0wP3NbX106c1tfXSsxOnNbX10pLHMubGVuZ3RoPT09MSYmKHM9WzIsc1swXV0pKSxzLmxlbmd0aCE9PTImJihzPWgocykubmV3U2hhcGUpO2NvbnN0IG09ZihzKTtyZXR1cm4gcy5sZW5ndGg8PTEmJm08PWk/WzEsbV06cy5sZW5ndGg9PT0yJiZzWzBdPD1pJiZzWzFdPD1pP3M6cy5sZW5ndGg9PT0zJiZzWzBdKnNbMV08PWkmJnNbMl08PWk/W3NbMF0qc1sxXSxzWzJdXTpzLmxlbmd0aD09PTMmJnNbMF08PWkmJnNbMV0qc1syXTw9aT9bc1swXSxzWzFdKnNbMl1dOnMubGVuZ3RoPT09NCYmc1swXSpzWzFdKnNbMl08PWkmJnNbM108PWk/W3NbMF0qc1sxXSpzWzJdLHNbM11dOnMubGVuZ3RoPT09NCYmc1swXTw9aSYmc1sxXSpzWzJdKnNbM108PWk/W3NbMF0sc1sxXSpzWzJdKnNbM11dOmU/ZChtLzQpLm1hcChnPT4yKmcpOmQobSl9fSx0LnNxdWVlemVTaGFwZT1oLHQucGFyc2VBeGlzUGFyYW09YSx0LmlzSW50PXAsdC5zaXplRnJvbVNoYXBlPWYsdC5nZXRSb3dzQ29scz1mdW5jdGlvbihsKXtpZihsLmxlbmd0aD09PTApdGhyb3cgRXJyb3IoIkNhbm5vdCBnZXQgcm93cyBhbmQgY29sdW1ucyBvZiBhbiBlbXB0eSBzaGFwZSBhcnJheS4iKTtyZXR1cm5bbC5sZW5ndGg+MT9sW2wubGVuZ3RoLTJdOjEsbFtsLmxlbmd0aC0xXV19LHQuc2l6ZVRvU3F1YXJpc2hTaGFwZT1kLHQuZ2V0QmF0Y2hEaW09ZnVuY3Rpb24obCxuPTIpe3JldHVybiBmKGwuc2xpY2UoMCxsLmxlbmd0aC1uKSl9fSw0MDU3OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVNoYXBlPXQuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0PXQuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZT12b2lkIDA7Y29uc3Qgbz1yKDI1MTcpLHU9cigyMDM5KTt0LmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tVGV4dHVyZVR5cGU9KGgsYSxwKT0+e2NvbnN0IGY9cD09PXUuVGV4dHVyZVR5cGUudW5wYWNrZWR8fHA9PT11LlRleHR1cmVUeXBlLnVucGFja2VkUmV2ZXJzZWQ/MTo0LGQ9cD09PXUuVGV4dHVyZVR5cGUucGFja2VkLGw9cD09PXUuVGV4dHVyZVR5cGUudW5wYWNrZWRSZXZlcnNlZHx8cD09PXUuVGV4dHVyZVR5cGUucGFja2VkLG49cD09PXUuVGV4dHVyZVR5cGUucGFja2VkTGFzdERpbWVuc2lvbj9hLmxlbmd0aC0xOnZvaWQgMCxlPXA9PT11LlRleHR1cmVUeXBlLnBhY2tlZExhc3REaW1lbnNpb24/YS5tYXAoKGkscyk9PnM9PT1hLmxlbmd0aC0xPzQqaTppKTp2b2lkIDA7cmV0dXJuKDAsdC5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVNoYXBlKShoLGEsZixlLHtpc1BhY2tlZDpkLHJldmVyc2VXSDpsLGJyZWFrQXhpczpufSl9LHQuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0PShoLGEscCk9Pntjb25zdCBmPSgwLHQuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZSkoaCxhLHApO3JldHVybltmLndpZHRoLGYuaGVpZ2h0XX0sdC5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVNoYXBlPShoLGEscD0xLGYsZCk9Pntjb25zdCBsPSEoIWR8fCFkLmlzUGFja2VkKSxbbixlXT1oLmNvbXB1dGVUZXh0dXJlV0gobCYmZnx8YSxkKSxpPWEubGVuZ3RoO2xldCBzPWEuc2xpY2UoMCk7aWYoaT09PTAmJihzPVsxXSkscD09PTEpZj1hO2Vsc2UgaWYobCl7aWYocCE9PTQpdGhyb3cgbmV3IEVycm9yKCJhIHBhY2tlZCB0ZXh0dXJlIG11c3QgYmUgNC1jaGFubmVsIik7Zj1hLGk+MCYmKHNbaS0xXT1NYXRoLmNlaWwoc1tpLTFdLzIpKSxpPjEmJihzW2ktMl09TWF0aC5jZWlsKHNbaS0yXS8yKSl9ZWxzZSBpZighZil0aHJvdyBuZXcgRXJyb3IoIlVucGFja2VkIHNoYXBlIGlzIG5lZWRlZCB3aGVuIHVzaW5nIGNoYW5uZWxzID4gMSIpO3JldHVybnt3aWR0aDpuLGhlaWdodDplLGNoYW5uZWxzOnAsaXNQYWNrZWQ6bCxzaGFwZTpzLHN0cmlkZXM6by5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXMocyksdW5wYWNrZWRTaGFwZTpmLHJldmVyc2VkV0g6ZCYmZC5yZXZlcnNlV0h9fX0sNTcwMjooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuVGV4dHVyZU1hbmFnZXI9dm9pZCAwO2NvbnN0IG89cig2MjMxKTt0LlRleHR1cmVNYW5hZ2VyPWNsYXNze2NvbnN0cnVjdG9yKHUsaCxhLHApe3RoaXMuZ2xDb250ZXh0PXUsdGhpcy5sYXlvdXRTdHJhdGVneT1oLHRoaXMucHJvZmlsZXI9YSx0aGlzLmNvbmZpZz1wLHRoaXMucGVuZGluZ1JlYWQ9bmV3IE1hcCxwLnJldXNlVGV4dHVyZXMmJih0aGlzLmluVXNlVGV4dHVyZXM9bmV3IE1hcCx0aGlzLmlkbGVUZXh0dXJlcz1uZXcgTWFwLHRoaXMudGV4dHVyZUxvb2t1cD1uZXcgTWFwKX1jcmVhdGVUZXh0dXJlRnJvbUxheW91dCh1LGgsYSxwKXtjb25zdCBmPXRoaXMudG9FbmNvZGVyVHlwZSh1KSxkPXRoaXMuZ2xDb250ZXh0LmdldEVuY29kZXIoZixoLmNoYW5uZWxzfHwxLHApO2lmKGguaXNQYWNrZWQmJnA9PT0xKXRocm93IG5ldyBFcnJvcigibm90IGltcGxlbWVudGVkIik7Y29uc3QgbD1oLndpZHRoLG49aC5oZWlnaHQ7bGV0IGUsaTtpZih0aGlzLmNvbmZpZy5yZXVzZVRleHR1cmVzKXtlPWAke2x9eCR7bn1fJHtkLmZvcm1hdH1fJHtkLmludGVybmFsRm9ybWF0fV8ke2QudGV4dHVyZVR5cGV9YCxpPXRoaXMuaW5Vc2VUZXh0dXJlcy5nZXQoZSksaXx8KGk9W10sdGhpcy5pblVzZVRleHR1cmVzLnNldChlLGkpKTtjb25zdCBtPXRoaXMuaWRsZVRleHR1cmVzLmdldChlKTtpZihtJiZtLmxlbmd0aD4wKXtjb25zdCBnPW0ucG9wKCk7cmV0dXJuIGkucHVzaChnKSxwPT09MSYmdGhpcy5nbENvbnRleHQudXBkYXRlVGV4dHVyZShnLGwsbixkLHRoaXMudG9UZXh0dXJlRGF0YSh1LGEpKSxnfX1vLkxvZ2dlci52ZXJib3NlKCJUZXh0dXJlTWFuYWdlciIsYENyZWF0aW5nIG5ldyB0ZXh0dXJlIG9mIHNpemUgJHtoLndpZHRofXgke2guaGVpZ2h0fWApO2NvbnN0IHM9dGhpcy5nbENvbnRleHQuYWxsb2NhdGVUZXh0dXJlKGwsbixkLHRoaXMudG9UZXh0dXJlRGF0YSh1LGEpKTtyZXR1cm4gdGhpcy5jb25maWcucmV1c2VUZXh0dXJlcyYmKGkucHVzaChzKSx0aGlzLnRleHR1cmVMb29rdXAuc2V0KHMsZSkpLHN9cmVhZFRleHR1cmUodSxoLGEpe3JldHVybiBhfHwoYT0xKSx0aGlzLnByb2ZpbGVyLmV2ZW50KCJiYWNrZW5kIiwiVGV4dHVyZU1hbmFnZXIucmVhZFRleHR1cmUiLCgpPT57Y29uc3QgcD11LnNoYXBlLnJlZHVjZSgoZCxsKT0+ZCpsKSphLGY9dGhpcy5nbENvbnRleHQucmVhZFRleHR1cmUodS50ZXh0dXJlLHUud2lkdGgsdS5oZWlnaHQscCx0aGlzLnRvRW5jb2RlclR5cGUoaCksYSk7cmV0dXJuIHRoaXMudG9UZW5zb3JEYXRhKGgsZil9KX1hc3luYyByZWFkVGV4dHVyZUFzeW5jKHUsaCxhKXtjb25zdCBwPXUudGVuc29yLmRhdGFJZDtpZihhfHwoYT0xKSx0aGlzLnBlbmRpbmdSZWFkLmhhcyhwKSl7Y29uc3QgZj10aGlzLnBlbmRpbmdSZWFkLmdldChwKTtyZXR1cm4gbmV3IFByb21pc2UoZD0+Zj09bnVsbD92b2lkIDA6Zi5wdXNoKGQpKX1yZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlRleHR1cmVNYW5hZ2VyLnJlYWRUZXh0dXJlQXN5bmMiLGFzeW5jKCk9Pnt0aGlzLnBlbmRpbmdSZWFkLnNldChwLFtdKTtjb25zdCBmPXUuc2hhcGUucmVkdWNlKChlLGkpPT5lKmkpKmE7YXdhaXQgdGhpcy5nbENvbnRleHQuY3JlYXRlQW5kV2FpdEZvckZlbmNlKCk7Y29uc3QgZD10aGlzLmdsQ29udGV4dC5yZWFkVGV4dHVyZSh1LnRleHR1cmUsdS53aWR0aCx1LmhlaWdodCxmLHRoaXMudG9FbmNvZGVyVHlwZShoKSxhKSxsPXRoaXMudG9UZW5zb3JEYXRhKGgsZCksbj10aGlzLnBlbmRpbmdSZWFkLmdldChwKTtyZXR1cm4gdGhpcy5wZW5kaW5nUmVhZC5kZWxldGUocCksbj09bnVsbHx8bi5mb3JFYWNoKGU9PmUobCkpLGx9KX1yZWFkVWludDhUZXh0dXJlQXNGbG9hdCh1KXtyZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlRleHR1cmVNYW5hZ2VyLnJlYWRVaW50OFRleHR1cmVBc0Zsb2F0IiwoKT0+e2NvbnN0IGg9dS5zaGFwZS5yZWR1Y2UoKHAsZik9PnAqZiksYT10aGlzLmdsQ29udGV4dC5yZWFkVGV4dHVyZSh1LnRleHR1cmUsdS53aWR0aCx1LmhlaWdodCw0KmgsImJ5dGUiLDQpO3JldHVybiBuZXcgRmxvYXQzMkFycmF5KGEuYnVmZmVyLGEuYnl0ZU9mZnNldCxoKX0pfXJlbGVhc2VUZXh0dXJlKHUsaCl7bGV0IGE7aWYodGhpcy5jb25maWcucmV1c2VUZXh0dXJlcyYmKGE9dGhpcy50ZXh0dXJlTG9va3VwLmdldCh1LnRleHR1cmUpLGEpKXtoJiZ0aGlzLnRleHR1cmVMb29rdXAuZGVsZXRlKGEpO2NvbnN0IHA9dGhpcy5pblVzZVRleHR1cmVzLmdldChhKTtpZihwKXtjb25zdCBmPXAuaW5kZXhPZih1LnRleHR1cmUpO2lmKGYhPT0tMSl7cC5zcGxpY2UoZiwxKTtsZXQgZD10aGlzLmlkbGVUZXh0dXJlcy5nZXQoYSk7ZHx8KGQ9W10sdGhpcy5pZGxlVGV4dHVyZXMuc2V0KGEsZCkpLGQucHVzaCh1LnRleHR1cmUpfX19YSYmIWh8fChvLkxvZ2dlci52ZXJib3NlKCJUZXh0dXJlTWFuYWdlciIsYERlbGV0aW5nIHRleHR1cmUgb2Ygc2l6ZSAke3Uud2lkdGh9eCR7dS5oZWlnaHR9YCksdGhpcy5nbENvbnRleHQuZGVsZXRlVGV4dHVyZSh1LnRleHR1cmUpKX10b1RlbnNvckRhdGEodSxoKXtzd2l0Y2godSl7Y2FzZSJpbnQxNiI6cmV0dXJuIGggaW5zdGFuY2VvZiBJbnQxNkFycmF5P2g6SW50MTZBcnJheS5mcm9tKGgpO2Nhc2UiaW50MzIiOnJldHVybiBoIGluc3RhbmNlb2YgSW50MzJBcnJheT9oOkludDMyQXJyYXkuZnJvbShoKTtjYXNlImludDgiOnJldHVybiBoIGluc3RhbmNlb2YgSW50OEFycmF5P2g6SW50OEFycmF5LmZyb20oaCk7Y2FzZSJ1aW50MTYiOnJldHVybiBoIGluc3RhbmNlb2YgVWludDE2QXJyYXk/aDpVaW50MTZBcnJheS5mcm9tKGgpO2Nhc2UidWludDMyIjpyZXR1cm4gaCBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P2g6VWludDMyQXJyYXkuZnJvbShoKTtjYXNlInVpbnQ4IjpjYXNlImJvb2wiOnJldHVybiBoIGluc3RhbmNlb2YgVWludDhBcnJheT9oOlVpbnQ4QXJyYXkuZnJvbShoKTtjYXNlImZsb2F0MzIiOnJldHVybiBoIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P2g6RmxvYXQzMkFycmF5LmZyb20oaCk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gaCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT9oOkZsb2F0NjRBcnJheS5mcm9tKGgpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBUZW5zb3JEYXRhIHR5cGUgJHt1fSBpcyBub3Qgc3VwcG9ydGVkYCl9fXRvVGV4dHVyZURhdGEodSxoKXtpZihoKXJldHVybiBoIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P2g6bmV3IEZsb2F0MzJBcnJheShoKX10b0VuY29kZXJUeXBlKHUpe3JldHVybiJmbG9hdCJ9Y2xlYXJBY3RpdmVUZXh0dXJlcygpe3RoaXMuZ2xDb250ZXh0LmNsZWFyQWN0aXZlVGV4dHVyZXMoKX19fSwyMDM5OihjLHQpPT57dmFyIHI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuVGV4dHVyZVR5cGU9dm9pZCAwLChyPXQuVGV4dHVyZVR5cGV8fCh0LlRleHR1cmVUeXBlPXt9KSlbci51bnBhY2tlZD0wXT0idW5wYWNrZWQiLHJbci51bnBhY2tlZFJldmVyc2VkPTFdPSJ1bnBhY2tlZFJldmVyc2VkIixyW3IucGFja2VkPTJdPSJwYWNrZWQiLHJbci5kb3dubG9hZFVpbnQ4QXNGbG9hdD0zXT0iZG93bmxvYWRVaW50OEFzRmxvYXQiLHJbci5wYWNrZWRMYXN0RGltZW5zaW9uPTRdPSJwYWNrZWRMYXN0RGltZW5zaW9uIn0sOTM5MDooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0R2xDaGFubmVscz10LmdldENvb3Jkc0RhdGFUeXBlPXQuZ2V0U3F1ZWV6ZWRQYXJhbXM9dC5zcXVlZXplSW5wdXRTaGFwZT10LmdlbmVyYXRlU2hhZGVyRnVuY05hbWVGcm9tSW5wdXRTYW1wbGVyTmFtZUF0T3V0Q29vcmRzPXQuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lPXQucmVwZWF0ZWRUcnk9dC5nZXRQYWNrZWRTaGFwZT12b2lkIDA7Y29uc3Qgbz1yKDI1MTcpO3QuZ2V0UGFja2VkU2hhcGU9ZnVuY3Rpb24odSl7Y29uc3QgaD11Lmxlbmd0aDtyZXR1cm4gdS5zbGljZSgwLGgtMSkuY29uY2F0KHVbaC0xXS80KX0sdC5yZXBlYXRlZFRyeT1hc3luYyBmdW5jdGlvbih1LGg9cD0+MCxhKXtyZXR1cm4gbmV3IFByb21pc2UoKHAsZik9PntsZXQgZD0wO2NvbnN0IGw9KCk9PntpZih1KCkpcmV0dXJuIHZvaWQgcCgpO2QrKztjb25zdCBuPWgoZCk7YSE9bnVsbCYmZD49YT9mKCk6c2V0VGltZW91dChsLG4pfTtsKCl9KX0sdC5nZW5lcmF0ZVNoYWRlckZ1bmNOYW1lRnJvbUlucHV0U2FtcGxlck5hbWU9ZnVuY3Rpb24odSl7cmV0dXJuKDAsby5hc3NlcnQpKHUhPT12b2lkIDAmJnUubGVuZ3RoIT09MCwoKT0+ImVtcHR5IHN0cmluZyBmb3VuZCBmb3Igc2FtcGxlciBuYW1lIiksImdldCIrdS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt1LnNsaWNlKDEpfSx0LmdlbmVyYXRlU2hhZGVyRnVuY05hbWVGcm9tSW5wdXRTYW1wbGVyTmFtZUF0T3V0Q29vcmRzPWZ1bmN0aW9uKHUpe3JldHVybigwLG8uYXNzZXJ0KSh1IT09dm9pZCAwJiZ1Lmxlbmd0aCE9PTAsKCk9PiJlbXB0eSBzdHJpbmcgZm91bmQgZm9yIHNhbXBsZXIgbmFtZSIpLCJnZXQiK3UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdS5zbGljZSgxKSsiQXRPdXRDb29yZHMifSx0LnNxdWVlemVJbnB1dFNoYXBlPWZ1bmN0aW9uKHUsaCl7bGV0IGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh1KSk7cmV0dXJuIGE9aCxhfSx0LmdldFNxdWVlemVkUGFyYW1zPWZ1bmN0aW9uKHUsaCl7cmV0dXJuIGgubWFwKGE9PnVbYV0pLmpvaW4oIiwgIil9LHQuZ2V0Q29vcmRzRGF0YVR5cGU9ZnVuY3Rpb24odSl7aWYodTw9MSlyZXR1cm4iaW50IjtpZih1PT09MilyZXR1cm4iaXZlYzIiO2lmKHU9PT0zKXJldHVybiJpdmVjMyI7aWYodT09PTQpcmV0dXJuIml2ZWM0IjtpZih1PT09NSlyZXR1cm4iaXZlYzUiO2lmKHU9PT02KXJldHVybiJpdmVjNiI7dGhyb3cgRXJyb3IoYEdQVSBmb3IgcmFuayAke3V9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCl9LHQuZ2V0R2xDaGFubmVscz1mdW5jdGlvbih1PTYpe3JldHVyblsieCIsInkiLCJ6IiwidyIsInUiLCJ2Il0uc2xpY2UoMCx1KX19LDczMDU6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZU5ld1dlYkdMQ29udGV4dD10LmNyZWF0ZVdlYkdMQ29udGV4dD12b2lkIDA7Y29uc3Qgbz1yKDYyMzEpLHU9cigxNzEzKSxoPXt9O2Z1bmN0aW9uIGEocCl7Y29uc3QgZj1mdW5jdGlvbigpe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpe2lmKHR5cGVvZiBPZmZzY3JlZW5DYW52YXM+InUiKXRocm93IG5ldyBUeXBlRXJyb3IoImZhaWxlZCB0byBjcmVhdGUgY2FudmFzOiBPZmZzY3JlZW5DYW52YXMgaXMgbm90IHN1cHBvcnRlZCIpO3JldHVybiBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSl9Y29uc3Qgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtyZXR1cm4gbi53aWR0aD0xLG4uaGVpZ2h0PTEsbn0oKTtsZXQgZDtjb25zdCBsPXthbHBoYTohMSxkZXB0aDohMSxhbnRpYWxpYXM6ITEsc3RlbmNpbDohMSxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6ITEscHJlbXVsdGlwbGllZEFscGhhOiExLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6ITF9O2lmKCghcHx8cD09PSJ3ZWJnbDIiKSYmKGQ9Zi5nZXRDb250ZXh0KCJ3ZWJnbDIiLGwpLGQpKXRyeXtyZXR1cm4gbmV3IHUuV2ViR0xDb250ZXh0KGQsMil9Y2F0Y2gobil7by5Mb2dnZXIud2FybmluZygiR2xDb250ZXh0RmFjdG9yeSIsYGZhaWxlZCB0byBjcmVhdGUgV2ViR0xDb250ZXh0IHVzaW5nIGNvbnRleHRJZCAnd2ViZ2wyJy4gRXJyb3I6ICR7bn1gKX1pZigoIXB8fHA9PT0id2ViZ2wiKSYmKGQ9Zi5nZXRDb250ZXh0KCJ3ZWJnbCIsbCl8fGYuZ2V0Q29udGV4dCgiZXhwZXJpbWVudGFsLXdlYmdsIixsKSxkKSl0cnl7cmV0dXJuIG5ldyB1LldlYkdMQ29udGV4dChkLDEpfWNhdGNoKG4pe28uTG9nZ2VyLndhcm5pbmcoIkdsQ29udGV4dEZhY3RvcnkiLGBmYWlsZWQgdG8gY3JlYXRlIFdlYkdMQ29udGV4dCB1c2luZyBjb250ZXh0SWQgJ3dlYmdsJyBvciAnZXhwZXJpbWVudGFsLXdlYmdsJy4gRXJyb3I6ICR7bn1gKX10aHJvdyBuZXcgRXJyb3IoIldlYkdMIGlzIG5vdCBzdXBwb3J0ZWQiKX10LmNyZWF0ZVdlYkdMQ29udGV4dD1mdW5jdGlvbiBwKGYpe2xldCBkO2YmJmYhPT0id2ViZ2wyInx8ISgid2ViZ2wyImluIGgpP2YmJmYhPT0id2ViZ2wifHwhKCJ3ZWJnbCJpbiBoKXx8KGQ9aC53ZWJnbCk6ZD1oLndlYmdsMixkPWR8fGEoZiksZj1mfHxkLnZlcnNpb249PT0xPyJ3ZWJnbCI6IndlYmdsMiI7Y29uc3QgbD1kLmdsO3JldHVybiBoW2ZdPWQsbC5pc0NvbnRleHRMb3N0KCk/KGRlbGV0ZSBoW2ZdLHAoZikpOihsLmRpc2FibGUobC5ERVBUSF9URVNUKSxsLmRpc2FibGUobC5TVEVOQ0lMX1RFU1QpLGwuZGlzYWJsZShsLkJMRU5EKSxsLmRpc2FibGUobC5ESVRIRVIpLGwuZGlzYWJsZShsLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLGwuZGlzYWJsZShsLlNBTVBMRV9DT1ZFUkFHRSksbC5lbmFibGUobC5TQ0lTU09SX1RFU1QpLGwuZW5hYmxlKGwuQ1VMTF9GQUNFKSxsLmN1bGxGYWNlKGwuQkFDSyksZCl9LHQuY3JlYXRlTmV3V2ViR0xDb250ZXh0PWF9LDE3MTM6ZnVuY3Rpb24oYyx0LHIpe3ZhciBvPXRoaXMmJnRoaXMuX19jcmVhdGVCaW5kaW5nfHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihsLG4sZSxpKXtpPT09dm9pZCAwJiYoaT1lKTt2YXIgcz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSk7cyYmISgiZ2V0ImluIHM/IW4uX19lc01vZHVsZTpzLndyaXRhYmxlfHxzLmNvbmZpZ3VyYWJsZSl8fChzPXtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuW2VdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsLGkscyl9OmZ1bmN0aW9uKGwsbixlLGkpe2k9PT12b2lkIDAmJihpPWUpLGxbaV09bltlXX0pLHU9dGhpcyYmdGhpcy5fX3NldE1vZHVsZURlZmF1bHR8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGwsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGwsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOm59KX06ZnVuY3Rpb24obCxuKXtsLmRlZmF1bHQ9bn0pLGg9dGhpcyYmdGhpcy5fX2ltcG9ydFN0YXJ8fGZ1bmN0aW9uKGwpe2lmKGwmJmwuX19lc01vZHVsZSlyZXR1cm4gbDt2YXIgbj17fTtpZihsIT1udWxsKWZvcih2YXIgZSBpbiBsKWUhPT0iZGVmYXVsdCImJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChsLGUpJiZvKG4sbCxlKTtyZXR1cm4gdShuLGwpLG59O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LldlYkdMQ29udGV4dD10LmxpbmVhclNlYXJjaExhc3RUcnVlPXZvaWQgMDtjb25zdCBhPXIoMTY3MCkscD1oKHIoNzc2OSkpLGY9cig5MzkwKTtmdW5jdGlvbiBkKGwpe2xldCBuPTA7Zm9yKDtuPGwubGVuZ3RoJiZsW25dKCk7KytuKTtyZXR1cm4gbi0xfXQubGluZWFyU2VhcmNoTGFzdFRydWU9ZCx0LldlYkdMQ29udGV4dD1jbGFzc3tjb25zdHJ1Y3RvcihsLG4pe3RoaXMuZnJhbWVCdWZmZXJCb3VuZD0hMSx0aGlzLml0ZW1zVG9Qb2xsPVtdLHRoaXMuZ2w9bCx0aGlzLnZlcnNpb249bix0aGlzLmdldEV4dGVuc2lvbnMoKSx0aGlzLnZlcnRleGJ1ZmZlcj10aGlzLmNyZWF0ZVZlcnRleGJ1ZmZlcigpLHRoaXMuZnJhbWVidWZmZXI9dGhpcy5jcmVhdGVGcmFtZWJ1ZmZlcigpLHRoaXMucXVlcnlWaXRhbFBhcmFtZXRlcnMoKX1hbGxvY2F0ZVRleHR1cmUobCxuLGUsaSl7Y29uc3Qgcz10aGlzLmdsLG09cy5jcmVhdGVUZXh0dXJlKCk7cy5iaW5kVGV4dHVyZShzLlRFWFRVUkVfMkQsbSkscy50ZXhQYXJhbWV0ZXJpKHMuVEVYVFVSRV8yRCxzLlRFWFRVUkVfTUlOX0ZJTFRFUixzLk5FQVJFU1QpLHMudGV4UGFyYW1ldGVyaShzLlRFWFRVUkVfMkQscy5URVhUVVJFX01BR19GSUxURVIscy5ORUFSRVNUKSxzLnRleFBhcmFtZXRlcmkocy5URVhUVVJFXzJELHMuVEVYVFVSRV9XUkFQX1Mscy5DTEFNUF9UT19FREdFKSxzLnRleFBhcmFtZXRlcmkocy5URVhUVVJFXzJELHMuVEVYVFVSRV9XUkFQX1Qscy5DTEFNUF9UT19FREdFKTtjb25zdCBnPWk/ZS5lbmNvZGUoaSxsKm4pOm51bGw7cmV0dXJuIHMudGV4SW1hZ2UyRChzLlRFWFRVUkVfMkQsMCxlLmludGVybmFsRm9ybWF0LGwsbiwwLGUuZm9ybWF0LGUudGV4dHVyZVR5cGUsZyksdGhpcy5jaGVja0Vycm9yKCksbX11cGRhdGVUZXh0dXJlKGwsbixlLGkscyl7Y29uc3QgbT10aGlzLmdsO20uYmluZFRleHR1cmUobS5URVhUVVJFXzJELGwpO2NvbnN0IGc9aS5lbmNvZGUocyxuKmUpO20udGV4U3ViSW1hZ2UyRChtLlRFWFRVUkVfMkQsMCwwLDAsbixlLGkuZm9ybWF0LGkudGV4dHVyZVR5cGUsZyksdGhpcy5jaGVja0Vycm9yKCl9YXR0YWNoRnJhbWVidWZmZXIobCxuLGUpe2NvbnN0IGk9dGhpcy5nbDtpLmJpbmRUZXh0dXJlKGkuVEVYVFVSRV8yRCxsKSxpLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLHRoaXMuZnJhbWVidWZmZXIpLGkuZnJhbWVidWZmZXJUZXh0dXJlMkQoaS5GUkFNRUJVRkZFUixpLkNPTE9SX0FUVEFDSE1FTlQwLGkuVEVYVFVSRV8yRCxsLDApLHRoaXMuY2hlY2tFcnJvcigpLGkudmlld3BvcnQoMCwwLG4sZSksaS5zY2lzc29yKDAsMCxuLGUpfXJlYWRUZXh0dXJlKGwsbixlLGkscyxtKXtjb25zdCBnPXRoaXMuZ2w7bXx8KG09MSksdGhpcy5mcmFtZUJ1ZmZlckJvdW5kfHx0aGlzLmF0dGFjaEZyYW1lYnVmZmVyKGwsbixlKTtjb25zdCBfPXRoaXMuZ2V0RW5jb2RlcihzLG0pLGI9Xy5hbGxvY2F0ZShuKmUpO3JldHVybiBnLmJpbmRUZXh0dXJlKGcuVEVYVFVSRV8yRCxsKSxnLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGcuRlJBTUVCVUZGRVIsZy5DT0xPUl9BVFRBQ0hNRU5UMCxnLlRFWFRVUkVfMkQsbCwwKSxnLnJlYWRQaXhlbHMoMCwwLG4sZSxnLlJHQkEsXy50ZXh0dXJlVHlwZSxiKSx0aGlzLmNoZWNrRXJyb3IoKSxfLmRlY29kZShiLGkpfWlzRnJhbWVidWZmZXJSZWFkeSgpe3JldHVybiEwfWdldEFjdGl2ZVRleHR1cmUoKXtjb25zdCBsPXRoaXMuZ2w7cmV0dXJuIlRFWFRVUkUiKyhsLmdldFBhcmFtZXRlcih0aGlzLmdsLkFDVElWRV9URVhUVVJFKS1sLlRFWFRVUkUwKX1nZXRUZXh0dXJlQmluZGluZygpe3JldHVybiB0aGlzLmdsLmdldFBhcmFtZXRlcih0aGlzLmdsLlRFWFRVUkVfQklORElOR18yRCl9Z2V0RnJhbWVidWZmZXJCaW5kaW5nKCl7cmV0dXJuIHRoaXMuZ2wuZ2V0UGFyYW1ldGVyKHRoaXMuZ2wuRlJBTUVCVUZGRVJfQklORElORyl9c2V0VmVydGV4QXR0cmlidXRlcyhsLG4pe2NvbnN0IGU9dGhpcy5nbDtlLnZlcnRleEF0dHJpYlBvaW50ZXIobCwzLGUuRkxPQVQsITEsMjAsMCksZS5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShsKSxuIT09LTEmJihlLnZlcnRleEF0dHJpYlBvaW50ZXIobiwyLGUuRkxPQVQsITEsMjAsMTIpLGUuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobikpLHRoaXMuY2hlY2tFcnJvcigpfWNyZWF0ZVByb2dyYW0obCxuKXtjb25zdCBlPXRoaXMuZ2wsaT1lLmNyZWF0ZVByb2dyYW0oKTtyZXR1cm4gZS5hdHRhY2hTaGFkZXIoaSxsKSxlLmF0dGFjaFNoYWRlcihpLG4pLGUubGlua1Byb2dyYW0oaSksaX1jb21waWxlU2hhZGVyKGwsbil7Y29uc3QgZT10aGlzLmdsLGk9ZS5jcmVhdGVTaGFkZXIobik7aWYoIWkpdGhyb3cgbmV3IEVycm9yKGBjcmVhdGVTaGFkZXIoKSByZXR1cm5lZCBudWxsIHdpdGggdHlwZSAke259YCk7aWYoZS5zaGFkZXJTb3VyY2UoaSxsKSxlLmNvbXBpbGVTaGFkZXIoaSksZS5nZXRTaGFkZXJQYXJhbWV0ZXIoaSxlLkNPTVBJTEVfU1RBVFVTKT09PSExKXRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbXBpbGUgc2hhZGVyOiAke2UuZ2V0U2hhZGVySW5mb0xvZyhpKX0KU2hhZGVyIHNvdXJjZToKJHtsfWApO3JldHVybiBpfWRlbGV0ZVNoYWRlcihsKXt0aGlzLmdsLmRlbGV0ZVNoYWRlcihsKX1iaW5kVGV4dHVyZVRvVW5pZm9ybShsLG4sZSl7Y29uc3QgaT10aGlzLmdsO2kuYWN0aXZlVGV4dHVyZShpLlRFWFRVUkUwK24pLHRoaXMuY2hlY2tFcnJvcigpLGkuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELGwpLHRoaXMuY2hlY2tFcnJvcigpLGkudW5pZm9ybTFpKGUsbiksdGhpcy5jaGVja0Vycm9yKCl9ZHJhdygpe3RoaXMuZ2wuZHJhd0FycmF5cyh0aGlzLmdsLlRSSUFOR0xFX1NUUklQLDAsNCksdGhpcy5jaGVja0Vycm9yKCl9Y2hlY2tFcnJvcigpe2lmKGEuZW52LmRlYnVnKXtjb25zdCBsPXRoaXMuZ2wsbj1sLmdldEVycm9yKCk7bGV0IGU9IiI7c3dpdGNoKG4pe2Nhc2UgbC5OT19FUlJPUjpyZXR1cm47Y2FzZSBsLklOVkFMSURfRU5VTTplPSJJTlZBTElEX0VOVU0iO2JyZWFrO2Nhc2UgbC5JTlZBTElEX1ZBTFVFOmU9IklOVkFMSURfVkFMVUUiO2JyZWFrO2Nhc2UgbC5JTlZBTElEX09QRVJBVElPTjplPSJJTlZBTElEX09QRVJBVElPTiI7YnJlYWs7Y2FzZSBsLklOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOmU9IklOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OIjticmVhaztjYXNlIGwuT1VUX09GX01FTU9SWTplPSJPVVRfT0ZfTUVNT1JZIjticmVhaztjYXNlIGwuQ09OVEVYVF9MT1NUX1dFQkdMOmU9IkNPTlRFWFRfTE9TVF9XRUJHTCI7YnJlYWs7ZGVmYXVsdDplPWBVbmtub3duIFdlYkdMIEVycm9yOiAke24udG9TdHJpbmcoMTYpfWB9dGhyb3cgbmV3IEVycm9yKGUpfX1kZWxldGVUZXh0dXJlKGwpe3RoaXMuZ2wuZGVsZXRlVGV4dHVyZShsKX1kZWxldGVQcm9ncmFtKGwpe3RoaXMuZ2wuZGVsZXRlUHJvZ3JhbShsKX1nZXRFbmNvZGVyKGwsbixlPTApe2lmKHRoaXMudmVyc2lvbj09PTIpcmV0dXJuIG5ldyBwLlJlZEZsb2F0MzJEYXRhRW5jb2Rlcih0aGlzLmdsLG4pO3N3aXRjaChsKXtjYXNlImZsb2F0IjpyZXR1cm4gZT09PTF8fHRoaXMuaXNSZW5kZXJGbG9hdDMyU3VwcG9ydGVkP25ldyBwLlJHQkFGbG9hdERhdGFFbmNvZGVyKHRoaXMuZ2wsbik6bmV3IHAuUkdCQUZsb2F0RGF0YUVuY29kZXIodGhpcy5nbCxuLHRoaXMudGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbi5IQUxGX0ZMT0FUX09FUyk7Y2FzZSJpbnQiOnRocm93IG5ldyBFcnJvcigibm90IGltcGxlbWVudGVkIik7Y2FzZSJieXRlIjpyZXR1cm4gbmV3IHAuVWludDhEYXRhRW5jb2Rlcih0aGlzLmdsLG4pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRhdGFUeXBlOiAke2x9YCl9fWNsZWFyQWN0aXZlVGV4dHVyZXMoKXtjb25zdCBsPXRoaXMuZ2w7Zm9yKGxldCBuPTA7bjx0aGlzLm1heFRleHR1cmVJbWFnZVVuaXRzOysrbilsLmFjdGl2ZVRleHR1cmUobC5URVhUVVJFMCtuKSxsLmJpbmRUZXh0dXJlKGwuVEVYVFVSRV8yRCxudWxsKX1kaXNwb3NlKCl7aWYodGhpcy5kaXNwb3NlZClyZXR1cm47Y29uc3QgbD10aGlzLmdsO2wuYmluZEZyYW1lYnVmZmVyKGwuRlJBTUVCVUZGRVIsbnVsbCksbC5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyKSxsLmJpbmRCdWZmZXIobC5BUlJBWV9CVUZGRVIsbnVsbCksbC5kZWxldGVCdWZmZXIodGhpcy52ZXJ0ZXhidWZmZXIpLGwuYmluZEJ1ZmZlcihsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLG51bGwpLGwuZmluaXNoKCksdGhpcy5kaXNwb3NlZD0hMH1jcmVhdGVEZWZhdWx0R2VvbWV0cnkoKXtyZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbLTEsMSwwLDAsMSwtMSwtMSwwLDAsMCwxLDEsMCwxLDEsMSwtMSwwLDEsMF0pfWNyZWF0ZVZlcnRleGJ1ZmZlcigpe2NvbnN0IGw9dGhpcy5nbCxuPWwuY3JlYXRlQnVmZmVyKCk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJjcmVhdGVCdWZmZXIoKSByZXR1cm5lZCBudWxsIik7Y29uc3QgZT10aGlzLmNyZWF0ZURlZmF1bHRHZW9tZXRyeSgpO3JldHVybiBsLmJpbmRCdWZmZXIobC5BUlJBWV9CVUZGRVIsbiksbC5idWZmZXJEYXRhKGwuQVJSQVlfQlVGRkVSLGUsbC5TVEFUSUNfRFJBVyksdGhpcy5jaGVja0Vycm9yKCksbn1jcmVhdGVGcmFtZWJ1ZmZlcigpe2NvbnN0IGw9dGhpcy5nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO2lmKCFsKXRocm93IG5ldyBFcnJvcigiY3JlYXRlRnJhbWVidWZmZXIgcmV0dXJuZWQgbnVsbCIpO3JldHVybiBsfXF1ZXJ5Vml0YWxQYXJhbWV0ZXJzKCl7Y29uc3QgbD10aGlzLmdsO2lmKHRoaXMuaXNGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcj10aGlzLmNoZWNrRmxvYXRUZXh0dXJlQXR0YWNoYWJsZVRvRnJhbWVCdWZmZXIoKSx0aGlzLmlzUmVuZGVyRmxvYXQzMlN1cHBvcnRlZD10aGlzLmNoZWNrUmVuZGVyRmxvYXQzMigpLHRoaXMuaXNGbG9hdDMyRG93bmxvYWRTdXBwb3J0ZWQ9dGhpcy5jaGVja0Zsb2F0MzJEb3dubG9hZCgpLHRoaXMudmVyc2lvbj09PTEmJiF0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24mJiF0aGlzLmlzUmVuZGVyRmxvYXQzMlN1cHBvcnRlZCl0aHJvdyBuZXcgRXJyb3IoImJvdGggZmxvYXQzMiBhbmQgZmxvYXQxNiBUZXh0dXJlVHlwZSBhcmUgbm90IHN1cHBvcnRlZCIpO3RoaXMuaXNCbGVuZFN1cHBvcnRlZD0hdGhpcy5pc1JlbmRlckZsb2F0MzJTdXBwb3J0ZWR8fHRoaXMuY2hlY2tGbG9hdDMyQmxlbmQoKSx0aGlzLm1heFRleHR1cmVTaXplPWwuZ2V0UGFyYW1ldGVyKGwuTUFYX1RFWFRVUkVfU0laRSksdGhpcy5tYXhUZXh0dXJlSW1hZ2VVbml0cz1sLmdldFBhcmFtZXRlcihsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKSx0aGlzLnZlcnNpb259Z2V0RXh0ZW5zaW9ucygpe3RoaXMudmVyc2lvbj09PTI/KHRoaXMuY29sb3JCdWZmZXJGbG9hdEV4dGVuc2lvbj10aGlzLmdsLmdldEV4dGVuc2lvbigiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpLHRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uPXRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCJFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyIikpOih0aGlzLnRleHR1cmVGbG9hdEV4dGVuc2lvbj10aGlzLmdsLmdldEV4dGVuc2lvbigiT0VTX3RleHR1cmVfZmxvYXQiKSx0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb249dGhpcy5nbC5nZXRFeHRlbnNpb24oIk9FU190ZXh0dXJlX2hhbGZfZmxvYXQiKSl9Y2hlY2tGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcigpe2NvbnN0IGw9dGhpcy5nbCxuPWwuY3JlYXRlVGV4dHVyZSgpO2wuYmluZFRleHR1cmUobC5URVhUVVJFXzJELG4pO2NvbnN0IGU9dGhpcy52ZXJzaW9uPT09Mj9sLlJHQkEzMkY6bC5SR0JBO2wudGV4SW1hZ2UyRChsLlRFWFRVUkVfMkQsMCxlLDEsMSwwLGwuUkdCQSxsLkZMT0FULG51bGwpO2NvbnN0IGk9bC5jcmVhdGVGcmFtZWJ1ZmZlcigpO2wuYmluZEZyYW1lYnVmZmVyKGwuRlJBTUVCVUZGRVIsaSksbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChsLkZSQU1FQlVGRkVSLGwuQ09MT1JfQVRUQUNITUVOVDAsbC5URVhUVVJFXzJELG4sMCk7Y29uc3Qgcz1sLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMobC5GUkFNRUJVRkZFUik9PT1sLkZSQU1FQlVGRkVSX0NPTVBMRVRFO3JldHVybiBsLmJpbmRUZXh0dXJlKGwuVEVYVFVSRV8yRCxudWxsKSxsLmJpbmRGcmFtZWJ1ZmZlcihsLkZSQU1FQlVGRkVSLG51bGwpLGwuZGVsZXRlVGV4dHVyZShuKSxsLmRlbGV0ZUZyYW1lYnVmZmVyKGkpLHN9Y2hlY2tSZW5kZXJGbG9hdDMyKCl7aWYodGhpcy52ZXJzaW9uPT09Mil7aWYoIXRoaXMuY29sb3JCdWZmZXJGbG9hdEV4dGVuc2lvbilyZXR1cm4hMX1lbHNlIGlmKCF0aGlzLnRleHR1cmVGbG9hdEV4dGVuc2lvbilyZXR1cm4hMTtyZXR1cm4gdGhpcy5pc0Zsb2F0VGV4dHVyZUF0dGFjaGFibGVUb0ZyYW1lQnVmZmVyfWNoZWNrRmxvYXQzMkRvd25sb2FkKCl7aWYodGhpcy52ZXJzaW9uPT09Mil7aWYoIXRoaXMuY29sb3JCdWZmZXJGbG9hdEV4dGVuc2lvbilyZXR1cm4hMX1lbHNlIGlmKCF0aGlzLnRleHR1cmVGbG9hdEV4dGVuc2lvbnx8IXRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQiKSlyZXR1cm4hMTtyZXR1cm4gdGhpcy5pc0Zsb2F0VGV4dHVyZUF0dGFjaGFibGVUb0ZyYW1lQnVmZmVyfWNoZWNrRmxvYXQzMkJsZW5kKCl7Y29uc3QgbD10aGlzLmdsO2xldCBuLGUsaSxzLG07dHJ5e249bC5jcmVhdGVUZXh0dXJlKCksZT1sLmNyZWF0ZUZyYW1lYnVmZmVyKCksbC5iaW5kVGV4dHVyZShsLlRFWFRVUkVfMkQsbik7Y29uc3QgZz10aGlzLnZlcnNpb249PT0yP2wuUkdCQTMyRjpsLlJHQkE7cmV0dXJuIGwudGV4SW1hZ2UyRChsLlRFWFRVUkVfMkQsMCxnLDEsMSwwLGwuUkdCQSxsLkZMT0FULG51bGwpLGwuYmluZEZyYW1lYnVmZmVyKGwuRlJBTUVCVUZGRVIsZSksbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChsLkZSQU1FQlVGRkVSLGwuQ09MT1JfQVRUQUNITUVOVDAsbC5URVhUVVJFXzJELG4sMCksbC5lbmFibGUobC5CTEVORCksaT1sLmNyZWF0ZVNoYWRlcihsLlZFUlRFWF9TSEFERVIpLCEhaSYmKGwuc2hhZGVyU291cmNlKGksInZvaWQgbWFpbigpe30iKSxsLmNvbXBpbGVTaGFkZXIoaSkscz1sLmNyZWF0ZVNoYWRlcihsLkZSQUdNRU5UX1NIQURFUiksISFzJiYobC5zaGFkZXJTb3VyY2UocywicHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3ZvaWQgbWFpbigpe2dsX0ZyYWdDb2xvcj12ZWM0KDAuNSk7fSIpLGwuY29tcGlsZVNoYWRlcihzKSxtPWwuY3JlYXRlUHJvZ3JhbSgpLCEhbSYmKGwuYXR0YWNoU2hhZGVyKG0saSksbC5hdHRhY2hTaGFkZXIobSxzKSxsLmxpbmtQcm9ncmFtKG0pLGwudXNlUHJvZ3JhbShtKSxsLmRyYXdBcnJheXMobC5QT0lOVFMsMCwxKSxsLmdldEVycm9yKCk9PT1sLk5PX0VSUk9SKSkpfWZpbmFsbHl7bC5kaXNhYmxlKGwuQkxFTkQpLG0mJmwuZGVsZXRlUHJvZ3JhbShtKSxpJiZsLmRlbGV0ZVNoYWRlcihpKSxzJiZsLmRlbGV0ZVNoYWRlcihzKSxlJiYobC5iaW5kRnJhbWVidWZmZXIobC5GUkFNRUJVRkZFUixudWxsKSxsLmRlbGV0ZUZyYW1lYnVmZmVyKGUpKSxuJiYobC5iaW5kVGV4dHVyZShsLlRFWFRVUkVfMkQsbnVsbCksbC5kZWxldGVUZXh0dXJlKG4pKX19YmVnaW5UaW1lcigpe2lmKHRoaXMudmVyc2lvbj09PTImJnRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uKXtjb25zdCBsPXRoaXMuZ2wsbj10aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbixlPWwuY3JlYXRlUXVlcnkoKTtyZXR1cm4gbC5iZWdpblF1ZXJ5KG4uVElNRV9FTEFQU0VEX0VYVCxlKSxlfXRocm93IG5ldyBFcnJvcigiV2ViR0wxIHByb2ZpbGluZyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4iKX1lbmRUaW1lcigpe2lmKHRoaXMudmVyc2lvbiE9PTJ8fCF0aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbil0aHJvdyBuZXcgRXJyb3IoIldlYkdMMSBwcm9maWxpbmcgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQiKTt7Y29uc3QgbD10aGlzLmdsLG49dGhpcy5kaXNqb2ludFRpbWVyUXVlcnlXZWJnbDJFeHRlbnNpb247bC5lbmRRdWVyeShuLlRJTUVfRUxBUFNFRF9FWFQpfX1pc1RpbWVyUmVzdWx0QXZhaWxhYmxlKGwpe2xldCBuPSExLGU9ITE7aWYodGhpcy52ZXJzaW9uIT09Mnx8IXRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uKXRocm93IG5ldyBFcnJvcigiV2ViR0wxIHByb2ZpbGluZyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCIpO3tjb25zdCBpPXRoaXMuZ2wscz10aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbjtuPWkuZ2V0UXVlcnlQYXJhbWV0ZXIobCxpLlFVRVJZX1JFU1VMVF9BVkFJTEFCTEUpLGU9aS5nZXRQYXJhbWV0ZXIocy5HUFVfRElTSk9JTlRfRVhUKX1yZXR1cm4gbiYmIWV9Z2V0VGltZXJSZXN1bHQobCl7bGV0IG49MDtpZih0aGlzLnZlcnNpb24hPT0yKXRocm93IG5ldyBFcnJvcigiV2ViR0wxIHByb2ZpbGluZyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCIpO3tjb25zdCBlPXRoaXMuZ2w7bj1lLmdldFF1ZXJ5UGFyYW1ldGVyKGwsZS5RVUVSWV9SRVNVTFQpLGUuZGVsZXRlUXVlcnkobCl9cmV0dXJuIG4vMWU2fWFzeW5jIHdhaXRGb3JRdWVyeUFuZEdldFRpbWUobCl7cmV0dXJuIGF3YWl0KDAsZi5yZXBlYXRlZFRyeSkoKCk9PnRoaXMuaXNUaW1lclJlc3VsdEF2YWlsYWJsZShsKSksdGhpcy5nZXRUaW1lclJlc3VsdChsKX1hc3luYyBjcmVhdGVBbmRXYWl0Rm9yRmVuY2UoKXtjb25zdCBsPXRoaXMuY3JlYXRlRmVuY2UodGhpcy5nbCk7cmV0dXJuIHRoaXMucG9sbEZlbmNlKGwpfWNyZWF0ZUZlbmNlKGwpe2xldCBuO2NvbnN0IGU9bCxpPWUuZmVuY2VTeW5jKGUuU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsMCk7cmV0dXJuIGwuZmx1c2goKSxuPWk9PT1udWxsPygpPT4hMDooKT0+e2NvbnN0IHM9ZS5jbGllbnRXYWl0U3luYyhpLDAsMCk7cmV0dXJuIHM9PT1lLkFMUkVBRFlfU0lHTkFMRUR8fHM9PT1lLkNPTkRJVElPTl9TQVRJU0ZJRUR9LHtxdWVyeTppLGlzRmVuY2VQYXNzZWQ6bn19YXN5bmMgcG9sbEZlbmNlKGwpe3JldHVybiBuZXcgUHJvbWlzZShuPT57dGhpcy5hZGRJdGVtVG9Qb2xsKCgpPT5sLmlzRmVuY2VQYXNzZWQoKSwoKT0+bigpKX0pfXBvbGxJdGVtcygpe2NvbnN0IGw9ZCh0aGlzLml0ZW1zVG9Qb2xsLm1hcChuPT5uLmlzRG9uZUZuKSk7Zm9yKGxldCBuPTA7bjw9bDsrK24pe2NvbnN0e3Jlc29sdmVGbjplfT10aGlzLml0ZW1zVG9Qb2xsW25dO2UoKX10aGlzLml0ZW1zVG9Qb2xsPXRoaXMuaXRlbXNUb1BvbGwuc2xpY2UobCsxKX1hc3luYyBhZGRJdGVtVG9Qb2xsKGwsbil7dGhpcy5pdGVtc1RvUG9sbC5wdXNoKHtpc0RvbmVGbjpsLHJlc29sdmVGbjpufSksdGhpcy5pdGVtc1RvUG9sbC5sZW5ndGg+MXx8YXdhaXQoMCxmLnJlcGVhdGVkVHJ5KSgoKT0+KHRoaXMucG9sbEl0ZW1zKCksdGhpcy5pdGVtc1RvUG9sbC5sZW5ndGg9PT0wKSl9fX0sMTAzNjooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRXhlY3V0aW9uUGxhbj12b2lkIDA7Y29uc3Qgbz1yKDYyMzEpO2NsYXNzIHV7Y29uc3RydWN0b3IoYSxwKXt0aGlzLm9wPWEsdGhpcy5ub2RlPXB9fXQuRXhlY3V0aW9uUGxhbj1jbGFzc3tjb25zdHJ1Y3RvcihoLGEscCl7dGhpcy5ncmFwaD1oLHRoaXMucHJvZmlsZXI9cCx0aGlzLmluaXRpYWxpemUoYSl9aW5pdGlhbGl6ZShoKXt0aGlzLnByb2ZpbGVyLmV2ZW50KCJzZXNzaW9uIiwiRXhlY3V0aW9uUGxhbi5pbml0aWFsaXplIiwoKT0+e2NvbnN0IGE9dGhpcy5ncmFwaC5nZXROb2RlcygpO2lmKGEubGVuZ3RoIT09aC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgc2l6ZSBvZiBub2RlcyBhbmQgT1BzIGRvIG5vdCBtYXRjaC4iKTt0aGlzLl9vcHM9aC5tYXAoKHAsZik9Pm5ldyB1KHAsYVtmXSkpLHRoaXMucmVzZXQoKSx0aGlzLl9zdGFydGVyPVtdLHRoaXMuX29wcy5mb3JFYWNoKChwLGYpPT57bGV0IGQ9ITA7Zm9yKGNvbnN0IGwgb2YgcC5ub2RlLmlucHV0cylpZighdGhpcy5fdmFsdWVzW2xdJiZ0aGlzLmdyYXBoLmdldElucHV0SW5kaWNlcygpLmluZGV4T2YobCk9PT0tMSl7ZD0hMTticmVha31kJiZ0aGlzLl9zdGFydGVyLnB1c2goZil9KX0pfXJlc2V0KCl7dGhpcy5fdmFsdWVzPXRoaXMuZ3JhcGguZ2V0VmFsdWVzKCkubWFwKGg9PmgudGVuc29yKX1hc3luYyBleGVjdXRlKGgsYSl7cmV0dXJuIHRoaXMucHJvZmlsZXIuZXZlbnQoInNlc3Npb24iLCJFeGVjdXRpb25QbGFuLmV4ZWN1dGUiLGFzeW5jKCk9Pnt0aGlzLnJlc2V0KCk7Y29uc3QgcD1oLmNyZWF0ZUluZmVyZW5jZUhhbmRsZXIoKSxmPXRoaXMuZ3JhcGguZ2V0SW5wdXRJbmRpY2VzKCk7aWYoYS5sZW5ndGghPT1mLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYG51bWJlciBvZiBpbnB1dCB0ZW5zb3JzIGRvbid0IG1hdGNoIHRoZSBudW1iZXIgb2YgaW5wdXRzIHRvIHRoZSBtb2RlbDogYWN0dWFsOiAke2EubGVuZ3RofSBleHBlY3RlZDogJHtmLmxlbmd0aH1gKTthLmZvckVhY2goKHMsbSk9Pntjb25zdCBnPWZbbV07dGhpcy5fdmFsdWVzW2ddPXN9KTtjb25zdCBkPXRoaXMuX3N0YXJ0ZXIuc2xpY2UoMCksbD10aGlzLmdyYXBoLmdldFZhbHVlcygpLG49dGhpcy5ncmFwaC5nZXROb2RlcygpO2xldCBlPTA7Zm9yKDtlPGQubGVuZ3RoOyl7Y29uc3Qgcz1kW2UrK10sbT10aGlzLl9vcHNbc10sZz1tLm5vZGUuaW5wdXRzLm1hcChUPT50aGlzLl92YWx1ZXNbVF0pO2lmKGcuaW5kZXhPZih2b2lkIDApIT09LTEpdGhyb3cgbmV3IEVycm9yKGB1bnJlc29sdmVkIGlucHV0IGRldGVjdGVkOiBvcDogJHttLm5vZGV9YCk7Y29uc3QgXz1nO28uTG9nZ2VyLnZlcmJvc2UoIkV4ZWNQbGFuIixgUnVuaW5nIG9wOiR7bS5ub2RlLm5hbWV9ICgke18ubWFwKChULHcpPT5gJyR7bS5ub2RlLmlucHV0c1t3XX0nOiAke1QudHlwZX1bJHtULmRpbXMuam9pbigiLCIpfV1gKS5qb2luKCIsICIpfSlgKTtjb25zdCBiPWF3YWl0IHRoaXMucHJvZmlsZXIuZXZlbnQoIm5vZGUiLG0ubm9kZS5uYW1lLGFzeW5jKCk9Pm0ub3AuaW1wbChwLF8sbS5vcC5jb250ZXh0KSk7aWYoYi5sZW5ndGghPT1tLm5vZGUub3V0cHV0cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgc2l6ZSBvZiBvdXRwdXQgZG9lcyBub3QgbWF0Y2ggbW9kZWwgZGVmaW5pdGlvbi4iKTtiLmZvckVhY2goKFQsdyk9Pntjb25zdCB4PW0ubm9kZS5vdXRwdXRzW3ddO2lmKHRoaXMuX3ZhbHVlc1t4XSl0aHJvdyBuZXcgRXJyb3IoYG91dHB1dCBbJHt4fV0gYWxyZWFkeSBoYXMgdmFsdWU6IG9wOiR7bS5ub2RlLm5hbWV9YCk7dGhpcy5fdmFsdWVzW3hdPVR9KTtjb25zdCB5PW5ldyBTZXQ7Yi5mb3JFYWNoKChULHcpPT57Y29uc3QgeD1tLm5vZGUub3V0cHV0c1t3XTtmb3IoY29uc3QgRSBvZiBsW3hdLnRvKXtjb25zdCBQPW5bRV07bGV0IHY9ITA7Zm9yKGNvbnN0IE0gb2YgUC5pbnB1dHMpaWYoIXRoaXMuX3ZhbHVlc1tNXSl7dj0hMTticmVha312JiZ5LmFkZChFKX19KSxkLnB1c2goLi4ueSl9Y29uc3QgaT1bXTtmb3IobGV0IHM9MDtzPHRoaXMuZ3JhcGguZ2V0T3V0cHV0SW5kaWNlcygpLmxlbmd0aDtzKyspe2NvbnN0IG09dGhpcy5ncmFwaC5nZXRPdXRwdXRJbmRpY2VzKClbc10sZz10aGlzLl92YWx1ZXNbbV07aWYoZz09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYHJlcXVpcmVkIG91dHB1dCBbJHttfV0gZG9lcyBub3QgaGF2ZSB2YWx1ZWApO209PT0wP2F3YWl0IGcuZ2V0RGF0YSgpOmcuZGF0YSxpLnB1c2goZyl9cmV0dXJuIG8uTG9nZ2VyLnZlcmJvc2UoIkV4ZWNQbGFuIiwiZGlzcG9zaW5nIG9mIGluZmVyZW5jZUhhbmRsZXIiKSxwLmRpc3Bvc2UoKSxpfSl9fX0sNzA3MDooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuR3JhcGg9dm9pZCAwO2NvbnN0IG89cigxNDQ2KSx1PXIoNzc3OCksaD1yKDkzOTUpLGE9cig5MTYyKSxwPXIoMjUxNyk7dmFyIGY9aC5vbm54cnVudGltZS5leHBlcmltZW50YWwuZmJzO3QuR3JhcGg9e2Zyb206KGUsaSk9Pm5ldyBuKGUsaSl9O2NsYXNzIGR7Y29uc3RydWN0b3IoaSl7dGhpcy5fZnJvbT12b2lkIDAsdGhpcy5fdG89W10sdGhpcy50ZW5zb3I9dm9pZCAwLHRoaXMudHlwZT12b2lkIDAsaSYmKHRoaXMudHlwZT1wLlByb3RvVXRpbC50ZW5zb3JWYWx1ZVR5cGVGcm9tUHJvdG8oaS50eXBlLnRlbnNvclR5cGUpKX1nZXQgZnJvbSgpe3JldHVybiB0aGlzLl9mcm9tfWdldCB0bygpe3JldHVybiB0aGlzLl90b319Y2xhc3MgbHtjb25zdHJ1Y3RvcihpLHMpe2kgaW5zdGFuY2VvZiBvLm9ubnguTm9kZVByb3RvPyh0aGlzLm5hbWU9aS5uYW1lLHRoaXMub3BUeXBlPWkub3BUeXBlLHRoaXMuYXR0cmlidXRlcz1uZXcgdS5BdHRyaWJ1dGUoaS5hdHRyaWJ1dGUpKTppIGluc3RhbmNlb2YgZi5Ob2RlJiYodGhpcy5uYW1lPXM/P2kubmFtZSgpLHRoaXMub3BUeXBlPWkub3BUeXBlKCksdGhpcy5hdHRyaWJ1dGVzPW5ldyB1LkF0dHJpYnV0ZShwLlByb3RvVXRpbC50ZW5zb3JBdHRyaWJ1dGVzRnJvbU9SVEZvcm1hdChpKSkpLHRoaXMuaW5wdXRzPVtdLHRoaXMub3V0cHV0cz1bXSx0aGlzLmV4ZWN1dGVOb2RlPSEwfX1jbGFzcyBue2NvbnN0cnVjdG9yKGkscyl7aWYoIWkpdGhyb3cgbmV3IFR5cGVFcnJvcigiZ3JhcGggaXMgZW1wdHkiKTt0aGlzLmJ1aWxkR3JhcGgoaSksdGhpcy50cmFuc2Zvcm1HcmFwaChzKSx0aGlzLmNoZWNrSXNBY3ljbGljKCl9Z2V0SW5wdXRJbmRpY2VzKCl7cmV0dXJuIHRoaXMuX2FsbElucHV0SW5kaWNlc31nZXRJbnB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuX2FsbElucHV0TmFtZXN9Z2V0T3V0cHV0SW5kaWNlcygpe3JldHVybiB0aGlzLl9hbGxPdXRwdXRJbmRpY2VzfWdldE91dHB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuX2FsbE91dHB1dE5hbWVzfWdldFZhbHVlcygpe3JldHVybiB0aGlzLl9hbGxEYXRhfWdldE5vZGVzKCl7cmV0dXJuIHRoaXMuX25vZGVzfWJ1aWxkR3JhcGgoaSl7aWYoaSBpbnN0YW5jZW9mIG8ub25ueC5HcmFwaFByb3RvKXRoaXMuYnVpbGRHcmFwaEZyb21Pbm54Rm9ybWF0KGkpO2Vsc2V7aWYoIShpIGluc3RhbmNlb2YgZi5HcmFwaCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiR3JhcGggdHlwZSBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuYnVpbGRHcmFwaEZyb21PcnRGb3JtYXQoaSl9fWJ1aWxkR3JhcGhGcm9tT25ueEZvcm1hdChpKXtjb25zdCBzPW5ldyBNYXA7dGhpcy5fYWxsRGF0YT1bXSx0aGlzLl9hbGxJbnB1dEluZGljZXM9W10sdGhpcy5fYWxsSW5wdXROYW1lcz1bXSx0aGlzLl9hbGxPdXRwdXRJbmRpY2VzPVtdLHRoaXMuX2FsbE91dHB1dE5hbWVzPVtdLHRoaXMuX25vZGVzPVtdO2NvbnN0IG09bmV3IE1hcDtpZighaS5pbnB1dCl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgaW5mb3JtYXRpb24gaW4gZ3JhcGg6IGlucHV0Iik7Y29uc3QgZz1bXTtmb3IoY29uc3QgXyBvZiBpLmlucHV0KXtpZihzLmhhcyhfLm5hbWUpKXRocm93IG5ldyBFcnJvcihgZHVwbGljYXRlZCBpbnB1dCBuYW1lOiAke18ubmFtZX1gKTtjb25zdCBiPXRoaXMuX2FsbERhdGEucHVzaChuZXcgZChfKSktMTtzLnNldChfLm5hbWUsYiksZy5wdXNoKF8ubmFtZSl9aWYoIWkuaW5pdGlhbGl6ZXIpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIGluZm9ybWF0aW9uIGluIGdyYXBoOiBpbml0aWFsaXplciIpO2Zvcihjb25zdCBfIG9mIGkuaW5pdGlhbGl6ZXIpe2xldCBiPXMuZ2V0KF8ubmFtZSk7aWYoYj09PXZvaWQgMCl7Y29uc3QgeT1uZXcgZDt5LnR5cGU9e3NoYXBlOntkaW1zOnAuUHJvdG9VdGlsLnRlbnNvckRpbXNGcm9tUHJvdG8oXy5kaW1zKX0sdGVuc29yVHlwZTpwLlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhfLmRhdGFUeXBlKX0sYj10aGlzLl9hbGxEYXRhLnB1c2goeSktMSxzLnNldChfLm5hbWUsYil9dGhpcy5fYWxsRGF0YVtiXS5fZnJvbT0tMSx0aGlzLl9hbGxEYXRhW2JdLnRlbnNvcj1hLlRlbnNvci5mcm9tUHJvdG8oXyl9Zm9yKGxldCBfPTA7Xzx0aGlzLl9hbGxEYXRhLmxlbmd0aDtfKyspdGhpcy5fYWxsRGF0YVtfXS50ZW5zb3J8fCh0aGlzLl9hbGxJbnB1dEluZGljZXMucHVzaChfKSx0aGlzLl9hbGxJbnB1dE5hbWVzLnB1c2goZ1tfXSkpO2lmKCFpLm91dHB1dCl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgaW5mb3JtYXRpb24gaW4gZ3JhcGg6IG91dHB1dCIpO2Zvcihjb25zdCBfIG9mIGkub3V0cHV0KXtpZihzLmhhcyhfLm5hbWUpKXRocm93IG5ldyBFcnJvcihgZHVwbGljYXRlZCBvdXRwdXQgbmFtZTogJHtfLm5hbWV9YCk7Y29uc3QgYj10aGlzLl9hbGxEYXRhLnB1c2gobmV3IGQoXykpLTE7cy5zZXQoXy5uYW1lLGIpLHRoaXMuX2FsbE91dHB1dEluZGljZXMucHVzaChiKSx0aGlzLl9hbGxPdXRwdXROYW1lcy5wdXNoKF8ubmFtZSl9aWYoIWkubm9kZSl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgaW5mb3JtYXRpb24gaW4gZ3JhcGg6IG5vZGUiKTtmb3IoY29uc3QgXyBvZiBpLm5vZGUpe2lmKCFfLm5hbWUpZm9yKGxldCB5PTA7O3krKyl7Y29uc3QgVD1gdW5uYW1lZF8ke18ub3BUeXBlfV8ke3l9YDtpZighbS5oYXMoVCkpe18ubmFtZT1UO2JyZWFrfX1pZihtLmhhcyhfLm5hbWUpKXRocm93IG5ldyBFcnJvcihgZHVwbGljYXRlZCBub2RlIG5hbWU6ICR7Xy5uYW1lfWApO2NvbnN0IGI9dGhpcy5fbm9kZXMucHVzaChuZXcgbChfKSktMTttLnNldChfLm5hbWUsYil9Zm9yKGxldCBfPTA7Xzx0aGlzLl9ub2Rlcy5sZW5ndGg7XysrKXtjb25zdCBiPXRoaXMuX25vZGVzW19dLHk9aS5ub2RlW19dO2lmKCF5Lm91dHB1dCl0aHJvdyBuZXcgRXJyb3IoYG1pc3Npbmcgb3V0cHV0IGZvciBub2RlOiAke3kubmFtZX1gKTtmb3IoY29uc3QgVCBvZiB5Lm91dHB1dCl7bGV0IHc9cy5nZXQoVCk7aWYodz09PXZvaWQgMCYmKHc9dGhpcy5fYWxsRGF0YS5wdXNoKG5ldyBkKS0xLHMuc2V0KFQsdykpLGIub3V0cHV0cy5wdXNoKHcpLHRoaXMuX2FsbERhdGFbd10uX2Zyb20hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBtdWx0aXBsZSBub2RlcyBvdXRwdXQgdG8gb25lIGRhdGEgdmFsdWU6ICR7d31gKTtpZih0aGlzLl9hbGxEYXRhW3ddLl9mcm9tPV8seS5vcFR5cGU9PT0iQ29uc3RhbnQiKXtpZigheS5hdHRyaWJ1dGV8fHkuYXR0cmlidXRlLmxlbmd0aCE9PTF8fCF5LmF0dHJpYnV0ZVswXS50KXRocm93IG5ldyBFcnJvcigibWlzc2luZyBhdHRyaWJ1dGVzIG9yIG1pc3NpbmcgdGVuc29yIHZhbHVlIGluIGF0dHJpYnV0ZXMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTtpZigheS5vdXRwdXR8fHkub3V0cHV0Lmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIG91dHB1dCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIG91dHB1dHMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTtiLm91dHB1dHMucG9wKCksYi5leGVjdXRlTm9kZT0hMSx0aGlzLl9hbGxEYXRhW3ddLl9mcm9tPS0xLHRoaXMuX2FsbERhdGFbd10udGVuc29yPWEuVGVuc29yLmZyb21Qcm90byh5LmF0dHJpYnV0ZVswXS50KX19fWZvcihsZXQgXz0wO188dGhpcy5fbm9kZXMubGVuZ3RoO18rKyl7Y29uc3QgYj10aGlzLl9ub2Rlc1tfXSx5PWkubm9kZVtfXTtpZigheS5pbnB1dCl0aHJvdyBuZXcgRXJyb3IoYG1pc3NpbmcgaW5wdXQgZm9yIG5vZGU6ICR7eS5uYW1lfWApO2Zvcihjb25zdCBUIG9mIHkuaW5wdXQpe2NvbnN0IHc9cy5nZXQoVCk7aWYodz09PXZvaWQgMCl7aWYoVD09PSIiJiZ5LmlucHV0Lmxlbmd0aD09PTMmJnkub3BUeXBlPT09IlJlc2l6ZSIpY29udGludWU7dGhyb3cgbmV3IEVycm9yKGB1bnJlY29nbml6ZWQgaW5wdXQgJyR7VH0nIGZvciBub2RlOiAke3kubmFtZX1gKX1iLmlucHV0cy5wdXNoKHcpLHRoaXMuX2FsbERhdGFbd10uX3RvLnB1c2goXyl9fXJldHVybiEwfWJ1aWxkR3JhcGhGcm9tT3J0Rm9ybWF0KGkpe3ZhciBzLG0sZztjb25zdCBfPW5ldyBNYXA7dGhpcy5fYWxsRGF0YT1bXSx0aGlzLl9hbGxJbnB1dEluZGljZXM9W10sdGhpcy5fYWxsSW5wdXROYW1lcz1bXSx0aGlzLl9hbGxPdXRwdXRJbmRpY2VzPVtdLHRoaXMuX2FsbE91dHB1dE5hbWVzPVtdLHRoaXMuX25vZGVzPVtdO2NvbnN0IGI9bmV3IE1hcCx5PVtdO2ZvcihsZXQgVD0wO1Q8aS5pbnB1dHNMZW5ndGgoKTtUKyspe2NvbnN0IHc9aS5pbnB1dHMoVCk7aWYoXy5oYXModykpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIGlucHV0IG5hbWU6ICR7d31gKTtmb3IobGV0IHg9MDt4PGkubm9kZUFyZ3NMZW5ndGgoKTt4KyspaWYoKChzPWkubm9kZUFyZ3MoeCkpPT09bnVsbHx8cz09PXZvaWQgMD92b2lkIDA6cy5uYW1lKCkpPT09dyl7Y29uc3QgRT1uZXcgZDtpZigoKGc9KG09aS5ub2RlQXJncyh4KSk9PT1udWxsfHxtPT09dm9pZCAwP3ZvaWQgMDptLnR5cGUoKSk9PT1udWxsfHxnPT09dm9pZCAwP3ZvaWQgMDpnLnZhbHVlVHlwZSgpKSE9PWYuVHlwZUluZm9WYWx1ZS50ZW5zb3JfdHlwZSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdmFsdWUgdHlwZSBmb3IgdGhlIG5vZGVBcmcuIik7Y29uc3QgUD1pLm5vZGVBcmdzKHgpLnR5cGUoKS52YWx1ZShuZXcgZi5UZW5zb3JUeXBlQW5kU2hhcGUpLHY9cC5Qcm90b1V0aWwudGVuc29yRGF0YVR5cGVGcm9tUHJvdG8oUC5lbGVtVHlwZSgpKSxNPVAuc2hhcGUoKSwkPVtdO2ZvcihsZXQgQj0wO0I8TS5kaW1MZW5ndGgoKTtCKyspJC5wdXNoKHAuTG9uZ1V0aWwubG9uZ1RvTnVtYmVyKE0uZGltKEIpLnZhbHVlKCkuZGltVmFsdWUoKSkpO0UudHlwZT17c2hhcGU6e2RpbXM6JH0sdGVuc29yVHlwZTp2fTtjb25zdCB6PXRoaXMuX2FsbERhdGEucHVzaChFKS0xO18uc2V0KHcseikseS5wdXNoKHcpfX1mb3IobGV0IFQ9MDtUPGkuaW5pdGlhbGl6ZXJzTGVuZ3RoKCk7VCsrKXtjb25zdCB3PWkuaW5pdGlhbGl6ZXJzKFQpO2xldCB4PV8uZ2V0KHcubmFtZSgpKTtpZih4PT09dm9pZCAwKXtjb25zdCBFPW5ldyBkLFA9cC5Qcm90b1V0aWwudGVuc29yRGltc0Zyb21PUlRGb3JtYXQodyksdj1wLlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byh3LmRhdGFUeXBlKCkpO0UudHlwZT17c2hhcGU6e2RpbXM6UH0sdGVuc29yVHlwZTp2fSx4PXRoaXMuX2FsbERhdGEucHVzaChFKS0xLF8uc2V0KHcubmFtZSgpLHgpfXRoaXMuX2FsbERhdGFbeF0uX2Zyb209LTEsdGhpcy5fYWxsRGF0YVt4XS50ZW5zb3I9YS5UZW5zb3IuZnJvbU9ydFRlbnNvcih3KX1mb3IobGV0IFQ9MDtUPHRoaXMuX2FsbERhdGEubGVuZ3RoO1QrKyl0aGlzLl9hbGxEYXRhW1RdLnRlbnNvcnx8KHRoaXMuX2FsbElucHV0SW5kaWNlcy5wdXNoKFQpLHRoaXMuX2FsbElucHV0TmFtZXMucHVzaCh5W1RdKSk7Zm9yKGxldCBUPTA7VDxpLm91dHB1dHNMZW5ndGgoKTtUKyspe2NvbnN0IHc9aS5vdXRwdXRzKFQpO2lmKF8uaGFzKHcpKXRocm93IG5ldyBFcnJvcihgZHVwbGljYXRlZCBvdXRwdXQgbmFtZTogJHt3fWApO2NvbnN0IHg9dGhpcy5fYWxsRGF0YS5wdXNoKG5ldyBkKS0xO18uc2V0KHcseCksdGhpcy5fYWxsT3V0cHV0SW5kaWNlcy5wdXNoKHgpLHRoaXMuX2FsbE91dHB1dE5hbWVzLnB1c2godyl9aWYoIWkubm9kZXMpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIGluZm9ybWF0aW9uIGluIGdyYXBoOiBub2RlIik7Zm9yKGxldCBUPTA7VDxpLm5vZGVzTGVuZ3RoKCk7VCsrKXtjb25zdCB3PWkubm9kZXMoVCk7bGV0IHg9dy5uYW1lKCk7aWYoIXgpZm9yKGxldCBQPTA7eD1gdW5uYW1lZF8ke3cub3BUeXBlKCl9XyR7UH1gLGIuaGFzKHgpO1ArKyk7aWYoYi5oYXMoeCkpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIG5vZGUgbmFtZTogJHt4fWApO2NvbnN0IEU9dGhpcy5fbm9kZXMucHVzaChuZXcgbCh3LHgpKS0xO2Iuc2V0KHgsRSl9Zm9yKGxldCBUPTA7VDx0aGlzLl9ub2Rlcy5sZW5ndGg7VCsrKXtjb25zdCB3PXRoaXMuX25vZGVzW1RdLHg9aS5ub2RlcyhUKTtpZih4PT1udWxsKXRocm93IG5ldyBFcnJvcihgTm8gbm9kZSBleGlzdHMgYXQgaW5kZXggJHtUfWApO2lmKCh4PT1udWxsP3ZvaWQgMDp4Lm91dHB1dHNMZW5ndGgoKSk9PT0wKXRocm93IG5ldyBFcnJvcihgbWlzc2luZyBvdXRwdXQgZm9yIG5vZGU6ICR7eC5uYW1lfWApO2ZvcihsZXQgRT0wO0U8KHg9PW51bGw/dm9pZCAwOngub3V0cHV0c0xlbmd0aCgpKTtFKyspe2NvbnN0IFA9eD09bnVsbD92b2lkIDA6eC5vdXRwdXRzKEUpO2xldCB2PV8uZ2V0KFApO2lmKHY9PT12b2lkIDAmJih2PXRoaXMuX2FsbERhdGEucHVzaChuZXcgZCktMSxfLnNldChQLHYpKSx3Lm91dHB1dHMucHVzaCh2KSx0aGlzLl9hbGxEYXRhW3ZdLl9mcm9tIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgbXVsdGlwbGUgbm9kZXMgb3V0cHV0IHRvIG9uZSBkYXRhIHZhbHVlOiAke3Z9YCk7aWYodGhpcy5fYWxsRGF0YVt2XS5fZnJvbT1ULHgub3BUeXBlKCk9PT0iQ29uc3RhbnQiKXtpZih4LmF0dHJpYnV0ZXNMZW5ndGgoKSE9PTF8fCF4LmF0dHJpYnV0ZXMoMCkudCgpKXRocm93IG5ldyBFcnJvcigibWlzc2luZyBhdHRyaWJ1dGVzIG9yIG1pc3NpbmcgdGVuc29yIHZhbHVlIGluIGF0dHJpYnV0ZXMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTtpZih4Lm91dHB1dHNMZW5ndGgoKSE9PTEpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIG91dHB1dCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIG91dHB1dHMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTt3Lm91dHB1dHMucG9wKCksdy5leGVjdXRlTm9kZT0hMSx0aGlzLl9hbGxEYXRhW3ZdLl9mcm9tPS0xLHRoaXMuX2FsbERhdGFbdl0udGVuc29yPWEuVGVuc29yLmZyb21PcnRUZW5zb3IoeC5hdHRyaWJ1dGVzKDApLnQoKSl9fX1mb3IobGV0IFQ9MDtUPHRoaXMuX25vZGVzLmxlbmd0aDtUKyspe2NvbnN0IHc9dGhpcy5fbm9kZXNbVF0seD1pLm5vZGVzKFQpO2lmKHguaW5wdXRzTGVuZ3RoKCk9PT0wKXRocm93IG5ldyBFcnJvcihgbWlzc2luZyBpbnB1dCBmb3Igbm9kZTogJHt4Lm5hbWV9YCk7Zm9yKGxldCBFPTA7RTx4LmlucHV0c0xlbmd0aCgpO0UrKyl7Y29uc3QgUD14LmlucHV0cyhFKSx2PV8uZ2V0KFApO2lmKHY9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGB1bnJlY29nbml6ZWQgaW5wdXQgJyR7UH0nIGZvciBub2RlOiAke3gubmFtZSgpfWApO3cuaW5wdXRzLnB1c2godiksdGhpcy5fYWxsRGF0YVt2XS5fdG8ucHVzaChUKX19fWNoZWNrSXNBY3ljbGljKCl7Y29uc3QgaT1uZXcgU2V0O3RoaXMuX2FsbElucHV0SW5kaWNlcy5mb3JFYWNoKGc9Pnt0aGlzLl9hbGxEYXRhW2ddLl90by5mb3JFYWNoKF89PntpLmFkZChfKX0pfSk7Y29uc3Qgcz1BcnJheS5mcm9tKGkpLG09bmV3IEFycmF5KHRoaXMuX25vZGVzLmxlbmd0aCkuZmlsbCgid2hpdGUiKTtmb3IoO3MubGVuZ3RoPjA7KXtjb25zdCBnPXMucG9wKCk7bVtnXT09PSJncmF5Ij9tW2ddPSJibGFjayI6KHMucHVzaChnKSxtW2ddPSJncmF5Iix0aGlzLl9ub2Rlc1tnXS5vdXRwdXRzLmZvckVhY2goXz0+e2NvbnN0IGI9dGhpcy5fYWxsRGF0YVtfXTtpZihiLnRlbnNvciE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIm5vZGUgb3V0cHV0cyBzaG91bGQgbm90IGJlIGluaXRpYWxpemVkIik7aWYoYi5fZnJvbSE9PWcpdGhyb3cgbmV3IEVycm9yKCJmcm9tIHByb3BlcnR5IG9mIHRoZSBWYWx1ZSBvYmplY3QgZG9lc24ndCBtYXRjaCBpbmRleCBvZiBOb2RlIGJlaW5nIHByb2Nlc3NlZCIpO2IuX3RvLmZvckVhY2goeT0+e2lmKG1beV09PT0iZ3JheSIpdGhyb3cgbmV3IEVycm9yKCJtb2RlbCBncmFwaCBpcyBjeWNsaWMiKTttW3ldPT09IndoaXRlIiYmcy5wdXNoKHkpfSl9KSl9fXRyYW5zZm9ybUdyYXBoKGkpe3RoaXMucmVtb3ZlQWxsSWRlbnRpdHlOb2RlcygpLHRoaXMucmVtb3ZlQWxsRHJvcG91dE5vZGVzKCksdGhpcy5mdXNlQ29udkFjdGl2YXRpb25Ob2RlcygpLGkmJmkudHJhbnNmb3JtR3JhcGgodGhpcyksdGhpcy5maW5hbGl6ZUdyYXBoKCl9ZmluYWxpemVHcmFwaCgpe2xldCBpPTA7Zm9yKGxldCBzPTA7czx0aGlzLl9ub2Rlcy5sZW5ndGg7cysrKXRoaXMuX25vZGVzW3NdLmV4ZWN1dGVOb2RlP2k+MCYmKHRoaXMuX25vZGVzW3NdLmlucHV0cy5mb3JFYWNoKG09Pntjb25zdCBnPXRoaXMuX2FsbERhdGFbbV0uX3RvLmluZGV4T2YocytpKTtnIT09LTEmJih0aGlzLl9hbGxEYXRhW21dLl90b1tnXT1zKX0pLHRoaXMuX25vZGVzW3NdLm91dHB1dHMuZm9yRWFjaChtPT57dGhpcy5fYWxsRGF0YVttXS5fZnJvbSYmdGhpcy5fYWxsRGF0YVttXS5fZnJvbT09PXMraSYmKHRoaXMuX2FsbERhdGFbbV0uX2Zyb209cyl9KSk6KGkrKyx0aGlzLl9ub2Rlc1tzXS5vdXRwdXRzLmZvckVhY2gobT0+e3RoaXMuX2FsbERhdGFbbV0uX2Zyb209LTJ9KSx0aGlzLl9ub2Rlcy5zcGxpY2UocywxKSxzLS0pO2k9MDtmb3IobGV0IHM9MDtzPHRoaXMuX2FsbERhdGEubGVuZ3RoO3MrKylpZih0aGlzLl9hbGxEYXRhW3NdLmZyb20hPT0tMnx8dGhpcy5fYWxsT3V0cHV0SW5kaWNlcy5pbmRleE9mKHMraSkhPT0tMSl7aWYoaT4wKXtsZXQgbT0tMTt0aGlzLl9hbGxEYXRhW3NdLmZyb20hPT12b2lkIDAmJnRoaXMuX2FsbERhdGFbc10uZnJvbSE9PS0xPyhtPXRoaXMuX25vZGVzW3RoaXMuX2FsbERhdGFbc10uZnJvbV0ub3V0cHV0cy5pbmRleE9mKHMraSksbSE9PS0xJiYodGhpcy5fbm9kZXNbdGhpcy5fYWxsRGF0YVtzXS5mcm9tXS5vdXRwdXRzW21dPXMpKToobT10aGlzLl9hbGxJbnB1dEluZGljZXMuaW5kZXhPZihzK2kpLG0hPT0tMSYmKHRoaXMuX2FsbElucHV0SW5kaWNlc1ttXT1zKSksdGhpcy5fYWxsRGF0YVtzXS50by5mb3JFYWNoKGc9PnttPXRoaXMuX25vZGVzW2ddLmlucHV0cy5pbmRleE9mKHMraSksbSE9PS0xJiYodGhpcy5fbm9kZXNbZ10uaW5wdXRzW21dPXMpfSksdGhpcy5fYWxsRGF0YVtzXS50by5sZW5ndGg9PT0wJiYobT10aGlzLl9hbGxPdXRwdXRJbmRpY2VzLmluZGV4T2YocytpKSxtIT09LTEmJih0aGlzLl9hbGxPdXRwdXRJbmRpY2VzW21dPXMpKX19ZWxzZSBpKyssdGhpcy5fYWxsRGF0YS5zcGxpY2UocywxKSxzLS19ZGVsZXRlTm9kZShpKXtjb25zdCBzPXRoaXMuX25vZGVzW2ldO2lmKHMub3V0cHV0cy5sZW5ndGg+MSl7Zm9yKGxldCBUPTE7VDxzLm91dHB1dHMubGVuZ3RoO1QrKylpZih0aGlzLl9hbGxEYXRhW3Mub3V0cHV0c1tUXV0udG8ubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCJOb2RlIGRlbGV0aW9uIHdpdGggbW9yZSB0aGFuIG9uZSBvdXRwdXQgY29ubmVjdGVkIHRvIG90aGVyIG5vZGVzIGlzIG5vdCBzdXBwb3J0ZWQuICIpfXMuZXhlY3V0ZU5vZGU9ITE7Y29uc3QgbT1zLmlucHV0c1swXSxnPXMub3V0cHV0c1swXSxfPXRoaXMuX2FsbERhdGFbZ10udG8sYj10aGlzLl9hbGxEYXRhW21dLnRvLmluZGV4T2YoaSk7aWYoYj09PS0xKXRocm93IG5ldyBFcnJvcigiVGhlIFZhbHVlIG9iamVjdCBkb2Vzbid0IGhhdmUgdGhlIGN1cnJlbnQgTm9kZSBpbiBpdCdzICd0bycgcHJvcGVydHkgIik7dGhpcy5fYWxsRGF0YVttXS50by5zcGxpY2UoYiwxKSx0aGlzLl9hbGxEYXRhW2ddLl90bz1bXTtjb25zdCB5PXRoaXMuX2FsbE91dHB1dEluZGljZXMuaW5kZXhPZihnKTtpZih5IT09LTEmJih0aGlzLl9hbGxPdXRwdXRJbmRpY2VzW3ldPW0pLF8mJl8ubGVuZ3RoPjApZm9yKGNvbnN0IFQgb2YgXyl7Y29uc3Qgdz10aGlzLl9ub2Rlc1tUXS5pbnB1dHMuaW5kZXhPZihnKTtpZih3PT09LTEpdGhyb3cgbmV3IEVycm9yKCJUaGUgTm9kZSBvYmplY3QgZG9lc24ndCBoYXZlIHRoZSBvdXRwdXQgVmFsdWUgaW4gaXQncyAnaW5wdXRzJyBwcm9wZXJ0eSAiKTt0aGlzLl9ub2Rlc1tUXS5pbnB1dHNbd109bSx0aGlzLl9hbGxEYXRhW21dLnRvLnB1c2goVCl9fXJlbW92ZUFsbERyb3BvdXROb2Rlcygpe2xldCBpPTA7Zm9yKGNvbnN0IHMgb2YgdGhpcy5fbm9kZXMpe2lmKHMub3BUeXBlPT09IkRyb3BvdXQiKXtpZihzLmlucHV0cy5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigiRHJvcG91dCBub2RlcyBzaG91bGQgb25seSBjb250YWluIG9uZSBpbnB1dC4gIik7aWYocy5vdXRwdXRzLmxlbmd0aCE9PTEmJnMub3V0cHV0cy5sZW5ndGghPT0yKXRocm93IG5ldyBFcnJvcigiRHJvcG91dCBub2RlcyBzaG91bGQgY29udGFpbiBlaXRoZXIgMSBvciAyIG91dHB1dChzKSIpO2lmKHMub3V0cHV0cy5sZW5ndGg9PT0yJiZ0aGlzLl9hbGxEYXRhW3Mub3V0cHV0c1sxXV0uX3RvLmxlbmd0aCE9PTApdGhyb3cgbmV3IEVycm9yKCJEcm9wb3V0IG5vZGVzJ3Mgc2Vjb25kIG91dHB1dCBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgYnkgb3RoZXIgbm9kZXMiKTt0aGlzLmRlbGV0ZU5vZGUoaSl9aSsrfX1yZW1vdmVBbGxJZGVudGl0eU5vZGVzKCl7bGV0IGk9MDtmb3IoY29uc3QgcyBvZiB0aGlzLl9ub2RlcylzLm9wVHlwZT09PSJJZGVudGl0eSImJnRoaXMuZGVsZXRlTm9kZShpKSxpKyt9aXNBY3RpdmF0aW9uKGkpe3N3aXRjaChpLm9wVHlwZSl7Y2FzZSJSZWx1IjpjYXNlIlNpZ21vaWQiOmNhc2UiQ2xpcCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVzZUNvbnZBY3RpdmF0aW9uTm9kZXMoKXtmb3IoY29uc3QgaSBvZiB0aGlzLl9ub2RlcylpZihpLm9wVHlwZT09PSJDb252Iil7Y29uc3Qgcz10aGlzLl9hbGxEYXRhW2kub3V0cHV0c1swXV0uX3RvO2lmKHMubGVuZ3RoPT09MSYmdGhpcy5pc0FjdGl2YXRpb24odGhpcy5fbm9kZXNbc1swXV0pKXtjb25zdCBtPXRoaXMuX25vZGVzW3NbMF1dO2lmKG0ub3BUeXBlPT09IkNsaXAiKWlmKG0uaW5wdXRzLmxlbmd0aD09PTEpdHJ5e2kuYXR0cmlidXRlcy5zZXQoImFjdGl2YXRpb25fcGFyYW1zIiwiZmxvYXRzIixbbS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJtaW4iKSxtLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoIm1heCIpXSl9Y2F0Y2h7aS5hdHRyaWJ1dGVzLnNldCgiYWN0aXZhdGlvbl9wYXJhbXMiLCJmbG9hdHMiLFtwLk1JTl9DTElQLHAuTUFYX0NMSVBdKX1lbHNle2lmKCEobS5pbnB1dHMubGVuZ3RoPj0zJiZ0aGlzLl9hbGxEYXRhW20uaW5wdXRzWzFdXS50ZW5zb3IhPT12b2lkIDAmJnRoaXMuX2FsbERhdGFbbS5pbnB1dHNbMl1dLnRlbnNvciE9PXZvaWQgMCkpY29udGludWU7aS5hdHRyaWJ1dGVzLnNldCgiYWN0aXZhdGlvbl9wYXJhbXMiLCJmbG9hdHMiLFt0aGlzLl9hbGxEYXRhW20uaW5wdXRzWzFdXS50ZW5zb3IuZmxvYXREYXRhWzBdLHRoaXMuX2FsbERhdGFbbS5pbnB1dHNbMl1dLnRlbnNvci5mbG9hdERhdGFbMF1dKX1pLmF0dHJpYnV0ZXMuc2V0KCJhY3RpdmF0aW9uIiwic3RyaW5nIixtLm9wVHlwZSksdGhpcy5kZWxldGVOb2RlKHNbMF0pfX19fX0sNjIzMTooYyx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lm5vdz10LlByb2ZpbGVyPXQuTG9nZ2VyPXZvaWQgMDtjb25zdCByPXt2ZXJib3NlOjFlMyxpbmZvOjJlMyx3YXJuaW5nOjRlMyxlcnJvcjo1ZTMsZmF0YWw6NmUzfSxvPXtub25lOm5ldyBjbGFzc3tsb2cobCxuLGUpe319LGNvbnNvbGU6bmV3IGNsYXNze2xvZyhsLG4sZSl7Y29uc29sZS5sb2coYCR7dGhpcy5jb2xvcihsKX0gJHtlPyJceDFCWzM1bSIrZSsiXHgxQlswbSAiOiIifSR7bn1gKX1jb2xvcihsKXtzd2l0Y2gobCl7Y2FzZSJ2ZXJib3NlIjpyZXR1cm4iXHgxQlszNDs0MG12XHgxQlswbSI7Y2FzZSJpbmZvIjpyZXR1cm4iXHgxQlszMm1pXHgxQlswbSI7Y2FzZSJ3YXJuaW5nIjpyZXR1cm4iXHgxQlszMDs0M213XHgxQlswbSI7Y2FzZSJlcnJvciI6cmV0dXJuIlx4MUJbMzE7NDBtZVx4MUJbMG0iO2Nhc2UiZmF0YWwiOnJldHVybiJceDFCWzEwMW1mXHgxQlswbSI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHNldmVyaXR5OiAke2x9YCl9fX19LHU9e3Byb3ZpZGVyOiJjb25zb2xlIixtaW5pbWFsU2V2ZXJpdHk6Indhcm5pbmciLGxvZ0RhdGVUaW1lOiEwLGxvZ1NvdXJjZUxvY2F0aW9uOiExfTtsZXQgaD17IiI6dX07ZnVuY3Rpb24gYShsLG4sZSxpKXtpZihuPT09dm9pZCAwKXJldHVybiBzPWwse3ZlcmJvc2U6YS52ZXJib3NlLmJpbmQobnVsbCxzKSxpbmZvOmEuaW5mby5iaW5kKG51bGwscyksd2FybmluZzphLndhcm5pbmcuYmluZChudWxsLHMpLGVycm9yOmEuZXJyb3IuYmluZChudWxsLHMpLGZhdGFsOmEuZmF0YWwuYmluZChudWxsLHMpfTtpZihlPT09dm9pZCAwKXAobCxuKTtlbHNlIGlmKHR5cGVvZiBlPT0ibnVtYmVyIiYmaT09PXZvaWQgMClwKGwsbik7ZWxzZSBpZih0eXBlb2YgZT09InN0cmluZyImJmk9PT12b2lkIDApcChsLGUsMCxuKTtlbHNle2lmKHR5cGVvZiBlIT0ic3RyaW5nInx8dHlwZW9mIGkhPSJudW1iZXIiKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IGlzIHZhbGlkIik7cChsLGUsMCxuKX12YXIgc31mdW5jdGlvbiBwKGwsbixlLGkpe2NvbnN0IHM9aFtpfHwiIl18fGhbIiJdO3JbbF08cltzLm1pbmltYWxTZXZlcml0eV18fChzLmxvZ0RhdGVUaW1lJiYobj1gJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9fCR7bn1gKSxzLmxvZ1NvdXJjZUxvY2F0aW9uLG9bcy5wcm92aWRlcl0ubG9nKGwsbixpKSl9KGZ1bmN0aW9uKGwpe2Z1bmN0aW9uIG4oaSl7aD17fSxlKCIiLGl8fHt9KX1mdW5jdGlvbiBlKGkscyl7aWYoaT09PSIqIiluKHMpO2Vsc2V7Y29uc3QgbT1oW2ldfHx1O2hbaV09e3Byb3ZpZGVyOnMucHJvdmlkZXJ8fG0ucHJvdmlkZXIsbWluaW1hbFNldmVyaXR5OnMubWluaW1hbFNldmVyaXR5fHxtLm1pbmltYWxTZXZlcml0eSxsb2dEYXRlVGltZTpzLmxvZ0RhdGVUaW1lPT09dm9pZCAwP20ubG9nRGF0ZVRpbWU6cy5sb2dEYXRlVGltZSxsb2dTb3VyY2VMb2NhdGlvbjpzLmxvZ1NvdXJjZUxvY2F0aW9uPT09dm9pZCAwP20ubG9nU291cmNlTG9jYXRpb246cy5sb2dTb3VyY2VMb2NhdGlvbn19fWwudmVyYm9zZT1mdW5jdGlvbihpLHMpe2woInZlcmJvc2UiLGkscyl9LGwuaW5mbz1mdW5jdGlvbihpLHMpe2woImluZm8iLGkscyl9LGwud2FybmluZz1mdW5jdGlvbihpLHMpe2woIndhcm5pbmciLGkscyl9LGwuZXJyb3I9ZnVuY3Rpb24oaSxzKXtsKCJlcnJvciIsaSxzKX0sbC5mYXRhbD1mdW5jdGlvbihpLHMpe2woImZhdGFsIixpLHMpfSxsLnJlc2V0PW4sbC5zZXQ9ZSxsLnNldFdpdGhFbnY9ZnVuY3Rpb24oaSl7Y29uc3Qgcz17fTtpLmxvZ0xldmVsJiYocy5taW5pbWFsU2V2ZXJpdHk9aS5sb2dMZXZlbCksZSgiIixzKX19KShhfHwoYT17fSkpLHQuTG9nZ2VyPWE7Y2xhc3MgZntjb25zdHJ1Y3RvcihuLGUsaSxzLG0sZyl7dGhpcy5jYXRlZ29yeT1uLHRoaXMubmFtZT1lLHRoaXMuc3RhcnRUaW1lPWksdGhpcy5lbmRDYWxsYmFjaz1zLHRoaXMudGltZXI9bSx0aGlzLmN0eD1nfWVuZCgpe3JldHVybiB0aGlzLmVuZENhbGxiYWNrKHRoaXMpfWFzeW5jIGNoZWNrVGltZXIoKXtpZih0aGlzLmN0eD09PXZvaWQgMHx8dGhpcy50aW1lcj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIk5vIHdlYmdsIHRpbWVyIGZvdW5kIik7cmV0dXJuIHRoaXMuY3R4LmVuZFRpbWVyKCksdGhpcy5jdHgud2FpdEZvclF1ZXJ5QW5kR2V0VGltZSh0aGlzLnRpbWVyKX19Y2xhc3MgZHtjb25zdHJ1Y3RvcihuLGUsaSxzKXt0aGlzLmNhdGVnb3J5PW4sdGhpcy5uYW1lPWUsdGhpcy5zdGFydFRpbWU9aSx0aGlzLmVuZFRpbWU9c319dC5Qcm9maWxlcj1jbGFzc3tzdGF0aWMgY3JlYXRlKGwpe3JldHVybiBsPT09dm9pZCAwP25ldyB0aGlzOm5ldyB0aGlzKGwubWF4TnVtYmVyRXZlbnRzLGwuZmx1c2hCYXRjaFNpemUsbC5mbHVzaEludGVydmFsSW5NaWxsaXNlY29uZHMpfWNvbnN0cnVjdG9yKGwsbixlKXt0aGlzLl9zdGFydGVkPSExLHRoaXMuX2ZsdXNoUG9pbnRlcj0wLHRoaXMuX3N0YXJ0ZWQ9ITEsdGhpcy5fbWF4TnVtYmVyRXZlbnRzPWw9PT12b2lkIDA/MWU0OmwsdGhpcy5fZmx1c2hCYXRjaFNpemU9bj09PXZvaWQgMD8xMDpuLHRoaXMuX2ZsdXNoSW50ZXJ2YWxJbk1pbGxpc2Vjb25kcz1lPT09dm9pZCAwPzVlMzplfXN0YXJ0KCl7dGhpcy5fc3RhcnRlZD0hMCx0aGlzLl90aW1pbmdFdmVudHM9W10sdGhpcy5fZmx1c2hUaW1lPSgwLHQubm93KSgpLHRoaXMuX2ZsdXNoUG9pbnRlcj0wfXN0b3AoKXtmb3IodGhpcy5fc3RhcnRlZD0hMTt0aGlzLl9mbHVzaFBvaW50ZXI8dGhpcy5fdGltaW5nRXZlbnRzLmxlbmd0aDt0aGlzLl9mbHVzaFBvaW50ZXIrKyl0aGlzLmxvZ09uZUV2ZW50KHRoaXMuX3RpbWluZ0V2ZW50c1t0aGlzLl9mbHVzaFBvaW50ZXJdKX1ldmVudChsLG4sZSxpKXtjb25zdCBzPXRoaXMuX3N0YXJ0ZWQ/dGhpcy5iZWdpbihsLG4saSk6dm9pZCAwO2xldCBtPSExO2NvbnN0IGc9ZSgpO2lmKGcmJnR5cGVvZiBnLnRoZW49PSJmdW5jdGlvbiIpcmV0dXJuIG09ITAsbmV3IFByb21pc2UoKF8sYik9PntnLnRoZW4oYXN5bmMgeT0+e3MmJmF3YWl0IHMuZW5kKCksXyh5KX0sYXN5bmMgeT0+e3MmJmF3YWl0IHMuZW5kKCksYih5KX0pfSk7aWYoIW0mJnMpe2NvbnN0IF89cy5lbmQoKTtpZihfJiZ0eXBlb2YgXy50aGVuPT0iZnVuY3Rpb24iKXJldHVybiBuZXcgUHJvbWlzZSgoYix5KT0+e18udGhlbigoKT0+e2IoZyl9LFQ9Pnt5KFQpfSl9KX1yZXR1cm4gZ31iZWdpbihsLG4sZSl7aWYoIXRoaXMuX3N0YXJ0ZWQpdGhyb3cgbmV3IEVycm9yKCJwcm9maWxlciBpcyBub3Qgc3RhcnRlZCB5ZXQiKTtpZihlPT09dm9pZCAwKXtjb25zdCBpPSgwLHQubm93KSgpO3JldHVybiB0aGlzLmZsdXNoKGkpLG5ldyBmKGwsbixpLHM9PnRoaXMuZW5kU3luYyhzKSl9e2NvbnN0IGk9ZS5iZWdpblRpbWVyKCk7cmV0dXJuIG5ldyBmKGwsbiwwLGFzeW5jIHM9PnRoaXMuZW5kKHMpLGksZSl9fWFzeW5jIGVuZChsKXtjb25zdCBuPWF3YWl0IGwuY2hlY2tUaW1lcigpO3RoaXMuX3RpbWluZ0V2ZW50cy5sZW5ndGg8dGhpcy5fbWF4TnVtYmVyRXZlbnRzJiYodGhpcy5fdGltaW5nRXZlbnRzLnB1c2gobmV3IGQobC5jYXRlZ29yeSxsLm5hbWUsbC5zdGFydFRpbWUsbikpLHRoaXMuZmx1c2gobikpfWVuZFN5bmMobCl7Y29uc3Qgbj0oMCx0Lm5vdykoKTt0aGlzLl90aW1pbmdFdmVudHMubGVuZ3RoPHRoaXMuX21heE51bWJlckV2ZW50cyYmKHRoaXMuX3RpbWluZ0V2ZW50cy5wdXNoKG5ldyBkKGwuY2F0ZWdvcnksbC5uYW1lLGwuc3RhcnRUaW1lLG4pKSx0aGlzLmZsdXNoKG4pKX1sb2dPbmVFdmVudChsKXt0LkxvZ2dlci52ZXJib3NlKGBQcm9maWxlci4ke2wuY2F0ZWdvcnl9YCxgJHsobC5lbmRUaW1lLWwuc3RhcnRUaW1lKS50b0ZpeGVkKDIpfW1zIG9uIGV2ZW50ICcke2wubmFtZX0nIGF0ICR7bC5lbmRUaW1lLnRvRml4ZWQoMil9YCl9Zmx1c2gobCl7aWYodGhpcy5fdGltaW5nRXZlbnRzLmxlbmd0aC10aGlzLl9mbHVzaFBvaW50ZXI+PXRoaXMuX2ZsdXNoQmF0Y2hTaXplfHxsLXRoaXMuX2ZsdXNoVGltZT49dGhpcy5fZmx1c2hJbnRlcnZhbEluTWlsbGlzZWNvbmRzKXtmb3IoY29uc3Qgbj10aGlzLl9mbHVzaFBvaW50ZXI7dGhpcy5fZmx1c2hQb2ludGVyPG4rdGhpcy5fZmx1c2hCYXRjaFNpemUmJnRoaXMuX2ZsdXNoUG9pbnRlcjx0aGlzLl90aW1pbmdFdmVudHMubGVuZ3RoO3RoaXMuX2ZsdXNoUG9pbnRlcisrKXRoaXMubG9nT25lRXZlbnQodGhpcy5fdGltaW5nRXZlbnRzW3RoaXMuX2ZsdXNoUG9pbnRlcl0pO3RoaXMuX2ZsdXNoVGltZT0oMCx0Lm5vdykoKX19Z2V0IHN0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5fc3RhcnRlZH19LHQubm93PXR5cGVvZiBwZXJmb3JtYW5jZTwidSImJnBlcmZvcm1hbmNlLm5vdz8oKT0+cGVyZm9ybWFuY2Uubm93KCk6RGF0ZS5ub3d9LDI2NDQ6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lk1vZGVsPXZvaWQgMDtjb25zdCBvPXIoNTY4NiksdT1yKDE0NDYpLGg9cig3MDcwKSxhPXIoOTM5NSkscD1yKDI1MTcpO3ZhciBmPWEub25ueHJ1bnRpbWUuZXhwZXJpbWVudGFsLmZiczt0Lk1vZGVsPWNsYXNze2NvbnN0cnVjdG9yKCl7fWxvYWQoZCxsLG4pe2lmKCFuKXRyeXtyZXR1cm4gdm9pZCB0aGlzLmxvYWRGcm9tT25ueEZvcm1hdChkLGwpfWNhdGNoKGUpe2lmKG4hPT12b2lkIDApdGhyb3cgZX10aGlzLmxvYWRGcm9tT3J0Rm9ybWF0KGQsbCl9bG9hZEZyb21Pbm54Rm9ybWF0KGQsbCl7Y29uc3Qgbj11Lm9ubnguTW9kZWxQcm90by5kZWNvZGUoZCk7aWYocC5Mb25nVXRpbC5sb25nVG9OdW1iZXIobi5pclZlcnNpb24pPDMpdGhyb3cgbmV3IEVycm9yKCJvbmx5IHN1cHBvcnQgT05OWCBtb2RlbCB3aXRoIElSX1ZFUlNJT04+PTMiKTt0aGlzLl9vcHNldHM9bi5vcHNldEltcG9ydC5tYXAoZT0+KHtkb21haW46ZS5kb21haW4sdmVyc2lvbjpwLkxvbmdVdGlsLmxvbmdUb051bWJlcihlLnZlcnNpb24pfSkpLHRoaXMuX2dyYXBoPWguR3JhcGguZnJvbShuLmdyYXBoLGwpfWxvYWRGcm9tT3J0Rm9ybWF0KGQsbCl7Y29uc3Qgbj1uZXcgby5mbGF0YnVmZmVycy5CeXRlQnVmZmVyKGQpLGU9Zi5JbmZlcmVuY2VTZXNzaW9uLmdldFJvb3RBc0luZmVyZW5jZVNlc3Npb24obikubW9kZWwoKTtpZihwLkxvbmdVdGlsLmxvbmdUb051bWJlcihlLmlyVmVyc2lvbigpKTwzKXRocm93IG5ldyBFcnJvcigib25seSBzdXBwb3J0IE9OTlggbW9kZWwgd2l0aCBJUl9WRVJTSU9OPj0zIik7dGhpcy5fb3BzZXRzPVtdO2ZvcihsZXQgaT0wO2k8ZS5vcHNldEltcG9ydExlbmd0aCgpO2krKyl7Y29uc3Qgcz1lLm9wc2V0SW1wb3J0KGkpO3RoaXMuX29wc2V0cy5wdXNoKHtkb21haW46cz09bnVsbD92b2lkIDA6cy5kb21haW4oKSx2ZXJzaW9uOnAuTG9uZ1V0aWwubG9uZ1RvTnVtYmVyKHMudmVyc2lvbigpKX0pfXRoaXMuX2dyYXBoPWguR3JhcGguZnJvbShlLmdyYXBoKCksbCl9Z2V0IGdyYXBoKCl7cmV0dXJuIHRoaXMuX2dyYXBofWdldCBvcHNldHMoKXtyZXR1cm4gdGhpcy5fb3BzZXRzfX19LDc4MjooYyx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkZMT0FUX1RZUEVTPXQuSU5UX1RZUEVTPXQuTlVNQkVSX1RZUEVTPXZvaWQgMCx0Lk5VTUJFUl9UWVBFUz1bImZsb2F0MzIiLCJmbG9hdDY0IiwiaW50MzIiLCJpbnQxNiIsImludDgiLCJ1aW50MTYiLCJ1aW50MzIiLCJ1aW50OCJdLHQuSU5UX1RZUEVTPVsiaW50MzIiLCJpbnQxNiIsImludDgiLCJ1aW50MTYiLCJ1aW50MzIiLCJ1aW50OCJdLHQuRkxPQVRfVFlQRVM9WyJmbG9hdDMyIiwiZmxvYXQ2NCJdfSwxMDQ3OihjLHQpPT57ZnVuY3Rpb24gcihvLHUpe2lmKHUuZW5kc1dpdGgoIisiKSl7Y29uc3QgaD1OdW1iZXIucGFyc2VJbnQodS5zdWJzdHJpbmcoMCx1Lmxlbmd0aC0xKSwxMCk7cmV0dXJuIWlzTmFOKGgpJiZoPD1vfWlmKHUuc3BsaXQoIi0iKS5sZW5ndGg9PT0yKXtjb25zdCBoPXUuc3BsaXQoIi0iKSxhPU51bWJlci5wYXJzZUludChoWzBdLDEwKSxwPU51bWJlci5wYXJzZUludChoWzFdLDEwKTtyZXR1cm4haXNOYU4oYSkmJiFpc05hTihwKSYmYTw9byYmbzw9cH1yZXR1cm4gTnVtYmVyLnBhcnNlSW50KHUsMTApPT09b31PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZXNvbHZlT3BlcmF0b3I9dm9pZCAwLHQucmVzb2x2ZU9wZXJhdG9yPWZ1bmN0aW9uKG8sdSxoKXtmb3IoY29uc3QgYSBvZiBoKXtjb25zdCBwPWFbMF0sZj1hWzFdLGQ9YVsyXSxsPWFbM10sbj1hWzRdO2lmKG8ub3BUeXBlPT09cCl7Zm9yKGNvbnN0IGUgb2YgdSlpZigoZS5kb21haW49PT1mfHxlLmRvbWFpbj09PSJhaS5vbm54IiYmZj09PSIiKSYmcihlLnZlcnNpb24sZCkpcmV0dXJue29wSW1wbDpsLG9wSW5pdDpufX19dGhyb3cgbmV3IFR5cGVFcnJvcihgY2Fubm90IHJlc29sdmUgb3BlcmF0b3IgJyR7by5vcFR5cGV9JyB3aXRoIG9wc2V0czogJHt1Lm1hcChhPT5gJHthLmRvbWFpbnx8ImFpLm9ubngifSB2JHthLnZlcnNpb259YCkuam9pbigiLCAiKX1gKX19LDkzOTU6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lm9ubnhydW50aW1lPXZvaWQgMDtjb25zdCBvPXIoNTY4Nik7dmFyIHUsaDt1PXQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSxmdW5jdGlvbihhKXsoZnVuY3Rpb24ocCl7cFtwLlVOREVGSU5FRD0wXT0iVU5ERUZJTkVEIixwW3AuRkxPQVQ9MV09IkZMT0FUIixwW3AuSU5UPTJdPSJJTlQiLHBbcC5TVFJJTkc9M109IlNUUklORyIscFtwLlRFTlNPUj00XT0iVEVOU09SIixwW3AuR1JBUEg9NV09IkdSQVBIIixwW3AuRkxPQVRTPTZdPSJGTE9BVFMiLHBbcC5JTlRTPTddPSJJTlRTIixwW3AuU1RSSU5HUz04XT0iU1RSSU5HUyIscFtwLlRFTlNPUlM9OV09IlRFTlNPUlMiLHBbcC5HUkFQSFM9MTBdPSJHUkFQSFMiLHBbcC5TUEFSU0VfVEVOU09SPTExXT0iU1BBUlNFX1RFTlNPUiIscFtwLlNQQVJTRV9URU5TT1JTPTEyXT0iU1BBUlNFX1RFTlNPUlMifSkoYS5BdHRyaWJ1dGVUeXBlfHwoYS5BdHRyaWJ1dGVUeXBlPXt9KSl9KChoPXUuZXhwZXJpbWVudGFsfHwodS5leHBlcmltZW50YWw9e30pKS5mYnN8fChoLmZicz17fSkpLGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihwKXsoZnVuY3Rpb24oZil7KGZ1bmN0aW9uKGQpe2RbZC5VTktOT1dOPTBdPSJVTktOT1dOIixkW2QuVkFMVUU9MV09IlZBTFVFIixkW2QuUEFSQU09Ml09IlBBUkFNIn0pKGYuRGltZW5zaW9uVmFsdWVUeXBlfHwoZi5EaW1lbnNpb25WYWx1ZVR5cGU9e30pKX0pKHAuZmJzfHwocC5mYnM9e30pKX0pKGEuZXhwZXJpbWVudGFsfHwoYS5leHBlcmltZW50YWw9e30pKX0odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihhKXsoZnVuY3Rpb24ocCl7KGZ1bmN0aW9uKGYpeyhmdW5jdGlvbihkKXtkW2QuVU5ERUZJTkVEPTBdPSJVTkRFRklORUQiLGRbZC5GTE9BVD0xXT0iRkxPQVQiLGRbZC5VSU5UOD0yXT0iVUlOVDgiLGRbZC5JTlQ4PTNdPSJJTlQ4IixkW2QuVUlOVDE2PTRdPSJVSU5UMTYiLGRbZC5JTlQxNj01XT0iSU5UMTYiLGRbZC5JTlQzMj02XT0iSU5UMzIiLGRbZC5JTlQ2ND03XT0iSU5UNjQiLGRbZC5TVFJJTkc9OF09IlNUUklORyIsZFtkLkJPT0w9OV09IkJPT0wiLGRbZC5GTE9BVDE2PTEwXT0iRkxPQVQxNiIsZFtkLkRPVUJMRT0xMV09IkRPVUJMRSIsZFtkLlVJTlQzMj0xMl09IlVJTlQzMiIsZFtkLlVJTlQ2ND0xM109IlVJTlQ2NCIsZFtkLkNPTVBMRVg2ND0xNF09IkNPTVBMRVg2NCIsZFtkLkNPTVBMRVgxMjg9MTVdPSJDT01QTEVYMTI4IixkW2QuQkZMT0FUMTY9MTZdPSJCRkxPQVQxNiJ9KShmLlRlbnNvckRhdGFUeXBlfHwoZi5UZW5zb3JEYXRhVHlwZT17fSkpfSkocC5mYnN8fChwLmZicz17fSkpfSkoYS5leHBlcmltZW50YWx8fChhLmV4cGVyaW1lbnRhbD17fSkpfSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihwKXsoZnVuY3Rpb24oZil7KGZ1bmN0aW9uKGQpe2RbZC5QcmltaXRpdmU9MF09IlByaW1pdGl2ZSIsZFtkLkZ1c2VkPTFdPSJGdXNlZCJ9KShmLk5vZGVUeXBlfHwoZi5Ob2RlVHlwZT17fSkpfSkocC5mYnN8fChwLmZicz17fSkpfSkoYS5leHBlcmltZW50YWx8fChhLmV4cGVyaW1lbnRhbD17fSkpfSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihwKXsoZnVuY3Rpb24oZil7KGZ1bmN0aW9uKGQpe2RbZC5OT05FPTBdPSJOT05FIixkW2QudGVuc29yX3R5cGU9MV09InRlbnNvcl90eXBlIixkW2Quc2VxdWVuY2VfdHlwZT0yXT0ic2VxdWVuY2VfdHlwZSIsZFtkLm1hcF90eXBlPTNdPSJtYXBfdHlwZSJ9KShmLlR5cGVJbmZvVmFsdWV8fChmLlR5cGVJbmZvVmFsdWU9e30pKX0pKHAuZmJzfHwocC5mYnM9e30pKX0pKGEuZXhwZXJpbWVudGFsfHwoYS5leHBlcmltZW50YWw9e30pKX0odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihhKXsoZnVuY3Rpb24ocCl7KGZ1bmN0aW9uKGYpe2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQobixlKXtyZXR1cm4gdGhpcy5iYl9wb3M9bix0aGlzLmJiPWUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzU2hhcGUobixlKXtyZXR1cm4oZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2hhcGUobixlKXtyZXR1cm4gbi5zZXRQb3NpdGlvbihuLnBvc2l0aW9uKCkrby5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLChlfHxuZXcgZCkuX19pbml0KG4ucmVhZEludDMyKG4ucG9zaXRpb24oKSkrbi5wb3NpdGlvbigpLG4pfWRpbShuLGUpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGk/KGV8fG5ldyBhLmV4cGVyaW1lbnRhbC5mYnMuRGltZW5zaW9uKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MraSkrNCpuKSx0aGlzLmJiKTpudWxsfWRpbUxlbmd0aCgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIG4/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3Mrbik6MH1zdGF0aWMgc3RhcnRTaGFwZShuKXtuLnN0YXJ0T2JqZWN0KDEpfXN0YXRpYyBhZGREaW0obixlKXtuLmFkZEZpZWxkT2Zmc2V0KDAsZSwwKX1zdGF0aWMgY3JlYXRlRGltVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUubGVuZ3RoLDQpO2ZvcihsZXQgaT1lLmxlbmd0aC0xO2k+PTA7aS0tKW4uYWRkT2Zmc2V0KGVbaV0pO3JldHVybiBuLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydERpbVZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoNCxlLDQpfXN0YXRpYyBlbmRTaGFwZShuKXtyZXR1cm4gbi5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlU2hhcGUobixlKXtyZXR1cm4gZC5zdGFydFNoYXBlKG4pLGQuYWRkRGltKG4sZSksZC5lbmRTaGFwZShuKX19Zi5TaGFwZT1kfSkocC5mYnN8fChwLmZicz17fSkpfSkoYS5leHBlcmltZW50YWx8fChhLmV4cGVyaW1lbnRhbD17fSkpfSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihwKXsoZnVuY3Rpb24oZil7Y2xhc3MgZHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdChuLGUpe3JldHVybiB0aGlzLmJiX3Bvcz1uLHRoaXMuYmI9ZSx0aGlzfXN0YXRpYyBnZXRSb290QXNEaW1lbnNpb24obixlKXtyZXR1cm4oZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRGltZW5zaW9uKG4sZSl7cmV0dXJuIG4uc2V0UG9zaXRpb24obi5wb3NpdGlvbigpK28uZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwoZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX12YWx1ZShuKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBlPyhufHxuZXcgYS5leHBlcmltZW50YWwuZmJzLkRpbWVuc2lvblZhbHVlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIpOm51bGx9ZGVub3RhdGlvbihuKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBlP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrZSxuKTpudWxsfXN0YXRpYyBzdGFydERpbWVuc2lvbihuKXtuLnN0YXJ0T2JqZWN0KDIpfXN0YXRpYyBhZGRWYWx1ZShuLGUpe24uYWRkRmllbGRPZmZzZXQoMCxlLDApfXN0YXRpYyBhZGREZW5vdGF0aW9uKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgxLGUsMCl9c3RhdGljIGVuZERpbWVuc2lvbihuKXtyZXR1cm4gbi5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlRGltZW5zaW9uKG4sZSxpKXtyZXR1cm4gZC5zdGFydERpbWVuc2lvbihuKSxkLmFkZFZhbHVlKG4sZSksZC5hZGREZW5vdGF0aW9uKG4saSksZC5lbmREaW1lbnNpb24obil9fWYuRGltZW5zaW9uPWR9KShwLmZic3x8KHAuZmJzPXt9KSl9KShhLmV4cGVyaW1lbnRhbHx8KGEuZXhwZXJpbWVudGFsPXt9KSl9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKHApeyhmdW5jdGlvbihmKXtjbGFzcyBke2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KG4sZSl7cmV0dXJuIHRoaXMuYmJfcG9zPW4sdGhpcy5iYj1lLHRoaXN9c3RhdGljIGdldFJvb3RBc0RpbWVuc2lvblZhbHVlKG4sZSl7cmV0dXJuKGV8fG5ldyBkKS5fX2luaXQobi5yZWFkSW50MzIobi5wb3NpdGlvbigpKStuLnBvc2l0aW9uKCksbil9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0RpbWVuc2lvblZhbHVlKG4sZSl7cmV0dXJuIG4uc2V0UG9zaXRpb24obi5wb3NpdGlvbigpK28uZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwoZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1kaW1UeXBlKCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gbj90aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zK24pOmEuZXhwZXJpbWVudGFsLmZicy5EaW1lbnNpb25WYWx1ZVR5cGUuVU5LTk9XTn1kaW1WYWx1ZSgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIG4/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3Mrbik6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9ZGltUGFyYW0obil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gZT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK2Usbik6bnVsbH1zdGF0aWMgc3RhcnREaW1lbnNpb25WYWx1ZShuKXtuLnN0YXJ0T2JqZWN0KDMpfXN0YXRpYyBhZGREaW1UeXBlKG4sZSl7bi5hZGRGaWVsZEludDgoMCxlLGEuZXhwZXJpbWVudGFsLmZicy5EaW1lbnNpb25WYWx1ZVR5cGUuVU5LTk9XTil9c3RhdGljIGFkZERpbVZhbHVlKG4sZSl7bi5hZGRGaWVsZEludDY0KDEsZSxuLmNyZWF0ZUxvbmcoMCwwKSl9c3RhdGljIGFkZERpbVBhcmFtKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgyLGUsMCl9c3RhdGljIGVuZERpbWVuc2lvblZhbHVlKG4pe3JldHVybiBuLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVEaW1lbnNpb25WYWx1ZShuLGUsaSxzKXtyZXR1cm4gZC5zdGFydERpbWVuc2lvblZhbHVlKG4pLGQuYWRkRGltVHlwZShuLGUpLGQuYWRkRGltVmFsdWUobixpKSxkLmFkZERpbVBhcmFtKG4scyksZC5lbmREaW1lbnNpb25WYWx1ZShuKX19Zi5EaW1lbnNpb25WYWx1ZT1kfSkocC5mYnN8fChwLmZicz17fSkpfSkoYS5leHBlcmltZW50YWx8fChhLmV4cGVyaW1lbnRhbD17fSkpfSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihwKXsoZnVuY3Rpb24oZil7Y2xhc3MgZHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdChuLGUpe3JldHVybiB0aGlzLmJiX3Bvcz1uLHRoaXMuYmI9ZSx0aGlzfXN0YXRpYyBnZXRSb290QXNUZW5zb3JUeXBlQW5kU2hhcGUobixlKXtyZXR1cm4oZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVGVuc29yVHlwZUFuZFNoYXBlKG4sZSl7cmV0dXJuIG4uc2V0UG9zaXRpb24obi5wb3NpdGlvbigpK28uZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwoZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1lbGVtVHlwZSgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIG4/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3Mrbik6YS5leHBlcmltZW50YWwuZmJzLlRlbnNvckRhdGFUeXBlLlVOREVGSU5FRH1zaGFwZShuKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBlPyhufHxuZXcgYS5leHBlcmltZW50YWwuZmJzLlNoYXBlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0VGVuc29yVHlwZUFuZFNoYXBlKG4pe24uc3RhcnRPYmplY3QoMil9c3RhdGljIGFkZEVsZW1UeXBlKG4sZSl7bi5hZGRGaWVsZEludDMyKDAsZSxhLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yRGF0YVR5cGUuVU5ERUZJTkVEKX1zdGF0aWMgYWRkU2hhcGUobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDEsZSwwKX1zdGF0aWMgZW5kVGVuc29yVHlwZUFuZFNoYXBlKG4pe3JldHVybiBuLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVUZW5zb3JUeXBlQW5kU2hhcGUobixlLGkpe3JldHVybiBkLnN0YXJ0VGVuc29yVHlwZUFuZFNoYXBlKG4pLGQuYWRkRWxlbVR5cGUobixlKSxkLmFkZFNoYXBlKG4saSksZC5lbmRUZW5zb3JUeXBlQW5kU2hhcGUobil9fWYuVGVuc29yVHlwZUFuZFNoYXBlPWR9KShwLmZic3x8KHAuZmJzPXt9KSl9KShhLmV4cGVyaW1lbnRhbHx8KGEuZXhwZXJpbWVudGFsPXt9KSl9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKHApeyhmdW5jdGlvbihmKXtjbGFzcyBke2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KG4sZSl7cmV0dXJuIHRoaXMuYmJfcG9zPW4sdGhpcy5iYj1lLHRoaXN9c3RhdGljIGdldFJvb3RBc01hcFR5cGUobixlKXtyZXR1cm4oZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTWFwVHlwZShuLGUpe3JldHVybiBuLnNldFBvc2l0aW9uKG4ucG9zaXRpb24oKStvLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKGV8fG5ldyBkKS5fX2luaXQobi5yZWFkSW50MzIobi5wb3NpdGlvbigpKStuLnBvc2l0aW9uKCksbil9a2V5VHlwZSgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIG4/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3Mrbik6YS5leHBlcmltZW50YWwuZmJzLlRlbnNvckRhdGFUeXBlLlVOREVGSU5FRH12YWx1ZVR5cGUobil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT8obnx8bmV3IGEuZXhwZXJpbWVudGFsLmZicy5UeXBlSW5mbykuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytlKSx0aGlzLmJiKTpudWxsfXN0YXRpYyBzdGFydE1hcFR5cGUobil7bi5zdGFydE9iamVjdCgyKX1zdGF0aWMgYWRkS2V5VHlwZShuLGUpe24uYWRkRmllbGRJbnQzMigwLGUsYS5leHBlcmltZW50YWwuZmJzLlRlbnNvckRhdGFUeXBlLlVOREVGSU5FRCl9c3RhdGljIGFkZFZhbHVlVHlwZShuLGUpe24uYWRkRmllbGRPZmZzZXQoMSxlLDApfXN0YXRpYyBlbmRNYXBUeXBlKG4pe3JldHVybiBuLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVNYXBUeXBlKG4sZSxpKXtyZXR1cm4gZC5zdGFydE1hcFR5cGUobiksZC5hZGRLZXlUeXBlKG4sZSksZC5hZGRWYWx1ZVR5cGUobixpKSxkLmVuZE1hcFR5cGUobil9fWYuTWFwVHlwZT1kfSkocC5mYnN8fChwLmZicz17fSkpfSkoYS5leHBlcmltZW50YWx8fChhLmV4cGVyaW1lbnRhbD17fSkpfSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihwKXsoZnVuY3Rpb24oZil7Y2xhc3MgZHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdChuLGUpe3JldHVybiB0aGlzLmJiX3Bvcz1uLHRoaXMuYmI9ZSx0aGlzfXN0YXRpYyBnZXRSb290QXNTZXF1ZW5jZVR5cGUobixlKXtyZXR1cm4oZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2VxdWVuY2VUeXBlKG4sZSl7cmV0dXJuIG4uc2V0UG9zaXRpb24obi5wb3NpdGlvbigpK28uZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwoZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1lbGVtVHlwZShuKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBlPyhufHxuZXcgYS5leHBlcmltZW50YWwuZmJzLlR5cGVJbmZvKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0U2VxdWVuY2VUeXBlKG4pe24uc3RhcnRPYmplY3QoMSl9c3RhdGljIGFkZEVsZW1UeXBlKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgwLGUsMCl9c3RhdGljIGVuZFNlcXVlbmNlVHlwZShuKXtyZXR1cm4gbi5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlU2VxdWVuY2VUeXBlKG4sZSl7cmV0dXJuIGQuc3RhcnRTZXF1ZW5jZVR5cGUobiksZC5hZGRFbGVtVHlwZShuLGUpLGQuZW5kU2VxdWVuY2VUeXBlKG4pfX1mLlNlcXVlbmNlVHlwZT1kfSkocC5mYnN8fChwLmZicz17fSkpfSkoYS5leHBlcmltZW50YWx8fChhLmV4cGVyaW1lbnRhbD17fSkpfSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihwKXsocC5mYnN8fChwLmZicz17fSkpLkVkZ2VFbmQ9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQoZixkKXtyZXR1cm4gdGhpcy5iYl9wb3M9Zix0aGlzLmJiPWQsdGhpc31ub2RlSW5kZXgoKXtyZXR1cm4gdGhpcy5iYi5yZWFkVWludDMyKHRoaXMuYmJfcG9zKX1zcmNBcmdJbmRleCgpe3JldHVybiB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3Bvcys0KX1kc3RBcmdJbmRleCgpe3JldHVybiB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3Bvcys4KX1zdGF0aWMgY3JlYXRlRWRnZUVuZChmLGQsbCxuKXtyZXR1cm4gZi5wcmVwKDQsMTIpLGYud3JpdGVJbnQzMihuKSxmLndyaXRlSW50MzIobCksZi53cml0ZUludDMyKGQpLGYub2Zmc2V0KCl9fX0pKGEuZXhwZXJpbWVudGFsfHwoYS5leHBlcmltZW50YWw9e30pKX0odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihhKXsoZnVuY3Rpb24ocCl7KGZ1bmN0aW9uKGYpe2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQobixlKXtyZXR1cm4gdGhpcy5iYl9wb3M9bix0aGlzLmJiPWUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTm9kZUVkZ2UobixlKXtyZXR1cm4oZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTm9kZUVkZ2UobixlKXtyZXR1cm4gbi5zZXRQb3NpdGlvbihuLnBvc2l0aW9uKCkrby5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLChlfHxuZXcgZCkuX19pbml0KG4ucmVhZEludDMyKG4ucG9zaXRpb24oKSkrbi5wb3NpdGlvbigpLG4pfW5vZGVJbmRleCgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIG4/dGhpcy5iYi5yZWFkVWludDMyKHRoaXMuYmJfcG9zK24pOjB9aW5wdXRFZGdlcyhuLGUpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGk/KGV8fG5ldyBhLmV4cGVyaW1lbnRhbC5mYnMuRWRnZUVuZCkuX19pbml0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MraSkrMTIqbix0aGlzLmJiKTpudWxsfWlucHV0RWRnZXNMZW5ndGgoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBuP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK24pOjB9b3V0cHV0RWRnZXMobixlKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBpPyhlfHxuZXcgYS5leHBlcmltZW50YWwuZmJzLkVkZ2VFbmQpLl9faW5pdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2kpKzEyKm4sdGhpcy5iYik6bnVsbH1vdXRwdXRFZGdlc0xlbmd0aCgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIG4/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3Mrbik6MH1zdGF0aWMgc3RhcnROb2RlRWRnZShuKXtuLnN0YXJ0T2JqZWN0KDMpfXN0YXRpYyBhZGROb2RlSW5kZXgobixlKXtuLmFkZEZpZWxkSW50MzIoMCxlLDApfXN0YXRpYyBhZGRJbnB1dEVkZ2VzKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgxLGUsMCl9c3RhdGljIHN0YXJ0SW5wdXRFZGdlc1ZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoMTIsZSw0KX1zdGF0aWMgYWRkT3V0cHV0RWRnZXMobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDIsZSwwKX1zdGF0aWMgc3RhcnRPdXRwdXRFZGdlc1ZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoMTIsZSw0KX1zdGF0aWMgZW5kTm9kZUVkZ2Uobil7cmV0dXJuIG4uZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZU5vZGVFZGdlKG4sZSxpLHMpe3JldHVybiBkLnN0YXJ0Tm9kZUVkZ2UobiksZC5hZGROb2RlSW5kZXgobixlKSxkLmFkZElucHV0RWRnZXMobixpKSxkLmFkZE91dHB1dEVkZ2VzKG4scyksZC5lbmROb2RlRWRnZShuKX19Zi5Ob2RlRWRnZT1kfSkocC5mYnN8fChwLmZicz17fSkpfSkoYS5leHBlcmltZW50YWx8fChhLmV4cGVyaW1lbnRhbD17fSkpfSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihwKXsoZnVuY3Rpb24oZil7Y2xhc3MgZHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdChuLGUpe3JldHVybiB0aGlzLmJiX3Bvcz1uLHRoaXMuYmI9ZSx0aGlzfXN0YXRpYyBnZXRSb290QXNOb2RlKG4sZSl7cmV0dXJuKGV8fG5ldyBkKS5fX2luaXQobi5yZWFkSW50MzIobi5wb3NpdGlvbigpKStuLnBvc2l0aW9uKCksbil9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc05vZGUobixlKXtyZXR1cm4gbi5zZXRQb3NpdGlvbihuLnBvc2l0aW9uKCkrby5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLChlfHxuZXcgZCkuX19pbml0KG4ucmVhZEludDMyKG4ucG9zaXRpb24oKSkrbi5wb3NpdGlvbigpLG4pfW5hbWUobil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK2Usbik6bnVsbH1kb2NTdHJpbmcobil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK2Usbik6bnVsbH1kb21haW4obil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gZT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK2Usbik6bnVsbH1zaW5jZVZlcnNpb24oKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEwKTtyZXR1cm4gbj90aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcytuKTowfWluZGV4KCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIG4/dGhpcy5iYi5yZWFkVWludDMyKHRoaXMuYmJfcG9zK24pOjB9b3BUeXBlKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTQpO3JldHVybiBlP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrZSxuKTpudWxsfXR5cGUoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE2KTtyZXR1cm4gbj90aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcytuKTphLmV4cGVyaW1lbnRhbC5mYnMuTm9kZVR5cGUuUHJpbWl0aXZlfWV4ZWN1dGlvblByb3ZpZGVyVHlwZShuKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE4KTtyZXR1cm4gZT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK2Usbik6bnVsbH1pbnB1dHMobixlKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIwKTtyZXR1cm4gaT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MraSkrNCpuLGUpOm51bGx9aW5wdXRzTGVuZ3RoKCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIG4/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3Mrbik6MH1vdXRwdXRzKG4sZSl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMik7cmV0dXJuIGk/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2kpKzQqbixlKTpudWxsfW91dHB1dHNMZW5ndGgoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIyKTtyZXR1cm4gbj90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytuKTowfWF0dHJpYnV0ZXMobixlKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI0KTtyZXR1cm4gaT8oZXx8bmV3IGEuZXhwZXJpbWVudGFsLmZicy5BdHRyaWJ1dGUpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytpKSs0Km4pLHRoaXMuYmIpOm51bGx9YXR0cmlidXRlc0xlbmd0aCgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjQpO3JldHVybiBuP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK24pOjB9aW5wdXRBcmdDb3VudHMobil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNik7cmV0dXJuIGU/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytlKSs0Km4pOjB9aW5wdXRBcmdDb3VudHNMZW5ndGgoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI2KTtyZXR1cm4gbj90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytuKTowfWlucHV0QXJnQ291bnRzQXJyYXkoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI2KTtyZXR1cm4gbj9uZXcgSW50MzJBcnJheSh0aGlzLmJiLmJ5dGVzKCkuYnVmZmVyLHRoaXMuYmIuYnl0ZXMoKS5ieXRlT2Zmc2V0K3RoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbiksdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrbikpOm51bGx9aW1wbGljaXRJbnB1dHMobixlKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI4KTtyZXR1cm4gaT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MraSkrNCpuLGUpOm51bGx9aW1wbGljaXRJbnB1dHNMZW5ndGgoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI4KTtyZXR1cm4gbj90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytuKTowfXN0YXRpYyBzdGFydE5vZGUobil7bi5zdGFydE9iamVjdCgxMyl9c3RhdGljIGFkZE5hbWUobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDAsZSwwKX1zdGF0aWMgYWRkRG9jU3RyaW5nKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgxLGUsMCl9c3RhdGljIGFkZERvbWFpbihuLGUpe24uYWRkRmllbGRPZmZzZXQoMixlLDApfXN0YXRpYyBhZGRTaW5jZVZlcnNpb24obixlKXtuLmFkZEZpZWxkSW50MzIoMyxlLDApfXN0YXRpYyBhZGRJbmRleChuLGUpe24uYWRkRmllbGRJbnQzMig0LGUsMCl9c3RhdGljIGFkZE9wVHlwZShuLGUpe24uYWRkRmllbGRPZmZzZXQoNSxlLDApfXN0YXRpYyBhZGRUeXBlKG4sZSl7bi5hZGRGaWVsZEludDMyKDYsZSxhLmV4cGVyaW1lbnRhbC5mYnMuTm9kZVR5cGUuUHJpbWl0aXZlKX1zdGF0aWMgYWRkRXhlY3V0aW9uUHJvdmlkZXJUeXBlKG4sZSl7bi5hZGRGaWVsZE9mZnNldCg3LGUsMCl9c3RhdGljIGFkZElucHV0cyhuLGUpe24uYWRkRmllbGRPZmZzZXQoOCxlLDApfXN0YXRpYyBjcmVhdGVJbnB1dHNWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDQsZS5sZW5ndGgsNCk7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49MDtpLS0pbi5hZGRPZmZzZXQoZVtpXSk7cmV0dXJuIG4uZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0SW5wdXRzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUsNCl9c3RhdGljIGFkZE91dHB1dHMobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDksZSwwKX1zdGF0aWMgY3JlYXRlT3V0cHV0c1ZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoNCxlLmxlbmd0aCw0KTtmb3IobGV0IGk9ZS5sZW5ndGgtMTtpPj0wO2ktLSluLmFkZE9mZnNldChlW2ldKTtyZXR1cm4gbi5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRPdXRwdXRzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUsNCl9c3RhdGljIGFkZEF0dHJpYnV0ZXMobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDEwLGUsMCl9c3RhdGljIGNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDQsZS5sZW5ndGgsNCk7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49MDtpLS0pbi5hZGRPZmZzZXQoZVtpXSk7cmV0dXJuIG4uZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0QXR0cmlidXRlc1ZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoNCxlLDQpfXN0YXRpYyBhZGRJbnB1dEFyZ0NvdW50cyhuLGUpe24uYWRkRmllbGRPZmZzZXQoMTEsZSwwKX1zdGF0aWMgY3JlYXRlSW5wdXRBcmdDb3VudHNWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDQsZS5sZW5ndGgsNCk7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49MDtpLS0pbi5hZGRJbnQzMihlW2ldKTtyZXR1cm4gbi5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRJbnB1dEFyZ0NvdW50c1ZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoNCxlLDQpfXN0YXRpYyBhZGRJbXBsaWNpdElucHV0cyhuLGUpe24uYWRkRmllbGRPZmZzZXQoMTIsZSwwKX1zdGF0aWMgY3JlYXRlSW1wbGljaXRJbnB1dHNWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDQsZS5sZW5ndGgsNCk7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49MDtpLS0pbi5hZGRPZmZzZXQoZVtpXSk7cmV0dXJuIG4uZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0SW1wbGljaXRJbnB1dHNWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDQsZSw0KX1zdGF0aWMgZW5kTm9kZShuKXtyZXR1cm4gbi5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlTm9kZShuLGUsaSxzLG0sZyxfLGIseSxULHcseCxFLFApe3JldHVybiBkLnN0YXJ0Tm9kZShuKSxkLmFkZE5hbWUobixlKSxkLmFkZERvY1N0cmluZyhuLGkpLGQuYWRkRG9tYWluKG4scyksZC5hZGRTaW5jZVZlcnNpb24obixtKSxkLmFkZEluZGV4KG4sZyksZC5hZGRPcFR5cGUobixfKSxkLmFkZFR5cGUobixiKSxkLmFkZEV4ZWN1dGlvblByb3ZpZGVyVHlwZShuLHkpLGQuYWRkSW5wdXRzKG4sVCksZC5hZGRPdXRwdXRzKG4sdyksZC5hZGRBdHRyaWJ1dGVzKG4seCksZC5hZGRJbnB1dEFyZ0NvdW50cyhuLEUpLGQuYWRkSW1wbGljaXRJbnB1dHMobixQKSxkLmVuZE5vZGUobil9fWYuTm9kZT1kfSkocC5mYnN8fChwLmZicz17fSkpfSkoYS5leHBlcmltZW50YWx8fChhLmV4cGVyaW1lbnRhbD17fSkpfSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihwKXsoZnVuY3Rpb24oZil7Y2xhc3MgZHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdChuLGUpe3JldHVybiB0aGlzLmJiX3Bvcz1uLHRoaXMuYmI9ZSx0aGlzfXN0YXRpYyBnZXRSb290QXNWYWx1ZUluZm8obixlKXtyZXR1cm4oZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVmFsdWVJbmZvKG4sZSl7cmV0dXJuIG4uc2V0UG9zaXRpb24obi5wb3NpdGlvbigpK28uZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwoZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1uYW1lKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcytlLG4pOm51bGx9ZG9jU3RyaW5nKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcytlLG4pOm51bGx9dHlwZShuKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBlPyhufHxuZXcgYS5leHBlcmltZW50YWwuZmJzLlR5cGVJbmZvKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0VmFsdWVJbmZvKG4pe24uc3RhcnRPYmplY3QoMyl9c3RhdGljIGFkZE5hbWUobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDAsZSwwKX1zdGF0aWMgYWRkRG9jU3RyaW5nKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgxLGUsMCl9c3RhdGljIGFkZFR5cGUobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDIsZSwwKX1zdGF0aWMgZW5kVmFsdWVJbmZvKG4pe3JldHVybiBuLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVWYWx1ZUluZm8obixlLGkscyl7cmV0dXJuIGQuc3RhcnRWYWx1ZUluZm8obiksZC5hZGROYW1lKG4sZSksZC5hZGREb2NTdHJpbmcobixpKSxkLmFkZFR5cGUobixzKSxkLmVuZFZhbHVlSW5mbyhuKX19Zi5WYWx1ZUluZm89ZH0pKHAuZmJzfHwocC5mYnM9e30pKX0pKGEuZXhwZXJpbWVudGFsfHwoYS5leHBlcmltZW50YWw9e30pKX0odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihhKXsoZnVuY3Rpb24ocCl7KGZ1bmN0aW9uKGYpe2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQobixlKXtyZXR1cm4gdGhpcy5iYl9wb3M9bix0aGlzLmJiPWUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzVHlwZUluZm8obixlKXtyZXR1cm4oZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVHlwZUluZm8obixlKXtyZXR1cm4gbi5zZXRQb3NpdGlvbihuLnBvc2l0aW9uKCkrby5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLChlfHxuZXcgZCkuX19pbml0KG4ucmVhZEludDMyKG4ucG9zaXRpb24oKSkrbi5wb3NpdGlvbigpLG4pfWRlbm90YXRpb24obil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK2Usbik6bnVsbH12YWx1ZVR5cGUoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBuP3RoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmJfcG9zK24pOmEuZXhwZXJpbWVudGFsLmZicy5UeXBlSW5mb1ZhbHVlLk5PTkV9dmFsdWUobil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gZT90aGlzLmJiLl9fdW5pb24obix0aGlzLmJiX3BvcytlKTpudWxsfXN0YXRpYyBzdGFydFR5cGVJbmZvKG4pe24uc3RhcnRPYmplY3QoMyl9c3RhdGljIGFkZERlbm90YXRpb24obixlKXtuLmFkZEZpZWxkT2Zmc2V0KDAsZSwwKX1zdGF0aWMgYWRkVmFsdWVUeXBlKG4sZSl7bi5hZGRGaWVsZEludDgoMSxlLGEuZXhwZXJpbWVudGFsLmZicy5UeXBlSW5mb1ZhbHVlLk5PTkUpfXN0YXRpYyBhZGRWYWx1ZShuLGUpe24uYWRkRmllbGRPZmZzZXQoMixlLDApfXN0YXRpYyBlbmRUeXBlSW5mbyhuKXtyZXR1cm4gbi5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlVHlwZUluZm8obixlLGkscyl7cmV0dXJuIGQuc3RhcnRUeXBlSW5mbyhuKSxkLmFkZERlbm90YXRpb24obixlKSxkLmFkZFZhbHVlVHlwZShuLGkpLGQuYWRkVmFsdWUobixzKSxkLmVuZFR5cGVJbmZvKG4pfX1mLlR5cGVJbmZvPWR9KShwLmZic3x8KHAuZmJzPXt9KSl9KShhLmV4cGVyaW1lbnRhbHx8KGEuZXhwZXJpbWVudGFsPXt9KSl9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKHApeyhmdW5jdGlvbihmKXtjbGFzcyBke2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KG4sZSl7cmV0dXJuIHRoaXMuYmJfcG9zPW4sdGhpcy5iYj1lLHRoaXN9c3RhdGljIGdldFJvb3RBc09wZXJhdG9yU2V0SWQobixlKXtyZXR1cm4oZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzT3BlcmF0b3JTZXRJZChuLGUpe3JldHVybiBuLnNldFBvc2l0aW9uKG4ucG9zaXRpb24oKStvLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKGV8fG5ldyBkKS5fX2luaXQobi5yZWFkSW50MzIobi5wb3NpdGlvbigpKStuLnBvc2l0aW9uKCksbil9ZG9tYWluKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcytlLG4pOm51bGx9dmVyc2lvbigpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIG4/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3Mrbik6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9c3RhdGljIHN0YXJ0T3BlcmF0b3JTZXRJZChuKXtuLnN0YXJ0T2JqZWN0KDIpfXN0YXRpYyBhZGREb21haW4obixlKXtuLmFkZEZpZWxkT2Zmc2V0KDAsZSwwKX1zdGF0aWMgYWRkVmVyc2lvbihuLGUpe24uYWRkRmllbGRJbnQ2NCgxLGUsbi5jcmVhdGVMb25nKDAsMCkpfXN0YXRpYyBlbmRPcGVyYXRvclNldElkKG4pe3JldHVybiBuLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVPcGVyYXRvclNldElkKG4sZSxpKXtyZXR1cm4gZC5zdGFydE9wZXJhdG9yU2V0SWQobiksZC5hZGREb21haW4obixlKSxkLmFkZFZlcnNpb24obixpKSxkLmVuZE9wZXJhdG9yU2V0SWQobil9fWYuT3BlcmF0b3JTZXRJZD1kfSkocC5mYnN8fChwLmZicz17fSkpfSkoYS5leHBlcmltZW50YWx8fChhLmV4cGVyaW1lbnRhbD17fSkpfSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihwKXsoZnVuY3Rpb24oZil7Y2xhc3MgZHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdChuLGUpe3JldHVybiB0aGlzLmJiX3Bvcz1uLHRoaXMuYmI9ZSx0aGlzfXN0YXRpYyBnZXRSb290QXNUZW5zb3IobixlKXtyZXR1cm4oZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVGVuc29yKG4sZSl7cmV0dXJuIG4uc2V0UG9zaXRpb24obi5wb3NpdGlvbigpK28uZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwoZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1uYW1lKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcytlLG4pOm51bGx9ZG9jU3RyaW5nKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcytlLG4pOm51bGx9ZGltcyhuKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBlP3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrZSkrOCpuKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1kaW1zTGVuZ3RoKCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gbj90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytuKTowfWRhdGFUeXBlKCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuIG4/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3Mrbik6YS5leHBlcmltZW50YWwuZmJzLlRlbnNvckRhdGFUeXBlLlVOREVGSU5FRH1yYXdEYXRhKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiBlP3RoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrZSkrbik6MH1yYXdEYXRhTGVuZ3RoKCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIG4/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3Mrbik6MH1yYXdEYXRhQXJyYXkoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gbj9uZXcgVWludDhBcnJheSh0aGlzLmJiLmJ5dGVzKCkuYnVmZmVyLHRoaXMuYmIuYnl0ZXMoKS5ieXRlT2Zmc2V0K3RoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbiksdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrbikpOm51bGx9c3RyaW5nRGF0YShuLGUpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTQpO3JldHVybiBpP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytpKSs0Km4sZSk6bnVsbH1zdHJpbmdEYXRhTGVuZ3RoKCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIG4/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3Mrbik6MH1zdGF0aWMgc3RhcnRUZW5zb3Iobil7bi5zdGFydE9iamVjdCg2KX1zdGF0aWMgYWRkTmFtZShuLGUpe24uYWRkRmllbGRPZmZzZXQoMCxlLDApfXN0YXRpYyBhZGREb2NTdHJpbmcobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDEsZSwwKX1zdGF0aWMgYWRkRGltcyhuLGUpe24uYWRkRmllbGRPZmZzZXQoMixlLDApfXN0YXRpYyBjcmVhdGVEaW1zVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig4LGUubGVuZ3RoLDgpO2ZvcihsZXQgaT1lLmxlbmd0aC0xO2k+PTA7aS0tKW4uYWRkSW50NjQoZVtpXSk7cmV0dXJuIG4uZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0RGltc1ZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoOCxlLDgpfXN0YXRpYyBhZGREYXRhVHlwZShuLGUpe24uYWRkRmllbGRJbnQzMigzLGUsYS5leHBlcmltZW50YWwuZmJzLlRlbnNvckRhdGFUeXBlLlVOREVGSU5FRCl9c3RhdGljIGFkZFJhd0RhdGEobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDQsZSwwKX1zdGF0aWMgY3JlYXRlUmF3RGF0YVZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoMSxlLmxlbmd0aCwxKTtmb3IobGV0IGk9ZS5sZW5ndGgtMTtpPj0wO2ktLSluLmFkZEludDgoZVtpXSk7cmV0dXJuIG4uZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0UmF3RGF0YVZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoMSxlLDEpfXN0YXRpYyBhZGRTdHJpbmdEYXRhKG4sZSl7bi5hZGRGaWVsZE9mZnNldCg1LGUsMCl9c3RhdGljIGNyZWF0ZVN0cmluZ0RhdGFWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDQsZS5sZW5ndGgsNCk7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49MDtpLS0pbi5hZGRPZmZzZXQoZVtpXSk7cmV0dXJuIG4uZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0U3RyaW5nRGF0YVZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoNCxlLDQpfXN0YXRpYyBlbmRUZW5zb3Iobil7cmV0dXJuIG4uZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZVRlbnNvcihuLGUsaSxzLG0sZyxfKXtyZXR1cm4gZC5zdGFydFRlbnNvcihuKSxkLmFkZE5hbWUobixlKSxkLmFkZERvY1N0cmluZyhuLGkpLGQuYWRkRGltcyhuLHMpLGQuYWRkRGF0YVR5cGUobixtKSxkLmFkZFJhd0RhdGEobixnKSxkLmFkZFN0cmluZ0RhdGEobixfKSxkLmVuZFRlbnNvcihuKX19Zi5UZW5zb3I9ZH0pKHAuZmJzfHwocC5mYnM9e30pKX0pKGEuZXhwZXJpbWVudGFsfHwoYS5leHBlcmltZW50YWw9e30pKX0odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihhKXsoZnVuY3Rpb24ocCl7KGZ1bmN0aW9uKGYpe2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQobixlKXtyZXR1cm4gdGhpcy5iYl9wb3M9bix0aGlzLmJiPWUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzU3BhcnNlVGVuc29yKG4sZSl7cmV0dXJuKGV8fG5ldyBkKS5fX2luaXQobi5yZWFkSW50MzIobi5wb3NpdGlvbigpKStuLnBvc2l0aW9uKCksbil9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NwYXJzZVRlbnNvcihuLGUpe3JldHVybiBuLnNldFBvc2l0aW9uKG4ucG9zaXRpb24oKStvLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKGV8fG5ldyBkKS5fX2luaXQobi5yZWFkSW50MzIobi5wb3NpdGlvbigpKStuLnBvc2l0aW9uKCksbil9dmFsdWVzKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGU/KG58fG5ldyBhLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIpOm51bGx9aW5kaWNlcyhuKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBlPyhufHxuZXcgYS5leHBlcmltZW50YWwuZmJzLlRlbnNvcikuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytlKSx0aGlzLmJiKTpudWxsfWRpbXMobil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gZT90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2UpKzgqbik6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9ZGltc0xlbmd0aCgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIG4/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3Mrbik6MH1zdGF0aWMgc3RhcnRTcGFyc2VUZW5zb3Iobil7bi5zdGFydE9iamVjdCgzKX1zdGF0aWMgYWRkVmFsdWVzKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgwLGUsMCl9c3RhdGljIGFkZEluZGljZXMobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDEsZSwwKX1zdGF0aWMgYWRkRGltcyhuLGUpe24uYWRkRmllbGRPZmZzZXQoMixlLDApfXN0YXRpYyBjcmVhdGVEaW1zVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig4LGUubGVuZ3RoLDgpO2ZvcihsZXQgaT1lLmxlbmd0aC0xO2k+PTA7aS0tKW4uYWRkSW50NjQoZVtpXSk7cmV0dXJuIG4uZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0RGltc1ZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoOCxlLDgpfXN0YXRpYyBlbmRTcGFyc2VUZW5zb3Iobil7cmV0dXJuIG4uZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZVNwYXJzZVRlbnNvcihuLGUsaSxzKXtyZXR1cm4gZC5zdGFydFNwYXJzZVRlbnNvcihuKSxkLmFkZFZhbHVlcyhuLGUpLGQuYWRkSW5kaWNlcyhuLGkpLGQuYWRkRGltcyhuLHMpLGQuZW5kU3BhcnNlVGVuc29yKG4pfX1mLlNwYXJzZVRlbnNvcj1kfSkocC5mYnN8fChwLmZicz17fSkpfSkoYS5leHBlcmltZW50YWx8fChhLmV4cGVyaW1lbnRhbD17fSkpfSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihwKXsoZnVuY3Rpb24oZil7Y2xhc3MgZHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdChuLGUpe3JldHVybiB0aGlzLmJiX3Bvcz1uLHRoaXMuYmI9ZSx0aGlzfXN0YXRpYyBnZXRSb290QXNBdHRyaWJ1dGUobixlKXtyZXR1cm4oZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzQXR0cmlidXRlKG4sZSl7cmV0dXJuIG4uc2V0UG9zaXRpb24obi5wb3NpdGlvbigpK28uZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwoZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1uYW1lKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcytlLG4pOm51bGx9ZG9jU3RyaW5nKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcytlLG4pOm51bGx9dHlwZSgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIG4/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3Mrbik6YS5leHBlcmltZW50YWwuZmJzLkF0dHJpYnV0ZVR5cGUuVU5ERUZJTkVEfWYoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEwKTtyZXR1cm4gbj90aGlzLmJiLnJlYWRGbG9hdDMyKHRoaXMuYmJfcG9zK24pOjB9aSgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiBuP3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zK24pOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfXMobil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcytlLG4pOm51bGx9dChuKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE2KTtyZXR1cm4gZT8obnx8bmV3IGEuZXhwZXJpbWVudGFsLmZicy5UZW5zb3IpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrZSksdGhpcy5iYik6bnVsbH1nKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTgpO3JldHVybiBlPyhufHxuZXcgYS5leHBlcmltZW50YWwuZmJzLkdyYXBoKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIpOm51bGx9ZmxvYXRzKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjApO3JldHVybiBlP3RoaXMuYmIucmVhZEZsb2F0MzIodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytlKSs0Km4pOjB9ZmxvYXRzTGVuZ3RoKCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIG4/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3Mrbik6MH1mbG9hdHNBcnJheSgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjApO3JldHVybiBuP25ldyBGbG9hdDMyQXJyYXkodGhpcy5iYi5ieXRlcygpLmJ1ZmZlcix0aGlzLmJiLmJ5dGVzKCkuYnl0ZU9mZnNldCt0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK24pLHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK24pKTpudWxsfWludHMobil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMik7cmV0dXJuIGU/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytlKSs4Km4pOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfWludHNMZW5ndGgoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIyKTtyZXR1cm4gbj90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytuKTowfXN0cmluZ3MobixlKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI0KTtyZXR1cm4gaT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MraSkrNCpuLGUpOm51bGx9c3RyaW5nc0xlbmd0aCgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjQpO3JldHVybiBuP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK24pOjB9dGVuc29ycyhuLGUpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjYpO3JldHVybiBpPyhlfHxuZXcgYS5leHBlcmltZW50YWwuZmJzLlRlbnNvcikuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2kpKzQqbiksdGhpcy5iYik6bnVsbH10ZW5zb3JzTGVuZ3RoKCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNik7cmV0dXJuIG4/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3Mrbik6MH1ncmFwaHMobixlKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI4KTtyZXR1cm4gaT8oZXx8bmV3IGEuZXhwZXJpbWVudGFsLmZicy5HcmFwaCkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2kpKzQqbiksdGhpcy5iYik6bnVsbH1ncmFwaHNMZW5ndGgoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI4KTtyZXR1cm4gbj90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytuKTowfXN0YXRpYyBzdGFydEF0dHJpYnV0ZShuKXtuLnN0YXJ0T2JqZWN0KDEzKX1zdGF0aWMgYWRkTmFtZShuLGUpe24uYWRkRmllbGRPZmZzZXQoMCxlLDApfXN0YXRpYyBhZGREb2NTdHJpbmcobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDEsZSwwKX1zdGF0aWMgYWRkVHlwZShuLGUpe24uYWRkRmllbGRJbnQzMigyLGUsYS5leHBlcmltZW50YWwuZmJzLkF0dHJpYnV0ZVR5cGUuVU5ERUZJTkVEKX1zdGF0aWMgYWRkRihuLGUpe24uYWRkRmllbGRGbG9hdDMyKDMsZSwwKX1zdGF0aWMgYWRkSShuLGUpe24uYWRkRmllbGRJbnQ2NCg0LGUsbi5jcmVhdGVMb25nKDAsMCkpfXN0YXRpYyBhZGRTKG4sZSl7bi5hZGRGaWVsZE9mZnNldCg1LGUsMCl9c3RhdGljIGFkZFQobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDYsZSwwKX1zdGF0aWMgYWRkRyhuLGUpe24uYWRkRmllbGRPZmZzZXQoNyxlLDApfXN0YXRpYyBhZGRGbG9hdHMobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDgsZSwwKX1zdGF0aWMgY3JlYXRlRmxvYXRzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUubGVuZ3RoLDQpO2ZvcihsZXQgaT1lLmxlbmd0aC0xO2k+PTA7aS0tKW4uYWRkRmxvYXQzMihlW2ldKTtyZXR1cm4gbi5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRGbG9hdHNWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDQsZSw0KX1zdGF0aWMgYWRkSW50cyhuLGUpe24uYWRkRmllbGRPZmZzZXQoOSxlLDApfXN0YXRpYyBjcmVhdGVJbnRzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig4LGUubGVuZ3RoLDgpO2ZvcihsZXQgaT1lLmxlbmd0aC0xO2k+PTA7aS0tKW4uYWRkSW50NjQoZVtpXSk7cmV0dXJuIG4uZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0SW50c1ZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoOCxlLDgpfXN0YXRpYyBhZGRTdHJpbmdzKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgxMCxlLDApfXN0YXRpYyBjcmVhdGVTdHJpbmdzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUubGVuZ3RoLDQpO2ZvcihsZXQgaT1lLmxlbmd0aC0xO2k+PTA7aS0tKW4uYWRkT2Zmc2V0KGVbaV0pO3JldHVybiBuLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFN0cmluZ3NWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDQsZSw0KX1zdGF0aWMgYWRkVGVuc29ycyhuLGUpe24uYWRkRmllbGRPZmZzZXQoMTEsZSwwKX1zdGF0aWMgY3JlYXRlVGVuc29yc1ZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoNCxlLmxlbmd0aCw0KTtmb3IobGV0IGk9ZS5sZW5ndGgtMTtpPj0wO2ktLSluLmFkZE9mZnNldChlW2ldKTtyZXR1cm4gbi5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRUZW5zb3JzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUsNCl9c3RhdGljIGFkZEdyYXBocyhuLGUpe24uYWRkRmllbGRPZmZzZXQoMTIsZSwwKX1zdGF0aWMgY3JlYXRlR3JhcGhzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUubGVuZ3RoLDQpO2ZvcihsZXQgaT1lLmxlbmd0aC0xO2k+PTA7aS0tKW4uYWRkT2Zmc2V0KGVbaV0pO3JldHVybiBuLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEdyYXBoc1ZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoNCxlLDQpfXN0YXRpYyBlbmRBdHRyaWJ1dGUobil7cmV0dXJuIG4uZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZUF0dHJpYnV0ZShuLGUsaSxzLG0sZyxfLGIseSxULHcseCxFLFApe3JldHVybiBkLnN0YXJ0QXR0cmlidXRlKG4pLGQuYWRkTmFtZShuLGUpLGQuYWRkRG9jU3RyaW5nKG4saSksZC5hZGRUeXBlKG4scyksZC5hZGRGKG4sbSksZC5hZGRJKG4sZyksZC5hZGRTKG4sXyksZC5hZGRUKG4sYiksZC5hZGRHKG4seSksZC5hZGRGbG9hdHMobixUKSxkLmFkZEludHMobix3KSxkLmFkZFN0cmluZ3Mobix4KSxkLmFkZFRlbnNvcnMobixFKSxkLmFkZEdyYXBocyhuLFApLGQuZW5kQXR0cmlidXRlKG4pfX1mLkF0dHJpYnV0ZT1kfSkocC5mYnN8fChwLmZicz17fSkpfSkoYS5leHBlcmltZW50YWx8fChhLmV4cGVyaW1lbnRhbD17fSkpfSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihwKXsoZnVuY3Rpb24oZil7Y2xhc3MgZHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdChuLGUpe3JldHVybiB0aGlzLmJiX3Bvcz1uLHRoaXMuYmI9ZSx0aGlzfXN0YXRpYyBnZXRSb290QXNHcmFwaChuLGUpe3JldHVybihlfHxuZXcgZCkuX19pbml0KG4ucmVhZEludDMyKG4ucG9zaXRpb24oKSkrbi5wb3NpdGlvbigpLG4pfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNHcmFwaChuLGUpe3JldHVybiBuLnNldFBvc2l0aW9uKG4ucG9zaXRpb24oKStvLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKGV8fG5ldyBkKS5fX2luaXQobi5yZWFkSW50MzIobi5wb3NpdGlvbigpKStuLnBvc2l0aW9uKCksbil9aW5pdGlhbGl6ZXJzKG4sZSl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gaT8oZXx8bmV3IGEuZXhwZXJpbWVudGFsLmZicy5UZW5zb3IpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytpKSs0Km4pLHRoaXMuYmIpOm51bGx9aW5pdGlhbGl6ZXJzTGVuZ3RoKCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gbj90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytuKTowfW5vZGVBcmdzKG4sZSl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gaT8oZXx8bmV3IGEuZXhwZXJpbWVudGFsLmZicy5WYWx1ZUluZm8pLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytpKSs0Km4pLHRoaXMuYmIpOm51bGx9bm9kZUFyZ3NMZW5ndGgoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBuP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK24pOjB9bm9kZXMobixlKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBpPyhlfHxuZXcgYS5leHBlcmltZW50YWwuZmJzLk5vZGUpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytpKSs0Km4pLHRoaXMuYmIpOm51bGx9bm9kZXNMZW5ndGgoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBuP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK24pOjB9bWF4Tm9kZUluZGV4KCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuIG4/dGhpcy5iYi5yZWFkVWludDMyKHRoaXMuYmJfcG9zK24pOjB9bm9kZUVkZ2VzKG4sZSl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIGk/KGV8fG5ldyBhLmV4cGVyaW1lbnRhbC5mYnMuTm9kZUVkZ2UpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytpKSs0Km4pLHRoaXMuYmIpOm51bGx9bm9kZUVkZ2VzTGVuZ3RoKCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIG4/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3Mrbik6MH1pbnB1dHMobixlKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gaT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MraSkrNCpuLGUpOm51bGx9aW5wdXRzTGVuZ3RoKCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIG4/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3Mrbik6MH1vdXRwdXRzKG4sZSl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNik7cmV0dXJuIGk/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2kpKzQqbixlKTpudWxsfW91dHB1dHNMZW5ndGgoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE2KTtyZXR1cm4gbj90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytuKTowfXNwYXJzZUluaXRpYWxpemVycyhuLGUpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTgpO3JldHVybiBpPyhlfHxuZXcgYS5leHBlcmltZW50YWwuZmJzLlNwYXJzZVRlbnNvcikuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2kpKzQqbiksdGhpcy5iYik6bnVsbH1zcGFyc2VJbml0aWFsaXplcnNMZW5ndGgoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE4KTtyZXR1cm4gbj90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytuKTowfXN0YXRpYyBzdGFydEdyYXBoKG4pe24uc3RhcnRPYmplY3QoOCl9c3RhdGljIGFkZEluaXRpYWxpemVycyhuLGUpe24uYWRkRmllbGRPZmZzZXQoMCxlLDApfXN0YXRpYyBjcmVhdGVJbml0aWFsaXplcnNWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDQsZS5sZW5ndGgsNCk7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49MDtpLS0pbi5hZGRPZmZzZXQoZVtpXSk7cmV0dXJuIG4uZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0SW5pdGlhbGl6ZXJzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUsNCl9c3RhdGljIGFkZE5vZGVBcmdzKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgxLGUsMCl9c3RhdGljIGNyZWF0ZU5vZGVBcmdzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUubGVuZ3RoLDQpO2ZvcihsZXQgaT1lLmxlbmd0aC0xO2k+PTA7aS0tKW4uYWRkT2Zmc2V0KGVbaV0pO3JldHVybiBuLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE5vZGVBcmdzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUsNCl9c3RhdGljIGFkZE5vZGVzKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgyLGUsMCl9c3RhdGljIGNyZWF0ZU5vZGVzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUubGVuZ3RoLDQpO2ZvcihsZXQgaT1lLmxlbmd0aC0xO2k+PTA7aS0tKW4uYWRkT2Zmc2V0KGVbaV0pO3JldHVybiBuLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE5vZGVzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUsNCl9c3RhdGljIGFkZE1heE5vZGVJbmRleChuLGUpe24uYWRkRmllbGRJbnQzMigzLGUsMCl9c3RhdGljIGFkZE5vZGVFZGdlcyhuLGUpe24uYWRkRmllbGRPZmZzZXQoNCxlLDApfXN0YXRpYyBjcmVhdGVOb2RlRWRnZXNWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDQsZS5sZW5ndGgsNCk7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49MDtpLS0pbi5hZGRPZmZzZXQoZVtpXSk7cmV0dXJuIG4uZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0Tm9kZUVkZ2VzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUsNCl9c3RhdGljIGFkZElucHV0cyhuLGUpe24uYWRkRmllbGRPZmZzZXQoNSxlLDApfXN0YXRpYyBjcmVhdGVJbnB1dHNWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDQsZS5sZW5ndGgsNCk7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49MDtpLS0pbi5hZGRPZmZzZXQoZVtpXSk7cmV0dXJuIG4uZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0SW5wdXRzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUsNCl9c3RhdGljIGFkZE91dHB1dHMobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDYsZSwwKX1zdGF0aWMgY3JlYXRlT3V0cHV0c1ZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoNCxlLmxlbmd0aCw0KTtmb3IobGV0IGk9ZS5sZW5ndGgtMTtpPj0wO2ktLSluLmFkZE9mZnNldChlW2ldKTtyZXR1cm4gbi5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRPdXRwdXRzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUsNCl9c3RhdGljIGFkZFNwYXJzZUluaXRpYWxpemVycyhuLGUpe24uYWRkRmllbGRPZmZzZXQoNyxlLDApfXN0YXRpYyBjcmVhdGVTcGFyc2VJbml0aWFsaXplcnNWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDQsZS5sZW5ndGgsNCk7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49MDtpLS0pbi5hZGRPZmZzZXQoZVtpXSk7cmV0dXJuIG4uZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0U3BhcnNlSW5pdGlhbGl6ZXJzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUsNCl9c3RhdGljIGVuZEdyYXBoKG4pe3JldHVybiBuLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVHcmFwaChuLGUsaSxzLG0sZyxfLGIseSl7cmV0dXJuIGQuc3RhcnRHcmFwaChuKSxkLmFkZEluaXRpYWxpemVycyhuLGUpLGQuYWRkTm9kZUFyZ3MobixpKSxkLmFkZE5vZGVzKG4scyksZC5hZGRNYXhOb2RlSW5kZXgobixtKSxkLmFkZE5vZGVFZGdlcyhuLGcpLGQuYWRkSW5wdXRzKG4sXyksZC5hZGRPdXRwdXRzKG4sYiksZC5hZGRTcGFyc2VJbml0aWFsaXplcnMobix5KSxkLmVuZEdyYXBoKG4pfX1mLkdyYXBoPWR9KShwLmZic3x8KHAuZmJzPXt9KSl9KShhLmV4cGVyaW1lbnRhbHx8KGEuZXhwZXJpbWVudGFsPXt9KSl9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKHApeyhmdW5jdGlvbihmKXtjbGFzcyBke2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KG4sZSl7cmV0dXJuIHRoaXMuYmJfcG9zPW4sdGhpcy5iYj1lLHRoaXN9c3RhdGljIGdldFJvb3RBc01vZGVsKG4sZSl7cmV0dXJuKGV8fG5ldyBkKS5fX2luaXQobi5yZWFkSW50MzIobi5wb3NpdGlvbigpKStuLnBvc2l0aW9uKCksbil9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc01vZGVsKG4sZSl7cmV0dXJuIG4uc2V0UG9zaXRpb24obi5wb3NpdGlvbigpK28uZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwoZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1pclZlcnNpb24oKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBuP3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zK24pOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfW9wc2V0SW1wb3J0KG4sZSl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gaT8oZXx8bmV3IGEuZXhwZXJpbWVudGFsLmZicy5PcGVyYXRvclNldElkKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MraSkrNCpuKSx0aGlzLmJiKTpudWxsfW9wc2V0SW1wb3J0TGVuZ3RoKCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gbj90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytuKTowfXByb2R1Y2VyTmFtZShuKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBlP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrZSxuKTpudWxsfXByb2R1Y2VyVmVyc2lvbihuKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEwKTtyZXR1cm4gZT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK2Usbik6bnVsbH1kb21haW4obil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIGU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcytlLG4pOm51bGx9bW9kZWxWZXJzaW9uKCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIG4/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3Mrbik6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9ZG9jU3RyaW5nKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTYpO3JldHVybiBlP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrZSxuKTpudWxsfWdyYXBoKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTgpO3JldHVybiBlPyhufHxuZXcgYS5leHBlcmltZW50YWwuZmJzLkdyYXBoKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIpOm51bGx9Z3JhcGhEb2NTdHJpbmcobil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIGU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcytlLG4pOm51bGx9c3RhdGljIHN0YXJ0TW9kZWwobil7bi5zdGFydE9iamVjdCg5KX1zdGF0aWMgYWRkSXJWZXJzaW9uKG4sZSl7bi5hZGRGaWVsZEludDY0KDAsZSxuLmNyZWF0ZUxvbmcoMCwwKSl9c3RhdGljIGFkZE9wc2V0SW1wb3J0KG4sZSl7bi5hZGRGaWVsZE9mZnNldCgxLGUsMCl9c3RhdGljIGNyZWF0ZU9wc2V0SW1wb3J0VmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUubGVuZ3RoLDQpO2ZvcihsZXQgaT1lLmxlbmd0aC0xO2k+PTA7aS0tKW4uYWRkT2Zmc2V0KGVbaV0pO3JldHVybiBuLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE9wc2V0SW1wb3J0VmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUsNCl9c3RhdGljIGFkZFByb2R1Y2VyTmFtZShuLGUpe24uYWRkRmllbGRPZmZzZXQoMixlLDApfXN0YXRpYyBhZGRQcm9kdWNlclZlcnNpb24obixlKXtuLmFkZEZpZWxkT2Zmc2V0KDMsZSwwKX1zdGF0aWMgYWRkRG9tYWluKG4sZSl7bi5hZGRGaWVsZE9mZnNldCg0LGUsMCl9c3RhdGljIGFkZE1vZGVsVmVyc2lvbihuLGUpe24uYWRkRmllbGRJbnQ2NCg1LGUsbi5jcmVhdGVMb25nKDAsMCkpfXN0YXRpYyBhZGREb2NTdHJpbmcobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDYsZSwwKX1zdGF0aWMgYWRkR3JhcGgobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDcsZSwwKX1zdGF0aWMgYWRkR3JhcGhEb2NTdHJpbmcobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDgsZSwwKX1zdGF0aWMgZW5kTW9kZWwobil7cmV0dXJuIG4uZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZU1vZGVsKG4sZSxpLHMsbSxnLF8sYix5LFQpe3JldHVybiBkLnN0YXJ0TW9kZWwobiksZC5hZGRJclZlcnNpb24obixlKSxkLmFkZE9wc2V0SW1wb3J0KG4saSksZC5hZGRQcm9kdWNlck5hbWUobixzKSxkLmFkZFByb2R1Y2VyVmVyc2lvbihuLG0pLGQuYWRkRG9tYWluKG4sZyksZC5hZGRNb2RlbFZlcnNpb24obixfKSxkLmFkZERvY1N0cmluZyhuLGIpLGQuYWRkR3JhcGgobix5KSxkLmFkZEdyYXBoRG9jU3RyaW5nKG4sVCksZC5lbmRNb2RlbChuKX19Zi5Nb2RlbD1kfSkocC5mYnN8fChwLmZicz17fSkpfSkoYS5leHBlcmltZW50YWx8fChhLmV4cGVyaW1lbnRhbD17fSkpfSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihwKXsoZnVuY3Rpb24oZil7Y2xhc3MgZHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wfV9faW5pdChuLGUpe3JldHVybiB0aGlzLmJiX3Bvcz1uLHRoaXMuYmI9ZSx0aGlzfXN0YXRpYyBnZXRSb290QXNLZXJuZWxDcmVhdGVJbmZvcyhuLGUpe3JldHVybihlfHxuZXcgZCkuX19pbml0KG4ucmVhZEludDMyKG4ucG9zaXRpb24oKSkrbi5wb3NpdGlvbigpLG4pfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNLZXJuZWxDcmVhdGVJbmZvcyhuLGUpe3JldHVybiBuLnNldFBvc2l0aW9uKG4ucG9zaXRpb24oKStvLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKGV8fG5ldyBkKS5fX2luaXQobi5yZWFkSW50MzIobi5wb3NpdGlvbigpKStuLnBvc2l0aW9uKCksbil9bm9kZUluZGljZXMobil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT90aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytlKSs0Km4pOjB9bm9kZUluZGljZXNMZW5ndGgoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBuP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK24pOjB9bm9kZUluZGljZXNBcnJheSgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIG4/bmV3IFVpbnQzMkFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQrdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytuKSx0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytuKSk6bnVsbH1rZXJuZWxEZWZIYXNoZXMobil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLnJlYWRVaW50NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytlKSs4Km4pOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfWtlcm5lbERlZkhhc2hlc0xlbmd0aCgpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIG4/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3Mrbik6MH1zdGF0aWMgc3RhcnRLZXJuZWxDcmVhdGVJbmZvcyhuKXtuLnN0YXJ0T2JqZWN0KDIpfXN0YXRpYyBhZGROb2RlSW5kaWNlcyhuLGUpe24uYWRkRmllbGRPZmZzZXQoMCxlLDApfXN0YXRpYyBjcmVhdGVOb2RlSW5kaWNlc1ZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoNCxlLmxlbmd0aCw0KTtmb3IobGV0IGk9ZS5sZW5ndGgtMTtpPj0wO2ktLSluLmFkZEludDMyKGVbaV0pO3JldHVybiBuLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE5vZGVJbmRpY2VzVmVjdG9yKG4sZSl7bi5zdGFydFZlY3Rvcig0LGUsNCl9c3RhdGljIGFkZEtlcm5lbERlZkhhc2hlcyhuLGUpe24uYWRkRmllbGRPZmZzZXQoMSxlLDApfXN0YXRpYyBjcmVhdGVLZXJuZWxEZWZIYXNoZXNWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDgsZS5sZW5ndGgsOCk7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49MDtpLS0pbi5hZGRJbnQ2NChlW2ldKTtyZXR1cm4gbi5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRLZXJuZWxEZWZIYXNoZXNWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDgsZSw4KX1zdGF0aWMgZW5kS2VybmVsQ3JlYXRlSW5mb3Mobil7cmV0dXJuIG4uZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZUtlcm5lbENyZWF0ZUluZm9zKG4sZSxpKXtyZXR1cm4gZC5zdGFydEtlcm5lbENyZWF0ZUluZm9zKG4pLGQuYWRkTm9kZUluZGljZXMobixlKSxkLmFkZEtlcm5lbERlZkhhc2hlcyhuLGkpLGQuZW5kS2VybmVsQ3JlYXRlSW5mb3Mobil9fWYuS2VybmVsQ3JlYXRlSW5mb3M9ZH0pKHAuZmJzfHwocC5mYnM9e30pKX0pKGEuZXhwZXJpbWVudGFsfHwoYS5leHBlcmltZW50YWw9e30pKX0odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihhKXsoZnVuY3Rpb24ocCl7KGZ1bmN0aW9uKGYpe2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQobixlKXtyZXR1cm4gdGhpcy5iYl9wb3M9bix0aGlzLmJiPWUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzU3ViR3JhcGhTZXNzaW9uU3RhdGUobixlKXtyZXR1cm4oZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU3ViR3JhcGhTZXNzaW9uU3RhdGUobixlKXtyZXR1cm4gbi5zZXRQb3NpdGlvbihuLnBvc2l0aW9uKCkrby5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLChlfHxuZXcgZCkuX19pbml0KG4ucmVhZEludDMyKG4ucG9zaXRpb24oKSkrbi5wb3NpdGlvbigpLG4pfWdyYXBoSWQobil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK2Usbik6bnVsbH1zZXNzaW9uU3RhdGUobil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT8obnx8bmV3IGEuZXhwZXJpbWVudGFsLmZicy5TZXNzaW9uU3RhdGUpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrZSksdGhpcy5iYik6bnVsbH1zdGF0aWMgc3RhcnRTdWJHcmFwaFNlc3Npb25TdGF0ZShuKXtuLnN0YXJ0T2JqZWN0KDIpfXN0YXRpYyBhZGRHcmFwaElkKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgwLGUsMCl9c3RhdGljIGFkZFNlc3Npb25TdGF0ZShuLGUpe24uYWRkRmllbGRPZmZzZXQoMSxlLDApfXN0YXRpYyBlbmRTdWJHcmFwaFNlc3Npb25TdGF0ZShuKXtsZXQgZT1uLmVuZE9iamVjdCgpO3JldHVybiBuLnJlcXVpcmVkRmllbGQoZSw0KSxlfXN0YXRpYyBjcmVhdGVTdWJHcmFwaFNlc3Npb25TdGF0ZShuLGUsaSl7cmV0dXJuIGQuc3RhcnRTdWJHcmFwaFNlc3Npb25TdGF0ZShuKSxkLmFkZEdyYXBoSWQobixlKSxkLmFkZFNlc3Npb25TdGF0ZShuLGkpLGQuZW5kU3ViR3JhcGhTZXNzaW9uU3RhdGUobil9fWYuU3ViR3JhcGhTZXNzaW9uU3RhdGU9ZH0pKHAuZmJzfHwocC5mYnM9e30pKX0pKGEuZXhwZXJpbWVudGFsfHwoYS5leHBlcmltZW50YWw9e30pKX0odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihhKXsoZnVuY3Rpb24ocCl7KGZ1bmN0aW9uKGYpe2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MH1fX2luaXQobixlKXtyZXR1cm4gdGhpcy5iYl9wb3M9bix0aGlzLmJiPWUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzU2Vzc2lvblN0YXRlKG4sZSl7cmV0dXJuKGV8fG5ldyBkKS5fX2luaXQobi5yZWFkSW50MzIobi5wb3NpdGlvbigpKStuLnBvc2l0aW9uKCksbil9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1Nlc3Npb25TdGF0ZShuLGUpe3JldHVybiBuLnNldFBvc2l0aW9uKG4ucG9zaXRpb24oKStvLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKGV8fG5ldyBkKS5fX2luaXQobi5yZWFkSW50MzIobi5wb3NpdGlvbigpKStuLnBvc2l0aW9uKCksbil9a2VybmVscyhuKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBlPyhufHxuZXcgYS5leHBlcmltZW50YWwuZmJzLktlcm5lbENyZWF0ZUluZm9zKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIpOm51bGx9c3ViR3JhcGhTZXNzaW9uU3RhdGVzKG4sZSl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gaT8oZXx8bmV3IGEuZXhwZXJpbWVudGFsLmZicy5TdWJHcmFwaFNlc3Npb25TdGF0ZSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2kpKzQqbiksdGhpcy5iYik6bnVsbH1zdWJHcmFwaFNlc3Npb25TdGF0ZXNMZW5ndGgoKXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBuP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK24pOjB9c3RhdGljIHN0YXJ0U2Vzc2lvblN0YXRlKG4pe24uc3RhcnRPYmplY3QoMil9c3RhdGljIGFkZEtlcm5lbHMobixlKXtuLmFkZEZpZWxkT2Zmc2V0KDAsZSwwKX1zdGF0aWMgYWRkU3ViR3JhcGhTZXNzaW9uU3RhdGVzKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgxLGUsMCl9c3RhdGljIGNyZWF0ZVN1YkdyYXBoU2Vzc2lvblN0YXRlc1ZlY3RvcihuLGUpe24uc3RhcnRWZWN0b3IoNCxlLmxlbmd0aCw0KTtmb3IobGV0IGk9ZS5sZW5ndGgtMTtpPj0wO2ktLSluLmFkZE9mZnNldChlW2ldKTtyZXR1cm4gbi5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRTdWJHcmFwaFNlc3Npb25TdGF0ZXNWZWN0b3IobixlKXtuLnN0YXJ0VmVjdG9yKDQsZSw0KX1zdGF0aWMgZW5kU2Vzc2lvblN0YXRlKG4pe3JldHVybiBuLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVTZXNzaW9uU3RhdGUobixlLGkpe3JldHVybiBkLnN0YXJ0U2Vzc2lvblN0YXRlKG4pLGQuYWRkS2VybmVscyhuLGUpLGQuYWRkU3ViR3JhcGhTZXNzaW9uU3RhdGVzKG4saSksZC5lbmRTZXNzaW9uU3RhdGUobil9fWYuU2Vzc2lvblN0YXRlPWR9KShwLmZic3x8KHAuZmJzPXt9KSl9KShhLmV4cGVyaW1lbnRhbHx8KGEuZXhwZXJpbWVudGFsPXt9KSl9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKHApeyhmdW5jdGlvbihmKXtjbGFzcyBke2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTB9X19pbml0KG4sZSl7cmV0dXJuIHRoaXMuYmJfcG9zPW4sdGhpcy5iYj1lLHRoaXN9c3RhdGljIGdldFJvb3RBc0luZmVyZW5jZVNlc3Npb24obixlKXtyZXR1cm4oZXx8bmV3IGQpLl9faW5pdChuLnJlYWRJbnQzMihuLnBvc2l0aW9uKCkpK24ucG9zaXRpb24oKSxuKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzSW5mZXJlbmNlU2Vzc2lvbihuLGUpe3JldHVybiBuLnNldFBvc2l0aW9uKG4ucG9zaXRpb24oKStvLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKGV8fG5ldyBkKS5fX2luaXQobi5yZWFkSW50MzIobi5wb3NpdGlvbigpKStuLnBvc2l0aW9uKCksbil9c3RhdGljIGJ1ZmZlckhhc0lkZW50aWZpZXIobil7cmV0dXJuIG4uX19oYXNfaWRlbnRpZmllcigiT1JUTSIpfW9ydFZlcnNpb24obil7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK2Usbik6bnVsbH1tb2RlbChuKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBlPyhufHxuZXcgYS5leHBlcmltZW50YWwuZmJzLk1vZGVsKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIpOm51bGx9c2Vzc2lvblN0YXRlKG4pe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIGU/KG58fG5ldyBhLmV4cGVyaW1lbnRhbC5mYnMuU2Vzc2lvblN0YXRlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0SW5mZXJlbmNlU2Vzc2lvbihuKXtuLnN0YXJ0T2JqZWN0KDMpfXN0YXRpYyBhZGRPcnRWZXJzaW9uKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgwLGUsMCl9c3RhdGljIGFkZE1vZGVsKG4sZSl7bi5hZGRGaWVsZE9mZnNldCgxLGUsMCl9c3RhdGljIGFkZFNlc3Npb25TdGF0ZShuLGUpe24uYWRkRmllbGRPZmZzZXQoMixlLDApfXN0YXRpYyBlbmRJbmZlcmVuY2VTZXNzaW9uKG4pe3JldHVybiBuLmVuZE9iamVjdCgpfXN0YXRpYyBmaW5pc2hJbmZlcmVuY2VTZXNzaW9uQnVmZmVyKG4sZSl7bi5maW5pc2goZSwiT1JUTSIpfXN0YXRpYyBmaW5pc2hTaXplUHJlZml4ZWRJbmZlcmVuY2VTZXNzaW9uQnVmZmVyKG4sZSl7bi5maW5pc2goZSwiT1JUTSIsITApfXN0YXRpYyBjcmVhdGVJbmZlcmVuY2VTZXNzaW9uKG4sZSxpLHMpe3JldHVybiBkLnN0YXJ0SW5mZXJlbmNlU2Vzc2lvbihuKSxkLmFkZE9ydFZlcnNpb24obixlKSxkLmFkZE1vZGVsKG4saSksZC5hZGRTZXNzaW9uU3RhdGUobixzKSxkLmVuZEluZmVyZW5jZVNlc3Npb24obil9fWYuSW5mZXJlbmNlU2Vzc2lvbj1kfSkocC5mYnN8fChwLmZicz17fSkpfSkoYS5leHBlcmltZW50YWx8fChhLmV4cGVyaW1lbnRhbD17fSkpfSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpfSw3NDQ4OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Pbm54anNTZXNzaW9uSGFuZGxlcj12b2lkIDA7Y29uc3Qgbz1yKDE2NzApLHU9cig5MTYyKTt0Lk9ubnhqc1Nlc3Npb25IYW5kbGVyPWNsYXNze2NvbnN0cnVjdG9yKGgpe3RoaXMuc2Vzc2lvbj1oLHRoaXMuaW5wdXROYW1lcz10aGlzLnNlc3Npb24uaW5wdXROYW1lcyx0aGlzLm91dHB1dE5hbWVzPXRoaXMuc2Vzc2lvbi5vdXRwdXROYW1lc31hc3luYyBkaXNwb3NlKCl7fWFzeW5jIHJ1bihoLGEscCl7Y29uc3QgZj1uZXcgTWFwO2Zvcihjb25zdCBuIGluIGgpaWYoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoaCxuKSl7Y29uc3QgZT1oW25dO2Yuc2V0KG4sbmV3IHUuVGVuc29yKGUuZGltcyxlLnR5cGUsdm9pZCAwLHZvaWQgMCxlLmRhdGEpKX1jb25zdCBkPWF3YWl0IHRoaXMuc2Vzc2lvbi5ydW4oZiksbD17fTtyZXR1cm4gZC5mb3JFYWNoKChuLGUpPT57bFtlXT1uZXcgby5UZW5zb3Iobi50eXBlLG4uZGF0YSxuLmRpbXMpfSksbH1zdGFydFByb2ZpbGluZygpe3RoaXMuc2Vzc2lvbi5zdGFydFByb2ZpbGluZygpfWVuZFByb2ZpbGluZygpe3RoaXMuc2Vzc2lvbi5lbmRQcm9maWxpbmcoKX19fSw2OTE5OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5TZXNzaW9uPXZvaWQgMDtjb25zdCBvPXIoNzA2NyksdT1yKDEyOTYpLGg9cig3MDkxKSxhPXIoMTAzNikscD1yKDYyMzEpLGY9cigyNjQ0KTt0LlNlc3Npb249Y2xhc3N7Y29uc3RydWN0b3IoZD17fSl7dGhpcy5faW5pdGlhbGl6ZWQ9ITEsdGhpcy5iYWNrZW5kSGludD1kLmJhY2tlbmRIaW50LHRoaXMucHJvZmlsZXI9cC5Qcm9maWxlci5jcmVhdGUoZC5wcm9maWxlciksdGhpcy5jb250ZXh0PXtwcm9maWxlcjp0aGlzLnByb2ZpbGVyLGdyYXBoSW5wdXRUeXBlczpbXSxncmFwaElucHV0RGltczpbXX19Z2V0IGlucHV0TmFtZXMoKXtyZXR1cm4gdGhpcy5fbW9kZWwuZ3JhcGguZ2V0SW5wdXROYW1lcygpfWdldCBvdXRwdXROYW1lcygpe3JldHVybiB0aGlzLl9tb2RlbC5ncmFwaC5nZXRPdXRwdXROYW1lcygpfXN0YXJ0UHJvZmlsaW5nKCl7dGhpcy5wcm9maWxlci5zdGFydCgpfWVuZFByb2ZpbGluZygpe3RoaXMucHJvZmlsZXIuc3RvcCgpfWFzeW5jIGxvYWRNb2RlbChkLGwsbil7YXdhaXQgdGhpcy5wcm9maWxlci5ldmVudCgic2Vzc2lvbiIsIlNlc3Npb24ubG9hZE1vZGVsIixhc3luYygpPT57Y29uc3QgZT1hd2FpdCgwLGgucmVzb2x2ZUJhY2tlbmQpKHRoaXMuYmFja2VuZEhpbnQpO2lmKHRoaXMuc2Vzc2lvbkhhbmRsZXI9ZS5jcmVhdGVTZXNzaW9uSGFuZGxlcih0aGlzLmNvbnRleHQpLHRoaXMuX21vZGVsPW5ldyBmLk1vZGVsLHR5cGVvZiBkPT0ic3RyaW5nIil7Y29uc3QgaT1kLmVuZHNXaXRoKCIub3J0Iik7aWYodHlwZW9mIGZldGNoPiJ1Iil7Y29uc3Qgcz1hd2FpdCgwLHUucHJvbWlzaWZ5KShvLnJlYWRGaWxlKShkKTt0aGlzLmluaXRpYWxpemUocyxpKX1lbHNle2NvbnN0IHM9YXdhaXQgZmV0Y2goZCksbT1hd2FpdCBzLmFycmF5QnVmZmVyKCk7dGhpcy5pbml0aWFsaXplKG5ldyBVaW50OEFycmF5KG0pLGkpfX1lbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhkKSl0aGlzLmluaXRpYWxpemUoZCk7ZWxzZXtjb25zdCBpPW5ldyBVaW50OEFycmF5KGQsbHx8MCxufHxkLmJ5dGVMZW5ndGgpO3RoaXMuaW5pdGlhbGl6ZShpKX19KX1pbml0aWFsaXplKGQsbCl7aWYodGhpcy5faW5pdGlhbGl6ZWQpdGhyb3cgbmV3IEVycm9yKCJhbHJlYWR5IGluaXRpYWxpemVkIik7dGhpcy5wcm9maWxlci5ldmVudCgic2Vzc2lvbiIsIlNlc3Npb24uaW5pdGlhbGl6ZSIsKCk9Pntjb25zdCBuPXRoaXMuc2Vzc2lvbkhhbmRsZXIudHJhbnNmb3JtR3JhcGg/dGhpcy5zZXNzaW9uSGFuZGxlcjp2b2lkIDA7dGhpcy5fbW9kZWwubG9hZChkLG4sbCksdGhpcy5zZXNzaW9uSGFuZGxlci5vbkdyYXBoSW5pdGlhbGl6ZWQmJnRoaXMuc2Vzc2lvbkhhbmRsZXIub25HcmFwaEluaXRpYWxpemVkKHRoaXMuX21vZGVsLmdyYXBoKSx0aGlzLmluaXRpYWxpemVPcHModGhpcy5fbW9kZWwuZ3JhcGgpLHRoaXMuX2V4ZWN1dGlvblBsYW49bmV3IGEuRXhlY3V0aW9uUGxhbih0aGlzLl9tb2RlbC5ncmFwaCx0aGlzLl9vcHMsdGhpcy5wcm9maWxlcil9KSx0aGlzLl9pbml0aWFsaXplZD0hMH1hc3luYyBydW4oZCl7aWYoIXRoaXMuX2luaXRpYWxpemVkKXRocm93IG5ldyBFcnJvcigic2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7cmV0dXJuIHRoaXMucHJvZmlsZXIuZXZlbnQoInNlc3Npb24iLCJTZXNzaW9uLnJ1biIsYXN5bmMoKT0+e2NvbnN0IGw9dGhpcy5ub3JtYWxpemVBbmRWYWxpZGF0ZUlucHV0cyhkKSxuPWF3YWl0IHRoaXMuX2V4ZWN1dGlvblBsYW4uZXhlY3V0ZSh0aGlzLnNlc3Npb25IYW5kbGVyLGwpO3JldHVybiB0aGlzLmNyZWF0ZU91dHB1dChuKX0pfW5vcm1hbGl6ZUFuZFZhbGlkYXRlSW5wdXRzKGQpe2NvbnN0IGw9dGhpcy5fbW9kZWwuZ3JhcGguZ2V0SW5wdXROYW1lcygpO2lmKEFycmF5LmlzQXJyYXkoZCkpe2lmKGQubGVuZ3RoIT09bC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBpbmNvcnJlY3QgaW5wdXQgYXJyYXkgbGVuZ3RoOiBleHBlY3RlZCAke2wubGVuZ3RofSBidXQgZ290ICR7ZC5sZW5ndGh9YCl9ZWxzZXtpZihkLnNpemUhPT1sLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYGluY29ycmVjdCBpbnB1dCBtYXAgc2l6ZTogZXhwZWN0ZWQgJHtsLmxlbmd0aH0gYnV0IGdvdCAke2Quc2l6ZX1gKTtjb25zdCBuPW5ldyBBcnJheShkLnNpemUpO2xldCBlPTA7Zm9yKGxldCBpPTA7aTxsLmxlbmd0aDsrK2kpe2NvbnN0IHM9ZC5nZXQobFtpXSk7aWYoIXMpdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIGlucHV0IHRlbnNvciBmb3I6ICcke25hbWV9J2ApO25bZSsrXT1zfWQ9bn1pZih0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dFR5cGVzJiZ0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dFR5cGVzLmxlbmd0aCE9PTAmJnRoaXMuY29udGV4dC5ncmFwaElucHV0RGltcyYmdGhpcy5jb250ZXh0LmdyYXBoSW5wdXREaW1zLmxlbmd0aCE9PTApdGhpcy52YWxpZGF0ZUlucHV0VGVuc29yRGltcyh0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dERpbXMsZCwhMSk7ZWxzZXtjb25zdCBuPXRoaXMuX21vZGVsLmdyYXBoLmdldElucHV0SW5kaWNlcygpLGU9dGhpcy5fbW9kZWwuZ3JhcGguZ2V0VmFsdWVzKCksaT1uZXcgQXJyYXkobi5sZW5ndGgpO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7KytzKXtjb25zdCBtPWVbbltzXV07aVtzXT1tLnR5cGUuc2hhcGUuZGltcyx0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dFR5cGVzLnB1c2gobS50eXBlLnRlbnNvclR5cGUpLHRoaXMuY29udGV4dC5ncmFwaElucHV0RGltcy5wdXNoKGRbc10uZGltcyl9dGhpcy52YWxpZGF0ZUlucHV0VGVuc29yRGltcyhpLGQsITApfXJldHVybiB0aGlzLnZhbGlkYXRlSW5wdXRUZW5zb3JUeXBlcyh0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dFR5cGVzLGQpLGR9dmFsaWRhdGVJbnB1dFRlbnNvclR5cGVzKGQsbCl7Zm9yKGxldCBuPTA7bjxsLmxlbmd0aDtuKyspe2NvbnN0IGU9ZFtuXSxpPWxbbl0udHlwZTtpZihlIT09aSl0aHJvdyBuZXcgRXJyb3IoYGlucHV0IHRlbnNvclske259XSBjaGVjayBmYWlsZWQ6IGV4cGVjdGVkIHR5cGUgJyR7ZX0nIGJ1dCBnb3QgJHtpfWApfX12YWxpZGF0ZUlucHV0VGVuc29yRGltcyhkLGwsbil7Zm9yKGxldCBlPTA7ZTxsLmxlbmd0aDtlKyspe2NvbnN0IGk9ZFtlXSxzPWxbZV0uZGltcztpZighdGhpcy5jb21wYXJlVGVuc29yRGltcyhpLHMsbikpdGhyb3cgbmV3IEVycm9yKGBpbnB1dCB0ZW5zb3JbJHtlfV0gY2hlY2sgZmFpbGVkOiBleHBlY3RlZCBzaGFwZSAnWyR7aS5qb2luKCIsIil9XScgYnV0IGdvdCBbJHtzLmpvaW4oIiwiKX1dYCl9fWNvbXBhcmVUZW5zb3JEaW1zKGQsbCxuKXtpZihkLmxlbmd0aCE9PWwubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgZT0wO2U8ZC5sZW5ndGg7KytlKWlmKGRbZV0hPT1sW2VdJiYoIW58fGRbZV0hPT0wKSlyZXR1cm4hMTtyZXR1cm4hMH1jcmVhdGVPdXRwdXQoZCl7Y29uc3QgbD10aGlzLl9tb2RlbC5ncmFwaC5nZXRPdXRwdXROYW1lcygpO2lmKGQubGVuZ3RoIT09bC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJleHBlY3RlZCBudW1iZXIgb2Ygb3V0cHV0cyBkbyBub3QgbWF0Y2ggbnVtYmVyIG9mIGdlbmVyYXRlZCBvdXRwdXRzIik7Y29uc3Qgbj1uZXcgTWFwO2ZvcihsZXQgZT0wO2U8bC5sZW5ndGg7KytlKW4uc2V0KGxbZV0sZFtlXSk7cmV0dXJuIG59aW5pdGlhbGl6ZU9wcyhkKXtjb25zdCBsPWQuZ2V0Tm9kZXMoKTt0aGlzLl9vcHM9bmV3IEFycmF5KGwubGVuZ3RoKTtmb3IobGV0IG49MDtuPGwubGVuZ3RoO24rKyl0aGlzLl9vcHNbbl09dGhpcy5zZXNzaW9uSGFuZGxlci5yZXNvbHZlKGxbbl0sdGhpcy5fbW9kZWwub3BzZXRzLGQpfX19LDkxNjI6ZnVuY3Rpb24oYyx0LHIpe3ZhciBvPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbihtKXtyZXR1cm4gbSYmbS5fX2VzTW9kdWxlP206e2RlZmF1bHQ6bX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlRlbnNvcj12b2lkIDA7Y29uc3QgdT1yKDM0NDIpLGg9byhyKDM3MjApKSxhPXIoMTQ0NikscD1yKDkzOTUpLGY9cigyNTE3KTt2YXIgZD1wLm9ubnhydW50aW1lLmV4cGVyaW1lbnRhbC5mYnM7Y2xhc3MgbHtnZXQgZGF0YSgpe2lmKHRoaXMuY2FjaGU9PT12b2lkIDApe2NvbnN0IGc9dGhpcy5kYXRhUHJvdmlkZXIodGhpcy5kYXRhSWQpO2lmKGcubGVuZ3RoIT09dGhpcy5zaXplKXRocm93IG5ldyBFcnJvcigiTGVuZ3RoIG9mIGRhdGEgcHJvdmlkZWQgYnkgdGhlIERhdGEgUHJvdmlkZXIgaXMgaW5jb25zaXN0ZW50IHdpdGggdGhlIGRpbXMgb2YgdGhpcyBUZW5zb3IuIik7dGhpcy5jYWNoZT1nfXJldHVybiB0aGlzLmNhY2hlfWdldCBzdHJpbmdEYXRhKCl7aWYodGhpcy50eXBlIT09InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZGF0YSB0eXBlIGlzIG5vdCBzdHJpbmciKTtyZXR1cm4gdGhpcy5kYXRhfWdldCBpbnRlZ2VyRGF0YSgpe3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UidWludDgiOmNhc2UiaW50OCI6Y2FzZSJ1aW50MTYiOmNhc2UiaW50MTYiOmNhc2UiaW50MzIiOmNhc2UidWludDMyIjpjYXNlImJvb2wiOnJldHVybiB0aGlzLmRhdGE7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIHR5cGUgaXMgbm90IGludGVnZXIgKHVpbnQ4LCBpbnQ4LCB1aW50MTYsIGludDE2LCBpbnQzMiwgdWludDMyLCBib29sKSIpfX1nZXQgZmxvYXREYXRhKCl7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJmbG9hdDMyIjpjYXNlImZsb2F0NjQiOnJldHVybiB0aGlzLmRhdGE7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIHR5cGUgaXMgbm90IGZsb2F0IChmbG9hdDMyLCBmbG9hdDY0KSIpfX1nZXQgbnVtYmVyRGF0YSgpe2lmKHRoaXMudHlwZSE9PSJzdHJpbmciKXJldHVybiB0aGlzLmRhdGE7dGhyb3cgbmV3IFR5cGVFcnJvcigidHlwZSBjYW5ub3QgYmUgbm9uLW51bWJlciAoc3RyaW5nKSIpfWdldChnKXtyZXR1cm4gdGhpcy5kYXRhW2YuU2hhcGVVdGlsLmluZGljZXNUb09mZnNldChnLHRoaXMuc3RyaWRlcyldfXNldChnLF8pe3RoaXMuZGF0YVtmLlNoYXBlVXRpbC5pbmRpY2VzVG9PZmZzZXQoZyx0aGlzLnN0cmlkZXMpXT1ffWFzeW5jIGdldERhdGEoKXtyZXR1cm4gdGhpcy5jYWNoZT09PXZvaWQgMCYmKHRoaXMuY2FjaGU9YXdhaXQgdGhpcy5hc3luY0RhdGFQcm92aWRlcih0aGlzLmRhdGFJZCkpLHRoaXMuY2FjaGV9Z2V0IHN0cmlkZXMoKXtyZXR1cm4gdGhpcy5fc3RyaWRlc3x8KHRoaXMuX3N0cmlkZXM9Zi5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXModGhpcy5kaW1zKSksdGhpcy5fc3RyaWRlc31jb25zdHJ1Y3RvcihnLF8sYix5LFQsdz11Lkd1aWQuY3JlYXRlKCkpe3RoaXMuZGltcz1nLHRoaXMudHlwZT1fLHRoaXMuZGF0YVByb3ZpZGVyPWIsdGhpcy5hc3luY0RhdGFQcm92aWRlcj15LHRoaXMuY2FjaGU9VCx0aGlzLmRhdGFJZD13LHRoaXMuc2l6ZT1mLlNoYXBlVXRpbC52YWxpZGF0ZURpbXNBbmRDYWxjU2l6ZShnKTtjb25zdCB4PXRoaXMuc2l6ZSxFPWI9PT12b2lkIDAmJnk9PT12b2lkIDAmJlQ9PT12b2lkIDA7aWYoVCE9PXZvaWQgMCYmVC5sZW5ndGghPT14KXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnB1dCBkaW1zIGRvZXNuJ3QgbWF0Y2ggZGF0YSBsZW5ndGguIik7aWYoXz09PSJzdHJpbmciKXtpZighKFQ9PT12b2lkIDB8fEFycmF5LmlzQXJyYXkoVCkmJlQuZXZlcnkoUD0+dHlwZW9mIFA9PSJzdHJpbmciKSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FjaGUgc2hvdWxkIGJlIGEgc3RyaW5nIGFycmF5Iik7RSYmKHRoaXMuY2FjaGU9bmV3IEFycmF5KHgpKX1lbHNle2lmKFQhPT12b2lkIDApe2NvbnN0IFA9ZShfKTtpZighKFQgaW5zdGFuY2VvZiBQKSl0aHJvdyBuZXcgVHlwZUVycm9yKGBjYWNoZSBzaG91bGQgYmUgdHlwZSAke1AubmFtZX1gKX1pZihFKXtjb25zdCBQPW5ldyBBcnJheUJ1ZmZlcih4KmZ1bmN0aW9uKHYpe3N3aXRjaCh2KXtjYXNlImJvb2wiOmNhc2UiaW50OCI6Y2FzZSJ1aW50OCI6cmV0dXJuIDE7Y2FzZSJpbnQxNiI6Y2FzZSJ1aW50MTYiOnJldHVybiAyO2Nhc2UiaW50MzIiOmNhc2UidWludDMyIjpjYXNlImZsb2F0MzIiOnJldHVybiA0O2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIDg7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBjYWxjdWxhdGUgc2l6ZW9mKCkgb24gdHlwZSAke3Z9YCl9fShfKSk7dGhpcy5jYWNoZT1mdW5jdGlvbih2LE0pe3JldHVybiBuZXcoZShNKSkodil9KFAsXyl9fX1zdGF0aWMgZnJvbVByb3RvKGcpe2lmKCFnKXRocm93IG5ldyBFcnJvcigiY2Fubm90IGNvbnN0cnVjdCBWYWx1ZSBmcm9tIGFuIGVtcHR5IHRlbnNvciIpO2NvbnN0IF89Zi5Qcm90b1V0aWwudGVuc29yRGF0YVR5cGVGcm9tUHJvdG8oZy5kYXRhVHlwZSksYj1mLlByb3RvVXRpbC50ZW5zb3JEaW1zRnJvbVByb3RvKGcuZGltcykseT1uZXcgbChiLF8pO2lmKF89PT0ic3RyaW5nIilnLnN0cmluZ0RhdGEuZm9yRWFjaCgoVCx3KT0+e3kuZGF0YVt3XT0oMCxmLmRlY29kZVV0ZjhTdHJpbmcpKFQpfSk7ZWxzZSBpZihnLnJhd0RhdGEmJnR5cGVvZiBnLnJhd0RhdGEuYnl0ZUxlbmd0aD09Im51bWJlciImJmcucmF3RGF0YS5ieXRlTGVuZ3RoPjApe2NvbnN0IFQ9eS5kYXRhLHc9bmV3IERhdGFWaWV3KGcucmF3RGF0YS5idWZmZXIsZy5yYXdEYXRhLmJ5dGVPZmZzZXQsZy5yYXdEYXRhLmJ5dGVMZW5ndGgpLHg9bihnLmRhdGFUeXBlKSxFPWcucmF3RGF0YS5ieXRlTGVuZ3RoL3g7aWYoZy5yYXdEYXRhLmJ5dGVMZW5ndGgleCE9MCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYnVmZmVyIGxlbmd0aCIpO2lmKFQubGVuZ3RoIT09RSl0aHJvdyBuZXcgRXJyb3IoImJ1ZmZlciBsZW5ndGggbWlzbWF0Y2giKTtmb3IobGV0IFA9MDtQPEU7UCsrKXtjb25zdCB2PXModyxnLmRhdGFUeXBlLFAqeCk7VFtQXT12fX1lbHNle2xldCBUO3N3aXRjaChnLmRhdGFUeXBlKXtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDpUPWcuZmxvYXREYXRhO2JyZWFrO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDMyOmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDE2OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ4OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkJPT0w6VD1nLmludDMyRGF0YTticmVhaztjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ2NDpUPWcuaW50NjREYXRhO2JyZWFrO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkRPVUJMRTpUPWcuZG91YmxlRGF0YTticmVhaztjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzI6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0OlQ9Zy51aW50NjREYXRhO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bnNwZWNpZmljIGVycm9yIil9aWYoVD09bnVsbCl0aHJvdyBuZXcgRXJyb3IoImZhaWxlZCB0byBwb3B1bGF0ZSBkYXRhIGZyb20gYSB0ZW5zb3Jwcm90byB2YWx1ZSIpO2NvbnN0IHc9eS5kYXRhO2lmKHcubGVuZ3RoIT09VC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJhcnJheSBsZW5ndGggbWlzbWF0Y2giKTtmb3IobGV0IHg9MDt4PFQubGVuZ3RoO3grKyl7Y29uc3QgRT1UW3hdO2guZGVmYXVsdC5pc0xvbmcoRSk/d1t4XT1pKEUsZy5kYXRhVHlwZSk6d1t4XT1FfX1yZXR1cm4geX1zdGF0aWMgZnJvbURhdGEoZyxfLGIpe3JldHVybiBuZXcgbChfLGIsdm9pZCAwLHZvaWQgMCxnKX1zdGF0aWMgZnJvbU9ydFRlbnNvcihnKXtpZighZyl0aHJvdyBuZXcgRXJyb3IoImNhbm5vdCBjb25zdHJ1Y3QgVmFsdWUgZnJvbSBhbiBlbXB0eSB0ZW5zb3IiKTtjb25zdCBfPWYuUHJvdG9VdGlsLnRlbnNvckRpbXNGcm9tT1JURm9ybWF0KGcpLGI9Zi5Qcm90b1V0aWwudGVuc29yRGF0YVR5cGVGcm9tUHJvdG8oZy5kYXRhVHlwZSgpKSx5PW5ldyBsKF8sYik7aWYoYj09PSJzdHJpbmciKWZvcihsZXQgVD0wO1Q8Zy5zdHJpbmdEYXRhTGVuZ3RoKCk7VCsrKXkuZGF0YVtUXT1nLnN0cmluZ0RhdGEoVCk7ZWxzZSBpZihnLnJhd0RhdGFBcnJheSgpJiZ0eXBlb2YgZy5yYXdEYXRhTGVuZ3RoKCk9PSJudW1iZXIiJiZnLnJhd0RhdGFMZW5ndGgoKT4wKXtjb25zdCBUPXkuZGF0YSx3PW5ldyBEYXRhVmlldyhnLnJhd0RhdGFBcnJheSgpLmJ1ZmZlcixnLnJhd0RhdGFBcnJheSgpLmJ5dGVPZmZzZXQsZy5yYXdEYXRhTGVuZ3RoKCkpLHg9bihnLmRhdGFUeXBlKCkpLEU9Zy5yYXdEYXRhTGVuZ3RoKCkveDtpZihnLnJhd0RhdGFMZW5ndGgoKSV4IT0wKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBidWZmZXIgbGVuZ3RoIik7aWYoVC5sZW5ndGghPT1FKXRocm93IG5ldyBFcnJvcigiYnVmZmVyIGxlbmd0aCBtaXNtYXRjaCIpO2ZvcihsZXQgUD0wO1A8RTtQKyspe2NvbnN0IHY9cyh3LGcuZGF0YVR5cGUoKSxQKngpO1RbUF09dn19cmV0dXJuIHl9fWZ1bmN0aW9uIG4obSl7c3dpdGNoKG0pe2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ4OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDg6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuQk9PTDpyZXR1cm4gMTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMTY6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMTY6cmV0dXJuIDI7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRkxPQVQ6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMzI6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDMyOnJldHVybiA0O2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDY0OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkRPVUJMRTpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjQ6cmV0dXJuIDg7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBjYWxjdWxhdGUgc2l6ZW9mKCkgb24gdHlwZSAke2Eub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZVttXX1gKX19ZnVuY3Rpb24gZShtKXtzd2l0Y2gobSl7Y2FzZSJib29sIjpjYXNlInVpbnQ4IjpyZXR1cm4gVWludDhBcnJheTtjYXNlImludDgiOnJldHVybiBJbnQ4QXJyYXk7Y2FzZSJpbnQxNiI6cmV0dXJuIEludDE2QXJyYXk7Y2FzZSJ1aW50MTYiOnJldHVybiBVaW50MTZBcnJheTtjYXNlImludDMyIjpyZXR1cm4gSW50MzJBcnJheTtjYXNlInVpbnQzMiI6cmV0dXJuIFVpbnQzMkFycmF5O2Nhc2UiZmxvYXQzMiI6cmV0dXJuIEZsb2F0MzJBcnJheTtjYXNlImZsb2F0NjQiOnJldHVybiBGbG9hdDY0QXJyYXk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVuc3BlY2lmaWVkIGVycm9yIil9fWZ1bmN0aW9uIGkobSxnKXtpZihnPT09YS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDY0fHxnPT09ZC5UZW5zb3JEYXRhVHlwZS5JTlQ2NCl7aWYobS5ncmVhdGVyVGhhbk9yRXF1YWwoMjE0NzQ4MzY0OCl8fG0ubGVzc1RoYW4oLTIxNDc0ODM2NDgpKXRocm93IG5ldyBUeXBlRXJyb3IoImludDY0IGlzIG5vdCBzdXBwb3J0ZWQiKX1lbHNle2lmKGchPT1hLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDMyJiZnIT09ZC5UZW5zb3JEYXRhVHlwZS5VSU5UMzImJmchPT1hLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0JiZnIT09ZC5UZW5zb3JEYXRhVHlwZS5VSU5UNjQpdGhyb3cgbmV3IFR5cGVFcnJvcihgbm90IGEgTE9ORyB0eXBlOiAke2Eub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZVtnXX1gKTtpZihtLmdyZWF0ZXJUaGFuT3JFcXVhbCg0Mjk0OTY3Mjk2KXx8bS5sZXNzVGhhbigwKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ1aW50NjQgaXMgbm90IHN1cHBvcnRlZCIpfXJldHVybiBtLnRvTnVtYmVyKCl9ZnVuY3Rpb24gcyhtLGcsXyl7c3dpdGNoKGcpe2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkJPT0w6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg6cmV0dXJuIG0uZ2V0VWludDgoXyk7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UODpyZXR1cm4gbS5nZXRJbnQ4KF8pO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjpyZXR1cm4gbS5nZXRVaW50MTYoXywhMCk7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMTY6cmV0dXJuIG0uZ2V0SW50MTYoXywhMCk7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRkxPQVQ6cmV0dXJuIG0uZ2V0RmxvYXQzMihfLCEwKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQzMjpyZXR1cm4gbS5nZXRJbnQzMihfLCEwKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzI6cmV0dXJuIG0uZ2V0VWludDMyKF8sITApO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDY0OnJldHVybiBpKGguZGVmYXVsdC5mcm9tQml0cyhtLmdldFVpbnQzMihfLCEwKSxtLmdldFVpbnQzMihfKzQsITApLCExKSxnKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5ET1VCTEU6cmV0dXJuIG0uZ2V0RmxvYXQ2NChfLCEwKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjQ6cmV0dXJuIGkoaC5kZWZhdWx0LmZyb21CaXRzKG0uZ2V0VWludDMyKF8sITApLG0uZ2V0VWludDMyKF8rNCwhMCksITApLGcpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgcmVhZCBmcm9tIERhdGFWaWV3IGZvciB0eXBlICR7YS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlW2ddfWApfX10LlRlbnNvcj1sfSwyNTE3OmZ1bmN0aW9uKGMsdCxyKXt2YXIgbz10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24oZyl7cmV0dXJuIGcmJmcuX19lc01vZHVsZT9nOntkZWZhdWx0Omd9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5kZWNvZGVVdGY4U3RyaW5nPXQuTUFYX0NMSVA9dC5NSU5fQ0xJUD10LlBvb2xDb252VXRpbD10LlJlZHVjZVV0aWw9dC5TcGxpdFV0aWw9dC5NYXRoVXRpbD10LlNoYXBlVXRpbD10LkxvbmdVdGlsPXQuUHJvdG9VdGlsPXQuR2VtbVV0aWw9dC5hcnJheUNvcHlIZWxwZXI9dC5Ccm9hZGNhc3RVdGlsPXQuTWF0TXVsVXRpbD10LkFycmF5VXRpbD10LmFzc2VydD10LmNoZWNrSW5wdXRzU2hhcGU9dm9pZCAwO2NvbnN0IHU9cig1Njg2KSxoPW8ocigzNzIwKSksYT1yKDE0NDYpLHA9cig5MTYyKTt0LmNoZWNrSW5wdXRzU2hhcGU9ZnVuY3Rpb24oZywuLi5fKXtpZighZ3x8Zy5sZW5ndGghPT1fLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IGI9MDtiPGcubGVuZ3RoO2IrKylpZighZ1tiXS5kaW1zfHxnW2JdLmRpbXMubGVuZ3RoIT09X1tiXSlyZXR1cm4hMTtyZXR1cm4hMH0sdC5hc3NlcnQ9ZnVuY3Rpb24oZyxfKXtpZighZyl0aHJvdyBuZXcgRXJyb3IodHlwZW9mIF89PSJzdHJpbmciP186XygpKX0sdC5BcnJheVV0aWw9Y2xhc3N7c3RhdGljIGFycmF5c0VxdWFsKGcsXyl7aWYoZy5sZW5ndGghPT1fLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IGI9MDtiPGcubGVuZ3RoO2IrKylpZihnW2JdIT09X1tiXSlyZXR1cm4hMTtyZXR1cm4hMH19O2NsYXNzIGZ7c3RhdGljIHByZXByb2Nlc3NJbnB1dFNoYXBlcyhfLGIpe3JldHVybltfLmxlbmd0aD09PTE/WzEsX1swXV06XyxiLmxlbmd0aD09PTE/W2JbMF0sMV06Yl19c3RhdGljIHBvc3Rwcm9jZXNzT3V0cHV0U2hhcGUoXyxiLHkpe2I9PT0xJiZfLnNwbGljZShfLmxlbmd0aC0yLDEpLHk9PT0xJiZfLnBvcCgpfXN0YXRpYyBjYWxjTWF0TXVsU2hhcGUoXyxiKXtyZXR1cm4gX1sxXSE9PWJbMF0/dm9pZCAwOltfWzBdLGJbMV1dfX10Lk1hdE11bFV0aWw9ZjtjbGFzcyBke3N0YXRpYyBjYWxjU2hhcGUoXyxiLHk9ITEpe2NvbnN0IFQ9Xy5sZW5ndGgsdz1iLmxlbmd0aDtpZihUPT09MClyZXR1cm4gYjtpZih3PT09MClyZXR1cm4gXztjb25zdCB4PU1hdGgubWF4KF8ubGVuZ3RoLGIubGVuZ3RoKSxFPW5ldyBBcnJheSh4KTtpZih5KXtpZihUPDJ8fHc8MilyZXR1cm47Y29uc3QgUD1mLmNhbGNNYXRNdWxTaGFwZShbX1tULTJdLF9bVC0xXV0sW2Jbdy0yXSxiW3ctMV1dKTtpZihQPT09dm9pZCAwKXJldHVybjtbRVt4LTJdLEVbeC0xXV09UH1mb3IobGV0IFA9eT8zOjE7UDw9eDtQKyspe2NvbnN0IHY9VC1QPDA/MTpfW1QtUF0sTT13LVA8MD8xOmJbdy1QXTtpZih2IT09TSYmdj4xJiZNPjEpcmV0dXJuO0VbeC1QXT1NYXRoLm1heCh2LE0pfXJldHVybiBFfXN0YXRpYyBpbmRleChfLGIpe2NvbnN0IHk9bmV3IEFycmF5KGIubGVuZ3RoKTtyZXR1cm4gZC5maWxsSW5kZXgoXyxiLHkpLHl9c3RhdGljIGZpbGxJbmRleChfLGIseSl7Y29uc3QgVD1fLmxlbmd0aC1iLmxlbmd0aDtmb3IobGV0IHc9MDt3PGIubGVuZ3RoO3crKyl5W3ddPV9bVCt3XSViW3ddfXN0YXRpYyBjYWxjKF8sYix5LFQsdyl7Y29uc3QgeD1kLmNhbGNTaGFwZShfLmRpbXMsYi5kaW1zKTtpZih4KXtpZihUJiYhZS5hcmVFcXVhbCh4LF8uZGltcykpcmV0dXJuO2NvbnN0IEU9ZS5zaXplKHgpLFA9VD9fOm5ldyBwLlRlbnNvcih4LHd8fF8udHlwZSk7aWYoeC5sZW5ndGg9PT0wKVAuc2V0KFtdLHkoXy5nZXQoW10pLGIuZ2V0KFtdKSkpO2Vsc2V7Y29uc3Qgdj1uZXcgQXJyYXkoeC5sZW5ndGgpLE09bmV3IEFycmF5KF8uZGltcy5sZW5ndGgpLCQ9bmV3IEFycmF5KGIuZGltcy5sZW5ndGgpO2xldCB6LEI9MCxOPTAsRD0hMSxJPSExO18uZGltcy5sZW5ndGg9PT0wJiYoQj1fLmdldChbXSksRD0hMCksYi5kaW1zLmxlbmd0aD09PTAmJihOPWIuZ2V0KFtdKSxJPSEwKTtmb3IobGV0IEY9MDtGPEU7RisrKXt6PUY7Zm9yKGxldCBYPXgubGVuZ3RoLTE7WD49MDtYLS0pdltYXT16JXhbWF0sej1NYXRoLmZsb29yKHoveFtYXSk7RHx8KGQuZmlsbEluZGV4KHYsXy5kaW1zLE0pLEI9Xy5nZXQoTSkpLEl8fChkLmZpbGxJbmRleCh2LGIuZGltcywkKSxOPWIuZ2V0KCQpKSxQLnNldCh2LHkoQixOKSl9fXJldHVybiBQfX1zdGF0aWMgaXNWYWxpZEJyb2FkY2FzdChfLGIpe2NvbnN0IHk9Xy5sZW5ndGgsVD1iLmxlbmd0aDtpZih5PlQpcmV0dXJuITE7Zm9yKGxldCB3PTE7dzw9eTt3KyspaWYoX1t5LXddIT09MSYmX1t5LXddIT09YltULXddKXJldHVybiExO3JldHVybiEwfXN0YXRpYyBnZXRCcm9hZGNhc3REaW1zKF8sYil7Y29uc3QgeT1fLmxlbmd0aCxUPVtdO2ZvcihsZXQgdz0wO3c8eTt3Kyspe2NvbnN0IHg9eS0xLXcsRT1fW3hdfHwxOyhiW2IubGVuZ3RoLTEtd118fDEpPjEmJkU9PT0xJiZULnVuc2hpZnQoeCl9cmV0dXJuIFR9fXQuQnJvYWRjYXN0VXRpbD1kLHQuYXJyYXlDb3B5SGVscGVyPWZ1bmN0aW9uKGcsXyxiLHksVCl7aWYoeTwwfHx5Pj1fLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZUluZGV4IG91dCBvZiBib3VuZHMiKTtpZihiPDB8fGI+PWcubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0SW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKHkrVD5fLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZSBpbmRpY2VzIHRvIGJlIGNvcGllZCBhcmUgb3V0c2lkZSBib3VuZHMiKTtpZihiK1Q+Zy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQgYXJyYXkgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVzdWx0Iik7Zm9yKGxldCB3PTA7dzxUO3crKylnW2Ird109X1t5K3ddfSx0LkdlbW1VdGlsPWNsYXNze3N0YXRpYyBnZXRTaGFwZU9mR2VtbVJlc3VsdChnLF8sYix5LFQpe2lmKGcubGVuZ3RoIT09Mnx8Yi5sZW5ndGghPT0yKXRocm93IG5ldyBFcnJvcigic2hhcGUgbmVlZCB0byBiZSBvZiBzaXplIDIiKTtsZXQgdyx4LEU7Xz8odz1nWzFdLHg9Z1swXSk6KHc9Z1swXSx4PWdbMV0pO2xldCBQPS0xO2lmKHk/KEU9YlswXSxQPTEpOihFPWJbMV0sUD0wKSxiW1BdIT09eCl0aHJvdyBuZXcgRXJyb3IoImRpbWVuc2lvbiBtaXNtYXRjaCIpO2lmKHc8PTB8fEU8PTB8fHg8PTApdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNoYXBlIHNwZWNpZmllZCIpO2lmKFQmJiFkLmlzVmFsaWRCcm9hZGNhc3QoVCxbdyxFXSkpdGhyb3cgbmV3IEVycm9yKCJnZW1tOiBpbnZhbGlkIGJpYXMgc2hhcGUgZm9yIGJyb2FkY2FzdCIpO3JldHVyblt3LEUseF19fTtjbGFzcyBse3N0YXRpYyB0ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhfKXtzd2l0Y2goXyl7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UODpyZXR1cm4iaW50OCI7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg6cmV0dXJuInVpbnQ4IjtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5CT09MOnJldHVybiJib29sIjtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQxNjpyZXR1cm4iaW50MTYiO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjpyZXR1cm4idWludDE2IjtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQzMjpyZXR1cm4iaW50MzIiO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQzMjpyZXR1cm4idWludDMyIjtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDpyZXR1cm4iZmxvYXQzMiI7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRE9VQkxFOnJldHVybiJmbG9hdDY0IjtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5TVFJJTkc6cmV0dXJuInN0cmluZyI7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjQ6cmV0dXJuImludDMyIjtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjQ6cmV0dXJuInVpbnQzMiI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGRhdGEgdHlwZTogJHthLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGVbX119YCl9fXN0YXRpYyB0ZW5zb3JEYXRhVHlwZVN0cmluZ1RvRW51bShfKXtzd2l0Y2goXyl7Y2FzZSJpbnQ4IjpyZXR1cm4gYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDg7Y2FzZSJ1aW50OCI6cmV0dXJuIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UODtjYXNlImJvb2wiOnJldHVybiBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuQk9PTDtjYXNlImludDE2IjpyZXR1cm4gYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDE2O2Nhc2UidWludDE2IjpyZXR1cm4gYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjtjYXNlImludDMyIjpyZXR1cm4gYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDMyO2Nhc2UidWludDMyIjpyZXR1cm4gYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQzMjtjYXNlImZsb2F0MzIiOnJldHVybiBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRkxPQVQ7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkRPVUJMRTtjYXNlInN0cmluZyI6cmV0dXJuIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5TVFJJTkc7Y2FzZSJpbnQ2NCI6cmV0dXJuIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ2NDtjYXNlInVpbnQ2NCI6cmV0dXJuIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjQ7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGRhdGEgdHlwZTogJHtffWApfX1zdGF0aWMgdGVuc29yRGltc0Zyb21Qcm90byhfKXtyZXR1cm4gXy5tYXAoYj0+aC5kZWZhdWx0LmlzTG9uZyhiKT9iLnRvTnVtYmVyKCk6Yil9c3RhdGljIHRlbnNvclZhbHVlVHlwZUZyb21Qcm90byhfKXtyZXR1cm57dGVuc29yVHlwZTpsLnRlbnNvckRhdGFUeXBlRnJvbVByb3RvKF8uZWxlbVR5cGUpLHNoYXBlOntkaW1zOmwudGVuc29yRGltc0Zyb21Qcm90byhfLnNoYXBlLmRpbS5tYXAoYj0+Yi5kaW1WYWx1ZSkpfX19c3RhdGljIHRlbnNvckRpbXNGcm9tT1JURm9ybWF0KF8pe2NvbnN0IGI9W107Zm9yKGxldCB5PTA7eTxfLmRpbXNMZW5ndGgoKTt5KyspYi5wdXNoKG4ubG9uZ1RvTnVtYmVyKF8uZGltcyh5KSkpO3JldHVybiBifXN0YXRpYyB0ZW5zb3JBdHRyaWJ1dGVzRnJvbU9SVEZvcm1hdChfKXtjb25zdCBiPVtdO2ZvcihsZXQgeT0wO3k8Xy5hdHRyaWJ1dGVzTGVuZ3RoKCk7eSsrKWIucHVzaChfLmF0dHJpYnV0ZXMoeSkpO3JldHVybiBifX10LlByb3RvVXRpbD1sO2NsYXNzIG57c3RhdGljIGxvbmdUb051bWJlcihfLGIpe3JldHVybiBoLmRlZmF1bHQuaXNMb25nKF8pP18udG9OdW1iZXIoKTpfIGluc3RhbmNlb2YgdS5mbGF0YnVmZmVycy5Mb25nP2guZGVmYXVsdC5mcm9tVmFsdWUoe2xvdzpfLmxvdyxoaWdoOl8uaGlnaCx1bnNpZ25lZDpiIT1udWxsJiZifSkudG9OdW1iZXIoKTpffXN0YXRpYyBpc0xvbmcoXyl7cmV0dXJuIGguZGVmYXVsdC5pc0xvbmcoXyl8fF8gaW5zdGFuY2VvZiB1LmZsYXRidWZmZXJzLkxvbmd9fXQuTG9uZ1V0aWw9bjtjbGFzcyBle3N0YXRpYyBzaXplKF8pe3JldHVybiBlLmdldFNpemVGcm9tRGltZW5zaW9uUmFuZ2UoXywwLF8ubGVuZ3RoKX1zdGF0aWMgc2l6ZUZyb21EaW1lbnNpb24oXyxiKXtpZihiPDB8fGI+Xy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRpbWVuc2lvbiBvZiAke2J9IGZvciBzaXplRnJvbURpbWVuc2lvbiBhcyBUZW5zb3IgaGFzICR7Xy5sZW5ndGh9IGRpbWVuc2lvbnMuYCk7cmV0dXJuIGUuZ2V0U2l6ZUZyb21EaW1lbnNpb25SYW5nZShfLGIsXy5sZW5ndGgpfXN0YXRpYyBzaXplVG9EaW1lbnNpb24oXyxiKXtpZihiPDB8fGI+Xy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRpbWVuc2lvbiBvZiAke2J9IGZvciBzaXplVG9EaW1lbnNpb24gYXMgVGVuc29yIGhhcyAke18ubGVuZ3RofSBkaW1lbnNpb25zLmApO3JldHVybiBlLmdldFNpemVGcm9tRGltZW5zaW9uUmFuZ2UoXywwLGIpfXN0YXRpYyBnZXRTaXplRnJvbURpbWVuc2lvblJhbmdlKF8sYix5KXtsZXQgVD0xO2ZvcihsZXQgdz1iO3c8eTt3Kyspe2lmKF9bd108PTApdGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgZ2V0IHZhbGlkIHNpemUgZnJvbSBzcGVjaWZpZWQgZGltZW5zaW9uIHJhbmdlLiBNb3N0IGxpa2VseSB0aGUgcmFuZ2UgY29udGFpbnMgMCBvciBuZWdhdGl2ZSB2YWx1ZXMgaW4gdGhlbS4iKTtUKj1fW3ddfXJldHVybiBUfXN0YXRpYyBjb21wdXRlU3RyaWRlcyhfKXtjb25zdCBiPV8ubGVuZ3RoO2lmKGI9PT0wKXJldHVybltdO2lmKGI9PT0xKXJldHVyblsxXTtjb25zdCB5PW5ldyBBcnJheShiKTt5W2ItMV09MSx5W2ItMl09X1tiLTFdO2ZvcihsZXQgVD1iLTM7VD49MDstLVQpeVtUXT15W1QrMV0qX1tUKzFdO3JldHVybiB5fXN0YXRpYyB0cmFuc3Bvc2UoXyl7cmV0dXJuIF8uc2xpY2UoKS5yZXZlcnNlKCl9c3RhdGljIGluZGljZXNUb09mZnNldChfLGIseSl7eT09PXZvaWQgMCYmKHk9Xy5sZW5ndGgpO2xldCBUPTA7Zm9yKGxldCB3PTA7dzx5OysrdylUKz1iW3ddKl9bd107cmV0dXJuIFR9c3RhdGljIG9mZnNldFRvSW5kaWNlcyhfLGIpe2NvbnN0IHk9Yi5sZW5ndGg7aWYoeT09PTApcmV0dXJuW107aWYoeT09PTEpcmV0dXJuW18qYlswXV07Y29uc3QgVD1uZXcgQXJyYXkoYi5sZW5ndGgpO2ZvcihsZXQgdz0wO3c8VC5sZW5ndGgtMTsrK3cpVFt3XT1NYXRoLmZsb29yKF8vYlt3XSksXy09VFt3XSpiW3ddO3JldHVybiBUW1QubGVuZ3RoLTFdPV8sVH1zdGF0aWMgbm9ybWFsaXplQXhpcyhfLGIpe2lmKF88LWImJl8+PWIpdGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCBheGlzIGZvciB0aGlzIG9wZXJhdGlvbi4iKTtyZXR1cm4gXzwwP18rYjpffXN0YXRpYyBub3JtYWxpemVBeGVzKF8sYil7cmV0dXJuIF8ubWFwKHk9PnRoaXMubm9ybWFsaXplQXhpcyh5LGIpKX1zdGF0aWMgaW5jcmVtZW50SW5kZXgoXyxiLHkpe2lmKGIubGVuZ3RoPT09MHx8Xy5sZW5ndGg9PT0wKXRocm93IG5ldyBFcnJvcigiSW5kZXggaW5jcmVtZW50aW5nIHVuc3VwcG9ydGVkIGZvciBzY2FsYXIgVGVuc29yIik7aWYoeT09PXZvaWQgMCl5PWIubGVuZ3RoO2Vsc2UgaWYoeTw9MHx8eT5iLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkluY29ycmVjdCBheGlzIHRvIGluY3JlbWVudCBvbiIpO2ZvcihsZXQgVD15LTE7VD49MCYmKF9bVF0rKywhKF9bVF08YltUXSkpOy0tVClfW1RdPTB9c3RhdGljIGNhbGN1bGF0ZVJlc2hhcGVkRGltcyhfLGIpe2lmKGIubGVuZ3RoPT09MCl7aWYoXy5sZW5ndGg9PT0wfHxlLnNpemUoXyk9PT0xKXJldHVybltdO3Rocm93IG5ldyBFcnJvcigiY2Fubm90IHJlc2hhcGUgdG8gYSBzY2FsYXIgVGVuc29yIil9Y29uc3QgeT1iLmxlbmd0aCxUPW5ldyBBcnJheSh5KTtsZXQgdz0tMSx4PTE7Zm9yKGxldCBQPTA7UDx5O1ArKyl7aWYoYltQXTwtMSl0aHJvdyBuZXcgRXJyb3IoImEgZGltZW5zaW9uIGluIHNoYXBlIGhpbnRzIGNhbm5vdCBiZSBsZXNzIHRoYW4gLTEiKTtpZihiW1BdPT09LTEpe2lmKHchPT0tMSl0aHJvdyBuZXcgRXJyb3IoImF0IG1vc3Qgb25lIGRpbWVuc2lvbiBpbiBzaGFwZSBoaW50cyBjYW4gYmUgLTEiKTt3PVB9ZWxzZXtpZihiW1BdPT09MCl7aWYoUD49Xy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgZGltZW5zaW9uIHdpdGggdmFsdWUgemVybyBleGNlZWRzIHRoZSBkaW1lbnNpb24gc2l6ZSBvZiB0aGUgaW5wdXQgdGVuc29yIik7VFtQXT1fW1BdfWVsc2UgVFtQXT1iW1BdO3gqPVRbUF19fWNvbnN0IEU9ZS5zaXplKF8pO2lmKHchPT0tMSl7aWYoRSV4IT0wKXRocm93IG5ldyBFcnJvcihgdGhlIGlucHV0IHRlbnNvciBjYW5ub3QgYmUgcmVzaGFwZWQgdG8gdGhlIHJlcXVlc3RlZCBzaGFwZS4gSW5wdXQgc2hhcGU6IFske199XSBPdXRwdXQgc2hhcGU6IFske2J9XWApO1Rbd109RS94fWVsc2UgaWYoeCE9PUUpdGhyb3cgbmV3IEVycm9yKCJyZXNoYXBlZERpbXMgYW5kIG9yaWdpbmFsRGltcyBkb24ndCBoYXZlIG1hdGNoaW5nIHNpemVzIik7cmV0dXJuIFR9c3RhdGljIHNvcnRCYXNlZE9uUGVybShfLGIpe3JldHVybiBiP2IubWFwKHk9Pl9beV0pOl8uc2xpY2UoKS5yZXZlcnNlKCl9c3RhdGljIHBhZFNoYXBlKF8sYil7Y29uc3QgeT1fLmxlbmd0aDtyZXR1cm4gXy5tYXAoKFQsdyk9PlQrYlt3XStiW3creV0pfXN0YXRpYyBhcmVFcXVhbChfLGIpe3JldHVybiBfLmxlbmd0aD09PWIubGVuZ3RoJiZfLmV2ZXJ5KCh5LFQpPT55PT09YltUXSl9c3RhdGljIHZhbGlkYXRlRGltc0FuZENhbGNTaXplKF8pe2lmKF8ubGVuZ3RoPjYpdGhyb3cgbmV3IFR5cGVFcnJvcigiT25seSByYW5rIDAgdG8gNiBpcyBzdXBwb3J0ZWQgZm9yIHRlbnNvciBzaGFwZS4iKTtsZXQgYj0xO2Zvcihjb25zdCB5IG9mIF8pe2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHkpKXRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgc2hhcGU6ICR7eX0gaXMgbm90IGFuIGludGVnZXJgKTtpZih5PDB8fHk+MjE0NzQ4MzY0Nyl0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHNoYXBlOiBsZW5ndGggJHt5fSBpcyBub3QgYWxsb3dlZGApO2IqPXl9cmV0dXJuIGJ9c3RhdGljIGZsYXR0ZW5TaGFwZShfLGIpe2I8MCYmKGIrPV8ubGVuZ3RoKTtjb25zdCB5PV8ucmVkdWNlKCh3LHgpPT53KngsMSksVD1fLnNsaWNlKGIpLnJlZHVjZSgodyx4KT0+dyp4LDEpO3JldHVyblt5L1QsVF19c3RhdGljIHNxdWVlemVTaGFwZShfLGIpe2NvbnN0IHk9bmV3IEFycmF5O2I9ZS5ub3JtYWxpemVBeGVzKGIsXy5sZW5ndGgpO2ZvcihsZXQgVD0wO1Q8Xy5sZW5ndGg7VCsrKXtjb25zdCB3PWIuaW5kZXhPZihUKT49MDtpZih3JiZfW1RdIT09MSl0aHJvdyBuZXcgRXJyb3IoInNxdWVlemUgYW4gYXhpcyBvZiBzaXplIGRpZmZlcmVudCB0aGFuIDEiKTsoYi5sZW5ndGg9PT0wJiZfW1RdPjF8fGIubGVuZ3RoPjAmJiF3KSYmeS5wdXNoKF9bVF0pfXJldHVybiB5fXN0YXRpYyB1bnNxdWVlemVTaGFwZShfLGIpe2NvbnN0IHk9bmV3IEFycmF5KF8ubGVuZ3RoK2IubGVuZ3RoKTt5LmZpbGwoMCk7Zm9yKGxldCB3PTA7dzxiLmxlbmd0aDt3Kyspe2NvbnN0IHg9ZS5ub3JtYWxpemVBeGlzKGJbd10seS5sZW5ndGgpO2lmKHg+PXkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiJ2F4ZXMnIGhhcyBhbiBvdXQgb2YgcmFuZ2UgYXhpcyIpO2lmKHlbeF0hPT0wKXRocm93IG5ldyBFcnJvcigiJ2F4ZXMnIGhhcyBhIGR1cGxpY2F0ZSBheGlzIik7eVt4XT0xfWxldCBUPTA7Zm9yKGxldCB3PTA7dzx5Lmxlbmd0aDt3KyspeVt3XT09PTAmJih5W3ddPV9bVCsrXSk7aWYoVCE9PV8ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIHVuc3F1ZWV6ZWQgZGltZW5zaW9uIGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCIpO3JldHVybiB5fX10LlNoYXBlVXRpbD1lLHQuTWF0aFV0aWw9Y2xhc3N7c3RhdGljIHNxcihnLF8sYix5LFQpe2lmKHk8MHx8eT49Xy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2VJbmRleCBvdXQgb2YgYm91bmRzIik7aWYoYjwwfHxiPj1nLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRhcmdldEluZGV4IG91dCBvZiBib3VuZHMiKTtpZih5K1Q+Xy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2UgaW5kaWNlcyB0byBiZSBjb3BpZWQgYXJlIG91dHNpZGUgYm91bmRzIik7aWYoYitUPmcubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0IGFycmF5IGlzIHRvbyBzbWFsbCB0byBob2xkIHJlc3VsdCIpO2ZvcihsZXQgdz0wO3c8VDt3KyspZ1tiK3ddKz1NYXRoLnBvdyhfW3krd10sMil9c3RhdGljIGF4cHkoZyxfLGIseSxULHcpe2lmKHk8MHx8eT49Xy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2VJbmRleCBvdXQgb2YgYm91bmRzIik7aWYoYjwwfHxiPj1nLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRhcmdldEluZGV4IG91dCBvZiBib3VuZHMiKTtpZih5K1Q+Xy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2UgaW5kaWNlcyB0byBiZSBjb3BpZWQgYXJlIG91dHNpZGUgYm91bmRzIik7aWYoYitUPmcubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0IGFycmF5IGlzIHRvbyBzbWFsbCB0byBob2xkIHJlc3VsdCIpO2ZvcihsZXQgeD0wO3g8VDt4KyspZ1tiK3hdKz13Kl9beSt4XX1zdGF0aWMgcG93eChnLF8sYix5LFQsdyl7aWYoeTwwfHx5Pj1fLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZUluZGV4IG91dCBvZiBib3VuZHMiKTtpZihiPDB8fGI+PWcubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0SW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKHkrVD5fLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZSBpbmRpY2VzIHRvIGJlIGNvcGllZCBhcmUgb3V0c2lkZSBib3VuZHMiKTtpZihiK1Q+Zy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQgYXJyYXkgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVzdWx0Iik7Zm9yKGxldCB4PTA7eDxUO3grKylnW2IreF09TWF0aC5wb3coX1t5K3hdLHcpfXN0YXRpYyBtdWwoZyxfLGIseSxUKXtpZih5PDB8fHk+PV8ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic291cmNlSW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKGI8MHx8Yj49Zy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXRJbmRleCBvdXQgb2YgYm91bmRzIik7aWYoeStUPl8ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic291cmNlIGluZGljZXMgdG8gYmUgY29waWVkIGFyZSBvdXRzaWRlIGJvdW5kcyIpO2lmKGIrVD5nLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRhcmdldCBhcnJheSBpcyB0b28gc21hbGwgdG8gaG9sZCByZXN1bHQiKTtmb3IobGV0IHc9MDt3PFQ7dysrKWdbYit3XT1fW3krd10qZ1tiK3ddfX07Y2xhc3MgaXtzdGF0aWMgc3BsaXRTaGFwZShfLGIseSxUKXtpZih5Lmxlbmd0aD09PTApe2lmKCFUKXRocm93IG5ldyBFcnJvcigibmVlZCB0byBrbm93IG51bWJlciBvZiBvdXRwdXRzIHdoZW4gdGhlICdzcGxpdCcgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQiKTtpLmRldGVybWluZVNwbGl0KF9bYl0sVCx5KX1jb25zdCB3PVtdLHg9WzBdO2ZvcihsZXQgRT0wO0U8eS5sZW5ndGg7KytFKXtFIT09MCYmeC5wdXNoKHhbRS0xXSt5W0UtMV0pO2NvbnN0IFA9Xy5zbGljZSgpO1BbYl09eVtFXSx3LnB1c2goUCl9cmV0dXJuW3cseF19c3RhdGljIGRldGVybWluZVNwbGl0KF8sYix5KXtpZihfJWIhPTApdGhyb3cgbmV3IEVycm9yKCJjYW5ub3Qgc3BsaXQgdGVuc29yIHRvIGVxdWFsIHNpemVkIHBhcnRzIik7Zm9yKGxldCBUPTA7VDxiOysrVCl5LnB1c2goXy9iKX19dC5TcGxpdFV0aWw9aTtjbGFzcyBze3N0YXRpYyBjYWxjUmVkdWNlKF8sYix5LFQsdyl7Y29uc3QgeD1fLmRpbXMuc2xpY2UoMCk7Yi5sZW5ndGg9PT0wJiZ4LmZvckVhY2goKEIsTik9PmIucHVzaChOKSk7Y29uc3QgRT1zLmNhbGNSZWR1Y2VTaGFwZSh4LGIsITApLFA9ZS5zaXplKEUpLHY9bmV3IHAuVGVuc29yKEUsXy50eXBlKSxNPWUuY29tcHV0ZVN0cmlkZXMoRSksJD1lLmNvbXB1dGVTdHJpZGVzKHgpLHo9bmV3IEFycmF5KHgubGVuZ3RoKTtmb3IobGV0IEI9MDtCPFA7QisrKXtjb25zdCBOPWUub2Zmc2V0VG9JbmRpY2VzKEIsTSk7ZC5maWxsSW5kZXgoTix4LHopLHYuc2V0KE4scy5jYWxjUmVkdWNlQnlBeGlzKF8ubnVtYmVyRGF0YSxiLHgsMCxlLmluZGljZXNUb09mZnNldCh6LCQpLFQsdykpfXJldHVybiB5P3Y6bmV3IHAuVGVuc29yKHMuY2FsY1JlZHVjZVNoYXBlKHgsYix5KSx2LnR5cGUsdm9pZCAwLHZvaWQgMCx2LmRhdGEsdi5kYXRhSWQpfXN0YXRpYyBjYWxjUmVkdWNlQnlBeGlzKF8sYix5LFQsdyx4LEUpe2xldCBQPTA7aWYoVD49Yi5sZW5ndGgpcmV0dXJuIHgoX1t3XSk7Y29uc3Qgdj1iW1RdLE09dj49eS5sZW5ndGg/MTplLnNpemUoeS5zbGljZSh2KzEpKTtmb3IobGV0ICQ9MDskPHlbdl07JCsrKVA9JD09PTA/cy5jYWxjUmVkdWNlQnlBeGlzKF8sYix5LFQrMSx3LHgsRSk6RShQLHMuY2FsY1JlZHVjZUJ5QXhpcyhfLGIseSxUKzEsdyx4LEUpKSx3Kz1NO3JldHVybiBQfXN0YXRpYyBjYWxjUmVkdWNlU2hhcGUoXyxiLHkpe2NvbnN0IFQ9Xy5zbGljZSgpO2ZvcihsZXQgdz0wO3c8Yi5sZW5ndGg7dysrKVRbYlt3XV09eT8xOjA7cmV0dXJuIFQuZmlsdGVyKHc9PnchPT0wKX19dC5SZWR1Y2VVdGlsPXM7Y2xhc3MgbXtzdGF0aWMgYWRqdXN0UG9vbEF0dHJpYnV0ZXMoXyxiLHksVCx3LHgpe2lmKCFfJiZ5Lmxlbmd0aCE9PWIubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJsZW5ndGggb2Ygc3BlY2lmaWVkIGtlcm5lbCBzaGFwZXMgc2hvdWxkIGJlIDIgbGVzcyB0aGFuIGxlbmd0aCBvZiBpbnB1dCBkaW1lbnNpb25zIik7aWYoXylmb3IobGV0IEU9MDtFPGIubGVuZ3RoLTI7RSsrKUU+PXkubGVuZ3RoP3kucHVzaChiW0UrMl0pOnlbRV09YltFKzJdO2ZvcihsZXQgRT0wO0U8eS5sZW5ndGg7RSsrKWlmKEU8VC5sZW5ndGgpe2lmKFRbRV08MCl0aHJvdyBuZXcgRXJyb3IoInN0cmlkZXMgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIil9ZWxzZSBULnB1c2goMSk7Zm9yKGxldCBFPTA7RTx5Lmxlbmd0aDtFKyspaWYoRTx3Lmxlbmd0aCl7aWYod1tFXTwwKXRocm93IG5ldyBFcnJvcigiZGlsYXRpb25zIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSIpfWVsc2Ugdy5wdXNoKDEpO2ZvcihsZXQgRT0wO0U8Mip5Lmxlbmd0aDtFKyspaWYoRTx4Lmxlbmd0aCl7aWYoeFtFXTwwKXRocm93IG5ldyBFcnJvcigicGFkIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSIpfWVsc2UgeC5wdXNoKDApO2ZvcihsZXQgRT0wO0U8eS5sZW5ndGg7RSsrKXtpZih5W0VdPD0wKXRocm93IG5ldyBFcnJvcigia2VybmVsIHNoYXBlcyBuZWVkIHRvIGJlIGdyZWF0ZXIgdGhhbiAwIik7aWYoeFtFXT49eVtFXXx8eFtFK3kubGVuZ3RoXT49eVtFXSl0aHJvdyBuZXcgRXJyb3IoInBhZHMgc2hvdWxkIGJlIHNtYWxsZXIgdGhhbiBrZXJuZWwiKX19c3RhdGljIGFkanVzdFBhZHNCYXNlZE9uQXV0b1BhZChfLGIseSxULHcseCl7aWYoeCl7aWYody5sZW5ndGghPT0yKihfLmxlbmd0aC0yKSl0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBvZiBwYWRzIHNob3VsZCBiZSB0d2ljZSB0aGUgbGVuZ3RoIG9mIGRhdGEgZGltZW5zaW9ucyIpO2lmKGIubGVuZ3RoIT09Xy5sZW5ndGgtMil0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBvZiBzdHJpZGVzIHNob3VsZCBiZSB0aGUgbGVuZ3RoIG9mIGRhdGEgZGltZW5zaW9ucyIpO2lmKFQubGVuZ3RoIT09Xy5sZW5ndGgtMil0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBvZiBrZXJuZWwgc2hhcGVzIHNob3VsZCBiZSB0aGUgbGVuZ3RoIG9mIGRhdGEgZGltZW5zaW9ucyIpO2ZvcihsZXQgRT0wO0U8Xy5sZW5ndGgtMjtFKyspbS5hZGp1c3RQYWRBbmRSZXR1cm5TaGFwZShfW0UrMl0sYltFXSx5W0VdLFRbRV0sdyxFLEUrXy5sZW5ndGgtMix4KX19c3RhdGljIGNvbXB1dGVQb29sT3V0cHV0U2hhcGUoXyxiLHksVCx3LHgsRSl7aWYoYi5sZW5ndGg8PTApdGhyb3cgbmV3IEVycm9yKCJpbnB1dCBzaGFwZSBtdXN0IGJlIG9mIHNpemUgZ3JlYXRlciB0aGFuIDAiKTtjb25zdCBQPVtiWzBdLGJbMV1dO3JldHVybiBtLmNvbXB1dGVTaGFwZUhlbHBlcihfLGIsUCx5LFQsdyx4LEUpLFB9c3RhdGljIGNvbXB1dGVDb252T3V0cHV0U2hhcGUoXyxiLHksVCx3LHgsRSl7aWYoXy5sZW5ndGg8PTB8fGIubGVuZ3RoPD0wKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCB0ZW5zb3IgZGltcyBvciBpbnZhbGlkIGZpbHRlciB0ZW5zb3IgZGltcyIpO2NvbnN0IFA9W19bMF0sYlswXV07cmV0dXJuIG0uY29tcHV0ZVNoYXBlSGVscGVyKCExLF8sUCx5LFQsdyx4LEUpLFB9c3RhdGljIGNvbXB1dGVTaGFwZUhlbHBlcihfLGIseSxULHcseCxFLFApe2lmKF8pZm9yKGxldCB2PTA7djxiLmxlbmd0aC0yO3YrKyl5LnB1c2goMSk7ZWxzZSBmb3IobGV0IHY9MDt2PGIubGVuZ3RoLTI7disrKXkucHVzaChtLmFkanVzdFBhZEFuZFJldHVyblNoYXBlKGJbdisyXSxUW3ZdLHdbdl0seFt2XSxFLHYsditiLmxlbmd0aC0yLFApKX1zdGF0aWMgYWRqdXN0UGFkQW5kUmV0dXJuU2hhcGUoXyxiLHksVCx3LHgsRSxQKXtjb25zdCB2PXkqKFQtMSkrMTtpZighUHx8UD09PSJOT1RTRVQiKXJldHVybiBNYXRoLmZsb29yKChfK3dbeF0rd1tFXS12KS9iKzEpO3N3aXRjaChQKXtjYXNlIlZBTElEIjpyZXR1cm4gd1t4XT0wLHdbRV09MCxNYXRoLmZsb29yKChfLXYpL2IrMSk7Y2FzZSJTQU1FX0xPV0VSIjpjYXNlIlNBTUVfVVBQRVIiOmlmKHkhPT0xKXRocm93IG5ldyBFcnJvcigiRGlsYXRpb24gbm90IHN1cHBvcnRlZCBmb3IgU0FNRV9VUFBFUiBvciBTQU1FX0xPV0VSIik7e2NvbnN0IE09KChfK2ItMSkvYi0xKSpiK1QtXztyZXR1cm4gd1t4XT1NYXRoLmZsb29yKFA9PT0iU0FNRV9MT1dFUiI/KE0rMSkvMjpNLzIpLHdbRV09TS13W3hdLE1hdGguZmxvb3IoKF8rTS1UKS9iKzEpfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBBdXRvUGFkIHR5cGUiKX19fXQuUG9vbENvbnZVdGlsPW0sdC5NSU5fQ0xJUD0tMzQwMjgyMzQ2NjM4NTI4ODZlMjIsdC5NQVhfQ0xJUD0zNDAyODIzNDY2Mzg1Mjg4NmUyMix0LmRlY29kZVV0ZjhTdHJpbmc9ZnVuY3Rpb24oZyl7cmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShnKX19LDc5Njc6KGMsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5pdGVyYXRlRXh0cmFPcHRpb25zPXZvaWQgMCx0Lml0ZXJhdGVFeHRyYU9wdGlvbnM9KHIsbyx1LGgpPT57aWYodHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCl7aWYodS5oYXMocikpdGhyb3cgbmV3IEVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgaW4gb3B0aW9ucyIpO3UuYWRkKHIpfU9iamVjdC5lbnRyaWVzKHIpLmZvckVhY2goKFthLHBdKT0+e2NvbnN0IGY9bz9vK2E6YTtpZih0eXBlb2YgcD09Im9iamVjdCIpKDAsdC5pdGVyYXRlRXh0cmFPcHRpb25zKShwLGYrIi4iLHUsaCk7ZWxzZSBpZih0eXBlb2YgcD09InN0cmluZyJ8fHR5cGVvZiBwPT0ibnVtYmVyIiloKGYscC50b1N0cmluZygpKTtlbHNle2lmKHR5cGVvZiBwIT0iYm9vbGVhbiIpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCBoYW5kbGUgZXh0cmEgY29uZmlnIHR5cGU6ICIrdHlwZW9mIHApO2goZixwPyIxIjoiMCIpfX0pfX0sMjE1NzpmdW5jdGlvbihjLHQscil7dmFyIG8sdT10aGlzJiZ0aGlzLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oTSwkLHosQil7Qj09PXZvaWQgMCYmKEI9eik7dmFyIE49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcigkLHopO04mJiEoImdldCJpbiBOPyEkLl9fZXNNb2R1bGU6Ti53cml0YWJsZXx8Ti5jb25maWd1cmFibGUpfHwoTj17ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gJFt6XX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTSxCLE4pfTpmdW5jdGlvbihNLCQseixCKXtCPT09dm9pZCAwJiYoQj16KSxNW0JdPSRbel19KSxoPXRoaXMmJnRoaXMuX19zZXRNb2R1bGVEZWZhdWx0fHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihNLCQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShNLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTokfSl9OmZ1bmN0aW9uKE0sJCl7TS5kZWZhdWx0PSR9KSxhPXRoaXMmJnRoaXMuX19pbXBvcnRTdGFyfHxmdW5jdGlvbihNKXtpZihNJiZNLl9fZXNNb2R1bGUpcmV0dXJuIE07dmFyICQ9e307aWYoTSE9bnVsbClmb3IodmFyIHogaW4gTSl6IT09ImRlZmF1bHQiJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoTSx6KSYmdSgkLE0seik7cmV0dXJuIGgoJCxNKSwkfTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5lbmRQcm9maWxpbmc9dC5ydW49dC5yZWxlYXNlU2Vzc2lvbj10LmNyZWF0ZVNlc3Npb249dC5jcmVhdGVTZXNzaW9uRmluYWxpemU9dC5jcmVhdGVTZXNzaW9uQWxsb2NhdGU9dC5pbml0T3J0PXQuaW5pdFdhc209dm9pZCAwO2NvbnN0IHA9cigxNjcwKSxmPWEocigzNDkpKSxkPXIoNjM2MSksbD0oKT0+ISFwLmVudi53YXNtLnByb3h5JiZ0eXBlb2YgZG9jdW1lbnQ8InUiO2xldCBuLGUsaSxzPSExLG09ITEsZz0hMTtjb25zdCBfPVtdLGI9W10seT1bXSxUPVtdLHc9W10seD1bXSxFPSgpPT57aWYoc3x8IW18fGd8fCFuKXRocm93IG5ldyBFcnJvcigid29ya2VyIG5vdCByZWFkeSIpfSxQPU09Pntzd2l0Y2goTS5kYXRhLnR5cGUpe2Nhc2UiaW5pdC13YXNtIjpzPSExLE0uZGF0YS5lcnI/KGc9ITAsZVsxXShNLmRhdGEuZXJyKSk6KG09ITAsZVswXSgpKTticmVhaztjYXNlImluaXQtb3J0IjpNLmRhdGEuZXJyP2lbMV0oTS5kYXRhLmVycik6aVswXSgpO2JyZWFrO2Nhc2UiY3JlYXRlX2FsbG9jYXRlIjpNLmRhdGEuZXJyP18uc2hpZnQoKVsxXShNLmRhdGEuZXJyKTpfLnNoaWZ0KClbMF0oTS5kYXRhLm91dCk7YnJlYWs7Y2FzZSJjcmVhdGVfZmluYWxpemUiOk0uZGF0YS5lcnI/Yi5zaGlmdCgpWzFdKE0uZGF0YS5lcnIpOmIuc2hpZnQoKVswXShNLmRhdGEub3V0KTticmVhaztjYXNlImNyZWF0ZSI6TS5kYXRhLmVycj95LnNoaWZ0KClbMV0oTS5kYXRhLmVycik6eS5zaGlmdCgpWzBdKE0uZGF0YS5vdXQpO2JyZWFrO2Nhc2UicmVsZWFzZSI6TS5kYXRhLmVycj9ULnNoaWZ0KClbMV0oTS5kYXRhLmVycik6VC5zaGlmdCgpWzBdKCk7YnJlYWs7Y2FzZSJydW4iOk0uZGF0YS5lcnI/dy5zaGlmdCgpWzFdKE0uZGF0YS5lcnIpOncuc2hpZnQoKVswXShNLmRhdGEub3V0KTticmVhaztjYXNlImVuZC1wcm9maWxpbmciOk0uZGF0YS5lcnI/eC5zaGlmdCgpWzFdKE0uZGF0YS5lcnIpOnguc2hpZnQoKVswXSgpfX0sdj10eXBlb2YgZG9jdW1lbnQ8InUiPyhvPWRvY3VtZW50PT1udWxsP3ZvaWQgMDpkb2N1bWVudC5jdXJyZW50U2NyaXB0KT09PW51bGx8fG89PT12b2lkIDA/dm9pZCAwOm8uc3JjOnZvaWQgMDt0LmluaXRXYXNtPWFzeW5jKCk9PntpZihsKCkpe2lmKG0pcmV0dXJuO2lmKHMpdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSBjYWxscyB0byAnaW5pdFdhc20oKScgZGV0ZWN0ZWQuIik7aWYoZyl0aHJvdyBuZXcgRXJyb3IoInByZXZpb3VzIGNhbGwgdG8gJ2luaXRXYXNtKCknIGZhaWxlZC4iKTtyZXR1cm4gcz0hMCxwLmVudi53YXNtLndhc21QYXRocz09PXZvaWQgMCYmdiYmdi5pbmRleE9mKCJibG9iOiIpIT09MCYmKHAuZW52Lndhc20ud2FzbVBhdGhzPXYuc3Vic3RyKDAsK3YubGFzdEluZGV4T2YoIi8iKSsxKSksbmV3IFByb21pc2UoKE0sJCk9PntuPT1udWxsfHxuLnRlcm1pbmF0ZSgpLG49cig5NzEwKS5aKCksbi5vbm1lc3NhZ2U9UCxlPVtNLCRdO2NvbnN0IHo9e3R5cGU6ImluaXQtd2FzbSIsaW46cC5lbnYud2FzbX07bi5wb3N0TWVzc2FnZSh6KX0pfXJldHVybigwLGQuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KShwLmVudi53YXNtKX0sdC5pbml0T3J0PWFzeW5jKE0sJCk9PntpZihsKCkpcmV0dXJuIEUoKSxuZXcgUHJvbWlzZSgoeixCKT0+e2k9W3osQl07Y29uc3QgTj17dHlwZToiaW5pdC1vcnQiLGluOntudW1UaHJlYWRzOk0sbG9nZ2luZ0xldmVsOiR9fTtuLnBvc3RNZXNzYWdlKE4pfSk7Zi5pbml0T3J0KE0sJCl9LHQuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlPWFzeW5jIE09PmwoKT8oRSgpLG5ldyBQcm9taXNlKCgkLHopPT57Xy5wdXNoKFskLHpdKTtjb25zdCBCPXt0eXBlOiJjcmVhdGVfYWxsb2NhdGUiLGluOnttb2RlbDpNfX07bi5wb3N0TWVzc2FnZShCLFtNLmJ1ZmZlcl0pfSkpOmYuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlKE0pLHQuY3JlYXRlU2Vzc2lvbkZpbmFsaXplPWFzeW5jKE0sJCk9PmwoKT8oRSgpLG5ldyBQcm9taXNlKCh6LEIpPT57Yi5wdXNoKFt6LEJdKTtjb25zdCBOPXt0eXBlOiJjcmVhdGVfZmluYWxpemUiLGluOnttb2RlbGRhdGE6TSxvcHRpb25zOiR9fTtuLnBvc3RNZXNzYWdlKE4pfSkpOmYuY3JlYXRlU2Vzc2lvbkZpbmFsaXplKE0sJCksdC5jcmVhdGVTZXNzaW9uPWFzeW5jKE0sJCk9PmwoKT8oRSgpLG5ldyBQcm9taXNlKCh6LEIpPT57eS5wdXNoKFt6LEJdKTtjb25zdCBOPXt0eXBlOiJjcmVhdGUiLGluOnttb2RlbDpNLG9wdGlvbnM6JH19O24ucG9zdE1lc3NhZ2UoTixbTS5idWZmZXJdKX0pKTpmLmNyZWF0ZVNlc3Npb24oTSwkKSx0LnJlbGVhc2VTZXNzaW9uPWFzeW5jIE09PntpZihsKCkpcmV0dXJuIEUoKSxuZXcgUHJvbWlzZSgoJCx6KT0+e1QucHVzaChbJCx6XSk7Y29uc3QgQj17dHlwZToicmVsZWFzZSIsaW46TX07bi5wb3N0TWVzc2FnZShCKX0pO2YucmVsZWFzZVNlc3Npb24oTSl9LHQucnVuPWFzeW5jKE0sJCx6LEIsTik9PmwoKT8oRSgpLG5ldyBQcm9taXNlKChELEkpPT57dy5wdXNoKFtELEldKTtjb25zdCBGPXt0eXBlOiJydW4iLGluOntzZXNzaW9uSWQ6TSxpbnB1dEluZGljZXM6JCxpbnB1dHM6eixvdXRwdXRJbmRpY2VzOkIsb3B0aW9uczpOfX07bi5wb3N0TWVzc2FnZShGLGYuZXh0cmFjdFRyYW5zZmVyYWJsZUJ1ZmZlcnMoeikpfSkpOmYucnVuKE0sJCx6LEIsTiksdC5lbmRQcm9maWxpbmc9YXN5bmMgTT0+e2lmKGwoKSlyZXR1cm4gRSgpLG5ldyBQcm9taXNlKCgkLHopPT57eC5wdXNoKFskLHpdKTtjb25zdCBCPXt0eXBlOiJlbmQtcHJvZmlsaW5nIixpbjpNfTtuLnBvc3RNZXNzYWdlKEIpfSk7Zi5lbmRQcm9maWxpbmcoTSl9fSw1ODY6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNldFJ1bk9wdGlvbnM9dm9pZCAwO2NvbnN0IG89cig3OTY3KSx1PXIoNDk4MyksaD1yKDYzNjEpO3Quc2V0UnVuT3B0aW9ucz1hPT57Y29uc3QgcD0oMCxoLmdldEluc3RhbmNlKSgpO2xldCBmPTA7Y29uc3QgZD1bXSxsPWF8fHt9O3RyeXtpZigoYT09bnVsbD92b2lkIDA6YS5sb2dTZXZlcml0eUxldmVsKT09PXZvaWQgMClsLmxvZ1NldmVyaXR5TGV2ZWw9MjtlbHNlIGlmKHR5cGVvZiBhLmxvZ1NldmVyaXR5TGV2ZWwhPSJudW1iZXIifHwhTnVtYmVyLmlzSW50ZWdlcihhLmxvZ1NldmVyaXR5TGV2ZWwpfHxhLmxvZ1NldmVyaXR5TGV2ZWw8MHx8YS5sb2dTZXZlcml0eUxldmVsPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHthLmxvZ1NldmVyaXR5TGV2ZWx9YCk7aWYoKGE9PW51bGw/dm9pZCAwOmEubG9nVmVyYm9zaXR5TGV2ZWwpPT09dm9pZCAwKWwubG9nVmVyYm9zaXR5TGV2ZWw9MDtlbHNlIGlmKHR5cGVvZiBhLmxvZ1ZlcmJvc2l0eUxldmVsIT0ibnVtYmVyInx8IU51bWJlci5pc0ludGVnZXIoYS5sb2dWZXJib3NpdHlMZXZlbCkpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHthLmxvZ1ZlcmJvc2l0eUxldmVsfWApOyhhPT1udWxsP3ZvaWQgMDphLnRlcm1pbmF0ZSk9PT12b2lkIDAmJihsLnRlcm1pbmF0ZT0hMSk7bGV0IG49MDtpZigoYT09bnVsbD92b2lkIDA6YS50YWcpIT09dm9pZCAwJiYobj0oMCx1LmFsbG9jV2FzbVN0cmluZykoYS50YWcsZCkpLGY9cC5fT3J0Q3JlYXRlUnVuT3B0aW9ucyhsLmxvZ1NldmVyaXR5TGV2ZWwsbC5sb2dWZXJib3NpdHlMZXZlbCwhIWwudGVybWluYXRlLG4pLGY9PT0wKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgY3JlYXRlIHJ1biBvcHRpb25zIik7cmV0dXJuKGE9PW51bGw/dm9pZCAwOmEuZXh0cmEpIT09dm9pZCAwJiYoMCxvLml0ZXJhdGVFeHRyYU9wdGlvbnMpKGEuZXh0cmEsIiIsbmV3IFdlYWtTZXQsKGUsaSk9Pntjb25zdCBzPSgwLHUuYWxsb2NXYXNtU3RyaW5nKShlLGQpLG09KDAsdS5hbGxvY1dhc21TdHJpbmcpKGksZCk7aWYocC5fT3J0QWRkUnVuQ29uZmlnRW50cnkoZixzLG0pIT09MCl0aHJvdyBuZXcgRXJyb3IoYENhbid0IHNldCBhIHJ1biBjb25maWcgZW50cnk6ICR7ZX0gLSAke2l9YCl9KSxbZixkXX1jYXRjaChuKXt0aHJvdyBmIT09MCYmcC5fT3J0UmVsZWFzZVJ1bk9wdGlvbnMoZiksZC5mb3JFYWNoKHAuX2ZyZWUpLG59fX0sMjMwNjooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuT25ueHJ1bnRpbWVXZWJBc3NlbWJseVNlc3Npb25IYW5kbGVyPXZvaWQgMDtjb25zdCBvPXIoMjgwNiksdT1yKDE2NzApLGg9cigyODUwKSxhPXIoMjE1Nyk7bGV0IHA7dC5Pbm54cnVudGltZVdlYkFzc2VtYmx5U2Vzc2lvbkhhbmRsZXI9Y2xhc3N7YXN5bmMgY3JlYXRlU2Vzc2lvbkFsbG9jYXRlKGYpe2NvbnN0IGQ9YXdhaXQgZmV0Y2goZiksbD1hd2FpdCBkLmFycmF5QnVmZmVyKCk7cmV0dXJuKDAsYS5jcmVhdGVTZXNzaW9uQWxsb2NhdGUpKG5ldyBVaW50OEFycmF5KGwpKX1hc3luYyBsb2FkTW9kZWwoZixkKXtpZihwfHwoYXdhaXQoMCxhLmluaXRPcnQpKHUuZW52Lndhc20ubnVtVGhyZWFkcywobD0+e3N3aXRjaChsKXtjYXNlInZlcmJvc2UiOnJldHVybiAwO2Nhc2UiaW5mbyI6cmV0dXJuIDE7Y2FzZSJ3YXJuaW5nIjpyZXR1cm4gMjtjYXNlImVycm9yIjpyZXR1cm4gMztjYXNlImZhdGFsIjpyZXR1cm4gNDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgbG9nZ2luZyBsZXZlbDogJHtsfWApfX0pKHUuZW52LmxvZ0xldmVsKSkscD0hMCksdHlwZW9mIGY9PSJzdHJpbmciKWlmKHR5cGVvZiBmZXRjaD4idSIpe2NvbnN0IGw9YXdhaXQoMCxoLnByb21pc2lmeSkoby5yZWFkRmlsZSkoZik7W3RoaXMuc2Vzc2lvbklkLHRoaXMuaW5wdXROYW1lcyx0aGlzLm91dHB1dE5hbWVzXT1hd2FpdCgwLGEuY3JlYXRlU2Vzc2lvbikobCxkKX1lbHNle2NvbnN0IGw9YXdhaXQgdGhpcy5jcmVhdGVTZXNzaW9uQWxsb2NhdGUoZik7W3RoaXMuc2Vzc2lvbklkLHRoaXMuaW5wdXROYW1lcyx0aGlzLm91dHB1dE5hbWVzXT1hd2FpdCgwLGEuY3JlYXRlU2Vzc2lvbkZpbmFsaXplKShsLGQpfWVsc2VbdGhpcy5zZXNzaW9uSWQsdGhpcy5pbnB1dE5hbWVzLHRoaXMub3V0cHV0TmFtZXNdPWF3YWl0KDAsYS5jcmVhdGVTZXNzaW9uKShmLGQpfWFzeW5jIGRpc3Bvc2UoKXtyZXR1cm4oMCxhLnJlbGVhc2VTZXNzaW9uKSh0aGlzLnNlc3Npb25JZCl9YXN5bmMgcnVuKGYsZCxsKXtjb25zdCBuPVtdLGU9W107T2JqZWN0LmVudHJpZXMoZikuZm9yRWFjaChnPT57Y29uc3QgXz1nWzBdLGI9Z1sxXSx5PXRoaXMuaW5wdXROYW1lcy5pbmRleE9mKF8pO2lmKHk9PT0tMSl0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW5wdXQgJyR7X30nYCk7bi5wdXNoKGIpLGUucHVzaCh5KX0pO2NvbnN0IGk9W107T2JqZWN0LmVudHJpZXMoZCkuZm9yRWFjaChnPT57Y29uc3QgXz1nWzBdLGI9dGhpcy5vdXRwdXROYW1lcy5pbmRleE9mKF8pO2lmKGI9PT0tMSl0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3V0cHV0ICcke199J2ApO2kucHVzaChiKX0pO2NvbnN0IHM9YXdhaXQoMCxhLnJ1bikodGhpcy5zZXNzaW9uSWQsZSxuLm1hcChnPT5bZy50eXBlLGcuZGltcyxnLmRhdGFdKSxpLGwpLG09e307Zm9yKGxldCBnPTA7ZzxzLmxlbmd0aDtnKyspbVt0aGlzLm91dHB1dE5hbWVzW2lbZ11dXT1uZXcgdS5UZW5zb3Ioc1tnXVswXSxzW2ddWzJdLHNbZ11bMV0pO3JldHVybiBtfXN0YXJ0UHJvZmlsaW5nKCl7fWVuZFByb2ZpbGluZygpeygwLGEuZW5kUHJvZmlsaW5nKSh0aGlzLnNlc3Npb25JZCl9fX0sNDkxOTooYyx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuc2V0U2Vzc2lvbk9wdGlvbnM9dm9pZCAwO2NvbnN0IG89cig3OTY3KSx1PXIoNDk4MyksaD1yKDYzNjEpO3Quc2V0U2Vzc2lvbk9wdGlvbnM9YT0+e2NvbnN0IHA9KDAsaC5nZXRJbnN0YW5jZSkoKTtsZXQgZj0wO2NvbnN0IGQ9W10sbD1hfHx7fTsobj0+e24uZXh0cmF8fChuLmV4dHJhPXt9KSxuLmV4dHJhLnNlc3Npb258fChuLmV4dHJhLnNlc3Npb249e30pO2NvbnN0IGU9bi5leHRyYS5zZXNzaW9uO2UudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseXx8KGUudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseT0iMSIpfSkobCk7dHJ5eyhhPT1udWxsP3ZvaWQgMDphLmdyYXBoT3B0aW1pemF0aW9uTGV2ZWwpPT09dm9pZCAwJiYobC5ncmFwaE9wdGltaXphdGlvbkxldmVsPSJhbGwiKTtjb25zdCBuPShzPT57c3dpdGNoKHMpe2Nhc2UiZGlzYWJsZWQiOnJldHVybiAwO2Nhc2UiYmFzaWMiOnJldHVybiAxO2Nhc2UiZXh0ZW5kZWQiOnJldHVybiAyO2Nhc2UiYWxsIjpyZXR1cm4gOTk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGdyYXBoIG9wdGltaXphdGlvbiBsZXZlbDogJHtzfWApfX0pKGwuZ3JhcGhPcHRpbWl6YXRpb25MZXZlbCk7KGE9PW51bGw/dm9pZCAwOmEuZW5hYmxlQ3B1TWVtQXJlbmEpPT09dm9pZCAwJiYobC5lbmFibGVDcHVNZW1BcmVuYT0hMCksKGE9PW51bGw/dm9pZCAwOmEuZW5hYmxlTWVtUGF0dGVybik9PT12b2lkIDAmJihsLmVuYWJsZU1lbVBhdHRlcm49ITApLChhPT1udWxsP3ZvaWQgMDphLmV4ZWN1dGlvbk1vZGUpPT09dm9pZCAwJiYobC5leGVjdXRpb25Nb2RlPSJzZXF1ZW50aWFsIik7Y29uc3QgZT0ocz0+e3N3aXRjaChzKXtjYXNlInNlcXVlbnRpYWwiOnJldHVybiAwO2Nhc2UicGFyYWxsZWwiOnJldHVybiAxO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBleGVjdXRpb24gbW9kZTogJHtzfWApfX0pKGwuZXhlY3V0aW9uTW9kZSk7bGV0IGk9MDtpZigoYT09bnVsbD92b2lkIDA6YS5sb2dJZCkhPT12b2lkIDAmJihpPSgwLHUuYWxsb2NXYXNtU3RyaW5nKShhLmxvZ0lkLGQpKSwoYT09bnVsbD92b2lkIDA6YS5sb2dTZXZlcml0eUxldmVsKT09PXZvaWQgMClsLmxvZ1NldmVyaXR5TGV2ZWw9MjtlbHNlIGlmKHR5cGVvZiBhLmxvZ1NldmVyaXR5TGV2ZWwhPSJudW1iZXIifHwhTnVtYmVyLmlzSW50ZWdlcihhLmxvZ1NldmVyaXR5TGV2ZWwpfHxhLmxvZ1NldmVyaXR5TGV2ZWw8MHx8YS5sb2dTZXZlcml0eUxldmVsPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHthLmxvZ1NldmVyaXR5TGV2ZWx9YCk7aWYoKGE9PW51bGw/dm9pZCAwOmEubG9nVmVyYm9zaXR5TGV2ZWwpPT09dm9pZCAwKWwubG9nVmVyYm9zaXR5TGV2ZWw9MDtlbHNlIGlmKHR5cGVvZiBhLmxvZ1ZlcmJvc2l0eUxldmVsIT0ibnVtYmVyInx8IU51bWJlci5pc0ludGVnZXIoYS5sb2dWZXJib3NpdHlMZXZlbCkpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHthLmxvZ1ZlcmJvc2l0eUxldmVsfWApO2lmKChhPT1udWxsP3ZvaWQgMDphLmVuYWJsZVByb2ZpbGluZyk9PT12b2lkIDAmJihsLmVuYWJsZVByb2ZpbGluZz0hMSksZj1wLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucyhuLCEhbC5lbmFibGVDcHVNZW1BcmVuYSwhIWwuZW5hYmxlTWVtUGF0dGVybixlLCEhbC5lbmFibGVQcm9maWxpbmcsMCxpLGwubG9nU2V2ZXJpdHlMZXZlbCxsLmxvZ1ZlcmJvc2l0eUxldmVsKSxmPT09MCl0aHJvdyBuZXcgRXJyb3IoIkNhbid0IGNyZWF0ZSBzZXNzaW9uIG9wdGlvbnMiKTtyZXR1cm4gYSE9bnVsbCYmYS5leGVjdXRpb25Qcm92aWRlcnMmJigocyxtLGcpPT57Zm9yKGNvbnN0IF8gb2YgbSl7bGV0IGI9dHlwZW9mIF89PSJzdHJpbmciP186Xy5uYW1lO3N3aXRjaChiKXtjYXNlInhubnBhY2siOmI9IlhOTlBBQ0siO2JyZWFrO2Nhc2Uid2FzbSI6Y2FzZSJjcHUiOmNvbnRpbnVlO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBub3Qgc3VwcG9ydGVkIEVQOiAke2J9YCl9Y29uc3QgeT0oMCx1LmFsbG9jV2FzbVN0cmluZykoYixnKTtpZigoMCxoLmdldEluc3RhbmNlKSgpLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcihzLHkpIT09MCl0aHJvdyBuZXcgRXJyb3IoYENhbid0IGFwcGVuZCBleGVjdXRpb24gcHJvdmlkZXI6ICR7Yn1gKX19KShmLGEuZXhlY3V0aW9uUHJvdmlkZXJzLGQpLChhPT1udWxsP3ZvaWQgMDphLmV4dHJhKSE9PXZvaWQgMCYmKDAsby5pdGVyYXRlRXh0cmFPcHRpb25zKShhLmV4dHJhLCIiLG5ldyBXZWFrU2V0LChzLG0pPT57Y29uc3QgZz0oMCx1LmFsbG9jV2FzbVN0cmluZykocyxkKSxfPSgwLHUuYWxsb2NXYXNtU3RyaW5nKShtLGQpO2lmKHAuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeShmLGcsXykhPT0wKXRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICR7c30gLSAke219YCl9KSxbZixkXX1jYXRjaChuKXt0aHJvdyBmIT09MCYmcC5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zKGYpLGQuZm9yRWFjaChwLl9mcmVlKSxufX19LDQ5ODM6KGMsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmFsbG9jV2FzbVN0cmluZz12b2lkIDA7Y29uc3Qgbz1yKDYzNjEpO3QuYWxsb2NXYXNtU3RyaW5nPSh1LGgpPT57Y29uc3QgYT0oMCxvLmdldEluc3RhbmNlKSgpLHA9YS5sZW5ndGhCeXRlc1VURjgodSkrMSxmPWEuX21hbGxvYyhwKTtyZXR1cm4gYS5zdHJpbmdUb1VURjgodSxmLHApLGgucHVzaChmKSxmfX0sMzQ5OihjLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5leHRyYWN0VHJhbnNmZXJhYmxlQnVmZmVycz10LmVuZFByb2ZpbGluZz10LnJ1bj10LnJlbGVhc2VTZXNzaW9uPXQuY3JlYXRlU2Vzc2lvbj10LmNyZWF0ZVNlc3Npb25GaW5hbGl6ZT10LmNyZWF0ZVNlc3Npb25BbGxvY2F0ZT10LmluaXRPcnQ9dm9pZCAwO2NvbnN0IG89cig1ODYpLHU9cig0OTE5KSxoPXIoNDk4MyksYT1yKDYzNjEpO3QuaW5pdE9ydD0obixlKT0+e2NvbnN0IGk9KDAsYS5nZXRJbnN0YW5jZSkoKS5fT3J0SW5pdChuLGUpO2lmKGkhPT0wKXRocm93IG5ldyBFcnJvcihgQ2FuJ3QgaW5pdGlhbGl6ZSBvbm54cnVudGltZS4gZXJyb3IgY29kZSA9ICR7aX1gKX07Y29uc3QgcD1uZXcgTWFwO3QuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlPW49Pntjb25zdCBlPSgwLGEuZ2V0SW5zdGFuY2UpKCksaT1lLl9tYWxsb2Mobi5ieXRlTGVuZ3RoKTtyZXR1cm4gZS5IRUFQVTguc2V0KG4saSksW2ksbi5ieXRlTGVuZ3RoXX0sdC5jcmVhdGVTZXNzaW9uRmluYWxpemU9KG4sZSk9Pntjb25zdCBpPSgwLGEuZ2V0SW5zdGFuY2UpKCk7bGV0IHM9MCxtPTAsZz1bXTt0cnl7aWYoW20sZ109KDAsdS5zZXRTZXNzaW9uT3B0aW9ucykoZSkscz1pLl9PcnRDcmVhdGVTZXNzaW9uKG5bMF0sblsxXSxtKSxzPT09MCl0aHJvdyBuZXcgRXJyb3IoIkNhbid0IGNyZWF0ZSBhIHNlc3Npb24iKX1maW5hbGx5e2kuX2ZyZWUoblswXSksaS5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zKG0pLGcuZm9yRWFjaChpLl9mcmVlKX1jb25zdCBfPWkuX09ydEdldElucHV0Q291bnQocyksYj1pLl9PcnRHZXRPdXRwdXRDb3VudChzKSx5PVtdLFQ9W10sdz1bXSx4PVtdO2ZvcihsZXQgRT0wO0U8XztFKyspe2NvbnN0IFA9aS5fT3J0R2V0SW5wdXROYW1lKHMsRSk7aWYoUD09PTApdGhyb3cgbmV3IEVycm9yKCJDYW4ndCBnZXQgYW4gaW5wdXQgbmFtZSIpO1QucHVzaChQKSx5LnB1c2goaS5VVEY4VG9TdHJpbmcoUCkpfWZvcihsZXQgRT0wO0U8YjtFKyspe2NvbnN0IFA9aS5fT3J0R2V0T3V0cHV0TmFtZShzLEUpO2lmKFA9PT0wKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgZ2V0IGFuIG91dHB1dCBuYW1lIik7eC5wdXNoKFApLHcucHVzaChpLlVURjhUb1N0cmluZyhQKSl9cmV0dXJuIHAuc2V0KHMsW3MsVCx4XSksW3MseSx3XX0sdC5jcmVhdGVTZXNzaW9uPShuLGUpPT57Y29uc3QgaT0oMCx0LmNyZWF0ZVNlc3Npb25BbGxvY2F0ZSkobik7cmV0dXJuKDAsdC5jcmVhdGVTZXNzaW9uRmluYWxpemUpKGksZSl9LHQucmVsZWFzZVNlc3Npb249bj0+e2NvbnN0IGU9KDAsYS5nZXRJbnN0YW5jZSkoKSxpPXAuZ2V0KG4pO2lmKCFpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzZXNzaW9uIGlkIik7Y29uc3Qgcz1pWzBdLG09aVsxXSxnPWlbMl07bS5mb3JFYWNoKGUuX09ydEZyZWUpLGcuZm9yRWFjaChlLl9PcnRGcmVlKSxlLl9PcnRSZWxlYXNlU2Vzc2lvbihzKSxwLmRlbGV0ZShuKX07Y29uc3QgZj1uPT57c3dpdGNoKG4pe2Nhc2UiaW50OCI6cmV0dXJuIDM7Y2FzZSJ1aW50OCI6cmV0dXJuIDI7Y2FzZSJib29sIjpyZXR1cm4gOTtjYXNlImludDE2IjpyZXR1cm4gNTtjYXNlInVpbnQxNiI6cmV0dXJuIDQ7Y2FzZSJpbnQzMiI6cmV0dXJuIDY7Y2FzZSJ1aW50MzIiOnJldHVybiAxMjtjYXNlImZsb2F0MzIiOnJldHVybiAxO2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIDExO2Nhc2Uic3RyaW5nIjpyZXR1cm4gODtjYXNlImludDY0IjpyZXR1cm4gNztjYXNlInVpbnQ2NCI6cmV0dXJuIDEzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7bn1gKX19LGQ9bj0+e3N3aXRjaChuKXtjYXNlIDM6cmV0dXJuImludDgiO2Nhc2UgMjpyZXR1cm4idWludDgiO2Nhc2UgOTpyZXR1cm4iYm9vbCI7Y2FzZSA1OnJldHVybiJpbnQxNiI7Y2FzZSA0OnJldHVybiJ1aW50MTYiO2Nhc2UgNjpyZXR1cm4iaW50MzIiO2Nhc2UgMTI6cmV0dXJuInVpbnQzMiI7Y2FzZSAxOnJldHVybiJmbG9hdDMyIjtjYXNlIDExOnJldHVybiJmbG9hdDY0IjtjYXNlIDg6cmV0dXJuInN0cmluZyI7Y2FzZSA3OnJldHVybiJpbnQ2NCI7Y2FzZSAxMzpyZXR1cm4idWludDY0IjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke259YCl9fSxsPW49Pntzd2l0Y2gobil7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gRmxvYXQzMkFycmF5O2Nhc2UidWludDgiOmNhc2UiYm9vbCI6cmV0dXJuIFVpbnQ4QXJyYXk7Y2FzZSJpbnQ4IjpyZXR1cm4gSW50OEFycmF5O2Nhc2UidWludDE2IjpyZXR1cm4gVWludDE2QXJyYXk7Y2FzZSJpbnQxNiI6cmV0dXJuIEludDE2QXJyYXk7Y2FzZSJpbnQzMiI6cmV0dXJuIEludDMyQXJyYXk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gRmxvYXQ2NEFycmF5O2Nhc2UidWludDMyIjpyZXR1cm4gVWludDMyQXJyYXk7Y2FzZSJpbnQ2NCI6cmV0dXJuIEJpZ0ludDY0QXJyYXk7Y2FzZSJ1aW50NjQiOnJldHVybiBCaWdVaW50NjRBcnJheTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdHlwZTogJHtufWApfX07dC5ydW49KG4sZSxpLHMsbSk9Pntjb25zdCBnPSgwLGEuZ2V0SW5zdGFuY2UpKCksXz1wLmdldChuKTtpZighXyl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2Vzc2lvbiBpZCIpO2NvbnN0IGI9X1swXSx5PV9bMV0sVD1fWzJdLHc9ZS5sZW5ndGgseD1zLmxlbmd0aDtsZXQgRT0wLFA9W107Y29uc3Qgdj1bXSxNPVtdO3RyeXtbRSxQXT0oMCxvLnNldFJ1bk9wdGlvbnMpKG0pO2ZvcihsZXQgST0wO0k8dztJKyspe2NvbnN0IEY9aVtJXVswXSxYPWlbSV1bMV0sRz1pW0ldWzJdO2xldCBlZSxKO2lmKEFycmF5LmlzQXJyYXkoRykpe0o9NCpHLmxlbmd0aCxlZT1nLl9tYWxsb2MoSiksTS5wdXNoKGVlKTtsZXQgd2U9ZWUvNDtmb3IobGV0IGllPTA7aWU8Ry5sZW5ndGg7aWUrKyl7aWYodHlwZW9mIEdbaWVdIT0ic3RyaW5nIil0aHJvdyBuZXcgVHlwZUVycm9yKGB0ZW5zb3IgZGF0YSBhdCBpbmRleCAke2llfSBpcyBub3QgYSBzdHJpbmdgKTtnLkhFQVBVMzJbd2UrK109KDAsaC5hbGxvY1dhc21TdHJpbmcpKEdbaWVdLE0pfX1lbHNlIEo9Ry5ieXRlTGVuZ3RoLGVlPWcuX21hbGxvYyhKKSxNLnB1c2goZWUpLGcuSEVBUFU4LnNldChuZXcgVWludDhBcnJheShHLmJ1ZmZlcixHLmJ5dGVPZmZzZXQsSiksZWUpO2NvbnN0IGxlPWcuc3RhY2tTYXZlKCkseGU9Zy5zdGFja0FsbG9jKDQqWC5sZW5ndGgpO3RyeXtsZXQgd2U9eGUvNDtYLmZvckVhY2goVGU9PmcuSEVBUDMyW3dlKytdPVRlKTtjb25zdCBpZT1nLl9PcnRDcmVhdGVUZW5zb3IoZihGKSxlZSxKLHhlLFgubGVuZ3RoKTtpZihpZT09PTApdGhyb3cgbmV3IEVycm9yKCJDYW4ndCBjcmVhdGUgYSB0ZW5zb3IiKTt2LnB1c2goaWUpfWZpbmFsbHl7Zy5zdGFja1Jlc3RvcmUobGUpfX1jb25zdCAkPWcuc3RhY2tTYXZlKCksej1nLnN0YWNrQWxsb2MoNCp3KSxCPWcuc3RhY2tBbGxvYyg0KncpLE49Zy5zdGFja0FsbG9jKDQqeCksRD1nLnN0YWNrQWxsb2MoNCp4KTt0cnl7bGV0IEk9ei80LEY9Qi80LFg9Ti80LEc9RC80O2ZvcihsZXQgbGU9MDtsZTx3O2xlKyspZy5IRUFQVTMyW0krK109dltsZV0sZy5IRUFQVTMyW0YrK109eVtlW2xlXV07Zm9yKGxldCBsZT0wO2xlPHg7bGUrKylnLkhFQVBVMzJbWCsrXT0wLGcuSEVBUFUzMltHKytdPVRbc1tsZV1dO2xldCBlZT1nLl9PcnRSdW4oYixCLHosdyxELHgsTixFKTtjb25zdCBKPVtdO2lmKGVlPT09MClmb3IobGV0IGxlPTA7bGU8eDtsZSsrKXtjb25zdCB4ZT1nLkhFQVBVMzJbTi80K2xlXSx3ZT1nLnN0YWNrU2F2ZSgpLGllPWcuc3RhY2tBbGxvYygxNik7bGV0IFRlLGJlPTA7dHJ5e2lmKGVlPWcuX09ydEdldFRlbnNvckRhdGEoeGUsaWUsaWUrNCxpZSs4LGllKzEyKSxlZSE9PTApdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBhY2Nlc3Mgb3V0cHV0IHRlbnNvciBkYXRhLiBlcnJvciBjb2RlID0gJHtlZX1gKTtsZXQgSWU9aWUvNDtjb25zdCBMZT1nLkhFQVBVMzJbSWUrK107YmU9Zy5IRUFQVTMyW0llKytdO2NvbnN0IEVlPWcuSEVBUFUzMltJZSsrXSxrZT1nLkhFQVBVMzJbSWUrK10sRGU9W107Zm9yKGxldCBTZT0wO1NlPGtlO1NlKyspRGUucHVzaChnLkhFQVBVMzJbRWUvNCtTZV0pO2cuX09ydEZyZWUoRWUpO2NvbnN0IEFlPURlLmxlbmd0aD09PTA/MTpEZS5yZWR1Y2UoKFNlLEJlKT0+U2UqQmUpO2lmKFRlPWQoTGUpLFRlPT09InN0cmluZyIpe2NvbnN0IFNlPVtdO2xldCBCZT1iZS80O2ZvcihsZXQgemU9MDt6ZTxBZTt6ZSsrKXtjb25zdCBqZT1nLkhFQVBVMzJbQmUrK10sWWU9emU9PT1BZS0xP3ZvaWQgMDpnLkhFQVBVMzJbQmVdLWplO1NlLnB1c2goZy5VVEY4VG9TdHJpbmcoamUsWWUpKX1KLnB1c2goW1RlLERlLFNlXSl9ZWxzZXtjb25zdCBTZT1uZXcobChUZSkpKEFlKTtuZXcgVWludDhBcnJheShTZS5idWZmZXIsU2UuYnl0ZU9mZnNldCxTZS5ieXRlTGVuZ3RoKS5zZXQoZy5IRUFQVTguc3ViYXJyYXkoYmUsYmUrU2UuYnl0ZUxlbmd0aCkpLEoucHVzaChbVGUsRGUsU2VdKX19ZmluYWxseXtnLnN0YWNrUmVzdG9yZSh3ZSksVGU9PT0ic3RyaW5nIiYmYmUmJmcuX2ZyZWUoYmUpLGcuX09ydFJlbGVhc2VUZW5zb3IoeGUpfX1pZihlZT09PTApcmV0dXJuIEo7dGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gY2FsbCBPcnRSdW4oKS4gZXJyb3IgY29kZSA9ICR7ZWV9LmApfWZpbmFsbHl7Zy5zdGFja1Jlc3RvcmUoJCl9fWZpbmFsbHl7di5mb3JFYWNoKGcuX09ydFJlbGVhc2VUZW5zb3IpLE0uZm9yRWFjaChnLl9mcmVlKSxnLl9PcnRSZWxlYXNlUnVuT3B0aW9ucyhFKSxQLmZvckVhY2goZy5fZnJlZSl9fSx0LmVuZFByb2ZpbGluZz1uPT57Y29uc3QgZT0oMCxhLmdldEluc3RhbmNlKSgpLGk9cC5nZXQobik7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNlc3Npb24gaWQiKTtjb25zdCBzPWlbMF0sbT1lLl9PcnRFbmRQcm9maWxpbmcocyk7aWYobT09PTApdGhyb3cgbmV3IEVycm9yKCJDYW4ndCBnZXQgYW4gcHJvZmlsZSBmaWxlIG5hbWUiKTtlLl9PcnRGcmVlKG0pfSx0LmV4dHJhY3RUcmFuc2ZlcmFibGVCdWZmZXJzPW49Pntjb25zdCBlPVtdO2Zvcihjb25zdCBpIG9mIG4pe2NvbnN0IHM9aVsyXTshQXJyYXkuaXNBcnJheShzKSYmcy5idWZmZXImJmUucHVzaChzLmJ1ZmZlcil9cmV0dXJuIGV9fSw2MzYxOmZ1bmN0aW9uKGMsdCxyKXt2YXIgbz10aGlzJiZ0aGlzLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24obSxnLF8sYil7Yj09PXZvaWQgMCYmKGI9Xyk7dmFyIHk9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihnLF8pO3kmJiEoImdldCJpbiB5PyFnLl9fZXNNb2R1bGU6eS53cml0YWJsZXx8eS5jb25maWd1cmFibGUpfHwoeT17ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZ1tfXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobSxiLHkpfTpmdW5jdGlvbihtLGcsXyxiKXtiPT09dm9pZCAwJiYoYj1fKSxtW2JdPWdbX119KSx1PXRoaXMmJnRoaXMuX19zZXRNb2R1bGVEZWZhdWx0fHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihtLGcpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShtLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTpnfSl9OmZ1bmN0aW9uKG0sZyl7bS5kZWZhdWx0PWd9KSxoPXRoaXMmJnRoaXMuX19pbXBvcnRTdGFyfHxmdW5jdGlvbihtKXtpZihtJiZtLl9fZXNNb2R1bGUpcmV0dXJuIG07dmFyIGc9e307aWYobSE9bnVsbClmb3IodmFyIF8gaW4gbSlfIT09ImRlZmF1bHQiJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobSxfKSYmbyhnLG0sXyk7cmV0dXJuIHUoZyxtKSxnfSxhPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbihtKXtyZXR1cm4gbSYmbS5fX2VzTW9kdWxlP206e2RlZmF1bHQ6bX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRpc3Bvc2U9dC5nZXRJbnN0YW5jZT10LmluaXRpYWxpemVXZWJBc3NlbWJseT12b2lkIDA7Y29uc3QgcD1oKHIoNjQ0OSkpLGY9YShyKDkzMikpLGQ9cigzNDc0KTtsZXQgbCxuPSExLGU9ITEsaT0hMTtjb25zdCBzPShtLGcpPT5nP20/Im9ydC13YXNtLXNpbWQtdGhyZWFkZWQud2FzbSI6Im9ydC13YXNtLXRocmVhZGVkLndhc20iOm0/Im9ydC13YXNtLXNpbWQud2FzbSI6Im9ydC13YXNtLndhc20iO3QuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5PWFzeW5jIG09PntpZihuKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTtpZihlKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgY2FsbHMgdG8gJ2luaXRpYWxpemVXZWJBc3NlbWJseSgpJyBkZXRlY3RlZC4iKTtpZihpKXRocm93IG5ldyBFcnJvcigicHJldmlvdXMgY2FsbCB0byAnaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KCknIGZhaWxlZC4iKTtlPSEwO2NvbnN0IGc9bS5pbml0VGltZW91dCxfPW0ubnVtVGhyZWFkcyxiPW0uc2ltZCx5PV8+MSYmKCgpPT57dHJ5e3JldHVybiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXI8InUiJiYodHlwZW9mIE1lc3NhZ2VDaGFubmVsPCJ1IiYmbmV3IE1lc3NhZ2VDaGFubmVsKCkucG9ydDEucG9zdE1lc3NhZ2UobmV3IFNoYXJlZEFycmF5QnVmZmVyKDEpKSxXZWJBc3NlbWJseS52YWxpZGF0ZShuZXcgVWludDhBcnJheShbMCw5NywxMTUsMTA5LDEsMCwwLDAsMSw0LDEsOTYsMCwwLDMsMiwxLDAsNSw0LDEsMywxLDEsMTAsMTEsMSw5LDAsNjUsMCwyNTQsMTYsMiwwLDI2LDExXSkpKX1jYXRjaHtyZXR1cm4hMX19KSgpLFQ9YiYmKCgpPT57dHJ5e3JldHVybiBXZWJBc3NlbWJseS52YWxpZGF0ZShuZXcgVWludDhBcnJheShbMCw5NywxMTUsMTA5LDEsMCwwLDAsMSw0LDEsOTYsMCwwLDMsMiwxLDAsMTAsMzAsMSwyOCwwLDY1LDAsMjUzLDE1LDI1MywxMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDI1MywxODYsMSwyNiwxMV0pKX1jYXRjaHtyZXR1cm4hMX19KSgpLHc9dHlwZW9mIG0ud2FzbVBhdGhzPT0ic3RyaW5nIj9tLndhc21QYXRoczp2b2lkIDAseD1zKCExLHkpLEU9cyhULHkpLFA9dHlwZW9mIG0ud2FzbVBhdGhzPT0ib2JqZWN0Ij9tLndhc21QYXRoc1tFXTp2b2lkIDA7bGV0IHY9ITE7Y29uc3QgTT1bXTtpZihnPjAmJk0ucHVzaChuZXcgUHJvbWlzZSgkPT57c2V0VGltZW91dCgoKT0+e3Y9ITAsJCgpfSxnKX0pKSxNLnB1c2gobmV3IFByb21pc2UoKCQseik9Pntjb25zdCBCPXk/ZDpmLmRlZmF1bHQsTj17bG9jYXRlRmlsZTooRCxJKT0+eSYmRC5lbmRzV2l0aCgiLndvcmtlci5qcyIpJiZ0eXBlb2YgQmxvYjwidSI/VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbcig0MTU0KV0se3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KSk6RD09PXg/UD8/KHc/P0kpK0U6SStEfTtpZih5KWlmKHR5cGVvZiBCbG9iPiJ1IilOLm1haW5TY3JpcHRVcmxPckJsb2I9cC5qb2luKCIvIiwib3J0LXdhc20tdGhyZWFkZWQuanMiKTtlbHNle2NvbnN0IEQ9YHZhciBvcnRXYXNtVGhyZWFkZWQ9KGZ1bmN0aW9uKCl7dmFyIF9zY3JpcHREaXI7cmV0dXJuICR7Qi50b1N0cmluZygpfX0pKCk7YDtOLm1haW5TY3JpcHRVcmxPckJsb2I9bmV3IEJsb2IoW0RdLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSl9QihOKS50aGVuKEQ9PntlPSExLG49ITAsbD1ELCQoKX0sRD0+e2U9ITEsaT0hMCx6KEQpfSl9KSksYXdhaXQgUHJvbWlzZS5yYWNlKE0pLHYpdGhyb3cgbmV3IEVycm9yKGBXZWJBc3NlbWJseSBiYWNrZW5kIGluaXRpYWxpemluZyBmYWlsZWQgZHVlIHRvIHRpbWVvdXQ6ICR7Z31tc2ApfSx0LmdldEluc3RhbmNlPSgpPT57aWYobiYmbClyZXR1cm4gbDt0aHJvdyBuZXcgRXJyb3IoIldlYkFzc2VtYmx5IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuIil9LHQuZGlzcG9zZT0oKT0+e3ZhciBtOyFufHxlfHxpfHwoZT0hMCwobT1sLlBUaHJlYWQpPT09bnVsbHx8bT09PXZvaWQgMHx8bS50ZXJtaW5hdGVBbGxUaHJlYWRzKCksbD12b2lkIDAsZT0hMSxuPSExLGk9ITApfX0sOTcxMDooYyx0LHIpPT57ci5kKHQse1o6KCk9Pmh9KTt2YXIgbz1yKDQ3NyksdT1yLm4obyk7ZnVuY3Rpb24gaCgpe3JldHVybiB1KCkoJy8qIVxuKiBPTk5YIFJ1bnRpbWUgV2ViIHYxLjE0LjBcbiogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiovXG4oKCk9Pnt2YXIgdD17NDc0Oih0LGUsbik9Pnt2YXIgX3NjcmlwdERpcixyPShfc2NyaXB0RGlyPShfc2NyaXB0RGlyPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwKXx8Ii9pbmRleC5qcyIsZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBqLmJ1ZmZlciE9RCYmTihqLmJ1ZmZlciksUH1mdW5jdGlvbiByKCl7cmV0dXJuIGouYnVmZmVyIT1EJiZOKGouYnVmZmVyKSxVfWZ1bmN0aW9uIGEoKXtyZXR1cm4gai5idWZmZXIhPUQmJk4oai5idWZmZXIpLEZ9ZnVuY3Rpb24gaSgpe3JldHVybiBqLmJ1ZmZlciE9RCYmTihqLmJ1ZmZlciksSX1mdW5jdGlvbiBvKCl7cmV0dXJuIGouYnVmZmVyIT1EJiZOKGouYnVmZmVyKSxXfXZhciB1LGMsczt0PXR8fHt9LHV8fCh1PXZvaWQgMCE9PXQ/dDp7fSksdS5yZWFkeT1uZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxlKXtjPXQscz1lfSkpO3ZhciBsLGYscCxoLGQseSxiPU9iamVjdC5hc3NpZ24oe30sdSksbT0iLi90aGlzLnByb2dyYW0iLGc9KHQsZSk9Pnt0aHJvdyBlfSx2PSJvYmplY3QiPT10eXBlb2Ygd2luZG93LHc9ImZ1bmN0aW9uIj09dHlwZW9mIGltcG9ydFNjcmlwdHMsXz0ib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MmJiJvYmplY3QiPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyYmInN0cmluZyI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUsTz11LkVOVklST05NRU5UX0lTX1BUSFJFQUR8fCExLEE9IiI7ZnVuY3Rpb24gUyh0KXtyZXR1cm4gdS5sb2NhdGVGaWxlP3UubG9jYXRlRmlsZSh0LEEpOkErdH1pZihfKXtsZXQgZTtBPXc/big5MDgpLmRpcm5hbWUoQSkrIi8iOiIvLyIseT0oKT0+e2R8fChoPW4oMzg0KSxkPW4oOTA4KSl9LGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4geSgpLHQ9ZC5ub3JtYWxpemUodCksaC5yZWFkRmlsZVN5bmModCxlP3ZvaWQgMDoidXRmOCIpfSxwPXQ9PigodD1sKHQsITApKS5idWZmZXJ8fCh0PW5ldyBVaW50OEFycmF5KHQpKSx0KSxmPSh0LGUsbik9Pnt5KCksdD1kLm5vcm1hbGl6ZSh0KSxoLnJlYWRGaWxlKHQsKGZ1bmN0aW9uKHQscil7dD9uKHQpOmUoci5idWZmZXIpfSkpfSwxPHByb2Nlc3MuYXJndi5sZW5ndGgmJihtPXByb2Nlc3MuYXJndlsxXS5yZXBsYWNlKC9cXFxcL2csIi8iKSkscHJvY2Vzcy5hcmd2LnNsaWNlKDIpLHByb2Nlc3Mub24oInVuY2F1Z2h0RXhjZXB0aW9uIiwoZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2YgY3QpKXRocm93IHR9KSkscHJvY2Vzcy5vbigidW5oYW5kbGVkUmVqZWN0aW9uIiwoZnVuY3Rpb24odCl7dGhyb3cgdH0pKSxnPSh0LGUpPT57aWYoUSgpKXRocm93IHByb2Nlc3MuZXhpdENvZGU9dCxlO2UgaW5zdGFuY2VvZiBjdHx8eCgiZXhpdGluZyBkdWUgdG8gZXhjZXB0aW9uOiAiK2UpLHByb2Nlc3MuZXhpdCh0KX0sdS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIn07dHJ5e2U9big5MjUpfWNhdGNoKHQpe3Rocm93IGNvbnNvbGUuZXJyb3IoXCdUaGUgIndvcmtlcl90aHJlYWRzIiBtb2R1bGUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIG5vZGUuanMgYnVpbGQgLSBwZXJoYXBzIGEgbmV3ZXIgdmVyc2lvbiBpcyBuZWVkZWQ/XCcpLHR9bi5nLldvcmtlcj1lLldvcmtlcn1lbHNlKHZ8fHcpJiYodz9BPXNlbGYubG9jYXRpb24uaHJlZjoidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYoQT1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksX3NjcmlwdERpciYmKEE9X3NjcmlwdERpciksQT0wIT09QS5pbmRleE9mKCJibG9iOiIpP0Euc3Vic3RyKDAsQS5yZXBsYWNlKC9bPyNdLiovLCIiKS5sYXN0SW5kZXhPZigiLyIpKzEpOiIiLF98fChsPXQ9Pnt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIGUub3BlbigiR0VUIix0LCExKSxlLnNlbmQobnVsbCksZS5yZXNwb25zZVRleHR9LHcmJihwPXQ9Pnt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIGUub3BlbigiR0VUIix0LCExKSxlLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLGUuc2VuZChudWxsKSxuZXcgVWludDhBcnJheShlLnJlc3BvbnNlKX0pLGY9KHQsZSxuKT0+e3ZhciByPW5ldyBYTUxIdHRwUmVxdWVzdDtyLm9wZW4oIkdFVCIsdCwhMCksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLm9ubG9hZD0oKT0+ezIwMD09ci5zdGF0dXN8fDA9PXIuc3RhdHVzJiZyLnJlc3BvbnNlP2Uoci5yZXNwb25zZSk6bigpfSxyLm9uZXJyb3I9bixyLnNlbmQobnVsbCl9KSk7XyYmInVuZGVmaW5lZCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmKG4uZy5wZXJmb3JtYW5jZT1uKDk1MykucGVyZm9ybWFuY2UpO3ZhciBUPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksRT1jb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtfJiYoeSgpLFQ9dD0+aC53cml0ZVN5bmMoMSx0KyJcXG4iKSxFPXQ9Pmgud3JpdGVTeW5jKDIsdCsiXFxuIikpO3ZhciBNLEM9dS5wcmludHx8VCx4PXUucHJpbnRFcnJ8fEU7T2JqZWN0LmFzc2lnbih1LGIpLGI9bnVsbCx1LnRoaXNQcm9ncmFtJiYobT11LnRoaXNQcm9ncmFtKSx1LnF1aXQmJihnPXUucXVpdCksdS53YXNtQmluYXJ5JiYoTT11Lndhc21CaW5hcnkpO3ZhciBSPXUubm9FeGl0UnVudGltZXx8ITE7Im9iamVjdCIhPXR5cGVvZiBXZWJBc3NlbWJseSYmYXQoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTt2YXIgaixrLEQsUCxVLEYsSSxXLEg9ITEsTD0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMDtmdW5jdGlvbiB6KHQsZSxuKXt2YXIgcj0oZT4+Pj0wKStuO2ZvcihuPWU7dFtuXSYmIShuPj1yKTspKytuO2lmKDE2PG4tZSYmdC5idWZmZXImJkwpcmV0dXJuIEwuZGVjb2RlKHQuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXI/dC5zbGljZShlLG4pOnQuc3ViYXJyYXkoZSxuKSk7Zm9yKHI9IiI7ZTxuOyl7dmFyIGE9dFtlKytdO2lmKDEyOCZhKXt2YXIgaT02MyZ0W2UrK107aWYoMTkyPT0oMjI0JmEpKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKDMxJmEpPDw2fGkpO2Vsc2V7dmFyIG89NjMmdFtlKytdOzY1NTM2PihhPTIyND09KDI0MCZhKT8oMTUmYSk8PDEyfGk8PDZ8bzooNyZhKTw8MTh8aTw8MTJ8bzw8Nnw2MyZ0W2UrK10pP3IrPVN0cmluZy5mcm9tQ2hhckNvZGUoYSk6KGEtPTY1NTM2LHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8YT4+MTAsNTYzMjB8MTAyMyZhKSl9fWVsc2Ugcis9U3RyaW5nLmZyb21DaGFyQ29kZShhKX1yZXR1cm4gcn1mdW5jdGlvbiBZKHQsZSl7cmV0dXJuKHQ+Pj49MCk/eihyKCksdCxlKToiIn1mdW5jdGlvbiBCKHQsZSxuLHIpe2lmKCEoMDxyKSlyZXR1cm4gMDt2YXIgYT1uPj4+PTA7cj1uK3ItMTtmb3IodmFyIGk9MDtpPHQubGVuZ3RoOysraSl7dmFyIG89dC5jaGFyQ29kZUF0KGkpO2lmKDU1Mjk2PD1vJiY1NzM0Mz49byYmKG89NjU1MzYrKCgxMDIzJm8pPDwxMCl8MTAyMyZ0LmNoYXJDb2RlQXQoKytpKSksMTI3Pj1vKXtpZihuPj1yKWJyZWFrO2VbbisrPj4+MF09b31lbHNle2lmKDIwNDc+PW8pe2lmKG4rMT49cilicmVhaztlW24rKz4+PjBdPTE5MnxvPj42fWVsc2V7aWYoNjU1MzU+PW8pe2lmKG4rMj49cilicmVhaztlW24rKz4+PjBdPTIyNHxvPj4xMn1lbHNle2lmKG4rMz49cilicmVhaztlW24rKz4+PjBdPTI0MHxvPj4xOCxlW24rKz4+PjBdPTEyOHxvPj4xMiY2M31lW24rKz4+PjBdPTEyOHxvPj42JjYzfWVbbisrPj4+MF09MTI4fDYzJm99fXJldHVybiBlW24+Pj4wXT0wLG4tYX1mdW5jdGlvbiBHKHQpe2Zvcih2YXIgZT0wLG49MDtuPHQubGVuZ3RoOysrbil7dmFyIHI9dC5jaGFyQ29kZUF0KG4pOzEyNz49cj9lKys6MjA0Nz49cj9lKz0yOjU1Mjk2PD1yJiY1NzM0Mz49cj8oZSs9NCwrK24pOmUrPTN9cmV0dXJuIGV9ZnVuY3Rpb24gTih0KXtEPXQsdS5IRUFQOD1QPW5ldyBJbnQ4QXJyYXkodCksdS5IRUFQMTY9bmV3IEludDE2QXJyYXkodCksdS5IRUFQMzI9Rj1uZXcgSW50MzJBcnJheSh0KSx1LkhFQVBVOD1VPW5ldyBVaW50OEFycmF5KHQpLHUuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkodCksdS5IRUFQVTMyPUk9bmV3IFVpbnQzMkFycmF5KHQpLHUuSEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KHQpLHUuSEVBUEY2ND1XPW5ldyBGbG9hdDY0QXJyYXkodCl9TyYmKEQ9dS5idWZmZXIpO3ZhciBWPXUuSU5JVElBTF9NRU1PUll8fDE2Nzc3MjE2O2lmKE8paj11Lndhc21NZW1vcnksRD11LmJ1ZmZlcjtlbHNlIGlmKHUud2FzbU1lbW9yeSlqPXUud2FzbU1lbW9yeTtlbHNlIGlmKCEoKGo9bmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7aW5pdGlhbDpWLzY1NTM2LG1heGltdW06NjU1MzYsc2hhcmVkOiEwfSkpLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSl0aHJvdyB4KCJyZXF1ZXN0ZWQgYSBzaGFyZWQgV2ViQXNzZW1ibHkuTWVtb3J5IGJ1dCB0aGUgcmV0dXJuZWQgYnVmZmVyIGlzIG5vdCBhIFNoYXJlZEFycmF5QnVmZmVyLCBpbmRpY2F0aW5nIHRoYXQgd2hpbGUgdGhlIGJyb3dzZXIgaGFzIFNoYXJlZEFycmF5QnVmZmVyIGl0IGRvZXMgbm90IGhhdmUgV2ViQXNzZW1ibHkgdGhyZWFkcyBzdXBwb3J0IC0geW91IG1heSBuZWVkIHRvIHNldCBhIGZsYWciKSxfJiZjb25zb2xlLmxvZygiKG9uIG5vZGUgeW91IG1heSBuZWVkOiAtLWV4cGVyaW1lbnRhbC13YXNtLXRocmVhZHMgLS1leHBlcmltZW50YWwtd2FzbS1idWxrLW1lbW9yeSBhbmQgYWxzbyB1c2UgYSByZWNlbnQgdmVyc2lvbikiKSxFcnJvcigiYmFkIG1lbW9yeSIpO2omJihEPWouYnVmZmVyKSxWPUQuYnl0ZUxlbmd0aCxOKEQpO3ZhciAkLHE9W10sWD1bXSxKPVtdLFo9W107ZnVuY3Rpb24gUSgpe3JldHVybiBSfHwhMX1mdW5jdGlvbiBLKCl7dmFyIHQ9dS5wcmVSdW4uc2hpZnQoKTtxLnVuc2hpZnQodCl9dmFyIHR0LGV0PTAsbnQ9bnVsbCxydD1udWxsO2Z1bmN0aW9uIGF0KHQpe3Rocm93IE8/cG9zdE1lc3NhZ2Uoe2NtZDoib25BYm9ydCIsYXJnOnR9KTp1Lm9uQWJvcnQmJnUub25BYm9ydCh0KSx4KHQ9IkFib3J0ZWQoIit0KyIpIiksSD0hMCx0PW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IodCsiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiIpLHModCksdH1mdW5jdGlvbiBpdCgpe3JldHVybiB0dC5zdGFydHNXaXRoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIil9ZnVuY3Rpb24gb3QoKXt2YXIgdD10dDt0cnl7aWYodD09dHQmJk0pcmV0dXJuIG5ldyBVaW50OEFycmF5KE0pO2lmKHApcmV0dXJuIHAodCk7dGhyb3ciYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifWNhdGNoKHQpe2F0KHQpfX10dD0ib3J0LXdhc20tdGhyZWFkZWQud2FzbSIsaXQoKXx8KHR0PVModHQpKTt2YXIgdXQ9e307ZnVuY3Rpb24gY3QodCl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9IlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIit0KyIpIix0aGlzLnN0YXR1cz10fWZ1bmN0aW9uIHN0KHQpeyh0PWh0LlZiW3RdKXx8YXQoKSxodC5tYyh0KX1mdW5jdGlvbiBsdCh0KXt2YXIgZT1odC5DYygpO2lmKCFlKXJldHVybiA2O2h0LmFjLnB1c2goZSksaHQuVmJbdC5VYl09ZSxlLlViPXQuVWI7dmFyIG49e2NtZDoicnVuIixzdGFydF9yb3V0aW5lOnQuSWMsYXJnOnQuemMscHRocmVhZF9wdHI6dC5VYn07cmV0dXJuIGUuJGI9KCk9PntuLnRpbWU9cGVyZm9ybWFuY2Uubm93KCksZS5wb3N0TWVzc2FnZShuLHQuTmMpfSxlLmxvYWRlZCYmKGUuJGIoKSxkZWxldGUgZS4kYiksMH1mdW5jdGlvbiBmdCh0KXtpZihPKXJldHVybiAkdCgxLDEsdCk7USgpfHwoaHQub2MoKSx1Lm9uRXhpdCYmdS5vbkV4aXQodCksSD0hMCksZyh0LG5ldyBjdCh0KSl9ZnVuY3Rpb24gcHQodCxlKXtpZighZSYmTyl0aHJvdyBidCh0KSwidW53aW5kIjtRKCl8fE98fChtZSgpLGR0KEopLGJlKDApLHJlWzFdLmxlbmd0aCYmYWUoMSwxMCkscmVbMl0ubGVuZ3RoJiZhZSgyLDEwKSxodC5vYygpKSxmdCh0KX12YXIgaHQ9e1liOltdLGFjOltdLHFjOltdLFZiOnt9LGZjOmZ1bmN0aW9uKCl7TyYmaHQuRWMoKX0sUGM6ZnVuY3Rpb24oKXt9LEVjOmZ1bmN0aW9uKCl7aHQucmVjZWl2ZU9iamVjdFRyYW5zZmVyPWh0LkdjLGh0LnRocmVhZEluaXRUTFM9aHQucGMsaHQuc2V0RXhpdFN0YXR1cz1odC5uYyxSPSExfSxuYzpmdW5jdGlvbigpe30sb2M6ZnVuY3Rpb24oKXtmb3IodmFyIHQgb2YgT2JqZWN0LnZhbHVlcyhodC5WYikpaHQubWModCk7Zm9yKHQgb2YgaHQuWWIpdC50ZXJtaW5hdGUoKTtodC5ZYj1bXX0sbWM6ZnVuY3Rpb24odCl7dmFyIGU9dC5VYjtkZWxldGUgaHQuVmJbZV0saHQuWWIucHVzaCh0KSxodC5hYy5zcGxpY2UoaHQuYWMuaW5kZXhPZih0KSwxKSx0LlViPTAsT2UoZSl9LEdjOmZ1bmN0aW9uKCl7fSxwYzpmdW5jdGlvbigpe2h0LnFjLmZvckVhY2goKHQ9PnQoKSkpfSxGYzpmdW5jdGlvbih0LGUpe3Qub25tZXNzYWdlPW49Pnt2YXIgcj0obj1uLmRhdGEpLmNtZDtpZih0LlViJiYoaHQuQmM9dC5VYiksbi50YXJnZXRUaHJlYWQmJm4udGFyZ2V0VGhyZWFkIT1oZSgpKXt2YXIgYT1odC5WYltuLlFjXTthP2EucG9zdE1lc3NhZ2UobixuLnRyYW5zZmVyTGlzdCk6eChcJ0ludGVybmFsIGVycm9yISBXb3JrZXIgc2VudCBhIG1lc3NhZ2UgIlwnK3IrXCciIHRvIHRhcmdldCBwdGhyZWFkIFwnK24udGFyZ2V0VGhyZWFkKyIsIGJ1dCB0aGF0IHRocmVhZCBubyBsb25nZXIgZXhpc3RzISIpfWVsc2UicHJvY2Vzc1Byb3h5aW5nUXVldWUiPT09cj96dChuLnF1ZXVlKToic3Bhd25UaHJlYWQiPT09cj9sdChuKToiY2xlYW51cFRocmVhZCI9PT1yP3N0KG4udGhyZWFkKToia2lsbFRocmVhZCI9PT1yPyhuPW4udGhyZWFkLHI9aHQuVmJbbl0sZGVsZXRlIGh0LlZiW25dLHIudGVybWluYXRlKCksT2UobiksaHQuYWMuc3BsaWNlKGh0LmFjLmluZGV4T2YociksMSksci5VYj0wKToiY2FuY2VsVGhyZWFkIj09PXI/aHQuVmJbbi50aHJlYWRdLnBvc3RNZXNzYWdlKHtjbWQ6ImNhbmNlbCJ9KToibG9hZGVkIj09PXI/KHQubG9hZGVkPSEwLGUmJmUodCksdC4kYiYmKHQuJGIoKSxkZWxldGUgdC4kYikpOiJwcmludCI9PT1yP0MoIlRocmVhZCAiK24udGhyZWFkSWQrIjogIituLnRleHQpOiJwcmludEVyciI9PT1yP3goIlRocmVhZCAiK24udGhyZWFkSWQrIjogIituLnRleHQpOiJhbGVydCI9PT1yP2FsZXJ0KCJUaHJlYWQgIituLnRocmVhZElkKyI6ICIrbi50ZXh0KToic2V0aW1tZWRpYXRlIj09PW4udGFyZ2V0P3QucG9zdE1lc3NhZ2Uobik6Im9uQWJvcnQiPT09cj91Lm9uQWJvcnQmJnUub25BYm9ydChuLmFyZyk6ciYmeCgid29ya2VyIHNlbnQgYW4gdW5rbm93biBjb21tYW5kICIrcik7aHQuQmM9dm9pZCAwfSx0Lm9uZXJyb3I9dD0+e3Rocm93IHgoIndvcmtlciBzZW50IGFuIGVycm9yISAiK3QuZmlsZW5hbWUrIjoiK3QubGluZW5vKyI6ICIrdC5tZXNzYWdlKSx0fSxfJiYodC5vbigibWVzc2FnZSIsKGZ1bmN0aW9uKGUpe3Qub25tZXNzYWdlKHtkYXRhOmV9KX0pKSx0Lm9uKCJlcnJvciIsKGZ1bmN0aW9uKGUpe3Qub25lcnJvcihlKX0pKSx0Lm9uKCJkZXRhY2hlZEV4aXQiLChmdW5jdGlvbigpe30pKSksdC5wb3N0TWVzc2FnZSh7Y21kOiJsb2FkIix1cmxPckJsb2I6dS5tYWluU2NyaXB0VXJsT3JCbG9ifHxfc2NyaXB0RGlyLHdhc21NZW1vcnk6aix3YXNtTW9kdWxlOmt9KX0seWM6ZnVuY3Rpb24oKXt2YXIgdD1TKCJvcnQtd2FzbS10aHJlYWRlZC53b3JrZXIuanMiKTtodC5ZYi5wdXNoKG5ldyBXb3JrZXIodCkpfSxDYzpmdW5jdGlvbigpe3JldHVybiAwPT1odC5ZYi5sZW5ndGgmJihodC55YygpLGh0LkZjKGh0LlliWzBdKSksaHQuWWIucG9wKCl9fTtmdW5jdGlvbiBkdCh0KXtmb3IoOzA8dC5sZW5ndGg7KXQuc2hpZnQoKSh1KX1mdW5jdGlvbiB5dCh0KXt2YXIgZT1FZSgpO3JldHVybiB0PXQoKSxNZShlKSx0fWZ1bmN0aW9uIGJ0KHQpe2lmKE8pcmV0dXJuICR0KDIsMCx0KTt0cnl7cHQodCl9Y2F0Y2godCl7dCBpbnN0YW5jZW9mIGN0fHwidW53aW5kIj09dHx8ZygxLHQpfX11LlBUaHJlYWQ9aHQsdS5lc3RhYmxpc2hTdGFja1NwYWNlPWZ1bmN0aW9uKCl7dmFyIHQ9aGUoKSxlPWEoKVt0KzQ0Pj4yPj4+MF07dD1hKClbdCs0OD4+Mj4+PjBdLFRlKGUsZS10KSxNZShlKX07dmFyIG10PVtdO2Z1bmN0aW9uIGd0KHQpe3ZhciBlPW10W3RdO3JldHVybiBlfHwodD49bXQubGVuZ3RoJiYobXQubGVuZ3RoPXQrMSksbXRbdF09ZT0kLmdldCh0KSksZX11Lmludm9rZUVudHJ5UG9pbnQ9ZnVuY3Rpb24odCxlKXt0PWd0KHQpKGUpLFEoKT9odC5uYyh0KTpBZSh0KX07dmFyIHZ0LHd0LF90PVtdLE90PTAsQXQ9MDtmdW5jdGlvbiBTdCh0KXt0aGlzLlpiPXQsdGhpcy5TYj10LTI0LHRoaXMueGM9ZnVuY3Rpb24odCl7aSgpW3RoaXMuU2IrND4+Mj4+PjBdPXR9LHRoaXMuYmM9ZnVuY3Rpb24oKXtyZXR1cm4gaSgpW3RoaXMuU2IrND4+Mj4+PjBdfSx0aGlzLndjPWZ1bmN0aW9uKHQpe2koKVt0aGlzLlNiKzg+PjI+Pj4wXT10fSx0aGlzLkRjPWZ1bmN0aW9uKCl7cmV0dXJuIGkoKVt0aGlzLlNiKzg+PjI+Pj4wXX0sdGhpcy5yYz1mdW5jdGlvbigpe2EoKVt0aGlzLlNiPj4yPj4+MF09MH0sdGhpcy5oYz1mdW5jdGlvbih0KXt0PXQ/MTowLGUoKVt0aGlzLlNiKzEyPj4wPj4+MF09dH0sdGhpcy51Yz1mdW5jdGlvbigpe3JldHVybiAwIT1lKClbdGhpcy5TYisxMj4+MD4+PjBdfSx0aGlzLmljPWZ1bmN0aW9uKHQpe3Q9dD8xOjAsZSgpW3RoaXMuU2IrMTM+PjA+Pj4wXT10fSx0aGlzLmtjPWZ1bmN0aW9uKCl7cmV0dXJuIDAhPWUoKVt0aGlzLlNiKzEzPj4wPj4+MF19LHRoaXMuZmM9ZnVuY3Rpb24odCxlKXt0aGlzLmNjKDApLHRoaXMueGModCksdGhpcy53YyhlKSx0aGlzLnJjKCksdGhpcy5oYyghMSksdGhpcy5pYyghMSl9LHRoaXMuc2M9ZnVuY3Rpb24oKXtBdG9taWNzLmFkZChhKCksdGhpcy5TYj4+MiwxKX0sdGhpcy5IYz1mdW5jdGlvbigpe3JldHVybiAxPT09QXRvbWljcy5zdWIoYSgpLHRoaXMuU2I+PjIsMSl9LHRoaXMuY2M9ZnVuY3Rpb24odCl7aSgpW3RoaXMuU2IrMTY+PjI+Pj4wXT10fSx0aGlzLnRjPWZ1bmN0aW9uKCl7cmV0dXJuIGkoKVt0aGlzLlNiKzE2Pj4yPj4+MF19LHRoaXMudmM9ZnVuY3Rpb24oKXtpZihSZSh0aGlzLmJjKCkpKXJldHVybiBpKClbdGhpcy5aYj4+Mj4+PjBdO3ZhciB0PXRoaXMudGMoKTtyZXR1cm4gMCE9PXQ/dDp0aGlzLlpifX1mdW5jdGlvbiBUdCh0KXtyZXR1cm4geWUobmV3IFN0KHQpLlNiKX1mdW5jdGlvbiBFdCh0LGUsbixyKXtyZXR1cm4gTz8kdCgzLDEsdCxlLG4scik6TXQodCxlLG4scil9ZnVuY3Rpb24gTXQodCxlLG4scil7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlcilyZXR1cm4geCgiQ3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IFNoYXJlZEFycmF5QnVmZmVyLCBwdGhyZWFkcyBhcmUgbm90IGF2YWlsYWJsZSEiKSw2O3ZhciBhPVtdO3JldHVybiBPJiYwPT09YS5sZW5ndGg/RXQodCxlLG4scik6KHQ9e0ljOm4sVWI6dCx6YzpyLE5jOmF9LE8/KHQuT2M9InNwYXduVGhyZWFkIixwb3N0TWVzc2FnZSh0LGEpLDApOmx0KHQpKX1mdW5jdGlvbiBDdCh0LGUsbil7cmV0dXJuIE8/JHQoNCwxLHQsZSxuKTowfWZ1bmN0aW9uIHh0KHQsZSl7aWYoTylyZXR1cm4gJHQoNSwxLHQsZSl9ZnVuY3Rpb24gUnQodCxlKXtpZihPKXJldHVybiAkdCg2LDEsdCxlKX1mdW5jdGlvbiBqdCh0LGUsbil7aWYoTylyZXR1cm4gJHQoNywxLHQsZSxuKX1mdW5jdGlvbiBrdCh0LGUsbil7cmV0dXJuIE8/JHQoOCwxLHQsZSxuKTowfWZ1bmN0aW9uIER0KHQsZSl7aWYoTylyZXR1cm4gJHQoOSwxLHQsZSl9ZnVuY3Rpb24gUHQodCxlLG4pe2lmKE8pcmV0dXJuICR0KDEwLDEsdCxlLG4pfWZ1bmN0aW9uIFV0KHQsZSxuLHIpe2lmKE8pcmV0dXJuICR0KDExLDEsdCxlLG4scil9ZnVuY3Rpb24gRnQodCxlLG4scil7aWYoTylyZXR1cm4gJHQoMTIsMSx0LGUsbixyKX1mdW5jdGlvbiBJdCh0LGUsbixyKXtpZihPKXJldHVybiAkdCgxMywxLHQsZSxuLHIpfWZ1bmN0aW9uIFd0KHQpe2lmKE8pcmV0dXJuICR0KDE0LDEsdCl9ZnVuY3Rpb24gSHQodCxlKXtpZihPKXJldHVybiAkdCgxNSwxLHQsZSl9ZnVuY3Rpb24gTHQodCxlLG4pe2lmKE8pcmV0dXJuICR0KDE2LDEsdCxlLG4pfWZ1bmN0aW9uIHp0KHQpe0F0b21pY3Muc3RvcmUoYSgpLHQ+PjIsMSksaGUoKSYmX2UodCksQXRvbWljcy5jb21wYXJlRXhjaGFuZ2UoYSgpLHQ+PjIsMSwwKX1mdW5jdGlvbiBZdCh0KXtyZXR1cm4gaSgpW3Q+Pj4yXSs0Mjk0OTY3Mjk2KmEoKVt0KzQ+Pj4yXX1mdW5jdGlvbiBCdCh0LGUsbixyLGEsaSl7cmV0dXJuIE8/JHQoMTcsMSx0LGUsbixyLGEsaSk6LTUyfWZ1bmN0aW9uIEd0KHQsZSxuLHIsYSxpKXtpZihPKXJldHVybiAkdCgxOCwxLHQsZSxuLHIsYSxpKX1mdW5jdGlvbiBOdCh0KXt2YXIgbj1HKHQpKzEscj1kZShuKTtyZXR1cm4gciYmQih0LGUoKSxyLG4pLHJ9ZnVuY3Rpb24gVnQodCxlLG4pe2Z1bmN0aW9uIHIodCl7cmV0dXJuKHQ9dC50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXFwoKFtBLVphLXogXSspXFwpJC8pKT90WzFdOiJHTVQifWlmKE8pcmV0dXJuICR0KDE5LDEsdCxlLG4pO3ZhciBvPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSx1PW5ldyBEYXRlKG8sMCwxKSxjPW5ldyBEYXRlKG8sNiwxKTtvPXUuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgcz1jLmdldFRpbWV6b25lT2Zmc2V0KCksbD1NYXRoLm1heChvLHMpO2EoKVt0Pj4yPj4+MF09NjAqbCxhKClbZT4+Mj4+PjBdPU51bWJlcihvIT1zKSx0PXIodSksZT1yKGMpLHQ9TnQodCksZT1OdChlKSxzPG8/KGkoKVtuPj4yPj4+MF09dCxpKClbbis0Pj4yPj4+MF09ZSk6KGkoKVtuPj4yPj4+MF09ZSxpKClbbis0Pj4yPj4+MF09dCl9ZnVuY3Rpb24gJHQodCxlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoLTIscj1hcmd1bWVudHM7cmV0dXJuIHl0KCgoKT0+e2Zvcih2YXIgYT1DZSg4Km4pLGk9YT4+Myx1PTA7dTxuO3UrKyl7dmFyIGM9clsyK3VdO28oKVtpK3U+Pj4wXT1jfXJldHVybiB3ZSh0LG4sYSxlKX0pKX11LmV4ZWN1dGVOb3RpZmllZFByb3h5aW5nUXVldWU9enQsd3Q9Xz8oKT0+e3ZhciB0PXByb2Nlc3MuaHJ0aW1lKCk7cmV0dXJuIDFlMyp0WzBdK3RbMV0vMWU2fTpPPygpPT5wZXJmb3JtYW5jZS5ub3coKS11Ll9fcGVyZm9ybWFuY2Vfbm93X2Nsb2NrX2RyaWZ0OigpPT5wZXJmb3JtYW5jZS5ub3coKTt2YXIgcXQsWHQ9W10sSnQ9e307ZnVuY3Rpb24gWnQoKXtpZighcXQpe3ZhciB0LGU9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzooIm9iamVjdCI9PXR5cGVvZiBuYXZpZ2F0b3ImJm5hdmlnYXRvci5sYW5ndWFnZXMmJm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fCJDIikucmVwbGFjZSgiLSIsIl8iKSsiLlVURi04IixfOm18fCIuL3RoaXMucHJvZ3JhbSJ9O2Zvcih0IGluIEp0KXZvaWQgMD09PUp0W3RdP2RlbGV0ZSBlW3RdOmVbdF09SnRbdF07dmFyIG49W107Zm9yKHQgaW4gZSluLnB1c2godCsiPSIrZVt0XSk7cXQ9bn1yZXR1cm4gcXR9ZnVuY3Rpb24gUXQodCxuKXtpZihPKXJldHVybiAkdCgyMCwxLHQsbik7dmFyIHI9MDtyZXR1cm4gWnQoKS5mb3JFYWNoKChmdW5jdGlvbihhLG8pe3ZhciB1PW4rcjtmb3Iobz1pKClbdCs0Km8+PjI+Pj4wXT11LHU9MDt1PGEubGVuZ3RoOysrdSllKClbbysrPj4wPj4+MF09YS5jaGFyQ29kZUF0KHUpO2UoKVtvPj4wPj4+MF09MCxyKz1hLmxlbmd0aCsxfSkpLDB9ZnVuY3Rpb24gS3QodCxlKXtpZihPKXJldHVybiAkdCgyMSwxLHQsZSk7dmFyIG49WnQoKTtpKClbdD4+Mj4+PjBdPW4ubGVuZ3RoO3ZhciByPTA7cmV0dXJuIG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7cis9dC5sZW5ndGgrMX0pKSxpKClbZT4+Mj4+PjBdPXIsMH1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gTz8kdCgyMiwxLHQpOjUyfWZ1bmN0aW9uIGVlKHQsZSxuLHIpe3JldHVybiBPPyR0KDIzLDEsdCxlLG4scik6NTJ9ZnVuY3Rpb24gbmUodCxlLG4scixhKXtyZXR1cm4gTz8kdCgyNCwxLHQsZSxuLHIsYSk6NzB9dmFyIHJlPVtudWxsLFtdLFtdXTtmdW5jdGlvbiBhZSh0LGUpe3ZhciBuPXJlW3RdOzA9PT1lfHwxMD09PWU/KCgxPT09dD9DOngpKHoobiwwKSksbi5sZW5ndGg9MCk6bi5wdXNoKGUpfWZ1bmN0aW9uIGllKHQsZSxuLGEpe2lmKE8pcmV0dXJuICR0KDI1LDEsdCxlLG4sYSk7Zm9yKHZhciBvPTAsdT0wO3U8bjt1Kyspe3ZhciBjPWkoKVtlPj4yPj4+MF0scz1pKClbZSs0Pj4yPj4+MF07ZSs9ODtmb3IodmFyIGw9MDtsPHM7bCsrKWFlKHQscigpW2MrbD4+PjBdKTtvKz1zfXJldHVybiBpKClbYT4+Mj4+PjBdPW8sMH12YXIgb2U9MDtmdW5jdGlvbiB1ZSh0KXtyZXR1cm4gMD09dCU0JiYoMCE9dCUxMDB8fDA9PXQlNDAwKX12YXIgY2U9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxzZT1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2Z1bmN0aW9uIGxlKHQsbixyLGkpe2Z1bmN0aW9uIG8odCxlLG4pe2Zvcih0PSJudW1iZXIiPT10eXBlb2YgdD90LnRvU3RyaW5nKCk6dHx8IiI7dC5sZW5ndGg8ZTspdD1uWzBdK3Q7cmV0dXJuIHR9ZnVuY3Rpb24gdSh0LGUpe3JldHVybiBvKHQsZSwiMCIpfWZ1bmN0aW9uIGModCxlKXtmdW5jdGlvbiBuKHQpe3JldHVybiAwPnQ/LTE6MDx0PzE6MH12YXIgcjtyZXR1cm4gMD09PShyPW4odC5nZXRGdWxsWWVhcigpLWUuZ2V0RnVsbFllYXIoKSkpJiYwPT09KHI9bih0LmdldE1vbnRoKCktZS5nZXRNb250aCgpKSkmJihyPW4odC5nZXREYXRlKCktZS5nZXREYXRlKCkpKSxyfWZ1bmN0aW9uIHModCl7c3dpdGNoKHQuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUodC5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gdDtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24gbCh0KXt2YXIgZT10LldiO2Zvcih0PW5ldyBEYXRlKG5ldyBEYXRlKHQuWGIrMTkwMCwwLDEpLmdldFRpbWUoKSk7MDxlOyl7dmFyIG49dC5nZXRNb250aCgpLHI9KHVlKHQuZ2V0RnVsbFllYXIoKSk/Y2U6c2UpW25dO2lmKCEoZT5yLXQuZ2V0RGF0ZSgpKSl7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK2UpO2JyZWFrfWUtPXItdC5nZXREYXRlKCkrMSx0LnNldERhdGUoMSksMTE+bj90LnNldE1vbnRoKG4rMSk6KHQuc2V0TW9udGgoMCksdC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrMSkpfXJldHVybiBuPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSsxLDAsNCksZT1zKG5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSwwLDQpKSxuPXMobiksMD49YyhlLHQpPzA+PWMobix0KT90LmdldEZ1bGxZZWFyKCkrMTp0LmdldEZ1bGxZZWFyKCk6dC5nZXRGdWxsWWVhcigpLTF9dmFyIGY9YSgpW2krNDA+PjI+Pj4wXTtmb3IodmFyIHAgaW4gaT17TGM6YSgpW2k+PjI+Pj4wXSxLYzphKClbaSs0Pj4yPj4+MF0sZGM6YSgpW2krOD4+Mj4+PjBdLGpjOmEoKVtpKzEyPj4yPj4+MF0sZWM6YSgpW2krMTY+PjI+Pj4wXSxYYjphKClbaSsyMD4+Mj4+PjBdLFRiOmEoKVtpKzI0Pj4yPj4+MF0sV2I6YSgpW2krMjg+PjI+Pj4wXSxSYzphKClbaSszMj4+Mj4+PjBdLEpjOmEoKVtpKzM2Pj4yPj4+MF0sTWM6Zj9ZKGYpOiIifSxyPVkociksZj17IiVjIjoiJWEgJWIgJWQgJUg6JU06JVMgJVkiLCIlRCI6IiVtLyVkLyV5IiwiJUYiOiIlWS0lbS0lZCIsIiVoIjoiJWIiLCIlciI6IiVJOiVNOiVTICVwIiwiJVIiOiIlSDolTSIsIiVUIjoiJUg6JU06JVMiLCIleCI6IiVtLyVkLyV5IiwiJVgiOiIlSDolTTolUyIsIiVFYyI6IiVjIiwiJUVDIjoiJUMiLCIlRXgiOiIlbS8lZC8leSIsIiVFWCI6IiVIOiVNOiVTIiwiJUV5IjoiJXkiLCIlRVkiOiIlWSIsIiVPZCI6IiVkIiwiJU9lIjoiJWUiLCIlT0giOiIlSCIsIiVPSSI6IiVJIiwiJU9tIjoiJW0iLCIlT00iOiIlTSIsIiVPUyI6IiVTIiwiJU91IjoiJXUiLCIlT1UiOiIlVSIsIiVPViI6IiVWIiwiJU93IjoiJXciLCIlT1ciOiIlVyIsIiVPeSI6IiV5In0pcj1yLnJlcGxhY2UobmV3IFJlZ0V4cChwLCJnIiksZltwXSk7dmFyIGg9IlN1bmRheSBNb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5Ii5zcGxpdCgiICIpLGQ9IkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIiLnNwbGl0KCIgIik7Zm9yKHAgaW4gZj17IiVhIjpmdW5jdGlvbih0KXtyZXR1cm4gaFt0LlRiXS5zdWJzdHJpbmcoMCwzKX0sIiVBIjpmdW5jdGlvbih0KXtyZXR1cm4gaFt0LlRiXX0sIiViIjpmdW5jdGlvbih0KXtyZXR1cm4gZFt0LmVjXS5zdWJzdHJpbmcoMCwzKX0sIiVCIjpmdW5jdGlvbih0KXtyZXR1cm4gZFt0LmVjXX0sIiVDIjpmdW5jdGlvbih0KXtyZXR1cm4gdSgodC5YYisxOTAwKS8xMDB8MCwyKX0sIiVkIjpmdW5jdGlvbih0KXtyZXR1cm4gdSh0LmpjLDIpfSwiJWUiOmZ1bmN0aW9uKHQpe3JldHVybiBvKHQuamMsMiwiICIpfSwiJWciOmZ1bmN0aW9uKHQpe3JldHVybiBsKHQpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpfSwiJUciOmZ1bmN0aW9uKHQpe3JldHVybiBsKHQpfSwiJUgiOmZ1bmN0aW9uKHQpe3JldHVybiB1KHQuZGMsMil9LCIlSSI6ZnVuY3Rpb24odCl7cmV0dXJuIDA9PSh0PXQuZGMpP3Q9MTI6MTI8dCYmKHQtPTEyKSx1KHQsMil9LCIlaiI6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj0wO248PXQuZWMtMTtlKz0odWUodC5YYisxOTAwKT9jZTpzZSlbbisrXSk7cmV0dXJuIHUodC5qYytlLDMpfSwiJW0iOmZ1bmN0aW9uKHQpe3JldHVybiB1KHQuZWMrMSwyKX0sIiVNIjpmdW5jdGlvbih0KXtyZXR1cm4gdSh0LktjLDIpfSwiJW4iOmZ1bmN0aW9uKCl7cmV0dXJuIlxcbiJ9LCIlcCI6ZnVuY3Rpb24odCl7cmV0dXJuIDA8PXQuZGMmJjEyPnQuZGM/IkFNIjoiUE0ifSwiJVMiOmZ1bmN0aW9uKHQpe3JldHVybiB1KHQuTGMsMil9LCIldCI6ZnVuY3Rpb24oKXtyZXR1cm4iXFx0In0sIiV1IjpmdW5jdGlvbih0KXtyZXR1cm4gdC5UYnx8N30sIiVVIjpmdW5jdGlvbih0KXtyZXR1cm4gdShNYXRoLmZsb29yKCh0LldiKzctdC5UYikvNyksMil9LCIlViI6ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5mbG9vcigodC5XYis3LSh0LlRiKzYpJTcpLzcpO2lmKDI+PSh0LlRiKzM3MS10LldiLTIpJTcmJmUrKyxlKTUzPT1lJiYoND09KG49KHQuVGIrMzcxLXQuV2IpJTcpfHwzPT1uJiZ1ZSh0LlhiKXx8KGU9MSkpO2Vsc2V7ZT01Mjt2YXIgbj0odC5UYis3LXQuV2ItMSklNzsoND09bnx8NT09biYmdWUodC5YYiU0MDAtMSkpJiZlKyt9cmV0dXJuIHUoZSwyKX0sIiV3IjpmdW5jdGlvbih0KXtyZXR1cm4gdC5UYn0sIiVXIjpmdW5jdGlvbih0KXtyZXR1cm4gdShNYXRoLmZsb29yKCh0LldiKzctKHQuVGIrNiklNykvNyksMil9LCIleSI6ZnVuY3Rpb24odCl7cmV0dXJuKHQuWGIrMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMil9LCIlWSI6ZnVuY3Rpb24odCl7cmV0dXJuIHQuWGIrMTkwMH0sIiV6IjpmdW5jdGlvbih0KXt2YXIgZT0wPD0odD10LkpjKTtyZXR1cm4gdD1NYXRoLmFicyh0KS82MCwoZT8iKyI6Ii0iKStTdHJpbmcoIjAwMDAiKyh0LzYwKjEwMCt0JTYwKSkuc2xpY2UoLTQpfSwiJVoiOmZ1bmN0aW9uKHQpe3JldHVybiB0Lk1jfSwiJSUiOmZ1bmN0aW9uKCl7cmV0dXJuIiUifX0scj1yLnJlcGxhY2UoLyUlL2csIlxcMFxcMCIpLGYpci5pbmNsdWRlcyhwKSYmKHI9ci5yZXBsYWNlKG5ldyBSZWdFeHAocCwiZyIpLGZbcF0oaSkpKTtyZXR1cm4gcD1mdW5jdGlvbih0KXt2YXIgZT1BcnJheShHKHQpKzEpO3JldHVybiBCKHQsZSwwLGUubGVuZ3RoKSxlfShyPXIucmVwbGFjZSgvXFwwXFwwL2csIiUiKSkscC5sZW5ndGg+bj8wOihmdW5jdGlvbih0LG4pe2UoKS5zZXQodCxuPj4+MCl9KHAsdCkscC5sZW5ndGgtMSl9aHQuZmMoKTt2YXIgZmU9W251bGwsZnQsYnQsRXQsQ3QseHQsUnQsanQsa3QsRHQsUHQsVXQsRnQsSXQsV3QsSHQsTHQsQnQsR3QsVnQsUXQsS3QsdGUsZWUsbmUsaWVdLHBlPXtiOmZ1bmN0aW9uKHQpe3JldHVybiBkZSh0KzI0KSsyNH0sbjpmdW5jdGlvbih0KXtyZXR1cm4odD1uZXcgU3QodCkpLnVjKCl8fCh0LmhjKCEwKSxPdC0tKSx0LmljKCExKSxfdC5wdXNoKHQpLHQuc2MoKSx0LnZjKCl9LG1hOmZ1bmN0aW9uKHQpe3Rocm93IHgoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biwgdGhpcyBpcyBub3QgcHJvcGVybHkgc3VwcG9ydGVkIC0gYWJvcnRpbmciKSxIPSEwLHR9LHg6ZnVuY3Rpb24oKXtTZSgwKTt2YXIgdD1fdC5wb3AoKTtpZih0LkhjKCkmJiF0LmtjKCkpe3ZhciBlPXQuRGMoKTtlJiZndChlKSh0LlpiKSxUdCh0LlpiKX1BdD0wfSxlOmZ1bmN0aW9uKCl7dmFyIHQ9QXQ7aWYoIXQpcmV0dXJuIG9lPTA7dmFyIGU9bmV3IFN0KHQpO2UuY2ModCk7dmFyIG49ZS5iYygpO2lmKCFuKXJldHVybiBvZT0wLHQ7Zm9yKHZhciByPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2lmKDA9PT1pfHxpPT09bilicmVhaztpZih4ZShpLG4sZS5TYisxNikpcmV0dXJuIG9lPWksdH1yZXR1cm4gb2U9bix0fSxsOmZ1bmN0aW9uKCl7dmFyIHQ9QXQ7aWYoIXQpcmV0dXJuIG9lPTA7dmFyIGU9bmV3IFN0KHQpO2UuY2ModCk7dmFyIG49ZS5iYygpO2lmKCFuKXJldHVybiBvZT0wLHQ7Zm9yKHZhciByPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2lmKDA9PT1pfHxpPT09bilicmVhaztpZih4ZShpLG4sZS5TYisxNikpcmV0dXJuIG9lPWksdH1yZXR1cm4gb2U9bix0fSxoOmZ1bmN0aW9uKCl7dmFyIHQ9QXQ7aWYoIXQpcmV0dXJuIG9lPTA7dmFyIGU9bmV3IFN0KHQpO2UuY2ModCk7dmFyIG49ZS5iYygpO2lmKCFuKXJldHVybiBvZT0wLHQ7Zm9yKHZhciByPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaT1yW2FdO2lmKDA9PT1pfHxpPT09bilicmVhaztpZih4ZShpLG4sZS5TYisxNikpcmV0dXJuIG9lPWksdH1yZXR1cm4gb2U9bix0fSx0OlR0LE06ZnVuY3Rpb24oKXt2YXIgdD1fdC5wb3AoKTt0fHxhdCgibm8gZXhjZXB0aW9uIHRvIHRocm93Iik7dmFyIGU9dC5aYjt0aHJvdyB0LmtjKCl8fChfdC5wdXNoKHQpLHQuaWMoITApLHQuaGMoITEpLE90KyspLEF0PWUsZX0sYzpmdW5jdGlvbih0LGUsbil7dGhyb3cgbmV3IFN0KHQpLmZjKGUsbiksQXQ9dCxPdCsrLHR9LHBhOmZ1bmN0aW9uKCl7cmV0dXJuIE90fSxGYTpmdW5jdGlvbih0KXtnZSh0LCF3LDEsIXYpLGh0LnBjKCl9LFQ6ZnVuY3Rpb24odCl7Tz9wb3N0TWVzc2FnZSh7Y21kOiJjbGVhbnVwVGhyZWFkIix0aHJlYWQ6dH0pOnN0KHQpfSx4YTpNdCxqOmZ1bmN0aW9uKHQpe3Rocm93IEF0fHwoQXQ9dCksdH0sSDpDdCxNYTp4dCx1YTpSdCx3YTpqdCxvYTprdCxLYTpEdCxDYTpQdCxKYTpVdCxWOkZ0LHZhOkl0LHNhOld0LExhOkh0LHRhOkx0LFRhOmZ1bmN0aW9uKCl7fSxYOmZ1bmN0aW9uKCl7YXQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIGVuYWJsZSBkeW5hbWljIGxpbmtpbmcsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIil9LFVhOmZ1bmN0aW9uKCl7YXQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIGVuYWJsZSBkeW5hbWljIGxpbmtpbmcsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIil9LFc6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gMjA5NzE1Mn0sT2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0semE6ZnVuY3Rpb24odCxlLG4scil7aWYodD09ZSlzZXRUaW1lb3V0KCgoKT0+enQocikpKTtlbHNlIGlmKE8pcG9zdE1lc3NhZ2Uoe3RhcmdldFRocmVhZDp0LGNtZDoicHJvY2Vzc1Byb3h5aW5nUXVldWUiLHF1ZXVlOnJ9KTtlbHNle2lmKCEodD1odC5WYlt0XSkpcmV0dXJuO3QucG9zdE1lc3NhZ2Uoe2NtZDoicHJvY2Vzc1Byb3h5aW5nUXVldWUiLHF1ZXVlOnJ9KX1yZXR1cm4gMX0sRWE6ZnVuY3Rpb24oKXtyZXR1cm4tMX0sUGE6ZnVuY3Rpb24odCxlKXt0PW5ldyBEYXRlKDFlMypZdCh0KSksYSgpW2U+PjI+Pj4wXT10LmdldFVUQ1NlY29uZHMoKSxhKClbZSs0Pj4yPj4+MF09dC5nZXRVVENNaW51dGVzKCksYSgpW2UrOD4+Mj4+PjBdPXQuZ2V0VVRDSG91cnMoKSxhKClbZSsxMj4+Mj4+PjBdPXQuZ2V0VVRDRGF0ZSgpLGEoKVtlKzE2Pj4yPj4+MF09dC5nZXRVVENNb250aCgpLGEoKVtlKzIwPj4yPj4+MF09dC5nZXRVVENGdWxsWWVhcigpLTE5MDAsYSgpW2UrMjQ+PjI+Pj4wXT10LmdldFVUQ0RheSgpLHQ9KHQuZ2V0VGltZSgpLURhdGUuVVRDKHQuZ2V0VVRDRnVsbFllYXIoKSwwLDEsMCwwLDAsMCkpLzg2NGU1fDAsYSgpW2UrMjg+PjI+Pj4wXT10fSxRYTpmdW5jdGlvbih0LGUpe3Q9bmV3IERhdGUoMWUzKll0KHQpKSxhKClbZT4+Mj4+PjBdPXQuZ2V0U2Vjb25kcygpLGEoKVtlKzQ+PjI+Pj4wXT10LmdldE1pbnV0ZXMoKSxhKClbZSs4Pj4yPj4+MF09dC5nZXRIb3VycygpLGEoKVtlKzEyPj4yPj4+MF09dC5nZXREYXRlKCksYSgpW2UrMTY+PjI+Pj4wXT10LmdldE1vbnRoKCksYSgpW2UrMjA+PjI+Pj4wXT10LmdldEZ1bGxZZWFyKCktMTkwMCxhKClbZSsyND4+Mj4+PjBdPXQuZ2V0RGF5KCk7dmFyIG49bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDAsMSkscj0odC5nZXRUaW1lKCktbi5nZXRUaW1lKCkpLzg2NGU1fDA7YSgpW2UrMjg+PjI+Pj4wXT1yLGEoKVtlKzM2Pj4yPj4+MF09LTYwKnQuZ2V0VGltZXpvbmVPZmZzZXQoKSxyPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCksdD0wfChyIT0obj1uLmdldFRpbWV6b25lT2Zmc2V0KCkpJiZ0LmdldFRpbWV6b25lT2Zmc2V0KCk9PU1hdGgubWluKG4scikpLGEoKVtlKzMyPj4yPj4+MF09dH0sUmE6ZnVuY3Rpb24odCl7dmFyIGU9bmV3IERhdGUoYSgpW3QrMjA+PjI+Pj4wXSsxOTAwLGEoKVt0KzE2Pj4yPj4+MF0sYSgpW3QrMTI+PjI+Pj4wXSxhKClbdCs4Pj4yPj4+MF0sYSgpW3QrND4+Mj4+PjBdLGEoKVt0Pj4yPj4+MF0sMCksbj1hKClbdCszMj4+Mj4+PjBdLHI9ZS5nZXRUaW1lem9uZU9mZnNldCgpLGk9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMSksbz1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksNiwxKS5nZXRUaW1lem9uZU9mZnNldCgpLHU9aS5nZXRUaW1lem9uZU9mZnNldCgpLGM9TWF0aC5taW4odSxvKTtyZXR1cm4gMD5uP2EoKVt0KzMyPj4yPj4+MF09TnVtYmVyKG8hPXUmJmM9PXIpOjA8biE9KGM9PXIpJiYobz1NYXRoLm1heCh1LG8pLGUuc2V0VGltZShlLmdldFRpbWUoKSs2ZTQqKCgwPG4/YzpvKS1yKSkpLGEoKVt0KzI0Pj4yPj4+MF09ZS5nZXREYXkoKSxuPShlLmdldFRpbWUoKS1pLmdldFRpbWUoKSkvODY0ZTV8MCxhKClbdCsyOD4+Mj4+PjBdPW4sYSgpW3Q+PjI+Pj4wXT1lLmdldFNlY29uZHMoKSxhKClbdCs0Pj4yPj4+MF09ZS5nZXRNaW51dGVzKCksYSgpW3QrOD4+Mj4+PjBdPWUuZ2V0SG91cnMoKSxhKClbdCsxMj4+Mj4+PjBdPWUuZ2V0RGF0ZSgpLGEoKVt0KzE2Pj4yPj4+MF09ZS5nZXRNb250aCgpLGUuZ2V0VGltZSgpLzFlM3wwfSxBYTpCdCxCYTpHdCxTYTpmdW5jdGlvbiB0KGUsbixyKXt0LkFjfHwodC5BYz0hMCxWdChlLG4scikpfSx5OmZ1bmN0aW9uKCl7YXQoIiIpfSxVOmZ1bmN0aW9uKCl7aWYoIV8mJiF3KXt2YXIgdD0iQmxvY2tpbmcgb24gdGhlIG1haW4gdGhyZWFkIGlzIHZlcnkgZGFuZ2Vyb3VzLCBzZWUgaHR0cHM6Ly9lbXNjcmlwdGVuLm9yZy9kb2NzL3BvcnRpbmcvcHRocmVhZHMuaHRtbCNibG9ja2luZy1vbi10aGUtbWFpbi1icm93c2VyLXRocmVhZCI7dnR8fCh2dD17fSksdnRbdF18fCh2dFt0XT0xLF8mJih0PSJ3YXJuaW5nOiAiK3QpLHgodCkpfX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sQjp3dCxJYTpmdW5jdGlvbih0LGUsbil7cigpLmNvcHlXaXRoaW4odD4+PjAsZT4+PjAsZStuPj4+MCl9LEY6ZnVuY3Rpb24oKXtyZXR1cm4gXz9uKDk5MykuY3B1cygpLmxlbmd0aDpuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeX0sRGE6ZnVuY3Rpb24odCxlLG4pe1h0Lmxlbmd0aD1lLG4+Pj0zO2Zvcih2YXIgcj0wO3I8ZTtyKyspWHRbcl09bygpW24rcj4+PjBdO3JldHVybigwPnQ/dXRbLXQtMV06ZmVbdF0pLmFwcGx5KG51bGwsWHQpfSxxYTpmdW5jdGlvbih0KXt2YXIgZT1yKCkubGVuZ3RoO2lmKCh0Pj4+PTApPD1lfHw0Mjk0OTAxNzYwPHQpcmV0dXJuITE7Zm9yKHZhciBuPTE7ND49bjtuKj0yKXt2YXIgYT1lKigxKy4yL24pO2E9TWF0aC5taW4oYSx0KzEwMDY2MzI5Nik7dmFyIGk9TWF0aDthPU1hdGgubWF4KHQsYSksaT1pLm1pbi5jYWxsKGksNDI5NDkwMTc2MCxhKyg2NTUzNi1hJTY1NTM2KSU2NTUzNik7dDp7dHJ5e2ouZ3JvdyhpLUQuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2KSxOKGouYnVmZmVyKTt2YXIgbz0xO2JyZWFrIHR9Y2F0Y2godCl7fW89dm9pZCAwfWlmKG8pcmV0dXJuITB9cmV0dXJuITF9LE5hOmZ1bmN0aW9uKCl7dGhyb3cidW53aW5kIn0sR2E6UXQsSGE6S3QsSjpwdCxJOnRlLFM6ZWUsZ2E6bmUsUjppZSxkOmZ1bmN0aW9uKCl7cmV0dXJuIG9lfSxuYTpmdW5jdGlvbiB0KHIsYSl7dC5sY3x8KHQubGM9ZnVuY3Rpb24oKXtpZigib2JqZWN0Ij09dHlwZW9mIGNyeXB0byYmImZ1bmN0aW9uIj09dHlwZW9mIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpe3ZhciB0PW5ldyBVaW50OEFycmF5KDEpO3JldHVybigpPT4oY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh0KSx0WzBdKX1pZihfKXRyeXt2YXIgZT1uKE9iamVjdChmdW5jdGlvbigpe3ZhciB0PW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlIFwnY3J5cHRvXCciKTt0aHJvdyB0LmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLHR9KCkpKTtyZXR1cm4oKT0+ZS5yYW5kb21CeXRlcygxKVswXX1jYXRjaCh0KXt9cmV0dXJuKCk9PmF0KCJyYW5kb21EZXZpY2UiKX0oKSk7Zm9yKHZhciBpPTA7aTxhO2krKyllKClbcitpPj4wPj4+MF09dC5sYygpO3JldHVybiAwfSxpYTpmdW5jdGlvbih0LGUsbil7dmFyIHI9RWUoKTt0cnl7cmV0dXJuIGd0KHQpKGUsbil9Y2F0Y2godCl7aWYoTWUociksdCE9PXQrMCl0aHJvdyB0O1NlKDEsMCl9fSxqYTpmdW5jdGlvbih0LGUsbil7dmFyIHI9RWUoKTt0cnl7cmV0dXJuIGd0KHQpKGUsbil9Y2F0Y2godCl7aWYoTWUociksdCE9PXQrMCl0aHJvdyB0O1NlKDEsMCl9fSxLOmZ1bmN0aW9uKHQpe3ZhciBlPUVlKCk7dHJ5e3JldHVybiBndCh0KSgpfWNhdGNoKHQpe2lmKE1lKGUpLHQhPT10KzApdGhyb3cgdDtTZSgxLDApfX0sZjpmdW5jdGlvbih0LGUpe3ZhciBuPUVlKCk7dHJ5e3JldHVybiBndCh0KShlKX1jYXRjaCh0KXtpZihNZShuKSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LFA6ZnVuY3Rpb24odCxlLG4pe3ZhciByPUVlKCk7dHJ5e3JldHVybiBndCh0KShlLG4pfWNhdGNoKHQpe2lmKE1lKHIpLHQhPT10KzApdGhyb3cgdDtTZSgxLDApfX0sUTpmdW5jdGlvbih0LGUsbil7dmFyIHI9RWUoKTt0cnl7cmV0dXJuIGd0KHQpKGUsbil9Y2F0Y2godCl7aWYoTWUociksdCE9PXQrMCl0aHJvdyB0O1NlKDEsMCl9fSxrOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1FZSgpO3RyeXtyZXR1cm4gZ3QodCkoZSxuKX1jYXRjaCh0KXtpZihNZShyKSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LHA6ZnVuY3Rpb24odCxlLG4scil7dmFyIGE9RWUoKTt0cnl7cmV0dXJuIGd0KHQpKGUsbixyKX1jYXRjaCh0KXtpZihNZShhKSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LHE6ZnVuY3Rpb24odCxlLG4scixhKXt2YXIgaT1FZSgpO3RyeXtyZXR1cm4gZ3QodCkoZSxuLHIsYSl9Y2F0Y2godCl7aWYoTWUoaSksdCE9PXQrMCl0aHJvdyB0O1NlKDEsMCl9fSxOOmZ1bmN0aW9uKHQsZSxuLHIsYSxpKXt2YXIgbz1FZSgpO3RyeXtyZXR1cm4gZ3QodCkoZSxuLHIsYSxpKX1jYXRjaCh0KXtpZihNZShvKSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LHM6ZnVuY3Rpb24odCxlLG4scixhLGkpe3ZhciBvPUVlKCk7dHJ5e3JldHVybiBndCh0KShlLG4scixhLGkpfWNhdGNoKHQpe2lmKE1lKG8pLHQhPT10KzApdGhyb3cgdDtTZSgxLDApfX0sdzpmdW5jdGlvbih0LGUsbixyLGEsaSxvKXt2YXIgdT1FZSgpO3RyeXtyZXR1cm4gZ3QodCkoZSxuLHIsYSxpLG8pfWNhdGNoKHQpe2lmKE1lKHUpLHQhPT10KzApdGhyb3cgdDtTZSgxLDApfX0sTDpmdW5jdGlvbih0LGUsbixyLGEsaSxvLHUpe3ZhciBjPUVlKCk7dHJ5e3JldHVybiBndCh0KShlLG4scixhLGksbyx1KX1jYXRjaCh0KXtpZihNZShjKSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LEU6ZnVuY3Rpb24odCxlLG4scixhLGksbyx1LGMscyxsLGYpe3ZhciBwPUVlKCk7dHJ5e3JldHVybiBndCh0KShlLG4scixhLGksbyx1LGMscyxsLGYpfWNhdGNoKHQpe2lmKE1lKHApLHQhPT10KzApdGhyb3cgdDtTZSgxLDApfX0sYWE6ZnVuY3Rpb24odCxlLG4scixhLGksbyx1KXt2YXIgYz1FZSgpO3RyeXtyZXR1cm4gSGUodCxlLG4scixhLGksbyx1KX1jYXRjaCh0KXtpZihNZShjKSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LF86ZnVuY3Rpb24odCxlLG4scixhLGksbyl7dmFyIHU9RWUoKTt0cnl7cmV0dXJuIGtlKHQsZSxuLHIsYSxpLG8pfWNhdGNoKHQpe2lmKE1lKHUpLHQhPT10KzApdGhyb3cgdDtTZSgxLDApfX0sWjpmdW5jdGlvbih0LGUsbixyLGEpe3ZhciBpPUVlKCk7dHJ5e3JldHVybiBMZSh0LGUsbixyLGEpfWNhdGNoKHQpe2lmKE1lKGkpLHQhPT10KzApdGhyb3cgdDtTZSgxLDApfX0sY2E6ZnVuY3Rpb24odCxlLG4scil7dmFyIGE9RWUoKTt0cnl7cmV0dXJuIEllKHQsZSxuLHIpfWNhdGNoKHQpe2lmKE1lKGEpLHQhPT10KzApdGhyb3cgdDtTZSgxLDApfX0sJDpmdW5jdGlvbih0KXt2YXIgZT1FZSgpO3RyeXtyZXR1cm4gamUodCl9Y2F0Y2godCl7aWYoTWUoZSksdCE9PXQrMCl0aHJvdyB0O1NlKDEsMCl9fSxiYTpmdW5jdGlvbih0LGUpe3ZhciBuPUVlKCk7dHJ5e3JldHVybiBXZSh0LGUpfWNhdGNoKHQpe2lmKE1lKG4pLHQhPT10KzApdGhyb3cgdDtTZSgxLDApfX0sWTpmdW5jdGlvbih0LGUsbil7dmFyIHI9RWUoKTt0cnl7cmV0dXJuIERlKHQsZSxuKX1jYXRjaCh0KXtpZihNZShyKSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LGc6ZnVuY3Rpb24odCl7dmFyIGU9RWUoKTt0cnl7Z3QodCkoKX1jYXRjaCh0KXtpZihNZShlKSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LHI6ZnVuY3Rpb24odCxlKXt2YXIgbj1FZSgpO3RyeXtndCh0KShlKX1jYXRjaCh0KXtpZihNZShuKSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LGk6ZnVuY3Rpb24odCxlLG4pe3ZhciByPUVlKCk7dHJ5e2d0KHQpKGUsbil9Y2F0Y2godCl7aWYoTWUociksdCE9PXQrMCl0aHJvdyB0O1NlKDEsMCl9fSxoYTpmdW5jdGlvbih0LGUsbixyKXt2YXIgYT1FZSgpO3RyeXtndCh0KShlLG4scil9Y2F0Y2godCl7aWYoTWUoYSksdCE9PXQrMCl0aHJvdyB0O1NlKDEsMCl9fSxtOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBhPUVlKCk7dHJ5e2d0KHQpKGUsbixyKX1jYXRjaCh0KXtpZihNZShhKSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LHY6ZnVuY3Rpb24odCxlLG4scixhKXt2YXIgaT1FZSgpO3RyeXtndCh0KShlLG4scixhKX1jYXRjaCh0KXtpZihNZShpKSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LHU6ZnVuY3Rpb24odCxlLG4scixhLGkpe3ZhciBvPUVlKCk7dHJ5e2d0KHQpKGUsbixyLGEsaSl9Y2F0Y2godCl7aWYoTWUobyksdCE9PXQrMCl0aHJvdyB0O1NlKDEsMCl9fSxPOmZ1bmN0aW9uKHQsZSxuLHIsYSxpLG8pe3ZhciB1PUVlKCk7dHJ5e2d0KHQpKGUsbixyLGEsaSxvKX1jYXRjaCh0KXtpZihNZSh1KSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LEE6ZnVuY3Rpb24odCxlLG4scixhLGksbyx1KXt2YXIgYz1FZSgpO3RyeXtndCh0KShlLG4scixhLGksbyx1KX1jYXRjaCh0KXtpZihNZShjKSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LGthOmZ1bmN0aW9uKHQsZSxuLHIsYSxpLG8sdSxjKXt2YXIgcz1FZSgpO3RyeXtndCh0KShlLG4scixhLGksbyx1LGMpfWNhdGNoKHQpe2lmKE1lKHMpLHQhPT10KzApdGhyb3cgdDtTZSgxLDApfX0sQzpmdW5jdGlvbih0LGUsbixyLGEsaSxvLHUsYyxzLGwpe3ZhciBmPUVlKCk7dHJ5e2d0KHQpKGUsbixyLGEsaSxvLHUsYyxzLGwpfWNhdGNoKHQpe2lmKE1lKGYpLHQhPT10KzApdGhyb3cgdDtTZSgxLDApfX0sRDpmdW5jdGlvbih0LGUsbixyLGEsaSxvLHUsYyxzLGwsZixwLGgsZCx5KXt2YXIgYj1FZSgpO3RyeXtndCh0KShlLG4scixhLGksbyx1LGMscyxsLGYscCxoLGQseSl9Y2F0Y2godCl7aWYoTWUoYiksdCE9PXQrMCl0aHJvdyB0O1NlKDEsMCl9fSxmYTpmdW5jdGlvbih0LGUsbixyLGEsaSxvLHUpe3ZhciBjPUVlKCk7dHJ5e1BlKHQsZSxuLHIsYSxpLG8sdSl9Y2F0Y2godCl7aWYoTWUoYyksdCE9PXQrMCl0aHJvdyB0O1NlKDEsMCl9fSxkYTpmdW5jdGlvbih0LGUsbixyLGEsaSxvLHUsYyxzLGwsZil7dmFyIHA9RWUoKTt0cnl7RmUodCxlLG4scixhLGksbyx1LGMscyxsLGYpfWNhdGNoKHQpe2lmKE1lKHApLHQhPT10KzApdGhyb3cgdDtTZSgxLDApfX0sZWE6ZnVuY3Rpb24odCxlLG4scixhLGkpe3ZhciBvPUVlKCk7dHJ5e1VlKHQsZSxuLHIsYSxpKX1jYXRjaCh0KXtpZihNZShvKSx0IT09dCswKXRocm93IHQ7U2UoMSwwKX19LG86ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGE6anx8dS53YXNtTWVtb3J5LEc6ZnVuY3Rpb24odCl7b2U9dH0sbGE6bGUsejpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gbGUodCxlLG4scil9fTshZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dS5hc209dC5leHBvcnRzLGh0LnFjLnB1c2godS5hc20uc2IpLCQ9dS5hc20udWIsWC51bnNoaWZ0KHUuYXNtLlZhKSxrPWUsT3x8KGV0LS0sdS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZ1Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoZXQpLDA9PWV0JiYobnVsbCE9PW50JiYoY2xlYXJJbnRlcnZhbChudCksbnQ9bnVsbCkscnQmJih0PXJ0LHJ0PW51bGwsdCgpKSkpfWZ1bmN0aW9uIGUoZSl7dChlLmluc3RhbmNlLGUubW9kdWxlKX1mdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe2lmKCFNJiYodnx8dykpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBmZXRjaCYmIXR0LnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSlyZXR1cm4gZmV0Y2godHQse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKChmdW5jdGlvbih0KXtpZighdC5vayl0aHJvdyJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0IFwnIit0dCsiXCciO3JldHVybiB0LmFycmF5QnVmZmVyKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKCl7cmV0dXJuIG90KCl9KSk7aWYoZilyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsZSl7Zih0dCwoZnVuY3Rpb24oZSl7dChuZXcgVWludDhBcnJheShlKSl9KSxlKX0pKX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gb3QoKX0pKX0oKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUodCxyKX0pKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKS50aGVuKHQsKGZ1bmN0aW9uKHQpe3goImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrdCksYXQodCl9KSl9dmFyIHI9e2E6cGV9O2lmKE98fChldCsrLHUubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmdS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKGV0KSksdS5pbnN0YW50aWF0ZVdhc20pdHJ5e3JldHVybiB1Lmluc3RhbnRpYXRlV2FzbShyLHQpfWNhdGNoKHQpe3JldHVybiB4KCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK3QpLCExfShNfHwiZnVuY3Rpb24iIT10eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmd8fGl0KCl8fHR0LnN0YXJ0c1dpdGgoImZpbGU6Ly8iKXx8X3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGZldGNoP24oZSk6ZmV0Y2godHQse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcodCxyKS50aGVuKGUsKGZ1bmN0aW9uKHQpe3JldHVybiB4KCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIit0KSx4KCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpLG4oZSl9KSl9KSkpLmNhdGNoKHMpfSgpLHUuX19fd2FzbV9jYWxsX2N0b3JzPWZ1bmN0aW9uKCl7cmV0dXJuKHUuX19fd2FzbV9jYWxsX2N0b3JzPXUuYXNtLlZhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHUuX09ydEluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4odS5fT3J0SW5pdD11LmFzbS5XYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx1Ll9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybih1Ll9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz11LmFzbS5YYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx1Ll9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj1mdW5jdGlvbigpe3JldHVybih1Ll9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj11LmFzbS5ZYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx1Ll9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9ZnVuY3Rpb24oKXtyZXR1cm4odS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PXUuYXNtLlphKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHUuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybih1Ll9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9dS5hc20uX2EpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdS5fT3J0Q3JlYXRlU2Vzc2lvbj1mdW5jdGlvbigpe3JldHVybih1Ll9PcnRDcmVhdGVTZXNzaW9uPXUuYXNtLiRhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHUuX09ydFJlbGVhc2VTZXNzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuKHUuX09ydFJlbGVhc2VTZXNzaW9uPXUuYXNtLmFiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHUuX09ydEdldElucHV0Q291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4odS5fT3J0R2V0SW5wdXRDb3VudD11LmFzbS5iYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx1Ll9PcnRHZXRPdXRwdXRDb3VudD1mdW5jdGlvbigpe3JldHVybih1Ll9PcnRHZXRPdXRwdXRDb3VudD11LmFzbS5jYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx1Ll9PcnRHZXRJbnB1dE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4odS5fT3J0R2V0SW5wdXROYW1lPXUuYXNtLmRiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHUuX09ydEdldE91dHB1dE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4odS5fT3J0R2V0T3V0cHV0TmFtZT11LmFzbS5lYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx1Ll9PcnRGcmVlPWZ1bmN0aW9uKCl7cmV0dXJuKHUuX09ydEZyZWU9dS5hc20uZmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdS5fT3J0Q3JlYXRlVGVuc29yPWZ1bmN0aW9uKCl7cmV0dXJuKHUuX09ydENyZWF0ZVRlbnNvcj11LmFzbS5nYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx1Ll9PcnRHZXRUZW5zb3JEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuKHUuX09ydEdldFRlbnNvckRhdGE9dS5hc20uaGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdS5fT3J0UmVsZWFzZVRlbnNvcj1mdW5jdGlvbigpe3JldHVybih1Ll9PcnRSZWxlYXNlVGVuc29yPXUuYXNtLmliKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHUuX09ydENyZWF0ZVJ1bk9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4odS5fT3J0Q3JlYXRlUnVuT3B0aW9ucz11LmFzbS5qYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx1Ll9PcnRBZGRSdW5Db25maWdFbnRyeT1mdW5jdGlvbigpe3JldHVybih1Ll9PcnRBZGRSdW5Db25maWdFbnRyeT11LmFzbS5rYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx1Ll9PcnRSZWxlYXNlUnVuT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybih1Ll9PcnRSZWxlYXNlUnVuT3B0aW9ucz11LmFzbS5sYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx1Ll9PcnRSdW49ZnVuY3Rpb24oKXtyZXR1cm4odS5fT3J0UnVuPXUuYXNtLm1iKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHUuX09ydEVuZFByb2ZpbGluZz1mdW5jdGlvbigpe3JldHVybih1Ll9PcnRFbmRQcm9maWxpbmc9dS5hc20ubmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIGhlPXUuX3B0aHJlYWRfc2VsZj1mdW5jdGlvbigpe3JldHVybihoZT11Ll9wdGhyZWFkX3NlbGY9dS5hc20ub2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZGU9dS5fbWFsbG9jPWZ1bmN0aW9uKCl7cmV0dXJuKGRlPXUuX21hbGxvYz11LmFzbS5wYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx5ZT11Ll9mcmVlPWZ1bmN0aW9uKCl7cmV0dXJuKHllPXUuX2ZyZWU9dS5hc20ucWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYmU9dS5fZmZsdXNoPWZ1bmN0aW9uKCl7cmV0dXJuKGJlPXUuX2ZmbHVzaD11LmFzbS5yYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt1Ll9fZW1zY3JpcHRlbl90bHNfaW5pdD1mdW5jdGlvbigpe3JldHVybih1Ll9fZW1zY3JpcHRlbl90bHNfaW5pdD11LmFzbS5zYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgbWU9dS5fX19mdW5jc19vbl9leGl0PWZ1bmN0aW9uKCl7cmV0dXJuKG1lPXUuX19fZnVuY3Nfb25fZXhpdD11LmFzbS50YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxnZT11Ll9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD1mdW5jdGlvbigpe3JldHVybihnZT11Ll9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD11LmFzbS52YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt1Ll9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZD1mdW5jdGlvbigpe3JldHVybih1Ll9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZD11LmFzbS53YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgdmUsd2U9dS5fZW1zY3JpcHRlbl9ydW5faW5fbWFpbl9ydW50aW1lX3RocmVhZF9qcz1mdW5jdGlvbigpe3JldHVybih3ZT11Ll9lbXNjcmlwdGVuX3J1bl9pbl9tYWluX3J1bnRpbWVfdGhyZWFkX2pzPXUuYXNtLnhiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LF9lPXUuX19lbXNjcmlwdGVuX3Byb3h5X2V4ZWN1dGVfdGFza19xdWV1ZT1mdW5jdGlvbigpe3JldHVybihfZT11Ll9fZW1zY3JpcHRlbl9wcm94eV9leGVjdXRlX3Rhc2tfcXVldWU9dS5hc20ueWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sT2U9dS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2ZyZWVfZGF0YT1mdW5jdGlvbigpe3JldHVybihPZT11Ll9fZW1zY3JpcHRlbl90aHJlYWRfZnJlZV9kYXRhPXUuYXNtLnpiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEFlPXUuX19lbXNjcmlwdGVuX3RocmVhZF9leGl0PWZ1bmN0aW9uKCl7cmV0dXJuKEFlPXUuX19lbXNjcmlwdGVuX3RocmVhZF9leGl0PXUuYXNtLkFiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFNlPXUuX3NldFRocmV3PWZ1bmN0aW9uKCl7cmV0dXJuKFNlPXUuX3NldFRocmV3PXUuYXNtLkJiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFRlPXUuX2Vtc2NyaXB0ZW5fc3RhY2tfc2V0X2xpbWl0cz1mdW5jdGlvbigpe3JldHVybihUZT11Ll9lbXNjcmlwdGVuX3N0YWNrX3NldF9saW1pdHM9dS5hc20uQ2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRWU9dS5zdGFja1NhdmU9ZnVuY3Rpb24oKXtyZXR1cm4oRWU9dS5zdGFja1NhdmU9dS5hc20uRGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTWU9dS5zdGFja1Jlc3RvcmU9ZnVuY3Rpb24oKXtyZXR1cm4oTWU9dS5zdGFja1Jlc3RvcmU9dS5hc20uRWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sQ2U9dS5zdGFja0FsbG9jPWZ1bmN0aW9uKCl7cmV0dXJuKENlPXUuc3RhY2tBbGxvYz11LmFzbS5GYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx4ZT11Ll9fX2N4YV9jYW5fY2F0Y2g9ZnVuY3Rpb24oKXtyZXR1cm4oeGU9dS5fX19jeGFfY2FuX2NhdGNoPXUuYXNtLkdiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFJlPXUuX19fY3hhX2lzX3BvaW50ZXJfdHlwZT1mdW5jdGlvbigpe3JldHVybihSZT11Ll9fX2N4YV9pc19wb2ludGVyX3R5cGU9dS5hc20uSGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0samU9dS5keW5DYWxsX2o9ZnVuY3Rpb24oKXtyZXR1cm4oamU9dS5keW5DYWxsX2o9dS5hc20uSWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sa2U9dS5keW5DYWxsX2lpaWlpaj1mdW5jdGlvbigpe3JldHVybihrZT11LmR5bkNhbGxfaWlpaWlqPXUuYXNtLkpiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LERlPXUuZHluQ2FsbF9qaWk9ZnVuY3Rpb24oKXtyZXR1cm4oRGU9dS5keW5DYWxsX2ppaT11LmFzbS5LYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxQZT11LmR5bkNhbGxfdmlpaWlpaj1mdW5jdGlvbigpe3JldHVybihQZT11LmR5bkNhbGxfdmlpaWlpaj11LmFzbS5MYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxVZT11LmR5bkNhbGxfdmpqaT1mdW5jdGlvbigpe3JldHVybihVZT11LmR5bkNhbGxfdmpqaT11LmFzbS5NYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxGZT11LmR5bkNhbGxfdmlpaWpqamlpPWZ1bmN0aW9uKCl7cmV0dXJuKEZlPXUuZHluQ2FsbF92aWlpampqaWk9dS5hc20uTmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sSWU9dS5keW5DYWxsX2lpaj1mdW5jdGlvbigpe3JldHVybihJZT11LmR5bkNhbGxfaWlqPXUuYXNtLk9iKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFdlPXUuZHluQ2FsbF9qaT1mdW5jdGlvbigpe3JldHVybihXZT11LmR5bkNhbGxfamk9dS5hc20uUGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sSGU9dS5keW5DYWxsX2lpaWlpaWo9ZnVuY3Rpb24oKXtyZXR1cm4oSGU9dS5keW5DYWxsX2lpaWlpaWo9dS5hc20uUWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTGU9dS5keW5DYWxsX2lpaWo9ZnVuY3Rpb24oKXtyZXR1cm4oTGU9dS5keW5DYWxsX2lpaWo9dS5hc20uUmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07ZnVuY3Rpb24gemUoKXtmdW5jdGlvbiB0KCl7aWYoIXZlJiYodmU9ITAsdS5jYWxsZWRSdW49ITAsIUgpJiYoT3x8ZHQoWCksYyh1KSx1Lm9uUnVudGltZUluaXRpYWxpemVkJiZ1Lm9uUnVudGltZUluaXRpYWxpemVkKCksIU8pKXtpZih1LnBvc3RSdW4pZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiB1LnBvc3RSdW4mJih1LnBvc3RSdW49W3UucG9zdFJ1bl0pO3UucG9zdFJ1bi5sZW5ndGg7KXt2YXIgdD11LnBvc3RSdW4uc2hpZnQoKTtaLnVuc2hpZnQodCl9ZHQoWil9fWlmKCEoMDxldCkpaWYoTyljKHUpLE98fGR0KFgpLHBvc3RNZXNzYWdlKHtjbWQ6ImxvYWRlZCJ9KTtlbHNle2lmKHUucHJlUnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgdS5wcmVSdW4mJih1LnByZVJ1bj1bdS5wcmVSdW5dKTt1LnByZVJ1bi5sZW5ndGg7KUsoKTtkdChxKSwwPGV0fHwodS5zZXRTdGF0dXM/KHUuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Uuc2V0U3RhdHVzKCIiKX0pLDEpLHQoKX0pLDEpKTp0KCkpfX1pZih1LlVURjhUb1N0cmluZz1ZLHUuc3RyaW5nVG9VVEY4PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQih0LHIoKSxlLG4pfSx1Lmxlbmd0aEJ5dGVzVVRGOD1HLHUua2VlcFJ1bnRpbWVBbGl2ZT1RLHUud2FzbU1lbW9yeT1qLHUuc3RhY2tTYXZlPUVlLHUuc3RhY2tSZXN0b3JlPU1lLHUuc3RhY2tBbGxvYz1DZSx1LkV4aXRTdGF0dXM9Y3QsdS5QVGhyZWFkPWh0LHJ0PWZ1bmN0aW9uIHQoKXt2ZXx8emUoKSx2ZXx8KHJ0PXQpfSx1LnByZUluaXQpZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiB1LnByZUluaXQmJih1LnByZUluaXQ9W3UucHJlSW5pdF0pOzA8dS5wcmVJbml0Lmxlbmd0aDspdS5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIHplKCksdC5yZWFkeX0pO3QuZXhwb3J0cz1yfSw5MzI6KHQsZSxuKT0+e3ZhciBfc2NyaXB0RGlyLHI9KF9zY3JpcHREaXI9KF9zY3JpcHREaXI9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdD9kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzp2b2lkIDApfHwiL2luZGV4LmpzIixmdW5jdGlvbih0KXt2YXIgZSxyLGE7dD10fHx7fSxlfHwoZT12b2lkIDAhPT10P3Q6e30pLGUucmVhZHk9bmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsZSl7cj10LGE9ZX0pKTt2YXIgaSxvLHUsYyxzLGwsZj1PYmplY3QuYXNzaWduKHt9LGUpLHA9Ii4vdGhpcy5wcm9ncmFtIixoPSh0LGUpPT57dGhyb3cgZX0sZD0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyx5PSJmdW5jdGlvbiI9PXR5cGVvZiBpbXBvcnRTY3JpcHRzLGI9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLG09IiI7Yj8obT15P24oOTA4KS5kaXJuYW1lKG0pKyIvIjoiLy8iLGw9KCk9PntzfHwoYz1uKDM4NCkscz1uKDkwOCkpfSxpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGwoKSx0PXMubm9ybWFsaXplKHQpLGMucmVhZEZpbGVTeW5jKHQsZT92b2lkIDA6InV0ZjgiKX0sdT10PT4oKHQ9aSh0LCEwKSkuYnVmZmVyfHwodD1uZXcgVWludDhBcnJheSh0KSksdCksbz0odCxlLG4pPT57bCgpLHQ9cy5ub3JtYWxpemUodCksYy5yZWFkRmlsZSh0LChmdW5jdGlvbih0LHIpe3Q/bih0KTplKHIuYnVmZmVyKX0pKX0sMTxwcm9jZXNzLmFyZ3YubGVuZ3RoJiYocD1wcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFxcXC9nLCIvIikpLHByb2Nlc3MuYXJndi5zbGljZSgyKSxwcm9jZXNzLm9uKCJ1bmNhdWdodEV4Y2VwdGlvbiIsKGZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIEopKXRocm93IHR9KSkscHJvY2Vzcy5vbigidW5oYW5kbGVkUmVqZWN0aW9uIiwoZnVuY3Rpb24odCl7dGhyb3cgdH0pKSxoPSh0LGUpPT57aWYoX3x8MDxMKXRocm93IHByb2Nlc3MuZXhpdENvZGU9dCxlO2UgaW5zdGFuY2VvZiBKfHx3KCJleGl0aW5nIGR1ZSB0byBleGNlcHRpb246ICIrZSkscHJvY2Vzcy5leGl0KHQpfSxlLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4iW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0ifSk6KGR8fHkpJiYoeT9tPXNlbGYubG9jYXRpb24uaHJlZjoidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYobT1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksX3NjcmlwdERpciYmKG09X3NjcmlwdERpciksbT0wIT09bS5pbmRleE9mKCJibG9iOiIpP20uc3Vic3RyKDAsbS5yZXBsYWNlKC9bPyNdLiovLCIiKS5sYXN0SW5kZXhPZigiLyIpKzEpOiIiLGk9dD0+e3ZhciBlPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gZS5vcGVuKCJHRVQiLHQsITEpLGUuc2VuZChudWxsKSxlLnJlc3BvbnNlVGV4dH0seSYmKHU9dD0+e3ZhciBlPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gZS5vcGVuKCJHRVQiLHQsITEpLGUucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsZS5zZW5kKG51bGwpLG5ldyBVaW50OEFycmF5KGUucmVzcG9uc2UpfSksbz0odCxlLG4pPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3Iub3BlbigiR0VUIix0LCEwKSxyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLHIub25sb2FkPSgpPT57MjAwPT1yLnN0YXR1c3x8MD09ci5zdGF0dXMmJnIucmVzcG9uc2U/ZShyLnJlc3BvbnNlKTpuKCl9LHIub25lcnJvcj1uLHIuc2VuZChudWxsKX0pO3ZhciBnLHY9ZS5wcmludHx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx3PWUucHJpbnRFcnJ8fGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO09iamVjdC5hc3NpZ24oZSxmKSxmPW51bGwsZS50aGlzUHJvZ3JhbSYmKHA9ZS50aGlzUHJvZ3JhbSksZS5xdWl0JiYoaD1lLnF1aXQpLGUud2FzbUJpbmFyeSYmKGc9ZS53YXNtQmluYXJ5KTt2YXIgXz1lLm5vRXhpdFJ1bnRpbWV8fCExOyJvYmplY3QiIT10eXBlb2YgV2ViQXNzZW1ibHkmJlYoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTt2YXIgTyxBLFMsVCxFLE0sQz0hMSx4PSJ1bmRlZmluZWQiIT10eXBlb2YgVGV4dERlY29kZXI/bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik6dm9pZCAwO2Z1bmN0aW9uIFIodCxlLG4pe3ZhciByPShlPj4+PTApK247Zm9yKG49ZTt0W25dJiYhKG4+PXIpOykrK247aWYoMTY8bi1lJiZ0LmJ1ZmZlciYmeClyZXR1cm4geC5kZWNvZGUodC5zdWJhcnJheShlLG4pKTtmb3Iocj0iIjtlPG47KXt2YXIgYT10W2UrK107aWYoMTI4JmEpe3ZhciBpPTYzJnRbZSsrXTtpZigxOTI9PSgyMjQmYSkpcis9U3RyaW5nLmZyb21DaGFyQ29kZSgoMzEmYSk8PDZ8aSk7ZWxzZXt2YXIgbz02MyZ0W2UrK107NjU1MzY+KGE9MjI0PT0oMjQwJmEpPygxNSZhKTw8MTJ8aTw8NnxvOig3JmEpPDwxOHxpPDwxMnxvPDw2fDYzJnRbZSsrXSk/cis9U3RyaW5nLmZyb21DaGFyQ29kZShhKTooYS09NjU1MzYscis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxhPj4xMCw1NjMyMHwxMDIzJmEpKX19ZWxzZSByKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpfXJldHVybiByfWZ1bmN0aW9uIGoodCxlKXtyZXR1cm4odD4+Pj0wKT9SKFQsdCxlKToiIn1mdW5jdGlvbiBrKHQsZSxuLHIpe2lmKCEoMDxyKSlyZXR1cm4gMDt2YXIgYT1uPj4+PTA7cj1uK3ItMTtmb3IodmFyIGk9MDtpPHQubGVuZ3RoOysraSl7dmFyIG89dC5jaGFyQ29kZUF0KGkpO2lmKDU1Mjk2PD1vJiY1NzM0Mz49byYmKG89NjU1MzYrKCgxMDIzJm8pPDwxMCl8MTAyMyZ0LmNoYXJDb2RlQXQoKytpKSksMTI3Pj1vKXtpZihuPj1yKWJyZWFrO2VbbisrPj4+MF09b31lbHNle2lmKDIwNDc+PW8pe2lmKG4rMT49cilicmVhaztlW24rKz4+PjBdPTE5MnxvPj42fWVsc2V7aWYoNjU1MzU+PW8pe2lmKG4rMj49cilicmVhaztlW24rKz4+PjBdPTIyNHxvPj4xMn1lbHNle2lmKG4rMz49cilicmVhaztlW24rKz4+PjBdPTI0MHxvPj4xOCxlW24rKz4+PjBdPTEyOHxvPj4xMiY2M31lW24rKz4+PjBdPTEyOHxvPj42JjYzfWVbbisrPj4+MF09MTI4fDYzJm99fXJldHVybiBlW24+Pj4wXT0wLG4tYX1mdW5jdGlvbiBEKHQpe2Zvcih2YXIgZT0wLG49MDtuPHQubGVuZ3RoOysrbil7dmFyIHI9dC5jaGFyQ29kZUF0KG4pOzEyNz49cj9lKys6MjA0Nz49cj9lKz0yOjU1Mjk2PD1yJiY1NzM0Mz49cj8oZSs9NCwrK24pOmUrPTN9cmV0dXJuIGV9ZnVuY3Rpb24gUCgpe3ZhciB0PU8uYnVmZmVyO0E9dCxlLkhFQVA4PVM9bmV3IEludDhBcnJheSh0KSxlLkhFQVAxNj1uZXcgSW50MTZBcnJheSh0KSxlLkhFQVAzMj1FPW5ldyBJbnQzMkFycmF5KHQpLGUuSEVBUFU4PVQ9bmV3IFVpbnQ4QXJyYXkodCksZS5IRUFQVTE2PW5ldyBVaW50MTZBcnJheSh0KSxlLkhFQVBVMzI9TT1uZXcgVWludDMyQXJyYXkodCksZS5IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkodCksZS5IRUFQRjY0PW5ldyBGbG9hdDY0QXJyYXkodCl9dmFyIFUsRj1bXSxJPVtdLFc9W10sSD1bXSxMPTA7ZnVuY3Rpb24geigpe3ZhciB0PWUucHJlUnVuLnNoaWZ0KCk7Ri51bnNoaWZ0KHQpfXZhciBZLEI9MCxHPW51bGwsTj1udWxsO2Z1bmN0aW9uIFYodCl7dGhyb3cgZS5vbkFib3J0JiZlLm9uQWJvcnQodCksdyh0PSJBYm9ydGVkKCIrdCsiKSIpLEM9ITAsdD1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHQrIi4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4iKSxhKHQpLHR9ZnVuY3Rpb24gJCgpe3JldHVybiBZLnN0YXJ0c1dpdGgoImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiKX1pZihZPSJvcnQtd2FzbS53YXNtIiwhJCgpKXt2YXIgcT1ZO1k9ZS5sb2NhdGVGaWxlP2UubG9jYXRlRmlsZShxLG0pOm0rcX1mdW5jdGlvbiBYKCl7dmFyIHQ9WTt0cnl7aWYodD09WSYmZylyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZyk7aWYodSlyZXR1cm4gdSh0KTt0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9Y2F0Y2godCl7Vih0KX19ZnVuY3Rpb24gSih0KXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiLHRoaXMubWVzc2FnZT0iUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgiK3QrIikiLHRoaXMuc3RhdHVzPXR9ZnVuY3Rpb24gWih0KXtmb3IoOzA8dC5sZW5ndGg7KXQuc2hpZnQoKShlKX12YXIgUT1bXSxLPTAsdHQ9MDtmdW5jdGlvbiBldCh0KXt0aGlzLkRiPXQsdGhpcy56Yj10LTI0LHRoaXMuVWI9ZnVuY3Rpb24odCl7TVt0aGlzLnpiKzQ+PjI+Pj4wXT10fSx0aGlzLkViPWZ1bmN0aW9uKCl7cmV0dXJuIE1bdGhpcy56Yis0Pj4yPj4+MF19LHRoaXMuU2I9ZnVuY3Rpb24odCl7TVt0aGlzLnpiKzg+PjI+Pj4wXT10fSx0aGlzLldiPWZ1bmN0aW9uKCl7cmV0dXJuIE1bdGhpcy56Yis4Pj4yPj4+MF19LHRoaXMuVGI9ZnVuY3Rpb24oKXtFW3RoaXMuemI+PjI+Pj4wXT0wfSx0aGlzLkliPWZ1bmN0aW9uKHQpe1NbdGhpcy56YisxMj4+MD4+PjBdPXQ/MTowfSx0aGlzLlBiPWZ1bmN0aW9uKCl7cmV0dXJuIDAhPVNbdGhpcy56YisxMj4+MD4+PjBdfSx0aGlzLkpiPWZ1bmN0aW9uKHQpe1NbdGhpcy56YisxMz4+MD4+PjBdPXQ/MTowfSx0aGlzLkxiPWZ1bmN0aW9uKCl7cmV0dXJuIDAhPVNbdGhpcy56YisxMz4+MD4+PjBdfSx0aGlzLlJiPWZ1bmN0aW9uKHQsZSl7dGhpcy5GYigwKSx0aGlzLlViKHQpLHRoaXMuU2IoZSksdGhpcy5UYigpLHRoaXMuSWIoITEpLHRoaXMuSmIoITEpfSx0aGlzLk5iPWZ1bmN0aW9uKCl7RVt0aGlzLnpiPj4yPj4+MF0rPTF9LHRoaXMuWGI9ZnVuY3Rpb24oKXt2YXIgdD1FW3RoaXMuemI+PjI+Pj4wXTtyZXR1cm4gRVt0aGlzLnpiPj4yPj4+MF09dC0xLDE9PT10fSx0aGlzLkZiPWZ1bmN0aW9uKHQpe01bdGhpcy56YisxNj4+Mj4+PjBdPXR9LHRoaXMuT2I9ZnVuY3Rpb24oKXtyZXR1cm4gTVt0aGlzLnpiKzE2Pj4yPj4+MF19LHRoaXMuUWI9ZnVuY3Rpb24oKXtpZihNdCh0aGlzLkViKCkpKXJldHVybiBNW3RoaXMuRGI+PjI+Pj4wXTt2YXIgdD10aGlzLk9iKCk7cmV0dXJuIDAhPT10P3Q6dGhpcy5EYn19ZnVuY3Rpb24gbnQodCl7cmV0dXJuIHZ0KG5ldyBldCh0KS56Yil9dmFyIHJ0PVtdO2Z1bmN0aW9uIGF0KHQpe3ZhciBlPXJ0W3RdO3JldHVybiBlfHwodD49cnQubGVuZ3RoJiYocnQubGVuZ3RoPXQrMSkscnRbdF09ZT1VLmdldCh0KSksZX1mdW5jdGlvbiBpdCh0KXt2YXIgZT1EKHQpKzEsbj1ndChlKTtyZXR1cm4gbiYmayh0LFMsbixlKSxufXZhciBvdD17fTtmdW5jdGlvbiB1dCgpe2lmKCFjdCl7dmFyIHQsZT17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOigib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvciYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmbmF2aWdhdG9yLmxhbmd1YWdlc1swXXx8IkMiKS5yZXBsYWNlKCItIiwiXyIpKyIuVVRGLTgiLF86cHx8Ii4vdGhpcy5wcm9ncmFtIn07Zm9yKHQgaW4gb3Qpdm9pZCAwPT09b3RbdF0/ZGVsZXRlIGVbdF06ZVt0XT1vdFt0XTt2YXIgbj1bXTtmb3IodCBpbiBlKW4ucHVzaCh0KyI9IitlW3RdKTtjdD1ufXJldHVybiBjdH12YXIgY3Qsc3Q9W251bGwsW10sW11dO2Z1bmN0aW9uIGx0KHQsZSl7dmFyIG49c3RbdF07MD09PWV8fDEwPT09ZT8oKDE9PT10P3Y6dykoUihuLDApKSxuLmxlbmd0aD0wKTpuLnB1c2goZSl9dmFyIGZ0PTA7ZnVuY3Rpb24gcHQodCl7cmV0dXJuIDA9PXQlNCYmKDAhPXQlMTAwfHwwPT10JTQwMCl9dmFyIGh0PVszMSwyOSwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV0sZHQ9WzMxLDI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXTtmdW5jdGlvbiB5dCh0LGUsbixyKXtmdW5jdGlvbiBhKHQsZSxuKXtmb3IodD0ibnVtYmVyIj09dHlwZW9mIHQ/dC50b1N0cmluZygpOnR8fCIiO3QubGVuZ3RoPGU7KXQ9blswXSt0O3JldHVybiB0fWZ1bmN0aW9uIGkodCxlKXtyZXR1cm4gYSh0LGUsIjAiKX1mdW5jdGlvbiBvKHQsZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gMD50Py0xOjA8dD8xOjB9dmFyIHI7cmV0dXJuIDA9PT0ocj1uKHQuZ2V0RnVsbFllYXIoKS1lLmdldEZ1bGxZZWFyKCkpKSYmMD09PShyPW4odC5nZXRNb250aCgpLWUuZ2V0TW9udGgoKSkpJiYocj1uKHQuZ2V0RGF0ZSgpLWUuZ2V0RGF0ZSgpKSkscn1mdW5jdGlvbiB1KHQpe3N3aXRjaCh0LmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIHQ7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uIGModCl7dmFyIGU9dC5CYjtmb3IodD1uZXcgRGF0ZShuZXcgRGF0ZSh0LkNiKzE5MDAsMCwxKS5nZXRUaW1lKCkpOzA8ZTspe3ZhciBuPXQuZ2V0TW9udGgoKSxyPShwdCh0LmdldEZ1bGxZZWFyKCkpP2h0OmR0KVtuXTtpZighKGU+ci10LmdldERhdGUoKSkpe3Quc2V0RGF0ZSh0LmdldERhdGUoKStlKTticmVha31lLT1yLXQuZ2V0RGF0ZSgpKzEsdC5zZXREYXRlKDEpLDExPm4/dC5zZXRNb250aChuKzEpOih0LnNldE1vbnRoKDApLHQuc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpKzEpKX1yZXR1cm4gbj1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCkrMSwwLDQpLGU9dShuZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCw0KSksbj11KG4pLDA+PW8oZSx0KT8wPj1vKG4sdCk/dC5nZXRGdWxsWWVhcigpKzE6dC5nZXRGdWxsWWVhcigpOnQuZ2V0RnVsbFllYXIoKS0xfXZhciBzPUVbcis0MD4+Mj4+PjBdO2Zvcih2YXIgbCBpbiByPXskYjpFW3I+PjI+Pj4wXSxaYjpFW3IrND4+Mj4+PjBdLEdiOkVbcis4Pj4yPj4+MF0sS2I6RVtyKzEyPj4yPj4+MF0sSGI6RVtyKzE2Pj4yPj4+MF0sQ2I6RVtyKzIwPj4yPj4+MF0sQWI6RVtyKzI0Pj4yPj4+MF0sQmI6RVtyKzI4Pj4yPj4+MF0sYmM6RVtyKzMyPj4yPj4+MF0sWWI6RVtyKzM2Pj4yPj4+MF0sYWM6cz9qKHMpOiIifSxuPWoobikscz17IiVjIjoiJWEgJWIgJWQgJUg6JU06JVMgJVkiLCIlRCI6IiVtLyVkLyV5IiwiJUYiOiIlWS0lbS0lZCIsIiVoIjoiJWIiLCIlciI6IiVJOiVNOiVTICVwIiwiJVIiOiIlSDolTSIsIiVUIjoiJUg6JU06JVMiLCIleCI6IiVtLyVkLyV5IiwiJVgiOiIlSDolTTolUyIsIiVFYyI6IiVjIiwiJUVDIjoiJUMiLCIlRXgiOiIlbS8lZC8leSIsIiVFWCI6IiVIOiVNOiVTIiwiJUV5IjoiJXkiLCIlRVkiOiIlWSIsIiVPZCI6IiVkIiwiJU9lIjoiJWUiLCIlT0giOiIlSCIsIiVPSSI6IiVJIiwiJU9tIjoiJW0iLCIlT00iOiIlTSIsIiVPUyI6IiVTIiwiJU91IjoiJXUiLCIlT1UiOiIlVSIsIiVPViI6IiVWIiwiJU93IjoiJXciLCIlT1ciOiIlVyIsIiVPeSI6IiV5In0pbj1uLnJlcGxhY2UobmV3IFJlZ0V4cChsLCJnIiksc1tsXSk7dmFyIGY9IlN1bmRheSBNb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5Ii5zcGxpdCgiICIpLHA9IkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIiLnNwbGl0KCIgIik7Zm9yKGwgaW4gcz17IiVhIjpmdW5jdGlvbih0KXtyZXR1cm4gZlt0LkFiXS5zdWJzdHJpbmcoMCwzKX0sIiVBIjpmdW5jdGlvbih0KXtyZXR1cm4gZlt0LkFiXX0sIiViIjpmdW5jdGlvbih0KXtyZXR1cm4gcFt0LkhiXS5zdWJzdHJpbmcoMCwzKX0sIiVCIjpmdW5jdGlvbih0KXtyZXR1cm4gcFt0LkhiXX0sIiVDIjpmdW5jdGlvbih0KXtyZXR1cm4gaSgodC5DYisxOTAwKS8xMDB8MCwyKX0sIiVkIjpmdW5jdGlvbih0KXtyZXR1cm4gaSh0LktiLDIpfSwiJWUiOmZ1bmN0aW9uKHQpe3JldHVybiBhKHQuS2IsMiwiICIpfSwiJWciOmZ1bmN0aW9uKHQpe3JldHVybiBjKHQpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpfSwiJUciOmZ1bmN0aW9uKHQpe3JldHVybiBjKHQpfSwiJUgiOmZ1bmN0aW9uKHQpe3JldHVybiBpKHQuR2IsMil9LCIlSSI6ZnVuY3Rpb24odCl7cmV0dXJuIDA9PSh0PXQuR2IpP3Q9MTI6MTI8dCYmKHQtPTEyKSxpKHQsMil9LCIlaiI6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj0wO248PXQuSGItMTtlKz0ocHQodC5DYisxOTAwKT9odDpkdClbbisrXSk7cmV0dXJuIGkodC5LYitlLDMpfSwiJW0iOmZ1bmN0aW9uKHQpe3JldHVybiBpKHQuSGIrMSwyKX0sIiVNIjpmdW5jdGlvbih0KXtyZXR1cm4gaSh0LlpiLDIpfSwiJW4iOmZ1bmN0aW9uKCl7cmV0dXJuIlxcbiJ9LCIlcCI6ZnVuY3Rpb24odCl7cmV0dXJuIDA8PXQuR2ImJjEyPnQuR2I/IkFNIjoiUE0ifSwiJVMiOmZ1bmN0aW9uKHQpe3JldHVybiBpKHQuJGIsMil9LCIldCI6ZnVuY3Rpb24oKXtyZXR1cm4iXFx0In0sIiV1IjpmdW5jdGlvbih0KXtyZXR1cm4gdC5BYnx8N30sIiVVIjpmdW5jdGlvbih0KXtyZXR1cm4gaShNYXRoLmZsb29yKCh0LkJiKzctdC5BYikvNyksMil9LCIlViI6ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5mbG9vcigodC5CYis3LSh0LkFiKzYpJTcpLzcpO2lmKDI+PSh0LkFiKzM3MS10LkJiLTIpJTcmJmUrKyxlKTUzPT1lJiYoND09KG49KHQuQWIrMzcxLXQuQmIpJTcpfHwzPT1uJiZwdCh0LkNiKXx8KGU9MSkpO2Vsc2V7ZT01Mjt2YXIgbj0odC5BYis3LXQuQmItMSklNzsoND09bnx8NT09biYmcHQodC5DYiU0MDAtMSkpJiZlKyt9cmV0dXJuIGkoZSwyKX0sIiV3IjpmdW5jdGlvbih0KXtyZXR1cm4gdC5BYn0sIiVXIjpmdW5jdGlvbih0KXtyZXR1cm4gaShNYXRoLmZsb29yKCh0LkJiKzctKHQuQWIrNiklNykvNyksMil9LCIleSI6ZnVuY3Rpb24odCl7cmV0dXJuKHQuQ2IrMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMil9LCIlWSI6ZnVuY3Rpb24odCl7cmV0dXJuIHQuQ2IrMTkwMH0sIiV6IjpmdW5jdGlvbih0KXt2YXIgZT0wPD0odD10LlliKTtyZXR1cm4gdD1NYXRoLmFicyh0KS82MCwoZT8iKyI6Ii0iKStTdHJpbmcoIjAwMDAiKyh0LzYwKjEwMCt0JTYwKSkuc2xpY2UoLTQpfSwiJVoiOmZ1bmN0aW9uKHQpe3JldHVybiB0LmFjfSwiJSUiOmZ1bmN0aW9uKCl7cmV0dXJuIiUifX0sbj1uLnJlcGxhY2UoLyUlL2csIlxcMFxcMCIpLHMpbi5pbmNsdWRlcyhsKSYmKG49bi5yZXBsYWNlKG5ldyBSZWdFeHAobCwiZyIpLHNbbF0ocikpKTtyZXR1cm4gbD1mdW5jdGlvbih0KXt2YXIgZT1BcnJheShEKHQpKzEpO3JldHVybiBrKHQsZSwwLGUubGVuZ3RoKSxlfShuPW4ucmVwbGFjZSgvXFwwXFwwL2csIiUiKSksbC5sZW5ndGg+ZT8wOihTLnNldChsLHQ+Pj4wKSxsLmxlbmd0aC0xKX12YXIgYnQ9e2E6ZnVuY3Rpb24odCl7cmV0dXJuIGd0KHQrMjQpKzI0fSxtOmZ1bmN0aW9uKHQpe3JldHVybih0PW5ldyBldCh0KSkuUGIoKXx8KHQuSWIoITApLEstLSksdC5KYighMSksUS5wdXNoKHQpLHQuTmIoKSx0LlFiKCl9LGlhOmZ1bmN0aW9uKHQpe3Rocm93IHcoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biwgdGhpcyBpcyBub3QgcHJvcGVybHkgc3VwcG9ydGVkIC0gYWJvcnRpbmciKSxDPSEwLHR9LHc6ZnVuY3Rpb24oKXtPdCgwKTt2YXIgdD1RLnBvcCgpO2lmKHQuWGIoKSYmIXQuTGIoKSl7dmFyIGU9dC5XYigpO2UmJmF0KGUpKHQuRGIpLG50KHQuRGIpfXR0PTB9LGQ6ZnVuY3Rpb24oKXt2YXIgdD10dDtpZighdClyZXR1cm4gZnQ9MDt2YXIgZT1uZXcgZXQodCk7ZS5GYih0KTt2YXIgbj1lLkViKCk7aWYoIW4pcmV0dXJuIGZ0PTAsdDtmb3IodmFyIHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBpPXJbYV07aWYoMD09PWl8fGk9PT1uKWJyZWFrO2lmKEV0KGksbixlLnpiKzE2KSlyZXR1cm4gZnQ9aSx0fXJldHVybiBmdD1uLHR9LGs6ZnVuY3Rpb24oKXt2YXIgdD10dDtpZighdClyZXR1cm4gZnQ9MDt2YXIgZT1uZXcgZXQodCk7ZS5GYih0KTt2YXIgbj1lLkViKCk7aWYoIW4pcmV0dXJuIGZ0PTAsdDtmb3IodmFyIHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBpPXJbYV07aWYoMD09PWl8fGk9PT1uKWJyZWFrO2lmKEV0KGksbixlLnpiKzE2KSlyZXR1cm4gZnQ9aSx0fXJldHVybiBmdD1uLHR9LGc6ZnVuY3Rpb24oKXt2YXIgdD10dDtpZighdClyZXR1cm4gZnQ9MDt2YXIgZT1uZXcgZXQodCk7ZS5GYih0KTt2YXIgbj1lLkViKCk7aWYoIW4pcmV0dXJuIGZ0PTAsdDtmb3IodmFyIHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBpPXJbYV07aWYoMD09PWl8fGk9PT1uKWJyZWFrO2lmKEV0KGksbixlLnpiKzE2KSlyZXR1cm4gZnQ9aSx0fXJldHVybiBmdD1uLHR9LHM6bnQsTDpmdW5jdGlvbigpe3ZhciB0PVEucG9wKCk7dHx8Vigibm8gZXhjZXB0aW9uIHRvIHRocm93Iik7dmFyIGU9dC5EYjt0aHJvdyB0LkxiKCl8fChRLnB1c2godCksdC5KYighMCksdC5JYighMSksSysrKSx0dD1lLGV9LGI6ZnVuY3Rpb24odCxlLG4pe3Rocm93IG5ldyBldCh0KS5SYihlLG4pLHR0PXQsSysrLHR9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIEt9LGk6ZnVuY3Rpb24odCl7dGhyb3cgdHR8fCh0dD10KSx0fSxIOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LEJhOmZ1bmN0aW9uKCl7fSxwYTpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LHphOmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe30seWE6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe30sQWE6ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7fSxIYTpmdW5jdGlvbigpe30sSmE6ZnVuY3Rpb24oKXtWKCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCBlbmFibGUgZHluYW1pYyBsaW5raW5nLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpfSxJYTpmdW5jdGlvbigpe1YoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIGVuYWJsZSBkeW5hbWljIGxpbmtpbmcsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIil9LFM6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX0sQ2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sRGE6ZnVuY3Rpb24odCxlKXt0PW5ldyBEYXRlKDFlMyooTVt0Pj4+Ml0rNDI5NDk2NzI5NipFW3QrND4+PjJdKSksRVtlPj4yPj4+MF09dC5nZXRVVENTZWNvbmRzKCksRVtlKzQ+PjI+Pj4wXT10LmdldFVUQ01pbnV0ZXMoKSxFW2UrOD4+Mj4+PjBdPXQuZ2V0VVRDSG91cnMoKSxFW2UrMTI+PjI+Pj4wXT10LmdldFVUQ0RhdGUoKSxFW2UrMTY+PjI+Pj4wXT10LmdldFVUQ01vbnRoKCksRVtlKzIwPj4yPj4+MF09dC5nZXRVVENGdWxsWWVhcigpLTE5MDAsRVtlKzI0Pj4yPj4+MF09dC5nZXRVVENEYXkoKSxFW2UrMjg+PjI+Pj4wXT0odC5nZXRUaW1lKCktRGF0ZS5VVEModC5nZXRVVENGdWxsWWVhcigpLDAsMSwwLDAsMCwwKSkvODY0ZTV8MH0sRWE6ZnVuY3Rpb24odCxlKXt0PW5ldyBEYXRlKDFlMyooTVt0Pj4+Ml0rNDI5NDk2NzI5NipFW3QrND4+PjJdKSksRVtlPj4yPj4+MF09dC5nZXRTZWNvbmRzKCksRVtlKzQ+PjI+Pj4wXT10LmdldE1pbnV0ZXMoKSxFW2UrOD4+Mj4+PjBdPXQuZ2V0SG91cnMoKSxFW2UrMTI+PjI+Pj4wXT10LmdldERhdGUoKSxFW2UrMTY+PjI+Pj4wXT10LmdldE1vbnRoKCksRVtlKzIwPj4yPj4+MF09dC5nZXRGdWxsWWVhcigpLTE5MDAsRVtlKzI0Pj4yPj4+MF09dC5nZXREYXkoKTt2YXIgbj1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCwxKTtFW2UrMjg+PjI+Pj4wXT0odC5nZXRUaW1lKCktbi5nZXRUaW1lKCkpLzg2NGU1fDAsRVtlKzM2Pj4yPj4+MF09LTYwKnQuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgcj1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksNiwxKS5nZXRUaW1lem9uZU9mZnNldCgpO249bi5nZXRUaW1lem9uZU9mZnNldCgpLEVbZSszMj4+Mj4+PjBdPTB8KHIhPW4mJnQuZ2V0VGltZXpvbmVPZmZzZXQoKT09TWF0aC5taW4obixyKSl9LEZhOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBEYXRlKEVbdCsyMD4+Mj4+PjBdKzE5MDAsRVt0KzE2Pj4yPj4+MF0sRVt0KzEyPj4yPj4+MF0sRVt0Kzg+PjI+Pj4wXSxFW3QrND4+Mj4+PjBdLEVbdD4+Mj4+PjBdLDApLG49RVt0KzMyPj4yPj4+MF0scj1lLmdldFRpbWV6b25lT2Zmc2V0KCksYT1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKSxpPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCksbz1hLmdldFRpbWV6b25lT2Zmc2V0KCksdT1NYXRoLm1pbihvLGkpO3JldHVybiAwPm4/RVt0KzMyPj4yPj4+MF09TnVtYmVyKGkhPW8mJnU9PXIpOjA8biE9KHU9PXIpJiYoaT1NYXRoLm1heChvLGkpLGUuc2V0VGltZShlLmdldFRpbWUoKSs2ZTQqKCgwPG4/dTppKS1yKSkpLEVbdCsyND4+Mj4+PjBdPWUuZ2V0RGF5KCksRVt0KzI4Pj4yPj4+MF09KGUuZ2V0VGltZSgpLWEuZ2V0VGltZSgpKS84NjRlNXwwLEVbdD4+Mj4+PjBdPWUuZ2V0U2Vjb25kcygpLEVbdCs0Pj4yPj4+MF09ZS5nZXRNaW51dGVzKCksRVt0Kzg+PjI+Pj4wXT1lLmdldEhvdXJzKCksRVt0KzEyPj4yPj4+MF09ZS5nZXREYXRlKCksRVt0KzE2Pj4yPj4+MF09ZS5nZXRNb250aCgpLGUuZ2V0VGltZSgpLzFlM3wwfSxzYTpmdW5jdGlvbigpe3JldHVybi01Mn0sdGE6ZnVuY3Rpb24oKXt9LEdhOmZ1bmN0aW9uIHQoZSxuLHIpe3QuVmJ8fCh0LlZiPSEwLGZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQpe3JldHVybih0PXQudG9UaW1lU3RyaW5nKCkubWF0Y2goL1xcKChbQS1aYS16IF0rKVxcKSQvKSk/dFsxXToiR01UIn12YXIgYT0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCksaT1uZXcgRGF0ZShhLDAsMSksbz1uZXcgRGF0ZShhLDYsMSk7YT1pLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyIHU9by5nZXRUaW1lem9uZU9mZnNldCgpO0VbdD4+Mj4+PjBdPTYwKk1hdGgubWF4KGEsdSksRVtlPj4yPj4+MF09TnVtYmVyKGEhPXUpLHQ9cihpKSxlPXIobyksdD1pdCh0KSxlPWl0KGUpLHU8YT8oTVtuPj4yPj4+MF09dCxNW24rND4+Mj4+PjBdPWUpOihNW24+PjI+Pj4wXT1lLE1bbis0Pj4yPj4+MF09dCl9KGUsbixyKSl9LEI6ZnVuY3Rpb24oKXtWKCIiKX0sbWE6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sSTpiPygpPT57dmFyIHQ9cHJvY2Vzcy5ocnRpbWUoKTtyZXR1cm4gMWUzKnRbMF0rdFsxXS8xZTZ9OigpPT5wZXJmb3JtYW5jZS5ub3coKSx4YTpmdW5jdGlvbih0LGUsbil7VC5jb3B5V2l0aGluKHQ+Pj4wLGU+Pj4wLGUrbj4+PjApfSxHOmZ1bmN0aW9uKHQpe3ZhciBlPVQubGVuZ3RoO2lmKDQyOTQ5MDE3NjA8KHQ+Pj49MCkpcmV0dXJuITE7Zm9yKHZhciBuPTE7ND49bjtuKj0yKXt2YXIgcj1lKigxKy4yL24pO3I9TWF0aC5taW4ocix0KzEwMDY2MzI5Nik7dmFyIGE9TWF0aDtyPU1hdGgubWF4KHQsciksYT1hLm1pbi5jYWxsKGEsNDI5NDkwMTc2MCxyKyg2NTUzNi1yJTY1NTM2KSU2NTUzNik7dDp7dHJ5e08uZ3JvdyhhLUEuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2KSxQKCk7dmFyIGk9MTticmVhayB0fWNhdGNoKHQpe31pPXZvaWQgMH1pZihpKXJldHVybiEwfXJldHVybiExfSx2YTpmdW5jdGlvbih0LGUpe3ZhciBuPTA7cmV0dXJuIHV0KCkuZm9yRWFjaCgoZnVuY3Rpb24ocixhKXt2YXIgaT1lK247Zm9yKGE9TVt0KzQqYT4+Mj4+PjBdPWksaT0wO2k8ci5sZW5ndGg7KytpKVNbYSsrPj4wPj4+MF09ci5jaGFyQ29kZUF0KGkpO1NbYT4+MD4+PjBdPTAsbis9ci5sZW5ndGgrMX0pKSwwfSx3YTpmdW5jdGlvbih0LGUpe3ZhciBuPXV0KCk7TVt0Pj4yPj4+MF09bi5sZW5ndGg7dmFyIHI9MDtyZXR1cm4gbi5mb3JFYWNoKChmdW5jdGlvbih0KXtyKz10Lmxlbmd0aCsxfSkpLE1bZT4+Mj4+PjBdPXIsMH0sYmE6ZnVuY3Rpb24odCl7X3x8MDxMfHwoX3QoKSxaKFcpLHd0KDApLHN0WzFdLmxlbmd0aCYmbHQoMSwxMCksc3RbMl0ubGVuZ3RoJiZsdCgyLDEwKSksX3x8MDxMfHwoZS5vbkV4aXQmJmUub25FeGl0KHQpLEM9ITApLGgodCxuZXcgSih0KSl9LEU6ZnVuY3Rpb24oKXtyZXR1cm4gNTJ9LFE6ZnVuY3Rpb24oKXtyZXR1cm4gNTJ9LGNhOmZ1bmN0aW9uKCl7cmV0dXJuIDcwfSxQOmZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgYT0wLGk9MDtpPG47aSsrKXt2YXIgbz1NW2U+PjI+Pj4wXSx1PU1bZSs0Pj4yPj4+MF07ZSs9ODtmb3IodmFyIGM9MDtjPHU7YysrKWx0KHQsVFtvK2M+Pj4wXSk7YSs9dX1yZXR1cm4gTVtyPj4yPj4+MF09YSwwfSxjOmZ1bmN0aW9uKCl7cmV0dXJuIGZ0fSxqYTpmdW5jdGlvbiB0KGUscil7dC5NYnx8KHQuTWI9ZnVuY3Rpb24oKXtpZigib2JqZWN0Ij09dHlwZW9mIGNyeXB0byYmImZ1bmN0aW9uIj09dHlwZW9mIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpe3ZhciB0PW5ldyBVaW50OEFycmF5KDEpO3JldHVybigpPT4oY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh0KSx0WzBdKX1pZihiKXRyeXt2YXIgZT1uKE9iamVjdChmdW5jdGlvbigpe3ZhciB0PW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlIFwnY3J5cHRvXCciKTt0aHJvdyB0LmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLHR9KCkpKTtyZXR1cm4oKT0+ZS5yYW5kb21CeXRlcygxKVswXX1jYXRjaCh0KXt9cmV0dXJuKCk9PlYoInJhbmRvbURldmljZSIpfSgpKTtmb3IodmFyIGE9MDthPHI7YSsrKVNbZSthPj4wPj4+MF09dC5NYigpO3JldHVybiAwfSxlYTpmdW5jdGlvbih0LGUsbil7dmFyIHI9QXQoKTt0cnl7cmV0dXJuIGF0KHQpKGUsbil9Y2F0Y2godCl7aWYoU3QociksdCE9PXQrMCl0aHJvdyB0O090KDEsMCl9fSxmYTpmdW5jdGlvbih0LGUsbil7dmFyIHI9QXQoKTt0cnl7cmV0dXJuIGF0KHQpKGUsbil9Y2F0Y2godCl7aWYoU3QociksdCE9PXQrMCl0aHJvdyB0O090KDEsMCl9fSxKOmZ1bmN0aW9uKHQpe3ZhciBlPUF0KCk7dHJ5e3JldHVybiBhdCh0KSgpfWNhdGNoKHQpe2lmKFN0KGUpLHQhPT10KzApdGhyb3cgdDtPdCgxLDApfX0sZTpmdW5jdGlvbih0LGUpe3ZhciBuPUF0KCk7dHJ5e3JldHVybiBhdCh0KShlKX1jYXRjaCh0KXtpZihTdChuKSx0IT09dCswKXRocm93IHQ7T3QoMSwwKX19LE46ZnVuY3Rpb24odCxlLG4pe3ZhciByPUF0KCk7dHJ5e3JldHVybiBhdCh0KShlLG4pfWNhdGNoKHQpe2lmKFN0KHIpLHQhPT10KzApdGhyb3cgdDtPdCgxLDApfX0sTzpmdW5jdGlvbih0LGUsbil7dmFyIHI9QXQoKTt0cnl7cmV0dXJuIGF0KHQpKGUsbil9Y2F0Y2godCl7aWYoU3QociksdCE9PXQrMCl0aHJvdyB0O090KDEsMCl9fSxqOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1BdCgpO3RyeXtyZXR1cm4gYXQodCkoZSxuKX1jYXRjaCh0KXtpZihTdChyKSx0IT09dCswKXRocm93IHQ7T3QoMSwwKX19LG86ZnVuY3Rpb24odCxlLG4scil7dmFyIGE9QXQoKTt0cnl7cmV0dXJuIGF0KHQpKGUsbixyKX1jYXRjaCh0KXtpZihTdChhKSx0IT09dCswKXRocm93IHQ7T3QoMSwwKX19LHA6ZnVuY3Rpb24odCxlLG4scixhKXt2YXIgaT1BdCgpO3RyeXtyZXR1cm4gYXQodCkoZSxuLHIsYSl9Y2F0Y2godCl7aWYoU3QoaSksdCE9PXQrMCl0aHJvdyB0O090KDEsMCl9fSxNOmZ1bmN0aW9uKHQsZSxuLHIsYSxpKXt2YXIgbz1BdCgpO3RyeXtyZXR1cm4gYXQodCkoZSxuLHIsYSxpKX1jYXRjaCh0KXtpZihTdChvKSx0IT09dCswKXRocm93IHQ7T3QoMSwwKX19LHI6ZnVuY3Rpb24odCxlLG4scixhLGkpe3ZhciBvPUF0KCk7dHJ5e3JldHVybiBhdCh0KShlLG4scixhLGkpfWNhdGNoKHQpe2lmKFN0KG8pLHQhPT10KzApdGhyb3cgdDtPdCgxLDApfX0sdjpmdW5jdGlvbih0LGUsbixyLGEsaSxvKXt2YXIgdT1BdCgpO3RyeXtyZXR1cm4gYXQodCkoZSxuLHIsYSxpLG8pfWNhdGNoKHQpe2lmKFN0KHUpLHQhPT10KzApdGhyb3cgdDtPdCgxLDApfX0sSzpmdW5jdGlvbih0LGUsbixyLGEsaSxvLHUpe3ZhciBjPUF0KCk7dHJ5e3JldHVybiBhdCh0KShlLG4scixhLGksbyx1KX1jYXRjaCh0KXtpZihTdChjKSx0IT09dCswKXRocm93IHQ7T3QoMSwwKX19LEQ6ZnVuY3Rpb24odCxlLG4scixhLGksbyx1LGMscyxsLGYpe3ZhciBwPUF0KCk7dHJ5e3JldHVybiBhdCh0KShlLG4scixhLGksbyx1LGMscyxsLGYpfWNhdGNoKHQpe2lmKFN0KHApLHQhPT10KzApdGhyb3cgdDtPdCgxLDApfX0sWDpmdW5jdGlvbih0LGUsbixyLGEsaSxvLHUpe3ZhciBjPUF0KCk7dHJ5e3JldHVybiBGdCh0LGUsbixyLGEsaSxvLHUpfWNhdGNoKHQpe2lmKFN0KGMpLHQhPT10KzApdGhyb3cgdDtPdCgxLDApfX0sVjpmdW5jdGlvbih0LGUsbixyLGEsaSxvKXt2YXIgdT1BdCgpO3RyeXtyZXR1cm4geHQodCxlLG4scixhLGksbyl9Y2F0Y2godCl7aWYoU3QodSksdCE9PXQrMCl0aHJvdyB0O090KDEsMCl9fSxVOmZ1bmN0aW9uKHQsZSxuLHIsYSl7dmFyIGk9QXQoKTt0cnl7cmV0dXJuIEl0KHQsZSxuLHIsYSl9Y2F0Y2godCl7aWYoU3QoaSksdCE9PXQrMCl0aHJvdyB0O090KDEsMCl9fSxaOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBhPUF0KCk7dHJ5e3JldHVybiBQdCh0LGUsbixyKX1jYXRjaCh0KXtpZihTdChhKSx0IT09dCswKXRocm93IHQ7T3QoMSwwKX19LFc6ZnVuY3Rpb24odCl7dmFyIGU9QXQoKTt0cnl7cmV0dXJuIEN0KHQpfWNhdGNoKHQpe2lmKFN0KGUpLHQhPT10KzApdGhyb3cgdDtPdCgxLDApfX0sWTpmdW5jdGlvbih0LGUpe3ZhciBuPUF0KCk7dHJ5e3JldHVybiBVdCh0LGUpfWNhdGNoKHQpe2lmKFN0KG4pLHQhPT10KzApdGhyb3cgdDtPdCgxLDApfX0sVDpmdW5jdGlvbih0LGUsbil7dmFyIHI9QXQoKTt0cnl7cmV0dXJuIFJ0KHQsZSxuKX1jYXRjaCh0KXtpZihTdChyKSx0IT09dCswKXRocm93IHQ7T3QoMSwwKX19LGY6ZnVuY3Rpb24odCl7dmFyIGU9QXQoKTt0cnl7YXQodCkoKX1jYXRjaCh0KXtpZihTdChlKSx0IT09dCswKXRocm93IHQ7T3QoMSwwKX19LHE6ZnVuY3Rpb24odCxlKXt2YXIgbj1BdCgpO3RyeXthdCh0KShlKX1jYXRjaCh0KXtpZihTdChuKSx0IT09dCswKXRocm93IHQ7T3QoMSwwKX19LGg6ZnVuY3Rpb24odCxlLG4pe3ZhciByPUF0KCk7dHJ5e2F0KHQpKGUsbil9Y2F0Y2godCl7aWYoU3QociksdCE9PXQrMCl0aHJvdyB0O090KDEsMCl9fSxkYTpmdW5jdGlvbih0LGUsbixyKXt2YXIgYT1BdCgpO3RyeXthdCh0KShlLG4scil9Y2F0Y2godCl7aWYoU3QoYSksdCE9PXQrMCl0aHJvdyB0O090KDEsMCl9fSxsOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBhPUF0KCk7dHJ5e2F0KHQpKGUsbixyKX1jYXRjaCh0KXtpZihTdChhKSx0IT09dCswKXRocm93IHQ7T3QoMSwwKX19LHQ6ZnVuY3Rpb24odCxlLG4scixhKXt2YXIgaT1BdCgpO3RyeXthdCh0KShlLG4scixhKX1jYXRjaCh0KXtpZihTdChpKSx0IT09dCswKXRocm93IHQ7T3QoMSwwKX19LHU6ZnVuY3Rpb24odCxlLG4scixhLGkpe3ZhciBvPUF0KCk7dHJ5e2F0KHQpKGUsbixyLGEsaSl9Y2F0Y2godCl7aWYoU3QobyksdCE9PXQrMCl0aHJvdyB0O090KDEsMCl9fSx4OmZ1bmN0aW9uKHQsZSxuLHIsYSxpLG8pe3ZhciB1PUF0KCk7dHJ5e2F0KHQpKGUsbixyLGEsaSxvKX1jYXRjaCh0KXtpZihTdCh1KSx0IT09dCswKXRocm93IHQ7T3QoMSwwKX19LHo6ZnVuY3Rpb24odCxlLG4scixhLGksbyx1KXt2YXIgYz1BdCgpO3RyeXthdCh0KShlLG4scixhLGksbyx1KX1jYXRjaCh0KXtpZihTdChjKSx0IT09dCswKXRocm93IHQ7T3QoMSwwKX19LGdhOmZ1bmN0aW9uKHQsZSxuLHIsYSxpLG8sdSxjKXt2YXIgcz1BdCgpO3RyeXthdCh0KShlLG4scixhLGksbyx1LGMpfWNhdGNoKHQpe2lmKFN0KHMpLHQhPT10KzApdGhyb3cgdDtPdCgxLDApfX0sQTpmdW5jdGlvbih0LGUsbixyLGEsaSxvLHUsYyxzLGwpe3ZhciBmPUF0KCk7dHJ5e2F0KHQpKGUsbixyLGEsaSxvLHUsYyxzLGwpfWNhdGNoKHQpe2lmKFN0KGYpLHQhPT10KzApdGhyb3cgdDtPdCgxLDApfX0sQzpmdW5jdGlvbih0LGUsbixyLGEsaSxvLHUsYyxzLGwsZixwLGgsZCx5KXt2YXIgYj1BdCgpO3RyeXthdCh0KShlLG4scixhLGksbyx1LGMscyxsLGYscCxoLGQseSl9Y2F0Y2godCl7aWYoU3QoYiksdCE9PXQrMCl0aHJvdyB0O090KDEsMCl9fSxhYTpmdW5jdGlvbih0LGUsbixyLGEsaSxvLHUpe3ZhciBjPUF0KCk7dHJ5e2p0KHQsZSxuLHIsYSxpLG8sdSl9Y2F0Y2godCl7aWYoU3QoYyksdCE9PXQrMCl0aHJvdyB0O090KDEsMCl9fSxfOmZ1bmN0aW9uKHQsZSxuLHIsYSxpLG8sdSxjLHMsbCxmKXt2YXIgcD1BdCgpO3RyeXtEdCh0LGUsbixyLGEsaSxvLHUsYyxzLGwsZil9Y2F0Y2godCl7aWYoU3QocCksdCE9PXQrMCl0aHJvdyB0O090KDEsMCl9fSwkOmZ1bmN0aW9uKHQsZSxuLHIsYSxpKXt2YXIgbz1BdCgpO3RyeXtrdCh0LGUsbixyLGEsaSl9Y2F0Y2godCl7aWYoU3QobyksdCE9PXQrMCl0aHJvdyB0O090KDEsMCl9fSxuOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxGOmZ1bmN0aW9uKHQpe2Z0PXR9LGhhOnl0LHk6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHl0KHQsZSxuLHIpfX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtlLmFzbT10LmV4cG9ydHMsTz1lLmFzbS5LYSxQKCksVT1lLmFzbS5pYixJLnVuc2hpZnQoZS5hc20uTGEpLEItLSxlLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmUubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhCKSwwPT1CJiYobnVsbCE9PUcmJihjbGVhckludGVydmFsKEcpLEc9bnVsbCksTiYmKHQ9TixOPW51bGwsdCgpKSl9ZnVuY3Rpb24gbihlKXt0KGUuaW5zdGFuY2UpfWZ1bmN0aW9uIHIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIWcmJihkfHx5KSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGZldGNoJiYhWS5zdGFydHNXaXRoKCJmaWxlOi8vIikpcmV0dXJuIGZldGNoKFkse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKChmdW5jdGlvbih0KXtpZighdC5vayl0aHJvdyJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0IFwnIitZKyJcJyI7cmV0dXJuIHQuYXJyYXlCdWZmZXIoKX0pKS5jYXRjaCgoZnVuY3Rpb24oKXtyZXR1cm4gWCgpfSkpO2lmKG8pcmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LGUpe28oWSwoZnVuY3Rpb24oZSl7dChuZXcgVWludDhBcnJheShlKSl9KSxlKX0pKX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gWCgpfSkpfSgpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh0LGkpfSkpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpLnRoZW4odCwoZnVuY3Rpb24odCl7dygiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIit0KSxWKHQpfSkpfXZhciBpPXthOmJ0fTtpZihCKyssZS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZlLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoQiksZS5pbnN0YW50aWF0ZVdhc20pdHJ5e3JldHVybiBlLmluc3RhbnRpYXRlV2FzbShpLHQpfWNhdGNoKHQpe3JldHVybiB3KCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK3QpLCExfShnfHwiZnVuY3Rpb24iIT10eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmd8fCQoKXx8WS5zdGFydHNXaXRoKCJmaWxlOi8vIil8fGJ8fCJmdW5jdGlvbiIhPXR5cGVvZiBmZXRjaD9yKG4pOmZldGNoKFkse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcodCxpKS50aGVuKG4sKGZ1bmN0aW9uKHQpe3JldHVybiB3KCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIit0KSx3KCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpLHIobil9KSl9KSkpLmNhdGNoKGEpfSgpLGUuX19fd2FzbV9jYWxsX2N0b3JzPWZ1bmN0aW9uKCl7cmV0dXJuKGUuX19fd2FzbV9jYWxsX2N0b3JzPWUuYXNtLkxhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGUuX09ydEluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4oZS5fT3J0SW5pdD1lLmFzbS5NYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxlLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybihlLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz1lLmFzbS5OYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxlLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj1mdW5jdGlvbigpe3JldHVybihlLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj1lLmFzbS5PYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxlLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9ZnVuY3Rpb24oKXtyZXR1cm4oZS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PWUuYXNtLlBhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGUuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybihlLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9ZS5hc20uUWEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZS5fT3J0Q3JlYXRlU2Vzc2lvbj1mdW5jdGlvbigpe3JldHVybihlLl9PcnRDcmVhdGVTZXNzaW9uPWUuYXNtLlJhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGUuX09ydFJlbGVhc2VTZXNzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuKGUuX09ydFJlbGVhc2VTZXNzaW9uPWUuYXNtLlNhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGUuX09ydEdldElucHV0Q291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4oZS5fT3J0R2V0SW5wdXRDb3VudD1lLmFzbS5UYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxlLl9PcnRHZXRPdXRwdXRDb3VudD1mdW5jdGlvbigpe3JldHVybihlLl9PcnRHZXRPdXRwdXRDb3VudD1lLmFzbS5VYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxlLl9PcnRHZXRJbnB1dE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4oZS5fT3J0R2V0SW5wdXROYW1lPWUuYXNtLlZhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGUuX09ydEdldE91dHB1dE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4oZS5fT3J0R2V0T3V0cHV0TmFtZT1lLmFzbS5XYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxlLl9PcnRGcmVlPWZ1bmN0aW9uKCl7cmV0dXJuKGUuX09ydEZyZWU9ZS5hc20uWGEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZS5fT3J0Q3JlYXRlVGVuc29yPWZ1bmN0aW9uKCl7cmV0dXJuKGUuX09ydENyZWF0ZVRlbnNvcj1lLmFzbS5ZYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxlLl9PcnRHZXRUZW5zb3JEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuKGUuX09ydEdldFRlbnNvckRhdGE9ZS5hc20uWmEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZS5fT3J0UmVsZWFzZVRlbnNvcj1mdW5jdGlvbigpe3JldHVybihlLl9PcnRSZWxlYXNlVGVuc29yPWUuYXNtLl9hKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGUuX09ydENyZWF0ZVJ1bk9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4oZS5fT3J0Q3JlYXRlUnVuT3B0aW9ucz1lLmFzbS4kYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxlLl9PcnRBZGRSdW5Db25maWdFbnRyeT1mdW5jdGlvbigpe3JldHVybihlLl9PcnRBZGRSdW5Db25maWdFbnRyeT1lLmFzbS5hYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxlLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybihlLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1lLmFzbS5iYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxlLl9PcnRSdW49ZnVuY3Rpb24oKXtyZXR1cm4oZS5fT3J0UnVuPWUuYXNtLmNiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGUuX09ydEVuZFByb2ZpbGluZz1mdW5jdGlvbigpe3JldHVybihlLl9PcnRFbmRQcm9maWxpbmc9ZS5hc20uZGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIG10LGd0PWUuX21hbGxvYz1mdW5jdGlvbigpe3JldHVybihndD1lLl9tYWxsb2M9ZS5hc20uZWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdnQ9ZS5fZnJlZT1mdW5jdGlvbigpe3JldHVybih2dD1lLl9mcmVlPWUuYXNtLmZiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHd0PWUuX2ZmbHVzaD1mdW5jdGlvbigpe3JldHVybih3dD1lLl9mZmx1c2g9ZS5hc20uZ2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sX3Q9ZS5fX19mdW5jc19vbl9leGl0PWZ1bmN0aW9uKCl7cmV0dXJuKF90PWUuX19fZnVuY3Nfb25fZXhpdD1lLmFzbS5oYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxPdD1lLl9zZXRUaHJldz1mdW5jdGlvbigpe3JldHVybihPdD1lLl9zZXRUaHJldz1lLmFzbS5qYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxBdD1lLnN0YWNrU2F2ZT1mdW5jdGlvbigpe3JldHVybihBdD1lLnN0YWNrU2F2ZT1lLmFzbS5rYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxTdD1lLnN0YWNrUmVzdG9yZT1mdW5jdGlvbigpe3JldHVybihTdD1lLnN0YWNrUmVzdG9yZT1lLmFzbS5sYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxUdD1lLnN0YWNrQWxsb2M9ZnVuY3Rpb24oKXtyZXR1cm4oVHQ9ZS5zdGFja0FsbG9jPWUuYXNtLm1iKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEV0PWUuX19fY3hhX2Nhbl9jYXRjaD1mdW5jdGlvbigpe3JldHVybihFdD1lLl9fX2N4YV9jYW5fY2F0Y2g9ZS5hc20ubmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTXQ9ZS5fX19jeGFfaXNfcG9pbnRlcl90eXBlPWZ1bmN0aW9uKCl7cmV0dXJuKE10PWUuX19fY3hhX2lzX3BvaW50ZXJfdHlwZT1lLmFzbS5vYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxDdD1lLmR5bkNhbGxfaj1mdW5jdGlvbigpe3JldHVybihDdD1lLmR5bkNhbGxfaj1lLmFzbS5wYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx4dD1lLmR5bkNhbGxfaWlpaWlqPWZ1bmN0aW9uKCl7cmV0dXJuKHh0PWUuZHluQ2FsbF9paWlpaWo9ZS5hc20ucWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUnQ9ZS5keW5DYWxsX2ppaT1mdW5jdGlvbigpe3JldHVybihSdD1lLmR5bkNhbGxfamlpPWUuYXNtLnJiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGp0PWUuZHluQ2FsbF92aWlpaWlqPWZ1bmN0aW9uKCl7cmV0dXJuKGp0PWUuZHluQ2FsbF92aWlpaWlqPWUuYXNtLnNiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGt0PWUuZHluQ2FsbF92amppPWZ1bmN0aW9uKCl7cmV0dXJuKGt0PWUuZHluQ2FsbF92amppPWUuYXNtLnRiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LER0PWUuZHluQ2FsbF92aWlpampqaWk9ZnVuY3Rpb24oKXtyZXR1cm4oRHQ9ZS5keW5DYWxsX3ZpaWlqamppaT1lLmFzbS51YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxQdD1lLmR5bkNhbGxfaWlqPWZ1bmN0aW9uKCl7cmV0dXJuKFB0PWUuZHluQ2FsbF9paWo9ZS5hc20udmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sVXQ9ZS5keW5DYWxsX2ppPWZ1bmN0aW9uKCl7cmV0dXJuKFV0PWUuZHluQ2FsbF9qaT1lLmFzbS53YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxGdD1lLmR5bkNhbGxfaWlpaWlpaj1mdW5jdGlvbigpe3JldHVybihGdD1lLmR5bkNhbGxfaWlpaWlpaj1lLmFzbS54YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxJdD1lLmR5bkNhbGxfaWlpaj1mdW5jdGlvbigpe3JldHVybihJdD1lLmR5bkNhbGxfaWlpaj1lLmFzbS55YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfTtmdW5jdGlvbiBXdCgpe2Z1bmN0aW9uIHQoKXtpZighbXQmJihtdD0hMCxlLmNhbGxlZFJ1bj0hMCwhQykpe2lmKFooSSkscihlKSxlLm9uUnVudGltZUluaXRpYWxpemVkJiZlLm9uUnVudGltZUluaXRpYWxpemVkKCksZS5wb3N0UnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgZS5wb3N0UnVuJiYoZS5wb3N0UnVuPVtlLnBvc3RSdW5dKTtlLnBvc3RSdW4ubGVuZ3RoOyl7dmFyIHQ9ZS5wb3N0UnVuLnNoaWZ0KCk7SC51bnNoaWZ0KHQpfVooSCl9fWlmKCEoMDxCKSl7aWYoZS5wcmVSdW4pZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBlLnByZVJ1biYmKGUucHJlUnVuPVtlLnByZVJ1bl0pO2UucHJlUnVuLmxlbmd0aDspeigpO1ooRiksMDxCfHwoZS5zZXRTdGF0dXM/KGUuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Uuc2V0U3RhdHVzKCIiKX0pLDEpLHQoKX0pLDEpKTp0KCkpfX1pZihlLlVURjhUb1N0cmluZz1qLGUuc3RyaW5nVG9VVEY4PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gayh0LFQsZSxuKX0sZS5sZW5ndGhCeXRlc1VURjg9RCxlLnN0YWNrU2F2ZT1BdCxlLnN0YWNrUmVzdG9yZT1TdCxlLnN0YWNrQWxsb2M9VHQsTj1mdW5jdGlvbiB0KCl7bXR8fFd0KCksbXR8fChOPXQpfSxlLnByZUluaXQpZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBlLnByZUluaXQmJihlLnByZUluaXQ9W2UucHJlSW5pdF0pOzA8ZS5wcmVJbml0Lmxlbmd0aDspZS5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIFd0KCksdC5yZWFkeX0pO3QuZXhwb3J0cz1yfSw5Njc6KHQsZSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuaXRlcmF0ZUV4dHJhT3B0aW9ucz12b2lkIDAsZS5pdGVyYXRlRXh0cmFPcHRpb25zPSh0LG4scixhKT0+e2lmKCJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQpe2lmKHIuaGFzKHQpKXRocm93IG5ldyBFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGluIG9wdGlvbnMiKTtyLmFkZCh0KX1PYmplY3QuZW50cmllcyh0KS5mb3JFYWNoKCgoW3QsaV0pPT57Y29uc3Qgbz1uP24rdDp0O2lmKCJvYmplY3QiPT10eXBlb2YgaSkoMCxlLml0ZXJhdGVFeHRyYU9wdGlvbnMpKGksbysiLiIscixhKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgaXx8Im51bWJlciI9PXR5cGVvZiBpKWEobyxpLnRvU3RyaW5nKCkpO2Vsc2V7aWYoImJvb2xlYW4iIT10eXBlb2YgaSl0aHJvdyBuZXcgRXJyb3IoIkNhblwndCBoYW5kbGUgZXh0cmEgY29uZmlnIHR5cGU6ICIrdHlwZW9mIGkpO2EobyxpPyIxIjoiMCIpfX0pKX19LDU4NjoodCxlLG4pPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLnNldFJ1bk9wdGlvbnM9dm9pZCAwO2NvbnN0IHI9big5NjcpLGE9big5ODMpLGk9bigzNjEpO2Uuc2V0UnVuT3B0aW9ucz10PT57Y29uc3QgZT0oMCxpLmdldEluc3RhbmNlKSgpO2xldCBuPTA7Y29uc3Qgbz1bXSx1PXR8fHt9O3RyeXtpZih2b2lkIDA9PT0obnVsbD09dD92b2lkIDA6dC5sb2dTZXZlcml0eUxldmVsKSl1LmxvZ1NldmVyaXR5TGV2ZWw9MjtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2YgdC5sb2dTZXZlcml0eUxldmVsfHwhTnVtYmVyLmlzSW50ZWdlcih0LmxvZ1NldmVyaXR5TGV2ZWwpfHx0LmxvZ1NldmVyaXR5TGV2ZWw8MHx8dC5sb2dTZXZlcml0eUxldmVsPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHt0LmxvZ1NldmVyaXR5TGV2ZWx9YCk7aWYodm9pZCAwPT09KG51bGw9PXQ/dm9pZCAwOnQubG9nVmVyYm9zaXR5TGV2ZWwpKXUubG9nVmVyYm9zaXR5TGV2ZWw9MDtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2YgdC5sb2dWZXJib3NpdHlMZXZlbHx8IU51bWJlci5pc0ludGVnZXIodC5sb2dWZXJib3NpdHlMZXZlbCkpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHt0LmxvZ1ZlcmJvc2l0eUxldmVsfWApO3ZvaWQgMD09PShudWxsPT10P3ZvaWQgMDp0LnRlcm1pbmF0ZSkmJih1LnRlcm1pbmF0ZT0hMSk7bGV0IGk9MDtpZih2b2lkIDAhPT0obnVsbD09dD92b2lkIDA6dC50YWcpJiYoaT0oMCxhLmFsbG9jV2FzbVN0cmluZykodC50YWcsbykpLG49ZS5fT3J0Q3JlYXRlUnVuT3B0aW9ucyh1LmxvZ1NldmVyaXR5TGV2ZWwsdS5sb2dWZXJib3NpdHlMZXZlbCwhIXUudGVybWluYXRlLGkpLDA9PT1uKXRocm93IG5ldyBFcnJvcigiQ2FuXCd0IGNyZWF0ZSBydW4gb3B0aW9ucyIpO3JldHVybiB2b2lkIDAhPT0obnVsbD09dD92b2lkIDA6dC5leHRyYSkmJigwLHIuaXRlcmF0ZUV4dHJhT3B0aW9ucykodC5leHRyYSwiIixuZXcgV2Vha1NldCwoKHQscik9Pntjb25zdCBpPSgwLGEuYWxsb2NXYXNtU3RyaW5nKSh0LG8pLHU9KDAsYS5hbGxvY1dhc21TdHJpbmcpKHIsbyk7aWYoMCE9PWUuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5KG4saSx1KSl0aHJvdyBuZXcgRXJyb3IoYENhblwndCBzZXQgYSBydW4gY29uZmlnIGVudHJ5OiAke3R9IC0gJHtyfWApfSkpLFtuLG9dfWNhdGNoKHQpe3Rocm93IDAhPT1uJiZlLl9PcnRSZWxlYXNlUnVuT3B0aW9ucyhuKSxvLmZvckVhY2goZS5fZnJlZSksdH19fSw5MTk6KHQsZSxuKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5zZXRTZXNzaW9uT3B0aW9ucz12b2lkIDA7Y29uc3Qgcj1uKDk2NyksYT1uKDk4MyksaT1uKDM2MSk7ZS5zZXRTZXNzaW9uT3B0aW9ucz10PT57Y29uc3QgZT0oMCxpLmdldEluc3RhbmNlKSgpO2xldCBuPTA7Y29uc3Qgbz1bXSx1PXR8fHt9Oyh0PT57dC5leHRyYXx8KHQuZXh0cmE9e30pLHQuZXh0cmEuc2Vzc2lvbnx8KHQuZXh0cmEuc2Vzc2lvbj17fSk7Y29uc3QgZT10LmV4dHJhLnNlc3Npb247ZS51c2Vfb3J0X21vZGVsX2J5dGVzX2RpcmVjdGx5fHwoZS51c2Vfb3J0X21vZGVsX2J5dGVzX2RpcmVjdGx5PSIxIil9KSh1KTt0cnl7dm9pZCAwPT09KG51bGw9PXQ/dm9pZCAwOnQuZ3JhcGhPcHRpbWl6YXRpb25MZXZlbCkmJih1LmdyYXBoT3B0aW1pemF0aW9uTGV2ZWw9ImFsbCIpO2NvbnN0IGM9KHQ9Pntzd2l0Y2godCl7Y2FzZSJkaXNhYmxlZCI6cmV0dXJuIDA7Y2FzZSJiYXNpYyI6cmV0dXJuIDE7Y2FzZSJleHRlbmRlZCI6cmV0dXJuIDI7Y2FzZSJhbGwiOnJldHVybiA5OTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZ3JhcGggb3B0aW1pemF0aW9uIGxldmVsOiAke3R9YCl9fSkodS5ncmFwaE9wdGltaXphdGlvbkxldmVsKTt2b2lkIDA9PT0obnVsbD09dD92b2lkIDA6dC5lbmFibGVDcHVNZW1BcmVuYSkmJih1LmVuYWJsZUNwdU1lbUFyZW5hPSEwKSx2b2lkIDA9PT0obnVsbD09dD92b2lkIDA6dC5lbmFibGVNZW1QYXR0ZXJuKSYmKHUuZW5hYmxlTWVtUGF0dGVybj0hMCksdm9pZCAwPT09KG51bGw9PXQ/dm9pZCAwOnQuZXhlY3V0aW9uTW9kZSkmJih1LmV4ZWN1dGlvbk1vZGU9InNlcXVlbnRpYWwiKTtjb25zdCBzPSh0PT57c3dpdGNoKHQpe2Nhc2Uic2VxdWVudGlhbCI6cmV0dXJuIDA7Y2FzZSJwYXJhbGxlbCI6cmV0dXJuIDE7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGV4ZWN1dGlvbiBtb2RlOiAke3R9YCl9fSkodS5leGVjdXRpb25Nb2RlKTtsZXQgbD0wO2lmKHZvaWQgMCE9PShudWxsPT10P3ZvaWQgMDp0LmxvZ0lkKSYmKGw9KDAsYS5hbGxvY1dhc21TdHJpbmcpKHQubG9nSWQsbykpLHZvaWQgMD09PShudWxsPT10P3ZvaWQgMDp0LmxvZ1NldmVyaXR5TGV2ZWwpKXUubG9nU2V2ZXJpdHlMZXZlbD0yO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiB0LmxvZ1NldmVyaXR5TGV2ZWx8fCFOdW1iZXIuaXNJbnRlZ2VyKHQubG9nU2V2ZXJpdHlMZXZlbCl8fHQubG9nU2V2ZXJpdHlMZXZlbDwwfHx0LmxvZ1NldmVyaXR5TGV2ZWw+NCl0aHJvdyBuZXcgRXJyb3IoYGxvZyBzZXJ2ZXJpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke3QubG9nU2V2ZXJpdHlMZXZlbH1gKTtpZih2b2lkIDA9PT0obnVsbD09dD92b2lkIDA6dC5sb2dWZXJib3NpdHlMZXZlbCkpdS5sb2dWZXJib3NpdHlMZXZlbD0wO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiB0LmxvZ1ZlcmJvc2l0eUxldmVsfHwhTnVtYmVyLmlzSW50ZWdlcih0LmxvZ1ZlcmJvc2l0eUxldmVsKSl0aHJvdyBuZXcgRXJyb3IoYGxvZyB2ZXJib3NpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke3QubG9nVmVyYm9zaXR5TGV2ZWx9YCk7aWYodm9pZCAwPT09KG51bGw9PXQ/dm9pZCAwOnQuZW5hYmxlUHJvZmlsaW5nKSYmKHUuZW5hYmxlUHJvZmlsaW5nPSExKSxuPWUuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zKGMsISF1LmVuYWJsZUNwdU1lbUFyZW5hLCEhdS5lbmFibGVNZW1QYXR0ZXJuLHMsISF1LmVuYWJsZVByb2ZpbGluZywwLGwsdS5sb2dTZXZlcml0eUxldmVsLHUubG9nVmVyYm9zaXR5TGV2ZWwpLDA9PT1uKXRocm93IG5ldyBFcnJvcigiQ2FuXCd0IGNyZWF0ZSBzZXNzaW9uIG9wdGlvbnMiKTtyZXR1cm4obnVsbD09dD92b2lkIDA6dC5leGVjdXRpb25Qcm92aWRlcnMpJiYoKHQsZSxuKT0+e2Zvcihjb25zdCByIG9mIGUpe2xldCBlPSJzdHJpbmciPT10eXBlb2Ygcj9yOnIubmFtZTtzd2l0Y2goZSl7Y2FzZSJ4bm5wYWNrIjplPSJYTk5QQUNLIjticmVhaztjYXNlIndhc20iOmNhc2UiY3B1Ijpjb250aW51ZTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgbm90IHN1cHBvcnRlZCBFUDogJHtlfWApfWNvbnN0IG89KDAsYS5hbGxvY1dhc21TdHJpbmcpKGUsbik7aWYoMCE9PSgwLGkuZ2V0SW5zdGFuY2UpKCkuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyKHQsbykpdGhyb3cgbmV3IEVycm9yKGBDYW5cJ3QgYXBwZW5kIGV4ZWN1dGlvbiBwcm92aWRlcjogJHtlfWApfX0pKG4sdC5leGVjdXRpb25Qcm92aWRlcnMsbyksdm9pZCAwIT09KG51bGw9PXQ/dm9pZCAwOnQuZXh0cmEpJiYoMCxyLml0ZXJhdGVFeHRyYU9wdGlvbnMpKHQuZXh0cmEsIiIsbmV3IFdlYWtTZXQsKCh0LHIpPT57Y29uc3QgaT0oMCxhLmFsbG9jV2FzbVN0cmluZykodCxvKSx1PSgwLGEuYWxsb2NXYXNtU3RyaW5nKShyLG8pO2lmKDAhPT1lLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnkobixpLHUpKXRocm93IG5ldyBFcnJvcihgQ2FuXCd0IHNldCBhIHNlc3Npb24gY29uZmlnIGVudHJ5OiAke3R9IC0gJHtyfWApfSkpLFtuLG9dfWNhdGNoKHQpe3Rocm93IDAhPT1uJiZlLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnMobiksby5mb3JFYWNoKGUuX2ZyZWUpLHR9fX0sOTgzOih0LGUsbik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuYWxsb2NXYXNtU3RyaW5nPXZvaWQgMDtjb25zdCByPW4oMzYxKTtlLmFsbG9jV2FzbVN0cmluZz0odCxlKT0+e2NvbnN0IG49KDAsci5nZXRJbnN0YW5jZSkoKSxhPW4ubGVuZ3RoQnl0ZXNVVEY4KHQpKzEsaT1uLl9tYWxsb2MoYSk7cmV0dXJuIG4uc3RyaW5nVG9VVEY4KHQsaSxhKSxlLnB1c2goaSksaX19LDM0OToodCxlLG4pPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmV4dHJhY3RUcmFuc2ZlcmFibGVCdWZmZXJzPWUuZW5kUHJvZmlsaW5nPWUucnVuPWUucmVsZWFzZVNlc3Npb249ZS5jcmVhdGVTZXNzaW9uPWUuY3JlYXRlU2Vzc2lvbkZpbmFsaXplPWUuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlPWUuaW5pdE9ydD12b2lkIDA7Y29uc3Qgcj1uKDU4NiksYT1uKDkxOSksaT1uKDk4Myksbz1uKDM2MSk7ZS5pbml0T3J0PSh0LGUpPT57Y29uc3Qgbj0oMCxvLmdldEluc3RhbmNlKSgpLl9PcnRJbml0KHQsZSk7aWYoMCE9PW4pdGhyb3cgbmV3IEVycm9yKGBDYW5cJ3QgaW5pdGlhbGl6ZSBvbm54cnVudGltZS4gZXJyb3IgY29kZSA9ICR7bn1gKX07Y29uc3QgdT1uZXcgTWFwO2UuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlPXQ9Pntjb25zdCBlPSgwLG8uZ2V0SW5zdGFuY2UpKCksbj1lLl9tYWxsb2ModC5ieXRlTGVuZ3RoKTtyZXR1cm4gZS5IRUFQVTguc2V0KHQsbiksW24sdC5ieXRlTGVuZ3RoXX0sZS5jcmVhdGVTZXNzaW9uRmluYWxpemU9KHQsZSk9Pntjb25zdCBuPSgwLG8uZ2V0SW5zdGFuY2UpKCk7bGV0IHI9MCxpPTAsYz1bXTt0cnl7aWYoW2ksY109KDAsYS5zZXRTZXNzaW9uT3B0aW9ucykoZSkscj1uLl9PcnRDcmVhdGVTZXNzaW9uKHRbMF0sdFsxXSxpKSwwPT09cil0aHJvdyBuZXcgRXJyb3IoIkNhblwndCBjcmVhdGUgYSBzZXNzaW9uIil9ZmluYWxseXtuLl9mcmVlKHRbMF0pLG4uX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucyhpKSxjLmZvckVhY2gobi5fZnJlZSl9Y29uc3Qgcz1uLl9PcnRHZXRJbnB1dENvdW50KHIpLGw9bi5fT3J0R2V0T3V0cHV0Q291bnQociksZj1bXSxwPVtdLGg9W10sZD1bXTtmb3IobGV0IHQ9MDt0PHM7dCsrKXtjb25zdCBlPW4uX09ydEdldElucHV0TmFtZShyLHQpO2lmKDA9PT1lKXRocm93IG5ldyBFcnJvcigiQ2FuXCd0IGdldCBhbiBpbnB1dCBuYW1lIik7cC5wdXNoKGUpLGYucHVzaChuLlVURjhUb1N0cmluZyhlKSl9Zm9yKGxldCB0PTA7dDxsO3QrKyl7Y29uc3QgZT1uLl9PcnRHZXRPdXRwdXROYW1lKHIsdCk7aWYoMD09PWUpdGhyb3cgbmV3IEVycm9yKCJDYW5cJ3QgZ2V0IGFuIG91dHB1dCBuYW1lIik7ZC5wdXNoKGUpLGgucHVzaChuLlVURjhUb1N0cmluZyhlKSl9cmV0dXJuIHUuc2V0KHIsW3IscCxkXSksW3IsZixoXX0sZS5jcmVhdGVTZXNzaW9uPSh0LG4pPT57Y29uc3Qgcj0oMCxlLmNyZWF0ZVNlc3Npb25BbGxvY2F0ZSkodCk7cmV0dXJuKDAsZS5jcmVhdGVTZXNzaW9uRmluYWxpemUpKHIsbil9LGUucmVsZWFzZVNlc3Npb249dD0+e2NvbnN0IGU9KDAsby5nZXRJbnN0YW5jZSkoKSxuPXUuZ2V0KHQpO2lmKCFuKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzZXNzaW9uIGlkIik7Y29uc3Qgcj1uWzBdLGE9blsxXSxpPW5bMl07YS5mb3JFYWNoKGUuX09ydEZyZWUpLGkuZm9yRWFjaChlLl9PcnRGcmVlKSxlLl9PcnRSZWxlYXNlU2Vzc2lvbihyKSx1LmRlbGV0ZSh0KX07Y29uc3QgYz10PT57c3dpdGNoKHQpe2Nhc2UiaW50OCI6cmV0dXJuIDM7Y2FzZSJ1aW50OCI6cmV0dXJuIDI7Y2FzZSJib29sIjpyZXR1cm4gOTtjYXNlImludDE2IjpyZXR1cm4gNTtjYXNlInVpbnQxNiI6cmV0dXJuIDQ7Y2FzZSJpbnQzMiI6cmV0dXJuIDY7Y2FzZSJ1aW50MzIiOnJldHVybiAxMjtjYXNlImZsb2F0MzIiOnJldHVybiAxO2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIDExO2Nhc2Uic3RyaW5nIjpyZXR1cm4gODtjYXNlImludDY0IjpyZXR1cm4gNztjYXNlInVpbnQ2NCI6cmV0dXJuIDEzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7dH1gKX19LHM9dD0+e3N3aXRjaCh0KXtjYXNlIDM6cmV0dXJuImludDgiO2Nhc2UgMjpyZXR1cm4idWludDgiO2Nhc2UgOTpyZXR1cm4iYm9vbCI7Y2FzZSA1OnJldHVybiJpbnQxNiI7Y2FzZSA0OnJldHVybiJ1aW50MTYiO2Nhc2UgNjpyZXR1cm4iaW50MzIiO2Nhc2UgMTI6cmV0dXJuInVpbnQzMiI7Y2FzZSAxOnJldHVybiJmbG9hdDMyIjtjYXNlIDExOnJldHVybiJmbG9hdDY0IjtjYXNlIDg6cmV0dXJuInN0cmluZyI7Y2FzZSA3OnJldHVybiJpbnQ2NCI7Y2FzZSAxMzpyZXR1cm4idWludDY0IjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke3R9YCl9fSxsPXQ9Pntzd2l0Y2godCl7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gRmxvYXQzMkFycmF5O2Nhc2UidWludDgiOmNhc2UiYm9vbCI6cmV0dXJuIFVpbnQ4QXJyYXk7Y2FzZSJpbnQ4IjpyZXR1cm4gSW50OEFycmF5O2Nhc2UidWludDE2IjpyZXR1cm4gVWludDE2QXJyYXk7Y2FzZSJpbnQxNiI6cmV0dXJuIEludDE2QXJyYXk7Y2FzZSJpbnQzMiI6cmV0dXJuIEludDMyQXJyYXk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gRmxvYXQ2NEFycmF5O2Nhc2UidWludDMyIjpyZXR1cm4gVWludDMyQXJyYXk7Y2FzZSJpbnQ2NCI6cmV0dXJuIEJpZ0ludDY0QXJyYXk7Y2FzZSJ1aW50NjQiOnJldHVybiBCaWdVaW50NjRBcnJheTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdHlwZTogJHt0fWApfX07ZS5ydW49KHQsZSxuLGEsZik9Pntjb25zdCBwPSgwLG8uZ2V0SW5zdGFuY2UpKCksaD11LmdldCh0KTtpZighaCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2Vzc2lvbiBpZCIpO2NvbnN0IGQ9aFswXSx5PWhbMV0sYj1oWzJdLG09ZS5sZW5ndGgsZz1hLmxlbmd0aDtsZXQgdj0wLHc9W107Y29uc3QgXz1bXSxPPVtdO3RyeXtbdix3XT0oMCxyLnNldFJ1bk9wdGlvbnMpKGYpO2ZvcihsZXQgdD0wO3Q8bTt0Kyspe2NvbnN0IGU9blt0XVswXSxyPW5bdF1bMV0sYT1uW3RdWzJdO2xldCBvLHU7aWYoQXJyYXkuaXNBcnJheShhKSl7dT00KmEubGVuZ3RoLG89cC5fbWFsbG9jKHUpLE8ucHVzaChvKTtsZXQgdD1vLzQ7Zm9yKGxldCBlPTA7ZTxhLmxlbmd0aDtlKyspe2lmKCJzdHJpbmciIT10eXBlb2YgYVtlXSl0aHJvdyBuZXcgVHlwZUVycm9yKGB0ZW5zb3IgZGF0YSBhdCBpbmRleCAke2V9IGlzIG5vdCBhIHN0cmluZ2ApO3AuSEVBUFUzMlt0KytdPSgwLGkuYWxsb2NXYXNtU3RyaW5nKShhW2VdLE8pfX1lbHNlIHU9YS5ieXRlTGVuZ3RoLG89cC5fbWFsbG9jKHUpLE8ucHVzaChvKSxwLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkoYS5idWZmZXIsYS5ieXRlT2Zmc2V0LHUpLG8pO2NvbnN0IHM9cC5zdGFja1NhdmUoKSxsPXAuc3RhY2tBbGxvYyg0KnIubGVuZ3RoKTt0cnl7bGV0IHQ9bC80O3IuZm9yRWFjaCgoZT0+cC5IRUFQMzJbdCsrXT1lKSk7Y29uc3Qgbj1wLl9PcnRDcmVhdGVUZW5zb3IoYyhlKSxvLHUsbCxyLmxlbmd0aCk7aWYoMD09PW4pdGhyb3cgbmV3IEVycm9yKCJDYW5cJ3QgY3JlYXRlIGEgdGVuc29yIik7Xy5wdXNoKG4pfWZpbmFsbHl7cC5zdGFja1Jlc3RvcmUocyl9fWNvbnN0IHQ9cC5zdGFja1NhdmUoKSxvPXAuc3RhY2tBbGxvYyg0Km0pLHU9cC5zdGFja0FsbG9jKDQqbSksaD1wLnN0YWNrQWxsb2MoNCpnKSxBPXAuc3RhY2tBbGxvYyg0KmcpO3RyeXtsZXQgbj1vLzQscj11LzQsaT1oLzQsYz1BLzQ7Zm9yKGxldCB0PTA7dDxtO3QrKylwLkhFQVBVMzJbbisrXT1fW3RdLHAuSEVBUFUzMltyKytdPXlbZVt0XV07Zm9yKGxldCB0PTA7dDxnO3QrKylwLkhFQVBVMzJbaSsrXT0wLHAuSEVBUFUzMltjKytdPWJbYVt0XV07bGV0IGY9cC5fT3J0UnVuKGQsdSxvLG0sQSxnLGgsdik7Y29uc3Qgdz1bXTtpZigwPT09Zilmb3IobGV0IHQ9MDt0PGc7dCsrKXtjb25zdCBlPXAuSEVBUFUzMltoLzQrdF0sbj1wLnN0YWNrU2F2ZSgpLHI9cC5zdGFja0FsbG9jKDE2KTtsZXQgYSxpPTA7dHJ5e2lmKGY9cC5fT3J0R2V0VGVuc29yRGF0YShlLHIscis0LHIrOCxyKzEyKSwwIT09Zil0aHJvdyBuZXcgRXJyb3IoYENhblwndCBhY2Nlc3Mgb3V0cHV0IHRlbnNvciBkYXRhLiBlcnJvciBjb2RlID0gJHtmfWApO2xldCB0PXIvNDtjb25zdCBvPXAuSEVBUFUzMlt0KytdO2k9cC5IRUFQVTMyW3QrK107Y29uc3QgdT1wLkhFQVBVMzJbdCsrXSxjPXAuSEVBUFUzMlt0KytdLGg9W107Zm9yKGxldCB0PTA7dDxjO3QrKyloLnB1c2gocC5IRUFQVTMyW3UvNCt0XSk7cC5fT3J0RnJlZSh1KTtjb25zdCBkPTA9PT1oLmxlbmd0aD8xOmgucmVkdWNlKCgodCxlKT0+dCplKSk7aWYoYT1zKG8pLCJzdHJpbmciPT09YSl7Y29uc3QgdD1bXTtsZXQgZT1pLzQ7Zm9yKGxldCBuPTA7bjxkO24rKyl7Y29uc3Qgcj1wLkhFQVBVMzJbZSsrXSxhPW49PT1kLTE/dm9pZCAwOnAuSEVBUFUzMltlXS1yO3QucHVzaChwLlVURjhUb1N0cmluZyhyLGEpKX13LnB1c2goW2EsaCx0XSl9ZWxzZXtjb25zdCB0PW5ldyhsKGEpKShkKTtuZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKS5zZXQocC5IRUFQVTguc3ViYXJyYXkoaSxpK3QuYnl0ZUxlbmd0aCkpLHcucHVzaChbYSxoLHRdKX19ZmluYWxseXtwLnN0YWNrUmVzdG9yZShuKSwic3RyaW5nIj09PWEmJmkmJnAuX2ZyZWUoaSkscC5fT3J0UmVsZWFzZVRlbnNvcihlKX19aWYoMD09PWYpcmV0dXJuIHc7dGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gY2FsbCBPcnRSdW4oKS4gZXJyb3IgY29kZSA9ICR7Zn0uYCl9ZmluYWxseXtwLnN0YWNrUmVzdG9yZSh0KX19ZmluYWxseXtfLmZvckVhY2gocC5fT3J0UmVsZWFzZVRlbnNvciksTy5mb3JFYWNoKHAuX2ZyZWUpLHAuX09ydFJlbGVhc2VSdW5PcHRpb25zKHYpLHcuZm9yRWFjaChwLl9mcmVlKX19LGUuZW5kUHJvZmlsaW5nPXQ9Pntjb25zdCBlPSgwLG8uZ2V0SW5zdGFuY2UpKCksbj11LmdldCh0KTtpZighbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2Vzc2lvbiBpZCIpO2NvbnN0IHI9blswXSxhPWUuX09ydEVuZFByb2ZpbGluZyhyKTtpZigwPT09YSl0aHJvdyBuZXcgRXJyb3IoIkNhblwndCBnZXQgYW4gcHJvZmlsZSBmaWxlIG5hbWUiKTtlLl9PcnRGcmVlKGEpfSxlLmV4dHJhY3RUcmFuc2ZlcmFibGVCdWZmZXJzPXQ9Pntjb25zdCBlPVtdO2Zvcihjb25zdCBuIG9mIHQpe2NvbnN0IHQ9blsyXTshQXJyYXkuaXNBcnJheSh0KSYmdC5idWZmZXImJmUucHVzaCh0LmJ1ZmZlcil9cmV0dXJuIGV9fSwzNjE6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10aGlzJiZ0aGlzLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24odCxlLG4scil7dm9pZCAwPT09ciYmKHI9bik7dmFyIGE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLG4pO2EmJiEoImdldCJpbiBhPyFlLl9fZXNNb2R1bGU6YS53cml0YWJsZXx8YS5jb25maWd1cmFibGUpfHwoYT17ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVtuXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLGEpfTpmdW5jdGlvbih0LGUsbixyKXt2b2lkIDA9PT1yJiYocj1uKSx0W3JdPWVbbl19KSxhPXRoaXMmJnRoaXMuX19zZXRNb2R1bGVEZWZhdWx0fHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbih0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSl9OmZ1bmN0aW9uKHQsZSl7dC5kZWZhdWx0PWV9KSxpPXRoaXMmJnRoaXMuX19pbXBvcnRTdGFyfHxmdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGU9e307aWYobnVsbCE9dClmb3IodmFyIG4gaW4gdCkiZGVmYXVsdCIhPT1uJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmcihlLHQsbik7cmV0dXJuIGEoZSx0KSxlfSxvPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRpc3Bvc2U9ZS5nZXRJbnN0YW5jZT1lLmluaXRpYWxpemVXZWJBc3NlbWJseT12b2lkIDA7Y29uc3QgdT1pKG4oNDQ5KSksYz1vKG4oOTMyKSkscz1uKDQ3NCk7bGV0IGwsZj0hMSxwPSExLGg9ITE7Y29uc3QgZD0odCxlKT0+ZT90PyJvcnQtd2FzbS1zaW1kLXRocmVhZGVkLndhc20iOiJvcnQtd2FzbS10aHJlYWRlZC53YXNtIjp0PyJvcnQtd2FzbS1zaW1kLndhc20iOiJvcnQtd2FzbS53YXNtIjtlLmluaXRpYWxpemVXZWJBc3NlbWJseT1hc3luYyB0PT57aWYoZilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7aWYocCl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIGNhbGxzIHRvIFwnaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KClcJyBkZXRlY3RlZC4iKTtpZihoKXRocm93IG5ldyBFcnJvcigicHJldmlvdXMgY2FsbCB0byBcJ2luaXRpYWxpemVXZWJBc3NlbWJseSgpXCcgZmFpbGVkLiIpO3A9ITA7Y29uc3QgZT10LmluaXRUaW1lb3V0LHI9dC5udW1UaHJlYWRzLGE9dC5zaW1kLGk9cj4xJiYoKCk9Pnt0cnl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciYmKCJ1bmRlZmluZWQiIT10eXBlb2YgTWVzc2FnZUNoYW5uZWwmJihuZXcgTWVzc2FnZUNoYW5uZWwpLnBvcnQxLnBvc3RNZXNzYWdlKG5ldyBTaGFyZWRBcnJheUJ1ZmZlcigxKSksV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDUsNCwxLDMsMSwxLDEwLDExLDEsOSwwLDY1LDAsMjU0LDE2LDIsMCwyNiwxMV0pKSl9Y2F0Y2godCl7cmV0dXJuITF9fSkoKSxvPWEmJigoKT0+e3RyeXtyZXR1cm4gV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDEwLDMwLDEsMjgsMCw2NSwwLDI1MywxNSwyNTMsMTIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyNTMsMTg2LDEsMjYsMTFdKSl9Y2F0Y2godCl7cmV0dXJuITF9fSkoKSx5PSJzdHJpbmciPT10eXBlb2YgdC53YXNtUGF0aHM/dC53YXNtUGF0aHM6dm9pZCAwLGI9ZCghMSxpKSxtPWQobyxpKSxnPSJvYmplY3QiPT10eXBlb2YgdC53YXNtUGF0aHM/dC53YXNtUGF0aHNbbV06dm9pZCAwO2xldCB2PSExO2NvbnN0IHc9W107aWYoZT4wJiZ3LnB1c2gobmV3IFByb21pc2UoKHQ9PntzZXRUaW1lb3V0KCgoKT0+e3Y9ITAsdCgpfSksZSl9KSkpLHcucHVzaChuZXcgUHJvbWlzZSgoKHQsZSk9Pntjb25zdCByPWk/czpjLmRlZmF1bHQsYT17bG9jYXRlRmlsZToodCxlKT0+aSYmdC5lbmRzV2l0aCgiLndvcmtlci5qcyIpJiYidW5kZWZpbmVkIiE9dHlwZW9mIEJsb2I/VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbigxNTQpXSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pKTp0PT09Yj9udWxsIT1nP2c6KG51bGwhPXk/eTplKSttOmUrdH07aWYoaSlpZigidW5kZWZpbmVkIj09dHlwZW9mIEJsb2IpYS5tYWluU2NyaXB0VXJsT3JCbG9iPXUuam9pbigiLyIsIm9ydC13YXNtLXRocmVhZGVkLmpzIik7ZWxzZXtjb25zdCB0PWB2YXIgb3J0V2FzbVRocmVhZGVkPShmdW5jdGlvbigpe3ZhciBfc2NyaXB0RGlyO3JldHVybiAke3IudG9TdHJpbmcoKX19KSgpO2A7YS5tYWluU2NyaXB0VXJsT3JCbG9iPW5ldyBCbG9iKFt0XSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pfXIoYSkudGhlbigoZT0+e3A9ITEsZj0hMCxsPWUsdCgpfSksKHQ9PntwPSExLGg9ITAsZSh0KX0pKX0pKSksYXdhaXQgUHJvbWlzZS5yYWNlKHcpLHYpdGhyb3cgbmV3IEVycm9yKGBXZWJBc3NlbWJseSBiYWNrZW5kIGluaXRpYWxpemluZyBmYWlsZWQgZHVlIHRvIHRpbWVvdXQ6ICR7ZX1tc2ApfSxlLmdldEluc3RhbmNlPSgpPT57aWYoZiYmbClyZXR1cm4gbDt0aHJvdyBuZXcgRXJyb3IoIldlYkFzc2VtYmx5IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuIil9LGUuZGlzcG9zZT0oKT0+e3ZhciB0OyFmfHxwfHxofHwocD0hMCxudWxsPT09KHQ9bC5QVGhyZWFkKXx8dm9pZCAwPT09dHx8dC50ZXJtaW5hdGVBbGxUaHJlYWRzKCksbD12b2lkIDAscD0hMSxmPSExLGg9ITApfX0sMTU0OnQ9PnsidXNlIHN0cmljdCI7dC5leHBvcnRzPVwnInVzZSBzdHJpY3QiO3ZhciBlPXt9LHQ9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlO2lmKHQpe3ZhciByPXJlcXVpcmUoIndvcmtlcl90aHJlYWRzIiksYT1yLnBhcmVudFBvcnQ7YS5vbigibWVzc2FnZSIsKGU9Pm9ubWVzc2FnZSh7ZGF0YTplfSkpKTt2YXIgbz1yZXF1aXJlKCJmcyIpO09iamVjdC5hc3NpZ24oZ2xvYmFsLHtzZWxmOmdsb2JhbCxyZXF1aXJlOnJlcXVpcmUsTW9kdWxlOmUsbG9jYXRpb246e2hyZWY6X19maWxlbmFtZX0sV29ya2VyOnIuV29ya2VyLGltcG9ydFNjcmlwdHM6ZnVuY3Rpb24oZSl7KDAsZXZhbCkoby5yZWFkRmlsZVN5bmMoZSwidXRmOCIpKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oZSl7YS5wb3N0TWVzc2FnZShlKX0scGVyZm9ybWFuY2U6Z2xvYmFsLnBlcmZvcm1hbmNlfHx7bm93OmZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9fX0pfXZhciBzPSExLG49W10saT1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiICIpO3Q/by53cml0ZVN5bmMoMixlKyJcXFxcbiIpOmNvbnNvbGUuZXJyb3IoZSl9O3NlbGYuYWxlcnQ9ZnVuY3Rpb24oKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiAiKTtwb3N0TWVzc2FnZSh7Y21kOiJhbGVydCIsdGV4dDp0LHRocmVhZElkOmUuX3B0aHJlYWRfc2VsZigpfSl9LGUuaW5zdGFudGlhdGVXYXNtPSh0LHIpPT57dmFyIGE9bmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKGUud2FzbU1vZHVsZSx0KTtyZXR1cm4gcihhKSxlLndhc21Nb2R1bGU9bnVsbCxhLmV4cG9ydHN9LHNlbGYub251bmhhbmRsZWRyZWplY3Rpb249ZT0+e3Rocm93IGUucmVhc29uPz9lfSxzZWxmLm9ubWVzc2FnZT10PT57dHJ5e2lmKCJsb2FkIj09PXQuZGF0YS5jbWQpe2lmKGUud2FzbU1vZHVsZT10LmRhdGEud2FzbU1vZHVsZSxlLndhc21NZW1vcnk9dC5kYXRhLndhc21NZW1vcnksZS5idWZmZXI9ZS53YXNtTWVtb3J5LmJ1ZmZlcixlLkVOVklST05NRU5UX0lTX1BUSFJFQUQ9ITAsInN0cmluZyI9PXR5cGVvZiB0LmRhdGEudXJsT3JCbG9iKWltcG9ydFNjcmlwdHModC5kYXRhLnVybE9yQmxvYik7ZWxzZXt2YXIgcj1VUkwuY3JlYXRlT2JqZWN0VVJMKHQuZGF0YS51cmxPckJsb2IpO2ltcG9ydFNjcmlwdHMociksVVJMLnJldm9rZU9iamVjdFVSTChyKX1vcnRXYXNtVGhyZWFkZWQoZSkudGhlbigoZnVuY3Rpb24odCl7ZT10fSkpfWVsc2UgaWYoInJ1biI9PT10LmRhdGEuY21kKXtlLl9fcGVyZm9ybWFuY2Vfbm93X2Nsb2NrX2RyaWZ0PXBlcmZvcm1hbmNlLm5vdygpLXQuZGF0YS50aW1lLGUuX19lbXNjcmlwdGVuX3RocmVhZF9pbml0KHQuZGF0YS5wdGhyZWFkX3B0ciwwLDAsMSksZS5lc3RhYmxpc2hTdGFja1NwYWNlKCksZS5QVGhyZWFkLnJlY2VpdmVPYmplY3RUcmFuc2Zlcih0LmRhdGEpLGUuUFRocmVhZC50aHJlYWRJbml0VExTKCksc3x8KG4uZm9yRWFjaCgodD0+e2UuZXhlY3V0ZU5vdGlmaWVkUHJveHlpbmdRdWV1ZSh0KX0pKSxuPVtdLHM9ITApO3RyeXtlLmludm9rZUVudHJ5UG9pbnQodC5kYXRhLnN0YXJ0X3JvdXRpbmUsdC5kYXRhLmFyZyl9Y2F0Y2godCl7aWYoInVud2luZCIhPXQpe2lmKCEodCBpbnN0YW5jZW9mIGUuRXhpdFN0YXR1cykpdGhyb3cgdDtlLmtlZXBSdW50aW1lQWxpdmUoKXx8ZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2V4aXQodC5zdGF0dXMpfX19ZWxzZSJjYW5jZWwiPT09dC5kYXRhLmNtZD9lLl9wdGhyZWFkX3NlbGYoKSYmZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2V4aXQoLTEpOiJzZXRpbW1lZGlhdGUiPT09dC5kYXRhLnRhcmdldHx8KCJwcm9jZXNzUHJveHlpbmdRdWV1ZSI9PT10LmRhdGEuY21kP3M/ZS5leGVjdXRlTm90aWZpZWRQcm94eWluZ1F1ZXVlKHQuZGF0YS5xdWV1ZSk6bi5wdXNoKHQuZGF0YS5xdWV1ZSk6KGkoIndvcmtlci5qcyByZWNlaXZlZCB1bmtub3duIGNvbW1hbmQgIit0LmRhdGEuY21kKSxpKHQuZGF0YSkpKX1jYXRjaCh0KXt0aHJvdyBpKCJ3b3JrZXIuanMgb25tZXNzYWdlKCkgY2FwdHVyZWQgYW4gdW5jYXVnaHQgZXhjZXB0aW9uOiAiK3QpLHQmJnQuc3RhY2smJmkodC5zdGFjayksZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQmJmUuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkKCksdH19O1xcblwnfSwzODQ6KCk9Pnt9LDk5MzooKT0+e30sOTA4OigpPT57fSw5NTM6KCk9Pnt9LDkyNTooKT0+e30sNDQ5OigpPT57fX0sZT17fTtmdW5jdGlvbiBuKHIpe3ZhciBhPWVbcl07aWYodm9pZCAwIT09YSlyZXR1cm4gYS5leHBvcnRzO3ZhciBpPWVbcl09e2V4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLG4pLGkuZXhwb3J0c31uLmc9ZnVuY3Rpb24oKXtpZigib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMpcmV0dXJuIGdsb2JhbFRoaXM7dHJ5e3JldHVybiB0aGlzfHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaCh0KXtpZigib2JqZWN0Ij09dHlwZW9mIHdpbmRvdylyZXR1cm4gd2luZG93fX0oKSwoKCk9PnsidXNlIHN0cmljdCI7Y29uc3QgdD1uKDM0OSksZT1uKDM2MSk7c2VsZi5vbm1lc3NhZ2U9bj0+e3N3aXRjaChuLmRhdGEudHlwZSl7Y2FzZSJpbml0LXdhc20iOigwLGUuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KShuLmRhdGEuaW4pLnRoZW4oKCgpPT5wb3N0TWVzc2FnZSh7dHlwZToiaW5pdC13YXNtIn0pKSwodD0+cG9zdE1lc3NhZ2Uoe3R5cGU6ImluaXQtd2FzbSIsZXJyOnR9KSkpO2JyZWFrO2Nhc2UiaW5pdC1vcnQiOnRyeXtjb25zdHtudW1UaHJlYWRzOmUsbG9nZ2luZ0xldmVsOnJ9PW4uZGF0YS5pbjsoMCx0LmluaXRPcnQpKGUscikscG9zdE1lc3NhZ2Uoe3R5cGU6ImluaXQtb3J0In0pfWNhdGNoKHQpe3Bvc3RNZXNzYWdlKHt0eXBlOiJpbml0LW9ydCIsZXJyOnR9KX1icmVhaztjYXNlImNyZWF0ZV9hbGxvY2F0ZSI6dHJ5e2NvbnN0e21vZGVsOmV9PW4uZGF0YS5pbixyPSgwLHQuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlKShlKTtwb3N0TWVzc2FnZSh7dHlwZToiY3JlYXRlX2FsbG9jYXRlIixvdXQ6cn0pfWNhdGNoKHQpe3Bvc3RNZXNzYWdlKHt0eXBlOiJjcmVhdGVfYWxsb2NhdGUiLGVycjp0fSl9YnJlYWs7Y2FzZSJjcmVhdGVfZmluYWxpemUiOnRyeXtjb25zdHttb2RlbGRhdGE6ZSxvcHRpb25zOnJ9PW4uZGF0YS5pbixhPSgwLHQuY3JlYXRlU2Vzc2lvbkZpbmFsaXplKShlLHIpO3Bvc3RNZXNzYWdlKHt0eXBlOiJjcmVhdGVfZmluYWxpemUiLG91dDphfSl9Y2F0Y2godCl7cG9zdE1lc3NhZ2Uoe3R5cGU6ImNyZWF0ZV9maW5hbGl6ZSIsZXJyOnR9KX1icmVhaztjYXNlImNyZWF0ZSI6dHJ5e2NvbnN0e21vZGVsOmUsb3B0aW9uczpyfT1uLmRhdGEuaW4sYT0oMCx0LmNyZWF0ZVNlc3Npb24pKGUscik7cG9zdE1lc3NhZ2Uoe3R5cGU6ImNyZWF0ZSIsb3V0OmF9KX1jYXRjaCh0KXtwb3N0TWVzc2FnZSh7dHlwZToiY3JlYXRlIixlcnI6dH0pfWJyZWFrO2Nhc2UicmVsZWFzZSI6dHJ5e2NvbnN0IGU9bi5kYXRhLmluOygwLHQucmVsZWFzZVNlc3Npb24pKGUpLHBvc3RNZXNzYWdlKHt0eXBlOiJyZWxlYXNlIn0pfWNhdGNoKHQpe3Bvc3RNZXNzYWdlKHt0eXBlOiJyZWxlYXNlIixlcnI6dH0pfWJyZWFrO2Nhc2UicnVuIjp0cnl7Y29uc3R7c2Vzc2lvbklkOmUsaW5wdXRJbmRpY2VzOnIsaW5wdXRzOmEsb3V0cHV0SW5kaWNlczppLG9wdGlvbnM6b309bi5kYXRhLmluLHU9KDAsdC5ydW4pKGUscixhLGksbyk7cG9zdE1lc3NhZ2Uoe3R5cGU6InJ1biIsb3V0OnV9LCgwLHQuZXh0cmFjdFRyYW5zZmVyYWJsZUJ1ZmZlcnMpKHUpKX1jYXRjaCh0KXtwb3N0TWVzc2FnZSh7dHlwZToicnVuIixlcnI6dH0pfWJyZWFrO2Nhc2UiZW5kLXByb2ZpbGluZyI6dHJ5e2NvbnN0IGU9bi5kYXRhLmluOygwLHQuZW5kUHJvZmlsaW5nKShlKSxwb3N0TWVzc2FnZSh7dHlwZToiZW5kLXByb2ZpbGluZyJ9KX1jYXRjaCh0KXtwb3N0TWVzc2FnZSh7dHlwZToiZW5kLXByb2ZpbGluZyIsZXJyOnR9KX19fX0pKCl9KSgpO1xuJywiV29ya2VyIix2b2lkIDAsdm9pZCAwKX19LDQ3NzpjPT57Yy5leHBvcnRzPWZ1bmN0aW9uKHQscixvLHUpe3ZhciBoPXNlbGZ8fHdpbmRvdzt0cnl7dHJ5e3ZhciBhO3RyeXthPW5ldyBoLkJsb2IoW3RdKX1jYXRjaHsoYT1uZXcoaC5CbG9iQnVpbGRlcnx8aC5XZWJLaXRCbG9iQnVpbGRlcnx8aC5Nb3pCbG9iQnVpbGRlcnx8aC5NU0Jsb2JCdWlsZGVyKSkuYXBwZW5kKHQpLGE9YS5nZXRCbG9iKCl9dmFyIHA9aC5VUkx8fGgud2Via2l0VVJMLGY9cC5jcmVhdGVPYmplY3RVUkwoYSksZD1uZXcgaFtyXShmLG8pO3JldHVybiBwLnJldm9rZU9iamVjdFVSTChmKSxkfWNhdGNoe3JldHVybiBuZXcgaFtyXSgiZGF0YTphcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCIuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudCh0KSksbyl9fWNhdGNoe2lmKCF1KXRocm93IEVycm9yKCJJbmxpbmUgd29ya2VyIGlzIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4gbmV3IGhbcl0odSxvKX19fSw0MTU0OmM9PntjLmV4cG9ydHM9YCJ1c2Ugc3RyaWN0Ijt2YXIgZT17fSx0PSJvYmplY3QiPT10eXBlb2YgcHJvY2VzcyYmIm9iamVjdCI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zJiYic3RyaW5nIj09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZTtpZih0KXt2YXIgcj1yZXF1aXJlKCJ3b3JrZXJfdGhyZWFkcyIpLGE9ci5wYXJlbnRQb3J0O2Eub24oIm1lc3NhZ2UiLChlPT5vbm1lc3NhZ2Uoe2RhdGE6ZX0pKSk7dmFyIG89cmVxdWlyZSgiZnMiKTtPYmplY3QuYXNzaWduKGdsb2JhbCx7c2VsZjpnbG9iYWwscmVxdWlyZTpyZXF1aXJlLE1vZHVsZTplLGxvY2F0aW9uOntocmVmOl9fZmlsZW5hbWV9LFdvcmtlcjpyLldvcmtlcixpbXBvcnRTY3JpcHRzOmZ1bmN0aW9uKGUpeygwLGV2YWwpKG8ucmVhZEZpbGVTeW5jKGUsInV0ZjgiKSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGUpe2EucG9zdE1lc3NhZ2UoZSl9LHBlcmZvcm1hbmNlOmdsb2JhbC5wZXJmb3JtYW5jZXx8e25vdzpmdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpfX19KX12YXIgcz0hMSxuPVtdLGk9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiAiKTt0P28ud3JpdGVTeW5jKDIsZSsiXFxuIik6Y29uc29sZS5lcnJvcihlKX07c2VsZi5hbGVydD1mdW5jdGlvbigpe3ZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiICIpO3Bvc3RNZXNzYWdlKHtjbWQ6ImFsZXJ0Iix0ZXh0OnQsdGhyZWFkSWQ6ZS5fcHRocmVhZF9zZWxmKCl9KX0sZS5pbnN0YW50aWF0ZVdhc209KHQscik9Pnt2YXIgYT1uZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UoZS53YXNtTW9kdWxlLHQpO3JldHVybiByKGEpLGUud2FzbU1vZHVsZT1udWxsLGEuZXhwb3J0c30sc2VsZi5vbnVuaGFuZGxlZHJlamVjdGlvbj1lPT57dGhyb3cgZS5yZWFzb24/P2V9LHNlbGYub25tZXNzYWdlPXQ9Pnt0cnl7aWYoImxvYWQiPT09dC5kYXRhLmNtZCl7aWYoZS53YXNtTW9kdWxlPXQuZGF0YS53YXNtTW9kdWxlLGUud2FzbU1lbW9yeT10LmRhdGEud2FzbU1lbW9yeSxlLmJ1ZmZlcj1lLndhc21NZW1vcnkuYnVmZmVyLGUuRU5WSVJPTk1FTlRfSVNfUFRIUkVBRD0hMCwic3RyaW5nIj09dHlwZW9mIHQuZGF0YS51cmxPckJsb2IpaW1wb3J0U2NyaXB0cyh0LmRhdGEudXJsT3JCbG9iKTtlbHNle3ZhciByPVVSTC5jcmVhdGVPYmplY3RVUkwodC5kYXRhLnVybE9yQmxvYik7aW1wb3J0U2NyaXB0cyhyKSxVUkwucmV2b2tlT2JqZWN0VVJMKHIpfW9ydFdhc21UaHJlYWRlZChlKS50aGVuKChmdW5jdGlvbih0KXtlPXR9KSl9ZWxzZSBpZigicnVuIj09PXQuZGF0YS5jbWQpe2UuX19wZXJmb3JtYW5jZV9ub3dfY2xvY2tfZHJpZnQ9cGVyZm9ybWFuY2Uubm93KCktdC5kYXRhLnRpbWUsZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQodC5kYXRhLnB0aHJlYWRfcHRyLDAsMCwxKSxlLmVzdGFibGlzaFN0YWNrU3BhY2UoKSxlLlBUaHJlYWQucmVjZWl2ZU9iamVjdFRyYW5zZmVyKHQuZGF0YSksZS5QVGhyZWFkLnRocmVhZEluaXRUTFMoKSxzfHwobi5mb3JFYWNoKCh0PT57ZS5leGVjdXRlTm90aWZpZWRQcm94eWluZ1F1ZXVlKHQpfSkpLG49W10scz0hMCk7dHJ5e2UuaW52b2tlRW50cnlQb2ludCh0LmRhdGEuc3RhcnRfcm91dGluZSx0LmRhdGEuYXJnKX1jYXRjaCh0KXtpZigidW53aW5kIiE9dCl7aWYoISh0IGluc3RhbmNlb2YgZS5FeGl0U3RhdHVzKSl0aHJvdyB0O2Uua2VlcFJ1bnRpbWVBbGl2ZSgpfHxlLl9fZW1zY3JpcHRlbl90aHJlYWRfZXhpdCh0LnN0YXR1cyl9fX1lbHNlImNhbmNlbCI9PT10LmRhdGEuY21kP2UuX3B0aHJlYWRfc2VsZigpJiZlLl9fZW1zY3JpcHRlbl90aHJlYWRfZXhpdCgtMSk6InNldGltbWVkaWF0ZSI9PT10LmRhdGEudGFyZ2V0fHwoInByb2Nlc3NQcm94eWluZ1F1ZXVlIj09PXQuZGF0YS5jbWQ/cz9lLmV4ZWN1dGVOb3RpZmllZFByb3h5aW5nUXVldWUodC5kYXRhLnF1ZXVlKTpuLnB1c2godC5kYXRhLnF1ZXVlKTooaSgid29ya2VyLmpzIHJlY2VpdmVkIHVua25vd24gY29tbWFuZCAiK3QuZGF0YS5jbWQpLGkodC5kYXRhKSkpfWNhdGNoKHQpe3Rocm93IGkoIndvcmtlci5qcyBvbm1lc3NhZ2UoKSBjYXB0dXJlZCBhbiB1bmNhdWdodCBleGNlcHRpb246ICIrdCksdCYmdC5zdGFjayYmaSh0LnN0YWNrKSxlLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZCYmZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQoKSx0fX07CmB9LDE2NzA6Yz0+e2MuZXhwb3J0cz1fX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xNjcwX199LDcwNjc6KCk9Pnt9LDEyOTY6KCk9Pnt9LDEzODQ6KCk9Pnt9LDM5OTM6KCk9Pnt9LDkwODooKT0+e30sNjk1MzooKT0+e30sOTkyNTooKT0+e30sMjgwNjooKT0+e30sNjQ0OTooKT0+e30sMjg1MDooKT0+e30sNTM4MTooKT0+e30sNTY4NjooYyx0LHIpPT57ci5yKHQpLHIuZCh0LHtmbGF0YnVmZmVyczooKT0+b30pO3ZhciBvPXt9O28uT2Zmc2V0LG8uVGFibGUsby5TSVpFT0ZfU0hPUlQ9MixvLlNJWkVPRl9JTlQ9NCxvLkZJTEVfSURFTlRJRklFUl9MRU5HVEg9NCxvLlNJWkVfUFJFRklYX0xFTkdUSD00LG8uRW5jb2Rpbmc9e1VURjhfQllURVM6MSxVVEYxNl9TVFJJTkc6Mn0sby5pbnQzMj1uZXcgSW50MzJBcnJheSgyKSxvLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheShvLmludDMyLmJ1ZmZlciksby5mbG9hdDY0PW5ldyBGbG9hdDY0QXJyYXkoby5pbnQzMi5idWZmZXIpLG8uaXNMaXR0bGVFbmRpYW49bmV3IFVpbnQxNkFycmF5KG5ldyBVaW50OEFycmF5KFsxLDBdKS5idWZmZXIpWzBdPT09MSxvLkxvbmc9ZnVuY3Rpb24odSxoKXt0aGlzLmxvdz0wfHUsdGhpcy5oaWdoPTB8aH0sby5Mb25nLmNyZWF0ZT1mdW5jdGlvbih1LGgpe3JldHVybiB1PT0wJiZoPT0wP28uTG9uZy5aRVJPOm5ldyBvLkxvbmcodSxoKX0sby5Mb25nLnByb3RvdHlwZS50b0Zsb2F0NjQ9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5sb3c+Pj4wKSs0Mjk0OTY3Mjk2KnRoaXMuaGlnaH0sby5Mb25nLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odSl7cmV0dXJuIHRoaXMubG93PT11LmxvdyYmdGhpcy5oaWdoPT11LmhpZ2h9LG8uTG9uZy5aRVJPPW5ldyBvLkxvbmcoMCwwKSxvLkJ1aWxkZXI9ZnVuY3Rpb24odSl7aWYodSloPXU7ZWxzZSB2YXIgaD0xMDI0O3RoaXMuYmI9by5CeXRlQnVmZmVyLmFsbG9jYXRlKGgpLHRoaXMuc3BhY2U9aCx0aGlzLm1pbmFsaWduPTEsdGhpcy52dGFibGU9bnVsbCx0aGlzLnZ0YWJsZV9pbl91c2U9MCx0aGlzLmlzTmVzdGVkPSExLHRoaXMub2JqZWN0X3N0YXJ0PTAsdGhpcy52dGFibGVzPVtdLHRoaXMudmVjdG9yX251bV9lbGVtcz0wLHRoaXMuZm9yY2VfZGVmYXVsdHM9ITF9LG8uQnVpbGRlci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmJiLmNsZWFyKCksdGhpcy5zcGFjZT10aGlzLmJiLmNhcGFjaXR5KCksdGhpcy5taW5hbGlnbj0xLHRoaXMudnRhYmxlPW51bGwsdGhpcy52dGFibGVfaW5fdXNlPTAsdGhpcy5pc05lc3RlZD0hMSx0aGlzLm9iamVjdF9zdGFydD0wLHRoaXMudnRhYmxlcz1bXSx0aGlzLnZlY3Rvcl9udW1fZWxlbXM9MCx0aGlzLmZvcmNlX2RlZmF1bHRzPSExfSxvLkJ1aWxkZXIucHJvdG90eXBlLmZvcmNlRGVmYXVsdHM9ZnVuY3Rpb24odSl7dGhpcy5mb3JjZV9kZWZhdWx0cz11fSxvLkJ1aWxkZXIucHJvdG90eXBlLmRhdGFCdWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYn0sby5CdWlsZGVyLnByb3RvdHlwZS5hc1VpbnQ4QXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYi5ieXRlcygpLnN1YmFycmF5KHRoaXMuYmIucG9zaXRpb24oKSx0aGlzLmJiLnBvc2l0aW9uKCkrdGhpcy5vZmZzZXQoKSl9LG8uQnVpbGRlci5wcm90b3R5cGUucHJlcD1mdW5jdGlvbih1LGgpe3U+dGhpcy5taW5hbGlnbiYmKHRoaXMubWluYWxpZ249dSk7Zm9yKHZhciBhPTErfih0aGlzLmJiLmNhcGFjaXR5KCktdGhpcy5zcGFjZStoKSZ1LTE7dGhpcy5zcGFjZTxhK3UraDspe3ZhciBwPXRoaXMuYmIuY2FwYWNpdHkoKTt0aGlzLmJiPW8uQnVpbGRlci5ncm93Qnl0ZUJ1ZmZlcih0aGlzLmJiKSx0aGlzLnNwYWNlKz10aGlzLmJiLmNhcGFjaXR5KCktcH10aGlzLnBhZChhKX0sby5CdWlsZGVyLnByb3RvdHlwZS5wYWQ9ZnVuY3Rpb24odSl7Zm9yKHZhciBoPTA7aDx1O2grKyl0aGlzLmJiLndyaXRlSW50OCgtLXRoaXMuc3BhY2UsMCl9LG8uQnVpbGRlci5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKHUpe3RoaXMuYmIud3JpdGVJbnQ4KHRoaXMuc3BhY2UtPTEsdSl9LG8uQnVpbGRlci5wcm90b3R5cGUud3JpdGVJbnQxNj1mdW5jdGlvbih1KXt0aGlzLmJiLndyaXRlSW50MTYodGhpcy5zcGFjZS09Mix1KX0sby5CdWlsZGVyLnByb3RvdHlwZS53cml0ZUludDMyPWZ1bmN0aW9uKHUpe3RoaXMuYmIud3JpdGVJbnQzMih0aGlzLnNwYWNlLT00LHUpfSxvLkJ1aWxkZXIucHJvdG90eXBlLndyaXRlSW50NjQ9ZnVuY3Rpb24odSl7dGhpcy5iYi53cml0ZUludDY0KHRoaXMuc3BhY2UtPTgsdSl9LG8uQnVpbGRlci5wcm90b3R5cGUud3JpdGVGbG9hdDMyPWZ1bmN0aW9uKHUpe3RoaXMuYmIud3JpdGVGbG9hdDMyKHRoaXMuc3BhY2UtPTQsdSl9LG8uQnVpbGRlci5wcm90b3R5cGUud3JpdGVGbG9hdDY0PWZ1bmN0aW9uKHUpe3RoaXMuYmIud3JpdGVGbG9hdDY0KHRoaXMuc3BhY2UtPTgsdSl9LG8uQnVpbGRlci5wcm90b3R5cGUuYWRkSW50OD1mdW5jdGlvbih1KXt0aGlzLnByZXAoMSwwKSx0aGlzLndyaXRlSW50OCh1KX0sby5CdWlsZGVyLnByb3RvdHlwZS5hZGRJbnQxNj1mdW5jdGlvbih1KXt0aGlzLnByZXAoMiwwKSx0aGlzLndyaXRlSW50MTYodSl9LG8uQnVpbGRlci5wcm90b3R5cGUuYWRkSW50MzI9ZnVuY3Rpb24odSl7dGhpcy5wcmVwKDQsMCksdGhpcy53cml0ZUludDMyKHUpfSxvLkJ1aWxkZXIucHJvdG90eXBlLmFkZEludDY0PWZ1bmN0aW9uKHUpe3RoaXMucHJlcCg4LDApLHRoaXMud3JpdGVJbnQ2NCh1KX0sby5CdWlsZGVyLnByb3RvdHlwZS5hZGRGbG9hdDMyPWZ1bmN0aW9uKHUpe3RoaXMucHJlcCg0LDApLHRoaXMud3JpdGVGbG9hdDMyKHUpfSxvLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZsb2F0NjQ9ZnVuY3Rpb24odSl7dGhpcy5wcmVwKDgsMCksdGhpcy53cml0ZUZsb2F0NjQodSl9LG8uQnVpbGRlci5wcm90b3R5cGUuYWRkRmllbGRJbnQ4PWZ1bmN0aW9uKHUsaCxhKXsodGhpcy5mb3JjZV9kZWZhdWx0c3x8aCE9YSkmJih0aGlzLmFkZEludDgoaCksdGhpcy5zbG90KHUpKX0sby5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZEludDE2PWZ1bmN0aW9uKHUsaCxhKXsodGhpcy5mb3JjZV9kZWZhdWx0c3x8aCE9YSkmJih0aGlzLmFkZEludDE2KGgpLHRoaXMuc2xvdCh1KSl9LG8uQnVpbGRlci5wcm90b3R5cGUuYWRkRmllbGRJbnQzMj1mdW5jdGlvbih1LGgsYSl7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fGghPWEpJiYodGhpcy5hZGRJbnQzMihoKSx0aGlzLnNsb3QodSkpfSxvLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkSW50NjQ9ZnVuY3Rpb24odSxoLGEpeyF0aGlzLmZvcmNlX2RlZmF1bHRzJiZoLmVxdWFscyhhKXx8KHRoaXMuYWRkSW50NjQoaCksdGhpcy5zbG90KHUpKX0sby5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZEZsb2F0MzI9ZnVuY3Rpb24odSxoLGEpeyh0aGlzLmZvcmNlX2RlZmF1bHRzfHxoIT1hKSYmKHRoaXMuYWRkRmxvYXQzMihoKSx0aGlzLnNsb3QodSkpfSxvLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkRmxvYXQ2ND1mdW5jdGlvbih1LGgsYSl7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fGghPWEpJiYodGhpcy5hZGRGbG9hdDY0KGgpLHRoaXMuc2xvdCh1KSl9LG8uQnVpbGRlci5wcm90b3R5cGUuYWRkRmllbGRPZmZzZXQ9ZnVuY3Rpb24odSxoLGEpeyh0aGlzLmZvcmNlX2RlZmF1bHRzfHxoIT1hKSYmKHRoaXMuYWRkT2Zmc2V0KGgpLHRoaXMuc2xvdCh1KSl9LG8uQnVpbGRlci5wcm90b3R5cGUuYWRkRmllbGRTdHJ1Y3Q9ZnVuY3Rpb24odSxoLGEpe2ghPWEmJih0aGlzLm5lc3RlZChoKSx0aGlzLnNsb3QodSkpfSxvLkJ1aWxkZXIucHJvdG90eXBlLm5lc3RlZD1mdW5jdGlvbih1KXtpZih1IT10aGlzLm9mZnNldCgpKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IHN0cnVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgaW5saW5lLiIpfSxvLkJ1aWxkZXIucHJvdG90eXBlLm5vdE5lc3RlZD1mdW5jdGlvbigpe2lmKHRoaXMuaXNOZXN0ZWQpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogb2JqZWN0IHNlcmlhbGl6YXRpb24gbXVzdCBub3QgYmUgbmVzdGVkLiIpfSxvLkJ1aWxkZXIucHJvdG90eXBlLnNsb3Q9ZnVuY3Rpb24odSl7dGhpcy52dGFibGVbdV09dGhpcy5vZmZzZXQoKX0sby5CdWlsZGVyLnByb3RvdHlwZS5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYi5jYXBhY2l0eSgpLXRoaXMuc3BhY2V9LG8uQnVpbGRlci5ncm93Qnl0ZUJ1ZmZlcj1mdW5jdGlvbih1KXt2YXIgaD11LmNhcGFjaXR5KCk7aWYoMzIyMTIyNTQ3MiZoKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IGNhbm5vdCBncm93IGJ1ZmZlciBiZXlvbmQgMiBnaWdhYnl0ZXMuIik7dmFyIGE9aDw8MSxwPW8uQnl0ZUJ1ZmZlci5hbGxvY2F0ZShhKTtyZXR1cm4gcC5zZXRQb3NpdGlvbihhLWgpLHAuYnl0ZXMoKS5zZXQodS5ieXRlcygpLGEtaCkscH0sby5CdWlsZGVyLnByb3RvdHlwZS5hZGRPZmZzZXQ9ZnVuY3Rpb24odSl7dGhpcy5wcmVwKG8uU0laRU9GX0lOVCwwKSx0aGlzLndyaXRlSW50MzIodGhpcy5vZmZzZXQoKS11K28uU0laRU9GX0lOVCl9LG8uQnVpbGRlci5wcm90b3R5cGUuc3RhcnRPYmplY3Q9ZnVuY3Rpb24odSl7dGhpcy5ub3ROZXN0ZWQoKSx0aGlzLnZ0YWJsZT09bnVsbCYmKHRoaXMudnRhYmxlPVtdKSx0aGlzLnZ0YWJsZV9pbl91c2U9dTtmb3IodmFyIGg9MDtoPHU7aCsrKXRoaXMudnRhYmxlW2hdPTA7dGhpcy5pc05lc3RlZD0hMCx0aGlzLm9iamVjdF9zdGFydD10aGlzLm9mZnNldCgpfSxvLkJ1aWxkZXIucHJvdG90eXBlLmVuZE9iamVjdD1mdW5jdGlvbigpe2lmKHRoaXMudnRhYmxlPT1udWxsfHwhdGhpcy5pc05lc3RlZCl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBlbmRPYmplY3QgY2FsbGVkIHdpdGhvdXQgc3RhcnRPYmplY3QiKTt0aGlzLmFkZEludDMyKDApO2Zvcih2YXIgdT10aGlzLm9mZnNldCgpLGg9dGhpcy52dGFibGVfaW5fdXNlLTE7aD49MCYmdGhpcy52dGFibGVbaF09PTA7aC0tKTtmb3IodmFyIGE9aCsxO2g+PTA7aC0tKXRoaXMuYWRkSW50MTYodGhpcy52dGFibGVbaF0hPTA/dS10aGlzLnZ0YWJsZVtoXTowKTt0aGlzLmFkZEludDE2KHUtdGhpcy5vYmplY3Rfc3RhcnQpO3ZhciBwPShhKzIpKm8uU0laRU9GX1NIT1JUO3RoaXMuYWRkSW50MTYocCk7dmFyIGY9MCxkPXRoaXMuc3BhY2U7ZTpmb3IoaD0wO2g8dGhpcy52dGFibGVzLmxlbmd0aDtoKyspe3ZhciBsPXRoaXMuYmIuY2FwYWNpdHkoKS10aGlzLnZ0YWJsZXNbaF07aWYocD09dGhpcy5iYi5yZWFkSW50MTYobCkpe2Zvcih2YXIgbj1vLlNJWkVPRl9TSE9SVDtuPHA7bis9by5TSVpFT0ZfU0hPUlQpaWYodGhpcy5iYi5yZWFkSW50MTYoZCtuKSE9dGhpcy5iYi5yZWFkSW50MTYobCtuKSljb250aW51ZSBlO2Y9dGhpcy52dGFibGVzW2hdO2JyZWFrfX1yZXR1cm4gZj8odGhpcy5zcGFjZT10aGlzLmJiLmNhcGFjaXR5KCktdSx0aGlzLmJiLndyaXRlSW50MzIodGhpcy5zcGFjZSxmLXUpKToodGhpcy52dGFibGVzLnB1c2godGhpcy5vZmZzZXQoKSksdGhpcy5iYi53cml0ZUludDMyKHRoaXMuYmIuY2FwYWNpdHkoKS11LHRoaXMub2Zmc2V0KCktdSkpLHRoaXMuaXNOZXN0ZWQ9ITEsdX0sby5CdWlsZGVyLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24odSxoLGEpe3ZhciBwPWE/by5TSVpFX1BSRUZJWF9MRU5HVEg6MDtpZihoKXt2YXIgZj1oO2lmKHRoaXMucHJlcCh0aGlzLm1pbmFsaWduLG8uU0laRU9GX0lOVCtvLkZJTEVfSURFTlRJRklFUl9MRU5HVEgrcCksZi5sZW5ndGghPW8uRklMRV9JREVOVElGSUVSX0xFTkdUSCl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBmaWxlIGlkZW50aWZpZXIgbXVzdCBiZSBsZW5ndGggIitvLkZJTEVfSURFTlRJRklFUl9MRU5HVEgpO2Zvcih2YXIgZD1vLkZJTEVfSURFTlRJRklFUl9MRU5HVEgtMTtkPj0wO2QtLSl0aGlzLndyaXRlSW50OChmLmNoYXJDb2RlQXQoZCkpfXRoaXMucHJlcCh0aGlzLm1pbmFsaWduLG8uU0laRU9GX0lOVCtwKSx0aGlzLmFkZE9mZnNldCh1KSxwJiZ0aGlzLmFkZEludDMyKHRoaXMuYmIuY2FwYWNpdHkoKS10aGlzLnNwYWNlKSx0aGlzLmJiLnNldFBvc2l0aW9uKHRoaXMuc3BhY2UpfSxvLkJ1aWxkZXIucHJvdG90eXBlLmZpbmlzaFNpemVQcmVmaXhlZD1mdW5jdGlvbih1LGgpe3RoaXMuZmluaXNoKHUsaCwhMCl9LG8uQnVpbGRlci5wcm90b3R5cGUucmVxdWlyZWRGaWVsZD1mdW5jdGlvbih1LGgpe3ZhciBhPXRoaXMuYmIuY2FwYWNpdHkoKS11LHA9YS10aGlzLmJiLnJlYWRJbnQzMihhKTtpZih0aGlzLmJiLnJlYWRJbnQxNihwK2gpPT0wKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IGZpZWxkICIraCsiIG11c3QgYmUgc2V0Iil9LG8uQnVpbGRlci5wcm90b3R5cGUuc3RhcnRWZWN0b3I9ZnVuY3Rpb24odSxoLGEpe3RoaXMubm90TmVzdGVkKCksdGhpcy52ZWN0b3JfbnVtX2VsZW1zPWgsdGhpcy5wcmVwKG8uU0laRU9GX0lOVCx1KmgpLHRoaXMucHJlcChhLHUqaCl9LG8uQnVpbGRlci5wcm90b3R5cGUuZW5kVmVjdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud3JpdGVJbnQzMih0aGlzLnZlY3Rvcl9udW1fZWxlbXMpLHRoaXMub2Zmc2V0KCl9LG8uQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlU3RyaW5nPWZ1bmN0aW9uKHUpe2lmKHUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXZhciBoPXU7ZWxzZXtoPVtdO2Zvcih2YXIgYT0wO2E8dS5sZW5ndGg7KXt2YXIgcCxmPXUuY2hhckNvZGVBdChhKyspOyhwPWY8NTUyOTZ8fGY+PTU2MzIwP2Y6KGY8PDEwKSt1LmNoYXJDb2RlQXQoYSsrKSstNTY2MTM4ODgpPDEyOD9oLnB1c2gocCk6KHA8MjA0OD9oLnB1c2gocD4+NiYzMXwxOTIpOihwPDY1NTM2P2gucHVzaChwPj4xMiYxNXwyMjQpOmgucHVzaChwPj4xOCY3fDI0MCxwPj4xMiY2M3wxMjgpLGgucHVzaChwPj42JjYzfDEyOCkpLGgucHVzaCg2MyZwfDEyOCkpfX10aGlzLmFkZEludDgoMCksdGhpcy5zdGFydFZlY3RvcigxLGgubGVuZ3RoLDEpLHRoaXMuYmIuc2V0UG9zaXRpb24odGhpcy5zcGFjZS09aC5sZW5ndGgpLGE9MDtmb3IodmFyIGQ9dGhpcy5zcGFjZSxsPXRoaXMuYmIuYnl0ZXMoKTthPGgubGVuZ3RoO2ErKylsW2QrK109aFthXTtyZXR1cm4gdGhpcy5lbmRWZWN0b3IoKX0sby5CdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVMb25nPWZ1bmN0aW9uKHUsaCl7cmV0dXJuIG8uTG9uZy5jcmVhdGUodSxoKX0sby5CeXRlQnVmZmVyPWZ1bmN0aW9uKHUpe3RoaXMuYnl0ZXNfPXUsdGhpcy5wb3NpdGlvbl89MH0sby5CeXRlQnVmZmVyLmFsbG9jYXRlPWZ1bmN0aW9uKHUpe3JldHVybiBuZXcgby5CeXRlQnVmZmVyKG5ldyBVaW50OEFycmF5KHUpKX0sby5CeXRlQnVmZmVyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMucG9zaXRpb25fPTB9LG8uQnl0ZUJ1ZmZlci5wcm90b3R5cGUuYnl0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ieXRlc199LG8uQnl0ZUJ1ZmZlci5wcm90b3R5cGUucG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb3NpdGlvbl99LG8uQnl0ZUJ1ZmZlci5wcm90b3R5cGUuc2V0UG9zaXRpb249ZnVuY3Rpb24odSl7dGhpcy5wb3NpdGlvbl89dX0sby5CeXRlQnVmZmVyLnByb3RvdHlwZS5jYXBhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ5dGVzXy5sZW5ndGh9LG8uQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odSl7cmV0dXJuIHRoaXMucmVhZFVpbnQ4KHUpPDwyND4+MjR9LG8uQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQ4PWZ1bmN0aW9uKHUpe3JldHVybiB0aGlzLmJ5dGVzX1t1XX0sby5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTY9ZnVuY3Rpb24odSl7cmV0dXJuIHRoaXMucmVhZFVpbnQxNih1KTw8MTY+PjE2fSxvLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MTY9ZnVuY3Rpb24odSl7cmV0dXJuIHRoaXMuYnl0ZXNfW3VdfHRoaXMuYnl0ZXNfW3UrMV08PDh9LG8uQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyPWZ1bmN0aW9uKHUpe3JldHVybiB0aGlzLmJ5dGVzX1t1XXx0aGlzLmJ5dGVzX1t1KzFdPDw4fHRoaXMuYnl0ZXNfW3UrMl08PDE2fHRoaXMuYnl0ZXNfW3UrM108PDI0fSxvLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MzI9ZnVuY3Rpb24odSl7cmV0dXJuIHRoaXMucmVhZEludDMyKHUpPj4+MH0sby5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50NjQ9ZnVuY3Rpb24odSl7cmV0dXJuIG5ldyBvLkxvbmcodGhpcy5yZWFkSW50MzIodSksdGhpcy5yZWFkSW50MzIodSs0KSl9LG8uQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQ2ND1mdW5jdGlvbih1KXtyZXR1cm4gbmV3IG8uTG9uZyh0aGlzLnJlYWRVaW50MzIodSksdGhpcy5yZWFkVWludDMyKHUrNCkpfSxvLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdDMyPWZ1bmN0aW9uKHUpe3JldHVybiBvLmludDMyWzBdPXRoaXMucmVhZEludDMyKHUpLG8uZmxvYXQzMlswXX0sby5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXQ2ND1mdW5jdGlvbih1KXtyZXR1cm4gby5pbnQzMltvLmlzTGl0dGxlRW5kaWFuPzA6MV09dGhpcy5yZWFkSW50MzIodSksby5pbnQzMltvLmlzTGl0dGxlRW5kaWFuPzE6MF09dGhpcy5yZWFkSW50MzIodSs0KSxvLmZsb2F0NjRbMF19LG8uQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKHUsaCl7dGhpcy5ieXRlc19bdV09aH0sby5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQ4PWZ1bmN0aW9uKHUsaCl7dGhpcy5ieXRlc19bdV09aH0sby5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2PWZ1bmN0aW9uKHUsaCl7dGhpcy5ieXRlc19bdV09aCx0aGlzLmJ5dGVzX1t1KzFdPWg+Pjh9LG8uQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MTY9ZnVuY3Rpb24odSxoKXt0aGlzLmJ5dGVzX1t1XT1oLHRoaXMuYnl0ZXNfW3UrMV09aD4+OH0sby5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyPWZ1bmN0aW9uKHUsaCl7dGhpcy5ieXRlc19bdV09aCx0aGlzLmJ5dGVzX1t1KzFdPWg+PjgsdGhpcy5ieXRlc19bdSsyXT1oPj4xNix0aGlzLmJ5dGVzX1t1KzNdPWg+PjI0fSxvLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDMyPWZ1bmN0aW9uKHUsaCl7dGhpcy5ieXRlc19bdV09aCx0aGlzLmJ5dGVzX1t1KzFdPWg+PjgsdGhpcy5ieXRlc19bdSsyXT1oPj4xNix0aGlzLmJ5dGVzX1t1KzNdPWg+PjI0fSxvLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlSW50NjQ9ZnVuY3Rpb24odSxoKXt0aGlzLndyaXRlSW50MzIodSxoLmxvdyksdGhpcy53cml0ZUludDMyKHUrNCxoLmhpZ2gpfSxvLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDY0PWZ1bmN0aW9uKHUsaCl7dGhpcy53cml0ZVVpbnQzMih1LGgubG93KSx0aGlzLndyaXRlVWludDMyKHUrNCxoLmhpZ2gpfSxvLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXQzMj1mdW5jdGlvbih1LGgpe28uZmxvYXQzMlswXT1oLHRoaXMud3JpdGVJbnQzMih1LG8uaW50MzJbMF0pfSxvLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXQ2ND1mdW5jdGlvbih1LGgpe28uZmxvYXQ2NFswXT1oLHRoaXMud3JpdGVJbnQzMih1LG8uaW50MzJbby5pc0xpdHRsZUVuZGlhbj8wOjFdKSx0aGlzLndyaXRlSW50MzIodSs0LG8uaW50MzJbby5pc0xpdHRsZUVuZGlhbj8xOjBdKX0sby5CeXRlQnVmZmVyLnByb3RvdHlwZS5nZXRCdWZmZXJJZGVudGlmaWVyPWZ1bmN0aW9uKCl7aWYodGhpcy5ieXRlc18ubGVuZ3RoPHRoaXMucG9zaXRpb25fK28uU0laRU9GX0lOVCtvLkZJTEVfSURFTlRJRklFUl9MRU5HVEgpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogQnl0ZUJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbiBhbiBpZGVudGlmaWVyLiIpO2Zvcih2YXIgdT0iIixoPTA7aDxvLkZJTEVfSURFTlRJRklFUl9MRU5HVEg7aCsrKXUrPVN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5yZWFkSW50OCh0aGlzLnBvc2l0aW9uXytvLlNJWkVPRl9JTlQraCkpO3JldHVybiB1fSxvLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9fb2Zmc2V0PWZ1bmN0aW9uKHUsaCl7dmFyIGE9dS10aGlzLnJlYWRJbnQzMih1KTtyZXR1cm4gaDx0aGlzLnJlYWRJbnQxNihhKT90aGlzLnJlYWRJbnQxNihhK2gpOjB9LG8uQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX191bmlvbj1mdW5jdGlvbih1LGgpe3JldHVybiB1LmJiX3Bvcz1oK3RoaXMucmVhZEludDMyKGgpLHUuYmI9dGhpcyx1fSxvLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9fc3RyaW5nPWZ1bmN0aW9uKHUsaCl7dSs9dGhpcy5yZWFkSW50MzIodSk7dmFyIGE9dGhpcy5yZWFkSW50MzIodSkscD0iIixmPTA7aWYodSs9by5TSVpFT0ZfSU5ULGg9PT1vLkVuY29kaW5nLlVURjhfQllURVMpcmV0dXJuIHRoaXMuYnl0ZXNfLnN1YmFycmF5KHUsdSthKTtmb3IoO2Y8YTspe3ZhciBkLGw9dGhpcy5yZWFkVWludDgodStmKyspO2lmKGw8MTkyKWQ9bDtlbHNle3ZhciBuPXRoaXMucmVhZFVpbnQ4KHUrZisrKTtpZihsPDIyNClkPSgzMSZsKTw8Nnw2MyZuO2Vsc2V7dmFyIGU9dGhpcy5yZWFkVWludDgodStmKyspO2Q9bDwyNDA/KDE1JmwpPDwxMnwoNjMmbik8PDZ8NjMmZTooNyZsKTw8MTh8KDYzJm4pPDwxMnwoNjMmZSk8PDZ8NjMmdGhpcy5yZWFkVWludDgodStmKyspfX1kPDY1NTM2P3ArPVN0cmluZy5mcm9tQ2hhckNvZGUoZCk6KGQtPTY1NTM2LHArPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTYrKGQ+PjEwKSw1NjMyMCsoMTAyMyZkKSkpfXJldHVybiBwfSxvLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9faW5kaXJlY3Q9ZnVuY3Rpb24odSl7cmV0dXJuIHUrdGhpcy5yZWFkSW50MzIodSl9LG8uQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX192ZWN0b3I9ZnVuY3Rpb24odSl7cmV0dXJuIHUrdGhpcy5yZWFkSW50MzIodSkrby5TSVpFT0ZfSU5UfSxvLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9fdmVjdG9yX2xlbj1mdW5jdGlvbih1KXtyZXR1cm4gdGhpcy5yZWFkSW50MzIodSt0aGlzLnJlYWRJbnQzMih1KSl9LG8uQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX19oYXNfaWRlbnRpZmllcj1mdW5jdGlvbih1KXtpZih1Lmxlbmd0aCE9by5GSUxFX0lERU5USUZJRVJfTEVOR1RIKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IGZpbGUgaWRlbnRpZmllciBtdXN0IGJlIGxlbmd0aCAiK28uRklMRV9JREVOVElGSUVSX0xFTkdUSCk7Zm9yKHZhciBoPTA7aDxvLkZJTEVfSURFTlRJRklFUl9MRU5HVEg7aCsrKWlmKHUuY2hhckNvZGVBdChoKSE9dGhpcy5yZWFkSW50OCh0aGlzLnBvc2l0aW9uXytvLlNJWkVPRl9JTlQraCkpcmV0dXJuITE7cmV0dXJuITB9LG8uQnl0ZUJ1ZmZlci5wcm90b3R5cGUuY3JlYXRlTG9uZz1mdW5jdGlvbih1LGgpe3JldHVybiBvLkxvbmcuY3JlYXRlKHUsaCl9fX0sX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fPXt9O2Z1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18oYyl7dmFyIHQ9X193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW2NdO2lmKHQhPT12b2lkIDApcmV0dXJuIHQuZXhwb3J0czt2YXIgcj1fX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bY109e2V4cG9ydHM6e319O3JldHVybiBfX3dlYnBhY2tfbW9kdWxlc19fW2NdLmNhbGwoci5leHBvcnRzLHIsci5leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pLHIuZXhwb3J0c31fX3dlYnBhY2tfcmVxdWlyZV9fLm49Yz0+e3ZhciB0PWMmJmMuX19lc01vZHVsZT8oKT0+Yy5kZWZhdWx0OigpPT5jO3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQodCx7YTp0fSksdH0sX193ZWJwYWNrX3JlcXVpcmVfXy5kPShjLHQpPT57Zm9yKHZhciByIGluIHQpX193ZWJwYWNrX3JlcXVpcmVfXy5vKHQscikmJiFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oYyxyKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGMscix7ZW51bWVyYWJsZTohMCxnZXQ6dFtyXX0pfSxfX3dlYnBhY2tfcmVxdWlyZV9fLmc9ZnVuY3Rpb24oKXtpZih0eXBlb2YgZ2xvYmFsVGhpcz09Im9iamVjdCIpcmV0dXJuIGdsb2JhbFRoaXM7dHJ5e3JldHVybiB0aGlzfHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaHtpZih0eXBlb2Ygd2luZG93PT0ib2JqZWN0IilyZXR1cm4gd2luZG93fX0oKSxfX3dlYnBhY2tfcmVxdWlyZV9fLm89KGMsdCk9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjLHQpLF9fd2VicGFja19yZXF1aXJlX18ucj1jPT57dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGMsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX07dmFyIF9fd2VicGFja19leHBvcnRzX189X193ZWJwYWNrX3JlcXVpcmVfXyg2MDE4KTtyZXR1cm4gX193ZWJwYWNrX2V4cG9ydHNfX30pKCkpfSkob3J0V2ViX21pbiQxKTt2YXIgb3J0V2ViX21pbkV4cG9ydHM9b3J0V2ViX21pbiQxLmV4cG9ydHMsb3J0V2ViX21pbj1nZXREZWZhdWx0RXhwb3J0RnJvbUNqcyhvcnRXZWJfbWluRXhwb3J0cyksT05OWF9XRUI9X21lcmdlTmFtZXNwYWNlcyh7X19wcm90b19fOm51bGwsZGVmYXVsdDpvcnRXZWJfbWlufSxbb3J0V2ViX21pbkV4cG9ydHNdKTtsZXQgT05OWDtjb25zdCBleGVjdXRpb25Qcm92aWRlcnM9WyJ3YXNtIl07dHlwZW9mIHByb2Nlc3M8InUiJiYoKG50PXByb2Nlc3M9PW51bGw/dm9pZCAwOnByb2Nlc3MucmVsZWFzZSk9PW51bGw/dm9pZCAwOm50Lm5hbWUpPT09Im5vZGUiPyhPTk5YPXNoYXJwPz9PTk5YX05PREUsZXhlY3V0aW9uUHJvdmlkZXJzLnVuc2hpZnQoImNwdSIpKTooT05OWD1vcnRXZWJfbWluPz9PTk5YX1dFQix0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmL2lQKGhvbmV8b2R8YWQpLisxNl80LitBcHBsZVdlYktpdC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKE9OTlguZW52Lndhc20uc2ltZD0hMSkpO2NvbnN0e2Vudjpvbm54X2Vudn09T05OWCxWRVJTSU9OPSIyLjE3LjIiLFdFQl9DQUNIRV9BVkFJTEFCTEU9dHlwZW9mIHNlbGY8InUiJiYiY2FjaGVzImluIHNlbGYsRlNfQVZBSUxBQkxFPSFpc0VtcHR5KHNoYXJwKSxQQVRIX0FWQUlMQUJMRT0haXNFbXB0eShzaGFycCksUlVOTklOR19MT0NBTExZPUZTX0FWQUlMQUJMRSYmUEFUSF9BVkFJTEFCTEUsX19kaXJuYW1lPVJVTk5JTkdfTE9DQUxMWT9zaGFycC5kaXJuYW1lKHNoYXJwLmRpcm5hbWUoc2hhcnAuZmlsZVVSTFRvUGF0aChzZWxmLmxvY2F0aW9uLmhyZWYpKSk6Ii4vIixERUZBVUxUX0NBQ0hFX0RJUj1SVU5OSU5HX0xPQ0FMTFk/c2hhcnAuam9pbihfX2Rpcm5hbWUsIi8uY2FjaGUvIik6bnVsbCxERUZBVUxUX0xPQ0FMX01PREVMX1BBVEg9Ii9tb2RlbHMvIixsb2NhbE1vZGVsUGF0aD1SVU5OSU5HX0xPQ0FMTFk/c2hhcnAuam9pbihfX2Rpcm5hbWUsREVGQVVMVF9MT0NBTF9NT0RFTF9QQVRIKTpERUZBVUxUX0xPQ0FMX01PREVMX1BBVEg7b25ueF9lbnYhPW51bGwmJm9ubnhfZW52Lndhc20mJihvbm54X2Vudi53YXNtLndhc21QYXRocz1SVU5OSU5HX0xPQ0FMTFk/c2hhcnAuam9pbihfX2Rpcm5hbWUsIi9kaXN0LyIpOmBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B4ZW5vdmEvdHJhbnNmb3JtZXJzQCR7VkVSU0lPTn0vZGlzdC9gKTtjb25zdCBlbnYkMT17YmFja2VuZHM6e29ubng6b25ueF9lbnYsdGZqczp7fX0sX19kaXJuYW1lLHZlcnNpb246VkVSU0lPTixhbGxvd1JlbW90ZU1vZGVsczohMCxyZW1vdGVIb3N0OiJodHRwczovL2h1Z2dpbmdmYWNlLmNvLyIscmVtb3RlUGF0aFRlbXBsYXRlOiJ7bW9kZWx9L3Jlc29sdmUve3JldmlzaW9ufS8iLGFsbG93TG9jYWxNb2RlbHM6ITAsbG9jYWxNb2RlbFBhdGgsdXNlRlM6RlNfQVZBSUxBQkxFLHVzZUJyb3dzZXJDYWNoZTpXRUJfQ0FDSEVfQVZBSUxBQkxFLHVzZUZTQ2FjaGU6RlNfQVZBSUxBQkxFLGNhY2hlRGlyOkRFRkFVTFRfQ0FDSEVfRElSLHVzZUN1c3RvbUNhY2hlOiExLGN1c3RvbUNhY2hlOm51bGx9O2Z1bmN0aW9uIGlzRW1wdHkoYyl7cmV0dXJuIE9iamVjdC5rZXlzKGMpLmxlbmd0aD09PTB9Y2xhc3MgRmlsZVJlc3BvbnNle2NvbnN0cnVjdG9yKHQpe0sodGhpcywiX0NPTlRFTlRfVFlQRV9NQVAiLHt0eHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIsY3NzOiJ0ZXh0L2NzcyIsanM6InRleHQvamF2YXNjcmlwdCIsanNvbjoiYXBwbGljYXRpb24vanNvbiIscG5nOiJpbWFnZS9wbmciLGpwZzoiaW1hZ2UvanBlZyIsanBlZzoiaW1hZ2UvanBlZyIsZ2lmOiJpbWFnZS9naWYifSk7aWYodGhpcy5maWxlUGF0aD10LHRoaXMuaGVhZGVycz1uZXcgSGVhZGVycyx0aGlzLmV4aXN0cz1zaGFycC5leGlzdHNTeW5jKHQpLHRoaXMuZXhpc3RzKXt0aGlzLnN0YXR1cz0yMDAsdGhpcy5zdGF0dXNUZXh0PSJPSyI7bGV0IHI9c2hhcnAuc3RhdFN5bmModCk7dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC1sZW5ndGgiLHIuc2l6ZS50b1N0cmluZygpKSx0aGlzLnVwZGF0ZUNvbnRlbnRUeXBlKCk7bGV0IG89dGhpczt0aGlzLmJvZHk9bmV3IFJlYWRhYmxlU3RyZWFtKHtzdGFydCh1KXtvLmFycmF5QnVmZmVyKCkudGhlbihoPT57dS5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KGgpKSx1LmNsb3NlKCl9KX19KX1lbHNlIHRoaXMuc3RhdHVzPTQwNCx0aGlzLnN0YXR1c1RleHQ9Ik5vdCBGb3VuZCIsdGhpcy5ib2R5PW51bGx9dXBkYXRlQ29udGVudFR5cGUoKXtjb25zdCB0PXRoaXMuZmlsZVBhdGgudG9TdHJpbmcoKS5zcGxpdCgiLiIpLnBvcCgpLnRvTG93ZXJDYXNlKCk7dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIix0aGlzLl9DT05URU5UX1RZUEVfTUFQW3RdPz8iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIil9Y2xvbmUoKXtsZXQgdD1uZXcgRmlsZVJlc3BvbnNlKHRoaXMuZmlsZVBhdGgpO3JldHVybiB0LmV4aXN0cz10aGlzLmV4aXN0cyx0LnN0YXR1cz10aGlzLnN0YXR1cyx0LnN0YXR1c1RleHQ9dGhpcy5zdGF0dXNUZXh0LHQuaGVhZGVycz1uZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLHR9YXN5bmMgYXJyYXlCdWZmZXIoKXtyZXR1cm4oYXdhaXQgc2hhcnAucHJvbWlzZXMucmVhZEZpbGUodGhpcy5maWxlUGF0aCkpLmJ1ZmZlcn1hc3luYyBibG9iKCl7Y29uc3QgdD1hd2FpdCBzaGFycC5wcm9taXNlcy5yZWFkRmlsZSh0aGlzLmZpbGVQYXRoKTtyZXR1cm4gbmV3IEJsb2IoW3RdLHt0eXBlOnRoaXMuaGVhZGVycy5nZXQoImNvbnRlbnQtdHlwZSIpfSl9YXN5bmMgdGV4dCgpe3JldHVybiBhd2FpdCBzaGFycC5wcm9taXNlcy5yZWFkRmlsZSh0aGlzLmZpbGVQYXRoLCJ1dGY4Iil9YXN5bmMganNvbigpe3JldHVybiBKU09OLnBhcnNlKGF3YWl0IHRoaXMudGV4dCgpKX19ZnVuY3Rpb24gaXNWYWxpZFVybChjLHQ9bnVsbCxyPW51bGwpe2xldCBvO3RyeXtvPW5ldyBVUkwoYyl9Y2F0Y2h7cmV0dXJuITF9cmV0dXJuISh0JiYhdC5pbmNsdWRlcyhvLnByb3RvY29sKXx8ciYmIXIuaW5jbHVkZXMoby5ob3N0bmFtZSkpfWFzeW5jIGZ1bmN0aW9uIGdldEZpbGUoYyl7dmFyIHQscixvLHU7aWYoZW52JDEudXNlRlMmJiFpc1ZhbGlkVXJsKGMsWyJodHRwOiIsImh0dHBzOiIsImJsb2I6Il0pKXJldHVybiBuZXcgRmlsZVJlc3BvbnNlKGMpO2lmKHR5cGVvZiBwcm9jZXNzPCJ1IiYmKCh0PXByb2Nlc3M9PW51bGw/dm9pZCAwOnByb2Nlc3MucmVsZWFzZSk9PW51bGw/dm9pZCAwOnQubmFtZSk9PT0ibm9kZSIpe2NvbnN0IGg9ISEoKHI9cHJvY2Vzcy5lbnYpIT1udWxsJiZyLlRFU1RJTkdfUkVNT1RFTFkpLGE9ZW52JDEudmVyc2lvbixwPW5ldyBIZWFkZXJzO2lmKHAuc2V0KCJVc2VyLUFnZW50IixgdHJhbnNmb3JtZXJzLmpzLyR7YX07IGlzX2NpLyR7aH07YCksaXNWYWxpZFVybChjLFsiaHR0cDoiLCJodHRwczoiXSxbImh1Z2dpbmdmYWNlLmNvIiwiaGYuY28iXSkpe2NvbnN0IGQ9KChvPXByb2Nlc3MuZW52KT09bnVsbD92b2lkIDA6by5IRl9UT0tFTik/PygodT1wcm9jZXNzLmVudik9PW51bGw/dm9pZCAwOnUuSEZfQUNDRVNTX1RPS0VOKTtkJiZwLnNldCgiQXV0aG9yaXphdGlvbiIsYEJlYXJlciAke2R9YCl9cmV0dXJuIGZldGNoKGMse2hlYWRlcnM6cH0pfWVsc2UgcmV0dXJuIGZldGNoKGMpfWNvbnN0IEVSUk9SX01BUFBJTkc9ezQwMDoiQmFkIHJlcXVlc3QgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGxvYWQgZmlsZSIsNDAxOiJVbmF1dGhvcml6ZWQgYWNjZXNzIHRvIGZpbGUiLDQwMzoiRm9yYmlkZGVuIGFjY2VzcyB0byBmaWxlIiw0MDQ6IkNvdWxkIG5vdCBsb2NhdGUgZmlsZSIsNDA4OiJSZXF1ZXN0IHRpbWVvdXQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGxvYWQgZmlsZSIsNTAwOiJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3IgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGxvYWQgZmlsZSIsNTAyOiJCYWQgZ2F0ZXdheSBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gbG9hZCBmaWxlIiw1MDM6IlNlcnZpY2UgdW5hdmFpbGFibGUgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGxvYWQgZmlsZSIsNTA0OiJHYXRld2F5IHRpbWVvdXQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGxvYWQgZmlsZSJ9O2Z1bmN0aW9uIGhhbmRsZUVycm9yKGMsdCxyKXtpZighcilyZXR1cm4gbnVsbDtjb25zdCBvPUVSUk9SX01BUFBJTkdbY10/P2BFcnJvciAoJHtjfSkgb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGxvYWQgZmlsZWA7dGhyb3cgRXJyb3IoYCR7b306ICIke3R9Ii5gKX1jbGFzcyBGaWxlQ2FjaGV7Y29uc3RydWN0b3IodCl7dGhpcy5wYXRoPXR9YXN5bmMgbWF0Y2godCl7bGV0IHI9c2hhcnAuam9pbih0aGlzLnBhdGgsdCksbz1uZXcgRmlsZVJlc3BvbnNlKHIpO2lmKG8uZXhpc3RzKXJldHVybiBvfWFzeW5jIHB1dCh0LHIpe2NvbnN0IG89QnVmZmVyLmZyb20oYXdhaXQgci5hcnJheUJ1ZmZlcigpKTtsZXQgdT1zaGFycC5qb2luKHRoaXMucGF0aCx0KTt0cnl7YXdhaXQgc2hhcnAucHJvbWlzZXMubWtkaXIoc2hhcnAuZGlybmFtZSh1KSx7cmVjdXJzaXZlOiEwfSksYXdhaXQgc2hhcnAucHJvbWlzZXMud3JpdGVGaWxlKHUsbyl9Y2F0Y2goaCl7Y29uc29sZS53YXJuKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIHRoZSBmaWxlIHRvIGNhY2hlOiIsaCl9fX1hc3luYyBmdW5jdGlvbiB0cnlDYWNoZShjLC4uLnQpe2ZvcihsZXQgciBvZiB0KXRyeXtsZXQgbz1hd2FpdCBjLm1hdGNoKHIpO2lmKG8pcmV0dXJuIG99Y2F0Y2h7Y29udGludWV9fWFzeW5jIGZ1bmN0aW9uIGdldE1vZGVsRmlsZShjLHQscj0hMCxvPXt9KXtpZighZW52JDEuYWxsb3dMb2NhbE1vZGVscyYmby5sb2NhbF9maWxlc19vbmx5KXRocm93IEVycm9yKCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gZGV0ZWN0ZWQ6IGxvY2FsIG1vZGVscyBhcmUgZGlzYWJsZWQgKGBlbnYuYWxsb3dMb2NhbE1vZGVscz1mYWxzZWApIGJ1dCB5b3UgaGF2ZSByZXF1ZXN0ZWQgdG8gb25seSB1c2UgbG9jYWwgbW9kZWxzIChgbG9jYWxfZmlsZXNfb25seT10cnVlYCkuIik7ZGlzcGF0Y2hDYWxsYmFjayhvLnByb2dyZXNzX2NhbGxiYWNrLHtzdGF0dXM6ImluaXRpYXRlIixuYW1lOmMsZmlsZTp0fSk7bGV0IHU7aWYoIXUmJmVudiQxLnVzZUJyb3dzZXJDYWNoZSl7aWYodHlwZW9mIGNhY2hlcz4idSIpdGhyb3cgRXJyb3IoIkJyb3dzZXIgY2FjaGUgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50LiIpO3RyeXt1PWF3YWl0IGNhY2hlcy5vcGVuKCJ0cmFuc2Zvcm1lcnMtY2FjaGUiKX1jYXRjaChfKXtjb25zb2xlLndhcm4oIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIG9wZW5pbmcgdGhlIGJyb3dzZXIgY2FjaGU6IixfKX19aWYoIXUmJmVudiQxLnVzZUZTQ2FjaGUmJih1PW5ldyBGaWxlQ2FjaGUoby5jYWNoZV9kaXI/P2VudiQxLmNhY2hlRGlyKSksIXUmJmVudiQxLnVzZUN1c3RvbUNhY2hlKXRocm93IEVycm9yKCJgZW52LnVzZUN1c3RvbUNhY2hlPXRydWVgLCBidXQgYGVudi5jdXN0b21DYWNoZWAgaXMgbm90IGRlZmluZWQuIik7Y29uc3QgaD1vLnJldmlzaW9uPz8ibWFpbiI7bGV0IGE9cGF0aEpvaW4oYyx0KSxwPXBhdGhKb2luKGVudiQxLmxvY2FsTW9kZWxQYXRoLGEpLGY9cGF0aEpvaW4oZW52JDEucmVtb3RlSG9zdCxlbnYkMS5yZW1vdGVQYXRoVGVtcGxhdGUucmVwbGFjZUFsbCgie21vZGVsfSIsYykucmVwbGFjZUFsbCgie3JldmlzaW9ufSIsZW5jb2RlVVJJQ29tcG9uZW50KGgpKSx0KSxkPWg9PT0ibWFpbiI/YTpwYXRoSm9pbihjLGgsdCksbCxuPXUgaW5zdGFuY2VvZiBGaWxlQ2FjaGU/ZDpmLGU9ITEsaTt1JiYoaT1hd2FpdCB0cnlDYWNoZSh1LHAsbikpO2NvbnN0IHM9aSE9PXZvaWQgMDtpZihpPT09dm9pZCAwKXtpZihlbnYkMS5hbGxvd0xvY2FsTW9kZWxzKWlmKGlzVmFsaWRVcmwoYSxbImh0dHA6IiwiaHR0cHM6Il0pKXtpZihvLmxvY2FsX2ZpbGVzX29ubHkpdGhyb3cgbmV3IEVycm9yKGBcYGxvY2FsX2ZpbGVzX29ubHk9dHJ1ZVxgLCBidXQgYXR0ZW1wdGVkIHRvIGxvYWQgYSByZW1vdGUgZmlsZSBmcm9tOiAke2F9LmApfWVsc2UgdHJ5e2k9YXdhaXQgZ2V0RmlsZShwKSxsPXB9Y2F0Y2goYil7Y29uc29sZS53YXJuKGBVbmFibGUgdG8gbG9hZCBmcm9tIGxvY2FsIHBhdGggIiR7cH0iOiAiJHtifSJgKX1pZihpPT09dm9pZCAwfHxpLnN0YXR1cz09PTQwNCl7aWYoby5sb2NhbF9maWxlc19vbmx5fHwhZW52JDEuYWxsb3dSZW1vdGVNb2RlbHMpe2lmKHIpdGhyb3cgRXJyb3IoYFxgbG9jYWxfZmlsZXNfb25seT10cnVlXGAgb3IgXGBlbnYuYWxsb3dSZW1vdGVNb2RlbHM9ZmFsc2VcYCBhbmQgZmlsZSB3YXMgbm90IGZvdW5kIGxvY2FsbHkgYXQgIiR7cH0iLmApO3JldHVybiBudWxsfWlmKGk9YXdhaXQgZ2V0RmlsZShmKSxpLnN0YXR1cyE9PTIwMClyZXR1cm4gaGFuZGxlRXJyb3IoaS5zdGF0dXMsZixyKTtsPW59ZT11JiZ0eXBlb2YgUmVzcG9uc2U8InUiJiZpIGluc3RhbmNlb2YgUmVzcG9uc2UmJmkuc3RhdHVzPT09MjAwfWRpc3BhdGNoQ2FsbGJhY2soby5wcm9ncmVzc19jYWxsYmFjayx7c3RhdHVzOiJkb3dubG9hZCIsbmFtZTpjLGZpbGU6dH0pO2NvbnN0IG09e3N0YXR1czoicHJvZ3Jlc3MiLG5hbWU6YyxmaWxlOnR9O2xldCBnO3JldHVybiBvLnByb2dyZXNzX2NhbGxiYWNrP3MmJnR5cGVvZiBuYXZpZ2F0b3I8InUiJiYvZmlyZWZveC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk/KGc9bmV3IFVpbnQ4QXJyYXkoYXdhaXQgaS5hcnJheUJ1ZmZlcigpKSxkaXNwYXRjaENhbGxiYWNrKG8ucHJvZ3Jlc3NfY2FsbGJhY2ssey4uLm0scHJvZ3Jlc3M6MTAwLGxvYWRlZDpnLmxlbmd0aCx0b3RhbDpnLmxlbmd0aH0pKTpnPWF3YWl0IHJlYWRSZXNwb25zZShpLF89PntkaXNwYXRjaENhbGxiYWNrKG8ucHJvZ3Jlc3NfY2FsbGJhY2ssey4uLm0sLi4uX30pfSk6Zz1uZXcgVWludDhBcnJheShhd2FpdCBpLmFycmF5QnVmZmVyKCkpLGUmJmwmJmF3YWl0IHUubWF0Y2gobCk9PT12b2lkIDAmJmF3YWl0IHUucHV0KGwsbmV3IFJlc3BvbnNlKGcse2hlYWRlcnM6aS5oZWFkZXJzfSkpLmNhdGNoKF89Pntjb25zb2xlLndhcm4oYFVuYWJsZSB0byBhZGQgcmVzcG9uc2UgdG8gYnJvd3NlciBjYWNoZTogJHtffS5gKX0pLGRpc3BhdGNoQ2FsbGJhY2soby5wcm9ncmVzc19jYWxsYmFjayx7c3RhdHVzOiJkb25lIixuYW1lOmMsZmlsZTp0fSksZ31hc3luYyBmdW5jdGlvbiBnZXRNb2RlbEpTT04oYyx0LHI9ITAsbz17fSl7bGV0IHU9YXdhaXQgZ2V0TW9kZWxGaWxlKGMsdCxyLG8pO2lmKHU9PT1udWxsKXJldHVybnt9O2xldCBhPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiKS5kZWNvZGUodSk7cmV0dXJuIEpTT04ucGFyc2UoYSl9YXN5bmMgZnVuY3Rpb24gcmVhZFJlc3BvbnNlKGMsdCl7Y29uc3Qgcj1jLmhlYWRlcnMuZ2V0KCJDb250ZW50LUxlbmd0aCIpO3I9PT1udWxsJiZjb25zb2xlLndhcm4oIlVuYWJsZSB0byBkZXRlcm1pbmUgY29udGVudC1sZW5ndGggZnJvbSByZXNwb25zZSBoZWFkZXJzLiBXaWxsIGV4cGFuZCBidWZmZXIgd2hlbiBuZWVkZWQuIik7bGV0IG89cGFyc2VJbnQocj8/IjAiKSx1PW5ldyBVaW50OEFycmF5KG8pLGg9MDtjb25zdCBhPWMuYm9keS5nZXRSZWFkZXIoKTthc3luYyBmdW5jdGlvbiBwKCl7Y29uc3R7ZG9uZTpmLHZhbHVlOmR9PWF3YWl0IGEucmVhZCgpO2lmKGYpcmV0dXJuO2xldCBsPWgrZC5sZW5ndGg7aWYobD5vKXtvPWw7bGV0IGU9bmV3IFVpbnQ4QXJyYXkobyk7ZS5zZXQodSksdT1lfXUuc2V0KGQsaCksaD1sO2NvbnN0IG49aC9vKjEwMDtyZXR1cm4gdCh7cHJvZ3Jlc3M6bixsb2FkZWQ6aCx0b3RhbDpvfSkscCgpfXJldHVybiBhd2FpdCBwKCksdX1mdW5jdGlvbiBwYXRoSm9pbiguLi5jKXtyZXR1cm4gYz1jLm1hcCgodCxyKT0+KHImJih0PXQucmVwbGFjZShuZXcgUmVnRXhwKCJeLyIpLCIiKSksciE9PWMubGVuZ3RoLTEmJih0PXQucmVwbGFjZShuZXcgUmVnRXhwKCIvJCIpLCIiKSksdCkpLGMuam9pbigiLyIpfWZ1bmN0aW9uIGludGVycG9sYXRlX2RhdGEoYyxbdCxyLG9dLFt1LGhdLGE9ImJpbGluZWFyIixwPSExKXtjb25zdCBmPWgvbyxkPXUvcixsPW5ldyBjLmNvbnN0cnVjdG9yKHUqaCp0KSxuPXIqbyxlPXUqaDtmb3IobGV0IGk9MDtpPHU7KytpKWZvcihsZXQgcz0wO3M8aDsrK3Mpe2NvbnN0IG09aSpoK3MsZz0ocysuNSkvZi0uNSxfPShpKy41KS9kLS41O2xldCBiPU1hdGguZmxvb3IoZykseT1NYXRoLmZsb29yKF8pO2NvbnN0IFQ9TWF0aC5taW4oYisxLG8tMSksdz1NYXRoLm1pbih5KzEsci0xKTtiPU1hdGgubWF4KGIsMCkseT1NYXRoLm1heCh5LDApO2NvbnN0IHg9Zy1iLEU9Xy15LFA9KDEteCkqKDEtRSksdj14KigxLUUpLE09KDEteCkqRSwkPXgqRSx6PXkqbyxCPXcqbyxOPXorYixEPXorVCxJPUIrYixGPUIrVDtmb3IobGV0IFg9MDtYPHQ7KytYKXtjb25zdCBHPVgqbjtsW1gqZSttXT1QKmNbRytOXSt2KmNbRytEXStNKmNbRytJXSskKmNbRytGXX19cmV0dXJuIGx9ZnVuY3Rpb24gcGVybXV0ZV9kYXRhKGMsdCxyKXtjb25zdCBvPW5ldyBBcnJheShyLmxlbmd0aCksdT1uZXcgQXJyYXkoci5sZW5ndGgpO2ZvcihsZXQgcD1yLmxlbmd0aC0xLGY9MTtwPj0wOy0tcCl1W3BdPWYsb1twXT10W3JbcF1dLGYqPW9bcF07Y29uc3QgaD1yLm1hcCgocCxmKT0+dVtyLmluZGV4T2YoZildKSxhPW5ldyBjLmNvbnN0cnVjdG9yKGMubGVuZ3RoKTtmb3IobGV0IHA9MDtwPGMubGVuZ3RoOysrcCl7bGV0IGY9MDtmb3IobGV0IGQ9dC5sZW5ndGgtMSxsPXA7ZD49MDstLWQpZis9bCV0W2RdKmhbZF0sbD1NYXRoLmZsb29yKGwvdFtkXSk7YVtmXT1jW3BdfXJldHVyblthLG9dfWZ1bmN0aW9uIHNvZnRtYXgoYyl7Y29uc3QgdD1tYXgoYylbMF0scj1jLm1hcChoPT5NYXRoLmV4cChoLXQpKSxvPXIucmVkdWNlKChoLGEpPT5oK2EsMCk7cmV0dXJuIHIubWFwKGg9Pmgvbyl9ZnVuY3Rpb24gbG9nX3NvZnRtYXgoYyl7cmV0dXJuIHNvZnRtYXgoYykubWFwKG89Pk1hdGgubG9nKG8pKX1mdW5jdGlvbiBnZXRUb3BJdGVtcyhjLHQ9MCl7cmV0dXJuIGM9QXJyYXkuZnJvbShjKS5tYXAoKHIsbyk9PltvLHJdKS5zb3J0KChyLG8pPT5vWzFdLXJbMV0pLHQhPT1udWxsJiZ0PjAmJihjPWMuc2xpY2UoMCx0KSksY31mdW5jdGlvbiBtaW4oYyl7aWYoYy5sZW5ndGg9PT0wKXRocm93IEVycm9yKCJBcnJheSBtdXN0IG5vdCBiZSBlbXB0eSIpO2xldCB0PWNbMF0scj0wO2ZvcihsZXQgbz0xO288Yy5sZW5ndGg7KytvKWNbb108dCYmKHQ9Y1tvXSxyPW8pO3JldHVyblt0LHJdfWZ1bmN0aW9uIG1heChjKXtpZihjLmxlbmd0aD09PTApdGhyb3cgRXJyb3IoIkFycmF5IG11c3Qgbm90IGJlIGVtcHR5Iik7bGV0IHQ9Y1swXSxyPTA7Zm9yKGxldCBvPTE7bzxjLmxlbmd0aDsrK28pY1tvXT50JiYodD1jW29dLHI9byk7cmV0dXJuW051bWJlcih0KSxyXX1mdW5jdGlvbiBpc1Bvd2VyT2ZUd28oYyl7cmV0dXJuIGM+MCYmKGMmYy0xKT09PTB9Y2xhc3MgUDJGRlR7Y29uc3RydWN0b3IodCl7aWYodGhpcy5zaXplPXR8MCx0aGlzLnNpemU8PTF8fCFpc1Bvd2VyT2ZUd28odGhpcy5zaXplKSl0aHJvdyBuZXcgRXJyb3IoIkZGVCBzaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28gbGFyZ2VyIHRoYW4gMSIpO3RoaXMuX2NzaXplPXQ8PDEsdGhpcy50YWJsZT1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuc2l6ZSoyKTtmb3IobGV0IG89MDtvPHRoaXMudGFibGUubGVuZ3RoO28rPTIpe2NvbnN0IHU9TWF0aC5QSSpvL3RoaXMuc2l6ZTt0aGlzLnRhYmxlW29dPU1hdGguY29zKHUpLHRoaXMudGFibGVbbysxXT0tTWF0aC5zaW4odSl9bGV0IHI9MDtmb3IobGV0IG89MTt0aGlzLnNpemU+bztvPDw9MSkrK3I7dGhpcy5fd2lkdGg9ciUyPT09MD9yLTE6cix0aGlzLl9iaXRyZXY9bmV3IEludDMyQXJyYXkoMTw8dGhpcy5fd2lkdGgpO2ZvcihsZXQgbz0wO288dGhpcy5fYml0cmV2Lmxlbmd0aDsrK28pe3RoaXMuX2JpdHJldltvXT0wO2ZvcihsZXQgdT0wO3U8dGhpcy5fd2lkdGg7dSs9Mil7Y29uc3QgaD10aGlzLl93aWR0aC11LTI7dGhpcy5fYml0cmV2W29dfD0obz4+PnUmMyk8PGh9fX1jcmVhdGVDb21wbGV4QXJyYXkoKXtyZXR1cm4gbmV3IEZsb2F0NjRBcnJheSh0aGlzLl9jc2l6ZSl9ZnJvbUNvbXBsZXhBcnJheSh0LHIpe2NvbnN0IG89cnx8bmV3IEFycmF5KHQubGVuZ3RoPj4+MSk7Zm9yKGxldCB1PTA7dTx0Lmxlbmd0aDt1Kz0yKW9bdT4+PjFdPXRbdV07cmV0dXJuIG99dG9Db21wbGV4QXJyYXkodCxyKXtjb25zdCBvPXJ8fHRoaXMuY3JlYXRlQ29tcGxleEFycmF5KCk7Zm9yKGxldCB1PTA7dTxvLmxlbmd0aDt1Kz0yKW9bdV09dFt1Pj4+MV0sb1t1KzFdPTA7cmV0dXJuIG99dHJhbnNmb3JtKHQscil7aWYodD09PXIpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSBkaWZmZXJlbnQiKTt0aGlzLl90cmFuc2Zvcm00KHQsciwxKX1yZWFsVHJhbnNmb3JtKHQscil7aWYodD09PXIpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSBkaWZmZXJlbnQiKTt0aGlzLl9yZWFsVHJhbnNmb3JtNCh0LHIsMSl9aW52ZXJzZVRyYW5zZm9ybSh0LHIpe2lmKHQ9PT1yKXRocm93IG5ldyBFcnJvcigiSW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgZGlmZmVyZW50Iik7dGhpcy5fdHJhbnNmb3JtNCh0LHIsLTEpO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7KytvKXRbb10vPXRoaXMuc2l6ZX1fdHJhbnNmb3JtNCh0LHIsbyl7Y29uc3QgdT10aGlzLl9jc2l6ZTtsZXQgYT0xPDx0aGlzLl93aWR0aCxwPXUvYTw8MSxmLGQ7Y29uc3QgbD10aGlzLl9iaXRyZXY7aWYocD09PTQpZm9yKGY9MCxkPTA7Zjx1O2YrPXAsKytkKXtjb25zdCBlPWxbZF07dGhpcy5fc2luZ2xlVHJhbnNmb3JtMihyLHQsZixlLGEpfWVsc2UgZm9yKGY9MCxkPTA7Zjx1O2YrPXAsKytkKXtjb25zdCBlPWxbZF07dGhpcy5fc2luZ2xlVHJhbnNmb3JtNChyLHQsZixlLGEsbyl9Y29uc3Qgbj10aGlzLnRhYmxlO2ZvcihhPj49MjthPj0yO2E+Pj0yKXtwPXUvYTw8MTtjb25zdCBlPXA+Pj4yO2ZvcihmPTA7Zjx1O2YrPXApe2NvbnN0IGk9ZitlLTE7Zm9yKGxldCBzPWYsbT0wO3M8aTtzKz0yLG0rPWEpe2NvbnN0IGc9cyxfPWcrZSxiPV8rZSx5PWIrZSxUPXRbZ10sdz10W2crMV0seD10W19dLEU9dFtfKzFdLFA9dFtiXSx2PXRbYisxXSxNPXRbeV0sJD10W3krMV0sej1uW21dLEI9bypuW20rMV0sTj14KnotRSpCLEQ9eCpCK0UqeixJPW5bMiptXSxGPW8qblsyKm0rMV0sWD1QKkktdipGLEc9UCpGK3YqSSxlZT1uWzMqbV0sSj1vKm5bMyptKzFdLGxlPU0qZWUtJCpKLHhlPU0qSiskKmVlLHdlPVQrWCxpZT13K0csVGU9VC1YLGJlPXctRyxJZT1OK2xlLExlPUQreGUsRWU9byooTi1sZSksa2U9byooRC14ZSk7dFtnXT13ZStJZSx0W2crMV09aWUrTGUsdFtfXT1UZStrZSx0W18rMV09YmUtRWUsdFtiXT13ZS1JZSx0W2IrMV09aWUtTGUsdFt5XT1UZS1rZSx0W3krMV09YmUrRWV9fX19X3NpbmdsZVRyYW5zZm9ybTIodCxyLG8sdSxoKXtjb25zdCBhPXRbdV0scD10W3UrMV0sZj10W3UraF0sZD10W3UraCsxXTtyW29dPWErZixyW28rMV09cCtkLHJbbysyXT1hLWYscltvKzNdPXAtZH1fc2luZ2xlVHJhbnNmb3JtNCh0LHIsbyx1LGgsYSl7Y29uc3QgcD1oKjIsZj1oKjMsZD10W3VdLGw9dFt1KzFdLG49dFt1K2hdLGU9dFt1K2grMV0saT10W3UrcF0scz10W3UrcCsxXSxtPXRbdStmXSxnPXRbdStmKzFdLF89ZCtpLGI9bCtzLHk9ZC1pLFQ9bC1zLHc9bittLHg9ZStnLEU9YSoobi1tKSxQPWEqKGUtZyk7cltvXT1fK3cscltvKzFdPWIreCxyW28rMl09eStQLHJbbyszXT1ULUUscltvKzRdPV8tdyxyW28rNV09Yi14LHJbbys2XT15LVAscltvKzddPVQrRX1fcmVhbFRyYW5zZm9ybTQodCxyLG8pe2NvbnN0IHU9dGhpcy5fY3NpemU7bGV0IGE9MTw8dGhpcy5fd2lkdGgscD11L2E8PDEsZixkO2NvbnN0IGw9dGhpcy5fYml0cmV2O2lmKHA9PT00KWZvcihmPTAsZD0wO2Y8dTtmKz1wLCsrZCl7Y29uc3QgaT1sW2RdO3RoaXMuX3NpbmdsZVJlYWxUcmFuc2Zvcm0yKHIsdCxmLGk+Pj4xLGE+Pj4xKX1lbHNlIGZvcihmPTAsZD0wO2Y8dTtmKz1wLCsrZCl7Y29uc3QgaT1sW2RdO3RoaXMuX3NpbmdsZVJlYWxUcmFuc2Zvcm00KHIsdCxmLGk+Pj4xLGE+Pj4xLG8pfWNvbnN0IG49dGhpcy50YWJsZTtmb3IoYT4+PTI7YT49MjthPj49Mil7cD11L2E8PDE7Y29uc3QgaT1wPj4+MSxzPWk+Pj4xLG09cz4+PjE7Zm9yKGY9MDtmPHU7Zis9cClmb3IobGV0IGc9MCxfPTA7Zzw9bTtnKz0yLF8rPWEpe2NvbnN0IGI9ZitnLHk9YitzLFQ9eStzLHc9VCtzLHg9dFtiXSxFPXRbYisxXSxQPXRbeV0sdj10W3krMV0sTT10W1RdLCQ9dFtUKzFdLHo9dFt3XSxCPXRbdysxXSxOPXgsRD1FLEk9bltfXSxGPW8qbltfKzFdLFg9UCpJLXYqRixHPVAqRit2KkksZWU9blsyKl9dLEo9bypuWzIqXysxXSxsZT1NKmVlLSQqSix4ZT1NKkorJCplZSx3ZT1uWzMqX10saWU9bypuWzMqXysxXSxUZT16KndlLUIqaWUsYmU9eippZStCKndlLEllPU4rbGUsTGU9RCt4ZSxFZT1OLWxlLGtlPUQteGUsRGU9WCtUZSxBZT1HK2JlLFNlPW8qKFgtVGUpLEJlPW8qKEctYmUpO2lmKHRbYl09SWUrRGUsdFtiKzFdPUxlK0FlLHRbeV09RWUrQmUsdFt5KzFdPWtlLVNlLGc9PT0wKXt0W1RdPUllLURlLHRbVCsxXT1MZS1BZTtjb250aW51ZX1pZihnPT09bSljb250aW51ZTtjb25zdCB6ZT1mK3MtZyxqZT1mK2ktZzt0W3plXT1FZS1vKkJlLHRbemUrMV09LWtlLW8qU2UsdFtqZV09SWUtbypEZSx0W2plKzFdPS1MZStvKkFlfX1jb25zdCBlPXU+Pj4xO2ZvcihsZXQgaT0yO2k8ZTtpKz0yKXRbdS1pXT10W2ldLHRbdS1pKzFdPS10W2krMV19X3NpbmdsZVJlYWxUcmFuc2Zvcm0yKHQscixvLHUsaCl7Y29uc3QgYT10W3VdLHA9dFt1K2hdO3Jbb109YStwLHJbbysxXT0wLHJbbysyXT1hLXAscltvKzNdPTB9X3NpbmdsZVJlYWxUcmFuc2Zvcm00KHQscixvLHUsaCxhKXtjb25zdCBwPWgqMixmPWgqMyxkPXRbdV0sbD10W3UraF0sbj10W3UrcF0sZT10W3UrZl0saT1kK24scz1kLW4sbT1sK2UsZz1hKihsLWUpO3Jbb109aSttLHJbbysxXT0wLHJbbysyXT1zLHJbbyszXT0tZyxyW28rNF09aS1tLHJbbys1XT0wLHJbbys2XT1zLHJbbys3XT1nfX1jbGFzcyBOUDJGRlR7Y29uc3RydWN0b3IodCl7Y29uc3Qgcj0yKih0LTEpLG89MiooMip0LTEpLHU9MioqTWF0aC5jZWlsKE1hdGgubG9nMihvKSk7dGhpcy5idWZmZXJTaXplPXUsdGhpcy5fYT1yO2NvbnN0IGg9bmV3IEZsb2F0NjRBcnJheShvKSxhPW5ldyBGbG9hdDY0QXJyYXkodSk7dGhpcy5fY2hpcnBCdWZmZXI9bmV3IEZsb2F0NjRBcnJheSh1KSx0aGlzLl9idWZmZXIxPW5ldyBGbG9hdDY0QXJyYXkodSksdGhpcy5fYnVmZmVyMj1uZXcgRmxvYXQ2NEFycmF5KHUpLHRoaXMuX291dEJ1ZmZlcjE9bmV3IEZsb2F0NjRBcnJheSh1KSx0aGlzLl9vdXRCdWZmZXIyPW5ldyBGbG9hdDY0QXJyYXkodSk7Y29uc3QgcD0tMipNYXRoLlBJL3QsZj1NYXRoLmNvcyhwKSxkPU1hdGguc2luKHApO2ZvcihsZXQgbD0wO2w8bz4+MTsrK2wpe2NvbnN0IG49KGwrMS10KSoqMi8yLGU9TWF0aC5zcXJ0KGYqKjIrZCoqMikqKm4saT1uKk1hdGguYXRhbjIoZCxmKSxzPTIqbDtoW3NdPWUqTWF0aC5jb3MoaSksaFtzKzFdPWUqTWF0aC5zaW4oaSksYVtzXT1oW3NdLGFbcysxXT0taFtzKzFdfXRoaXMuX3NsaWNlZENoaXJwQnVmZmVyPWguc3ViYXJyYXkocixvKSx0aGlzLl9mPW5ldyBQMkZGVCh1Pj4xKSx0aGlzLl9mLnRyYW5zZm9ybSh0aGlzLl9jaGlycEJ1ZmZlcixhKX1fdHJhbnNmb3JtKHQscixvKXtjb25zdCB1PXRoaXMuX2J1ZmZlcjEsaD10aGlzLl9idWZmZXIyLGE9dGhpcy5fb3V0QnVmZmVyMSxwPXRoaXMuX291dEJ1ZmZlcjIsZj10aGlzLl9jaGlycEJ1ZmZlcixkPXRoaXMuX3NsaWNlZENoaXJwQnVmZmVyLGw9dGhpcy5fYTtpZihvKWZvcihsZXQgbj0wO248ZC5sZW5ndGg7bis9Mil7Y29uc3QgZT1uKzEsaT1uPj4xLHM9cltpXTt1W25dPXMqZFtuXSx1W2VdPXMqZFtlXX1lbHNlIGZvcihsZXQgbj0wO248ZC5sZW5ndGg7bis9Mil7Y29uc3QgZT1uKzE7dVtuXT1yW25dKmRbbl0tcltlXSpkW2VdLHVbZV09cltuXSpkW2VdK3JbZV0qZFtuXX10aGlzLl9mLnRyYW5zZm9ybShhLHUpO2ZvcihsZXQgbj0wO248Zi5sZW5ndGg7bis9Mil7Y29uc3QgZT1uKzE7aFtuXT1hW25dKmZbbl0tYVtlXSpmW2VdLGhbZV09YVtuXSpmW2VdK2FbZV0qZltuXX10aGlzLl9mLmludmVyc2VUcmFuc2Zvcm0ocCxoKTtmb3IobGV0IG49MDtuPHAubGVuZ3RoO24rPTIpe2NvbnN0IGU9cFtuK2xdLGk9cFtuK2wrMV0scz1kW25dLG09ZFtuKzFdO3Rbbl09ZSpzLWkqbSx0W24rMV09ZSptK2kqc319dHJhbnNmb3JtKHQscil7dGhpcy5fdHJhbnNmb3JtKHQsciwhMSl9cmVhbFRyYW5zZm9ybSh0LHIpe3RoaXMuX3RyYW5zZm9ybSh0LHIsITApfX1jbGFzcyBGRlR7Y29uc3RydWN0b3IodCl7dGhpcy5mZnRfbGVuZ3RoPXQsdGhpcy5pc1Bvd2VyT2ZUd289aXNQb3dlck9mVHdvKHQpLHRoaXMuaXNQb3dlck9mVHdvPyh0aGlzLmZmdD1uZXcgUDJGRlQodCksdGhpcy5vdXRwdXRCdWZmZXJTaXplPTIqdCk6KHRoaXMuZmZ0PW5ldyBOUDJGRlQodCksdGhpcy5vdXRwdXRCdWZmZXJTaXplPXRoaXMuZmZ0LmJ1ZmZlclNpemUpfXJlYWxUcmFuc2Zvcm0odCxyKXt0aGlzLmZmdC5yZWFsVHJhbnNmb3JtKHQscil9dHJhbnNmb3JtKHQscil7dGhpcy5mZnQudHJhbnNmb3JtKHQscil9fWZ1bmN0aW9uIG1lZGlhbkZpbHRlcihjLHQpe2lmKHQlMj09PTB8fHQ8PTApdGhyb3cgbmV3IEVycm9yKCJXaW5kb3cgc2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgb2RkIG51bWJlciIpO2NvbnN0IHI9bmV3IGMuY29uc3RydWN0b3IoYy5sZW5ndGgpLG89bmV3IGMuY29uc3RydWN0b3IodCksdT1NYXRoLmZsb29yKHQvMik7Zm9yKGxldCBoPTA7aDxjLmxlbmd0aDsrK2gpe2xldCBhPTA7Zm9yKGxldCBwPS11O3A8PXU7KytwKXtsZXQgZj1oK3A7ZjwwP2Y9TWF0aC5hYnMoZik6Zj49Yy5sZW5ndGgmJihmPTIqKGMubGVuZ3RoLTEpLWYpLG9bYSsrXT1jW2ZdfW8uc29ydCgpLHJbaF09b1t1XX1yZXR1cm4gcn1mdW5jdGlvbiByb3VuZChjLHQpe2NvbnN0IHI9TWF0aC5wb3coMTAsdCk7cmV0dXJuIE1hdGgucm91bmQoYypyKS9yfWZ1bmN0aW9uIGJhbmtlcnNfcm91bmQoYyl7Y29uc3QgdD1NYXRoLnJvdW5kKGMpO3JldHVybiBNYXRoLmFicyhjKSUxPT09LjU/dCUyPT09MD90OnQtMTp0fWNvbnN0IERhdGFUeXBlTWFwPU9iamVjdC5mcmVlemUoe2Zsb2F0MzI6RmxvYXQzMkFycmF5LGZsb2F0NjQ6RmxvYXQ2NEFycmF5LHN0cmluZzpBcnJheSxpbnQ4OkludDhBcnJheSx1aW50ODpVaW50OEFycmF5LGludDE2OkludDE2QXJyYXksdWludDE2OlVpbnQxNkFycmF5LGludDMyOkludDMyQXJyYXksdWludDMyOlVpbnQzMkFycmF5LGludDY0OkJpZ0ludDY0QXJyYXksdWludDY0OkJpZ1VpbnQ2NEFycmF5LGJvb2w6VWludDhBcnJheX0pLE9OTlhUZW5zb3IkMT1PTk5YLlRlbnNvcjtjbGFzcyBUZW5zb3J7Y29uc3RydWN0b3IoLi4udCl7Syh0aGlzLCJkaW1zIik7Syh0aGlzLCJ0eXBlIik7Syh0aGlzLCJkYXRhIik7Syh0aGlzLCJzaXplIik7cmV0dXJuIHRbMF1pbnN0YW5jZW9mIE9OTlhUZW5zb3IkMT9PYmplY3QuYXNzaWduKHRoaXMsdFswXSk6T2JqZWN0LmFzc2lnbih0aGlzLG5ldyBPTk5YVGVuc29yJDEodFswXSx0WzFdLHRbMl0pKSxuZXcgUHJveHkodGhpcyx7Z2V0OihyLG8pPT57aWYodHlwZW9mIG89PSJzdHJpbmciKXtsZXQgdT1OdW1iZXIobyk7aWYoTnVtYmVyLmlzSW50ZWdlcih1KSlyZXR1cm4gci5fZ2V0aXRlbSh1KX1yZXR1cm4gcltvXX0sc2V0OihyLG8sdSk9PnJbb109dX0pfSpbU3ltYm9sLml0ZXJhdG9yXSgpe2NvbnN0W3QsLi4ucl09dGhpcy5kaW1zO2lmKHIubGVuZ3RoPjApe2NvbnN0IG89ci5yZWR1Y2UoKHUsaCk9PnUqaCk7Zm9yKGxldCB1PTA7dTx0OysrdSl5aWVsZCB0aGlzLl9zdWJhcnJheSh1LG8scil9ZWxzZSB5aWVsZCp0aGlzLmRhdGF9X2dldGl0ZW0odCl7Y29uc3RbciwuLi5vXT10aGlzLmRpbXM7aWYodD1zYWZlSW5kZXgodCxyKSxvLmxlbmd0aD4wKXtjb25zdCB1PW8ucmVkdWNlKChoLGEpPT5oKmEpO3JldHVybiB0aGlzLl9zdWJhcnJheSh0LHUsbyl9ZWxzZSByZXR1cm4gbmV3IFRlbnNvcih0aGlzLnR5cGUsW3RoaXMuZGF0YVt0XV0sbyl9aW5kZXhPZih0KXtmb3IobGV0IHI9MDtyPHRoaXMuZGF0YS5sZW5ndGg7KytyKWlmKHRoaXMuZGF0YVtyXT09dClyZXR1cm4gcjtyZXR1cm4tMX1fc3ViYXJyYXkodCxyLG8pe2NvbnN0IHU9dCpyLGg9KHQrMSkqcixhPSJzdWJhcnJheSJpbiB0aGlzLmRhdGE/dGhpcy5kYXRhLnN1YmFycmF5KHUsaCk6dGhpcy5kYXRhLnNsaWNlKHUsaCk7cmV0dXJuIG5ldyBUZW5zb3IodGhpcy50eXBlLGEsbyl9aXRlbSgpe2lmKHRoaXMuZGF0YS5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcihgYSBUZW5zb3Igd2l0aCAke3RoaXMuZGF0YS5sZW5ndGh9IGVsZW1lbnRzIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gU2NhbGFyYCk7cmV0dXJuIHRoaXMuZGF0YVswXX10b2xpc3QoKXtyZXR1cm4gcmVzaGFwZSh0aGlzLmRhdGEsdGhpcy5kaW1zKX1zaWdtb2lkKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5zaWdtb2lkXygpfXNpZ21vaWRfKCl7Zm9yKGxldCB0PTA7dDx0aGlzLmRhdGEubGVuZ3RoOysrdCl0aGlzLmRhdGFbdF09MS8oMStNYXRoLmV4cCgtdGhpcy5kYXRhW3RdKSk7cmV0dXJuIHRoaXN9bXVsKHQpe3JldHVybiB0aGlzLmNsb25lKCkubXVsXyh0KX1tdWxfKHQpe2ZvcihsZXQgcj0wO3I8dGhpcy5kYXRhLmxlbmd0aDsrK3IpdGhpcy5kYXRhW3JdKj10O3JldHVybiB0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmFkZF8odCl9YWRkXyh0KXtmb3IobGV0IHI9MDtyPHRoaXMuZGF0YS5sZW5ndGg7KytyKXRoaXMuZGF0YVtyXSs9dDtyZXR1cm4gdGhpc31jbG9uZSgpe3JldHVybiBuZXcgVGVuc29yKHRoaXMudHlwZSx0aGlzLmRhdGEuc2xpY2UoKSx0aGlzLmRpbXMuc2xpY2UoKSl9c2xpY2UoLi4udCl7bGV0IHI9W10sbz1bXTtmb3IobGV0IGY9MDtmPHRoaXMuZGltcy5sZW5ndGg7KytmKXtsZXQgZD10W2ZdO2lmKGQ9PW51bGwpby5wdXNoKFswLHRoaXMuZGltc1tmXV0pLHIucHVzaCh0aGlzLmRpbXNbZl0pO2Vsc2UgaWYodHlwZW9mIGQ9PSJudW1iZXIiKWQ9c2FmZUluZGV4KGQsdGhpcy5kaW1zW2ZdLGYpLG8ucHVzaChbZCxkKzFdKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoZCkmJmQubGVuZ3RoPT09Mil7aWYoZFswXT5kWzFdKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzbGljZTogJHtkfWApO2xldCBsPVtNYXRoLm1heChkWzBdLDApLE1hdGgubWluKGRbMV0sdGhpcy5kaW1zW2ZdKV07by5wdXNoKGwpLHIucHVzaChsWzFdLWxbMF0pfWVsc2UgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNsaWNlOiAke2R9YCl9bGV0IHU9by5tYXAoKFtmLGRdKT0+ZC1mKSxoPXUucmVkdWNlKChmLGQpPT5mKmQpLGE9bmV3IHRoaXMuZGF0YS5jb25zdHJ1Y3RvcihoKTtjb25zdCBwPXRoaXMuc3RyaWRlKCk7Zm9yKGxldCBmPTA7ZjxoOysrZil7bGV0IGQ9MDtmb3IobGV0IGw9dS5sZW5ndGgtMSxuPWY7bD49MDstLWwpe2NvbnN0IGU9dVtsXTtkKz0obiVlK29bbF1bMF0pKnBbbF0sbj1NYXRoLmZsb29yKG4vZSl9YVtmXT10aGlzLmRhdGFbZF19cmV0dXJuIG5ldyBUZW5zb3IodGhpcy50eXBlLGEscil9cGVybXV0ZSguLi50KXtyZXR1cm4gcGVybXV0ZSh0aGlzLHQpfXRyYW5zcG9zZSguLi50KXtyZXR1cm4gdGhpcy5wZXJtdXRlKC4uLnQpfXN1bSh0PW51bGwscj0hMSl7cmV0dXJuIHRoaXMubm9ybSgxLHQscil9bm9ybSh0PSJmcm8iLHI9bnVsbCxvPSExKXtpZih0PT09ImZybyIpdD0yO2Vsc2UgaWYodHlwZW9mIHQ9PSJzdHJpbmciKXRocm93IEVycm9yKGBVbnN1cHBvcnRlZCBub3JtOiAke3R9YCk7aWYocj09PW51bGwpe2xldCBhPXRoaXMuZGF0YS5yZWR1Y2UoKHAsZik9PnArZioqdCwwKSoqKDEvdCk7cmV0dXJuIG5ldyBUZW5zb3IodGhpcy50eXBlLFthXSxbXSl9cj1zYWZlSW5kZXgocix0aGlzLmRpbXMubGVuZ3RoKTtjb25zdCB1PXRoaXMuZGltcy5zbGljZSgpO3Vbcl09MTtjb25zdCBoPW5ldyB0aGlzLmRhdGEuY29uc3RydWN0b3IodGhpcy5kYXRhLmxlbmd0aC90aGlzLmRpbXNbcl0pO2ZvcihsZXQgYT0wO2E8dGhpcy5kYXRhLmxlbmd0aDsrK2Epe2xldCBwPTA7Zm9yKGxldCBmPXRoaXMuZGltcy5sZW5ndGgtMSxkPWEsbD0xO2Y+PTA7LS1mKXtjb25zdCBuPXRoaXMuZGltc1tmXTtpZihmIT09cil7Y29uc3QgZT1kJW47cCs9ZSpsLGwqPXVbZl19ZD1NYXRoLmZsb29yKGQvbil9aFtwXSs9dGhpcy5kYXRhW2FdKip0fWlmKHQhPT0xKWZvcihsZXQgYT0wO2E8aC5sZW5ndGg7KythKWhbYV09aFthXSoqKDEvdCk7cmV0dXJuIG98fHUuc3BsaWNlKHIsMSksbmV3IFRlbnNvcih0aGlzLnR5cGUsaCx1KX1ub3JtYWxpemVfKHQ9MixyPTEpe3I9c2FmZUluZGV4KHIsdGhpcy5kaW1zLmxlbmd0aCk7Y29uc3Qgbz10aGlzLm5vcm0odCxyLCEwKTtmb3IobGV0IHU9MDt1PHRoaXMuZGF0YS5sZW5ndGg7Kyt1KXtsZXQgaD0wO2ZvcihsZXQgYT10aGlzLmRpbXMubGVuZ3RoLTEscD11LGY9MTthPj0wOy0tYSl7Y29uc3QgZD10aGlzLmRpbXNbYV07aWYoYSE9PXIpe2NvbnN0IGw9cCVkO2grPWwqZixmKj10aGlzLmRpbXNbYV19cD1NYXRoLmZsb29yKHAvZCl9dGhpcy5kYXRhW3VdLz1vLmRhdGFbaF19cmV0dXJuIHRoaXN9bm9ybWFsaXplKHQ9MixyPTEpe3JldHVybiB0aGlzLmNsb25lKCkubm9ybWFsaXplXyh0LHIpfXN0cmlkZSgpe3JldHVybiBkaW1zVG9TdHJpZGUodGhpcy5kaW1zKX1zcXVlZXplKHQ9bnVsbCl7cmV0dXJuIG5ldyBUZW5zb3IodGhpcy50eXBlLHRoaXMuZGF0YSxjYWxjX3NxdWVlemVfZGltcyh0aGlzLmRpbXMsdCkpfXNxdWVlemVfKHQ9bnVsbCl7cmV0dXJuIHRoaXMuZGltcz1jYWxjX3NxdWVlemVfZGltcyh0aGlzLmRpbXMsdCksdGhpc311bnNxdWVlemUodD1udWxsKXtyZXR1cm4gbmV3IFRlbnNvcih0aGlzLnR5cGUsdGhpcy5kYXRhLGNhbGNfdW5zcXVlZXplX2RpbXModGhpcy5kaW1zLHQpKX11bnNxdWVlemVfKHQ9bnVsbCl7cmV0dXJuIHRoaXMuZGltcz1jYWxjX3Vuc3F1ZWV6ZV9kaW1zKHRoaXMuZGltcyx0KSx0aGlzfWZsYXR0ZW5fKHQ9MCxyPS0xKXtyPShyK3RoaXMuZGltcy5sZW5ndGgpJXRoaXMuZGltcy5sZW5ndGg7bGV0IG89dGhpcy5kaW1zLnNsaWNlKDAsdCksdT10aGlzLmRpbXMuc2xpY2UodCxyKzEpLGg9dGhpcy5kaW1zLnNsaWNlKHIrMSk7cmV0dXJuIHRoaXMuZGltcz1bLi4ubyx1LnJlZHVjZSgoYSxwKT0+YSpwLDEpLC4uLmhdLHRoaXN9ZmxhdHRlbih0PTAscj0tMSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5mbGF0dGVuXyh0LHIpfXZpZXcoLi4udCl7bGV0IHI9LTE7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDsrK28paWYodFtvXT09PS0xKXtpZihyIT09LTEpdGhyb3cgbmV3IEVycm9yKCJPbmx5IG9uZSBkaW1lbnNpb24gY2FuIGJlIGluZmVycmVkIik7cj1vfWlmKHIhPT0tMSl7Y29uc3Qgbz10LnJlZHVjZSgodSxoLGEpPT5hIT09cj91Kmg6dSwxKTt0W3JdPXRoaXMuZGF0YS5sZW5ndGgvb31yZXR1cm4gbmV3IFRlbnNvcih0aGlzLnR5cGUsdGhpcy5kYXRhLHQpfW5lZ18oKXtmb3IobGV0IHQ9MDt0PHRoaXMuZGF0YS5sZW5ndGg7Kyt0KXRoaXMuZGF0YVt0XT0tdGhpcy5kYXRhW3RdO3JldHVybiB0aGlzfW5lZygpe3JldHVybiB0aGlzLmNsb25lKCkubmVnXygpfWNsYW1wXyh0LHIpe2ZvcihsZXQgbz0wO288dGhpcy5kYXRhLmxlbmd0aDsrK28pdGhpcy5kYXRhW29dPU1hdGgubWluKE1hdGgubWF4KHRoaXMuZGF0YVtvXSx0KSxyKTtyZXR1cm4gdGhpc31jbGFtcCh0LHIpe3JldHVybiB0aGlzLmNsb25lKCkuY2xhbXBfKHQscil9cm91bmRfKCl7Zm9yKGxldCB0PTA7dDx0aGlzLmRhdGEubGVuZ3RoOysrdCl0aGlzLmRhdGFbdF09TWF0aC5yb3VuZCh0aGlzLmRhdGFbdF0pO3JldHVybiB0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5yb3VuZF8oKX10byh0KXtpZih0aGlzLnR5cGU9PT10KXJldHVybiB0aGlzO2lmKCFEYXRhVHlwZU1hcC5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dH1gKTtyZXR1cm4gbmV3IFRlbnNvcih0LERhdGFUeXBlTWFwW3RdLmZyb20odGhpcy5kYXRhKSx0aGlzLmRpbXMpfX1mdW5jdGlvbiByZXNoYXBlKGMsdCl7Y29uc3Qgcj1jLmxlbmd0aCxvPXQucmVkdWNlKChoLGEpPT5oKmEpO2lmKHIhPT1vKXRocm93IEVycm9yKGBjYW5ub3QgcmVzaGFwZSBhcnJheSBvZiBzaXplICR7cn0gaW50byBzaGFwZSAoJHt0fSlgKTtsZXQgdT1jO2ZvcihsZXQgaD10Lmxlbmd0aC0xO2g+PTA7aC0tKXU9dS5yZWR1Y2UoKGEscCk9PntsZXQgZj1hW2EubGVuZ3RoLTFdO3JldHVybiBmLmxlbmd0aDx0W2hdP2YucHVzaChwKTphLnB1c2goW3BdKSxhfSxbW11dKTtyZXR1cm4gdVswXX1mdW5jdGlvbiBwZXJtdXRlKGMsdCl7Y29uc3RbcixvXT1wZXJtdXRlX2RhdGEoYy5kYXRhLGMuZGltcyx0KTtyZXR1cm4gbmV3IFRlbnNvcihjLnR5cGUscixvKX1mdW5jdGlvbiBpbnRlcnBvbGF0ZShjLFt0LHJdLG89ImJpbGluZWFyIix1PSExKXtjb25zdCBoPWMuZGltcy5hdCgtMyk/PzEsYT1jLmRpbXMuYXQoLTIpLHA9Yy5kaW1zLmF0KC0xKTtsZXQgZj1pbnRlcnBvbGF0ZV9kYXRhKGMuZGF0YSxbaCxhLHBdLFt0LHJdLG8sdSk7cmV0dXJuIG5ldyBUZW5zb3IoYy50eXBlLGYsW2gsdCxyXSl9ZnVuY3Rpb24gbWVhbl9wb29saW5nKGMsdCl7bGV0IHI9W2MuZGltc1swXSxjLmRpbXNbMl1dLG89bmV3IGMuZGF0YS5jb25zdHJ1Y3RvcihyWzBdKnJbMV0pLFt1LGgsYV09Yy5kaW1zLHA9MDtmb3IobGV0IGY9MDtmPHU7KytmKXtsZXQgZD1mKmEqaDtmb3IobGV0IGw9MDtsPGE7KytsKXtsZXQgbj0wLGU9MCxpPWYqaCxzPWQrbDtmb3IobGV0IGc9MDtnPGg7KytnKXtsZXQgXz1OdW1iZXIodC5kYXRhW2krZ10pO2UrPV8sbis9Yy5kYXRhW3MrZyphXSpffWxldCBtPW4vZTtvW3ArK109bX19cmV0dXJuIG5ldyBUZW5zb3IoYy50eXBlLG8scil9ZnVuY3Rpb24gY2FsY19zcXVlZXplX2RpbXMoYyx0KXtyZXR1cm4gYz1jLnNsaWNlKCksdD09PW51bGw/Yz1jLmZpbHRlcihyPT5yIT09MSk6dHlwZW9mIHQ9PSJudW1iZXIiP2NbdF09PT0xJiZjLnNwbGljZSh0LDEpOkFycmF5LmlzQXJyYXkodCkmJihjPWMuZmlsdGVyKChyLG8pPT5yIT09MXx8IXQuaW5jbHVkZXMobykpKSxjfWZ1bmN0aW9uIGNhbGNfdW5zcXVlZXplX2RpbXMoYyx0KXtyZXR1cm4gdD1zYWZlSW5kZXgodCxjLmxlbmd0aCsxKSxjPWMuc2xpY2UoKSxjLnNwbGljZSh0LDAsMSksY31mdW5jdGlvbiBzYWZlSW5kZXgoYyx0LHI9bnVsbCl7aWYoYzwtdHx8Yz49dCl0aHJvdyBuZXcgRXJyb3IoYEluZGV4RXJyb3I6IGluZGV4ICR7Y30gaXMgb3V0IG9mIGJvdW5kcyBmb3IgZGltZW5zaW9uJHtyPT09bnVsbD8iIjoiICIrcn0gd2l0aCBzaXplICR7dH1gKTtyZXR1cm4gYzwwJiYoYz0oYyV0K3QpJXQpLGN9ZnVuY3Rpb24gY2F0KGMsdD0wKXt0PXNhZmVJbmRleCh0LGNbMF0uZGltcy5sZW5ndGgpO2NvbnN0IHI9Y1swXS5kaW1zLnNsaWNlKCk7clt0XT1jLnJlZHVjZSgoYSxwKT0+YStwLmRpbXNbdF0sMCk7Y29uc3Qgbz1yLnJlZHVjZSgoYSxwKT0+YSpwLDEpLHU9bmV3IGNbMF0uZGF0YS5jb25zdHJ1Y3RvcihvKSxoPWNbMF0udHlwZTtpZih0PT09MCl7bGV0IGE9MDtmb3IobGV0IHAgb2YgYyl1LnNldChwLmRhdGEsYSksYSs9cC5kYXRhLmxlbmd0aH1lbHNle2xldCBhPTA7Zm9yKGxldCBwPTA7cDxjLmxlbmd0aDsrK3Ape2xldCBmPWNbcF07Zm9yKGxldCBkPTA7ZDxmLmRhdGEubGVuZ3RoOysrZCl7bGV0IGw9MDtmb3IobGV0IG49Zi5kaW1zLmxlbmd0aC0xLGU9ZCxpPTE7bj49MDstLW4pe2NvbnN0IHM9Zi5kaW1zW25dO2xldCBtPWUlcztuPT09dCYmKG0rPWEpLGwrPW0qaSxpKj1yW25dLGU9TWF0aC5mbG9vcihlL3MpfXVbbF09Zi5kYXRhW2RdfWErPWYuZGltc1t0XX19cmV0dXJuIG5ldyBUZW5zb3IoaCx1LHIpfWZ1bmN0aW9uIHN0YWNrKGMsdD0wKXtyZXR1cm4gY2F0KGMubWFwKHI9PnIudW5zcXVlZXplKHQpKSx0KX1mdW5jdGlvbiBzdGRfbWVhbihjLHQ9bnVsbCxyPTEsbz0hMSl7aWYodD09PW51bGwpe2NvbnN0IGQ9Yy5kYXRhLnJlZHVjZSgoaSxzKT0+aStzLDApL2MuZGF0YS5sZW5ndGgsbD1NYXRoLnNxcnQoYy5kYXRhLnJlZHVjZSgoaSxzKT0+aSsocy1kKSoqMiwwKS8oYy5kYXRhLmxlbmd0aC1yKSksbj1uZXcgVGVuc29yKGMudHlwZSxbZF0sW10pO3JldHVybltuZXcgVGVuc29yKGMudHlwZSxbbF0sW10pLG5dfXQ9c2FmZUluZGV4KHQsYy5kaW1zLmxlbmd0aCk7Y29uc3QgdT1tZWFuKGMsdCxvKSxoPWMuZGltcy5zbGljZSgpO2hbdF09MTtjb25zdCBhPW5ldyBjLmRhdGEuY29uc3RydWN0b3IoYy5kYXRhLmxlbmd0aC9jLmRpbXNbdF0pO2ZvcihsZXQgZj0wO2Y8Yy5kYXRhLmxlbmd0aDsrK2Ype2xldCBkPTA7Zm9yKGxldCBsPWMuZGltcy5sZW5ndGgtMSxuPWYsZT0xO2w+PTA7LS1sKXtjb25zdCBpPWMuZGltc1tsXTtpZihsIT09dCl7Y29uc3Qgcz1uJWk7ZCs9cyplLGUqPWhbbF19bj1NYXRoLmZsb29yKG4vaSl9YVtkXSs9KGMuZGF0YVtmXS11LmRhdGFbZF0pKioyfWZvcihsZXQgZj0wO2Y8YS5sZW5ndGg7KytmKWFbZl09TWF0aC5zcXJ0KGFbZl0vKGMuZGltc1t0XS1yKSk7cmV0dXJuIG98fGguc3BsaWNlKHQsMSksW25ldyBUZW5zb3IoYy50eXBlLGEsaCksdV19ZnVuY3Rpb24gbWVhbihjLHQ9bnVsbCxyPSExKXtpZih0PT09bnVsbCl7bGV0IGg9Yy5kYXRhLnJlZHVjZSgoYSxwKT0+YStwLDApO3JldHVybiBuZXcgVGVuc29yKGMudHlwZSxbaC9jLmRhdGEubGVuZ3RoXSxbXSl9dD1zYWZlSW5kZXgodCxjLmRpbXMubGVuZ3RoKTtjb25zdCBvPWMuZGltcy5zbGljZSgpO29bdF09MTtjb25zdCB1PW5ldyBjLmRhdGEuY29uc3RydWN0b3IoYy5kYXRhLmxlbmd0aC9jLmRpbXNbdF0pO2ZvcihsZXQgaD0wO2g8Yy5kYXRhLmxlbmd0aDsrK2gpe2xldCBhPTA7Zm9yKGxldCBwPWMuZGltcy5sZW5ndGgtMSxmPWgsZD0xO3A+PTA7LS1wKXtjb25zdCBsPWMuZGltc1twXTtpZihwIT09dCl7Y29uc3Qgbj1mJWw7YSs9bipkLGQqPW9bcF19Zj1NYXRoLmZsb29yKGYvbCl9dVthXSs9Yy5kYXRhW2hdfWlmKGMuZGltc1t0XSE9PTEpZm9yKGxldCBoPTA7aDx1Lmxlbmd0aDsrK2gpdVtoXT11W2hdL2MuZGltc1t0XTtyZXR1cm4gcnx8by5zcGxpY2UodCwxKSxuZXcgVGVuc29yKGMudHlwZSx1LG8pfWZ1bmN0aW9uIGR5bmFtaWNUaW1lV2FycGluZyhjKXtjb25zdFt0LHJdPWMuZGltcyxvPVt0KzEscisxXSx1PW5ldyBUZW5zb3IoImZsb2F0MzIiLG5ldyBGbG9hdDMyQXJyYXkob1swXSpvWzFdKS5maWxsKDEvMCksbyksaD1uZXcgVGVuc29yKCJmbG9hdDMyIixuZXcgRmxvYXQzMkFycmF5KG9bMF0qb1sxXSkuZmlsbCgtMSksbyk7dVswXS5kYXRhWzBdPTA7Zm9yKGxldCBsPTE7bDxyKzE7KytsKWZvcihsZXQgbj0xO248dCsxOysrbil7Y29uc3QgZT11W24tMV1bbC0xXS5pdGVtKCksaT11W24tMV1bbF0uaXRlbSgpLHM9dVtuXVtsLTFdLml0ZW0oKTtsZXQgbSxnO2U8aSYmZTxzPyhtPWUsZz0wKTppPGUmJmk8cz8obT1pLGc9MSk6KG09cyxnPTIpLHVbbl0uZGF0YVtsXT1jW24tMV1bbC0xXS5pdGVtKCkrbSxoW25dLmRhdGFbbF09Z31sZXQgYT10LHA9cjtoLmRhdGEuZmlsbCgyLDAsb1sxXSk7Zm9yKGxldCBsPTA7bDxvWzBdOysrbCloW2xdLmRhdGFbMF09MTtsZXQgZj1bXSxkPVtdO2Zvcig7YT4wfHxwPjA7KXN3aXRjaChmLnB1c2goYS0xKSxkLnB1c2gocC0xKSxoW2FdW3BdLml0ZW0oKSl7Y2FzZSAwOi0tYSwtLXA7YnJlYWs7Y2FzZSAxOi0tYTticmVhaztjYXNlIDI6LS1wO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBlcnJvciBpbiBkeW5hbWljIHRpbWUgd2FycGluZy4gVW5leHBlY3RlZCB0cmFjZVske2F9LCAke3B9XS4gUGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0LmApfXJldHVybiBmLnJldmVyc2UoKSxkLnJldmVyc2UoKSxbZixkXX1mdW5jdGlvbiBkaW1zVG9TdHJpZGUoYyl7Y29uc3QgdD1uZXcgQXJyYXkoYy5sZW5ndGgpO2ZvcihsZXQgcj1jLmxlbmd0aC0xLG89MTtyPj0wOy0tcil0W3JdPW8sbyo9Y1tyXTtyZXR1cm4gdH1mdW5jdGlvbiBvbmVzKGMpe2NvbnN0IHQ9Yy5yZWR1Y2UoKHIsbyk9PnIqbywxKTtyZXR1cm4gbmV3IFRlbnNvcigiaW50NjQiLG5ldyBCaWdJbnQ2NEFycmF5KHQpLmZpbGwoMW4pLGMpfWZ1bmN0aW9uIG9uZXNfbGlrZShjKXtyZXR1cm4gb25lcyhjLmRpbXMpfWZ1bmN0aW9uIHF1YW50aXplX2VtYmVkZGluZ3MoYyx0KXtpZihjLmRpbXMubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3IoIlRoZSB0ZW5zb3IgbXVzdCBoYXZlIDIgZGltZW5zaW9ucyIpO2lmKGMuZGltcy5hdCgtMSklOCE9PTApdGhyb3cgbmV3IEVycm9yKCJUaGUgbGFzdCBkaW1lbnNpb24gb2YgdGhlIHRlbnNvciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCIpO2lmKCFbImJpbmFyeSIsInViaW5hcnkiXS5pbmNsdWRlcyh0KSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBwcmVjaXNpb24gbXVzdCBiZSBlaXRoZXIgJ2JpbmFyeScgb3IgJ3ViaW5hcnknIik7Y29uc3Qgcj10PT09ImJpbmFyeSIsbz1yPyJpbnQ4IjoidWludDgiLHU9cj9JbnQ4QXJyYXk6VWludDhBcnJheSxoPWMuZGF0YSxhPW5ldyB1KGgubGVuZ3RoLzgpO2ZvcihsZXQgcD0wO3A8aC5sZW5ndGg7KytwKXtjb25zdCBmPWhbcF0+MD8xOjAsZD1NYXRoLmZsb29yKHAvOCksbD1wJTg7YVtkXXw9Zjw8Ny1sLHImJmw9PT0wJiYoYVtkXS09MTI4KX1yZXR1cm4gbmV3IFRlbnNvcihvLGEsW2MuZGltc1swXSxjLmRpbXNbMV0vOF0pfWNsYXNzIFByaW9yaXR5UXVldWV7Y29uc3RydWN0b3IodD0ocixvKT0+cj5vKXt0aGlzLl9oZWFwPVtdLHRoaXMuX2NvbXBhcmF0b3I9dH1nZXQgc2l6ZSgpe3JldHVybiB0aGlzLl9oZWFwLmxlbmd0aH1pc0VtcHR5KCl7cmV0dXJuIHRoaXMuc2l6ZT09PTB9cGVlaygpe3JldHVybiB0aGlzLl9oZWFwWzBdfXB1c2goLi4udCl7cmV0dXJuIHRoaXMuZXh0ZW5kKHQpfWV4dGVuZCh0KXtmb3IoY29uc3QgciBvZiB0KXRoaXMuX2hlYXAucHVzaChyKSx0aGlzLl9zaWZ0VXAoKTtyZXR1cm4gdGhpcy5zaXplfXBvcCgpe2NvbnN0IHQ9dGhpcy5wZWVrKCkscj10aGlzLnNpemUtMTtyZXR1cm4gcj4wJiZ0aGlzLl9zd2FwKDAsciksdGhpcy5faGVhcC5wb3AoKSx0aGlzLl9zaWZ0RG93bigpLHR9cmVwbGFjZSh0KXtjb25zdCByPXRoaXMucGVlaygpO3JldHVybiB0aGlzLl9oZWFwWzBdPXQsdGhpcy5fc2lmdERvd24oKSxyfV9wYXJlbnQodCl7cmV0dXJuKHQrMT4+PjEpLTF9X2xlZnQodCl7cmV0dXJuKHQ8PDEpKzF9X3JpZ2h0KHQpe3JldHVybiB0KzE8PDF9X2dyZWF0ZXIodCxyKXtyZXR1cm4gdGhpcy5fY29tcGFyYXRvcih0aGlzLl9oZWFwW3RdLHRoaXMuX2hlYXBbcl0pfV9zd2FwKHQscil7Y29uc3Qgbz10aGlzLl9oZWFwW3RdO3RoaXMuX2hlYXBbdF09dGhpcy5faGVhcFtyXSx0aGlzLl9oZWFwW3JdPW99X3NpZnRVcCgpe2xldCB0PXRoaXMuc2l6ZS0xO2Zvcig7dD4wJiZ0aGlzLl9ncmVhdGVyKHQsdGhpcy5fcGFyZW50KHQpKTspdGhpcy5fc3dhcCh0LHRoaXMuX3BhcmVudCh0KSksdD10aGlzLl9wYXJlbnQodCl9X3NpZnREb3duKCl7bGV0IHQ9MDtmb3IoO3RoaXMuX2xlZnQodCk8dGhpcy5zaXplJiZ0aGlzLl9ncmVhdGVyKHRoaXMuX2xlZnQodCksdCl8fHRoaXMuX3JpZ2h0KHQpPHRoaXMuc2l6ZSYmdGhpcy5fZ3JlYXRlcih0aGlzLl9yaWdodCh0KSx0KTspe2NvbnN0IHI9dGhpcy5fcmlnaHQodCk8dGhpcy5zaXplJiZ0aGlzLl9ncmVhdGVyKHRoaXMuX3JpZ2h0KHQpLHRoaXMuX2xlZnQodCkpP3RoaXMuX3JpZ2h0KHQpOnRoaXMuX2xlZnQodCk7dGhpcy5fc3dhcCh0LHIpLHQ9cn19fWNsYXNzIENoYXJUcmlle2NvbnN0cnVjdG9yKCl7dGhpcy5yb290PUNoYXJUcmllTm9kZS5kZWZhdWx0KCl9ZXh0ZW5kKHQpe2ZvcihsZXQgciBvZiB0KXRoaXMucHVzaChyKX1wdXNoKHQpe2xldCByPXRoaXMucm9vdDtmb3IobGV0IG8gb2YgdCl7bGV0IHU9ci5jaGlsZHJlbi5nZXQobyk7dT09PXZvaWQgMCYmKHU9Q2hhclRyaWVOb2RlLmRlZmF1bHQoKSxyLmNoaWxkcmVuLnNldChvLHUpKSxyPXV9ci5pc0xlYWY9ITB9KmNvbW1vblByZWZpeFNlYXJjaCh0KXtsZXQgcj10aGlzLnJvb3Qsbz0iIjtmb3IobGV0IHU9MDt1PHQubGVuZ3RoJiZyIT09dm9pZCAwOysrdSl7Y29uc3QgaD10W3VdO28rPWgscj1yLmNoaWxkcmVuLmdldChoKSxyIT09dm9pZCAwJiZyLmlzTGVhZiYmKHlpZWxkIG8pfX19Y2xhc3MgQ2hhclRyaWVOb2Rle2NvbnN0cnVjdG9yKHQscil7dGhpcy5pc0xlYWY9dCx0aGlzLmNoaWxkcmVuPXJ9c3RhdGljIGRlZmF1bHQoKXtyZXR1cm4gbmV3IENoYXJUcmllTm9kZSghMSxuZXcgTWFwKX19Y2xhc3MgVG9rZW5MYXR0aWNle2NvbnN0cnVjdG9yKHQscixvKXt0aGlzLnNlbnRlbmNlPXQsdGhpcy5sZW49dC5sZW5ndGgsdGhpcy5ib3NUb2tlbklkPXIsdGhpcy5lb3NUb2tlbklkPW8sdGhpcy5ub2Rlcz1bXSx0aGlzLmJlZ2luTm9kZXM9QXJyYXkuZnJvbSh7bGVuZ3RoOnRoaXMubGVuKzF9LCgpPT5bXSksdGhpcy5lbmROb2Rlcz1BcnJheS5mcm9tKHtsZW5ndGg6dGhpcy5sZW4rMX0sKCk9PltdKTtjb25zdCB1PW5ldyBUb2tlbkxhdHRpY2VOb2RlKHRoaXMuYm9zVG9rZW5JZCwwLDAsMCwwKSxoPW5ldyBUb2tlbkxhdHRpY2VOb2RlKHRoaXMuZW9zVG9rZW5JZCwxLHRoaXMubGVuLDAsMCk7dGhpcy5ub2Rlcy5wdXNoKHUuY2xvbmUoKSksdGhpcy5ub2Rlcy5wdXNoKGguY2xvbmUoKSksdGhpcy5iZWdpbk5vZGVzW3RoaXMubGVuXS5wdXNoKGgpLHRoaXMuZW5kTm9kZXNbMF0ucHVzaCh1KX1pbnNlcnQodCxyLG8sdSl7Y29uc3QgaD10aGlzLm5vZGVzLmxlbmd0aCxhPW5ldyBUb2tlbkxhdHRpY2VOb2RlKHUsaCx0LHIsbyk7dGhpcy5iZWdpbk5vZGVzW3RdLnB1c2goYSksdGhpcy5lbmROb2Rlc1t0K3JdLnB1c2goYSksdGhpcy5ub2Rlcy5wdXNoKGEpfXZpdGVyYmkoKXtjb25zdCB0PXRoaXMubGVuO2xldCByPTA7Zm9yKDtyPD10Oyl7aWYodGhpcy5iZWdpbk5vZGVzW3JdLmxlbmd0aD09MClyZXR1cm5bXTtmb3IobGV0IHAgb2YgdGhpcy5iZWdpbk5vZGVzW3JdKXtwLnByZXY9bnVsbDtsZXQgZj0wLGQ9bnVsbDtmb3IobGV0IGwgb2YgdGhpcy5lbmROb2Rlc1tyXSl7Y29uc3Qgbj1sLmJhY2t0cmFjZVNjb3JlK3Auc2NvcmU7KGQ9PT1udWxsfHxuPmYpJiYoZD1sLmNsb25lKCksZj1uKX1pZihkIT09bnVsbClwLnByZXY9ZCxwLmJhY2t0cmFjZVNjb3JlPWY7ZWxzZSByZXR1cm5bXX0rK3J9Y29uc3Qgbz1bXSxoPXRoaXMuYmVnaW5Ob2Rlc1t0XVswXS5wcmV2O2lmKGg9PT1udWxsKXJldHVybltdO2xldCBhPWguY2xvbmUoKTtmb3IoO2EucHJldiE9PW51bGw7KW8ucHVzaChhLmNsb25lKCkpLGE9YS5jbG9uZSgpLnByZXYuY2xvbmUoKTtyZXR1cm4gby5yZXZlcnNlKCksb31waWVjZSh0KXtyZXR1cm4gdGhpcy5zZW50ZW5jZS5zbGljZSh0LnBvcyx0LnBvcyt0Lmxlbmd0aCl9dG9rZW5zKCl7cmV0dXJuIHRoaXMudml0ZXJiaSgpLm1hcChyPT50aGlzLnBpZWNlKHIpKX10b2tlbklkcygpe3JldHVybiB0aGlzLnZpdGVyYmkoKS5tYXAocj0+ci50b2tlbklkKX19Y2xhc3MgVG9rZW5MYXR0aWNlTm9kZXtjb25zdHJ1Y3Rvcih0LHIsbyx1LGgpe3RoaXMudG9rZW5JZD10LHRoaXMubm9kZUlkPXIsdGhpcy5wb3M9byx0aGlzLmxlbmd0aD11LHRoaXMuc2NvcmU9aCx0aGlzLnByZXY9bnVsbCx0aGlzLmJhY2t0cmFjZVNjb3JlPTB9Y2xvbmUoKXtjb25zdCB0PW5ldyBUb2tlbkxhdHRpY2VOb2RlKHRoaXMudG9rZW5JZCx0aGlzLm5vZGVJZCx0aGlzLnBvcyx0aGlzLmxlbmd0aCx0aGlzLnNjb3JlKTtyZXR1cm4gdC5wcmV2PXRoaXMucHJldix0LmJhY2t0cmFjZVNjb3JlPXRoaXMuYmFja3RyYWNlU2NvcmUsdH19dmFyIFRPS0VOX1RZUEVTPU9iamVjdC5mcmVlemUoe1RleHQ6IlRleHQiLE51bWVyaWNMaXRlcmFsOiJOdW1lcmljTGl0ZXJhbCIsQm9vbGVhbkxpdGVyYWw6IkJvb2xlYW5MaXRlcmFsIixTdHJpbmdMaXRlcmFsOiJTdHJpbmdMaXRlcmFsIixJZGVudGlmaWVyOiJJZGVudGlmaWVyIixFcXVhbHM6IkVxdWFscyIsT3BlblBhcmVuOiJPcGVuUGFyZW4iLENsb3NlUGFyZW46IkNsb3NlUGFyZW4iLE9wZW5TdGF0ZW1lbnQ6Ik9wZW5TdGF0ZW1lbnQiLENsb3NlU3RhdGVtZW50OiJDbG9zZVN0YXRlbWVudCIsT3BlbkV4cHJlc3Npb246Ik9wZW5FeHByZXNzaW9uIixDbG9zZUV4cHJlc3Npb246IkNsb3NlRXhwcmVzc2lvbiIsT3BlblNxdWFyZUJyYWNrZXQ6Ik9wZW5TcXVhcmVCcmFja2V0IixDbG9zZVNxdWFyZUJyYWNrZXQ6IkNsb3NlU3F1YXJlQnJhY2tldCIsT3BlbkN1cmx5QnJhY2tldDoiT3BlbkN1cmx5QnJhY2tldCIsQ2xvc2VDdXJseUJyYWNrZXQ6IkNsb3NlQ3VybHlCcmFja2V0IixDb21tYToiQ29tbWEiLERvdDoiRG90IixDb2xvbjoiQ29sb24iLFBpcGU6IlBpcGUiLENhbGxPcGVyYXRvcjoiQ2FsbE9wZXJhdG9yIixBZGRpdGl2ZUJpbmFyeU9wZXJhdG9yOiJBZGRpdGl2ZUJpbmFyeU9wZXJhdG9yIixNdWx0aXBsaWNhdGl2ZUJpbmFyeU9wZXJhdG9yOiJNdWx0aXBsaWNhdGl2ZUJpbmFyeU9wZXJhdG9yIixDb21wYXJpc29uQmluYXJ5T3BlcmF0b3I6IkNvbXBhcmlzb25CaW5hcnlPcGVyYXRvciIsVW5hcnlPcGVyYXRvcjoiVW5hcnlPcGVyYXRvciIsU2V0OiJTZXQiLElmOiJJZiIsRm9yOiJGb3IiLEluOiJJbiIsSXM6IklzIixOb3RJbjoiTm90SW4iLEVsc2U6IkVsc2UiLEVuZElmOiJFbmRJZiIsRWxzZUlmOiJFbHNlSWYiLEVuZEZvcjoiRW5kRm9yIixBbmQ6IkFuZCIsT3I6Ik9yIixOb3Q6IlVuYXJ5T3BlcmF0b3IifSksS0VZV09SRFM9T2JqZWN0LmZyZWV6ZSh7c2V0OlRPS0VOX1RZUEVTLlNldCxmb3I6VE9LRU5fVFlQRVMuRm9yLGluOlRPS0VOX1RZUEVTLkluLGlzOlRPS0VOX1RZUEVTLklzLGlmOlRPS0VOX1RZUEVTLklmLGVsc2U6VE9LRU5fVFlQRVMuRWxzZSxlbmRpZjpUT0tFTl9UWVBFUy5FbmRJZixlbGlmOlRPS0VOX1RZUEVTLkVsc2VJZixlbmRmb3I6VE9LRU5fVFlQRVMuRW5kRm9yLGFuZDpUT0tFTl9UWVBFUy5BbmQsb3I6VE9LRU5fVFlQRVMuT3Isbm90OlRPS0VOX1RZUEVTLk5vdCwibm90IGluIjpUT0tFTl9UWVBFUy5Ob3RJbix0cnVlOlRPS0VOX1RZUEVTLkJvb2xlYW5MaXRlcmFsLGZhbHNlOlRPS0VOX1RZUEVTLkJvb2xlYW5MaXRlcmFsfSksVG9rZW49Y2xhc3N7Y29uc3RydWN0b3IoYyx0KXt0aGlzLnZhbHVlPWMsdGhpcy50eXBlPXR9fTtmdW5jdGlvbiBpc1dvcmQoYyl7cmV0dXJuL1x3Ly50ZXN0KGMpfWZ1bmN0aW9uIGlzSW50ZWdlcihjKXtyZXR1cm4vWzAtOV0vLnRlc3QoYyl9dmFyIE9SREVSRURfTUFQUElOR19UQUJMRT1bWyJ7JSIsVE9LRU5fVFlQRVMuT3BlblN0YXRlbWVudF0sWyIlfSIsVE9LRU5fVFlQRVMuQ2xvc2VTdGF0ZW1lbnRdLFsie3siLFRPS0VOX1RZUEVTLk9wZW5FeHByZXNzaW9uXSxbIn19IixUT0tFTl9UWVBFUy5DbG9zZUV4cHJlc3Npb25dLFsiKCIsVE9LRU5fVFlQRVMuT3BlblBhcmVuXSxbIikiLFRPS0VOX1RZUEVTLkNsb3NlUGFyZW5dLFsieyIsVE9LRU5fVFlQRVMuT3BlbkN1cmx5QnJhY2tldF0sWyJ9IixUT0tFTl9UWVBFUy5DbG9zZUN1cmx5QnJhY2tldF0sWyJbIixUT0tFTl9UWVBFUy5PcGVuU3F1YXJlQnJhY2tldF0sWyJdIixUT0tFTl9UWVBFUy5DbG9zZVNxdWFyZUJyYWNrZXRdLFsiLCIsVE9LRU5fVFlQRVMuQ29tbWFdLFsiLiIsVE9LRU5fVFlQRVMuRG90XSxbIjoiLFRPS0VOX1RZUEVTLkNvbG9uXSxbInwiLFRPS0VOX1RZUEVTLlBpcGVdLFsiPD0iLFRPS0VOX1RZUEVTLkNvbXBhcmlzb25CaW5hcnlPcGVyYXRvcl0sWyI+PSIsVE9LRU5fVFlQRVMuQ29tcGFyaXNvbkJpbmFyeU9wZXJhdG9yXSxbIj09IixUT0tFTl9UWVBFUy5Db21wYXJpc29uQmluYXJ5T3BlcmF0b3JdLFsiIT0iLFRPS0VOX1RZUEVTLkNvbXBhcmlzb25CaW5hcnlPcGVyYXRvcl0sWyI8IixUT0tFTl9UWVBFUy5Db21wYXJpc29uQmluYXJ5T3BlcmF0b3JdLFsiPiIsVE9LRU5fVFlQRVMuQ29tcGFyaXNvbkJpbmFyeU9wZXJhdG9yXSxbIisiLFRPS0VOX1RZUEVTLkFkZGl0aXZlQmluYXJ5T3BlcmF0b3JdLFsiLSIsVE9LRU5fVFlQRVMuQWRkaXRpdmVCaW5hcnlPcGVyYXRvcl0sWyIqIixUT0tFTl9UWVBFUy5NdWx0aXBsaWNhdGl2ZUJpbmFyeU9wZXJhdG9yXSxbIi8iLFRPS0VOX1RZUEVTLk11bHRpcGxpY2F0aXZlQmluYXJ5T3BlcmF0b3JdLFsiJSIsVE9LRU5fVFlQRVMuTXVsdGlwbGljYXRpdmVCaW5hcnlPcGVyYXRvcl0sWyI9IixUT0tFTl9UWVBFUy5FcXVhbHNdXSxFU0NBUEVfQ0hBUkFDVEVSUz1uZXcgTWFwKFtbIm4iLGAKYF0sWyJ0IiwiCSJdLFsiciIsIlxyIl0sWyJiIiwiXGIiXSxbImYiLCJcZiJdLFsidiIsIlx2Il0sWyInIiwiJyJdLFsnIicsJyInXSxbIlxcIiwiXFwiXV0pO2Z1bmN0aW9uIHByZXByb2Nlc3MoYyx0PXt9KXtyZXR1cm4gYy5lbmRzV2l0aChgCmApJiYoYz1jLnNsaWNlKDAsLTEpKSxjPWMucmVwbGFjZSgveyMuKj8jfS9ncywieyMjfSIpLHQubHN0cmlwX2Jsb2NrcyYmKGM9Yy5yZXBsYWNlKC9eWyBcdF0qKHtbIyVdKS9nbSwiJDEiKSksdC50cmltX2Jsb2NrcyYmKGM9Yy5yZXBsYWNlKC8oWyMlXX0pXG4vZywiJDEiKSksYy5yZXBsYWNlKC97IyN9L2csIiIpLnJlcGxhY2UoLy0lfVxzKi9nLCIlfSIpLnJlcGxhY2UoL1xzKnslLS9nLCJ7JSIpLnJlcGxhY2UoLy19fVxzKi9nLCJ9fSIpLnJlcGxhY2UoL1xzKnt7LS9nLCJ7eyIpfWZ1bmN0aW9uIHRva2VuaXplKGMsdD17fSl7dmFyIGEscCxmO2NvbnN0IHI9W10sbz1wcmVwcm9jZXNzKGMsdCk7bGV0IHU9MDtjb25zdCBoPWQ9PntsZXQgbD0iIjtmb3IoO2Qob1t1XSk7KXtpZihvW3VdPT09IlxcIil7aWYoKyt1LHU+PW8ubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTtjb25zdCBuPW9bdSsrXSxlPUVTQ0FQRV9DSEFSQUNURVJTLmdldChuKTtpZihlPT09dm9pZCAwKXRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBlc2NhcGVkIGNoYXJhY3RlcjogJHtufWApO2wrPWU7Y29udGludWV9aWYobCs9b1t1KytdLHU+PW8ubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKX1yZXR1cm4gbH07ZTpmb3IoO3U8by5sZW5ndGg7KXtjb25zdCBkPShhPXIuYXQoLTEpKT09bnVsbD92b2lkIDA6YS50eXBlO2lmKGQ9PT12b2lkIDB8fGQ9PT1UT0tFTl9UWVBFUy5DbG9zZVN0YXRlbWVudHx8ZD09PVRPS0VOX1RZUEVTLkNsb3NlRXhwcmVzc2lvbil7bGV0IG49IiI7Zm9yKDt1PG8ubGVuZ3RoJiYhKG9bdV09PT0ieyImJihvW3UrMV09PT0iJSJ8fG9bdSsxXT09PSJ7IikpOyluKz1vW3UrK107aWYobi5sZW5ndGg+MCl7ci5wdXNoKG5ldyBUb2tlbihuLFRPS0VOX1RZUEVTLlRleHQpKTtjb250aW51ZX19aChuPT4vXHMvLnRlc3QobikpO2NvbnN0IGw9b1t1XTtpZihsPT09Ii0ifHxsPT09IisiKXtjb25zdCBuPShwPXIuYXQoLTEpKT09bnVsbD92b2lkIDA6cC50eXBlO2lmKG49PT1UT0tFTl9UWVBFUy5UZXh0fHxuPT09dm9pZCAwKXRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXI6ICR7bH1gKTtzd2l0Y2gobil7Y2FzZSBUT0tFTl9UWVBFUy5JZGVudGlmaWVyOmNhc2UgVE9LRU5fVFlQRVMuTnVtZXJpY0xpdGVyYWw6Y2FzZSBUT0tFTl9UWVBFUy5Cb29sZWFuTGl0ZXJhbDpjYXNlIFRPS0VOX1RZUEVTLlN0cmluZ0xpdGVyYWw6Y2FzZSBUT0tFTl9UWVBFUy5DbG9zZVBhcmVuOmNhc2UgVE9LRU5fVFlQRVMuQ2xvc2VTcXVhcmVCcmFja2V0OmJyZWFrO2RlZmF1bHQ6eysrdTtjb25zdCBlPWgoaXNJbnRlZ2VyKTtyLnB1c2gobmV3IFRva2VuKGAke2x9JHtlfWAsZS5sZW5ndGg+MD9UT0tFTl9UWVBFUy5OdW1lcmljTGl0ZXJhbDpUT0tFTl9UWVBFUy5VbmFyeU9wZXJhdG9yKSk7Y29udGludWV9fX1mb3IoY29uc3RbbixlXW9mIE9SREVSRURfTUFQUElOR19UQUJMRSlpZihvLnNsaWNlKHUsdStuLmxlbmd0aCk9PT1uKXtyLnB1c2gobmV3IFRva2VuKG4sZSkpLHUrPW4ubGVuZ3RoO2NvbnRpbnVlIGV9aWYobD09PSInInx8bD09PSciJyl7Kyt1O2NvbnN0IG49aChlPT5lIT09bCk7ci5wdXNoKG5ldyBUb2tlbihuLFRPS0VOX1RZUEVTLlN0cmluZ0xpdGVyYWwpKSwrK3U7Y29udGludWV9aWYoaXNJbnRlZ2VyKGwpKXtjb25zdCBuPWgoaXNJbnRlZ2VyKTtyLnB1c2gobmV3IFRva2VuKG4sVE9LRU5fVFlQRVMuTnVtZXJpY0xpdGVyYWwpKTtjb250aW51ZX1pZihpc1dvcmQobCkpe2NvbnN0IG49aChpc1dvcmQpLGU9T2JqZWN0Lmhhc093bihLRVlXT1JEUyxuKT9LRVlXT1JEU1tuXTpUT0tFTl9UWVBFUy5JZGVudGlmaWVyO2U9PT1UT0tFTl9UWVBFUy5JbiYmKChmPXIuYXQoLTEpKT09bnVsbD92b2lkIDA6Zi50eXBlKT09PVRPS0VOX1RZUEVTLk5vdD8oci5wb3AoKSxyLnB1c2gobmV3IFRva2VuKCJub3QgaW4iLFRPS0VOX1RZUEVTLk5vdEluKSkpOnIucHVzaChuZXcgVG9rZW4obixlKSk7Y29udGludWV9dGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlcjogJHtsfWApfXJldHVybiByfXZhciBTdGF0ZW1lbnQ9Y2xhc3N7Y29uc3RydWN0b3IoKXtLKHRoaXMsInR5cGUiLCJTdGF0ZW1lbnQiKX19LFByb2dyYW09Y2xhc3MgZXh0ZW5kcyBTdGF0ZW1lbnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKTtLKHRoaXMsInR5cGUiLCJQcm9ncmFtIik7dGhpcy5ib2R5PXR9fSxJZj1jbGFzcyBleHRlbmRzIFN0YXRlbWVudHtjb25zdHJ1Y3Rvcih0LHIsbyl7c3VwZXIoKTtLKHRoaXMsInR5cGUiLCJJZiIpO3RoaXMudGVzdD10LHRoaXMuYm9keT1yLHRoaXMuYWx0ZXJuYXRlPW99fSxGb3I9Y2xhc3MgZXh0ZW5kcyBTdGF0ZW1lbnR7Y29uc3RydWN0b3IodCxyLG8pe3N1cGVyKCk7Syh0aGlzLCJ0eXBlIiwiRm9yIik7dGhpcy5sb29wdmFyPXQsdGhpcy5pdGVyYWJsZT1yLHRoaXMuYm9keT1vfX0sU2V0U3RhdGVtZW50PWNsYXNzIGV4dGVuZHMgU3RhdGVtZW50e2NvbnN0cnVjdG9yKHQscil7c3VwZXIoKTtLKHRoaXMsInR5cGUiLCJTZXQiKTt0aGlzLmFzc2lnbmVlPXQsdGhpcy52YWx1ZT1yfX0sRXhwcmVzc2lvbj1jbGFzcyBleHRlbmRzIFN0YXRlbWVudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Syh0aGlzLCJ0eXBlIiwiRXhwcmVzc2lvbiIpfX0sTWVtYmVyRXhwcmVzc2lvbj1jbGFzcyBleHRlbmRzIEV4cHJlc3Npb257Y29uc3RydWN0b3IodCxyLG8pe3N1cGVyKCk7Syh0aGlzLCJ0eXBlIiwiTWVtYmVyRXhwcmVzc2lvbiIpO3RoaXMub2JqZWN0PXQsdGhpcy5wcm9wZXJ0eT1yLHRoaXMuY29tcHV0ZWQ9b319LENhbGxFeHByZXNzaW9uPWNsYXNzIGV4dGVuZHMgRXhwcmVzc2lvbntjb25zdHJ1Y3Rvcih0LHIpe3N1cGVyKCk7Syh0aGlzLCJ0eXBlIiwiQ2FsbEV4cHJlc3Npb24iKTt0aGlzLmNhbGxlZT10LHRoaXMuYXJncz1yfX0sSWRlbnRpZmllcj1jbGFzcyBleHRlbmRzIEV4cHJlc3Npb257Y29uc3RydWN0b3IodCl7c3VwZXIoKTtLKHRoaXMsInR5cGUiLCJJZGVudGlmaWVyIik7dGhpcy52YWx1ZT10fX0sTGl0ZXJhbD1jbGFzcyBleHRlbmRzIEV4cHJlc3Npb257Y29uc3RydWN0b3IodCl7c3VwZXIoKTtLKHRoaXMsInR5cGUiLCJMaXRlcmFsIik7dGhpcy52YWx1ZT10fX0sTnVtZXJpY0xpdGVyYWw9Y2xhc3MgZXh0ZW5kcyBMaXRlcmFse2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtLKHRoaXMsInR5cGUiLCJOdW1lcmljTGl0ZXJhbCIpfX0sU3RyaW5nTGl0ZXJhbD1jbGFzcyBleHRlbmRzIExpdGVyYWx7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO0sodGhpcywidHlwZSIsIlN0cmluZ0xpdGVyYWwiKX19LEJvb2xlYW5MaXRlcmFsPWNsYXNzIGV4dGVuZHMgTGl0ZXJhbHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Syh0aGlzLCJ0eXBlIiwiQm9vbGVhbkxpdGVyYWwiKX19LEFycmF5TGl0ZXJhbD1jbGFzcyBleHRlbmRzIExpdGVyYWx7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO0sodGhpcywidHlwZSIsIkFycmF5TGl0ZXJhbCIpfX0sVHVwbGVMaXRlcmFsPWNsYXNzIGV4dGVuZHMgTGl0ZXJhbHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Syh0aGlzLCJ0eXBlIiwiVHVwbGVMaXRlcmFsIil9fSxPYmplY3RMaXRlcmFsPWNsYXNzIGV4dGVuZHMgTGl0ZXJhbHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Syh0aGlzLCJ0eXBlIiwiT2JqZWN0TGl0ZXJhbCIpfX0sQmluYXJ5RXhwcmVzc2lvbj1jbGFzcyBleHRlbmRzIEV4cHJlc3Npb257Y29uc3RydWN0b3IodCxyLG8pe3N1cGVyKCk7Syh0aGlzLCJ0eXBlIiwiQmluYXJ5RXhwcmVzc2lvbiIpO3RoaXMub3BlcmF0b3I9dCx0aGlzLmxlZnQ9cix0aGlzLnJpZ2h0PW99fSxGaWx0ZXJFeHByZXNzaW9uPWNsYXNzIGV4dGVuZHMgRXhwcmVzc2lvbntjb25zdHJ1Y3Rvcih0LHIpe3N1cGVyKCk7Syh0aGlzLCJ0eXBlIiwiRmlsdGVyRXhwcmVzc2lvbiIpO3RoaXMub3BlcmFuZD10LHRoaXMuZmlsdGVyPXJ9fSxUZXN0RXhwcmVzc2lvbj1jbGFzcyBleHRlbmRzIEV4cHJlc3Npb257Y29uc3RydWN0b3IodCxyLG8pe3N1cGVyKCk7Syh0aGlzLCJ0eXBlIiwiVGVzdEV4cHJlc3Npb24iKTt0aGlzLm9wZXJhbmQ9dCx0aGlzLm5lZ2F0ZT1yLHRoaXMudGVzdD1vfX0sVW5hcnlFeHByZXNzaW9uPWNsYXNzIGV4dGVuZHMgRXhwcmVzc2lvbntjb25zdHJ1Y3Rvcih0LHIpe3N1cGVyKCk7Syh0aGlzLCJ0eXBlIiwiVW5hcnlFeHByZXNzaW9uIik7dGhpcy5vcGVyYXRvcj10LHRoaXMuYXJndW1lbnQ9cn19LFNsaWNlRXhwcmVzc2lvbj1jbGFzcyBleHRlbmRzIEV4cHJlc3Npb257Y29uc3RydWN0b3IodD12b2lkIDAscj12b2lkIDAsbz12b2lkIDApe3N1cGVyKCk7Syh0aGlzLCJ0eXBlIiwiU2xpY2VFeHByZXNzaW9uIik7dGhpcy5zdGFydD10LHRoaXMuc3RvcD1yLHRoaXMuc3RlcD1vfX0sS2V5d29yZEFyZ3VtZW50RXhwcmVzc2lvbj1jbGFzcyBleHRlbmRzIEV4cHJlc3Npb257Y29uc3RydWN0b3IodCxyKXtzdXBlcigpO0sodGhpcywidHlwZSIsIktleXdvcmRBcmd1bWVudEV4cHJlc3Npb24iKTt0aGlzLmtleT10LHRoaXMudmFsdWU9cn19O2Z1bmN0aW9uIHBhcnNlKGMpe2NvbnN0IHQ9bmV3IFByb2dyYW0oW10pO2xldCByPTA7ZnVuY3Rpb24gbyhELEkpe2NvbnN0IEY9Y1tyKytdO2lmKCFGfHxGLnR5cGUhPT1EKXRocm93IG5ldyBFcnJvcihgUGFyc2VyIEVycm9yOiAke0l9LiAke0YudHlwZX0gIT09ICR7RH0uYCk7cmV0dXJuIEZ9ZnVuY3Rpb24gdSgpe3N3aXRjaChjW3JdLnR5cGUpe2Nhc2UgVE9LRU5fVFlQRVMuVGV4dDpyZXR1cm4gcCgpO2Nhc2UgVE9LRU5fVFlQRVMuT3BlblN0YXRlbWVudDpyZXR1cm4gZigpO2Nhc2UgVE9LRU5fVFlQRVMuT3BlbkV4cHJlc3Npb246cmV0dXJuIGQoKTtkZWZhdWx0OnRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCB0b2tlbiB0eXBlOiAke2Nbcl0udHlwZX1gKX19ZnVuY3Rpb24gaCguLi5EKXtyZXR1cm4gcitELmxlbmd0aDw9Yy5sZW5ndGgmJkQuc29tZSgoSSxGKT0+SSE9PWNbcitGXS50eXBlKX1mdW5jdGlvbiBhKC4uLkQpe3JldHVybiByK0QubGVuZ3RoPD1jLmxlbmd0aCYmRC5ldmVyeSgoSSxGKT0+ST09PWNbcitGXS50eXBlKX1mdW5jdGlvbiBwKCl7cmV0dXJuIG5ldyBTdHJpbmdMaXRlcmFsKG8oVE9LRU5fVFlQRVMuVGV4dCwiRXhwZWN0ZWQgdGV4dCB0b2tlbiIpLnZhbHVlKX1mdW5jdGlvbiBmKCl7byhUT0tFTl9UWVBFUy5PcGVuU3RhdGVtZW50LCJFeHBlY3RlZCBvcGVuaW5nIHN0YXRlbWVudCB0b2tlbiIpO2xldCBEO3N3aXRjaChjW3JdLnR5cGUpe2Nhc2UgVE9LRU5fVFlQRVMuU2V0OisrcixEPWwoKSxvKFRPS0VOX1RZUEVTLkNsb3NlU3RhdGVtZW50LCJFeHBlY3RlZCBjbG9zaW5nIHN0YXRlbWVudCB0b2tlbiIpO2JyZWFrO2Nhc2UgVE9LRU5fVFlQRVMuSWY6KytyLEQ9bigpLG8oVE9LRU5fVFlQRVMuT3BlblN0YXRlbWVudCwiRXhwZWN0ZWQgeyUgdG9rZW4iKSxvKFRPS0VOX1RZUEVTLkVuZElmLCJFeHBlY3RlZCBlbmRpZiB0b2tlbiIpLG8oVE9LRU5fVFlQRVMuQ2xvc2VTdGF0ZW1lbnQsIkV4cGVjdGVkICV9IHRva2VuIik7YnJlYWs7Y2FzZSBUT0tFTl9UWVBFUy5Gb3I6KytyLEQ9aSgpLG8oVE9LRU5fVFlQRVMuT3BlblN0YXRlbWVudCwiRXhwZWN0ZWQgeyUgdG9rZW4iKSxvKFRPS0VOX1RZUEVTLkVuZEZvciwiRXhwZWN0ZWQgZW5kZm9yIHRva2VuIiksbyhUT0tFTl9UWVBFUy5DbG9zZVN0YXRlbWVudCwiRXhwZWN0ZWQgJX0gdG9rZW4iKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBTeW50YXhFcnJvcihgVW5rbm93biBzdGF0ZW1lbnQgdHlwZTogJHtjW3JdLnR5cGV9YCl9cmV0dXJuIER9ZnVuY3Rpb24gZCgpe28oVE9LRU5fVFlQRVMuT3BlbkV4cHJlc3Npb24sIkV4cGVjdGVkIG9wZW5pbmcgZXhwcmVzc2lvbiB0b2tlbiIpO2NvbnN0IEQ9cygpO3JldHVybiBvKFRPS0VOX1RZUEVTLkNsb3NlRXhwcmVzc2lvbiwiRXhwZWN0ZWQgY2xvc2luZyBleHByZXNzaW9uIHRva2VuIiksRH1mdW5jdGlvbiBsKCl7Y29uc3QgRD1zKCk7aWYoYShUT0tFTl9UWVBFUy5FcXVhbHMpKXsrK3I7Y29uc3QgST1sKCk7cmV0dXJuIG5ldyBTZXRTdGF0ZW1lbnQoRCxJKX1yZXR1cm4gRH1mdW5jdGlvbiBuKCl7dmFyIFgsRyxlZSxKLGxlLHhlLHdlLGllO2NvbnN0IEQ9cygpO28oVE9LRU5fVFlQRVMuQ2xvc2VTdGF0ZW1lbnQsIkV4cGVjdGVkIGNsb3Npbmcgc3RhdGVtZW50IHRva2VuIik7Y29uc3QgST1bXSxGPVtdO2Zvcig7ISgoKFg9Y1tyXSk9PW51bGw/dm9pZCAwOlgudHlwZSk9PT1UT0tFTl9UWVBFUy5PcGVuU3RhdGVtZW50JiYoKChHPWNbcisxXSk9PW51bGw/dm9pZCAwOkcudHlwZSk9PT1UT0tFTl9UWVBFUy5FbHNlSWZ8fCgoZWU9Y1tyKzFdKT09bnVsbD92b2lkIDA6ZWUudHlwZSk9PT1UT0tFTl9UWVBFUy5FbHNlfHwoKEo9Y1tyKzFdKT09bnVsbD92b2lkIDA6Si50eXBlKT09PVRPS0VOX1RZUEVTLkVuZElmKSk7KUkucHVzaCh1KCkpO2lmKCgobGU9Y1tyXSk9PW51bGw/dm9pZCAwOmxlLnR5cGUpPT09VE9LRU5fVFlQRVMuT3BlblN0YXRlbWVudCYmKCh4ZT1jW3IrMV0pPT1udWxsP3ZvaWQgMDp4ZS50eXBlKSE9PVRPS0VOX1RZUEVTLkVuZElmKWlmKCsrcixhKFRPS0VOX1RZUEVTLkVsc2VJZikpbyhUT0tFTl9UWVBFUy5FbHNlSWYsIkV4cGVjdGVkIGVsc2VpZiB0b2tlbiIpLEYucHVzaChuKCkpO2Vsc2UgZm9yKG8oVE9LRU5fVFlQRVMuRWxzZSwiRXhwZWN0ZWQgZWxzZSB0b2tlbiIpLG8oVE9LRU5fVFlQRVMuQ2xvc2VTdGF0ZW1lbnQsIkV4cGVjdGVkIGNsb3Npbmcgc3RhdGVtZW50IHRva2VuIik7ISgoKHdlPWNbcl0pPT1udWxsP3ZvaWQgMDp3ZS50eXBlKT09PVRPS0VOX1RZUEVTLk9wZW5TdGF0ZW1lbnQmJigoaWU9Y1tyKzFdKT09bnVsbD92b2lkIDA6aWUudHlwZSk9PT1UT0tFTl9UWVBFUy5FbmRJZik7KUYucHVzaCh1KCkpO3JldHVybiBuZXcgSWYoRCxJLEYpfWZ1bmN0aW9uIGUoRD0hMSl7Y29uc3QgST1EP046cyxGPVtJKCldLFg9YShUT0tFTl9UWVBFUy5Db21tYSk7Zm9yKDtYJiYoKytyLEYucHVzaChJKCkpLCEhYShUT0tFTl9UWVBFUy5Db21tYSkpOyk7cmV0dXJuIFg/bmV3IFR1cGxlTGl0ZXJhbChGKTpGWzBdfWZ1bmN0aW9uIGkoKXtjb25zdCBEPWUoITApO2lmKCEoRCBpbnN0YW5jZW9mIElkZW50aWZpZXJ8fEQgaW5zdGFuY2VvZiBUdXBsZUxpdGVyYWwpKXRocm93IG5ldyBTeW50YXhFcnJvcihgRXhwZWN0ZWQgaWRlbnRpZmllci90dXBsZSBmb3IgdGhlIGxvb3AgdmFyaWFibGUsIGdvdCAke0QudHlwZX0gaW5zdGVhZGApO28oVE9LRU5fVFlQRVMuSW4sIkV4cGVjdGVkIGBpbmAga2V5d29yZCBmb2xsb3dpbmcgbG9vcCB2YXJpYWJsZSIpO2NvbnN0IEk9cygpO28oVE9LRU5fVFlQRVMuQ2xvc2VTdGF0ZW1lbnQsIkV4cGVjdGVkIGNsb3Npbmcgc3RhdGVtZW50IHRva2VuIik7Y29uc3QgRj1bXTtmb3IoO2goVE9LRU5fVFlQRVMuT3BlblN0YXRlbWVudCxUT0tFTl9UWVBFUy5FbmRGb3IpOylGLnB1c2godSgpKTtyZXR1cm4gbmV3IEZvcihELEksRil9ZnVuY3Rpb24gcygpe3JldHVybiBtKCl9ZnVuY3Rpb24gbSgpe2NvbnN0IEQ9ZygpO2lmKGEoVE9LRU5fVFlQRVMuSWYpKXsrK3I7Y29uc3QgST1nKCk7byhUT0tFTl9UWVBFUy5FbHNlLCJFeHBlY3RlZCBlbHNlIHRva2VuIik7Y29uc3QgRj1nKCk7cmV0dXJuIG5ldyBJZihJLFtEXSxbRl0pfXJldHVybiBEfWZ1bmN0aW9uIGcoKXtsZXQgRD1fKCk7Zm9yKDthKFRPS0VOX1RZUEVTLk9yKTspe2NvbnN0IEk9Y1tyXTsrK3I7Y29uc3QgRj1fKCk7RD1uZXcgQmluYXJ5RXhwcmVzc2lvbihJLEQsRil9cmV0dXJuIER9ZnVuY3Rpb24gXygpe2xldCBEPWIoKTtmb3IoO2EoVE9LRU5fVFlQRVMuQW5kKTspe2NvbnN0IEk9Y1tyXTsrK3I7Y29uc3QgRj1iKCk7RD1uZXcgQmluYXJ5RXhwcmVzc2lvbihJLEQsRil9cmV0dXJuIER9ZnVuY3Rpb24gYigpe2xldCBEO2Zvcig7YShUT0tFTl9UWVBFUy5Ob3QpOyl7Y29uc3QgST1jW3JdOysrcjtjb25zdCBGPWIoKTtEPW5ldyBVbmFyeUV4cHJlc3Npb24oSSxGKX1yZXR1cm4gRD8/eSgpfWZ1bmN0aW9uIHkoKXtsZXQgRD1UKCk7Zm9yKDthKFRPS0VOX1RZUEVTLkNvbXBhcmlzb25CaW5hcnlPcGVyYXRvcil8fGEoVE9LRU5fVFlQRVMuSW4pfHxhKFRPS0VOX1RZUEVTLk5vdEluKTspe2NvbnN0IEk9Y1tyXTsrK3I7Y29uc3QgRj1UKCk7RD1uZXcgQmluYXJ5RXhwcmVzc2lvbihJLEQsRil9cmV0dXJuIER9ZnVuY3Rpb24gVCgpe2xldCBEPSQoKTtmb3IoO2EoVE9LRU5fVFlQRVMuQWRkaXRpdmVCaW5hcnlPcGVyYXRvcik7KXtjb25zdCBJPWNbcl07KytyO2NvbnN0IEY9JCgpO0Q9bmV3IEJpbmFyeUV4cHJlc3Npb24oSSxELEYpfXJldHVybiBEfWZ1bmN0aW9uIHcoKXtjb25zdCBEPU0oKTtyZXR1cm4gYShUT0tFTl9UWVBFUy5PcGVuUGFyZW4pP3goRCk6RH1mdW5jdGlvbiB4KEQpe2xldCBJPW5ldyBDYWxsRXhwcmVzc2lvbihELEUoKSk7cmV0dXJuIGEoVE9LRU5fVFlQRVMuT3BlblBhcmVuKSYmKEk9eChJKSksSX1mdW5jdGlvbiBFKCl7byhUT0tFTl9UWVBFUy5PcGVuUGFyZW4sIkV4cGVjdGVkIG9wZW5pbmcgcGFyZW50aGVzaXMgZm9yIGFyZ3VtZW50cyBsaXN0Iik7Y29uc3QgRD1QKCk7cmV0dXJuIG8oVE9LRU5fVFlQRVMuQ2xvc2VQYXJlbiwiRXhwZWN0ZWQgY2xvc2luZyBwYXJlbnRoZXNpcyBmb3IgYXJndW1lbnRzIGxpc3QiKSxEfWZ1bmN0aW9uIFAoKXtjb25zdCBEPVtdO2Zvcig7IWEoVE9LRU5fVFlQRVMuQ2xvc2VQYXJlbik7KXtsZXQgST1zKCk7aWYoYShUT0tFTl9UWVBFUy5FcXVhbHMpKXtpZigrK3IsIShJIGluc3RhbmNlb2YgSWRlbnRpZmllcikpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJFeHBlY3RlZCBpZGVudGlmaWVyIGZvciBrZXl3b3JkIGFyZ3VtZW50Iik7Y29uc3QgRj1zKCk7ST1uZXcgS2V5d29yZEFyZ3VtZW50RXhwcmVzc2lvbihJLEYpfUQucHVzaChJKSxhKFRPS0VOX1RZUEVTLkNvbW1hKSYmKytyfXJldHVybiBEfWZ1bmN0aW9uIHYoKXtjb25zdCBEPVtdO2xldCBJPSExO2Zvcig7IWEoVE9LRU5fVFlQRVMuQ2xvc2VTcXVhcmVCcmFja2V0KTspYShUT0tFTl9UWVBFUy5Db2xvbik/KEQucHVzaCh2b2lkIDApLCsrcixJPSEwKTooRC5wdXNoKHMoKSksYShUT0tFTl9UWVBFUy5Db2xvbikmJigrK3IsST0hMCkpO2lmKEQubGVuZ3RoPT09MCl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudCBmb3IgbWVtYmVyL3NsaWNlIGV4cHJlc3Npb24iKTtpZihJKXtpZihELmxlbmd0aD4zKXRocm93IG5ldyBTeW50YXhFcnJvcigiRXhwZWN0ZWQgMC0zIGFyZ3VtZW50cyBmb3Igc2xpY2UgZXhwcmVzc2lvbiIpO3JldHVybiBuZXcgU2xpY2VFeHByZXNzaW9uKC4uLkQpfXJldHVybiBEWzBdfWZ1bmN0aW9uIE0oKXtsZXQgRD1OKCk7Zm9yKDthKFRPS0VOX1RZUEVTLkRvdCl8fGEoVE9LRU5fVFlQRVMuT3BlblNxdWFyZUJyYWNrZXQpOyl7Y29uc3QgST1jW3JdOysrcjtsZXQgRjtjb25zdCBYPUkudHlwZSE9PVRPS0VOX1RZUEVTLkRvdDtpZihYKUY9digpLG8oVE9LRU5fVFlQRVMuQ2xvc2VTcXVhcmVCcmFja2V0LCJFeHBlY3RlZCBjbG9zaW5nIHNxdWFyZSBicmFja2V0Iik7ZWxzZSBpZihGPU4oKSxGLnR5cGUhPT0iSWRlbnRpZmllciIpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJFeHBlY3RlZCBpZGVudGlmaWVyIGZvbGxvd2luZyBkb3Qgb3BlcmF0b3IiKTtEPW5ldyBNZW1iZXJFeHByZXNzaW9uKEQsRixYKX1yZXR1cm4gRH1mdW5jdGlvbiAkKCl7bGV0IEQ9eigpO2Zvcig7YShUT0tFTl9UWVBFUy5NdWx0aXBsaWNhdGl2ZUJpbmFyeU9wZXJhdG9yKTspe2NvbnN0IEk9Y1tyXTsrK3I7Y29uc3QgRj16KCk7RD1uZXcgQmluYXJ5RXhwcmVzc2lvbihJLEQsRil9cmV0dXJuIER9ZnVuY3Rpb24geigpe2xldCBEPUIoKTtmb3IoO2EoVE9LRU5fVFlQRVMuSXMpOyl7KytyO2NvbnN0IEk9YShUT0tFTl9UWVBFUy5Ob3QpO0kmJisrcjtsZXQgRj1OKCk7aWYoRiBpbnN0YW5jZW9mIEJvb2xlYW5MaXRlcmFsJiYoRj1uZXcgSWRlbnRpZmllcihGLnZhbHVlLnRvU3RyaW5nKCkpKSwhKEYgaW5zdGFuY2VvZiBJZGVudGlmaWVyKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkV4cGVjdGVkIGlkZW50aWZpZXIgZm9yIHRoZSB0ZXN0Iik7RD1uZXcgVGVzdEV4cHJlc3Npb24oRCxJLEYpfXJldHVybiBEfWZ1bmN0aW9uIEIoKXtsZXQgRD13KCk7Zm9yKDthKFRPS0VOX1RZUEVTLlBpcGUpOyl7KytyO2xldCBJPU4oKTtpZighKEkgaW5zdGFuY2VvZiBJZGVudGlmaWVyKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkV4cGVjdGVkIGlkZW50aWZpZXIgZm9yIHRoZSBmaWx0ZXIiKTthKFRPS0VOX1RZUEVTLk9wZW5QYXJlbikmJihJPXgoSSkpLEQ9bmV3IEZpbHRlckV4cHJlc3Npb24oRCxJKX1yZXR1cm4gRH1mdW5jdGlvbiBOKCl7Y29uc3QgRD1jW3JdO3N3aXRjaChELnR5cGUpe2Nhc2UgVE9LRU5fVFlQRVMuTnVtZXJpY0xpdGVyYWw6cmV0dXJuKytyLG5ldyBOdW1lcmljTGl0ZXJhbChOdW1iZXIoRC52YWx1ZSkpO2Nhc2UgVE9LRU5fVFlQRVMuU3RyaW5nTGl0ZXJhbDpyZXR1cm4rK3IsbmV3IFN0cmluZ0xpdGVyYWwoRC52YWx1ZSk7Y2FzZSBUT0tFTl9UWVBFUy5Cb29sZWFuTGl0ZXJhbDpyZXR1cm4rK3IsbmV3IEJvb2xlYW5MaXRlcmFsKEQudmFsdWU9PT0idHJ1ZSIpO2Nhc2UgVE9LRU5fVFlQRVMuSWRlbnRpZmllcjpyZXR1cm4rK3IsbmV3IElkZW50aWZpZXIoRC52YWx1ZSk7Y2FzZSBUT0tFTl9UWVBFUy5PcGVuUGFyZW46eysrcjtjb25zdCBJPWUoKTtpZihjW3JdLnR5cGUhPT1UT0tFTl9UWVBFUy5DbG9zZVBhcmVuKXRocm93IG5ldyBTeW50YXhFcnJvcihgRXhwZWN0ZWQgY2xvc2luZyBwYXJlbnRoZXNpcywgZ290ICR7Y1tyXS50eXBlfSBpbnN0ZWFkYCk7cmV0dXJuKytyLEl9Y2FzZSBUT0tFTl9UWVBFUy5PcGVuU3F1YXJlQnJhY2tldDp7KytyO2NvbnN0IEk9W107Zm9yKDshYShUT0tFTl9UWVBFUy5DbG9zZVNxdWFyZUJyYWNrZXQpOylJLnB1c2gocygpKSxhKFRPS0VOX1RZUEVTLkNvbW1hKSYmKytyO3JldHVybisrcixuZXcgQXJyYXlMaXRlcmFsKEkpfWNhc2UgVE9LRU5fVFlQRVMuT3BlbkN1cmx5QnJhY2tldDp7KytyO2NvbnN0IEk9bmV3IE1hcDtmb3IoOyFhKFRPS0VOX1RZUEVTLkNsb3NlQ3VybHlCcmFja2V0KTspe2NvbnN0IEY9cygpO28oVE9LRU5fVFlQRVMuQ29sb24sIkV4cGVjdGVkIGNvbG9uIGJldHdlZW4ga2V5IGFuZCB2YWx1ZSBpbiBvYmplY3QgbGl0ZXJhbCIpO2NvbnN0IFg9cygpO0kuc2V0KEYsWCksYShUT0tFTl9UWVBFUy5Db21tYSkmJisrcn1yZXR1cm4rK3IsbmV3IE9iamVjdExpdGVyYWwoSSl9ZGVmYXVsdDp0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgdG9rZW46ICR7RC50eXBlfWApfX1mb3IoO3I8Yy5sZW5ndGg7KXQuYm9keS5wdXNoKHUoKSk7cmV0dXJuIHR9ZnVuY3Rpb24gcmFuZ2UoYyx0LHI9MSl7dD09PXZvaWQgMCYmKHQ9YyxjPTApO2NvbnN0IG89W107Zm9yKGxldCB1PWM7dTx0O3UrPXIpby5wdXNoKHUpO3JldHVybiBvfWZ1bmN0aW9uIHNsaWNlKGMsdCxyLG89MSl7Y29uc3QgdT1NYXRoLnNpZ24obyk7dT49MD8odD0odD8/KHQ9MCkpPDA/TWF0aC5tYXgoYy5sZW5ndGgrdCwwKTpNYXRoLm1pbih0LGMubGVuZ3RoKSxyPShyPz8ocj1jLmxlbmd0aCkpPDA/TWF0aC5tYXgoYy5sZW5ndGgrciwwKTpNYXRoLm1pbihyLGMubGVuZ3RoKSk6KHQ9KHQ/Pyh0PWMubGVuZ3RoLTEpKTwwP01hdGgubWF4KGMubGVuZ3RoK3QsLTEpOk1hdGgubWluKHQsYy5sZW5ndGgtMSkscj0ocj8/KHI9LTEpKTwtMT9NYXRoLm1heChjLmxlbmd0aCtyLC0xKTpNYXRoLm1pbihyLGMubGVuZ3RoLTEpKTtjb25zdCBoPVtdO2ZvcihsZXQgYT10O3UqYTx1KnI7YSs9byloLnB1c2goY1thXSk7cmV0dXJuIGh9ZnVuY3Rpb24gdGl0bGVDYXNlKGMpe3JldHVybiBjLnJlcGxhY2UoL1xiXHcvZyx0PT50LnRvVXBwZXJDYXNlKCkpfXZhciBSdW50aW1lVmFsdWU9Y2xhc3N7Y29uc3RydWN0b3IoYz12b2lkIDApe0sodGhpcywidHlwZSIsIlJ1bnRpbWVWYWx1ZSIpO0sodGhpcywidmFsdWUiKTtLKHRoaXMsImJ1aWx0aW5zIixuZXcgTWFwKTt0aGlzLnZhbHVlPWN9X19ib29sX18oKXtyZXR1cm4gbmV3IEJvb2xlYW5WYWx1ZSghIXRoaXMudmFsdWUpfX0sTnVtZXJpY1ZhbHVlPWNsYXNzIGV4dGVuZHMgUnVudGltZVZhbHVle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtLKHRoaXMsInR5cGUiLCJOdW1lcmljVmFsdWUiKX19LFN0cmluZ1ZhbHVlPWNsYXNzIGV4dGVuZHMgUnVudGltZVZhbHVle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtLKHRoaXMsInR5cGUiLCJTdHJpbmdWYWx1ZSIpO0sodGhpcywiYnVpbHRpbnMiLG5ldyBNYXAoW1sidXBwZXIiLG5ldyBGdW5jdGlvblZhbHVlKCgpPT5uZXcgU3RyaW5nVmFsdWUodGhpcy52YWx1ZS50b1VwcGVyQ2FzZSgpKSldLFsibG93ZXIiLG5ldyBGdW5jdGlvblZhbHVlKCgpPT5uZXcgU3RyaW5nVmFsdWUodGhpcy52YWx1ZS50b0xvd2VyQ2FzZSgpKSldLFsic3RyaXAiLG5ldyBGdW5jdGlvblZhbHVlKCgpPT5uZXcgU3RyaW5nVmFsdWUodGhpcy52YWx1ZS50cmltKCkpKV0sWyJ0aXRsZSIsbmV3IEZ1bmN0aW9uVmFsdWUoKCk9Pm5ldyBTdHJpbmdWYWx1ZSh0aXRsZUNhc2UodGhpcy52YWx1ZSkpKV0sWyJsZW5ndGgiLG5ldyBOdW1lcmljVmFsdWUodGhpcy52YWx1ZS5sZW5ndGgpXV0pKX19LEJvb2xlYW5WYWx1ZT1jbGFzcyBleHRlbmRzIFJ1bnRpbWVWYWx1ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Syh0aGlzLCJ0eXBlIiwiQm9vbGVhblZhbHVlIil9fSxPYmplY3RWYWx1ZT1jbGFzcyBleHRlbmRzIFJ1bnRpbWVWYWx1ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Syh0aGlzLCJ0eXBlIiwiT2JqZWN0VmFsdWUiKTtLKHRoaXMsImJ1aWx0aW5zIixuZXcgTWFwKFtbImdldCIsbmV3IEZ1bmN0aW9uVmFsdWUoKFt0LHJdKT0+e2lmKCEodCBpbnN0YW5jZW9mIFN0cmluZ1ZhbHVlKSl0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBrZXkgbXVzdCBiZSBhIHN0cmluZzogZ290ICR7dC50eXBlfWApO3JldHVybiB0aGlzLnZhbHVlLmdldCh0LnZhbHVlKT8/cj8/bmV3IE51bGxWYWx1ZX0pXSxbIml0ZW1zIixuZXcgRnVuY3Rpb25WYWx1ZSgoKT0+bmV3IEFycmF5VmFsdWUoQXJyYXkuZnJvbSh0aGlzLnZhbHVlLmVudHJpZXMoKSkubWFwKChbdCxyXSk9Pm5ldyBBcnJheVZhbHVlKFtuZXcgU3RyaW5nVmFsdWUodCkscl0pKSkpXV0pKX1fX2Jvb2xfXygpe3JldHVybiBuZXcgQm9vbGVhblZhbHVlKHRoaXMudmFsdWUuc2l6ZT4wKX19LEFycmF5VmFsdWU9Y2xhc3MgZXh0ZW5kcyBSdW50aW1lVmFsdWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO0sodGhpcywidHlwZSIsIkFycmF5VmFsdWUiKTtLKHRoaXMsImJ1aWx0aW5zIixuZXcgTWFwKFtbImxlbmd0aCIsbmV3IE51bWVyaWNWYWx1ZSh0aGlzLnZhbHVlLmxlbmd0aCldXSkpfV9fYm9vbF9fKCl7cmV0dXJuIG5ldyBCb29sZWFuVmFsdWUodGhpcy52YWx1ZS5sZW5ndGg+MCl9fSxUdXBsZVZhbHVlPWNsYXNzIGV4dGVuZHMgQXJyYXlWYWx1ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Syh0aGlzLCJ0eXBlIiwiVHVwbGVWYWx1ZSIpfX0sRnVuY3Rpb25WYWx1ZT1jbGFzcyBleHRlbmRzIFJ1bnRpbWVWYWx1ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Syh0aGlzLCJ0eXBlIiwiRnVuY3Rpb25WYWx1ZSIpfX0sTnVsbFZhbHVlPWNsYXNzIGV4dGVuZHMgUnVudGltZVZhbHVle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtLKHRoaXMsInR5cGUiLCJOdWxsVmFsdWUiKX19LFVuZGVmaW5lZFZhbHVlPWNsYXNzIGV4dGVuZHMgUnVudGltZVZhbHVle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtLKHRoaXMsInR5cGUiLCJVbmRlZmluZWRWYWx1ZSIpfX0sRW52aXJvbm1lbnQ9Y2xhc3N7Y29uc3RydWN0b3IoYyl7Syh0aGlzLCJ2YXJpYWJsZXMiLG5ldyBNYXAoW1sibmFtZXNwYWNlIixuZXcgRnVuY3Rpb25WYWx1ZShjPT57aWYoYy5sZW5ndGg9PT0wKXJldHVybiBuZXcgT2JqZWN0VmFsdWUobmV3IE1hcCk7aWYoYy5sZW5ndGghPT0xfHwhKGNbMF1pbnN0YW5jZW9mIE9iamVjdFZhbHVlKSl0aHJvdyBuZXcgRXJyb3IoImBuYW1lc3BhY2VgIGV4cGVjdHMgZWl0aGVyIHplcm8gYXJndW1lbnRzIG9yIGEgc2luZ2xlIG9iamVjdCBhcmd1bWVudCIpO3JldHVybiBjWzBdfSldXSkpO0sodGhpcywidGVzdHMiLG5ldyBNYXAoW1siYm9vbGVhbiIsYz0+Yy50eXBlPT09IkJvb2xlYW5WYWx1ZSJdLFsiY2FsbGFibGUiLGM9PmMgaW5zdGFuY2VvZiBGdW5jdGlvblZhbHVlXSxbIm9kZCIsYz0+e2lmKGMudHlwZSE9PSJOdW1lcmljVmFsdWUiKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IGFwcGx5IHRlc3QgIm9kZCIgdG8gdHlwZTogJHtjLnR5cGV9YCk7cmV0dXJuIGMudmFsdWUlMiE9PTB9XSxbImV2ZW4iLGM9PntpZihjLnR5cGUhPT0iTnVtZXJpY1ZhbHVlIil0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhcHBseSB0ZXN0ICJldmVuIiB0byB0eXBlOiAke2MudHlwZX1gKTtyZXR1cm4gYy52YWx1ZSUyPT09MH1dLFsiZmFsc2UiLGM9PmMudHlwZT09PSJCb29sZWFuVmFsdWUiJiYhYy52YWx1ZV0sWyJ0cnVlIixjPT5jLnR5cGU9PT0iQm9vbGVhblZhbHVlIiYmYy52YWx1ZV0sWyJudW1iZXIiLGM9PmMudHlwZT09PSJOdW1lcmljVmFsdWUiXSxbImludGVnZXIiLGM9PmMudHlwZT09PSJOdW1lcmljVmFsdWUiJiZOdW1iZXIuaXNJbnRlZ2VyKGMudmFsdWUpXSxbIml0ZXJhYmxlIixjPT5jIGluc3RhbmNlb2YgQXJyYXlWYWx1ZXx8YyBpbnN0YW5jZW9mIFN0cmluZ1ZhbHVlXSxbImxvd2VyIixjPT57Y29uc3QgdD1jLnZhbHVlO3JldHVybiBjLnR5cGU9PT0iU3RyaW5nVmFsdWUiJiZ0PT09dC50b0xvd2VyQ2FzZSgpfV0sWyJ1cHBlciIsYz0+e2NvbnN0IHQ9Yy52YWx1ZTtyZXR1cm4gYy50eXBlPT09IlN0cmluZ1ZhbHVlIiYmdD09PXQudG9VcHBlckNhc2UoKX1dLFsibm9uZSIsYz0+Yy50eXBlPT09Ik51bGxWYWx1ZSJdLFsiZGVmaW5lZCIsYz0+Yy50eXBlIT09IlVuZGVmaW5lZFZhbHVlIl0sWyJ1bmRlZmluZWQiLGM9PmMudHlwZT09PSJVbmRlZmluZWRWYWx1ZSJdLFsiZXF1YWx0byIsKGMsdCk9PmMudmFsdWU9PT10LnZhbHVlXV0pKTt0aGlzLnBhcmVudD1jfXNldChjLHQpe3JldHVybiB0aGlzLmRlY2xhcmVWYXJpYWJsZShjLGNvbnZlcnRUb1J1bnRpbWVWYWx1ZXModCkpfWRlY2xhcmVWYXJpYWJsZShjLHQpe2lmKHRoaXMudmFyaWFibGVzLmhhcyhjKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFZhcmlhYmxlIGFscmVhZHkgZGVjbGFyZWQ6ICR7Y31gKTtyZXR1cm4gdGhpcy52YXJpYWJsZXMuc2V0KGMsdCksdH1zZXRWYXJpYWJsZShjLHQpe3JldHVybiB0aGlzLnZhcmlhYmxlcy5zZXQoYyx0KSx0fXJlc29sdmUoYyl7aWYodGhpcy52YXJpYWJsZXMuaGFzKGMpKXJldHVybiB0aGlzO2lmKHRoaXMucGFyZW50KXJldHVybiB0aGlzLnBhcmVudC5yZXNvbHZlKGMpO3Rocm93IG5ldyBFcnJvcihgVW5rbm93biB2YXJpYWJsZTogJHtjfWApfWxvb2t1cFZhcmlhYmxlKGMpe3RyeXtyZXR1cm4gdGhpcy5yZXNvbHZlKGMpLnZhcmlhYmxlcy5nZXQoYyk/P25ldyBVbmRlZmluZWRWYWx1ZX1jYXRjaHtyZXR1cm4gbmV3IFVuZGVmaW5lZFZhbHVlfX19LEludGVycHJldGVyPWNsYXNze2NvbnN0cnVjdG9yKGMpe0sodGhpcywiZ2xvYmFsIik7dGhpcy5nbG9iYWw9Yz8/bmV3IEVudmlyb25tZW50fXJ1bihjKXtyZXR1cm4gdGhpcy5ldmFsdWF0ZShjLHRoaXMuZ2xvYmFsKX1ldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb24oYyx0KXtjb25zdCByPXRoaXMuZXZhbHVhdGUoYy5sZWZ0LHQpO3N3aXRjaChjLm9wZXJhdG9yLnZhbHVlKXtjYXNlImFuZCI6cmV0dXJuIHIuX19ib29sX18oKS52YWx1ZT90aGlzLmV2YWx1YXRlKGMucmlnaHQsdCk6cjtjYXNlIm9yIjpyZXR1cm4gci5fX2Jvb2xfXygpLnZhbHVlP3I6dGhpcy5ldmFsdWF0ZShjLnJpZ2h0LHQpfWNvbnN0IG89dGhpcy5ldmFsdWF0ZShjLnJpZ2h0LHQpO3N3aXRjaChjLm9wZXJhdG9yLnZhbHVlKXtjYXNlIj09IjpyZXR1cm4gbmV3IEJvb2xlYW5WYWx1ZShyLnZhbHVlPT1vLnZhbHVlKTtjYXNlIiE9IjpyZXR1cm4gbmV3IEJvb2xlYW5WYWx1ZShyLnZhbHVlIT1vLnZhbHVlKX1pZihyIGluc3RhbmNlb2YgVW5kZWZpbmVkVmFsdWV8fG8gaW5zdGFuY2VvZiBVbmRlZmluZWRWYWx1ZSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBvbiB1bmRlZmluZWQgdmFsdWVzIik7aWYociBpbnN0YW5jZW9mIE51bGxWYWx1ZXx8byBpbnN0YW5jZW9mIE51bGxWYWx1ZSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBvbiBudWxsIHZhbHVlcyIpO2lmKHIgaW5zdGFuY2VvZiBOdW1lcmljVmFsdWUmJm8gaW5zdGFuY2VvZiBOdW1lcmljVmFsdWUpc3dpdGNoKGMub3BlcmF0b3IudmFsdWUpe2Nhc2UiKyI6cmV0dXJuIG5ldyBOdW1lcmljVmFsdWUoci52YWx1ZStvLnZhbHVlKTtjYXNlIi0iOnJldHVybiBuZXcgTnVtZXJpY1ZhbHVlKHIudmFsdWUtby52YWx1ZSk7Y2FzZSIqIjpyZXR1cm4gbmV3IE51bWVyaWNWYWx1ZShyLnZhbHVlKm8udmFsdWUpO2Nhc2UiLyI6cmV0dXJuIG5ldyBOdW1lcmljVmFsdWUoci52YWx1ZS9vLnZhbHVlKTtjYXNlIiUiOnJldHVybiBuZXcgTnVtZXJpY1ZhbHVlKHIudmFsdWUlby52YWx1ZSk7Y2FzZSI8IjpyZXR1cm4gbmV3IEJvb2xlYW5WYWx1ZShyLnZhbHVlPG8udmFsdWUpO2Nhc2UiPiI6cmV0dXJuIG5ldyBCb29sZWFuVmFsdWUoci52YWx1ZT5vLnZhbHVlKTtjYXNlIj49IjpyZXR1cm4gbmV3IEJvb2xlYW5WYWx1ZShyLnZhbHVlPj1vLnZhbHVlKTtjYXNlIjw9IjpyZXR1cm4gbmV3IEJvb2xlYW5WYWx1ZShyLnZhbHVlPD1vLnZhbHVlKX1lbHNlIGlmKHIgaW5zdGFuY2VvZiBBcnJheVZhbHVlJiZvIGluc3RhbmNlb2YgQXJyYXlWYWx1ZSlzd2l0Y2goYy5vcGVyYXRvci52YWx1ZSl7Y2FzZSIrIjpyZXR1cm4gbmV3IEFycmF5VmFsdWUoci52YWx1ZS5jb25jYXQoby52YWx1ZSkpfWVsc2UgaWYobyBpbnN0YW5jZW9mIEFycmF5VmFsdWUpe2NvbnN0IHU9by52YWx1ZS5maW5kKGg9PmgudmFsdWU9PT1yLnZhbHVlKSE9PXZvaWQgMDtzd2l0Y2goYy5vcGVyYXRvci52YWx1ZSl7Y2FzZSJpbiI6cmV0dXJuIG5ldyBCb29sZWFuVmFsdWUodSk7Y2FzZSJub3QgaW4iOnJldHVybiBuZXcgQm9vbGVhblZhbHVlKCF1KX19aWYociBpbnN0YW5jZW9mIFN0cmluZ1ZhbHVlfHxvIGluc3RhbmNlb2YgU3RyaW5nVmFsdWUpc3dpdGNoKGMub3BlcmF0b3IudmFsdWUpe2Nhc2UiKyI6cmV0dXJuIG5ldyBTdHJpbmdWYWx1ZShyLnZhbHVlLnRvU3RyaW5nKCkrby52YWx1ZS50b1N0cmluZygpKX1pZihyIGluc3RhbmNlb2YgU3RyaW5nVmFsdWUmJm8gaW5zdGFuY2VvZiBTdHJpbmdWYWx1ZSlzd2l0Y2goYy5vcGVyYXRvci52YWx1ZSl7Y2FzZSJpbiI6cmV0dXJuIG5ldyBCb29sZWFuVmFsdWUoby52YWx1ZS5pbmNsdWRlcyhyLnZhbHVlKSk7Y2FzZSJub3QgaW4iOnJldHVybiBuZXcgQm9vbGVhblZhbHVlKCFvLnZhbHVlLmluY2x1ZGVzKHIudmFsdWUpKX1pZihyIGluc3RhbmNlb2YgU3RyaW5nVmFsdWUmJm8gaW5zdGFuY2VvZiBPYmplY3RWYWx1ZSlzd2l0Y2goYy5vcGVyYXRvci52YWx1ZSl7Y2FzZSJpbiI6cmV0dXJuIG5ldyBCb29sZWFuVmFsdWUoby52YWx1ZS5oYXMoci52YWx1ZSkpO2Nhc2Uibm90IGluIjpyZXR1cm4gbmV3IEJvb2xlYW5WYWx1ZSghby52YWx1ZS5oYXMoci52YWx1ZSkpfXRocm93IG5ldyBTeW50YXhFcnJvcihgVW5rbm93biBvcGVyYXRvciAiJHtjLm9wZXJhdG9yLnZhbHVlfSIgYmV0d2VlbiAke3IudHlwZX0gYW5kICR7by50eXBlfWApfWV2YWx1YXRlRmlsdGVyRXhwcmVzc2lvbihjLHQpe2NvbnN0IHI9dGhpcy5ldmFsdWF0ZShjLm9wZXJhbmQsdCk7aWYoYy5maWx0ZXIudHlwZT09PSJJZGVudGlmaWVyIil7Y29uc3Qgbz1jLmZpbHRlcjtpZihyIGluc3RhbmNlb2YgQXJyYXlWYWx1ZSlzd2l0Y2goby52YWx1ZSl7Y2FzZSJsaXN0IjpyZXR1cm4gcjtjYXNlImZpcnN0IjpyZXR1cm4gci52YWx1ZVswXTtjYXNlImxhc3QiOnJldHVybiByLnZhbHVlW3IudmFsdWUubGVuZ3RoLTFdO2Nhc2UibGVuZ3RoIjpyZXR1cm4gbmV3IE51bWVyaWNWYWx1ZShyLnZhbHVlLmxlbmd0aCk7Y2FzZSJyZXZlcnNlIjpyZXR1cm4gbmV3IEFycmF5VmFsdWUoci52YWx1ZS5yZXZlcnNlKCkpO2Nhc2Uic29ydCI6cmV0dXJuIG5ldyBBcnJheVZhbHVlKHIudmFsdWUuc29ydCgodSxoKT0+e2lmKHUudHlwZSE9PWgudHlwZSl0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb21wYXJlIGRpZmZlcmVudCB0eXBlczogJHt1LnR5cGV9IGFuZCAke2gudHlwZX1gKTtzd2l0Y2godS50eXBlKXtjYXNlIk51bWVyaWNWYWx1ZSI6cmV0dXJuIHUudmFsdWUtaC52YWx1ZTtjYXNlIlN0cmluZ1ZhbHVlIjpyZXR1cm4gdS52YWx1ZS5sb2NhbGVDb21wYXJlKGgudmFsdWUpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29tcGFyZSB0eXBlOiAke3UudHlwZX1gKX19KSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQXJyYXlWYWx1ZSBmaWx0ZXI6ICR7by52YWx1ZX1gKX1lbHNlIGlmKHIgaW5zdGFuY2VvZiBTdHJpbmdWYWx1ZSlzd2l0Y2goby52YWx1ZSl7Y2FzZSJsZW5ndGgiOnJldHVybiBuZXcgTnVtZXJpY1ZhbHVlKHIudmFsdWUubGVuZ3RoKTtjYXNlInVwcGVyIjpyZXR1cm4gbmV3IFN0cmluZ1ZhbHVlKHIudmFsdWUudG9VcHBlckNhc2UoKSk7Y2FzZSJsb3dlciI6cmV0dXJuIG5ldyBTdHJpbmdWYWx1ZShyLnZhbHVlLnRvTG93ZXJDYXNlKCkpO2Nhc2UidGl0bGUiOnJldHVybiBuZXcgU3RyaW5nVmFsdWUodGl0bGVDYXNlKHIudmFsdWUpKTtjYXNlImNhcGl0YWxpemUiOnJldHVybiBuZXcgU3RyaW5nVmFsdWUoci52YWx1ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStyLnZhbHVlLnNsaWNlKDEpKTtjYXNlInRyaW0iOnJldHVybiBuZXcgU3RyaW5nVmFsdWUoci52YWx1ZS50cmltKCkpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIFN0cmluZ1ZhbHVlIGZpbHRlcjogJHtvLnZhbHVlfWApfWVsc2UgaWYociBpbnN0YW5jZW9mIE51bWVyaWNWYWx1ZSlzd2l0Y2goby52YWx1ZSl7Y2FzZSJhYnMiOnJldHVybiBuZXcgTnVtZXJpY1ZhbHVlKE1hdGguYWJzKHIudmFsdWUpKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5rbm93biBOdW1lcmljVmFsdWUgZmlsdGVyOiAke28udmFsdWV9YCl9ZWxzZSBpZihyIGluc3RhbmNlb2YgT2JqZWN0VmFsdWUpc3dpdGNoKG8udmFsdWUpe2Nhc2UiaXRlbXMiOnJldHVybiBuZXcgQXJyYXlWYWx1ZShBcnJheS5mcm9tKHIudmFsdWUuZW50cmllcygpKS5tYXAoKFt1LGhdKT0+bmV3IEFycmF5VmFsdWUoW25ldyBTdHJpbmdWYWx1ZSh1KSxoXSkpKTtjYXNlImxlbmd0aCI6cmV0dXJuIG5ldyBOdW1lcmljVmFsdWUoci52YWx1ZS5zaXplKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5rbm93biBPYmplY3RWYWx1ZSBmaWx0ZXI6ICR7by52YWx1ZX1gKX10aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhcHBseSBmaWx0ZXIgIiR7by52YWx1ZX0iIHRvIHR5cGU6ICR7ci50eXBlfWApfWVsc2UgaWYoYy5maWx0ZXIudHlwZT09PSJDYWxsRXhwcmVzc2lvbiIpe2NvbnN0IG89Yy5maWx0ZXI7aWYoby5jYWxsZWUudHlwZSE9PSJJZGVudGlmaWVyIil0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZmlsdGVyOiAke28uY2FsbGVlLnR5cGV9YCk7Y29uc3QgdT1vLmNhbGxlZS52YWx1ZTtpZihyIGluc3RhbmNlb2YgQXJyYXlWYWx1ZSl7c3dpdGNoKHUpe2Nhc2Uic2VsZWN0YXR0ciI6e2lmKHIudmFsdWUuc29tZShsPT4hKGwgaW5zdGFuY2VvZiBPYmplY3RWYWx1ZSkpKXRocm93IG5ldyBFcnJvcigiYHNlbGVjdGF0dHJgIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYXJyYXkgb2Ygb2JqZWN0cyIpO2lmKG8uYXJncy5zb21lKGw9PmwudHlwZSE9PSJTdHJpbmdMaXRlcmFsIikpdGhyb3cgbmV3IEVycm9yKCJhcmd1bWVudHMgb2YgYHNlbGVjdGF0dHJgIG11c3QgYmUgc3RyaW5ncyIpO2NvbnN0W2gsYSxwXT1vLmFyZ3MubWFwKGw9PnRoaXMuZXZhbHVhdGUobCx0KSk7bGV0IGY7aWYoYSl7Y29uc3QgbD10LnRlc3RzLmdldChhLnZhbHVlKTtpZighbCl0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdGVzdDogJHthLnZhbHVlfWApO2Y9bH1lbHNlIGY9KC4uLmwpPT5sWzBdLl9fYm9vbF9fKCkudmFsdWU7Y29uc3QgZD1yLnZhbHVlLmZpbHRlcihsPT57Y29uc3Qgbj1sLnZhbHVlLmdldChoLnZhbHVlKTtyZXR1cm4gbj9mKG4scCk6ITF9KTtyZXR1cm4gbmV3IEFycmF5VmFsdWUoZCl9fXRocm93IG5ldyBFcnJvcihgVW5rbm93biBBcnJheVZhbHVlIGZpbHRlcjogJHt1fWApfWVsc2UgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYXBwbHkgZmlsdGVyICIke3V9IiB0byB0eXBlOiAke3IudHlwZX1gKX10aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZmlsdGVyOiAke2MuZmlsdGVyLnR5cGV9YCl9ZXZhbHVhdGVUZXN0RXhwcmVzc2lvbihjLHQpe2NvbnN0IHI9dGhpcy5ldmFsdWF0ZShjLm9wZXJhbmQsdCksbz10LnRlc3RzLmdldChjLnRlc3QudmFsdWUpO2lmKCFvKXRocm93IG5ldyBFcnJvcihgVW5rbm93biB0ZXN0OiAke2MudGVzdC52YWx1ZX1gKTtjb25zdCB1PW8ocik7cmV0dXJuIG5ldyBCb29sZWFuVmFsdWUoYy5uZWdhdGU/IXU6dSl9ZXZhbHVhdGVVbmFyeUV4cHJlc3Npb24oYyx0KXtjb25zdCByPXRoaXMuZXZhbHVhdGUoYy5hcmd1bWVudCx0KTtzd2l0Y2goYy5vcGVyYXRvci52YWx1ZSl7Y2FzZSJub3QiOnJldHVybiBuZXcgQm9vbGVhblZhbHVlKCFyLnZhbHVlKTtkZWZhdWx0OnRocm93IG5ldyBTeW50YXhFcnJvcihgVW5rbm93biBvcGVyYXRvcjogJHtjLm9wZXJhdG9yLnZhbHVlfWApfX1ldmFsUHJvZ3JhbShjLHQpe3JldHVybiB0aGlzLmV2YWx1YXRlQmxvY2soYy5ib2R5LHQpfWV2YWx1YXRlQmxvY2soYyx0KXtsZXQgcj0iIjtmb3IoY29uc3QgbyBvZiBjKXtjb25zdCB1PXRoaXMuZXZhbHVhdGUobyx0KTt1LnR5cGUhPT0iTnVsbFZhbHVlIiYmdS50eXBlIT09IlVuZGVmaW5lZFZhbHVlIiYmKHIrPXUudmFsdWUpfXJldHVybiBuZXcgU3RyaW5nVmFsdWUocil9ZXZhbHVhdGVJZGVudGlmaWVyKGMsdCl7cmV0dXJuIHQubG9va3VwVmFyaWFibGUoYy52YWx1ZSl9ZXZhbHVhdGVDYWxsRXhwcmVzc2lvbihjLHQpe2NvbnN0IHI9W10sbz1uZXcgTWFwO2Zvcihjb25zdCBoIG9mIGMuYXJncylpZihoLnR5cGU9PT0iS2V5d29yZEFyZ3VtZW50RXhwcmVzc2lvbiIpe2NvbnN0IGE9aDtvLnNldChhLmtleS52YWx1ZSx0aGlzLmV2YWx1YXRlKGEudmFsdWUsdCkpfWVsc2Ugci5wdXNoKHRoaXMuZXZhbHVhdGUoaCx0KSk7by5zaXplPjAmJnIucHVzaChuZXcgT2JqZWN0VmFsdWUobykpO2NvbnN0IHU9dGhpcy5ldmFsdWF0ZShjLmNhbGxlZSx0KTtpZih1LnR5cGUhPT0iRnVuY3Rpb25WYWx1ZSIpdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2FsbCBzb21ldGhpbmcgdGhhdCBpcyBub3QgYSBmdW5jdGlvbjogZ290ICR7dS50eXBlfWApO3JldHVybiB1LnZhbHVlKHIsdCl9ZXZhbHVhdGVTbGljZUV4cHJlc3Npb24oYyx0LHIpe2lmKCEoYyBpbnN0YW5jZW9mIEFycmF5VmFsdWV8fGMgaW5zdGFuY2VvZiBTdHJpbmdWYWx1ZSkpdGhyb3cgbmV3IEVycm9yKCJTbGljZSBvYmplY3QgbXVzdCBiZSBhbiBhcnJheSBvciBzdHJpbmciKTtjb25zdCBvPXRoaXMuZXZhbHVhdGUodC5zdGFydCxyKSx1PXRoaXMuZXZhbHVhdGUodC5zdG9wLHIpLGg9dGhpcy5ldmFsdWF0ZSh0LnN0ZXAscik7aWYoIShvIGluc3RhbmNlb2YgTnVtZXJpY1ZhbHVlfHxvIGluc3RhbmNlb2YgVW5kZWZpbmVkVmFsdWUpKXRocm93IG5ldyBFcnJvcigiU2xpY2Ugc3RhcnQgbXVzdCBiZSBudW1lcmljIG9yIHVuZGVmaW5lZCIpO2lmKCEodSBpbnN0YW5jZW9mIE51bWVyaWNWYWx1ZXx8dSBpbnN0YW5jZW9mIFVuZGVmaW5lZFZhbHVlKSl0aHJvdyBuZXcgRXJyb3IoIlNsaWNlIHN0b3AgbXVzdCBiZSBudW1lcmljIG9yIHVuZGVmaW5lZCIpO2lmKCEoaCBpbnN0YW5jZW9mIE51bWVyaWNWYWx1ZXx8aCBpbnN0YW5jZW9mIFVuZGVmaW5lZFZhbHVlKSl0aHJvdyBuZXcgRXJyb3IoIlNsaWNlIHN0ZXAgbXVzdCBiZSBudW1lcmljIG9yIHVuZGVmaW5lZCIpO3JldHVybiBjIGluc3RhbmNlb2YgQXJyYXlWYWx1ZT9uZXcgQXJyYXlWYWx1ZShzbGljZShjLnZhbHVlLG8udmFsdWUsdS52YWx1ZSxoLnZhbHVlKSk6bmV3IFN0cmluZ1ZhbHVlKHNsaWNlKEFycmF5LmZyb20oYy52YWx1ZSksby52YWx1ZSx1LnZhbHVlLGgudmFsdWUpLmpvaW4oIiIpKX1ldmFsdWF0ZU1lbWJlckV4cHJlc3Npb24oYyx0KXtjb25zdCByPXRoaXMuZXZhbHVhdGUoYy5vYmplY3QsdCk7bGV0IG87aWYoYy5jb21wdXRlZCl7aWYoYy5wcm9wZXJ0eS50eXBlPT09IlNsaWNlRXhwcmVzc2lvbiIpcmV0dXJuIHRoaXMuZXZhbHVhdGVTbGljZUV4cHJlc3Npb24ocixjLnByb3BlcnR5LHQpO289dGhpcy5ldmFsdWF0ZShjLnByb3BlcnR5LHQpfWVsc2Ugbz1uZXcgU3RyaW5nVmFsdWUoYy5wcm9wZXJ0eS52YWx1ZSk7bGV0IHU7aWYociBpbnN0YW5jZW9mIE9iamVjdFZhbHVlKXtpZighKG8gaW5zdGFuY2VvZiBTdHJpbmdWYWx1ZSkpdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IHdpdGggbm9uLXN0cmluZzogZ290ICR7by50eXBlfWApO3U9ci52YWx1ZS5nZXQoby52YWx1ZSk/P3IuYnVpbHRpbnMuZ2V0KG8udmFsdWUpfWVsc2UgaWYociBpbnN0YW5jZW9mIEFycmF5VmFsdWV8fHIgaW5zdGFuY2VvZiBTdHJpbmdWYWx1ZSlpZihvIGluc3RhbmNlb2YgTnVtZXJpY1ZhbHVlKXU9ci52YWx1ZS5hdChvLnZhbHVlKSxyIGluc3RhbmNlb2YgU3RyaW5nVmFsdWUmJih1PW5ldyBTdHJpbmdWYWx1ZShyLnZhbHVlLmF0KG8udmFsdWUpKSk7ZWxzZSBpZihvIGluc3RhbmNlb2YgU3RyaW5nVmFsdWUpdT1yLmJ1aWx0aW5zLmdldChvLnZhbHVlKTtlbHNlIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSB3aXRoIG5vbi1zdHJpbmcvbm9uLW51bWJlcjogZ290ICR7by50eXBlfWApO2Vsc2V7aWYoIShvIGluc3RhbmNlb2YgU3RyaW5nVmFsdWUpKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSB3aXRoIG5vbi1zdHJpbmc6IGdvdCAke28udHlwZX1gKTt1PXIuYnVpbHRpbnMuZ2V0KG8udmFsdWUpfXJldHVybiB1IGluc3RhbmNlb2YgUnVudGltZVZhbHVlP3U6bmV3IFVuZGVmaW5lZFZhbHVlfWV2YWx1YXRlU2V0KGMsdCl7Y29uc3Qgcj10aGlzLmV2YWx1YXRlKGMudmFsdWUsdCk7aWYoYy5hc3NpZ25lZS50eXBlPT09IklkZW50aWZpZXIiKXtjb25zdCBvPWMuYXNzaWduZWUudmFsdWU7dC5zZXRWYXJpYWJsZShvLHIpfWVsc2UgaWYoYy5hc3NpZ25lZS50eXBlPT09Ik1lbWJlckV4cHJlc3Npb24iKXtjb25zdCBvPWMuYXNzaWduZWUsdT10aGlzLmV2YWx1YXRlKG8ub2JqZWN0LHQpO2lmKCEodSBpbnN0YW5jZW9mIE9iamVjdFZhbHVlKSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBhc3NpZ24gdG8gbWVtYmVyIG9mIG5vbi1vYmplY3QiKTtpZihvLnByb3BlcnR5LnR5cGUhPT0iSWRlbnRpZmllciIpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgYXNzaWduIHRvIG1lbWJlciB3aXRoIG5vbi1pZGVudGlmaWVyIHByb3BlcnR5Iik7dS52YWx1ZS5zZXQoby5wcm9wZXJ0eS52YWx1ZSxyKX1lbHNlIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBMSFMgaW5zaWRlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbjogJHtKU09OLnN0cmluZ2lmeShjLmFzc2lnbmVlKX1gKTtyZXR1cm4gbmV3IE51bGxWYWx1ZX1ldmFsdWF0ZUlmKGMsdCl7Y29uc3Qgcj10aGlzLmV2YWx1YXRlKGMudGVzdCx0KTtyZXR1cm4gdGhpcy5ldmFsdWF0ZUJsb2NrKHIuX19ib29sX18oKS52YWx1ZT9jLmJvZHk6Yy5hbHRlcm5hdGUsdCl9ZXZhbHVhdGVGb3IoYyx0KXtjb25zdCByPW5ldyBFbnZpcm9ubWVudCh0KSxvPXRoaXMuZXZhbHVhdGUoYy5pdGVyYWJsZSxyKTtpZighKG8gaW5zdGFuY2VvZiBBcnJheVZhbHVlKSl0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGl0ZXJhYmxlIHR5cGUgaW4gZm9yIGxvb3A6IGdvdCAke28udHlwZX1gKTtsZXQgdT0iIjtmb3IobGV0IGg9MDtoPG8udmFsdWUubGVuZ3RoOysraCl7Y29uc3QgYT1uZXcgTWFwKFtbImluZGV4IixuZXcgTnVtZXJpY1ZhbHVlKGgrMSldLFsiaW5kZXgwIixuZXcgTnVtZXJpY1ZhbHVlKGgpXSxbInJldmluZGV4IixuZXcgTnVtZXJpY1ZhbHVlKG8udmFsdWUubGVuZ3RoLWgpXSxbInJldmluZGV4MCIsbmV3IE51bWVyaWNWYWx1ZShvLnZhbHVlLmxlbmd0aC1oLTEpXSxbImZpcnN0IixuZXcgQm9vbGVhblZhbHVlKGg9PT0wKV0sWyJsYXN0IixuZXcgQm9vbGVhblZhbHVlKGg9PT1vLnZhbHVlLmxlbmd0aC0xKV0sWyJsZW5ndGgiLG5ldyBOdW1lcmljVmFsdWUoby52YWx1ZS5sZW5ndGgpXSxbInByZXZpdGVtIixoPjA/by52YWx1ZVtoLTFdOm5ldyBVbmRlZmluZWRWYWx1ZV0sWyJuZXh0aXRlbSIsaDxvLnZhbHVlLmxlbmd0aC0xP28udmFsdWVbaCsxXTpuZXcgVW5kZWZpbmVkVmFsdWVdXSk7ci5zZXRWYXJpYWJsZSgibG9vcCIsbmV3IE9iamVjdFZhbHVlKGEpKTtjb25zdCBwPW8udmFsdWVbaF07aWYoYy5sb29wdmFyLnR5cGU9PT0iSWRlbnRpZmllciIpci5zZXRWYXJpYWJsZShjLmxvb3B2YXIudmFsdWUscCk7ZWxzZSBpZihjLmxvb3B2YXIudHlwZT09PSJUdXBsZUxpdGVyYWwiKXtjb25zdCBkPWMubG9vcHZhcjtpZihwLnR5cGUhPT0iQXJyYXlWYWx1ZSIpdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdW5wYWNrIG5vbi1pdGVyYWJsZSB0eXBlOiAke3AudHlwZX1gKTtjb25zdCBsPXA7aWYoZC52YWx1ZS5sZW5ndGghPT1sLnZhbHVlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYFRvbyAke2QudmFsdWUubGVuZ3RoPmwudmFsdWUubGVuZ3RoPyJmZXciOiJtYW55In0gaXRlbXMgdG8gdW5wYWNrYCk7Zm9yKGxldCBuPTA7bjxkLnZhbHVlLmxlbmd0aDsrK24pe2lmKGQudmFsdWVbbl0udHlwZSE9PSJJZGVudGlmaWVyIil0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB1bnBhY2sgbm9uLWlkZW50aWZpZXIgdHlwZTogJHtkLnZhbHVlW25dLnR5cGV9YCk7ci5zZXRWYXJpYWJsZShkLnZhbHVlW25dLnZhbHVlLGwudmFsdWVbbl0pfX1jb25zdCBmPXRoaXMuZXZhbHVhdGVCbG9jayhjLmJvZHkscik7dSs9Zi52YWx1ZX1yZXR1cm4gbmV3IFN0cmluZ1ZhbHVlKHUpfWV2YWx1YXRlKGMsdCl7aWYoYz09PXZvaWQgMClyZXR1cm4gbmV3IFVuZGVmaW5lZFZhbHVlO3N3aXRjaChjLnR5cGUpe2Nhc2UiUHJvZ3JhbSI6cmV0dXJuIHRoaXMuZXZhbFByb2dyYW0oYyx0KTtjYXNlIlNldCI6cmV0dXJuIHRoaXMuZXZhbHVhdGVTZXQoYyx0KTtjYXNlIklmIjpyZXR1cm4gdGhpcy5ldmFsdWF0ZUlmKGMsdCk7Y2FzZSJGb3IiOnJldHVybiB0aGlzLmV2YWx1YXRlRm9yKGMsdCk7Y2FzZSJOdW1lcmljTGl0ZXJhbCI6cmV0dXJuIG5ldyBOdW1lcmljVmFsdWUoTnVtYmVyKGMudmFsdWUpKTtjYXNlIlN0cmluZ0xpdGVyYWwiOnJldHVybiBuZXcgU3RyaW5nVmFsdWUoYy52YWx1ZSk7Y2FzZSJCb29sZWFuTGl0ZXJhbCI6cmV0dXJuIG5ldyBCb29sZWFuVmFsdWUoYy52YWx1ZSk7Y2FzZSJBcnJheUxpdGVyYWwiOnJldHVybiBuZXcgQXJyYXlWYWx1ZShjLnZhbHVlLm1hcChyPT50aGlzLmV2YWx1YXRlKHIsdCkpKTtjYXNlIlR1cGxlTGl0ZXJhbCI6cmV0dXJuIG5ldyBUdXBsZVZhbHVlKGMudmFsdWUubWFwKHI9PnRoaXMuZXZhbHVhdGUocix0KSkpO2Nhc2UiT2JqZWN0TGl0ZXJhbCI6e2NvbnN0IHI9bmV3IE1hcDtmb3IoY29uc3Rbbyx1XW9mIGMudmFsdWUpe2NvbnN0IGg9dGhpcy5ldmFsdWF0ZShvLHQpO2lmKCEoaCBpbnN0YW5jZW9mIFN0cmluZ1ZhbHVlKSl0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBrZXlzIG11c3QgYmUgc3RyaW5nczogZ290ICR7aC50eXBlfWApO3Iuc2V0KGgudmFsdWUsdGhpcy5ldmFsdWF0ZSh1LHQpKX1yZXR1cm4gbmV3IE9iamVjdFZhbHVlKHIpfWNhc2UiSWRlbnRpZmllciI6cmV0dXJuIHRoaXMuZXZhbHVhdGVJZGVudGlmaWVyKGMsdCk7Y2FzZSJDYWxsRXhwcmVzc2lvbiI6cmV0dXJuIHRoaXMuZXZhbHVhdGVDYWxsRXhwcmVzc2lvbihjLHQpO2Nhc2UiTWVtYmVyRXhwcmVzc2lvbiI6cmV0dXJuIHRoaXMuZXZhbHVhdGVNZW1iZXJFeHByZXNzaW9uKGMsdCk7Y2FzZSJVbmFyeUV4cHJlc3Npb24iOnJldHVybiB0aGlzLmV2YWx1YXRlVW5hcnlFeHByZXNzaW9uKGMsdCk7Y2FzZSJCaW5hcnlFeHByZXNzaW9uIjpyZXR1cm4gdGhpcy5ldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb24oYyx0KTtjYXNlIkZpbHRlckV4cHJlc3Npb24iOnJldHVybiB0aGlzLmV2YWx1YXRlRmlsdGVyRXhwcmVzc2lvbihjLHQpO2Nhc2UiVGVzdEV4cHJlc3Npb24iOnJldHVybiB0aGlzLmV2YWx1YXRlVGVzdEV4cHJlc3Npb24oYyx0KTtkZWZhdWx0OnRocm93IG5ldyBTeW50YXhFcnJvcihgVW5rbm93biBub2RlIHR5cGU6ICR7Yy50eXBlfWApfX19O2Z1bmN0aW9uIGNvbnZlcnRUb1J1bnRpbWVWYWx1ZXMoYyl7c3dpdGNoKHR5cGVvZiBjKXtjYXNlIm51bWJlciI6cmV0dXJuIG5ldyBOdW1lcmljVmFsdWUoYyk7Y2FzZSJzdHJpbmciOnJldHVybiBuZXcgU3RyaW5nVmFsdWUoYyk7Y2FzZSJib29sZWFuIjpyZXR1cm4gbmV3IEJvb2xlYW5WYWx1ZShjKTtjYXNlIm9iamVjdCI6cmV0dXJuIGM9PT1udWxsP25ldyBOdWxsVmFsdWU6QXJyYXkuaXNBcnJheShjKT9uZXcgQXJyYXlWYWx1ZShjLm1hcChjb252ZXJ0VG9SdW50aW1lVmFsdWVzKSk6bmV3IE9iamVjdFZhbHVlKG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoYykubWFwKChbdCxyXSk9Plt0LGNvbnZlcnRUb1J1bnRpbWVWYWx1ZXMocildKSkpO2Nhc2UiZnVuY3Rpb24iOnJldHVybiBuZXcgRnVuY3Rpb25WYWx1ZSgodCxyKT0+e2NvbnN0IG89YyguLi50Lm1hcCh1PT51LnZhbHVlKSk/P251bGw7cmV0dXJuIGNvbnZlcnRUb1J1bnRpbWVWYWx1ZXMobyl9KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgdG8gcnVudGltZSB2YWx1ZTogJHtjfWApfX12YXIgVGVtcGxhdGU9Y2xhc3N7Y29uc3RydWN0b3IoYyl7Syh0aGlzLCJwYXJzZWQiKTtjb25zdCB0PXRva2VuaXplKGMse2xzdHJpcF9ibG9ja3M6ITAsdHJpbV9ibG9ja3M6ITB9KTt0aGlzLnBhcnNlZD1wYXJzZSh0KX1yZW5kZXIoYyl7Y29uc3QgdD1uZXcgRW52aXJvbm1lbnQ7dC5zZXQoImZhbHNlIiwhMSksdC5zZXQoInRydWUiLCEwKSx0LnNldCgicmFpc2VfZXhjZXB0aW9uIix1PT57dGhyb3cgbmV3IEVycm9yKHUpfSksdC5zZXQoInJhbmdlIixyYW5nZSk7Zm9yKGNvbnN0W3UsaF1vZiBPYmplY3QuZW50cmllcyhjKSl0LnNldCh1LGgpO3JldHVybiBuZXcgSW50ZXJwcmV0ZXIodCkucnVuKHRoaXMucGFyc2VkKS52YWx1ZX19O2FzeW5jIGZ1bmN0aW9uIGxvYWRUb2tlbml6ZXIoYyx0KXtjb25zdCByPWF3YWl0IFByb21pc2UuYWxsKFtnZXRNb2RlbEpTT04oYywidG9rZW5pemVyLmpzb24iLCEwLHQpLGdldE1vZGVsSlNPTihjLCJ0b2tlbml6ZXJfY29uZmlnLmpzb24iLCEwLHQpXSk7cmV0dXJuIHQubGVnYWN5IT09bnVsbCYmKHJbMV0ubGVnYWN5PXQubGVnYWN5KSxyfWZ1bmN0aW9uIHJlZ2V4U3BsaXQoYyx0KXtjb25zdCByPVtdO2xldCBvPTA7Zm9yKGNvbnN0IHUgb2YgYy5tYXRjaEFsbCh0KSl7Y29uc3QgaD11WzBdO288dS5pbmRleCYmci5wdXNoKGMuc2xpY2Uobyx1LmluZGV4KSksaC5sZW5ndGg+MCYmci5wdXNoKGgpLG89dS5pbmRleCtoLmxlbmd0aH1yZXR1cm4gbzxjLmxlbmd0aCYmci5wdXNoKGMuc2xpY2UobykpLHJ9ZnVuY3Rpb24gY3JlYXRlUGF0dGVybihjLHQ9ITApe2lmKGMuUmVnZXghPT12b2lkIDApe2xldCByPWMuUmVnZXgucmVwbGFjZSgvXFwoWyMmfl0pL2csIiQxIik7Zm9yKGNvbnN0W28sdV1vZiBQUk9CTEVNQVRJQ19SRUdFWF9NQVApcj1yLnJlcGxhY2VBbGwobyx1KTtyZXR1cm4gbmV3IFJlZ0V4cChyLCJndSIpfWVsc2UgaWYoYy5TdHJpbmchPT12b2lkIDApe2NvbnN0IHI9ZXNjYXBlUmVnRXhwKGMuU3RyaW5nKTtyZXR1cm4gbmV3IFJlZ0V4cCh0P3I6YCgke3J9KWAsImd1Iil9ZWxzZSByZXR1cm4gY29uc29sZS53YXJuKCJVbmtub3duIHBhdHRlcm4gdHlwZToiLGMpLG51bGx9ZnVuY3Rpb24gb2JqZWN0VG9NYXAoYyl7cmV0dXJuIG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoYykpfWZ1bmN0aW9uIHByZXBhcmVUZW5zb3JGb3JEZWNvZGUoYyl7Y29uc3QgdD1jLmRpbXM7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIGMudG9saXN0KCk7Y2FzZSAyOmlmKHRbMF0hPT0xKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGRlY29kZSB0ZW5zb3Igd2l0aCBgYmF0Y2ggc2l6ZSAhPT0gMWAuIFVzZSBgdG9rZW5pemVyLmJhdGNoX2RlY29kZSguLi4pYCBmb3IgYmF0Y2hlZCBpbnB1dHMuIik7cmV0dXJuIGMudG9saXN0KClbMF07ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRlbnNvciB0byBoYXZlIDEtMiBkaW1lbnNpb25zLCBnb3QgJHt0Lmxlbmd0aH0uYCl9fWZ1bmN0aW9uIGNsZWFuX3VwX3Rva2VuaXphdGlvbihjKXtyZXR1cm4gYy5yZXBsYWNlKC8gXC4vZywiLiIpLnJlcGxhY2UoLyBcPy9nLCI/IikucmVwbGFjZSgvIFwhL2csIiEiKS5yZXBsYWNlKC8gLC9nLCIsIikucmVwbGFjZSgvIFwnIC9nLCInIikucmVwbGFjZSgvIG5cJ3QvZywibid0IikucmVwbGFjZSgvIFwnbS9nLCInbSIpLnJlcGxhY2UoLyBcJ3MvZywiJ3MiKS5yZXBsYWNlKC8gXCd2ZS9nLCIndmUiKS5yZXBsYWNlKC8gXCdyZS9nLCIncmUiKX1mdW5jdGlvbiByZW1vdmVfYWNjZW50cyhjKXtyZXR1cm4gYy5yZXBsYWNlKC9bXHUwMzAwLVx1MDM2Zl0vZywiIil9ZnVuY3Rpb24gbG93ZXJjYXNlX2FuZF9yZW1vdmVfYWNjZW50KGMpe3JldHVybiByZW1vdmVfYWNjZW50cyhjLnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIGZ1c2UoYyx0LHIpe2NvbnN0IG89W107bGV0IHU9MDtmb3IoO3U8Yy5sZW5ndGg7KXtpZihvLnB1c2goY1t1XSksKHIuZ2V0KGNbdV0pPz90KSE9PXQpeysrdTtjb250aW51ZX1mb3IoO3U8Yy5sZW5ndGgmJihyLmdldChjW3VdKT8/dCk9PT10OykrK3V9cmV0dXJuIG99ZnVuY3Rpb24gd2hpdGVzcGFjZV9zcGxpdChjKXtyZXR1cm4gYy5tYXRjaCgvXFMrL2cpfHxbXX1jb25zdCBQVU5DVFVBVElPTl9SRUdFWD0iXFxwe1B9XFx1MDAyMS1cXHUwMDJGXFx1MDAzQS1cXHUwMDQwXFx1MDA1Qi1cXHUwMDYwXFx1MDA3Qi1cXHUwMDdFIixQUk9CTEVNQVRJQ19SRUdFWF9NQVA9bmV3IE1hcChbWyIoP2k6J3N8J3R8J3JlfCd2ZXwnbXwnbGx8J2QpIiwiKD86Jyhbc1NdfFt0VF18W3JSXVtlRV18W3ZWXVtlRV18W21NXXxbbExdW2xMXXxbZERdKSkiXV0pO2NsYXNzIEFkZGVkVG9rZW57Y29uc3RydWN0b3IodCl7dGhpcy5jb250ZW50PXQuY29udGVudCx0aGlzLmlkPXQuaWQsdGhpcy5zaW5nbGVfd29yZD10LnNpbmdsZV93b3JkPz8hMSx0aGlzLmxzdHJpcD10LmxzdHJpcD8/ITEsdGhpcy5yc3RyaXA9dC5yc3RyaXA/PyExLHRoaXMuc3BlY2lhbD10LnNwZWNpYWw/PyExLHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQ/P251bGx9fWNsYXNzIFRva2VuaXplck1vZGVsIGV4dGVuZHMgQ2FsbGFibGV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmNvbmZpZz10LHRoaXMudm9jYWI9W10sdGhpcy50b2tlbnNfdG9faWRzPW5ldyBNYXAsdGhpcy51bmtfdG9rZW5faWQ9dm9pZCAwLHRoaXMudW5rX3Rva2VuPXZvaWQgMCx0aGlzLmVuZF9vZl93b3JkX3N1ZmZpeD12b2lkIDAsdGhpcy5mdXNlX3Vuaz10aGlzLmNvbmZpZy5mdXNlX3Vuaz8/ITF9c3RhdGljIGZyb21Db25maWcodCwuLi5yKXtzd2l0Y2godC50eXBlKXtjYXNlIldvcmRQaWVjZSI6cmV0dXJuIG5ldyBXb3JkUGllY2VUb2tlbml6ZXIodCk7Y2FzZSJVbmlncmFtIjpyZXR1cm4gbmV3IFVuaWdyYW0odCwuLi5yKTtjYXNlIkJQRSI6cmV0dXJuIG5ldyBCUEUodCk7ZGVmYXVsdDppZih0LnZvY2FiKXJldHVybiBuZXcgTGVnYWN5VG9rZW5pemVyTW9kZWwodCwuLi5yKTt0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gVG9rZW5pemVyTW9kZWwgdHlwZTogJHt0LnR5cGV9YCl9fV9jYWxsKHQpe2xldCByPXRoaXMuZW5jb2RlKHQpO3JldHVybiB0aGlzLmZ1c2VfdW5rJiYocj1mdXNlKHIsdGhpcy51bmtfdG9rZW5faWQsdGhpcy50b2tlbnNfdG9faWRzKSkscn1lbmNvZGUodCl7dGhyb3cgRXJyb3IoImVuY29kZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MuIil9Y29udmVydF90b2tlbnNfdG9faWRzKHQpe3JldHVybiB0Lm1hcChyPT50aGlzLnRva2Vuc190b19pZHMuZ2V0KHIpPz90aGlzLnVua190b2tlbl9pZCl9Y29udmVydF9pZHNfdG9fdG9rZW5zKHQpe3JldHVybiB0Lm1hcChyPT50aGlzLnZvY2FiW3JdPz90aGlzLnVua190b2tlbil9fWNsYXNzIFdvcmRQaWVjZVRva2VuaXplciBleHRlbmRzIFRva2VuaXplck1vZGVse2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMudG9rZW5zX3RvX2lkcz1vYmplY3RUb01hcCh0LnZvY2FiKSx0aGlzLnVua190b2tlbl9pZD10aGlzLnRva2Vuc190b19pZHMuZ2V0KHQudW5rX3Rva2VuKSx0aGlzLnVua190b2tlbj10LnVua190b2tlbix0aGlzLm1heF9pbnB1dF9jaGFyc19wZXJfd29yZD10Lm1heF9pbnB1dF9jaGFyc19wZXJfd29yZD8/MTAwLHRoaXMudm9jYWI9bmV3IEFycmF5KHRoaXMudG9rZW5zX3RvX2lkcy5zaXplKTtmb3IoY29uc3RbcixvXW9mIHRoaXMudG9rZW5zX3RvX2lkcyl0aGlzLnZvY2FiW29dPXJ9ZW5jb2RlKHQpe2NvbnN0IHI9W107Zm9yKGNvbnN0IG8gb2YgdCl7Y29uc3QgdT1bLi4ub107aWYodS5sZW5ndGg+dGhpcy5tYXhfaW5wdXRfY2hhcnNfcGVyX3dvcmQpe3IucHVzaCh0aGlzLnVua190b2tlbik7Y29udGludWV9bGV0IGg9ITEsYT0wO2NvbnN0IHA9W107Zm9yKDthPHUubGVuZ3RoOyl7bGV0IGY9dS5sZW5ndGgsZD1udWxsO2Zvcig7YTxmOyl7bGV0IGw9dS5zbGljZShhLGYpLmpvaW4oIiIpO2lmKGE+MCYmKGw9dGhpcy5jb25maWcuY29udGludWluZ19zdWJ3b3JkX3ByZWZpeCtsKSx0aGlzLnRva2Vuc190b19pZHMuaGFzKGwpKXtkPWw7YnJlYWt9LS1mfWlmKGQ9PT1udWxsKXtoPSEwO2JyZWFrfXAucHVzaChkKSxhPWZ9aD9yLnB1c2godGhpcy51bmtfdG9rZW4pOnIucHVzaCguLi5wKX1yZXR1cm4gcn19Y2xhc3MgVW5pZ3JhbSBleHRlbmRzIFRva2VuaXplck1vZGVse2NvbnN0cnVjdG9yKHQscil7c3VwZXIodCk7Y29uc3Qgbz10LnZvY2FiLmxlbmd0aDt0aGlzLnZvY2FiPW5ldyBBcnJheShvKSx0aGlzLnNjb3Jlcz1uZXcgQXJyYXkobyk7Zm9yKGxldCB1PTA7dTxvOysrdSl7Y29uc3QgaD10LnZvY2FiW3VdO3RoaXMudm9jYWJbdV09aFswXSx0aGlzLnNjb3Jlc1t1XT1oWzFdfXRoaXMudW5rX3Rva2VuX2lkPXQudW5rX2lkLHRoaXMudW5rX3Rva2VuPXRoaXMudm9jYWJbdC51bmtfaWRdLHRoaXMudG9rZW5zX3RvX2lkcz1uZXcgTWFwKHRoaXMudm9jYWIubWFwKCh1LGgpPT5bdSxoXSkpLHRoaXMuYm9zVG9rZW49IiAiLHRoaXMuYm9zVG9rZW5JZD10aGlzLnRva2Vuc190b19pZHMuZ2V0KHRoaXMuYm9zVG9rZW4pLHRoaXMuZW9zVG9rZW49ci5lb3NfdG9rZW4sdGhpcy5lb3NUb2tlbklkPXRoaXMudG9rZW5zX3RvX2lkcy5nZXQodGhpcy5lb3NUb2tlbiksdGhpcy51bmtUb2tlbj10aGlzLnZvY2FiW3RoaXMudW5rX3Rva2VuX2lkXSx0aGlzLm1pblNjb3JlPW1pbih0aGlzLnNjb3JlcylbMF0sdGhpcy51bmtTY29yZT10aGlzLm1pblNjb3JlLTEwLHRoaXMuc2NvcmVzW3RoaXMudW5rX3Rva2VuX2lkXT10aGlzLnVua1Njb3JlLHRoaXMudHJpZT1uZXcgQ2hhclRyaWUsdGhpcy50cmllLmV4dGVuZCh0aGlzLnZvY2FiKSx0aGlzLmZ1c2VfdW5rPSEwfXBvcHVsYXRlTm9kZXModCl7Y29uc3Qgcj10LnNlbnRlbmNlLG89ci5sZW5ndGg7bGV0IHU9MDtmb3IoO3U8bzspe2xldCBhPSExO2ZvcihsZXQgcCBvZiB0aGlzLnRyaWUuY29tbW9uUHJlZml4U2VhcmNoKHIuc2xpY2UodSkpKXtjb25zdCBmPXRoaXMudG9rZW5zX3RvX2lkcy5nZXQocCksZD10aGlzLnNjb3Jlc1tmXSxsPXAubGVuZ3RoO3QuaW5zZXJ0KHUsbCxkLGYpLCFhJiZsPT09MSYmKGE9ITApfWF8fHQuaW5zZXJ0KHUsMSx0aGlzLnVua1Njb3JlLHRoaXMudW5rX3Rva2VuX2lkKSx1Kz0xfX10b2tlbml6ZSh0KXtjb25zdCByPW5ldyBUb2tlbkxhdHRpY2UodCx0aGlzLmJvc1Rva2VuSWQsdGhpcy5lb3NUb2tlbklkKTtyZXR1cm4gdGhpcy5wb3B1bGF0ZU5vZGVzKHIpLHIudG9rZW5zKCl9ZW5jb2RlKHQpe2NvbnN0IHI9W107Zm9yKGNvbnN0IG8gb2YgdCl7Y29uc3QgdT10aGlzLnRva2VuaXplKG8pO3IucHVzaCguLi51KX1yZXR1cm4gcn19Y29uc3QgQllURVNfVE9fVU5JQ09ERT0oKCk9Pntjb25zdCBjPVsuLi5BcnJheS5mcm9tKHtsZW5ndGg6OTR9LCh1LGgpPT5oKzMzKSwuLi5BcnJheS5mcm9tKHtsZW5ndGg6MTJ9LCh1LGgpPT5oKzE2MSksLi4uQXJyYXkuZnJvbSh7bGVuZ3RoOjgyfSwodSxoKT0+aCsxNzQpXSx0PWMuc2xpY2UoKTtsZXQgcj0wO2ZvcihsZXQgdT0wO3U8MjU2OysrdSljLmluY2x1ZGVzKHUpfHwoYy5wdXNoKHUpLHQucHVzaCgyNTYrcikscis9MSk7Y29uc3Qgbz10Lm1hcCh1PT5TdHJpbmcuZnJvbUNoYXJDb2RlKHUpKTtyZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGMubWFwKCh1LGgpPT5bdSxvW2hdXSkpfSkoKSxVTklDT0RFX1RPX0JZVEVTPXJldmVyc2VEaWN0aW9uYXJ5KEJZVEVTX1RPX1VOSUNPREUpO2NsYXNzIEJQRSBleHRlbmRzIFRva2VuaXplck1vZGVse2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuQlBFX1NQTElUX1RPS0VOPSIgIix0aGlzLnRva2Vuc190b19pZHM9b2JqZWN0VG9NYXAodC52b2NhYiksdGhpcy51bmtfdG9rZW5faWQ9dGhpcy50b2tlbnNfdG9faWRzLmdldCh0LnVua190b2tlbiksdGhpcy51bmtfdG9rZW49dC51bmtfdG9rZW4sdGhpcy52b2NhYj1uZXcgQXJyYXkodGhpcy50b2tlbnNfdG9faWRzLnNpemUpO2Zvcihjb25zdFtyLG9db2YgdGhpcy50b2tlbnNfdG9faWRzKXRoaXMudm9jYWJbb109cjt0aGlzLmJwZV9yYW5rcz1uZXcgTWFwKHQubWVyZ2VzLm1hcCgocixvKT0+W3Isb10pKSx0aGlzLm1lcmdlcz10Lm1lcmdlcy5tYXAocj0+ci5zcGxpdCh0aGlzLkJQRV9TUExJVF9UT0tFTikpLHRoaXMuZW5kX29mX3dvcmRfc3VmZml4PXQuZW5kX29mX3dvcmRfc3VmZml4LHRoaXMuY29udGludWluZ19zdWJ3b3JkX3N1ZmZpeD10LmNvbnRpbnVpbmdfc3Vid29yZF9zdWZmaXg/P251bGwsdGhpcy5ieXRlX2ZhbGxiYWNrPXRoaXMuY29uZmlnLmJ5dGVfZmFsbGJhY2s/PyExLHRoaXMuYnl0ZV9mYWxsYmFjayYmKHRoaXMudGV4dF9lbmNvZGVyPW5ldyBUZXh0RW5jb2RlciksdGhpcy5pZ25vcmVfbWVyZ2VzPXRoaXMuY29uZmlnLmlnbm9yZV9tZXJnZXM/PyExLHRoaXMuY2FjaGU9bmV3IE1hcH1icGUodCl7aWYodC5sZW5ndGg9PT0wKXJldHVybltdO2NvbnN0IHI9dGhpcy5jYWNoZS5nZXQodCk7aWYociE9PXZvaWQgMClyZXR1cm4gcjtjb25zdCBvPUFycmF5LmZyb20odCk7dGhpcy5lbmRfb2Zfd29yZF9zdWZmaXgmJihvW28ubGVuZ3RoLTFdKz10aGlzLmVuZF9vZl93b3JkX3N1ZmZpeCk7bGV0IHU9W107aWYoby5sZW5ndGg+MSl7Y29uc3QgaD1uZXcgUHJpb3JpdHlRdWV1ZSgoZixkKT0+Zi5zY29yZTxkLnNjb3JlKTtsZXQgYT17dG9rZW46b1swXSxiaWFzOjAscHJldjpudWxsLG5leHQ6bnVsbH0scD1hO2ZvcihsZXQgZj0xO2Y8by5sZW5ndGg7KytmKXtjb25zdCBkPXtiaWFzOmYvby5sZW5ndGgsdG9rZW46b1tmXSxwcmV2OnAsbmV4dDpudWxsfTtwLm5leHQ9ZCx0aGlzLl9hZGRfbm9kZShoLHApLHA9ZH1mb3IoOyFoLmlzRW1wdHkoKTspe2NvbnN0IGY9aC5wb3AoKTtpZihmLmRlbGV0ZWR8fCFmLm5leHR8fGYubmV4dC5kZWxldGVkKWNvbnRpbnVlO2lmKGYuZGVsZXRlZD0hMCxmLm5leHQuZGVsZXRlZD0hMCxmLnByZXYpe2NvbnN0IGw9ey4uLmYucHJldn07Zi5wcmV2LmRlbGV0ZWQ9ITAsZi5wcmV2PWwsbC5wcmV2P2wucHJldi5uZXh0PWw6YT1sfWNvbnN0IGQ9e3Rva2VuOmYudG9rZW4rZi5uZXh0LnRva2VuLGJpYXM6Zi5iaWFzLHByZXY6Zi5wcmV2LG5leHQ6Zi5uZXh0Lm5leHR9O2QucHJldj8oZC5wcmV2Lm5leHQ9ZCx0aGlzLl9hZGRfbm9kZShoLGQucHJldikpOmE9ZCxkLm5leHQmJihkLm5leHQucHJldj1kLHRoaXMuX2FkZF9ub2RlKGgsZCkpfWZvcihsZXQgZj1hO2YhPT1udWxsO2Y9Zi5uZXh0KXUucHVzaChmLnRva2VuKX1lbHNlIHU9bztpZih0aGlzLmNvbnRpbnVpbmdfc3Vid29yZF9zdWZmaXgpZm9yKGxldCBoPTA7aDx1Lmxlbmd0aC0xOysraCl1W2hdKz10aGlzLmNvbnRpbnVpbmdfc3Vid29yZF9zdWZmaXg7cmV0dXJuIHRoaXMuY2FjaGUuc2V0KHQsdSksdX1fYWRkX25vZGUodCxyKXtjb25zdCBvPXRoaXMuYnBlX3JhbmtzLmdldChyLnRva2VuK3RoaXMuQlBFX1NQTElUX1RPS0VOK3IubmV4dC50b2tlbik7byE9PXZvaWQgMCYmKHIuc2NvcmU9bytyLmJpYXMsdC5wdXNoKHIpKX1lbmNvZGUodCl7Y29uc3Qgcj1bXTtmb3IoY29uc3QgbyBvZiB0KXtpZih0aGlzLmlnbm9yZV9tZXJnZXMmJnRoaXMudG9rZW5zX3RvX2lkcy5oYXMobykpe3IucHVzaChvKTtjb250aW51ZX1jb25zdCB1PXRoaXMuYnBlKG8pO2Zvcihjb25zdCBoIG9mIHUpdGhpcy50b2tlbnNfdG9faWRzLmhhcyhoKT9yLnB1c2goaCk6dGhpcy5ieXRlX2ZhbGxiYWNrP3IucHVzaCguLi5BcnJheS5mcm9tKHRoaXMudGV4dF9lbmNvZGVyLmVuY29kZShoKSkubWFwKGE9PmA8MHgke2EudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkucGFkU3RhcnQoMiwiMCIpfT5gKSk6ci5wdXNoKHRoaXMudW5rX3Rva2VuKX1yZXR1cm4gcn19Y2xhc3MgTGVnYWN5VG9rZW5pemVyTW9kZWwgZXh0ZW5kcyBUb2tlbml6ZXJNb2RlbHtjb25zdHJ1Y3Rvcih0LHIpe3N1cGVyKHQpLHRoaXMudG9rZW5zX3RvX2lkcz1vYmplY3RUb01hcChyLnRhcmdldF9sYW5nP3Qudm9jYWJbci50YXJnZXRfbGFuZ106dC52b2NhYiksdGhpcy5ib3NfdG9rZW49ci5ib3NfdG9rZW4sdGhpcy5ib3NfdG9rZW5faWQ9dGhpcy50b2tlbnNfdG9faWRzLmdldCh0aGlzLmJvc190b2tlbiksdGhpcy5lb3NfdG9rZW49ci5lb3NfdG9rZW4sdGhpcy5lb3NfdG9rZW5faWQ9dGhpcy50b2tlbnNfdG9faWRzLmdldCh0aGlzLmVvc190b2tlbiksdGhpcy5wYWRfdG9rZW49ci5wYWRfdG9rZW4sdGhpcy5wYWRfdG9rZW5faWQ9dGhpcy50b2tlbnNfdG9faWRzLmdldCh0aGlzLnBhZF90b2tlbiksdGhpcy51bmtfdG9rZW49ci51bmtfdG9rZW4sdGhpcy51bmtfdG9rZW5faWQ9dGhpcy50b2tlbnNfdG9faWRzLmdldCh0aGlzLnVua190b2tlbiksdGhpcy52b2NhYj1uZXcgQXJyYXkodGhpcy50b2tlbnNfdG9faWRzLnNpemUpO2Zvcihjb25zdFtvLHVdb2YgdGhpcy50b2tlbnNfdG9faWRzKXRoaXMudm9jYWJbdV09b31lbmNvZGUodCl7cmV0dXJuIHR9fWNsYXNzIE5vcm1hbGl6ZXIgZXh0ZW5kcyBDYWxsYWJsZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuY29uZmlnPXR9c3RhdGljIGZyb21Db25maWcodCl7aWYodD09PW51bGwpcmV0dXJuIG51bGw7c3dpdGNoKHQudHlwZSl7Y2FzZSJCZXJ0Tm9ybWFsaXplciI6cmV0dXJuIG5ldyBCZXJ0Tm9ybWFsaXplcih0KTtjYXNlIlByZWNvbXBpbGVkIjpyZXR1cm4gbmV3IFByZWNvbXBpbGVkKHQpO2Nhc2UiU2VxdWVuY2UiOnJldHVybiBuZXcgTm9ybWFsaXplclNlcXVlbmNlKHQpO2Nhc2UiUmVwbGFjZSI6cmV0dXJuIG5ldyBSZXBsYWNlKHQpO2Nhc2UiTkZDIjpyZXR1cm4gbmV3IE5GQyh0KTtjYXNlIk5GS0MiOnJldHVybiBuZXcgTkZLQyh0KTtjYXNlIk5GS0QiOnJldHVybiBuZXcgTkZLRCh0KTtjYXNlIlN0cmlwIjpyZXR1cm4gbmV3IFN0cmlwTm9ybWFsaXplcih0KTtjYXNlIlN0cmlwQWNjZW50cyI6cmV0dXJuIG5ldyBTdHJpcEFjY2VudHModCk7Y2FzZSJMb3dlcmNhc2UiOnJldHVybiBuZXcgTG93ZXJjYXNlKHQpO2Nhc2UiUHJlcGVuZCI6cmV0dXJuIG5ldyBQcmVwZW5kKHQpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIE5vcm1hbGl6ZXIgdHlwZTogJHt0LnR5cGV9YCl9fW5vcm1hbGl6ZSh0KXt0aHJvdyBFcnJvcigibm9ybWFsaXplIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcy4iKX1fY2FsbCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUodCl9fWNsYXNzIFJlcGxhY2UgZXh0ZW5kcyBOb3JtYWxpemVye25vcm1hbGl6ZSh0KXtjb25zdCByPWNyZWF0ZVBhdHRlcm4odGhpcy5jb25maWcucGF0dGVybik7cmV0dXJuIHI9PT1udWxsP3Q6dC5yZXBsYWNlQWxsKHIsdGhpcy5jb25maWcuY29udGVudCl9fWNsYXNzIE5GQyBleHRlbmRzIE5vcm1hbGl6ZXJ7bm9ybWFsaXplKHQpe3JldHVybiB0PXQubm9ybWFsaXplKCJORkMiKSx0fX1jbGFzcyBORktDIGV4dGVuZHMgTm9ybWFsaXplcntub3JtYWxpemUodCl7cmV0dXJuIHQ9dC5ub3JtYWxpemUoIk5GS0MiKSx0fX1jbGFzcyBORktEIGV4dGVuZHMgTm9ybWFsaXplcntub3JtYWxpemUodCl7cmV0dXJuIHQ9dC5ub3JtYWxpemUoIk5GS0QiKSx0fX1jbGFzcyBTdHJpcE5vcm1hbGl6ZXIgZXh0ZW5kcyBOb3JtYWxpemVye25vcm1hbGl6ZSh0KXtyZXR1cm4gdGhpcy5jb25maWcuc3RyaXBfbGVmdCYmdGhpcy5jb25maWcuc3RyaXBfcmlnaHQ/dD10LnRyaW0oKToodGhpcy5jb25maWcuc3RyaXBfbGVmdCYmKHQ9dC50cmltU3RhcnQoKSksdGhpcy5jb25maWcuc3RyaXBfcmlnaHQmJih0PXQudHJpbUVuZCgpKSksdH19Y2xhc3MgU3RyaXBBY2NlbnRzIGV4dGVuZHMgTm9ybWFsaXplcntub3JtYWxpemUodCl7cmV0dXJuIHQ9cmVtb3ZlX2FjY2VudHModCksdH19Y2xhc3MgTG93ZXJjYXNlIGV4dGVuZHMgTm9ybWFsaXplcntub3JtYWxpemUodCl7cmV0dXJuIHQ9dC50b0xvd2VyQ2FzZSgpLHR9fWNsYXNzIFByZXBlbmQgZXh0ZW5kcyBOb3JtYWxpemVye25vcm1hbGl6ZSh0KXtyZXR1cm4gdD10aGlzLmNvbmZpZy5wcmVwZW5kK3QsdH19Y2xhc3MgTm9ybWFsaXplclNlcXVlbmNlIGV4dGVuZHMgTm9ybWFsaXplcntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLm5vcm1hbGl6ZXJzPXQubm9ybWFsaXplcnMubWFwKHI9Pk5vcm1hbGl6ZXIuZnJvbUNvbmZpZyhyKSl9bm9ybWFsaXplKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZXJzLnJlZHVjZSgocixvKT0+by5ub3JtYWxpemUociksdCl9fWNsYXNzIEJlcnROb3JtYWxpemVyIGV4dGVuZHMgTm9ybWFsaXplcntfdG9rZW5pemVfY2hpbmVzZV9jaGFycyh0KXtjb25zdCByPVtdO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7KytvKXtjb25zdCB1PXRbb10saD11LmNoYXJDb2RlQXQoMCk7dGhpcy5faXNfY2hpbmVzZV9jaGFyKGgpPyhyLnB1c2goIiAiKSxyLnB1c2godSksci5wdXNoKCIgIikpOnIucHVzaCh1KX1yZXR1cm4gci5qb2luKCIiKX1faXNfY2hpbmVzZV9jaGFyKHQpe3JldHVybiB0Pj0xOTk2OCYmdDw9NDA5NTl8fHQ+PTEzMzEyJiZ0PD0xOTkwM3x8dD49MTMxMDcyJiZ0PD0xNzM3OTF8fHQ+PTE3MzgyNCYmdDw9MTc3OTgzfHx0Pj0xNzc5ODQmJnQ8PTE3ODIwN3x8dD49MTc4MjA4JiZ0PD0xODM5ODN8fHQ+PTYzNzQ0JiZ0PD02NDI1NXx8dD49MTk0NTYwJiZ0PD0xOTUxMDN9c3RyaXBBY2NlbnRzKHQpe3JldHVybiB0Lm5vcm1hbGl6ZSgiTkZEIikucmVwbGFjZSgvW1x1MDMwMC1cdTAzNmZdL2csIiIpfV9pc19jb250cm9sKHQpe3N3aXRjaCh0KXtjYXNlIgkiOmNhc2VgCmA6Y2FzZSJcciI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4gbmV3IFJlZ0V4cCgiXlxccHtDY318XFxwe0NmfXxcXHB7Q299fFxccHtDc30kIiwidSIpLnRlc3QodCl9fV9jbGVhbl90ZXh0KHQpe2NvbnN0IHI9W107Zm9yKGNvbnN0IG8gb2YgdCl7Y29uc3QgdT1vLmNoYXJDb2RlQXQoMCk7dT09PTB8fHU9PT02NTUzM3x8dGhpcy5faXNfY29udHJvbChvKXx8KC9eXHMkLy50ZXN0KG8pP3IucHVzaCgiICIpOnIucHVzaChvKSl9cmV0dXJuIHIuam9pbigiIil9bm9ybWFsaXplKHQpe3JldHVybiB0aGlzLmNvbmZpZy5jbGVhbl90ZXh0JiYodD10aGlzLl9jbGVhbl90ZXh0KHQpKSx0aGlzLmNvbmZpZy5oYW5kbGVfY2hpbmVzZV9jaGFycyYmKHQ9dGhpcy5fdG9rZW5pemVfY2hpbmVzZV9jaGFycyh0KSksdGhpcy5jb25maWcubG93ZXJjYXNlPyh0PXQudG9Mb3dlckNhc2UoKSx0aGlzLmNvbmZpZy5zdHJpcF9hY2NlbnRzIT09ITEmJih0PXRoaXMuc3RyaXBBY2NlbnRzKHQpKSk6dGhpcy5jb25maWcuc3RyaXBfYWNjZW50cyYmKHQ9dGhpcy5zdHJpcEFjY2VudHModCkpLHR9fWNsYXNzIFByZVRva2VuaXplciBleHRlbmRzIENhbGxhYmxle3N0YXRpYyBmcm9tQ29uZmlnKHQpe2lmKHQ9PT1udWxsKXJldHVybiBudWxsO3N3aXRjaCh0LnR5cGUpe2Nhc2UiQmVydFByZVRva2VuaXplciI6cmV0dXJuIG5ldyBCZXJ0UHJlVG9rZW5pemVyKHQpO2Nhc2UiU2VxdWVuY2UiOnJldHVybiBuZXcgUHJlVG9rZW5pemVyU2VxdWVuY2UodCk7Y2FzZSJXaGl0ZXNwYWNlIjpyZXR1cm4gbmV3IFdoaXRlc3BhY2VQcmVUb2tlbml6ZXIodCk7Y2FzZSJXaGl0ZXNwYWNlU3BsaXQiOnJldHVybiBuZXcgV2hpdGVzcGFjZVNwbGl0KHQpO2Nhc2UiTWV0YXNwYWNlIjpyZXR1cm4gbmV3IE1ldGFzcGFjZVByZVRva2VuaXplcih0KTtjYXNlIkJ5dGVMZXZlbCI6cmV0dXJuIG5ldyBCeXRlTGV2ZWxQcmVUb2tlbml6ZXIodCk7Y2FzZSJTcGxpdCI6cmV0dXJuIG5ldyBTcGxpdFByZVRva2VuaXplcih0KTtjYXNlIlB1bmN0dWF0aW9uIjpyZXR1cm4gbmV3IFB1bmN0dWF0aW9uUHJlVG9rZW5pemVyKHQpO2Nhc2UiRGlnaXRzIjpyZXR1cm4gbmV3IERpZ2l0c1ByZVRva2VuaXplcih0KTtjYXNlIlJlcGxhY2UiOnJldHVybiBuZXcgUmVwbGFjZVByZVRva2VuaXplcih0KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5rbm93biBQcmVUb2tlbml6ZXIgdHlwZTogJHt0LnR5cGV9YCl9fXByZV90b2tlbml6ZV90ZXh0KHQscil7dGhyb3cgRXJyb3IoInByZV90b2tlbml6ZV90ZXh0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcy4iKX1wcmVfdG9rZW5pemUodCxyKXtyZXR1cm4oQXJyYXkuaXNBcnJheSh0KT90Lm1hcChvPT50aGlzLnByZV90b2tlbml6ZV90ZXh0KG8scikpOnRoaXMucHJlX3Rva2VuaXplX3RleHQodCxyKSkuZmxhdCgpfV9jYWxsKHQscil7cmV0dXJuIHRoaXMucHJlX3Rva2VuaXplKHQscil9fWNsYXNzIEJlcnRQcmVUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUb2tlbml6ZXJ7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnBhdHRlcm49bmV3IFJlZ0V4cChgW15cXHMke1BVTkNUVUFUSU9OX1JFR0VYfV0rfFske1BVTkNUVUFUSU9OX1JFR0VYfV1gLCJndSIpfXByZV90b2tlbml6ZV90ZXh0KHQscil7cmV0dXJuIHQudHJpbSgpLm1hdGNoKHRoaXMucGF0dGVybil8fFtdfX1jbGFzcyBCeXRlTGV2ZWxQcmVUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUb2tlbml6ZXJ7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmNvbmZpZz10LHRoaXMuYWRkX3ByZWZpeF9zcGFjZT10aGlzLmNvbmZpZy5hZGRfcHJlZml4X3NwYWNlLHRoaXMudHJpbV9vZmZzZXRzPXRoaXMuY29uZmlnLnRyaW1fb2Zmc2V0cyx0aGlzLnVzZV9yZWdleD10aGlzLmNvbmZpZy51c2VfcmVnZXg/PyEwLHRoaXMucGF0dGVybj1uZXcgUmVnRXhwKCInc3wndHwncmV8J3ZlfCdtfCdsbHwnZHwgP1xccHtMfSt8ID9cXHB7Tn0rfCA/W15cXHNcXHB7TH1cXHB7Tn1dK3xcXHMrKD8hXFxTKXxcXHMrIiwiZ3UiKSx0aGlzLmJ5dGVfZW5jb2Rlcj1CWVRFU19UT19VTklDT0RFLHRoaXMudGV4dF9lbmNvZGVyPW5ldyBUZXh0RW5jb2Rlcn1wcmVfdG9rZW5pemVfdGV4dCh0LHIpe3JldHVybiB0aGlzLmFkZF9wcmVmaXhfc3BhY2UmJiF0LnN0YXJ0c1dpdGgoIiAiKSYmKHQ9IiAiK3QpLCh0aGlzLnVzZV9yZWdleD90Lm1hdGNoKHRoaXMucGF0dGVybil8fFtdOlt0XSkubWFwKHU9PkFycmF5LmZyb20odGhpcy50ZXh0X2VuY29kZXIuZW5jb2RlKHUpLGg9PnRoaXMuYnl0ZV9lbmNvZGVyW2hdKS5qb2luKCIiKSl9fWNsYXNzIFNwbGl0UHJlVG9rZW5pemVyIGV4dGVuZHMgUHJlVG9rZW5pemVye2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5jb25maWc9dCx0aGlzLnBhdHRlcm49Y3JlYXRlUGF0dGVybih0aGlzLmNvbmZpZy5wYXR0ZXJuLHRoaXMuY29uZmlnLmludmVydCl9cHJlX3Rva2VuaXplX3RleHQodCxyKXtyZXR1cm4gdGhpcy5wYXR0ZXJuPT09bnVsbD9bXTp0aGlzLmNvbmZpZy5pbnZlcnQ/dC5tYXRjaCh0aGlzLnBhdHRlcm4pfHxbXTpyZWdleFNwbGl0KHQsdGhpcy5wYXR0ZXJuKX19Y2xhc3MgUHVuY3R1YXRpb25QcmVUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUb2tlbml6ZXJ7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmNvbmZpZz10LHRoaXMucGF0dGVybj1uZXcgUmVnRXhwKGBbXiR7UFVOQ1RVQVRJT05fUkVHRVh9XSt8WyR7UFVOQ1RVQVRJT05fUkVHRVh9XStgLCJndSIpfXByZV90b2tlbml6ZV90ZXh0KHQscil7cmV0dXJuIHQubWF0Y2godGhpcy5wYXR0ZXJuKXx8W119fWNsYXNzIERpZ2l0c1ByZVRva2VuaXplciBleHRlbmRzIFByZVRva2VuaXplcntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuY29uZmlnPXQ7Y29uc3Qgcj1gW15cXGRdK3xcXGQke3RoaXMuY29uZmlnLmluZGl2aWR1YWxfZGlnaXRzPyIiOiIrIn1gO3RoaXMucGF0dGVybj1uZXcgUmVnRXhwKHIsImd1Iil9cHJlX3Rva2VuaXplX3RleHQodCxyKXtyZXR1cm4gdC5tYXRjaCh0aGlzLnBhdHRlcm4pfHxbXX19Y2xhc3MgUG9zdFByb2Nlc3NvciBleHRlbmRzIENhbGxhYmxle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5jb25maWc9dH1zdGF0aWMgZnJvbUNvbmZpZyh0KXtpZih0PT09bnVsbClyZXR1cm4gbnVsbDtzd2l0Y2godC50eXBlKXtjYXNlIlRlbXBsYXRlUHJvY2Vzc2luZyI6cmV0dXJuIG5ldyBUZW1wbGF0ZVByb2Nlc3NpbmcodCk7Y2FzZSJCeXRlTGV2ZWwiOnJldHVybiBuZXcgQnl0ZUxldmVsUG9zdFByb2Nlc3Nvcih0KTtjYXNlIlJvYmVydGFQcm9jZXNzaW5nIjpyZXR1cm4gbmV3IFJvYmVydGFQcm9jZXNzaW5nKHQpO2Nhc2UiQmVydFByb2Nlc3NpbmciOnJldHVybiBuZXcgQmVydFByb2Nlc3NpbmcodCk7Y2FzZSJTZXF1ZW5jZSI6cmV0dXJuIG5ldyBQb3N0UHJvY2Vzc29yU2VxdWVuY2UodCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gUG9zdFByb2Nlc3NvciB0eXBlOiAke3QudHlwZX1gKX19cG9zdF9wcm9jZXNzKHQsLi4ucil7dGhyb3cgRXJyb3IoInBvc3RfcHJvY2VzcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MuIil9X2NhbGwodCwuLi5yKXtyZXR1cm4gdGhpcy5wb3N0X3Byb2Nlc3ModCwuLi5yKX19Y2xhc3MgQmVydFByb2Nlc3NpbmcgZXh0ZW5kcyBQb3N0UHJvY2Vzc29ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuY2xzPXQuY2xzWzBdLHRoaXMuc2VwPXQuc2VwWzBdfXBvc3RfcHJvY2Vzcyh0LHI9bnVsbCx7YWRkX3NwZWNpYWxfdG9rZW5zOm89ITB9PXt9KXtvJiYodD1tZXJnZUFycmF5cyhbdGhpcy5jbHNdLHQsW3RoaXMuc2VwXSkpO2xldCB1PW5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbCgwKTtpZihyIT09bnVsbCl7Y29uc3QgaD1vJiZ0aGlzIGluc3RhbmNlb2YgUm9iZXJ0YVByb2Nlc3Npbmc/W3RoaXMuc2VwXTpbXSxhPW8/W3RoaXMuc2VwXTpbXTt0PW1lcmdlQXJyYXlzKHQsaCxyLGEpLHU9bWVyZ2VBcnJheXModSxuZXcgQXJyYXkoci5sZW5ndGgraC5sZW5ndGgrYS5sZW5ndGgpLmZpbGwoMSkpfXJldHVybnt0b2tlbnM6dCx0b2tlbl90eXBlX2lkczp1fX19Y2xhc3MgUm9iZXJ0YVByb2Nlc3NpbmcgZXh0ZW5kcyBCZXJ0UHJvY2Vzc2luZ3t9Y2xhc3MgVGVtcGxhdGVQcm9jZXNzaW5nIGV4dGVuZHMgUG9zdFByb2Nlc3Nvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnNpbmdsZT10LnNpbmdsZSx0aGlzLnBhaXI9dC5wYWlyfXBvc3RfcHJvY2Vzcyh0LHI9bnVsbCx7YWRkX3NwZWNpYWxfdG9rZW5zOm89ITB9PXt9KXtjb25zdCB1PXI9PT1udWxsP3RoaXMuc2luZ2xlOnRoaXMucGFpcjtsZXQgaD1bXSxhPVtdO2Zvcihjb25zdCBwIG9mIHUpIlNwZWNpYWxUb2tlbiJpbiBwP28mJihoLnB1c2gocC5TcGVjaWFsVG9rZW4uaWQpLGEucHVzaChwLlNwZWNpYWxUb2tlbi50eXBlX2lkKSk6IlNlcXVlbmNlImluIHAmJihwLlNlcXVlbmNlLmlkPT09IkEiPyhoPW1lcmdlQXJyYXlzKGgsdCksYT1tZXJnZUFycmF5cyhhLG5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbChwLlNlcXVlbmNlLnR5cGVfaWQpKSk6cC5TZXF1ZW5jZS5pZD09PSJCIiYmKGg9bWVyZ2VBcnJheXMoaCxyKSxhPW1lcmdlQXJyYXlzKGEsbmV3IEFycmF5KHIubGVuZ3RoKS5maWxsKHAuU2VxdWVuY2UudHlwZV9pZCkpKSk7cmV0dXJue3Rva2VuczpoLHRva2VuX3R5cGVfaWRzOmF9fX1jbGFzcyBCeXRlTGV2ZWxQb3N0UHJvY2Vzc29yIGV4dGVuZHMgUG9zdFByb2Nlc3Nvcntwb3N0X3Byb2Nlc3ModCxyPW51bGwpe3JldHVybiByJiYodD1tZXJnZUFycmF5cyh0LHIpKSx7dG9rZW5zOnR9fX1jbGFzcyBQb3N0UHJvY2Vzc29yU2VxdWVuY2UgZXh0ZW5kcyBQb3N0UHJvY2Vzc29ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMucHJvY2Vzc29ycz10LnByb2Nlc3NvcnMubWFwKHI9PlBvc3RQcm9jZXNzb3IuZnJvbUNvbmZpZyhyKSl9cG9zdF9wcm9jZXNzKHQscj1udWxsLG89e30pe2xldCB1O2Zvcihjb25zdCBoIG9mIHRoaXMucHJvY2Vzc29ycylpZihoIGluc3RhbmNlb2YgQnl0ZUxldmVsUG9zdFByb2Nlc3Nvcil0PWgucG9zdF9wcm9jZXNzKHQpLnRva2VucyxyJiYocj1oLnBvc3RfcHJvY2VzcyhyKS50b2tlbnMpO2Vsc2V7Y29uc3QgYT1oLnBvc3RfcHJvY2Vzcyh0LHIsbyk7dD1hLnRva2Vucyx1PWEudG9rZW5fdHlwZV9pZHN9cmV0dXJue3Rva2Vuczp0LHRva2VuX3R5cGVfaWRzOnV9fX1jbGFzcyBEZWNvZGVyIGV4dGVuZHMgQ2FsbGFibGV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmNvbmZpZz10LHRoaXMuYWRkZWRfdG9rZW5zPVtdLHRoaXMuZW5kX29mX3dvcmRfc3VmZml4PW51bGwsdGhpcy50cmltX29mZnNldHM9dC50cmltX29mZnNldHN9c3RhdGljIGZyb21Db25maWcodCl7aWYodD09PW51bGwpcmV0dXJuIG51bGw7c3dpdGNoKHQudHlwZSl7Y2FzZSJXb3JkUGllY2UiOnJldHVybiBuZXcgV29yZFBpZWNlRGVjb2Rlcih0KTtjYXNlIk1ldGFzcGFjZSI6cmV0dXJuIG5ldyBNZXRhc3BhY2VEZWNvZGVyKHQpO2Nhc2UiQnl0ZUxldmVsIjpyZXR1cm4gbmV3IEJ5dGVMZXZlbERlY29kZXIodCk7Y2FzZSJSZXBsYWNlIjpyZXR1cm4gbmV3IFJlcGxhY2VEZWNvZGVyKHQpO2Nhc2UiQnl0ZUZhbGxiYWNrIjpyZXR1cm4gbmV3IEJ5dGVGYWxsYmFjayh0KTtjYXNlIkZ1c2UiOnJldHVybiBuZXcgRnVzZURlY29kZXIodCk7Y2FzZSJTdHJpcCI6cmV0dXJuIG5ldyBTdHJpcERlY29kZXIodCk7Y2FzZSJTZXF1ZW5jZSI6cmV0dXJuIG5ldyBEZWNvZGVyU2VxdWVuY2UodCk7Y2FzZSJDVEMiOnJldHVybiBuZXcgQ1RDRGVjb2Rlcih0KTtjYXNlIkJQRURlY29kZXIiOnJldHVybiBuZXcgQlBFRGVjb2Rlcih0KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5rbm93biBEZWNvZGVyIHR5cGU6ICR7dC50eXBlfWApfX1fY2FsbCh0KXtyZXR1cm4gdGhpcy5kZWNvZGUodCl9ZGVjb2RlKHQpe3JldHVybiB0aGlzLmRlY29kZV9jaGFpbih0KS5qb2luKCIiKX1kZWNvZGVfY2hhaW4odCl7dGhyb3cgRXJyb3IoImBkZWNvZGVfY2hhaW5gIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcy4iKX19Y2xhc3MgUmVwbGFjZURlY29kZXIgZXh0ZW5kcyBEZWNvZGVye2RlY29kZV9jaGFpbih0KXtjb25zdCByPWNyZWF0ZVBhdHRlcm4odGhpcy5jb25maWcucGF0dGVybik7cmV0dXJuIHI9PT1udWxsP3Q6dC5tYXAobz0+by5yZXBsYWNlQWxsKHIsdGhpcy5jb25maWcuY29udGVudCkpfX1jbGFzcyBCeXRlRmFsbGJhY2sgZXh0ZW5kcyBEZWNvZGVye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMudGV4dF9kZWNvZGVyPW5ldyBUZXh0RGVjb2Rlcn1kZWNvZGVfY2hhaW4odCl7Y29uc3Qgcj1bXTtsZXQgbz1bXTtmb3IoY29uc3QgdSBvZiB0KXtsZXQgaD1udWxsO2lmKHUubGVuZ3RoPT09NiYmdS5zdGFydHNXaXRoKCI8MHgiKSYmdS5lbmRzV2l0aCgiPiIpKXtjb25zdCBhPXBhcnNlSW50KHUuc2xpY2UoMyw1KSwxNik7aXNOYU4oYSl8fChoPWEpfWlmKGghPT1udWxsKW8ucHVzaChoKTtlbHNle2lmKG8ubGVuZ3RoPjApe2NvbnN0IGE9dGhpcy50ZXh0X2RlY29kZXIuZGVjb2RlKFVpbnQ4QXJyYXkuZnJvbShvKSk7ci5wdXNoKGEpLG89W119ci5wdXNoKHUpfX1pZihvLmxlbmd0aD4wKXtjb25zdCB1PXRoaXMudGV4dF9kZWNvZGVyLmRlY29kZShVaW50OEFycmF5LmZyb20obykpO3IucHVzaCh1KSxvPVtdfXJldHVybiByfX1jbGFzcyBGdXNlRGVjb2RlciBleHRlbmRzIERlY29kZXJ7ZGVjb2RlX2NoYWluKHQpe3JldHVyblt0LmpvaW4oIiIpXX19Y2xhc3MgU3RyaXBEZWNvZGVyIGV4dGVuZHMgRGVjb2Rlcntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLmNvbnRlbnQ9dGhpcy5jb25maWcuY29udGVudCx0aGlzLnN0YXJ0PXRoaXMuY29uZmlnLnN0YXJ0LHRoaXMuc3RvcD10aGlzLmNvbmZpZy5zdG9wfWRlY29kZV9jaGFpbih0KXtyZXR1cm4gdC5tYXAocj0+e2xldCBvPTA7Zm9yKGxldCBoPTA7aDx0aGlzLnN0YXJ0JiZyW2hdPT09dGhpcy5jb250ZW50OysraCl7bz1oKzE7Y29udGludWV9bGV0IHU9ci5sZW5ndGg7Zm9yKGxldCBoPTA7aDx0aGlzLnN0b3A7KytoKXtjb25zdCBhPXIubGVuZ3RoLWgtMTtpZihyW2FdPT09dGhpcy5jb250ZW50KXt1PWE7Y29udGludWV9ZWxzZSBicmVha31yZXR1cm4gci5zbGljZShvLHUpfSl9fWNsYXNzIFdvcmRQaWVjZURlY29kZXIgZXh0ZW5kcyBEZWNvZGVye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuY2xlYW51cD10LmNsZWFudXB9ZGVjb2RlX2NoYWluKHQpe3JldHVybiB0Lm1hcCgocixvKT0+KG8hPT0wJiYoci5zdGFydHNXaXRoKHRoaXMuY29uZmlnLnByZWZpeCk/cj1yLnJlcGxhY2UodGhpcy5jb25maWcucHJlZml4LCIiKTpyPSIgIityKSx0aGlzLmNsZWFudXAmJihyPWNsZWFuX3VwX3Rva2VuaXphdGlvbihyKSkscikpfX1jbGFzcyBCeXRlTGV2ZWxEZWNvZGVyIGV4dGVuZHMgRGVjb2Rlcntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLmJ5dGVfZGVjb2Rlcj1VTklDT0RFX1RPX0JZVEVTLHRoaXMudGV4dF9kZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtmYXRhbDohMSxpZ25vcmVCT006ITB9KSx0aGlzLmVuZF9vZl93b3JkX3N1ZmZpeD1udWxsfWNvbnZlcnRfdG9rZW5zX3RvX3N0cmluZyh0KXtjb25zdCByPXQuam9pbigiIiksbz1uZXcgVWludDhBcnJheShbLi4ucl0ubWFwKGg9PnRoaXMuYnl0ZV9kZWNvZGVyW2hdKSk7cmV0dXJuIHRoaXMudGV4dF9kZWNvZGVyLmRlY29kZShvKX1kZWNvZGVfY2hhaW4odCl7Y29uc3Qgcj1bXTtsZXQgbz1bXTtmb3IoY29uc3QgdSBvZiB0KXRoaXMuYWRkZWRfdG9rZW5zLmZpbmQoaD0+aC5jb250ZW50PT09dSkhPT12b2lkIDA/KG8ubGVuZ3RoPjAmJihyLnB1c2godGhpcy5jb252ZXJ0X3Rva2Vuc190b19zdHJpbmcobykpLG89W10pLHIucHVzaCh1KSk6by5wdXNoKHUpO3JldHVybiBvLmxlbmd0aD4wJiZyLnB1c2godGhpcy5jb252ZXJ0X3Rva2Vuc190b19zdHJpbmcobykpLHJ9fWNsYXNzIENUQ0RlY29kZXIgZXh0ZW5kcyBEZWNvZGVye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMucGFkX3Rva2VuPXRoaXMuY29uZmlnLnBhZF90b2tlbix0aGlzLndvcmRfZGVsaW1pdGVyX3Rva2VuPXRoaXMuY29uZmlnLndvcmRfZGVsaW1pdGVyX3Rva2VuLHRoaXMuY2xlYW51cD10aGlzLmNvbmZpZy5jbGVhbnVwfWNvbnZlcnRfdG9rZW5zX3RvX3N0cmluZyh0KXtpZih0Lmxlbmd0aD09PTApcmV0dXJuIiI7Y29uc3Qgcj1bdFswXV07Zm9yKGxldCBoPTE7aDx0Lmxlbmd0aDsrK2gpdFtoXSE9PXIuYXQoLTEpJiZyLnB1c2godFtoXSk7bGV0IHU9ci5maWx0ZXIoaD0+aCE9PXRoaXMucGFkX3Rva2VuKS5qb2luKCIiKTtyZXR1cm4gdGhpcy5jbGVhbnVwJiYodT1jbGVhbl91cF90b2tlbml6YXRpb24odSkucmVwbGFjZUFsbCh0aGlzLndvcmRfZGVsaW1pdGVyX3Rva2VuLCIgIikudHJpbSgpKSx1fWRlY29kZV9jaGFpbih0KXtyZXR1cm5bdGhpcy5jb252ZXJ0X3Rva2Vuc190b19zdHJpbmcodCldfX1jbGFzcyBEZWNvZGVyU2VxdWVuY2UgZXh0ZW5kcyBEZWNvZGVye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuZGVjb2RlcnM9dC5kZWNvZGVycy5tYXAocj0+RGVjb2Rlci5mcm9tQ29uZmlnKHIpKX1kZWNvZGVfY2hhaW4odCl7cmV0dXJuIHRoaXMuZGVjb2RlcnMucmVkdWNlKChyLG8pPT5vLmRlY29kZV9jaGFpbihyKSx0KX19Y2xhc3MgQlBFRGVjb2RlciBleHRlbmRzIERlY29kZXJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5zdWZmaXg9dGhpcy5jb25maWcuc3VmZml4fWRlY29kZV9jaGFpbih0KXtyZXR1cm4gdC5tYXAoKHIsbyk9PnIucmVwbGFjZUFsbCh0aGlzLnN1ZmZpeCxvPT09dC5sZW5ndGgtMT8iIjoiICIpKX19Y2xhc3MgVml0c0RlY29kZXIgZXh0ZW5kcyBEZWNvZGVye2RlY29kZV9jaGFpbih0KXtsZXQgcj0iIjtmb3IobGV0IG89MTtvPHQubGVuZ3RoO28rPTIpcis9dFtvXTtyZXR1cm5bcl19fWNsYXNzIE1ldGFzcGFjZVByZVRva2VuaXplciBleHRlbmRzIFByZVRva2VuaXplcntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuYWRkUHJlZml4U3BhY2U9dC5hZGRfcHJlZml4X3NwYWNlLHRoaXMucmVwbGFjZW1lbnQ9dC5yZXBsYWNlbWVudCx0aGlzLnN0clJlcD10LnN0cl9yZXB8fHRoaXMucmVwbGFjZW1lbnQsdGhpcy5wcmVwZW5kX3NjaGVtZT10LnByZXBlbmRfc2NoZW1lPz8iYWx3YXlzIn1wcmVfdG9rZW5pemVfdGV4dCh0LHtzZWN0aW9uX2luZGV4OnI9dm9pZCAwfT17fSl7bGV0IG89dC5yZXBsYWNlQWxsKCIgIix0aGlzLnN0clJlcCk7cmV0dXJuIHRoaXMuYWRkUHJlZml4U3BhY2UmJiFvLnN0YXJ0c1dpdGgodGhpcy5yZXBsYWNlbWVudCkmJih0aGlzLnByZXBlbmRfc2NoZW1lPT09ImFsd2F5cyJ8fHRoaXMucHJlcGVuZF9zY2hlbWU9PT0iZmlyc3QiJiZyPT09MCkmJihvPXRoaXMuc3RyUmVwK28pLFtvXX19Y2xhc3MgTWV0YXNwYWNlRGVjb2RlciBleHRlbmRzIERlY29kZXJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5hZGRQcmVmaXhTcGFjZT10LmFkZF9wcmVmaXhfc3BhY2UsdGhpcy5yZXBsYWNlbWVudD10LnJlcGxhY2VtZW50fWRlY29kZV9jaGFpbih0KXtjb25zdCByPVtdO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7KytvKXtsZXQgdT10W29dLnJlcGxhY2VBbGwodGhpcy5yZXBsYWNlbWVudCwiICIpO3RoaXMuYWRkUHJlZml4U3BhY2UmJm89PTAmJnUuc3RhcnRzV2l0aCgiICIpJiYodT11LnN1YnN0cmluZygxKSksci5wdXNoKHUpfXJldHVybiByfX1jbGFzcyBQcmVjb21waWxlZCBleHRlbmRzIE5vcm1hbGl6ZXJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5jaGFyc21hcD10LnByZWNvbXBpbGVkX2NoYXJzbWFwfW5vcm1hbGl6ZSh0KXtyZXR1cm4gdD10LnJlcGxhY2UoL1tcdTAwMDEtXHUwMDA4XHUwMDBCXHUwMDBFLVx1MDAxRlx1MDA3Rlx1MDA4Rlx1MDA5Rl0vZ20sIiIpLHQ9dC5yZXBsYWNlKC9bXHUwMDA5XHUwMDBBXHUwMDBDXHUwMDBEXHUxNjgwXHUyMDBCXHUyMDBDXHUyMDBFXHUyMDBGXHUyMDI4XHUyMDI5XHUyNTgxXHVGRUZGXHVGRkZEXS9nbSwiICIpLHQuaW5jbHVkZXMoIu+9niIpP3Q9dC5zcGxpdCgi772eIikubWFwKG89Pm8ubm9ybWFsaXplKCJORktDIikpLmpvaW4oIu+9niIpOnQ9dC5ub3JtYWxpemUoIk5GS0MiKSx0fX1jbGFzcyBQcmVUb2tlbml6ZXJTZXF1ZW5jZSBleHRlbmRzIFByZVRva2VuaXplcntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudG9rZW5pemVycz10LnByZXRva2VuaXplcnMubWFwKHI9PlByZVRva2VuaXplci5mcm9tQ29uZmlnKHIpKX1wcmVfdG9rZW5pemVfdGV4dCh0LHIpe3JldHVybiB0aGlzLnRva2VuaXplcnMucmVkdWNlKChvLHUpPT51LnByZV90b2tlbml6ZShvLHIpLFt0XSl9fWNsYXNzIFdoaXRlc3BhY2VQcmVUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUb2tlbml6ZXJ7Y29uc3RydWN0b3IodCl7c3VwZXIoKX1wcmVfdG9rZW5pemVfdGV4dCh0LHIpe3JldHVybiB0Lm1hdGNoKC9cdyt8W15cd1xzXSsvZyl8fFtdfX1jbGFzcyBXaGl0ZXNwYWNlU3BsaXQgZXh0ZW5kcyBQcmVUb2tlbml6ZXJ7Y29uc3RydWN0b3IodCl7c3VwZXIoKX1wcmVfdG9rZW5pemVfdGV4dCh0LHIpe3JldHVybiB3aGl0ZXNwYWNlX3NwbGl0KHQpfX1jbGFzcyBSZXBsYWNlUHJlVG9rZW5pemVyIGV4dGVuZHMgUHJlVG9rZW5pemVye2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5jb25maWc9dCx0aGlzLnBhdHRlcm49Y3JlYXRlUGF0dGVybih0aGlzLmNvbmZpZy5wYXR0ZXJuKSx0aGlzLmNvbnRlbnQ9dGhpcy5jb25maWcuY29udGVudH1wcmVfdG9rZW5pemVfdGV4dCh0LHIpe3JldHVybiB0aGlzLnBhdHRlcm49PT1udWxsP1t0XTpbdC5yZXBsYWNlQWxsKHRoaXMucGF0dGVybix0aGlzLmNvbmZpZy5jb250ZW50KV19fWNvbnN0IFNQRUNJQUxfVE9LRU5fQVRUUklCVVRFUz1bImJvc190b2tlbiIsImVvc190b2tlbiIsInVua190b2tlbiIsInNlcF90b2tlbiIsInBhZF90b2tlbiIsImNsc190b2tlbiIsIm1hc2tfdG9rZW4iXTtmdW5jdGlvbiBwYWRIZWxwZXIoYyx0LHIsbyl7Zm9yKGNvbnN0IHUgb2YgT2JqZWN0LmtleXMoYykpe2NvbnN0IGg9dC1jW3VdLmxlbmd0aCxhPXIodSkscD1uZXcgQXJyYXkoaCkuZmlsbChhKTtjW3VdPW89PT0icmlnaHQiP21lcmdlQXJyYXlzKGNbdV0scCk6bWVyZ2VBcnJheXMocCxjW3VdKX19ZnVuY3Rpb24gdHJ1bmNhdGVIZWxwZXIoYyx0KXtmb3IoY29uc3QgciBvZiBPYmplY3Qua2V5cyhjKSljW3JdLmxlbmd0aD10fWNsYXNzIFByZVRyYWluZWRUb2tlbml6ZXIgZXh0ZW5kcyBDYWxsYWJsZXtjb25zdHJ1Y3RvcihyLG8pe3N1cGVyKCk7Syh0aGlzLCJyZXR1cm5fdG9rZW5fdHlwZV9pZHMiLCExKTtLKHRoaXMsIl9kZWZhdWx0X2NoYXRfdGVtcGxhdGUiLGB7JSBmb3IgbWVzc2FnZSBpbiBtZXNzYWdlcyAlfXt7Jzx8aW1fc3RhcnR8PicgKyBtZXNzYWdlWydyb2xlJ10gKyAnCicgKyBtZXNzYWdlWydjb250ZW50J10gKyAnPHxpbV9lbmR8PicgKyAnCid9fXslIGVuZGZvciAlfXslIGlmIGFkZF9nZW5lcmF0aW9uX3Byb21wdCAlfXt7ICc8fGltX3N0YXJ0fD5hc3Npc3RhbnQKJyB9fXslIGVuZGlmICV9YCk7dGhpcy5fdG9rZW5pemVyX2NvbmZpZz1vLHRoaXMubm9ybWFsaXplcj1Ob3JtYWxpemVyLmZyb21Db25maWcoci5ub3JtYWxpemVyKSx0aGlzLnByZV90b2tlbml6ZXI9UHJlVG9rZW5pemVyLmZyb21Db25maWcoci5wcmVfdG9rZW5pemVyKSx0aGlzLm1vZGVsPVRva2VuaXplck1vZGVsLmZyb21Db25maWcoci5tb2RlbCxvKSx0aGlzLnBvc3RfcHJvY2Vzc29yPVBvc3RQcm9jZXNzb3IuZnJvbUNvbmZpZyhyLnBvc3RfcHJvY2Vzc29yKSx0aGlzLmRlY29kZXI9RGVjb2Rlci5mcm9tQ29uZmlnKHIuZGVjb2RlciksdGhpcy5zcGVjaWFsX3Rva2Vucz1bXSx0aGlzLmFsbF9zcGVjaWFsX2lkcz1bXSx0aGlzLmFkZGVkX3Rva2Vucz1bXTtmb3IoY29uc3QgdSBvZiByLmFkZGVkX3Rva2Vucyl7Y29uc3QgaD1uZXcgQWRkZWRUb2tlbih1KTt0aGlzLmFkZGVkX3Rva2Vucy5wdXNoKGgpLHRoaXMubW9kZWwudG9rZW5zX3RvX2lkcy5zZXQoaC5jb250ZW50LGguaWQpLHRoaXMubW9kZWwudm9jYWJbaC5pZF09aC5jb250ZW50LGguc3BlY2lhbCYmKHRoaXMuc3BlY2lhbF90b2tlbnMucHVzaChoLmNvbnRlbnQpLHRoaXMuYWxsX3NwZWNpYWxfaWRzLnB1c2goaC5pZCkpfWlmKHRoaXMuYWRkaXRpb25hbF9zcGVjaWFsX3Rva2Vucz1vLmFkZGl0aW9uYWxfc3BlY2lhbF90b2tlbnM/P1tdLHRoaXMuc3BlY2lhbF90b2tlbnMucHVzaCguLi50aGlzLmFkZGl0aW9uYWxfc3BlY2lhbF90b2tlbnMpLHRoaXMuc3BlY2lhbF90b2tlbnM9Wy4uLm5ldyBTZXQodGhpcy5zcGVjaWFsX3Rva2VucyldLHRoaXMuZGVjb2RlciYmKHRoaXMuZGVjb2Rlci5hZGRlZF90b2tlbnM9dGhpcy5hZGRlZF90b2tlbnMsdGhpcy5kZWNvZGVyLmVuZF9vZl93b3JkX3N1ZmZpeD10aGlzLm1vZGVsLmVuZF9vZl93b3JkX3N1ZmZpeCksdGhpcy5hZGRlZF90b2tlbnNfcmVnZXg9dGhpcy5hZGRlZF90b2tlbnMubGVuZ3RoPjA/bmV3IFJlZ0V4cCh0aGlzLmFkZGVkX3Rva2Vucy5tYXAodT0+YCR7dS5sc3RyaXA/IlxccyoiOiIifSgke2VzY2FwZVJlZ0V4cCh1LmNvbnRlbnQpfSkke3UucnN0cmlwPyJcXHMqIjoiIn1gKS5qb2luKCJ8IikpOm51bGwsdGhpcy5tYXNrX3Rva2VuPXRoaXMuZ2V0VG9rZW4oIm1hc2tfdG9rZW4iKSx0aGlzLm1hc2tfdG9rZW5faWQ9dGhpcy5tb2RlbC50b2tlbnNfdG9faWRzLmdldCh0aGlzLm1hc2tfdG9rZW4pLHRoaXMucGFkX3Rva2VuPXRoaXMuZ2V0VG9rZW4oInBhZF90b2tlbiIsImVvc190b2tlbiIpLHRoaXMucGFkX3Rva2VuX2lkPXRoaXMubW9kZWwudG9rZW5zX3RvX2lkcy5nZXQodGhpcy5wYWRfdG9rZW4pLHRoaXMuc2VwX3Rva2VuPXRoaXMuZ2V0VG9rZW4oInNlcF90b2tlbiIpLHRoaXMuc2VwX3Rva2VuX2lkPXRoaXMubW9kZWwudG9rZW5zX3RvX2lkcy5nZXQodGhpcy5zZXBfdG9rZW4pLHRoaXMudW5rX3Rva2VuPXRoaXMuZ2V0VG9rZW4oInVua190b2tlbiIpLHRoaXMudW5rX3Rva2VuX2lkPXRoaXMubW9kZWwudG9rZW5zX3RvX2lkcy5nZXQodGhpcy51bmtfdG9rZW4pLHRoaXMubW9kZWxfbWF4X2xlbmd0aD1vLm1vZGVsX21heF9sZW5ndGgsdGhpcy5yZW1vdmVfc3BhY2U9by5yZW1vdmVfc3BhY2UsdGhpcy5jbGVhbl91cF90b2tlbml6YXRpb25fc3BhY2VzPW8uY2xlYW5fdXBfdG9rZW5pemF0aW9uX3NwYWNlcz8/ITAsdGhpcy5kb19sb3dlcmNhc2VfYW5kX3JlbW92ZV9hY2NlbnQ9by5kb19sb3dlcmNhc2VfYW5kX3JlbW92ZV9hY2NlbnQ/PyExLHRoaXMucGFkZGluZ19zaWRlPSJyaWdodCIsdGhpcy5sZWdhY3k9ITEsdGhpcy5jaGF0X3RlbXBsYXRlPW8uY2hhdF90ZW1wbGF0ZT8/bnVsbCxBcnJheS5pc0FycmF5KHRoaXMuY2hhdF90ZW1wbGF0ZSkpe2NvbnN0IHU9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IoY29uc3R7bmFtZTpoLHRlbXBsYXRlOmF9b2YgdGhpcy5jaGF0X3RlbXBsYXRlKXtpZih0eXBlb2YgaCE9InN0cmluZyJ8fHR5cGVvZiBhIT0ic3RyaW5nIil0aHJvdyBuZXcgRXJyb3IoJ0NoYXQgdGVtcGxhdGUgbXVzdCBiZSBhIGxpc3Qgb2Ygb2JqZWN0cyB3aXRoICJuYW1lIiBhbmQgInRlbXBsYXRlIiBwcm9wZXJ0aWVzJyk7dVtoXT1hfXRoaXMuY2hhdF90ZW1wbGF0ZT11fXRoaXMuX2NvbXBpbGVkX3RlbXBsYXRlX2NhY2hlPW5ldyBNYXB9Z2V0VG9rZW4oLi4ucil7Zm9yKGNvbnN0IG8gb2Ygcil7Y29uc3QgdT10aGlzLl90b2tlbml6ZXJfY29uZmlnW29dO2lmKHUpaWYodHlwZW9mIHU9PSJvYmplY3QiKXtpZih1Ll9fdHlwZT09PSJBZGRlZFRva2VuIilyZXR1cm4gdS5jb250ZW50O3Rocm93IEVycm9yKGBVbmtub3duIHRva2VuOiAke3V9YCl9ZWxzZSByZXR1cm4gdX1yZXR1cm4gbnVsbH1zdGF0aWMgYXN5bmMgZnJvbV9wcmV0cmFpbmVkKHIse3Byb2dyZXNzX2NhbGxiYWNrOm89bnVsbCxjb25maWc6dT1udWxsLGNhY2hlX2RpcjpoPW51bGwsbG9jYWxfZmlsZXNfb25seTphPSExLHJldmlzaW9uOnA9Im1haW4iLGxlZ2FjeTpmPW51bGx9PXt9KXtjb25zdCBkPWF3YWl0IGxvYWRUb2tlbml6ZXIocix7cHJvZ3Jlc3NfY2FsbGJhY2s6byxjb25maWc6dSxjYWNoZV9kaXI6aCxsb2NhbF9maWxlc19vbmx5OmEscmV2aXNpb246cCxsZWdhY3k6Zn0pO3JldHVybiBuZXcgdGhpcyguLi5kKX1fY2FsbChyLHt0ZXh0X3BhaXI6bz1udWxsLGFkZF9zcGVjaWFsX3Rva2Vuczp1PSEwLHBhZGRpbmc6aD0hMSx0cnVuY2F0aW9uOmE9bnVsbCxtYXhfbGVuZ3RoOnA9bnVsbCxyZXR1cm5fdGVuc29yOmY9ITAscmV0dXJuX3Rva2VuX3R5cGVfaWRzOmQ9bnVsbH09e30pe2NvbnN0IGw9QXJyYXkuaXNBcnJheShyKTtsZXQgbjtpZihsKXtpZihyLmxlbmd0aD09PTApdGhyb3cgRXJyb3IoInRleHQgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkiKTtpZihvIT09bnVsbCl7aWYoQXJyYXkuaXNBcnJheShvKSl7aWYoci5sZW5ndGghPT1vLmxlbmd0aCl0aHJvdyBFcnJvcigidGV4dCBhbmQgdGV4dF9wYWlyIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGgiKX1lbHNlIHRocm93IEVycm9yKCJ0ZXh0X3BhaXIgbXVzdCBhbHNvIGJlIGFuIGFycmF5Iik7bj1yLm1hcCgoaSxzKT0+dGhpcy5fZW5jb2RlX3BsdXMoaSxvW3NdLHthZGRfc3BlY2lhbF90b2tlbnM6dSxyZXR1cm5fdG9rZW5fdHlwZV9pZHM6ZH0pKX1lbHNlIG49ci5tYXAoaT0+dGhpcy5fZW5jb2RlX3BsdXMoaSxudWxsLHthZGRfc3BlY2lhbF90b2tlbnM6dSxyZXR1cm5fdG9rZW5fdHlwZV9pZHM6ZH0pKX1lbHNle2lmKHI9PW51bGwpdGhyb3cgRXJyb3IoInRleHQgbWF5IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCIpO2lmKEFycmF5LmlzQXJyYXkobykpdGhyb3cgRXJyb3IoIldoZW4gc3BlY2lmeWluZyBgdGV4dF9wYWlyYCwgc2luY2UgYHRleHRgIGlzIGEgc3RyaW5nLCBgdGV4dF9wYWlyYCBtdXN0IGFsc28gYmUgYSBzdHJpbmcgKGkuZS4sIG5vdCBhbiBhcnJheSkuIik7bj1bdGhpcy5fZW5jb2RlX3BsdXMocixvLHthZGRfc3BlY2lhbF90b2tlbnM6dSxyZXR1cm5fdG9rZW5fdHlwZV9pZHM6ZH0pXX1pZihwPT09bnVsbD9oPT09Im1heF9sZW5ndGgiP3A9dGhpcy5tb2RlbF9tYXhfbGVuZ3RoOnA9bWF4KG4ubWFwKGk9PmkuaW5wdXRfaWRzLmxlbmd0aCkpWzBdOmF8fGNvbnNvbGUud2FybigiVHJ1bmNhdGlvbiB3YXMgbm90IGV4cGxpY2l0bHkgYWN0aXZhdGVkIGJ1dCBgbWF4X2xlbmd0aGAgaXMgcHJvdmlkZWQgYSBzcGVjaWZpYyB2YWx1ZSwgcGxlYXNlIHVzZSBgdHJ1bmNhdGlvbj10cnVlYCB0byBleHBsaWNpdGx5IHRydW5jYXRlIGV4YW1wbGVzIHRvIG1heCBsZW5ndGguIikscD1NYXRoLm1pbihwLHRoaXMubW9kZWxfbWF4X2xlbmd0aCksaHx8YSlmb3IobGV0IGk9MDtpPG4ubGVuZ3RoOysraSluW2ldLmlucHV0X2lkcy5sZW5ndGghPT1wJiYobltpXS5pbnB1dF9pZHMubGVuZ3RoPnA/YSYmdHJ1bmNhdGVIZWxwZXIobltpXSxwKTpoJiZwYWRIZWxwZXIobltpXSxwLHM9PnM9PT0iaW5wdXRfaWRzIj90aGlzLnBhZF90b2tlbl9pZDowLHRoaXMucGFkZGluZ19zaWRlKSk7Y29uc3QgZT17fTtpZihmKXtpZighKGgmJmEpJiZuLnNvbWUocz0+e3ZhciBtO2Zvcihjb25zdCBnIG9mIE9iamVjdC5rZXlzKHMpKWlmKHNbZ10ubGVuZ3RoIT09KChtPW5bMF1bZ10pPT1udWxsP3ZvaWQgMDptLmxlbmd0aCkpcmV0dXJuITA7cmV0dXJuITF9KSl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSB0ZW5zb3IsIHlvdSBzaG91bGQgcHJvYmFibHkgYWN0aXZhdGUgdHJ1bmNhdGlvbiBhbmQvb3IgcGFkZGluZyB3aXRoICdwYWRkaW5nPXRydWUnIGFuZCAndHJ1bmNhdGlvbj10cnVlJyB0byBoYXZlIGJhdGNoZWQgdGVuc29ycyB3aXRoIHRoZSBzYW1lIGxlbmd0aC4iKTtjb25zdCBpPVtuLmxlbmd0aCxuWzBdLmlucHV0X2lkcy5sZW5ndGhdO2Zvcihjb25zdCBzIG9mIE9iamVjdC5rZXlzKG5bMF0pKWVbc109bmV3IFRlbnNvcigiaW50NjQiLEJpZ0ludDY0QXJyYXkuZnJvbShuLmZsYXRNYXAobT0+bVtzXSkubWFwKEJpZ0ludCkpLGkpfWVsc2V7Zm9yKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoblswXSkpZVtpXT1uLm1hcChzPT5zW2ldKTtpZighbClmb3IoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhlKSllW2ldPWVbaV1bMF19cmV0dXJuIGV9X2VuY29kZV90ZXh0KHIpe3JldHVybiByPT09bnVsbD9udWxsOih0aGlzLmFkZGVkX3Rva2Vuc19yZWdleD9yLnNwbGl0KHRoaXMuYWRkZWRfdG9rZW5zX3JlZ2V4KS5maWx0ZXIoaD0+aCk6W3JdKS5tYXAoKGgsYSk9PntpZih0aGlzLmFkZGVkX3Rva2Vucy5maW5kKGY9PmYuY29udGVudD09PWgpIT09dm9pZCAwKXJldHVybiBoO3tpZih0aGlzLnJlbW92ZV9zcGFjZT09PSEwJiYoaD1oLnRyaW0oKS5zcGxpdCgvXHMrLykuam9pbigiICIpKSx0aGlzLmRvX2xvd2VyY2FzZV9hbmRfcmVtb3ZlX2FjY2VudCYmKGg9bG93ZXJjYXNlX2FuZF9yZW1vdmVfYWNjZW50KGgpKSx0aGlzLm5vcm1hbGl6ZXIhPT1udWxsJiYoaD10aGlzLm5vcm1hbGl6ZXIoaCkpLGgubGVuZ3RoPT09MClyZXR1cm5bXTtjb25zdCBmPXRoaXMucHJlX3Rva2VuaXplciE9PW51bGw/dGhpcy5wcmVfdG9rZW5pemVyKGgse3NlY3Rpb25faW5kZXg6YX0pOltoXTtyZXR1cm4gdGhpcy5tb2RlbChmKX19KS5mbGF0KCl9X2VuY29kZV9wbHVzKHIsbz1udWxsLHthZGRfc3BlY2lhbF90b2tlbnM6dT0hMCxyZXR1cm5fdG9rZW5fdHlwZV9pZHM6aD1udWxsfT17fSl7Y29uc3QgYT10aGlzLl9lbmNvZGVfdGV4dChyKSxwPXRoaXMuX2VuY29kZV90ZXh0KG8pLGY9dGhpcy5wb3N0X3Byb2Nlc3Nvcj90aGlzLnBvc3RfcHJvY2Vzc29yKGEscCx7YWRkX3NwZWNpYWxfdG9rZW5zOnV9KTp7dG9rZW5zOm1lcmdlQXJyYXlzKGE/P1tdLHA/P1tdKX0sZD10aGlzLm1vZGVsLmNvbnZlcnRfdG9rZW5zX3RvX2lkcyhmLnRva2VucyksbD17aW5wdXRfaWRzOmQsYXR0ZW50aW9uX21hc2s6bmV3IEFycmF5KGQubGVuZ3RoKS5maWxsKDEpfTtyZXR1cm4oaD8/dGhpcy5yZXR1cm5fdG9rZW5fdHlwZV9pZHMpJiZmLnRva2VuX3R5cGVfaWRzJiYobC50b2tlbl90eXBlX2lkcz1mLnRva2VuX3R5cGVfaWRzKSxsfWVuY29kZShyLG89bnVsbCx7YWRkX3NwZWNpYWxfdG9rZW5zOnU9ITAscmV0dXJuX3Rva2VuX3R5cGVfaWRzOmg9bnVsbH09e30pe2NvbnN0e2lucHV0X2lkczphfT10aGlzLl9lbmNvZGVfcGx1cyhyLG8se2FkZF9zcGVjaWFsX3Rva2Vuczp1LHJldHVybl90b2tlbl90eXBlX2lkczpofSk7cmV0dXJuIGF9YmF0Y2hfZGVjb2RlKHIsbz17fSl7cmV0dXJuIHIgaW5zdGFuY2VvZiBUZW5zb3ImJihyPXIudG9saXN0KCkpLHIubWFwKHU9PnRoaXMuZGVjb2RlKHUsbykpfWRlY29kZShyLG89e30pe2lmKHIgaW5zdGFuY2VvZiBUZW5zb3ImJihyPXByZXBhcmVUZW5zb3JGb3JEZWNvZGUocikpLCFBcnJheS5pc0FycmF5KHIpfHxyLmxlbmd0aD09PTB8fCFpc0ludGVncmFsTnVtYmVyKHJbMF0pKXRocm93IEVycm9yKCJ0b2tlbl9pZHMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheSBvZiBpbnRlZ2Vycy4iKTtyZXR1cm4gdGhpcy5kZWNvZGVfc2luZ2xlKHIsbyl9ZGVjb2RlX3NpbmdsZShyLHtza2lwX3NwZWNpYWxfdG9rZW5zOm89ITEsY2xlYW5fdXBfdG9rZW5pemF0aW9uX3NwYWNlczp1PW51bGx9KXtsZXQgaD10aGlzLm1vZGVsLmNvbnZlcnRfaWRzX3RvX3Rva2VucyhyKTtvJiYoaD1oLmZpbHRlcihwPT4hdGhpcy5zcGVjaWFsX3Rva2Vucy5pbmNsdWRlcyhwKSkpO2xldCBhPXRoaXMuZGVjb2Rlcj90aGlzLmRlY29kZXIoaCk6aC5qb2luKCIgIik7cmV0dXJuIHRoaXMuZGVjb2RlciYmdGhpcy5kZWNvZGVyLmVuZF9vZl93b3JkX3N1ZmZpeCYmKGE9YS5yZXBsYWNlQWxsKHRoaXMuZGVjb2Rlci5lbmRfb2Zfd29yZF9zdWZmaXgsIiAiKSxvJiYoYT1hLnRyaW0oKSkpLCh1Pz90aGlzLmNsZWFuX3VwX3Rva2VuaXphdGlvbl9zcGFjZXMpJiYoYT1jbGVhbl91cF90b2tlbml6YXRpb24oYSkpLGF9Z2V0IGRlZmF1bHRfY2hhdF90ZW1wbGF0ZSgpe3JldHVybiB0aGlzLl93YXJuZWRfYWJvdXRfY2hhdF90ZW1wbGF0ZXx8KGNvbnNvbGUud2FybigiTm8gY2hhdCB0ZW1wbGF0ZSBpcyBkZWZpbmVkIGZvciB0aGlzIHRva2VuaXplciAtIHVzaW5nIGEgZGVmYXVsdCBjaGF0IHRlbXBsYXRlIHRoYXQgaW1wbGVtZW50cyB0aGUgQ2hhdE1MIGZvcm1hdC4gSWYgdGhlIGRlZmF1bHQgaXMgbm90IGFwcHJvcHJpYXRlIGZvciB5b3VyIG1vZGVsLCBwbGVhc2Ugc2V0IGB0b2tlbml6ZXIuY2hhdF90ZW1wbGF0ZWAgdG8gYW4gYXBwcm9wcmlhdGUgdGVtcGxhdGUuIFNlZSBodHRwczovL2h1Z2dpbmdmYWNlLmNvL2RvY3MvdHJhbnNmb3JtZXJzL21haW4vY2hhdF90ZW1wbGF0aW5nIGZvciBtb3JlIGluZm9ybWF0aW9uLiIpLHRoaXMuX3dhcm5lZF9hYm91dF9jaGF0X3RlbXBsYXRlPSEwKSx0aGlzLl9kZWZhdWx0X2NoYXRfdGVtcGxhdGV9YXBwbHlfY2hhdF90ZW1wbGF0ZShyLHtjaGF0X3RlbXBsYXRlOm89bnVsbCxhZGRfZ2VuZXJhdGlvbl9wcm9tcHQ6dT0hMSx0b2tlbml6ZTpoPSEwLHBhZGRpbmc6YT0hMSx0cnVuY2F0aW9uOnA9ITEsbWF4X2xlbmd0aDpmPW51bGwscmV0dXJuX3RlbnNvcjpkPSEwLHRva2VuaXplcl9rd2FyZ3M6bD17fSwuLi5ufT17fSl7aWYodGhpcy5jaGF0X3RlbXBsYXRlJiZ0eXBlb2YgdGhpcy5jaGF0X3RlbXBsYXRlPT0ib2JqZWN0Inx8dGhpcy5jaGF0X3RlbXBsYXRlPT09bnVsbCYmdGhpcy5kZWZhdWx0X2NoYXRfdGVtcGxhdGUmJnR5cGVvZiB0aGlzLmRlZmF1bHRfY2hhdF90ZW1wbGF0ZT09Im9iamVjdCIpe2NvbnN0IG09dGhpcy5jaGF0X3RlbXBsYXRlPz90aGlzLmRlZmF1bHRfY2hhdF90ZW1wbGF0ZTtpZihvIT09bnVsbCYmT2JqZWN0Lmhhc093bihtLG8pKW89bVtvXTtlbHNlIGlmKG89PT1udWxsJiYiZGVmYXVsdCJpbiBtKW89bS5kZWZhdWx0O2Vsc2UgaWYobz09PW51bGwpdGhyb3cgRXJyb3IoYFRoaXMgbW9kZWwgaGFzIG11bHRpcGxlIGNoYXQgdGVtcGxhdGVzIHdpdGggbm8gZGVmYXVsdCBzcGVjaWZpZWQhIFBsZWFzZSBlaXRoZXIgcGFzcyBhIGNoYXQgdGVtcGxhdGUgb3IgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHlvdSB3aXNoIHRvIHVzZSB0byB0aGUgJ2NoYXRfdGVtcGxhdGUnIGFyZ3VtZW50LiBBdmFpbGFibGUgdGVtcGxhdGUgbmFtZXMgYXJlICR7T2JqZWN0LmtleXMobSkuc29ydCgpfS5gKX1lbHNlIG8/PyhvPXRoaXMuY2hhdF90ZW1wbGF0ZT8/dGhpcy5kZWZhdWx0X2NoYXRfdGVtcGxhdGUpO2lmKHR5cGVvZiBvIT0ic3RyaW5nIil0aHJvdyBFcnJvcihgY2hhdF90ZW1wbGF0ZSBtdXN0IGJlIGEgc3RyaW5nLCBidXQgZ290ICR7dHlwZW9mIG99YCk7bGV0IGU9dGhpcy5fY29tcGlsZWRfdGVtcGxhdGVfY2FjaGUuZ2V0KG8pO2U9PT12b2lkIDAmJihlPW5ldyBUZW1wbGF0ZShvKSx0aGlzLl9jb21waWxlZF90ZW1wbGF0ZV9jYWNoZS5zZXQobyxlKSk7Y29uc3QgaT1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcihjb25zdCBtIG9mIFNQRUNJQUxfVE9LRU5fQVRUUklCVVRFUyl7Y29uc3QgZz10aGlzLmdldFRva2VuKG0pO2cmJihpW21dPWcpfWNvbnN0IHM9ZS5yZW5kZXIoe21lc3NhZ2VzOnIsYWRkX2dlbmVyYXRpb25fcHJvbXB0OnUsLi4uaSwuLi5ufSk7cmV0dXJuIGg/dGhpcy5fY2FsbChzLHthZGRfc3BlY2lhbF90b2tlbnM6ITEscGFkZGluZzphLHRydW5jYXRpb246cCxtYXhfbGVuZ3RoOmYscmV0dXJuX3RlbnNvcjpkLC4uLmx9KS5pbnB1dF9pZHM6c319Y2xhc3MgQmVydFRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO0sodGhpcywicmV0dXJuX3Rva2VuX3R5cGVfaWRzIiwhMCl9fWNsYXNzIEFsYmVydFRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO0sodGhpcywicmV0dXJuX3Rva2VuX3R5cGVfaWRzIiwhMCl9fWNsYXNzIE1vYmlsZUJlcnRUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUcmFpbmVkVG9rZW5pemVye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtLKHRoaXMsInJldHVybl90b2tlbl90eXBlX2lkcyIsITApfX1jbGFzcyBTcXVlZXplQmVydFRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO0sodGhpcywicmV0dXJuX3Rva2VuX3R5cGVfaWRzIiwhMCl9fWNsYXNzIERlYmVydGFUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUcmFpbmVkVG9rZW5pemVye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtLKHRoaXMsInJldHVybl90b2tlbl90eXBlX2lkcyIsITApfX1jbGFzcyBEZWJlcnRhVjJUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUcmFpbmVkVG9rZW5pemVye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtLKHRoaXMsInJldHVybl90b2tlbl90eXBlX2lkcyIsITApfX1jbGFzcyBIZXJiZXJ0VG9rZW5pemVyIGV4dGVuZHMgUHJlVHJhaW5lZFRva2VuaXplcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Syh0aGlzLCJyZXR1cm5fdG9rZW5fdHlwZV9pZHMiLCEwKX19Y2xhc3MgQ29udkJlcnRUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUcmFpbmVkVG9rZW5pemVye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtLKHRoaXMsInJldHVybl90b2tlbl90eXBlX2lkcyIsITApfX1jbGFzcyBSb0Zvcm1lclRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO0sodGhpcywicmV0dXJuX3Rva2VuX3R5cGVfaWRzIiwhMCl9fWNsYXNzIERpc3RpbEJlcnRUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUcmFpbmVkVG9rZW5pemVye31jbGFzcyBDYW1lbWJlcnRUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUcmFpbmVkVG9rZW5pemVye31jbGFzcyBYTE1Ub2tlbml6ZXIgZXh0ZW5kcyBQcmVUcmFpbmVkVG9rZW5pemVye2NvbnN0cnVjdG9yKHIsbyl7c3VwZXIocixvKTtLKHRoaXMsInJldHVybl90b2tlbl90eXBlX2lkcyIsITApO2NvbnNvbGUud2FybignV0FSTklORzogYFhMTVRva2VuaXplcmAgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnkgSHVnZ2luZyBGYWNlXCdzICJmYXN0IiB0b2tlbml6ZXJzIGxpYnJhcnkuIFRoZXJlZm9yZSwgeW91IG1heSBleHBlcmllbmNlIHNsaWdodGx5IGluYWNjdXJhdGUgcmVzdWx0cy4nKX19Y2xhc3MgRWxlY3RyYVRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO0sodGhpcywicmV0dXJuX3Rva2VuX3R5cGVfaWRzIiwhMCl9fWNsYXNzIFQ1VG9rZW5pemVyIGV4dGVuZHMgUHJlVHJhaW5lZFRva2VuaXplcnt9Y2xhc3MgR1BUMlRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO0sodGhpcywiX2RlZmF1bHRfY2hhdF90ZW1wbGF0ZSIsJ3slIGZvciBtZXNzYWdlIGluIG1lc3NhZ2VzICV9IiAie3sgbWVzc2FnZS5jb250ZW50IH19e3sgZW9zX3Rva2VuIH19IiAieyUgZW5kZm9yICV9Jyl9fWNsYXNzIEJhcnRUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUcmFpbmVkVG9rZW5pemVye31jbGFzcyBNQmFydFRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7Y29uc3RydWN0b3IodCxyKXtzdXBlcih0LHIpLHRoaXMubGFuZ3VhZ2VSZWdleD0vXlthLXpdezJ9X1tBLVpdezJ9JC8sdGhpcy5sYW5ndWFnZV9jb2Rlcz10aGlzLnNwZWNpYWxfdG9rZW5zLmZpbHRlcihvPT50aGlzLmxhbmd1YWdlUmVnZXgudGVzdChvKSksdGhpcy5sYW5nX3RvX3Rva2VuPW89Pm99X2J1aWxkX3RyYW5zbGF0aW9uX2lucHV0cyh0LHIsbyl7cmV0dXJuIF9idWlsZF90cmFuc2xhdGlvbl9pbnB1dHModGhpcyx0LHIsbyl9fWNsYXNzIE1CYXJ0NTBUb2tlbml6ZXIgZXh0ZW5kcyBNQmFydFRva2VuaXplcnt9Y2xhc3MgUm9iZXJ0YVRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7fWNsYXNzIEJsb29tVG9rZW5pemVyIGV4dGVuZHMgR1BUMlRva2VuaXplcntjb25zdHJ1Y3Rvcih0LHIpe3ZhciBoLGE7Y29uc3Qgbz0iLiwhP+KApuOAgu+8jOOAgeClpNuU2IwiLHU9KGE9KGg9dC5wcmVfdG9rZW5pemVyKT09bnVsbD92b2lkIDA6aC5wcmV0b2tlbml6ZXJzWzBdKT09bnVsbD92b2lkIDA6YS5wYXR0ZXJuO3UmJnUuUmVnZXg9PT1gID9bXihcXHN8WyR7b31dKV0rYCYmKHUuUmVnZXg9YCA/W15cXHMke299XStgKSxzdXBlcih0LHIpfX1jb25zdCBTUElFQ0VfVU5ERVJMSU5FPSLiloEiO2NsYXNzIExsYW1hVG9rZW5pemVyIGV4dGVuZHMgUHJlVHJhaW5lZFRva2VuaXplcntjb25zdHJ1Y3RvcihyLG8pe3N1cGVyKHIsbyk7Syh0aGlzLCJfZGVmYXVsdF9jaGF0X3RlbXBsYXRlIixgeyUgaWYgbWVzc2FnZXNbMF1bJ3JvbGUnXSA9PSAnc3lzdGVtJyAlfXslIHNldCBsb29wX21lc3NhZ2VzID0gbWVzc2FnZXNbMTpdICV9eyUgc2V0IHN5c3RlbV9tZXNzYWdlID0gbWVzc2FnZXNbMF1bJ2NvbnRlbnQnXSAlfXslIGVsaWYgVVNFX0RFRkFVTFRfUFJPTVBUID09IHRydWUgYW5kIG5vdCAnPDxTWVM+PicgaW4gbWVzc2FnZXNbMF1bJ2NvbnRlbnQnXSAlfXslIHNldCBsb29wX21lc3NhZ2VzID0gbWVzc2FnZXMgJX17JSBzZXQgc3lzdGVtX21lc3NhZ2UgPSAnREVGQVVMVF9TWVNURU1fTUVTU0FHRScgJX17JSBlbHNlICV9eyUgc2V0IGxvb3BfbWVzc2FnZXMgPSBtZXNzYWdlcyAlfXslIHNldCBzeXN0ZW1fbWVzc2FnZSA9IGZhbHNlICV9eyUgZW5kaWYgJX17JSBmb3IgbWVzc2FnZSBpbiBsb29wX21lc3NhZ2VzICV9eyUgaWYgKG1lc3NhZ2VbJ3JvbGUnXSA9PSAndXNlcicpICE9IChsb29wLmluZGV4MCAlIDIgPT0gMCkgJX17eyByYWlzZV9leGNlcHRpb24oJ0NvbnZlcnNhdGlvbiByb2xlcyBtdXN0IGFsdGVybmF0ZSB1c2VyL2Fzc2lzdGFudC91c2VyL2Fzc2lzdGFudC8uLi4nKSB9fXslIGVuZGlmICV9eyUgaWYgbG9vcC5pbmRleDAgPT0gMCBhbmQgc3lzdGVtX21lc3NhZ2UgIT0gZmFsc2UgJX17JSBzZXQgY29udGVudCA9ICc8PFNZUz4+CicgKyBzeXN0ZW1fbWVzc2FnZSArICcKPDwvU1lTPj4KCicgKyBtZXNzYWdlWydjb250ZW50J10gJX17JSBlbHNlICV9eyUgc2V0IGNvbnRlbnQgPSBtZXNzYWdlWydjb250ZW50J10gJX17JSBlbmRpZiAlfXslIGlmIG1lc3NhZ2VbJ3JvbGUnXSA9PSAndXNlcicgJX17eyBib3NfdG9rZW4gKyAnW0lOU1RdICcgKyBjb250ZW50LnN0cmlwKCkgKyAnIFsvSU5TVF0nIH19eyUgZWxpZiBtZXNzYWdlWydyb2xlJ10gPT0gJ3N5c3RlbScgJX17eyAnPDxTWVM+PgonICsgY29udGVudC5zdHJpcCgpICsgJwo8PC9TWVM+PgoKJyB9fXslIGVsaWYgbWVzc2FnZVsncm9sZSddID09ICdhc3Npc3RhbnQnICV9e3sgJyAnICArIGNvbnRlbnQuc3RyaXAoKSArICcgJyArIGVvc190b2tlbiB9fXslIGVuZGlmICV9eyUgZW5kZm9yICV9YCk7Syh0aGlzLCJERUZBVUxUX1NZU1RFTV9QUk9NUFQiLGBZb3UgYXJlIGEgaGVscGZ1bCwgcmVzcGVjdGZ1bCBhbmQgaG9uZXN0IGFzc2lzdGFudC4gQWx3YXlzIGFuc3dlciBhcyBoZWxwZnVsbHkgYXMgcG9zc2libGUsIHdoaWxlIGJlaW5nIHNhZmUuIFlvdXIgYW5zd2VycyBzaG91bGQgbm90IGluY2x1ZGUgYW55IGhhcm1mdWwsIHVuZXRoaWNhbCwgcmFjaXN0LCBzZXhpc3QsIHRveGljLCBkYW5nZXJvdXMsIG9yIGlsbGVnYWwgY29udGVudC4gUGxlYXNlIGVuc3VyZSB0aGF0IHlvdXIgcmVzcG9uc2VzIGFyZSBzb2NpYWxseSB1bmJpYXNlZCBhbmQgcG9zaXRpdmUgaW4gbmF0dXJlLgoKSWYgYSBxdWVzdGlvbiBkb2VzIG5vdCBtYWtlIGFueSBzZW5zZSwgb3IgaXMgbm90IGZhY3R1YWxseSBjb2hlcmVudCwgZXhwbGFpbiB3aHkgaW5zdGVhZCBvZiBhbnN3ZXJpbmcgc29tZXRoaW5nIG5vdCBjb3JyZWN0LiBJZiB5b3UgZG9uJ3Qga25vdyB0aGUgYW5zd2VyIHRvIGEgcXVlc3Rpb24sIHBsZWFzZSBkb24ndCBzaGFyZSBmYWxzZSBpbmZvcm1hdGlvbi5gKTt0aGlzLnVzZV9kZWZhdWx0X3N5c3RlbV9wcm9tcHQ9by51c2VfZGVmYXVsdF9zeXN0ZW1fcHJvbXB0Pz8hMSx0aGlzLmxlZ2FjeT1vLmxlZ2FjeT8/ITAsdGhpcy5sZWdhY3l8fCh0aGlzLm5vcm1hbGl6ZXI9bnVsbCx0aGlzLnByZV90b2tlbml6ZXI9bmV3IE1ldGFzcGFjZVByZVRva2VuaXplcih7cmVwbGFjZW1lbnQ6U1BJRUNFX1VOREVSTElORSxhZGRfcHJlZml4X3NwYWNlOiEwLHByZXBlbmRfc2NoZW1lOiJmaXJzdCJ9KSl9X2VuY29kZV90ZXh0KHIpe2lmKHI9PT1udWxsKXJldHVybiBudWxsO2lmKHRoaXMubGVnYWN5fHxyLmxlbmd0aD09PTApcmV0dXJuIHN1cGVyLl9lbmNvZGVfdGV4dChyKTtsZXQgbz1zdXBlci5fZW5jb2RlX3RleHQoU1BJRUNFX1VOREVSTElORStyLnJlcGxhY2VBbGwoU1BJRUNFX1VOREVSTElORSwiICIpKTtyZXR1cm4gby5sZW5ndGg+MSYmb1swXT09PVNQSUVDRV9VTkRFUkxJTkUmJnRoaXMuc3BlY2lhbF90b2tlbnMuaW5jbHVkZXMob1sxXSkmJihvPW8uc2xpY2UoMSkpLG99Z2V0IGRlZmF1bHRfY2hhdF90ZW1wbGF0ZSgpe3JldHVybiBzdXBlci5kZWZhdWx0X2NoYXRfdGVtcGxhdGUucmVwbGFjZUFsbCgiVVNFX0RFRkFVTFRfUFJPTVBUIix0aGlzLnVzZV9kZWZhdWx0X3N5c3RlbV9wcm9tcHQ/InRydWUiOiJmYWxzZSIpLnJlcGxhY2VBbGwoIkRFRkFVTFRfU1lTVEVNX01FU1NBR0UiLHRoaXMuREVGQVVMVF9TWVNURU1fUFJPTVBULnJlcGxhY2VBbGwoYApgLCJcXG4iKS5yZXBsYWNlQWxsKCInIiwiXFwnIikpfX1jbGFzcyBDb2RlTGxhbWFUb2tlbml6ZXIgZXh0ZW5kcyBMbGFtYVRva2VuaXplcnt9Y2xhc3MgWExNUm9iZXJ0YVRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7fWNsYXNzIE1QTmV0VG9rZW5pemVyIGV4dGVuZHMgUHJlVHJhaW5lZFRva2VuaXplcnt9Y2xhc3MgRmFsY29uVG9rZW5pemVyIGV4dGVuZHMgUHJlVHJhaW5lZFRva2VuaXplcnt9Y2xhc3MgR1BUTmVvWFRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7fWNsYXNzIEVzbVRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7fWNsYXNzIFF3ZW4yVG9rZW5pemVyIGV4dGVuZHMgUHJlVHJhaW5lZFRva2VuaXplcnt9Y2xhc3MgR2VtbWFUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUcmFpbmVkVG9rZW5pemVye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtLKHRoaXMsIl9kZWZhdWx0X2NoYXRfdGVtcGxhdGUiLGB7JSBpZiBtZXNzYWdlc1swXVsncm9sZSddID09ICdzeXN0ZW0nICV9e3sgcmFpc2VfZXhjZXB0aW9uKCdTeXN0ZW0gcm9sZSBub3Qgc3VwcG9ydGVkJykgfX17JSBlbmRpZiAlfXslIGZvciBtZXNzYWdlIGluIG1lc3NhZ2VzICV9eyUgaWYgKG1lc3NhZ2VbJ3JvbGUnXSA9PSAndXNlcicpICE9IChsb29wLmluZGV4MCAlIDIgPT0gMCkgJX17eyByYWlzZV9leGNlcHRpb24oJ0NvbnZlcnNhdGlvbiByb2xlcyBtdXN0IGFsdGVybmF0ZSB1c2VyL2Fzc2lzdGFudC91c2VyL2Fzc2lzdGFudC8uLi4nKSB9fXslIGVuZGlmICV9eyUgaWYgKG1lc3NhZ2VbJ3JvbGUnXSA9PSAnYXNzaXN0YW50JykgJX17JSBzZXQgcm9sZSA9ICdtb2RlbCcgJX17JSBlbHNlICV9eyUgc2V0IHJvbGUgPSBtZXNzYWdlWydyb2xlJ10gJX17JSBlbmRpZiAlfXt7ICc8c3RhcnRfb2ZfdHVybj4nICsgcm9sZSArICcKJyArIG1lc3NhZ2VbJ2NvbnRlbnQnXSB8IHRyaW0gKyAnPGVuZF9vZl90dXJuPgonIH19eyUgZW5kZm9yICV9eyUgaWYgYWRkX2dlbmVyYXRpb25fcHJvbXB0ICV9e3snPHN0YXJ0X29mX3R1cm4+bW9kZWwKJ319eyUgZW5kaWYgJX1gKX19Y2xhc3MgR3JvazFUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUcmFpbmVkVG9rZW5pemVye31mdW5jdGlvbiBfYnVpbGRfdHJhbnNsYXRpb25faW5wdXRzKGMsdCxyLG8pe2lmKCEoImxhbmd1YWdlX2NvZGVzImluIGMpfHwhQXJyYXkuaXNBcnJheShjLmxhbmd1YWdlX2NvZGVzKSl0aHJvdyBuZXcgRXJyb3IoIlRva2VuaXplciBtdXN0IGhhdmUgYGxhbmd1YWdlX2NvZGVzYCBhdHRyaWJ1dGUgc2V0IGFuZCBpdCBzaG91bGQgYmUgYW4gYXJyYXkgb2YgbGFuZ3VhZ2UgaWRzLiIpO2lmKCEoImxhbmd1YWdlUmVnZXgiaW4gYyl8fCEoYy5sYW5ndWFnZVJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwKSl0aHJvdyBuZXcgRXJyb3IoIlRva2VuaXplciBtdXN0IGhhdmUgYGxhbmd1YWdlUmVnZXhgIGF0dHJpYnV0ZSBzZXQgYW5kIGl0IHNob3VsZCBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4iKTtpZighKCJsYW5nX3RvX3Rva2VuImluIGMpfHx0eXBlb2YgYy5sYW5nX3RvX3Rva2VuIT0iZnVuY3Rpb24iKXRocm93IG5ldyBFcnJvcigiVG9rZW5pemVyIG11c3QgaGF2ZSBgbGFuZ190b190b2tlbmAgYXR0cmlidXRlIHNldCBhbmQgaXQgc2hvdWxkIGJlIGEgZnVuY3Rpb24uIik7Y29uc3QgdT1vLnNyY19sYW5nLGg9by50Z3RfbGFuZztpZighYy5sYW5ndWFnZV9jb2Rlcy5pbmNsdWRlcyhoKSl0aHJvdyBuZXcgRXJyb3IoYFRhcmdldCBsYW5ndWFnZSBjb2RlICIke2h9IiBpcyBub3QgdmFsaWQuIE11c3QgYmUgb25lIG9mOiB7JHtjLmxhbmd1YWdlX2NvZGVzLmpvaW4oIiwgIil9fWApO2lmKHUhPT12b2lkIDApe2lmKCFjLmxhbmd1YWdlX2NvZGVzLmluY2x1ZGVzKHUpKXRocm93IG5ldyBFcnJvcihgU291cmNlIGxhbmd1YWdlIGNvZGUgIiR7dX0iIGlzIG5vdCB2YWxpZC4gTXVzdCBiZSBvbmUgb2Y6IHske2MubGFuZ3VhZ2VfY29kZXMuam9pbigiLCAiKX19YCk7Zm9yKGNvbnN0IGEgb2YgYy5wb3N0X3Byb2Nlc3Nvci5jb25maWcuc2luZ2xlKWlmKCJTcGVjaWFsVG9rZW4iaW4gYSYmYy5sYW5ndWFnZVJlZ2V4LnRlc3QoYS5TcGVjaWFsVG9rZW4uaWQpKXthLlNwZWNpYWxUb2tlbi5pZD1jLmxhbmdfdG9fdG9rZW4odSk7YnJlYWt9fXJldHVybiBvLmZvcmNlZF9ib3NfdG9rZW5faWQ9Yy5tb2RlbC5jb252ZXJ0X3Rva2Vuc190b19pZHMoW2MubGFuZ190b190b2tlbihoKV0pWzBdLGMuX2NhbGwodCxyKX1jbGFzcyBObGxiVG9rZW5pemVyIGV4dGVuZHMgUHJlVHJhaW5lZFRva2VuaXplcntjb25zdHJ1Y3Rvcih0LHIpe3N1cGVyKHQsciksdGhpcy5sYW5ndWFnZVJlZ2V4PS9eW2Etel17M31fW0EtWl1bYS16XXszfSQvLHRoaXMubGFuZ3VhZ2VfY29kZXM9dGhpcy5zcGVjaWFsX3Rva2Vucy5maWx0ZXIobz0+dGhpcy5sYW5ndWFnZVJlZ2V4LnRlc3QobykpLHRoaXMubGFuZ190b190b2tlbj1vPT5vfV9idWlsZF90cmFuc2xhdGlvbl9pbnB1dHModCxyLG8pe3JldHVybiBfYnVpbGRfdHJhbnNsYXRpb25faW5wdXRzKHRoaXMsdCxyLG8pfX1jbGFzcyBNMk0xMDBUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUcmFpbmVkVG9rZW5pemVye2NvbnN0cnVjdG9yKHQscil7c3VwZXIodCxyKSx0aGlzLmxhbmd1YWdlUmVnZXg9L15fX1thLXpdezIsM31fXyQvLHRoaXMubGFuZ3VhZ2VfY29kZXM9dGhpcy5zcGVjaWFsX3Rva2Vucy5maWx0ZXIobz0+dGhpcy5sYW5ndWFnZVJlZ2V4LnRlc3QobykpLm1hcChvPT5vLnNsaWNlKDIsLTIpKSx0aGlzLmxhbmdfdG9fdG9rZW49bz0+YF9fJHtvfV9fYH1fYnVpbGRfdHJhbnNsYXRpb25faW5wdXRzKHQscixvKXtyZXR1cm4gX2J1aWxkX3RyYW5zbGF0aW9uX2lucHV0cyh0aGlzLHQscixvKX19Y29uc3QgV0hJU1BFUl9MQU5HVUFHRVM9W1siZW4iLCJlbmdsaXNoIl0sWyJ6aCIsImNoaW5lc2UiXSxbImRlIiwiZ2VybWFuIl0sWyJlcyIsInNwYW5pc2giXSxbInJ1IiwicnVzc2lhbiJdLFsia28iLCJrb3JlYW4iXSxbImZyIiwiZnJlbmNoIl0sWyJqYSIsImphcGFuZXNlIl0sWyJwdCIsInBvcnR1Z3Vlc2UiXSxbInRyIiwidHVya2lzaCJdLFsicGwiLCJwb2xpc2giXSxbImNhIiwiY2F0YWxhbiJdLFsibmwiLCJkdXRjaCJdLFsiYXIiLCJhcmFiaWMiXSxbInN2Iiwic3dlZGlzaCJdLFsiaXQiLCJpdGFsaWFuIl0sWyJpZCIsImluZG9uZXNpYW4iXSxbImhpIiwiaGluZGkiXSxbImZpIiwiZmlubmlzaCJdLFsidmkiLCJ2aWV0bmFtZXNlIl0sWyJoZSIsImhlYnJldyJdLFsidWsiLCJ1a3JhaW5pYW4iXSxbImVsIiwiZ3JlZWsiXSxbIm1zIiwibWFsYXkiXSxbImNzIiwiY3plY2giXSxbInJvIiwicm9tYW5pYW4iXSxbImRhIiwiZGFuaXNoIl0sWyJodSIsImh1bmdhcmlhbiJdLFsidGEiLCJ0YW1pbCJdLFsibm8iLCJub3J3ZWdpYW4iXSxbInRoIiwidGhhaSJdLFsidXIiLCJ1cmR1Il0sWyJociIsImNyb2F0aWFuIl0sWyJiZyIsImJ1bGdhcmlhbiJdLFsibHQiLCJsaXRodWFuaWFuIl0sWyJsYSIsImxhdGluIl0sWyJtaSIsIm1hb3JpIl0sWyJtbCIsIm1hbGF5YWxhbSJdLFsiY3kiLCJ3ZWxzaCJdLFsic2siLCJzbG92YWsiXSxbInRlIiwidGVsdWd1Il0sWyJmYSIsInBlcnNpYW4iXSxbImx2IiwibGF0dmlhbiJdLFsiYm4iLCJiZW5nYWxpIl0sWyJzciIsInNlcmJpYW4iXSxbImF6IiwiYXplcmJhaWphbmkiXSxbInNsIiwic2xvdmVuaWFuIl0sWyJrbiIsImthbm5hZGEiXSxbImV0IiwiZXN0b25pYW4iXSxbIm1rIiwibWFjZWRvbmlhbiJdLFsiYnIiLCJicmV0b24iXSxbImV1IiwiYmFzcXVlIl0sWyJpcyIsImljZWxhbmRpYyJdLFsiaHkiLCJhcm1lbmlhbiJdLFsibmUiLCJuZXBhbGkiXSxbIm1uIiwibW9uZ29saWFuIl0sWyJicyIsImJvc25pYW4iXSxbImtrIiwia2F6YWtoIl0sWyJzcSIsImFsYmFuaWFuIl0sWyJzdyIsInN3YWhpbGkiXSxbImdsIiwiZ2FsaWNpYW4iXSxbIm1yIiwibWFyYXRoaSJdLFsicGEiLCJwdW5qYWJpIl0sWyJzaSIsInNpbmhhbGEiXSxbImttIiwia2htZXIiXSxbInNuIiwic2hvbmEiXSxbInlvIiwieW9ydWJhIl0sWyJzbyIsInNvbWFsaSJdLFsiYWYiLCJhZnJpa2FhbnMiXSxbIm9jIiwib2NjaXRhbiJdLFsia2EiLCJnZW9yZ2lhbiJdLFsiYmUiLCJiZWxhcnVzaWFuIl0sWyJ0ZyIsInRhamlrIl0sWyJzZCIsInNpbmRoaSJdLFsiZ3UiLCJndWphcmF0aSJdLFsiYW0iLCJhbWhhcmljIl0sWyJ5aSIsInlpZGRpc2giXSxbImxvIiwibGFvIl0sWyJ1eiIsInV6YmVrIl0sWyJmbyIsImZhcm9lc2UiXSxbImh0IiwiaGFpdGlhbiBjcmVvbGUiXSxbInBzIiwicGFzaHRvIl0sWyJ0ayIsInR1cmttZW4iXSxbIm5uIiwibnlub3JzayJdLFsibXQiLCJtYWx0ZXNlIl0sWyJzYSIsInNhbnNrcml0Il0sWyJsYiIsImx1eGVtYm91cmdpc2giXSxbIm15IiwibXlhbm1hciJdLFsiYm8iLCJ0aWJldGFuIl0sWyJ0bCIsInRhZ2Fsb2ciXSxbIm1nIiwibWFsYWdhc3kiXSxbImFzIiwiYXNzYW1lc2UiXSxbInR0IiwidGF0YXIiXSxbImhhdyIsImhhd2FpaWFuIl0sWyJsbiIsImxpbmdhbGEiXSxbImhhIiwiaGF1c2EiXSxbImJhIiwiYmFzaGtpciJdLFsianciLCJqYXZhbmVzZSJdLFsic3UiLCJzdW5kYW5lc2UiXV0sV0hJU1BFUl9MQU5HVUFHRV9NQVBQSU5HPW5ldyBNYXAoV0hJU1BFUl9MQU5HVUFHRVMpLFdISVNQRVJfVE9fTEFOR1VBR0VfQ09ERV9NQVBQSU5HPW5ldyBNYXAoWy4uLldISVNQRVJfTEFOR1VBR0VTLm1hcCgoW2MsdF0pPT5bdCxjXSksWyJidXJtZXNlIiwibXkiXSxbInZhbGVuY2lhbiIsImNhIl0sWyJmbGVtaXNoIiwibmwiXSxbImhhaXRpYW4iLCJodCJdLFsibGV0emVidXJnZXNjaCIsImxiIl0sWyJwdXNodG8iLCJwcyJdLFsicGFuamFiaSIsInBhIl0sWyJtb2xkYXZpYW4iLCJybyJdLFsibW9sZG92YW4iLCJybyJdLFsic2luaGFsZXNlIiwic2kiXSxbImNhc3RpbGlhbiIsImVzIl1dKTtjbGFzcyBXaGlzcGVyVG9rZW5pemVyIGV4dGVuZHMgUHJlVHJhaW5lZFRva2VuaXplcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Syh0aGlzLCJfZGVmYXVsdF9jaGF0X3RlbXBsYXRlIiwneyUgZm9yIG1lc3NhZ2UgaW4gbWVzc2FnZXMgJX0iICJ7eyBtZXNzYWdlLmNvbnRlbnQgfX17eyBlb3NfdG9rZW4gfX0iICJ7JSBlbmRmb3IgJX0nKX1fZGVjb2RlX2FzcihyLHtyZXR1cm5fdGltZXN0YW1wczpvPSExLHJldHVybl9sYW5ndWFnZTp1PSExLHRpbWVfcHJlY2lzaW9uOmg9bnVsbCxmb3JjZV9mdWxsX3NlcXVlbmNlczphPSEwfT17fSl7aWYoaD09PW51bGwpdGhyb3cgRXJyb3IoIk11c3Qgc3BlY2lmeSB0aW1lX3ByZWNpc2lvbiIpO2xldCBwPW51bGw7Y29uc3QgZj1vPT09IndvcmQiO2Z1bmN0aW9uIGQoKXtyZXR1cm57bGFuZ3VhZ2U6cCx0aW1lc3RhbXA6W251bGwsbnVsbF0sdGV4dDoiIn19Y29uc3QgbD1bXTtsZXQgbj1kKCksZT0wO2NvbnN0IGk9dGhpcy5tb2RlbC5jb252ZXJ0X3Rva2Vuc190b19pZHMoWyI8fG5vdGltZXN0YW1wc3w+Il0pWzBdKzE7bGV0IHM9W10sbT1bXSxnPSExLF89bnVsbDtjb25zdCBiPW5ldyBTZXQodGhpcy5hbGxfc3BlY2lhbF9pZHMpO2Zvcihjb25zdCB3IG9mIHIpe2NvbnN0IHg9dy50b2tlbnMsRT1mP3cudG9rZW5fdGltZXN0YW1wczpudWxsO2xldCBQPW51bGwsdj1pO2lmKCJzdHJpZGUiaW4gdyl7Y29uc3RbeixCLE5dPXcuc3RyaWRlO2lmKGUtPUIsXz16LU4sQiYmKHY9Qi9oK2kpLE4pZm9yKGxldCBEPXgubGVuZ3RoLTE7RD49MDstLUQpe2NvbnN0IEk9eFtEXTtpZihJPj1pKXtpZihQIT09bnVsbCYmKEktaSkqaDxfKWJyZWFrO1A9SX19fWxldCBNPVtdLCQ9W107Zm9yKGxldCB6PTA7ejx4Lmxlbmd0aDsrK3ope2NvbnN0IEI9eFt6XTtpZihiLmhhcyhCKSl7Y29uc3QgTj10aGlzLmRlY29kZShbQl0pLEQ9V0hJU1BFUl9MQU5HVUFHRV9NQVBQSU5HLmdldChOLnNsaWNlKDIsLTIpKTtpZihEIT09dm9pZCAwKXtpZihwIT09bnVsbCYmRCE9PXAmJiFvKXtzLnB1c2goTSk7Y29uc3QgST10aGlzLmZpbmRMb25nZXN0Q29tbW9uU2VxdWVuY2UocylbMF0sRj10aGlzLmRlY29kZShJKTtuLnRleHQ9RixsLnB1c2gobikscz1bXSxNPVtdLG49ZCgpfXA9bi5sYW5ndWFnZT1EfX1lbHNlIGlmKEI+PWkpe2NvbnN0IE49KEItaSkqaCtlLEQ9cm91bmQoTiwyKTtpZihQIT09bnVsbCYmQj49UClnPSEwO2Vsc2UgaWYoZ3x8cy5sZW5ndGg+MCYmQjx2KWc9ITE7ZWxzZSBpZihuLnRpbWVzdGFtcFswXT09PW51bGwpbi50aW1lc3RhbXBbMF09RDtlbHNlIGlmKEQhPT1uLnRpbWVzdGFtcFswXSl7bi50aW1lc3RhbXBbMV09RCxzLnB1c2goTSksZiYmbS5wdXNoKCQpO2NvbnN0W0ksRl09dGhpcy5maW5kTG9uZ2VzdENvbW1vblNlcXVlbmNlKHMsbSksWD10aGlzLmRlY29kZShJKTtuLnRleHQ9WCxmJiYobi53b3Jkcz10aGlzLmNvbGxhdGVXb3JkVGltZXN0YW1wcyhJLEYscCkpLGwucHVzaChuKSxzPVtdLE09W10sbT1bXSwkPVtdLG49ZCgpfX1lbHNlIGlmKE0ucHVzaChCKSxmKXtsZXQgTj1yb3VuZChFW3pdK2UsMiksRDt6KzE8RS5sZW5ndGg/RD1yb3VuZChFW3orMV0rZSwyKTpEPW51bGwsJC5wdXNoKFtOLERdKX19aWYoInN0cmlkZSJpbiB3KXtjb25zdFt6LEIsTl09dy5zdHJpZGU7ZSs9ei1OfU0ubGVuZ3RoPjA/KHMucHVzaChNKSxmJiZtLnB1c2goJCkpOnMuZXZlcnkoej0+ei5sZW5ndGg9PT0wKSYmKG49ZCgpLHM9W10sTT1bXSxtPVtdLCQ9W10pfWlmKHMubGVuZ3RoPjApe2lmKGEmJm8pdGhyb3cgbmV3IEVycm9yKCJXaGlzcGVyIGRpZCBub3QgcHJlZGljdCBhbiBlbmRpbmcgdGltZXN0YW1wLCB3aGljaCBjYW4gaGFwcGVuIGlmIGF1ZGlvIGlzIGN1dCBvZmYgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQuIEFsc28gbWFrZSBzdXJlIFdoaXNwZXJUaW1lU3RhbXBMb2dpdHNQcm9jZXNzb3Igd2FzIHVzZWQgZHVyaW5nIGdlbmVyYXRpb24uIik7Y29uc3Rbdyx4XT10aGlzLmZpbmRMb25nZXN0Q29tbW9uU2VxdWVuY2UocyxtKSxFPXRoaXMuZGVjb2RlKHcpO24udGV4dD1FLGYmJihuLndvcmRzPXRoaXMuY29sbGF0ZVdvcmRUaW1lc3RhbXBzKHcseCxwKSksbC5wdXNoKG4pfWxldCB5PU9iamVjdC5jcmVhdGUobnVsbCk7Y29uc3QgVD1sLm1hcCh3PT53LnRleHQpLmpvaW4oIiIpO2lmKG98fHUpe2ZvcihsZXQgdz0wO3c8bC5sZW5ndGg7Kyt3KXtjb25zdCB4PWxbd107b3x8ZGVsZXRlIHgudGltZXN0YW1wLHV8fGRlbGV0ZSB4Lmxhbmd1YWdlfWlmKGYpe2NvbnN0IHc9W107Zm9yKGNvbnN0IHggb2YgbClmb3IoY29uc3QgRSBvZiB4LndvcmRzKXcucHVzaChFKTt5PXtjaHVua3M6d319ZWxzZSB5PXtjaHVua3M6bH19cmV0dXJuW1QseV19ZmluZExvbmdlc3RDb21tb25TZXF1ZW5jZShyLG89bnVsbCl7bGV0IHU9clswXSxoPXUubGVuZ3RoLGE9W107Y29uc3QgcD1BcnJheS5pc0FycmF5KG8pJiZvLmxlbmd0aD4wO2xldCBmPXA/W106bnVsbCxkPXA/b1swXTpudWxsO2ZvcihsZXQgbD0xO2w8ci5sZW5ndGg7KytsKXtjb25zdCBuPXJbbF07bGV0IGU9MCxpPVtoLGgsMCwwXTtjb25zdCBzPW4ubGVuZ3RoO2ZvcihsZXQgdz0xO3c8aCtzOysrdyl7Y29uc3QgeD13LzFlNCxFPU1hdGgubWF4KDAsaC13KSxQPU1hdGgubWluKGgsaCtzLXcpLHY9dS5zbGljZShFLFApLE09TWF0aC5tYXgoMCx3LWgpLCQ9TWF0aC5taW4ocyx3KSx6PW4uc2xpY2UoTSwkKTtpZih2Lmxlbmd0aCE9PXoubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVGhlcmUgaXMgYSBidWcgd2l0aGluIHdoaXNwZXIgYGRlY29kZV9hc3JgIGZ1bmN0aW9uLCBwbGVhc2UgcmVwb3J0IGl0LiBEcm9wcGluZyB0byBwcmV2ZW50IGJhZCBpbmZlcmVuY2UuIik7Y29uc3QgQj12LmZpbHRlcigoRCxJKT0+RD09PXpbSV0pLmxlbmd0aCxOPUIvdyt4O0I+MSYmTj5lJiYoZT1OLGk9W0UsUCxNLCRdKX1jb25zdFttLGcsXyxiXT1pLHk9TWF0aC5mbG9vcigoZyttKS8yKSxUPU1hdGguZmxvb3IoKGIrXykvMik7YS5wdXNoKC4uLnUuc2xpY2UoMCx5KSksdT1uLnNsaWNlKFQpLGg9dS5sZW5ndGgscCYmKGYucHVzaCguLi5kLnNsaWNlKDAseSkpLGQ9b1tsXS5zbGljZShUKSl9cmV0dXJuIGEucHVzaCguLi51KSxwPyhmLnB1c2goLi4uZCksW2EsZl0pOlthLFtdXX1jb2xsYXRlV29yZFRpbWVzdGFtcHMocixvLHUpe2NvbnN0W2gsYSxwXT10aGlzLmNvbWJpbmVUb2tlbnNJbnRvV29yZHMocix1KSxmPVtdO2ZvcihsZXQgZD0wO2Q8aC5sZW5ndGg7KytkKXtjb25zdCBsPXBbZF07Zi5wdXNoKHt0ZXh0OmhbZF0sdGltZXN0YW1wOltvW2wuYXQoMCldWzBdLG9bbC5hdCgtMSldWzFdXX0pfXJldHVybiBmfWNvbWJpbmVUb2tlbnNJbnRvV29yZHMocixvLHU9YCIn4oCcwqHCvyhbey1gLGg9YCInLuOAgizvvIwh77yBP++8nzrvvJrigJ0pXX3jgIFgKXtvPW8/PyJlbmdsaXNoIjtsZXQgYSxwLGY7cmV0dXJuWyJjaGluZXNlIiwiamFwYW5lc2UiLCJ0aGFpIiwibGFvIiwibXlhbm1hciJdLmluY2x1ZGVzKG8pP1thLHAsZl09dGhpcy5zcGxpdFRva2Vuc09uVW5pY29kZShyKTpbYSxwLGZdPXRoaXMuc3BsaXRUb2tlbnNPblNwYWNlcyhyKSx0aGlzLm1lcmdlUHVuY3R1YXRpb25zKGEscCxmLHUsaCl9ZGVjb2RlKHIsbyl7bGV0IHU7cmV0dXJuIG8mJm8uZGVjb2RlX3dpdGhfdGltZXN0YW1wcz8ociBpbnN0YW5jZW9mIFRlbnNvciYmKHI9cHJlcGFyZVRlbnNvckZvckRlY29kZShyKSksdT10aGlzLmRlY29kZVdpdGhUaW1lc3RhbXBzKHIsbykpOnU9c3VwZXIuZGVjb2RlKHIsbyksdX1kZWNvZGVXaXRoVGltZXN0YW1wcyhyLG8pe2NvbnN0IHU9KG89PW51bGw/dm9pZCAwOm8udGltZV9wcmVjaXNpb24pPz8uMDIsaD1BcnJheS5mcm9tKHRoaXMuYWxsX3NwZWNpYWxfaWRzKS5hdCgtMSkrMTtsZXQgYT1bW11dO2Zvcihjb25zdCBwIG9mIHIpaWYocD49aCl7Y29uc3QgZj1yb3VuZCgocC1oKSp1LDIpO2EucHVzaChgPHwke2Z9fD5gKSxhLnB1c2goW10pfWVsc2UgYVthLmxlbmd0aC0xXS5wdXNoKHApO3JldHVybiBhPWEubWFwKHA9PnR5cGVvZiBwPT0ic3RyaW5nIj9wOnN1cGVyLmRlY29kZShwLG8pKSxhLmpvaW4oIiIpfXNwbGl0VG9rZW5zT25Vbmljb2RlKHIpe2NvbnN0IG89dGhpcy5kZWNvZGUocix7ZGVjb2RlX3dpdGhfdGltZXN0YW1wczohMH0pLHU9Iu+/vSIsaD1bXSxhPVtdLHA9W107bGV0IGY9W10sZD1bXSxsPTA7Zm9yKGxldCBuPTA7bjxyLmxlbmd0aDsrK24pe2NvbnN0IGU9cltuXTtmLnB1c2goZSksZC5wdXNoKG4pO2NvbnN0IGk9dGhpcy5kZWNvZGUoZix7ZGVjb2RlX3dpdGhfdGltZXN0YW1wczohMH0pOyghaS5pbmNsdWRlcyh1KXx8b1tsK2kuaW5kZXhPZih1KV09PT11KSYmKGgucHVzaChpKSxhLnB1c2goZikscC5wdXNoKGQpLGY9W10sZD1bXSxsKz1pLmxlbmd0aCl9cmV0dXJuW2gsYSxwXX1zcGxpdFRva2Vuc09uU3BhY2VzKHIpe2NvbnN0W28sdSxoXT10aGlzLnNwbGl0VG9rZW5zT25Vbmljb2RlKHIpLGE9W10scD1bXSxmPVtdLGQ9bmV3IFJlZ0V4cChgXlske1BVTkNUVUFUSU9OX1JFR0VYfV0kYCwiZ3UiKTtmb3IobGV0IGw9MDtsPG8ubGVuZ3RoOysrbCl7Y29uc3Qgbj1vW2xdLGU9dVtsXSxpPWhbbF0scz1lWzBdPj10aGlzLm1vZGVsLnRva2Vuc190b19pZHMuZ2V0KCI8fGVuZG9mdGV4dHw+IiksbT1uLnN0YXJ0c1dpdGgoIiAiKSxnPW4udHJpbSgpLF89ZC50ZXN0KGcpO2lmKHN8fG18fF98fGEubGVuZ3RoPT09MClhLnB1c2gobikscC5wdXNoKGUpLGYucHVzaChpKTtlbHNle2NvbnN0IGI9YS5sZW5ndGgtMTthW2JdKz1uLHBbYl0ucHVzaCguLi5lKSxmW2JdLnB1c2goLi4uaSl9fXJldHVyblthLHAsZl19bWVyZ2VQdW5jdHVhdGlvbnMocixvLHUsaCxhKXtjb25zdCBwPXN0cnVjdHVyZWRDbG9uZShyKSxmPXN0cnVjdHVyZWRDbG9uZShvKSxkPXN0cnVjdHVyZWRDbG9uZSh1KTtsZXQgbD1wLmxlbmd0aC0yLG49cC5sZW5ndGgtMTtmb3IoO2w+PTA7KXBbbF0uc3RhcnRzV2l0aCgiICIpJiZoLmluY2x1ZGVzKHBbbF0udHJpbSgpKT8ocFtuXT1wW2xdK3Bbbl0sZltuXT1tZXJnZUFycmF5cyhmW2xdLGZbbl0pLGRbbl09bWVyZ2VBcnJheXMoZFtsXSxkW25dKSxwW2xdPSIiLGZbbF09W10sZFtsXT1bXSk6bj1sLC0tbDtmb3IobD0wLG49MTtuPHAubGVuZ3RoOykhcFtsXS5lbmRzV2l0aCgiICIpJiZhLmluY2x1ZGVzKHBbbl0pPyhwW2xdKz1wW25dLGZbbF09bWVyZ2VBcnJheXMoZltsXSxmW25dKSxkW2xdPW1lcmdlQXJyYXlzKGRbbF0sZFtuXSkscFtuXT0iIixmW25dPVtdLGRbbl09W10pOmw9biwrK247cmV0dXJuW3AuZmlsdGVyKGU9PmUpLGYuZmlsdGVyKGU9PmUubGVuZ3RoPjApLGQuZmlsdGVyKGU9PmUubGVuZ3RoPjApXX1nZXRfZGVjb2Rlcl9wcm9tcHRfaWRzKHtsYW5ndWFnZTpyPW51bGwsdGFzazpvPW51bGwsbm9fdGltZXN0YW1wczp1PSEwfT17fSl7Y29uc3QgaD1bXTtpZihyKXtyPXIudG9Mb3dlckNhc2UoKTtsZXQgYT1XSElTUEVSX1RPX0xBTkdVQUdFX0NPREVfTUFQUElORy5nZXQocik7aWYoYT09PXZvaWQgMClpZihXSElTUEVSX0xBTkdVQUdFX01BUFBJTkcuaGFzKHIpKWE9cjtlbHNle2NvbnN0IGQ9ci5sZW5ndGg9PT0yP1dISVNQRVJfTEFOR1VBR0VfTUFQUElORy5rZXlzKCk6V0hJU1BFUl9MQU5HVUFHRV9NQVBQSU5HLnZhbHVlcygpO3Rocm93IG5ldyBFcnJvcihgTGFuZ3VhZ2UgIiR7cn0iIGlzIG5vdCBzdXBwb3J0ZWQuIE11c3QgYmUgb25lIG9mOiAke0pTT04uc3RyaW5naWZ5KGQpfWApfWNvbnN0IHA9dGhpcy5tb2RlbC50b2tlbnNfdG9faWRzLmdldChgPHwke2F9fD5gKTtpZihwPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgbGFuZ3VhZ2UgIiR7YX0iIGluIG1vZGVsIHZvY2FidWxhcnkuIFBsZWFzZSByZXBvcnQgdGhpcyBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20veGVub3ZhL3RyYW5zZm9ybWVycy5qcy9pc3N1ZXMvbmV3L2Nob29zZS5gKTtoLnB1c2gocCl9ZWxzZSBoLnB1c2gobnVsbCk7aWYobyl7aWYobz1vLnRvTG93ZXJDYXNlKCksbyE9PSJ0cmFuc2NyaWJlIiYmbyE9PSJ0cmFuc2xhdGUiKXRocm93IG5ldyBFcnJvcihgVGFzayAiJHtvfSIgaXMgbm90IHN1cHBvcnRlZC4gTXVzdCBiZSBvbmUgb2Y6IFsidHJhbnNjcmliZSIsICJ0cmFuc2xhdGUiXWApO2NvbnN0IGE9dGhpcy5tb2RlbC50b2tlbnNfdG9faWRzLmdldChgPHwke299fD5gKTtpZihhPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgdGFzayAiJHtvfSIgaW4gbW9kZWwgdm9jYWJ1bGFyeS4gUGxlYXNlIHJlcG9ydCB0aGlzIGlzc3VlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS94ZW5vdmEvdHJhbnNmb3JtZXJzLmpzL2lzc3Vlcy9uZXcvY2hvb3NlLmApO2gucHVzaChhKX1lbHNlIGgucHVzaChudWxsKTtpZih1KXtjb25zdCBhPXRoaXMubW9kZWwudG9rZW5zX3RvX2lkcy5nZXQoIjx8bm90aW1lc3RhbXBzfD4iKTtpZihhPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgIjx8bm90aW1lc3RhbXBzfD4iIGluIG1vZGVsIHZvY2FidWxhcnkuIFBsZWFzZSByZXBvcnQgdGhpcyBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20veGVub3ZhL3RyYW5zZm9ybWVycy5qcy9pc3N1ZXMvbmV3L2Nob29zZS4nKTtoLnB1c2goYSl9cmV0dXJuIGgubWFwKChhLHApPT5bcCsxLGFdKS5maWx0ZXIoYT0+YVsxXSE9PW51bGwpfX1jbGFzcyBDb2RlR2VuVG9rZW5pemVyIGV4dGVuZHMgUHJlVHJhaW5lZFRva2VuaXplcnt9Y2xhc3MgQ0xJUFRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7fWNsYXNzIFNpZ2xpcFRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7fWNsYXNzIE1hcmlhblRva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7Y29uc3RydWN0b3IodCxyKXtzdXBlcih0LHIpLHRoaXMubGFuZ3VhZ2VSZWdleD0vXig+Plx3Kzw8KVxzKi9nLHRoaXMuc3VwcG9ydGVkX2xhbmd1YWdlX2NvZGVzPXRoaXMubW9kZWwudm9jYWIuZmlsdGVyKG89PnRoaXMubGFuZ3VhZ2VSZWdleC50ZXN0KG8pKSxjb25zb2xlLndhcm4oJ1dBUk5JTkc6IGBNYXJpYW5Ub2tlbml6ZXJgIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IEh1Z2dpbmcgRmFjZVwncyAiZmFzdCIgdG9rZW5pemVycyBsaWJyYXJ5LiBUaGVyZWZvcmUsIHlvdSBtYXkgZXhwZXJpZW5jZSBzbGlnaHRseSBpbmFjY3VyYXRlIHJlc3VsdHMuJyl9X2VuY29kZV90ZXh0KHQpe2lmKHQ9PT1udWxsKXJldHVybiBudWxsO2NvbnN0W3IsLi4ub109dC50cmltKCkuc3BsaXQodGhpcy5sYW5ndWFnZVJlZ2V4KTtpZihvLmxlbmd0aD09PTApcmV0dXJuIHN1cGVyLl9lbmNvZGVfdGV4dChyKTtpZihvLmxlbmd0aD09PTIpe2NvbnN0W3UsaF09bztyZXR1cm4gdGhpcy5zdXBwb3J0ZWRfbGFuZ3VhZ2VfY29kZXMuaW5jbHVkZXModSl8fGNvbnNvbGUud2FybihgVW5zdXBwb3J0ZWQgbGFuZ3VhZ2UgY29kZSAiJHt1fSIgZGV0ZWN0ZWQsIHdoaWNoIG1heSBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IuIFNob3VsZCBiZSBvbmUgb2Y6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdXBwb3J0ZWRfbGFuZ3VhZ2VfY29kZXMpfWApLG1lcmdlQXJyYXlzKFt1XSxzdXBlci5fZW5jb2RlX3RleHQoaCkpfX19Y2xhc3MgV2F2MlZlYzJDVENUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUcmFpbmVkVG9rZW5pemVye31jbGFzcyBCbGVuZGVyYm90VG9rZW5pemVyIGV4dGVuZHMgUHJlVHJhaW5lZFRva2VuaXplcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Syh0aGlzLCJfZGVmYXVsdF9jaGF0X3RlbXBsYXRlIiwieyUgZm9yIG1lc3NhZ2UgaW4gbWVzc2FnZXMgJX17JSBpZiBtZXNzYWdlWydyb2xlJ10gPT0gJ3VzZXInICV9e3sgJyAnIH19eyUgZW5kaWYgJX17eyBtZXNzYWdlWydjb250ZW50J10gfX17JSBpZiBub3QgbG9vcC5sYXN0ICV9e3sgJyAgJyB9fXslIGVuZGlmICV9eyUgZW5kZm9yICV9e3sgZW9zX3Rva2VuIH19Iil9fWNsYXNzIEJsZW5kZXJib3RTbWFsbFRva2VuaXplciBleHRlbmRzIEJsZW5kZXJib3RUb2tlbml6ZXJ7fWNsYXNzIFNwZWVjaFQ1VG9rZW5pemVyIGV4dGVuZHMgUHJlVHJhaW5lZFRva2VuaXplcnt9Y2xhc3MgTm91Z2F0VG9rZW5pemVyIGV4dGVuZHMgUHJlVHJhaW5lZFRva2VuaXplcnt9Y2xhc3MgVml0c1Rva2VuaXplciBleHRlbmRzIFByZVRyYWluZWRUb2tlbml6ZXJ7Y29uc3RydWN0b3IodCxyKXtzdXBlcih0LHIpLHRoaXMuZGVjb2Rlcj1uZXcgVml0c0RlY29kZXIoe30pfX1jbGFzcyBDb2hlcmVUb2tlbml6ZXIgZXh0ZW5kcyBQcmVUcmFpbmVkVG9rZW5pemVye31jbGFzcyBBdXRvVG9rZW5pemVye3N0YXRpYyBhc3luYyBmcm9tX3ByZXRyYWluZWQodCx7cXVhbnRpemVkOnI9ITAscHJvZ3Jlc3NfY2FsbGJhY2s6bz1udWxsLGNvbmZpZzp1PW51bGwsY2FjaGVfZGlyOmg9bnVsbCxsb2NhbF9maWxlc19vbmx5OmE9ITEscmV2aXNpb246cD0ibWFpbiIsbGVnYWN5OmY9bnVsbH09e30pe3ZhciBpO2NvbnN0W2QsbF09YXdhaXQgbG9hZFRva2VuaXplcih0LHtxdWFudGl6ZWQ6cixwcm9ncmVzc19jYWxsYmFjazpvLGNvbmZpZzp1LGNhY2hlX2RpcjpoLGxvY2FsX2ZpbGVzX29ubHk6YSxyZXZpc2lvbjpwLGxlZ2FjeTpmfSksbj0oKGk9bC50b2tlbml6ZXJfY2xhc3MpPT1udWxsP3ZvaWQgMDppLnJlcGxhY2UoL0Zhc3QkLywiIikpPz8iUHJlVHJhaW5lZFRva2VuaXplciI7bGV0IGU9dGhpcy5UT0tFTklaRVJfQ0xBU1NfTUFQUElOR1tuXTtyZXR1cm4gZXx8KGNvbnNvbGUud2FybihgVW5rbm93biB0b2tlbml6ZXIgY2xhc3MgIiR7bn0iLCBhdHRlbXB0aW5nIHRvIGNvbnN0cnVjdCBmcm9tIGJhc2UgY2xhc3MuYCksZT1QcmVUcmFpbmVkVG9rZW5pemVyKSxuZXcgZShkLGwpfX1LKEF1dG9Ub2tlbml6ZXIsIlRPS0VOSVpFUl9DTEFTU19NQVBQSU5HIix7VDVUb2tlbml6ZXIsRGlzdGlsQmVydFRva2VuaXplcixDYW1lbWJlcnRUb2tlbml6ZXIsRGViZXJ0YVRva2VuaXplcixEZWJlcnRhVjJUb2tlbml6ZXIsQmVydFRva2VuaXplcixIZXJiZXJ0VG9rZW5pemVyLENvbnZCZXJ0VG9rZW5pemVyLFJvRm9ybWVyVG9rZW5pemVyLFhMTVRva2VuaXplcixFbGVjdHJhVG9rZW5pemVyLE1vYmlsZUJlcnRUb2tlbml6ZXIsU3F1ZWV6ZUJlcnRUb2tlbml6ZXIsQWxiZXJ0VG9rZW5pemVyLEdQVDJUb2tlbml6ZXIsQmFydFRva2VuaXplcixNQmFydFRva2VuaXplcixNQmFydDUwVG9rZW5pemVyLFJvYmVydGFUb2tlbml6ZXIsV2hpc3BlclRva2VuaXplcixDb2RlR2VuVG9rZW5pemVyLENMSVBUb2tlbml6ZXIsU2lnbGlwVG9rZW5pemVyLE1hcmlhblRva2VuaXplcixCbG9vbVRva2VuaXplcixObGxiVG9rZW5pemVyLE0yTTEwMFRva2VuaXplcixMbGFtYVRva2VuaXplcixDb2RlTGxhbWFUb2tlbml6ZXIsWExNUm9iZXJ0YVRva2VuaXplcixNUE5ldFRva2VuaXplcixGYWxjb25Ub2tlbml6ZXIsR1BUTmVvWFRva2VuaXplcixFc21Ub2tlbml6ZXIsV2F2MlZlYzJDVENUb2tlbml6ZXIsQmxlbmRlcmJvdFRva2VuaXplcixCbGVuZGVyYm90U21hbGxUb2tlbml6ZXIsU3BlZWNoVDVUb2tlbml6ZXIsTm91Z2F0VG9rZW5pemVyLFZpdHNUb2tlbml6ZXIsUXdlbjJUb2tlbml6ZXIsR2VtbWFUb2tlbml6ZXIsR3JvazFUb2tlbml6ZXIsQ29oZXJlVG9rZW5pemVyLFByZVRyYWluZWRUb2tlbml6ZXJ9KTthc3luYyBmdW5jdGlvbiBsb2FkQ29uZmlnKGMsdCl7cmV0dXJuIGF3YWl0IGdldE1vZGVsSlNPTihjLCJjb25maWcuanNvbiIsITAsdCl9Y2xhc3MgUHJldHJhaW5lZENvbmZpZ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLm1vZGVsX3R5cGU9bnVsbCx0aGlzLmlzX2VuY29kZXJfZGVjb2Rlcj0hMSxPYmplY3QuYXNzaWduKHRoaXMsdCl9c3RhdGljIGFzeW5jIGZyb21fcHJldHJhaW5lZCh0LHtwcm9ncmVzc19jYWxsYmFjazpyPW51bGwsY29uZmlnOm89bnVsbCxjYWNoZV9kaXI6dT1udWxsLGxvY2FsX2ZpbGVzX29ubHk6aD0hMSxyZXZpc2lvbjphPSJtYWluIn09e30pe2xldCBwPW8/P2F3YWl0IGxvYWRDb25maWcodCx7cHJvZ3Jlc3NfY2FsbGJhY2s6cixjb25maWc6byxjYWNoZV9kaXI6dSxsb2NhbF9maWxlc19vbmx5OmgscmV2aXNpb246YX0pO3JldHVybiBuZXcgdGhpcyhwKX19Y2xhc3MgQXV0b0NvbmZpZ3tzdGF0aWMgYXN5bmMgZnJvbV9wcmV0cmFpbmVkKC4uLnQpe3JldHVybiBQcmV0cmFpbmVkQ29uZmlnLmZyb21fcHJldHJhaW5lZCguLi50KX19Y2xhc3MgTG9naXRzUHJvY2Vzc29yTGlzdCBleHRlbmRzIENhbGxhYmxle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnByb2Nlc3NvcnM9W119cHVzaCh0KXt0aGlzLnByb2Nlc3NvcnMucHVzaCh0KX1leHRlbmQodCl7dGhpcy5wcm9jZXNzb3JzLnB1c2goLi4udCl9X2NhbGwodCxyKXtmb3IobGV0IG8gb2Ygcil0aGlzLnByb2Nlc3NvcnMuZm9yRWFjaCh1PT51KHQsbykpfVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHRoaXMucHJvY2Vzc29ycy52YWx1ZXMoKX19Y2xhc3MgTG9naXRzUHJvY2Vzc29yIGV4dGVuZHMgQ2FsbGFibGV7X2NhbGwodCxyKXt0aHJvdyBFcnJvcigiYF9jYWxsYCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gYSBzdWJjbGFzcyIpfX1jbGFzcyBGb3JjZVRva2Vuc0xvZ2l0c1Byb2Nlc3NvciBleHRlbmRzIExvZ2l0c1Byb2Nlc3Nvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZm9yY2VfdG9rZW5fbWFwPU9iamVjdC5mcm9tRW50cmllcyh0Pz9bXSl9X2NhbGwodCxyKXtsZXQgbz10aGlzLmZvcmNlX3Rva2VuX21hcFt0Lmxlbmd0aF07cmV0dXJuIGV4aXN0cyhvKSYmKHIuZGF0YS5maWxsKC0xLzApLHIuZGF0YVtvXT0wKSxyfX1jbGFzcyBGb3JjZWRCT1NUb2tlbkxvZ2l0c1Byb2Nlc3NvciBleHRlbmRzIExvZ2l0c1Byb2Nlc3Nvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuYm9zX3Rva2VuX2lkPXR9X2NhbGwodCxyKXtyZXR1cm4gdC5sZW5ndGg9PT0xJiYoci5kYXRhLmZpbGwoLTEvMCksci5kYXRhW3RoaXMuYm9zX3Rva2VuX2lkXT0wKSxyfX1jbGFzcyBGb3JjZWRFT1NUb2tlbkxvZ2l0c1Byb2Nlc3NvciBleHRlbmRzIExvZ2l0c1Byb2Nlc3Nvcntjb25zdHJ1Y3Rvcih0LHIpe3N1cGVyKCksdGhpcy5tYXhfbGVuZ3RoPXQsdGhpcy5mb3JjZWRfZW9zX3Rva2VuX2lkPXJ9X2NhbGwodCxyKXt9fWNsYXNzIFN1cHByZXNzVG9rZW5zQXRCZWdpbkxvZ2l0c1Byb2Nlc3NvciBleHRlbmRzIExvZ2l0c1Byb2Nlc3Nvcntjb25zdHJ1Y3Rvcih0LHIpe3N1cGVyKCksdGhpcy5iZWdpbl9zdXBwcmVzc190b2tlbnM9dCx0aGlzLmJlZ2luX2luZGV4PXJ9X2NhbGwodCxyKXtpZih0Lmxlbmd0aD09PXRoaXMuYmVnaW5faW5kZXgpZm9yKGxldCBvIG9mIHRoaXMuYmVnaW5fc3VwcHJlc3NfdG9rZW5zKXIuZGF0YVtvXT0tMS8wO3JldHVybiByfX1jbGFzcyBXaGlzcGVyVGltZVN0YW1wTG9naXRzUHJvY2Vzc29yIGV4dGVuZHMgTG9naXRzUHJvY2Vzc29ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5lb3NfdG9rZW5faWQ9dC5lb3NfdG9rZW5faWQsdGhpcy5ub190aW1lc3RhbXBzX3Rva2VuX2lkPXQubm9fdGltZXN0YW1wc190b2tlbl9pZCx0aGlzLnRpbWVzdGFtcF9iZWdpbj10aGlzLm5vX3RpbWVzdGFtcHNfdG9rZW5faWQrMSx0aGlzLmJlZ2luX2luZGV4PSh0LmZvcmNlZF9kZWNvZGVyX2lkc3x8W10pLmxlbmd0aCsyLHQuZm9yY2VkX2RlY29kZXJfaWRzLnNsaWNlKC0xKVswXVsxXT09PXRoaXMubm9fdGltZXN0YW1wc190b2tlbl9pZCYmKHRoaXMuYmVnaW5faW5kZXgtPTEpLHRoaXMubWF4X2luaXRpYWxfdGltZXN0YW1wX2luZGV4PXQubWF4X2luaXRpYWxfdGltZXN0YW1wX2luZGV4fV9jYWxsKHQscil7Y29uc3Qgbz1yLmRhdGE7aWYob1t0aGlzLm5vX3RpbWVzdGFtcHNfdG9rZW5faWRdPS0xLzAsdC5sZW5ndGg9PT10aGlzLmJlZ2luX2luZGV4LTEpcmV0dXJuIG8uZmlsbCgtMS8wKSxvW3RoaXMudGltZXN0YW1wX2JlZ2luXT0wLHI7Y29uc3QgdT10LnNsaWNlKHRoaXMuYmVnaW5faW5kZXgpLGg9dS5sZW5ndGg+PTEmJnVbdS5sZW5ndGgtMV0+PXRoaXMudGltZXN0YW1wX2JlZ2luLGE9dS5sZW5ndGg8Mnx8dVt1Lmxlbmd0aC0yXT49dGhpcy50aW1lc3RhbXBfYmVnaW47aWYoaCYmKGE/by5zdWJhcnJheSh0aGlzLnRpbWVzdGFtcF9iZWdpbikuZmlsbCgtMS8wKTpvLnN1YmFycmF5KDAsdGhpcy5lb3NfdG9rZW5faWQpLmZpbGwoLTEvMCkpLHQubGVuZ3RoPT09dGhpcy5iZWdpbl9pbmRleCYmdGhpcy5tYXhfaW5pdGlhbF90aW1lc3RhbXBfaW5kZXghPT1udWxsKXtjb25zdCBsPXRoaXMudGltZXN0YW1wX2JlZ2luK3RoaXMubWF4X2luaXRpYWxfdGltZXN0YW1wX2luZGV4O28uc3ViYXJyYXkobCsxKS5maWxsKC0xLzApfWNvbnN0IHA9bG9nX3NvZnRtYXgobyksZj1NYXRoLmxvZyhwLnN1YmFycmF5KHRoaXMudGltZXN0YW1wX2JlZ2luKS5tYXAoTWF0aC5leHApLnJlZHVjZSgobCxuKT0+bCtuKSksZD1tYXgocC5zdWJhcnJheSgwLHRoaXMudGltZXN0YW1wX2JlZ2luKSlbMF07cmV0dXJuIGY+ZCYmby5zdWJhcnJheSgwLHRoaXMudGltZXN0YW1wX2JlZ2luKS5maWxsKC0xLzApLHJ9fWNsYXNzIE5vUmVwZWF0TkdyYW1Mb2dpdHNQcm9jZXNzb3IgZXh0ZW5kcyBMb2dpdHNQcm9jZXNzb3J7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLm5vX3JlcGVhdF9uZ3JhbV9zaXplPXR9Z2V0TmdyYW1zKHQpe2NvbnN0IHI9dC5sZW5ndGgsbz1bXTtmb3IobGV0IGg9MDtoPHIrMS10aGlzLm5vX3JlcGVhdF9uZ3JhbV9zaXplOysraCl7Y29uc3QgYT1bXTtmb3IobGV0IHA9MDtwPHRoaXMubm9fcmVwZWF0X25ncmFtX3NpemU7KytwKWEucHVzaCh0W2grcF0pO28ucHVzaChhKX1jb25zdCB1PW5ldyBNYXA7Zm9yKGNvbnN0IGggb2Ygbyl7Y29uc3QgYT1oLnNsaWNlKDAsaC5sZW5ndGgtMSkscD1KU09OLnN0cmluZ2lmeShhKSxmPXUuZ2V0KHApPz9bXTtmLnB1c2goaFtoLmxlbmd0aC0xXSksdS5zZXQocCxmKX1yZXR1cm4gdX1nZXRHZW5lcmF0ZWROZ3JhbXModCxyKXtjb25zdCBvPXIuc2xpY2Uoci5sZW5ndGgrMS10aGlzLm5vX3JlcGVhdF9uZ3JhbV9zaXplLHIubGVuZ3RoKTtyZXR1cm4gdC5nZXQoSlNPTi5zdHJpbmdpZnkobykpPz9bXX1jYWxjQmFubmVkTmdyYW1Ub2tlbnModCl7Y29uc3Qgcj1bXTtpZih0Lmxlbmd0aCsxPHRoaXMubm9fcmVwZWF0X25ncmFtX3NpemUpcmV0dXJuIHI7e2NvbnN0IG89dGhpcy5nZXROZ3JhbXModCk7cmV0dXJuIHRoaXMuZ2V0R2VuZXJhdGVkTmdyYW1zKG8sdCl9fV9jYWxsKHQscil7Y29uc3Qgbz10aGlzLmNhbGNCYW5uZWROZ3JhbVRva2Vucyh0KTtmb3IoY29uc3QgdSBvZiBvKXIuZGF0YVt1XT0tMS8wO3JldHVybiByfX1jbGFzcyBSZXBldGl0aW9uUGVuYWx0eUxvZ2l0c1Byb2Nlc3NvciBleHRlbmRzIExvZ2l0c1Byb2Nlc3Nvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMucGVuYWx0eT10fV9jYWxsKHQscil7Zm9yKGNvbnN0IG8gb2YgdClyLmRhdGFbb108MD9yLmRhdGFbb10qPXRoaXMucGVuYWx0eTpyLmRhdGFbb10vPXRoaXMucGVuYWx0eTtyZXR1cm4gcn19Y2xhc3MgTWluTGVuZ3RoTG9naXRzUHJvY2Vzc29yIGV4dGVuZHMgTG9naXRzUHJvY2Vzc29ye2NvbnN0cnVjdG9yKHQscil7c3VwZXIoKSx0aGlzLm1pbl9sZW5ndGg9dCx0aGlzLmVvc190b2tlbl9pZD1BcnJheS5pc0FycmF5KHIpP3I6W3JdfV9jYWxsKHQscil7aWYodC5sZW5ndGg8dGhpcy5taW5fbGVuZ3RoKWZvcihjb25zdCBvIG9mIHRoaXMuZW9zX3Rva2VuX2lkKXIuZGF0YVtvXT0tMS8wO3JldHVybiByfX1jbGFzcyBNaW5OZXdUb2tlbnNMZW5ndGhMb2dpdHNQcm9jZXNzb3IgZXh0ZW5kcyBMb2dpdHNQcm9jZXNzb3J7Y29uc3RydWN0b3IodCxyLG8pe3N1cGVyKCksdGhpcy5wcm9tcHRfbGVuZ3RoX3RvX3NraXA9dCx0aGlzLm1pbl9uZXdfdG9rZW5zPXIsdGhpcy5lb3NfdG9rZW5faWQ9QXJyYXkuaXNBcnJheShvKT9vOltvXX1fY2FsbCh0LHIpe2lmKHQubGVuZ3RoLXRoaXMucHJvbXB0X2xlbmd0aF90b19za2lwPHRoaXMubWluX25ld190b2tlbnMpZm9yKGNvbnN0IHUgb2YgdGhpcy5lb3NfdG9rZW5faWQpci5kYXRhW3VdPS0xLzA7cmV0dXJuIHJ9fWNsYXNzIE5vQmFkV29yZHNMb2dpdHNQcm9jZXNzb3IgZXh0ZW5kcyBMb2dpdHNQcm9jZXNzb3J7Y29uc3RydWN0b3IodCxyKXtzdXBlcigpLHRoaXMuYmFkX3dvcmRzX2lkcz10LHRoaXMuZW9zX3Rva2VuX2lkPUFycmF5LmlzQXJyYXkocik/cjpbcl19X2NhbGwodCxyKXtmb3IoY29uc3QgbyBvZiB0aGlzLmJhZF93b3Jkc19pZHMpe2xldCB1PSEwO2ZvcihsZXQgaD0xO2g8PW8ubGVuZ3RoLTEmJm8ubGVuZ3RoPHQubGVuZ3RoOysraClpZihvLmF0KC1oLTEpIT09dC5hdCgtaCkpe3U9ITE7YnJlYWt9dSYmKHIuZGF0YVtvLmF0KC0xKV09LTEvMCl9cmV0dXJuIHJ9fWNvbnN0IEdlbmVyYXRpb25Db25maWc9Y2xhc3N7Y29uc3RydWN0b3IoYz17fSl7dGhpcy5tYXhfbGVuZ3RoPWMubWF4X2xlbmd0aD8/MjAsdGhpcy5tYXhfbmV3X3Rva2Vucz1jLm1heF9uZXdfdG9rZW5zPz9udWxsLHRoaXMubWluX2xlbmd0aD1jLm1pbl9sZW5ndGg/PzAsdGhpcy5taW5fbmV3X3Rva2Vucz1jLm1pbl9uZXdfdG9rZW5zPz9udWxsLHRoaXMuZWFybHlfc3RvcHBpbmc9Yy5lYXJseV9zdG9wcGluZz8/ITEsdGhpcy5tYXhfdGltZT1jLm1heF90aW1lPz9udWxsLHRoaXMuZG9fc2FtcGxlPWMuZG9fc2FtcGxlPz8hMSx0aGlzLm51bV9iZWFtcz1jLm51bV9iZWFtcz8/MSx0aGlzLm51bV9iZWFtX2dyb3Vwcz1jLm51bV9iZWFtX2dyb3Vwcz8/MSx0aGlzLnBlbmFsdHlfYWxwaGE9Yy5wZW5hbHR5X2FscGhhPz9udWxsLHRoaXMudXNlX2NhY2hlPWMudXNlX2NhY2hlPz8hMCx0aGlzLnRlbXBlcmF0dXJlPWMudGVtcGVyYXR1cmU/PzEsdGhpcy50b3Bfaz1jLnRvcF9rPz81MCx0aGlzLnRvcF9wPWMudG9wX3A/PzEsdGhpcy50eXBpY2FsX3A9Yy50eXBpY2FsX3A/PzEsdGhpcy5lcHNpbG9uX2N1dG9mZj1jLmVwc2lsb25fY3V0b2ZmPz8wLHRoaXMuZXRhX2N1dG9mZj1jLmV0YV9jdXRvZmY/PzAsdGhpcy5kaXZlcnNpdHlfcGVuYWx0eT1jLmRpdmVyc2l0eV9wZW5hbHR5Pz8wLHRoaXMucmVwZXRpdGlvbl9wZW5hbHR5PWMucmVwZXRpdGlvbl9wZW5hbHR5Pz8xLHRoaXMuZW5jb2Rlcl9yZXBldGl0aW9uX3BlbmFsdHk9Yy5lbmNvZGVyX3JlcGV0aXRpb25fcGVuYWx0eT8/MSx0aGlzLmxlbmd0aF9wZW5hbHR5PWMubGVuZ3RoX3BlbmFsdHk/PzEsdGhpcy5ub19yZXBlYXRfbmdyYW1fc2l6ZT1jLm5vX3JlcGVhdF9uZ3JhbV9zaXplPz8wLHRoaXMuYmFkX3dvcmRzX2lkcz1jLmJhZF93b3Jkc19pZHM/P251bGwsdGhpcy5mb3JjZV93b3Jkc19pZHM9Yy5mb3JjZV93b3Jkc19pZHM/P251bGwsdGhpcy5yZW5vcm1hbGl6ZV9sb2dpdHM9Yy5yZW5vcm1hbGl6ZV9sb2dpdHM/PyExLHRoaXMuY29uc3RyYWludHM9Yy5jb25zdHJhaW50cz8/bnVsbCx0aGlzLmZvcmNlZF9ib3NfdG9rZW5faWQ9Yy5mb3JjZWRfYm9zX3Rva2VuX2lkPz9udWxsLHRoaXMuZm9yY2VkX2Vvc190b2tlbl9pZD1jLmZvcmNlZF9lb3NfdG9rZW5faWQ/P251bGwsdGhpcy5yZW1vdmVfaW52YWxpZF92YWx1ZXM9Yy5yZW1vdmVfaW52YWxpZF92YWx1ZXM/PyExLHRoaXMuZXhwb25lbnRpYWxfZGVjYXlfbGVuZ3RoX3BlbmFsdHk9Yy5leHBvbmVudGlhbF9kZWNheV9sZW5ndGhfcGVuYWx0eT8/bnVsbCx0aGlzLnN1cHByZXNzX3Rva2Vucz1jLnN1cHByZXNzX3Rva2Vucz8/bnVsbCx0aGlzLmJlZ2luX3N1cHByZXNzX3Rva2Vucz1jLmJlZ2luX3N1cHByZXNzX3Rva2Vucz8/bnVsbCx0aGlzLmZvcmNlZF9kZWNvZGVyX2lkcz1jLmZvcmNlZF9kZWNvZGVyX2lkcz8/bnVsbCx0aGlzLm51bV9yZXR1cm5fc2VxdWVuY2VzPWMubnVtX3JldHVybl9zZXF1ZW5jZXM/PzEsdGhpcy5vdXRwdXRfYXR0ZW50aW9ucz1jLm91dHB1dF9hdHRlbnRpb25zPz8hMSx0aGlzLm91dHB1dF9oaWRkZW5fc3RhdGVzPWMub3V0cHV0X2hpZGRlbl9zdGF0ZXM/PyExLHRoaXMub3V0cHV0X3Njb3Jlcz1jLm91dHB1dF9zY29yZXM/PyExLHRoaXMucmV0dXJuX2RpY3RfaW5fZ2VuZXJhdGU9Yy5yZXR1cm5fZGljdF9pbl9nZW5lcmF0ZT8/ITEsdGhpcy5wYWRfdG9rZW5faWQ9Yy5wYWRfdG9rZW5faWQ/P251bGwsdGhpcy5ib3NfdG9rZW5faWQ9Yy5ib3NfdG9rZW5faWQ/P251bGwsdGhpcy5lb3NfdG9rZW5faWQ9Yy5lb3NfdG9rZW5faWQ/P251bGwsdGhpcy5lbmNvZGVyX25vX3JlcGVhdF9uZ3JhbV9zaXplPWMuZW5jb2Rlcl9ub19yZXBlYXRfbmdyYW1fc2l6ZT8/MCx0aGlzLmRlY29kZXJfc3RhcnRfdG9rZW5faWQ9Yy5kZWNvZGVyX3N0YXJ0X3Rva2VuX2lkPz9udWxsLHRoaXMuZ2VuZXJhdGlvbl9rd2FyZ3M9Yy5nZW5lcmF0aW9uX2t3YXJncz8/e319fTtjbGFzcyBTYW1wbGVyIGV4dGVuZHMgQ2FsbGFibGV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmdlbmVyYXRpb25fY29uZmlnPXR9X2NhbGwodCxyPS0xKXtyZXR1cm4gdGhpcy5zYW1wbGUodCxyKX1zYW1wbGUodCxyKXt0aHJvdyBFcnJvcigic2FtcGxlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzLiIpfWdldExvZ2l0cyh0LHIpe2xldCBvPXQuZGltcy5hdCgtMSksdT10LmRhdGE7aWYocj09PS0xKXU9dS5zbGljZSgtbyk7ZWxzZXtsZXQgaD1yKm87dT11LnNsaWNlKGgsaCtvKX1yZXR1cm4gdGhpcy5nZW5lcmF0aW9uX2NvbmZpZy50ZW1wZXJhdHVyZT4wJiYodT11Lm
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment