@decidables/discountable-elements 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/lib/discountableElements.esm.js +15 -11
- package/lib/discountableElements.esm.js.map +1 -1
- package/lib/discountableElements.esm.min.js +4 -4
- package/lib/discountableElements.esm.min.js.map +1 -1
- package/lib/discountableElements.umd.js +15 -11
- package/lib/discountableElements.umd.js.map +1 -1
- package/lib/discountableElements.umd.min.js +4 -4
- package/lib/discountableElements.umd.min.js.map +1 -1
- package/package.json +2 -2
- package/src/components/htd-calculation.js +4 -1
- package/src/components/htd-curves.js +4 -4
- package/src/equations/adk2v.js +4 -1
- package/src/examples/human.js +3 -1
- package/src/examples/interactive.js +3 -1
- package/src/examples/model.js +3 -1
|
@@ -1173,7 +1173,7 @@ const RF=2;let NF=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1173
1173
|
decidables-spinner {
|
|
1174
1174
|
border-radius: var(---border-radius);
|
|
1175
1175
|
}
|
|
1176
|
-
`]}render(){let t,e,n,i,s,c,a,l;this.
|
|
1176
|
+
`]}willUpdate(){this.alignState()}render(){let t,e,n,i,s,c,a,l;this.numeric?(t=J`<decidables-spinner class="a as" ?disabled=${!this.interactive} step="1" .value="${this.as}" @input=${this.asInput.bind(this)}>
|
|
1177
1177
|
<var class="math-var">A<sub class="subscript">ss</sub></var>
|
|
1178
1178
|
</decidables-spinner>`,e=J`<decidables-spinner class="d ds" ?disabled=${!this.interactive} min="0" step="1" .value="${this.ds}" @input=${this.dsInput.bind(this)}>
|
|
1179
1179
|
<var class="math-var">D<sub class="subscript">ss</sub></var>
|
|
@@ -1369,7 +1369,7 @@ const RF=2;let NF=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1369
1369
|
/* HACK: This gets Safari to correctly apply the filter! */
|
|
1370
1370
|
stroke: #0000ff;
|
|
1371
1371
|
}
|
|
1372
|
-
`]}render(){return J``}update(t){if(super.update(t),this.alignState(),Number.isNaN(this.width)||Number.isNaN(this.height)||Number.isNaN(this.rem))return;const e=this.width,n=this.height;let i,s;e/n>1.8?(s=n,i=1.8*s):(i=e,s=i/1.8);const c=2*this.rem,a=3*this.rem,l=3*this.rem,r=s-(c+a),o=i-(l+2*this.rem),g=parseInt(this.getComputedStyleValue("---transition-duration"),10),B=ko().domain([this.scale.time.min,this.scale.time.max]).range([0,o]),d=ko().domain([this.scale.value.min,this.scale.value.max]).range([r,0]),Q=hI().x((t=>B(t.d))).y((t=>d(t.v))),I=Mn(this.renderRoot).selectAll(".main").data([{width:this.width,height:this.height,rem:this.rem}]),F=I.enter().append("svg").classed("main",!0);F.html(xF.svgDefs);const u=F.merge(I).attr("viewBox",`0 0 ${i} ${s}`),h=F.append("g").classed("plot",!0),U=u.select(".plot").attr("transform",`translate(${l}, ${c})`);h.append("clipPath").attr("id","clip-htd-curves").append("rect"),U.select("clipPath rect").attr("height",r+1).attr("width",o+1);const b=h.append("g").classed("underlayer",!0),C=U.select(".underlayer");b.append("rect").classed("background",!0),C.select(".background").attr("height",r).attr("width",o),b.append("g").classed("axis-x",!0);C.select(".axis-x").attr("transform",`translate(0, ${d(0)})`).transition().duration(2*g).ease(zc).call(me(B)).attr("font-size",null).attr("font-family",null).selectAll("line, path").attr("stroke",null);const y=b.append("text").classed("title-x",!0).attr("text-anchor","middle");y.append("tspan").classed("name",!0).text("Delay ("),y.append("tspan").classed("math-var d",!0).text("D"),y.append("tspan").classed("name",!0).text(")"),C.select(".title-x").attr("transform",`translate(${o/2}, ${r+2.25*this.rem})`),b.append("g").classed("axis-y",!0);var f;C.select(".axis-y").transition().duration(2*g).ease(zc).call((f=d,pe(he,f))).attr("font-size",null).attr("font-family",null).selectAll("line, path").attr("stroke",null);const G=b.append("text").classed("title-y",!0).attr("text-anchor","middle");G.append("tspan").classed("name",!0).text("Value ("),G.append("tspan").classed("math-var v",!0).text("V"),G.append("tspan").classed("name",!0).text(")"),C.select(".title-y").attr("transform",`translate(${-2*this.rem}, ${r/2})rotate(-90)`),h.append("g").classed("content",!0);const p=U.select(".content").selectAll(".option").data(this.options.filter((t=>null!==t.a&&null!==t.d)),(t=>t.name)),m=p.enter().append("g").classed("option",!0);m.append("path").classed("curve",!0).attr("clip-path","url(#clip-htd-curves)").attr("d",(t=>{const e=ge(B(t.d),B(0),-1).map((e=>({d:B.invert(e),v:$F.adk2v(t.a,t.d-B.invert(e),this.k)})));return Q(e)})).attr("stroke-dasharray",((t,e,n)=>{if(t.trial){return`0,${n[e].getTotalLength()}`}return"none"})),m.append("line").classed("bar",!0).attr("x1",(t=>B(t.d))).attr("x2",(t=>B(t.d))).attr("y1",d(0)).attr("y2",(t=>d(t.a))).attr("stroke-dasharray",((t,e,n)=>{if(t.trial){return`0,${n[e].getTotalLength()}`}return"none"}));const A=m.append("g").classed("point",!0).attr("transform",(t=>`translate(${B(t.d)}, ${d(t.a)})`)).attr("opacity",(t=>t.trial?0:1));A.append("circle").classed("mark",!0),A.append("text").classed("label",!0);const x=m.merge(p);x.filter(((t,e,n)=>this.interactive&&!n[e].classList.contains("interactive"))).select(".curve").classed("interactive",!0).attr("tabindex",0).call(ni().subject((t=>({x:t.x,y:t.y}))).on("start",(t=>{Mn(t.currentTarget).classed("dragging",!0)})).on("drag",((t,e)=>{this.drag=!0;const n=e.d-B.invert(t.x),i=n<0?0:n>e.d?e.d:n,s=d.invert(t.y),c=s<=0?.001:s>e.a?e.a:s,a=$F.adv2k(e.a,i,c);this.k=a<this.scale.discount.min?this.scale.discount.min:a>this.scale.discount.max?this.scale.discount.max:this.scale.discount.round(a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))})).on("end",(t=>{Mn(t.currentTarget).classed("dragging",!1)}))).on("keydown",((t,e)=>{if(["ArrowUp","ArrowDown","ArrowRight","ArrowLeft"].includes(t.key)){let n=this.k;switch(t.key){case"ArrowUp":case"ArrowLeft":n*=t.shiftKey?.95:.85;break;case"ArrowDown":case"ArrowRight":n*=t.shiftKey?1.05:1.15}n=n<this.scale.discount.min?this.scale.discount.min:n>this.scale.discount.max?this.scale.discount.max:this.scale.discount.round(n),n!==this.k&&(this.k=n,this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))),t.preventDefault()}})),x.filter(((t,e,n)=>this.interactive&&!t.trial&&!n[e].classList.contains("interactive"))).select(".bar").classed("interactive",!0).attr("tabindex",0).call(ni().subject(((t,e)=>({x:B(e.d),y:d(e.a)}))).on("start",(t=>{Mn(t.currentTarget).classed("dragging",!0)})).on("drag",((t,e)=>{this.drag=!0;const n=B.invert(t.x);e.d=n<this.scale.time.min?this.scale.time.min:n>this.scale.time.max?this.scale.time.max:this.scale.time.round(n),"default"===e.name&&(this.d=e.d),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))})).on("end",(t=>{Mn(t.currentTarget).classed("dragging",!1)}))).on("keydown",((t,e)=>{if(["ArrowLeft","ArrowRight"].includes(t.key)){let n=e.d;switch(t.key){case"ArrowRight":n+=t.shiftKey?1:5;break;case"ArrowLeft":n-=t.shiftKey?1:5}n=n<this.scale.time.min?this.scale.time.min:n>this.scale.time.max?this.scale.time.max:n,n!==e.d&&(e.d=n,"default"===e.name&&(this.d=e.d),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))),t.preventDefault()}})),x.filter(((t,e,n)=>this.interactive&&!t.trial&&!n[e].classList.contains("interactive"))).select(".point").classed("interactive",!0).attr("tabindex",0).call(ni().subject(((t,e)=>({x:B(e.d),y:d(e.a)}))).on("start",(t=>{Mn(t.currentTarget).classed("dragging",!0)})).on("drag",((t,e)=>{this.drag=!0;const n=d.invert(t.y);e.a=n<this.scale.value.min?this.scale.value.min:n>this.scale.value.max?this.scale.value.max:this.scale.value.round(n),"default"===e.name&&(this.a=e.a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))})).on("end",(t=>{Mn(t.currentTarget).classed("dragging",!1)}))).on("keydown",((t,e)=>{if(["ArrowUp","ArrowDown"].includes(t.key)){let n=e.a;switch(t.key){case"ArrowUp":n+=t.shiftKey?1:5;break;case"ArrowDown":n-=t.shiftKey?1:5}n=n<this.scale.value.min?this.scale.value.min:n>this.scale.value.max?this.scale.value.max:n,n!==e.a&&(e.a=n,"default"===e.name&&(this.a=e.a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))),t.preventDefault()}})),x.filter(((t,e,n)=>!this.interactive&&n[e].classList.contains("interactive"))).select(".curve").classed("interactive",!1).attr("tabindex",null).on("drag",null).on("keydown",null),x.filter(((t,e,n)=>(!this.interactive||t.trial)&&n[e].classList.contains("interactive"))).select(".bar").classed("interactive",!1).attr("tabindex",null).on("drag",null).on("keydown",null),x.filter(((t,e,n)=>(!this.interactive||t.trial)&&n[e].classList.contains("interactive"))).select(".point").classed("interactive",!1).attr("tabindex",null).on("drag",null).on("keydown",null),x.filter((t=>t.new)).select(".curve").transition().duration(g).delay(g+g/10).ease(Tc).attrTween("stroke-dasharray",((t,e,n)=>{const i=n[e].getTotalLength();return Rs(`0,${i}`,`${i},0`)})).on("end",(t=>{t.new=!1,this.dispatchEvent(new CustomEvent("discountable-response",{detail:{trial:this.trialCount,as:this.as,ds:this.ds,al:this.al,dl:this.dl,response:this.response},bubbles:!0}))})),x.filter((t=>t.new)).select(".bar").transition().duration(g).ease(Tc).attrTween("stroke-dasharray",((t,e,n)=>{const i=n[e].getTotalLength();return Rs(`0,${i}`,`${i},${i}`)})),x.filter((t=>t.new)).select(".point").transition().duration(g/10).delay(g).ease(Tc).attrTween("opacity",(()=>Rs(0,1))),p.select(".curve").transition().duration(this.drag?0:this.firstUpdate?2*g:g).ease(zc).attrTween("d",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.a?i.a:t.a,t.a),c=Rs(void 0!==i.d?i.d:t.d,t.d);return t=>{i.a=s(t),i.d=c(t);const e=ge(B(i.d),B(0),-1).map((t=>({d:B.invert(t),v:$F.adk2v(i.a,i.d-B.invert(t),this.k)})));return Q(e)}})),p.select(".bar").transition().duration(this.drag?0:this.firstUpdate?2*g:g).ease(zc).attrTween("x1",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.d?i.d:t.d,t.d);return t=>(i.d=s(t),`${B(i.d)}`)})).attrTween("x2",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.d?i.d:t.d,t.d);return t=>(i.d=s(t),`${B(i.d)}`)})).attrTween("y2",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.a?i.a:t.a,t.a);return t=>(i.a=s(t),`${d(i.a)}`)})),p.select(".point").transition().duration(this.drag?0:this.firstUpdate?2*g:g).ease(zc).attrTween("transform",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.d?i.d:t.d,t.d),c=Rs(void 0!==i.a?i.a:t.a,t.a);return t=>(i.d=s(t),i.a=c(t),`translate(${B(i.d)}, ${d(i.a)})`)})),x.select(".point .label").text((t=>t.label)),p.exit().remove(),this.drag=!1,this.firstUpdate=!1}}function nu(t){return null!=t&&!Number.isNaN(t)}function iu(t,e){return+nu(e)-+nu(t)||ot(t,e)}function su(t,e){return+nu(e)-+nu(t)||gt(t,e)}function cu(t){return null!=t&&""!=`${t}`}function au(t){return isFinite(t)?t:NaN}function lu(t){return t>0&&isFinite(t)?t:NaN}function ru(t){return t<0&&isFinite(t)?t:NaN}function ou(t,e){if(t instanceof Date||(t=new Date(+t)),isNaN(t))return"function"==typeof e?e(t):e;const n=t.getUTCHours(),i=t.getUTCMinutes(),s=t.getUTCSeconds(),c=t.getUTCMilliseconds();return`${a=t.getUTCFullYear(),a<0?`-${gu(-a,6)}`:a>9999?`+${gu(a,6)}`:gu(a,4)}-${gu(t.getUTCMonth()+1,2)}-${gu(t.getUTCDate(),2)}${n||i||s||c?`T${gu(n,2)}:${gu(i,2)}${s||c?`:${gu(s,2)}${c?`.${gu(c,3)}`:""}`:""}Z`:""}`;var a}function gu(t,e){return`${t}`.padStart(e,"0")}customElements.define("htd-curves",eu);const Bu=/^(?:[-+]\d{2})?\d{4}(?:-\d{2}(?:-\d{2})?)?(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d{3})?)?(?:Z|[-+]\d{2}:?\d{2})?)?$/;function du(t,e){return Bu.test(t+="")?new Date(t):"function"==typeof e?e(t):e}const Qu=1e3,Iu=6e4,Fu=36e5,uu=864e5,hu=7*uu,Uu=30*uu,bu=365*uu,Cu=[["millisecond",1],["2 milliseconds",2],["5 milliseconds",5],["10 milliseconds",10],["20 milliseconds",20],["50 milliseconds",50],["100 milliseconds",100],["200 milliseconds",200],["500 milliseconds",500],["second",Qu],["5 seconds",5e3],["15 seconds",15e3],["30 seconds",3e4],["minute",Iu],["5 minutes",3e5],["15 minutes",9e5],["30 minutes",18e5],["hour",Fu],["3 hours",108e5],["6 hours",216e5],["12 hours",432e5],["day",uu],["2 days",2*uu],["week",hu],["2 weeks",2*hu],["month",Uu],["3 months",3*Uu],["6 months",6*Uu],["year",bu],["2 years",2*bu],["5 years",5*bu],["10 years",10*bu],["20 years",20*bu],["50 years",50*bu],["100 years",100*bu]],yu=new Map([["second",Qu],["minute",Iu],["hour",Fu],["day",uu],["monday",hu],["tuesday",hu],["wednesday",hu],["thursday",hu],["friday",hu],["saturday",hu],["sunday",hu],["week",hu],["month",Uu],["year",bu]]),fu=new Map([["second",yg],["minute",fg],["hour",pg],["day",Ag],["monday",Ng],["tuesday",Xg],["wednesday",vg],["thursday",Zg],["friday",Eg],["saturday",Vg],["sunday",Rg],["week",Rg],["month",Tg],["year",Kg]]),Gu=new Map([["second",yg],["minute",Gg],["hour",mg],["day",Lg],["monday",Hg],["tuesday",Dg],["wednesday",Yg],["thursday",kg],["friday",Jg],["saturday",Mg],["sunday",Wg],["week",Wg],["month",zg],["year",Og]]),pu=Symbol("intervalDuration"),mu=Symbol("intervalType");for(const[t,e]of fu)e[pu]=yu.get(t),e[mu]="time";for(const[t,e]of Gu)e[pu]=yu.get(t),e[mu]="utc";const Au=[["year",Og,"utc"],["year",Kg,"time"],["month",zg,"utc"],["month",Tg,"time"],["day",Lg,"utc",6*Uu],["day",Ag,"time",6*Uu],["hour",mg,"utc",3*uu],["minute",Gg,"utc",216e5],["second",yg,"utc",18e5]];function xu(t,e,n){let i=`${t}`.toLowerCase();i.endsWith("s")&&(i=i.slice(0,-1));let s=1;const c=/^(?:(\d+)\s+)/.exec(i);switch(c&&(i=i.slice(c[0].length),s=+c[1]),i){case"quarter":i="month",s*=3;break;case"half":i="month",s*=6}let a=e.get(i);if(!a)throw new Error(`unknown interval: ${t}`);if(s>1){if(!a.every)throw new Error(`non-periodic interval: ${i}`);a=a.every(s),a[pu]=yu.get(i)*s,a[mu]=n}return a}function Lu(t){return xu(t,fu,"time")}function Su(t){return xu(t,Gu,"utc")}function Ru(t,e){if(!(e>1))return;const n=t[pu];if(!Cu.some((([,t])=>t===n)))return;if(n%uu==0&&uu<n&&n<Uu)return;const[i]=Cu[Bt((([,t])=>Math.log(t))).center(Cu,Math.log(n*e))];return("time"===t[mu]?Lu:Su)(i)}function Nu(t,e,n){const i="time"===e?sB:cB;if(null==n)return i("year"===t?"%Y":"month"===t?"%Y-%m":"day"===t?"%Y-%m-%d":"hour"===t||"minute"===t?"%Y-%m-%dT%H:%M":"second"===t?"%Y-%m-%dT%H:%M:%S":"%Y-%m-%dT%H:%M:%S.%L");const s=function(t){return"left"===t||"right"===t?(t,e)=>`\n${t}\n${e}`:"top"===t?(t,e)=>`${e}\n${t}`:(t,e)=>`${t}\n${e}`}(n);switch(t){case"millisecond":return vu(i(".%L"),i(":%M:%S"),s);case"second":return vu(i(":%S"),i("%-I:%M"),s);case"minute":return vu(i("%-I:%M"),i("%p"),s);case"hour":return vu(i("%-I %p"),i("%b %-d"),s);case"day":return vu(i("%-d"),i("%b"),s);case"month":return vu(i("%b"),i("%Y"),s);case"year":return i("%Y")}throw new Error("unable to format time ticks")}function Xu(t,e){const n=Ot(function(t,e=oe){const n=[];let i,s=!1;for(const c of t)s&&n.push(e(i,c)),i=c,s=!0;return n}(t,((t,e)=>Math.abs(e-t))));if(n<1e3)return Nu("millisecond","utc",e);for(const[i,s,c,a]of Au){if(n>a)break;if("hour"===i&&!n)break;if(t.every((t=>s.floor(t)>=t)))return Nu(i,c,e)}}function vu(t,e,n){return(i,s,c)=>{const a=t(i,s),l=e(i,s),r=s-Jh(c);return s!==r&&void 0!==c[r]&&l===e(c[r],r)?a:n(a,l)}}const Zu=Object.getPrototypeOf(Uint8Array),Eu=Object.prototype.toString,Vu=Symbol("reindex");function wu(t,e,n){const i=typeof e;return"string"===i?Wu(t,Yu(e),n):"function"===i?Wu(t,e,n):"number"===i||e instanceof Date||"boolean"===i?ah(t,Pu(e),n):"function"==typeof e?.transform?Hu(e.transform(t),n):function(t,e){return e?uh(t,e):t}(Hu(e,n),t?.[Vu])}function Wu(t,e,n){return ah(t,n?.prototype instanceof Zu?function(t){return(e,n)=>$u(t(e,n))}(e):e,n)}function Hu(t,e){return void 0===e?ch(t):t instanceof e?t:e.prototype instanceof Zu&&!(t instanceof Zu)?e.from(t,$u):e.from(t)}const Du=[null],Yu=t=>e=>e[t],ku={transform:Fh},Ju={transform:t=>t},Mu=()=>1,Tu=()=>!0,zu=t=>null==t?t:`${t}`,Ku=t=>null==t?t:+t,Ou=t=>t?t[0]:void 0,_u=t=>t?t[1]:void 0,Pu=t=>()=>t;function ju(t){return t instanceof Zu?t:ah(t,$u,Float64Array)}function $u(t){return null==t?NaN:Number(t)}function qu(t){return ah(t,th)}function th(t){return t instanceof Date&&!isNaN(t)?t:"string"==typeof t?du(t):null==t||isNaN(t=+t)?void 0:new Date(t)}function eh(t,e){return void 0===t&&(t=e),null===t?[void 0,"none"]:wh(t)?[void 0,t]:[t,void 0]}function nh(t,e){return void 0===t&&(t=e),null===t||"number"==typeof t?[void 0,t]:[t,void 0]}function ih(t,e,n){if(null!=t)return sh(t,e,n)}function sh(t,e,n){const i=`${t}`.toLowerCase();if(!n.includes(i))throw new Error(`invalid ${e}: ${t}`);return i}function ch(t){return null==t||t instanceof Array||t instanceof Zu?t:Array.from(t)}function ah(t,e,n=Array){return null==t?t:t instanceof n?t.map(e):n.from(t,e)}function lh(t,e=Array){return t instanceof e?t.slice():e.from(t)}function rh({y:t,y1:e,y2:n}){return void 0!==t||void 0!==e||void 0!==n}function oh(t){return t?.toString===Eu}function gh(t){return oh(t)&&(void 0!==t.type||void 0!==t.domain)}function Bh(t){return oh(t)&&"function"!=typeof t.transform}function dh(t){return Bh(t)&&void 0===t.value&&void 0===t.channel}function Qh(t,e){return void 0===t&&void 0===e?[Ou,_u]:[t,e]}function Ih({z:t,fill:e,stroke:n}={}){return void 0===t&&([t]=eh(e)),void 0===t&&([t]=eh(n)),t}function Fh(t){const e=t.length,n=new Uint32Array(e);for(let t=0;t<e;++t)n[t]=t;return n}function uh(t,e){return ah(e,(e=>t[e]),t.constructor)}function hh(t,e,n){return t.subarray?t.subarray(e,n):t.slice(e,n)}function Uh(t){return null!==t&&"object"==typeof t?t.valueOf():t}function bh(t){let e;return[{transform:()=>e,label:yh(t)},t=>e=t]}function Ch(t){return null==t?[t]:bh(t)}function yh(t,e){return"string"==typeof t?t:t&&void 0!==t.label?t.label:e}function fh(t,e){return{transform(n){const i=t.transform(n),s=e.transform(n);return Xh(i)||Xh(s)?ah(i,((t,e)=>new Date((+i[e]+ +s[e])/2))):ah(i,((t,e)=>(+i[e]+ +s[e])/2),Float64Array)},label:t.label}}function Gh(t,e){const n=ph(e?.interval,e?.type);return n?ah(t,n):t}function ph(t,e){const n=mh(t,e);return n&&(t=>nu(t)?n.floor(t):t)}function mh(t,e){if(null!=t){if("number"==typeof t){0<t&&t<1&&Number.isInteger(1/t)&&(t=-1/t);const e=Math.abs(t);return t<0?{floor:t=>Math.floor(t*e)/e,offset:t=>(t*e+1)/e,range:(t,n)=>ge(Math.ceil(t*e),n*e).map((t=>t/e))}:{floor:t=>Math.floor(t/e)*e,offset:t=>t+e,range:(t,n)=>ge(Math.ceil(t/e),n/e).map((t=>t*e))}}if("string"==typeof t)return("time"===e?Lu:Su)(t);if("function"!=typeof t.floor)throw new Error("invalid interval; missing floor method");if("function"!=typeof t.offset)throw new Error("invalid interval; missing offset method");return t}}function Ah(t,e){if((t=mh(t,e))&&"function"!=typeof t.range)throw new Error("invalid interval: missing range method");return t}function xh(t){return"function"==typeof t?.range}function Lh(t){return void 0===t||Bh(t)?t:{value:t}}function Sh(t){return t&&"function"==typeof t[Symbol.iterator]}function Rh(t){for(const e of t)if(null!=e)return"object"!=typeof e||e instanceof Date}function Nh(t){for(const e of t){if(null==e)continue;const t=typeof e;return"string"===t||"boolean"===t}}function Xh(t){for(const e of t)if(null!=e)return e instanceof Date}function vh(t){for(const e of t)if(null!=e)return"string"==typeof e&&isNaN(e)&&du(e)}function Zh(t){for(const e of t)if(null!=e){if("string"!=typeof e)return!1;if(e.trim())return!isNaN(e)}}function Eh(t,e){let n;for(const i of t)if(null!=i){if(!e(i))return!1;n=!0}return n}const Vh=new Set("none,currentcolor,transparent,aliceblue,antiquewhite,aqua,aquamarine,azure,beige,bisque,black,blanchedalmond,blue,blueviolet,brown,burlywood,cadetblue,chartreuse,chocolate,coral,cornflowerblue,cornsilk,crimson,cyan,darkblue,darkcyan,darkgoldenrod,darkgray,darkgreen,darkgrey,darkkhaki,darkmagenta,darkolivegreen,darkorange,darkorchid,darkred,darksalmon,darkseagreen,darkslateblue,darkslategray,darkslategrey,darkturquoise,darkviolet,deeppink,deepskyblue,dimgray,dimgrey,dodgerblue,firebrick,floralwhite,forestgreen,fuchsia,gainsboro,ghostwhite,gold,goldenrod,gray,green,greenyellow,grey,honeydew,hotpink,indianred,indigo,ivory,khaki,lavender,lavenderblush,lawngreen,lemonchiffon,lightblue,lightcoral,lightcyan,lightgoldenrodyellow,lightgray,lightgreen,lightgrey,lightpink,lightsalmon,lightseagreen,lightskyblue,lightslategray,lightslategrey,lightsteelblue,lightyellow,lime,limegreen,linen,magenta,maroon,mediumaquamarine,mediumblue,mediumorchid,mediumpurple,mediumseagreen,mediumslateblue,mediumspringgreen,mediumturquoise,mediumvioletred,midnightblue,mintcream,mistyrose,moccasin,navajowhite,navy,oldlace,olive,olivedrab,orange,orangered,orchid,palegoldenrod,palegreen,paleturquoise,palevioletred,papayawhip,peachpuff,peru,pink,plum,powderblue,purple,rebeccapurple,red,rosybrown,royalblue,saddlebrown,salmon,sandybrown,seagreen,seashell,sienna,silver,skyblue,slateblue,slategray,slategrey,snow,springgreen,steelblue,tan,teal,thistle,tomato,turquoise,violet,wheat,white,whitesmoke,yellow".split(","));function wh(t){return"string"==typeof t&&(t=t.toLowerCase().trim(),/^#[0-9a-f]{3,8}$/.test(t)||/^(?:url|var|rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix)\(.*\)$/.test(t)||Vh.has(t))}function Wh(t){return"number"==typeof t&&(0<=t&&t<=1||isNaN(t))}function Hh(t){return null==t||Dh(t)}function Dh(t){return/^\s*none\s*$/i.test(t)}function Yh(t,e){return ih(t,e,["middle","top-left","top","top-right","right","bottom-right","bottom","bottom-left","left"])}function kh(t="middle"){return Yh(t,"frameAnchor")}function Jh(t){if(null==t)return;return gt(t[0],t[t.length-1])}function Mh(t){return Sh(t)?function(t){console.warn("named iterables are deprecated; please use an object instead");const e=new Set;return Object.fromEntries(Array.from(t,(t=>{const{name:n}=t;if(null==n)throw new Error("missing name");const i=`${n}`;if("__proto__"===i)throw new Error(`illegal name: ${i}`);if(e.has(i))throw new Error(`duplicate name: ${i}`);return e.add(i),[n,t]})))}(t):t}const Th=Symbol("position"),zh=Symbol("color"),Kh=Symbol("radius"),Oh=Symbol("length"),_h=Symbol("opacity"),Ph=Symbol("symbol"),jh=Symbol("projection"),$h=new Map([["x",Th],["y",Th],["fx",Th],["fy",Th],["r",Kh],["color",zh],["opacity",_h],["symbol",Ph],["length",Oh],["projection",jh]]);const qh=2/Math.sqrt(3),tU=new Map([["asterisk",CI],["circle",yI],["cross",fI],["diamond",mI],["diamond2",AI],["hexagon",{draw(t,e){const n=Math.sqrt(e/Math.PI),i=n*qh,s=i/2;t.moveTo(0,i),t.lineTo(n,s),t.lineTo(n,-s),t.lineTo(0,-i),t.lineTo(-n,-s),t.lineTo(-n,s),t.closePath()}}],["plus",xI],["square",LI],["square2",SI],["star",vI],["times",JI],["triangle",EI],["triangle2",wI],["wye",kI]]);function eU(t){return t&&"function"==typeof t.draw}function nU(t){return!!eU(t)||"string"==typeof t&&tU.has(t.toLowerCase())}function iU(t){if(null==t||eU(t))return t;const e=tU.get(`${t}`.toLowerCase());if(e)return e;throw new Error(`invalid symbol: ${t}`)}function sU({filter:t,sort:e,reverse:n,transform:i,initializer:s,...c}={},a){if(void 0===i&&(null!=t&&(i=rU(t)),null==e||dh(e)||(i=aU(i,gU(e))),n&&(i=aU(i,oU))),null!=a&&null!=s)throw new Error("transforms cannot be applied after initializers");return{...c,...(null===e||dh(e))&&{sort:e},transform:aU(i,a)}}function cU({filter:t,sort:e,reverse:n,initializer:i,...s}={},c){return void 0===i&&(null!=t&&(i=rU(t)),null==e||dh(e)||(i=lU(i,gU(e))),n&&(i=lU(i,oU))),{...s,...(null===e||dh(e))&&{sort:e},initializer:lU(i,c)}}function aU(t,e){return null==t?null===e?void 0:e:null==e?null===t?void 0:t:function(n,i,s){return({data:n,facets:i}=t.call(this,n,i,s)),e.call(this,ch(n),i,s)}}function lU(t,e){return null==t?null===e?void 0:e:null==e?null===t?void 0:t:function(n,i,s,...c){let a,l,r,o,g,B;return({data:l=n,facets:r=i,channels:a}=t.call(this,n,i,s,...c)),({data:g=l,facets:B=r,channels:o}=e.call(this,l,r,{...s,...a},...c)),{data:g,facets:B,channels:{...a,...o}}}}function rU(t){return(e,n)=>{const i=wu(e,t);return{data:e,facets:n.map((t=>t.filter((t=>i[t]))))}}}function oU(t,e){return{data:t,facets:e.map((t=>t.slice().reverse()))}}function gU(t){return("function"==typeof t&&1!==t.length?BU:dU)(t)}function BU(t){return(e,n)=>{const i=(n,i)=>t(e[n],e[i]);return{data:e,facets:n.map((t=>t.slice().sort(i)))}}}function dU(t){let e,n;({channel:e,value:t,order:n}={...Lh(t)});const i=e?.startsWith("-");if(i&&(e=e.slice(1)),void 0===n&&(n=i?su:iu),"function"!=typeof n)switch(`${n}`.toLowerCase()){case"ascending":n=iu;break;case"descending":n=su;break;default:throw new Error(`invalid order: ${n}`)}return(i,s,c)=>{let a;if(void 0===e)a=wu(i,t);else{if(void 0===c)throw new Error("channel sort requires an initializer");if(a=c[e],!a)return{};a=a.value}const l=(t,e)=>n(a[t],a[e]);return{data:i,facets:s.map((t=>t.slice().sort(l)))}}}function QU(t,...e){for(const{name:n}of t)if(e.includes(n))return!0;return!1}function IU(t,e,n,i=FU){let s;oh(e)&&"reduce"in e&&(s=e.scale,e=e.reduce);const c=i(t,e,n),[a,l]=bh(c.label);let r;return{name:t,output:void 0===s?a:{value:a,scale:s},initialize(t){c.initialize(t),r=l([])},scope(t,e){c.scope(t,e)},reduce(t,e){r.push(c.reduce(t,e))}}}function FU(t,e,n,i=hU){const s=function(t,e){if(void 0!==e[t])return e[t];switch(t){case"x1":case"x2":t="x";break;case"y1":case"y2":t="y"}return e[t]}(t,n),c=i(e,s);let a,l;return{label:yh(c===mU?null:s,c.label),initialize(t){a=void 0===s?t:wu(t,s),"data"===c.scope&&(l=c.reduceIndex(Fh(t),a))},scope(t,e){c.scope===t&&(l=c.reduceIndex(e,a))},reduce:(t,e)=>null==c.scope?c.reduceIndex(t,a,e):c.reduceIndex(t,a,l,e)}}function uU(t,e){return e?Vt(Xt(t,(t=>e[t])),Ou):[[,t]]}function hU(t,e,n=UU){if(null==t)return n(t);if("function"==typeof t.reduceIndex)return t;if("function"==typeof t.reduce&&oh(t))return function(t){return console.warn("deprecated reduce interface; implement reduceIndex instead."),{...t,reduceIndex:t.reduce.bind(t)}}(t);if("function"==typeof t)return function(t){return{reduceIndex:(e,n,i)=>t(uh(n,e),i)}}(t);if(/^p\d{2}$/i.test(t))return bU(function(t){const e=+`${t}`.slice(1)/100;return(t,n)=>ee(t,e,n)}(t));switch(`${t}`.toLowerCase()){case"first":return fU;case"last":return pU;case"identity":return yU;case"count":return mU;case"distinct":return AU;case"sum":return null==e?mU:xU;case"proportion":return LU(e,"data");case"proportion-facet":return LU(e,"facet");case"deviation":return bU(ft);case"min":return bU(Pt);case"min-index":return bU(jt);case"max":return bU(Ot);case"max-index":return bU(_t);case"mean":return CU(ce);case"median":return CU(ae);case"variance":return bU(yt);case"mode":return bU(re)}return n(t)}function UU(t){throw new Error(`invalid reduce: ${t}`)}function bU(t){return{reduceIndex:(e,n)=>t(e,(t=>n[t]))}}function CU(t){return{reduceIndex(e,n){const i=t(e,(t=>n[t]));return Xh(n)?new Date(i):i}}}const yU={reduceIndex:(t,e)=>uh(e,t)},fU={reduceIndex:(t,e)=>e[t[0]]},GU={reduceIndex(t,e){const n=Vt(vt(t,(t=>t.length),(t=>e[t])),_u),i=n.slice(-5).reverse();if(i.length<n.length){const t=n.slice(0,-4);i[4]=[`… ${t.length.toLocaleString("en-US")} more`,Be(t,_u)]}return i.map((([t,e])=>`${t} (${e.toLocaleString("en-US")})`)).join("\n")}},pU={reduceIndex:(t,e)=>e[t[t.length-1]]},mU={label:"Frequency",reduceIndex:t=>t.length},AU={label:"Distinct",reduceIndex(t,e){const n=new At;for(const i of t)n.add(e[i]);return n.size}},xU=bU(Be);function LU(t,e){return null==t?{scope:e,label:"Frequency",reduceIndex:(t,e,n=1)=>t.length/n}:{scope:e,reduceIndex:(t,e,n=1)=>Be(t,(t=>e[t]))/n}}function SU(t,{scale:e,type:n,value:i,filter:s,hint:c,label:a=yh(i)},l){return void 0===c&&"function"==typeof i?.transform&&(c=i.hint),RU(l,{scale:e,type:n,value:wu(t,i),label:a,filter:s,hint:c})}function RU(t,e){const{scale:n,value:i}=e;if(!0===n||"auto"===n)switch(t){case"fill":case"stroke":case"color":e.scale=!0!==n&&Eh(i,wh)?null:"color";break;case"fillOpacity":case"strokeOpacity":case"opacity":e.scale=!0!==n&&Eh(i,Wh)?null:"opacity";break;case"symbol":!0!==n&&Eh(i,nU)?(e.scale=null,e.value=ah(i,iU)):e.scale="symbol";break;default:e.scale=$h.has(t)?t:null}else if(!1===n)e.scale=null;else if(null!=n&&!$h.has(n))throw new Error(`unknown scale: ${n}`);return e}function NU(t,e){for(const n in t){const i=t[n];if(i.scale===e)return i}}function XU(t,e){const n=t.original;if(n===t)return e;const i=e.value,s=e.value=[];for(let e=0;e<n.length;++e){const c=i[n[e][0]];for(const n of t[e])s[n]=c}return e}function vU(t,e,n){const i=ZU(t,e);return ah(ZU(t,n),((t,e)=>Math.abs(t-i[e])),Float64Array)}function ZU(t,e,n){let i=t[e];if(i||void 0===n||(i=t[n]),i)return i.value;throw new Error(`missing channel: ${e}`)}function EU(t){if(null==t||"function"==typeof t)return t;switch(`${t}`.toLowerCase()){case"ascending":return VU;case"descending":return wU}throw new Error(`invalid order: ${t}`)}function VU([t,e],[n,i]){return iu(e,i)||iu(t,n)}function wU([t,e],[n,i]){return su(e,i)||iu(t,n)}function WU(t,e){let n=t[e];if(n){for(;n.source;)n=n.source;return null===n.source?null:n}}const HU=function(t){let e,n;return(...i)=>((n?.length!==i.length||n.some(((t,e)=>t!==i[e])))&&(n=i,e=t(...i)),e)}((t=>new Intl.NumberFormat(t)));function DU(t){return ou(t,"Invalid Date")}const YU=function(t="en-US"){const e=function(t="en-US"){const e=HU(t);return t=>null==t||isNaN(t)?void 0:e.format(t)}(t);return t=>(t instanceof Date?DU:"number"==typeof t?e:zu)(t)}();let kU,JU=0;function MU(t){t!==kU&&(kU=t,console.warn(t),++JU)}const TU=("undefined"!=typeof window?window.devicePixelRatio>1:"undefined"==typeof it)?0:.5;let zU=0;function KU(){return"plot-clip-"+ ++zU}function OU(t,{title:e,href:n,ariaLabel:i,ariaDescription:s,ariaHidden:c,target:a,fill:l,fillOpacity:r,stroke:o,strokeWidth:g,strokeOpacity:B,strokeLinejoin:d,strokeLinecap:Q,strokeMiterlimit:I,strokeDasharray:F,strokeDashoffset:u,opacity:h,mixBlendMode:U,imageFilter:b,paintOrder:C,pointerEvents:y,shapeRendering:f,channels:G},{ariaLabel:p,fill:m="currentColor",fillOpacity:A,stroke:x="none",strokeOpacity:L,strokeWidth:S,strokeLinecap:R,strokeLinejoin:N,strokeMiterlimit:X,paintOrder:v}){null===m&&(l=null,r=null),null===x&&(o=null,B=null),Hh(m)?Hh(x)||Hh(l)&&!G?.fill||(x="none"):!Hh(x)||Hh(o)&&!G?.stroke||(m="none");const[Z,E]=eh(l,m),[V,w]=nh(r,A),[W,H]=eh(o,x),[D,Y]=nh(B,L),[k,J]=nh(h);Dh(H)||(void 0===g&&(g=S),void 0===Q&&(Q=R),void 0===d&&(d=N),void 0!==I||/^\s*round\s*$/i.test(d)||(I=X),Dh(E)||void 0!==C||(C=v));const[M,T]=nh(g);return null!==m&&(t.fill=ab(E,"currentColor"),t.fillOpacity=lb(w,1)),null!==x&&(t.stroke=ab(H,"none"),t.strokeWidth=lb(T,1),t.strokeOpacity=lb(Y,1),t.strokeLinejoin=ab(d,"miter"),t.strokeLinecap=ab(Q,"butt"),t.strokeMiterlimit=lb(I,4),t.strokeDasharray=ab(F,"none"),t.strokeDashoffset=ab(u,"0")),t.target=zu(a),t.ariaLabel=zu(p),t.ariaDescription=zu(s),t.ariaHidden=zu(c),t.opacity=lb(J,1),t.mixBlendMode=ab(U,"normal"),t.imageFilter=ab(b,"none"),t.paintOrder=ab(C,"normal"),t.pointerEvents=ab(y,"auto"),t.shapeRendering=ab(f,"auto"),{title:{value:e,optional:!0,filter:null},href:{value:n,optional:!0,filter:null},ariaLabel:{value:i,optional:!0,filter:null},fill:{value:Z,scale:"auto",optional:!0},fillOpacity:{value:V,scale:"auto",optional:!0},stroke:{value:W,scale:"auto",optional:!0},strokeOpacity:{value:D,scale:"auto",optional:!0},strokeWidth:{value:M,optional:!0},opacity:{value:k,scale:"auto",optional:!0}}}function _U(t,e){e&&t.text((t=>YU(e[t])))}function PU(t,e){e&&t.text((([t])=>YU(e[t])))}function jU(t,{target:e,tip:n},{ariaLabel:i,title:s,fill:c,fillOpacity:a,stroke:l,strokeOpacity:r,strokeWidth:o,opacity:g,href:B}){i&&sb(t,"aria-label",(t=>i[t])),c&&sb(t,"fill",(t=>c[t])),a&&sb(t,"fill-opacity",(t=>a[t])),l&&sb(t,"stroke",(t=>l[t])),r&&sb(t,"stroke-opacity",(t=>r[t])),o&&sb(t,"stroke-width",(t=>o[t])),g&&sb(t,"opacity",(t=>g[t])),B&&ib(t,(t=>B[t]),e),n||function(t,e){e&&t.filter((t=>cu(e[t]))).append("title").call(_U,e)}(t,s)}function $U(t,{target:e,tip:n},{ariaLabel:i,title:s,fill:c,fillOpacity:a,stroke:l,strokeOpacity:r,strokeWidth:o,opacity:g,href:B}){i&&sb(t,"aria-label",(([t])=>i[t])),c&&sb(t,"fill",(([t])=>c[t])),a&&sb(t,"fill-opacity",(([t])=>a[t])),l&&sb(t,"stroke",(([t])=>l[t])),r&&sb(t,"stroke-opacity",(([t])=>r[t])),o&&sb(t,"stroke-width",(([t])=>o[t])),g&&sb(t,"opacity",(([t])=>g[t])),B&&ib(t,(([t])=>B[t]),e),n||function(t,e){e&&t.filter((([t])=>cu(e[t]))).append("title").call(PU,e)}(t,s)}function*qU(t,e,n,i){const{z:s}=n,{z:c}=i,a=function({ariaLabel:t,title:e,fill:n,fillOpacity:i,stroke:s,strokeOpacity:c,strokeWidth:a,opacity:l,href:r},{tip:o}){return[t,o?void 0:e,n,i,s,c,a,l,r].filter((t=>void 0!==t))}(i,n),l=[...e,...a];for(const e of c?function(t,e,n){const i=Xt(t,(t=>e[t]));return void 0===n&&i.size>1+t.length>>1&&MU("Warning: the implicit z channel has high cardinality. This may occur when the fill or stroke channel is associated with quantitative data rather than ordinal or categorical data. You can suppress this warning by setting the z option explicitly; if this data represents a single series, set z to null."),i.values()}(t,c,s):[t]){let t,n;t:for(const i of e){for(const t of l)if(!nu(t[i])){n&&n.push(-1);continue t}if(void 0!==t){n.push(i);for(let e=0;e<a.length;++e){if(Uh(a[e][i])!==t[e]){yield n,t=a.map((t=>Uh(t[i]))),n=[i];continue t}}}else n&&(yield n),t=a.map((t=>Uh(t[i]))),n=[i]}n&&(yield n)}}function tb(t){return!0===t?t="frame":!1===t?t=null:null!=t&&(t=sh(t,"clip",["frame","sphere"])),t}function eb(t,e,n,i){!function(t,e,n,i){let s;const{clip:c=i.clip}=e;switch(c){case"frame":{const{width:e,height:c,marginLeft:a,marginRight:l,marginTop:r,marginBottom:o}=n,g=KU();s=`url(#${g})`,t=Qb("svg:g",i).call((t=>t.append("svg:clipPath").attr("id",g).append("rect").attr("x",a).attr("y",r).attr("width",e-l-a).attr("height",c-r-o))).each((function(){this.appendChild(t.node()),t.node=()=>this}));break}case"sphere":{const{projection:e}=i;if(!e)throw new Error('the "sphere" clip option requires a projection');const n=KU();s=`url(#${n})`,t.append("clipPath").attr("id",n).append("path").attr("d",mr(e)({type:"Sphere"}));break}}sb(t,"aria-label",e.ariaLabel),sb(t,"aria-description",e.ariaDescription),sb(t,"aria-hidden",e.ariaHidden),sb(t,"clip-path",s)}(t,e,n,i),sb(t,"fill",e.fill),sb(t,"fill-opacity",e.fillOpacity),sb(t,"stroke",e.stroke),sb(t,"stroke-width",e.strokeWidth),sb(t,"stroke-opacity",e.strokeOpacity),sb(t,"stroke-linejoin",e.strokeLinejoin),sb(t,"stroke-linecap",e.strokeLinecap),sb(t,"stroke-miterlimit",e.strokeMiterlimit),sb(t,"stroke-dasharray",e.strokeDasharray),sb(t,"stroke-dashoffset",e.strokeDashoffset),sb(t,"shape-rendering",e.shapeRendering),sb(t,"filter",e.imageFilter),sb(t,"paint-order",e.paintOrder);const{pointerEvents:s=(!1===i.pointerSticky?"none":void 0)}=e;sb(t,"pointer-events",s)}function nb(t,e){!function(t,e,n){null!=n&&t.style(e,n)}(t,"mix-blend-mode",e.mixBlendMode),sb(t,"opacity",e.opacity)}function ib(t,e,n){t.each((function(t){const i=e(t);if(null!=i){const t=this.ownerDocument.createElementNS(Xe.svg,"a");t.setAttribute("fill","inherit"),t.setAttributeNS(Xe.xlink,"href",i),null!=n&&t.setAttribute("target",n),this.parentNode.insertBefore(t,this).appendChild(this)}}))}function sb(t,e,n){null!=n&&t.attr(e,n)}function cb(t,e,{x:n,y:i},s=TU,c=TU){s+=e.dx,c+=e.dy,n?.bandwidth&&(s+=n.bandwidth()/2),i?.bandwidth&&(c+=i.bandwidth()/2),(s||c)&&t.attr("transform",`translate(${s},${c})`)}function ab(t,e){if((t=zu(t))!==e)return t}function lb(t,e){if((t=Ku(t))!==e)return t}const rb=/^-?([_a-z]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])([_a-z0-9-]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*$/i;function ob(t){if(void 0===t)return"plot-d6a7b5";if(t=`${t}`,!rb.test(t))throw new Error(`invalid class name: ${t}`);return t}function gb(t,e){if("string"==typeof e)t.property("style",e);else if(null!=e)for(const n of t)Object.assign(n.style,e)}function Bb({frameAnchor:t},{width:e,height:n,marginTop:i,marginRight:s,marginBottom:c,marginLeft:a}){return[/left$/.test(t)?a:/right$/.test(t)?e-s:(a+e-s)/2,/^top/.test(t)?i:/^bottom/.test(t)?n-c:(i+n-c)/2]}function db(t={}){const{document:e=("undefined"!=typeof window?window.document:void 0),clip:n}=t;return{document:e,clip:tb(n)}}function Qb(t,{document:e}){return Mn(Ve(t).call(e.documentElement))}const Ib=Math.PI,Fb=2*Ib,ub=.618;function hb({projection:t,inset:e=0,insetTop:n=e,insetRight:i=e,insetBottom:s=e,insetLeft:c=e}={},a){if(null==t)return;if("function"==typeof t.stream)return t;let l,r,o="frame";if(oh(t)){let e;if(({type:t,domain:r,inset:e,insetTop:n=(void 0!==e?e:n),insetRight:i=(void 0!==e?e:i),insetBottom:s=(void 0!==e?e:s),insetLeft:c=(void 0!==e?e:c),clip:o=o,...l}=t),null==t)return}"function"!=typeof t&&({type:t}=Ub(t));const{width:g,height:B,marginLeft:d,marginRight:Q,marginTop:I,marginBottom:F}=a,u=g-d-Q-c-i,h=B-I-F-n-s;if(t=t?.({width:u,height:h,clip:o,...l}),null==t)return;o=function(t,e,n,i,s){if(!1===t||null==t||"number"==typeof t)return t=>t;!0===t&&(t="frame");if("frame"===`${t}`.toLowerCase())return Ul(e,n,i,s);throw new Error(`unknown projection clip type: ${t}`)}(o,d,I,g-Q,B-F);let U,b=d+c,C=I+n;if(null!=r){const[[e,n],[i,s]]=mr(t).bounds(r),c=Math.min(u/(i-e),h/(s-n));c>0?(b-=(c*(e+i)-u)/2,C-=(c*(n+s)-h)/2,U=Ar({point(t,e){this.stream.point(t*c+b,e*c+C)}})):MU("Warning: the projection could not be fit to the specified domain; using the default scale.")}return U??=0===b&&0===C?yb():Ar({point(t,e){this.stream.point(t+b,e+C)}}),{stream:e=>t.stream(U.stream(o(e)))}}function Ub(t){switch(`${t}`.toLowerCase()){case"albers-usa":return bb(Tr,.7463,.4673);case"albers":return Cb(Mr,.7463,.4673);case"azimuthal-equal-area":return bb(_r,4,4);case"azimuthal-equidistant":return bb(jr,Fb,Fb);case"conic-conformal":return Cb(io,Fb,Fb);case"conic-equal-area":return Cb(Jr,6.1702,2.9781);case"conic-equidistant":return Cb(lo,7.312,3.6282);case"equal-earth":return bb(Fo,5.4133,2.6347);case"equirectangular":return bb(co,Fb,Ib);case"gnomonic":return bb(ho,3.4641,3.4641);case"identity":return{type:yb};case"reflect-y":return{type:fb};case"mercator":return bb(qr,Fb,Fb);case"orthographic":return bb(bo,2,2);case"stereographic":return bb(yo,2,2);case"transverse-mercator":return bb(Go,Fb,Fb);default:throw new Error(`unknown projection type: ${t}`)}}function bb(t,e,n){return{type:({width:i,height:s,rotate:c,precision:a=.15,clip:l})=>{const r=t();return null!=a&&r.precision?.(a),null!=c&&r.rotate?.(c),"number"==typeof l&&r.clipAngle?.(l),r.scale(Math.min(i/e,s/n)),r.translate([i/2,s/2]),r},aspectRatio:n/e}}function Cb(t,e,n){const{type:i,aspectRatio:s}=bb(t,e,n);return{type:t=>{const{parallels:e,domain:n,width:s,height:c}=t,a=i(t);return null!=e&&(a.parallels(e),void 0===n&&a.fitSize([s,c],{type:"Sphere"})),a},aspectRatio:s}}const yb=Pu({stream:t=>t}),fb=Pu(Ar({point(t,e){this.stream.point(t,-e)}}));function Gb(t,e,n,i){const s=n[t],c=n[e],a=s.length,l=n[t]=new Float64Array(a).fill(NaN),r=n[e]=new Float64Array(a).fill(NaN);let o;const g=i.stream({point(t,e){l[o]=t,r[o]=e}});for(o=0;o<a;++o)g.point(s[o],c[o])}function pb({projection:t}={}){return null!=t&&("function"==typeof t.stream||(oh(t)&&(t=t.type),null!=t))}function mb(t){const e=[],n=[],i={scale:"x",value:e},s={scale:"y",value:n},c={point(t,i){e.push(t),n.push(i)},lineStart(){},lineEnd(){},polygonStart(){},polygonEnd(){},sphere(){}};for(const e of t.value)Ma(e,c);return[i,s]}const Ab=new Map([["accent",Zd],["category10",vd],["dark2",Ed],["paired",Vd],["pastel1",wd],["pastel2",Wd],["set1",Hd],["set2",Dd],["set3",Yd],["tableau10",kd]]);const xb=new Map([...Ab,["brbg",Sb(Md,Td)],["prgn",Sb(zd,Kd)],["piyg",Sb(Od,_d)],["puor",Sb(Pd,jd)],["rdbu",Sb($d,qd)],["rdgy",Sb(tQ,eQ)],["rdylbu",Sb(nQ,iQ)],["rdylgn",Sb(sQ,cQ)],["spectral",Sb(aQ,lQ)],["burd",Rb($d,qd)],["buylrd",Rb(nQ,iQ)],["blues",Lb(XQ,vQ)],["greens",Lb(ZQ,EQ)],["greys",Lb(VQ,wQ)],["oranges",Lb(kQ,JQ)],["purples",Lb(WQ,HQ)],["reds",Lb(DQ,YQ)],["turbo",Nb(tI)],["viridis",Nb(nI)],["magma",Nb(iI)],["inferno",Nb(sI)],["plasma",Nb(cI)],["cividis",Nb(MQ)],["cubehelix",Nb(TQ)],["warm",Nb(zQ)],["cool",Nb(KQ)],["bugn",Lb(rQ,oQ)],["bupu",Lb(gQ,BQ)],["gnbu",Lb(dQ,QQ)],["orrd",Lb(IQ,FQ)],["pubu",Lb(UQ,bQ)],["pubugn",Lb(uQ,hQ)],["purd",Lb(CQ,yQ)],["rdpu",Lb(fQ,GQ)],["ylgn",Lb(AQ,xQ)],["ylgnbu",Lb(pQ,mQ)],["ylorbr",Lb(LQ,SQ)],["ylorrd",Lb(RQ,NQ)],["rainbow",Xb(_Q)],["sinebow",Xb(qQ)]]);function Lb(t,e){return({length:n})=>1===n?[t[3][1]]:2===n?[t[3][1],t[3][2]]:(n=Math.max(3,Math.floor(n)))>9?Ms(e,n):t[n]}function Sb(t,e){return({length:n})=>2===n?[t[3][0],t[3][2]]:(n=Math.max(3,Math.floor(n)))>11?Ms(e,n):t[n]}function Rb(t,e){return({length:n})=>2===n?[t[3][2],t[3][0]]:(n=Math.max(3,Math.floor(n)))>11?Ms((t=>e(1-t)),n):t[n].slice().reverse()}function Nb(t){return({length:e})=>Ms(t,Math.max(2,Math.floor(e)))}function Xb(t){return({length:e})=>Ms(t,Math.floor(e)+1).slice(0,-1)}function vb(t){const e=`${t}`.toLowerCase();if(!xb.has(e))throw new Error(`unknown ordinal scheme: ${e}`);return xb.get(e)}function Zb(t,e){const n=vb(t),i="function"==typeof n?n({length:e}):n;return i.length!==e?i.slice(0,e):i}const Eb=new Map([["brbg",Td],["prgn",Kd],["piyg",_d],["puor",jd],["rdbu",qd],["rdgy",eQ],["rdylbu",iQ],["rdylgn",cQ],["spectral",lQ],["burd",t=>qd(1-t)],["buylrd",t=>iQ(1-t)],["blues",vQ],["greens",EQ],["greys",wQ],["purples",HQ],["reds",YQ],["oranges",JQ],["turbo",tI],["viridis",nI],["magma",iI],["inferno",sI],["plasma",cI],["cividis",MQ],["cubehelix",TQ],["warm",zQ],["cool",KQ],["bugn",oQ],["bupu",BQ],["gnbu",QQ],["orrd",FQ],["pubugn",hQ],["pubu",bQ],["purd",yQ],["rdpu",GQ],["ylgnbu",mQ],["ylgn",xQ],["ylorbr",SQ],["ylorrd",NQ],["rainbow",_Q],["sinebow",qQ]]);function Vb(t){const e=`${t}`.toLowerCase();if(!Eb.has(e))throw new Error(`unknown quantitative scheme: ${e}`);return Eb.get(e)}const wb=new Set(["brbg","prgn","piyg","puor","rdbu","rdgy","rdylbu","rdylgn","spectral","burd","buylrd"]);const Wb=t=>e=>t(1-e),Hb=[0,1],Db=new Map([["number",ms],["rgb",bs],["hsl",Hs],["hcl",Ds],["lab",function(t,e){var n=Us((t=_i(t)).l,(e=_i(e)).l),i=Us(t.a,e.a),s=Us(t.b,e.b),c=Us(t.opacity,e.opacity);return function(e){return t.l=n(e),t.a=i(e),t.b=s(e),t.opacity=c(e),t+""}}]]);function Yb(t){const e=`${t}`.toLowerCase();if(!Db.has(e))throw new Error(`unknown interpolator: ${e}`);return Db.get(e)}function kb(t,e,n,{type:i,nice:s,clamp:c,zero:a,domain:l=_b(t,n),unknown:r,round:o,scheme:g,interval:B,range:d=($h.get(t)===Kh?jb(n,l):$h.get(t)===Oh?$b(n,l):$h.get(t)===_h?Hb:void 0),interpolate:Q=($h.get(t)===zh?null==g&&void 0!==d?bs:Vb(void 0!==g?g:"cyclical"===i?"rainbow":"turbo"):o?Ns:ms),reverse:I}){if(B=Ah(B,i),"cyclical"!==i&&"sequential"!==i||(i="linear"),"function"!=typeof Q&&(Q=Yb(Q)),I=!!I,void 0!==d){if((l=ch(l)).length!==(d=ch(d)).length){if(1===Q.length)throw new Error("invalid piecewise interpolator");Q=Js(Q,d),d=void 0}}if(1===Q.length?(I&&(Q=Wb(Q),I=!1),void 0===d&&(d=Float64Array.from(l,((t,e)=>e/(l.length-1))),2===d.length&&(d=Hb)),e.interpolate((d===Hb?Pu:eC)(Q))):e.interpolate(Q),a){const[t,e]=Gt(l);(t>0||e<0)&&(Jh(l=lh(l))!==Math.sign(t)?l[l.length-1]=0:l[0]=0)}return I&&(l=de(l)),e.domain(l).unknown(r),s&&(e.nice(function(t,e){return!0===t?void 0:"number"==typeof t?t:function(t,e){if((t=Ah(t,e))&&"function"!=typeof t.ceil)throw new Error("invalid interval: missing ceil method");return t}(t,e)}(s,i)),l=e.domain()),void 0!==d&&e.range(d),c&&e.clamp(c),{type:i,domain:l,range:d,scale:e,interpolate:Q,interval:B}}function Jb(t,e,{exponent:n=1,...i}){return kb(t,lg().exponent(n),e,{...i,type:"pow"})}function Mb(t,e,{base:n=10,domain:i=qb(e),...s}){return kb(t,$o().base(n),e,{...s,domain:i})}function Tb(t,e,{constant:n=1,...i}){return kb(t,ng().constant(n),e,i)}function zb(t,e,{range:n,quantiles:i=(void 0===n?5:(n=[...n]).length),n:s=i,scheme:c="rdylbu",domain:a=tC(e),unknown:l,interpolate:r,reverse:o}){return void 0===n&&(n=void 0!==r?Ms(r,s):$h.get(t)===zh?Zb(c,s):void 0),a.length>0&&(a=rg(a,void 0===n?{length:s}:n).quantiles()),Kb(t,e,{domain:a,range:n,reverse:o,unknown:l})}function Kb(t,e,{domain:n=[0],unknown:i,scheme:s="rdylbu",interpolate:c,range:a=(void 0!==c?Ms(c,n.length+1):$h.get(t)===zh?Zb(s,n.length+1):void 0),reverse:l}){const r=Jh(n=ch(n));if(!isNaN(r)&&!function(t,e){for(let n=1,i=t.length,s=t[0];n<i;++n){const i=gt(s,s=t[n]);if(0!==i&&i!==e)return!1}return!0}(n,r))throw new Error(`the ${t} scale has a non-monotonic domain`);return l&&(a=de(a)),{type:"threshold",scale:og(r<0?de(n):n,void 0===a?[]:a).unknown(i),domain:n,range:a}}function Ob(t,e=au){return t.length?[Pt(t,(({value:t})=>void 0===t?t:Pt(t,e))),Ot(t,(({value:t})=>void 0===t?t:Ot(t,e)))]:[0,1]}function _b(t,e){const n=$h.get(t);return(n===Kh||n===_h||n===Oh?Pb:Ob)(e)}function Pb(t){return[0,t.length?Ot(t,(({value:t})=>void 0===t?t:Ot(t,au))):1]}function jb(t,e){const n=t.find((({radius:t})=>void 0!==t));if(void 0!==n)return[0,n.radius];const i=ee(t,.5,(({value:t})=>void 0===t?NaN:ee(t,.25,lu))),s=e.map((t=>3*Math.sqrt(t/i))),c=30/Ot(s);return c<1?s.map((t=>t*c)):s}function $b(t,e){const n=ae(t,(({value:t})=>void 0===t?NaN:ae(t,Math.abs))),i=e.map((t=>12*t/n)),s=60/Ot(i);return s<1?i.map((t=>t*s)):i}function qb(t){for(const{value:e}of t)if(void 0!==e)for(let n of e){if(n>0)return Ob(t,lu);if(n<0)return Ob(t,ru)}return[1,10]}function tC(t){const e=[];for(const{value:n}of t)if(void 0!==n)for(const t of n)e.push(t);return e}function eC(t){return(e,n)=>i=>t(e+i*(n-e))}function nC(t,e,n,i,{type:s,nice:c,clamp:a,domain:l=Ob(i),unknown:r,pivot:o=0,scheme:g,range:B,symmetric:d=!0,interpolate:Q=($h.get(t)===zh?null==g&&void 0!==B?bs:Vb(void 0!==g?g:"rdbu"):ms),reverse:I}){o=+o,l=ch(l);let[F,u]=l;if(l.length>2&&MU(`Warning: the diverging ${t} scale domain contains extra elements.`),gt(F,u)<0&&([F,u]=[u,F],I=!I),F=Math.min(F,o),u=Math.max(u,o),"function"!=typeof Q&&(Q=Yb(Q)),void 0!==B&&(Q=1===Q.length?eC(Q)(...B):Js(Q,B)),I&&(Q=Wb(Q)),d){const t=n.apply(o),e=t-n.apply(F),i=n.apply(u)-t;e<i?F=n.invert(t-i):e>i&&(u=n.invert(t+e))}return e.domain([F,o,u]).unknown(r).interpolator(Q),a&&e.clamp(a),c&&e.nice(c),{type:s,domain:[F,u],pivot:o,interpolate:Q,scale:e}}function iC(t,e,n){return nC(t,Ld(),lC,e,n)}function sC(t,e,{exponent:n=1,...i}){return nC(t,Nd().exponent(n=+n),function(t){return.5===t?oC:{apply:e=>Math.sign(e)*Math.pow(Math.abs(e),t),invert:e=>Math.sign(e)*Math.pow(Math.abs(e),1/t)}}(n),e,{...i,type:"diverging-pow"})}function cC(t,e,{base:n=10,pivot:i=1,domain:s=Ob(e,i<0?ru:lu),...c}){return nC(t,Sd().base(n=+n),rC,e,{domain:s,pivot:i,...c})}function aC(t,e,{constant:n=1,...i}){return nC(t,Rd().constant(n=+n),function(t){return{apply:e=>Math.sign(e)*Math.log1p(Math.abs(e/t)),invert:e=>Math.sign(e)*Math.expm1(Math.abs(e))*t}}(n),e,i)}const lC={apply:t=>t,invert:t=>t},rC={apply:Math.log,invert:Math.exp},oC={apply:t=>Math.sign(t)*Math.sqrt(Math.abs(t)),invert:t=>Math.sign(t)*(t*t)};function gC(t,e,n,i){return kb(t,e,n,i)}function BC(t,e,n){return gC(t,function(){return po.apply(md($g,qg,Kg,Tg,Rg,Ag,pg,fg,yg,sB).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}(),e,n)}function dC(t,e,n){return gC(t,function(){return po.apply(md(Pg,jg,Og,zg,Wg,xg,mg,Gg,yg,cB).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)}(),e,n)}const QC=Symbol("ordinal");function IC(t,e,n,{type:i,interval:s,domain:c,range:a,reverse:l,hint:r}){return s=Ah(s,i),void 0===c&&(c=hC(n,s,t)),"categorical"!==i&&i!==QC||(i="ordinal"),l&&(c=de(c)),c=e.domain(c).domain(),void 0!==a&&("function"==typeof a&&(a=a(c)),e.range(a)),{type:i,domain:c,range:a,scale:e,hint:r,interval:s}}function FC(t,e,{type:n,interval:i,domain:s,range:c,scheme:a,unknown:l,...r}){let o;if(i=Ah(i,n),void 0===s&&(s=hC(e,i,t)),$h.get(t)===Ph)o=function(t){return{fill:UC(t,"fill"),stroke:UC(t,"stroke")}}(e),c=void 0===c?function(t){return Hh(t.fill)?TI:MI}(o):ah(c,iU);else if($h.get(t)===zh&&(void 0!==c||"ordinal"!==n&&n!==QC||(c=function(t,e="greys"){const n=new Set,[i,s]=Zb(e,2);for(const e of t)if(null!=e)if(!0===e)n.add(s);else{if(!1!==e)return;n.add(i)}return[...n]}(s,a),void 0!==c&&(a=void 0)),void 0===a&&void 0===c&&(a="ordinal"===n?"turbo":"tableau10"),void 0!==a))if(void 0!==c){const t=Vb(a),e=c[0],n=c[1]-c[0];c=({length:i})=>Ms((i=>t(e+n*i)),i)}else c=vb(a);if(l===Ao)throw new Error(`implicit unknown on ${t} scale is not supported`);return IC(t,xo().unknown(l),e,{...r,type:n,domain:s,range:c,hint:o})}function uC(t,e,n,i){let{round:s}=n;return void 0!==s&&t.round(s=!!s),(t=IC(i,t,e,n)).round=s,t}function hC(t,e,n){const i=new At;for(const{value:e,domain:n}of t){if(void 0!==n)return n();if(void 0!==e)for(const t of e)i.add(t)}if(void 0!==e){const[t,n]=Gt(i).map(e.floor,e);return e.range(t,e.offset(n))}if(i.size>1e4&&$h.get(n)===Th)throw new Error(`implicit ordinal domain of ${n} scale has more than 10,000 values`);return Vt(i,iu)}function UC(t,e){let n;for(const{hint:i}of t){const t=i?.[e];if(void 0!==t)if(void 0===n)n=t;else if(n!==t)return}return n}function bC(t,{label:e,inset:n=0,insetTop:i=n,insetRight:s=n,insetBottom:c=n,insetLeft:a=n,round:l,nice:r,clamp:o,zero:g,align:B,padding:d,projection:Q,facet:{label:I=e}={},...F}={}){const u={};for(const[n,h]of t){const t=F[n],U=LC(n,h,{round:$h.get(n)===Th?l:void 0,nice:r,clamp:o,zero:g,align:B,padding:d,projection:Q,...t});if(U){let{label:l=("fx"===n||"fy"===n?I:e),percent:r,transform:o,inset:g,insetTop:B=(void 0!==g?g:"y"===n?i:0),insetRight:d=(void 0!==g?g:"x"===n?s:0),insetBottom:Q=(void 0!==g?g:"y"===n?c:0),insetLeft:F=(void 0!==g?g:"x"===n?a:0)}=t||{};if(null==o)o=void 0;else if("function"!=typeof o)throw new Error("invalid scale transform; not a function");U.percent=!!r,U.label=void 0===l?yC(h,U):l,U.transform=o,"x"===n||"fx"===n?(U.insetLeft=+F,U.insetRight=+d):"y"!==n&&"fy"!==n||(U.insetTop=+B,U.insetBottom=+Q),u[n]=U}}return u}function CC(t){const e={},n={scales:e};for(const[i,s]of Object.entries(t)){const{scale:t,type:c,interval:a,label:l}=s;e[i]=wC(s),n[i]=t,t.type=c,null!=a&&(t.interval=a),null!=l&&(t.label=l)}return n}function yC(t=[],e){let n;for(const{label:e}of t)if(void 0!==e)if(void 0===n)n=e;else if(n!==e)return;if(void 0!==n)return!XC(e)&&e.percent&&(n=`${n} (%)`),{inferred:!0,toString:()=>n}}function fC(t){const{marginTop:e,marginRight:n,marginBottom:i,marginLeft:s,width:c,height:a,facet:{marginTop:l,marginRight:r,marginBottom:o,marginLeft:g}}=t;return{marginTop:Math.max(e,l),marginRight:Math.max(n,r),marginBottom:Math.max(i,o),marginLeft:Math.max(s,g),width:c,height:a}}function GC({fx:t,fy:e},n){const{marginTop:i,marginRight:s,marginBottom:c,marginLeft:a,width:l,height:r}=fC(n);return{marginTop:i,marginRight:s,marginBottom:c,marginLeft:a,width:t?t.scale.bandwidth()+a+s:l,height:e?e.scale.bandwidth()+i+c:r,facet:{width:l,height:r}}}function pC(t,e){if(void 0===t.range){const{insetLeft:n,insetRight:i}=t,{width:s,marginLeft:c=0,marginRight:a=0}=e,l=c+n,r=s-a-i;t.range=[l,Math.max(l,r)],XC(t)||(t.range=xC(t)),t.scale.range(t.range)}AC(t)}function mC(t,e){if(void 0===t.range){const{insetTop:n,insetBottom:i}=t,{height:s,marginTop:c=0,marginBottom:a=0}=e,l=c+n,r=s-a-i;t.range=[Math.max(l,r),l],XC(t)?t.range.reverse():t.range=xC(t),t.scale.range(t.range)}AC(t)}function AC(t){void 0===t.round&&function({type:t}){return"point"===t||"band"===t}(t)&&function({scale:t}){const e=t.domain().length,[n,i]=t.range(),s=t.paddingInner?t.paddingInner():1,c=t.paddingOuter?t.paddingOuter():t.padding(),a=e-s,l=Math.abs(i-n)/Math.max(1,a+2*c);return(l-Math.floor(l))*a}(t)<=30&&t.scale.round(!0)}function xC(t){const e=t.scale.domain().length+vC(t);if(!(e>2))return t.range;const[n,i]=t.range;return Array.from({length:e},((t,s)=>n+s/(e-1)*(i-n)))}function LC(t,e=[],n={}){const i=function(t,e,{type:n,domain:i,range:s,scheme:c,pivot:a,projection:l}){if("fx"===t||"fy"===t)return"band";"x"!==t&&"y"!==t||null==l||(n=RC);for(const{type:t}of e)if(void 0!==t)if(void 0===n)n=t;else if(n!==t)throw new Error(`scale incompatible with channel: ${n} !== ${t}`);if(n===RC)return;if(void 0!==n)return n;if(void 0===i&&!e.some((({value:t})=>void 0!==t)))return;const r=$h.get(t);if(r===Kh)return"sqrt";if(r===_h||r===Oh)return"linear";if(r===Ph)return"ordinal";if((i||s||[]).length>2)return NC(r);if(void 0!==i){if(Nh(i))return NC(r);if(Xh(i))return"utc"}else{const t=e.map((({value:t})=>t)).filter((t=>void 0!==t));if(t.some(Nh))return NC(r);if(t.some(Xh))return"utc"}if(r===zh){if(null!=a||function(t){return null!=t&&wb.has(`${t}`.toLowerCase())}(c))return"diverging";if(function(t){return null!=t&&Ab.has(`${t}`.toLowerCase())}(c))return"categorical"}return"linear"}(t,e,n);if(void 0===n.type&&void 0===n.domain&&void 0===n.range&&null==n.interval&&"fx"!==t&&"fy"!==t&&XC({type:i})){const n=e.map((({value:t})=>t)).filter((t=>void 0!==t));n.some(Xh)?MU(`Warning: some data associated with the ${t} scale are dates. Dates are typically associated with a "utc" or "time" scale rather than a "${SC(i)}" scale. If you are using a bar mark, you probably want a rect mark with the interval option instead; if you are using a group transform, you probably want a bin transform instead. If you want to treat this data as ordinal, you can specify the interval of the ${t} scale (e.g., d3.utcDay), or you can suppress this warning by setting the type of the ${t} scale to "${SC(i)}".`):n.some(vh)?MU(`Warning: some data associated with the ${t} scale are strings that appear to be dates (e.g., YYYY-MM-DD). If these strings represent dates, you should parse them to Date objects. Dates are typically associated with a "utc" or "time" scale rather than a "${SC(i)}" scale. If you are using a bar mark, you probably want a rect mark with the interval option instead; if you are using a group transform, you probably want a bin transform instead. If you want to treat this data as ordinal, you can suppress this warning by setting the type of the ${t} scale to "${SC(i)}".`):n.some(Zh)&&MU(`Warning: some data associated with the ${t} scale are strings that appear to be numbers. If these strings represent numbers, you should parse or coerce them to numbers. Numbers are typically associated with a "linear" scale rather than a "${SC(i)}" scale. If you want to treat this data as ordinal, you can specify the interval of the ${t} scale (e.g., 1 for integers), or you can suppress this warning by setting the type of the ${t} scale to "${SC(i)}".`)}switch(n.type=i,i){case"diverging":case"diverging-sqrt":case"diverging-pow":case"diverging-log":case"diverging-symlog":case"cyclical":case"sequential":case"linear":case"sqrt":case"threshold":case"quantile":case"pow":case"log":case"symlog":n=EC(e,n,ju);break;case"identity":switch($h.get(t)){case Th:n=EC(e,n,ju);break;case Ph:n=EC(e,n,VC)}break;case"utc":case"time":n=EC(e,n,qu)}switch(i){case"diverging":return iC(t,e,n);case"diverging-sqrt":return function(t,e,n){return sC(t,e,{...n,exponent:.5})}(t,e,n);case"diverging-pow":return sC(t,e,n);case"diverging-log":return cC(t,e,n);case"diverging-symlog":return aC(t,e,n);case"categorical":case"ordinal":case QC:return FC(t,e,n);case"cyclical":case"sequential":case"linear":return function(t,e,n){return kb(t,ko(),e,n)}(t,e,n);case"sqrt":return function(t,e,n){return Jb(t,e,{...n,exponent:.5})}(t,e,n);case"threshold":return Kb(t,0,n);case"quantile":return zb(t,e,n);case"quantize":return function(t,e,{range:n,n:i=(void 0===n?5:(n=[...n]).length),scheme:s="rdylbu",domain:c=_b(t,e),unknown:a,interpolate:l,reverse:r}){const[o,g]=Gt(c);let B;return void 0===n?(B=Mt(o,g,i),B[0]<=o&&B.splice(0,1),B[B.length-1]>=g&&B.pop(),i=B.length+1,n=void 0!==l?Ms(l,i):$h.get(t)===zh?Zb(s,i):void 0):(B=Ms(ms(o,g),i+1).slice(1,-1),o instanceof Date&&(B=B.map((t=>new Date(t))))),Jh(ch(c))<0&&B.reverse(),Kb(t,0,{domain:B,range:n,reverse:r,unknown:a})}(t,e,n);case"pow":return Jb(t,e,n);case"log":return Mb(t,e,n);case"symlog":return Tb(t,e,n);case"utc":return dC(t,e,n);case"time":return BC(t,e,n);case"point":return function(t,e,{align:n=.5,padding:i=.5,...s}){return uC(Ro().align(n).padding(i),e,s,t)}(t,e,n);case"band":return function(t,e,{align:n=.5,padding:i=.1,paddingInner:s=i,paddingOuter:c=("fx"===t||"fy"===t?0:i),...a}){return uC(Lo().align(n).paddingInner(s).paddingOuter(c),e,a,t)}(t,e,n);case"identity":return function(t){return{type:"identity",scale:(e=$h.get(t),e===Th||e===Kh||e===Oh||e===_h?Jo():t=>t)};var e}(t);case void 0:return;default:throw new Error(`unknown scale type: ${i}`)}}function SC(t){return"symbol"==typeof t?t.description:t}const RC={toString:()=>"projection"};function NC(t){switch(t){case Th:return"point";case zh:return QC;default:return"ordinal"}}function XC({type:t}){return"ordinal"===t||"point"===t||"band"===t||t===QC}function vC({type:t}){return"threshold"===t}function ZC(t){if(void 0===t)return!0;const e=t.domain(),n=t(e[0]);for(let i=1,s=e.length;i<s;++i)if(t(e[i])-n)return!1;return!0}function EC(t,{domain:e,...n},i){for(const e of t)void 0!==e.value&&(e.value=i(e.value));return{domain:void 0===e?e:i(e),...n}}function VC(t){return ah(t,iU)}function wC({scale:t,type:e,domain:n,range:i,interpolate:s,interval:c,transform:a,percent:l,pivot:r}){if("identity"===e)return{type:"identity",apply:t=>t,invert:t=>t};const o=t.unknown?t.unknown():void 0;return{type:e,domain:lh(n),...void 0!==i&&{range:lh(i)},...void 0!==a&&{transform:a},...l&&{percent:l},...void 0!==o&&{unknown:o},...void 0!==c&&{interval:c},...void 0!==s&&{interpolate:s},...t.clamp&&{clamp:t.clamp()},...void 0!==r&&{pivot:r,symmetric:!1},...t.base&&{base:t.base()},...t.exponent&&{exponent:t.exponent()},...t.constant&&{constant:t.constant()},...t.align&&{align:t.align(),round:t.round()},...t.padding&&(t.paddingInner?{paddingInner:t.paddingInner(),paddingOuter:t.paddingOuter()}:{padding:t.padding()}),...t.bandwidth&&{bandwidth:t.bandwidth(),step:t.step()},apply:e=>t(e),...t.invert&&{invert:e=>t.invert(e)}}}function WC({x:t,y:e,fy:n,fx:i},{projection:s,aspectRatio:c},{width:a,marginTopDefault:l,marginRightDefault:r,marginBottomDefault:o,marginLeftDefault:g}){const B=n?n.scale.domain().length:1,d=function(t){if("function"==typeof t?.stream)return ub;if(oh(t)&&(t=t.type),null!=t){if("function"!=typeof t){const{aspectRatio:e}=Ub(t);if(e)return e}return ub}}(s);if(d){const t=(1.1*B-.1)/(1.1*(i?i.scale.domain().length:1)-.1)*d,e=Math.max(.1,Math.min(10,t));return Math.round((a-g-r)*e+l+o)}const Q=e?XC(e)?e.scale.domain().length:Math.max(7,17/B):1;if(null!=c){if(c=+c,!(isFinite(c)&&c>0))throw new Error(`invalid aspectRatio: ${c}`);const s=HC("y",e)/(HC("x",t)*c),B=i?i.scale.bandwidth():1,d=n?n.scale.bandwidth():1;return(s*(B*(a-g-r)-t.insetLeft-t.insetRight)+e.insetTop+e.insetBottom)/d+l+o}return!(!e&&!n)*Math.max(1,Math.min(60,Q*B))*20+30*!!i+60}function HC(t,e){if(!e)throw new Error(`aspectRatio requires ${t} scale`);const{type:n,domain:i}=e;let s;switch(n){case"linear":case"utc":case"time":s=Number;break;case"pow":{const t=e.scale.exponent();s=e=>Math.pow(e,t);break}case"log":s=Math.log;break;case"point":case"band":return i.length;default:throw new Error(`unsupported ${t} scale for aspectRatio: ${n}`)}const[c,a]=Gt(i);return Math.abs(s(a)-s(c))}function DC(t,e){const{fx:n,fy:i}=bC(t,e),s=n?.scale.domain(),c=i?.scale.domain();return s&&c?function(...t){const e="function"==typeof t[t.length-1]&&function(t){return e=>t(...e)}(t.pop()),n=(t=t.map(bt)).map(ht),i=t.length-1,s=new Array(i+1).fill(0),c=[];if(i<0||n.some(Ut))return c;for(;;){c.push(s.map(((e,n)=>t[n][e])));let a=i;for(;++s[a]===n[a];){if(0===a)return e?c.map(e):c;s[a--]=0}}}(s,c).map((([t,e],n)=>({x:t,y:e,i:n}))):s?s.map(((t,e)=>({x:t,i:e}))):c?c.map(((t,e)=>({y:t,i:e}))):void 0}function YC(t,{fx:e,fy:n}){const i=Fh(t),s=e?.value,c=n?.value;return e&&n?vt(i,(t=>(t.fx=s[t[0]],t.fy=c[t[0]],t)),(t=>s[t]),(t=>c[t])):e?vt(i,(t=>(t.fx=s[t[0]],t)),(t=>s[t])):vt(i,(t=>(t.fy=c[t[0]],t)),(t=>c[t]))}function kC(t){const e=[],n=new Uint32Array(Be(t,(t=>t.length)));for(const i of t){let s=0;for(const e of t)i!==e&&(n.set(e,s),s+=e.length);e.push(n.slice(0,s))}return e}const JC=new Map([["top",OC],["right",jC],["bottom",_C],["left",PC],["top-left",$C(OC,PC)],["top-right",$C(OC,jC)],["bottom-left",$C(_C,PC)],["bottom-right",$C(_C,jC)],["top-empty",function(t,{y:e},{x:n,y:i,empty:s}){if(s)return!1;if(!e)return;const c=zC(e,i);if(c>0)return KC(t,n,e[c-1])}],["right-empty",function(t,{x:e},{x:n,y:i,empty:s}){if(s)return!1;if(!e)return;const c=zC(e,n);if(c<e.length-1)return KC(t,e[c+1],i)}],["bottom-empty",function(t,{y:e},{x:n,y:i,empty:s}){if(s)return!1;if(!e)return;const c=zC(e,i);if(c<e.length-1)return KC(t,n,e[c+1])}],["left-empty",function(t,{x:e},{x:n,y:i,empty:s}){if(s)return!1;if(!e)return;const c=zC(e,n);if(c>0)return KC(t,e[c-1],i)}],["empty",function(t,e,{empty:n}){return n}]]);const MC=new WeakMap;function TC(t){let e=MC.get(t);return e||MC.set(t,e=new mt(ah(t,((t,e)=>[t,e])))),e}function zC(t,e){return TC(t).get(e)}function KC(t,e,n){return function(t,e,n){return e=Uh(e),n=Uh(n),t.find((t=>Object.is(Uh(t.x),e)&&Object.is(Uh(t.y),n)))}(t,e,n)?.empty}function OC(t,{y:e},{y:n}){return!e||0===zC(e,n)}function _C(t,{y:e},{y:n}){return!e||zC(e,n)===e.length-1}function PC(t,{x:e},{x:n}){return!e||0===zC(e,n)}function jC(t,{x:e},{x:n}){return!e||zC(e,n)===e.length-1}function $C(t,e){return function(){return t.apply(null,arguments)&&e.apply(null,arguments)}}function qC(t,{channels:{fx:e,fy:n},groups:i}){return e&&n?t.map((({x:t,y:e})=>i.get(t)?.get(e)??[])):e?t.map((({x:t})=>i.get(t)??[])):t.map((({y:t})=>i.get(t)??[]))}class ty{constructor(t,e={},n={},i){const{facet:s="auto",facetAnchor:c,fx:a,fy:l,sort:r,dx:o=0,dy:g=0,margin:B=0,marginTop:d=B,marginRight:Q=B,marginBottom:I=B,marginLeft:F=B,clip:u=i?.clip,channels:h,tip:U,render:b}=n;if(this.data=t,this.sort=dh(r)?r:null,this.initializer=cU(n).initializer,this.transform=this.initializer?n.transform:sU(n).transform,null===s||!1===s?this.facet=null:(this.facet=sh(!0===s?"include":s,"facet",["auto","include","exclude","super"]),this.fx=t===Du&&"string"==typeof a?[a]:a,this.fy=t===Du&&"string"==typeof l?[l]:l),this.facetAnchor=function(t){if(null==t)return null;const e=JC.get(`${t}`.toLowerCase());if(e)return e;throw new Error(`invalid facet anchor: ${t}`)}(c),e=Mh(e),void 0!==h&&(e={...iy(h),...e}),void 0!==i&&(e={...OU(this,n,i),...e}),this.channels=Object.fromEntries(Object.entries(e).map((([e,n])=>{if(Bh(n.value)){const{value:t,label:e=n.label,scale:i=n.scale}=n.value;n={...n,label:e,scale:i,value:t}}if(t===Du&&"string"==typeof n.value){const{value:t}=n;n={...n,value:[t]}}return[e,n]})).filter((([t,{value:e,optional:n}])=>{if(null!=e)return!0;if(n)return!1;throw new Error(`missing channel value: ${t}`)}))),this.dx=+o,this.dy=+g,this.marginTop=+d,this.marginRight=+Q,this.marginBottom=+I,this.marginLeft=+F,this.clip=tb(u),this.tip=function(t){return!0===t?"xy":!1===t||null==t?null:"string"==typeof t?sh(t,"tip",["x","y","xy"]):t}(U),"super"===this.facet){if(a||l)throw new Error("super-faceting cannot use fx or fy");for(const t in this.channels){const{scale:n}=e[t];if("x"===n||"y"===n)throw new Error("super-faceting cannot use x or y")}}null!=b&&(this.render=ny(b,this.render))}initialize(t,e,n){let i=ch(this.data);void 0===t&&null!=i&&(t=[Fh(i)]);const s=t;null!=this.transform&&(({facets:t,data:i}=this.transform(i,t,n)),i=ch(i)),void 0!==t&&(t.original=s);const c=function(t,e){return Object.fromEntries(Object.entries(t).map((([t,n])=>[t,SU(e,n,t)])))}(this.channels,i);return null!=this.sort&&function(t,e,n,i,s){const{order:c,reverse:a,reduce:l=!0,limit:r}=s;for(const o in s){if(!$h.has(o))continue;let{value:g,order:B=c,reverse:d=a,reduce:Q=l,limit:I=r}=Lh(s[o]);const F=g?.startsWith("-");if(F&&(g=g.slice(1)),B=void 0===B?F!==("width"===g||"height"===g)?wU:VU:EU(B),null==Q||!1===Q)continue;const u="fx"===o||"fy"===o?XU(e,i[o]):NU(n,o);if(!u)throw new Error(`missing channel for scale: ${o}`);const h=u.value,[U=0,b=1/0]=Sh(I)?I:I<0?[I]:[0,I];if(null==g)u.domain=()=>{let t=Array.from(new At(h));return d&&(t=t.reverse()),0===U&&b===1/0||(t=t.slice(U,b)),t};else{const e="data"===g?t:"height"===g?vU(n,"y1","y2"):"width"===g?vU(n,"x1","x2"):ZU(n,g,"y"===g?"y2":"x"===g?"x2":void 0),i=hU(!0===Q?"max":Q,e);u.domain=()=>{let t=Zt(Fh(h),(t=>i.reduceIndex(t,e)),(t=>h[t]));return B&&t.sort(B),d&&t.reverse(),0===U&&b===1/0||(t=t.slice(U,b)),t.map(Ou)}}}}(i,t,c,e,this.sort),{data:i,facets:t,channels:c}}filter(t,e,n){for(const i in e){const{filter:s=nu}=e[i];if(null!==s){const e=n[i];t=t.filter((t=>s(e[t])))}}return t}project(t,e,n){for(const i in t)if("x"===t[i].scale&&/^x|x$/.test(i)){const s=i.replace(/^x|x$/,"y");s in t&&"y"===t[s].scale&&Gb(i,s,e,n.projection)}}scale(t,e,n){const i=function(t,e){const n=Object.fromEntries(Object.entries(t).map((([t,{scale:n,value:i}])=>{const s=null==n?null:e[n];return[t,null==s?i:ah(i,s)]})));return n.channels=t,n}(t,e);return n.projection&&this.project(t,i,n),i}}function ey(...t){return t.plot=ty.prototype.plot,t}function ny(t,e){if(null==t)return null===e?void 0:e;if(null==e)return null===t?void 0:t;if("function"!=typeof t)throw new TypeError(`invalid render transform: ${t}`);if("function"!=typeof e)throw new TypeError(`invalid render transform: ${e}`);return function(n,i,s,c,a,l){return t.call(this,n,i,s,c,a,((t,n,i,s,c)=>e.call(this,t,n,i,s,c,l)))}}function iy(t){return Object.fromEntries(Object.entries(Mh(t)).map((([t,e])=>(void 0===(e="string"==typeof e?{value:e,label:t}:Lh(e)).filter&&null==e.scale&&(e={...e,filter:null}),[t,e]))))}function sy(t,e){return!0===t?.tip?{...t,tip:e}:oh(t?.tip)&&void 0===t.tip.pointer?{...t,tip:{...t.tip,pointer:e}}:t}const cy=new WeakMap;function ay(t,e,{x:n,y:i,px:s,py:c,maxRadius:a=40,channels:l,render:r,...o}={}){return a=+a,null!=s&&(n??=null,l={...l,px:{value:s,scale:"x"}}),null!=c&&(i??=null,l={...l,py:{value:c,scale:"y"}}),{x:n,y:i,channels:l,...o,render:ny((function(n,i,s,c,l,r){const o=(l={...l,pointerSticky:!1}).ownerSVGElement,{data:g}=l.getMarkState(this);let B=cy.get(o);B||cy.set(o,B={sticky:!1,roots:[],renders:[]});let d=B.renders.push(X)-1;const{x:Q,y:I,fx:F,fy:u}=i;let h=F?F(n.fx)-c.marginLeft:0,U=u?u(n.fy)-c.marginTop:0;Q?.bandwidth&&(h+=Q.bandwidth()/2),I?.bandwidth&&(U+=I.bandwidth()/2);const b=null!=n.fi;let C;if(b){let t=B.facetStates;t||(B.facetStates=t=new Map),C=t.get(this),C||t.set(this,C=new Map)}const[y,f]=Bb(this,c),{px:G,py:p}=s,m=G?t=>G[t]:gy(s,y),A=p?t=>p[t]:By(s,f);let x,L,S,R;function N(t,e){if(b){if(R&&(R=cancelAnimationFrame(R)),null!=t)return C.set(n.fi,e),void(R=requestAnimationFrame((()=>{R=null;for(const[i,s]of C)if(s<e||s===e&&i<n.fi){t=null;break}X(t)})));C.delete(n.fi)}X(t)}function X(t){if(x===t&&S===B.sticky)return;x=t,S=l.pointerSticky=B.sticky;const e=null==x?[]:[x];b&&(e.fx=n.fx,e.fy=n.fy,e.fi=n.fi);const a=r(e,i,s,c,l);if(L){if(b){const t=L.parentNode,e=L.getAttribute("transform"),n=a.getAttribute("transform");e?a.setAttribute("transform",e):a.removeAttribute("transform"),n?t.setAttribute("transform",n):t.removeAttribute("transform"),a.removeAttribute("aria-label"),a.removeAttribute("aria-description"),a.removeAttribute("aria-hidden")}L.replaceWith(a)}return B.roots[d]=L=a,null==x&&C?.size>1||l.dispatchValue(null==x?null:g[x]),a}function v(i){if(B.sticky||"mouse"===i.pointerType&&1===i.buttons)return;let[s,l]=Tn(i);s-=h,l-=U;const r=s<c.marginLeft||s>c.width-c.marginRight?1:t,o=l<c.marginTop||l>c.height-c.marginBottom?1:e;let g=null,d=a*a;for(const t of n){const e=r*(m(t)-s),n=o*(A(t)-l),i=e*e+n*n;i<=d&&(g=t,d=i)}if(null!=g&&(1!==t||1!==e)){const t=m(g)-s,e=A(g)-l;d=t*t+e*e}N(g,d)}return o.addEventListener("pointerenter",v),o.addEventListener("pointermove",v),o.addEventListener("pointerdown",(function(t){"mouse"===t.pointerType&&null!=x&&(B.sticky&&B.roots.some((e=>e?.contains(t.target)))||(B.sticky?(B.sticky=!1,B.renders.forEach((t=>t(null)))):(B.sticky=!0,X(x)),t.stopImmediatePropagation()))})),o.addEventListener("pointerleave",(function(t){"mouse"===t.pointerType&&(B.sticky||N(null))})),X(null)}),r)}}function ly(t){return ay(1,1,t)}function ry(t){return ay(1,.01,t)}function oy(t){return ay(.01,1,t)}function gy({x1:t,x2:e,x:n=t},i){return t&&e?n=>(t[n]+e[n])/2:n?t=>n[t]:()=>i}function By({y1:t,y2:e,y:n=t},i){return t&&e?n=>(t[n]+e[n])/2:n?t=>n[t]:()=>i}function dy(t){return XC(t)&&void 0===t.interval?void 0:"tabular-nums"}const Qy=Math.PI/180;function Iy(t,{marker:e,markerStart:n=e,markerMid:i=e,markerEnd:s=e}={}){t.markerStart=Fy(n),t.markerMid=Fy(i),t.markerEnd=Fy(s)}function Fy(t){if(null==t||!1===t)return null;if(!0===t)return Uy;if("function"==typeof t)return t;switch(`${t}`.toLowerCase()){case"none":return null;case"arrow":return uy("auto");case"arrow-reverse":return uy("auto-start-reverse");case"dot":return hy;case"circle":case"circle-fill":return Uy;case"circle-stroke":return by}throw new Error(`invalid marker: ${t}`)}function uy(t){return(e,n)=>Qb("svg:marker",n).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("orient",t).attr("fill","none").attr("stroke",e).attr("stroke-width",1.5).attr("stroke-linecap","round").attr("stroke-linejoin","round").call((t=>t.append("path").attr("d","M-1.5,-3l3,3l-3,3"))).node()}function hy(t,e){return Qb("svg:marker",e).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill",t).attr("stroke","none").call((t=>t.append("circle").attr("r",2.5))).node()}function Uy(t,e){return Qb("svg:marker",e).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill",t).attr("stroke","white").attr("stroke-width",1.5).call((t=>t.append("circle").attr("r",3))).node()}function by(t,e){return Qb("svg:marker",e).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill","white").attr("stroke",t).attr("stroke-width",1.5).call((t=>t.append("circle").attr("r",3))).node()}let Cy=0;function yy(t,e,{stroke:n},i){return Gy(t,e,n&&(t=>n[t]),i)}function fy(t,e,{stroke:n},i){return Gy(t,e,n&&(([t])=>n[t]),i)}function Gy(t,{markerStart:e,markerMid:n,markerEnd:i,stroke:s},c=(()=>s),a){const l=new Map;function r(t){return function(e){const n=c(e);let i=l.get(t);i||l.set(t,i=new Map);let s=i.get(n);if(!s){const e=this.parentNode.insertBefore(t(n,a),this),c="plot-marker-"+ ++Cy;e.setAttribute("id",c),i.set(n,s=`url(#${c})`)}return s}}e&&t.attr("marker-start",r(e)),n&&t.attr("marker-mid",r(n)),i&&t.attr("marker-end",r(i))}function py({inset:t,insetLeft:e,insetRight:n,...i}={}){return[e,n]=Ay(t,e,n),{inset:t,insetLeft:e,insetRight:n,...i}}function my({inset:t,insetTop:e,insetBottom:n,...i}={}){return[e,n]=Ay(t,e,n),{inset:t,insetTop:e,insetBottom:n,...i}}function Ay(t,e,n){return void 0===t&&void 0===e&&void 0===n?TU?[1,0]:[.5,.5]:[e,n]}function xy(t,{interval:e}){return(t={...Lh(t)}).interval=mh(void 0===t.interval?e:t.interval),t}function Ly(t,e,n,i){const{[t]:s,[`${t}1`]:c,[`${t}2`]:a}=n,{value:l,interval:r}=xy(s,n);if(null==l||null==r&&!i)return n;const o=yh(s);if(null==r){let e;const i={transform:t=>e||(e=wu(t,l)),label:o};return{...n,[t]:void 0,[`${t}1`]:void 0===c?i:c,[`${t}2`]:void 0===a?i:a}}let g,B;function d(t){return void 0!==B&&t===g?B:B=ah(wu(g=t,l),(t=>r.floor(t)))}return e({...n,[t]:void 0,[`${t}1`]:void 0===c?{transform:d,label:o}:c,[`${t}2`]:void 0===a?{transform:t=>d(t).map((t=>r.offset(t))),label:o}:a})}function Sy(t,e,n){const{[t]:i}=n,{value:s,interval:c}=xy(i,n);return null==s||null==c?n:e({...n,[t]:{label:yh(i),transform:t=>{const e=ah(wu(t,s),(t=>c.floor(t))),n=e.map((t=>c.offset(t)));return e.map(Xh(e)?(t,e)=>null==t||isNaN(t=+t)||null==(e=n[e])||isNaN(e=+e)?void 0:new Date((t+e)/2):(t,e)=>null==t||null==(e=n[e])?NaN:(+t+ +e)/2)}}})}const Ry={ariaLabel:"rule",fill:null,stroke:"currentColor"};class Ny extends ty{constructor(t,e={}){const{x:n,y1:i,y2:s,inset:c=0,insetTop:a=c,insetBottom:l=c}=e;super(t,{x:{value:n,scale:"x",optional:!0},y1:{value:i,scale:"y",optional:!0},y2:{value:s,scale:"y",optional:!0}},sy(e,"x"),Ry),this.insetTop=Ku(a),this.insetBottom=Ku(l),Iy(this,e)}render(t,e,n,i,s){const{x:c,y:a}=e,{x:l,y1:r,y2:o}=n,{width:g,height:B,marginTop:d,marginRight:Q,marginLeft:I,marginBottom:F}=i,{insetTop:u,insetBottom:h}=this;return Qb("svg:g",s).call(eb,this,i,s).call(cb,this,{x:l&&c},TU,0).call((e=>e.selectAll().data(t).enter().append("line").call(nb,this).attr("x1",l?t=>l[t]:(I+g-Q)/2).attr("x2",l?t=>l[t]:(I+g-Q)/2).attr("y1",r&&!ZC(a)?t=>r[t]+u:d+u).attr("y2",o&&!ZC(a)?a.bandwidth?t=>o[t]+a.bandwidth()-h:t=>o[t]-h:B-F-h).call(jU,this,n).call(yy,this,n,s))).node()}}class Xy extends ty{constructor(t,e={}){const{x1:n,x2:i,y:s,inset:c=0,insetRight:a=c,insetLeft:l=c}=e;super(t,{y:{value:s,scale:"y",optional:!0},x1:{value:n,scale:"x",optional:!0},x2:{value:i,scale:"x",optional:!0}},sy(e,"y"),Ry),this.insetRight=Ku(a),this.insetLeft=Ku(l),Iy(this,e)}render(t,e,n,i,s){const{x:c,y:a}=e,{y:l,x1:r,x2:o}=n,{width:g,height:B,marginTop:d,marginRight:Q,marginLeft:I,marginBottom:F}=i,{insetLeft:u,insetRight:h}=this;return Qb("svg:g",s).call(eb,this,i,s).call(cb,this,{y:l&&a},0,TU).call((e=>e.selectAll().data(t).enter().append("line").call(nb,this).attr("x1",r&&!ZC(c)?t=>r[t]+u:I+u).attr("x2",o&&!ZC(c)?c.bandwidth?t=>o[t]+c.bandwidth()-h:t=>o[t]-h:g-Q-h).attr("y1",l?t=>l[t]:(d+B-F)/2).attr("y2",l?t=>l[t]:(d+B-F)/2).call(jU,this,n).call(yy,this,n,s))).node()}}function vy(t,e){let{x:n=Ju,y:i,y1:s,y2:c,...a}=function(t={}){return Ly("y",my,t)}(e);return[s,c]=Ey(i,s,c),new Ny(t,{...a,x:n,y1:s,y2:c})}function Zy(t,e){let{y:n=Ju,x:i,x1:s,x2:c,...a}=function(t={}){return Ly("x",py,t)}(e);return[s,c]=Ey(i,s,c),new Xy(t,{...a,y:n,x1:s,x2:c})}function Ey(t,e,n){if(null==t){if(void 0===e){if(void 0!==n)return[0,n]}else if(void 0===n)return[0,e]}else{if(void 0===e)return void 0===n?[0,t]:[t,n];if(void 0===n)return[t,e]}return[e,n]}function Vy(t,...e){let n=e.length;for(let i=0,s=!0;i<n;++i)"function"!=typeof e[i]&&(s&&(t=t.slice(),s=!1),t.splice(i,2,t[i]+e[i]+t[i+1]),e.splice(i,1),--i,--n);return i=>{let s=t[0];for(let c=0;c<n;++c)s+=e[c](i)+t[c+1];return s}}const wy={ariaLabel:"text",strokeLinejoin:"round",strokeWidth:3,paintOrder:"stroke"},Wy="";class Hy extends ty{constructor(t,e={}){const{x:n,y:i,text:s=(Sh(t)&&Rh(t)?Ju:ku),frameAnchor:c,textAnchor:a=(/right$/i.test(c)?"end":/left$/i.test(c)?"start":"middle"),lineAnchor:l=(/^top/i.test(c)?"top":/^bottom/i.test(c)?"bottom":"middle"),lineHeight:r=1,lineWidth:o=1/0,textOverflow:g,monospace:B,fontFamily:d=(B?"ui-monospace, monospace":void 0),fontSize:Q,fontStyle:I,fontVariant:F,fontWeight:u,rotate:h}=e,[U,b]=nh(h,0),[C,y]=function(t){return null==t||"number"==typeof t?[void 0,t]:"string"!=typeof t?[t,void 0]:(t=t.trim().toLowerCase(),zy.has(t)||/^[+-]?\d*\.?\d+(e[+-]?\d+)?(\w*|%)$/.test(t)?[void 0,t]:[t,void 0])}(Q);var f;if(super(t,{x:{value:n,scale:"x",optional:!0},y:{value:i,scale:"y",optional:!0},fontSize:{value:C,optional:!0},rotate:{value:(f=U,null==f?null:{transform:t=>wu(t,f,Float64Array),label:yh(f)}),optional:!0},text:{value:s,filter:cu,optional:!0}},e,wy),this.rotate=b,this.textAnchor=ab(a,"middle"),this.lineAnchor=sh(l,"lineAnchor",["top","middle","bottom"]),this.lineHeight=+r,this.lineWidth=+o,this.textOverflow=Dy(g),this.monospace=!!B,this.fontFamily=zu(d),this.fontSize=y,this.fontStyle=zu(I),this.fontVariant=zu(F),this.fontWeight=zu(u),this.frameAnchor=kh(c),!(this.lineWidth>=0))throw new Error(`invalid lineWidth: ${o}`);this.splitLines=jy(this),this.clipLine=$y(this)}render(t,e,n,i,s){const{x:c,y:a}=e,{x:l,y:r,rotate:o,text:g,title:B,fontSize:d}=n,{rotate:Q}=this,[I,F]=Bb(this,i);return Qb("svg:g",s).call(eb,this,i,s).call(Ty,this,g,i).call(cb,this,{x:l&&c,y:r&&a}).call((e=>e.selectAll().data(t).enter().append("text").call(nb,this).call(Yy,this,g,B).attr("transform",Vy`translate(${l?t=>l[t]:I},${r?t=>r[t]:F})${o?t=>` rotate(${o[t]})`:Q?` rotate(${Q})`:""}`).call(sb,"font-size",d&&(t=>d[t])).call(jU,this,n))).node()}}function Dy(t){return null==t?null:sh(t,"textOverflow",["clip","ellipsis","clip-start","clip-end","ellipsis-start","ellipsis-middle","ellipsis-end"]).replace(/^(clip|ellipsis)$/,"$1-end")}function Yy(t,e,n,i){if(!n)return;const{lineAnchor:s,lineHeight:c,textOverflow:a,splitLines:l,clipLine:r}=e;t.each((function(t){const e=l(YU(n[t])??"").map(r),o=e.length,g="top"===s?.71:"bottom"===s?1-o:(164-100*o)/200;if(o>1){let t=0;for(let n=0;n<o;++n){if(++t,!e[n])continue;const i=this.ownerDocument.createElementNS(Xe.svg,"tspan");i.setAttribute("x",0),n===t-1?i.setAttribute("y",(g+n)*c+"em"):i.setAttribute("dy",t*c+"em"),i.textContent=e[n],this.appendChild(i),t=0}}else g&&this.setAttribute("y",g*c+"em"),this.textContent=e[0];if(a&&!i&&e[0]!==n[t]){const e=this.ownerDocument.createElementNS(Xe.svg,"title");e.textContent=n[t],this.appendChild(e)}}))}function ky(t,{x:e,y:n,...i}={}){return void 0===i.frameAnchor&&([e,n]=Qh(e,n)),new Hy(t,{...i,x:e,y:n})}function Jy(t,{x:e=Ju,...n}={}){return new Hy(t,function(t={}){return Sy("y",my,t)}({...n,x:e}))}function My(t,{y:e=Ju,...n}={}){return new Hy(t,function(t={}){return Sy("x",py,t)}({...n,y:e}))}function Ty(t,e,n){sb(t,"text-anchor",e.textAnchor),sb(t,"font-family",e.fontFamily),sb(t,"font-size",e.fontSize),sb(t,"font-style",e.fontStyle),sb(t,"font-variant",void 0===e.fontVariant?function(t){return t&&(function(t){for(const e of t)if(null!=e)return"number"==typeof e}(t)||Xh(t))?"tabular-nums":void 0}(n):e.fontVariant),sb(t,"font-weight",e.fontWeight)}const zy=new Set(["inherit","initial","revert","unset","xx-small","x-small","small","medium","large","x-large","xx-large","xxx-large","larger","smaller"]);function Ky(t,e,n){const i=[];let s,c=0;for(const[a,l,r]of function*(t){let e=0,n=0;const i=t.length;for(;n<i;){let i=1;switch(t[n]){case Wy:case"-":++n,yield[e,n,!1],e=n;break;case" ":for(yield[e,n,!1];" "===t[++n];);e=n;break;case"\r":"\n"===t[n+1]&&++i;case"\n":yield[e,n,!0],n+=i,e=n;break;default:++n}}yield[e,n,!0]}(t))void 0===s&&(s=a),c>s&&n(t,s,l)>e&&(i.push(t.slice(s,c)+(t[c-1]===Wy?"-":"")),s=a),r?(i.push(t.slice(s,l)),s=void 0):c=l;return i}const Oy={a:56,b:63,c:57,d:63,e:58,f:37,g:62,h:60,i:26,j:26,k:55,l:26,m:88,n:60,o:60,p:62,q:62,r:39,s:54,t:38,u:60,v:55,w:79,x:54,y:55,z:55,A:69,B:67,C:73,D:74,E:61,F:58,G:76,H:75,I:28,J:55,K:67,L:58,M:89,N:75,O:78,P:65,Q:78,R:67,S:65,T:65,U:75,V:69,W:98,X:69,Y:67,Z:67,0:64,1:48,2:62,3:64,4:66,5:63,6:65,7:58,8:65,9:65," ":29,"!":32,'"':49,"'":31,"(":39,")":39,",":31,"-":48,".":31,"/":32,":":31,";":31,"?":52,"‘":31,"’":31,"“":47,"”":47,"…":82};function _y(t,e=0,n=t.length){let i=0;for(let s=e;s<n;s=af(t,s))i+=Oy[t[s]]??(rf(t,s)?120:Oy.e);return i}function Py(t,e=0,n=t.length){let i=0;for(let s=e;s<n;s=af(t,s))i+=rf(t,s)?200:100;return i}function jy({monospace:t,lineWidth:e,textOverflow:n}){if(null!=n||e==1/0)return t=>t.split(/\r\n?|\n/g);const i=t?Py:_y,s=100*e;return t=>Ky(t,s,i)}function $y({monospace:t,lineWidth:e,textOverflow:n}){if(null==n||e==1/0)return t=>t;const i=t?Py:_y,s=100*e;switch(n){case"clip-start":return t=>nf(t,s,i,"");case"clip-end":return t=>ef(t,s,i,"");case"ellipsis-start":return t=>nf(t,s,i,qy);case"ellipsis-middle":return t=>function(t,e,n,i){t=t.trim();const s=n(t);if(s<=e)return t;const c=n(i)/2,[a,l]=tf(t,e/2,n,c),[r]=tf(t,s-e/2-l+c,n,-c);return r<0?i:t.slice(0,a).trimEnd()+i+t.slice(af(t,r)).trimStart()}(t,s,i,qy);case"ellipsis-end":return t=>ef(t,s,i,qy)}}const qy="…";function tf(t,e,n,i){const s=[];let c=0;for(let a=0,l=0,r=t.length;a<r;a=l){l=af(t,a);const r=n(t,a,l);if(c+r>e){for(c+=i;c>e&&a>0;)l=a,a=s.pop(),c-=n(t,a,l);return[a,e-c]}c+=r,s.push(a)}return[-1,0]}function ef(t,e,n,i){t=t.trim();const s=n(i),[c]=tf(t,e,n,s);return c<0?t:t.slice(0,c).trimEnd()+i}function nf(t,e,n,i){const s=n(t=t.trim());if(s<=e)return t;const c=n(i),[a]=tf(t,s-e+c,n,-c);return a<0?i:i+t.slice(af(t,a)).trimStart()}const sf=/[\p{Combining_Mark}\p{Emoji_Modifier}]+/uy,cf=/\p{Extended_Pictographic}/uy;function af(t,e){return e+=function(t,e){const n=t.charCodeAt(e);if(n>=55296&&n<56320){const n=t.charCodeAt(e+1);return n>=56320&&n<57344}return!1}(t,e)?2:1,function(t,e){return!lf(t,e)&&(sf.lastIndex=e,sf.test(t))}(t,e)&&(e=sf.lastIndex),function(t,e){return 8205===t.charCodeAt(e)}(t,e)?af(t,e+1):e}function lf(t,e){return t.charCodeAt(e)<128}function rf(t,e){return!lf(t,e)&&(cf.lastIndex=e,cf.test(t))}const of={ariaLabel:"vector",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinejoin:"round",strokeLinecap:"round"},gf=3.5,Bf=5*gf,df={draw(t,e,n){const i=e*n/Bf;t.moveTo(0,0),t.lineTo(0,-e),t.moveTo(-i,i-e),t.lineTo(0,-e),t.lineTo(i,i-e)}},Qf={draw(t,e,n){t.moveTo(-n,0),t.lineTo(0,-e),t.lineTo(n,0)}},If=new Map([["arrow",df],["spike",Qf]]);class Ff extends ty{constructor(t,e={}){const{x:n,y:i,r:s=gf,length:c,rotate:a,shape:l=df,anchor:r="middle",frameAnchor:o}=e,[g,B]=nh(c,12),[d,Q]=nh(a,0);super(t,{x:{value:n,scale:"x",optional:!0},y:{value:i,scale:"y",optional:!0},length:{value:g,scale:"length",optional:!0},rotate:{value:d,optional:!0}},e,of),this.r=+s,this.length=B,this.rotate=Q,this.shape=function(t){if(function(t){return t&&"function"==typeof t.draw}(t))return t;const e=If.get(`${t}`.toLowerCase());if(e)return e;throw new Error(`invalid shape: ${t}`)}(l),this.anchor=sh(r,"anchor",["start","middle","end"]),this.frameAnchor=kh(o)}render(t,e,n,i,s){const{x:c,y:a}=e,{x:l,y:r,length:o,rotate:g}=n,{length:B,rotate:d,anchor:Q,shape:I,r:F}=this,[u,h]=Bb(this,i);return Qb("svg:g",s).call(eb,this,i,s).call(cb,this,{x:l&&c,y:r&&a}).call((e=>e.selectAll().data(t).enter().append("path").call(nb,this).attr("transform",Vy`translate(${l?t=>l[t]:u},${r?t=>r[t]:h})${g?t=>` rotate(${g[t]})`:d?` rotate(${d})`:""}${"start"===Q?"":"end"===Q?o?t=>` translate(0,${o[t]})`:` translate(0,${B})`:o?t=>` translate(0,${o[t]/2})`:` translate(0,${B/2})`}`).attr("d",o?t=>{const e=ea();return I.draw(e,o[t],F),e}:(()=>{const t=ea();return I.draw(t,B,F),t})()).call(jU,this,n))).node()}}function uf(t,e={}){const{x:n=Ju,...i}=e;return new Ff(t,{...i,x:n})}function hf(t,e={}){const{y:n=Ju,...i}=e;return new Ff(t,{...i,y:n})}function Uf(t,e){return arguments.length<2&&!Sh(t)&&(e=t,t=null),void 0===e&&(e={}),[t,e]}function bf({anchor:t}={},e){return void 0===t?e[0]:sh(t,"anchor",e)}function Cf(t){return bf(t,["left","right"])}function yf(t){return bf(t,["right","left"])}function ff(t){return bf(t,["bottom","top"])}function Gf(t){return bf(t,["top","bottom"])}function pf(){const[t,e]=Uf(...arguments);return Lf("y",Cf(e),t,e)}function mf(){const[t,e]=Uf(...arguments);return Lf("fy",yf(e),t,e)}function Af(){const[t,e]=Uf(...arguments);return Sf("x",ff(e),t,e)}function xf(){const[t,e]=Uf(...arguments);return Sf("fx",Gf(e),t,e)}function Lf(t,e,n,{color:i="currentColor",opacity:s=1,stroke:c=i,strokeOpacity:a=s,strokeWidth:l=1,fill:r=i,fillOpacity:o=s,textAnchor:g,textStroke:B,textStrokeOpacity:d,textStrokeWidth:Q,tickSize:I=("y"===t?6:0),tickPadding:F,tickRotate:u,x:h,margin:U,marginTop:b=(void 0===U?20:U),marginRight:C=(void 0===U?"right"===e?40:0:U),marginBottom:y=(void 0===U?20:U),marginLeft:f=(void 0===U?"left"===e?40:0:U),label:G,labelAnchor:p,labelArrow:m,labelOffset:A,...x}){return I=Ku(I),F=Ku(F),u=Ku(u),void 0!==p&&(p=sh(p,"labelAnchor",["center","top","bottom"])),m=Of(m),ey(I&&!Hh(c)?function(t,e,n,{strokeWidth:i=1,strokeLinecap:s=null,strokeLinejoin:c=null,facetAnchor:a=e+("y"===t?"-empty":""),frameAnchor:l=e,tickSize:r,inset:o=0,insetLeft:g=o,insetRight:B=o,dx:d=0,y:Q=("y"===t?void 0:null),...I}){return Wf(hf,t,e,`${t}-axis tick`,n,{strokeWidth:i,strokeLinecap:s,strokeLinejoin:c,facetAnchor:a,frameAnchor:l,y:Q,...I,dx:"left"===e?+d-TU+ +g:+d+TU-B,anchor:"start",length:r,shape:"left"===e?Mf:Tf})}(t,e,n,{stroke:c,strokeOpacity:a,strokeWidth:l,tickSize:I,tickPadding:F,tickRotate:u,x:h,...x}):null,Hh(r)?null:function(t,e,n,{facetAnchor:i=e+("y"===t?"-empty":""),frameAnchor:s=e,tickSize:c,tickRotate:a=0,tickPadding:l=Math.max(3,9-c)+(Math.abs(a)>60?4*Math.cos(a*Qy):0),text:r,textAnchor:o=(Math.abs(a)>60?"middle":"left"===e?"end":"start"),lineAnchor:g=(a>60?"top":a<-60?"bottom":"middle"),fontVariant:B,inset:d=0,insetLeft:Q=d,insetRight:I=d,dx:F=0,y:u=("y"===t?void 0:null),...h}){return Wf(My,t,e,`${t}-axis tick label`,n,{facetAnchor:i,frameAnchor:s,text:r,textAnchor:o,lineAnchor:g,fontVariant:B,rotate:a,y:u,...h,dx:"left"===e?+F-c-l+ +Q:+F+ +c+ +l-I},(function(t,n,i,s,c){void 0===B&&(this.fontVariant=zf(t)),void 0===r&&(c.text=Hf(t,n,i,s,e))}))}(t,e,n,{fill:r,fillOpacity:o,stroke:B,strokeOpacity:d,strokeWidth:Q,textAnchor:g,tickSize:I,tickPadding:F,tickRotate:u,x:h,marginTop:b,marginRight:C,marginBottom:y,marginLeft:f,...x}),Hh(r)||null===G?null:ky([],wf({fill:r,fillOpacity:o,...x},(function(n,i,s,c,a){const l=c[t],{marginTop:r,marginRight:o,marginBottom:g,marginLeft:B}="y"===t&&a.inset||a,d=p??(l.bandwidth?"center":"top"),Q=A??("right"===e?o:B)-3;return"center"===d?(this.textAnchor=void 0,this.lineAnchor="right"===e?"bottom":"top",this.frameAnchor=e,this.rotate=-90):(this.textAnchor="right"===e?"end":"start",this.lineAnchor=d,this.frameAnchor=`${d}-${e}`,this.rotate=0),this.dy="top"===d?3-r:"bottom"===d?g-3:0,this.dx="right"===e?Q:-Q,this.ariaLabel=`${t}-axis label`,{facets:[[0]],channels:{text:{value:[Kf(t,l,{anchor:e,label:G,labelAnchor:d,labelArrow:m})]}}}}))))}function Sf(t,e,n,{color:i="currentColor",opacity:s=1,stroke:c=i,strokeOpacity:a=s,strokeWidth:l=1,fill:r=i,fillOpacity:o=s,textAnchor:g,textStroke:B,textStrokeOpacity:d,textStrokeWidth:Q,tickSize:I=("x"===t?6:0),tickPadding:F,tickRotate:u,y:h,margin:U,marginTop:b=(void 0===U?"top"===e?30:0:U),marginRight:C=(void 0===U?20:U),marginBottom:y=(void 0===U?"bottom"===e?30:0:U),marginLeft:f=(void 0===U?20:U),label:G,labelAnchor:p,labelArrow:m,labelOffset:A,...x}){return I=Ku(I),F=Ku(F),u=Ku(u),void 0!==p&&(p=sh(p,"labelAnchor",["center","left","right"])),m=Of(m),ey(I&&!Hh(c)?function(t,e,n,{strokeWidth:i=1,strokeLinecap:s=null,strokeLinejoin:c=null,facetAnchor:a=e+("x"===t?"-empty":""),frameAnchor:l=e,tickSize:r,inset:o=0,insetTop:g=o,insetBottom:B=o,dy:d=0,x:Q=("x"===t?void 0:null),...I}){return Wf(uf,t,e,`${t}-axis tick`,n,{strokeWidth:i,strokeLinejoin:c,strokeLinecap:s,facetAnchor:a,frameAnchor:l,x:Q,...I,dy:"bottom"===e?+d-TU-B:+d+TU+ +g,anchor:"start",length:r,shape:"bottom"===e?kf:Jf})}(t,e,n,{stroke:c,strokeOpacity:a,strokeWidth:l,tickSize:I,tickPadding:F,tickRotate:u,y:h,...x}):null,Hh(r)?null:function(t,e,n,{facetAnchor:i=e+("x"===t?"-empty":""),frameAnchor:s=e,tickSize:c,tickRotate:a=0,tickPadding:l=Math.max(3,9-c)+(Math.abs(a)>=10?4*Math.cos(a*Qy):0),text:r,textAnchor:o=(Math.abs(a)>=10?a<0^"bottom"===e?"start":"end":"middle"),lineAnchor:g=(Math.abs(a)>=10?"middle":"bottom"===e?"top":"bottom"),fontVariant:B,inset:d=0,insetTop:Q=d,insetBottom:I=d,dy:F=0,x:u=("x"===t?void 0:null),...h}){return Wf(Jy,t,e,`${t}-axis tick label`,n,{facetAnchor:i,frameAnchor:s,text:void 0===r?null:r,textAnchor:o,lineAnchor:g,fontVariant:B,rotate:a,x:u,...h,dy:"bottom"===e?+F+ +c+ +l-I:+F-c-l+ +Q},(function(t,n,i,s,c){void 0===B&&(this.fontVariant=zf(t)),void 0===r&&(c.text=Hf(t,n,i,s,e))}))}(t,e,n,{fill:r,fillOpacity:o,stroke:B,strokeOpacity:d,strokeWidth:Q,textAnchor:g,tickSize:I,tickPadding:F,tickRotate:u,y:h,marginTop:b,marginRight:C,marginBottom:y,marginLeft:f,...x}),Hh(r)||null===G?null:ky([],wf({fill:r,fillOpacity:o,...x},(function(n,i,s,c,a){const l=c[t],{marginTop:r,marginRight:o,marginBottom:g,marginLeft:B}="x"===t&&a.inset||a,d=p??(l.bandwidth?"center":"right"),Q=A??("top"===e?r:g)-3;return"center"===d?(this.frameAnchor=e,this.textAnchor=void 0):(this.frameAnchor=`${e}-${d}`,this.textAnchor="right"===d?"end":"start"),this.lineAnchor=e,this.dy="top"===e?-Q:Q,this.dx="right"===d?o-3:"left"===d?3-B:0,this.ariaLabel=`${t}-axis label`,{facets:[[0]],channels:{text:{value:[Kf(t,l,{anchor:e,label:G,labelAnchor:d,labelArrow:m})]}}}}))))}function Rf(){const[t,e]=Uf(...arguments);return Zf("y",Cf(e),t,e)}function Nf(){const[t,e]=Uf(...arguments);return Zf("fy",yf(e),t,e)}function Xf(){const[t,e]=Uf(...arguments);return Ef("x",ff(e),t,e)}function vf(){const[t,e]=Uf(...arguments);return Ef("fx",Gf(e),t,e)}function Zf(t,e,n,{y:i=("y"===t?void 0:null),x:s=null,x1:c=("left"===e?s:null),x2:a=("right"===e?s:null),...l}){return Wf(Zy,t,e,`${t}-grid`,n,{y:i,x1:c,x2:a,...Vf(l)})}function Ef(t,e,n,{x:i=("x"===t?void 0:null),y:s=null,y1:c=("top"===e?s:null),y2:a=("bottom"===e?s:null),...l}){return Wf(vy,t,e,`${t}-grid`,n,{x:i,y1:c,y2:a,...Vf(l)})}function Vf({color:t="currentColor",opacity:e=.1,stroke:n=t,strokeOpacity:i=e,strokeWidth:s=1,...c}){return{stroke:n,strokeOpacity:i,strokeWidth:s,...c}}function wf({fill:t,fillOpacity:e,fontFamily:n,fontSize:i,fontStyle:s,fontVariant:c,fontWeight:a,monospace:l,pointerEvents:r,shapeRendering:o,clip:g=!1},B){return[,t]=eh(t),[,e]=nh(e),{facet:"super",x:null,y:null,fill:t,fillOpacity:e,fontFamily:n,fontSize:i,fontStyle:s,fontVariant:c,fontWeight:a,monospace:l,pointerEvents:r,shapeRendering:o,clip:g,initializer:B}}function Wf(t,e,n,i,s,c,a){let l;const r=cU(c).initializer,o=t(s,cU({...c,initializer:function(t,n,i,s,r,o){const g=null==t&&("fx"===e||"fy"===e),{[e]:B}=s;if(!B)throw new Error(`missing scale: ${e}`);const d=B.domain();let{interval:Q,ticks:I,tickFormat:F,tickSpacing:u=("x"===e?80:35)}=c;if("string"==typeof I&&_f(B)&&(Q=I,I=void 0),void 0===I&&(I=Ah(Q,B.type)??function(t,e){const[n,i]=Gt(t.range());return(i-n)/e}(B,u)),null==t){if(Sh(I))t=ch(I);else if(xh(I))t=Yf(I,...Gt(d));else if(B.interval){let e=B.interval;if(B.ticks){const[n,i]=Gt(d);e=Ru(e,(i-n)/e[pu]/I)??e,t=Yf(e,n,i)}else{e=Ru(e,(t=d).length/I)??e,e!==B.interval&&(t=Yf(e,...Gt(t)))}if(e===B.interval){const e=Math.round(t.length/I);e>1&&(t=t.filter(((t,n)=>n%e==0)))}}else t=B.ticks?B.ticks(I):d;if(!B.ticks&&t.length&&t!==d){const n=new At(d);t=t.filter((t=>n.has(t))),t.length||MU(`Warning: the ${e}-axis ticks appear to not align with the scale domain, resulting in no ticks. Try different ticks?`)}"y"===e||"x"===e?n=[Fh(t)]:l[e]={scale:e,value:Ju}}a?.call(this,B,t,I,F,l);const h=Object.fromEntries(Object.entries(l).map((([e,n])=>[e,{...n,value:wu(t,n.value)}])));return g&&(n=o.filterFacets(t,h)),{data:t,facets:n,channels:h}}},r));return null==s?(l=o.channels,o.channels={}):l={},o.ariaLabel=i,void 0===o.clip&&(o.clip=!1),o}function Hf(t,e,n,i,s){return{value:Df(t,e,n,i,s)}}function Df(t,e,n,i,s){return"function"==typeof i?i:void 0===i&&e&&Xh(e)?Xu(e,s)??YU:t.tickFormat?t.tickFormat("number"==typeof n?n:null,i):void 0===i?YU:"string"==typeof i?(Xh(t.domain())?cB:da)(i):Pu(i)}function Yf(t,e,n){return t.range(e,t.offset(t.floor(n)))}const kf={draw(t,e){t.moveTo(0,0),t.lineTo(0,e)}},Jf={draw(t,e){t.moveTo(0,0),t.lineTo(0,-e)}},Mf={draw(t,e){t.moveTo(0,0),t.lineTo(-e,0)}},Tf={draw(t,e){t.moveTo(0,0),t.lineTo(e,0)}};function zf(t){return t.bandwidth&&!t.interval?void 0:"tabular-nums"}function Kf(t,e,{anchor:n,label:i=e.label,labelAnchor:s,labelArrow:c}={}){if(!(null==i||i.inferred&&_f(e)&&/^(date|time|year)$/i.test(i))){if(i=String(i),"auto"===c&&(c=(!e.bandwidth||e.interval)&&!/[↑↓→←]/.test(i)),!c)return i;if(!0===c){const n=function(t){return Math.sign(Jh(t.domain()))*Math.sign(Jh(t.range()))}(e);n&&(c=/x$/.test(t)||"center"===s?/x$/.test(t)===n<0?"left":"right":n<0?"up":"down")}switch(c){case"left":return`← ${i}`;case"right":return`${i} →`;case"up":return"right"===n?`${i} ↑`:`↑ ${i}`;case"down":return"right"===n?`${i} ↓`:`↓ ${i}`}return i}}function Of(t="auto"){return!Hh(t)&&("boolean"==typeof t?t:sh(t,"labelArrow",["auto","up","right","down","left"]))}function _f(t){return Xh(t.domain())}function Pf(t,e){if(null==e)return e;const n=t(e);if(!n)throw new Error(`scale not found: ${e}`);return n}function jf(t,e={},n){let{columns:i,tickFormat:s,fontVariant:c=dy(t),swatchSize:a=15,swatchWidth:l=a,swatchHeight:r=a,marginLeft:o=0,className:g,style:B,width:d}=e;const Q=db(e);g=ob(g),s=Df(t.scale,t.domain,void 0,s);const I=Qb("div",Q).attr("class",`${g}-swatches ${g}-swatches-${null!=i?"columns":"wrap"}`);let F;return null!=i?(F=`.${g}-swatches-columns .${g}-swatch {\n display: flex;\n align-items: center;\n break-inside: avoid;\n padding-bottom: 1px;\n}\n.${g}-swatches-columns .${g}-swatch::before {\n flex-shrink: 0;\n}\n.${g}-swatches-columns .${g}-swatch-label {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}`,I.style("columns",i).selectAll().data(t.domain).enter().append("div").attr("class",`${g}-swatch`).call(n,t,l,r).call((t=>t.append("div").attr("class",`${g}-swatch-label`).attr("title",s).text(s)))):(F=`.${g}-swatches-wrap {\n display: flex;\n align-items: center;\n min-height: 33px;\n flex-wrap: wrap;\n}\n.${g}-swatches-wrap .${g}-swatch {\n display: inline-flex;\n align-items: center;\n margin-right: 1em;\n}`,I.selectAll().data(t.domain).enter().append("span").attr("class",`${g}-swatch`).call(n,t,l,r).append((function(){return this.ownerDocument.createTextNode(s.apply(this,arguments))}))),I.call((t=>t.insert("style","*").text(`.${g}-swatches {\n font-family: system-ui, sans-serif;\n font-size: 10px;\n margin-bottom: 0.5em;\n}\n.${g}-swatch > svg {\n margin-right: 0.5em;\n overflow: visible;\n}\n${F}`))).style("margin-left",o?+o+"px":null).style("width",void 0===d?null:+d+"px").style("font-variant",ab(c,"normal")).call(gb,B).node()}const $f=new Map([["symbol",function(t,{fill:e=(void 0!==t.hint?.fill?t.hint.fill:"none"),fillOpacity:n=1,stroke:i=(void 0!==t.hint?.stroke?t.hint.stroke:Hh(e)?"currentColor":"none"),strokeOpacity:s=1,strokeWidth:c=1.5,r:a=4.5,...l}={},r){const[o,g]=eh(e),[B,d]=eh(i),Q=Pf(r,o),I=Pf(r,B),F=a*a*Math.PI;return n=nh(n)[1],s=nh(s)[1],c=nh(c)[1],jf(t,l,((e,i,a,l)=>e.append("svg").attr("viewBox","-8 -8 16 16").attr("width",a).attr("height",l).attr("fill","color"===o?t=>Q.scale(t):g).attr("fill-opacity",n).attr("stroke","color"===B?t=>I.scale(t):d).attr("stroke-opacity",s).attr("stroke-width",c).append("path").attr("d",(e=>{const n=ea();return t.scale(e).draw(n,F),n}))))}],["color",tG],["opacity",function({type:t,interpolate:e,...n},{legend:i=!0,color:s=mi(0,0,0),...c}){if(!e)throw new Error(`${t} opacity scales are not supported`);!0===i&&(i="ramp");if("ramp"!==`${i}`.toLowerCase())throw new Error(`${i} opacity legends are not supported`);return tG({type:t,...n,interpolate:eG(s)},{legend:i,...c})}]]);function qf({className:t,...e},{label:n,ticks:i,tickFormat:s}={},c){return function(t={},...e){let n=t;for(const i of e)for(const e in i)if(void 0===n[e]){const s=i[e];n===t?n={...n,[e]:s}:n[e]=s}return n}(c,{className:t,...e},{label:n,ticks:i,tickFormat:s})}function tG(t,{legend:e=!0,...n}){if(!0===e&&(e="ordinal"===t.type?"swatches":"ramp"),void 0!==t.domain)switch(`${e}`.toLowerCase()){case"swatches":return function(t,{opacity:e,...n}={}){if(!XC(t)&&!vC(t))throw new Error(`swatches legend requires ordinal or threshold color scale (not ${t.type})`);return jf(t,n,((t,n,i,s)=>t.append("svg").attr("width",i).attr("height",s).attr("fill",n.scale).attr("fill-opacity",nh(e)[1]).append("rect").attr("width","100%").attr("height","100%")))}(t,n);case"ramp":return function(t,e){let{label:n=t.label,tickSize:i=6,width:s=240,height:c=44+i,marginTop:a=18,marginRight:l=0,marginBottom:r=16+i,marginLeft:o=0,style:g,ticks:B=(s-o-l)/64,tickFormat:d,fontVariant:Q=dy(t),round:I=!0,opacity:F,className:u}=e;const h=db(e);u=ob(u),F=nh(F)[1],null===d&&(d=()=>null);const U=Qb("svg",h).attr("class",`${u}-ramp`).attr("font-family","system-ui, sans-serif").attr("font-size",10).attr("width",s).attr("height",c).attr("viewBox",`0 0 ${s} ${c}`).call((t=>t.append("style").text(`.${u}-ramp {\n display: block;\n background: white;\n height: auto;\n height: intrinsic;\n max-width: 100%;\n overflow: visible;\n}\n.${u}-ramp text {\n white-space: pre;\n}`))).call(gb,g);let b,C=t=>t.selectAll(".tick line").attr("y1",a+r-c);const y=I?(t,e)=>t.rangeRound(e):(t,e)=>t.range(e),{type:f,domain:G,range:p,interpolate:m,scale:A,pivot:x}=t;if(m){const t=void 0===p?m:Js(1===m.length?eC(m):m,p);b=y(A.copy(),Ms(ms(o,s-l),Math.min(G.length+(void 0!==x),void 0===p?1/0:p.length)));const e=256,n=h.document.createElement("canvas");n.width=e,n.height=1;const i=n.getContext("2d");for(let n=0,s=e-1;n<e;++n)i.fillStyle=t(n/s),i.fillRect(n,0,1,1);U.append("image").attr("opacity",F).attr("x",o).attr("y",a).attr("width",s-o-l).attr("height",c-a-r).attr("preserveAspectRatio","none").attr("xlink:href",n.toDataURL())}else if("threshold"===f){const t=G,e=void 0===d?t=>t:"string"==typeof d?da(d):d;b=y(ko().domain([-1,p.length-1]),[o,s-l]),U.append("g").attr("fill-opacity",F).selectAll().data(p).enter().append("rect").attr("x",((t,e)=>b(e-1))).attr("y",a).attr("width",((t,e)=>b(e)-b(e-1))).attr("height",c-a-r).attr("fill",(t=>t)),B=ah(t,((t,e)=>e)),d=n=>e(t[n],n)}else b=y(Lo().domain(G),[o,s-l]),U.append("g").attr("fill-opacity",F).selectAll().data(G).enter().append("rect").attr("x",b).attr("y",a).attr("width",Math.max(0,b.bandwidth()-1)).attr("height",c-a-r).attr("fill",A),C=()=>{};return U.append("g").attr("transform",`translate(0,${c-r})`).call(me(b).ticks(Array.isArray(B)?null:B,"string"==typeof d?d:void 0).tickFormat("function"==typeof d?d:void 0).tickSize(i).tickValues(Array.isArray(B)?B:null)).attr("font-size",null).attr("font-family",null).attr("font-variant",ab(Q,"normal")).call(C).call((t=>t.select(".domain").remove())),void 0!==n&&U.append("text").attr("x",o).attr("y",a-6).attr("fill","currentColor").attr("font-weight","bold").text(n),U.node()}(t,n);default:throw new Error(`unknown legend type: ${e}`)}}function eG(t){const{r:e,g:n,b:i}=mi(t)||mi(0,0,0);return t=>`rgba(${e},${n},${i},${t})`}const nG={ariaLabel:"frame",fill:"none",stroke:"currentColor",clip:!1},iG={ariaLabel:"frame",fill:null,stroke:"currentColor",strokeLinecap:"square",clip:!1};class sG extends ty{constructor(t={}){const{anchor:e=null,inset:n=0,insetTop:i=n,insetRight:s=n,insetBottom:c=n,insetLeft:a=n,rx:l,ry:r}=t;super(Du,void 0,t,null==e?nG:iG),this.anchor=ih(e,"anchor",["top","right","bottom","left"]),this.insetTop=Ku(i),this.insetRight=Ku(s),this.insetBottom=Ku(c),this.insetLeft=Ku(a),this.rx=Ku(l),this.ry=Ku(r)}render(t,e,n,i,s){const{marginTop:c,marginRight:a,marginBottom:l,marginLeft:r,width:o,height:g}=i,{anchor:B,insetTop:d,insetRight:Q,insetBottom:I,insetLeft:F,rx:u,ry:h}=this,U=r+F,b=o-a-Q,C=c+d,y=g-l-I;return Qb(B?"svg:line":"svg:rect",s).datum(0).call(eb,this,i,s).call(nb,this).call(jU,this,n).call(cb,this,{}).call("left"===B?t=>t.attr("x1",U).attr("x2",U).attr("y1",C).attr("y2",y):"right"===B?t=>t.attr("x1",b).attr("x2",b).attr("y1",C).attr("y2",y):"top"===B?t=>t.attr("x1",U).attr("x2",b).attr("y1",C).attr("y2",C):"bottom"===B?t=>t.attr("x1",U).attr("x2",b).attr("y1",y).attr("y2",y):t=>t.attr("x",U).attr("y",C).attr("width",b-U).attr("height",y-C).attr("rx",u).attr("ry",h)).node()}}const cG={ariaLabel:"tip",fill:"white",stroke:"currentColor"},aG=new Set(["geometry","href","src","ariaLabel","scales"]);class lG extends ty{constructor(t,e={}){e.tip&&(e={...e,tip:!1}),void 0===e.title&&Sh(t)&&Rh(t)&&(e={...e,title:Ju});const{x:n,y:i,x1:s,x2:c,y1:a,y2:l,anchor:r,monospace:o,fontFamily:g=(o?"ui-monospace, monospace":void 0),fontSize:B,fontStyle:d,fontVariant:Q,fontWeight:I,lineHeight:F=1,lineWidth:u=20,frameAnchor:h,format:U,textAnchor:b="start",textOverflow:C,textPadding:y=8,title:f,pointerSize:G=12,pathFilter:p="drop-shadow(0 3px 4px rgba(0,0,0,0.2))"}=e;super(t,{x:{value:null!=s&&null!=c?null:n,scale:"x",optional:!0},y:{value:null!=a&&null!=l?null:i,scale:"y",optional:!0},x1:{value:s,scale:"x",optional:null==c},y1:{value:a,scale:"y",optional:null==l},x2:{value:c,scale:"x",optional:null==s},y2:{value:l,scale:"y",optional:null==a},title:{value:f,optional:!0}},e,cG),this.anchor=Yh(r,"anchor"),this.previousAnchor=this.anchor??"top-left",this.frameAnchor=kh(h),this.textAnchor=ab(b,"middle"),this.textPadding=+y,this.pointerSize=+G,this.pathFilter=zu(p),this.lineHeight=+F,this.lineWidth=+u,this.textOverflow=Dy(C),this.monospace=!!o,this.fontFamily=zu(g),this.fontSize=Ku(B),this.fontStyle=zu(d),this.fontVariant=zu(Q),this.fontWeight=zu(I);for(const t in cG)t in this.channels&&(this[t]=cG[t]);this.splitLines=jy(this),this.clipLine=$y(this),this.format={...U}}render(t,e,n,i,s){const c=this,{x:a,y:l,fx:r,fy:o}=e,{ownerSVGElement:g,document:B}=s,{anchor:d,monospace:Q,lineHeight:I,lineWidth:F}=this,{textPadding:u,pointerSize:h,pathFilter:U}=this,{marginTop:b,marginLeft:C}=i,{x1:y,y1:f,x2:G,y2:p,x:m=y??G,y:A=f??p}=n,x=r?r(t.fx)-C:0,L=o?o(t.fy)-b:0,[S,R]=Bb(this,i),N=gy(n,S),X=By(n,R),v=Q?Py:_y,Z=v(qy);let E,V;"title"in n?(E=n.channels,V=BG):(E=oG.call(this,n,e),V=dG);const w=Qb("svg:g",s).call(eb,this,i,s).call(Ty,this).call(cb,this,{x:m&&a,y:A&&l}).call((i=>i.selectAll().data(t).enter().append("g").attr("transform",(t=>`translate(${Math.round(N(t))},${Math.round(X(t))})`)).call(nb,this).call((t=>t.append("path").attr("filter",U))).call((i=>i.append("text").each((function(i){const s=Mn(this);this.setAttribute("fill","currentColor"),this.setAttribute("fill-opacity",1),this.setAttribute("stroke","none");const a=V.call(c,i,t,E,e,n);if("string"==typeof a)for(const t of c.splitLines(a))W(s,{value:c.clipLine(t)});else{const t=new Set;for(const e of a){const{label:n=""}=e;n&&t.has(n)||(t.add(n),W(s,e))}}}))))));function W(t,{label:e,value:n,color:i,opacity:s}){e??="",n??="";const c=null!=i||null!=s;let a,l=100*F;const[r]=tf(e,l,v,Z);if(r>=0)e=e.slice(0,r).trimEnd()+qy,a=n.trim(),n="";else{(e||!n&&!c)&&(n=" "+n);const[t]=tf(n,l-v(e),v,Z);t>=0&&(a=(n=n.slice(0,t).trimEnd()+qy).trim())}const o=t.append("tspan").attr("x",0).attr("dy",`${I}em`).text("");e&&o.append("tspan").attr("font-weight","bold").text(e),n&&o.append((()=>B.createTextNode(n))),c&&o.append("tspan").text(" ■").attr("fill",i).attr("fill-opacity",s).style("user-select","none"),a&&o.append("title").text(a)}function H(){const{width:t,height:e}=i.facet??i;w.selectChildren().each((function(n){let{x:i,width:s,height:a}=this.getBBox();s=Math.round(s),a=Math.round(a);let l=d;if(void 0===l){l=c.previousAnchor;const i=N(n)+x,r=X(n)+L,o=i+s+2*u<t,g=i-s-2*u>0,B=r+a+h+2*u+7<e,d=r-a-h-2*u>0,Q=(/-left$/.test(l)?o||!g:o&&!g)?"left":"right",I=(/^top-/.test(l)?B||!d:B&&!d)?"top":"bottom";l=c.previousAnchor=`${I}-${Q}`}const r=this.firstChild,o=this.lastChild;if(r.setAttribute("d",function(t,e,n,i,s){const c=i+2*n,a=s+2*n;switch(t){case"middle":return`M${-c/2},${-a/2}h${c}v${a}h${-c}z`;case"top-left":return`M0,0l${e},${e}h${c-e}v${a}h${-c}z`;case"top":return`M0,0l${e/2},${e/2}h${(c-e)/2}v${a}h${-c}v${-a}h${(c-e)/2}z`;case"top-right":return`M0,0l${-e},${e}h${e-c}v${a}h${c}z`;case"right":return`M0,0l${-e/2},${-e/2}v${e/2-a/2}h${-c}v${a}h${c}v${e/2-a/2}z`;case"bottom-left":return`M0,0l${e},${-e}h${c-e}v${-a}h${-c}z`;case"bottom":return`M0,0l${e/2},${-e/2}h${(c-e)/2}v${-a}h${-c}v${a}h${(c-e)/2}z`;case"bottom-right":return`M0,0l${-e},${-e}h${e-c}v${-a}h${c}z`;case"left":return`M0,0l${e/2},${-e/2}v${e/2-a/2}h${c}v${a}h${-c}v${e/2-a/2}z`}}(l,h,u,s,a)),i)for(const t of o.childNodes)t.setAttribute("x",-i);o.setAttribute("y",+function(t,e,n){return/^top(?:-|$)/.test(t)?.94-n:-.29-e*n}(l,o.childNodes.length,I).toFixed(6)+"em"),o.setAttribute("transform",`translate(${function(t,e,n,i,s){switch(t){case"middle":return[-i/2,s/2];case"top-left":return[n,e+n];case"top":return[-i/2,e/2+n];case"top-right":return[-i-n,e+n];case"right":return[-e/2-i-n,s/2];case"bottom-left":return[n,-e-n];case"bottom":return[-i/2,-e/2-n];case"bottom-right":return[-i-n,-e-n];case"left":return[n+e/2,s/2]}}(l,h,u,s,a)})`)})),w.attr("visibility",null)}return t.length&&(w.attr("visibility","hidden"),g.isConnected?Promise.resolve().then(H):"undefined"!=typeof requestAnimationFrame&&requestAnimationFrame(H)),w.node()}}function rG(t,{x:e,y:n,...i}={}){return void 0===i.frameAnchor&&([e,n]=Qh(e,n)),new lG(t,{...i,x:e,y:n})}function oG({channels:t},e){const n={};let i=this.format;i=gG(i,t,"x"),i=gG(i,t,"y"),this.format=i;for(const e in i){const s=i[e];if(null!==s&&!1!==s)if("fx"===e||"fy"===e)n[e]=!0;else{const i=WU(t,e);i&&(n[e]=i)}}for(const e in t){if(e in n||e in i||aG.has(e))continue;const s=WU(t,e);s&&(n[e]=s)}this.facet&&(e.fx&&!("fx"in i)&&(n.fx=!0),e.fy&&!("fy"in i)&&(n.fy=!0));for(const t in n){const i=this.format[t];if("string"==typeof i){const s=n[t]?.value??e[t]?.domain()??[];this.format[t]=(Xh(s)?cB:da)(i)}else if(void 0===i||!0===i){const n=e[t];this.format[t]=n?.bandwidth?Df(n,n.domain()):YU}}return n}function gG(t,e,n){if(!(n in t))return t;const i=`${n}1`,s=`${n}2`;if(!(!(i in t)&&i in e||!(s in t)&&s in e))return t;const c=Object.entries(t),a=t[n];return c.splice(c.findIndex((([t])=>t===n))+1,0,[i,a],[s,a]),Object.fromEntries(c)}function BG(t,e,{title:n}){return YU(n.value[t],t)}function*dG(t,e,n,i,s){for(const c in n){if("fx"===c||"fy"===c){yield{label:FG(i,n,c),value:this.format[c](e[c],t)};continue}if("x1"===c&&"x2"in n)continue;if("y1"===c&&"y2"in n)continue;const a=n[c];if("x2"===c&&"x1"in n)yield{label:IG(i,n,"x"),value:QG(this.format.x2,n.x1,a,t)};else if("y2"===c&&"y1"in n)yield{label:IG(i,n,"y"),value:QG(this.format.y2,n.y1,a,t)};else{const e=a.value[t],l=a.scale;if(!nu(e)&&null==l)continue;yield{label:FG(i,n,c),value:this.format[c](e,t),color:"color"===l?s[c][t]:null,opacity:"opacity"===l?s[c][t]:null}}}}function QG(t,e,n,i){return n.hint?.length?`${t(n.value[i]-e.value[i],i)}`:`${t(e.value[i],i)}–${t(n.value[i],i)}`}function IG(t,e,n){const i=FG(t,e,`${n}1`,n),s=FG(t,e,`${n}2`,n);return i===s?i:`${i}–${s}`}function FG(t,e,n,i=n){const s=e[n],c=t[s?.scale??n];return String(c?.label??s?.label??i)}function uG(t={}){const{facet:e,style:n,title:i,subtitle:s,caption:c,ariaLabel:a,ariaDescription:l}=t,r=ob(t.className),o=void 0===t.marks?[]:UG(t.marks);o.push(...function(t){const e=[];for(const n of t){let t=n.tip;if(t){!0===t?t={}:"string"==typeof t&&(t={pointer:t});let{pointer:i}=t;i=/^x$/i.test(i)?ry:/^y$/i.test(i)?oy:ly,t=i(xG(n,t)),t.title=null;const s=rG(n.data,t);s.facet=n.facet,s.facetAnchor=n.facetAnchor,e.push(s)}}return e}(o));const g=function(t,e){if(null==t)return;const{x:n,y:i}=t;if(null==n&&null==i)return;const s=ch(t.data);if(null==s)throw new Error("missing facet data");const c={};null!=n&&(c.fx=SU(s,{value:n,scale:"fx"}));null!=i&&(c.fy=SU(s,{value:i,scale:"fy"}));yG(c,e);const a=YC(s,c);return{channels:c,groups:a,data:t.data}}(e,t),B=new Map;for(const e of o){const n=AG(e,g,t);n&&B.set(e,n)}const d=new Map;g&&pG(d,[g],t),pG(d,B,t);const Q=UG(function(t,e,n){let{projection:i,x:s={},y:c={},fx:a={},fy:l={},axis:r,grid:o,facet:g={},facet:{axis:B=r,grid:d}=g,x:{axis:Q=r,grid:I=(null===Q?null:o)}=s,y:{axis:F=r,grid:u=(null===F?null:o)}=c,fx:{axis:h=B,grid:U=(null===h?null:d)}=a,fy:{axis:b=B,grid:C=(null===b?null:d)}=l}=n;(i||!gh(s)&&!XG("x",t))&&(Q=I=null);(i||!gh(c)&&!XG("y",t))&&(F=u=null);e.has("fx")||(h=U=null);e.has("fy")||(b=C=null);void 0===Q&&(Q=!NG(t,"x"));void 0===F&&(F=!NG(t,"y"));void 0===h&&(h=!NG(t,"fx"));void 0===b&&(b=!NG(t,"fy"));!0===Q&&(Q="bottom");!0===F&&(F="left");!0===h&&(h="top"===Q||null===Q?"bottom":"top");!0===b&&(b="right"===F||null===F?"left":"right");const y=[];return SG(y,C,Nf,l),LG(y,b,mf,"right","left",g,l),SG(y,U,vf,a),LG(y,h,xf,"top","bottom",g,a),SG(y,u,Rf,c),LG(y,F,pf,"left","right",n,c),SG(y,I,Xf,s),LG(y,Q,Af,"bottom","top",n,s),y}(o,d,t));for(const e of Q){const n=AG(e,g,t);n&&B.set(e,n)}o.unshift(...Q);let I=DC(d,t);if(void 0!==I){const t=g?qC(I,g):void 0;for(const e of o){if(null===e.facet||"super"===e.facet)continue;const n=B.get(e);void 0!==n&&(n.facetsIndex=null!=e.fx||null!=e.fy?qC(I,n):t)}const e=new Set;for(const{facetsIndex:t}of B.values())t?.forEach(((t,n)=>{t?.length>0&&e.add(n)}));I.forEach(0<e.size&&e.size<I.length?(t,n)=>t.empty=!e.has(n):t=>t.empty=!1);for(const t of o)if("exclude"===t.facet){const e=B.get(t);void 0!==e&&(e.facetsIndex=kC(e.facetsIndex))}}for(const e of $h.keys())gh(t[e])&&"fx"!==e&&"fy"!==e&&d.set(e,[]);const F=new Map;for(const e of o){if(F.has(e))throw new Error("duplicate mark; each mark must be unique");const{facetsIndex:n,channels:i}=B.get(e)??{},{data:s,facets:c,channels:a}=e.initialize(n,i,t);yG(a,t),F.set(e,{data:s,facets:c,channels:a})}const u=bC(pG(d,F,t),t),h=function(t,e,n={}){let i=.5-TU,s=.5+TU,c=.5+TU,a=.5-TU;for(const{marginTop:t,marginRight:n,marginBottom:l,marginLeft:r}of e)t>i&&(i=t),n>s&&(s=n),l>c&&(c=l),r>a&&(a=r);let{margin:l,marginTop:r=(void 0!==l?l:i),marginRight:o=(void 0!==l?l:s),marginBottom:g=(void 0!==l?l:c),marginLeft:B=(void 0!==l?l:a)}=n;r=+r,o=+o,g=+g,B=+B;let{width:d=640,height:Q=WC(t,n,{width:d,marginTopDefault:i,marginRightDefault:s,marginBottomDefault:c,marginLeftDefault:a})+Math.max(0,r-i+g-c)}=n;d=+d,Q=+Q;const I={width:d,height:Q,marginTop:r,marginRight:o,marginBottom:g,marginLeft:B};if(t.fx||t.fy){let{margin:t,marginTop:e=(void 0!==t?t:r),marginRight:i=(void 0!==t?t:o),marginBottom:s=(void 0!==t?t:g),marginLeft:c=(void 0!==t?t:B)}=n.facet??{};e=+e,i=+i,s=+s,c=+c,I.facet={marginTop:e,marginRight:i,marginBottom:s,marginLeft:c}}return I}(u,o,t);!function(t,e){const{x:n,y:i,fx:s,fy:c}=t,a=s||c?fC(e):e;s&&pC(s,a),c&&mC(c,a);const l=s||c?GC(t,e):e;n&&pC(n,l),i&&mC(i,l)}(u,h);const U=CC(u),{fx:b,fy:C}=U,y=b||C?GC(u,h):h,f=b||C?function({fx:t,fy:e},n){const{marginTop:i,marginRight:s,marginBottom:c,marginLeft:a,width:l,height:r}=fC(n),o=t&&vG(t),g=e&&vG(e);return{marginTop:e?g[0]:i,marginRight:t?l-o[1]:s,marginBottom:e?r-g[1]:c,marginLeft:t?o[0]:a,inset:{marginTop:n.marginTop,marginRight:n.marginRight,marginBottom:n.marginBottom,marginLeft:n.marginLeft},width:l,height:r}}(U,h):h,G=db(t),p=G.document,m=Ve("svg").call(p.documentElement);let A=m;G.ownerSVGElement=m,G.className=r,G.projection=hb(t,y),G.filterFacets=(t,e)=>qC(I,{channels:e,groups:YC(t,e)}),G.getMarkState=t=>{const e=F.get(t),n=B.get(t);return{...e,channels:{...e.channels,...n?.channels}}},G.dispatchValue=t=>{A.value!==t&&(A.value=t,A.dispatchEvent(new Event("input",{bubbles:!0})))};const x=new Set;for(const[e,n]of F)if(null!=e.initializer){const i="super"===e.facet?f:y,s=e.initializer(n.data,n.facets,n.channels,U,i,G);if(void 0!==s.data&&(n.data=s.data),void 0!==s.facets&&(n.facets=s.facets),void 0!==s.channels){const{fx:i,fy:c,...a}=s.channels;GG(a),Object.assign(n.channels,a);for(const e of Object.values(a)){const{scale:n}=e;null!=n&&((L=$h.get(n))!==Th&&L!==jh)&&(fG(e,t),x.add(n))}null==i&&null==c||B.set(e,!0)}}var L;if(x.size){const e=new Map;pG(e,F,t,(t=>x.has(t))),pG(d,F,t,(t=>x.has(t)));const n=function(t,e){for(const n in t){const i=t[n],s=e[n];void 0===i.label&&s&&(i.label=s.label)}return t}(bC(e,t),u),{scales:i,...s}=CC(n);Object.assign(u,n),Object.assign(U,s),Object.assign(U.scales,i)}let S,R;void 0!==I&&(S={x:b?.domain(),y:C?.domain()},I=function(t,{x:e,y:n}){return e&&=TC(e),n&&=TC(n),t.filter(e&&n?t=>e.has(t.x)&&n.has(t.y):e?t=>e.has(t.x):t=>n.has(t.y)).sort(e&&n?(t,i)=>e.get(t.x)-e.get(i.x)||n.get(t.y)-n.get(i.y):e?(t,n)=>e.get(t.x)-e.get(n.x):(t,e)=>n.get(t.y)-n.get(e.y))}(I,S),R=function(t,e,{marginTop:n,marginLeft:i}){return t&&e?({x:s,y:c})=>`translate(${t(s)-i},${e(c)-n})`:t?({x:e})=>`translate(${t(e)-i},0)`:({y:t})=>`translate(0,${e(t)-n})`}(b,C,h));for(const[t,e]of F)e.values=t.scale(e.channels,U,G);const{width:N,height:X}=h;Mn(m).attr("class",r).attr("fill","currentColor").attr("font-family","system-ui, sans-serif").attr("font-size",10).attr("text-anchor","middle").attr("width",N).attr("height",X).attr("viewBox",`0 0 ${N} ${X}`).attr("aria-label",a).attr("aria-description",l).call((t=>t.append("style").text(`.${r} {\n display: block;\n background: white;\n height: auto;\n height: intrinsic;\n max-width: 100%;\n}\n.${r} text,\n.${r} tspan {\n white-space: pre;\n}`))).call(gb,n);for(const t of o){const{channels:e,values:n,facets:i}=F.get(t);if(void 0===I||"super"===t.facet){let s=null;if(i&&(s=i[0],s=t.filter(s,e,n),0===s.length))continue;const c=t.render(s,U,n,f,G);if(null==c)continue;m.appendChild(c)}else{let s;for(const c of I){if(!(t.facetAnchor?.(I,S,c)??!c.empty))continue;let a=null;if(i){const s=B.has(t);if(a=i[s?c.i:0],a=t.filter(a,e,n),0===a.length)continue;s||a!==i[0]||(a=hh(a)),a.fx=c.x,a.fy=c.y,a.fi=c.i}const l=t.render(a,U,n,y,G);if(null!=l){(s??=Mn(m).append("g")).append((()=>l)).datum(c);for(const t of["aria-label","aria-description","aria-hidden","transform"])l.hasAttribute(t)&&(s.attr(t,l.getAttribute(t)),l.removeAttribute(t))}}s?.selectChildren().attr("transform",R)}}const v=function(t,e,n){const i=[];for(const[s,c]of $f){const a=n[s];if(a?.legend&&s in t){const n=c(t[s],qf(e,t[s],a),(e=>t[e]));null!=n&&i.push(n)}}return i}(u,G,t),{figure:Z=null!=i||null!=s||null!=c||v.length>0}=t;Z&&(A=p.createElement("figure"),A.className=`${r}-figure`,A.style.maxWidth="initial",null!=i&&A.append(hG(p,i,"h2")),null!=s&&A.append(hG(p,s,"h3")),A.append(...v,m),null!=c&&A.append(function(t,e){const n=t.createElement("figcaption");return n.append(e),n}(p,c))),A.scale=function(t){return e=>{if(!$h.has(e=`${e}`))throw new Error(`unknown scale: ${e}`);return t[e]}}(U.scales),A.legend=function(t,e,n={}){return(i,s)=>{if(!$f.has(i))throw new Error(`unknown legend type: ${i}`);if(i in t)return $f.get(i)(t[i],qf(e,n[i],s),(e=>t[e]))}}(u,G,t);const E=function(){const t=JU;return JU=0,kU=void 0,t}();return E>0&&Mn(m).append("text").attr("x",N).attr("y",20).attr("dy","-1em").attr("text-anchor","end").attr("font-family","initial").text("⚠️").append("title").text(`${E.toLocaleString("en-US")} warning${1===E?"":"s"}. Please check the console.`),A}function hG(t,e,n){if(e.ownerDocument)return e;const i=t.createElement(n);return i.append(e),i}function UG(t){return t.flat(1/0).filter((t=>null!=t)).map(bG)}function bG(t){return"function"==typeof t.render?t:new CG(t)}ty.prototype.plot=function({marks:t=[],...e}={}){return uG({...e,marks:[...t,this]})};class CG extends ty{constructor(t){if("function"!=typeof t)throw new TypeError("invalid mark; missing render function");super(),this.render=t}render(){}}function yG(t,e){for(const n in t)fG(t[n],e);return t}function fG(t,e){const{scale:n,transform:i=!0}=t;if(null==n||!i)return;const{type:s,percent:c,interval:a,transform:l=(c?t=>100*t:ph(a,s))}=e[n]??{};null!=l&&(t.value=ah(t.value,l),t.transform=!1)}function GG(t){for(const e in t)RU(e,t[e])}function pG(t,e,n,i=Tu){for(const{channels:s}of e.values())for(const e in s){const c=s[e],{scale:a}=c;if(null!=a&&i(a))if("projection"===a){if(!pb(n)){const e=void 0===n.x?.domain,i=void 0===n.y?.domain;if(e||i){const[n,s]=mb(c);e&&mG(t,"x",n),i&&mG(t,"y",s)}}}else mG(t,a,c)}return t}function mG(t,e,n){const i=t.get(e);void 0!==i?i.push(n):t.set(e,[n])}function AG(t,e,n){if(null===t.facet||"super"===t.facet)return;const{fx:i,fy:s}=t;if(null!=i||null!=s){const e=ch(t.data??i??s);if(void 0===e)throw new Error(`missing facet data in ${t.ariaLabel}`);if(null===e)return;const c={};return null!=i&&(c.fx=SU(e,{value:i,scale:"fx"})),null!=s&&(c.fy=SU(e,{value:s,scale:"fy"})),yG(c,n),{channels:c,groups:YC(e,c)}}if(void 0===e)return;const{channels:c,groups:a,data:l}=e;if("auto"!==t.facet||t.data===l)return{channels:c,groups:a};l.length>0&&(a.size>1||1===a.size&&c.fx&&c.fy&&[...a][0][1].size>1)&&ch(t.data)?.length===l.length&&MU(`Warning: the ${t.ariaLabel} mark appears to use faceted data, but isn’t faceted. The mark data has the same length as the facet data and the mark facet option is "auto", but the mark data and facet data are distinct. If this mark should be faceted, set the mark facet option to true; otherwise, suppress this warning by setting the mark facet option to false.`)}function xG(t,e={}){return cU({...e,x:null,y:null},((e,n,i,s,c,a)=>a.getMarkState(t)))}function LG(t,e,n,i,s,c,a){if(!e)return;const l=/^\s*both\s*$/i.test(e);a=function(t,e,{line:n=e.line,ticks:i,tickSize:s,tickSpacing:c,tickPadding:a,tickFormat:l,tickRotate:r,fontVariant:o,ariaLabel:g,ariaDescription:B,label:d=e.label,labelAnchor:Q,labelArrow:I=e.labelArrow,labelOffset:F}){return{anchor:t,line:n,ticks:i,tickSize:s,tickSpacing:c,tickPadding:a,tickFormat:l,tickRotate:r,fontVariant:o,ariaLabel:g,ariaDescription:B,label:d,labelAnchor:Q,labelArrow:I,labelOffset:F}}(l?i:e,c,a);const{line:r}=a;n!==pf&&n!==Af||!r||Dh(r)||t.push(function(t){return new sG(t)}(function(t){const{anchor:e,line:n}=t;return{anchor:e,facetAnchor:e+"-empty",stroke:!0===n?void 0:n}}(a))),t.push(n(a)),l&&t.push(n({...a,anchor:s,label:null}))}function SG(t,e,n,i){e&&!Dh(e)&&t.push(n(function(t,{stroke:e=(wh(t)?t:void 0),ticks:n=(RG(t)?t:void 0),tickSpacing:i,ariaLabel:s,ariaDescription:c}){return{stroke:e,ticks:n,tickSpacing:i,ariaLabel:s,ariaDescription:c}}(e,i)))}function RG(t){switch(typeof t){case"number":return!0;case"string":return!wh(t)}return Sh(t)||"function"==typeof t?.range}function NG(t,e){const n=`${e}-axis `;return t.some((t=>t.ariaLabel?.startsWith(n)))}function XG(t,e){for(const n of e)for(const e in n.channels){const{scale:i}=n.channels[e];if(i===t||"projection"===i)return!0}return!1}function vG(t){const e=t.domain();let n=t(e[0]),i=t(e[e.length-1]);return i<n&&([n,i]=[i,n]),[n,i+t.bandwidth()]}const ZG=new Map([["basis",function(t){return new OI(t)}],["basis-closed",function(t){return new _I(t)}],["basis-open",function(t){return new PI(t)}],["bundle",$I],["bump-x",function(t){return new UI(t,!0)}],["bump-y",function(t){return new UI(t,!1)}],["cardinal",eF],["cardinal-closed",iF],["cardinal-open",cF],["catmull-rom",rF],["catmull-rom-closed",gF],["catmull-rom-open",dF],["linear",II],["linear-closed",function(t){return new QF(t)}],["monotone-x",function(t){return new UF(t)}],["monotone-y",function(t){return new bF(t)}],["natural",function(t){return new yF(t)}],["step",function(t){return new GF(t,.5)}],["step-after",function(t){return new GF(t,1)}],["step-before",function(t){return new GF(t,0)}]]);function EG(t=VG,e){return"function"!=typeof t&&"auto"===`${t}`.toLowerCase()?VG:function(t=II,e){if("function"==typeof t)return t;const n=ZG.get(`${t}`.toLowerCase());if(!n)throw new Error(`unknown curve: ${t}`);if(void 0!==e){if("beta"in n)return n.beta(e);if("tension"in n)return n.tension(e);if("alpha"in n)return n.alpha(e)}return n}(t,e)}function VG(t){return II(t)}function wG(t={y:"count"},e={}){[t,e]=function({cumulative:t,domain:e,thresholds:n,interval:i,...s},c){return[s,{cumulative:t,domain:e,thresholds:n,interval:i,...c}]}(t,e);const{x:n,y:i}=e;return function(t,e,n,i,{data:s=yU,filter:c=mU,sort:a,reverse:l,...r}={},o={}){t=HG(t),e=HG(e),r=function(t,e){return function(t,e,n=IU){const i=Object.entries(t);return null!=e.title&&void 0===t.title&&i.push(["title",GU]),null!=e.href&&void 0===t.href&&i.push(["href",fU]),i.filter((([,t])=>void 0!==t)).map((([t,i])=>null===i?function(t){return{name:t,initialize(){},scope(){},reduce(){}}}(t):n(t,i,e)))}(t,e,DG)}(r,o),s=kG(s,Ju),a=null==a?void 0:DG("sort",a,o),c=null==c?void 0:YG("filter",c,o),null!=n&&QU(r,"x","x1","x2")&&(n=null);null!=i&&QU(r,"y","y1","y2")&&(i=null);const[g,B]=Ch(t),[d,Q]=Ch(t),[I,F]=Ch(e),[u,h]=Ch(e),[U,b]=null!=n?[n,"x"]:null!=i?[i,"y"]:[],[C,y]=Ch(U),{x:f,y:G,z:p,fill:m,stroke:A,x1:x,x2:L,y1:S,y2:R,domain:N,cumulative:X,thresholds:v,interval:Z,...E}=o,[V,w]=Ch(p),[W]=eh(m),[H]=eh(A),[D,Y]=Ch(W),[k,J]=Ch(H);return{..."z"in o&&{z:V||p},..."fill"in o&&{fill:D||m},..."stroke"in o&&{stroke:k||A},...sU(E,((n,i,o)=>{const g=Gh(wu(n,U),o?.[b]),d=wu(n,p),I=wu(n,W),u=wu(n,H),C=function(t,e){for(const n in e){const i=e[n];if(void 0!==i&&!t.some((t=>t.name===n)))return i}}(r,{z:d,fill:I,stroke:u}),f=[],G=[],m=g&&y([]),A=d&&w([]),x=I&&Y([]),L=u&&J([]),S=t&&B([]),R=t&&Q([]),N=e&&F([]),X=e&&h([]),v=(Z=t?.(n),E=e?.(n),Z&&E?function*(t){const e=Z.bin(t);for(const[t,[n,i]]of Z.entries()){const s=E.bin(e[t]);for(const[t,[e,c]]of E.entries())yield[s[t],{x1:n,y1:e,x2:i,y2:c}]}}:Z?function*(t){const e=Z.bin(t);for(const[t,[n,i]]of Z.entries())yield[e[t],{x1:n,x2:i}]}:function*(t){const e=E.bin(t);for(const[t,[n,i]]of E.entries())yield[e[t],{y1:n,y2:i}]});var Z,E;let V=0;for(const t of r)t.initialize(n);a&&a.initialize(n),c&&c.initialize(n);for(const t of i){const e=[];for(const e of r)e.scope("facet",t);a&&a.scope("facet",t),c&&c.scope("facet",t);for(const[i,l]of uU(t,C))for(const[t,o]of uU(l,g))for(const[l,B]of v(o))if(!c||c.reduce(l,B)){e.push(V++),G.push(s.reduceIndex(l,n,B)),g&&m.push(t),d&&A.push(C===d?i:d[(l.length>0?l:o)[0]]),I&&x.push(C===I?i:I[(l.length>0?l:o)[0]]),u&&L.push(C===u?i:u[(l.length>0?l:o)[0]]),S&&(S.push(B.x1),R.push(B.x2)),N&&(N.push(B.y1),X.push(B.y2));for(const t of r)t.reduce(l,B);a&&a.reduce(l)}f.push(e)}return function(t,e,n){if(e){const n=e.output.transform(),i=(t,e)=>iu(n[t],n[e]);t.forEach((t=>t.sort(i)))}n&&t.forEach((t=>t.reverse()))}(f,a,l),{data:G,facets:f}})),...!QU(r,"x")&&(g?{x1:g,x2:d,x:fh(g,d)}:{x:f,x1:x,x2:L}),...!QU(r,"y")&&(I?{y1:I,y2:u,y:fh(I,u)}:{y:G,y1:S,y2:R}),...C&&{[b]:C},...Object.fromEntries(r.map((({name:t,output:e})=>[t,e])))}}(function(t,{cumulative:e,domain:n,thresholds:i,interval:s},c){void 0===(t={...Lh(t)}).domain&&(t.domain=n);void 0===t.cumulative&&(t.cumulative=e);void 0===t.thresholds&&(t.thresholds=i);void 0===t.interval&&(t.interval=s);void 0===t.value&&(t.value=c);return t.thresholds=function(t,e,n=MG){if(void 0===t)return void 0===e?n:Ah(e);if("string"==typeof t){switch(t.toLowerCase()){case"freedman-diaconis":return ie;case"scott":return se;case"sturges":return Kt;case"auto":return MG}return Su(t)}return t}(t.thresholds,t.interval),t}(n,e,Ju),null,null,i,t,py(e))}function WG(t={}){return function(t,e,n={}){if(null==n?.interval)return n;const{reduce:i=fU}=n,s={filter:null};return null!=n[e]&&(s[e]=i),null!=n[`${e}1`]&&(s[`${e}1`]=i),null!=n[`${e}2`]&&(s[`${e}2`]=i),t(s,n)}(wG,"y",sy(t,"x"))}function HG(t){if(null==t)return;const{value:e,cumulative:n,domain:i=Gt,thresholds:s}=t,c=t=>{let c,a=wu(t,e);if(Xh(a)||function(t){return function(t){return xh(t)&&"function"==typeof t?.floor&&t.floor()instanceof Date}(t)||Sh(t)&&Xh(t)}(s)){a=ah(a,th,Float64Array);let[t,e]="function"==typeof i?i(a):i,n="function"!=typeof s||xh(s)?s:s(a,t,e);"number"==typeof n&&(n=jg(t,e,n)),xh(n)&&(i===Gt&&(t=n.floor(t),e=n.offset(n.floor(e))),n=n.range(t,n.offset(e))),c=n}else{a=ju(a);let[t,e]="function"==typeof i?i(a):i,n="function"!=typeof s||xh(s)?s:s(a,t,e);if("number"==typeof n)if(i===Gt){let i=Tt(t,e,n);if(isFinite(i))if(i>0){let s=Math.round(t/i),c=Math.round(e/i);s*i<=t||--s,c*i>e||++c;let a=c-s+1;n=new Float64Array(a);for(let t=0;t<a;++t)n[t]=(s+t)*i}else if(i<0){i=-i;let s=Math.round(t*i),c=Math.round(e*i);s/i<=t||--s,c/i>e||++c;let a=c-s+1;n=new Float64Array(a);for(let t=0;t<a;++t)n[t]=(s+t)/i}else n=[t];else n=[t]}else n=Mt(t,e,n);else xh(n)&&(i===Gt&&(t=n.floor(t),e=n.offset(n.floor(e))),n=n.range(t,n.offset(e)));c=n}const l=[];if(1===c.length)l.push([c[0],c[0]]);else for(let t=1;t<c.length;++t)l.push([c[t-1],c[t]]);return l.bin=(n<0?KG:n>0?zG:TG)(l,c,a),l};return c.label=yh(e),c}function DG(t,e,n){return IU(t,e,n,YG)}function YG(t,e,n){return FU(t,e,n,kG)}function kG(t,e){return hU(t,e,JG)}function JG(t){switch(`${t}`.toLowerCase()){case"x":return _G;case"x1":return jG;case"x2":return $G;case"y":return PG;case"y1":return qG;case"y2":return tp}throw new Error(`invalid bin reduce: ${t}`)}function MG(t,e,n){return Math.min(200,se(t,e,n))}function TG(t,e,n){return e=ju(e),i=>{const s=t.map((()=>[]));for(const t of i)s[Ft(e,n[t])-1]?.push(t);return s}}function zG(t,e,n){const i=TG(t,e,n);return t=>{const e=i(t);for(let t=1,n=e.length;t<n;++t){const n=e[t-1],i=e[t];for(const t of n)i.push(t)}return e}}function KG(t,e,n){const i=TG(t,e,n);return t=>{const e=i(t);for(let t=e.length-2;t>=0;--t){const n=e[t+1],i=e[t];for(const t of n)i.push(t)}return e}}function OG(t,e){const n=(+t+ +e)/2;return t instanceof Date?new Date(n):n}const _G={reduceIndex:(t,e,{x1:n,x2:i})=>OG(n,i)},PG={reduceIndex:(t,e,{y1:n,y2:i})=>OG(n,i)},jG={reduceIndex:(t,e,{x1:n})=>n},$G={reduceIndex:(t,e,{x2:n})=>n},qG={reduceIndex:(t,e,{y1:n})=>n},tp={reduceIndex:(t,e,{y2:n})=>n};function ep(t={},e={}){1===arguments.length&&([t,e]=function(t){const{offset:e,order:n,reverse:i,...s}=t;return[{offset:e,order:n,reverse:i},s]}(t));const{x1:n,x:i=n,y:s,...c}=e,[a,l,r,o]=function(t,e=Mu,n,i,{offset:s,order:c,reverse:a},l){if(null===e)throw new Error(`stack requires ${i}`);const r=Ih(l),[o,g]=Ch(t),[B,d]=bh(e),[Q,I]=bh(e);return B.hint=Q.hint=ip,s=function(t){if(null==t)return;if("function"==typeof t)return t;switch(`${t}`.toLowerCase()){case"expand":case"normalize":return cp;case"center":case"silhouette":return ap;case"wiggle":return lp}throw new Error(`unknown offset: ${t}`)}(s),c=function(t,e,n){if(void 0===t&&e===lp)return gp(iu);if(null==t)return;if("string"==typeof t){const e=t.startsWith("-"),i=e?su:iu;switch((e?t.slice(1):t).toLowerCase()){case"value":case n:return function(t){return(e,n,i)=>(e,n)=>t(i[e],i[n])}(i);case"z":return function(t){return(e,n,i,s)=>(e,n)=>t(s[e],s[n])}(i);case"sum":return function(t){return Qp(t,((t,e,n,i)=>Ht(Fh(t),(t=>Be(t,(t=>n[t]))),(t=>i[t]))))}(i);case"appearance":return function(t){return Qp(t,((t,e,n,i)=>Ht(Fh(t),(t=>e[te(t,(t=>n[t]))]),(t=>i[t]))))}(i);case"inside-out":return gp(i)}return Bp(Yu(t))}if("function"==typeof t)return(1===t.length?Bp:dp)(t);if(Array.isArray(t))return i=t,Qp(iu,(()=>i));var i;throw new Error(`invalid order: ${t}`)}(c,s,i),[sU(l,((i,l,o)=>{({data:i,facets:l}=function(t,e){if(1===e.length)return{data:t,facets:e};const n=t.length,i=new Uint8Array(n);let s=0;for(const t of e)for(const e of t)i[e]&&++s,i[e]=1;if(0===s)return{data:t,facets:e};const c=(t=lh(t))[Vu]=new Uint32Array(n+s);e=e.map((t=>lh(t,Uint32Array)));let a=n;i.fill(0);for(const n of e)for(let e=0,s=n.length;e<s;++e){const s=n[e];i[s]?(n[e]=a,t[a]=t[s],c[a]=s,++a):c[s]=s,i[s]=1}return{data:t,facets:e}}(i,l));const B=null==t?void 0:g(Gh(wu(i,t),o?.[n])),Q=wu(i,e,Float64Array),F=wu(i,r),u=c&&c(i,B,Q,F),h=i.length,U=d(new Float64Array(h)),b=I(new Float64Array(h)),C=[];for(const t of l){const e=B?Array.from(Xt(t,(t=>B[t])).values()):[t];if(u)for(const t of e)t.sort(u);for(const t of e){let e=0,n=0;a&&t.reverse();for(const i of t){const t=Q[i];t<0?e=b[i]=(U[i]=e)+t:t>0?n=b[i]=(U[i]=n)+t:b[i]=U[i]=n}}C.push(e)}return s&&s(C,U,b,F),{data:i,facets:l}})),o,B,Q]}(i,s,"x","y",t,c);return{...a,x1:n,x:l,y1:r,y2:o,y:fh(r,o)}}function np({y:t,y1:e,y2:n,...i}={}){return i=sy(i,"x"),void 0===e&&void 0===n?ep({y:t,...i}):([e,n]=function(t,e,n,i=Ju){return void 0===e&&void 0===n?(e=0,n=void 0===t?i:t):void 0===e?e=void 0===t?0:t:void 0===n&&(n=void 0===t?0:t),[e,n]}(t,e,n),{...i,y1:e,y2:n})}const ip={length:!0};function sp(t,e){let n=0,i=0;for(const s of t){const t=e[s];t<n&&(n=t),t>i&&(i=t)}return[n,i]}function cp(t,e,n){for(const i of t)for(const t of i){const[i,s]=sp(t,n);for(const c of t){const t=1/(s-i||1);e[c]=t*(e[c]-i),n[c]=t*(n[c]-i)}}}function ap(t,e,n){for(const i of t){for(const t of i){const[i,s]=sp(t,n);for(const c of t){const t=(s+i)/2;e[c]-=t,n[c]-=t}}rp(i,e,n)}op(t,e,n)}function lp(t,e,n,i){for(const s of t){const t=new mt;let c=0;for(const a of s){let s=-1;const l=a.map((t=>Math.abs(n[t]-e[t]))),r=a.map((c=>{s=i?i[c]:++s;const a=n[c]-e[c],l=t.has(s)?a-t.get(s):0;return t.set(s,a),l})),o=[0,...Ct(r)];for(const t of a)e[t]+=c,n[t]+=c;const g=Be(l);g&&(c-=Be(l,((t,e)=>(r[e]/2+o[e])*t))/g)}rp(s,e,n)}op(t,e,n)}function rp(t,e,n){const i=Pt(t,(t=>Pt(t,(t=>e[t]))));for(const s of t)for(const t of s)e[t]-=i,n[t]-=i}function op(t,e,n){const i=t.length;if(1===i)return;const s=t.map((t=>t.flat())),c=s.map((t=>(Pt(t,(t=>e[t]))+Ot(t,(t=>n[t])))/2)),a=Pt(c);for(let t=0;t<i;t++){const i=a-c[t];for(const c of s[t])e[c]+=i,n[c]+=i}}function gp(t){return Qp(t,((t,e,n,i)=>{const s=Fh(t),c=Ht(s,(t=>e[te(t,(t=>n[t]))]),(t=>i[t])),a=vt(s,(t=>Be(t,(t=>n[t]))),(t=>i[t])),l=[],r=[];let o=0;for(const t of c)o<0?(o+=a.get(t),l.push(t)):(o-=a.get(t),r.push(t));return r.reverse().concat(l)}))}function Bp(t){return e=>{const n=wu(e,t);return(t,e)=>iu(n[t],n[e])}}function dp(t){return e=>(n,i)=>t(e[n],e[i])}function Qp(t,e){return(n,i,s,c)=>{if(!c)throw new Error("missing channel: z");const a=new mt(e(n,i,s,c).map(((t,e)=>[t,e])));return(e,n)=>t(a.get(c[e]),a.get(c[n]))}}const Ip={ariaLabel:"line",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",strokeMiterlimit:1};class Fp extends ty{constructor(t,e={}){const{x:n,y:i,z:s,curve:c,tension:a}=e;super(t,{x:{value:n,scale:"x"},y:{value:i,scale:"y"},z:{value:Ih(e),optional:!0}},e,Ip),this.z=s,this.curve=EG(c,a),Iy(this,e)}filter(t){return t}project(t,e,n){this.curve!==VG&&super.project(t,e,n)}render(t,e,n,i,s){const{x:c,y:a}=n,{curve:l}=this;return Qb("svg:g",s).call(eb,this,i,s).call(cb,this,e).call((e=>e.selectAll().data(qU(t,[c,a],this,n)).enter().append("path").call(nb,this).call($U,this,n).call(fy,this,n,s).attr("d",l===VG&&s.projection?function(t,e,n){const i=mr(t);return e=ju(e),n=ju(n),t=>{let s=[];const c=[s];for(const i of t)-1===i?(s=[],c.push(s)):s.push([e[i],n[i]]);return i({type:"MultiLineString",coordinates:c})}}(s.projection,c,a):hI().curve(l).defined((t=>t>=0)).x((t=>c[t])).y((t=>a[t]))))).node()}}function up(t,{x:e=ku,y:n=Ju,...i}={}){return new Fp(t,WG({...i,x:e,y:n}))}const hp={ariaLabel:"rect"};class Up extends ty{constructor(t,e={}){const{x1:n,y1:i,x2:s,y2:c,inset:a=0,insetTop:l=a,insetRight:r=a,insetBottom:o=a,insetLeft:g=a,rx:B,ry:d}=e;super(t,{x1:{value:n,scale:"x",optional:!0},y1:{value:i,scale:"y",optional:!0},x2:{value:s,scale:"x",optional:!0},y2:{value:c,scale:"y",optional:!0}},e,hp),this.insetTop=Ku(l),this.insetRight=Ku(r),this.insetBottom=Ku(o),this.insetLeft=Ku(g),this.rx=ab(B,"auto"),this.ry=ab(d,"auto")}render(t,e,n,i,s){const{x:c,y:a}=e,{x1:l,y1:r,x2:o,y2:g}=n,{marginTop:B,marginRight:d,marginBottom:Q,marginLeft:I,width:F,height:u}=i,{projection:h}=s,{insetTop:U,insetRight:b,insetBottom:C,insetLeft:y,rx:f,ry:G}=this;return Qb("svg:g",s).call(eb,this,i,s).call(cb,this,{x:l&&o&&c,y:r&&g&&a},0,0).call((e=>e.selectAll().data(t).enter().append("rect").call(nb,this).attr("x",l&&o&&(h||!ZC(c))?t=>Math.min(l[t],o[t])+y:I+y).attr("y",r&&g&&(h||!ZC(a))?t=>Math.min(r[t],g[t])+U:B+U).attr("width",l&&o&&(h||!ZC(c))?t=>Math.max(0,Math.abs(o[t]-l[t])-y-b):F-d-I-b-y).attr("height",r&&g&&(h||!ZC(a))?t=>Math.max(0,Math.abs(r[t]-g[t])-U-C):u-B-Q-U-C).call(sb,"rx",f).call(sb,"ry",G).call(jU,this,n))).node()}}function bp(t,e={}){return function(t){return function({x:t,x1:e,x2:n}){return void 0!==t||void 0!==e||void 0!==n}(t)||rh(t)||void 0!==t.interval}(e)||(e={...e,x:ku,y2:Ju,interval:1}),new Up(t,np(function(t={}){return Ly("x",py,t,!0)}(function(t={}){return rh(t)?t:{...t,y:Ju}}(e))))}function Cp(t,e,n){var i=void 0===e?null:e,s=function(t,e){var n=atob(t);if(e){for(var i=new Uint8Array(n.length),s=0,c=n.length;s<c;++s)i[s]=n.charCodeAt(s);return String.fromCharCode.apply(null,new Uint16Array(i.buffer))}return n}(t,void 0!==n&&n),c=s.indexOf("\n",10)+1,a=s.substring(c)+(i?"//# sourceMappingURL="+i:""),l=new Blob([a],{type:"application/javascript"});return URL.createObjectURL(l)}var yp,fp,Gp,pp,mp=(yp="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewoJJ3VzZSBzdHJpY3QnOwoKCXZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9OwoKCXZhciBkaXN0cmlidXRpb25zID0ge2V4cG9ydHM6IHt9fTsKCgkoZnVuY3Rpb24gKG1vZHVsZSkgewoKCSAgLy8gQSBudW1iZXIgb2YgbG9nIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb25zIChQREYpLiBOYW1pbmcgYW5kIHBhcmFtZXRlcml6YXRpb24KCSAgLy8gc2hvdWxkIG1hdGNoIFIncywgZXhjZXB0IGZvciB0aGF0IGFsbCBmdW5jdGlvbnMgcmVzaWRlIGluIGFuIGxkIG9iamVjdCAoCgkgIC8vIGFzIGluICJsb2cgZGVuc2l0eSIpLCBzbyB0byBnZXQgYSBub3JtYWwgbG9nIGRlbnNpdHkgeW91IHdvdWxkIHdyaXRlCgkgIC8vIGxkLm5vcm0oLi4uKS4KCSAgLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0CgkgIC8vIChodHRwczovL2dpdGh1Yi5jb20vanN0YXQvKSB3aGljaCBpbmNsdWRlcyBQREYgZm9yIG1hbnkgY29tbW9uIHByb2JhYmlsaXR5CgkgIC8vIGRpc3RyaWJ1dGlvbnMuIFdoYXQgSSBoYXZlIGRvbmUgaXMgb25seSB0byBjb252ZXJ0IHRoZXNlIHRvIGxvZyBQREZzLgoKCSAgLyoKCSAgT3JpZ2luYWwgd29yayBDb3B5cmlnaHQgKGMpIDIwMTMgalN0YXQKCSAgTW9kaWZpZWQgd29yayBDb3B5cmlnaHQgKGMpIDIwMTUgUmFzbXVzIELDpcOldGggCgkgIAlQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CgkgIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCgkgIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKCSAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAoJICBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKCSAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCSAgCVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCgkgIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoJICAJVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKCSAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCgkgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQoJICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCgkgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCgkgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KCSAgVEhFIFNPRlRXQVJFLgoJICAJKi8KCgkgIC8vIFRoaXMgYm9pbGVyIHBsYXRlIGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tOgoJICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCgkgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAoJICAvLyBOb2RlLCBhbmQgYnkgdXNpbmcgdGhlIEFzeW5jaHJvbm91cyBNb2R1bGUgRGVmaW5pdGlvbiBzdGFuZGFyZC4KCSAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCgkgIC8vIG9iamVjdCBsZCAuCgkgIChmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewoJICAgIGlmIChtb2R1bGUuZXhwb3J0cykgewoJICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CgkgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKCSAgICAgIC8vIGxpa2UgTm9kZS4KCSAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KQoJICAgICAgcm9vdC5sZCA9IGZhY3RvcnkoKTsKCSAgICB9CgkgIH0pKGNvbW1vbmpzR2xvYmFsLCBmdW5jdGlvbiAoKSB7CgkgICAgLy8gT2JqZWN0IHRvIGhvbGQgdGhlIGZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZC4KCSAgICB2YXIgbGQgPSB7fTsKCgkgICAgLy8vLy8vLy8vLyBIZWxwZXIgZnVuY3Rpb25zIC8vLy8vLy8vLy8KCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCSAgICB2YXIgbGdhbW1hID0gZnVuY3Rpb24gKHgpIHsKCSAgICAgIHZhciBqID0gMDsKCSAgICAgIHZhciBjb2YgPSBbNzYuMTgwMDkxNzI5NDcxNDYsIC04Ni41MDUzMjAzMjk0MTY3NywgMjQuMDE0MDk4MjQwODMwOTEsIC0xLjIzMTczOTU3MjQ1MDE1NSwgMC4xMjA4NjUwOTczODY2MTc5ZS0yLCAtMC41Mzk1MjM5Mzg0OTUzZS01XTsKCSAgICAgIHZhciBzZXIgPSAxLjAwMDAwMDAwMDE5MDAxNTsKCSAgICAgIHZhciB4eCwgeSwgdG1wOwoJICAgICAgdG1wID0gKHkgPSB4eCA9IHgpICsgNS41OwoJICAgICAgdG1wIC09ICh4eCArIDAuNSkgKiBsb2codG1wKTsKCSAgICAgIGZvciAoOyBqIDwgNjsgaisrKSBzZXIgKz0gY29mW2pdIC8gKyt5OwoJICAgICAgcmV0dXJuIGxvZygyLjUwNjYyODI3NDYzMTAwMDUgKiBzZXIgLyB4eCkgLSB0bXA7CgkgICAgfTsKCSAgICBsZC5sZ2FtbWEgPSBsZ2FtbWE7CgkgICAgdmFyIGxmYWN0b3JpYWwgPSBmdW5jdGlvbiAobikgewoJICAgICAgcmV0dXJuIG4gPCAwID8gTmFOIDogbGdhbW1hKG4gKyAxKTsKCSAgICB9OwoJICAgIGxkLmxmYWN0b3JpYWwgPSBsZmFjdG9yaWFsOwoJICAgIHZhciBsY2hvb3NlID0gZnVuY3Rpb24gKG4sIGspIHsKCSAgICAgIHJldHVybiBsZmFjdG9yaWFsKG4pIC0gbGZhY3RvcmlhbChrKSAtIGxmYWN0b3JpYWwobiAtIGspOwoJICAgIH07CgkgICAgbGQubGNob29zZSA9IGxjaG9vc2U7CgkgICAgdmFyIGxiZXRhID0gZnVuY3Rpb24gKGEsIGIpIHsKCSAgICAgIHJldHVybiBsZ2FtbWEoYSkgKyBsZ2FtbWEoYikgLSBsZ2FtbWEoYSArIGIpOwoJICAgIH07CgkgICAgbGQubGJldGEgPSBsYmV0YTsKCSAgICB2YXIgbG9nID0gTWF0aC5sb2c7CgkgICAgdmFyIGV4cCA9IE1hdGguZXhwOwoJICAgIHZhciBhYnMgPSBNYXRoLmFiczsKCSAgICB2YXIgcG93ID0gTWF0aC5wb3c7CgkgICAgdmFyIHNxcnQgPSBNYXRoLnNxcnQ7CgkgICAgdmFyIHBpID0gTWF0aC5QSTsKCgkgICAgLy8vLy8vLy8vLyBDb250aW5vdXMgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIGxkLmJldGEgPSBmdW5jdGlvbiAoeCwgc2hhcGUxLCBzaGFwZTIpIHsKCSAgICAgIGlmICh4ID4gMSB8fCB4IDwgMCkgewoJICAgICAgICByZXR1cm4gLUluZmluaXR5OwoJICAgICAgfQoJICAgICAgaWYgKHNoYXBlMSA9PT0gMSAmJiBzaGFwZTIgPT09IDEpIHsKCSAgICAgICAgcmV0dXJuIDA7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gKHNoYXBlMSAtIDEpICogbG9nKHgpICsgKHNoYXBlMiAtIDEpICogbG9nKDEgLSB4KSAtIGxiZXRhKHNoYXBlMSwgc2hhcGUyKTsKCSAgICAgIH0KCSAgICB9OwoJICAgIGxkLmNhdWNoeSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKCSAgICAgIHJldHVybiBsb2coc2NhbGUpIC0gbG9nKHBvdyh4IC0gbG9jYXRpb24sIDIpICsgcG93KHNjYWxlLCAyKSkgLSBsb2cocGkpOwoJICAgIH07CgkgICAgbGQubm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCkgewoJICAgICAgcmV0dXJuIC0wLjUgKiBsb2coMiAqIHBpKSAtIGxvZyhzZCkgLSBwb3coeCAtIG1lYW4sIDIpIC8gKDIgKiBzZCAqIHNkKTsKCSAgICB9OwoKCSAgICAvLyBBIGJpdmFyaWF0ZSBOb3JtYWwgZGlzdHJpYnV0aW9uIHBhcmFtZXRlcml6ZWQgYnkgYXJyYXlzIG9mIHR3byBtZWFucyBhbmQgU0RzLCBhbmQgCgkgICAgLy8gdGhlIGNvcnJlbGF0aW9uLgoJICAgIGxkLmJpdmFybm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCwgY29ycikgewoJICAgICAgdmFyIHogPSBwb3coeFswXSAtIG1lYW5bMF0sIDIpIC8gcG93KHNkWzBdLCAyKSArIHBvdyh4WzFdIC0gbWVhblsxXSwgMikgLyBwb3coc2RbMV0sIDIpIC0gMiAqIGNvcnIgKiAoeFswXSAtIG1lYW5bMF0pICogKHhbMV0gLSBtZWFuWzFdKSAvIChzZFswXSAqIHNkWzFdKTsKCSAgICAgIHZhciBub3JtYWxpemluZ19mYWN0b3IgPSAtKGxvZygyKSArIGxvZyhwaSkgKyBsb2coc2RbMF0pICsgbG9nKHNkWzFdKSArIDAuNSAqIGxvZygxIC0gcG93KGNvcnIsIDIpKSk7CgkgICAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSkpOwoJICAgICAgcmV0dXJuIGJpdmFyX2xvZ19kZW5zOwoJICAgIH07CgkgICAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKCSAgICAgIHJldHVybiAtYWJzKHggLSBsb2NhdGlvbikgLyBzY2FsZSAtIGxvZygyICogc2NhbGUpOwoJICAgIH07CgkgICAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7CgkgICAgbGQuZ2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHJhdGUpIHsKCSAgICAgIHZhciBzY2FsZSA9IDEgLyByYXRlOwoJICAgICAgaWYgKHggPCAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICBpZiAoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgewoJICAgICAgICByZXR1cm4gLWxvZyhzY2FsZSk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gKHNoYXBlIC0gMSkgKiBsb2coeCkgLSB4IC8gc2NhbGUgLSBsZ2FtbWEoc2hhcGUpIC0gc2hhcGUgKiBsb2coc2NhbGUpOwoJICAgICAgfQoJICAgIH07CgkgICAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHNjYWxlKSB7CgkgICAgICBpZiAoeCA8PSAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gLShzaGFwZSArIDEpICogbG9nKHgpIC0gc2NhbGUgLyB4IC0gbGdhbW1hKHNoYXBlKSArIHNoYXBlICogbG9nKHNjYWxlKTsKCSAgICB9OwoJICAgIGxkLmxub3JtID0gZnVuY3Rpb24gKHgsIG1lYW5sb2csIHNkbG9nKSB7CgkgICAgICBpZiAoeCA8PSAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gLWxvZyh4KSAtIDAuNSAqIGxvZygyICogcGkpIC0gbG9nKHNkbG9nKSAtIHBvdyhsb2coeCkgLSBtZWFubG9nLCAyKSAvICgyICogc2Rsb2cgKiBzZGxvZyk7CgkgICAgfTsKCSAgICBsZC5wYXJldG8gPSBmdW5jdGlvbiAoeCwgc2NhbGUsIHNoYXBlKSB7CgkgICAgICBpZiAoeCA8IHNjYWxlKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbG9nKHNoYXBlKSArIHNoYXBlICogbG9nKHNjYWxlKSAtIChzaGFwZSArIDEpICogbG9nKHgpOwoJICAgIH07CgkgICAgbGQudCA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUsIGRmKSB7CgkgICAgICBkZiA9IGRmID4gMWUxMDAgPyAxZTEwMCA6IGRmOwoJICAgICAgcmV0dXJuIGxnYW1tYSgoZGYgKyAxKSAvIDIpIC0gbGdhbW1hKGRmIC8gMikgLSBsb2coc3FydChwaSAqIGRmKSAqIHNjYWxlKSArIGxvZyhwb3coMSArIDEgLyBkZiAqIHBvdygoeCAtIGxvY2F0aW9uKSAvIHNjYWxlLCAyKSwgLShkZiArIDEpIC8gMikpOwoJICAgIH07CgoJICAgIC8vIFRoaXMgaXMgYSBkaXJlY3QgamF2YXNjcmlwdCB0cmFuc2xhdGlvbiBvZiB0aGUgUiBjb2RlIHVzZWQgdG8gZXZhbHVhdGUKCSAgICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSB3ZWlidWxsIGRpc3RyaWJ1dGlvbjogCgkgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmMKCSAgICBsZC53ZWlidWxsID0gZnVuY3Rpb24gKHgsIHNoYXBlLCBzY2FsZSkgewoJICAgICAgaWYgKHggPCAwKSByZXR1cm4gLUluZmluaXR5OwoJICAgICAgaWYgKHggPT09IDAgJiYgc2hhcGUgPCAxKSByZXR1cm4gSW5maW5pdHk7CgkgICAgICB2YXIgdG1wMSA9IHBvdyh4IC8gc2NhbGUsIHNoYXBlIC0gMSk7CgkgICAgICB2YXIgdG1wMiA9IHRtcDEgKiAoeCAvIHNjYWxlKTsKCSAgICAgIHJldHVybiAtdG1wMiArIGxvZyhzaGFwZSAqIHRtcDEgLyBzY2FsZSk7CgkgICAgfTsKCgkgICAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZQoJICAgIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIGxvZ2lzdGljIGRpc3RyaWJ1dGlvbjogCgkgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2Rsb2dpcy5jCgkgICAgbGQubG9naXMgPSBmdW5jdGlvbiAoeCwgbG9jYXRpb24sIHNjYWxlKSB7CgkgICAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpOwoJICAgICAgdmFyIGUgPSBleHAoLXgpOwoJICAgICAgdmFyIGYgPSAxLjAgKyBlOwoJICAgICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7CgkgICAgfTsKCSAgICBsZC5kaXJpY2hsZXQgPSBmdW5jdGlvbiAoeCwgYWxwaGEpIHsKCSAgICAgIHZhciBzdW1fYWxwaGEgPSAwOwoJICAgICAgdmFyIHN1bV9sZ2FtbWFfYWxwaGEgPSAwOwoJICAgICAgdmFyIHN1bV9hbHBoYV9zdWJfMV9sb2dfeCA9IDA7CgkgICAgICB2YXIgbiA9IGFscGhhLmxlbmd0aDsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkgICAgICAgIHN1bV9hbHBoYSArPSBhbHBoYVtpXTsKCSAgICAgICAgc3VtX2xnYW1tYV9hbHBoYSArPSBsZ2FtbWEoYWxwaGFbaV0pOwoJICAgICAgICBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggKz0gKGFscGhhW2ldIC0gMSkgKiBsb2coeFtpXSk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbGdhbW1hKHN1bV9hbHBoYSkgLSBzdW1fbGdhbW1hX2FscGhhICsgc3VtX2FscGhhX3N1Yl8xX2xvZ194OwoJICAgIH07CgkgICAgbGQuZXhwID0gZnVuY3Rpb24gKHgsIHJhdGUpIHsKCSAgICAgIHJldHVybiB4IDwgMCA/IC1JbmZpbml0eSA6IGxvZyhyYXRlKSAtIHJhdGUgKiB4OwoJICAgIH07CgkgICAgbGQudW5pZiA9IGZ1bmN0aW9uICh4LCBtaW4sIG1heCkgewoJICAgICAgcmV0dXJuIHggPCBtaW4gfHwgeCA+IG1heCA/IC1JbmZpbml0eSA6IGxvZygxIC8gKG1heCAtIG1pbikpOwoJICAgIH07CgoJICAgIC8vLy8vLy8vLy8gRGlzY3JldGUgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgbGQuYmVybiA9IGZ1bmN0aW9uICh4LCBwcm9iKSB7CgkgICAgICByZXR1cm4gISh4ID09PSAwIHx8IHggPT09IDEpID8gLUluZmluaXR5IDogbG9nKHggKiBwcm9iICsgKDEgLSB4KSAqICgxIC0gcHJvYikpOwoJICAgIH07CgkgICAgbGQuY2F0ID0gZnVuY3Rpb24gKHgsIHByb2JzKSB7CgkgICAgICBpZiAoeCA8IDEgfHwgeCA+IHByb2JzLmxlbmd0aCkgewoJICAgICAgICByZXR1cm4gLUluZmluaXR5OwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIGxvZyhwcm9ic1t4IC0gMV0pOwoJICAgICAgfQoJICAgIH07CgkgICAgbGQuYmlub20gPSBmdW5jdGlvbiAoeCwgc2l6ZSwgcHJvYikgewoJICAgICAgaWYgKHggPiBzaXplIHx8IHggPCAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICBpZiAocHJvYiA9PT0gMCB8fCBwcm9iID09PSAxKSB7CgkgICAgICAgIHJldHVybiBzaXplICogcHJvYiA9PT0geCA/IDAgOiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTsKCSAgICB9OwoJICAgIGxkLm5iaW5vbSA9IGZ1bmN0aW9uICh4LCBzaXplLCBwcm9iKSB7CgkgICAgICBpZiAoeCA8IDApIHsKCSAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKCSAgICAgIH0KCSAgICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpOwoJICAgIH07CgkgICAgbGQuaHlwZXIgPSBmdW5jdGlvbiAoeCwgbSwgbiwgaykgewoJICAgICAgaWYgKHggPCAwIHx8IHggPiBrKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2UobiwgayAtIHgpIC0gbGNob29zZShtICsgbiwgayk7CgkgICAgICB9CgkgICAgfTsKCSAgICBsZC5wb2lzID0gZnVuY3Rpb24gKHgsIGxhbWJkYSkgewoJICAgICAgcmV0dXJuIHggPCAwID8gLUluZmluaXR5IDogbG9nKGxhbWJkYSkgKiB4IC0gbGFtYmRhIC0gbGZhY3RvcmlhbCh4KTsKCSAgICB9OwoJICAgIHJldHVybiBsZDsKCSAgfSk7Cgl9KShkaXN0cmlidXRpb25zKTsKCXZhciBkaXN0cmlidXRpb25zRXhwb3J0cyA9IGRpc3RyaWJ1dGlvbnMuZXhwb3J0czsKCgl2YXIgbWNtYyA9IHtleHBvcnRzOiB7fX07CgoJKGZ1bmN0aW9uIChtb2R1bGUpIHsKCgkgIC8vIFRoaXMgYm9pbGVyIHBsYXRlIGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tOgoJICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCgkgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAoJICAvLyBOb2RlLCBhbmQgYnkgdXNpbmcgdGhlIEFzeW5jaHJvbm91cyBNb2R1bGUgRGVmaW5pdGlvbiBzdGFuZGFyZC4KCSAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCgkgIC8vIG9iamVjdCBtY21jIC4KCSAgKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7CgkgICAgaWYgKG1vZHVsZS5leHBvcnRzKSB7CgkgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXQKCSAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLAoJICAgICAgLy8gbGlrZSBOb2RlLgoJICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpCgkgICAgICByb290Lm1jbWMgPSBmYWN0b3J5KCk7CgkgICAgfQoJICB9KShjb21tb25qc0dsb2JhbCwgZnVuY3Rpb24gKCkgewoJICAgIC8vLyBUaGUgYWN0dWFsIG1vZHVsZSBjb2RlIHN0YXJ0cyBoZXJlIC8vLwoJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgCgoJICAgIC8vLy8vLy8vLy8gSGVscGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgLyoqIFJldHVybnMgYSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqLwoJICAgIHZhciBydW5pZiA9IGZ1bmN0aW9uIChtaW4sIG1heCkgewoJICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSArIG1pbjsKCSAgICB9OwoKCSAgICAvKiogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIGFuZCBtYXggKi8KCSAgICB2YXIgcnVuaWZfZGlzY3JldGUgPSBmdW5jdGlvbiAobWluLCBtYXgpIHsKCSAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluOwoJICAgIH07CgoJICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkCgkgICAgICogIGJ5IG1lYW4gYW5kIHNkLiAKCSAgICAgKiAgQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qc3RhdC9qc3RhdC9ibG9iL21hc3Rlci9zcmMvc3BlY2lhbC5qcyAqLwoJICAgIHZhciBybm9ybSA9IGZ1bmN0aW9uIChtZWFuLCBzZCkgewoJICAgICAgdmFyIHUsIHYsIHgsIHksIHE7CgkgICAgICBkbyB7CgkgICAgICAgIHUgPSBNYXRoLnJhbmRvbSgpOwoJICAgICAgICB2ID0gMS43MTU2ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpOwoJICAgICAgICB4ID0gdSAtIDAuNDQ5ODcxOwoJICAgICAgICB5ID0gTWF0aC5hYnModikgKyAwLjM4NjU5NTsKCSAgICAgICAgcSA9IHggKiB4ICsgeSAqICgwLjE5NjAwICogeSAtIDAuMjU0NzIgKiB4KTsKCSAgICAgIH0gd2hpbGUgKHEgPiAwLjI3NTk3ICYmIChxID4gMC4yNzg0NiB8fCB2ICogdiA+IC00ICogTWF0aC5sb2codSkgKiB1ICogdSkpOwoJICAgICAgcmV0dXJuIHYgLyB1ICogc2QgKyBtZWFuOwoJICAgIH07CgoJICAgIC8qKiBSZXR1cm5zIGEgZGVlcCBjbG9uZSBvZiBzcmMsIHNvcnQgb2YuLi4gSXQgb25seSBjb3BpZXMgYSBsaW1pdGVkCgkgICAgICogbnVtYmVyIG9mIHR5cGVzIGFuZCwgZm9yIGV4YW1wbGUsIGZ1bmN0aW9uIGFyZSBub3QgY29waWVkLiAKCSAgICAgKiBGcm9tIGh0dHA6Ly9kYXZpZHdhbHNoLm5hbWUvamF2YXNjcmlwdC1jbG9uZQoJICAgICAqLwoJICAgIHZhciBkZWVwX2Nsb25lID0gZnVuY3Rpb24gKHNyYykgewoJICAgICAgZnVuY3Rpb24gbWl4aW4oZGVzdCwgc291cmNlLCBjb3B5RnVuYykgewoJICAgICAgICB2YXIgbmFtZSwKCSAgICAgICAgICBzLAoJICAgICAgICAgIGVtcHR5ID0ge307CgkgICAgICAgIGZvciAobmFtZSBpbiBzb3VyY2UpIHsKCSAgICAgICAgICAvLyB0aGUgKCEobmFtZSBpbiBlbXB0eSkgfHwgZW1wdHlbbmFtZV0gIT09IHMpIGNvbmRpdGlvbiBhdm9pZHMgY29weWluZyBwcm9wZXJ0aWVzIGluICJzb3VyY2UiCgkgICAgICAgICAgLy8gaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZS4JIEZvciBleGFtcGxlLCBpZiBkZXN0IGhhcyBhIGN1c3RvbSB0b1N0cmluZygpIG1ldGhvZCwKCSAgICAgICAgICAvLyBkb24ndCBvdmVyd3JpdGUgaXQgd2l0aCB0aGUgdG9TdHJpbmcoKSBtZXRob2QgdGhhdCBzb3VyY2UgaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZQoJICAgICAgICAgIHMgPSBzb3VyY2VbbmFtZV07CgkgICAgICAgICAgaWYgKCEobmFtZSBpbiBkZXN0KSB8fCBkZXN0W25hbWVdICE9PSBzICYmICghKG5hbWUgaW4gZW1wdHkpIHx8IGVtcHR5W25hbWVdICE9PSBzKSkgewoJICAgICAgICAgICAgZGVzdFtuYW1lXSA9IGNvcHlGdW5jID8gY29weUZ1bmMocykgOiBzOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gZGVzdDsKCSAgICAgIH0KCSAgICAgIGlmICghc3JjIHx8IHR5cGVvZiBzcmMgIT0gIm9iamVjdCIgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHNyYykgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKCSAgICAgICAgLy8gbnVsbCwgdW5kZWZpbmVkLCBhbnkgbm9uLW9iamVjdCwgb3IgZnVuY3Rpb24KCSAgICAgICAgcmV0dXJuIHNyYzsgLy8gYW55dGhpbmcKCSAgICAgIH0KCSAgICAgIGlmIChzcmMubm9kZVR5cGUgJiYgImNsb25lTm9kZSIgaW4gc3JjKSB7CgkgICAgICAgIC8vIERPTSBOb2RlCgkgICAgICAgIHJldHVybiBzcmMuY2xvbmVOb2RlKHRydWUpOyAvLyBOb2RlCgkgICAgICB9CgkgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgRGF0ZSkgewoJICAgICAgICAvLyBEYXRlCgkgICAgICAgIHJldHVybiBuZXcgRGF0ZShzcmMuZ2V0VGltZSgpKTsgLy8gRGF0ZQoJICAgICAgfQoJICAgICAgaWYgKHNyYyBpbnN0YW5jZW9mIFJlZ0V4cCkgewoJICAgICAgICAvLyBSZWdFeHAKCSAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoc3JjKTsgLy8gUmVnRXhwCgkgICAgICB9CgkgICAgICB2YXIgciwgaSwgbDsKCSAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBBcnJheSkgewoJICAgICAgICAvLyBhcnJheQoJICAgICAgICByID0gW107CgkgICAgICAgIGZvciAoaSA9IDAsIGwgPSBzcmMubGVuZ3RoOyBpIDwgbDsgKytpKSB7CgkgICAgICAgICAgaWYgKGkgaW4gc3JjKSB7CgkgICAgICAgICAgICByLnB1c2goZGVlcF9jbG9uZShzcmNbaV0pKTsKCSAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIC8vIGdlbmVyaWMgb2JqZWN0cwoJICAgICAgICByID0gc3JjLmNvbnN0cnVjdG9yID8gbmV3IHNyYy5jb25zdHJ1Y3RvcigpIDoge307CgkgICAgICB9CgkgICAgICByZXR1cm4gbWl4aW4ociwgc3JjLCBkZWVwX2Nsb25lKTsKCSAgICB9OwoKCSAgICAvKiogU3BlY2lhbGl6ZWQgY2xvbmUgZnVuY3Rpb24gdGhhdCBvbmx5IGNsb25lcyBzY2FsYXJzIGFuZCBuZXN0ZWQgYXJyYXlzIHdoZXJlCgkgICAgICogZWFjaCBhcnJheSBlaXRoZXIgY29uc2lzdHMgb2YgYWxsIGFycmF5cyBvciBhbGwgbnVtYmVycy4gVGhpcyBmdW5jdGlvbgoJICAgICAqIGlzIG1lYW50IGFzIGEgZmFzdCB3YXkgb2YgY2xvbmluZyBwYXJhbWV0ZXIgZHJhd3Mgd2l0aGluIHRoZSBtY21jIHNhbXBsaW5nCgkgICAgICogbG9vcC4KCSAgICAgKi8KCSAgICB2YXIgY2xvbmVfcGFyYW1fZHJhdyA9IGZ1bmN0aW9uICh4KSB7CgkgICAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkgewoJICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh4WzBdKSkgewoJICAgICAgICAgIC8vIHggaXMgYW4gYXJyYXkgb2YgYXJyYXlzIHNvIHdlIG5lZWQgdG8gY2xvbmUgaXQgcmVjdXJzaXZlbHkKCSAgICAgICAgICB2YXIgeF9jb3B5ID0gW107CgkgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgIHhfY29weS5wdXNoKGNsb25lX3BhcmFtX2RyYXcoeFtpXSkpOwoJICAgICAgICAgIH0KCSAgICAgICAgICByZXR1cm4geF9jb3B5OwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgYXJyYXlzIG9mIHNjYWxhcnMKCSAgICAgICAgICByZXR1cm4geC5zbGljZSgwKTsKCSAgICAgICAgfQoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXIKCSAgICAgICAgcmV0dXJuIHg7CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBvYmplY3QgaXMgYSBudW1iZXIuCgkgICAgICovCgkgICAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uIChvYmplY3QpIHsKCSAgICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICJudW1iZXIiIHx8IHR5cGVvZiBvYmplY3QgPT0gIm9iamVjdCIgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09PSBOdW1iZXI7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSAocG9zc2libHkgbXVsdGlkaW1lbnNpb25hbC9uZXN0ZWQpIGFycmF5LgoJICAgICAqIEBwYXJhbSBkaW0gLSBBbiBhcnJheSBnaXZpbmcgdGhlIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkuIEZvciBleGFtcGxlLAoJICAgICAqICAgWzVdIHdvdWxkIHlpZWxkIGEgNSBlbGVtZW50IGFycmF5LCBhbmQgWzMsM10gd291bGQgeWllbGQgYSAzIGJ5IDMgbWF0cml4LgoJICAgICAqIEBwYXJhbSBpbml0IC0gQSB2YWx1ZSBvciBhIGZ1bmN0aW9uIHVzZWQgdG8gZmlsbCBpbiB0aGUgZWFjaCBlbGVtZW50IGluCgkgICAgICogICB0aGUgYXJyYXkuIElmIGl0IGlzIGEgZnVuY3Rpb24gaXQgc2hvdWxkIHRha2Ugbm8gYXJndW1lbnRzLCBpdCB3aWxsIGJlIAoJICAgICAqICAgZXZhbHVhdGVkIG9uY2UgZm9yIGVhY2ggZWxlbWVudCwgYW5kIGl0J3MgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZCB0bwoJICAgICAqICAgZmlsbCBpbiBlYWNoIGVsZW1lbnQuCgkgICAgICogQGV4YW1wbGUgCgkgICAgICogLy8gVGhlIGZvbGxvd2luZyB3b3VsZCByZXR1cm4gW1sxLDFdLFsxLDFdLFsxLDFdXQoJICAgICAqIGNyZWF0ZV9hcnJheShbMiwzXSwgMSkKCSAgICAgKi8KCSAgICB2YXIgY3JlYXRlX2FycmF5ID0gZnVuY3Rpb24gKGRpbSwgaW5pdCkgewoJICAgICAgdmFyIGFyciA9IG5ldyBBcnJheShkaW1bMF0pOwoJICAgICAgdmFyIGk7CgkgICAgICBpZiAoZGltLmxlbmd0aCA9PSAxKSB7CgkgICAgICAgIC8vIEZpbGwgaXQgdXAgd2l0aCBpbml0CgkgICAgICAgIGlmICh0eXBlb2YgaW5pdCA9PT0gImZ1bmN0aW9uIikgewoJICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewoJICAgICAgICAgICAgYXJyW2ldID0gaW5pdCgpOwoJICAgICAgICAgIH0KCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIGFycltpXSA9IGluaXQ7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgaWYgKGRpbS5sZW5ndGggPiAxKSB7CgkgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewoJICAgICAgICAgIGFycltpXSA9IGNyZWF0ZV9hcnJheShkaW0uc2xpY2UoMSksIGluaXQpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aHJvdyAiY3JlYXRlX2FycmF5IGNhbid0IGNyZWF0ZSBhIGRpbWVuc2lvbmxlc3MgYXJyYXkiOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGFycjsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciAKCSAgICAgKiBleGFtcGxlLCBhcnJheV9kaW0oIFtbMSwgMl0sIFsxLCAyXV0gKSBzaG91bGQgcmV0dXJuIFsyLCAyXQoJICAgICAqIEFzc3VtZXMgdGhhdCBhbGwgYXJyYXlzIGluc2lkZSBhbm90aGVyIGFycmF5IGFyZSBvZiB0aGUgc2FtZSBsZW5ndGguCgkgICAgICogQGV4YW1wbGUKCSAgICAgKiAvLyBTaG91bGQgcmV0dXJuIFs0LCAyLCAxXQoJICAgICAqIGFycmF5X2RpbShjcmVhdGVfYXJyYXkoWzQsIDIsIDFdLCAwKSkKCSAgICAgKi8KCSAgICB2YXIgYXJyYXlfZGltID0gZnVuY3Rpb24gKGEpIHsKCSAgICAgIGlmIChBcnJheS5pc0FycmF5KGFbMF0pKSB7CgkgICAgICAgIHJldHVybiBbYS5sZW5ndGhdLmNvbmNhdChhcnJheV9kaW0oYVswXSkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIFthLmxlbmd0aF07CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogQ2hlY2tzIGlmIHR3byBhcnJheXMgYXJlIGVxdWFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cwoJICAgICAqIGFzIGp1ZGdlZCBieSB0aGUgIj09IiBvcGVyYXRvci4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgoJICAgICAqIEFkYXB0ZWQgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNDg1Mzk3NC8xMDAxODQ4CgkgICAgICovCgkgICAgdmFyIGFycmF5X2VxdWFsID0gZnVuY3Rpb24gKGExLCBhMikgewoJICAgICAgaWYgKGExLmxlbmd0aCAhPSBhMi5sZW5ndGgpIHJldHVybiBmYWxzZTsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBuZXN0ZWQgYXJyYXlzCgkgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGExW2ldKSAmJiBBcnJheS5pc0FycmF5KGEyW2ldKSkgewoJICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5cwoJICAgICAgICAgIGlmICghYXJyYXlfZXF1YWwoYTFbaV0sIGEyW2ldKSkgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9IGVsc2UgaWYgKGExW2ldICE9IGEyW2ldKSB7CgkgICAgICAgICAgLy8gV2FybmluZyAtIHR3byBkaWZmZXJlbnQgb2JqZWN0IGluc3RhbmNlcyB3aWxsIG5ldmVyIGJlIGVxdWFsOiB7eDoyMH0gIT0ge3g6MjB9CgkgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICByZXR1cm4gdHJ1ZTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBUcmF2ZXJzZXMgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYSBhbmQgYXBwbGllcyBmdW4gdG8gYWxsICJsZWFmIG5vZGVzIiwgCgkgICAgICogdGhhdCBpcywgdmFsdWVzIHRoYXQgYXJlIG5vdCBhcnJheXMuIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2l6ZSBhcwoJICAgICAqIGEuCgkgICAgICovCgkgICAgdmFyIG5lc3RlZF9hcnJheV9hcHBseSA9IGZ1bmN0aW9uIChhLCBmdW4pIHsKCSAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CgkgICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoYS5sZW5ndGgpOwoJICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gcmVzdWx0OwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIGZ1bihhKTsKCSAgICAgIH0KCSAgICB9OwoKCSAgICAvKiogUmFuZG9taXppbmcgdGhlIGFycmF5IGVsZW1lbnQgb3JkZXIgaW4tcGxhY2UuIFVzaW5nIER1cnN0ZW5mZWxkCgkgICAgICogc2h1ZmZsZSBhbGdvcml0aG0uIEFkYXB0ZWQgZnJvbSBoZXJlOiAKCSAgICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4CgkgICAgICovCgkgICAgZnVuY3Rpb24gc2h1ZmZsZV9hcnJheShhcnJheSkgewoJICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHsKCSAgICAgICAgdmFyIGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTsKCSAgICAgICAgdmFyIHRlbXAgPSBhcnJheVtpXTsKCSAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTsKCSAgICAgICAgYXJyYXlbal0gPSB0ZW1wOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGFycmF5OwoJICAgIH0KCgkgICAgLyoqCgkgICAgICogRG9lcyB0aGUgc2FtZSB0aGluZyBhcyBuZXN0ZWRfYXJyYXlfYXBwbHksIHRoYXQgaXMsIHRyYXZlcnNlcyBhIHBvc3NpYmx5CgkgICAgICogbmVzdGVkIGFycmF5IGEgYW5kIGFwcGxpZXMgZnVuIHRvIGFsbCAibGVhZiBub2RlcyIgYW5kIHJldHVybnMgYW4gYXJyYXkgCgkgICAgICogb2YgdGhlIHNhbWUgc2l6ZSBhcyBhLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG5lc3RlZF9hcnJheV9yYW5kb21fYXBwbHkKCSAgICAgKiBicmFuY2hlcyByYW5kb21seS4KCSAgICAgKi8KCSAgICB2YXIgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSA9IGZ1bmN0aW9uIChhLCBmdW4pIHsKCSAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CgkgICAgICAgIHZhciBsZW4gPSBhLmxlbmd0aDsKCSAgICAgICAgdmFyIGk7CgkgICAgICAgIHZhciBhcnJheV9pcyA9IFtdOwoJICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgICAgICBhcnJheV9pc1tpXSA9IGk7CgkgICAgICAgIH0KCSAgICAgICAgc2h1ZmZsZV9hcnJheShhcnJheV9pcyk7CgkgICAgICAgIHZhciByZXN1bHQgPSBbXTsKCSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgICAgdmFyIGFycmF5X2kgPSBhcnJheV9pc1tpXTsKCSAgICAgICAgICByZXN1bHRbYXJyYXlfaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVthcnJheV9pXSwgZnVuKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gcmVzdWx0OwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIGZ1bihhKTsKCSAgICAgIH0KCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBBbGxvd3MgYSBwcmV0dHkgd2F5IG9mIHNldHRpbmcgZGVmYXVsdCBvcHRpb25zIHdoZXJlIHRoZSBkZWZ1bHRzIGNhbiBiZQoJICAgICAqIG92ZXJyaWRkZW4gYnkgYW4gb3B0aW9ucyBvYmplY3QuCgkgICAgICogIEBwYXJhbSBvcHRpb25fbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gYXMgYSBzdHJpbmcKCSAgICAgKiAgQHBhcmFtIG15X29wdGlvbnMgLSBhbiBvcHRpb24gb2JqZWN0IHRoYXQgY291bGQgaGF2ZSBvcHRpb25fbmFtZSAKCSAgICAgKiAgICBhcyBhIG1lbWJlci4KCSAgICAgKiBAcGFyYW0gZGVmYXVsX3ZhbHVlIC0gZGVmdWx0IHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgaWYgb3B0aW9uX25hbWUgCgkgICAgICogICBpcyBub3QgZGVmaW5lZCBpbiBteV9vcHRpb25zLgoJICAgICAqIEBleGFtcGxlCgkgICAgICogdmFyIG15X29wdGlvbnMgPSB7cGk6IDMuMTQxNTl9CgkgICAgICogdmFyIHBpID0gZ2V0X29wdGlvbigicGkiLCBteV9vcHRpb25zLCAzLjE0KQoJICAgICAqLwoJICAgIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuCgkgICAgLy8gYnkgYW4gb3B0aW9ucyBvYmplY3QuIEZvciBleGFtcGxlOgoJICAgIC8vIHZhciBwaSA9IGdldF9vcHRpb24oInBpIiwgbXlfb3B0aW9ucywgMy4xNCkKCSAgICB2YXIgZ2V0X29wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25fbmFtZSwgb3B0aW9ucywgZGVmYXVsX3ZhbHVlKSB7CgkgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgICAgIHJldHVybiBvcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbl9uYW1lKSAmJiBvcHRpb25zW29wdGlvbl9uYW1lXSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSBudWxsID8gb3B0aW9uc1tvcHRpb25fbmFtZV0gOiBkZWZhdWxfdmFsdWU7CgkgICAgfTsKCgkgICAgLyoqIFZlcnNpb24gb2YgZ2V0X29wdGlvbiB3aGVyZSB0aGUgb3B0aW9uIHNob3VsZCBiZSBhIG9uZSBvciBtdWx0aS1kaW1lbnNpb25hbAoJICAgICAqIGFycmF5IGFuZCB3aGVyZSB0aGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBlaXRoZXIgYnkgYSBzY2FsYXIgb3IgYnkgYW4gYXJyYXkuCgkgICAgICogSWYgaXQncyBhIHNjYWxhciB0aGUgdGhhdCBzY2FsYXIgaXMgdXNlZCB0byBpbml0aWFsaXplIGFuIGFycmF5IHdpdGggCgkgICAgICogZGltIGRpbWVuc2lvbnMuCgkgICAgICogCgkgICAgICovCgkgICAgdmFyIGdldF9tdWx0aWRpbV9vcHRpb24gPSBmdW5jdGlvbiAob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRpbSwgZGVmYXVsX3ZhbHVlKSB7CgkgICAgICB2YXIgdmFsdWUgPSBnZXRfb3B0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkZWZhdWxfdmFsdWUpOwoJICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgewoJICAgICAgICB2YWx1ZSA9IGNyZWF0ZV9hcnJheShkaW0sIHZhbHVlKTsKCSAgICAgIH0KCSAgICAgIGlmICghYXJyYXlfZXF1YWwoYXJyYXlfZGltKHZhbHVlKSwgZGltKSkgewoJICAgICAgICB0aHJvdyAiVGhlIG9wdGlvbiAiICsgb3B0aW9uX25hbWUgKyAiIGlzIG9mIGRpbWVuc2lvbiBbIiArIGFycmF5X2RpbSh2YWx1ZSkgKyAiXSBidXQgc2hvdWxkIGJlIFsiICsgZGltICsgIl0uIjsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9OwoKCSAgICAvLy8vLy8vLy8vIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcGFyYW1ldGVyIG9iamVjdHMgLy8vLy8vLy8vLwoJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIC8qKgoJICAgICAqIFJldHVybnMgYSBmaXhlZCAoc2FtZSBldmVyeSB0aW1lKSBudW1iZXIgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIGluaXRpYWxpemUKCSAgICAgKiBhIHBhcmFtZXRlciBvZiBhIGNlcnRhaW4gdHlwZSwgcG9zc2libHkgd2l0aCBsb3dlciBhbmQgdXBwZXIgYm91bmRzLgoJICAgICAqIFRoZSBwb3NzaWxlIHR5cGVzIGFyZSAicmVhbCIsICJpbnQiLCBhbmQgImJpbmFyeSIuCgkgICAgICovCgkgICAgdmFyIHBhcmFtX2luaXRfZml4ZWQgPSBmdW5jdGlvbiAodHlwZSwgbG93ZXIsIHVwcGVyKSB7CgkgICAgICBpZiAobG93ZXIgPiB1cHBlcikgewoJICAgICAgICB0aHJvdyAiQ2FuIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciB3aGVyZSBsb3dlciBib3VuZCA+IHVwcGVyIGJvdW5kIjsKCSAgICAgIH0KCSAgICAgIGlmICh0eXBlID09PSAicmVhbCIpIHsKCSAgICAgICAgaWYgKGxvd2VyID09PSAtSW5maW5pdHkgJiYgdXBwZXIgPT09IEluZmluaXR5KSB7CgkgICAgICAgICAgcmV0dXJuIDAuNTsKCSAgICAgICAgfSBlbHNlIGlmIChsb3dlciA9PT0gLUluZmluaXR5KSB7CgkgICAgICAgICAgcmV0dXJuIHVwcGVyIC0gMC41OwoJICAgICAgICB9IGVsc2UgaWYgKHVwcGVyID09PSBJbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiBsb3dlciArIDAuNTsKCSAgICAgICAgfSBlbHNlIGlmIChsb3dlciA8PSB1cHBlcikgewoJICAgICAgICAgIHJldHVybiAobG93ZXIgKyB1cHBlcikgLyAyOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJpbnQiKSB7CgkgICAgICAgIGlmIChsb3dlciA9PT0gLUluZmluaXR5ICYmIHVwcGVyID09PSBJbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiAxOwoJICAgICAgICB9IGVsc2UgaWYgKGxvd2VyID09PSAtSW5maW5pdHkpIHsKCSAgICAgICAgICByZXR1cm4gdXBwZXIgLSAxOwoJICAgICAgICB9IGVsc2UgaWYgKHVwcGVyID09PSBJbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiBsb3dlciArIDE7CgkgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPD0gdXBwZXIpIHsKCSAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgobG93ZXIgKyB1cHBlcikgLyAyKTsKCSAgICAgICAgfQoJICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAiYmluYXJ5IikgewoJICAgICAgICByZXR1cm4gMTsKCSAgICAgIH0KCSAgICAgIHRocm93ICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIgb2YgdHlwZSAiICsgdHlwZSArICJbIiArIGxvd2VyICsgIiwgIiArIHVwcGVyICsgIl0iOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIAoJICAgICAqIGFuZCBpbml0aWFsaXplcyBub24taW5pdGlhbGl6ZWQgcGFyYW1ldGVycy4gVGhpcyBtb2RpZmllZCB2ZXJzaW9uIG9mCgkgICAgICogcGFyYW1zX3RvX2NvbXBsZXRlIGlzIHJldHVybmVkIGFzIGEgZGVlcCBjb3B5IGFuZCBub3QgbW9kaWZpZWQgaW4gcGxhY2UuCgkgICAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlCgkgICAgICogZnVuY3Rpb24odHlwZSwgbG93ZXIsIHVwcGVyKSB0aGF0IHNob3VsZCByZXR1cm4gYSBzaW5nbGUgbnVtYmVyIAoJICAgICAqIChsaWtlIHBhcmFtX2luaXRfZml4ZWQsIGZvciBleGFtcGxlKS4KCSAgICAgKiBAZXhhbXBsZQoJICAgICAqIHZhciBwYXJhbXMgPSB7ICJtdSI6IHsidHlwZSI6ICJyZWFsIn0gfQoJICAgICAqIHBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyhwYXJhbXMpOwoJICAgICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOgoJICAgICAqIC8vICB7Im11IjogeyAidHlwZSI6ICJyZWFsIiwgImRpbSI6IFsxXSwgInVwcGVyIjogSW5maW5pdHksCgkgICAgICogLy8gICAgICAgICAgICJsb3dlciI6IC1JbmZpbml0eSwgImluaXQiOiAwLjUgfX0KCSAgICAgKi8KCSAgICB2YXIgY29tcGxldGVfcGFyYW1zID0gZnVuY3Rpb24gKHBhcmFtc190b19jb21wbGV0ZSwgcGFyYW1faW5pdCkgewoJICAgICAgdmFyIHBhcmFtcyA9IGRlZXBfY2xvbmUocGFyYW1zX3RvX2NvbXBsZXRlKTsKCSAgICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7CgkgICAgICAgIGlmICghcGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtX25hbWUpKSBjb250aW51ZTsKCSAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW3BhcmFtX25hbWVdOwoJICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJ0eXBlIikpIHsKCSAgICAgICAgICBwYXJhbS50eXBlID0gInJlYWwiOwoJICAgICAgICB9CgkgICAgICAgIGlmICghcGFyYW0uaGFzT3duUHJvcGVydHkoImRpbSIpKSB7CgkgICAgICAgICAgcGFyYW0uZGltID0gWzFdOwoJICAgICAgICB9CgkgICAgICAgIGlmIChpc19udW1iZXIocGFyYW0uZGltKSkgewoJICAgICAgICAgIHBhcmFtLmRpbSA9IFtwYXJhbS5kaW1dOwoJICAgICAgICB9CgkgICAgICAgIGlmIChwYXJhbS50eXBlID09ICJiaW5hcnkiKSB7CgkgICAgICAgICAgcGFyYW0udXBwZXIgPSAxOwoJICAgICAgICAgIHBhcmFtLmxvd2VyID0gMDsKCSAgICAgICAgfQoJICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJ1cHBlciIpKSB7CgkgICAgICAgICAgcGFyYW0udXBwZXIgPSBJbmZpbml0eTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJsb3dlciIpKSB7CgkgICAgICAgICAgcGFyYW0ubG93ZXIgPSAtSW5maW5pdHk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHBhcmFtLmhhc093blByb3BlcnR5KCJpbml0IikpIHsKCSAgICAgICAgICAvLyBJZiB0aGlzIGlzIGp1c3QgYSBudW1iZXIgb3IgYSBuZXN0ZWQgYXJyYXkgd2UgbGVhdmUgaXQgYWxvbmUsIGJ1dCBpZi4uLgoJICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgdHlwZW9mIHBhcmFtLmluaXQgPT09ICJmdW5jdGlvbiIpIHsKCSAgICAgICAgICAgIC8vIHBhcmFtLmluaXQgaXMgYSBmdW5jdGlvbiwgdXNlIHRoYXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVyLgoJICAgICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtLmluaXQoKTsKCSAgICAgICAgICB9IGVsc2UgaWYgKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHsKCSAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlciB3aGVyZSB0aGUgcGFyYW0uaW5pdCBleGlzdCBidXQKCSAgICAgICAgICAgIC8vIGlzIG5vdCBhbiBhcnJheS4gVGhlbiBhc3N1bWUgaXQgaXMgYSBudW1iZXIgb3IgYSBmdW5jdGlvbiBhbmQgdXNlCgkgICAgICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuCgkgICAgICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgcGFyYW0uaW5pdCk7CgkgICAgICAgICAgfQoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIFdlIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KCSAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CgkgICAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwoJICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgICByZXR1cm4gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwoJICAgICAgICAgICAgfSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgkgICAgICByZXR1cm4gcGFyYW1zOwoJICAgIH07CgoJICAgIC8vLy8vLy8vLy8gU3RlcHBlciBGdW5jdGlvbnMgLy8vLy8vLy8vLy8KCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIC8qKgoJICAgICAqIEBpbnRlcmZhY2UKCSAgICAgKiBBIFN0ZXBwZXIgaXMgYW4gb2JqZWN0IHJlc3BvbnNpYmxlIGZvciBwdXNoaW5nIGFyb3VuZCBvbmUKCSAgICAgKiBvciBtb3JlIHBhcmFtZXRlciB2YWx1ZXMgaW4gYSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGRpc3RyaWJ1dGlvbgoJICAgICAqIGRlZmluZWQgYnkgdGhlIGxvZyBwb3N0ZXJpb3IuIFRoaXMgZGVmaW5lcyB0aGUgU3RlcHBlciAiaW50ZXJmYWNlIiwKCSAgICAgKiB3aGVyZSAiaW50ZXJmYWNlIiBtZWFucyB0aGF0IFN0ZXBwZXIgZGVmaW5lcyBhIGNsYXNzIHRoYXQgaXMgbmV2ZXIKCSAgICAgKiBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBqdXN0IHRvIGJlIHN1YmNsYXNzZWQgYnkgc3BlY2lhbGl6ZWQKCSAgICAgKiBzdGVwcGVyIGZ1bmN0aW9ucy4KCSAgICAgKiBAaW50ZXJmYWNlCgkgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6CgkgICAgICogICB7Im11IjogeyAidHlwZSI6ICJyZWFsIiwgImRpbSI6IFsxXSwgInVwcGVyIjogSW5maW5pdHksIAoJICAgICAqICAgImxvd2VyIjogLUluZmluaXR5LCAiaW5pdCI6IDAuNSB9fQoJICAgICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUgImNvbXBsZXRlIiwgdGhhdCBpcywKCSAgICAgKiAgIHNwZWNpZnlpbmcgYWxsIHJlbGV2YW50IGF0dHJpYnV0ZXMgc3VjaCBhcyBkaW0sIGxvd2VyIGFuZCB1cHBlci4KCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMgaW4gcGFyYW1zCgkgICAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzCgkgICAgICogICBhcyBzY2FsYXJzIG9yLCBwb3NzaWJseSBuZXN0ZWQsIGFycmF5cy4gRm9yIGV4YW1wbGU6CgkgICAgICogICB7bXU6IDEwLCBzaWdtYTogNSwgYmV0YTogWzEsIDIuNV19CgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGUKCSAgICAgKiAgIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFRoYXQgaXMsIHRoZSB2YWx1ZSBvZiBsb2dfcG9zdAoJICAgICAqICAgc2hvdWxkIGNoYW5nZSBpZiB0aGUgdGhlIHZhbHVlcyBpbiBzdGF0ZSBhcmUgY2hhbmdlZC4KCSAgICAKCSAgICAgKi8KCSAgICB2YXIgU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCkgewoJICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CgkgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CgkgICAgICB0aGlzLmxvZ19wb3N0ID0gbG9nX3Bvc3Q7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogVGFrZXMgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuIFNob3VsZCByZXR1cm4gdGhlIG5ldyBzdGF0ZSwKCSAgICAgKiBidXQgaXMgbWFpbmx5IGNhbGxlZCBmb3IgaXQncyBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgYSBjaGFuZ2UgaW4gdGhlCgkgICAgICogc3RhdGUgb2JqZWN0LgoJICAgICAqLwoJICAgIFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICB0aHJvdyAiRXZlcnkgU3RlcHBlciBuZWVkIHRvIGltcGxlbWVudCBzdGVwKCkiOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIElmIGltcGxlbWVudGVkLCBtYWtlcyB0aGUgc3RlcHBlciBhZGFwdCB3aGlsZSBzdGVwcGluZy4KCSAgICAgKi8KCSAgICBTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gT3B0aW9uYWwsIHNvbWUgc3RlcHBlcnMgbWlnaHQgbm90IGJlIGFkYXB0aXZlLiAqLyAKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgY2Vhc2UgYWRhcHRpbmcgd2hpbGUgc3RlcHBpbmcuCgkgICAgICovCgkgICAgU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gT3B0aW9uYWwsIHNvbWUgc3RlcHBlcnMgbWlnaHQgbm90IGJlIGFkYXB0aXZlLiAqLyAKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluZyBpbmZvIHJlZ2FyZGluZyB0aGUgc3RlcHBlci4KCSAgICAgKi8KCSAgICBTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgc3RlcHBlci4KCSAgICAgIHJldHVybiB7fTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluCgkgICAgICogdGhlIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiAiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQyIKCSAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLgoJICAgICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi4KCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAgKiBAcGFyYW0gZ2VuZXJhdGVfcHJvcG9zYWwgLSBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHByb3Bvc2FsIChhcyBhIG51bWJlcikKCSAgICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhCgkgICAgICogbnVtYmVyIGFuZCBsb2dfc2NhbGUgZGVmaW5lcyB0aGUgc2NhbGUgb2YgdGhlIHByb3Bvc2FsIHNvbWVob3cuCgkgICAgKi8KCSAgICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGdlbmVyYXRlX3Byb3Bvc2FsKSB7CgkgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCAhPSAxKSB7CgkgICAgICAgIHRocm93ICJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBjYW4gb25seSBoYW5kbGUgb25lIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CgkgICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdOwoJICAgICAgaWYgKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKCSAgICAgICAgdGhyb3cgIk9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIGNhbiBvbmx5IGhhbmRsZSBvbmUgb25lLWRpbWVuc2lvbmFsIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyOwoJICAgICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyOwoJICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSA9IGdldF9vcHRpb24oInByb3BfbG9nX3NjYWxlIiwgb3B0aW9ucywgMCk7CgkgICAgICB0aGlzLmJhdGNoX3NpemUgPSBnZXRfb3B0aW9uKCJiYXRjaF9zaXplIiwgb3B0aW9ucywgNTApOwoJICAgICAgdGhpcy5tYXhfYWRhcHRhdGlvbiA9IGdldF9vcHRpb24oIm1heF9hZGFwdGF0aW9uIiwgb3B0aW9ucywgMC4zMyk7CgkgICAgICB0aGlzLmluaXRpYWxfYWRhcHRhdGlvbiA9IGdldF9vcHRpb24oImluaXRpYWxfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIDEuMCk7CgkgICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSA9IGdldF9vcHRpb24oInRhcmdldF9hY2NlcHRfcmF0ZSIsIG9wdGlvbnMsIDAuNDQpOwoJICAgICAgdGhpcy5pc19hZGFwdGluZyA9IGdldF9vcHRpb24oImlzX2FkYXB0aW5nIiwgb3B0aW9ucywgdHJ1ZSk7CgkgICAgICB0aGlzLmdlbmVyYXRlX3Byb3Bvc2FsID0gZ2VuZXJhdGVfcHJvcG9zYWw7CgkgICAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwOwoJICAgICAgdGhpcy5iYXRjaF9jb3VudCA9IDA7CgkgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gPSAwOwoJICAgIH07CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT25lZGltTWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICB2YXIgcGFyYW1fc3RhdGUgPSB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07CgkgICAgICB2YXIgcGFyYW1fcHJvcG9zYWwgPSB0aGlzLmdlbmVyYXRlX3Byb3Bvc2FsKHBhcmFtX3N0YXRlLCB0aGlzLnByb3BfbG9nX3NjYWxlKTsKCSAgICAgIGlmIChwYXJhbV9wcm9wb3NhbCA8IHRoaXMubG93ZXIgfHwgcGFyYW1fcHJvcG9zYWwgPiB0aGlzLnVwcGVyKSA7IGVsc2UgewoJICAgICAgICAvLyBtYWtlIGEgTWV0cm9wb2xpcyBzdGVwCgkgICAgICAgIHZhciBjdXJyX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwoJICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSBwYXJhbV9wcm9wb3NhbDsKCSAgICAgICAgdmFyIHByb3BfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CgkgICAgICAgIHZhciBhY2NlcHRfcHJvYiA9IE1hdGguZXhwKHByb3BfbG9nX2RlbnMgLSBjdXJyX2xvZ19kZW5zKTsKCSAgICAgICAgaWYgKGFjY2VwdF9wcm9iID4gTWF0aC5yYW5kb20oKSkgewoJICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWwKCSAgICAgICAgICBpZiAodGhpcy5pc19hZGFwdGluZykgdGhpcy5hY2NlcHRhbmNlX2NvdW50Kys7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbQoJICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3N0YXRlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5pc19hZGFwdGluZykgewoJICAgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24rKzsKCSAgICAgICAgaWYgKHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA+PSB0aGlzLmJhdGNoX3NpemUpIHsKCSAgICAgICAgICAvLyB0aGVuIGFkYXB0CgkgICAgICAgICAgdGhpcy5iYXRjaF9jb3VudCsrOwoJICAgICAgICAgIHZhciBsb2dfc2RfYWRqdXN0bWVudCA9IE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uIC8gTWF0aC5zcXJ0KHRoaXMuYmF0Y2hfY291bnQpKTsKCSAgICAgICAgICBpZiAodGhpcy5hY2NlcHRhbmNlX2NvdW50IC8gdGhpcy5iYXRjaF9zaXplID4gdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUpIHsKCSAgICAgICAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgKz0gbG9nX3NkX2FkanVzdG1lbnQ7CgkgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgLT0gbG9nX3NkX2FkanVzdG1lbnQ7CgkgICAgICAgICAgfQoJICAgICAgICAgIHRoaXMuYWNjZXB0YW5jZV9jb3VudCA9IDA7CgkgICAgICAgICAgdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID0gMDsKCSAgICAgICAgfQoJICAgICAgfQoJICAgICAgcmV0dXJuIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXTsKCSAgICB9OwoJICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgdGhpcy5pc19hZGFwdGluZyA9IHRydWU7CgkgICAgfTsKCSAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgdGhpcy5pc19hZGFwdGluZyA9IGZhbHNlOwoJICAgIH07CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CgkgICAgICByZXR1cm4gewoJICAgICAgICBwcm9wX2xvZ19zY2FsZTogdGhpcy5wcm9wX2xvZ19zY2FsZSwKCSAgICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsCgkgICAgICAgIGFjY2VwdGFuY2VfY291bnQ6IHRoaXMuYWNjZXB0YW5jZV9jb3VudCwKCSAgICAgICAgaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbjogdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uLAoJICAgICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudAoJICAgICAgfTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYSBOb3JtYWwgcHJvcG9zYWwuCgkgICAgICovCgkgICAgdmFyIG5vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uIChwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHsKCSAgICAgIHJldHVybiBybm9ybShwYXJhbV9zdGF0ZSwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAYXVnbWVudHMge09uZWRpbU1ldHJvcG9saXNTdGVwcGVyfQoJICAgICAqIEEgInN1YmNsYXNzIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuCgkgICAgICovCgkgICAgdmFyIFJlYWxNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewoJICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgbm9ybWFsX3Byb3Bvc2FsKTsKCSAgICB9OwoJICAgIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjsKCgkgICAgLyoqCgkgICAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGlzY3JldGl6ZWQgTm9ybWFsIHByb3Bvc2FsLgoJICAgICAqLwoJICAgIHZhciBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbiAocGFyYW1fc3RhdGUsIHByb3BfbG9nX3NjYWxlKSB7CgkgICAgICByZXR1cm4gTWF0aC5yb3VuZChybm9ybShwYXJhbV9zdGF0ZSwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKSk7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgKiBAY2xhc3MKCSAgICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9CgkgICAgKiBBICJzdWJjbGFzcyIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuCgkgICAgKi8KCSAgICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCk7CgkgICAgfTsKCSAgICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgSW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50TWV0cm9wb2xpc1N0ZXBwZXI7CgoJICAgIC8qKgoJICAgICAqIEBjbGFzcwoJICAgICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfQoJICAgICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBtZXRyb3BvbGlzIHN0ZXAgaW4KCSAgICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgoJICAgICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkgZm9yIHBvc3NpYmx5IG11bHRpZGltZW5zaW9uYWwgYXJyYXlzLiBUaGF0CgkgICAgICogaXMsIGluc3RlYWQgb2YganVzdCB0YWtpbmcgYSBzdGVwIGZvciBhIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIgbGlrZSAKCSAgICAgKiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciwgdGhpcyBTdGVwcGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgc3RlcHMgCgkgICAgICogZm9yIGEgbXVsdGlkaW1lbnNpb25hbCBhcnJheS4gSXQncyBzdGlsbCBwcmV0dHkgZHVtYiBhbmQganVzdCB0YWtlcwoJICAgICAqIG9uZS1kaW1lbnNpb25hbCBzdGVwcyBmb3IgZWFjaCBwYXJhbWV0ZXIgY29tcG9uZW50LCB0aG91Z2guCgkgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uIGZvciBhIAoJICAgICAqICAgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuCgkgICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgoJICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKCSAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCgkgICAgICogQHBhcmFtIFN1YlN0ZXBwZXIgLSBhIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSBvZiBvbmUgZGltZW5zaW9uYWwgU3RlcHBlciB0byBhcHBseSBvbgoJICAgICAqICAgYWxsIHRoZSBjb21wb25lbnRzIG9mIHRoZSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci4KCSAgICAqLwoJICAgIHZhciBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBTdWJTdGVwcGVyKSB7CgkgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCAhPSAxKSB7CgkgICAgICAgIHRocm93ICJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CgkgICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdOwoJICAgICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyOwoJICAgICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyOwoJICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07CgkgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlID0gZ2V0X211bHRpZGltX29wdGlvbigicHJvcF9sb2dfc2NhbGUiLCBvcHRpb25zLCB0aGlzLmRpbSwgMCk7CgkgICAgICB0aGlzLmJhdGNoX3NpemUgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJiYXRjaF9zaXplIiwgb3B0aW9ucywgdGhpcy5kaW0sIDUwKTsKCSAgICAgIHRoaXMubWF4X2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJtYXhfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIHRoaXMuZGltLCAwLjMzKTsKCSAgICAgIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uID0gZ2V0X211bHRpZGltX29wdGlvbigiaW5pdGlhbF9hZGFwdGF0aW9uIiwgb3B0aW9ucywgdGhpcy5kaW0sIDEuMCk7CgkgICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oInRhcmdldF9hY2NlcHRfcmF0ZSIsIG9wdGlvbnMsIHRoaXMuZGltLCAwLjQ0KTsKCSAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJpc19hZGFwdGluZyIsIG9wdGlvbnMsIHRoaXMuZGltLCB0cnVlKTsKCgkgICAgICAvLyBUaGlzIGhhY2sgYmVsb3cgaXMgYSByZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFycmF5IG9mIAoJICAgICAgLy8gb25lIGRpbWVuc2lvbmFsIHN0ZXBwZXJzIGFjY29yZGluZyB0byBkaW0uCgkgICAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gZnVuY3Rpb24gKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZSwgYmF0Y2hfc2l6ZSwgbWF4X2FkYXB0YXRpb24sIGluaXRpYWxfYWRhcHRhdGlvbiwgdGFyZ2V0X2FjY2VwdF9yYXRlLCBpc19hZGFwdGluZykgewoJICAgICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTsKCSAgICAgICAgaWYgKGRpbS5sZW5ndGggPT09IDEpIHsKCSAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CgkgICAgICAgICAgICB2YXIgc3Vib3B0aW9ucyA9IHsKCSAgICAgICAgICAgICAgcHJvcF9sb2dfc2NhbGU6IHByb3BfbG9nX3NjYWxlW2ldLAoJICAgICAgICAgICAgICBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLAoJICAgICAgICAgICAgICBtYXhfYWRhcHRhdGlvbjogbWF4X2FkYXB0YXRpb25baV0sCgkgICAgICAgICAgICAgIGluaXRpYWxfYWRhcHRhdGlvbjogaW5pdGlhbF9hZGFwdGF0aW9uW2ldLAoJICAgICAgICAgICAgICB0YXJnZXRfYWNjZXB0X3JhdGU6IHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwKCSAgICAgICAgICAgICAgaXNfYWRhcHRpbmc6IGlzX2FkYXB0aW5nW2ldCgkgICAgICAgICAgICB9OwoJICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307CgkgICAgICAgICAgICBzdWJwYXJhbVtpXSA9IGRlZXBfY2xvbmUocGFyYW0pOwoJICAgICAgICAgICAgc3VicGFyYW1baV0uZGltID0gWzFdOyAvLyBBcyB0aGlzIHNob3VsZCBub3cgYmUgYSBvbmUtZGltIHBhcmFtZXRlcgoJICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWQKCSAgICAgICAgICAgIHN1YnN0ZXBwZXJzW2ldID0gbmV3IFN1YlN0ZXBwZXIoc3VicGFyYW0sIHN1YnN0YXRlLCBsb2dfcG9zdCwgc3Vib3B0aW9ucyk7CgkgICAgICAgICAgfQoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIHN1YnN0ZXBwZXJzW2ldID0gY3JlYXRlX3N1YnN0ZXBwZXJzKGRpbS5zbGljZSgxKSwgc3Vic3RhdGVbaV0sIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZVtpXSwgYmF0Y2hfc2l6ZVtpXSwgbWF4X2FkYXB0YXRpb25baV0sIGluaXRpYWxfYWRhcHRhdGlvbltpXSwgdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZ1tpXSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyczsKCSAgICAgIH07CgkgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QsIHRoaXMucHJvcF9sb2dfc2NhbGUsIHRoaXMuYmF0Y2hfc2l6ZSwgdGhpcy5tYXhfYWRhcHRhdGlvbiwgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24sIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlLCB0aGlzLmlzX2FkYXB0aW5nKTsKCSAgICB9OwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS4KCSAgICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLnN0ZXAoKTsKCSAgICAgIH0pOwoJICAgIH07CgkgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewoJICAgICAgICBzdWJzdGVwcGVyLnN0YXJ0X2FkYXB0YXRpb24oKTsKCSAgICAgIH0pOwoJICAgIH07CgkgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHN1YnN0ZXBwZXIuc3RvcF9hZGFwdGF0aW9uKCk7CgkgICAgICB9KTsKCSAgICB9OwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CgkgICAgICByZXR1cm4gbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLmluZm8oKTsKCSAgICAgIH0pOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIEBjbGFzcwoJICAgICAqIEBhdWdtZW50cyB7TXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcn0KCSAgICAgKiBBICJzdWJjbGFzcyIgb2YgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuCgkgICAgICovCgkgICAgdmFyIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFJlYWxNZXRyb3BvbGlzU3RlcHBlcik7CgkgICAgfTsKCSAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsKCSAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKCgkgICAgLyoqCgkgICAgICogQGNsYXNzCgkgICAgICogQGF1Z21lbnRzIHtNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyfQoJICAgICAqIEEgInN1YmNsYXNzIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLgoJICAgICAqLwoJICAgIHZhciBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIEludE1ldHJvcG9saXNTdGVwcGVyKTsKCSAgICB9OwoJICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBhIHN0ZXAgZm9yIGEgYmluYXJ5IHBhcmFtZXRlci4KCSAgICAgKiBUaGlzIGlzIGRvbmUgYnkgZXZhbHVhdGluZyB0aGUgbG9nIHBvc3RlcmlvciBmb3IgYm90aCBzdGF0ZXMgb2YgdGhlCgkgICAgICogcGFyYW1ldGVyIGFuZCB0aGVuIHNlbGVjdGluZyBhIHN0YXRlIHJhbmRvbWx5IHdpdGggcHJvYmFiaWxpdHkgcmVsYXRpdmUgCgkgICAgICogdG8gdGhlIHBvc3RlcmlvciBvZiBlYWNoIHN0YXRlLgoJICAgICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi4KCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAqLwoJICAgIHZhciBCaW5hcnlTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCA9PSAxKSB7CgkgICAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdGhyb3cgIkJpbmFyeVN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLiI7CgkgICAgICB9CgkgICAgfTsKCSAgICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5U3RlcHBlcjsKCSAgICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewoJICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDsKCSAgICAgIHZhciB6ZXJvX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwoJICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMTsKCSAgICAgIHZhciBvbmVfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CgkgICAgICB2YXIgbWF4X2xvZ19kZW5zID0gTWF0aC5tYXgoemVyb19sb2dfZGVucywgb25lX2xvZ19kZW5zKTsKCSAgICAgIHplcm9fbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zOwoJICAgICAgb25lX2xvZ19kZW5zIC09IG1heF9sb2dfZGVuczsKCSAgICAgIHZhciB6ZXJvX3Byb2IgPSBNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zIC0gTWF0aC5sb2coTWF0aC5leHAoemVyb19sb2dfZGVucykgKyBNYXRoLmV4cChvbmVfbG9nX2RlbnMpKSk7CgkgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikgewoJICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSAwOwoJICAgICAgICByZXR1cm4gMDsKCSAgICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC4KCSAgICAgIHJldHVybiAxOwoJICAgIH07CgoJICAgIC8qKgoJICAgICogQGNsYXNzCgkgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAqIEp1c3QgbGlrZSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIHRoaXMgU3RlcHBlciB0YWtlcyBhIHN0ZXBzIGZvcgoJICAgICogYSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlciBieSB1cGRhdGluZyBlYWNoIGNvbXBvbmVudCBpbiB0dXJuLiBUaGUgZGlmZmVyZW5jZQoJICAgICogaXMgdGhhdCB0aGlzIHN0ZXBwZXIgd29ya3Mgb24gYmluYXJ5IHBhcmFtZXRlcnMuCgkgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgCgkgICAgKiAgIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyLgoJICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgoJICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLgoJICAgICovCgkgICAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7CgkgICAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgkgICAgICBpZiAocGFyYW1fbmFtZXMubGVuZ3RoID09IDEpIHsKCSAgICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CgkgICAgICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07CgkgICAgICAgIHRoaXMuZGltID0gcGFyYW0uZGltOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdGhyb3cgIkJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLiI7CgkgICAgICB9CgkgICAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gZnVuY3Rpb24gKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0KSB7CgkgICAgICAgIHZhciBzdWJzdGVwcGVycyA9IFtdOwoJICAgICAgICB2YXIgaTsKCSAgICAgICAgaWYgKGRpbS5sZW5ndGggPT09IDEpIHsKCSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTsKCSAgICAgICAgICAgIHN1YnBhcmFtc1tpXSA9IHBhcmFtOwoJICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBuZXcgQmluYXJ5U3RlcHBlcihzdWJwYXJhbXMsIHN1YnN0YXRlLCBsb2dfcG9zdCk7CgkgICAgICAgICAgfQoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewoJICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QpOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gc3Vic3RlcHBlcnM7CgkgICAgICB9OwoJICAgICAgdGhpcy5zdWJzdGVwcGVycyA9IGNyZWF0ZV9zdWJzdGVwcGVycyh0aGlzLmRpbSwgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdLCB0aGlzLmxvZ19wb3N0KTsKCSAgICB9OwoJICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlDb21wb25lbnRTdGVwcGVyOwoJICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS4KCSAgICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLnN0ZXAoKTsKCSAgICAgIH0pOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIEBjbGFzcwoJICAgICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfQoJICAgICAqIFRoaXMgc3RlcHBlciBjYW4gYmUgcmVzcG9uc2libGUgZm9yIHRha2luZyBhIHN0ZXAgZm9yIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMuCgkgICAgICogRm9yIHJlYWwgYW5kIGludCBwYXJhbWV0ZXJzIGl0IHRha2VzIE1ldHJvcG9saXMgd2l0aGluIEdpYmJzIHN0ZXBzLCBhbmQgZm9yIAoJICAgICAqIGJpbmFyeSBwYXJhbWV0ZXJzIGl0IGRvZXMgZXZhbHVhdGVzIHRoZSBwb3N0ZXJpb3IgZm9yIGJvdGggcGFyYW10ZXIgdmFsdWVzIGFuZAoJICAgICAqIHJhbmRvbWx5IGNoYW5nZXMgdG8gYSBjZXJ0YWluIHZhbHVlIHByb3BvcnRpb25hbGx5IHRvIHRoYXQgdmFsdWUncyBwb3N0ZXJpb3IKCSAgICAgKiAodGhpcyBpcyBhbHNvIGRvbmUgZm9yIGVhY2ggcGFyYW1ldGVyLCBzbyBhbHNvIGEgKiB3aXRoaW4gR2liYnMgYXBwcm9hY2gpLgoJICAgICAqIFRoaXMgc3RlcHBlciBpcyBhbHNvIGFkYXB0aXZlIGFuZCBjYW4gYmUgZWZmaWNpZW50IHdoZW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCgkgICAgICogYXJlIG5vdCB0b28gaGlnaCBhbmQgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHBhcmFtZXRlcnMgYXJlIGxvdy4KCSAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMKCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAqLwoJICAgIHZhciBBbXdnU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewoJICAgICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTsKCSAgICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgkgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gW107CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1fbmFtZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dOwoJICAgICAgICB2YXIgU2VsZWN0U3RlcHBlcjsKCSAgICAgICAgc3dpdGNoIChwYXJhbS50eXBlKSB7CgkgICAgICAgICAgY2FzZSAicmVhbCI6CgkgICAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CgkgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICBjYXNlICJpbnQiOgoJICAgICAgICAgICAgaWYgKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gSW50TWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgIGNhc2UgImJpbmFyeSI6CgkgICAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CgkgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyOwoJICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICBkZWZhdWx0OgoJICAgICAgICAgICAgdGhyb3cgIkFtd2dTdGVwcGVyIGNhbid0IGhhbmRsZSBwYXJhbWV0ZXIgIiArIHRoaXMucGFyYW1fbmFtZXNbaV0gKyAiIHdpdGggdHlwZSAiICsgcGFyYW0udHlwZTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgcGFyYW1fb2JqZWN0X3dyYXAgPSB7fTsKCSAgICAgICAgcGFyYW1fb2JqZWN0X3dyYXBbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSBwYXJhbTsKCSAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgkgICAgICAgIHZhciBwYXJhbV9vcHRpb25zID0gb3B0aW9ucy5wYXJhbXMgJiYgb3B0aW9ucy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV0gfHwge307CgkgICAgICAgIHBhcmFtX29wdGlvbnMucHJvcF9sb2dfc2NhbGUgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlIHx8IG9wdGlvbnMucHJvcF9sb2dfc2NhbGU7CgkgICAgICAgIHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSA9IHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSB8fCBvcHRpb25zLmJhdGNoX3NpemU7CgkgICAgICAgIHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gPSBwYXJhbV9vcHRpb25zLm1heF9hZGFwdGF0aW9uIHx8IG9wdGlvbnMubWF4X2FkYXB0YXRpb247CgkgICAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247CgkgICAgICAgIHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlID0gcGFyYW1fb3B0aW9ucy50YXJnZXRfYWNjZXB0X3JhdGUgfHwgb3B0aW9ucy50YXJnZXRfYWNjZXB0X3JhdGU7CgkgICAgICAgIHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgPSBwYXJhbV9vcHRpb25zLmlzX2FkYXB0aW5nIHx8IG9wdGlvbnMuaXNfYWRhcHRpbmc7CgkgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0gPSBuZXcgU2VsZWN0U3RlcHBlcihwYXJhbV9vYmplY3Rfd3JhcCwgc3RhdGUsIGxvZ19wb3N0LCBwYXJhbV9vcHRpb25zKTsKCSAgICAgIH0KCSAgICB9OwoJICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFtd2dTdGVwcGVyOwoJICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewoJICAgICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykgewoJICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0ZXAoKTsKCSAgICAgIH0KCSAgICAgIHJldHVybiB0aGlzLnN0YXRlOwoJICAgIH07CgkgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGFydF9hZGFwdGF0aW9uKCk7CgkgICAgICB9CgkgICAgfTsKCSAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7CgkgICAgICB9CgkgICAgfTsKCSAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHZhciBpbmZvID0ge307CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgaW5mb1t0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMuc3Vic3RlcHBlcnNbaV0uaW5mbygpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGluZm87CgkgICAgfTsKCgkgICAgLy8vLy8vLy8vLy8gU2FtcGxlciBGdW5jdGlvbnMgLy8vLy8vLy8vLwoJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgLyoqCgkgICAgKiBAaW50ZXJmYWNlCgkgICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYQoJICAgIC8vIFNhbXBsZXIgaXMgaGVyZSBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIHdoZXJlIGFuIGluc3RhbmNlIG9mIFNhbXBsZXIKCSAgICAvLyBzZXRzIHVwIHRoZSBTdGVwcGVycywgY2hlY2tzIHRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiwKCSAgICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyICJpbnRlcmZhY2UiLgoJICAgICogQGludGVyZmFjZQoJICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6CgkgICAgKiAgIHsibXUiOiB7InR5cGUiOiAicmVhbCJ9LCAic2lnbWEiOiB7InR5cGUiOiAicmVhbCIsICJsb3dlciIgPSAwfX0KCSAgICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBkb2Vzbid0IGhhdmUgdG8gYmUgImNvbXBsZXRlIiBhbmQgcHJvcGVydGllcwoJICAgICogICBsZWZ0IG91dCAobGlrZSBsb3dlciBhbmQgdXBwZXIpIHdpbGwgYmUgZmlsbGVkIGluIGJ5IGRlZmF1bHRzLgoJICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmUKCSAgICAqICAgc3RhdGUgd2lsbCBiZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSB3aXRoIGVhY2ggcGFyYW1ldGVyIGFzIGEgCgkgICAgKiAgIGtleSBhbmQgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYXMgbnVtYmVycyBvciBhcnJheXMuIEZvciBleGFtcGxlOgoJICAgICogICB7Im11IjogMywgInNpZ21hIjogMS41fS4gVGhlIGRhdGEgYXJndW1lbnQgd2lsbCBiZSB0aGUgc2FtZSBvYmplY3QgYXMgCgkgICAgKiAgIHRoZSBkYXRhIGFyZ3VtZW50IGdpdmVuIGJlbG93LgoJICAgICogQHBhcmFtIGRhdGEgLSBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24KCSAgICAqICAgd2hlbiBzYW1wbGluZy4KCSAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc2FtcGxlci4KCSAgICAqLwoJICAgIHZhciBTYW1wbGVyID0gZnVuY3Rpb24gKHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpIHsKCSAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwoJICAgICAgdGhpcy5kYXRhID0gZGF0YTsKCSAgICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgoJICAgICAgLy8gU2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgaWYgbm90IHBhc3NlZCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdAoJICAgICAgdGhpcy5wYXJhbV9pbml0X2Z1biA9IGdldF9vcHRpb24oInBhcmFtX2luaXRfZnVuIiwgb3B0aW9ucywgcGFyYW1faW5pdF9maXhlZCk7CgkgICAgICB2YXIgdGhpbm5pbmdfaW50ZXJ2YWwgPSBnZXRfb3B0aW9uKCJ0aGluIiwgb3B0aW9ucywgMSk7CgkgICAgICB2YXIgcGFyYW1zX3RvX21vbml0b3IgPSBnZXRfb3B0aW9uKCJtb25pdG9yIiwgb3B0aW9ucywgbnVsbCk7CgkgICAgICB0aGlzLnRoaW4odGhpbm5pbmdfaW50ZXJ2YWwpOwoJICAgICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTsKCSAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgICAvLyBDb21wbGV0aW5nIHRoZSBwYXJhbXMgYW5kIGluaXRpYWxpemluZyB0aGUgc3RhdGUuCgkgICAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7CgkgICAgICB2YXIgc3RhdGUgPSB7fTsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbV9uYW1lcy5sZW5ndGg7IGkrKykgewoJICAgICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7CgkgICAgICB9CgkgICAgICB0aGlzLmxvZ19wb3N0ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpOwoJICAgICAgfTsKCSAgICAgIC8vIFJ1bm5pbmcgdGhlIGxvZ19wb3N0IGZ1bmN0aW9uIG9uY2UgaW4gY2FzZSBpdCBmdXJ0aGVyIG1vZGlmaWVzIHRoZSBzdGF0ZQoJICAgICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy4KCSAgICAgIHRoaXMubG9nX3Bvc3QoKTsKCSAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKCSAgICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpOwoJICAgIH07CgoJICAgIC8qKiBTaG91bGQgcmV0dXJuIGEgdmVjdG9yIG9mIHN0ZXBwZXJzIHRoYXQgd2hlbiBjYWxsZWQgCgkgICAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbiAoc3RhdGUsIGxvZ19wb3N0KSB7CgkgICAgICB0aHJvdyAiRXZlcnkgU2FtcGxlciBuZWVkcyB0byBpbXBsZW1lbnQgY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUoKSI7CgkgICAgfTsKCgkgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIFNhbXBsZXIuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHJldHVybiB7CgkgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLAoJICAgICAgICB0aGluOiB0aGlzLnRoaW4sCgkgICAgICAgIG1vbml0b3I6IHRoaXMubW9uaXRvciwKCSAgICAgICAgc3RlcHBlcnM6IHRoaXMuc3RlcHBlcnMKCSAgICAgIH07CgkgICAgfTsKCgkgICAgLyoqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBSZXR1cm5zIHRoZSBuZXcgc3BhY2UKCSAgICAgKiBidXQgYWxzbyBtb2RpZmllcyB0aGUgc3RhdGUgaW4gcGxhY2UuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdGVwcGVycyk7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdGhpcy5zdGVwcGVyc1tpXS5zdGVwKCk7CgkgICAgICB9CgkgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zdGF0ZSkubGVuZ3RoID4gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpLmxlbmd0aCkgewoJICAgICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2UKCSAgICAgICAgLy8gbmVlZCB0byBydW4gdGhlIGxvZ19wb3N0IG9uY2UgbW9yZSBpbiBvcmRlciB0byBzZXQgdGhlIGRlcml2ZWQgcXVhbnRpdGllcwoJICAgICAgICAvLyBmb3IgdGhlIGZpbmFsIHBhcmFtZXRlciBzdGF0ZQoJICAgICAgICB0aGlzLmxvZ19wb3N0KCk7CgkgICAgICB9CgkgICAgICByZXR1cm4gdGhpcy5zdGF0ZTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBUYWtlcyBuX2l0ZXJhdGlvbnMgc3RlcHMgaW4gdGhlIHBhcmFtZXRlciBzcGFjZSBhbmQgcmV0dXJucyB0aGVtCgkgICAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZToKCSAgICAgKiB7bXU6IFsxLCAtMSwgMiwgMywgLi4uXSwgc2lnbWE6IFsxLCAyLCAyLCAxLCAuLi5dfS4KCSAgICAgKiBJZiB0aGluIGlzID4gMSB0aGVuIG5faXRlcmF0aW9ucyAvIHRoaW4gc2FtcGxlcyBhcmUgcmV0dXJuZWQuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuc2FtcGxlID0gZnVuY3Rpb24gKG5faXRlcmF0aW9ucykgewoJICAgICAgLy8gSW5pdGlhbGl6aW5nIGN1cnJfc2FtcGxlIHdoZXJlIHRoZSBzYW1wbGUgaXMgZ29pbmcgdG8gYmUgc2F2ZWQKCSAgICAgIC8vIGFzIGFuIG9iamVjdCBjb250YWluaW5nIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyIHRvIGJlIG1vbml0b3JlZC4KCSAgICAgIHZhciBpLCBqLCBtb25pdG9yZWRfcGFyYW1zOwoJICAgICAgaWYgKHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9PT0gbnVsbCkgewoJICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gdGhpcy5tb25pdG9yZWRfcGFyYW1zOwoJICAgICAgfQoJICAgICAgdmFyIGN1cnJfc2FtcGxlID0ge307CgkgICAgICBmb3IgKGogPSAwOyBqIDwgbW9uaXRvcmVkX3BhcmFtcy5sZW5ndGg7IGorKykgewoJICAgICAgICBjdXJyX3NhbXBsZVttb25pdG9yZWRfcGFyYW1zW2pdXSA9IFtdOwoJICAgICAgfQoJICAgICAgZm9yIChpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7CgkgICAgICAgIGlmIChpICUgdGhpcy50aGlubmluZ19pbnRlcnZhbCA9PT0gMCkgewoJICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7CgkgICAgICAgICAgICB2YXIgcGFyYW0gPSBtb25pdG9yZWRfcGFyYW1zW2pdOwoJICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goY2xvbmVfcGFyYW1fZHJhdyh0aGlzLnN0YXRlW3BhcmFtXSkpOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0ZXAoKTsKCSAgICAgIH0KCSAgICAgIHJldHVybiBjdXJyX3NhbXBsZTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBUYWtlcyBuX2l0ZXJhdGlvbiBzdGVwcyBpbiBwYXJhbWV0ZXIgc3BhY2UgYnV0IHJldHVybnMgbm90aGluZy4KCSAgICAgKi8KCSAgICBTYW1wbGVyLnByb3RvdHlwZS5idXJuID0gZnVuY3Rpb24gKG5faXRlcmF0aW9ucykgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuX2l0ZXJhdGlvbnM7IGkrKykgewoJICAgICAgICB0aGlzLnN0ZXAoKTsKCSAgICAgIH0KCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBTZXRzIHdoYXQgcGFyYW1ldGVycyBzaG91bGQgYmUgbW9uaXRvcmVkIGFuZCByZXR1cm5lZCB3aGVuIGNhbGxpbmcKCSAgICAgKiBzYW1wbGUuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUubW9uaXRvciA9IGZ1bmN0aW9uIChwYXJhbXNfdG9fbW9uaXRvcikgewoJICAgICAgdGhpcy5tb25pdG9yZWRfcGFyYW1zID0gcGFyYW1zX3RvX21vbml0b3I7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogU2V0cyB0aGUgdGhpbm5pbmcuIEZvciBleGFtcGxlIHRoaW4gPT0gMTAgbWVhbnMgdGhhdCBldmVyeSAxMHRoIHBvc3RlcmlvcgoJICAgICAqIGRyYXcgd2lsbCBiZSBrZXB0LgoJICAgICAqLwoJICAgIFNhbXBsZXIucHJvdG90eXBlLnRoaW4gPSBmdW5jdGlvbiAodGhpbm5pbmdfaW50ZXJ2YWwpIHsKCSAgICAgIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPSB0aGlubmluZ19pbnRlcnZhbDsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBTZXRzIGFkYXB0YXRpb24gb24sIGlmIGFwcGxpY2FibGUsIGluIGFsbCBzdGVwcGVycy4KCSAgICAgKi8KCSAgICBTYW1wbGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RhcnRfYWRhcHRhdGlvbigpOwoJICAgICAgfQoJICAgIH07CgoJICAgIC8qKgoJICAgICogU2V0cyBhZGFwdGF0aW9uIG9mZiwgaWYgYXBwbGljYWJsZSwgaW4gYWxsIHN0ZXBwZXJzLgoJICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqCgkgICAgKiBAY2xhc3MKCSAgICAqIEBpbXBsZW1lbnRzIHtTYW1wbGVyfQoJICAgICogVGhpcyBzYW1wbGVyIHVzZXMgdGhlIEFtd2dTdGVwcGVyIGFzIHRoZSBzdGVwcGVyIGZ1bmN0aW9uIHdoaWNoIGltcGxlbWVudHMgdGhlIAoJICAgICogQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgoJICAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KS4gQW4gYWRpdGlvbiBpcyB0aGF0IGl0IGhhbmRsZXMgaW50IHBhcmFtZXRlcnMKCSAgICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgCgkgICAgKiB2YWx1ZSBwcm9wb3J0aW9uYWwgdG8gdGhlIHBvc3RlcmlvciBvZiB0aGUgdHdvIHBvc3NpYmxlIHN0YXRlcyBvZiB0aGUKCSAgICAqIHBhcmFtZXRlci4gVGhpcyBzYW1wbGVyIGNhbiBiZSBlZmZpY2llbnQgd2hlbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKCSAgICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuCgkgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMKCSAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KCSAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKCSAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAqLwoJICAgIHZhciBBbXdnU2FtcGxlciA9IGZ1bmN0aW9uIChwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7CgkgICAgICBTYW1wbGVyLmNhbGwodGhpcywgcGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucyk7CgkgICAgfTsKCSAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNhbXBsZXIucHJvdG90eXBlKTsKCSAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU2FtcGxlcjsKCSAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIHJldHVybiBbbmV3IEFtd2dTdGVwcGVyKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKV07CgkgICAgfTsKCgkgICAgLy8gUmV0dXJuaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgcHVibGljbHkgZXhwb3NlZCBieSB0aGlzIG1vZHVsZQoJICAgIHJldHVybiB7CgkgICAgICBydW5pZjogcnVuaWYsCgkgICAgICBydW5pZl9kaXNjcmV0ZTogcnVuaWZfZGlzY3JldGUsCgkgICAgICBybm9ybTogcm5vcm0sCgkgICAgICBwYXJhbV9pbml0X2ZpeGVkOiBwYXJhbV9pbml0X2ZpeGVkLAoJICAgICAgY29tcGxldGVfcGFyYW1zOiBjb21wbGV0ZV9wYXJhbXMsCgkgICAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwKCSAgICAgIEludE1ldHJvcG9saXNTdGVwcGVyOiBJbnRNZXRyb3BvbGlzU3RlcHBlciwKCSAgICAgIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOiBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciwKCSAgICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsCgkgICAgICBCaW5hcnlTdGVwcGVyOiBCaW5hcnlTdGVwcGVyLAoJICAgICAgQmluYXJ5Q29tcG9uZW50U3RlcHBlcjogQmluYXJ5Q29tcG9uZW50U3RlcHBlciwKCSAgICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwKCSAgICAgIEFtd2dTYW1wbGVyOiBBbXdnU2FtcGxlcgoJICAgIH07CgkgIH0pOwoJfSkobWNtYyk7Cgl2YXIgbWNtY0V4cG9ydHMgPSBtY21jLmV4cG9ydHM7CgoJZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHsKCSAgcmV0dXJuIGEgPT0gbnVsbCB8fCBiID09IG51bGwgPyBOYU4gOiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsKCX0KCglmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHsKCSAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkgewoJICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykgewoJICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkgewoJICAgICAgICB5aWVsZCB2YWx1ZTsKCSAgICAgIH0KCSAgICB9CgkgIH0gZWxzZSB7CgkgICAgbGV0IGluZGV4ID0gLTE7CgkgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7CgkgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7CgkgICAgICAgIHlpZWxkIHZhbHVlOwoJICAgICAgfQoJICAgIH0KCSAgfQoJfQoKCWZ1bmN0aW9uIGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUgPSBhc2NlbmRpbmcpIHsKCSAgaWYgKGNvbXBhcmUgPT09IGFzY2VuZGluZykgcmV0dXJuIGFzY2VuZGluZ0RlZmluZWQ7CgkgIGlmICh0eXBlb2YgY29tcGFyZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiY29tcGFyZSBpcyBub3QgYSBmdW5jdGlvbiIpOwoJICByZXR1cm4gKGEsIGIpID0+IHsKCSAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTsKCSAgICBpZiAoeCB8fCB4ID09PSAwKSByZXR1cm4geDsKCSAgICByZXR1cm4gKGNvbXBhcmUoYiwgYikgPT09IDApIC0gKGNvbXBhcmUoYSwgYSkgPT09IDApOwoJICB9OwoJfQoJZnVuY3Rpb24gYXNjZW5kaW5nRGVmaW5lZChhLCBiKSB7CgkgIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTsKCX0KCglmdW5jdGlvbiBtYXgodmFsdWVzLCB2YWx1ZW9mKSB7CgkgIGxldCBtYXg7CgkgIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHsKCSAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykgewoJICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKG1heCA8IHZhbHVlIHx8IG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkgewoJICAgICAgICBtYXggPSB2YWx1ZTsKCSAgICAgIH0KCSAgICB9CgkgIH0gZWxzZSB7CgkgICAgbGV0IGluZGV4ID0gLTE7CgkgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7CgkgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAobWF4IDwgdmFsdWUgfHwgbWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSB7CgkgICAgICAgIG1heCA9IHZhbHVlOwoJICAgICAgfQoJICAgIH0KCSAgfQoJICByZXR1cm4gbWF4OwoJfQoKCWZ1bmN0aW9uIG1pbih2YWx1ZXMsIHZhbHVlb2YpIHsKCSAgbGV0IG1pbjsKCSAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkgewoJICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7CgkgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAobWluID4gdmFsdWUgfHwgbWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSB7CgkgICAgICAgIG1pbiA9IHZhbHVlOwoJICAgICAgfQoJICAgIH0KCSAgfSBlbHNlIHsKCSAgICBsZXQgaW5kZXggPSAtMTsKCSAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHsKCSAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmIChtaW4gPiB2YWx1ZSB8fCBtaW4gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpIHsKCSAgICAgICAgbWluID0gdmFsdWU7CgkgICAgICB9CgkgICAgfQoJICB9CgkgIHJldHVybiBtaW47Cgl9CgoJLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcXVpY2tzZWxlY3QKCS8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uCglmdW5jdGlvbiBxdWlja3NlbGVjdChhcnJheSwgaywgbGVmdCA9IDAsIHJpZ2h0ID0gSW5maW5pdHksIGNvbXBhcmUpIHsKCSAgayA9IE1hdGguZmxvb3Ioayk7CgkgIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTsKCSAgcmlnaHQgPSBNYXRoLmZsb29yKE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIHJpZ2h0KSk7CgkgIGlmICghKGxlZnQgPD0gayAmJiBrIDw9IHJpZ2h0KSkgcmV0dXJuIGFycmF5OwoJICBjb21wYXJlID0gY29tcGFyZSA9PT0gdW5kZWZpbmVkID8gYXNjZW5kaW5nRGVmaW5lZCA6IGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUpOwoJICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7CgkgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkgewoJICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7CgkgICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxOwoJICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pOwoJICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7CgkgICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTsKCSAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpOwoJICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTsKCSAgICAgIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7CgkgICAgfQoJICAgIGNvbnN0IHQgPSBhcnJheVtrXTsKCSAgICBsZXQgaSA9IGxlZnQ7CgkgICAgbGV0IGogPSByaWdodDsKCSAgICBzd2FwKGFycmF5LCBsZWZ0LCBrKTsKCSAgICBpZiAoY29tcGFyZShhcnJheVtyaWdodF0sIHQpID4gMCkgc3dhcChhcnJheSwgbGVmdCwgcmlnaHQpOwoJICAgIHdoaWxlIChpIDwgaikgewoJICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qOwoJICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbaV0sIHQpIDwgMCkgKytpOwoJICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbal0sIHQpID4gMCkgLS1qOwoJICAgIH0KCSAgICBpZiAoY29tcGFyZShhcnJheVtsZWZ0XSwgdCkgPT09IDApIHN3YXAoYXJyYXksIGxlZnQsIGopO2Vsc2UgKytqLCBzd2FwKGFycmF5LCBqLCByaWdodCk7CgkgICAgaWYgKGogPD0gaykgbGVmdCA9IGogKyAxOwoJICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7CgkgIH0KCSAgcmV0dXJuIGFycmF5OwoJfQoJZnVuY3Rpb24gc3dhcChhcnJheSwgaSwgaikgewoJICBjb25zdCB0ID0gYXJyYXlbaV07CgkgIGFycmF5W2ldID0gYXJyYXlbal07CgkgIGFycmF5W2pdID0gdDsKCX0KCglmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHsKCSAgdmFsdWVzID0gRmxvYXQ2NEFycmF5LmZyb20obnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpKTsKCSAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjsKCSAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpOwoJICBpZiAocCA+PSAxKSByZXR1cm4gbWF4KHZhbHVlcyk7CgkgIHZhciBuLAoJICAgIGkgPSAobiAtIDEpICogcCwKCSAgICBpMCA9IE1hdGguZmxvb3IoaSksCgkgICAgdmFsdWUwID0gbWF4KHF1aWNrc2VsZWN0KHZhbHVlcywgaTApLnN1YmFycmF5KDAsIGkwICsgMSkpLAoJICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7CgkgIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApOwoJfQoKCWZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHsKCSAgcmV0dXJuIHF1YW50aWxlKHZhbHVlcywgMC41LCB2YWx1ZW9mKTsKCX0KCglmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkgewoJICB0aGlzLmsgPSBrOwoJICB0aGlzLnggPSB4OwoJICB0aGlzLnkgPSB5OwoJfQoJVHJhbnNmb3JtLnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSwKCSAgc2NhbGU6IGZ1bmN0aW9uIChrKSB7CgkgICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7CgkgIH0sCgkgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKHgsIHkpIHsKCSAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpOwoJICB9LAoJICBhcHBseTogZnVuY3Rpb24gKHBvaW50KSB7CgkgICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldOwoJICB9LAoJICBhcHBseVg6IGZ1bmN0aW9uICh4KSB7CgkgICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7CgkgIH0sCgkgIGFwcGx5WTogZnVuY3Rpb24gKHkpIHsKCSAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTsKCSAgfSwKCSAgaW52ZXJ0OiBmdW5jdGlvbiAobG9jYXRpb24pIHsKCSAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdOwoJICB9LAoJICBpbnZlcnRYOiBmdW5jdGlvbiAoeCkgewoJICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7CgkgIH0sCgkgIGludmVydFk6IGZ1bmN0aW9uICh5KSB7CgkgICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuazsKCSAgfSwKCSAgcmVzY2FsZVg6IGZ1bmN0aW9uICh4KSB7CgkgICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7CgkgIH0sCgkgIHJlc2NhbGVZOiBmdW5jdGlvbiAoeSkgewoJICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpOwoJICB9LAoJICB0b1N0cmluZzogZnVuY3Rpb24gKCkgewoJICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyB0aGlzLnggKyAiLCIgKyB0aGlzLnkgKyAiKSBzY2FsZSgiICsgdGhpcy5rICsgIikiOwoJICB9Cgl9OwoJVHJhbnNmb3JtLnByb3RvdHlwZTsKCgkvKgoJICBIVERNYXRoIFN0YXRpYyBDbGFzcyAtIE5vdCBpbnRlbmRlZCBmb3IgaW5zdGFudGlhdGlvbiEKCgkgIFZhcmlhYmxlczoKCSAgICBBID0gYW1vdW50CgkgICAgRCA9IGRlbGF5CgkgICAgViA9IHN1YmplY3RpdmUgdmFsdWUKCgkgICAgayA9IGRpc2NvdW50IGZhY3RvcgoKCSAgRXF1YXRpb25zOgoJICAgIFYgPSBBIC8gKDEgKyBrRCkKCSovCgljbGFzcyBIVERNYXRoIHsKCSAgc3RhdGljIGFkazJ2KGEsIGQsIGspIHsKCSAgICByZXR1cm4gYSAvICgxICsgayAqIGQpOwoJICB9CgkgIHN0YXRpYyBhZHYyayhhLCBkLCB2KSB7CgkgICAgcmV0dXJuIChhIC0gdikgLyAodiAqIGQpOwoJICB9Cgl9CgoJLy8gSW50ZXJuYWwgZGVwZW5kZW5jaWVzCgoJLyogZXNsaW50IG5vLXJlc3RyaWN0ZWQtZ2xvYmFsczogWyJvZmYiLCAic2VsZiJdICovCgoJc2VsZi5vbm1lc3NhZ2UgPSBldmVudCA9PiB7CgkgIGNvbnN0IHBhcmFtcyA9IHsKCSAgICBrOiB7CgkgICAgICB0eXBlOiAncmVhbCcsCgkgICAgICBsb3dlcjogMCwKCSAgICAgIHVwcGVyOiAxMDAKCSAgICB9LAoJICAgIGx1Y2U6IHsKCSAgICAgIHR5cGU6ICdyZWFsJywKCSAgICAgIGxvd2VyOiAwLAoJICAgICAgdXBwZXI6IDEwMAoJICAgIH0KCSAgfTsKCSAgY29uc3QgbG9nUG9zdCA9IChzdGF0ZSwgZGF0YSkgPT4gewoJICAgIGxldCBscCA9IDA7CgoJICAgIC8vIFByaW9ycwoJICAgIGNvbnN0IGtNZWFuID0gMjsKCSAgICBjb25zdCBrU2hhcGUgPSAzOwoJICAgIGxwICs9IGRpc3RyaWJ1dGlvbnNFeHBvcnRzLmdhbW1hKHN0YXRlLmssIGtTaGFwZSwga1NoYXBlIC8ga01lYW4pOwoJICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmssIDAsIDEwMCk7CgoJICAgIGNvbnN0IGx1Y2VNZWFuID0gMjsKCSAgICBjb25zdCBsdWNlU2hhcGUgPSAzOwoJICAgIGxwICs9IGRpc3RyaWJ1dGlvbnNFeHBvcnRzLmdhbW1hKHN0YXRlLmx1Y2UsIGx1Y2VTaGFwZSwgbHVjZVNoYXBlIC8gbHVjZU1lYW4pOwoJICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7CgoJICAgIC8vIExpa2VsaWhvb2QKCSAgICBkYXRhLmZvckVhY2goY2hvaWNlID0+IHsKCSAgICAgIC8vIFZhbHVlcwoJICAgICAgY29uc3QgdnMgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hcywgY2hvaWNlLmRzLCBzdGF0ZS5rKTsKCSAgICAgIGNvbnN0IHZsID0gSFRETWF0aC5hZGsydihjaG9pY2UuYWwsIGNob2ljZS5kbCwgc3RhdGUuayk7CgoJICAgICAgLy8gQ2hvaWNlIG9mIHNvb25lciBvciBsYXRlciBpcyBzYW1wbGVkIGZyb20gYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uCgkgICAgICAvLyBMdWNlIGNob2ljZSBydWxlIGlzIHVzZWQgdG8gY29tcHV0ZSBwcm9iYWJpbGl0eSBvZiB3YWl0aW5nISAoMCA9IHNvb25lciwgMSA9IGxhdGVyKQoJICAgICAgY29uc3QgYmludmFsID0gMSAvICgxICsgTWF0aC5leHAoc3RhdGUubHVjZSAqICh2cyAtIHZsKSkpOwoKCSAgICAgIC8vIEFjdHVhbCByZXNwb25zZQoJICAgICAgY29uc3QgcmVzcG9uc2UgPSBjaG9pY2UucmVzcG9uc2UgPT09ICdmaXJzdCcgPyAwIDogMTsKCSAgICAgIGxwICs9IGRpc3RyaWJ1dGlvbnNFeHBvcnRzLmJlcm4ocmVzcG9uc2UsIGJpbnZhbCk7CgkgICAgfSk7CgkgICAgcmV0dXJuIGxwOwoJICB9OwoKCSAgLy8gSW5pdGlhbGl6aW5nIHRoZSBzYW1wbGVyCgkgIGNvbnN0IHNhbXBsZXIgPSBuZXcgbWNtY0V4cG9ydHMuQW13Z1NhbXBsZXIocGFyYW1zLCBsb2dQb3N0LCBldmVudC5kYXRhKTsKCSAgLy8gQnVybmluZyBzb21lIHNhbXBsZXMgdG8gdGhlIE1DTUMgZ29kcyBhbmQgc2FtcGxpbmcgNTAwMCBkcmF3cwoJICBzYW1wbGVyLmJ1cm4oMTAwMCk7CgkgIGNvbnN0IHNhbXBsZXMgPSBzYW1wbGVyLnNhbXBsZSg1MDAwKTsKCgkgIC8vIEV4dHJhY3Qgc3VtbWFyeSBzdGF0cwoJICBjb25zdCByZXN1bHRzID0gewoJICAgIGs6IG1lZGlhbihzYW1wbGVzLmspLAoJICAgIGx1Y2U6IG1lZGlhbihzYW1wbGVzLmx1Y2UpCgkgIH07CgkgIHNlbGYucG9zdE1lc3NhZ2UoewoJICAgIHJlc3VsdHM6IHJlc3VsdHMsCgkgICAgc2FtcGxlczogc2FtcGxlcwoJICB9KTsKCX07Cgp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD1odGQtZml0LXdvcmtlci5qcy5tYXAKCg==",fp="data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRkLWZpdC13b3JrZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9iYXllcy5qcy9kaXN0cmlidXRpb25zLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2JheWVzLmpzL21jbWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FzY2VuZGluZy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zb3J0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVpY2tzZWxlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1YW50aWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tZWRpYW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvdHJhbnNmb3JtLmpzIiwiLi4vZGlzY291bnRhYmxlLW1hdGgvc3JjL2h0ZC1tYXRoLmpzIiwiLi4vZGlzY291bnRhYmxlLW1hdGgvc3JjL2luZGV4LmpzIiwic3JjL2NvbXBvbmVudHMvaHRkLWZpdC13b3JrZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLy8gQSBudW1iZXIgb2YgbG9nIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb25zIChQREYpLiBOYW1pbmcgYW5kIHBhcmFtZXRlcml6YXRpb25cbi8vIHNob3VsZCBtYXRjaCBSJ3MsIGV4Y2VwdCBmb3IgdGhhdCBhbGwgZnVuY3Rpb25zIHJlc2lkZSBpbiBhbiBsZCBvYmplY3QgKFxuLy8gYXMgaW4gXCJsb2cgZGVuc2l0eVwiKSwgc28gdG8gZ2V0IGEgbm9ybWFsIGxvZyBkZW5zaXR5IHlvdSB3b3VsZCB3cml0ZVxuLy8gbGQubm9ybSguLi4pLlxuLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0XG4vLyAoaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0Lykgd2hpY2ggaW5jbHVkZXMgUERGIGZvciBtYW55IGNvbW1vbiBwcm9iYWJpbGl0eVxuLy8gZGlzdHJpYnV0aW9ucy4gV2hhdCBJIGhhdmUgZG9uZSBpcyBvbmx5IHRvIGNvbnZlcnQgdGhlc2UgdG8gbG9nIFBERnMuXG5cbi8qXG5PcmlnaW5hbCB3b3JrIENvcHlyaWdodCAoYykgMjAxMyBqU3RhdFxuTW9kaWZpZWQgd29yayBDb3B5cmlnaHQgKGMpIDIwMTUgUmFzbXVzIELDpcOldGggXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS5cblxuKi9cblxuXG4vLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanNcbi8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLFxuLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuXG4vLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWxcbi8vIG9iamVjdCBsZCAuXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgICAgZGVmaW5lKFtdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dFxuICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgLy8gbGlrZSBOb2RlLlxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KVxuICAgICAgICByb290LmxkID0gZmFjdG9yeSgpO1xuICB9XG59KHRoaXMsIGZ1bmN0aW9uKCkge1xuICAvLyBPYmplY3QgdG8gaG9sZCB0aGUgZnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkLlxuICB2YXIgbGQgID0ge307XG4gIFxuICAvLy8vLy8vLy8vIEhlbHBlciBmdW5jdGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgdmFyIGxnYW1tYSA9IGZ1bmN0aW9uKHgpIHtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGNvZiA9IFtcbiAgICAgIDc2LjE4MDA5MTcyOTQ3MTQ2LCAtODYuNTA1MzIwMzI5NDE2NzcsIDI0LjAxNDA5ODI0MDgzMDkxLFxuICAgICAgLTEuMjMxNzM5NTcyNDUwMTU1LCAwLjEyMDg2NTA5NzM4NjYxNzllLTIsIC0wLjUzOTUyMzkzODQ5NTNlLTVcbiAgICBdO1xuICAgIHZhciBzZXIgPSAxLjAwMDAwMDAwMDE5MDAxNTtcbiAgICB2YXIgeHgsIHksIHRtcDtcbiAgICB0bXAgPSAoeSA9IHh4ID0geCkgKyA1LjU7XG4gICAgdG1wIC09ICh4eCArIDAuNSkgKiBsb2codG1wKTtcbiAgICBmb3IgKDsgaiA8IDY7IGorKylcbiAgICAgIHNlciArPSBjb2Zbal0gLyArK3k7XG4gICAgcmV0dXJuIGxvZygyLjUwNjYyODI3NDYzMTAwMDUgKiBzZXIgLyB4eCkgLSB0bXA7XG4gIH07XG4gIGxkLmxnYW1tYSA9IGxnYW1tYTtcbiAgXG4gIHZhciBsZmFjdG9yaWFsID0gZnVuY3Rpb24obikge1xuICAgIHJldHVybiBuIDwgMCA/IE5hTiA6IGxnYW1tYShuICsgMSk7XG4gIH07XG4gIGxkLmxmYWN0b3JpYWwgPSBsZmFjdG9yaWFsO1xuICBcbiAgdmFyIGxjaG9vc2UgPSBmdW5jdGlvbihuLCBrKXtcbiAgICByZXR1cm4gbGZhY3RvcmlhbChuKSAtIGxmYWN0b3JpYWwoaykgLSBsZmFjdG9yaWFsKG4gLSBrKTtcbiAgfTtcbiAgbGQubGNob29zZSA9IGxjaG9vc2U7XG4gIFxuICB2YXIgbGJldGEgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGxnYW1tYShhKSArIGxnYW1tYShiKSAtIGxnYW1tYShhICsgYik7XG4gIH07XG4gIGxkLmxiZXRhID0gbGJldGE7XG4gIFxuICB2YXIgbG9nICA9IE1hdGgubG9nO1xuICB2YXIgZXhwICA9IE1hdGguZXhwO1xuICB2YXIgYWJzICA9IE1hdGguYWJzO1xuICB2YXIgcG93ICA9IE1hdGgucG93O1xuICB2YXIgc3FydCA9IE1hdGguc3FydDtcbiAgdmFyIHBpICAgPSBNYXRoLlBJO1xuICBcbiAgLy8vLy8vLy8vLyBDb250aW5vdXMgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgbGQuYmV0YSA9IGZ1bmN0aW9uKHgsIHNoYXBlMSwgc2hhcGUyKSB7XG4gICAgaWYgKHggPiAxIHx8IHggPCAwKSB7XG4gICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIGlmKHNoYXBlMSA9PT0gMSAmJiBzaGFwZTIgPT09IDEpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKHNoYXBlMSAtIDEpICogbG9nKHgpICsgKHNoYXBlMiAtIDEpICogbG9nKDEgLSB4KSAtIGxiZXRhKHNoYXBlMSwgc2hhcGUyKTsgIFxuICAgIH1cbiAgfTtcbiAgXG4gIGxkLmNhdWNoeSA9IGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSkge1xuICAgIHJldHVybiBsb2coc2NhbGUpIC0gbG9nKHBvdyh4IC0gbG9jYXRpb24sIDIpICsgcG93KHNjYWxlLCAyKSkgIC0gbG9nKHBpKTtcbiAgfTtcbiAgXG4gIGxkLm5vcm0gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCkge1xuICAgICAgcmV0dXJuIC0wLjUgKiBsb2coMiAqIHBpKSAtbG9nKHNkKSAtIHBvdyh4IC0gbWVhbiwgMikgLyAoMiAqIHNkICogc2QpO1xuICB9O1xuXG4gIC8vIEEgYml2YXJpYXRlIE5vcm1hbCBkaXN0cmlidXRpb24gcGFyYW1ldGVyaXplZCBieSBhcnJheXMgb2YgdHdvIG1lYW5zIGFuZCBTRHMsIGFuZCBcbiAgLy8gdGhlIGNvcnJlbGF0aW9uLlxuICBsZC5iaXZhcm5vcm0gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCwgY29ycikge1xuICAgIHZhciB6ID0gcG93KHhbMF0gLSBtZWFuWzBdLCAyKSAvIHBvdyhzZFswXSwgMikgK1xuICAgICAgICAgICAgcG93KHhbMV0gLSBtZWFuWzFdLCAyKSAvIHBvdyhzZFsxXSwgMikgLSBcbiAgICAgICAgICAgICgyICogY29yciAqICh4WzBdIC0gbWVhblswXSkgKiAoeFsxXSAtIG1lYW5bMV0pKSAvIChzZFswXSAqIHNkWzFdKTtcbiAgICB2YXIgbm9ybWFsaXppbmdfZmFjdG9yID0gLSggbG9nKDIpICsgbG9nKHBpKSArIGxvZyhzZFswXSkgKyBsb2coc2RbMV0pICsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNSAqIGxvZygxIC0gcG93KGNvcnIsIDIpKSApOyBcbiAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSApICk7IFxuICAgIHJldHVybiBiaXZhcl9sb2dfZGVucztcbiAgfTtcbiAgXG5cbiAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSkge1xuICAgIHJldHVybiAoLWFicyh4IC0gbG9jYXRpb24pL3NjYWxlKSAtIGxvZygyICogc2NhbGUpO1xuICB9O1xuICBcbiAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7XG4gIFxuICBsZC5nYW1tYSA9IGZ1bmN0aW9uKHgsIHNoYXBlLCByYXRlKSB7XG4gICAgdmFyIHNjYWxlID0gMSAvIHJhdGU7XG4gICAgaWYgKHggPCAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICBpZigoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgKSB7XG4gICAgICByZXR1cm4gLWxvZyhzY2FsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoc2hhcGUgLSAxKSAqIGxvZyh4KSAtIHggLyBzY2FsZSAtIGxnYW1tYShzaGFwZSkgLSBzaGFwZSAqIGxvZyhzY2FsZSk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbih4LCBzaGFwZSwgc2NhbGUpIHtcbiAgICAgIGlmICh4IDw9IDApIHtcbiAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAtKHNoYXBlICsgMSkgKiBsb2coeCkgLSBzY2FsZSAvIHggLSBsZ2FtbWEoc2hhcGUpICsgc2hhcGUgKiBsb2coc2NhbGUpO1xuICAgIH07XG4gIFxuICBsZC5sbm9ybSA9ICBmdW5jdGlvbih4LCBtZWFubG9nLCBzZGxvZykge1xuICAgIGlmICh4IDw9IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiAtbG9nKHgpIC0gMC41ICogbG9nKDIgKiBwaSkgLSBsb2coc2Rsb2cpIC0gXG4gICAgICAgICAgICBwb3cobG9nKHgpIC0gbWVhbmxvZywgMikgLyAoMiAqIHNkbG9nICogc2Rsb2cpO1xuICB9O1xuICBcbiAgbGQucGFyZXRvID0gZnVuY3Rpb24oeCwgc2NhbGUsIHNoYXBlKSB7XG4gICAgaWYgKHggPCBzY2FsZSkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZyhzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSkgLSAoc2hhcGUgKyAxKSAqIGxvZyh4KTtcbiAgfTtcbiAgXG4gIGxkLnQgID0gIGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSwgZGYpIHtcbiAgICBkZiA9IGRmID4gMWUxMDAgPyAxZTEwMCA6IGRmO1xuICAgIHJldHVybiBsZ2FtbWEoKGRmICsgMSkvMikgLSBsZ2FtbWEoZGYvMikgLSBsb2coc3FydChwaSAqIGRmKSAqIHNjYWxlKSArXG4gICAgICAgICAgIGxvZyhwb3coMSArICgxL2RmKSAqIHBvdygoeCAtIGxvY2F0aW9uKS9zY2FsZSwgMiksIC0oZGYgKyAxKS8yKSk7XG4gIH07XG4gIFxuICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlXG4gIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIHdlaWJ1bGwgZGlzdHJpYnV0aW9uOiBcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmNcbiAgbGQud2VpYnVsbCA9IGZ1bmN0aW9uKHgsIHNoYXBlLCBzY2FsZSkge1xuICAgIGlmICh4IDwgMCkgcmV0dXJuIC1JbmZpbml0eTtcbiAgICBpZih4ID09PSAwICYmIHNoYXBlIDwgMSkgcmV0dXJuIEluZmluaXR5O1xuICAgIHZhciB0bXAxID0gcG93KHggLyBzY2FsZSwgc2hhcGUgLSAxKTtcbiAgICB2YXIgdG1wMiA9IHRtcDEgKiAoeCAvIHNjYWxlKTtcblx0ICByZXR1cm4gLXRtcDIgKyBsb2coc2hhcGUgKiB0bXAxIC8gc2NhbGUpO1xuICB9O1xuICBcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZVxuICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSBsb2dpc3RpYyBkaXN0cmlidXRpb246IFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2NoL3Itc291cmNlL2Jsb2IvYjE1NmUzYTcxMTk2N2Y1ODEzMWUyM2MxYjFkYzFlYTkwZTJmMGM0My9zcmMvbm1hdGgvZGxvZ2lzLmNcbiAgbGQubG9naXMgPSBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUpIHtcbiAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpO1xuICAgIHZhciBlID0gZXhwKC14KTtcbiAgICB2YXIgZiA9IDEuMCArIGU7XG4gICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7ICAgIFxuICB9O1xuXG4gIGxkLmRpcmljaGxldCA9IGZ1bmN0aW9uKHgsIGFscGhhKSB7XG4gICAgdmFyIHN1bV9hbHBoYSA9IDA7XG4gICAgdmFyIHN1bV9sZ2FtbWFfYWxwaGEgPSAwO1xuICAgIHZhciBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggPSAwO1xuICAgIHZhciBuID0gYWxwaGEubGVuZ3RoO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIHN1bV9hbHBoYSArPSBhbHBoYVtpXTtcbiAgICAgIHN1bV9sZ2FtbWFfYWxwaGEgKz0gbGdhbW1hKGFscGhhW2ldKTtcbiAgICAgIHN1bV9hbHBoYV9zdWJfMV9sb2dfeCArPSAoYWxwaGFbaV0gLSAxKSAqIGxvZyh4W2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGxnYW1tYShzdW1fYWxwaGEpIC0gc3VtX2xnYW1tYV9hbHBoYSArIHN1bV9hbHBoYV9zdWJfMV9sb2dfeDtcbiAgfTtcbiAgIFxuICAgIFxuICBsZC5leHAgPSBmdW5jdGlvbih4LCByYXRlKSB7XG4gICAgICByZXR1cm4geCA8IDAgPyAtSW5maW5pdHkgOiBsb2cocmF0ZSkgLXJhdGUgKiB4O1xuICB9O1xuICBcbiAgbGQudW5pZiA9IGZ1bmN0aW9uKHgsIG1pbiwgbWF4KSB7XG4gICAgICByZXR1cm4gKHggPCBtaW4gfHwgeCA+IG1heCkgPyAtSW5maW5pdHkgOiBsb2coMSAvIChtYXggLSBtaW4pKTtcbiAgfTtcbiAgXG4gIC8vLy8vLy8vLy8gRGlzY3JldGUgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIFxuICBsZC5iZXJuID0gZnVuY3Rpb24oeCwgcHJvYikge1xuICAgICAgcmV0dXJuICEoeCA9PT0gMCB8fCB4ID09PSAxKSA/IC1JbmZpbml0eSA6IGxvZyh4ICogcHJvYiArICgxIC0geCkgKiAoMSAtIHByb2IpKTtcbiAgfTtcbiAgXG4gIGxkLmNhdCA9IGZ1bmN0aW9uKHgsIHByb2JzKSB7XG4gICAgaWYoeCA8IDEgfHwgeCA+IHByb2JzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvZyggcHJvYnNbeCAtIDFdICk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQuYmlub20gPSBmdW5jdGlvbih4LCBzaXplLCBwcm9iKSB7XG4gICAgaWYoeCA+IHNpemUgfHwgeCA8IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIGlmKHByb2IgPT09IDAgfHwgcHJvYiA9PT0gMSkge1xuICAgICAgcmV0dXJuIChzaXplICogcHJvYikgPT09IHggPyAwIDogLUluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTtcbiAgfTtcbiAgXG4gIHZhciBtdWx0aW5vbSA9IGZ1bmN0aW9uKHgsIHByb2JzKSB7XG4gICAgdmFyIG4gPSB4Lmxlbmd0aDtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgdmFyIHRtcF90ZXJtID0gMDtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBpZihwcm9ic1tpXSA9PT0gMCkge1xuICAgICAgICBpZih4W2ldICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsgIFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplICs9IHhbaV07XG4gICAgICAgIHRtcF90ZXJtICs9IHhbaV0gKiBsb2cocHJvYnNbaV0pIC0gbGdhbW1hKHhbaV0gKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxnYW1tYShzaXplICsgMSkgKyB0bXBfdGVybSA7XG4gIH07XG4gIFxuICBsZC5uYmlub20gPSBmdW5jdGlvbih4LCBzaXplLCBwcm9iKSB7XG4gICAgaWYoeCA8IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpO1xuICB9O1xuICBcbiAgbGQuaHlwZXIgPSBmdW5jdGlvbih4LCBtLCBuLCBrKSB7XG4gICAgaWYoeCA8IDAgfHwgeCA+IGspIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2Uobiwgay14KSAtIGxjaG9vc2UobStuLCBrKTtcbiAgICB9XG4gIH07XG4gIFxuICBsZC5wb2lzID0gZnVuY3Rpb24oeCwgbGFtYmRhKSB7XG4gICAgICByZXR1cm4geCA8IDAgPyAtSW5maW5pdHkgOiBsb2cobGFtYmRhKSAqIHggLSBsYW1iZGEgLSBsZmFjdG9yaWFsKHgpO1xuICB9O1xuICBcbiAgcmV0dXJuIGxkO1xufSkpOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanNcbi8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLFxuLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuXG4vLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWxcbi8vIG9iamVjdCBtY21jIC5cbihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxuICAgICAgICBkZWZpbmUoW10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0XG4gICAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLFxuICAgICAgICAvLyBsaWtlIE5vZGUuXG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpXG4gICAgICAgIHJvb3QubWNtYyA9IGZhY3RvcnkoKTtcbiAgfVxufSh0aGlzLCBmdW5jdGlvbigpe1xuXG4vLy8gVGhlIGFjdHVhbCBtb2R1bGUgY29kZSBzdGFydHMgaGVyZSAvLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgXG4gIFxuICAvLy8vLy8vLy8vIEhlbHBlciBGdW5jdGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgLyoqIFJldHVybnMgYSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqL1xuICB2YXIgcnVuaWYgPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKyBtaW47XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIGFuZCBtYXggKi9cbiAgdmFyIHJ1bmlmX2Rpc2NyZXRlID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcbiAgfTtcbiAgXG4gIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkXG4gICAqICBieSBtZWFuIGFuZCBzZC4gXG4gICAqICBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0L2pzdGF0L2Jsb2IvbWFzdGVyL3NyYy9zcGVjaWFsLmpzICovXG4gIHZhciBybm9ybSA9IGZ1bmN0aW9uKG1lYW4sIHNkKSB7XG4gICAgdmFyIHUsIHYsIHgsIHksIHE7XG4gICAgZG8ge1xuICAgICAgdSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICB2ID0gMS43MTU2ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICAgICAgeCA9IHUgLSAwLjQ0OTg3MTtcbiAgICAgIHkgPSBNYXRoLmFicyh2KSArIDAuMzg2NTk1O1xuICAgICAgcSA9IHggKiB4ICsgeSAqICgwLjE5NjAwICogeSAtIDAuMjU0NzIgKiB4KTtcbiAgICB9IHdoaWxlIChxID4gMC4yNzU5NyAmJiAocSA+IDAuMjc4NDYgfHwgdiAqIHYgPiAtNCAqIE1hdGgubG9nKHUpICogdSAqIHUpKTtcbiAgICBcbiAgICByZXR1cm4gKHYgLyB1KSAqIHNkICsgbWVhbjtcbiAgfTtcbiAgXG4gIFxuICAvKiogUmV0dXJucyBhIGRlZXAgY2xvbmUgb2Ygc3JjLCBzb3J0IG9mLi4uIEl0IG9ubHkgY29waWVzIGEgbGltaXRlZFxuICAgKiBudW1iZXIgb2YgdHlwZXMgYW5kLCBmb3IgZXhhbXBsZSwgZnVuY3Rpb24gYXJlIG5vdCBjb3BpZWQuIFxuICAgKiBGcm9tIGh0dHA6Ly9kYXZpZHdhbHNoLm5hbWUvamF2YXNjcmlwdC1jbG9uZVxuICAgKi9cbiAgdmFyIGRlZXBfY2xvbmUgPSBmdW5jdGlvbihzcmMpIHtcbiAgXHRmdW5jdGlvbiBtaXhpbihkZXN0LCBzb3VyY2UsIGNvcHlGdW5jKSB7XG4gIFx0XHR2YXIgbmFtZSwgcywgaSwgZW1wdHkgPSB7fTtcbiAgXHRcdGZvcihuYW1lIGluIHNvdXJjZSl7XG4gIFx0XHRcdC8vIHRoZSAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykgY29uZGl0aW9uIGF2b2lkcyBjb3B5aW5nIHByb3BlcnRpZXMgaW4gXCJzb3VyY2VcIlxuICBcdFx0XHQvLyBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlLlx0IEZvciBleGFtcGxlLCBpZiBkZXN0IGhhcyBhIGN1c3RvbSB0b1N0cmluZygpIG1ldGhvZCxcbiAgXHRcdFx0Ly8gZG9uJ3Qgb3ZlcndyaXRlIGl0IHdpdGggdGhlIHRvU3RyaW5nKCkgbWV0aG9kIHRoYXQgc291cmNlIGluaGVyaXRlZCBmcm9tIE9iamVjdC5wcm90b3R5cGVcbiAgXHRcdFx0cyA9IHNvdXJjZVtuYW1lXTtcbiAgXHRcdFx0aWYoIShuYW1lIGluIGRlc3QpIHx8IChkZXN0W25hbWVdICE9PSBzICYmICghKG5hbWUgaW4gZW1wdHkpIHx8IGVtcHR5W25hbWVdICE9PSBzKSkpe1xuICBcdFx0XHRcdGRlc3RbbmFtZV0gPSBjb3B5RnVuYyA/IGNvcHlGdW5jKHMpIDogcztcbiAgXHRcdFx0fVxuICBcdFx0fVxuICBcdFx0cmV0dXJuIGRlc3Q7XG4gIFx0fVxuICBcdGlmKCFzcmMgfHwgdHlwZW9mIHNyYyAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzcmMpID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCIpe1xuICBcdFx0Ly8gbnVsbCwgdW5kZWZpbmVkLCBhbnkgbm9uLW9iamVjdCwgb3IgZnVuY3Rpb25cbiAgXHRcdHJldHVybiBzcmM7XHQvLyBhbnl0aGluZ1xuICBcdH1cbiAgXHRpZihzcmMubm9kZVR5cGUgJiYgXCJjbG9uZU5vZGVcIiBpbiBzcmMpe1xuICBcdFx0Ly8gRE9NIE5vZGVcbiAgXHRcdHJldHVybiBzcmMuY2xvbmVOb2RlKHRydWUpOyAvLyBOb2RlXG4gIFx0fVxuICBcdGlmKHNyYyBpbnN0YW5jZW9mIERhdGUpe1xuICBcdFx0Ly8gRGF0ZVxuICBcdFx0cmV0dXJuIG5ldyBEYXRlKHNyYy5nZXRUaW1lKCkpO1x0Ly8gRGF0ZVxuICBcdH1cbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBSZWdFeHApe1xuICBcdFx0Ly8gUmVnRXhwXG4gIFx0XHRyZXR1cm4gbmV3IFJlZ0V4cChzcmMpOyAgIC8vIFJlZ0V4cFxuICBcdH1cbiAgXHR2YXIgciwgaSwgbDtcbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBBcnJheSl7XG4gIFx0XHQvLyBhcnJheVxuICBcdFx0ciA9IFtdO1xuICBcdFx0Zm9yKGkgPSAwLCBsID0gc3JjLmxlbmd0aDsgaSA8IGw7ICsraSl7XG4gIFx0XHRcdGlmKGkgaW4gc3JjKXtcbiAgXHRcdFx0XHRyLnB1c2goZGVlcF9jbG9uZShzcmNbaV0pKTtcbiAgXHRcdFx0fVxuICBcdFx0fVxuICBcdH0gZWxzZSB7XG4gIFx0XHQvLyBnZW5lcmljIG9iamVjdHNcbiAgXHRcdHIgPSBzcmMuY29uc3RydWN0b3IgPyBuZXcgc3JjLmNvbnN0cnVjdG9yKCkgOiB7fTtcbiAgXHR9XG4gIFx0cmV0dXJuIG1peGluKHIsIHNyYywgZGVlcF9jbG9uZSk7XG4gIH07XG4gIFxuICAvKiogU3BlY2lhbGl6ZWQgY2xvbmUgZnVuY3Rpb24gdGhhdCBvbmx5IGNsb25lcyBzY2FsYXJzIGFuZCBuZXN0ZWQgYXJyYXlzIHdoZXJlXG4gICAqIGVhY2ggYXJyYXkgZWl0aGVyIGNvbnNpc3RzIG9mIGFsbCBhcnJheXMgb3IgYWxsIG51bWJlcnMuIFRoaXMgZnVuY3Rpb25cbiAgICogaXMgbWVhbnQgYXMgYSBmYXN0IHdheSBvZiBjbG9uaW5nIHBhcmFtZXRlciBkcmF3cyB3aXRoaW4gdGhlIG1jbWMgc2FtcGxpbmdcbiAgICogbG9vcC5cbiAgICovXG4gIHZhciBjbG9uZV9wYXJhbV9kcmF3ID0gZnVuY3Rpb24oeCkge1xuICAgIGlmKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgIGlmKEFycmF5LmlzQXJyYXkoeFswXSkpIHtcbiAgICAgICAgLy8geCBpcyBhbiBhcnJheSBvZiBhcnJheXMgc28gd2UgbmVlZCB0byBjbG9uZSBpdCByZWN1cnNpdmVseVxuICAgICAgICB2YXIgeF9jb3B5ID0gW107XG4gICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB4X2NvcHkucHVzaChjbG9uZV9wYXJhbV9kcmF3KHhbaV0pKTtcbiAgICAgICAgfSBcbiAgICAgICAgcmV0dXJuIHhfY29weTtcbiAgICAgIH0gZWxzZSB7IC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgYXJyYXlzIG9mIHNjYWxhcnNcbiAgICAgICAgcmV0dXJuIHguc2xpY2UoMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXJcbiAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgbnVtYmVyLlxuICAgKi9cbiAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT0gXCJudW1iZXJcIiB8fCAodHlwZW9mIG9iamVjdCA9PSBcIm9iamVjdFwiICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIChwb3NzaWJseSBtdWx0aWRpbWVuc2lvbmFsL25lc3RlZCkgYXJyYXkuXG4gICAqIEBwYXJhbSBkaW0gLSBBbiBhcnJheSBnaXZpbmcgdGhlIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkuIEZvciBleGFtcGxlLFxuICAgKiAgIFs1XSB3b3VsZCB5aWVsZCBhIDUgZWxlbWVudCBhcnJheSwgYW5kIFszLDNdIHdvdWxkIHlpZWxkIGEgMyBieSAzIG1hdHJpeC5cbiAgICogQHBhcmFtIGluaXQgLSBBIHZhbHVlIG9yIGEgZnVuY3Rpb24gdXNlZCB0byBmaWxsIGluIHRoZSBlYWNoIGVsZW1lbnQgaW5cbiAgICogICB0aGUgYXJyYXkuIElmIGl0IGlzIGEgZnVuY3Rpb24gaXQgc2hvdWxkIHRha2Ugbm8gYXJndW1lbnRzLCBpdCB3aWxsIGJlIFxuICAgKiAgIGV2YWx1YXRlZCBvbmNlIGZvciBlYWNoIGVsZW1lbnQsIGFuZCBpdCdzIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWQgdG9cbiAgICogICBmaWxsIGluIGVhY2ggZWxlbWVudC5cbiAgICogQGV4YW1wbGUgXG4gICAqIC8vIFRoZSBmb2xsb3dpbmcgd291bGQgcmV0dXJuIFtbMSwxXSxbMSwxXSxbMSwxXV1cbiAgICogY3JlYXRlX2FycmF5KFsyLDNdLCAxKVxuICAgKi9cbiAgdmFyIGNyZWF0ZV9hcnJheSA9IGZ1bmN0aW9uKGRpbSwgaW5pdCkge1xuICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZGltWzBdKTtcbiAgICB2YXIgaTtcbiAgICBpZihkaW0ubGVuZ3RoID09IDEpIHsgLy8gRmlsbCBpdCB1cCB3aXRoIGluaXRcbiAgICAgIGlmKHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBhcnJbaV0gPSBpbml0KCk7XG4gICAgICAgIH0gIFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBhcnJbaV0gPSBpbml0O1xuICAgICAgICB9IFxuICAgICAgfVxuICAgIH0gZWxzZSBpZihkaW0ubGVuZ3RoID4gMSkge1xuICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gY3JlYXRlX2FycmF5KGRpbS5zbGljZSgxKSwgaW5pdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiY3JlYXRlX2FycmF5IGNhbid0IGNyZWF0ZSBhIGRpbWVuc2lvbmxlc3MgYXJyYXlcIjtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciBcbiAgICogZXhhbXBsZSwgYXJyYXlfZGltKCBbWzEsIDJdLCBbMSwgMl1dICkgc2hvdWxkIHJldHVybiBbMiwgMl1cbiAgICogQXNzdW1lcyB0aGF0IGFsbCBhcnJheXMgaW5zaWRlIGFub3RoZXIgYXJyYXkgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aC5cbiAgICogQGV4YW1wbGVcbiAgICogLy8gU2hvdWxkIHJldHVybiBbNCwgMiwgMV1cbiAgICogYXJyYXlfZGltKGNyZWF0ZV9hcnJheShbNCwgMiwgMV0sIDApKVxuICAgKi9cbiAgdmFyIGFycmF5X2RpbSA9IGZ1bmN0aW9uKGEpIHtcbiAgICBpZihBcnJheS5pc0FycmF5KGFbMF0pKSB7XG4gICAgICByZXR1cm4gW2EubGVuZ3RoXS5jb25jYXQoYXJyYXlfZGltKGFbMF0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFthLmxlbmd0aF07XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0d28gYXJyYXlzIGFyZSBlcXVhbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHNcbiAgICogYXMganVkZ2VkIGJ5IHRoZSBcIj09XCIgb3BlcmF0b3IuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS5cbiAgICogQWRhcHRlZCBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0ODUzOTc0LzEwMDE4NDhcbiAgICovIFxuICB2YXIgYXJyYXlfZXF1YWwgPSBmdW5jdGlvbiAoYTEsIGEyKSB7XG4gICAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5c1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGExW2ldKSAmJiBBcnJheS5pc0FycmF5KGEyW2ldKSkge1xuICAgICAgICAgICAgICAvLyByZWN1cnNlIGludG8gdGhlIG5lc3RlZCBhcnJheXNcbiAgICAgICAgICAgICAgaWYgKCFhcnJheV9lcXVhbChhMVtpXSwgYTJbaV0pKSByZXR1cm4gZmFsc2U7ICAgICAgIFxuICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgICAgIGVsc2UgaWYgKGExW2ldICE9IGEyW2ldKSB7IFxuICAgICAgICAgICAgICAvLyBXYXJuaW5nIC0gdHdvIGRpZmZlcmVudCBvYmplY3QgaW5zdGFuY2VzIHdpbGwgbmV2ZXIgYmUgZXF1YWw6IHt4OjIwfSAhPSB7eDoyMH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIFxuICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgfSAgICAgICBcbiAgICAgIHJldHVybiB0cnVlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRyYXZlcnNlcyBhIHBvc3NpYmx5IG5lc3RlZCBhcnJheSBhIGFuZCBhcHBsaWVzIGZ1biB0byBhbGwgXCJsZWFmIG5vZGVzXCIsIFxuICAgKiB0aGF0IGlzLCB2YWx1ZXMgdGhhdCBhcmUgbm90IGFycmF5cy4gUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaXplIGFzXG4gICAqIGEuXG4gICAqL1xuICB2YXIgbmVzdGVkX2FycmF5X2FwcGx5ID0gZnVuY3Rpb24oYSwgZnVuKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheShhLmxlbmd0aCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4oYSk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqIFJhbmRvbWl6aW5nIHRoZSBhcnJheSBlbGVtZW50IG9yZGVyIGluLXBsYWNlLiBVc2luZyBEdXJzdGVuZmVsZFxuICAgKiBzaHVmZmxlIGFsZ29yaXRobS4gQWRhcHRlZCBmcm9tIGhlcmU6IFxuICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4XG4gICAqL1xuICBmdW5jdGlvbiBzaHVmZmxlX2FycmF5KGFycmF5KSB7XG4gICAgICBmb3IgKHZhciBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgdmFyIHRlbXAgPSBhcnJheVtpXTtcbiAgICAgICAgICBhcnJheVtpXSA9IGFycmF5W2pdO1xuICAgICAgICAgIGFycmF5W2pdID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERvZXMgdGhlIHNhbWUgdGhpbmcgYXMgbmVzdGVkX2FycmF5X2FwcGx5LCB0aGF0IGlzLCB0cmF2ZXJzZXMgYSBwb3NzaWJseVxuICAgKiBuZXN0ZWQgYXJyYXkgYSBhbmQgYXBwbGllcyBmdW4gdG8gYWxsIFwibGVhZiBub2Rlc1wiIGFuZCByZXR1cm5zIGFuIGFycmF5IFxuICAgKiBvZiB0aGUgc2FtZSBzaXplIGFzIGEuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseVxuICAgKiBicmFuY2hlcyByYW5kb21seS5cbiAgICovXG4gIHZhciBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5ID0gZnVuY3Rpb24oYSwgZnVuKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgdmFyIGxlbiA9IGEubGVuZ3RoO1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgYXJyYXlfaXMgPSBbXTtcbiAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGFycmF5X2lzW2ldID0gaTtcbiAgICAgIH1cbiAgICAgIHNodWZmbGVfYXJyYXkoYXJyYXlfaXMpO1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgXG4gICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgYXJyYXlfaSA9IGFycmF5X2lzW2ldO1xuICAgICAgICByZXN1bHRbYXJyYXlfaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVthcnJheV9pXSwgZnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4oYSk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIEFsbG93cyBhIHByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZnVsdHMgY2FuIGJlXG4gICAqIG92ZXJyaWRkZW4gYnkgYW4gb3B0aW9ucyBvYmplY3QuXG4gICAqICBAcGFyYW0gb3B0aW9uX25hbWUgLSB0aGUgbmFtZSBvZiB0aGUgb3B0aW9uIGFzIGEgc3RyaW5nXG4gICAqICBAcGFyYW0gbXlfb3B0aW9ucyAtIGFuIG9wdGlvbiBvYmplY3QgdGhhdCBjb3VsZCBoYXZlIG9wdGlvbl9uYW1lIFxuICAgKiAgICBhcyBhIG1lbWJlci5cbiAgICogQHBhcmFtIGRlZmF1bF92YWx1ZSAtIGRlZnVsdCB2YWx1ZSB0aGF0IGlzIHJldHVybmVkIGlmIG9wdGlvbl9uYW1lIFxuICAgKiAgIGlzIG5vdCBkZWZpbmVkIGluIG15X29wdGlvbnMuXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBteV9vcHRpb25zID0ge3BpOiAzLjE0MTU5fVxuICAgKiB2YXIgcGkgPSBnZXRfb3B0aW9uKFwicGlcIiwgbXlfb3B0aW9ucywgMy4xNClcbiAgICovXG4gIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuXG4gIC8vIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LiBGb3IgZXhhbXBsZTpcbiAgLy8gdmFyIHBpID0gZ2V0X29wdGlvbihcInBpXCIsIG15X29wdGlvbnMsIDMuMTQpXG4gIHZhciBnZXRfb3B0aW9uID0gZnVuY3Rpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSkge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBvcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbl9uYW1lKSAmJiBcbiAgICAgICAgICAgb3B0aW9uc1tvcHRpb25fbmFtZV0gIT09IHVuZGVmaW5lZCAgJiYgXG4gICAgICAgICAgIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSBudWxsID8gb3B0aW9uc1tvcHRpb25fbmFtZV0gOiBkZWZhdWxfdmFsdWU7XG4gIH07XG4gIFxuICAvKiogVmVyc2lvbiBvZiBnZXRfb3B0aW9uIHdoZXJlIHRoZSBvcHRpb24gc2hvdWxkIGJlIGEgb25lIG9yIG11bHRpLWRpbWVuc2lvbmFsXG4gICAqIGFycmF5IGFuZCB3aGVyZSB0aGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBlaXRoZXIgYnkgYSBzY2FsYXIgb3IgYnkgYW4gYXJyYXkuXG4gICAqIElmIGl0J3MgYSBzY2FsYXIgdGhlIHRoYXQgc2NhbGFyIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBhcnJheSB3aXRoIFxuICAgKiBkaW0gZGltZW5zaW9ucy5cbiAgICogXG4gICAqL1xuICB2YXIgZ2V0X211bHRpZGltX29wdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkaW0sIGRlZmF1bF92YWx1ZSkge1xuICAgIHZhciB2YWx1ZSA9IGdldF9vcHRpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSk7XG4gICAgIGlmKCEgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICB2YWx1ZSA9IGNyZWF0ZV9hcnJheShkaW0sIHZhbHVlKTtcbiAgICAgfSBcbiAgICAgaWYoISBhcnJheV9lcXVhbCggYXJyYXlfZGltKHZhbHVlKSwgZGltKSkge1xuICAgICAgIHRocm93IFwiVGhlIG9wdGlvbiBcIiArIG9wdGlvbl9uYW1lICsgXCIgaXMgb2YgZGltZW5zaW9uIFtcIiArIFxuICAgICAgICAgICAgIGFycmF5X2RpbSh2YWx1ZSkgKyBcIl0gYnV0IHNob3VsZCBiZSBbXCIgKyBkaW0gKyBcIl0uXCI7XG4gICAgfVxuICAgICByZXR1cm4gdmFsdWU7XG4gIH07XG4gIFxuICAvLy8vLy8vLy8vIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcGFyYW1ldGVyIG9iamVjdHMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgLyoqXG4gICAqIFJldHVybnMgYSBmaXhlZCAoc2FtZSBldmVyeSB0aW1lKSBudW1iZXIgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgICogYSBwYXJhbWV0ZXIgb2YgYSBjZXJ0YWluIHR5cGUsIHBvc3NpYmx5IHdpdGggbG93ZXIgYW5kIHVwcGVyIGJvdW5kcy5cbiAgICogVGhlIHBvc3NpbGUgdHlwZXMgYXJlIFwicmVhbFwiLCBcImludFwiLCBhbmQgXCJiaW5hcnlcIi5cbiAgICovXG4gIHZhciBwYXJhbV9pbml0X2ZpeGVkID0gZnVuY3Rpb24odHlwZSwgbG93ZXIsIHVwcGVyKSB7XG4gICAgaWYobG93ZXIgPiB1cHBlcikge1xuICAgICAgdGhyb3cgXCJDYW4gbm90IGluaXRpYWxpemUgcGFyYW1ldGVyIHdoZXJlIGxvd2VyIGJvdW5kID4gdXBwZXIgYm91bmRcIjtcbiAgICB9XG4gICAgaWYodHlwZSA9PT0gXCJyZWFsXCIpIHtcbiAgICAgIGlmKGxvd2VyID09PSAtSW5maW5pdHkgJiYgdXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gdXBwZXIgLSAwLjU7XG4gICAgICB9IGVsc2UgaWYodXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiBsb3dlciArIDAuNTtcbiAgICAgIH0gZWxzZSBpZihsb3dlciA8PSB1cHBlcikge1xuICAgICAgICByZXR1cm4gKGxvd2VyICsgdXBwZXIpIC8gMjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYodHlwZSA9PT0gXCJpbnRcIikge1xuICAgICAgaWYobG93ZXIgPT09IC1JbmZpbml0eSAmJiB1cHBlciA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gdXBwZXIgLSAxO1xuICAgICAgfSBlbHNlIGlmKHVwcGVyID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gbG93ZXIgKyAxO1xuICAgICAgfSBlbHNlIGlmKGxvd2VyIDw9IHVwcGVyKXtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGxvd2VyICsgdXBwZXIpIC8gMik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHR5cGUgPT09IFwiYmluYXJ5XCIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB0aHJvdyBcIkNvdWxkIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciBvZiB0eXBlIFwiICsgdHlwZSArIFwiW1wiICsgbG93ZXIgKyBcIiwgXCIgKyB1cHBlciArIFwiXVwiO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIFxuICAgKiBhbmQgaW5pdGlhbGl6ZXMgbm9uLWluaXRpYWxpemVkIHBhcmFtZXRlcnMuIFRoaXMgbW9kaWZpZWQgdmVyc2lvbiBvZlxuICAgKiBwYXJhbXNfdG9fY29tcGxldGUgaXMgcmV0dXJuZWQgYXMgYSBkZWVwIGNvcHkgYW5kIG5vdCBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlXG4gICAqIGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikgdGhhdCBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlciBcbiAgICogKGxpa2UgcGFyYW1faW5pdF9maXhlZCwgZm9yIGV4YW1wbGUpLlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgcGFyYW1zID0geyBcIm11XCI6IHtcInR5cGVcIjogXCJyZWFsXCJ9IH1cbiAgICogcGFyYW1zID0gY29tcGxldGVfcGFyYW1zKHBhcmFtcyk7XG4gICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOlxuICAgKiAvLyAge1wibXVcIjogeyBcInR5cGVcIjogXCJyZWFsXCIsIFwiZGltXCI6IFsxXSwgXCJ1cHBlclwiOiBJbmZpbml0eSxcbiAgICogLy8gICAgICAgICAgIFwibG93ZXJcIjogLUluZmluaXR5LCBcImluaXRcIjogMC41IH19XG4gICAqLyBcbiAgdmFyIGNvbXBsZXRlX3BhcmFtcyAgPSBmdW5jdGlvbihwYXJhbXNfdG9fY29tcGxldGUsIHBhcmFtX2luaXQpIHtcbiAgICB2YXIgcGFyYW1zID0gZGVlcF9jbG9uZShwYXJhbXNfdG9fY29tcGxldGUpO1xuICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7IGlmICghcGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtX25hbWUpKSBjb250aW51ZTtcbiAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1twYXJhbV9uYW1lXTtcbiAgICAgIGlmKCAhcGFyYW0uaGFzT3duUHJvcGVydHkoXCJ0eXBlXCIpKSB7XG4gICAgICAgIHBhcmFtLnR5cGUgPSBcInJlYWxcIjtcbiAgICAgIH1cbiAgICAgIGlmKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eShcImRpbVwiKSkge1xuICAgICAgICBwYXJhbS5kaW0gPSBbMV07XG4gICAgICB9XG4gICAgICBpZihpc19udW1iZXIocGFyYW0uZGltKSkge1xuICAgICAgICBwYXJhbS5kaW0gPSBbcGFyYW0uZGltXTtcbiAgICAgIH1cbiAgICAgIGlmKHBhcmFtLnR5cGUgPT0gXCJiaW5hcnlcIikge1xuICAgICAgICBwYXJhbS51cHBlciA9IDE7XG4gICAgICAgIHBhcmFtLmxvd2VyID0gMDtcbiAgICAgIH1cbiAgICAgIGlmKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eShcInVwcGVyXCIpKSB7XG4gICAgICAgIHBhcmFtLnVwcGVyID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBpZighcGFyYW0uaGFzT3duUHJvcGVydHkoXCJsb3dlclwiKSkge1xuICAgICAgICBwYXJhbS5sb3dlciA9IC1JbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYocGFyYW0uaGFzT3duUHJvcGVydHkoXCJpbml0XCIpKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMganVzdCBhIG51bWJlciBvciBhIG5lc3RlZCBhcnJheSB3ZSBsZWF2ZSBpdCBhbG9uZSwgYnV0IGlmLi4uXG4gICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSAmJiB0eXBlb2YgcGFyYW0uaW5pdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gcGFyYW0uaW5pdCBpcyBhIGZ1bmN0aW9uLCB1c2UgdGhhdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtLmluaXQoKTtcbiAgICAgICAgfSBlbHNlIGlmKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyIHdoZXJlIHRoZSBwYXJhbS5pbml0IGV4aXN0IGJ1dFxuICAgICAgICAvLyBpcyBub3QgYW4gYXJyYXkuIFRoZW4gYXNzdW1lIGl0IGlzIGEgbnVtYmVyIG9yIGEgZnVuY3Rpb24gYW5kIHVzZVxuICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBwYXJhbS5pbml0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgLy8gV2UgdXNlIHRoZSBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLlxuICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbV9pbml0KHBhcmFtLnR5cGUsIHBhcmFtLmxvd2VyLCBwYXJhbS51cHBlcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfTtcbiAgXG4gIFxuICAvLy8vLy8vLy8vIFN0ZXBwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIFxuICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBBIFN0ZXBwZXIgaXMgYW4gb2JqZWN0IHJlc3BvbnNpYmxlIGZvciBwdXNoaW5nIGFyb3VuZCBvbmVcbiAgICogb3IgbW9yZSBwYXJhbWV0ZXIgdmFsdWVzIGluIGEgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBkaXN0cmlidXRpb25cbiAgICogZGVmaW5lZCBieSB0aGUgbG9nIHBvc3Rlcmlvci4gVGhpcyBkZWZpbmVzIHRoZSBTdGVwcGVyIFwiaW50ZXJmYWNlXCIsXG4gICAqIHdoZXJlIFwiaW50ZXJmYWNlXCIgbWVhbnMgdGhhdCBTdGVwcGVyIGRlZmluZXMgYSBjbGFzcyB0aGF0IGlzIG5ldmVyXG4gICAqIG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCwgYnV0IGp1c3QgdG8gYmUgc3ViY2xhc3NlZCBieSBzcGVjaWFsaXplZFxuICAgKiBzdGVwcGVyIGZ1bmN0aW9ucy5cbiAgICogQGludGVyZmFjZVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggcGFyYW1ldGVyIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZTpcbiAgICogICB7XCJtdVwiOiB7IFwidHlwZVwiOiBcInJlYWxcIiwgXCJkaW1cIjogWzFdLCBcInVwcGVyXCI6IEluZmluaXR5LCBcbiAgICogICBcImxvd2VyXCI6IC1JbmZpbml0eSwgXCJpbml0XCI6IDAuNSB9fVxuICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGJlIFwiY29tcGxldGVcIiwgdGhhdCBpcyxcbiAgICogICBzcGVjaWZ5aW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzIHN1Y2ggYXMgZGltLCBsb3dlciBhbmQgdXBwZXIuXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyBpbiBwYXJhbXNcbiAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzXG4gICAqICAgYXMgc2NhbGFycyBvciwgcG9zc2libHkgbmVzdGVkLCBhcnJheXMuIEZvciBleGFtcGxlOlxuICAgKiAgIHttdTogMTAsIHNpZ21hOiA1LCBiZXRhOiBbMSwgMi41XX1cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGVcbiAgICogICBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBUaGF0IGlzLCB0aGUgdmFsdWUgb2YgbG9nX3Bvc3RcbiAgICogICBzaG91bGQgY2hhbmdlIGlmIHRoZSB0aGUgdmFsdWVzIGluIHN0YXRlIGFyZSBjaGFuZ2VkLlxuICBcbiAgICovXG4gIHZhciBTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpIHtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2dfcG9zdCA9IGxvZ19wb3N0O1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBTaG91bGQgcmV0dXJuIHRoZSBuZXcgc3RhdGUsXG4gICAqIGJ1dCBpcyBtYWlubHkgY2FsbGVkIGZvciBpdCdzIHNpZGUgZWZmZWN0IG9mIG1ha2luZyBhIGNoYW5nZSBpbiB0aGVcbiAgICogc3RhdGUgb2JqZWN0LlxuICAgKi9cbiAgU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IFwiRXZlcnkgU3RlcHBlciBuZWVkIHRvIGltcGxlbWVudCBzdGVwKClcIjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgYWRhcHQgd2hpbGUgc3RlcHBpbmcuXG4gICAqLyBcbiAgU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gXG4gIH07XG4gIFxuICAvKipcbiAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGNlYXNlIGFkYXB0aW5nIHdoaWxlIHN0ZXBwaW5nLlxuICAgKi8gXG4gIFN0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gXG4gIH07XG4gIFxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmcgaW5mbyByZWdhcmRpbmcgdGhlIHN0ZXBwZXIuXG4gICAqLyBcbiAgU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHN0ZXBwZXIuXG4gICAgcmV0dXJuIHt9O1xuICB9O1xuICBcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBtZXRyb3BvbGlzIHN0ZXAgaW5cbiAgICogdGhlIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiBcIkV4YW1wbGVzIG9mIEFkYXB0aXZlIE1DTUNcIlxuICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICAqIEBwYXJhbSBnZW5lcmF0ZV9wcm9wb3NhbCAtIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgcHJvcG9zYWwgKGFzIGEgbnVtYmVyKVxuICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhXG4gICAqIG51bWJlciBhbmQgbG9nX3NjYWxlIGRlZmluZXMgdGhlIHNjYWxlIG9mIHRoZSBwcm9wb3NhbCBzb21laG93LlxuICAqL1xuICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgZ2VuZXJhdGVfcHJvcG9zYWwpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggICE9IDEpIHtcbiAgICAgIHRocm93IFwiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07XG4gICAgaWYoIWFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgdGhyb3cgXCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBjYW4gb25seSBoYW5kbGUgb25lIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjtcbiAgICB0aGlzLnVwcGVyID0gcGFyYW0udXBwZXI7XG4gICAgXG4gICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAgICAgPSBnZXRfb3B0aW9uKFwicHJvcF9sb2dfc2NhbGVcIiwgb3B0aW9ucywgMCk7XG4gICAgdGhpcy5iYXRjaF9zaXplICAgICAgICAgPSBnZXRfb3B0aW9uKFwiYmF0Y2hfc2l6ZVwiLCBvcHRpb25zLCA1MCk7XG4gICAgdGhpcy5tYXhfYWRhcHRhdGlvbiAgICAgPSBnZXRfb3B0aW9uKFwibWF4X2FkYXB0YXRpb25cIiwgb3B0aW9ucywgMC4zMyk7XG4gICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfb3B0aW9uKFwiaW5pdGlhbF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIDEuMCk7XG4gICAgdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUgPSBnZXRfb3B0aW9uKFwidGFyZ2V0X2FjY2VwdF9yYXRlXCIsIG9wdGlvbnMsIDAuNDQpO1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgICAgICAgID0gZ2V0X29wdGlvbihcImlzX2FkYXB0aW5nXCIsIG9wdGlvbnMsIHRydWUpO1xuICAgIFxuICAgIHRoaXMuZ2VuZXJhdGVfcHJvcG9zYWwgPSBnZW5lcmF0ZV9wcm9wb3NhbDtcbiAgICBcbiAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwO1xuICAgIHRoaXMuYmF0Y2hfY291bnQgPSAwO1xuICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7ICBcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT25lZGltTWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBhcmFtX3N0YXRlID0gdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdO1xuICAgICAgdmFyIHBhcmFtX3Byb3Bvc2FsID0gdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbChwYXJhbV9zdGF0ZSwgdGhpcy5wcm9wX2xvZ19zY2FsZSk7XG4gICAgICBpZihwYXJhbV9wcm9wb3NhbCA8IHRoaXMubG93ZXIgfHwgcGFyYW1fcHJvcG9zYWwgPiB0aGlzLnVwcGVyKSB7XG4gICAgICAgIC8vIE91dHNpZGUgb2YgbGltaXRzIG9mIHRoZSBwYXJhbWV0ZXIsIHJlamVjdCB0aGUgcHJvcG9zYWwgXG4gICAgICAgIC8vIGFuZCBzdGF5IGF0IHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgfSBlbHNlIHsgLy8gbWFrZSBhIE1ldHJvcG9saXMgc3RlcFxuICAgICAgICB2YXIgY3Vycl9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gcGFyYW1fcHJvcG9zYWw7XG4gICAgICAgIHZhciBwcm9wX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpO1xuICAgICAgICB2YXIgYWNjZXB0X3Byb2IgPSBNYXRoLmV4cChwcm9wX2xvZ19kZW5zIC0gY3Vycl9sb2dfZGVucyk7XG4gICAgICAgIGlmKGFjY2VwdF9wcm9iID4gTWF0aC5yYW5kb20oKSkge1xuICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWxcbiAgICAgICAgICBpZih0aGlzLmlzX2FkYXB0aW5nKSB0aGlzLmFjY2VwdGFuY2VfY291bnQrKyA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbVxuICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3N0YXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZih0aGlzLmlzX2FkYXB0aW5nKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiArKztcbiAgICAgICAgaWYodGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID49IHRoaXMuYmF0Y2hfc2l6ZSkgeyAvLyB0aGVuIGFkYXB0XG4gICAgICAgICAgdGhpcy5iYXRjaF9jb3VudCArKztcbiAgICAgICAgICB2YXIgbG9nX3NkX2FkanVzdG1lbnQgPSBcbiAgICAgICAgICAgIE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIFxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gLyBNYXRoLnNxcnQodGhpcy5iYXRjaF9jb3VudCkpO1xuICAgICAgICAgIGlmKHRoaXMuYWNjZXB0YW5jZV9jb3VudCAvIHRoaXMuYmF0Y2hfc2l6ZSA+IHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlICs9IGxvZ19zZF9hZGp1c3RtZW50O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlIC09IGxvZ19zZF9hZGp1c3RtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwO1xuICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07XG4gIH07XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgPSB0cnVlO1xuICB9O1xuICBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBmYWxzZTtcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BfbG9nX3NjYWxlOiB0aGlzLnByb3BfbG9nX3NjYWxlLFxuICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsXG4gICAgICBhY2NlcHRhbmNlX2NvdW50OiB0aGlzLmFjY2VwdGFuY2VfY291bnQsXG4gICAgICBpdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uOiB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24sXG4gICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudFxuICAgIH07XG4gIH07XG4gIFxuICBcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhIE5vcm1hbCBwcm9wb3NhbC5cbiAgICovXG4gIHZhciBub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHtcbiAgICByZXR1cm4gcm5vcm0ocGFyYW1fc3RhdGUgLCBNYXRoLmV4cChwcm9wX2xvZ19zY2FsZSkpO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge09uZWRpbU1ldHJvcG9saXNTdGVwcGVyfVxuICAgKiBBIFwic3ViY2xhc3NcIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgUmVhbE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBub3JtYWxfcHJvcG9zYWwpO1xuICB9O1xuICBcbiAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICAvKipcbiAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGlzY3JldGl6ZWQgTm9ybWFsIHByb3Bvc2FsLlxuICAgKi9cbiAgdmFyIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uKHBhcmFtX3N0YXRlLCBwcm9wX2xvZ19zY2FsZSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHJub3JtKHBhcmFtX3N0YXRlICwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKSk7XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGF1Z21lbnRzIHtPbmVkaW1NZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCk7XG4gIH07XG4gIFxuICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfVxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluXG4gICAqIHRoZSBBZGFwdGl2ZSBNZXRyb3BvbGlzLVdpdGhpbi1HaWJicyBhbGdvcml0aG0gaW4gXCJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DXCJcbiAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KSBmb3IgcG9zc2libHkgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMuIFRoYXRcbiAgICogaXMsIGluc3RlYWQgb2YganVzdCB0YWtpbmcgYSBzdGVwIGZvciBhIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIgbGlrZSBcbiAgICogT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIsIHRoaXMgU3RlcHBlciBpcyByZXNwb25zaWJsZSBmb3IgdGFraW5nIHN0ZXBzIFxuICAgKiBmb3IgYSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5LiBJdCdzIHN0aWxsIHByZXR0eSBkdW1iIGFuZCBqdXN0IHRha2VzXG4gICAqIG9uZS1kaW1lbnNpb25hbCBzdGVwcyBmb3IgZWFjaCBwYXJhbWV0ZXIgY29tcG9uZW50LCB0aG91Z2guXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgYSBcbiAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgICogQHBhcmFtIFN1YlN0ZXBwZXIgLSBhIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSBvZiBvbmUgZGltZW5zaW9uYWwgU3RlcHBlciB0byBhcHBseSBvblxuICAgKiAgIGFsbCB0aGUgY29tcG9uZW50cyBvZiB0aGUgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuXG4gICovXG4gIHZhciBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFN1YlN0ZXBwZXIpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggICE9IDEpIHtcbiAgICAgIHRocm93IFwiTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07XG4gICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyO1xuICAgIHRoaXMudXBwZXIgPSBwYXJhbS51cHBlcjtcbiAgICB0aGlzLmRpbSA9IHBhcmFtLmRpbTtcbiAgXG4gICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwicHJvcF9sb2dfc2NhbGVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDApO1xuICAgIHRoaXMuYmF0Y2hfc2l6ZSAgICAgICAgID0gZ2V0X211bHRpZGltX29wdGlvbihcImJhdGNoX3NpemVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDUwKTtcbiAgICB0aGlzLm1heF9hZGFwdGF0aW9uICAgICA9IGdldF9tdWx0aWRpbV9vcHRpb24oXCJtYXhfYWRhcHRhdGlvblwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMC4zMyk7XG4gICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwiaW5pdGlhbF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIHRoaXMuZGltLCAxLjApO1xuICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X211bHRpZGltX29wdGlvbihcInRhcmdldF9hY2NlcHRfcmF0ZVwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMC40NCk7XG4gICAgdGhpcy5pc19hZGFwdGluZyAgICAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwiaXNfYWRhcHRpbmdcIiwgb3B0aW9ucywgdGhpcy5kaW0sIHRydWUpO1xuICAgIFxuICAgIC8vIFRoaXMgaGFjayBiZWxvdyBpcyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJyYXkgb2YgXG4gICAgLy8gb25lIGRpbWVuc2lvbmFsIHN0ZXBwZXJzIGFjY29yZGluZyB0byBkaW0uXG4gICAgdmFyIGNyZWF0ZV9zdWJzdGVwcGVycyA9IFxuICAgICAgZnVuY3Rpb24oZGltLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHByb3BfbG9nX3NjYWxlLCBiYXRjaF9zaXplLCBtYXhfYWRhcHRhdGlvbiwgaW5pdGlhbF9hZGFwdGF0aW9uLCB0YXJnZXRfYWNjZXB0X3JhdGUsIGlzX2FkYXB0aW5nKSB7XG4gICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTtcbiAgICAgIGlmKGRpbS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgdmFyIHN1Ym9wdGlvbnMgPSB7cHJvcF9sb2dfc2NhbGU6IHByb3BfbG9nX3NjYWxlW2ldLCBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLFxuICAgICAgICAgICAgbWF4X2FkYXB0YXRpb246IG1heF9hZGFwdGF0aW9uW2ldLCBpbml0aWFsX2FkYXB0YXRpb246IGluaXRpYWxfYWRhcHRhdGlvbltpXSxcbiAgICAgICAgICAgIHRhcmdldF9hY2NlcHRfcmF0ZTogdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZzogaXNfYWRhcHRpbmdbaV19O1xuICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307XG4gICAgICAgICAgICBzdWJwYXJhbVtpXSA9IGRlZXBfY2xvbmUocGFyYW0pO1xuICAgICAgICAgICAgc3VicGFyYW1baV0uZGltID0gWzFdOyAvLyBBcyB0aGlzIHNob3VsZCBub3cgYmUgYSBvbmUtZGltIHBhcmFtZXRlclxuICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWRcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBTdWJTdGVwcGVyKHN1YnBhcmFtLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHN1Ym9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IGNyZWF0ZV9zdWJzdGVwcGVycyhkaW0uc2xpY2UoMSksIHN1YnN0YXRlW2ldLCBsb2dfcG9zdCwgcHJvcF9sb2dfc2NhbGVbaV0sIFxuICAgICAgICAgICAgYmF0Y2hfc2l6ZVtpXSwgbWF4X2FkYXB0YXRpb25baV0sIGluaXRpYWxfYWRhcHRhdGlvbltpXSwgdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZ1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdGVwcGVycztcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBjcmVhdGVfc3Vic3RlcHBlcnModGhpcy5kaW0sIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSwgdGhpcy5sb2dfcG9zdCxcbiAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUsIHRoaXMuYmF0Y2hfc2l6ZSwgdGhpcy5tYXhfYWRhcHRhdGlvbiwgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24sXG4gICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSwgdGhpcy5pc19hZGFwdGluZyk7XG4gICAgXG4gIH07XG4gIFxuICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEdvIHRocm91Z2ggdGhlIHN1YnN0ZXBwZXJzIGluIGEgcmFuZG9tIG9yZGVyIGFuZCBjYWxsIHN0ZXAoKSBvbiB0aGVtLlxuICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtyZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7IH0pO1xuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7c3Vic3RlcHBlci5zdGFydF9hZGFwdGF0aW9uKCk7IH0pO1xuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtzdWJzdGVwcGVyLnN0b3BfYWRhcHRhdGlvbigpOyB9KTtcbiAgfTtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtcbiAgICAgIHJldHVybiBzdWJzdGVwcGVyLmluZm8oKTsgXG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBhdWdtZW50cyB7TXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgUmVhbE1ldHJvcG9saXNTdGVwcGVyKTtcbiAgfTtcbiAgXG4gIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7XG5cbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9XG4gICAqIEEgXCJzdWJjbGFzc1wiIG9mIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqLyAgICBcbiAgdmFyIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgSW50TWV0cm9wb2xpc1N0ZXBwZXIpO1xuICB9O1xuICBcbiAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGEgc3RlcCBmb3IgYSBiaW5hcnkgcGFyYW1ldGVyLlxuICAgKiBUaGlzIGlzIGRvbmUgYnkgZXZhbHVhdGluZyB0aGUgbG9nIHBvc3RlcmlvciBmb3IgYm90aCBzdGF0ZXMgb2YgdGhlXG4gICAqIHBhcmFtZXRlciBhbmQgdGhlbiBzZWxlY3RpbmcgYSBzdGF0ZSByYW5kb21seSB3aXRoIHByb2JhYmlsaXR5IHJlbGF0aXZlIFxuICAgKiB0byB0aGUgcG9zdGVyaW9yIG9mIGVhY2ggc3RhdGUuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEJpbmFyeVN0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7XG4gICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIGlmKHBhcmFtX25hbWVzLmxlbmd0aCAgPT0gMSkge1xuICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiQmluYXJ5U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICB9O1xuICBcbiAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5U3RlcHBlcjtcbiAgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSAwO1xuICAgIHZhciB6ZXJvX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpO1xuICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDE7XG4gICAgdmFyIG9uZV9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICB2YXIgbWF4X2xvZ19kZW5zID0gTWF0aC5tYXgoemVyb19sb2dfZGVucywgb25lX2xvZ19kZW5zKTtcbiAgICB6ZXJvX2xvZ19kZW5zIC09IG1heF9sb2dfZGVucztcbiAgICBvbmVfbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zO1xuICAgIHZhciB6ZXJvX3Byb2IgPSBNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zIC0gTWF0aC5sb2coIE1hdGguZXhwKHplcm9fbG9nX2RlbnMpICsgTWF0aC5leHAob25lX2xvZ19kZW5zKSApICk7XG4gICAgaWYoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikge1xuICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC5cbiAgICByZXR1cm4gMTtcbiAgfTtcbiAgXG4gICAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogSnVzdCBsaWtlIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgdGhpcyBTdGVwcGVyIHRha2VzIGEgc3RlcHMgZm9yXG4gICAqIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgYnkgdXBkYXRpbmcgZWFjaCBjb21wb25lbnQgaW4gdHVybi4gVGhlIGRpZmZlcmVuY2VcbiAgICogaXMgdGhhdCB0aGlzIHN0ZXBwZXIgd29ya3Mgb24gYmluYXJ5IHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgYSBcbiAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7XG4gICAgXG4gICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIGlmKHBhcmFtX25hbWVzLmxlbmd0aCAgPT0gMSkge1xuICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07XG4gICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdO1xuICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiQmluYXJ5Q29tcG9uZW50U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIFxuICAgIHZhciBjcmVhdGVfc3Vic3RlcHBlcnMgPSBcbiAgICAgIGZ1bmN0aW9uKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0KSB7XG4gICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTtcbiAgICAgIHZhciBpO1xuICAgICAgaWYoZGltLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykge1xuICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTtcbiAgICAgICAgICBzdWJwYXJhbXNbaV0gPSBwYXJhbTtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBCaW5hcnlTdGVwcGVyKHN1YnBhcmFtcywgc3Vic3RhdGUsIGxvZ19wb3N0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IGNyZWF0ZV9zdWJzdGVwcGVycyhkaW0uc2xpY2UoMSksIHN1YnN0YXRlW2ldLCBsb2dfcG9zdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdGVwcGVycztcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBjcmVhdGVfc3Vic3RlcHBlcnModGhpcy5kaW0sIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSwgdGhpcy5sb2dfcG9zdCk7XG4gIH07XG4gIFxuICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlDb21wb25lbnRTdGVwcGVyO1xuICBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEdvIHRocm91Z2ggdGhlIHN1YnN0ZXBwZXJzIGluIGEgcmFuZG9tIG9yZGVyIGFuZCBjYWxsIHN0ZXAoKSBvbiB0aGVtLlxuICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtyZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7IH0pO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogVGhpcyBzdGVwcGVyIGNhbiBiZSByZXNwb25zaWJsZSBmb3IgdGFraW5nIGEgc3RlcCBmb3Igb25lIG9yIG1vcmUgcGFyYW1ldGVycy5cbiAgICogRm9yIHJlYWwgYW5kIGludCBwYXJhbWV0ZXJzIGl0IHRha2VzIE1ldHJvcG9saXMgd2l0aGluIEdpYmJzIHN0ZXBzLCBhbmQgZm9yIFxuICAgKiBiaW5hcnkgcGFyYW1ldGVycyBpdCBkb2VzIGV2YWx1YXRlcyB0aGUgcG9zdGVyaW9yIGZvciBib3RoIHBhcmFtdGVyIHZhbHVlcyBhbmRcbiAgICogcmFuZG9tbHkgY2hhbmdlcyB0byBhIGNlcnRhaW4gdmFsdWUgcHJvcG9ydGlvbmFsbHkgdG8gdGhhdCB2YWx1ZSdzIHBvc3RlcmlvclxuICAgKiAodGhpcyBpcyBhbHNvIGRvbmUgZm9yIGVhY2ggcGFyYW1ldGVyLCBzbyBhbHNvIGEgKiB3aXRoaW4gR2liYnMgYXBwcm9hY2gpLlxuICAgKiBUaGlzIHN0ZXBwZXIgaXMgYWxzbyBhZGFwdGl2ZSBhbmQgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyc1xuICAgKiBhcmUgbm90IHRvbyBoaWdoIGFuZCB0aGUgY29ycmVsYXRpb25zIGJldHdlZW4gcGFyYW1ldGVycyBhcmUgbG93LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnNcbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEFtd2dTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgdGhpcy5zdWJzdGVwcGVycyA9IFtdO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV07XG4gICAgICB2YXIgU2VsZWN0U3RlcHBlcjtcbiAgICAgIHN3aXRjaCAocGFyYW0udHlwZSkge1xuICAgICAgICBjYXNlIFwicmVhbFwiOlxuICAgICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImludFwiOlxuICAgICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEludE1ldHJvcG9saXNTdGVwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJiaW5hcnlcIjpcbiAgICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgXCJBbXdnU3RlcHBlciBjYW4ndCBoYW5kbGUgcGFyYW1ldGVyIFwiICsgdGhpcy5wYXJhbV9uYW1lc1tpXSAgK1wiIHdpdGggdHlwZSBcIiArIHBhcmFtLnR5cGU7IFxuICAgICAgfVxuICAgICAgdmFyIHBhcmFtX29iamVjdF93cmFwID0ge307XG4gICAgICBwYXJhbV9vYmplY3Rfd3JhcFt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHBhcmFtO1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICB2YXIgcGFyYW1fb3B0aW9ucyA9IG9wdGlvbnMucGFyYW1zICYmIG9wdGlvbnMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dIHx8IHt9O1xuICAgICAgcGFyYW1fb3B0aW9ucy5wcm9wX2xvZ19zY2FsZSAgICAgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlICAgICB8fCBvcHRpb25zLnByb3BfbG9nX3NjYWxlOyBcbiAgICAgIHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSAgICAgICAgID0gcGFyYW1fb3B0aW9ucy5iYXRjaF9zaXplICAgICAgICAgfHwgb3B0aW9ucy5iYXRjaF9zaXplOyBcbiAgICAgIHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gICAgID0gcGFyYW1fb3B0aW9ucy5tYXhfYWRhcHRhdGlvbiAgICAgfHwgb3B0aW9ucy5tYXhfYWRhcHRhdGlvbjtcbiAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247XG4gICAgICBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSA9IHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlIHx8IG9wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlOyBcbiAgICAgIHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgICAgICAgID0gcGFyYW1fb3B0aW9ucy5pc19hZGFwdGluZyAgICAgICAgfHwgb3B0aW9ucy5pc19hZGFwdGluZzsgXG4gICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldID0gbmV3IFNlbGVjdFN0ZXBwZXIocGFyYW1fb2JqZWN0X3dyYXAsIHN0YXRlLCBsb2dfcG9zdCwgcGFyYW1fb3B0aW9ucyk7XG4gICAgfVxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU3RlcHBlcjtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGVwKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGFydF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpO1xuICAgIH0gXG4gIH07XG4gIFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbmZvID0ge307XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGluZm9bdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnN1YnN0ZXBwZXJzW2ldLmluZm8oKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH07XG4gIFxuICBcbiAgXG4gIC8vLy8vLy8vLy8vIFNhbXBsZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgXG4gICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYVxuICAvLyBTYW1wbGVyIGlzIGhlcmUgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB3aGVyZSBhbiBpbnN0YW5jZSBvZiBTYW1wbGVyXG4gIC8vIHNldHMgdXAgdGhlIFN0ZXBwZXJzLCBjaGVja3MgdGhlIHBhcmFtZXRlciBkZWZpbml0aW9uLFxuICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyIFwiaW50ZXJmYWNlXCIuXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6XG4gICAqICAge1wibXVcIjoge1widHlwZVwiOiBcInJlYWxcIn0sIFwic2lnbWFcIjoge1widHlwZVwiOiBcInJlYWxcIiwgXCJsb3dlclwiID0gMH19XG4gICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBkb2Vzbid0IGhhdmUgdG8gYmUgXCJjb21wbGV0ZVwiIGFuZCBwcm9wZXJ0aWVzXG4gICAqICAgbGVmdCBvdXQgKGxpa2UgbG93ZXIgYW5kIHVwcGVyKSB3aWxsIGJlIGZpbGxlZCBpbiBieSBkZWZhdWx0cy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmVcbiAgICogICBzdGF0ZSB3aWxsIGJlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN0YXRlIHdpdGggZWFjaCBwYXJhbWV0ZXIgYXMgYSBcbiAgICogICBrZXkgYW5kIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFzIG51bWJlcnMgb3IgYXJyYXlzLiBGb3IgZXhhbXBsZTpcbiAgICogICB7XCJtdVwiOiAzLCBcInNpZ21hXCI6IDEuNX0uIFRoZSBkYXRhIGFyZ3VtZW50IHdpbGwgYmUgdGhlIHNhbWUgb2JqZWN0IGFzIFxuICAgKiAgIHRoZSBkYXRhIGFyZ3VtZW50IGdpdmVuIGJlbG93LlxuICAgKiBAcGFyYW0gZGF0YSAtIGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBsb2dfcG9zdCBmdW5jdGlvblxuICAgKiAgIHdoZW4gc2FtcGxpbmcuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc2FtcGxlci5cbiAgICovXG4gIHZhciBTYW1wbGVyID0gZnVuY3Rpb24ocGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucykge1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5wYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBcbiAgICAvLyBTZXR0aW5nIGRlZmF1bHQgb3B0aW9ucyBpZiBub3QgcGFzc2VkIHRocm91Z2ggdGhlIG9wdGlvbnMgb2JqZWN0XG4gICAgdGhpcy5wYXJhbV9pbml0X2Z1biAgID0gZ2V0X29wdGlvbihcInBhcmFtX2luaXRfZnVuXCIsIG9wdGlvbnMsIHBhcmFtX2luaXRfZml4ZWQpO1xuICAgIHZhciB0aGlubmluZ19pbnRlcnZhbCA9IGdldF9vcHRpb24oXCJ0aGluXCIsIG9wdGlvbnMsIDEpO1xuICAgIHZhciBwYXJhbXNfdG9fbW9uaXRvciA9IGdldF9vcHRpb24oXCJtb25pdG9yXCIsIG9wdGlvbnMsIG51bGwpO1xuICAgIHRoaXMudGhpbih0aGlubmluZ19pbnRlcnZhbCk7XG4gICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIC8vIENvbXBsZXRpbmcgdGhlIHBhcmFtcyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBzdGF0ZS5cbiAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7XG4gICAgdmFyIHN0YXRlID0ge307XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1fbmFtZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7XG4gICAgfVxuICAgIHRoaXMubG9nX3Bvc3QgPSBmdW5jdGlvbigpIHsgXG4gICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpO1xuICAgIH07XG4gICAgLy8gUnVubmluZyB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24gb25jZSBpbiBjYXNlIGl0IGZ1cnRoZXIgbW9kaWZpZXMgdGhlIHN0YXRlXG4gICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy5cbiAgICB0aGlzLmxvZ19wb3N0KCk7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpO1xuICB9O1xuICBcbiAgLyoqIFNob3VsZCByZXR1cm4gYSB2ZWN0b3Igb2Ygc3RlcHBlcnMgdGhhdCB3aGVuIGNhbGxlZCBcbiAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuXG4gICAqL1xuICBTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uKHN0YXRlLCBsb2dfcG9zdCl7XG4gICAgdGhyb3cgXCJFdmVyeSBTYW1wbGVyIG5lZWRzIHRvIGltcGxlbWVudCBjcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSgpXCI7XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgU2FtcGxlci5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtzdGF0ZTogdGhpcy5zdGF0ZSwgdGhpbjogdGhpcy50aGluLCBtb25pdG9yOiB0aGlzLm1vbml0b3IsXG4gICAgICAgICAgICBzdGVwcGVyczogdGhpcy5zdGVwcGVyc307XG4gIH07XG4gIFxuICAvKiogVGFrZXMgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuIFJldHVybnMgdGhlIG5ldyBzcGFjZVxuICAgKiBidXQgYWxzbyBtb2RpZmllcyB0aGUgc3RhdGUgaW4gcGxhY2UuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdGVwcGVycyk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RlcCgpO1xuICAgIH1cbiAgICBpZihPYmplY3Qua2V5cyh0aGlzLnN0YXRlKS5sZW5ndGggPiBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcykubGVuZ3RoKSB7XG4gICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2VcbiAgICAgIC8vIG5lZWQgdG8gcnVuIHRoZSBsb2dfcG9zdCBvbmNlIG1vcmUgaW4gb3JkZXIgdG8gc2V0IHRoZSBkZXJpdmVkIHF1YW50aXRpZXNcbiAgICAgIC8vIGZvciB0aGUgZmluYWwgcGFyYW1ldGVyIHN0YXRlXG4gICAgICB0aGlzLmxvZ19wb3N0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIG5faXRlcmF0aW9ucyBzdGVwcyBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlIGFuZCByZXR1cm5zIHRoZW1cbiAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZTpcbiAgICoge211OiBbMSwgLTEsIDIsIDMsIC4uLl0sIHNpZ21hOiBbMSwgMiwgMiwgMSwgLi4uXX0uXG4gICAqIElmIHRoaW4gaXMgPiAxIHRoZW4gbl9pdGVyYXRpb25zIC8gdGhpbiBzYW1wbGVzIGFyZSByZXR1cm5lZC5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5zYW1wbGUgPSBmdW5jdGlvbihuX2l0ZXJhdGlvbnMpIHtcbiAgICAgIC8vIEluaXRpYWxpemluZyBjdXJyX3NhbXBsZSB3aGVyZSB0aGUgc2FtcGxlIGlzIGdvaW5nIHRvIGJlIHNhdmVkXG4gICAgICAvLyBhcyBhbiBvYmplY3QgY29udGFpbmluZyBvbmUgYXJyYXkgcGVyIHBhcmFtZXRlciB0byBiZSBtb25pdG9yZWQuXG4gICAgICB2YXIgaSwgaiwgbW9uaXRvcmVkX3BhcmFtcztcbiAgICAgIGlmKHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9PT0gbnVsbCkge1xuICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gdGhpcy5tb25pdG9yZWRfcGFyYW1zO1xuICAgICAgfVxuICAgICAgXG4gICAgICB2YXIgY3Vycl9zYW1wbGUgPSB7fTtcbiAgICAgIGZvcihqID0gMDsgaiA8IG1vbml0b3JlZF9wYXJhbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY3Vycl9zYW1wbGVbbW9uaXRvcmVkX3BhcmFtc1tqXV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZm9yKGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHtcbiAgICAgICAgaWYoaSAlIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPT09IDApIHtcbiAgICAgICAgICBmb3IoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW0gPSBtb25pdG9yZWRfcGFyYW1zW2pdO1xuICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goIGNsb25lX3BhcmFtX2RyYXcodGhpcy5zdGF0ZVtwYXJhbV0pICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RlcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJfc2FtcGxlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIG5faXRlcmF0aW9uIHN0ZXBzIGluIHBhcmFtZXRlciBzcGFjZSBidXQgcmV0dXJucyBub3RoaW5nLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLmJ1cm4gPSBmdW5jdGlvbihuX2l0ZXJhdGlvbnMpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcCgpO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBTZXRzIHdoYXQgcGFyYW1ldGVycyBzaG91bGQgYmUgbW9uaXRvcmVkIGFuZCByZXR1cm5lZCB3aGVuIGNhbGxpbmdcbiAgICogc2FtcGxlLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLm1vbml0b3IgPSBmdW5jdGlvbihwYXJhbXNfdG9fbW9uaXRvcikge1xuICAgICAgdGhpcy5tb25pdG9yZWRfcGFyYW1zID0gcGFyYW1zX3RvX21vbml0b3I7XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyB0aGUgdGhpbm5pbmcuIEZvciBleGFtcGxlIHRoaW4gPT0gMTAgbWVhbnMgdGhhdCBldmVyeSAxMHRoIHBvc3RlcmlvclxuICAgKiBkcmF3IHdpbGwgYmUga2VwdC5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS50aGluID0gZnVuY3Rpb24odGhpbm5pbmdfaW50ZXJ2YWwpIHtcbiAgICB0aGlzLnRoaW5uaW5nX2ludGVydmFsID0gdGhpbm5pbmdfaW50ZXJ2YWw7XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyBhZGFwdGF0aW9uIG9uLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTtcbiAgICB9XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBTZXRzIGFkYXB0YXRpb24gb2ZmLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1NhbXBsZXJ9XG4gICAqIFRoaXMgc2FtcGxlciB1c2VzIHRoZSBBbXdnU3RlcHBlciBhcyB0aGUgc3RlcHBlciBmdW5jdGlvbiB3aGljaCBpbXBsZW1lbnRzIHRoZSBcbiAgICogQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluIFwiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQ1wiXG4gICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkuIEFuIGFkaXRpb24gaXMgdGhhdCBpdCBoYW5kbGVzIGludCBwYXJhbWV0ZXJzXG4gICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgXG4gICAqIHZhbHVlIHByb3BvcnRpb25hbCB0byB0aGUgcG9zdGVyaW9yIG9mIHRoZSB0d28gcG9zc2libGUgc3RhdGVzIG9mIHRoZVxuICAgKiBwYXJhbWV0ZXIuIFRoaXMgc2FtcGxlciBjYW4gYmUgZWZmaWNpZW50IHdoZW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIG9uZSBvciBtb3JlIHBhcmFtZXRlciBkZWZpbml0aW9uc1xuICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLlxuICAqL1xuICB2YXIgQW13Z1NhbXBsZXIgPSBmdW5jdGlvbihwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7XG4gICAgU2FtcGxlci5jYWxsKHRoaXMsIHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpO1xuICB9O1xuICBcbiAgQW13Z1NhbXBsZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTYW1wbGVyLnByb3RvdHlwZSk7IFxuICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU2FtcGxlcjtcbiAgXG4gIEFtd2dTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKXtcbiAgICByZXR1cm4gWyBuZXcgQW13Z1N0ZXBwZXIocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIF07XG4gIH07XG4gIFxuICBcbiAgLy8gUmV0dXJuaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgcHVibGljbHkgZXhwb3NlZCBieSB0aGlzIG1vZHVsZVxuICByZXR1cm4ge1xuICAgIHJ1bmlmOiBydW5pZixcbiAgICBydW5pZl9kaXNjcmV0ZTogcnVuaWZfZGlzY3JldGUsXG4gICAgcm5vcm06IHJub3JtLFxuICAgIHBhcmFtX2luaXRfZml4ZWQ6IHBhcmFtX2luaXRfZml4ZWQsIFxuICAgIGNvbXBsZXRlX3BhcmFtczogY29tcGxldGVfcGFyYW1zLCBcbiAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwgXG4gICAgSW50TWV0cm9wb2xpc1N0ZXBwZXI6IEludE1ldHJvcG9saXNTdGVwcGVyLCBcbiAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjogTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIEJpbmFyeVN0ZXBwZXI6IEJpbmFyeVN0ZXBwZXIsIFxuICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI6IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIsIFxuICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwgXG4gICAgQW13Z1NhbXBsZXI6IEFtd2dTYW1wbGVyXG4gIH07XG59KSk7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA9PSBudWxsIHx8IGIgPT0gbnVsbCA/IE5hTiA6IGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbnVtYmVyKHgpIHtcbiAgcmV0dXJuIHggPT09IG51bGwgPyBOYU4gOiAreDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBudW1iZXJzKHZhbHVlcywgdmFsdWVvZikge1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IHBlcm11dGUgZnJvbSBcIi4vcGVybXV0ZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0KHZhbHVlcywgLi4uRikge1xuICBpZiAodHlwZW9mIHZhbHVlc1tTeW1ib2wuaXRlcmF0b3JdICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWx1ZXMgaXMgbm90IGl0ZXJhYmxlXCIpO1xuICB2YWx1ZXMgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gIGxldCBbZl0gPSBGO1xuICBpZiAoKGYgJiYgZi5sZW5ndGggIT09IDIpIHx8IEYubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChkLCBpKSA9PiBpKTtcbiAgICBpZiAoRi5sZW5ndGggPiAxKSB7XG4gICAgICBGID0gRi5tYXAoZiA9PiB2YWx1ZXMubWFwKGYpKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIEYpIHtcbiAgICAgICAgICBjb25zdCBjID0gYXNjZW5kaW5nRGVmaW5lZChmW2ldLCBmW2pdKTtcbiAgICAgICAgICBpZiAoYykgcmV0dXJuIGM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmID0gdmFsdWVzLm1hcChmKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IGFzY2VuZGluZ0RlZmluZWQoZltpXSwgZltqXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcGVybXV0ZSh2YWx1ZXMsIGluZGV4KTtcbiAgfVxuICByZXR1cm4gdmFsdWVzLnNvcnQoY29tcGFyZURlZmluZWQoZikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZURlZmluZWQoY29tcGFyZSA9IGFzY2VuZGluZykge1xuICBpZiAoY29tcGFyZSA9PT0gYXNjZW5kaW5nKSByZXR1cm4gYXNjZW5kaW5nRGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBjb21wYXJlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjb21wYXJlIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTtcbiAgICBpZiAoeCB8fCB4ID09PSAwKSByZXR1cm4geDtcbiAgICByZXR1cm4gKGNvbXBhcmUoYiwgYikgPT09IDApIC0gKGNvbXBhcmUoYSwgYSkgPT09IDApO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNjZW5kaW5nRGVmaW5lZChhLCBiKSB7XG4gIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1pbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbjtcbn1cbiIsImltcG9ydCB7YXNjZW5kaW5nRGVmaW5lZCwgY29tcGFyZURlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcXVpY2tzZWxlY3Rcbi8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWlja3NlbGVjdChhcnJheSwgaywgbGVmdCA9IDAsIHJpZ2h0ID0gSW5maW5pdHksIGNvbXBhcmUpIHtcbiAgayA9IE1hdGguZmxvb3Ioayk7XG4gIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTtcbiAgcmlnaHQgPSBNYXRoLmZsb29yKE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIHJpZ2h0KSk7XG5cbiAgaWYgKCEobGVmdCA8PSBrICYmIGsgPD0gcmlnaHQpKSByZXR1cm4gYXJyYXk7XG5cbiAgY29tcGFyZSA9IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IGFzY2VuZGluZ0RlZmluZWQgOiBjb21wYXJlRGVmaW5lZChjb21wYXJlKTtcblxuICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdCA9IGFycmF5W2tdO1xuICAgIGxldCBpID0gbGVmdDtcbiAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgc3dhcChhcnJheSwgbGVmdCwgayk7XG4gICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTtcblxuICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbaV0sIHQpIDwgMCkgKytpO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbal0sIHQpID4gMCkgLS1qO1xuICAgIH1cblxuICAgIGlmIChjb21wYXJlKGFycmF5W2xlZnRdLCB0KSA9PT0gMCkgc3dhcChhcnJheSwgbGVmdCwgaik7XG4gICAgZWxzZSArK2osIHN3YXAoYXJyYXksIGosIHJpZ2h0KTtcblxuICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICBpZiAoayA8PSBqKSByaWdodCA9IGogLSAxO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBzd2FwKGFycmF5LCBpLCBqKSB7XG4gIGNvbnN0IHQgPSBhcnJheVtpXTtcbiAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgYXJyYXlbal0gPSB0O1xufVxuIiwiaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbmltcG9ydCBtYXhJbmRleCBmcm9tIFwiLi9tYXhJbmRleC5qc1wiO1xuaW1wb3J0IG1pbiBmcm9tIFwiLi9taW4uanNcIjtcbmltcG9ydCBtaW5JbmRleCBmcm9tIFwiLi9taW5JbmRleC5qc1wiO1xuaW1wb3J0IHF1aWNrc2VsZWN0IGZyb20gXCIuL3F1aWNrc2VsZWN0LmpzXCI7XG5pbXBvcnQgbnVtYmVyLCB7bnVtYmVyc30gZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge2FzY2VuZGluZ0RlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBncmVhdGVzdCBmcm9tIFwiLi9ncmVhdGVzdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHtcbiAgdmFsdWVzID0gRmxvYXQ2NEFycmF5LmZyb20obnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpKTtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpO1xuICBpZiAocCA+PSAxKSByZXR1cm4gbWF4KHZhbHVlcyk7XG4gIHZhciBuLFxuICAgICAgaSA9IChuIC0gMSkgKiBwLFxuICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLFxuICAgICAgdmFsdWUwID0gbWF4KHF1aWNrc2VsZWN0KHZhbHVlcywgaTApLnN1YmFycmF5KDAsIGkwICsgMSkpLFxuICAgICAgdmFsdWUxID0gbWluKHZhbHVlcy5zdWJhcnJheShpMCArIDEpKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZVNvcnRlZCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1swXSwgMCwgdmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9ICt2YWx1ZW9mKHZhbHVlc1tpMF0sIGkwLCB2YWx1ZXMpLFxuICAgICAgdmFsdWUxID0gK3ZhbHVlb2YodmFsdWVzW2kwICsgMV0sIGkwICsgMSwgdmFsdWVzKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZUluZGV4KHZhbHVlcywgcCwgdmFsdWVvZiA9IG51bWJlcikge1xuICBpZiAoaXNOYU4ocCA9ICtwKSkgcmV0dXJuO1xuICBudW1iZXJzID0gRmxvYXQ2NEFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSk7XG4gIGlmIChwIDw9IDApIHJldHVybiBtaW5JbmRleChudW1iZXJzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heEluZGV4KG51bWJlcnMpO1xuICB2YXIgbnVtYmVycyxcbiAgICAgIGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChfLCBpKSA9PiBpKSxcbiAgICAgIGogPSBudW1iZXJzLmxlbmd0aCAtIDEsXG4gICAgICBpID0gTWF0aC5mbG9vcihqICogcCk7XG4gIHF1aWNrc2VsZWN0KGluZGV4LCBpLCAwLCBqLCAoaSwgaikgPT4gYXNjZW5kaW5nRGVmaW5lZChudW1iZXJzW2ldLCBudW1iZXJzW2pdKSk7XG4gIGkgPSBncmVhdGVzdChpbmRleC5zdWJhcnJheSgwLCBpICsgMSksIChpKSA9PiBudW1iZXJzW2ldKTtcbiAgcmV0dXJuIGkgPj0gMCA/IGkgOiAtMTtcbn1cbiIsImltcG9ydCBxdWFudGlsZSwge3F1YW50aWxlSW5kZXh9IGZyb20gXCIuL3F1YW50aWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgcmV0dXJuIHF1YW50aWxlKHZhbHVlcywgMC41LCB2YWx1ZW9mKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lZGlhbkluZGV4KHZhbHVlcywgdmFsdWVvZikge1xuICByZXR1cm4gcXVhbnRpbGVJbmRleCh2YWx1ZXMsIDAuNSwgdmFsdWVvZik7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHtcbiAgdGhpcy5rID0gaztcbiAgdGhpcy54ID0geDtcbiAgdGhpcy55ID0geTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSxcbiAgc2NhbGU6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gayA9PT0gMSA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuayAqIGssIHRoaXMueCwgdGhpcy55KTtcbiAgfSxcbiAgdHJhbnNsYXRlOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIHggPT09IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlzLmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldO1xuICB9LFxuICBhcHBseVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geCAqIHRoaXMuayArIHRoaXMueDtcbiAgfSxcbiAgYXBwbHlZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24obG9jYXRpb24pIHtcbiAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdO1xuICB9LFxuICBpbnZlcnRYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuICh4IC0gdGhpcy54KSAvIHRoaXMuaztcbiAgfSxcbiAgaW52ZXJ0WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7XG4gIH0sXG4gIHJlc2NhbGVYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7XG4gIH0sXG4gIHJlc2NhbGVZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkuY29weSgpLmRvbWFpbih5LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSwgdGhpcykubWFwKHkuaW52ZXJ0LCB5KSk7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyB0aGlzLnggKyBcIixcIiArIHRoaXMueSArIFwiKSBzY2FsZShcIiArIHRoaXMuayArIFwiKVwiO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0gbmV3IFRyYW5zZm9ybSgxLCAwLCAwKTtcblxudHJhbnNmb3JtLnByb3RvdHlwZSA9IFRyYW5zZm9ybS5wcm90b3R5cGU7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlKSB7XG4gIHdoaWxlICghbm9kZS5fX3pvb20pIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHJldHVybiBub2RlLl9fem9vbTtcbn1cbiIsIlxuLypcbiAgSFRETWF0aCBTdGF0aWMgQ2xhc3MgLSBOb3QgaW50ZW5kZWQgZm9yIGluc3RhbnRpYXRpb24hXG5cbiAgVmFyaWFibGVzOlxuICAgIEEgPSBhbW91bnRcbiAgICBEID0gZGVsYXlcbiAgICBWID0gc3ViamVjdGl2ZSB2YWx1ZVxuXG4gICAgayA9IGRpc2NvdW50IGZhY3RvclxuXG4gIEVxdWF0aW9uczpcbiAgICBWID0gQSAvICgxICsga0QpXG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSFRETWF0aCB7XG4gIHN0YXRpYyBhZGsydihhLCBkLCBrKSB7XG4gICAgcmV0dXJuIGEgLyAoMSArIGsgKiBkKTtcbiAgfVxuXG4gIHN0YXRpYyBhZHYyayhhLCBkLCB2KSB7XG4gICAgcmV0dXJuIChhIC0gdikgLyAodiAqIGQpO1xuICB9XG59XG4iLCJcbi8vIEludGVybmFsIGRlcGVuZGVuY2llc1xuaW1wb3J0IEhURE1hdGggZnJvbSAnLi9odGQtbWF0aCc7XG5cbmV4cG9ydCBkZWZhdWx0IEhURE1hdGg7XG4iLCIvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1nbG9iYWxzOiBbXCJvZmZcIiwgXCJzZWxmXCJdICovXG5cbi8vIE5lZWRlZCBmb3IgZDMgaW4gV2ViV29ya2VyIVxuaW1wb3J0ICdyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUnO1xuXG5pbXBvcnQgKiBhcyBCYXllc0Rpc3RyaWJ1dGlvbnMgZnJvbSAnYmF5ZXMuanMvZGlzdHJpYnV0aW9ucyc7XG5pbXBvcnQgKiBhcyBCYXllc01jbWMgZnJvbSAnYmF5ZXMuanMvbWNtYyc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgSFRETWF0aCBmcm9tICdAZGVjaWRhYmxlcy9kaXNjb3VudGFibGUtbWF0aCc7XG5cbnNlbGYub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBrOiB7dHlwZTogJ3JlYWwnLCBsb3dlcjogMCwgdXBwZXI6IDEwMH0sXG4gICAgbHVjZToge3R5cGU6ICdyZWFsJywgbG93ZXI6IDAsIHVwcGVyOiAxMDB9LFxuICB9O1xuXG4gIGNvbnN0IGxvZ1Bvc3QgPSAoc3RhdGUsIGRhdGEpID0+IHtcbiAgICBsZXQgbHAgPSAwO1xuXG4gICAgLy8gUHJpb3JzXG4gICAgY29uc3Qga01lYW4gPSAyO1xuICAgIGNvbnN0IGtTaGFwZSA9IDM7XG4gICAgbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLmdhbW1hKFxuICAgICAgc3RhdGUuayxcbiAgICAgIGtTaGFwZSxcbiAgICAgIGtTaGFwZSAvIGtNZWFuLFxuICAgICk7XG4gICAgLy8gbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLnVuaWYoc3RhdGUuaywgMCwgMTAwKTtcblxuICAgIGNvbnN0IGx1Y2VNZWFuID0gMjtcbiAgICBjb25zdCBsdWNlU2hhcGUgPSAzO1xuICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5nYW1tYShcbiAgICAgIHN0YXRlLmx1Y2UsXG4gICAgICBsdWNlU2hhcGUsXG4gICAgICBsdWNlU2hhcGUgLyBsdWNlTWVhbixcbiAgICApO1xuICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7XG5cbiAgICAvLyBMaWtlbGlob29kXG4gICAgZGF0YS5mb3JFYWNoKChjaG9pY2UpID0+IHtcbiAgICAgIC8vIFZhbHVlc1xuICAgICAgY29uc3QgdnMgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hcywgY2hvaWNlLmRzLCBzdGF0ZS5rKTtcbiAgICAgIGNvbnN0IHZsID0gSFRETWF0aC5hZGsydihjaG9pY2UuYWwsIGNob2ljZS5kbCwgc3RhdGUuayk7XG5cbiAgICAgIC8vIENob2ljZSBvZiBzb29uZXIgb3IgbGF0ZXIgaXMgc2FtcGxlZCBmcm9tIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvblxuICAgICAgLy8gTHVjZSBjaG9pY2UgcnVsZSBpcyB1c2VkIHRvIGNvbXB1dGUgcHJvYmFiaWxpdHkgb2Ygd2FpdGluZyEgKDAgPSBzb29uZXIsIDEgPSBsYXRlcilcbiAgICAgIGNvbnN0IGJpbnZhbCA9IDEgLyAoMSArIE1hdGguZXhwKHN0YXRlLmx1Y2UgKiAodnMgLSB2bCkpKTtcblxuICAgICAgLy8gQWN0dWFsIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZSA9IChjaG9pY2UucmVzcG9uc2UgPT09ICdmaXJzdCcpID8gMCA6IDE7XG5cbiAgICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5iZXJuKHJlc3BvbnNlLCBiaW52YWwpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxwO1xuICB9O1xuXG4gIC8vIEluaXRpYWxpemluZyB0aGUgc2FtcGxlclxuICBjb25zdCBzYW1wbGVyID0gbmV3IEJheWVzTWNtYy5BbXdnU2FtcGxlcihwYXJhbXMsIGxvZ1Bvc3QsIGV2ZW50LmRhdGEpO1xuICAvLyBCdXJuaW5nIHNvbWUgc2FtcGxlcyB0byB0aGUgTUNNQyBnb2RzIGFuZCBzYW1wbGluZyA1MDAwIGRyYXdzXG4gIHNhbXBsZXIuYnVybigxMDAwKTtcbiAgY29uc3Qgc2FtcGxlcyA9IHNhbXBsZXIuc2FtcGxlKDUwMDApO1xuXG4gIC8vIEV4dHJhY3Qgc3VtbWFyeSBzdGF0c1xuICBjb25zdCByZXN1bHRzID0ge1xuICAgIGs6IGQzLm1lZGlhbihzYW1wbGVzLmspLFxuICAgIGx1Y2U6IGQzLm1lZGlhbihzYW1wbGVzLmx1Y2UpLFxuICB9O1xuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe3Jlc3VsdHM6IHJlc3VsdHMsIHNhbXBsZXM6IHNhbXBsZXN9KTtcbn07XG4iXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJtb2R1bGUiLCJleHBvcnRzIiwibGQiLCJ0aGlzIiwibGdhbW1hIiwieCIsImoiLCJjb2YiLCJzZXIiLCJ4eCIsInkiLCJ0bXAiLCJsb2ciLCJsZmFjdG9yaWFsIiwibiIsIk5hTiIsImxjaG9vc2UiLCJrIiwibGJldGEiLCJhIiwiYiIsIk1hdGgiLCJleHAiLCJhYnMiLCJwb3ciLCJzcXJ0IiwicGkiLCJQSSIsImJldGEiLCJzaGFwZTEiLCJzaGFwZTIiLCJJbmZpbml0eSIsImNhdWNoeSIsImxvY2F0aW9uIiwic2NhbGUiLCJub3JtIiwibWVhbiIsInNkIiwiYml2YXJub3JtIiwiY29yciIsInoiLCJub3JtYWxpemluZ19mYWN0b3IiLCJiaXZhcl9sb2dfZGVucyIsImxhcGxhY2UiLCJkZXhwIiwiZ2FtbWEiLCJzaGFwZSIsInJhdGUiLCJpbnZnYW1tYSIsImxub3JtIiwibWVhbmxvZyIsInNkbG9nIiwicGFyZXRvIiwidCIsImRmIiwid2VpYnVsbCIsInRtcDEiLCJ0bXAyIiwibG9naXMiLCJlIiwiZiIsImRpcmljaGxldCIsImFscGhhIiwic3VtX2FscGhhIiwic3VtX2xnYW1tYV9hbHBoYSIsInN1bV9hbHBoYV9zdWJfMV9sb2dfeCIsImxlbmd0aCIsImkiLCJ1bmlmIiwibWluIiwibWF4IiwiYmVybiIsInByb2IiLCJjYXQiLCJwcm9icyIsImJpbm9tIiwic2l6ZSIsIm5iaW5vbSIsImh5cGVyIiwibSIsInBvaXMiLCJsYW1iZGEiLCJtY21jIiwicnVuaWYiLCJyYW5kb20iLCJydW5pZl9kaXNjcmV0ZSIsImZsb29yIiwicm5vcm0iLCJ1IiwidiIsInEiLCJkZWVwX2Nsb25lIiwic3JjIiwibWl4aW4iLCJkZXN0Iiwic291cmNlIiwiY29weUZ1bmMiLCJuYW1lIiwicyIsImVtcHR5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwibm9kZVR5cGUiLCJjbG9uZU5vZGUiLCJEYXRlIiwiZ2V0VGltZSIsIlJlZ0V4cCIsInIiLCJsIiwiQXJyYXkiLCJwdXNoIiwiY29uc3RydWN0b3IiLCJjbG9uZV9wYXJhbV9kcmF3IiwiaXNBcnJheSIsInhfY29weSIsInNsaWNlIiwiaXNfbnVtYmVyIiwib2JqZWN0IiwiTnVtYmVyIiwiY3JlYXRlX2FycmF5IiwiZGltIiwiaW5pdCIsImFyciIsImFycmF5X2RpbSIsImNvbmNhdCIsImFycmF5X2VxdWFsIiwiYTEiLCJhMiIsIm5lc3RlZF9hcnJheV9hcHBseSIsImZ1biIsInJlc3VsdCIsInNodWZmbGVfYXJyYXkiLCJhcnJheSIsInRlbXAiLCJuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5IiwibGVuIiwiYXJyYXlfaXMiLCJhcnJheV9pIiwiZ2V0X29wdGlvbiIsIm9wdGlvbl9uYW1lIiwib3B0aW9ucyIsImRlZmF1bF92YWx1ZSIsImhhc093blByb3BlcnR5IiwidW5kZWZpbmVkIiwiZ2V0X211bHRpZGltX29wdGlvbiIsInZhbHVlIiwicGFyYW1faW5pdF9maXhlZCIsInR5cGUiLCJsb3dlciIsInVwcGVyIiwicm91bmQiLCJjb21wbGV0ZV9wYXJhbXMiLCJwYXJhbXNfdG9fY29tcGxldGUiLCJwYXJhbV9pbml0IiwicGFyYW1zIiwicGFyYW1fbmFtZSIsInBhcmFtIiwiU3RlcHBlciIsInN0YXRlIiwibG9nX3Bvc3QiLCJzdGVwIiwic3RhcnRfYWRhcHRhdGlvbiIsInN0b3BfYWRhcHRhdGlvbiIsImluZm8iLCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciIsImdlbmVyYXRlX3Byb3Bvc2FsIiwicGFyYW1fbmFtZXMiLCJrZXlzIiwicHJvcF9sb2dfc2NhbGUiLCJiYXRjaF9zaXplIiwibWF4X2FkYXB0YXRpb24iLCJpbml0aWFsX2FkYXB0YXRpb24iLCJ0YXJnZXRfYWNjZXB0X3JhdGUiLCJpc19hZGFwdGluZyIsImFjY2VwdGFuY2VfY291bnQiLCJiYXRjaF9jb3VudCIsIml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24iLCJjcmVhdGUiLCJwYXJhbV9zdGF0ZSIsInBhcmFtX3Byb3Bvc2FsIiwiY3Vycl9sb2dfZGVucyIsInByb3BfbG9nX2RlbnMiLCJhY2NlcHRfcHJvYiIsImxvZ19zZF9hZGp1c3RtZW50Iiwibm9ybWFsX3Byb3Bvc2FsIiwiUmVhbE1ldHJvcG9saXNTdGVwcGVyIiwiZGlzY3JldGVfbm9ybWFsX3Byb3Bvc2FsIiwiSW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiU3ViU3RlcHBlciIsImNyZWF0ZV9zdWJzdGVwcGVycyIsInN1YnN0YXRlIiwic3Vic3RlcHBlcnMiLCJzdWJvcHRpb25zIiwic3VicGFyYW0iLCJzdWJzdGVwcGVyIiwiTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiQmluYXJ5U3RlcHBlciIsInplcm9fbG9nX2RlbnMiLCJvbmVfbG9nX2RlbnMiLCJtYXhfbG9nX2RlbnMiLCJ6ZXJvX3Byb2IiLCJCaW5hcnlDb21wb25lbnRTdGVwcGVyIiwic3VicGFyYW1zIiwiQW13Z1N0ZXBwZXIiLCJTZWxlY3RTdGVwcGVyIiwicGFyYW1fb2JqZWN0X3dyYXAiLCJwYXJhbV9vcHRpb25zIiwiU2FtcGxlciIsImRhdGEiLCJwYXJhbV9pbml0X2Z1biIsInRoaW5uaW5nX2ludGVydmFsIiwicGFyYW1zX3RvX21vbml0b3IiLCJ0aGluIiwibW9uaXRvciIsInN0ZXBwZXJzIiwiY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUiLCJzYW1wbGUiLCJuX2l0ZXJhdGlvbnMiLCJtb25pdG9yZWRfcGFyYW1zIiwiY3Vycl9zYW1wbGUiLCJidXJuIiwiQW13Z1NhbXBsZXIiLCJhc2NlbmRpbmciLCJudW1iZXJzIiwidmFsdWVzIiwidmFsdWVvZiIsImluZGV4IiwiY29tcGFyZURlZmluZWQiLCJjb21wYXJlIiwiYXNjZW5kaW5nRGVmaW5lZCIsIlR5cGVFcnJvciIsInF1aWNrc2VsZWN0IiwibGVmdCIsInJpZ2h0IiwibmV3TGVmdCIsIm5ld1JpZ2h0Iiwic3dhcCIsInF1YW50aWxlIiwicCIsIkZsb2F0NjRBcnJheSIsImZyb20iLCJpc05hTiIsImkwIiwidmFsdWUwIiwic3ViYXJyYXkiLCJ2YWx1ZTEiLCJtZWRpYW4iLCJUcmFuc2Zvcm0iLCJ0cmFuc2xhdGUiLCJhcHBseSIsInBvaW50IiwiYXBwbHlYIiwiYXBwbHlZIiwiaW52ZXJ0IiwiaW52ZXJ0WCIsImludmVydFkiLCJyZXNjYWxlWCIsImNvcHkiLCJkb21haW4iLCJyYW5nZSIsIm1hcCIsInJlc2NhbGVZIiwiSFRETWF0aCIsImFkazJ2IiwiZCIsImFkdjJrIiwic2VsZiIsIm9ubWVzc2FnZSIsImV2ZW50IiwibHVjZSIsImxvZ1Bvc3QiLCJscCIsImtNZWFuIiwia1NoYXBlIiwiQmF5ZXNEaXN0cmlidXRpb25zIiwibHVjZU1lYW4iLCJsdWNlU2hhcGUiLCJmb3JFYWNoIiwiY2hvaWNlIiwidnMiLCJhcyIsImRzIiwidmwiLCJhbCIsImRsIiwiYmludmFsIiwicmVzcG9uc2UiLCJzYW1wbGVyIiwiQmF5ZXNNY21jIiwic2FtcGxlcyIsInJlc3VsdHMiLCJkMyIsInBvc3RNZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Q0FHQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FPQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7R0FDQyxDQUFVQSxVQUFBQSxJQUFJLEVBQUVDLE9BQU8sRUFBRTtLQUlmLElBQWtDQyxNQUFNLENBQUNDLE9BQU8sRUFBRTtDQUM3RDtDQUNBO0NBQ0E7Q0FDUUQsTUFBQUEsTUFBQSxDQUFBQyxPQUFBLEdBQWlCRixPQUFPLEVBQUUsQ0FBQTtDQUNsQyxLQUFLLE1BQU07Q0FDWDtDQUNRRCxNQUFBQSxJQUFJLENBQUNJLEVBQUUsR0FBR0gsT0FBTyxFQUFFLENBQUE7Q0FDeEIsS0FBQTtDQUNILEdBQUMsRUFBQ0ksY0FBSSxFQUFFLFlBQVc7Q0FDbkI7S0FDRSxJQUFJRCxFQUFFLEdBQUksRUFBRSxDQUFBOztDQUVkO0NBQ0E7O0NBRUUsSUFBQSxJQUFJRSxNQUFNLEdBQUcsVUFBU0MsQ0FBQyxFQUFFO09BQ3ZCLElBQUlDLENBQUMsR0FBRyxDQUFDLENBQUE7Q0FDVCxNQUFBLElBQUlDLEdBQUcsR0FBRyxDQUNSLGlCQUFpQixFQUFFLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQ3hELENBQUMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FDL0QsQ0FBQTtPQUNELElBQUlDLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQTtDQUMzQixNQUFBLElBQUlDLEVBQUUsRUFBRUMsQ0FBQyxFQUFFQyxHQUFHLENBQUE7T0FDZEEsR0FBRyxHQUFHLENBQUNELENBQUMsR0FBR0QsRUFBRSxHQUFHSixDQUFDLElBQUks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QixDQUM1QnRILEtBQUssQ0FBQ2lILElBQUksRUFDVk8sU0FBUyxFQUNUQSxTQUFTLEdBQUdELFFBQ2QsQ0FBQyxDQUFBO0NBQ0Q7O0NBRUE7Q0FDQW5FLElBQUFBLElBQUksQ0FBQ3FFLE9BQU8sQ0FBRUMsTUFBTSxJQUFLO0NBQ3ZCO0NBQ0EsTUFBQSxNQUFNQyxFQUFFLEdBQUdqQixPQUFPLENBQUNDLEtBQUssQ0FBQ2UsTUFBTSxDQUFDRSxFQUFFLEVBQUVGLE1BQU0sQ0FBQ0csRUFBRSxFQUFFN0gsS0FBSyxDQUFDL0ksQ0FBQyxDQUFDLENBQUE7Q0FDdkQsTUFBQSxNQUFNNlEsRUFBRSxHQUFHcEIsT0FBTyxDQUFDQyxLQUFLLENBQUNlLE1BQU0sQ0FBQ0ssRUFBRSxFQUFFTCxNQUFNLENBQUNNLEVBQUUsRUFBRWhJLEtBQUssQ0FBQy9JLENBQUMsQ0FBQyxDQUFBOztDQUV2RDtDQUNBO0NBQ0EsTUFBQSxNQUFNZ1IsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUc1USxJQUFJLENBQUNDLEdBQUcsQ0FBQzBJLEtBQUssQ0FBQ2lILElBQUksSUFBSVUsRUFBRSxHQUFHRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7O0NBRXpEO09BQ0EsTUFBTUksUUFBUSxHQUFJUixNQUFNLENBQUNRLFFBQVEsS0FBSyxPQUFPLEdBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtPQUV0RGYsRUFBRSxJQUFJRyx5QkFBdUIsQ0FBQ1ksUUFBUSxFQUFFRCxNQUFNLENBQUMsQ0FBQTtDQUNqRCxLQUFDLENBQUMsQ0FBQTtDQUVGLElBQUEsT0FBT2QsRUFBRSxDQUFBO0lBQ1YsQ0FBQTs7Q0FFRDtDQUNBLEVBQUEsTUFBTWdCLE9BQU8sR0FBRyxJQUFJQyx1QkFBcUIsQ0FBQ3hJLE1BQU0sRUFBRXNILE9BQU8sRUFBRUYsS0FBSyxDQUFDNUQsSUFBSSxDQUFDLENBQUE7Q0FDdEU7Q0FDQStFLEVBQUFBLE9BQU8sQ0FBQ25FLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtDQUNsQixFQUFBLE1BQU1xRSxPQUFPLEdBQUdGLE9BQU8sQ0FBQ3ZFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTs7Q0FFcEM7Q0FDQSxFQUFBLE1BQU0wRSxPQUFPLEdBQUc7S0FDZHJSLENBQUMsRUFBRXNSLE1BQVMsQ0FBQ0YsT0FBTyxDQUFDcFIsQ0FBQyxDQUFDO0NBQ3ZCZ1EsSUFBQUEsSUFBSSxFQUFFc0IsTUFBUyxDQUFDRixPQUFPLENBQUNwQixJQUFJLENBQUE7SUFDN0IsQ0FBQTtHQUVESCxJQUFJLENBQUMwQixXQUFXLENBQUM7Q0FBQ0YsSUFBQUEsT0FBTyxFQUFFQSxPQUFPO0NBQUVELElBQUFBLE9BQU8sRUFBRUEsT0FBQUE7Q0FBTyxHQUFDLENBQUMsQ0FBQTtDQUN4RCxDQUFDOzs7Ozs7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTBdfQ==",Gp=!1,function(t){return pp=pp||Cp(yp,fp,Gp),new Worker(pp,t)});class Ap extends xF{static get properties(){return{}}constructor(){super(),this.k=.05,this.choices=[],this.samples=null,this.working=!1,this.queued=!1,this.worker=new mp,this.worker.onmessage=t=>{this.working=!1,this.samples=t.data.samples,this.k=t.data.results.k,this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-fit-update",{detail:{k:this.k},bubbles:!0})),this.queued&&this.fit()},this.fit()}fit(){this.working?this.queued=!0:(this.worker.postMessage(this.choices),this.working=!0,this.queued=!1)}clear(){this.choices=[],this.fit()}get(t="default"){const e=this.choices.find((e=>e.name===t));return void 0===e?null:e}set(t,e,n,i,s,c="",a=""){const l=this.choices.find((t=>t.name===c));void 0===l?this.choices.push({as:t,ds:e,al:n,dl:i,response:s,name:c,label:a}):(l.as=t,l.ds=e,l.al=n,l.dl=i,l.response=s,l.label=a),this.fit()}static get styles(){return[super.styles,a`
|
|
1372
|
+
`]}render(){return J``}willUpdate(){this.alignState()}update(t){if(super.update(t),Number.isNaN(this.width)||Number.isNaN(this.height)||Number.isNaN(this.rem))return;const e=this.width,n=this.height;let i,s;e/n>1.8?(s=n,i=1.8*s):(i=e,s=i/1.8);const c=2*this.rem,a=3*this.rem,l=3*this.rem,r=s-(c+a),o=i-(l+2*this.rem),g=parseInt(this.getComputedStyleValue("---transition-duration"),10),B=ko().domain([this.scale.time.min,this.scale.time.max]).range([0,o]),d=ko().domain([this.scale.value.min,this.scale.value.max]).range([r,0]),Q=hI().x((t=>B(t.d))).y((t=>d(t.v))),I=Mn(this.renderRoot).selectAll(".main").data([{width:this.width,height:this.height,rem:this.rem}]),F=I.enter().append("svg").classed("main",!0);F.html(xF.svgDefs);const u=F.merge(I).attr("viewBox",`0 0 ${i} ${s}`),h=F.append("g").classed("plot",!0),U=u.select(".plot").attr("transform",`translate(${l}, ${c})`);h.append("clipPath").attr("id","clip-htd-curves").append("rect"),U.select("clipPath rect").attr("height",r+1).attr("width",o+1);const b=h.append("g").classed("underlayer",!0),C=U.select(".underlayer");b.append("rect").classed("background",!0),C.select(".background").attr("height",r).attr("width",o),b.append("g").classed("axis-x",!0);C.select(".axis-x").attr("transform",`translate(0, ${d(0)})`).transition().duration(2*g).ease(zc).call(me(B)).attr("font-size",null).attr("font-family",null).selectAll("line, path").attr("stroke",null);const y=b.append("text").classed("title-x",!0).attr("text-anchor","middle");y.append("tspan").classed("name",!0).text("Delay ("),y.append("tspan").classed("math-var d",!0).text("D"),y.append("tspan").classed("name",!0).text(")"),C.select(".title-x").attr("transform",`translate(${o/2}, ${r+2.25*this.rem})`),b.append("g").classed("axis-y",!0);var f;C.select(".axis-y").transition().duration(2*g).ease(zc).call((f=d,pe(he,f))).attr("font-size",null).attr("font-family",null).selectAll("line, path").attr("stroke",null);const G=b.append("text").classed("title-y",!0).attr("text-anchor","middle");G.append("tspan").classed("name",!0).text("Value ("),G.append("tspan").classed("math-var v",!0).text("V"),G.append("tspan").classed("name",!0).text(")"),C.select(".title-y").attr("transform",`translate(${-2*this.rem}, ${r/2})rotate(-90)`),h.append("g").classed("content",!0);const p=U.select(".content").selectAll(".option").data(this.options.filter((t=>null!==t.a&&null!==t.d)),(t=>t.name)),m=p.enter().append("g").classed("option",!0);m.append("path").classed("curve",!0).attr("clip-path","url(#clip-htd-curves)").attr("d",(t=>{const e=ge(B(t.d),B(0),-1).map((e=>({d:B.invert(e),v:$F.adk2v(t.a,t.d-B.invert(e),this.k)})));return Q(e)})).attr("stroke-dasharray",((t,e,n)=>{if(t.trial){return`0,${n[e].getTotalLength()}`}return"none"})),m.append("line").classed("bar",!0).attr("x1",(t=>B(t.d))).attr("x2",(t=>B(t.d))).attr("y1",d(0)).attr("y2",(t=>d(t.a))).attr("stroke-dasharray",((t,e,n)=>{if(t.trial){return`0,${n[e].getTotalLength()}`}return"none"}));const A=m.append("g").classed("point",!0).attr("transform",(t=>`translate(${B(t.d)}, ${d(t.a)})`)).attr("opacity",(t=>t.trial?0:1));A.append("circle").classed("mark",!0),A.append("text").classed("label",!0);const x=m.merge(p);x.filter(((t,e,n)=>this.interactive&&!n[e].classList.contains("interactive"))).select(".curve").classed("interactive",!0).attr("tabindex",0).call(ni().subject((t=>({x:t.x,y:t.y}))).on("start",(t=>{Mn(t.currentTarget).classed("dragging",!0)})).on("drag",((t,e)=>{this.drag=!0;const n=e.d-B.invert(t.x),i=n<0?0:n>e.d?e.d:n,s=d.invert(t.y),c=s<=0?.001:s>e.a?e.a:s,a=$F.adv2k(e.a,i,c);this.k=a<this.scale.discount.min?this.scale.discount.min:a>this.scale.discount.max?this.scale.discount.max:this.scale.discount.round(a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))})).on("end",(t=>{Mn(t.currentTarget).classed("dragging",!1)}))).on("keydown",((t,e)=>{if(["ArrowUp","ArrowDown","ArrowRight","ArrowLeft"].includes(t.key)){let n=this.k;switch(t.key){case"ArrowUp":case"ArrowLeft":n*=t.shiftKey?.95:.85;break;case"ArrowDown":case"ArrowRight":n*=t.shiftKey?1.05:1.15}n=n<this.scale.discount.min?this.scale.discount.min:n>this.scale.discount.max?this.scale.discount.max:this.scale.discount.round(n),n!==this.k&&(this.k=n,this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))),t.preventDefault()}})),x.filter(((t,e,n)=>this.interactive&&!t.trial&&!n[e].classList.contains("interactive"))).select(".bar").classed("interactive",!0).attr("tabindex",0).call(ni().subject(((t,e)=>({x:B(e.d),y:d(e.a)}))).on("start",(t=>{Mn(t.currentTarget).classed("dragging",!0)})).on("drag",((t,e)=>{this.drag=!0;const n=B.invert(t.x);e.d=n<this.scale.time.min?this.scale.time.min:n>this.scale.time.max?this.scale.time.max:this.scale.time.round(n),"default"===e.name&&(this.d=e.d),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))})).on("end",(t=>{Mn(t.currentTarget).classed("dragging",!1)}))).on("keydown",((t,e)=>{if(["ArrowLeft","ArrowRight"].includes(t.key)){let n=e.d;switch(t.key){case"ArrowRight":n+=t.shiftKey?1:5;break;case"ArrowLeft":n-=t.shiftKey?1:5}n=n<this.scale.time.min?this.scale.time.min:n>this.scale.time.max?this.scale.time.max:n,n!==e.d&&(e.d=n,"default"===e.name&&(this.d=e.d),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))),t.preventDefault()}})),x.filter(((t,e,n)=>this.interactive&&!t.trial&&!n[e].classList.contains("interactive"))).select(".point").classed("interactive",!0).attr("tabindex",0).call(ni().subject(((t,e)=>({x:B(e.d),y:d(e.a)}))).on("start",(t=>{Mn(t.currentTarget).classed("dragging",!0)})).on("drag",((t,e)=>{this.drag=!0;const n=d.invert(t.y);e.a=n<this.scale.value.min?this.scale.value.min:n>this.scale.value.max?this.scale.value.max:this.scale.value.round(n),"default"===e.name&&(this.a=e.a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))})).on("end",(t=>{Mn(t.currentTarget).classed("dragging",!1)}))).on("keydown",((t,e)=>{if(["ArrowUp","ArrowDown"].includes(t.key)){let n=e.a;switch(t.key){case"ArrowUp":n+=t.shiftKey?1:5;break;case"ArrowDown":n-=t.shiftKey?1:5}n=n<this.scale.value.min?this.scale.value.min:n>this.scale.value.max?this.scale.value.max:n,n!==e.a&&(e.a=n,"default"===e.name&&(this.a=e.a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))),t.preventDefault()}})),x.filter(((t,e,n)=>!this.interactive&&n[e].classList.contains("interactive"))).select(".curve").classed("interactive",!1).attr("tabindex",null).on("drag",null).on("keydown",null),x.filter(((t,e,n)=>(!this.interactive||t.trial)&&n[e].classList.contains("interactive"))).select(".bar").classed("interactive",!1).attr("tabindex",null).on("drag",null).on("keydown",null),x.filter(((t,e,n)=>(!this.interactive||t.trial)&&n[e].classList.contains("interactive"))).select(".point").classed("interactive",!1).attr("tabindex",null).on("drag",null).on("keydown",null),x.filter((t=>t.new)).select(".curve").transition().duration(g).delay(g+g/10).ease(Tc).attrTween("stroke-dasharray",((t,e,n)=>{const i=n[e].getTotalLength();return Rs(`0,${i}`,`${i},0`)})).on("end",(t=>{t.new=!1,this.dispatchEvent(new CustomEvent("discountable-response",{detail:{trial:this.trialCount,as:this.as,ds:this.ds,al:this.al,dl:this.dl,response:this.response},bubbles:!0}))})),x.filter((t=>t.new)).select(".bar").transition().duration(g).ease(Tc).attrTween("stroke-dasharray",((t,e,n)=>{const i=n[e].getTotalLength();return Rs(`0,${i}`,`${i},${i}`)})),x.filter((t=>t.new)).select(".point").transition().duration(g/10).delay(g).ease(Tc).attrTween("opacity",(()=>Rs(0,1))),p.select(".curve").transition().duration(this.drag?0:this.firstUpdate?2*g:g).ease(zc).attrTween("d",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.a?i.a:t.a,t.a),c=Rs(void 0!==i.d?i.d:t.d,t.d);return t=>{i.a=s(t),i.d=c(t);const e=ge(B(i.d),B(0),-1).map((t=>({d:B.invert(t),v:$F.adk2v(i.a,i.d-B.invert(t),this.k)})));return Q(e)}})),p.select(".bar").transition().duration(this.drag?0:this.firstUpdate?2*g:g).ease(zc).attrTween("x1",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.d?i.d:t.d,t.d);return t=>(i.d=s(t),`${B(i.d)}`)})).attrTween("x2",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.d?i.d:t.d,t.d);return t=>(i.d=s(t),`${B(i.d)}`)})).attrTween("y2",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.a?i.a:t.a,t.a);return t=>(i.a=s(t),`${d(i.a)}`)})),p.select(".point").transition().duration(this.drag?0:this.firstUpdate?2*g:g).ease(zc).attrTween("transform",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.d?i.d:t.d,t.d),c=Rs(void 0!==i.a?i.a:t.a,t.a);return t=>(i.d=s(t),i.a=c(t),`translate(${B(i.d)}, ${d(i.a)})`)})),x.select(".point .label").text((t=>t.label)),p.exit().remove(),this.drag=!1,this.firstUpdate=!1}}function nu(t){return null!=t&&!Number.isNaN(t)}function iu(t,e){return+nu(e)-+nu(t)||ot(t,e)}function su(t,e){return+nu(e)-+nu(t)||gt(t,e)}function cu(t){return null!=t&&""!=`${t}`}function au(t){return isFinite(t)?t:NaN}function lu(t){return t>0&&isFinite(t)?t:NaN}function ru(t){return t<0&&isFinite(t)?t:NaN}function ou(t,e){if(t instanceof Date||(t=new Date(+t)),isNaN(t))return"function"==typeof e?e(t):e;const n=t.getUTCHours(),i=t.getUTCMinutes(),s=t.getUTCSeconds(),c=t.getUTCMilliseconds();return`${a=t.getUTCFullYear(),a<0?`-${gu(-a,6)}`:a>9999?`+${gu(a,6)}`:gu(a,4)}-${gu(t.getUTCMonth()+1,2)}-${gu(t.getUTCDate(),2)}${n||i||s||c?`T${gu(n,2)}:${gu(i,2)}${s||c?`:${gu(s,2)}${c?`.${gu(c,3)}`:""}`:""}Z`:""}`;var a}function gu(t,e){return`${t}`.padStart(e,"0")}customElements.define("htd-curves",eu);const Bu=/^(?:[-+]\d{2})?\d{4}(?:-\d{2}(?:-\d{2})?)?(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d{3})?)?(?:Z|[-+]\d{2}:?\d{2})?)?$/;function du(t,e){return Bu.test(t+="")?new Date(t):"function"==typeof e?e(t):e}const Qu=1e3,Iu=6e4,Fu=36e5,uu=864e5,hu=7*uu,Uu=30*uu,bu=365*uu,Cu=[["millisecond",1],["2 milliseconds",2],["5 milliseconds",5],["10 milliseconds",10],["20 milliseconds",20],["50 milliseconds",50],["100 milliseconds",100],["200 milliseconds",200],["500 milliseconds",500],["second",Qu],["5 seconds",5e3],["15 seconds",15e3],["30 seconds",3e4],["minute",Iu],["5 minutes",3e5],["15 minutes",9e5],["30 minutes",18e5],["hour",Fu],["3 hours",108e5],["6 hours",216e5],["12 hours",432e5],["day",uu],["2 days",2*uu],["week",hu],["2 weeks",2*hu],["month",Uu],["3 months",3*Uu],["6 months",6*Uu],["year",bu],["2 years",2*bu],["5 years",5*bu],["10 years",10*bu],["20 years",20*bu],["50 years",50*bu],["100 years",100*bu]],yu=new Map([["second",Qu],["minute",Iu],["hour",Fu],["day",uu],["monday",hu],["tuesday",hu],["wednesday",hu],["thursday",hu],["friday",hu],["saturday",hu],["sunday",hu],["week",hu],["month",Uu],["year",bu]]),fu=new Map([["second",yg],["minute",fg],["hour",pg],["day",Ag],["monday",Ng],["tuesday",Xg],["wednesday",vg],["thursday",Zg],["friday",Eg],["saturday",Vg],["sunday",Rg],["week",Rg],["month",Tg],["year",Kg]]),Gu=new Map([["second",yg],["minute",Gg],["hour",mg],["day",Lg],["monday",Hg],["tuesday",Dg],["wednesday",Yg],["thursday",kg],["friday",Jg],["saturday",Mg],["sunday",Wg],["week",Wg],["month",zg],["year",Og]]),pu=Symbol("intervalDuration"),mu=Symbol("intervalType");for(const[t,e]of fu)e[pu]=yu.get(t),e[mu]="time";for(const[t,e]of Gu)e[pu]=yu.get(t),e[mu]="utc";const Au=[["year",Og,"utc"],["year",Kg,"time"],["month",zg,"utc"],["month",Tg,"time"],["day",Lg,"utc",6*Uu],["day",Ag,"time",6*Uu],["hour",mg,"utc",3*uu],["minute",Gg,"utc",216e5],["second",yg,"utc",18e5]];function xu(t,e,n){let i=`${t}`.toLowerCase();i.endsWith("s")&&(i=i.slice(0,-1));let s=1;const c=/^(?:(\d+)\s+)/.exec(i);switch(c&&(i=i.slice(c[0].length),s=+c[1]),i){case"quarter":i="month",s*=3;break;case"half":i="month",s*=6}let a=e.get(i);if(!a)throw new Error(`unknown interval: ${t}`);if(s>1){if(!a.every)throw new Error(`non-periodic interval: ${i}`);a=a.every(s),a[pu]=yu.get(i)*s,a[mu]=n}return a}function Lu(t){return xu(t,fu,"time")}function Su(t){return xu(t,Gu,"utc")}function Ru(t,e){if(!(e>1))return;const n=t[pu];if(!Cu.some((([,t])=>t===n)))return;if(n%uu==0&&uu<n&&n<Uu)return;const[i]=Cu[Bt((([,t])=>Math.log(t))).center(Cu,Math.log(n*e))];return("time"===t[mu]?Lu:Su)(i)}function Nu(t,e,n){const i="time"===e?sB:cB;if(null==n)return i("year"===t?"%Y":"month"===t?"%Y-%m":"day"===t?"%Y-%m-%d":"hour"===t||"minute"===t?"%Y-%m-%dT%H:%M":"second"===t?"%Y-%m-%dT%H:%M:%S":"%Y-%m-%dT%H:%M:%S.%L");const s=function(t){return"left"===t||"right"===t?(t,e)=>`\n${t}\n${e}`:"top"===t?(t,e)=>`${e}\n${t}`:(t,e)=>`${t}\n${e}`}(n);switch(t){case"millisecond":return vu(i(".%L"),i(":%M:%S"),s);case"second":return vu(i(":%S"),i("%-I:%M"),s);case"minute":return vu(i("%-I:%M"),i("%p"),s);case"hour":return vu(i("%-I %p"),i("%b %-d"),s);case"day":return vu(i("%-d"),i("%b"),s);case"month":return vu(i("%b"),i("%Y"),s);case"year":return i("%Y")}throw new Error("unable to format time ticks")}function Xu(t,e){const n=Ot(function(t,e=oe){const n=[];let i,s=!1;for(const c of t)s&&n.push(e(i,c)),i=c,s=!0;return n}(t,((t,e)=>Math.abs(e-t))));if(n<1e3)return Nu("millisecond","utc",e);for(const[i,s,c,a]of Au){if(n>a)break;if("hour"===i&&!n)break;if(t.every((t=>s.floor(t)>=t)))return Nu(i,c,e)}}function vu(t,e,n){return(i,s,c)=>{const a=t(i,s),l=e(i,s),r=s-Jh(c);return s!==r&&void 0!==c[r]&&l===e(c[r],r)?a:n(a,l)}}const Zu=Object.getPrototypeOf(Uint8Array),Eu=Object.prototype.toString,Vu=Symbol("reindex");function wu(t,e,n){const i=typeof e;return"string"===i?Wu(t,Yu(e),n):"function"===i?Wu(t,e,n):"number"===i||e instanceof Date||"boolean"===i?ah(t,Pu(e),n):"function"==typeof e?.transform?Hu(e.transform(t),n):function(t,e){return e?uh(t,e):t}(Hu(e,n),t?.[Vu])}function Wu(t,e,n){return ah(t,n?.prototype instanceof Zu?function(t){return(e,n)=>$u(t(e,n))}(e):e,n)}function Hu(t,e){return void 0===e?ch(t):t instanceof e?t:e.prototype instanceof Zu&&!(t instanceof Zu)?e.from(t,$u):e.from(t)}const Du=[null],Yu=t=>e=>e[t],ku={transform:Fh},Ju={transform:t=>t},Mu=()=>1,Tu=()=>!0,zu=t=>null==t?t:`${t}`,Ku=t=>null==t?t:+t,Ou=t=>t?t[0]:void 0,_u=t=>t?t[1]:void 0,Pu=t=>()=>t;function ju(t){return t instanceof Zu?t:ah(t,$u,Float64Array)}function $u(t){return null==t?NaN:Number(t)}function qu(t){return ah(t,th)}function th(t){return t instanceof Date&&!isNaN(t)?t:"string"==typeof t?du(t):null==t||isNaN(t=+t)?void 0:new Date(t)}function eh(t,e){return void 0===t&&(t=e),null===t?[void 0,"none"]:wh(t)?[void 0,t]:[t,void 0]}function nh(t,e){return void 0===t&&(t=e),null===t||"number"==typeof t?[void 0,t]:[t,void 0]}function ih(t,e,n){if(null!=t)return sh(t,e,n)}function sh(t,e,n){const i=`${t}`.toLowerCase();if(!n.includes(i))throw new Error(`invalid ${e}: ${t}`);return i}function ch(t){return null==t||t instanceof Array||t instanceof Zu?t:Array.from(t)}function ah(t,e,n=Array){return null==t?t:t instanceof n?t.map(e):n.from(t,e)}function lh(t,e=Array){return t instanceof e?t.slice():e.from(t)}function rh({y:t,y1:e,y2:n}){return void 0!==t||void 0!==e||void 0!==n}function oh(t){return t?.toString===Eu}function gh(t){return oh(t)&&(void 0!==t.type||void 0!==t.domain)}function Bh(t){return oh(t)&&"function"!=typeof t.transform}function dh(t){return Bh(t)&&void 0===t.value&&void 0===t.channel}function Qh(t,e){return void 0===t&&void 0===e?[Ou,_u]:[t,e]}function Ih({z:t,fill:e,stroke:n}={}){return void 0===t&&([t]=eh(e)),void 0===t&&([t]=eh(n)),t}function Fh(t){const e=t.length,n=new Uint32Array(e);for(let t=0;t<e;++t)n[t]=t;return n}function uh(t,e){return ah(e,(e=>t[e]),t.constructor)}function hh(t,e,n){return t.subarray?t.subarray(e,n):t.slice(e,n)}function Uh(t){return null!==t&&"object"==typeof t?t.valueOf():t}function bh(t){let e;return[{transform:()=>e,label:yh(t)},t=>e=t]}function Ch(t){return null==t?[t]:bh(t)}function yh(t,e){return"string"==typeof t?t:t&&void 0!==t.label?t.label:e}function fh(t,e){return{transform(n){const i=t.transform(n),s=e.transform(n);return Xh(i)||Xh(s)?ah(i,((t,e)=>new Date((+i[e]+ +s[e])/2))):ah(i,((t,e)=>(+i[e]+ +s[e])/2),Float64Array)},label:t.label}}function Gh(t,e){const n=ph(e?.interval,e?.type);return n?ah(t,n):t}function ph(t,e){const n=mh(t,e);return n&&(t=>nu(t)?n.floor(t):t)}function mh(t,e){if(null!=t){if("number"==typeof t){0<t&&t<1&&Number.isInteger(1/t)&&(t=-1/t);const e=Math.abs(t);return t<0?{floor:t=>Math.floor(t*e)/e,offset:t=>(t*e+1)/e,range:(t,n)=>ge(Math.ceil(t*e),n*e).map((t=>t/e))}:{floor:t=>Math.floor(t/e)*e,offset:t=>t+e,range:(t,n)=>ge(Math.ceil(t/e),n/e).map((t=>t*e))}}if("string"==typeof t)return("time"===e?Lu:Su)(t);if("function"!=typeof t.floor)throw new Error("invalid interval; missing floor method");if("function"!=typeof t.offset)throw new Error("invalid interval; missing offset method");return t}}function Ah(t,e){if((t=mh(t,e))&&"function"!=typeof t.range)throw new Error("invalid interval: missing range method");return t}function xh(t){return"function"==typeof t?.range}function Lh(t){return void 0===t||Bh(t)?t:{value:t}}function Sh(t){return t&&"function"==typeof t[Symbol.iterator]}function Rh(t){for(const e of t)if(null!=e)return"object"!=typeof e||e instanceof Date}function Nh(t){for(const e of t){if(null==e)continue;const t=typeof e;return"string"===t||"boolean"===t}}function Xh(t){for(const e of t)if(null!=e)return e instanceof Date}function vh(t){for(const e of t)if(null!=e)return"string"==typeof e&&isNaN(e)&&du(e)}function Zh(t){for(const e of t)if(null!=e){if("string"!=typeof e)return!1;if(e.trim())return!isNaN(e)}}function Eh(t,e){let n;for(const i of t)if(null!=i){if(!e(i))return!1;n=!0}return n}const Vh=new Set("none,currentcolor,transparent,aliceblue,antiquewhite,aqua,aquamarine,azure,beige,bisque,black,blanchedalmond,blue,blueviolet,brown,burlywood,cadetblue,chartreuse,chocolate,coral,cornflowerblue,cornsilk,crimson,cyan,darkblue,darkcyan,darkgoldenrod,darkgray,darkgreen,darkgrey,darkkhaki,darkmagenta,darkolivegreen,darkorange,darkorchid,darkred,darksalmon,darkseagreen,darkslateblue,darkslategray,darkslategrey,darkturquoise,darkviolet,deeppink,deepskyblue,dimgray,dimgrey,dodgerblue,firebrick,floralwhite,forestgreen,fuchsia,gainsboro,ghostwhite,gold,goldenrod,gray,green,greenyellow,grey,honeydew,hotpink,indianred,indigo,ivory,khaki,lavender,lavenderblush,lawngreen,lemonchiffon,lightblue,lightcoral,lightcyan,lightgoldenrodyellow,lightgray,lightgreen,lightgrey,lightpink,lightsalmon,lightseagreen,lightskyblue,lightslategray,lightslategrey,lightsteelblue,lightyellow,lime,limegreen,linen,magenta,maroon,mediumaquamarine,mediumblue,mediumorchid,mediumpurple,mediumseagreen,mediumslateblue,mediumspringgreen,mediumturquoise,mediumvioletred,midnightblue,mintcream,mistyrose,moccasin,navajowhite,navy,oldlace,olive,olivedrab,orange,orangered,orchid,palegoldenrod,palegreen,paleturquoise,palevioletred,papayawhip,peachpuff,peru,pink,plum,powderblue,purple,rebeccapurple,red,rosybrown,royalblue,saddlebrown,salmon,sandybrown,seagreen,seashell,sienna,silver,skyblue,slateblue,slategray,slategrey,snow,springgreen,steelblue,tan,teal,thistle,tomato,turquoise,violet,wheat,white,whitesmoke,yellow".split(","));function wh(t){return"string"==typeof t&&(t=t.toLowerCase().trim(),/^#[0-9a-f]{3,8}$/.test(t)||/^(?:url|var|rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix)\(.*\)$/.test(t)||Vh.has(t))}function Wh(t){return"number"==typeof t&&(0<=t&&t<=1||isNaN(t))}function Hh(t){return null==t||Dh(t)}function Dh(t){return/^\s*none\s*$/i.test(t)}function Yh(t,e){return ih(t,e,["middle","top-left","top","top-right","right","bottom-right","bottom","bottom-left","left"])}function kh(t="middle"){return Yh(t,"frameAnchor")}function Jh(t){if(null==t)return;return gt(t[0],t[t.length-1])}function Mh(t){return Sh(t)?function(t){console.warn("named iterables are deprecated; please use an object instead");const e=new Set;return Object.fromEntries(Array.from(t,(t=>{const{name:n}=t;if(null==n)throw new Error("missing name");const i=`${n}`;if("__proto__"===i)throw new Error(`illegal name: ${i}`);if(e.has(i))throw new Error(`duplicate name: ${i}`);return e.add(i),[n,t]})))}(t):t}const Th=Symbol("position"),zh=Symbol("color"),Kh=Symbol("radius"),Oh=Symbol("length"),_h=Symbol("opacity"),Ph=Symbol("symbol"),jh=Symbol("projection"),$h=new Map([["x",Th],["y",Th],["fx",Th],["fy",Th],["r",Kh],["color",zh],["opacity",_h],["symbol",Ph],["length",Oh],["projection",jh]]);const qh=2/Math.sqrt(3),tU=new Map([["asterisk",CI],["circle",yI],["cross",fI],["diamond",mI],["diamond2",AI],["hexagon",{draw(t,e){const n=Math.sqrt(e/Math.PI),i=n*qh,s=i/2;t.moveTo(0,i),t.lineTo(n,s),t.lineTo(n,-s),t.lineTo(0,-i),t.lineTo(-n,-s),t.lineTo(-n,s),t.closePath()}}],["plus",xI],["square",LI],["square2",SI],["star",vI],["times",JI],["triangle",EI],["triangle2",wI],["wye",kI]]);function eU(t){return t&&"function"==typeof t.draw}function nU(t){return!!eU(t)||"string"==typeof t&&tU.has(t.toLowerCase())}function iU(t){if(null==t||eU(t))return t;const e=tU.get(`${t}`.toLowerCase());if(e)return e;throw new Error(`invalid symbol: ${t}`)}function sU({filter:t,sort:e,reverse:n,transform:i,initializer:s,...c}={},a){if(void 0===i&&(null!=t&&(i=rU(t)),null==e||dh(e)||(i=aU(i,gU(e))),n&&(i=aU(i,oU))),null!=a&&null!=s)throw new Error("transforms cannot be applied after initializers");return{...c,...(null===e||dh(e))&&{sort:e},transform:aU(i,a)}}function cU({filter:t,sort:e,reverse:n,initializer:i,...s}={},c){return void 0===i&&(null!=t&&(i=rU(t)),null==e||dh(e)||(i=lU(i,gU(e))),n&&(i=lU(i,oU))),{...s,...(null===e||dh(e))&&{sort:e},initializer:lU(i,c)}}function aU(t,e){return null==t?null===e?void 0:e:null==e?null===t?void 0:t:function(n,i,s){return({data:n,facets:i}=t.call(this,n,i,s)),e.call(this,ch(n),i,s)}}function lU(t,e){return null==t?null===e?void 0:e:null==e?null===t?void 0:t:function(n,i,s,...c){let a,l,r,o,g,B;return({data:l=n,facets:r=i,channels:a}=t.call(this,n,i,s,...c)),({data:g=l,facets:B=r,channels:o}=e.call(this,l,r,{...s,...a},...c)),{data:g,facets:B,channels:{...a,...o}}}}function rU(t){return(e,n)=>{const i=wu(e,t);return{data:e,facets:n.map((t=>t.filter((t=>i[t]))))}}}function oU(t,e){return{data:t,facets:e.map((t=>t.slice().reverse()))}}function gU(t){return("function"==typeof t&&1!==t.length?BU:dU)(t)}function BU(t){return(e,n)=>{const i=(n,i)=>t(e[n],e[i]);return{data:e,facets:n.map((t=>t.slice().sort(i)))}}}function dU(t){let e,n;({channel:e,value:t,order:n}={...Lh(t)});const i=e?.startsWith("-");if(i&&(e=e.slice(1)),void 0===n&&(n=i?su:iu),"function"!=typeof n)switch(`${n}`.toLowerCase()){case"ascending":n=iu;break;case"descending":n=su;break;default:throw new Error(`invalid order: ${n}`)}return(i,s,c)=>{let a;if(void 0===e)a=wu(i,t);else{if(void 0===c)throw new Error("channel sort requires an initializer");if(a=c[e],!a)return{};a=a.value}const l=(t,e)=>n(a[t],a[e]);return{data:i,facets:s.map((t=>t.slice().sort(l)))}}}function QU(t,...e){for(const{name:n}of t)if(e.includes(n))return!0;return!1}function IU(t,e,n,i=FU){let s;oh(e)&&"reduce"in e&&(s=e.scale,e=e.reduce);const c=i(t,e,n),[a,l]=bh(c.label);let r;return{name:t,output:void 0===s?a:{value:a,scale:s},initialize(t){c.initialize(t),r=l([])},scope(t,e){c.scope(t,e)},reduce(t,e){r.push(c.reduce(t,e))}}}function FU(t,e,n,i=hU){const s=function(t,e){if(void 0!==e[t])return e[t];switch(t){case"x1":case"x2":t="x";break;case"y1":case"y2":t="y"}return e[t]}(t,n),c=i(e,s);let a,l;return{label:yh(c===mU?null:s,c.label),initialize(t){a=void 0===s?t:wu(t,s),"data"===c.scope&&(l=c.reduceIndex(Fh(t),a))},scope(t,e){c.scope===t&&(l=c.reduceIndex(e,a))},reduce:(t,e)=>null==c.scope?c.reduceIndex(t,a,e):c.reduceIndex(t,a,l,e)}}function uU(t,e){return e?Vt(Xt(t,(t=>e[t])),Ou):[[,t]]}function hU(t,e,n=UU){if(null==t)return n(t);if("function"==typeof t.reduceIndex)return t;if("function"==typeof t.reduce&&oh(t))return function(t){return console.warn("deprecated reduce interface; implement reduceIndex instead."),{...t,reduceIndex:t.reduce.bind(t)}}(t);if("function"==typeof t)return function(t){return{reduceIndex:(e,n,i)=>t(uh(n,e),i)}}(t);if(/^p\d{2}$/i.test(t))return bU(function(t){const e=+`${t}`.slice(1)/100;return(t,n)=>ee(t,e,n)}(t));switch(`${t}`.toLowerCase()){case"first":return fU;case"last":return pU;case"identity":return yU;case"count":return mU;case"distinct":return AU;case"sum":return null==e?mU:xU;case"proportion":return LU(e,"data");case"proportion-facet":return LU(e,"facet");case"deviation":return bU(ft);case"min":return bU(Pt);case"min-index":return bU(jt);case"max":return bU(Ot);case"max-index":return bU(_t);case"mean":return CU(ce);case"median":return CU(ae);case"variance":return bU(yt);case"mode":return bU(re)}return n(t)}function UU(t){throw new Error(`invalid reduce: ${t}`)}function bU(t){return{reduceIndex:(e,n)=>t(e,(t=>n[t]))}}function CU(t){return{reduceIndex(e,n){const i=t(e,(t=>n[t]));return Xh(n)?new Date(i):i}}}const yU={reduceIndex:(t,e)=>uh(e,t)},fU={reduceIndex:(t,e)=>e[t[0]]},GU={reduceIndex(t,e){const n=Vt(vt(t,(t=>t.length),(t=>e[t])),_u),i=n.slice(-5).reverse();if(i.length<n.length){const t=n.slice(0,-4);i[4]=[`… ${t.length.toLocaleString("en-US")} more`,Be(t,_u)]}return i.map((([t,e])=>`${t} (${e.toLocaleString("en-US")})`)).join("\n")}},pU={reduceIndex:(t,e)=>e[t[t.length-1]]},mU={label:"Frequency",reduceIndex:t=>t.length},AU={label:"Distinct",reduceIndex(t,e){const n=new At;for(const i of t)n.add(e[i]);return n.size}},xU=bU(Be);function LU(t,e){return null==t?{scope:e,label:"Frequency",reduceIndex:(t,e,n=1)=>t.length/n}:{scope:e,reduceIndex:(t,e,n=1)=>Be(t,(t=>e[t]))/n}}function SU(t,{scale:e,type:n,value:i,filter:s,hint:c,label:a=yh(i)},l){return void 0===c&&"function"==typeof i?.transform&&(c=i.hint),RU(l,{scale:e,type:n,value:wu(t,i),label:a,filter:s,hint:c})}function RU(t,e){const{scale:n,value:i}=e;if(!0===n||"auto"===n)switch(t){case"fill":case"stroke":case"color":e.scale=!0!==n&&Eh(i,wh)?null:"color";break;case"fillOpacity":case"strokeOpacity":case"opacity":e.scale=!0!==n&&Eh(i,Wh)?null:"opacity";break;case"symbol":!0!==n&&Eh(i,nU)?(e.scale=null,e.value=ah(i,iU)):e.scale="symbol";break;default:e.scale=$h.has(t)?t:null}else if(!1===n)e.scale=null;else if(null!=n&&!$h.has(n))throw new Error(`unknown scale: ${n}`);return e}function NU(t,e){for(const n in t){const i=t[n];if(i.scale===e)return i}}function XU(t,e){const n=t.original;if(n===t)return e;const i=e.value,s=e.value=[];for(let e=0;e<n.length;++e){const c=i[n[e][0]];for(const n of t[e])s[n]=c}return e}function vU(t,e,n){const i=ZU(t,e);return ah(ZU(t,n),((t,e)=>Math.abs(t-i[e])),Float64Array)}function ZU(t,e,n){let i=t[e];if(i||void 0===n||(i=t[n]),i)return i.value;throw new Error(`missing channel: ${e}`)}function EU(t){if(null==t||"function"==typeof t)return t;switch(`${t}`.toLowerCase()){case"ascending":return VU;case"descending":return wU}throw new Error(`invalid order: ${t}`)}function VU([t,e],[n,i]){return iu(e,i)||iu(t,n)}function wU([t,e],[n,i]){return su(e,i)||iu(t,n)}function WU(t,e){let n=t[e];if(n){for(;n.source;)n=n.source;return null===n.source?null:n}}const HU=function(t){let e,n;return(...i)=>((n?.length!==i.length||n.some(((t,e)=>t!==i[e])))&&(n=i,e=t(...i)),e)}((t=>new Intl.NumberFormat(t)));function DU(t){return ou(t,"Invalid Date")}const YU=function(t="en-US"){const e=function(t="en-US"){const e=HU(t);return t=>null==t||isNaN(t)?void 0:e.format(t)}(t);return t=>(t instanceof Date?DU:"number"==typeof t?e:zu)(t)}();let kU,JU=0;function MU(t){t!==kU&&(kU=t,console.warn(t),++JU)}const TU=("undefined"!=typeof window?window.devicePixelRatio>1:"undefined"==typeof it)?0:.5;let zU=0;function KU(){return"plot-clip-"+ ++zU}function OU(t,{title:e,href:n,ariaLabel:i,ariaDescription:s,ariaHidden:c,target:a,fill:l,fillOpacity:r,stroke:o,strokeWidth:g,strokeOpacity:B,strokeLinejoin:d,strokeLinecap:Q,strokeMiterlimit:I,strokeDasharray:F,strokeDashoffset:u,opacity:h,mixBlendMode:U,imageFilter:b,paintOrder:C,pointerEvents:y,shapeRendering:f,channels:G},{ariaLabel:p,fill:m="currentColor",fillOpacity:A,stroke:x="none",strokeOpacity:L,strokeWidth:S,strokeLinecap:R,strokeLinejoin:N,strokeMiterlimit:X,paintOrder:v}){null===m&&(l=null,r=null),null===x&&(o=null,B=null),Hh(m)?Hh(x)||Hh(l)&&!G?.fill||(x="none"):!Hh(x)||Hh(o)&&!G?.stroke||(m="none");const[Z,E]=eh(l,m),[V,w]=nh(r,A),[W,H]=eh(o,x),[D,Y]=nh(B,L),[k,J]=nh(h);Dh(H)||(void 0===g&&(g=S),void 0===Q&&(Q=R),void 0===d&&(d=N),void 0!==I||/^\s*round\s*$/i.test(d)||(I=X),Dh(E)||void 0!==C||(C=v));const[M,T]=nh(g);return null!==m&&(t.fill=ab(E,"currentColor"),t.fillOpacity=lb(w,1)),null!==x&&(t.stroke=ab(H,"none"),t.strokeWidth=lb(T,1),t.strokeOpacity=lb(Y,1),t.strokeLinejoin=ab(d,"miter"),t.strokeLinecap=ab(Q,"butt"),t.strokeMiterlimit=lb(I,4),t.strokeDasharray=ab(F,"none"),t.strokeDashoffset=ab(u,"0")),t.target=zu(a),t.ariaLabel=zu(p),t.ariaDescription=zu(s),t.ariaHidden=zu(c),t.opacity=lb(J,1),t.mixBlendMode=ab(U,"normal"),t.imageFilter=ab(b,"none"),t.paintOrder=ab(C,"normal"),t.pointerEvents=ab(y,"auto"),t.shapeRendering=ab(f,"auto"),{title:{value:e,optional:!0,filter:null},href:{value:n,optional:!0,filter:null},ariaLabel:{value:i,optional:!0,filter:null},fill:{value:Z,scale:"auto",optional:!0},fillOpacity:{value:V,scale:"auto",optional:!0},stroke:{value:W,scale:"auto",optional:!0},strokeOpacity:{value:D,scale:"auto",optional:!0},strokeWidth:{value:M,optional:!0},opacity:{value:k,scale:"auto",optional:!0}}}function _U(t,e){e&&t.text((t=>YU(e[t])))}function PU(t,e){e&&t.text((([t])=>YU(e[t])))}function jU(t,{target:e,tip:n},{ariaLabel:i,title:s,fill:c,fillOpacity:a,stroke:l,strokeOpacity:r,strokeWidth:o,opacity:g,href:B}){i&&sb(t,"aria-label",(t=>i[t])),c&&sb(t,"fill",(t=>c[t])),a&&sb(t,"fill-opacity",(t=>a[t])),l&&sb(t,"stroke",(t=>l[t])),r&&sb(t,"stroke-opacity",(t=>r[t])),o&&sb(t,"stroke-width",(t=>o[t])),g&&sb(t,"opacity",(t=>g[t])),B&&ib(t,(t=>B[t]),e),n||function(t,e){e&&t.filter((t=>cu(e[t]))).append("title").call(_U,e)}(t,s)}function $U(t,{target:e,tip:n},{ariaLabel:i,title:s,fill:c,fillOpacity:a,stroke:l,strokeOpacity:r,strokeWidth:o,opacity:g,href:B}){i&&sb(t,"aria-label",(([t])=>i[t])),c&&sb(t,"fill",(([t])=>c[t])),a&&sb(t,"fill-opacity",(([t])=>a[t])),l&&sb(t,"stroke",(([t])=>l[t])),r&&sb(t,"stroke-opacity",(([t])=>r[t])),o&&sb(t,"stroke-width",(([t])=>o[t])),g&&sb(t,"opacity",(([t])=>g[t])),B&&ib(t,(([t])=>B[t]),e),n||function(t,e){e&&t.filter((([t])=>cu(e[t]))).append("title").call(PU,e)}(t,s)}function*qU(t,e,n,i){const{z:s}=n,{z:c}=i,a=function({ariaLabel:t,title:e,fill:n,fillOpacity:i,stroke:s,strokeOpacity:c,strokeWidth:a,opacity:l,href:r},{tip:o}){return[t,o?void 0:e,n,i,s,c,a,l,r].filter((t=>void 0!==t))}(i,n),l=[...e,...a];for(const e of c?function(t,e,n){const i=Xt(t,(t=>e[t]));return void 0===n&&i.size>1+t.length>>1&&MU("Warning: the implicit z channel has high cardinality. This may occur when the fill or stroke channel is associated with quantitative data rather than ordinal or categorical data. You can suppress this warning by setting the z option explicitly; if this data represents a single series, set z to null."),i.values()}(t,c,s):[t]){let t,n;t:for(const i of e){for(const t of l)if(!nu(t[i])){n&&n.push(-1);continue t}if(void 0!==t){n.push(i);for(let e=0;e<a.length;++e){if(Uh(a[e][i])!==t[e]){yield n,t=a.map((t=>Uh(t[i]))),n=[i];continue t}}}else n&&(yield n),t=a.map((t=>Uh(t[i]))),n=[i]}n&&(yield n)}}function tb(t){return!0===t?t="frame":!1===t?t=null:null!=t&&(t=sh(t,"clip",["frame","sphere"])),t}function eb(t,e,n,i){!function(t,e,n,i){let s;const{clip:c=i.clip}=e;switch(c){case"frame":{const{width:e,height:c,marginLeft:a,marginRight:l,marginTop:r,marginBottom:o}=n,g=KU();s=`url(#${g})`,t=Qb("svg:g",i).call((t=>t.append("svg:clipPath").attr("id",g).append("rect").attr("x",a).attr("y",r).attr("width",e-l-a).attr("height",c-r-o))).each((function(){this.appendChild(t.node()),t.node=()=>this}));break}case"sphere":{const{projection:e}=i;if(!e)throw new Error('the "sphere" clip option requires a projection');const n=KU();s=`url(#${n})`,t.append("clipPath").attr("id",n).append("path").attr("d",mr(e)({type:"Sphere"}));break}}sb(t,"aria-label",e.ariaLabel),sb(t,"aria-description",e.ariaDescription),sb(t,"aria-hidden",e.ariaHidden),sb(t,"clip-path",s)}(t,e,n,i),sb(t,"fill",e.fill),sb(t,"fill-opacity",e.fillOpacity),sb(t,"stroke",e.stroke),sb(t,"stroke-width",e.strokeWidth),sb(t,"stroke-opacity",e.strokeOpacity),sb(t,"stroke-linejoin",e.strokeLinejoin),sb(t,"stroke-linecap",e.strokeLinecap),sb(t,"stroke-miterlimit",e.strokeMiterlimit),sb(t,"stroke-dasharray",e.strokeDasharray),sb(t,"stroke-dashoffset",e.strokeDashoffset),sb(t,"shape-rendering",e.shapeRendering),sb(t,"filter",e.imageFilter),sb(t,"paint-order",e.paintOrder);const{pointerEvents:s=(!1===i.pointerSticky?"none":void 0)}=e;sb(t,"pointer-events",s)}function nb(t,e){!function(t,e,n){null!=n&&t.style(e,n)}(t,"mix-blend-mode",e.mixBlendMode),sb(t,"opacity",e.opacity)}function ib(t,e,n){t.each((function(t){const i=e(t);if(null!=i){const t=this.ownerDocument.createElementNS(Xe.svg,"a");t.setAttribute("fill","inherit"),t.setAttributeNS(Xe.xlink,"href",i),null!=n&&t.setAttribute("target",n),this.parentNode.insertBefore(t,this).appendChild(this)}}))}function sb(t,e,n){null!=n&&t.attr(e,n)}function cb(t,e,{x:n,y:i},s=TU,c=TU){s+=e.dx,c+=e.dy,n?.bandwidth&&(s+=n.bandwidth()/2),i?.bandwidth&&(c+=i.bandwidth()/2),(s||c)&&t.attr("transform",`translate(${s},${c})`)}function ab(t,e){if((t=zu(t))!==e)return t}function lb(t,e){if((t=Ku(t))!==e)return t}const rb=/^-?([_a-z]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])([_a-z0-9-]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*$/i;function ob(t){if(void 0===t)return"plot-d6a7b5";if(t=`${t}`,!rb.test(t))throw new Error(`invalid class name: ${t}`);return t}function gb(t,e){if("string"==typeof e)t.property("style",e);else if(null!=e)for(const n of t)Object.assign(n.style,e)}function Bb({frameAnchor:t},{width:e,height:n,marginTop:i,marginRight:s,marginBottom:c,marginLeft:a}){return[/left$/.test(t)?a:/right$/.test(t)?e-s:(a+e-s)/2,/^top/.test(t)?i:/^bottom/.test(t)?n-c:(i+n-c)/2]}function db(t={}){const{document:e=("undefined"!=typeof window?window.document:void 0),clip:n}=t;return{document:e,clip:tb(n)}}function Qb(t,{document:e}){return Mn(Ve(t).call(e.documentElement))}const Ib=Math.PI,Fb=2*Ib,ub=.618;function hb({projection:t,inset:e=0,insetTop:n=e,insetRight:i=e,insetBottom:s=e,insetLeft:c=e}={},a){if(null==t)return;if("function"==typeof t.stream)return t;let l,r,o="frame";if(oh(t)){let e;if(({type:t,domain:r,inset:e,insetTop:n=(void 0!==e?e:n),insetRight:i=(void 0!==e?e:i),insetBottom:s=(void 0!==e?e:s),insetLeft:c=(void 0!==e?e:c),clip:o=o,...l}=t),null==t)return}"function"!=typeof t&&({type:t}=Ub(t));const{width:g,height:B,marginLeft:d,marginRight:Q,marginTop:I,marginBottom:F}=a,u=g-d-Q-c-i,h=B-I-F-n-s;if(t=t?.({width:u,height:h,clip:o,...l}),null==t)return;o=function(t,e,n,i,s){if(!1===t||null==t||"number"==typeof t)return t=>t;!0===t&&(t="frame");if("frame"===`${t}`.toLowerCase())return Ul(e,n,i,s);throw new Error(`unknown projection clip type: ${t}`)}(o,d,I,g-Q,B-F);let U,b=d+c,C=I+n;if(null!=r){const[[e,n],[i,s]]=mr(t).bounds(r),c=Math.min(u/(i-e),h/(s-n));c>0?(b-=(c*(e+i)-u)/2,C-=(c*(n+s)-h)/2,U=Ar({point(t,e){this.stream.point(t*c+b,e*c+C)}})):MU("Warning: the projection could not be fit to the specified domain; using the default scale.")}return U??=0===b&&0===C?yb():Ar({point(t,e){this.stream.point(t+b,e+C)}}),{stream:e=>t.stream(U.stream(o(e)))}}function Ub(t){switch(`${t}`.toLowerCase()){case"albers-usa":return bb(Tr,.7463,.4673);case"albers":return Cb(Mr,.7463,.4673);case"azimuthal-equal-area":return bb(_r,4,4);case"azimuthal-equidistant":return bb(jr,Fb,Fb);case"conic-conformal":return Cb(io,Fb,Fb);case"conic-equal-area":return Cb(Jr,6.1702,2.9781);case"conic-equidistant":return Cb(lo,7.312,3.6282);case"equal-earth":return bb(Fo,5.4133,2.6347);case"equirectangular":return bb(co,Fb,Ib);case"gnomonic":return bb(ho,3.4641,3.4641);case"identity":return{type:yb};case"reflect-y":return{type:fb};case"mercator":return bb(qr,Fb,Fb);case"orthographic":return bb(bo,2,2);case"stereographic":return bb(yo,2,2);case"transverse-mercator":return bb(Go,Fb,Fb);default:throw new Error(`unknown projection type: ${t}`)}}function bb(t,e,n){return{type:({width:i,height:s,rotate:c,precision:a=.15,clip:l})=>{const r=t();return null!=a&&r.precision?.(a),null!=c&&r.rotate?.(c),"number"==typeof l&&r.clipAngle?.(l),r.scale(Math.min(i/e,s/n)),r.translate([i/2,s/2]),r},aspectRatio:n/e}}function Cb(t,e,n){const{type:i,aspectRatio:s}=bb(t,e,n);return{type:t=>{const{parallels:e,domain:n,width:s,height:c}=t,a=i(t);return null!=e&&(a.parallels(e),void 0===n&&a.fitSize([s,c],{type:"Sphere"})),a},aspectRatio:s}}const yb=Pu({stream:t=>t}),fb=Pu(Ar({point(t,e){this.stream.point(t,-e)}}));function Gb(t,e,n,i){const s=n[t],c=n[e],a=s.length,l=n[t]=new Float64Array(a).fill(NaN),r=n[e]=new Float64Array(a).fill(NaN);let o;const g=i.stream({point(t,e){l[o]=t,r[o]=e}});for(o=0;o<a;++o)g.point(s[o],c[o])}function pb({projection:t}={}){return null!=t&&("function"==typeof t.stream||(oh(t)&&(t=t.type),null!=t))}function mb(t){const e=[],n=[],i={scale:"x",value:e},s={scale:"y",value:n},c={point(t,i){e.push(t),n.push(i)},lineStart(){},lineEnd(){},polygonStart(){},polygonEnd(){},sphere(){}};for(const e of t.value)Ma(e,c);return[i,s]}const Ab=new Map([["accent",Zd],["category10",vd],["dark2",Ed],["paired",Vd],["pastel1",wd],["pastel2",Wd],["set1",Hd],["set2",Dd],["set3",Yd],["tableau10",kd]]);const xb=new Map([...Ab,["brbg",Sb(Md,Td)],["prgn",Sb(zd,Kd)],["piyg",Sb(Od,_d)],["puor",Sb(Pd,jd)],["rdbu",Sb($d,qd)],["rdgy",Sb(tQ,eQ)],["rdylbu",Sb(nQ,iQ)],["rdylgn",Sb(sQ,cQ)],["spectral",Sb(aQ,lQ)],["burd",Rb($d,qd)],["buylrd",Rb(nQ,iQ)],["blues",Lb(XQ,vQ)],["greens",Lb(ZQ,EQ)],["greys",Lb(VQ,wQ)],["oranges",Lb(kQ,JQ)],["purples",Lb(WQ,HQ)],["reds",Lb(DQ,YQ)],["turbo",Nb(tI)],["viridis",Nb(nI)],["magma",Nb(iI)],["inferno",Nb(sI)],["plasma",Nb(cI)],["cividis",Nb(MQ)],["cubehelix",Nb(TQ)],["warm",Nb(zQ)],["cool",Nb(KQ)],["bugn",Lb(rQ,oQ)],["bupu",Lb(gQ,BQ)],["gnbu",Lb(dQ,QQ)],["orrd",Lb(IQ,FQ)],["pubu",Lb(UQ,bQ)],["pubugn",Lb(uQ,hQ)],["purd",Lb(CQ,yQ)],["rdpu",Lb(fQ,GQ)],["ylgn",Lb(AQ,xQ)],["ylgnbu",Lb(pQ,mQ)],["ylorbr",Lb(LQ,SQ)],["ylorrd",Lb(RQ,NQ)],["rainbow",Xb(_Q)],["sinebow",Xb(qQ)]]);function Lb(t,e){return({length:n})=>1===n?[t[3][1]]:2===n?[t[3][1],t[3][2]]:(n=Math.max(3,Math.floor(n)))>9?Ms(e,n):t[n]}function Sb(t,e){return({length:n})=>2===n?[t[3][0],t[3][2]]:(n=Math.max(3,Math.floor(n)))>11?Ms(e,n):t[n]}function Rb(t,e){return({length:n})=>2===n?[t[3][2],t[3][0]]:(n=Math.max(3,Math.floor(n)))>11?Ms((t=>e(1-t)),n):t[n].slice().reverse()}function Nb(t){return({length:e})=>Ms(t,Math.max(2,Math.floor(e)))}function Xb(t){return({length:e})=>Ms(t,Math.floor(e)+1).slice(0,-1)}function vb(t){const e=`${t}`.toLowerCase();if(!xb.has(e))throw new Error(`unknown ordinal scheme: ${e}`);return xb.get(e)}function Zb(t,e){const n=vb(t),i="function"==typeof n?n({length:e}):n;return i.length!==e?i.slice(0,e):i}const Eb=new Map([["brbg",Td],["prgn",Kd],["piyg",_d],["puor",jd],["rdbu",qd],["rdgy",eQ],["rdylbu",iQ],["rdylgn",cQ],["spectral",lQ],["burd",t=>qd(1-t)],["buylrd",t=>iQ(1-t)],["blues",vQ],["greens",EQ],["greys",wQ],["purples",HQ],["reds",YQ],["oranges",JQ],["turbo",tI],["viridis",nI],["magma",iI],["inferno",sI],["plasma",cI],["cividis",MQ],["cubehelix",TQ],["warm",zQ],["cool",KQ],["bugn",oQ],["bupu",BQ],["gnbu",QQ],["orrd",FQ],["pubugn",hQ],["pubu",bQ],["purd",yQ],["rdpu",GQ],["ylgnbu",mQ],["ylgn",xQ],["ylorbr",SQ],["ylorrd",NQ],["rainbow",_Q],["sinebow",qQ]]);function Vb(t){const e=`${t}`.toLowerCase();if(!Eb.has(e))throw new Error(`unknown quantitative scheme: ${e}`);return Eb.get(e)}const wb=new Set(["brbg","prgn","piyg","puor","rdbu","rdgy","rdylbu","rdylgn","spectral","burd","buylrd"]);const Wb=t=>e=>t(1-e),Hb=[0,1],Db=new Map([["number",ms],["rgb",bs],["hsl",Hs],["hcl",Ds],["lab",function(t,e){var n=Us((t=_i(t)).l,(e=_i(e)).l),i=Us(t.a,e.a),s=Us(t.b,e.b),c=Us(t.opacity,e.opacity);return function(e){return t.l=n(e),t.a=i(e),t.b=s(e),t.opacity=c(e),t+""}}]]);function Yb(t){const e=`${t}`.toLowerCase();if(!Db.has(e))throw new Error(`unknown interpolator: ${e}`);return Db.get(e)}function kb(t,e,n,{type:i,nice:s,clamp:c,zero:a,domain:l=_b(t,n),unknown:r,round:o,scheme:g,interval:B,range:d=($h.get(t)===Kh?jb(n,l):$h.get(t)===Oh?$b(n,l):$h.get(t)===_h?Hb:void 0),interpolate:Q=($h.get(t)===zh?null==g&&void 0!==d?bs:Vb(void 0!==g?g:"cyclical"===i?"rainbow":"turbo"):o?Ns:ms),reverse:I}){if(B=Ah(B,i),"cyclical"!==i&&"sequential"!==i||(i="linear"),"function"!=typeof Q&&(Q=Yb(Q)),I=!!I,void 0!==d){if((l=ch(l)).length!==(d=ch(d)).length){if(1===Q.length)throw new Error("invalid piecewise interpolator");Q=Js(Q,d),d=void 0}}if(1===Q.length?(I&&(Q=Wb(Q),I=!1),void 0===d&&(d=Float64Array.from(l,((t,e)=>e/(l.length-1))),2===d.length&&(d=Hb)),e.interpolate((d===Hb?Pu:eC)(Q))):e.interpolate(Q),a){const[t,e]=Gt(l);(t>0||e<0)&&(Jh(l=lh(l))!==Math.sign(t)?l[l.length-1]=0:l[0]=0)}return I&&(l=de(l)),e.domain(l).unknown(r),s&&(e.nice(function(t,e){return!0===t?void 0:"number"==typeof t?t:function(t,e){if((t=Ah(t,e))&&"function"!=typeof t.ceil)throw new Error("invalid interval: missing ceil method");return t}(t,e)}(s,i)),l=e.domain()),void 0!==d&&e.range(d),c&&e.clamp(c),{type:i,domain:l,range:d,scale:e,interpolate:Q,interval:B}}function Jb(t,e,{exponent:n=1,...i}){return kb(t,lg().exponent(n),e,{...i,type:"pow"})}function Mb(t,e,{base:n=10,domain:i=qb(e),...s}){return kb(t,$o().base(n),e,{...s,domain:i})}function Tb(t,e,{constant:n=1,...i}){return kb(t,ng().constant(n),e,i)}function zb(t,e,{range:n,quantiles:i=(void 0===n?5:(n=[...n]).length),n:s=i,scheme:c="rdylbu",domain:a=tC(e),unknown:l,interpolate:r,reverse:o}){return void 0===n&&(n=void 0!==r?Ms(r,s):$h.get(t)===zh?Zb(c,s):void 0),a.length>0&&(a=rg(a,void 0===n?{length:s}:n).quantiles()),Kb(t,e,{domain:a,range:n,reverse:o,unknown:l})}function Kb(t,e,{domain:n=[0],unknown:i,scheme:s="rdylbu",interpolate:c,range:a=(void 0!==c?Ms(c,n.length+1):$h.get(t)===zh?Zb(s,n.length+1):void 0),reverse:l}){const r=Jh(n=ch(n));if(!isNaN(r)&&!function(t,e){for(let n=1,i=t.length,s=t[0];n<i;++n){const i=gt(s,s=t[n]);if(0!==i&&i!==e)return!1}return!0}(n,r))throw new Error(`the ${t} scale has a non-monotonic domain`);return l&&(a=de(a)),{type:"threshold",scale:og(r<0?de(n):n,void 0===a?[]:a).unknown(i),domain:n,range:a}}function Ob(t,e=au){return t.length?[Pt(t,(({value:t})=>void 0===t?t:Pt(t,e))),Ot(t,(({value:t})=>void 0===t?t:Ot(t,e)))]:[0,1]}function _b(t,e){const n=$h.get(t);return(n===Kh||n===_h||n===Oh?Pb:Ob)(e)}function Pb(t){return[0,t.length?Ot(t,(({value:t})=>void 0===t?t:Ot(t,au))):1]}function jb(t,e){const n=t.find((({radius:t})=>void 0!==t));if(void 0!==n)return[0,n.radius];const i=ee(t,.5,(({value:t})=>void 0===t?NaN:ee(t,.25,lu))),s=e.map((t=>3*Math.sqrt(t/i))),c=30/Ot(s);return c<1?s.map((t=>t*c)):s}function $b(t,e){const n=ae(t,(({value:t})=>void 0===t?NaN:ae(t,Math.abs))),i=e.map((t=>12*t/n)),s=60/Ot(i);return s<1?i.map((t=>t*s)):i}function qb(t){for(const{value:e}of t)if(void 0!==e)for(let n of e){if(n>0)return Ob(t,lu);if(n<0)return Ob(t,ru)}return[1,10]}function tC(t){const e=[];for(const{value:n}of t)if(void 0!==n)for(const t of n)e.push(t);return e}function eC(t){return(e,n)=>i=>t(e+i*(n-e))}function nC(t,e,n,i,{type:s,nice:c,clamp:a,domain:l=Ob(i),unknown:r,pivot:o=0,scheme:g,range:B,symmetric:d=!0,interpolate:Q=($h.get(t)===zh?null==g&&void 0!==B?bs:Vb(void 0!==g?g:"rdbu"):ms),reverse:I}){o=+o,l=ch(l);let[F,u]=l;if(l.length>2&&MU(`Warning: the diverging ${t} scale domain contains extra elements.`),gt(F,u)<0&&([F,u]=[u,F],I=!I),F=Math.min(F,o),u=Math.max(u,o),"function"!=typeof Q&&(Q=Yb(Q)),void 0!==B&&(Q=1===Q.length?eC(Q)(...B):Js(Q,B)),I&&(Q=Wb(Q)),d){const t=n.apply(o),e=t-n.apply(F),i=n.apply(u)-t;e<i?F=n.invert(t-i):e>i&&(u=n.invert(t+e))}return e.domain([F,o,u]).unknown(r).interpolator(Q),a&&e.clamp(a),c&&e.nice(c),{type:s,domain:[F,u],pivot:o,interpolate:Q,scale:e}}function iC(t,e,n){return nC(t,Ld(),lC,e,n)}function sC(t,e,{exponent:n=1,...i}){return nC(t,Nd().exponent(n=+n),function(t){return.5===t?oC:{apply:e=>Math.sign(e)*Math.pow(Math.abs(e),t),invert:e=>Math.sign(e)*Math.pow(Math.abs(e),1/t)}}(n),e,{...i,type:"diverging-pow"})}function cC(t,e,{base:n=10,pivot:i=1,domain:s=Ob(e,i<0?ru:lu),...c}){return nC(t,Sd().base(n=+n),rC,e,{domain:s,pivot:i,...c})}function aC(t,e,{constant:n=1,...i}){return nC(t,Rd().constant(n=+n),function(t){return{apply:e=>Math.sign(e)*Math.log1p(Math.abs(e/t)),invert:e=>Math.sign(e)*Math.expm1(Math.abs(e))*t}}(n),e,i)}const lC={apply:t=>t,invert:t=>t},rC={apply:Math.log,invert:Math.exp},oC={apply:t=>Math.sign(t)*Math.sqrt(Math.abs(t)),invert:t=>Math.sign(t)*(t*t)};function gC(t,e,n,i){return kb(t,e,n,i)}function BC(t,e,n){return gC(t,function(){return po.apply(md($g,qg,Kg,Tg,Rg,Ag,pg,fg,yg,sB).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}(),e,n)}function dC(t,e,n){return gC(t,function(){return po.apply(md(Pg,jg,Og,zg,Wg,xg,mg,Gg,yg,cB).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)}(),e,n)}const QC=Symbol("ordinal");function IC(t,e,n,{type:i,interval:s,domain:c,range:a,reverse:l,hint:r}){return s=Ah(s,i),void 0===c&&(c=hC(n,s,t)),"categorical"!==i&&i!==QC||(i="ordinal"),l&&(c=de(c)),c=e.domain(c).domain(),void 0!==a&&("function"==typeof a&&(a=a(c)),e.range(a)),{type:i,domain:c,range:a,scale:e,hint:r,interval:s}}function FC(t,e,{type:n,interval:i,domain:s,range:c,scheme:a,unknown:l,...r}){let o;if(i=Ah(i,n),void 0===s&&(s=hC(e,i,t)),$h.get(t)===Ph)o=function(t){return{fill:UC(t,"fill"),stroke:UC(t,"stroke")}}(e),c=void 0===c?function(t){return Hh(t.fill)?TI:MI}(o):ah(c,iU);else if($h.get(t)===zh&&(void 0!==c||"ordinal"!==n&&n!==QC||(c=function(t,e="greys"){const n=new Set,[i,s]=Zb(e,2);for(const e of t)if(null!=e)if(!0===e)n.add(s);else{if(!1!==e)return;n.add(i)}return[...n]}(s,a),void 0!==c&&(a=void 0)),void 0===a&&void 0===c&&(a="ordinal"===n?"turbo":"tableau10"),void 0!==a))if(void 0!==c){const t=Vb(a),e=c[0],n=c[1]-c[0];c=({length:i})=>Ms((i=>t(e+n*i)),i)}else c=vb(a);if(l===Ao)throw new Error(`implicit unknown on ${t} scale is not supported`);return IC(t,xo().unknown(l),e,{...r,type:n,domain:s,range:c,hint:o})}function uC(t,e,n,i){let{round:s}=n;return void 0!==s&&t.round(s=!!s),(t=IC(i,t,e,n)).round=s,t}function hC(t,e,n){const i=new At;for(const{value:e,domain:n}of t){if(void 0!==n)return n();if(void 0!==e)for(const t of e)i.add(t)}if(void 0!==e){const[t,n]=Gt(i).map(e.floor,e);return e.range(t,e.offset(n))}if(i.size>1e4&&$h.get(n)===Th)throw new Error(`implicit ordinal domain of ${n} scale has more than 10,000 values`);return Vt(i,iu)}function UC(t,e){let n;for(const{hint:i}of t){const t=i?.[e];if(void 0!==t)if(void 0===n)n=t;else if(n!==t)return}return n}function bC(t,{label:e,inset:n=0,insetTop:i=n,insetRight:s=n,insetBottom:c=n,insetLeft:a=n,round:l,nice:r,clamp:o,zero:g,align:B,padding:d,projection:Q,facet:{label:I=e}={},...F}={}){const u={};for(const[n,h]of t){const t=F[n],U=LC(n,h,{round:$h.get(n)===Th?l:void 0,nice:r,clamp:o,zero:g,align:B,padding:d,projection:Q,...t});if(U){let{label:l=("fx"===n||"fy"===n?I:e),percent:r,transform:o,inset:g,insetTop:B=(void 0!==g?g:"y"===n?i:0),insetRight:d=(void 0!==g?g:"x"===n?s:0),insetBottom:Q=(void 0!==g?g:"y"===n?c:0),insetLeft:F=(void 0!==g?g:"x"===n?a:0)}=t||{};if(null==o)o=void 0;else if("function"!=typeof o)throw new Error("invalid scale transform; not a function");U.percent=!!r,U.label=void 0===l?yC(h,U):l,U.transform=o,"x"===n||"fx"===n?(U.insetLeft=+F,U.insetRight=+d):"y"!==n&&"fy"!==n||(U.insetTop=+B,U.insetBottom=+Q),u[n]=U}}return u}function CC(t){const e={},n={scales:e};for(const[i,s]of Object.entries(t)){const{scale:t,type:c,interval:a,label:l}=s;e[i]=wC(s),n[i]=t,t.type=c,null!=a&&(t.interval=a),null!=l&&(t.label=l)}return n}function yC(t=[],e){let n;for(const{label:e}of t)if(void 0!==e)if(void 0===n)n=e;else if(n!==e)return;if(void 0!==n)return!XC(e)&&e.percent&&(n=`${n} (%)`),{inferred:!0,toString:()=>n}}function fC(t){const{marginTop:e,marginRight:n,marginBottom:i,marginLeft:s,width:c,height:a,facet:{marginTop:l,marginRight:r,marginBottom:o,marginLeft:g}}=t;return{marginTop:Math.max(e,l),marginRight:Math.max(n,r),marginBottom:Math.max(i,o),marginLeft:Math.max(s,g),width:c,height:a}}function GC({fx:t,fy:e},n){const{marginTop:i,marginRight:s,marginBottom:c,marginLeft:a,width:l,height:r}=fC(n);return{marginTop:i,marginRight:s,marginBottom:c,marginLeft:a,width:t?t.scale.bandwidth()+a+s:l,height:e?e.scale.bandwidth()+i+c:r,facet:{width:l,height:r}}}function pC(t,e){if(void 0===t.range){const{insetLeft:n,insetRight:i}=t,{width:s,marginLeft:c=0,marginRight:a=0}=e,l=c+n,r=s-a-i;t.range=[l,Math.max(l,r)],XC(t)||(t.range=xC(t)),t.scale.range(t.range)}AC(t)}function mC(t,e){if(void 0===t.range){const{insetTop:n,insetBottom:i}=t,{height:s,marginTop:c=0,marginBottom:a=0}=e,l=c+n,r=s-a-i;t.range=[Math.max(l,r),l],XC(t)?t.range.reverse():t.range=xC(t),t.scale.range(t.range)}AC(t)}function AC(t){void 0===t.round&&function({type:t}){return"point"===t||"band"===t}(t)&&function({scale:t}){const e=t.domain().length,[n,i]=t.range(),s=t.paddingInner?t.paddingInner():1,c=t.paddingOuter?t.paddingOuter():t.padding(),a=e-s,l=Math.abs(i-n)/Math.max(1,a+2*c);return(l-Math.floor(l))*a}(t)<=30&&t.scale.round(!0)}function xC(t){const e=t.scale.domain().length+vC(t);if(!(e>2))return t.range;const[n,i]=t.range;return Array.from({length:e},((t,s)=>n+s/(e-1)*(i-n)))}function LC(t,e=[],n={}){const i=function(t,e,{type:n,domain:i,range:s,scheme:c,pivot:a,projection:l}){if("fx"===t||"fy"===t)return"band";"x"!==t&&"y"!==t||null==l||(n=RC);for(const{type:t}of e)if(void 0!==t)if(void 0===n)n=t;else if(n!==t)throw new Error(`scale incompatible with channel: ${n} !== ${t}`);if(n===RC)return;if(void 0!==n)return n;if(void 0===i&&!e.some((({value:t})=>void 0!==t)))return;const r=$h.get(t);if(r===Kh)return"sqrt";if(r===_h||r===Oh)return"linear";if(r===Ph)return"ordinal";if((i||s||[]).length>2)return NC(r);if(void 0!==i){if(Nh(i))return NC(r);if(Xh(i))return"utc"}else{const t=e.map((({value:t})=>t)).filter((t=>void 0!==t));if(t.some(Nh))return NC(r);if(t.some(Xh))return"utc"}if(r===zh){if(null!=a||function(t){return null!=t&&wb.has(`${t}`.toLowerCase())}(c))return"diverging";if(function(t){return null!=t&&Ab.has(`${t}`.toLowerCase())}(c))return"categorical"}return"linear"}(t,e,n);if(void 0===n.type&&void 0===n.domain&&void 0===n.range&&null==n.interval&&"fx"!==t&&"fy"!==t&&XC({type:i})){const n=e.map((({value:t})=>t)).filter((t=>void 0!==t));n.some(Xh)?MU(`Warning: some data associated with the ${t} scale are dates. Dates are typically associated with a "utc" or "time" scale rather than a "${SC(i)}" scale. If you are using a bar mark, you probably want a rect mark with the interval option instead; if you are using a group transform, you probably want a bin transform instead. If you want to treat this data as ordinal, you can specify the interval of the ${t} scale (e.g., d3.utcDay), or you can suppress this warning by setting the type of the ${t} scale to "${SC(i)}".`):n.some(vh)?MU(`Warning: some data associated with the ${t} scale are strings that appear to be dates (e.g., YYYY-MM-DD). If these strings represent dates, you should parse them to Date objects. Dates are typically associated with a "utc" or "time" scale rather than a "${SC(i)}" scale. If you are using a bar mark, you probably want a rect mark with the interval option instead; if you are using a group transform, you probably want a bin transform instead. If you want to treat this data as ordinal, you can suppress this warning by setting the type of the ${t} scale to "${SC(i)}".`):n.some(Zh)&&MU(`Warning: some data associated with the ${t} scale are strings that appear to be numbers. If these strings represent numbers, you should parse or coerce them to numbers. Numbers are typically associated with a "linear" scale rather than a "${SC(i)}" scale. If you want to treat this data as ordinal, you can specify the interval of the ${t} scale (e.g., 1 for integers), or you can suppress this warning by setting the type of the ${t} scale to "${SC(i)}".`)}switch(n.type=i,i){case"diverging":case"diverging-sqrt":case"diverging-pow":case"diverging-log":case"diverging-symlog":case"cyclical":case"sequential":case"linear":case"sqrt":case"threshold":case"quantile":case"pow":case"log":case"symlog":n=EC(e,n,ju);break;case"identity":switch($h.get(t)){case Th:n=EC(e,n,ju);break;case Ph:n=EC(e,n,VC)}break;case"utc":case"time":n=EC(e,n,qu)}switch(i){case"diverging":return iC(t,e,n);case"diverging-sqrt":return function(t,e,n){return sC(t,e,{...n,exponent:.5})}(t,e,n);case"diverging-pow":return sC(t,e,n);case"diverging-log":return cC(t,e,n);case"diverging-symlog":return aC(t,e,n);case"categorical":case"ordinal":case QC:return FC(t,e,n);case"cyclical":case"sequential":case"linear":return function(t,e,n){return kb(t,ko(),e,n)}(t,e,n);case"sqrt":return function(t,e,n){return Jb(t,e,{...n,exponent:.5})}(t,e,n);case"threshold":return Kb(t,0,n);case"quantile":return zb(t,e,n);case"quantize":return function(t,e,{range:n,n:i=(void 0===n?5:(n=[...n]).length),scheme:s="rdylbu",domain:c=_b(t,e),unknown:a,interpolate:l,reverse:r}){const[o,g]=Gt(c);let B;return void 0===n?(B=Mt(o,g,i),B[0]<=o&&B.splice(0,1),B[B.length-1]>=g&&B.pop(),i=B.length+1,n=void 0!==l?Ms(l,i):$h.get(t)===zh?Zb(s,i):void 0):(B=Ms(ms(o,g),i+1).slice(1,-1),o instanceof Date&&(B=B.map((t=>new Date(t))))),Jh(ch(c))<0&&B.reverse(),Kb(t,0,{domain:B,range:n,reverse:r,unknown:a})}(t,e,n);case"pow":return Jb(t,e,n);case"log":return Mb(t,e,n);case"symlog":return Tb(t,e,n);case"utc":return dC(t,e,n);case"time":return BC(t,e,n);case"point":return function(t,e,{align:n=.5,padding:i=.5,...s}){return uC(Ro().align(n).padding(i),e,s,t)}(t,e,n);case"band":return function(t,e,{align:n=.5,padding:i=.1,paddingInner:s=i,paddingOuter:c=("fx"===t||"fy"===t?0:i),...a}){return uC(Lo().align(n).paddingInner(s).paddingOuter(c),e,a,t)}(t,e,n);case"identity":return function(t){return{type:"identity",scale:(e=$h.get(t),e===Th||e===Kh||e===Oh||e===_h?Jo():t=>t)};var e}(t);case void 0:return;default:throw new Error(`unknown scale type: ${i}`)}}function SC(t){return"symbol"==typeof t?t.description:t}const RC={toString:()=>"projection"};function NC(t){switch(t){case Th:return"point";case zh:return QC;default:return"ordinal"}}function XC({type:t}){return"ordinal"===t||"point"===t||"band"===t||t===QC}function vC({type:t}){return"threshold"===t}function ZC(t){if(void 0===t)return!0;const e=t.domain(),n=t(e[0]);for(let i=1,s=e.length;i<s;++i)if(t(e[i])-n)return!1;return!0}function EC(t,{domain:e,...n},i){for(const e of t)void 0!==e.value&&(e.value=i(e.value));return{domain:void 0===e?e:i(e),...n}}function VC(t){return ah(t,iU)}function wC({scale:t,type:e,domain:n,range:i,interpolate:s,interval:c,transform:a,percent:l,pivot:r}){if("identity"===e)return{type:"identity",apply:t=>t,invert:t=>t};const o=t.unknown?t.unknown():void 0;return{type:e,domain:lh(n),...void 0!==i&&{range:lh(i)},...void 0!==a&&{transform:a},...l&&{percent:l},...void 0!==o&&{unknown:o},...void 0!==c&&{interval:c},...void 0!==s&&{interpolate:s},...t.clamp&&{clamp:t.clamp()},...void 0!==r&&{pivot:r,symmetric:!1},...t.base&&{base:t.base()},...t.exponent&&{exponent:t.exponent()},...t.constant&&{constant:t.constant()},...t.align&&{align:t.align(),round:t.round()},...t.padding&&(t.paddingInner?{paddingInner:t.paddingInner(),paddingOuter:t.paddingOuter()}:{padding:t.padding()}),...t.bandwidth&&{bandwidth:t.bandwidth(),step:t.step()},apply:e=>t(e),...t.invert&&{invert:e=>t.invert(e)}}}function WC({x:t,y:e,fy:n,fx:i},{projection:s,aspectRatio:c},{width:a,marginTopDefault:l,marginRightDefault:r,marginBottomDefault:o,marginLeftDefault:g}){const B=n?n.scale.domain().length:1,d=function(t){if("function"==typeof t?.stream)return ub;if(oh(t)&&(t=t.type),null!=t){if("function"!=typeof t){const{aspectRatio:e}=Ub(t);if(e)return e}return ub}}(s);if(d){const t=(1.1*B-.1)/(1.1*(i?i.scale.domain().length:1)-.1)*d,e=Math.max(.1,Math.min(10,t));return Math.round((a-g-r)*e+l+o)}const Q=e?XC(e)?e.scale.domain().length:Math.max(7,17/B):1;if(null!=c){if(c=+c,!(isFinite(c)&&c>0))throw new Error(`invalid aspectRatio: ${c}`);const s=HC("y",e)/(HC("x",t)*c),B=i?i.scale.bandwidth():1,d=n?n.scale.bandwidth():1;return(s*(B*(a-g-r)-t.insetLeft-t.insetRight)+e.insetTop+e.insetBottom)/d+l+o}return!(!e&&!n)*Math.max(1,Math.min(60,Q*B))*20+30*!!i+60}function HC(t,e){if(!e)throw new Error(`aspectRatio requires ${t} scale`);const{type:n,domain:i}=e;let s;switch(n){case"linear":case"utc":case"time":s=Number;break;case"pow":{const t=e.scale.exponent();s=e=>Math.pow(e,t);break}case"log":s=Math.log;break;case"point":case"band":return i.length;default:throw new Error(`unsupported ${t} scale for aspectRatio: ${n}`)}const[c,a]=Gt(i);return Math.abs(s(a)-s(c))}function DC(t,e){const{fx:n,fy:i}=bC(t,e),s=n?.scale.domain(),c=i?.scale.domain();return s&&c?function(...t){const e="function"==typeof t[t.length-1]&&function(t){return e=>t(...e)}(t.pop()),n=(t=t.map(bt)).map(ht),i=t.length-1,s=new Array(i+1).fill(0),c=[];if(i<0||n.some(Ut))return c;for(;;){c.push(s.map(((e,n)=>t[n][e])));let a=i;for(;++s[a]===n[a];){if(0===a)return e?c.map(e):c;s[a--]=0}}}(s,c).map((([t,e],n)=>({x:t,y:e,i:n}))):s?s.map(((t,e)=>({x:t,i:e}))):c?c.map(((t,e)=>({y:t,i:e}))):void 0}function YC(t,{fx:e,fy:n}){const i=Fh(t),s=e?.value,c=n?.value;return e&&n?vt(i,(t=>(t.fx=s[t[0]],t.fy=c[t[0]],t)),(t=>s[t]),(t=>c[t])):e?vt(i,(t=>(t.fx=s[t[0]],t)),(t=>s[t])):vt(i,(t=>(t.fy=c[t[0]],t)),(t=>c[t]))}function kC(t){const e=[],n=new Uint32Array(Be(t,(t=>t.length)));for(const i of t){let s=0;for(const e of t)i!==e&&(n.set(e,s),s+=e.length);e.push(n.slice(0,s))}return e}const JC=new Map([["top",OC],["right",jC],["bottom",_C],["left",PC],["top-left",$C(OC,PC)],["top-right",$C(OC,jC)],["bottom-left",$C(_C,PC)],["bottom-right",$C(_C,jC)],["top-empty",function(t,{y:e},{x:n,y:i,empty:s}){if(s)return!1;if(!e)return;const c=zC(e,i);if(c>0)return KC(t,n,e[c-1])}],["right-empty",function(t,{x:e},{x:n,y:i,empty:s}){if(s)return!1;if(!e)return;const c=zC(e,n);if(c<e.length-1)return KC(t,e[c+1],i)}],["bottom-empty",function(t,{y:e},{x:n,y:i,empty:s}){if(s)return!1;if(!e)return;const c=zC(e,i);if(c<e.length-1)return KC(t,n,e[c+1])}],["left-empty",function(t,{x:e},{x:n,y:i,empty:s}){if(s)return!1;if(!e)return;const c=zC(e,n);if(c>0)return KC(t,e[c-1],i)}],["empty",function(t,e,{empty:n}){return n}]]);const MC=new WeakMap;function TC(t){let e=MC.get(t);return e||MC.set(t,e=new mt(ah(t,((t,e)=>[t,e])))),e}function zC(t,e){return TC(t).get(e)}function KC(t,e,n){return function(t,e,n){return e=Uh(e),n=Uh(n),t.find((t=>Object.is(Uh(t.x),e)&&Object.is(Uh(t.y),n)))}(t,e,n)?.empty}function OC(t,{y:e},{y:n}){return!e||0===zC(e,n)}function _C(t,{y:e},{y:n}){return!e||zC(e,n)===e.length-1}function PC(t,{x:e},{x:n}){return!e||0===zC(e,n)}function jC(t,{x:e},{x:n}){return!e||zC(e,n)===e.length-1}function $C(t,e){return function(){return t.apply(null,arguments)&&e.apply(null,arguments)}}function qC(t,{channels:{fx:e,fy:n},groups:i}){return e&&n?t.map((({x:t,y:e})=>i.get(t)?.get(e)??[])):e?t.map((({x:t})=>i.get(t)??[])):t.map((({y:t})=>i.get(t)??[]))}class ty{constructor(t,e={},n={},i){const{facet:s="auto",facetAnchor:c,fx:a,fy:l,sort:r,dx:o=0,dy:g=0,margin:B=0,marginTop:d=B,marginRight:Q=B,marginBottom:I=B,marginLeft:F=B,clip:u=i?.clip,channels:h,tip:U,render:b}=n;if(this.data=t,this.sort=dh(r)?r:null,this.initializer=cU(n).initializer,this.transform=this.initializer?n.transform:sU(n).transform,null===s||!1===s?this.facet=null:(this.facet=sh(!0===s?"include":s,"facet",["auto","include","exclude","super"]),this.fx=t===Du&&"string"==typeof a?[a]:a,this.fy=t===Du&&"string"==typeof l?[l]:l),this.facetAnchor=function(t){if(null==t)return null;const e=JC.get(`${t}`.toLowerCase());if(e)return e;throw new Error(`invalid facet anchor: ${t}`)}(c),e=Mh(e),void 0!==h&&(e={...iy(h),...e}),void 0!==i&&(e={...OU(this,n,i),...e}),this.channels=Object.fromEntries(Object.entries(e).map((([e,n])=>{if(Bh(n.value)){const{value:t,label:e=n.label,scale:i=n.scale}=n.value;n={...n,label:e,scale:i,value:t}}if(t===Du&&"string"==typeof n.value){const{value:t}=n;n={...n,value:[t]}}return[e,n]})).filter((([t,{value:e,optional:n}])=>{if(null!=e)return!0;if(n)return!1;throw new Error(`missing channel value: ${t}`)}))),this.dx=+o,this.dy=+g,this.marginTop=+d,this.marginRight=+Q,this.marginBottom=+I,this.marginLeft=+F,this.clip=tb(u),this.tip=function(t){return!0===t?"xy":!1===t||null==t?null:"string"==typeof t?sh(t,"tip",["x","y","xy"]):t}(U),"super"===this.facet){if(a||l)throw new Error("super-faceting cannot use fx or fy");for(const t in this.channels){const{scale:n}=e[t];if("x"===n||"y"===n)throw new Error("super-faceting cannot use x or y")}}null!=b&&(this.render=ny(b,this.render))}initialize(t,e,n){let i=ch(this.data);void 0===t&&null!=i&&(t=[Fh(i)]);const s=t;null!=this.transform&&(({facets:t,data:i}=this.transform(i,t,n)),i=ch(i)),void 0!==t&&(t.original=s);const c=function(t,e){return Object.fromEntries(Object.entries(t).map((([t,n])=>[t,SU(e,n,t)])))}(this.channels,i);return null!=this.sort&&function(t,e,n,i,s){const{order:c,reverse:a,reduce:l=!0,limit:r}=s;for(const o in s){if(!$h.has(o))continue;let{value:g,order:B=c,reverse:d=a,reduce:Q=l,limit:I=r}=Lh(s[o]);const F=g?.startsWith("-");if(F&&(g=g.slice(1)),B=void 0===B?F!==("width"===g||"height"===g)?wU:VU:EU(B),null==Q||!1===Q)continue;const u="fx"===o||"fy"===o?XU(e,i[o]):NU(n,o);if(!u)throw new Error(`missing channel for scale: ${o}`);const h=u.value,[U=0,b=1/0]=Sh(I)?I:I<0?[I]:[0,I];if(null==g)u.domain=()=>{let t=Array.from(new At(h));return d&&(t=t.reverse()),0===U&&b===1/0||(t=t.slice(U,b)),t};else{const e="data"===g?t:"height"===g?vU(n,"y1","y2"):"width"===g?vU(n,"x1","x2"):ZU(n,g,"y"===g?"y2":"x"===g?"x2":void 0),i=hU(!0===Q?"max":Q,e);u.domain=()=>{let t=Zt(Fh(h),(t=>i.reduceIndex(t,e)),(t=>h[t]));return B&&t.sort(B),d&&t.reverse(),0===U&&b===1/0||(t=t.slice(U,b)),t.map(Ou)}}}}(i,t,c,e,this.sort),{data:i,facets:t,channels:c}}filter(t,e,n){for(const i in e){const{filter:s=nu}=e[i];if(null!==s){const e=n[i];t=t.filter((t=>s(e[t])))}}return t}project(t,e,n){for(const i in t)if("x"===t[i].scale&&/^x|x$/.test(i)){const s=i.replace(/^x|x$/,"y");s in t&&"y"===t[s].scale&&Gb(i,s,e,n.projection)}}scale(t,e,n){const i=function(t,e){const n=Object.fromEntries(Object.entries(t).map((([t,{scale:n,value:i}])=>{const s=null==n?null:e[n];return[t,null==s?i:ah(i,s)]})));return n.channels=t,n}(t,e);return n.projection&&this.project(t,i,n),i}}function ey(...t){return t.plot=ty.prototype.plot,t}function ny(t,e){if(null==t)return null===e?void 0:e;if(null==e)return null===t?void 0:t;if("function"!=typeof t)throw new TypeError(`invalid render transform: ${t}`);if("function"!=typeof e)throw new TypeError(`invalid render transform: ${e}`);return function(n,i,s,c,a,l){return t.call(this,n,i,s,c,a,((t,n,i,s,c)=>e.call(this,t,n,i,s,c,l)))}}function iy(t){return Object.fromEntries(Object.entries(Mh(t)).map((([t,e])=>(void 0===(e="string"==typeof e?{value:e,label:t}:Lh(e)).filter&&null==e.scale&&(e={...e,filter:null}),[t,e]))))}function sy(t,e){return!0===t?.tip?{...t,tip:e}:oh(t?.tip)&&void 0===t.tip.pointer?{...t,tip:{...t.tip,pointer:e}}:t}const cy=new WeakMap;function ay(t,e,{x:n,y:i,px:s,py:c,maxRadius:a=40,channels:l,render:r,...o}={}){return a=+a,null!=s&&(n??=null,l={...l,px:{value:s,scale:"x"}}),null!=c&&(i??=null,l={...l,py:{value:c,scale:"y"}}),{x:n,y:i,channels:l,...o,render:ny((function(n,i,s,c,l,r){const o=(l={...l,pointerSticky:!1}).ownerSVGElement,{data:g}=l.getMarkState(this);let B=cy.get(o);B||cy.set(o,B={sticky:!1,roots:[],renders:[]});let d=B.renders.push(X)-1;const{x:Q,y:I,fx:F,fy:u}=i;let h=F?F(n.fx)-c.marginLeft:0,U=u?u(n.fy)-c.marginTop:0;Q?.bandwidth&&(h+=Q.bandwidth()/2),I?.bandwidth&&(U+=I.bandwidth()/2);const b=null!=n.fi;let C;if(b){let t=B.facetStates;t||(B.facetStates=t=new Map),C=t.get(this),C||t.set(this,C=new Map)}const[y,f]=Bb(this,c),{px:G,py:p}=s,m=G?t=>G[t]:gy(s,y),A=p?t=>p[t]:By(s,f);let x,L,S,R;function N(t,e){if(b){if(R&&(R=cancelAnimationFrame(R)),null!=t)return C.set(n.fi,e),void(R=requestAnimationFrame((()=>{R=null;for(const[i,s]of C)if(s<e||s===e&&i<n.fi){t=null;break}X(t)})));C.delete(n.fi)}X(t)}function X(t){if(x===t&&S===B.sticky)return;x=t,S=l.pointerSticky=B.sticky;const e=null==x?[]:[x];b&&(e.fx=n.fx,e.fy=n.fy,e.fi=n.fi);const a=r(e,i,s,c,l);if(L){if(b){const t=L.parentNode,e=L.getAttribute("transform"),n=a.getAttribute("transform");e?a.setAttribute("transform",e):a.removeAttribute("transform"),n?t.setAttribute("transform",n):t.removeAttribute("transform"),a.removeAttribute("aria-label"),a.removeAttribute("aria-description"),a.removeAttribute("aria-hidden")}L.replaceWith(a)}return B.roots[d]=L=a,null==x&&C?.size>1||l.dispatchValue(null==x?null:g[x]),a}function v(i){if(B.sticky||"mouse"===i.pointerType&&1===i.buttons)return;let[s,l]=Tn(i);s-=h,l-=U;const r=s<c.marginLeft||s>c.width-c.marginRight?1:t,o=l<c.marginTop||l>c.height-c.marginBottom?1:e;let g=null,d=a*a;for(const t of n){const e=r*(m(t)-s),n=o*(A(t)-l),i=e*e+n*n;i<=d&&(g=t,d=i)}if(null!=g&&(1!==t||1!==e)){const t=m(g)-s,e=A(g)-l;d=t*t+e*e}N(g,d)}return o.addEventListener("pointerenter",v),o.addEventListener("pointermove",v),o.addEventListener("pointerdown",(function(t){"mouse"===t.pointerType&&null!=x&&(B.sticky&&B.roots.some((e=>e?.contains(t.target)))||(B.sticky?(B.sticky=!1,B.renders.forEach((t=>t(null)))):(B.sticky=!0,X(x)),t.stopImmediatePropagation()))})),o.addEventListener("pointerleave",(function(t){"mouse"===t.pointerType&&(B.sticky||N(null))})),X(null)}),r)}}function ly(t){return ay(1,1,t)}function ry(t){return ay(1,.01,t)}function oy(t){return ay(.01,1,t)}function gy({x1:t,x2:e,x:n=t},i){return t&&e?n=>(t[n]+e[n])/2:n?t=>n[t]:()=>i}function By({y1:t,y2:e,y:n=t},i){return t&&e?n=>(t[n]+e[n])/2:n?t=>n[t]:()=>i}function dy(t){return XC(t)&&void 0===t.interval?void 0:"tabular-nums"}const Qy=Math.PI/180;function Iy(t,{marker:e,markerStart:n=e,markerMid:i=e,markerEnd:s=e}={}){t.markerStart=Fy(n),t.markerMid=Fy(i),t.markerEnd=Fy(s)}function Fy(t){if(null==t||!1===t)return null;if(!0===t)return Uy;if("function"==typeof t)return t;switch(`${t}`.toLowerCase()){case"none":return null;case"arrow":return uy("auto");case"arrow-reverse":return uy("auto-start-reverse");case"dot":return hy;case"circle":case"circle-fill":return Uy;case"circle-stroke":return by}throw new Error(`invalid marker: ${t}`)}function uy(t){return(e,n)=>Qb("svg:marker",n).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("orient",t).attr("fill","none").attr("stroke",e).attr("stroke-width",1.5).attr("stroke-linecap","round").attr("stroke-linejoin","round").call((t=>t.append("path").attr("d","M-1.5,-3l3,3l-3,3"))).node()}function hy(t,e){return Qb("svg:marker",e).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill",t).attr("stroke","none").call((t=>t.append("circle").attr("r",2.5))).node()}function Uy(t,e){return Qb("svg:marker",e).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill",t).attr("stroke","white").attr("stroke-width",1.5).call((t=>t.append("circle").attr("r",3))).node()}function by(t,e){return Qb("svg:marker",e).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill","white").attr("stroke",t).attr("stroke-width",1.5).call((t=>t.append("circle").attr("r",3))).node()}let Cy=0;function yy(t,e,{stroke:n},i){return Gy(t,e,n&&(t=>n[t]),i)}function fy(t,e,{stroke:n},i){return Gy(t,e,n&&(([t])=>n[t]),i)}function Gy(t,{markerStart:e,markerMid:n,markerEnd:i,stroke:s},c=(()=>s),a){const l=new Map;function r(t){return function(e){const n=c(e);let i=l.get(t);i||l.set(t,i=new Map);let s=i.get(n);if(!s){const e=this.parentNode.insertBefore(t(n,a),this),c="plot-marker-"+ ++Cy;e.setAttribute("id",c),i.set(n,s=`url(#${c})`)}return s}}e&&t.attr("marker-start",r(e)),n&&t.attr("marker-mid",r(n)),i&&t.attr("marker-end",r(i))}function py({inset:t,insetLeft:e,insetRight:n,...i}={}){return[e,n]=Ay(t,e,n),{inset:t,insetLeft:e,insetRight:n,...i}}function my({inset:t,insetTop:e,insetBottom:n,...i}={}){return[e,n]=Ay(t,e,n),{inset:t,insetTop:e,insetBottom:n,...i}}function Ay(t,e,n){return void 0===t&&void 0===e&&void 0===n?TU?[1,0]:[.5,.5]:[e,n]}function xy(t,{interval:e}){return(t={...Lh(t)}).interval=mh(void 0===t.interval?e:t.interval),t}function Ly(t,e,n,i){const{[t]:s,[`${t}1`]:c,[`${t}2`]:a}=n,{value:l,interval:r}=xy(s,n);if(null==l||null==r&&!i)return n;const o=yh(s);if(null==r){let e;const i={transform:t=>e||(e=wu(t,l)),label:o};return{...n,[t]:void 0,[`${t}1`]:void 0===c?i:c,[`${t}2`]:void 0===a?i:a}}let g,B;function d(t){return void 0!==B&&t===g?B:B=ah(wu(g=t,l),(t=>r.floor(t)))}return e({...n,[t]:void 0,[`${t}1`]:void 0===c?{transform:d,label:o}:c,[`${t}2`]:void 0===a?{transform:t=>d(t).map((t=>r.offset(t))),label:o}:a})}function Sy(t,e,n){const{[t]:i}=n,{value:s,interval:c}=xy(i,n);return null==s||null==c?n:e({...n,[t]:{label:yh(i),transform:t=>{const e=ah(wu(t,s),(t=>c.floor(t))),n=e.map((t=>c.offset(t)));return e.map(Xh(e)?(t,e)=>null==t||isNaN(t=+t)||null==(e=n[e])||isNaN(e=+e)?void 0:new Date((t+e)/2):(t,e)=>null==t||null==(e=n[e])?NaN:(+t+ +e)/2)}}})}const Ry={ariaLabel:"rule",fill:null,stroke:"currentColor"};class Ny extends ty{constructor(t,e={}){const{x:n,y1:i,y2:s,inset:c=0,insetTop:a=c,insetBottom:l=c}=e;super(t,{x:{value:n,scale:"x",optional:!0},y1:{value:i,scale:"y",optional:!0},y2:{value:s,scale:"y",optional:!0}},sy(e,"x"),Ry),this.insetTop=Ku(a),this.insetBottom=Ku(l),Iy(this,e)}render(t,e,n,i,s){const{x:c,y:a}=e,{x:l,y1:r,y2:o}=n,{width:g,height:B,marginTop:d,marginRight:Q,marginLeft:I,marginBottom:F}=i,{insetTop:u,insetBottom:h}=this;return Qb("svg:g",s).call(eb,this,i,s).call(cb,this,{x:l&&c},TU,0).call((e=>e.selectAll().data(t).enter().append("line").call(nb,this).attr("x1",l?t=>l[t]:(I+g-Q)/2).attr("x2",l?t=>l[t]:(I+g-Q)/2).attr("y1",r&&!ZC(a)?t=>r[t]+u:d+u).attr("y2",o&&!ZC(a)?a.bandwidth?t=>o[t]+a.bandwidth()-h:t=>o[t]-h:B-F-h).call(jU,this,n).call(yy,this,n,s))).node()}}class Xy extends ty{constructor(t,e={}){const{x1:n,x2:i,y:s,inset:c=0,insetRight:a=c,insetLeft:l=c}=e;super(t,{y:{value:s,scale:"y",optional:!0},x1:{value:n,scale:"x",optional:!0},x2:{value:i,scale:"x",optional:!0}},sy(e,"y"),Ry),this.insetRight=Ku(a),this.insetLeft=Ku(l),Iy(this,e)}render(t,e,n,i,s){const{x:c,y:a}=e,{y:l,x1:r,x2:o}=n,{width:g,height:B,marginTop:d,marginRight:Q,marginLeft:I,marginBottom:F}=i,{insetLeft:u,insetRight:h}=this;return Qb("svg:g",s).call(eb,this,i,s).call(cb,this,{y:l&&a},0,TU).call((e=>e.selectAll().data(t).enter().append("line").call(nb,this).attr("x1",r&&!ZC(c)?t=>r[t]+u:I+u).attr("x2",o&&!ZC(c)?c.bandwidth?t=>o[t]+c.bandwidth()-h:t=>o[t]-h:g-Q-h).attr("y1",l?t=>l[t]:(d+B-F)/2).attr("y2",l?t=>l[t]:(d+B-F)/2).call(jU,this,n).call(yy,this,n,s))).node()}}function vy(t,e){let{x:n=Ju,y:i,y1:s,y2:c,...a}=function(t={}){return Ly("y",my,t)}(e);return[s,c]=Ey(i,s,c),new Ny(t,{...a,x:n,y1:s,y2:c})}function Zy(t,e){let{y:n=Ju,x:i,x1:s,x2:c,...a}=function(t={}){return Ly("x",py,t)}(e);return[s,c]=Ey(i,s,c),new Xy(t,{...a,y:n,x1:s,x2:c})}function Ey(t,e,n){if(null==t){if(void 0===e){if(void 0!==n)return[0,n]}else if(void 0===n)return[0,e]}else{if(void 0===e)return void 0===n?[0,t]:[t,n];if(void 0===n)return[t,e]}return[e,n]}function Vy(t,...e){let n=e.length;for(let i=0,s=!0;i<n;++i)"function"!=typeof e[i]&&(s&&(t=t.slice(),s=!1),t.splice(i,2,t[i]+e[i]+t[i+1]),e.splice(i,1),--i,--n);return i=>{let s=t[0];for(let c=0;c<n;++c)s+=e[c](i)+t[c+1];return s}}const wy={ariaLabel:"text",strokeLinejoin:"round",strokeWidth:3,paintOrder:"stroke"},Wy="";class Hy extends ty{constructor(t,e={}){const{x:n,y:i,text:s=(Sh(t)&&Rh(t)?Ju:ku),frameAnchor:c,textAnchor:a=(/right$/i.test(c)?"end":/left$/i.test(c)?"start":"middle"),lineAnchor:l=(/^top/i.test(c)?"top":/^bottom/i.test(c)?"bottom":"middle"),lineHeight:r=1,lineWidth:o=1/0,textOverflow:g,monospace:B,fontFamily:d=(B?"ui-monospace, monospace":void 0),fontSize:Q,fontStyle:I,fontVariant:F,fontWeight:u,rotate:h}=e,[U,b]=nh(h,0),[C,y]=function(t){return null==t||"number"==typeof t?[void 0,t]:"string"!=typeof t?[t,void 0]:(t=t.trim().toLowerCase(),zy.has(t)||/^[+-]?\d*\.?\d+(e[+-]?\d+)?(\w*|%)$/.test(t)?[void 0,t]:[t,void 0])}(Q);var f;if(super(t,{x:{value:n,scale:"x",optional:!0},y:{value:i,scale:"y",optional:!0},fontSize:{value:C,optional:!0},rotate:{value:(f=U,null==f?null:{transform:t=>wu(t,f,Float64Array),label:yh(f)}),optional:!0},text:{value:s,filter:cu,optional:!0}},e,wy),this.rotate=b,this.textAnchor=ab(a,"middle"),this.lineAnchor=sh(l,"lineAnchor",["top","middle","bottom"]),this.lineHeight=+r,this.lineWidth=+o,this.textOverflow=Dy(g),this.monospace=!!B,this.fontFamily=zu(d),this.fontSize=y,this.fontStyle=zu(I),this.fontVariant=zu(F),this.fontWeight=zu(u),this.frameAnchor=kh(c),!(this.lineWidth>=0))throw new Error(`invalid lineWidth: ${o}`);this.splitLines=jy(this),this.clipLine=$y(this)}render(t,e,n,i,s){const{x:c,y:a}=e,{x:l,y:r,rotate:o,text:g,title:B,fontSize:d}=n,{rotate:Q}=this,[I,F]=Bb(this,i);return Qb("svg:g",s).call(eb,this,i,s).call(Ty,this,g,i).call(cb,this,{x:l&&c,y:r&&a}).call((e=>e.selectAll().data(t).enter().append("text").call(nb,this).call(Yy,this,g,B).attr("transform",Vy`translate(${l?t=>l[t]:I},${r?t=>r[t]:F})${o?t=>` rotate(${o[t]})`:Q?` rotate(${Q})`:""}`).call(sb,"font-size",d&&(t=>d[t])).call(jU,this,n))).node()}}function Dy(t){return null==t?null:sh(t,"textOverflow",["clip","ellipsis","clip-start","clip-end","ellipsis-start","ellipsis-middle","ellipsis-end"]).replace(/^(clip|ellipsis)$/,"$1-end")}function Yy(t,e,n,i){if(!n)return;const{lineAnchor:s,lineHeight:c,textOverflow:a,splitLines:l,clipLine:r}=e;t.each((function(t){const e=l(YU(n[t])??"").map(r),o=e.length,g="top"===s?.71:"bottom"===s?1-o:(164-100*o)/200;if(o>1){let t=0;for(let n=0;n<o;++n){if(++t,!e[n])continue;const i=this.ownerDocument.createElementNS(Xe.svg,"tspan");i.setAttribute("x",0),n===t-1?i.setAttribute("y",(g+n)*c+"em"):i.setAttribute("dy",t*c+"em"),i.textContent=e[n],this.appendChild(i),t=0}}else g&&this.setAttribute("y",g*c+"em"),this.textContent=e[0];if(a&&!i&&e[0]!==n[t]){const e=this.ownerDocument.createElementNS(Xe.svg,"title");e.textContent=n[t],this.appendChild(e)}}))}function ky(t,{x:e,y:n,...i}={}){return void 0===i.frameAnchor&&([e,n]=Qh(e,n)),new Hy(t,{...i,x:e,y:n})}function Jy(t,{x:e=Ju,...n}={}){return new Hy(t,function(t={}){return Sy("y",my,t)}({...n,x:e}))}function My(t,{y:e=Ju,...n}={}){return new Hy(t,function(t={}){return Sy("x",py,t)}({...n,y:e}))}function Ty(t,e,n){sb(t,"text-anchor",e.textAnchor),sb(t,"font-family",e.fontFamily),sb(t,"font-size",e.fontSize),sb(t,"font-style",e.fontStyle),sb(t,"font-variant",void 0===e.fontVariant?function(t){return t&&(function(t){for(const e of t)if(null!=e)return"number"==typeof e}(t)||Xh(t))?"tabular-nums":void 0}(n):e.fontVariant),sb(t,"font-weight",e.fontWeight)}const zy=new Set(["inherit","initial","revert","unset","xx-small","x-small","small","medium","large","x-large","xx-large","xxx-large","larger","smaller"]);function Ky(t,e,n){const i=[];let s,c=0;for(const[a,l,r]of function*(t){let e=0,n=0;const i=t.length;for(;n<i;){let i=1;switch(t[n]){case Wy:case"-":++n,yield[e,n,!1],e=n;break;case" ":for(yield[e,n,!1];" "===t[++n];);e=n;break;case"\r":"\n"===t[n+1]&&++i;case"\n":yield[e,n,!0],n+=i,e=n;break;default:++n}}yield[e,n,!0]}(t))void 0===s&&(s=a),c>s&&n(t,s,l)>e&&(i.push(t.slice(s,c)+(t[c-1]===Wy?"-":"")),s=a),r?(i.push(t.slice(s,l)),s=void 0):c=l;return i}const Oy={a:56,b:63,c:57,d:63,e:58,f:37,g:62,h:60,i:26,j:26,k:55,l:26,m:88,n:60,o:60,p:62,q:62,r:39,s:54,t:38,u:60,v:55,w:79,x:54,y:55,z:55,A:69,B:67,C:73,D:74,E:61,F:58,G:76,H:75,I:28,J:55,K:67,L:58,M:89,N:75,O:78,P:65,Q:78,R:67,S:65,T:65,U:75,V:69,W:98,X:69,Y:67,Z:67,0:64,1:48,2:62,3:64,4:66,5:63,6:65,7:58,8:65,9:65," ":29,"!":32,'"':49,"'":31,"(":39,")":39,",":31,"-":48,".":31,"/":32,":":31,";":31,"?":52,"‘":31,"’":31,"“":47,"”":47,"…":82};function _y(t,e=0,n=t.length){let i=0;for(let s=e;s<n;s=af(t,s))i+=Oy[t[s]]??(rf(t,s)?120:Oy.e);return i}function Py(t,e=0,n=t.length){let i=0;for(let s=e;s<n;s=af(t,s))i+=rf(t,s)?200:100;return i}function jy({monospace:t,lineWidth:e,textOverflow:n}){if(null!=n||e==1/0)return t=>t.split(/\r\n?|\n/g);const i=t?Py:_y,s=100*e;return t=>Ky(t,s,i)}function $y({monospace:t,lineWidth:e,textOverflow:n}){if(null==n||e==1/0)return t=>t;const i=t?Py:_y,s=100*e;switch(n){case"clip-start":return t=>nf(t,s,i,"");case"clip-end":return t=>ef(t,s,i,"");case"ellipsis-start":return t=>nf(t,s,i,qy);case"ellipsis-middle":return t=>function(t,e,n,i){t=t.trim();const s=n(t);if(s<=e)return t;const c=n(i)/2,[a,l]=tf(t,e/2,n,c),[r]=tf(t,s-e/2-l+c,n,-c);return r<0?i:t.slice(0,a).trimEnd()+i+t.slice(af(t,r)).trimStart()}(t,s,i,qy);case"ellipsis-end":return t=>ef(t,s,i,qy)}}const qy="…";function tf(t,e,n,i){const s=[];let c=0;for(let a=0,l=0,r=t.length;a<r;a=l){l=af(t,a);const r=n(t,a,l);if(c+r>e){for(c+=i;c>e&&a>0;)l=a,a=s.pop(),c-=n(t,a,l);return[a,e-c]}c+=r,s.push(a)}return[-1,0]}function ef(t,e,n,i){t=t.trim();const s=n(i),[c]=tf(t,e,n,s);return c<0?t:t.slice(0,c).trimEnd()+i}function nf(t,e,n,i){const s=n(t=t.trim());if(s<=e)return t;const c=n(i),[a]=tf(t,s-e+c,n,-c);return a<0?i:i+t.slice(af(t,a)).trimStart()}const sf=/[\p{Combining_Mark}\p{Emoji_Modifier}]+/uy,cf=/\p{Extended_Pictographic}/uy;function af(t,e){return e+=function(t,e){const n=t.charCodeAt(e);if(n>=55296&&n<56320){const n=t.charCodeAt(e+1);return n>=56320&&n<57344}return!1}(t,e)?2:1,function(t,e){return!lf(t,e)&&(sf.lastIndex=e,sf.test(t))}(t,e)&&(e=sf.lastIndex),function(t,e){return 8205===t.charCodeAt(e)}(t,e)?af(t,e+1):e}function lf(t,e){return t.charCodeAt(e)<128}function rf(t,e){return!lf(t,e)&&(cf.lastIndex=e,cf.test(t))}const of={ariaLabel:"vector",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinejoin:"round",strokeLinecap:"round"},gf=3.5,Bf=5*gf,df={draw(t,e,n){const i=e*n/Bf;t.moveTo(0,0),t.lineTo(0,-e),t.moveTo(-i,i-e),t.lineTo(0,-e),t.lineTo(i,i-e)}},Qf={draw(t,e,n){t.moveTo(-n,0),t.lineTo(0,-e),t.lineTo(n,0)}},If=new Map([["arrow",df],["spike",Qf]]);class Ff extends ty{constructor(t,e={}){const{x:n,y:i,r:s=gf,length:c,rotate:a,shape:l=df,anchor:r="middle",frameAnchor:o}=e,[g,B]=nh(c,12),[d,Q]=nh(a,0);super(t,{x:{value:n,scale:"x",optional:!0},y:{value:i,scale:"y",optional:!0},length:{value:g,scale:"length",optional:!0},rotate:{value:d,optional:!0}},e,of),this.r=+s,this.length=B,this.rotate=Q,this.shape=function(t){if(function(t){return t&&"function"==typeof t.draw}(t))return t;const e=If.get(`${t}`.toLowerCase());if(e)return e;throw new Error(`invalid shape: ${t}`)}(l),this.anchor=sh(r,"anchor",["start","middle","end"]),this.frameAnchor=kh(o)}render(t,e,n,i,s){const{x:c,y:a}=e,{x:l,y:r,length:o,rotate:g}=n,{length:B,rotate:d,anchor:Q,shape:I,r:F}=this,[u,h]=Bb(this,i);return Qb("svg:g",s).call(eb,this,i,s).call(cb,this,{x:l&&c,y:r&&a}).call((e=>e.selectAll().data(t).enter().append("path").call(nb,this).attr("transform",Vy`translate(${l?t=>l[t]:u},${r?t=>r[t]:h})${g?t=>` rotate(${g[t]})`:d?` rotate(${d})`:""}${"start"===Q?"":"end"===Q?o?t=>` translate(0,${o[t]})`:` translate(0,${B})`:o?t=>` translate(0,${o[t]/2})`:` translate(0,${B/2})`}`).attr("d",o?t=>{const e=ea();return I.draw(e,o[t],F),e}:(()=>{const t=ea();return I.draw(t,B,F),t})()).call(jU,this,n))).node()}}function uf(t,e={}){const{x:n=Ju,...i}=e;return new Ff(t,{...i,x:n})}function hf(t,e={}){const{y:n=Ju,...i}=e;return new Ff(t,{...i,y:n})}function Uf(t,e){return arguments.length<2&&!Sh(t)&&(e=t,t=null),void 0===e&&(e={}),[t,e]}function bf({anchor:t}={},e){return void 0===t?e[0]:sh(t,"anchor",e)}function Cf(t){return bf(t,["left","right"])}function yf(t){return bf(t,["right","left"])}function ff(t){return bf(t,["bottom","top"])}function Gf(t){return bf(t,["top","bottom"])}function pf(){const[t,e]=Uf(...arguments);return Lf("y",Cf(e),t,e)}function mf(){const[t,e]=Uf(...arguments);return Lf("fy",yf(e),t,e)}function Af(){const[t,e]=Uf(...arguments);return Sf("x",ff(e),t,e)}function xf(){const[t,e]=Uf(...arguments);return Sf("fx",Gf(e),t,e)}function Lf(t,e,n,{color:i="currentColor",opacity:s=1,stroke:c=i,strokeOpacity:a=s,strokeWidth:l=1,fill:r=i,fillOpacity:o=s,textAnchor:g,textStroke:B,textStrokeOpacity:d,textStrokeWidth:Q,tickSize:I=("y"===t?6:0),tickPadding:F,tickRotate:u,x:h,margin:U,marginTop:b=(void 0===U?20:U),marginRight:C=(void 0===U?"right"===e?40:0:U),marginBottom:y=(void 0===U?20:U),marginLeft:f=(void 0===U?"left"===e?40:0:U),label:G,labelAnchor:p,labelArrow:m,labelOffset:A,...x}){return I=Ku(I),F=Ku(F),u=Ku(u),void 0!==p&&(p=sh(p,"labelAnchor",["center","top","bottom"])),m=Of(m),ey(I&&!Hh(c)?function(t,e,n,{strokeWidth:i=1,strokeLinecap:s=null,strokeLinejoin:c=null,facetAnchor:a=e+("y"===t?"-empty":""),frameAnchor:l=e,tickSize:r,inset:o=0,insetLeft:g=o,insetRight:B=o,dx:d=0,y:Q=("y"===t?void 0:null),...I}){return Wf(hf,t,e,`${t}-axis tick`,n,{strokeWidth:i,strokeLinecap:s,strokeLinejoin:c,facetAnchor:a,frameAnchor:l,y:Q,...I,dx:"left"===e?+d-TU+ +g:+d+TU-B,anchor:"start",length:r,shape:"left"===e?Mf:Tf})}(t,e,n,{stroke:c,strokeOpacity:a,strokeWidth:l,tickSize:I,tickPadding:F,tickRotate:u,x:h,...x}):null,Hh(r)?null:function(t,e,n,{facetAnchor:i=e+("y"===t?"-empty":""),frameAnchor:s=e,tickSize:c,tickRotate:a=0,tickPadding:l=Math.max(3,9-c)+(Math.abs(a)>60?4*Math.cos(a*Qy):0),text:r,textAnchor:o=(Math.abs(a)>60?"middle":"left"===e?"end":"start"),lineAnchor:g=(a>60?"top":a<-60?"bottom":"middle"),fontVariant:B,inset:d=0,insetLeft:Q=d,insetRight:I=d,dx:F=0,y:u=("y"===t?void 0:null),...h}){return Wf(My,t,e,`${t}-axis tick label`,n,{facetAnchor:i,frameAnchor:s,text:r,textAnchor:o,lineAnchor:g,fontVariant:B,rotate:a,y:u,...h,dx:"left"===e?+F-c-l+ +Q:+F+ +c+ +l-I},(function(t,n,i,s,c){void 0===B&&(this.fontVariant=zf(t)),void 0===r&&(c.text=Hf(t,n,i,s,e))}))}(t,e,n,{fill:r,fillOpacity:o,stroke:B,strokeOpacity:d,strokeWidth:Q,textAnchor:g,tickSize:I,tickPadding:F,tickRotate:u,x:h,marginTop:b,marginRight:C,marginBottom:y,marginLeft:f,...x}),Hh(r)||null===G?null:ky([],wf({fill:r,fillOpacity:o,...x},(function(n,i,s,c,a){const l=c[t],{marginTop:r,marginRight:o,marginBottom:g,marginLeft:B}="y"===t&&a.inset||a,d=p??(l.bandwidth?"center":"top"),Q=A??("right"===e?o:B)-3;return"center"===d?(this.textAnchor=void 0,this.lineAnchor="right"===e?"bottom":"top",this.frameAnchor=e,this.rotate=-90):(this.textAnchor="right"===e?"end":"start",this.lineAnchor=d,this.frameAnchor=`${d}-${e}`,this.rotate=0),this.dy="top"===d?3-r:"bottom"===d?g-3:0,this.dx="right"===e?Q:-Q,this.ariaLabel=`${t}-axis label`,{facets:[[0]],channels:{text:{value:[Kf(t,l,{anchor:e,label:G,labelAnchor:d,labelArrow:m})]}}}}))))}function Sf(t,e,n,{color:i="currentColor",opacity:s=1,stroke:c=i,strokeOpacity:a=s,strokeWidth:l=1,fill:r=i,fillOpacity:o=s,textAnchor:g,textStroke:B,textStrokeOpacity:d,textStrokeWidth:Q,tickSize:I=("x"===t?6:0),tickPadding:F,tickRotate:u,y:h,margin:U,marginTop:b=(void 0===U?"top"===e?30:0:U),marginRight:C=(void 0===U?20:U),marginBottom:y=(void 0===U?"bottom"===e?30:0:U),marginLeft:f=(void 0===U?20:U),label:G,labelAnchor:p,labelArrow:m,labelOffset:A,...x}){return I=Ku(I),F=Ku(F),u=Ku(u),void 0!==p&&(p=sh(p,"labelAnchor",["center","left","right"])),m=Of(m),ey(I&&!Hh(c)?function(t,e,n,{strokeWidth:i=1,strokeLinecap:s=null,strokeLinejoin:c=null,facetAnchor:a=e+("x"===t?"-empty":""),frameAnchor:l=e,tickSize:r,inset:o=0,insetTop:g=o,insetBottom:B=o,dy:d=0,x:Q=("x"===t?void 0:null),...I}){return Wf(uf,t,e,`${t}-axis tick`,n,{strokeWidth:i,strokeLinejoin:c,strokeLinecap:s,facetAnchor:a,frameAnchor:l,x:Q,...I,dy:"bottom"===e?+d-TU-B:+d+TU+ +g,anchor:"start",length:r,shape:"bottom"===e?kf:Jf})}(t,e,n,{stroke:c,strokeOpacity:a,strokeWidth:l,tickSize:I,tickPadding:F,tickRotate:u,y:h,...x}):null,Hh(r)?null:function(t,e,n,{facetAnchor:i=e+("x"===t?"-empty":""),frameAnchor:s=e,tickSize:c,tickRotate:a=0,tickPadding:l=Math.max(3,9-c)+(Math.abs(a)>=10?4*Math.cos(a*Qy):0),text:r,textAnchor:o=(Math.abs(a)>=10?a<0^"bottom"===e?"start":"end":"middle"),lineAnchor:g=(Math.abs(a)>=10?"middle":"bottom"===e?"top":"bottom"),fontVariant:B,inset:d=0,insetTop:Q=d,insetBottom:I=d,dy:F=0,x:u=("x"===t?void 0:null),...h}){return Wf(Jy,t,e,`${t}-axis tick label`,n,{facetAnchor:i,frameAnchor:s,text:void 0===r?null:r,textAnchor:o,lineAnchor:g,fontVariant:B,rotate:a,x:u,...h,dy:"bottom"===e?+F+ +c+ +l-I:+F-c-l+ +Q},(function(t,n,i,s,c){void 0===B&&(this.fontVariant=zf(t)),void 0===r&&(c.text=Hf(t,n,i,s,e))}))}(t,e,n,{fill:r,fillOpacity:o,stroke:B,strokeOpacity:d,strokeWidth:Q,textAnchor:g,tickSize:I,tickPadding:F,tickRotate:u,y:h,marginTop:b,marginRight:C,marginBottom:y,marginLeft:f,...x}),Hh(r)||null===G?null:ky([],wf({fill:r,fillOpacity:o,...x},(function(n,i,s,c,a){const l=c[t],{marginTop:r,marginRight:o,marginBottom:g,marginLeft:B}="x"===t&&a.inset||a,d=p??(l.bandwidth?"center":"right"),Q=A??("top"===e?r:g)-3;return"center"===d?(this.frameAnchor=e,this.textAnchor=void 0):(this.frameAnchor=`${e}-${d}`,this.textAnchor="right"===d?"end":"start"),this.lineAnchor=e,this.dy="top"===e?-Q:Q,this.dx="right"===d?o-3:"left"===d?3-B:0,this.ariaLabel=`${t}-axis label`,{facets:[[0]],channels:{text:{value:[Kf(t,l,{anchor:e,label:G,labelAnchor:d,labelArrow:m})]}}}}))))}function Rf(){const[t,e]=Uf(...arguments);return Zf("y",Cf(e),t,e)}function Nf(){const[t,e]=Uf(...arguments);return Zf("fy",yf(e),t,e)}function Xf(){const[t,e]=Uf(...arguments);return Ef("x",ff(e),t,e)}function vf(){const[t,e]=Uf(...arguments);return Ef("fx",Gf(e),t,e)}function Zf(t,e,n,{y:i=("y"===t?void 0:null),x:s=null,x1:c=("left"===e?s:null),x2:a=("right"===e?s:null),...l}){return Wf(Zy,t,e,`${t}-grid`,n,{y:i,x1:c,x2:a,...Vf(l)})}function Ef(t,e,n,{x:i=("x"===t?void 0:null),y:s=null,y1:c=("top"===e?s:null),y2:a=("bottom"===e?s:null),...l}){return Wf(vy,t,e,`${t}-grid`,n,{x:i,y1:c,y2:a,...Vf(l)})}function Vf({color:t="currentColor",opacity:e=.1,stroke:n=t,strokeOpacity:i=e,strokeWidth:s=1,...c}){return{stroke:n,strokeOpacity:i,strokeWidth:s,...c}}function wf({fill:t,fillOpacity:e,fontFamily:n,fontSize:i,fontStyle:s,fontVariant:c,fontWeight:a,monospace:l,pointerEvents:r,shapeRendering:o,clip:g=!1},B){return[,t]=eh(t),[,e]=nh(e),{facet:"super",x:null,y:null,fill:t,fillOpacity:e,fontFamily:n,fontSize:i,fontStyle:s,fontVariant:c,fontWeight:a,monospace:l,pointerEvents:r,shapeRendering:o,clip:g,initializer:B}}function Wf(t,e,n,i,s,c,a){let l;const r=cU(c).initializer,o=t(s,cU({...c,initializer:function(t,n,i,s,r,o){const g=null==t&&("fx"===e||"fy"===e),{[e]:B}=s;if(!B)throw new Error(`missing scale: ${e}`);const d=B.domain();let{interval:Q,ticks:I,tickFormat:F,tickSpacing:u=("x"===e?80:35)}=c;if("string"==typeof I&&_f(B)&&(Q=I,I=void 0),void 0===I&&(I=Ah(Q,B.type)??function(t,e){const[n,i]=Gt(t.range());return(i-n)/e}(B,u)),null==t){if(Sh(I))t=ch(I);else if(xh(I))t=Yf(I,...Gt(d));else if(B.interval){let e=B.interval;if(B.ticks){const[n,i]=Gt(d);e=Ru(e,(i-n)/e[pu]/I)??e,t=Yf(e,n,i)}else{e=Ru(e,(t=d).length/I)??e,e!==B.interval&&(t=Yf(e,...Gt(t)))}if(e===B.interval){const e=Math.round(t.length/I);e>1&&(t=t.filter(((t,n)=>n%e==0)))}}else t=B.ticks?B.ticks(I):d;if(!B.ticks&&t.length&&t!==d){const n=new At(d);t=t.filter((t=>n.has(t))),t.length||MU(`Warning: the ${e}-axis ticks appear to not align with the scale domain, resulting in no ticks. Try different ticks?`)}"y"===e||"x"===e?n=[Fh(t)]:l[e]={scale:e,value:Ju}}a?.call(this,B,t,I,F,l);const h=Object.fromEntries(Object.entries(l).map((([e,n])=>[e,{...n,value:wu(t,n.value)}])));return g&&(n=o.filterFacets(t,h)),{data:t,facets:n,channels:h}}},r));return null==s?(l=o.channels,o.channels={}):l={},o.ariaLabel=i,void 0===o.clip&&(o.clip=!1),o}function Hf(t,e,n,i,s){return{value:Df(t,e,n,i,s)}}function Df(t,e,n,i,s){return"function"==typeof i?i:void 0===i&&e&&Xh(e)?Xu(e,s)??YU:t.tickFormat?t.tickFormat("number"==typeof n?n:null,i):void 0===i?YU:"string"==typeof i?(Xh(t.domain())?cB:da)(i):Pu(i)}function Yf(t,e,n){return t.range(e,t.offset(t.floor(n)))}const kf={draw(t,e){t.moveTo(0,0),t.lineTo(0,e)}},Jf={draw(t,e){t.moveTo(0,0),t.lineTo(0,-e)}},Mf={draw(t,e){t.moveTo(0,0),t.lineTo(-e,0)}},Tf={draw(t,e){t.moveTo(0,0),t.lineTo(e,0)}};function zf(t){return t.bandwidth&&!t.interval?void 0:"tabular-nums"}function Kf(t,e,{anchor:n,label:i=e.label,labelAnchor:s,labelArrow:c}={}){if(!(null==i||i.inferred&&_f(e)&&/^(date|time|year)$/i.test(i))){if(i=String(i),"auto"===c&&(c=(!e.bandwidth||e.interval)&&!/[↑↓→←]/.test(i)),!c)return i;if(!0===c){const n=function(t){return Math.sign(Jh(t.domain()))*Math.sign(Jh(t.range()))}(e);n&&(c=/x$/.test(t)||"center"===s?/x$/.test(t)===n<0?"left":"right":n<0?"up":"down")}switch(c){case"left":return`← ${i}`;case"right":return`${i} →`;case"up":return"right"===n?`${i} ↑`:`↑ ${i}`;case"down":return"right"===n?`${i} ↓`:`↓ ${i}`}return i}}function Of(t="auto"){return!Hh(t)&&("boolean"==typeof t?t:sh(t,"labelArrow",["auto","up","right","down","left"]))}function _f(t){return Xh(t.domain())}function Pf(t,e){if(null==e)return e;const n=t(e);if(!n)throw new Error(`scale not found: ${e}`);return n}function jf(t,e={},n){let{columns:i,tickFormat:s,fontVariant:c=dy(t),swatchSize:a=15,swatchWidth:l=a,swatchHeight:r=a,marginLeft:o=0,className:g,style:B,width:d}=e;const Q=db(e);g=ob(g),s=Df(t.scale,t.domain,void 0,s);const I=Qb("div",Q).attr("class",`${g}-swatches ${g}-swatches-${null!=i?"columns":"wrap"}`);let F;return null!=i?(F=`.${g}-swatches-columns .${g}-swatch {\n display: flex;\n align-items: center;\n break-inside: avoid;\n padding-bottom: 1px;\n}\n.${g}-swatches-columns .${g}-swatch::before {\n flex-shrink: 0;\n}\n.${g}-swatches-columns .${g}-swatch-label {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}`,I.style("columns",i).selectAll().data(t.domain).enter().append("div").attr("class",`${g}-swatch`).call(n,t,l,r).call((t=>t.append("div").attr("class",`${g}-swatch-label`).attr("title",s).text(s)))):(F=`.${g}-swatches-wrap {\n display: flex;\n align-items: center;\n min-height: 33px;\n flex-wrap: wrap;\n}\n.${g}-swatches-wrap .${g}-swatch {\n display: inline-flex;\n align-items: center;\n margin-right: 1em;\n}`,I.selectAll().data(t.domain).enter().append("span").attr("class",`${g}-swatch`).call(n,t,l,r).append((function(){return this.ownerDocument.createTextNode(s.apply(this,arguments))}))),I.call((t=>t.insert("style","*").text(`.${g}-swatches {\n font-family: system-ui, sans-serif;\n font-size: 10px;\n margin-bottom: 0.5em;\n}\n.${g}-swatch > svg {\n margin-right: 0.5em;\n overflow: visible;\n}\n${F}`))).style("margin-left",o?+o+"px":null).style("width",void 0===d?null:+d+"px").style("font-variant",ab(c,"normal")).call(gb,B).node()}const $f=new Map([["symbol",function(t,{fill:e=(void 0!==t.hint?.fill?t.hint.fill:"none"),fillOpacity:n=1,stroke:i=(void 0!==t.hint?.stroke?t.hint.stroke:Hh(e)?"currentColor":"none"),strokeOpacity:s=1,strokeWidth:c=1.5,r:a=4.5,...l}={},r){const[o,g]=eh(e),[B,d]=eh(i),Q=Pf(r,o),I=Pf(r,B),F=a*a*Math.PI;return n=nh(n)[1],s=nh(s)[1],c=nh(c)[1],jf(t,l,((e,i,a,l)=>e.append("svg").attr("viewBox","-8 -8 16 16").attr("width",a).attr("height",l).attr("fill","color"===o?t=>Q.scale(t):g).attr("fill-opacity",n).attr("stroke","color"===B?t=>I.scale(t):d).attr("stroke-opacity",s).attr("stroke-width",c).append("path").attr("d",(e=>{const n=ea();return t.scale(e).draw(n,F),n}))))}],["color",tG],["opacity",function({type:t,interpolate:e,...n},{legend:i=!0,color:s=mi(0,0,0),...c}){if(!e)throw new Error(`${t} opacity scales are not supported`);!0===i&&(i="ramp");if("ramp"!==`${i}`.toLowerCase())throw new Error(`${i} opacity legends are not supported`);return tG({type:t,...n,interpolate:eG(s)},{legend:i,...c})}]]);function qf({className:t,...e},{label:n,ticks:i,tickFormat:s}={},c){return function(t={},...e){let n=t;for(const i of e)for(const e in i)if(void 0===n[e]){const s=i[e];n===t?n={...n,[e]:s}:n[e]=s}return n}(c,{className:t,...e},{label:n,ticks:i,tickFormat:s})}function tG(t,{legend:e=!0,...n}){if(!0===e&&(e="ordinal"===t.type?"swatches":"ramp"),void 0!==t.domain)switch(`${e}`.toLowerCase()){case"swatches":return function(t,{opacity:e,...n}={}){if(!XC(t)&&!vC(t))throw new Error(`swatches legend requires ordinal or threshold color scale (not ${t.type})`);return jf(t,n,((t,n,i,s)=>t.append("svg").attr("width",i).attr("height",s).attr("fill",n.scale).attr("fill-opacity",nh(e)[1]).append("rect").attr("width","100%").attr("height","100%")))}(t,n);case"ramp":return function(t,e){let{label:n=t.label,tickSize:i=6,width:s=240,height:c=44+i,marginTop:a=18,marginRight:l=0,marginBottom:r=16+i,marginLeft:o=0,style:g,ticks:B=(s-o-l)/64,tickFormat:d,fontVariant:Q=dy(t),round:I=!0,opacity:F,className:u}=e;const h=db(e);u=ob(u),F=nh(F)[1],null===d&&(d=()=>null);const U=Qb("svg",h).attr("class",`${u}-ramp`).attr("font-family","system-ui, sans-serif").attr("font-size",10).attr("width",s).attr("height",c).attr("viewBox",`0 0 ${s} ${c}`).call((t=>t.append("style").text(`.${u}-ramp {\n display: block;\n background: white;\n height: auto;\n height: intrinsic;\n max-width: 100%;\n overflow: visible;\n}\n.${u}-ramp text {\n white-space: pre;\n}`))).call(gb,g);let b,C=t=>t.selectAll(".tick line").attr("y1",a+r-c);const y=I?(t,e)=>t.rangeRound(e):(t,e)=>t.range(e),{type:f,domain:G,range:p,interpolate:m,scale:A,pivot:x}=t;if(m){const t=void 0===p?m:Js(1===m.length?eC(m):m,p);b=y(A.copy(),Ms(ms(o,s-l),Math.min(G.length+(void 0!==x),void 0===p?1/0:p.length)));const e=256,n=h.document.createElement("canvas");n.width=e,n.height=1;const i=n.getContext("2d");for(let n=0,s=e-1;n<e;++n)i.fillStyle=t(n/s),i.fillRect(n,0,1,1);U.append("image").attr("opacity",F).attr("x",o).attr("y",a).attr("width",s-o-l).attr("height",c-a-r).attr("preserveAspectRatio","none").attr("xlink:href",n.toDataURL())}else if("threshold"===f){const t=G,e=void 0===d?t=>t:"string"==typeof d?da(d):d;b=y(ko().domain([-1,p.length-1]),[o,s-l]),U.append("g").attr("fill-opacity",F).selectAll().data(p).enter().append("rect").attr("x",((t,e)=>b(e-1))).attr("y",a).attr("width",((t,e)=>b(e)-b(e-1))).attr("height",c-a-r).attr("fill",(t=>t)),B=ah(t,((t,e)=>e)),d=n=>e(t[n],n)}else b=y(Lo().domain(G),[o,s-l]),U.append("g").attr("fill-opacity",F).selectAll().data(G).enter().append("rect").attr("x",b).attr("y",a).attr("width",Math.max(0,b.bandwidth()-1)).attr("height",c-a-r).attr("fill",A),C=()=>{};return U.append("g").attr("transform",`translate(0,${c-r})`).call(me(b).ticks(Array.isArray(B)?null:B,"string"==typeof d?d:void 0).tickFormat("function"==typeof d?d:void 0).tickSize(i).tickValues(Array.isArray(B)?B:null)).attr("font-size",null).attr("font-family",null).attr("font-variant",ab(Q,"normal")).call(C).call((t=>t.select(".domain").remove())),void 0!==n&&U.append("text").attr("x",o).attr("y",a-6).attr("fill","currentColor").attr("font-weight","bold").text(n),U.node()}(t,n);default:throw new Error(`unknown legend type: ${e}`)}}function eG(t){const{r:e,g:n,b:i}=mi(t)||mi(0,0,0);return t=>`rgba(${e},${n},${i},${t})`}const nG={ariaLabel:"frame",fill:"none",stroke:"currentColor",clip:!1},iG={ariaLabel:"frame",fill:null,stroke:"currentColor",strokeLinecap:"square",clip:!1};class sG extends ty{constructor(t={}){const{anchor:e=null,inset:n=0,insetTop:i=n,insetRight:s=n,insetBottom:c=n,insetLeft:a=n,rx:l,ry:r}=t;super(Du,void 0,t,null==e?nG:iG),this.anchor=ih(e,"anchor",["top","right","bottom","left"]),this.insetTop=Ku(i),this.insetRight=Ku(s),this.insetBottom=Ku(c),this.insetLeft=Ku(a),this.rx=Ku(l),this.ry=Ku(r)}render(t,e,n,i,s){const{marginTop:c,marginRight:a,marginBottom:l,marginLeft:r,width:o,height:g}=i,{anchor:B,insetTop:d,insetRight:Q,insetBottom:I,insetLeft:F,rx:u,ry:h}=this,U=r+F,b=o-a-Q,C=c+d,y=g-l-I;return Qb(B?"svg:line":"svg:rect",s).datum(0).call(eb,this,i,s).call(nb,this).call(jU,this,n).call(cb,this,{}).call("left"===B?t=>t.attr("x1",U).attr("x2",U).attr("y1",C).attr("y2",y):"right"===B?t=>t.attr("x1",b).attr("x2",b).attr("y1",C).attr("y2",y):"top"===B?t=>t.attr("x1",U).attr("x2",b).attr("y1",C).attr("y2",C):"bottom"===B?t=>t.attr("x1",U).attr("x2",b).attr("y1",y).attr("y2",y):t=>t.attr("x",U).attr("y",C).attr("width",b-U).attr("height",y-C).attr("rx",u).attr("ry",h)).node()}}const cG={ariaLabel:"tip",fill:"white",stroke:"currentColor"},aG=new Set(["geometry","href","src","ariaLabel","scales"]);class lG extends ty{constructor(t,e={}){e.tip&&(e={...e,tip:!1}),void 0===e.title&&Sh(t)&&Rh(t)&&(e={...e,title:Ju});const{x:n,y:i,x1:s,x2:c,y1:a,y2:l,anchor:r,monospace:o,fontFamily:g=(o?"ui-monospace, monospace":void 0),fontSize:B,fontStyle:d,fontVariant:Q,fontWeight:I,lineHeight:F=1,lineWidth:u=20,frameAnchor:h,format:U,textAnchor:b="start",textOverflow:C,textPadding:y=8,title:f,pointerSize:G=12,pathFilter:p="drop-shadow(0 3px 4px rgba(0,0,0,0.2))"}=e;super(t,{x:{value:null!=s&&null!=c?null:n,scale:"x",optional:!0},y:{value:null!=a&&null!=l?null:i,scale:"y",optional:!0},x1:{value:s,scale:"x",optional:null==c},y1:{value:a,scale:"y",optional:null==l},x2:{value:c,scale:"x",optional:null==s},y2:{value:l,scale:"y",optional:null==a},title:{value:f,optional:!0}},e,cG),this.anchor=Yh(r,"anchor"),this.previousAnchor=this.anchor??"top-left",this.frameAnchor=kh(h),this.textAnchor=ab(b,"middle"),this.textPadding=+y,this.pointerSize=+G,this.pathFilter=zu(p),this.lineHeight=+F,this.lineWidth=+u,this.textOverflow=Dy(C),this.monospace=!!o,this.fontFamily=zu(g),this.fontSize=Ku(B),this.fontStyle=zu(d),this.fontVariant=zu(Q),this.fontWeight=zu(I);for(const t in cG)t in this.channels&&(this[t]=cG[t]);this.splitLines=jy(this),this.clipLine=$y(this),this.format={...U}}render(t,e,n,i,s){const c=this,{x:a,y:l,fx:r,fy:o}=e,{ownerSVGElement:g,document:B}=s,{anchor:d,monospace:Q,lineHeight:I,lineWidth:F}=this,{textPadding:u,pointerSize:h,pathFilter:U}=this,{marginTop:b,marginLeft:C}=i,{x1:y,y1:f,x2:G,y2:p,x:m=y??G,y:A=f??p}=n,x=r?r(t.fx)-C:0,L=o?o(t.fy)-b:0,[S,R]=Bb(this,i),N=gy(n,S),X=By(n,R),v=Q?Py:_y,Z=v(qy);let E,V;"title"in n?(E=n.channels,V=BG):(E=oG.call(this,n,e),V=dG);const w=Qb("svg:g",s).call(eb,this,i,s).call(Ty,this).call(cb,this,{x:m&&a,y:A&&l}).call((i=>i.selectAll().data(t).enter().append("g").attr("transform",(t=>`translate(${Math.round(N(t))},${Math.round(X(t))})`)).call(nb,this).call((t=>t.append("path").attr("filter",U))).call((i=>i.append("text").each((function(i){const s=Mn(this);this.setAttribute("fill","currentColor"),this.setAttribute("fill-opacity",1),this.setAttribute("stroke","none");const a=V.call(c,i,t,E,e,n);if("string"==typeof a)for(const t of c.splitLines(a))W(s,{value:c.clipLine(t)});else{const t=new Set;for(const e of a){const{label:n=""}=e;n&&t.has(n)||(t.add(n),W(s,e))}}}))))));function W(t,{label:e,value:n,color:i,opacity:s}){e??="",n??="";const c=null!=i||null!=s;let a,l=100*F;const[r]=tf(e,l,v,Z);if(r>=0)e=e.slice(0,r).trimEnd()+qy,a=n.trim(),n="";else{(e||!n&&!c)&&(n=" "+n);const[t]=tf(n,l-v(e),v,Z);t>=0&&(a=(n=n.slice(0,t).trimEnd()+qy).trim())}const o=t.append("tspan").attr("x",0).attr("dy",`${I}em`).text("");e&&o.append("tspan").attr("font-weight","bold").text(e),n&&o.append((()=>B.createTextNode(n))),c&&o.append("tspan").text(" ■").attr("fill",i).attr("fill-opacity",s).style("user-select","none"),a&&o.append("title").text(a)}function H(){const{width:t,height:e}=i.facet??i;w.selectChildren().each((function(n){let{x:i,width:s,height:a}=this.getBBox();s=Math.round(s),a=Math.round(a);let l=d;if(void 0===l){l=c.previousAnchor;const i=N(n)+x,r=X(n)+L,o=i+s+2*u<t,g=i-s-2*u>0,B=r+a+h+2*u+7<e,d=r-a-h-2*u>0,Q=(/-left$/.test(l)?o||!g:o&&!g)?"left":"right",I=(/^top-/.test(l)?B||!d:B&&!d)?"top":"bottom";l=c.previousAnchor=`${I}-${Q}`}const r=this.firstChild,o=this.lastChild;if(r.setAttribute("d",function(t,e,n,i,s){const c=i+2*n,a=s+2*n;switch(t){case"middle":return`M${-c/2},${-a/2}h${c}v${a}h${-c}z`;case"top-left":return`M0,0l${e},${e}h${c-e}v${a}h${-c}z`;case"top":return`M0,0l${e/2},${e/2}h${(c-e)/2}v${a}h${-c}v${-a}h${(c-e)/2}z`;case"top-right":return`M0,0l${-e},${e}h${e-c}v${a}h${c}z`;case"right":return`M0,0l${-e/2},${-e/2}v${e/2-a/2}h${-c}v${a}h${c}v${e/2-a/2}z`;case"bottom-left":return`M0,0l${e},${-e}h${c-e}v${-a}h${-c}z`;case"bottom":return`M0,0l${e/2},${-e/2}h${(c-e)/2}v${-a}h${-c}v${a}h${(c-e)/2}z`;case"bottom-right":return`M0,0l${-e},${-e}h${e-c}v${-a}h${c}z`;case"left":return`M0,0l${e/2},${-e/2}v${e/2-a/2}h${c}v${a}h${-c}v${e/2-a/2}z`}}(l,h,u,s,a)),i)for(const t of o.childNodes)t.setAttribute("x",-i);o.setAttribute("y",+function(t,e,n){return/^top(?:-|$)/.test(t)?.94-n:-.29-e*n}(l,o.childNodes.length,I).toFixed(6)+"em"),o.setAttribute("transform",`translate(${function(t,e,n,i,s){switch(t){case"middle":return[-i/2,s/2];case"top-left":return[n,e+n];case"top":return[-i/2,e/2+n];case"top-right":return[-i-n,e+n];case"right":return[-e/2-i-n,s/2];case"bottom-left":return[n,-e-n];case"bottom":return[-i/2,-e/2-n];case"bottom-right":return[-i-n,-e-n];case"left":return[n+e/2,s/2]}}(l,h,u,s,a)})`)})),w.attr("visibility",null)}return t.length&&(w.attr("visibility","hidden"),g.isConnected?Promise.resolve().then(H):"undefined"!=typeof requestAnimationFrame&&requestAnimationFrame(H)),w.node()}}function rG(t,{x:e,y:n,...i}={}){return void 0===i.frameAnchor&&([e,n]=Qh(e,n)),new lG(t,{...i,x:e,y:n})}function oG({channels:t},e){const n={};let i=this.format;i=gG(i,t,"x"),i=gG(i,t,"y"),this.format=i;for(const e in i){const s=i[e];if(null!==s&&!1!==s)if("fx"===e||"fy"===e)n[e]=!0;else{const i=WU(t,e);i&&(n[e]=i)}}for(const e in t){if(e in n||e in i||aG.has(e))continue;const s=WU(t,e);s&&(n[e]=s)}this.facet&&(e.fx&&!("fx"in i)&&(n.fx=!0),e.fy&&!("fy"in i)&&(n.fy=!0));for(const t in n){const i=this.format[t];if("string"==typeof i){const s=n[t]?.value??e[t]?.domain()??[];this.format[t]=(Xh(s)?cB:da)(i)}else if(void 0===i||!0===i){const n=e[t];this.format[t]=n?.bandwidth?Df(n,n.domain()):YU}}return n}function gG(t,e,n){if(!(n in t))return t;const i=`${n}1`,s=`${n}2`;if(!(!(i in t)&&i in e||!(s in t)&&s in e))return t;const c=Object.entries(t),a=t[n];return c.splice(c.findIndex((([t])=>t===n))+1,0,[i,a],[s,a]),Object.fromEntries(c)}function BG(t,e,{title:n}){return YU(n.value[t],t)}function*dG(t,e,n,i,s){for(const c in n){if("fx"===c||"fy"===c){yield{label:FG(i,n,c),value:this.format[c](e[c],t)};continue}if("x1"===c&&"x2"in n)continue;if("y1"===c&&"y2"in n)continue;const a=n[c];if("x2"===c&&"x1"in n)yield{label:IG(i,n,"x"),value:QG(this.format.x2,n.x1,a,t)};else if("y2"===c&&"y1"in n)yield{label:IG(i,n,"y"),value:QG(this.format.y2,n.y1,a,t)};else{const e=a.value[t],l=a.scale;if(!nu(e)&&null==l)continue;yield{label:FG(i,n,c),value:this.format[c](e,t),color:"color"===l?s[c][t]:null,opacity:"opacity"===l?s[c][t]:null}}}}function QG(t,e,n,i){return n.hint?.length?`${t(n.value[i]-e.value[i],i)}`:`${t(e.value[i],i)}–${t(n.value[i],i)}`}function IG(t,e,n){const i=FG(t,e,`${n}1`,n),s=FG(t,e,`${n}2`,n);return i===s?i:`${i}–${s}`}function FG(t,e,n,i=n){const s=e[n],c=t[s?.scale??n];return String(c?.label??s?.label??i)}function uG(t={}){const{facet:e,style:n,title:i,subtitle:s,caption:c,ariaLabel:a,ariaDescription:l}=t,r=ob(t.className),o=void 0===t.marks?[]:UG(t.marks);o.push(...function(t){const e=[];for(const n of t){let t=n.tip;if(t){!0===t?t={}:"string"==typeof t&&(t={pointer:t});let{pointer:i}=t;i=/^x$/i.test(i)?ry:/^y$/i.test(i)?oy:ly,t=i(xG(n,t)),t.title=null;const s=rG(n.data,t);s.facet=n.facet,s.facetAnchor=n.facetAnchor,e.push(s)}}return e}(o));const g=function(t,e){if(null==t)return;const{x:n,y:i}=t;if(null==n&&null==i)return;const s=ch(t.data);if(null==s)throw new Error("missing facet data");const c={};null!=n&&(c.fx=SU(s,{value:n,scale:"fx"}));null!=i&&(c.fy=SU(s,{value:i,scale:"fy"}));yG(c,e);const a=YC(s,c);return{channels:c,groups:a,data:t.data}}(e,t),B=new Map;for(const e of o){const n=AG(e,g,t);n&&B.set(e,n)}const d=new Map;g&&pG(d,[g],t),pG(d,B,t);const Q=UG(function(t,e,n){let{projection:i,x:s={},y:c={},fx:a={},fy:l={},axis:r,grid:o,facet:g={},facet:{axis:B=r,grid:d}=g,x:{axis:Q=r,grid:I=(null===Q?null:o)}=s,y:{axis:F=r,grid:u=(null===F?null:o)}=c,fx:{axis:h=B,grid:U=(null===h?null:d)}=a,fy:{axis:b=B,grid:C=(null===b?null:d)}=l}=n;(i||!gh(s)&&!XG("x",t))&&(Q=I=null);(i||!gh(c)&&!XG("y",t))&&(F=u=null);e.has("fx")||(h=U=null);e.has("fy")||(b=C=null);void 0===Q&&(Q=!NG(t,"x"));void 0===F&&(F=!NG(t,"y"));void 0===h&&(h=!NG(t,"fx"));void 0===b&&(b=!NG(t,"fy"));!0===Q&&(Q="bottom");!0===F&&(F="left");!0===h&&(h="top"===Q||null===Q?"bottom":"top");!0===b&&(b="right"===F||null===F?"left":"right");const y=[];return SG(y,C,Nf,l),LG(y,b,mf,"right","left",g,l),SG(y,U,vf,a),LG(y,h,xf,"top","bottom",g,a),SG(y,u,Rf,c),LG(y,F,pf,"left","right",n,c),SG(y,I,Xf,s),LG(y,Q,Af,"bottom","top",n,s),y}(o,d,t));for(const e of Q){const n=AG(e,g,t);n&&B.set(e,n)}o.unshift(...Q);let I=DC(d,t);if(void 0!==I){const t=g?qC(I,g):void 0;for(const e of o){if(null===e.facet||"super"===e.facet)continue;const n=B.get(e);void 0!==n&&(n.facetsIndex=null!=e.fx||null!=e.fy?qC(I,n):t)}const e=new Set;for(const{facetsIndex:t}of B.values())t?.forEach(((t,n)=>{t?.length>0&&e.add(n)}));I.forEach(0<e.size&&e.size<I.length?(t,n)=>t.empty=!e.has(n):t=>t.empty=!1);for(const t of o)if("exclude"===t.facet){const e=B.get(t);void 0!==e&&(e.facetsIndex=kC(e.facetsIndex))}}for(const e of $h.keys())gh(t[e])&&"fx"!==e&&"fy"!==e&&d.set(e,[]);const F=new Map;for(const e of o){if(F.has(e))throw new Error("duplicate mark; each mark must be unique");const{facetsIndex:n,channels:i}=B.get(e)??{},{data:s,facets:c,channels:a}=e.initialize(n,i,t);yG(a,t),F.set(e,{data:s,facets:c,channels:a})}const u=bC(pG(d,F,t),t),h=function(t,e,n={}){let i=.5-TU,s=.5+TU,c=.5+TU,a=.5-TU;for(const{marginTop:t,marginRight:n,marginBottom:l,marginLeft:r}of e)t>i&&(i=t),n>s&&(s=n),l>c&&(c=l),r>a&&(a=r);let{margin:l,marginTop:r=(void 0!==l?l:i),marginRight:o=(void 0!==l?l:s),marginBottom:g=(void 0!==l?l:c),marginLeft:B=(void 0!==l?l:a)}=n;r=+r,o=+o,g=+g,B=+B;let{width:d=640,height:Q=WC(t,n,{width:d,marginTopDefault:i,marginRightDefault:s,marginBottomDefault:c,marginLeftDefault:a})+Math.max(0,r-i+g-c)}=n;d=+d,Q=+Q;const I={width:d,height:Q,marginTop:r,marginRight:o,marginBottom:g,marginLeft:B};if(t.fx||t.fy){let{margin:t,marginTop:e=(void 0!==t?t:r),marginRight:i=(void 0!==t?t:o),marginBottom:s=(void 0!==t?t:g),marginLeft:c=(void 0!==t?t:B)}=n.facet??{};e=+e,i=+i,s=+s,c=+c,I.facet={marginTop:e,marginRight:i,marginBottom:s,marginLeft:c}}return I}(u,o,t);!function(t,e){const{x:n,y:i,fx:s,fy:c}=t,a=s||c?fC(e):e;s&&pC(s,a),c&&mC(c,a);const l=s||c?GC(t,e):e;n&&pC(n,l),i&&mC(i,l)}(u,h);const U=CC(u),{fx:b,fy:C}=U,y=b||C?GC(u,h):h,f=b||C?function({fx:t,fy:e},n){const{marginTop:i,marginRight:s,marginBottom:c,marginLeft:a,width:l,height:r}=fC(n),o=t&&vG(t),g=e&&vG(e);return{marginTop:e?g[0]:i,marginRight:t?l-o[1]:s,marginBottom:e?r-g[1]:c,marginLeft:t?o[0]:a,inset:{marginTop:n.marginTop,marginRight:n.marginRight,marginBottom:n.marginBottom,marginLeft:n.marginLeft},width:l,height:r}}(U,h):h,G=db(t),p=G.document,m=Ve("svg").call(p.documentElement);let A=m;G.ownerSVGElement=m,G.className=r,G.projection=hb(t,y),G.filterFacets=(t,e)=>qC(I,{channels:e,groups:YC(t,e)}),G.getMarkState=t=>{const e=F.get(t),n=B.get(t);return{...e,channels:{...e.channels,...n?.channels}}},G.dispatchValue=t=>{A.value!==t&&(A.value=t,A.dispatchEvent(new Event("input",{bubbles:!0})))};const x=new Set;for(const[e,n]of F)if(null!=e.initializer){const i="super"===e.facet?f:y,s=e.initializer(n.data,n.facets,n.channels,U,i,G);if(void 0!==s.data&&(n.data=s.data),void 0!==s.facets&&(n.facets=s.facets),void 0!==s.channels){const{fx:i,fy:c,...a}=s.channels;GG(a),Object.assign(n.channels,a);for(const e of Object.values(a)){const{scale:n}=e;null!=n&&((L=$h.get(n))!==Th&&L!==jh)&&(fG(e,t),x.add(n))}null==i&&null==c||B.set(e,!0)}}var L;if(x.size){const e=new Map;pG(e,F,t,(t=>x.has(t))),pG(d,F,t,(t=>x.has(t)));const n=function(t,e){for(const n in t){const i=t[n],s=e[n];void 0===i.label&&s&&(i.label=s.label)}return t}(bC(e,t),u),{scales:i,...s}=CC(n);Object.assign(u,n),Object.assign(U,s),Object.assign(U.scales,i)}let S,R;void 0!==I&&(S={x:b?.domain(),y:C?.domain()},I=function(t,{x:e,y:n}){return e&&=TC(e),n&&=TC(n),t.filter(e&&n?t=>e.has(t.x)&&n.has(t.y):e?t=>e.has(t.x):t=>n.has(t.y)).sort(e&&n?(t,i)=>e.get(t.x)-e.get(i.x)||n.get(t.y)-n.get(i.y):e?(t,n)=>e.get(t.x)-e.get(n.x):(t,e)=>n.get(t.y)-n.get(e.y))}(I,S),R=function(t,e,{marginTop:n,marginLeft:i}){return t&&e?({x:s,y:c})=>`translate(${t(s)-i},${e(c)-n})`:t?({x:e})=>`translate(${t(e)-i},0)`:({y:t})=>`translate(0,${e(t)-n})`}(b,C,h));for(const[t,e]of F)e.values=t.scale(e.channels,U,G);const{width:N,height:X}=h;Mn(m).attr("class",r).attr("fill","currentColor").attr("font-family","system-ui, sans-serif").attr("font-size",10).attr("text-anchor","middle").attr("width",N).attr("height",X).attr("viewBox",`0 0 ${N} ${X}`).attr("aria-label",a).attr("aria-description",l).call((t=>t.append("style").text(`.${r} {\n display: block;\n background: white;\n height: auto;\n height: intrinsic;\n max-width: 100%;\n}\n.${r} text,\n.${r} tspan {\n white-space: pre;\n}`))).call(gb,n);for(const t of o){const{channels:e,values:n,facets:i}=F.get(t);if(void 0===I||"super"===t.facet){let s=null;if(i&&(s=i[0],s=t.filter(s,e,n),0===s.length))continue;const c=t.render(s,U,n,f,G);if(null==c)continue;m.appendChild(c)}else{let s;for(const c of I){if(!(t.facetAnchor?.(I,S,c)??!c.empty))continue;let a=null;if(i){const s=B.has(t);if(a=i[s?c.i:0],a=t.filter(a,e,n),0===a.length)continue;s||a!==i[0]||(a=hh(a)),a.fx=c.x,a.fy=c.y,a.fi=c.i}const l=t.render(a,U,n,y,G);if(null!=l){(s??=Mn(m).append("g")).append((()=>l)).datum(c);for(const t of["aria-label","aria-description","aria-hidden","transform"])l.hasAttribute(t)&&(s.attr(t,l.getAttribute(t)),l.removeAttribute(t))}}s?.selectChildren().attr("transform",R)}}const v=function(t,e,n){const i=[];for(const[s,c]of $f){const a=n[s];if(a?.legend&&s in t){const n=c(t[s],qf(e,t[s],a),(e=>t[e]));null!=n&&i.push(n)}}return i}(u,G,t),{figure:Z=null!=i||null!=s||null!=c||v.length>0}=t;Z&&(A=p.createElement("figure"),A.className=`${r}-figure`,A.style.maxWidth="initial",null!=i&&A.append(hG(p,i,"h2")),null!=s&&A.append(hG(p,s,"h3")),A.append(...v,m),null!=c&&A.append(function(t,e){const n=t.createElement("figcaption");return n.append(e),n}(p,c))),A.scale=function(t){return e=>{if(!$h.has(e=`${e}`))throw new Error(`unknown scale: ${e}`);return t[e]}}(U.scales),A.legend=function(t,e,n={}){return(i,s)=>{if(!$f.has(i))throw new Error(`unknown legend type: ${i}`);if(i in t)return $f.get(i)(t[i],qf(e,n[i],s),(e=>t[e]))}}(u,G,t);const E=function(){const t=JU;return JU=0,kU=void 0,t}();return E>0&&Mn(m).append("text").attr("x",N).attr("y",20).attr("dy","-1em").attr("text-anchor","end").attr("font-family","initial").text("⚠️").append("title").text(`${E.toLocaleString("en-US")} warning${1===E?"":"s"}. Please check the console.`),A}function hG(t,e,n){if(e.ownerDocument)return e;const i=t.createElement(n);return i.append(e),i}function UG(t){return t.flat(1/0).filter((t=>null!=t)).map(bG)}function bG(t){return"function"==typeof t.render?t:new CG(t)}ty.prototype.plot=function({marks:t=[],...e}={}){return uG({...e,marks:[...t,this]})};class CG extends ty{constructor(t){if("function"!=typeof t)throw new TypeError("invalid mark; missing render function");super(),this.render=t}render(){}}function yG(t,e){for(const n in t)fG(t[n],e);return t}function fG(t,e){const{scale:n,transform:i=!0}=t;if(null==n||!i)return;const{type:s,percent:c,interval:a,transform:l=(c?t=>100*t:ph(a,s))}=e[n]??{};null!=l&&(t.value=ah(t.value,l),t.transform=!1)}function GG(t){for(const e in t)RU(e,t[e])}function pG(t,e,n,i=Tu){for(const{channels:s}of e.values())for(const e in s){const c=s[e],{scale:a}=c;if(null!=a&&i(a))if("projection"===a){if(!pb(n)){const e=void 0===n.x?.domain,i=void 0===n.y?.domain;if(e||i){const[n,s]=mb(c);e&&mG(t,"x",n),i&&mG(t,"y",s)}}}else mG(t,a,c)}return t}function mG(t,e,n){const i=t.get(e);void 0!==i?i.push(n):t.set(e,[n])}function AG(t,e,n){if(null===t.facet||"super"===t.facet)return;const{fx:i,fy:s}=t;if(null!=i||null!=s){const e=ch(t.data??i??s);if(void 0===e)throw new Error(`missing facet data in ${t.ariaLabel}`);if(null===e)return;const c={};return null!=i&&(c.fx=SU(e,{value:i,scale:"fx"})),null!=s&&(c.fy=SU(e,{value:s,scale:"fy"})),yG(c,n),{channels:c,groups:YC(e,c)}}if(void 0===e)return;const{channels:c,groups:a,data:l}=e;if("auto"!==t.facet||t.data===l)return{channels:c,groups:a};l.length>0&&(a.size>1||1===a.size&&c.fx&&c.fy&&[...a][0][1].size>1)&&ch(t.data)?.length===l.length&&MU(`Warning: the ${t.ariaLabel} mark appears to use faceted data, but isn’t faceted. The mark data has the same length as the facet data and the mark facet option is "auto", but the mark data and facet data are distinct. If this mark should be faceted, set the mark facet option to true; otherwise, suppress this warning by setting the mark facet option to false.`)}function xG(t,e={}){return cU({...e,x:null,y:null},((e,n,i,s,c,a)=>a.getMarkState(t)))}function LG(t,e,n,i,s,c,a){if(!e)return;const l=/^\s*both\s*$/i.test(e);a=function(t,e,{line:n=e.line,ticks:i,tickSize:s,tickSpacing:c,tickPadding:a,tickFormat:l,tickRotate:r,fontVariant:o,ariaLabel:g,ariaDescription:B,label:d=e.label,labelAnchor:Q,labelArrow:I=e.labelArrow,labelOffset:F}){return{anchor:t,line:n,ticks:i,tickSize:s,tickSpacing:c,tickPadding:a,tickFormat:l,tickRotate:r,fontVariant:o,ariaLabel:g,ariaDescription:B,label:d,labelAnchor:Q,labelArrow:I,labelOffset:F}}(l?i:e,c,a);const{line:r}=a;n!==pf&&n!==Af||!r||Dh(r)||t.push(function(t){return new sG(t)}(function(t){const{anchor:e,line:n}=t;return{anchor:e,facetAnchor:e+"-empty",stroke:!0===n?void 0:n}}(a))),t.push(n(a)),l&&t.push(n({...a,anchor:s,label:null}))}function SG(t,e,n,i){e&&!Dh(e)&&t.push(n(function(t,{stroke:e=(wh(t)?t:void 0),ticks:n=(RG(t)?t:void 0),tickSpacing:i,ariaLabel:s,ariaDescription:c}){return{stroke:e,ticks:n,tickSpacing:i,ariaLabel:s,ariaDescription:c}}(e,i)))}function RG(t){switch(typeof t){case"number":return!0;case"string":return!wh(t)}return Sh(t)||"function"==typeof t?.range}function NG(t,e){const n=`${e}-axis `;return t.some((t=>t.ariaLabel?.startsWith(n)))}function XG(t,e){for(const n of e)for(const e in n.channels){const{scale:i}=n.channels[e];if(i===t||"projection"===i)return!0}return!1}function vG(t){const e=t.domain();let n=t(e[0]),i=t(e[e.length-1]);return i<n&&([n,i]=[i,n]),[n,i+t.bandwidth()]}const ZG=new Map([["basis",function(t){return new OI(t)}],["basis-closed",function(t){return new _I(t)}],["basis-open",function(t){return new PI(t)}],["bundle",$I],["bump-x",function(t){return new UI(t,!0)}],["bump-y",function(t){return new UI(t,!1)}],["cardinal",eF],["cardinal-closed",iF],["cardinal-open",cF],["catmull-rom",rF],["catmull-rom-closed",gF],["catmull-rom-open",dF],["linear",II],["linear-closed",function(t){return new QF(t)}],["monotone-x",function(t){return new UF(t)}],["monotone-y",function(t){return new bF(t)}],["natural",function(t){return new yF(t)}],["step",function(t){return new GF(t,.5)}],["step-after",function(t){return new GF(t,1)}],["step-before",function(t){return new GF(t,0)}]]);function EG(t=VG,e){return"function"!=typeof t&&"auto"===`${t}`.toLowerCase()?VG:function(t=II,e){if("function"==typeof t)return t;const n=ZG.get(`${t}`.toLowerCase());if(!n)throw new Error(`unknown curve: ${t}`);if(void 0!==e){if("beta"in n)return n.beta(e);if("tension"in n)return n.tension(e);if("alpha"in n)return n.alpha(e)}return n}(t,e)}function VG(t){return II(t)}function wG(t={y:"count"},e={}){[t,e]=function({cumulative:t,domain:e,thresholds:n,interval:i,...s},c){return[s,{cumulative:t,domain:e,thresholds:n,interval:i,...c}]}(t,e);const{x:n,y:i}=e;return function(t,e,n,i,{data:s=yU,filter:c=mU,sort:a,reverse:l,...r}={},o={}){t=HG(t),e=HG(e),r=function(t,e){return function(t,e,n=IU){const i=Object.entries(t);return null!=e.title&&void 0===t.title&&i.push(["title",GU]),null!=e.href&&void 0===t.href&&i.push(["href",fU]),i.filter((([,t])=>void 0!==t)).map((([t,i])=>null===i?function(t){return{name:t,initialize(){},scope(){},reduce(){}}}(t):n(t,i,e)))}(t,e,DG)}(r,o),s=kG(s,Ju),a=null==a?void 0:DG("sort",a,o),c=null==c?void 0:YG("filter",c,o),null!=n&&QU(r,"x","x1","x2")&&(n=null);null!=i&&QU(r,"y","y1","y2")&&(i=null);const[g,B]=Ch(t),[d,Q]=Ch(t),[I,F]=Ch(e),[u,h]=Ch(e),[U,b]=null!=n?[n,"x"]:null!=i?[i,"y"]:[],[C,y]=Ch(U),{x:f,y:G,z:p,fill:m,stroke:A,x1:x,x2:L,y1:S,y2:R,domain:N,cumulative:X,thresholds:v,interval:Z,...E}=o,[V,w]=Ch(p),[W]=eh(m),[H]=eh(A),[D,Y]=Ch(W),[k,J]=Ch(H);return{..."z"in o&&{z:V||p},..."fill"in o&&{fill:D||m},..."stroke"in o&&{stroke:k||A},...sU(E,((n,i,o)=>{const g=Gh(wu(n,U),o?.[b]),d=wu(n,p),I=wu(n,W),u=wu(n,H),C=function(t,e){for(const n in e){const i=e[n];if(void 0!==i&&!t.some((t=>t.name===n)))return i}}(r,{z:d,fill:I,stroke:u}),f=[],G=[],m=g&&y([]),A=d&&w([]),x=I&&Y([]),L=u&&J([]),S=t&&B([]),R=t&&Q([]),N=e&&F([]),X=e&&h([]),v=(Z=t?.(n),E=e?.(n),Z&&E?function*(t){const e=Z.bin(t);for(const[t,[n,i]]of Z.entries()){const s=E.bin(e[t]);for(const[t,[e,c]]of E.entries())yield[s[t],{x1:n,y1:e,x2:i,y2:c}]}}:Z?function*(t){const e=Z.bin(t);for(const[t,[n,i]]of Z.entries())yield[e[t],{x1:n,x2:i}]}:function*(t){const e=E.bin(t);for(const[t,[n,i]]of E.entries())yield[e[t],{y1:n,y2:i}]});var Z,E;let V=0;for(const t of r)t.initialize(n);a&&a.initialize(n),c&&c.initialize(n);for(const t of i){const e=[];for(const e of r)e.scope("facet",t);a&&a.scope("facet",t),c&&c.scope("facet",t);for(const[i,l]of uU(t,C))for(const[t,o]of uU(l,g))for(const[l,B]of v(o))if(!c||c.reduce(l,B)){e.push(V++),G.push(s.reduceIndex(l,n,B)),g&&m.push(t),d&&A.push(C===d?i:d[(l.length>0?l:o)[0]]),I&&x.push(C===I?i:I[(l.length>0?l:o)[0]]),u&&L.push(C===u?i:u[(l.length>0?l:o)[0]]),S&&(S.push(B.x1),R.push(B.x2)),N&&(N.push(B.y1),X.push(B.y2));for(const t of r)t.reduce(l,B);a&&a.reduce(l)}f.push(e)}return function(t,e,n){if(e){const n=e.output.transform(),i=(t,e)=>iu(n[t],n[e]);t.forEach((t=>t.sort(i)))}n&&t.forEach((t=>t.reverse()))}(f,a,l),{data:G,facets:f}})),...!QU(r,"x")&&(g?{x1:g,x2:d,x:fh(g,d)}:{x:f,x1:x,x2:L}),...!QU(r,"y")&&(I?{y1:I,y2:u,y:fh(I,u)}:{y:G,y1:S,y2:R}),...C&&{[b]:C},...Object.fromEntries(r.map((({name:t,output:e})=>[t,e])))}}(function(t,{cumulative:e,domain:n,thresholds:i,interval:s},c){void 0===(t={...Lh(t)}).domain&&(t.domain=n);void 0===t.cumulative&&(t.cumulative=e);void 0===t.thresholds&&(t.thresholds=i);void 0===t.interval&&(t.interval=s);void 0===t.value&&(t.value=c);return t.thresholds=function(t,e,n=MG){if(void 0===t)return void 0===e?n:Ah(e);if("string"==typeof t){switch(t.toLowerCase()){case"freedman-diaconis":return ie;case"scott":return se;case"sturges":return Kt;case"auto":return MG}return Su(t)}return t}(t.thresholds,t.interval),t}(n,e,Ju),null,null,i,t,py(e))}function WG(t={}){return function(t,e,n={}){if(null==n?.interval)return n;const{reduce:i=fU}=n,s={filter:null};return null!=n[e]&&(s[e]=i),null!=n[`${e}1`]&&(s[`${e}1`]=i),null!=n[`${e}2`]&&(s[`${e}2`]=i),t(s,n)}(wG,"y",sy(t,"x"))}function HG(t){if(null==t)return;const{value:e,cumulative:n,domain:i=Gt,thresholds:s}=t,c=t=>{let c,a=wu(t,e);if(Xh(a)||function(t){return function(t){return xh(t)&&"function"==typeof t?.floor&&t.floor()instanceof Date}(t)||Sh(t)&&Xh(t)}(s)){a=ah(a,th,Float64Array);let[t,e]="function"==typeof i?i(a):i,n="function"!=typeof s||xh(s)?s:s(a,t,e);"number"==typeof n&&(n=jg(t,e,n)),xh(n)&&(i===Gt&&(t=n.floor(t),e=n.offset(n.floor(e))),n=n.range(t,n.offset(e))),c=n}else{a=ju(a);let[t,e]="function"==typeof i?i(a):i,n="function"!=typeof s||xh(s)?s:s(a,t,e);if("number"==typeof n)if(i===Gt){let i=Tt(t,e,n);if(isFinite(i))if(i>0){let s=Math.round(t/i),c=Math.round(e/i);s*i<=t||--s,c*i>e||++c;let a=c-s+1;n=new Float64Array(a);for(let t=0;t<a;++t)n[t]=(s+t)*i}else if(i<0){i=-i;let s=Math.round(t*i),c=Math.round(e*i);s/i<=t||--s,c/i>e||++c;let a=c-s+1;n=new Float64Array(a);for(let t=0;t<a;++t)n[t]=(s+t)/i}else n=[t];else n=[t]}else n=Mt(t,e,n);else xh(n)&&(i===Gt&&(t=n.floor(t),e=n.offset(n.floor(e))),n=n.range(t,n.offset(e)));c=n}const l=[];if(1===c.length)l.push([c[0],c[0]]);else for(let t=1;t<c.length;++t)l.push([c[t-1],c[t]]);return l.bin=(n<0?KG:n>0?zG:TG)(l,c,a),l};return c.label=yh(e),c}function DG(t,e,n){return IU(t,e,n,YG)}function YG(t,e,n){return FU(t,e,n,kG)}function kG(t,e){return hU(t,e,JG)}function JG(t){switch(`${t}`.toLowerCase()){case"x":return _G;case"x1":return jG;case"x2":return $G;case"y":return PG;case"y1":return qG;case"y2":return tp}throw new Error(`invalid bin reduce: ${t}`)}function MG(t,e,n){return Math.min(200,se(t,e,n))}function TG(t,e,n){return e=ju(e),i=>{const s=t.map((()=>[]));for(const t of i)s[Ft(e,n[t])-1]?.push(t);return s}}function zG(t,e,n){const i=TG(t,e,n);return t=>{const e=i(t);for(let t=1,n=e.length;t<n;++t){const n=e[t-1],i=e[t];for(const t of n)i.push(t)}return e}}function KG(t,e,n){const i=TG(t,e,n);return t=>{const e=i(t);for(let t=e.length-2;t>=0;--t){const n=e[t+1],i=e[t];for(const t of n)i.push(t)}return e}}function OG(t,e){const n=(+t+ +e)/2;return t instanceof Date?new Date(n):n}const _G={reduceIndex:(t,e,{x1:n,x2:i})=>OG(n,i)},PG={reduceIndex:(t,e,{y1:n,y2:i})=>OG(n,i)},jG={reduceIndex:(t,e,{x1:n})=>n},$G={reduceIndex:(t,e,{x2:n})=>n},qG={reduceIndex:(t,e,{y1:n})=>n},tp={reduceIndex:(t,e,{y2:n})=>n};function ep(t={},e={}){1===arguments.length&&([t,e]=function(t){const{offset:e,order:n,reverse:i,...s}=t;return[{offset:e,order:n,reverse:i},s]}(t));const{x1:n,x:i=n,y:s,...c}=e,[a,l,r,o]=function(t,e=Mu,n,i,{offset:s,order:c,reverse:a},l){if(null===e)throw new Error(`stack requires ${i}`);const r=Ih(l),[o,g]=Ch(t),[B,d]=bh(e),[Q,I]=bh(e);return B.hint=Q.hint=ip,s=function(t){if(null==t)return;if("function"==typeof t)return t;switch(`${t}`.toLowerCase()){case"expand":case"normalize":return cp;case"center":case"silhouette":return ap;case"wiggle":return lp}throw new Error(`unknown offset: ${t}`)}(s),c=function(t,e,n){if(void 0===t&&e===lp)return gp(iu);if(null==t)return;if("string"==typeof t){const e=t.startsWith("-"),i=e?su:iu;switch((e?t.slice(1):t).toLowerCase()){case"value":case n:return function(t){return(e,n,i)=>(e,n)=>t(i[e],i[n])}(i);case"z":return function(t){return(e,n,i,s)=>(e,n)=>t(s[e],s[n])}(i);case"sum":return function(t){return Qp(t,((t,e,n,i)=>Ht(Fh(t),(t=>Be(t,(t=>n[t]))),(t=>i[t]))))}(i);case"appearance":return function(t){return Qp(t,((t,e,n,i)=>Ht(Fh(t),(t=>e[te(t,(t=>n[t]))]),(t=>i[t]))))}(i);case"inside-out":return gp(i)}return Bp(Yu(t))}if("function"==typeof t)return(1===t.length?Bp:dp)(t);if(Array.isArray(t))return i=t,Qp(iu,(()=>i));var i;throw new Error(`invalid order: ${t}`)}(c,s,i),[sU(l,((i,l,o)=>{({data:i,facets:l}=function(t,e){if(1===e.length)return{data:t,facets:e};const n=t.length,i=new Uint8Array(n);let s=0;for(const t of e)for(const e of t)i[e]&&++s,i[e]=1;if(0===s)return{data:t,facets:e};const c=(t=lh(t))[Vu]=new Uint32Array(n+s);e=e.map((t=>lh(t,Uint32Array)));let a=n;i.fill(0);for(const n of e)for(let e=0,s=n.length;e<s;++e){const s=n[e];i[s]?(n[e]=a,t[a]=t[s],c[a]=s,++a):c[s]=s,i[s]=1}return{data:t,facets:e}}(i,l));const B=null==t?void 0:g(Gh(wu(i,t),o?.[n])),Q=wu(i,e,Float64Array),F=wu(i,r),u=c&&c(i,B,Q,F),h=i.length,U=d(new Float64Array(h)),b=I(new Float64Array(h)),C=[];for(const t of l){const e=B?Array.from(Xt(t,(t=>B[t])).values()):[t];if(u)for(const t of e)t.sort(u);for(const t of e){let e=0,n=0;a&&t.reverse();for(const i of t){const t=Q[i];t<0?e=b[i]=(U[i]=e)+t:t>0?n=b[i]=(U[i]=n)+t:b[i]=U[i]=n}}C.push(e)}return s&&s(C,U,b,F),{data:i,facets:l}})),o,B,Q]}(i,s,"x","y",t,c);return{...a,x1:n,x:l,y1:r,y2:o,y:fh(r,o)}}function np({y:t,y1:e,y2:n,...i}={}){return i=sy(i,"x"),void 0===e&&void 0===n?ep({y:t,...i}):([e,n]=function(t,e,n,i=Ju){return void 0===e&&void 0===n?(e=0,n=void 0===t?i:t):void 0===e?e=void 0===t?0:t:void 0===n&&(n=void 0===t?0:t),[e,n]}(t,e,n),{...i,y1:e,y2:n})}const ip={length:!0};function sp(t,e){let n=0,i=0;for(const s of t){const t=e[s];t<n&&(n=t),t>i&&(i=t)}return[n,i]}function cp(t,e,n){for(const i of t)for(const t of i){const[i,s]=sp(t,n);for(const c of t){const t=1/(s-i||1);e[c]=t*(e[c]-i),n[c]=t*(n[c]-i)}}}function ap(t,e,n){for(const i of t){for(const t of i){const[i,s]=sp(t,n);for(const c of t){const t=(s+i)/2;e[c]-=t,n[c]-=t}}rp(i,e,n)}op(t,e,n)}function lp(t,e,n,i){for(const s of t){const t=new mt;let c=0;for(const a of s){let s=-1;const l=a.map((t=>Math.abs(n[t]-e[t]))),r=a.map((c=>{s=i?i[c]:++s;const a=n[c]-e[c],l=t.has(s)?a-t.get(s):0;return t.set(s,a),l})),o=[0,...Ct(r)];for(const t of a)e[t]+=c,n[t]+=c;const g=Be(l);g&&(c-=Be(l,((t,e)=>(r[e]/2+o[e])*t))/g)}rp(s,e,n)}op(t,e,n)}function rp(t,e,n){const i=Pt(t,(t=>Pt(t,(t=>e[t]))));for(const s of t)for(const t of s)e[t]-=i,n[t]-=i}function op(t,e,n){const i=t.length;if(1===i)return;const s=t.map((t=>t.flat())),c=s.map((t=>(Pt(t,(t=>e[t]))+Ot(t,(t=>n[t])))/2)),a=Pt(c);for(let t=0;t<i;t++){const i=a-c[t];for(const c of s[t])e[c]+=i,n[c]+=i}}function gp(t){return Qp(t,((t,e,n,i)=>{const s=Fh(t),c=Ht(s,(t=>e[te(t,(t=>n[t]))]),(t=>i[t])),a=vt(s,(t=>Be(t,(t=>n[t]))),(t=>i[t])),l=[],r=[];let o=0;for(const t of c)o<0?(o+=a.get(t),l.push(t)):(o-=a.get(t),r.push(t));return r.reverse().concat(l)}))}function Bp(t){return e=>{const n=wu(e,t);return(t,e)=>iu(n[t],n[e])}}function dp(t){return e=>(n,i)=>t(e[n],e[i])}function Qp(t,e){return(n,i,s,c)=>{if(!c)throw new Error("missing channel: z");const a=new mt(e(n,i,s,c).map(((t,e)=>[t,e])));return(e,n)=>t(a.get(c[e]),a.get(c[n]))}}const Ip={ariaLabel:"line",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",strokeMiterlimit:1};class Fp extends ty{constructor(t,e={}){const{x:n,y:i,z:s,curve:c,tension:a}=e;super(t,{x:{value:n,scale:"x"},y:{value:i,scale:"y"},z:{value:Ih(e),optional:!0}},e,Ip),this.z=s,this.curve=EG(c,a),Iy(this,e)}filter(t){return t}project(t,e,n){this.curve!==VG&&super.project(t,e,n)}render(t,e,n,i,s){const{x:c,y:a}=n,{curve:l}=this;return Qb("svg:g",s).call(eb,this,i,s).call(cb,this,e).call((e=>e.selectAll().data(qU(t,[c,a],this,n)).enter().append("path").call(nb,this).call($U,this,n).call(fy,this,n,s).attr("d",l===VG&&s.projection?function(t,e,n){const i=mr(t);return e=ju(e),n=ju(n),t=>{let s=[];const c=[s];for(const i of t)-1===i?(s=[],c.push(s)):s.push([e[i],n[i]]);return i({type:"MultiLineString",coordinates:c})}}(s.projection,c,a):hI().curve(l).defined((t=>t>=0)).x((t=>c[t])).y((t=>a[t]))))).node()}}function up(t,{x:e=ku,y:n=Ju,...i}={}){return new Fp(t,WG({...i,x:e,y:n}))}const hp={ariaLabel:"rect"};class Up extends ty{constructor(t,e={}){const{x1:n,y1:i,x2:s,y2:c,inset:a=0,insetTop:l=a,insetRight:r=a,insetBottom:o=a,insetLeft:g=a,rx:B,ry:d}=e;super(t,{x1:{value:n,scale:"x",optional:!0},y1:{value:i,scale:"y",optional:!0},x2:{value:s,scale:"x",optional:!0},y2:{value:c,scale:"y",optional:!0}},e,hp),this.insetTop=Ku(l),this.insetRight=Ku(r),this.insetBottom=Ku(o),this.insetLeft=Ku(g),this.rx=ab(B,"auto"),this.ry=ab(d,"auto")}render(t,e,n,i,s){const{x:c,y:a}=e,{x1:l,y1:r,x2:o,y2:g}=n,{marginTop:B,marginRight:d,marginBottom:Q,marginLeft:I,width:F,height:u}=i,{projection:h}=s,{insetTop:U,insetRight:b,insetBottom:C,insetLeft:y,rx:f,ry:G}=this;return Qb("svg:g",s).call(eb,this,i,s).call(cb,this,{x:l&&o&&c,y:r&&g&&a},0,0).call((e=>e.selectAll().data(t).enter().append("rect").call(nb,this).attr("x",l&&o&&(h||!ZC(c))?t=>Math.min(l[t],o[t])+y:I+y).attr("y",r&&g&&(h||!ZC(a))?t=>Math.min(r[t],g[t])+U:B+U).attr("width",l&&o&&(h||!ZC(c))?t=>Math.max(0,Math.abs(o[t]-l[t])-y-b):F-d-I-b-y).attr("height",r&&g&&(h||!ZC(a))?t=>Math.max(0,Math.abs(r[t]-g[t])-U-C):u-B-Q-U-C).call(sb,"rx",f).call(sb,"ry",G).call(jU,this,n))).node()}}function bp(t,e={}){return function(t){return function({x:t,x1:e,x2:n}){return void 0!==t||void 0!==e||void 0!==n}(t)||rh(t)||void 0!==t.interval}(e)||(e={...e,x:ku,y2:Ju,interval:1}),new Up(t,np(function(t={}){return Ly("x",py,t,!0)}(function(t={}){return rh(t)?t:{...t,y:Ju}}(e))))}function Cp(t,e,n){var i=void 0===e?null:e,s=function(t,e){var n=atob(t);if(e){for(var i=new Uint8Array(n.length),s=0,c=n.length;s<c;++s)i[s]=n.charCodeAt(s);return String.fromCharCode.apply(null,new Uint16Array(i.buffer))}return n}(t,void 0!==n&&n),c=s.indexOf("\n",10)+1,a=s.substring(c)+(i?"//# sourceMappingURL="+i:""),l=new Blob([a],{type:"application/javascript"});return URL.createObjectURL(l)}var yp,fp,Gp,pp,mp=(yp="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewoJJ3VzZSBzdHJpY3QnOwoKCXZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9OwoKCXZhciBkaXN0cmlidXRpb25zID0ge2V4cG9ydHM6IHt9fTsKCgkoZnVuY3Rpb24gKG1vZHVsZSkgewoKCSAgLy8gQSBudW1iZXIgb2YgbG9nIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb25zIChQREYpLiBOYW1pbmcgYW5kIHBhcmFtZXRlcml6YXRpb24KCSAgLy8gc2hvdWxkIG1hdGNoIFIncywgZXhjZXB0IGZvciB0aGF0IGFsbCBmdW5jdGlvbnMgcmVzaWRlIGluIGFuIGxkIG9iamVjdCAoCgkgIC8vIGFzIGluICJsb2cgZGVuc2l0eSIpLCBzbyB0byBnZXQgYSBub3JtYWwgbG9nIGRlbnNpdHkgeW91IHdvdWxkIHdyaXRlCgkgIC8vIGxkLm5vcm0oLi4uKS4KCSAgLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0CgkgIC8vIChodHRwczovL2dpdGh1Yi5jb20vanN0YXQvKSB3aGljaCBpbmNsdWRlcyBQREYgZm9yIG1hbnkgY29tbW9uIHByb2JhYmlsaXR5CgkgIC8vIGRpc3RyaWJ1dGlvbnMuIFdoYXQgSSBoYXZlIGRvbmUgaXMgb25seSB0byBjb252ZXJ0IHRoZXNlIHRvIGxvZyBQREZzLgoKCSAgLyoKCSAgT3JpZ2luYWwgd29yayBDb3B5cmlnaHQgKGMpIDIwMTMgalN0YXQKCSAgTW9kaWZpZWQgd29yayBDb3B5cmlnaHQgKGMpIDIwMTUgUmFzbXVzIELDpcOldGggCgkgIAlQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CgkgIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCgkgIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKCSAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAoJICBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKCSAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCSAgCVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCgkgIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoJICAJVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKCSAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCgkgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQoJICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCgkgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCgkgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KCSAgVEhFIFNPRlRXQVJFLgoJICAJKi8KCgkgIC8vIFRoaXMgYm9pbGVyIHBsYXRlIGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tOgoJICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCgkgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAoJICAvLyBOb2RlLCBhbmQgYnkgdXNpbmcgdGhlIEFzeW5jaHJvbm91cyBNb2R1bGUgRGVmaW5pdGlvbiBzdGFuZGFyZC4KCSAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCgkgIC8vIG9iamVjdCBsZCAuCgkgIChmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewoJICAgIGlmIChtb2R1bGUuZXhwb3J0cykgewoJICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CgkgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKCSAgICAgIC8vIGxpa2UgTm9kZS4KCSAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KQoJICAgICAgcm9vdC5sZCA9IGZhY3RvcnkoKTsKCSAgICB9CgkgIH0pKGNvbW1vbmpzR2xvYmFsLCBmdW5jdGlvbiAoKSB7CgkgICAgLy8gT2JqZWN0IHRvIGhvbGQgdGhlIGZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZC4KCSAgICB2YXIgbGQgPSB7fTsKCgkgICAgLy8vLy8vLy8vLyBIZWxwZXIgZnVuY3Rpb25zIC8vLy8vLy8vLy8KCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCSAgICB2YXIgbGdhbW1hID0gZnVuY3Rpb24gKHgpIHsKCSAgICAgIHZhciBqID0gMDsKCSAgICAgIHZhciBjb2YgPSBbNzYuMTgwMDkxNzI5NDcxNDYsIC04Ni41MDUzMjAzMjk0MTY3NywgMjQuMDE0MDk4MjQwODMwOTEsIC0xLjIzMTczOTU3MjQ1MDE1NSwgMC4xMjA4NjUwOTczODY2MTc5ZS0yLCAtMC41Mzk1MjM5Mzg0OTUzZS01XTsKCSAgICAgIHZhciBzZXIgPSAxLjAwMDAwMDAwMDE5MDAxNTsKCSAgICAgIHZhciB4eCwgeSwgdG1wOwoJICAgICAgdG1wID0gKHkgPSB4eCA9IHgpICsgNS41OwoJICAgICAgdG1wIC09ICh4eCArIDAuNSkgKiBsb2codG1wKTsKCSAgICAgIGZvciAoOyBqIDwgNjsgaisrKSBzZXIgKz0gY29mW2pdIC8gKyt5OwoJICAgICAgcmV0dXJuIGxvZygyLjUwNjYyODI3NDYzMTAwMDUgKiBzZXIgLyB4eCkgLSB0bXA7CgkgICAgfTsKCSAgICBsZC5sZ2FtbWEgPSBsZ2FtbWE7CgkgICAgdmFyIGxmYWN0b3JpYWwgPSBmdW5jdGlvbiAobikgewoJICAgICAgcmV0dXJuIG4gPCAwID8gTmFOIDogbGdhbW1hKG4gKyAxKTsKCSAgICB9OwoJICAgIGxkLmxmYWN0b3JpYWwgPSBsZmFjdG9yaWFsOwoJICAgIHZhciBsY2hvb3NlID0gZnVuY3Rpb24gKG4sIGspIHsKCSAgICAgIHJldHVybiBsZmFjdG9yaWFsKG4pIC0gbGZhY3RvcmlhbChrKSAtIGxmYWN0b3JpYWwobiAtIGspOwoJICAgIH07CgkgICAgbGQubGNob29zZSA9IGxjaG9vc2U7CgkgICAgdmFyIGxiZXRhID0gZnVuY3Rpb24gKGEsIGIpIHsKCSAgICAgIHJldHVybiBsZ2FtbWEoYSkgKyBsZ2FtbWEoYikgLSBsZ2FtbWEoYSArIGIpOwoJICAgIH07CgkgICAgbGQubGJldGEgPSBsYmV0YTsKCSAgICB2YXIgbG9nID0gTWF0aC5sb2c7CgkgICAgdmFyIGV4cCA9IE1hdGguZXhwOwoJICAgIHZhciBhYnMgPSBNYXRoLmFiczsKCSAgICB2YXIgcG93ID0gTWF0aC5wb3c7CgkgICAgdmFyIHNxcnQgPSBNYXRoLnNxcnQ7CgkgICAgdmFyIHBpID0gTWF0aC5QSTsKCgkgICAgLy8vLy8vLy8vLyBDb250aW5vdXMgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIGxkLmJldGEgPSBmdW5jdGlvbiAoeCwgc2hhcGUxLCBzaGFwZTIpIHsKCSAgICAgIGlmICh4ID4gMSB8fCB4IDwgMCkgewoJICAgICAgICByZXR1cm4gLUluZmluaXR5OwoJICAgICAgfQoJICAgICAgaWYgKHNoYXBlMSA9PT0gMSAmJiBzaGFwZTIgPT09IDEpIHsKCSAgICAgICAgcmV0dXJuIDA7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gKHNoYXBlMSAtIDEpICogbG9nKHgpICsgKHNoYXBlMiAtIDEpICogbG9nKDEgLSB4KSAtIGxiZXRhKHNoYXBlMSwgc2hhcGUyKTsKCSAgICAgIH0KCSAgICB9OwoJICAgIGxkLmNhdWNoeSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKCSAgICAgIHJldHVybiBsb2coc2NhbGUpIC0gbG9nKHBvdyh4IC0gbG9jYXRpb24sIDIpICsgcG93KHNjYWxlLCAyKSkgLSBsb2cocGkpOwoJICAgIH07CgkgICAgbGQubm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCkgewoJICAgICAgcmV0dXJuIC0wLjUgKiBsb2coMiAqIHBpKSAtIGxvZyhzZCkgLSBwb3coeCAtIG1lYW4sIDIpIC8gKDIgKiBzZCAqIHNkKTsKCSAgICB9OwoKCSAgICAvLyBBIGJpdmFyaWF0ZSBOb3JtYWwgZGlzdHJpYnV0aW9uIHBhcmFtZXRlcml6ZWQgYnkgYXJyYXlzIG9mIHR3byBtZWFucyBhbmQgU0RzLCBhbmQgCgkgICAgLy8gdGhlIGNvcnJlbGF0aW9uLgoJICAgIGxkLmJpdmFybm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCwgY29ycikgewoJICAgICAgdmFyIHogPSBwb3coeFswXSAtIG1lYW5bMF0sIDIpIC8gcG93KHNkWzBdLCAyKSArIHBvdyh4WzFdIC0gbWVhblsxXSwgMikgLyBwb3coc2RbMV0sIDIpIC0gMiAqIGNvcnIgKiAoeFswXSAtIG1lYW5bMF0pICogKHhbMV0gLSBtZWFuWzFdKSAvIChzZFswXSAqIHNkWzFdKTsKCSAgICAgIHZhciBub3JtYWxpemluZ19mYWN0b3IgPSAtKGxvZygyKSArIGxvZyhwaSkgKyBsb2coc2RbMF0pICsgbG9nKHNkWzFdKSArIDAuNSAqIGxvZygxIC0gcG93KGNvcnIsIDIpKSk7CgkgICAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSkpOwoJICAgICAgcmV0dXJuIGJpdmFyX2xvZ19kZW5zOwoJICAgIH07CgkgICAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKCSAgICAgIHJldHVybiAtYWJzKHggLSBsb2NhdGlvbikgLyBzY2FsZSAtIGxvZygyICogc2NhbGUpOwoJICAgIH07CgkgICAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7CgkgICAgbGQuZ2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHJhdGUpIHsKCSAgICAgIHZhciBzY2FsZSA9IDEgLyByYXRlOwoJICAgICAgaWYgKHggPCAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICBpZiAoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgewoJICAgICAgICByZXR1cm4gLWxvZyhzY2FsZSk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gKHNoYXBlIC0gMSkgKiBsb2coeCkgLSB4IC8gc2NhbGUgLSBsZ2FtbWEoc2hhcGUpIC0gc2hhcGUgKiBsb2coc2NhbGUpOwoJICAgICAgfQoJICAgIH07CgkgICAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHNjYWxlKSB7CgkgICAgICBpZiAoeCA8PSAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gLShzaGFwZSArIDEpICogbG9nKHgpIC0gc2NhbGUgLyB4IC0gbGdhbW1hKHNoYXBlKSArIHNoYXBlICogbG9nKHNjYWxlKTsKCSAgICB9OwoJICAgIGxkLmxub3JtID0gZnVuY3Rpb24gKHgsIG1lYW5sb2csIHNkbG9nKSB7CgkgICAgICBpZiAoeCA8PSAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gLWxvZyh4KSAtIDAuNSAqIGxvZygyICogcGkpIC0gbG9nKHNkbG9nKSAtIHBvdyhsb2coeCkgLSBtZWFubG9nLCAyKSAvICgyICogc2Rsb2cgKiBzZGxvZyk7CgkgICAgfTsKCSAgICBsZC5wYXJldG8gPSBmdW5jdGlvbiAoeCwgc2NhbGUsIHNoYXBlKSB7CgkgICAgICBpZiAoeCA8IHNjYWxlKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbG9nKHNoYXBlKSArIHNoYXBlICogbG9nKHNjYWxlKSAtIChzaGFwZSArIDEpICogbG9nKHgpOwoJICAgIH07CgkgICAgbGQudCA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUsIGRmKSB7CgkgICAgICBkZiA9IGRmID4gMWUxMDAgPyAxZTEwMCA6IGRmOwoJICAgICAgcmV0dXJuIGxnYW1tYSgoZGYgKyAxKSAvIDIpIC0gbGdhbW1hKGRmIC8gMikgLSBsb2coc3FydChwaSAqIGRmKSAqIHNjYWxlKSArIGxvZyhwb3coMSArIDEgLyBkZiAqIHBvdygoeCAtIGxvY2F0aW9uKSAvIHNjYWxlLCAyKSwgLShkZiArIDEpIC8gMikpOwoJICAgIH07CgoJICAgIC8vIFRoaXMgaXMgYSBkaXJlY3QgamF2YXNjcmlwdCB0cmFuc2xhdGlvbiBvZiB0aGUgUiBjb2RlIHVzZWQgdG8gZXZhbHVhdGUKCSAgICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSB3ZWlidWxsIGRpc3RyaWJ1dGlvbjogCgkgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmMKCSAgICBsZC53ZWlidWxsID0gZnVuY3Rpb24gKHgsIHNoYXBlLCBzY2FsZSkgewoJICAgICAgaWYgKHggPCAwKSByZXR1cm4gLUluZmluaXR5OwoJICAgICAgaWYgKHggPT09IDAgJiYgc2hhcGUgPCAxKSByZXR1cm4gSW5maW5pdHk7CgkgICAgICB2YXIgdG1wMSA9IHBvdyh4IC8gc2NhbGUsIHNoYXBlIC0gMSk7CgkgICAgICB2YXIgdG1wMiA9IHRtcDEgKiAoeCAvIHNjYWxlKTsKCSAgICAgIHJldHVybiAtdG1wMiArIGxvZyhzaGFwZSAqIHRtcDEgLyBzY2FsZSk7CgkgICAgfTsKCgkgICAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZQoJICAgIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIGxvZ2lzdGljIGRpc3RyaWJ1dGlvbjogCgkgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2Rsb2dpcy5jCgkgICAgbGQubG9naXMgPSBmdW5jdGlvbiAoeCwgbG9jYXRpb24sIHNjYWxlKSB7CgkgICAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpOwoJICAgICAgdmFyIGUgPSBleHAoLXgpOwoJICAgICAgdmFyIGYgPSAxLjAgKyBlOwoJICAgICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7CgkgICAgfTsKCSAgICBsZC5kaXJpY2hsZXQgPSBmdW5jdGlvbiAoeCwgYWxwaGEpIHsKCSAgICAgIHZhciBzdW1fYWxwaGEgPSAwOwoJICAgICAgdmFyIHN1bV9sZ2FtbWFfYWxwaGEgPSAwOwoJICAgICAgdmFyIHN1bV9hbHBoYV9zdWJfMV9sb2dfeCA9IDA7CgkgICAgICB2YXIgbiA9IGFscGhhLmxlbmd0aDsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkgICAgICAgIHN1bV9hbHBoYSArPSBhbHBoYVtpXTsKCSAgICAgICAgc3VtX2xnYW1tYV9hbHBoYSArPSBsZ2FtbWEoYWxwaGFbaV0pOwoJICAgICAgICBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggKz0gKGFscGhhW2ldIC0gMSkgKiBsb2coeFtpXSk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbGdhbW1hKHN1bV9hbHBoYSkgLSBzdW1fbGdhbW1hX2FscGhhICsgc3VtX2FscGhhX3N1Yl8xX2xvZ194OwoJICAgIH07CgkgICAgbGQuZXhwID0gZnVuY3Rpb24gKHgsIHJhdGUpIHsKCSAgICAgIHJldHVybiB4IDwgMCA/IC1JbmZpbml0eSA6IGxvZyhyYXRlKSAtIHJhdGUgKiB4OwoJICAgIH07CgkgICAgbGQudW5pZiA9IGZ1bmN0aW9uICh4LCBtaW4sIG1heCkgewoJICAgICAgcmV0dXJuIHggPCBtaW4gfHwgeCA+IG1heCA/IC1JbmZpbml0eSA6IGxvZygxIC8gKG1heCAtIG1pbikpOwoJICAgIH07CgoJICAgIC8vLy8vLy8vLy8gRGlzY3JldGUgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgbGQuYmVybiA9IGZ1bmN0aW9uICh4LCBwcm9iKSB7CgkgICAgICByZXR1cm4gISh4ID09PSAwIHx8IHggPT09IDEpID8gLUluZmluaXR5IDogbG9nKHggKiBwcm9iICsgKDEgLSB4KSAqICgxIC0gcHJvYikpOwoJICAgIH07CgkgICAgbGQuY2F0ID0gZnVuY3Rpb24gKHgsIHByb2JzKSB7CgkgICAgICBpZiAoeCA8IDEgfHwgeCA+IHByb2JzLmxlbmd0aCkgewoJICAgICAgICByZXR1cm4gLUluZmluaXR5OwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIGxvZyhwcm9ic1t4IC0gMV0pOwoJICAgICAgfQoJICAgIH07CgkgICAgbGQuYmlub20gPSBmdW5jdGlvbiAoeCwgc2l6ZSwgcHJvYikgewoJICAgICAgaWYgKHggPiBzaXplIHx8IHggPCAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICBpZiAocHJvYiA9PT0gMCB8fCBwcm9iID09PSAxKSB7CgkgICAgICAgIHJldHVybiBzaXplICogcHJvYiA9PT0geCA/IDAgOiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTsKCSAgICB9OwoJICAgIGxkLm5iaW5vbSA9IGZ1bmN0aW9uICh4LCBzaXplLCBwcm9iKSB7CgkgICAgICBpZiAoeCA8IDApIHsKCSAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKCSAgICAgIH0KCSAgICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpOwoJICAgIH07CgkgICAgbGQuaHlwZXIgPSBmdW5jdGlvbiAoeCwgbSwgbiwgaykgewoJICAgICAgaWYgKHggPCAwIHx8IHggPiBrKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2UobiwgayAtIHgpIC0gbGNob29zZShtICsgbiwgayk7CgkgICAgICB9CgkgICAgfTsKCSAgICBsZC5wb2lzID0gZnVuY3Rpb24gKHgsIGxhbWJkYSkgewoJICAgICAgcmV0dXJuIHggPCAwID8gLUluZmluaXR5IDogbG9nKGxhbWJkYSkgKiB4IC0gbGFtYmRhIC0gbGZhY3RvcmlhbCh4KTsKCSAgICB9OwoJICAgIHJldHVybiBsZDsKCSAgfSk7Cgl9KShkaXN0cmlidXRpb25zKTsKCXZhciBkaXN0cmlidXRpb25zRXhwb3J0cyA9IGRpc3RyaWJ1dGlvbnMuZXhwb3J0czsKCgl2YXIgbWNtYyA9IHtleHBvcnRzOiB7fX07CgoJKGZ1bmN0aW9uIChtb2R1bGUpIHsKCgkgIC8vIFRoaXMgYm9pbGVyIHBsYXRlIGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tOgoJICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCgkgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAoJICAvLyBOb2RlLCBhbmQgYnkgdXNpbmcgdGhlIEFzeW5jaHJvbm91cyBNb2R1bGUgRGVmaW5pdGlvbiBzdGFuZGFyZC4KCSAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCgkgIC8vIG9iamVjdCBtY21jIC4KCSAgKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7CgkgICAgaWYgKG1vZHVsZS5leHBvcnRzKSB7CgkgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXQKCSAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLAoJICAgICAgLy8gbGlrZSBOb2RlLgoJICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpCgkgICAgICByb290Lm1jbWMgPSBmYWN0b3J5KCk7CgkgICAgfQoJICB9KShjb21tb25qc0dsb2JhbCwgZnVuY3Rpb24gKCkgewoJICAgIC8vLyBUaGUgYWN0dWFsIG1vZHVsZSBjb2RlIHN0YXJ0cyBoZXJlIC8vLwoJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgCgoJICAgIC8vLy8vLy8vLy8gSGVscGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgLyoqIFJldHVybnMgYSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqLwoJICAgIHZhciBydW5pZiA9IGZ1bmN0aW9uIChtaW4sIG1heCkgewoJICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSArIG1pbjsKCSAgICB9OwoKCSAgICAvKiogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIGFuZCBtYXggKi8KCSAgICB2YXIgcnVuaWZfZGlzY3JldGUgPSBmdW5jdGlvbiAobWluLCBtYXgpIHsKCSAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluOwoJICAgIH07CgoJICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkCgkgICAgICogIGJ5IG1lYW4gYW5kIHNkLiAKCSAgICAgKiAgQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qc3RhdC9qc3RhdC9ibG9iL21hc3Rlci9zcmMvc3BlY2lhbC5qcyAqLwoJICAgIHZhciBybm9ybSA9IGZ1bmN0aW9uIChtZWFuLCBzZCkgewoJICAgICAgdmFyIHUsIHYsIHgsIHksIHE7CgkgICAgICBkbyB7CgkgICAgICAgIHUgPSBNYXRoLnJhbmRvbSgpOwoJICAgICAgICB2ID0gMS43MTU2ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpOwoJICAgICAgICB4ID0gdSAtIDAuNDQ5ODcxOwoJICAgICAgICB5ID0gTWF0aC5hYnModikgKyAwLjM4NjU5NTsKCSAgICAgICAgcSA9IHggKiB4ICsgeSAqICgwLjE5NjAwICogeSAtIDAuMjU0NzIgKiB4KTsKCSAgICAgIH0gd2hpbGUgKHEgPiAwLjI3NTk3ICYmIChxID4gMC4yNzg0NiB8fCB2ICogdiA+IC00ICogTWF0aC5sb2codSkgKiB1ICogdSkpOwoJICAgICAgcmV0dXJuIHYgLyB1ICogc2QgKyBtZWFuOwoJICAgIH07CgoJICAgIC8qKiBSZXR1cm5zIGEgZGVlcCBjbG9uZSBvZiBzcmMsIHNvcnQgb2YuLi4gSXQgb25seSBjb3BpZXMgYSBsaW1pdGVkCgkgICAgICogbnVtYmVyIG9mIHR5cGVzIGFuZCwgZm9yIGV4YW1wbGUsIGZ1bmN0aW9uIGFyZSBub3QgY29waWVkLiAKCSAgICAgKiBGcm9tIGh0dHA6Ly9kYXZpZHdhbHNoLm5hbWUvamF2YXNjcmlwdC1jbG9uZQoJICAgICAqLwoJICAgIHZhciBkZWVwX2Nsb25lID0gZnVuY3Rpb24gKHNyYykgewoJICAgICAgZnVuY3Rpb24gbWl4aW4oZGVzdCwgc291cmNlLCBjb3B5RnVuYykgewoJICAgICAgICB2YXIgbmFtZSwKCSAgICAgICAgICBzLAoJICAgICAgICAgIGVtcHR5ID0ge307CgkgICAgICAgIGZvciAobmFtZSBpbiBzb3VyY2UpIHsKCSAgICAgICAgICAvLyB0aGUgKCEobmFtZSBpbiBlbXB0eSkgfHwgZW1wdHlbbmFtZV0gIT09IHMpIGNvbmRpdGlvbiBhdm9pZHMgY29weWluZyBwcm9wZXJ0aWVzIGluICJzb3VyY2UiCgkgICAgICAgICAgLy8gaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZS4JIEZvciBleGFtcGxlLCBpZiBkZXN0IGhhcyBhIGN1c3RvbSB0b1N0cmluZygpIG1ldGhvZCwKCSAgICAgICAgICAvLyBkb24ndCBvdmVyd3JpdGUgaXQgd2l0aCB0aGUgdG9TdHJpbmcoKSBtZXRob2QgdGhhdCBzb3VyY2UgaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZQoJICAgICAgICAgIHMgPSBzb3VyY2VbbmFtZV07CgkgICAgICAgICAgaWYgKCEobmFtZSBpbiBkZXN0KSB8fCBkZXN0W25hbWVdICE9PSBzICYmICghKG5hbWUgaW4gZW1wdHkpIHx8IGVtcHR5W25hbWVdICE9PSBzKSkgewoJICAgICAgICAgICAgZGVzdFtuYW1lXSA9IGNvcHlGdW5jID8gY29weUZ1bmMocykgOiBzOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gZGVzdDsKCSAgICAgIH0KCSAgICAgIGlmICghc3JjIHx8IHR5cGVvZiBzcmMgIT0gIm9iamVjdCIgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHNyYykgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKCSAgICAgICAgLy8gbnVsbCwgdW5kZWZpbmVkLCBhbnkgbm9uLW9iamVjdCwgb3IgZnVuY3Rpb24KCSAgICAgICAgcmV0dXJuIHNyYzsgLy8gYW55dGhpbmcKCSAgICAgIH0KCSAgICAgIGlmIChzcmMubm9kZVR5cGUgJiYgImNsb25lTm9kZSIgaW4gc3JjKSB7CgkgICAgICAgIC8vIERPTSBOb2RlCgkgICAgICAgIHJldHVybiBzcmMuY2xvbmVOb2RlKHRydWUpOyAvLyBOb2RlCgkgICAgICB9CgkgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgRGF0ZSkgewoJICAgICAgICAvLyBEYXRlCgkgICAgICAgIHJldHVybiBuZXcgRGF0ZShzcmMuZ2V0VGltZSgpKTsgLy8gRGF0ZQoJICAgICAgfQoJICAgICAgaWYgKHNyYyBpbnN0YW5jZW9mIFJlZ0V4cCkgewoJICAgICAgICAvLyBSZWdFeHAKCSAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoc3JjKTsgLy8gUmVnRXhwCgkgICAgICB9CgkgICAgICB2YXIgciwgaSwgbDsKCSAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBBcnJheSkgewoJICAgICAgICAvLyBhcnJheQoJICAgICAgICByID0gW107CgkgICAgICAgIGZvciAoaSA9IDAsIGwgPSBzcmMubGVuZ3RoOyBpIDwgbDsgKytpKSB7CgkgICAgICAgICAgaWYgKGkgaW4gc3JjKSB7CgkgICAgICAgICAgICByLnB1c2goZGVlcF9jbG9uZShzcmNbaV0pKTsKCSAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIC8vIGdlbmVyaWMgb2JqZWN0cwoJICAgICAgICByID0gc3JjLmNvbnN0cnVjdG9yID8gbmV3IHNyYy5jb25zdHJ1Y3RvcigpIDoge307CgkgICAgICB9CgkgICAgICByZXR1cm4gbWl4aW4ociwgc3JjLCBkZWVwX2Nsb25lKTsKCSAgICB9OwoKCSAgICAvKiogU3BlY2lhbGl6ZWQgY2xvbmUgZnVuY3Rpb24gdGhhdCBvbmx5IGNsb25lcyBzY2FsYXJzIGFuZCBuZXN0ZWQgYXJyYXlzIHdoZXJlCgkgICAgICogZWFjaCBhcnJheSBlaXRoZXIgY29uc2lzdHMgb2YgYWxsIGFycmF5cyBvciBhbGwgbnVtYmVycy4gVGhpcyBmdW5jdGlvbgoJICAgICAqIGlzIG1lYW50IGFzIGEgZmFzdCB3YXkgb2YgY2xvbmluZyBwYXJhbWV0ZXIgZHJhd3Mgd2l0aGluIHRoZSBtY21jIHNhbXBsaW5nCgkgICAgICogbG9vcC4KCSAgICAgKi8KCSAgICB2YXIgY2xvbmVfcGFyYW1fZHJhdyA9IGZ1bmN0aW9uICh4KSB7CgkgICAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkgewoJICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh4WzBdKSkgewoJICAgICAgICAgIC8vIHggaXMgYW4gYXJyYXkgb2YgYXJyYXlzIHNvIHdlIG5lZWQgdG8gY2xvbmUgaXQgcmVjdXJzaXZlbHkKCSAgICAgICAgICB2YXIgeF9jb3B5ID0gW107CgkgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgIHhfY29weS5wdXNoKGNsb25lX3BhcmFtX2RyYXcoeFtpXSkpOwoJICAgICAgICAgIH0KCSAgICAgICAgICByZXR1cm4geF9jb3B5OwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgYXJyYXlzIG9mIHNjYWxhcnMKCSAgICAgICAgICByZXR1cm4geC5zbGljZSgwKTsKCSAgICAgICAgfQoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXIKCSAgICAgICAgcmV0dXJuIHg7CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBvYmplY3QgaXMgYSBudW1iZXIuCgkgICAgICovCgkgICAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uIChvYmplY3QpIHsKCSAgICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICJudW1iZXIiIHx8IHR5cGVvZiBvYmplY3QgPT0gIm9iamVjdCIgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09PSBOdW1iZXI7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSAocG9zc2libHkgbXVsdGlkaW1lbnNpb25hbC9uZXN0ZWQpIGFycmF5LgoJICAgICAqIEBwYXJhbSBkaW0gLSBBbiBhcnJheSBnaXZpbmcgdGhlIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkuIEZvciBleGFtcGxlLAoJICAgICAqICAgWzVdIHdvdWxkIHlpZWxkIGEgNSBlbGVtZW50IGFycmF5LCBhbmQgWzMsM10gd291bGQgeWllbGQgYSAzIGJ5IDMgbWF0cml4LgoJICAgICAqIEBwYXJhbSBpbml0IC0gQSB2YWx1ZSBvciBhIGZ1bmN0aW9uIHVzZWQgdG8gZmlsbCBpbiB0aGUgZWFjaCBlbGVtZW50IGluCgkgICAgICogICB0aGUgYXJyYXkuIElmIGl0IGlzIGEgZnVuY3Rpb24gaXQgc2hvdWxkIHRha2Ugbm8gYXJndW1lbnRzLCBpdCB3aWxsIGJlIAoJICAgICAqICAgZXZhbHVhdGVkIG9uY2UgZm9yIGVhY2ggZWxlbWVudCwgYW5kIGl0J3MgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZCB0bwoJICAgICAqICAgZmlsbCBpbiBlYWNoIGVsZW1lbnQuCgkgICAgICogQGV4YW1wbGUgCgkgICAgICogLy8gVGhlIGZvbGxvd2luZyB3b3VsZCByZXR1cm4gW1sxLDFdLFsxLDFdLFsxLDFdXQoJICAgICAqIGNyZWF0ZV9hcnJheShbMiwzXSwgMSkKCSAgICAgKi8KCSAgICB2YXIgY3JlYXRlX2FycmF5ID0gZnVuY3Rpb24gKGRpbSwgaW5pdCkgewoJICAgICAgdmFyIGFyciA9IG5ldyBBcnJheShkaW1bMF0pOwoJICAgICAgdmFyIGk7CgkgICAgICBpZiAoZGltLmxlbmd0aCA9PSAxKSB7CgkgICAgICAgIC8vIEZpbGwgaXQgdXAgd2l0aCBpbml0CgkgICAgICAgIGlmICh0eXBlb2YgaW5pdCA9PT0gImZ1bmN0aW9uIikgewoJICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewoJICAgICAgICAgICAgYXJyW2ldID0gaW5pdCgpOwoJICAgICAgICAgIH0KCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIGFycltpXSA9IGluaXQ7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgaWYgKGRpbS5sZW5ndGggPiAxKSB7CgkgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewoJICAgICAgICAgIGFycltpXSA9IGNyZWF0ZV9hcnJheShkaW0uc2xpY2UoMSksIGluaXQpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aHJvdyAiY3JlYXRlX2FycmF5IGNhbid0IGNyZWF0ZSBhIGRpbWVuc2lvbmxlc3MgYXJyYXkiOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGFycjsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciAKCSAgICAgKiBleGFtcGxlLCBhcnJheV9kaW0oIFtbMSwgMl0sIFsxLCAyXV0gKSBzaG91bGQgcmV0dXJuIFsyLCAyXQoJICAgICAqIEFzc3VtZXMgdGhhdCBhbGwgYXJyYXlzIGluc2lkZSBhbm90aGVyIGFycmF5IGFyZSBvZiB0aGUgc2FtZSBsZW5ndGguCgkgICAgICogQGV4YW1wbGUKCSAgICAgKiAvLyBTaG91bGQgcmV0dXJuIFs0LCAyLCAxXQoJICAgICAqIGFycmF5X2RpbShjcmVhdGVfYXJyYXkoWzQsIDIsIDFdLCAwKSkKCSAgICAgKi8KCSAgICB2YXIgYXJyYXlfZGltID0gZnVuY3Rpb24gKGEpIHsKCSAgICAgIGlmIChBcnJheS5pc0FycmF5KGFbMF0pKSB7CgkgICAgICAgIHJldHVybiBbYS5sZW5ndGhdLmNvbmNhdChhcnJheV9kaW0oYVswXSkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIFthLmxlbmd0aF07CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogQ2hlY2tzIGlmIHR3byBhcnJheXMgYXJlIGVxdWFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cwoJICAgICAqIGFzIGp1ZGdlZCBieSB0aGUgIj09IiBvcGVyYXRvci4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgoJICAgICAqIEFkYXB0ZWQgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNDg1Mzk3NC8xMDAxODQ4CgkgICAgICovCgkgICAgdmFyIGFycmF5X2VxdWFsID0gZnVuY3Rpb24gKGExLCBhMikgewoJICAgICAgaWYgKGExLmxlbmd0aCAhPSBhMi5sZW5ndGgpIHJldHVybiBmYWxzZTsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBuZXN0ZWQgYXJyYXlzCgkgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGExW2ldKSAmJiBBcnJheS5pc0FycmF5KGEyW2ldKSkgewoJICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5cwoJICAgICAgICAgIGlmICghYXJyYXlfZXF1YWwoYTFbaV0sIGEyW2ldKSkgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9IGVsc2UgaWYgKGExW2ldICE9IGEyW2ldKSB7CgkgICAgICAgICAgLy8gV2FybmluZyAtIHR3byBkaWZmZXJlbnQgb2JqZWN0IGluc3RhbmNlcyB3aWxsIG5ldmVyIGJlIGVxdWFsOiB7eDoyMH0gIT0ge3g6MjB9CgkgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICByZXR1cm4gdHJ1ZTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBUcmF2ZXJzZXMgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYSBhbmQgYXBwbGllcyBmdW4gdG8gYWxsICJsZWFmIG5vZGVzIiwgCgkgICAgICogdGhhdCBpcywgdmFsdWVzIHRoYXQgYXJlIG5vdCBhcnJheXMuIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2l6ZSBhcwoJICAgICAqIGEuCgkgICAgICovCgkgICAgdmFyIG5lc3RlZF9hcnJheV9hcHBseSA9IGZ1bmN0aW9uIChhLCBmdW4pIHsKCSAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CgkgICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoYS5sZW5ndGgpOwoJICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gcmVzdWx0OwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIGZ1bihhKTsKCSAgICAgIH0KCSAgICB9OwoKCSAgICAvKiogUmFuZG9taXppbmcgdGhlIGFycmF5IGVsZW1lbnQgb3JkZXIgaW4tcGxhY2UuIFVzaW5nIER1cnN0ZW5mZWxkCgkgICAgICogc2h1ZmZsZSBhbGdvcml0aG0uIEFkYXB0ZWQgZnJvbSBoZXJlOiAKCSAgICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4CgkgICAgICovCgkgICAgZnVuY3Rpb24gc2h1ZmZsZV9hcnJheShhcnJheSkgewoJICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHsKCSAgICAgICAgdmFyIGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTsKCSAgICAgICAgdmFyIHRlbXAgPSBhcnJheVtpXTsKCSAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTsKCSAgICAgICAgYXJyYXlbal0gPSB0ZW1wOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGFycmF5OwoJICAgIH0KCgkgICAgLyoqCgkgICAgICogRG9lcyB0aGUgc2FtZSB0aGluZyBhcyBuZXN0ZWRfYXJyYXlfYXBwbHksIHRoYXQgaXMsIHRyYXZlcnNlcyBhIHBvc3NpYmx5CgkgICAgICogbmVzdGVkIGFycmF5IGEgYW5kIGFwcGxpZXMgZnVuIHRvIGFsbCAibGVhZiBub2RlcyIgYW5kIHJldHVybnMgYW4gYXJyYXkgCgkgICAgICogb2YgdGhlIHNhbWUgc2l6ZSBhcyBhLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG5lc3RlZF9hcnJheV9yYW5kb21fYXBwbHkKCSAgICAgKiBicmFuY2hlcyByYW5kb21seS4KCSAgICAgKi8KCSAgICB2YXIgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSA9IGZ1bmN0aW9uIChhLCBmdW4pIHsKCSAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CgkgICAgICAgIHZhciBsZW4gPSBhLmxlbmd0aDsKCSAgICAgICAgdmFyIGk7CgkgICAgICAgIHZhciBhcnJheV9pcyA9IFtdOwoJICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgICAgICBhcnJheV9pc1tpXSA9IGk7CgkgICAgICAgIH0KCSAgICAgICAgc2h1ZmZsZV9hcnJheShhcnJheV9pcyk7CgkgICAgICAgIHZhciByZXN1bHQgPSBbXTsKCSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgICAgdmFyIGFycmF5X2kgPSBhcnJheV9pc1tpXTsKCSAgICAgICAgICByZXN1bHRbYXJyYXlfaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVthcnJheV9pXSwgZnVuKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gcmVzdWx0OwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIGZ1bihhKTsKCSAgICAgIH0KCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBBbGxvd3MgYSBwcmV0dHkgd2F5IG9mIHNldHRpbmcgZGVmYXVsdCBvcHRpb25zIHdoZXJlIHRoZSBkZWZ1bHRzIGNhbiBiZQoJICAgICAqIG92ZXJyaWRkZW4gYnkgYW4gb3B0aW9ucyBvYmplY3QuCgkgICAgICogIEBwYXJhbSBvcHRpb25fbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gYXMgYSBzdHJpbmcKCSAgICAgKiAgQHBhcmFtIG15X29wdGlvbnMgLSBhbiBvcHRpb24gb2JqZWN0IHRoYXQgY291bGQgaGF2ZSBvcHRpb25fbmFtZSAKCSAgICAgKiAgICBhcyBhIG1lbWJlci4KCSAgICAgKiBAcGFyYW0gZGVmYXVsX3ZhbHVlIC0gZGVmdWx0IHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgaWYgb3B0aW9uX25hbWUgCgkgICAgICogICBpcyBub3QgZGVmaW5lZCBpbiBteV9vcHRpb25zLgoJICAgICAqIEBleGFtcGxlCgkgICAgICogdmFyIG15X29wdGlvbnMgPSB7cGk6IDMuMTQxNTl9CgkgICAgICogdmFyIHBpID0gZ2V0X29wdGlvbigicGkiLCBteV9vcHRpb25zLCAzLjE0KQoJICAgICAqLwoJICAgIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuCgkgICAgLy8gYnkgYW4gb3B0aW9ucyBvYmplY3QuIEZvciBleGFtcGxlOgoJICAgIC8vIHZhciBwaSA9IGdldF9vcHRpb24oInBpIiwgbXlfb3B0aW9ucywgMy4xNCkKCSAgICB2YXIgZ2V0X29wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25fbmFtZSwgb3B0aW9ucywgZGVmYXVsX3ZhbHVlKSB7CgkgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgICAgIHJldHVybiBvcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbl9uYW1lKSAmJiBvcHRpb25zW29wdGlvbl9uYW1lXSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSBudWxsID8gb3B0aW9uc1tvcHRpb25fbmFtZV0gOiBkZWZhdWxfdmFsdWU7CgkgICAgfTsKCgkgICAgLyoqIFZlcnNpb24gb2YgZ2V0X29wdGlvbiB3aGVyZSB0aGUgb3B0aW9uIHNob3VsZCBiZSBhIG9uZSBvciBtdWx0aS1kaW1lbnNpb25hbAoJICAgICAqIGFycmF5IGFuZCB3aGVyZSB0aGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBlaXRoZXIgYnkgYSBzY2FsYXIgb3IgYnkgYW4gYXJyYXkuCgkgICAgICogSWYgaXQncyBhIHNjYWxhciB0aGUgdGhhdCBzY2FsYXIgaXMgdXNlZCB0byBpbml0aWFsaXplIGFuIGFycmF5IHdpdGggCgkgICAgICogZGltIGRpbWVuc2lvbnMuCgkgICAgICogCgkgICAgICovCgkgICAgdmFyIGdldF9tdWx0aWRpbV9vcHRpb24gPSBmdW5jdGlvbiAob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRpbSwgZGVmYXVsX3ZhbHVlKSB7CgkgICAgICB2YXIgdmFsdWUgPSBnZXRfb3B0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkZWZhdWxfdmFsdWUpOwoJICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgewoJICAgICAgICB2YWx1ZSA9IGNyZWF0ZV9hcnJheShkaW0sIHZhbHVlKTsKCSAgICAgIH0KCSAgICAgIGlmICghYXJyYXlfZXF1YWwoYXJyYXlfZGltKHZhbHVlKSwgZGltKSkgewoJICAgICAgICB0aHJvdyAiVGhlIG9wdGlvbiAiICsgb3B0aW9uX25hbWUgKyAiIGlzIG9mIGRpbWVuc2lvbiBbIiArIGFycmF5X2RpbSh2YWx1ZSkgKyAiXSBidXQgc2hvdWxkIGJlIFsiICsgZGltICsgIl0uIjsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9OwoKCSAgICAvLy8vLy8vLy8vIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcGFyYW1ldGVyIG9iamVjdHMgLy8vLy8vLy8vLwoJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIC8qKgoJICAgICAqIFJldHVybnMgYSBmaXhlZCAoc2FtZSBldmVyeSB0aW1lKSBudW1iZXIgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIGluaXRpYWxpemUKCSAgICAgKiBhIHBhcmFtZXRlciBvZiBhIGNlcnRhaW4gdHlwZSwgcG9zc2libHkgd2l0aCBsb3dlciBhbmQgdXBwZXIgYm91bmRzLgoJICAgICAqIFRoZSBwb3NzaWxlIHR5cGVzIGFyZSAicmVhbCIsICJpbnQiLCBhbmQgImJpbmFyeSIuCgkgICAgICovCgkgICAgdmFyIHBhcmFtX2luaXRfZml4ZWQgPSBmdW5jdGlvbiAodHlwZSwgbG93ZXIsIHVwcGVyKSB7CgkgICAgICBpZiAobG93ZXIgPiB1cHBlcikgewoJICAgICAgICB0aHJvdyAiQ2FuIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciB3aGVyZSBsb3dlciBib3VuZCA+IHVwcGVyIGJvdW5kIjsKCSAgICAgIH0KCSAgICAgIGlmICh0eXBlID09PSAicmVhbCIpIHsKCSAgICAgICAgaWYgKGxvd2VyID09PSAtSW5maW5pdHkgJiYgdXBwZXIgPT09IEluZmluaXR5KSB7CgkgICAgICAgICAgcmV0dXJuIDAuNTsKCSAgICAgICAgfSBlbHNlIGlmIChsb3dlciA9PT0gLUluZmluaXR5KSB7CgkgICAgICAgICAgcmV0dXJuIHVwcGVyIC0gMC41OwoJICAgICAgICB9IGVsc2UgaWYgKHVwcGVyID09PSBJbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiBsb3dlciArIDAuNTsKCSAgICAgICAgfSBlbHNlIGlmIChsb3dlciA8PSB1cHBlcikgewoJICAgICAgICAgIHJldHVybiAobG93ZXIgKyB1cHBlcikgLyAyOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJpbnQiKSB7CgkgICAgICAgIGlmIChsb3dlciA9PT0gLUluZmluaXR5ICYmIHVwcGVyID09PSBJbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiAxOwoJICAgICAgICB9IGVsc2UgaWYgKGxvd2VyID09PSAtSW5maW5pdHkpIHsKCSAgICAgICAgICByZXR1cm4gdXBwZXIgLSAxOwoJICAgICAgICB9IGVsc2UgaWYgKHVwcGVyID09PSBJbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiBsb3dlciArIDE7CgkgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPD0gdXBwZXIpIHsKCSAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgobG93ZXIgKyB1cHBlcikgLyAyKTsKCSAgICAgICAgfQoJICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAiYmluYXJ5IikgewoJICAgICAgICByZXR1cm4gMTsKCSAgICAgIH0KCSAgICAgIHRocm93ICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIgb2YgdHlwZSAiICsgdHlwZSArICJbIiArIGxvd2VyICsgIiwgIiArIHVwcGVyICsgIl0iOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIAoJICAgICAqIGFuZCBpbml0aWFsaXplcyBub24taW5pdGlhbGl6ZWQgcGFyYW1ldGVycy4gVGhpcyBtb2RpZmllZCB2ZXJzaW9uIG9mCgkgICAgICogcGFyYW1zX3RvX2NvbXBsZXRlIGlzIHJldHVybmVkIGFzIGEgZGVlcCBjb3B5IGFuZCBub3QgbW9kaWZpZWQgaW4gcGxhY2UuCgkgICAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlCgkgICAgICogZnVuY3Rpb24odHlwZSwgbG93ZXIsIHVwcGVyKSB0aGF0IHNob3VsZCByZXR1cm4gYSBzaW5nbGUgbnVtYmVyIAoJICAgICAqIChsaWtlIHBhcmFtX2luaXRfZml4ZWQsIGZvciBleGFtcGxlKS4KCSAgICAgKiBAZXhhbXBsZQoJICAgICAqIHZhciBwYXJhbXMgPSB7ICJtdSI6IHsidHlwZSI6ICJyZWFsIn0gfQoJICAgICAqIHBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyhwYXJhbXMpOwoJICAgICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOgoJICAgICAqIC8vICB7Im11IjogeyAidHlwZSI6ICJyZWFsIiwgImRpbSI6IFsxXSwgInVwcGVyIjogSW5maW5pdHksCgkgICAgICogLy8gICAgICAgICAgICJsb3dlciI6IC1JbmZpbml0eSwgImluaXQiOiAwLjUgfX0KCSAgICAgKi8KCSAgICB2YXIgY29tcGxldGVfcGFyYW1zID0gZnVuY3Rpb24gKHBhcmFtc190b19jb21wbGV0ZSwgcGFyYW1faW5pdCkgewoJICAgICAgdmFyIHBhcmFtcyA9IGRlZXBfY2xvbmUocGFyYW1zX3RvX2NvbXBsZXRlKTsKCSAgICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7CgkgICAgICAgIGlmICghcGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtX25hbWUpKSBjb250aW51ZTsKCSAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW3BhcmFtX25hbWVdOwoJICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJ0eXBlIikpIHsKCSAgICAgICAgICBwYXJhbS50eXBlID0gInJlYWwiOwoJICAgICAgICB9CgkgICAgICAgIGlmICghcGFyYW0uaGFzT3duUHJvcGVydHkoImRpbSIpKSB7CgkgICAgICAgICAgcGFyYW0uZGltID0gWzFdOwoJICAgICAgICB9CgkgICAgICAgIGlmIChpc19udW1iZXIocGFyYW0uZGltKSkgewoJICAgICAgICAgIHBhcmFtLmRpbSA9IFtwYXJhbS5kaW1dOwoJICAgICAgICB9CgkgICAgICAgIGlmIChwYXJhbS50eXBlID09ICJiaW5hcnkiKSB7CgkgICAgICAgICAgcGFyYW0udXBwZXIgPSAxOwoJICAgICAgICAgIHBhcmFtLmxvd2VyID0gMDsKCSAgICAgICAgfQoJICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJ1cHBlciIpKSB7CgkgICAgICAgICAgcGFyYW0udXBwZXIgPSBJbmZpbml0eTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJsb3dlciIpKSB7CgkgICAgICAgICAgcGFyYW0ubG93ZXIgPSAtSW5maW5pdHk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHBhcmFtLmhhc093blByb3BlcnR5KCJpbml0IikpIHsKCSAgICAgICAgICAvLyBJZiB0aGlzIGlzIGp1c3QgYSBudW1iZXIgb3IgYSBuZXN0ZWQgYXJyYXkgd2UgbGVhdmUgaXQgYWxvbmUsIGJ1dCBpZi4uLgoJICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgdHlwZW9mIHBhcmFtLmluaXQgPT09ICJmdW5jdGlvbiIpIHsKCSAgICAgICAgICAgIC8vIHBhcmFtLmluaXQgaXMgYSBmdW5jdGlvbiwgdXNlIHRoYXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVyLgoJICAgICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtLmluaXQoKTsKCSAgICAgICAgICB9IGVsc2UgaWYgKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHsKCSAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlciB3aGVyZSB0aGUgcGFyYW0uaW5pdCBleGlzdCBidXQKCSAgICAgICAgICAgIC8vIGlzIG5vdCBhbiBhcnJheS4gVGhlbiBhc3N1bWUgaXQgaXMgYSBudW1iZXIgb3IgYSBmdW5jdGlvbiBhbmQgdXNlCgkgICAgICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuCgkgICAgICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgcGFyYW0uaW5pdCk7CgkgICAgICAgICAgfQoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIFdlIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KCSAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CgkgICAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwoJICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgICByZXR1cm4gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwoJICAgICAgICAgICAgfSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgkgICAgICByZXR1cm4gcGFyYW1zOwoJICAgIH07CgoJICAgIC8vLy8vLy8vLy8gU3RlcHBlciBGdW5jdGlvbnMgLy8vLy8vLy8vLy8KCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIC8qKgoJICAgICAqIEBpbnRlcmZhY2UKCSAgICAgKiBBIFN0ZXBwZXIgaXMgYW4gb2JqZWN0IHJlc3BvbnNpYmxlIGZvciBwdXNoaW5nIGFyb3VuZCBvbmUKCSAgICAgKiBvciBtb3JlIHBhcmFtZXRlciB2YWx1ZXMgaW4gYSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGRpc3RyaWJ1dGlvbgoJICAgICAqIGRlZmluZWQgYnkgdGhlIGxvZyBwb3N0ZXJpb3IuIFRoaXMgZGVmaW5lcyB0aGUgU3RlcHBlciAiaW50ZXJmYWNlIiwKCSAgICAgKiB3aGVyZSAiaW50ZXJmYWNlIiBtZWFucyB0aGF0IFN0ZXBwZXIgZGVmaW5lcyBhIGNsYXNzIHRoYXQgaXMgbmV2ZXIKCSAgICAgKiBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBqdXN0IHRvIGJlIHN1YmNsYXNzZWQgYnkgc3BlY2lhbGl6ZWQKCSAgICAgKiBzdGVwcGVyIGZ1bmN0aW9ucy4KCSAgICAgKiBAaW50ZXJmYWNlCgkgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6CgkgICAgICogICB7Im11IjogeyAidHlwZSI6ICJyZWFsIiwgImRpbSI6IFsxXSwgInVwcGVyIjogSW5maW5pdHksIAoJICAgICAqICAgImxvd2VyIjogLUluZmluaXR5LCAiaW5pdCI6IDAuNSB9fQoJICAgICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUgImNvbXBsZXRlIiwgdGhhdCBpcywKCSAgICAgKiAgIHNwZWNpZnlpbmcgYWxsIHJlbGV2YW50IGF0dHJpYnV0ZXMgc3VjaCBhcyBkaW0sIGxvd2VyIGFuZCB1cHBlci4KCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMgaW4gcGFyYW1zCgkgICAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzCgkgICAgICogICBhcyBzY2FsYXJzIG9yLCBwb3NzaWJseSBuZXN0ZWQsIGFycmF5cy4gRm9yIGV4YW1wbGU6CgkgICAgICogICB7bXU6IDEwLCBzaWdtYTogNSwgYmV0YTogWzEsIDIuNV19CgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGUKCSAgICAgKiAgIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFRoYXQgaXMsIHRoZSB2YWx1ZSBvZiBsb2dfcG9zdAoJICAgICAqICAgc2hvdWxkIGNoYW5nZSBpZiB0aGUgdGhlIHZhbHVlcyBpbiBzdGF0ZSBhcmUgY2hhbmdlZC4KCSAgICAKCSAgICAgKi8KCSAgICB2YXIgU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCkgewoJICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CgkgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CgkgICAgICB0aGlzLmxvZ19wb3N0ID0gbG9nX3Bvc3Q7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogVGFrZXMgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuIFNob3VsZCByZXR1cm4gdGhlIG5ldyBzdGF0ZSwKCSAgICAgKiBidXQgaXMgbWFpbmx5IGNhbGxlZCBmb3IgaXQncyBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgYSBjaGFuZ2UgaW4gdGhlCgkgICAgICogc3RhdGUgb2JqZWN0LgoJICAgICAqLwoJICAgIFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICB0aHJvdyAiRXZlcnkgU3RlcHBlciBuZWVkIHRvIGltcGxlbWVudCBzdGVwKCkiOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIElmIGltcGxlbWVudGVkLCBtYWtlcyB0aGUgc3RlcHBlciBhZGFwdCB3aGlsZSBzdGVwcGluZy4KCSAgICAgKi8KCSAgICBTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gT3B0aW9uYWwsIHNvbWUgc3RlcHBlcnMgbWlnaHQgbm90IGJlIGFkYXB0aXZlLiAqLyAKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgY2Vhc2UgYWRhcHRpbmcgd2hpbGUgc3RlcHBpbmcuCgkgICAgICovCgkgICAgU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gT3B0aW9uYWwsIHNvbWUgc3RlcHBlcnMgbWlnaHQgbm90IGJlIGFkYXB0aXZlLiAqLyAKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluZyBpbmZvIHJlZ2FyZGluZyB0aGUgc3RlcHBlci4KCSAgICAgKi8KCSAgICBTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgc3RlcHBlci4KCSAgICAgIHJldHVybiB7fTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluCgkgICAgICogdGhlIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiAiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQyIKCSAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLgoJICAgICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi4KCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAgKiBAcGFyYW0gZ2VuZXJhdGVfcHJvcG9zYWwgLSBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHByb3Bvc2FsIChhcyBhIG51bWJlcikKCSAgICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhCgkgICAgICogbnVtYmVyIGFuZCBsb2dfc2NhbGUgZGVmaW5lcyB0aGUgc2NhbGUgb2YgdGhlIHByb3Bvc2FsIHNvbWVob3cuCgkgICAgKi8KCSAgICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGdlbmVyYXRlX3Byb3Bvc2FsKSB7CgkgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCAhPSAxKSB7CgkgICAgICAgIHRocm93ICJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBjYW4gb25seSBoYW5kbGUgb25lIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CgkgICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdOwoJICAgICAgaWYgKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKCSAgICAgICAgdGhyb3cgIk9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIGNhbiBvbmx5IGhhbmRsZSBvbmUgb25lLWRpbWVuc2lvbmFsIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyOwoJICAgICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyOwoJICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSA9IGdldF9vcHRpb24oInByb3BfbG9nX3NjYWxlIiwgb3B0aW9ucywgMCk7CgkgICAgICB0aGlzLmJhdGNoX3NpemUgPSBnZXRfb3B0aW9uKCJiYXRjaF9zaXplIiwgb3B0aW9ucywgNTApOwoJICAgICAgdGhpcy5tYXhfYWRhcHRhdGlvbiA9IGdldF9vcHRpb24oIm1heF9hZGFwdGF0aW9uIiwgb3B0aW9ucywgMC4zMyk7CgkgICAgICB0aGlzLmluaXRpYWxfYWRhcHRhdGlvbiA9IGdldF9vcHRpb24oImluaXRpYWxfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIDEuMCk7CgkgICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSA9IGdldF9vcHRpb24oInRhcmdldF9hY2NlcHRfcmF0ZSIsIG9wdGlvbnMsIDAuNDQpOwoJICAgICAgdGhpcy5pc19hZGFwdGluZyA9IGdldF9vcHRpb24oImlzX2FkYXB0aW5nIiwgb3B0aW9ucywgdHJ1ZSk7CgkgICAgICB0aGlzLmdlbmVyYXRlX3Byb3Bvc2FsID0gZ2VuZXJhdGVfcHJvcG9zYWw7CgkgICAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwOwoJICAgICAgdGhpcy5iYXRjaF9jb3VudCA9IDA7CgkgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gPSAwOwoJICAgIH07CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT25lZGltTWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICB2YXIgcGFyYW1fc3RhdGUgPSB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07CgkgICAgICB2YXIgcGFyYW1fcHJvcG9zYWwgPSB0aGlzLmdlbmVyYXRlX3Byb3Bvc2FsKHBhcmFtX3N0YXRlLCB0aGlzLnByb3BfbG9nX3NjYWxlKTsKCSAgICAgIGlmIChwYXJhbV9wcm9wb3NhbCA8IHRoaXMubG93ZXIgfHwgcGFyYW1fcHJvcG9zYWwgPiB0aGlzLnVwcGVyKSA7IGVsc2UgewoJICAgICAgICAvLyBtYWtlIGEgTWV0cm9wb2xpcyBzdGVwCgkgICAgICAgIHZhciBjdXJyX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwoJICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSBwYXJhbV9wcm9wb3NhbDsKCSAgICAgICAgdmFyIHByb3BfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CgkgICAgICAgIHZhciBhY2NlcHRfcHJvYiA9IE1hdGguZXhwKHByb3BfbG9nX2RlbnMgLSBjdXJyX2xvZ19kZW5zKTsKCSAgICAgICAgaWYgKGFjY2VwdF9wcm9iID4gTWF0aC5yYW5kb20oKSkgewoJICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWwKCSAgICAgICAgICBpZiAodGhpcy5pc19hZGFwdGluZykgdGhpcy5hY2NlcHRhbmNlX2NvdW50Kys7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbQoJICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3N0YXRlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5pc19hZGFwdGluZykgewoJICAgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24rKzsKCSAgICAgICAgaWYgKHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA+PSB0aGlzLmJhdGNoX3NpemUpIHsKCSAgICAgICAgICAvLyB0aGVuIGFkYXB0CgkgICAgICAgICAgdGhpcy5iYXRjaF9jb3VudCsrOwoJICAgICAgICAgIHZhciBsb2dfc2RfYWRqdXN0bWVudCA9IE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uIC8gTWF0aC5zcXJ0KHRoaXMuYmF0Y2hfY291bnQpKTsKCSAgICAgICAgICBpZiAodGhpcy5hY2NlcHRhbmNlX2NvdW50IC8gdGhpcy5iYXRjaF9zaXplID4gdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUpIHsKCSAgICAgICAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgKz0gbG9nX3NkX2FkanVzdG1lbnQ7CgkgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgLT0gbG9nX3NkX2FkanVzdG1lbnQ7CgkgICAgICAgICAgfQoJICAgICAgICAgIHRoaXMuYWNjZXB0YW5jZV9jb3VudCA9IDA7CgkgICAgICAgICAgdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID0gMDsKCSAgICAgICAgfQoJICAgICAgfQoJICAgICAgcmV0dXJuIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXTsKCSAgICB9OwoJICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgdGhpcy5pc19hZGFwdGluZyA9IHRydWU7CgkgICAgfTsKCSAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgdGhpcy5pc19hZGFwdGluZyA9IGZhbHNlOwoJICAgIH07CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CgkgICAgICByZXR1cm4gewoJICAgICAgICBwcm9wX2xvZ19zY2FsZTogdGhpcy5wcm9wX2xvZ19zY2FsZSwKCSAgICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsCgkgICAgICAgIGFjY2VwdGFuY2VfY291bnQ6IHRoaXMuYWNjZXB0YW5jZV9jb3VudCwKCSAgICAgICAgaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbjogdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uLAoJICAgICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudAoJICAgICAgfTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYSBOb3JtYWwgcHJvcG9zYWwuCgkgICAgICovCgkgICAgdmFyIG5vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uIChwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHsKCSAgICAgIHJldHVybiBybm9ybShwYXJhbV9zdGF0ZSwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAYXVnbWVudHMge09uZWRpbU1ldHJvcG9saXNTdGVwcGVyfQoJICAgICAqIEEgInN1YmNsYXNzIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuCgkgICAgICovCgkgICAgdmFyIFJlYWxNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewoJICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgbm9ybWFsX3Byb3Bvc2FsKTsKCSAgICB9OwoJICAgIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjsKCgkgICAgLyoqCgkgICAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGlzY3JldGl6ZWQgTm9ybWFsIHByb3Bvc2FsLgoJICAgICAqLwoJICAgIHZhciBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbiAocGFyYW1fc3RhdGUsIHByb3BfbG9nX3NjYWxlKSB7CgkgICAgICByZXR1cm4gTWF0aC5yb3VuZChybm9ybShwYXJhbV9zdGF0ZSwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKSk7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgKiBAY2xhc3MKCSAgICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9CgkgICAgKiBBICJzdWJjbGFzcyIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuCgkgICAgKi8KCSAgICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCk7CgkgICAgfTsKCSAgICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgSW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50TWV0cm9wb2xpc1N0ZXBwZXI7CgoJICAgIC8qKgoJICAgICAqIEBjbGFzcwoJICAgICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfQoJICAgICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBtZXRyb3BvbGlzIHN0ZXAgaW4KCSAgICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgoJICAgICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkgZm9yIHBvc3NpYmx5IG11bHRpZGltZW5zaW9uYWwgYXJyYXlzLiBUaGF0CgkgICAgICogaXMsIGluc3RlYWQgb2YganVzdCB0YWtpbmcgYSBzdGVwIGZvciBhIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIgbGlrZSAKCSAgICAgKiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciwgdGhpcyBTdGVwcGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgc3RlcHMgCgkgICAgICogZm9yIGEgbXVsdGlkaW1lbnNpb25hbCBhcnJheS4gSXQncyBzdGlsbCBwcmV0dHkgZHVtYiBhbmQganVzdCB0YWtlcwoJICAgICAqIG9uZS1kaW1lbnNpb25hbCBzdGVwcyBmb3IgZWFjaCBwYXJhbWV0ZXIgY29tcG9uZW50LCB0aG91Z2guCgkgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uIGZvciBhIAoJICAgICAqICAgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuCgkgICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgoJICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKCSAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCgkgICAgICogQHBhcmFtIFN1YlN0ZXBwZXIgLSBhIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSBvZiBvbmUgZGltZW5zaW9uYWwgU3RlcHBlciB0byBhcHBseSBvbgoJICAgICAqICAgYWxsIHRoZSBjb21wb25lbnRzIG9mIHRoZSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci4KCSAgICAqLwoJICAgIHZhciBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBTdWJTdGVwcGVyKSB7CgkgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCAhPSAxKSB7CgkgICAgICAgIHRocm93ICJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CgkgICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdOwoJICAgICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyOwoJICAgICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyOwoJICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07CgkgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlID0gZ2V0X211bHRpZGltX29wdGlvbigicHJvcF9sb2dfc2NhbGUiLCBvcHRpb25zLCB0aGlzLmRpbSwgMCk7CgkgICAgICB0aGlzLmJhdGNoX3NpemUgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJiYXRjaF9zaXplIiwgb3B0aW9ucywgdGhpcy5kaW0sIDUwKTsKCSAgICAgIHRoaXMubWF4X2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJtYXhfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIHRoaXMuZGltLCAwLjMzKTsKCSAgICAgIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uID0gZ2V0X211bHRpZGltX29wdGlvbigiaW5pdGlhbF9hZGFwdGF0aW9uIiwgb3B0aW9ucywgdGhpcy5kaW0sIDEuMCk7CgkgICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oInRhcmdldF9hY2NlcHRfcmF0ZSIsIG9wdGlvbnMsIHRoaXMuZGltLCAwLjQ0KTsKCSAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJpc19hZGFwdGluZyIsIG9wdGlvbnMsIHRoaXMuZGltLCB0cnVlKTsKCgkgICAgICAvLyBUaGlzIGhhY2sgYmVsb3cgaXMgYSByZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFycmF5IG9mIAoJICAgICAgLy8gb25lIGRpbWVuc2lvbmFsIHN0ZXBwZXJzIGFjY29yZGluZyB0byBkaW0uCgkgICAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gZnVuY3Rpb24gKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZSwgYmF0Y2hfc2l6ZSwgbWF4X2FkYXB0YXRpb24sIGluaXRpYWxfYWRhcHRhdGlvbiwgdGFyZ2V0X2FjY2VwdF9yYXRlLCBpc19hZGFwdGluZykgewoJICAgICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTsKCSAgICAgICAgaWYgKGRpbS5sZW5ndGggPT09IDEpIHsKCSAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CgkgICAgICAgICAgICB2YXIgc3Vib3B0aW9ucyA9IHsKCSAgICAgICAgICAgICAgcHJvcF9sb2dfc2NhbGU6IHByb3BfbG9nX3NjYWxlW2ldLAoJICAgICAgICAgICAgICBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLAoJICAgICAgICAgICAgICBtYXhfYWRhcHRhdGlvbjogbWF4X2FkYXB0YXRpb25baV0sCgkgICAgICAgICAgICAgIGluaXRpYWxfYWRhcHRhdGlvbjogaW5pdGlhbF9hZGFwdGF0aW9uW2ldLAoJICAgICAgICAgICAgICB0YXJnZXRfYWNjZXB0X3JhdGU6IHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwKCSAgICAgICAgICAgICAgaXNfYWRhcHRpbmc6IGlzX2FkYXB0aW5nW2ldCgkgICAgICAgICAgICB9OwoJICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307CgkgICAgICAgICAgICBzdWJwYXJhbVtpXSA9IGRlZXBfY2xvbmUocGFyYW0pOwoJICAgICAgICAgICAgc3VicGFyYW1baV0uZGltID0gWzFdOyAvLyBBcyB0aGlzIHNob3VsZCBub3cgYmUgYSBvbmUtZGltIHBhcmFtZXRlcgoJICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWQKCSAgICAgICAgICAgIHN1YnN0ZXBwZXJzW2ldID0gbmV3IFN1YlN0ZXBwZXIoc3VicGFyYW0sIHN1YnN0YXRlLCBsb2dfcG9zdCwgc3Vib3B0aW9ucyk7CgkgICAgICAgICAgfQoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIHN1YnN0ZXBwZXJzW2ldID0gY3JlYXRlX3N1YnN0ZXBwZXJzKGRpbS5zbGljZSgxKSwgc3Vic3RhdGVbaV0sIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZVtpXSwgYmF0Y2hfc2l6ZVtpXSwgbWF4X2FkYXB0YXRpb25baV0sIGluaXRpYWxfYWRhcHRhdGlvbltpXSwgdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZ1tpXSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyczsKCSAgICAgIH07CgkgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QsIHRoaXMucHJvcF9sb2dfc2NhbGUsIHRoaXMuYmF0Y2hfc2l6ZSwgdGhpcy5tYXhfYWRhcHRhdGlvbiwgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24sIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlLCB0aGlzLmlzX2FkYXB0aW5nKTsKCSAgICB9OwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS4KCSAgICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLnN0ZXAoKTsKCSAgICAgIH0pOwoJICAgIH07CgkgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewoJICAgICAgICBzdWJzdGVwcGVyLnN0YXJ0X2FkYXB0YXRpb24oKTsKCSAgICAgIH0pOwoJICAgIH07CgkgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHN1YnN0ZXBwZXIuc3RvcF9hZGFwdGF0aW9uKCk7CgkgICAgICB9KTsKCSAgICB9OwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CgkgICAgICByZXR1cm4gbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLmluZm8oKTsKCSAgICAgIH0pOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIEBjbGFzcwoJICAgICAqIEBhdWdtZW50cyB7TXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcn0KCSAgICAgKiBBICJzdWJjbGFzcyIgb2YgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuCgkgICAgICovCgkgICAgdmFyIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFJlYWxNZXRyb3BvbGlzU3RlcHBlcik7CgkgICAgfTsKCSAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsKCSAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKCgkgICAgLyoqCgkgICAgICogQGNsYXNzCgkgICAgICogQGF1Z21lbnRzIHtNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyfQoJICAgICAqIEEgInN1YmNsYXNzIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLgoJICAgICAqLwoJICAgIHZhciBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIEludE1ldHJvcG9saXNTdGVwcGVyKTsKCSAgICB9OwoJICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBhIHN0ZXAgZm9yIGEgYmluYXJ5IHBhcmFtZXRlci4KCSAgICAgKiBUaGlzIGlzIGRvbmUgYnkgZXZhbHVhdGluZyB0aGUgbG9nIHBvc3RlcmlvciBmb3IgYm90aCBzdGF0ZXMgb2YgdGhlCgkgICAgICogcGFyYW1ldGVyIGFuZCB0aGVuIHNlbGVjdGluZyBhIHN0YXRlIHJhbmRvbWx5IHdpdGggcHJvYmFiaWxpdHkgcmVsYXRpdmUgCgkgICAgICogdG8gdGhlIHBvc3RlcmlvciBvZiBlYWNoIHN0YXRlLgoJICAgICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi4KCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAqLwoJICAgIHZhciBCaW5hcnlTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCA9PSAxKSB7CgkgICAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdGhyb3cgIkJpbmFyeVN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLiI7CgkgICAgICB9CgkgICAgfTsKCSAgICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5U3RlcHBlcjsKCSAgICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewoJICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDsKCSAgICAgIHZhciB6ZXJvX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwoJICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMTsKCSAgICAgIHZhciBvbmVfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CgkgICAgICB2YXIgbWF4X2xvZ19kZW5zID0gTWF0aC5tYXgoemVyb19sb2dfZGVucywgb25lX2xvZ19kZW5zKTsKCSAgICAgIHplcm9fbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zOwoJICAgICAgb25lX2xvZ19kZW5zIC09IG1heF9sb2dfZGVuczsKCSAgICAgIHZhciB6ZXJvX3Byb2IgPSBNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zIC0gTWF0aC5sb2coTWF0aC5leHAoemVyb19sb2dfZGVucykgKyBNYXRoLmV4cChvbmVfbG9nX2RlbnMpKSk7CgkgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikgewoJICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSAwOwoJICAgICAgICByZXR1cm4gMDsKCSAgICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC4KCSAgICAgIHJldHVybiAxOwoJICAgIH07CgoJICAgIC8qKgoJICAgICogQGNsYXNzCgkgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAqIEp1c3QgbGlrZSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIHRoaXMgU3RlcHBlciB0YWtlcyBhIHN0ZXBzIGZvcgoJICAgICogYSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlciBieSB1cGRhdGluZyBlYWNoIGNvbXBvbmVudCBpbiB0dXJuLiBUaGUgZGlmZmVyZW5jZQoJICAgICogaXMgdGhhdCB0aGlzIHN0ZXBwZXIgd29ya3Mgb24gYmluYXJ5IHBhcmFtZXRlcnMuCgkgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgCgkgICAgKiAgIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyLgoJICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgoJICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLgoJICAgICovCgkgICAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7CgkgICAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgkgICAgICBpZiAocGFyYW1fbmFtZXMubGVuZ3RoID09IDEpIHsKCSAgICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CgkgICAgICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07CgkgICAgICAgIHRoaXMuZGltID0gcGFyYW0uZGltOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdGhyb3cgIkJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLiI7CgkgICAgICB9CgkgICAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gZnVuY3Rpb24gKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0KSB7CgkgICAgICAgIHZhciBzdWJzdGVwcGVycyA9IFtdOwoJICAgICAgICB2YXIgaTsKCSAgICAgICAgaWYgKGRpbS5sZW5ndGggPT09IDEpIHsKCSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTsKCSAgICAgICAgICAgIHN1YnBhcmFtc1tpXSA9IHBhcmFtOwoJICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBuZXcgQmluYXJ5U3RlcHBlcihzdWJwYXJhbXMsIHN1YnN0YXRlLCBsb2dfcG9zdCk7CgkgICAgICAgICAgfQoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewoJICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QpOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gc3Vic3RlcHBlcnM7CgkgICAgICB9OwoJICAgICAgdGhpcy5zdWJzdGVwcGVycyA9IGNyZWF0ZV9zdWJzdGVwcGVycyh0aGlzLmRpbSwgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdLCB0aGlzLmxvZ19wb3N0KTsKCSAgICB9OwoJICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlDb21wb25lbnRTdGVwcGVyOwoJICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS4KCSAgICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLnN0ZXAoKTsKCSAgICAgIH0pOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIEBjbGFzcwoJICAgICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfQoJICAgICAqIFRoaXMgc3RlcHBlciBjYW4gYmUgcmVzcG9uc2libGUgZm9yIHRha2luZyBhIHN0ZXAgZm9yIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMuCgkgICAgICogRm9yIHJlYWwgYW5kIGludCBwYXJhbWV0ZXJzIGl0IHRha2VzIE1ldHJvcG9saXMgd2l0aGluIEdpYmJzIHN0ZXBzLCBhbmQgZm9yIAoJICAgICAqIGJpbmFyeSBwYXJhbWV0ZXJzIGl0IGRvZXMgZXZhbHVhdGVzIHRoZSBwb3N0ZXJpb3IgZm9yIGJvdGggcGFyYW10ZXIgdmFsdWVzIGFuZAoJICAgICAqIHJhbmRvbWx5IGNoYW5nZXMgdG8gYSBjZXJ0YWluIHZhbHVlIHByb3BvcnRpb25hbGx5IHRvIHRoYXQgdmFsdWUncyBwb3N0ZXJpb3IKCSAgICAgKiAodGhpcyBpcyBhbHNvIGRvbmUgZm9yIGVhY2ggcGFyYW1ldGVyLCBzbyBhbHNvIGEgKiB3aXRoaW4gR2liYnMgYXBwcm9hY2gpLgoJICAgICAqIFRoaXMgc3RlcHBlciBpcyBhbHNvIGFkYXB0aXZlIGFuZCBjYW4gYmUgZWZmaWNpZW50IHdoZW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCgkgICAgICogYXJlIG5vdCB0b28gaGlnaCBhbmQgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHBhcmFtZXRlcnMgYXJlIGxvdy4KCSAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMKCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAqLwoJICAgIHZhciBBbXdnU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewoJICAgICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTsKCSAgICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgkgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gW107CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1fbmFtZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dOwoJICAgICAgICB2YXIgU2VsZWN0U3RlcHBlcjsKCSAgICAgICAgc3dpdGNoIChwYXJhbS50eXBlKSB7CgkgICAgICAgICAgY2FzZSAicmVhbCI6CgkgICAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CgkgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICBjYXNlICJpbnQiOgoJICAgICAgICAgICAgaWYgKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gSW50TWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgIGNhc2UgImJpbmFyeSI6CgkgICAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CgkgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyOwoJICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICBkZWZhdWx0OgoJICAgICAgICAgICAgdGhyb3cgIkFtd2dTdGVwcGVyIGNhbid0IGhhbmRsZSBwYXJhbWV0ZXIgIiArIHRoaXMucGFyYW1fbmFtZXNbaV0gKyAiIHdpdGggdHlwZSAiICsgcGFyYW0udHlwZTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgcGFyYW1fb2JqZWN0X3dyYXAgPSB7fTsKCSAgICAgICAgcGFyYW1fb2JqZWN0X3dyYXBbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSBwYXJhbTsKCSAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgkgICAgICAgIHZhciBwYXJhbV9vcHRpb25zID0gb3B0aW9ucy5wYXJhbXMgJiYgb3B0aW9ucy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV0gfHwge307CgkgICAgICAgIHBhcmFtX29wdGlvbnMucHJvcF9sb2dfc2NhbGUgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlIHx8IG9wdGlvbnMucHJvcF9sb2dfc2NhbGU7CgkgICAgICAgIHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSA9IHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSB8fCBvcHRpb25zLmJhdGNoX3NpemU7CgkgICAgICAgIHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gPSBwYXJhbV9vcHRpb25zLm1heF9hZGFwdGF0aW9uIHx8IG9wdGlvbnMubWF4X2FkYXB0YXRpb247CgkgICAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247CgkgICAgICAgIHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlID0gcGFyYW1fb3B0aW9ucy50YXJnZXRfYWNjZXB0X3JhdGUgfHwgb3B0aW9ucy50YXJnZXRfYWNjZXB0X3JhdGU7CgkgICAgICAgIHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgPSBwYXJhbV9vcHRpb25zLmlzX2FkYXB0aW5nIHx8IG9wdGlvbnMuaXNfYWRhcHRpbmc7CgkgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0gPSBuZXcgU2VsZWN0U3RlcHBlcihwYXJhbV9vYmplY3Rfd3JhcCwgc3RhdGUsIGxvZ19wb3N0LCBwYXJhbV9vcHRpb25zKTsKCSAgICAgIH0KCSAgICB9OwoJICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFtd2dTdGVwcGVyOwoJICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewoJICAgICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykgewoJICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0ZXAoKTsKCSAgICAgIH0KCSAgICAgIHJldHVybiB0aGlzLnN0YXRlOwoJICAgIH07CgkgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGFydF9hZGFwdGF0aW9uKCk7CgkgICAgICB9CgkgICAgfTsKCSAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7CgkgICAgICB9CgkgICAgfTsKCSAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHZhciBpbmZvID0ge307CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgaW5mb1t0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMuc3Vic3RlcHBlcnNbaV0uaW5mbygpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGluZm87CgkgICAgfTsKCgkgICAgLy8vLy8vLy8vLy8gU2FtcGxlciBGdW5jdGlvbnMgLy8vLy8vLy8vLwoJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgLyoqCgkgICAgKiBAaW50ZXJmYWNlCgkgICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYQoJICAgIC8vIFNhbXBsZXIgaXMgaGVyZSBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIHdoZXJlIGFuIGluc3RhbmNlIG9mIFNhbXBsZXIKCSAgICAvLyBzZXRzIHVwIHRoZSBTdGVwcGVycywgY2hlY2tzIHRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiwKCSAgICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyICJpbnRlcmZhY2UiLgoJICAgICogQGludGVyZmFjZQoJICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6CgkgICAgKiAgIHsibXUiOiB7InR5cGUiOiAicmVhbCJ9LCAic2lnbWEiOiB7InR5cGUiOiAicmVhbCIsICJsb3dlciIgPSAwfX0KCSAgICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBkb2Vzbid0IGhhdmUgdG8gYmUgImNvbXBsZXRlIiBhbmQgcHJvcGVydGllcwoJICAgICogICBsZWZ0IG91dCAobGlrZSBsb3dlciBhbmQgdXBwZXIpIHdpbGwgYmUgZmlsbGVkIGluIGJ5IGRlZmF1bHRzLgoJICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmUKCSAgICAqICAgc3RhdGUgd2lsbCBiZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSB3aXRoIGVhY2ggcGFyYW1ldGVyIGFzIGEgCgkgICAgKiAgIGtleSBhbmQgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYXMgbnVtYmVycyBvciBhcnJheXMuIEZvciBleGFtcGxlOgoJICAgICogICB7Im11IjogMywgInNpZ21hIjogMS41fS4gVGhlIGRhdGEgYXJndW1lbnQgd2lsbCBiZSB0aGUgc2FtZSBvYmplY3QgYXMgCgkgICAgKiAgIHRoZSBkYXRhIGFyZ3VtZW50IGdpdmVuIGJlbG93LgoJICAgICogQHBhcmFtIGRhdGEgLSBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24KCSAgICAqICAgd2hlbiBzYW1wbGluZy4KCSAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc2FtcGxlci4KCSAgICAqLwoJICAgIHZhciBTYW1wbGVyID0gZnVuY3Rpb24gKHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpIHsKCSAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwoJICAgICAgdGhpcy5kYXRhID0gZGF0YTsKCSAgICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgoJICAgICAgLy8gU2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgaWYgbm90IHBhc3NlZCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdAoJICAgICAgdGhpcy5wYXJhbV9pbml0X2Z1biA9IGdldF9vcHRpb24oInBhcmFtX2luaXRfZnVuIiwgb3B0aW9ucywgcGFyYW1faW5pdF9maXhlZCk7CgkgICAgICB2YXIgdGhpbm5pbmdfaW50ZXJ2YWwgPSBnZXRfb3B0aW9uKCJ0aGluIiwgb3B0aW9ucywgMSk7CgkgICAgICB2YXIgcGFyYW1zX3RvX21vbml0b3IgPSBnZXRfb3B0aW9uKCJtb25pdG9yIiwgb3B0aW9ucywgbnVsbCk7CgkgICAgICB0aGlzLnRoaW4odGhpbm5pbmdfaW50ZXJ2YWwpOwoJICAgICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTsKCSAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgICAvLyBDb21wbGV0aW5nIHRoZSBwYXJhbXMgYW5kIGluaXRpYWxpemluZyB0aGUgc3RhdGUuCgkgICAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7CgkgICAgICB2YXIgc3RhdGUgPSB7fTsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbV9uYW1lcy5sZW5ndGg7IGkrKykgewoJICAgICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7CgkgICAgICB9CgkgICAgICB0aGlzLmxvZ19wb3N0ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpOwoJICAgICAgfTsKCSAgICAgIC8vIFJ1bm5pbmcgdGhlIGxvZ19wb3N0IGZ1bmN0aW9uIG9uY2UgaW4gY2FzZSBpdCBmdXJ0aGVyIG1vZGlmaWVzIHRoZSBzdGF0ZQoJICAgICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy4KCSAgICAgIHRoaXMubG9nX3Bvc3QoKTsKCSAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKCSAgICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpOwoJICAgIH07CgoJICAgIC8qKiBTaG91bGQgcmV0dXJuIGEgdmVjdG9yIG9mIHN0ZXBwZXJzIHRoYXQgd2hlbiBjYWxsZWQgCgkgICAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbiAoc3RhdGUsIGxvZ19wb3N0KSB7CgkgICAgICB0aHJvdyAiRXZlcnkgU2FtcGxlciBuZWVkcyB0byBpbXBsZW1lbnQgY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUoKSI7CgkgICAgfTsKCgkgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIFNhbXBsZXIuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHJldHVybiB7CgkgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLAoJICAgICAgICB0aGluOiB0aGlzLnRoaW4sCgkgICAgICAgIG1vbml0b3I6IHRoaXMubW9uaXRvciwKCSAgICAgICAgc3RlcHBlcnM6IHRoaXMuc3RlcHBlcnMKCSAgICAgIH07CgkgICAgfTsKCgkgICAgLyoqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBSZXR1cm5zIHRoZSBuZXcgc3BhY2UKCSAgICAgKiBidXQgYWxzbyBtb2RpZmllcyB0aGUgc3RhdGUgaW4gcGxhY2UuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdGVwcGVycyk7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdGhpcy5zdGVwcGVyc1tpXS5zdGVwKCk7CgkgICAgICB9CgkgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zdGF0ZSkubGVuZ3RoID4gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpLmxlbmd0aCkgewoJICAgICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2UKCSAgICAgICAgLy8gbmVlZCB0byBydW4gdGhlIGxvZ19wb3N0IG9uY2UgbW9yZSBpbiBvcmRlciB0byBzZXQgdGhlIGRlcml2ZWQgcXVhbnRpdGllcwoJICAgICAgICAvLyBmb3IgdGhlIGZpbmFsIHBhcmFtZXRlciBzdGF0ZQoJICAgICAgICB0aGlzLmxvZ19wb3N0KCk7CgkgICAgICB9CgkgICAgICByZXR1cm4gdGhpcy5zdGF0ZTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBUYWtlcyBuX2l0ZXJhdGlvbnMgc3RlcHMgaW4gdGhlIHBhcmFtZXRlciBzcGFjZSBhbmQgcmV0dXJucyB0aGVtCgkgICAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZToKCSAgICAgKiB7bXU6IFsxLCAtMSwgMiwgMywgLi4uXSwgc2lnbWE6IFsxLCAyLCAyLCAxLCAuLi5dfS4KCSAgICAgKiBJZiB0aGluIGlzID4gMSB0aGVuIG5faXRlcmF0aW9ucyAvIHRoaW4gc2FtcGxlcyBhcmUgcmV0dXJuZWQuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuc2FtcGxlID0gZnVuY3Rpb24gKG5faXRlcmF0aW9ucykgewoJICAgICAgLy8gSW5pdGlhbGl6aW5nIGN1cnJfc2FtcGxlIHdoZXJlIHRoZSBzYW1wbGUgaXMgZ29pbmcgdG8gYmUgc2F2ZWQKCSAgICAgIC8vIGFzIGFuIG9iamVjdCBjb250YWluaW5nIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyIHRvIGJlIG1vbml0b3JlZC4KCSAgICAgIHZhciBpLCBqLCBtb25pdG9yZWRfcGFyYW1zOwoJICAgICAgaWYgKHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9PT0gbnVsbCkgewoJICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gdGhpcy5tb25pdG9yZWRfcGFyYW1zOwoJICAgICAgfQoJICAgICAgdmFyIGN1cnJfc2FtcGxlID0ge307CgkgICAgICBmb3IgKGogPSAwOyBqIDwgbW9uaXRvcmVkX3BhcmFtcy5sZW5ndGg7IGorKykgewoJICAgICAgICBjdXJyX3NhbXBsZVttb25pdG9yZWRfcGFyYW1zW2pdXSA9IFtdOwoJICAgICAgfQoJICAgICAgZm9yIChpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7CgkgICAgICAgIGlmIChpICUgdGhpcy50aGlubmluZ19pbnRlcnZhbCA9PT0gMCkgewoJICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7CgkgICAgICAgICAgICB2YXIgcGFyYW0gPSBtb25pdG9yZWRfcGFyYW1zW2pdOwoJICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goY2xvbmVfcGFyYW1fZHJhdyh0aGlzLnN0YXRlW3BhcmFtXSkpOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0ZXAoKTsKCSAgICAgIH0KCSAgICAgIHJldHVybiBjdXJyX3NhbXBsZTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBUYWtlcyBuX2l0ZXJhdGlvbiBzdGVwcyBpbiBwYXJhbWV0ZXIgc3BhY2UgYnV0IHJldHVybnMgbm90aGluZy4KCSAgICAgKi8KCSAgICBTYW1wbGVyLnByb3RvdHlwZS5idXJuID0gZnVuY3Rpb24gKG5faXRlcmF0aW9ucykgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuX2l0ZXJhdGlvbnM7IGkrKykgewoJICAgICAgICB0aGlzLnN0ZXAoKTsKCSAgICAgIH0KCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBTZXRzIHdoYXQgcGFyYW1ldGVycyBzaG91bGQgYmUgbW9uaXRvcmVkIGFuZCByZXR1cm5lZCB3aGVuIGNhbGxpbmcKCSAgICAgKiBzYW1wbGUuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUubW9uaXRvciA9IGZ1bmN0aW9uIChwYXJhbXNfdG9fbW9uaXRvcikgewoJICAgICAgdGhpcy5tb25pdG9yZWRfcGFyYW1zID0gcGFyYW1zX3RvX21vbml0b3I7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogU2V0cyB0aGUgdGhpbm5pbmcuIEZvciBleGFtcGxlIHRoaW4gPT0gMTAgbWVhbnMgdGhhdCBldmVyeSAxMHRoIHBvc3RlcmlvcgoJICAgICAqIGRyYXcgd2lsbCBiZSBrZXB0LgoJICAgICAqLwoJICAgIFNhbXBsZXIucHJvdG90eXBlLnRoaW4gPSBmdW5jdGlvbiAodGhpbm5pbmdfaW50ZXJ2YWwpIHsKCSAgICAgIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPSB0aGlubmluZ19pbnRlcnZhbDsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBTZXRzIGFkYXB0YXRpb24gb24sIGlmIGFwcGxpY2FibGUsIGluIGFsbCBzdGVwcGVycy4KCSAgICAgKi8KCSAgICBTYW1wbGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RhcnRfYWRhcHRhdGlvbigpOwoJICAgICAgfQoJICAgIH07CgoJICAgIC8qKgoJICAgICogU2V0cyBhZGFwdGF0aW9uIG9mZiwgaWYgYXBwbGljYWJsZSwgaW4gYWxsIHN0ZXBwZXJzLgoJICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqCgkgICAgKiBAY2xhc3MKCSAgICAqIEBpbXBsZW1lbnRzIHtTYW1wbGVyfQoJICAgICogVGhpcyBzYW1wbGVyIHVzZXMgdGhlIEFtd2dTdGVwcGVyIGFzIHRoZSBzdGVwcGVyIGZ1bmN0aW9uIHdoaWNoIGltcGxlbWVudHMgdGhlIAoJICAgICogQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgoJICAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KS4gQW4gYWRpdGlvbiBpcyB0aGF0IGl0IGhhbmRsZXMgaW50IHBhcmFtZXRlcnMKCSAgICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgCgkgICAgKiB2YWx1ZSBwcm9wb3J0aW9uYWwgdG8gdGhlIHBvc3RlcmlvciBvZiB0aGUgdHdvIHBvc3NpYmxlIHN0YXRlcyBvZiB0aGUKCSAgICAqIHBhcmFtZXRlci4gVGhpcyBzYW1wbGVyIGNhbiBiZSBlZmZpY2llbnQgd2hlbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKCSAgICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuCgkgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMKCSAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KCSAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKCSAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAqLwoJICAgIHZhciBBbXdnU2FtcGxlciA9IGZ1bmN0aW9uIChwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7CgkgICAgICBTYW1wbGVyLmNhbGwodGhpcywgcGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucyk7CgkgICAgfTsKCSAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNhbXBsZXIucHJvdG90eXBlKTsKCSAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU2FtcGxlcjsKCSAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIHJldHVybiBbbmV3IEFtd2dTdGVwcGVyKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKV07CgkgICAgfTsKCgkgICAgLy8gUmV0dXJuaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgcHVibGljbHkgZXhwb3NlZCBieSB0aGlzIG1vZHVsZQoJICAgIHJldHVybiB7CgkgICAgICBydW5pZjogcnVuaWYsCgkgICAgICBydW5pZl9kaXNjcmV0ZTogcnVuaWZfZGlzY3JldGUsCgkgICAgICBybm9ybTogcm5vcm0sCgkgICAgICBwYXJhbV9pbml0X2ZpeGVkOiBwYXJhbV9pbml0X2ZpeGVkLAoJICAgICAgY29tcGxldGVfcGFyYW1zOiBjb21wbGV0ZV9wYXJhbXMsCgkgICAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwKCSAgICAgIEludE1ldHJvcG9saXNTdGVwcGVyOiBJbnRNZXRyb3BvbGlzU3RlcHBlciwKCSAgICAgIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOiBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciwKCSAgICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsCgkgICAgICBCaW5hcnlTdGVwcGVyOiBCaW5hcnlTdGVwcGVyLAoJICAgICAgQmluYXJ5Q29tcG9uZW50U3RlcHBlcjogQmluYXJ5Q29tcG9uZW50U3RlcHBlciwKCSAgICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwKCSAgICAgIEFtd2dTYW1wbGVyOiBBbXdnU2FtcGxlcgoJICAgIH07CgkgIH0pOwoJfSkobWNtYyk7Cgl2YXIgbWNtY0V4cG9ydHMgPSBtY21jLmV4cG9ydHM7CgoJZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHsKCSAgcmV0dXJuIGEgPT0gbnVsbCB8fCBiID09IG51bGwgPyBOYU4gOiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsKCX0KCglmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHsKCSAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkgewoJICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykgewoJICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkgewoJICAgICAgICB5aWVsZCB2YWx1ZTsKCSAgICAgIH0KCSAgICB9CgkgIH0gZWxzZSB7CgkgICAgbGV0IGluZGV4ID0gLTE7CgkgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7CgkgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7CgkgICAgICAgIHlpZWxkIHZhbHVlOwoJICAgICAgfQoJICAgIH0KCSAgfQoJfQoKCWZ1bmN0aW9uIGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUgPSBhc2NlbmRpbmcpIHsKCSAgaWYgKGNvbXBhcmUgPT09IGFzY2VuZGluZykgcmV0dXJuIGFzY2VuZGluZ0RlZmluZWQ7CgkgIGlmICh0eXBlb2YgY29tcGFyZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiY29tcGFyZSBpcyBub3QgYSBmdW5jdGlvbiIpOwoJICByZXR1cm4gKGEsIGIpID0+IHsKCSAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTsKCSAgICBpZiAoeCB8fCB4ID09PSAwKSByZXR1cm4geDsKCSAgICByZXR1cm4gKGNvbXBhcmUoYiwgYikgPT09IDApIC0gKGNvbXBhcmUoYSwgYSkgPT09IDApOwoJICB9OwoJfQoJZnVuY3Rpb24gYXNjZW5kaW5nRGVmaW5lZChhLCBiKSB7CgkgIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTsKCX0KCglmdW5jdGlvbiBtYXgodmFsdWVzLCB2YWx1ZW9mKSB7CgkgIGxldCBtYXg7CgkgIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHsKCSAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykgewoJICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKG1heCA8IHZhbHVlIHx8IG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkgewoJICAgICAgICBtYXggPSB2YWx1ZTsKCSAgICAgIH0KCSAgICB9CgkgIH0gZWxzZSB7CgkgICAgbGV0IGluZGV4ID0gLTE7CgkgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7CgkgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAobWF4IDwgdmFsdWUgfHwgbWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSB7CgkgICAgICAgIG1heCA9IHZhbHVlOwoJICAgICAgfQoJICAgIH0KCSAgfQoJICByZXR1cm4gbWF4OwoJfQoKCWZ1bmN0aW9uIG1pbih2YWx1ZXMsIHZhbHVlb2YpIHsKCSAgbGV0IG1pbjsKCSAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkgewoJICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7CgkgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAobWluID4gdmFsdWUgfHwgbWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSB7CgkgICAgICAgIG1pbiA9IHZhbHVlOwoJICAgICAgfQoJICAgIH0KCSAgfSBlbHNlIHsKCSAgICBsZXQgaW5kZXggPSAtMTsKCSAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHsKCSAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmIChtaW4gPiB2YWx1ZSB8fCBtaW4gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpIHsKCSAgICAgICAgbWluID0gdmFsdWU7CgkgICAgICB9CgkgICAgfQoJICB9CgkgIHJldHVybiBtaW47Cgl9CgoJLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcXVpY2tzZWxlY3QKCS8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uCglmdW5jdGlvbiBxdWlja3NlbGVjdChhcnJheSwgaywgbGVmdCA9IDAsIHJpZ2h0ID0gSW5maW5pdHksIGNvbXBhcmUpIHsKCSAgayA9IE1hdGguZmxvb3Ioayk7CgkgIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTsKCSAgcmlnaHQgPSBNYXRoLmZsb29yKE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIHJpZ2h0KSk7CgkgIGlmICghKGxlZnQgPD0gayAmJiBrIDw9IHJpZ2h0KSkgcmV0dXJuIGFycmF5OwoJICBjb21wYXJlID0gY29tcGFyZSA9PT0gdW5kZWZpbmVkID8gYXNjZW5kaW5nRGVmaW5lZCA6IGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUpOwoJICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7CgkgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkgewoJICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7CgkgICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxOwoJICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pOwoJICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7CgkgICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTsKCSAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpOwoJICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTsKCSAgICAgIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7CgkgICAgfQoJICAgIGNvbnN0IHQgPSBhcnJheVtrXTsKCSAgICBsZXQgaSA9IGxlZnQ7CgkgICAgbGV0IGogPSByaWdodDsKCSAgICBzd2FwKGFycmF5LCBsZWZ0LCBrKTsKCSAgICBpZiAoY29tcGFyZShhcnJheVtyaWdodF0sIHQpID4gMCkgc3dhcChhcnJheSwgbGVmdCwgcmlnaHQpOwoJICAgIHdoaWxlIChpIDwgaikgewoJICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qOwoJICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbaV0sIHQpIDwgMCkgKytpOwoJICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbal0sIHQpID4gMCkgLS1qOwoJICAgIH0KCSAgICBpZiAoY29tcGFyZShhcnJheVtsZWZ0XSwgdCkgPT09IDApIHN3YXAoYXJyYXksIGxlZnQsIGopO2Vsc2UgKytqLCBzd2FwKGFycmF5LCBqLCByaWdodCk7CgkgICAgaWYgKGogPD0gaykgbGVmdCA9IGogKyAxOwoJICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7CgkgIH0KCSAgcmV0dXJuIGFycmF5OwoJfQoJZnVuY3Rpb24gc3dhcChhcnJheSwgaSwgaikgewoJICBjb25zdCB0ID0gYXJyYXlbaV07CgkgIGFycmF5W2ldID0gYXJyYXlbal07CgkgIGFycmF5W2pdID0gdDsKCX0KCglmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHsKCSAgdmFsdWVzID0gRmxvYXQ2NEFycmF5LmZyb20obnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpKTsKCSAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjsKCSAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpOwoJICBpZiAocCA+PSAxKSByZXR1cm4gbWF4KHZhbHVlcyk7CgkgIHZhciBuLAoJICAgIGkgPSAobiAtIDEpICogcCwKCSAgICBpMCA9IE1hdGguZmxvb3IoaSksCgkgICAgdmFsdWUwID0gbWF4KHF1aWNrc2VsZWN0KHZhbHVlcywgaTApLnN1YmFycmF5KDAsIGkwICsgMSkpLAoJICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7CgkgIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApOwoJfQoKCWZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHsKCSAgcmV0dXJuIHF1YW50aWxlKHZhbHVlcywgMC41LCB2YWx1ZW9mKTsKCX0KCglmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkgewoJICB0aGlzLmsgPSBrOwoJICB0aGlzLnggPSB4OwoJICB0aGlzLnkgPSB5OwoJfQoJVHJhbnNmb3JtLnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSwKCSAgc2NhbGU6IGZ1bmN0aW9uIChrKSB7CgkgICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7CgkgIH0sCgkgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKHgsIHkpIHsKCSAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpOwoJICB9LAoJICBhcHBseTogZnVuY3Rpb24gKHBvaW50KSB7CgkgICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldOwoJICB9LAoJICBhcHBseVg6IGZ1bmN0aW9uICh4KSB7CgkgICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7CgkgIH0sCgkgIGFwcGx5WTogZnVuY3Rpb24gKHkpIHsKCSAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTsKCSAgfSwKCSAgaW52ZXJ0OiBmdW5jdGlvbiAobG9jYXRpb24pIHsKCSAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdOwoJICB9LAoJICBpbnZlcnRYOiBmdW5jdGlvbiAoeCkgewoJICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7CgkgIH0sCgkgIGludmVydFk6IGZ1bmN0aW9uICh5KSB7CgkgICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuazsKCSAgfSwKCSAgcmVzY2FsZVg6IGZ1bmN0aW9uICh4KSB7CgkgICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7CgkgIH0sCgkgIHJlc2NhbGVZOiBmdW5jdGlvbiAoeSkgewoJICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpOwoJICB9LAoJICB0b1N0cmluZzogZnVuY3Rpb24gKCkgewoJICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyB0aGlzLnggKyAiLCIgKyB0aGlzLnkgKyAiKSBzY2FsZSgiICsgdGhpcy5rICsgIikiOwoJICB9Cgl9OwoJVHJhbnNmb3JtLnByb3RvdHlwZTsKCgkvKgoJICBIVERNYXRoIFN0YXRpYyBDbGFzcyAtIE5vdCBpbnRlbmRlZCBmb3IgaW5zdGFudGlhdGlvbiEKCgkgIFZhcmlhYmxlczoKCSAgICBBID0gYW1vdW50CgkgICAgRCA9IGRlbGF5CgkgICAgViA9IHN1YmplY3RpdmUgdmFsdWUKCgkgICAgayA9IGRpc2NvdW50IGZhY3RvcgoKCSAgRXF1YXRpb25zOgoJICAgIFYgPSBBIC8gKDEgKyBrRCkKCSovCgljbGFzcyBIVERNYXRoIHsKCSAgc3RhdGljIGFkazJ2KGEsIGQsIGspIHsKCSAgICByZXR1cm4gYSAvICgxICsgayAqIGQpOwoJICB9CgkgIHN0YXRpYyBhZHYyayhhLCBkLCB2KSB7CgkgICAgcmV0dXJuIChhIC0gdikgLyAodiAqIGQpOwoJICB9Cgl9CgoJLy8gSW50ZXJuYWwgZGVwZW5kZW5jaWVzCgoJLyogZXNsaW50IG5vLXJlc3RyaWN0ZWQtZ2xvYmFsczogWyJvZmYiLCAic2VsZiJdICovCgoJc2VsZi5vbm1lc3NhZ2UgPSBldmVudCA9PiB7CgkgIGNvbnN0IHBhcmFtcyA9IHsKCSAgICBrOiB7CgkgICAgICB0eXBlOiAncmVhbCcsCgkgICAgICBsb3dlcjogMCwKCSAgICAgIHVwcGVyOiAxMDAKCSAgICB9LAoJICAgIGx1Y2U6IHsKCSAgICAgIHR5cGU6ICdyZWFsJywKCSAgICAgIGxvd2VyOiAwLAoJICAgICAgdXBwZXI6IDEwMAoJICAgIH0KCSAgfTsKCSAgY29uc3QgbG9nUG9zdCA9IChzdGF0ZSwgZGF0YSkgPT4gewoJICAgIGxldCBscCA9IDA7CgoJICAgIC8vIFByaW9ycwoJICAgIGNvbnN0IGtNZWFuID0gMjsKCSAgICBjb25zdCBrU2hhcGUgPSAzOwoJICAgIGxwICs9IGRpc3RyaWJ1dGlvbnNFeHBvcnRzLmdhbW1hKHN0YXRlLmssIGtTaGFwZSwga1NoYXBlIC8ga01lYW4pOwoJICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmssIDAsIDEwMCk7CgoJICAgIGNvbnN0IGx1Y2VNZWFuID0gMjsKCSAgICBjb25zdCBsdWNlU2hhcGUgPSAzOwoJICAgIGxwICs9IGRpc3RyaWJ1dGlvbnNFeHBvcnRzLmdhbW1hKHN0YXRlLmx1Y2UsIGx1Y2VTaGFwZSwgbHVjZVNoYXBlIC8gbHVjZU1lYW4pOwoJICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7CgoJICAgIC8vIExpa2VsaWhvb2QKCSAgICBkYXRhLmZvckVhY2goY2hvaWNlID0+IHsKCSAgICAgIC8vIFZhbHVlcwoJICAgICAgY29uc3QgdnMgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hcywgY2hvaWNlLmRzLCBzdGF0ZS5rKTsKCSAgICAgIGNvbnN0IHZsID0gSFRETWF0aC5hZGsydihjaG9pY2UuYWwsIGNob2ljZS5kbCwgc3RhdGUuayk7CgoJICAgICAgLy8gQ2hvaWNlIG9mIHNvb25lciBvciBsYXRlciBpcyBzYW1wbGVkIGZyb20gYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uCgkgICAgICAvLyBMdWNlIGNob2ljZSBydWxlIGlzIHVzZWQgdG8gY29tcHV0ZSBwcm9iYWJpbGl0eSBvZiB3YWl0aW5nISAoMCA9IHNvb25lciwgMSA9IGxhdGVyKQoJICAgICAgY29uc3QgYmludmFsID0gMSAvICgxICsgTWF0aC5leHAoc3RhdGUubHVjZSAqICh2cyAtIHZsKSkpOwoKCSAgICAgIC8vIEFjdHVhbCByZXNwb25zZQoJICAgICAgY29uc3QgcmVzcG9uc2UgPSBjaG9pY2UucmVzcG9uc2UgPT09ICdmaXJzdCcgPyAwIDogMTsKCSAgICAgIGxwICs9IGRpc3RyaWJ1dGlvbnNFeHBvcnRzLmJlcm4ocmVzcG9uc2UsIGJpbnZhbCk7CgkgICAgfSk7CgkgICAgcmV0dXJuIGxwOwoJICB9OwoKCSAgLy8gSW5pdGlhbGl6aW5nIHRoZSBzYW1wbGVyCgkgIGNvbnN0IHNhbXBsZXIgPSBuZXcgbWNtY0V4cG9ydHMuQW13Z1NhbXBsZXIocGFyYW1zLCBsb2dQb3N0LCBldmVudC5kYXRhKTsKCSAgLy8gQnVybmluZyBzb21lIHNhbXBsZXMgdG8gdGhlIE1DTUMgZ29kcyBhbmQgc2FtcGxpbmcgNTAwMCBkcmF3cwoJICBzYW1wbGVyLmJ1cm4oMTAwMCk7CgkgIGNvbnN0IHNhbXBsZXMgPSBzYW1wbGVyLnNhbXBsZSg1MDAwKTsKCgkgIC8vIEV4dHJhY3Qgc3VtbWFyeSBzdGF0cwoJICBjb25zdCByZXN1bHRzID0gewoJICAgIGs6IG1lZGlhbihzYW1wbGVzLmspLAoJICAgIGx1Y2U6IG1lZGlhbihzYW1wbGVzLmx1Y2UpCgkgIH07CgkgIHNlbGYucG9zdE1lc3NhZ2UoewoJICAgIHJlc3VsdHM6IHJlc3VsdHMsCgkgICAgc2FtcGxlczogc2FtcGxlcwoJICB9KTsKCX07Cgp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD1odGQtZml0LXdvcmtlci5qcy5tYXAKCg==",fp="data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRkLWZpdC13b3JrZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9iYXllcy5qcy9kaXN0cmlidXRpb25zLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2JheWVzLmpzL21jbWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FzY2VuZGluZy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zb3J0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVpY2tzZWxlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1YW50aWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tZWRpYW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvdHJhbnNmb3JtLmpzIiwiLi4vZGlzY291bnRhYmxlLW1hdGgvc3JjL2h0ZC1tYXRoLmpzIiwiLi4vZGlzY291bnRhYmxlLW1hdGgvc3JjL2luZGV4LmpzIiwic3JjL2NvbXBvbmVudHMvaHRkLWZpdC13b3JrZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLy8gQSBudW1iZXIgb2YgbG9nIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb25zIChQREYpLiBOYW1pbmcgYW5kIHBhcmFtZXRlcml6YXRpb25cbi8vIHNob3VsZCBtYXRjaCBSJ3MsIGV4Y2VwdCBmb3IgdGhhdCBhbGwgZnVuY3Rpb25zIHJlc2lkZSBpbiBhbiBsZCBvYmplY3QgKFxuLy8gYXMgaW4gXCJsb2cgZGVuc2l0eVwiKSwgc28gdG8gZ2V0IGEgbm9ybWFsIGxvZyBkZW5zaXR5IHlvdSB3b3VsZCB3cml0ZVxuLy8gbGQubm9ybSguLi4pLlxuLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0XG4vLyAoaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0Lykgd2hpY2ggaW5jbHVkZXMgUERGIGZvciBtYW55IGNvbW1vbiBwcm9iYWJpbGl0eVxuLy8gZGlzdHJpYnV0aW9ucy4gV2hhdCBJIGhhdmUgZG9uZSBpcyBvbmx5IHRvIGNvbnZlcnQgdGhlc2UgdG8gbG9nIFBERnMuXG5cbi8qXG5PcmlnaW5hbCB3b3JrIENvcHlyaWdodCAoYykgMjAxMyBqU3RhdFxuTW9kaWZpZWQgd29yayBDb3B5cmlnaHQgKGMpIDIwMTUgUmFzbXVzIELDpcOldGggXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS5cblxuKi9cblxuXG4vLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanNcbi8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLFxuLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuXG4vLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWxcbi8vIG9iamVjdCBsZCAuXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgICAgZGVmaW5lKFtdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dFxuICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgLy8gbGlrZSBOb2RlLlxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KVxuICAgICAgICByb290LmxkID0gZmFjdG9yeSgpO1xuICB9XG59KHRoaXMsIGZ1bmN0aW9uKCkge1xuICAvLyBPYmplY3QgdG8gaG9sZCB0aGUgZnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkLlxuICB2YXIgbGQgID0ge307XG4gIFxuICAvLy8vLy8vLy8vIEhlbHBlciBmdW5jdGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgdmFyIGxnYW1tYSA9IGZ1bmN0aW9uKHgpIHtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGNvZiA9IFtcbiAgICAgIDc2LjE4MDA5MTcyOTQ3MTQ2LCAtODYuNTA1MzIwMzI5NDE2NzcsIDI0LjAxNDA5ODI0MDgzMDkxLFxuICAgICAgLTEuMjMxNzM5NTcyNDUwMTU1LCAwLjEyMDg2NTA5NzM4NjYxNzllLTIsIC0wLjUzOTUyMzkzODQ5NTNlLTVcbiAgICBdO1xuICAgIHZhciBzZXIgPSAxLjAwMDAwMDAwMDE5MDAxNTtcbiAgICB2YXIgeHgsIHksIHRtcDtcbiAgICB0bXAgPSAoeSA9IHh4ID0geCkgKyA1LjU7XG4gICAgdG1wIC09ICh4eCArIDAuNSkgKiBsb2codG1wKTtcbiAgICBmb3IgKDsgaiA8IDY7IGorKylcbiAgICAgIHNlciArPSBjb2Zbal0gLyArK3k7XG4gICAgcmV0dXJuIGxvZygyLjUwNjYyODI3NDYzMTAwMDUgKiBzZXIgLyB4eCkgLSB0bXA7XG4gIH07XG4gIGxkLmxnYW1tYSA9IGxnYW1tYTtcbiAgXG4gIHZhciBsZmFjdG9yaWFsID0gZnVuY3Rpb24obikge1xuICAgIHJldHVybiBuIDwgMCA/IE5hTiA6IGxnYW1tYShuICsgMSk7XG4gIH07XG4gIGxkLmxmYWN0b3JpYWwgPSBsZmFjdG9yaWFsO1xuICBcbiAgdmFyIGxjaG9vc2UgPSBmdW5jdGlvbihuLCBrKXtcbiAgICByZXR1cm4gbGZhY3RvcmlhbChuKSAtIGxmYWN0b3JpYWwoaykgLSBsZmFjdG9yaWFsKG4gLSBrKTtcbiAgfTtcbiAgbGQubGNob29zZSA9IGxjaG9vc2U7XG4gIFxuICB2YXIgbGJldGEgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGxnYW1tYShhKSArIGxnYW1tYShiKSAtIGxnYW1tYShhICsgYik7XG4gIH07XG4gIGxkLmxiZXRhID0gbGJldGE7XG4gIFxuICB2YXIgbG9nICA9IE1hdGgubG9nO1xuICB2YXIgZXhwICA9IE1hdGguZXhwO1xuICB2YXIgYWJzICA9IE1hdGguYWJzO1xuICB2YXIgcG93ICA9IE1hdGgucG93O1xuICB2YXIgc3FydCA9IE1hdGguc3FydDtcbiAgdmFyIHBpICAgPSBNYXRoLlBJO1xuICBcbiAgLy8vLy8vLy8vLyBDb250aW5vdXMgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgbGQuYmV0YSA9IGZ1bmN0aW9uKHgsIHNoYXBlMSwgc2hhcGUyKSB7XG4gICAgaWYgKHggPiAxIHx8IHggPCAwKSB7XG4gICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIGlmKHNoYXBlMSA9PT0gMSAmJiBzaGFwZTIgPT09IDEpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKHNoYXBlMSAtIDEpICogbG9nKHgpICsgKHNoYXBlMiAtIDEpICogbG9nKDEgLSB4KSAtIGxiZXRhKHNoYXBlMSwgc2hhcGUyKTsgIFxuICAgIH1cbiAgfTtcbiAgXG4gIGxkLmNhdWNoeSA9IGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSkge1xuICAgIHJldHVybiBsb2coc2NhbGUpIC0gbG9nKHBvdyh4IC0gbG9jYXRpb24sIDIpICsgcG93KHNjYWxlLCAyKSkgIC0gbG9nKHBpKTtcbiAgfTtcbiAgXG4gIGxkLm5vcm0gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCkge1xuICAgICAgcmV0dXJuIC0wLjUgKiBsb2coMiAqIHBpKSAtbG9nKHNkKSAtIHBvdyh4IC0gbWVhbiwgMikgLyAoMiAqIHNkICogc2QpO1xuICB9O1xuXG4gIC8vIEEgYml2YXJpYXRlIE5vcm1hbCBkaXN0cmlidXRpb24gcGFyYW1ldGVyaXplZCBieSBhcnJheXMgb2YgdHdvIG1lYW5zIGFuZCBTRHMsIGFuZCBcbiAgLy8gdGhlIGNvcnJlbGF0aW9uLlxuICBsZC5iaXZhcm5vcm0gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCwgY29ycikge1xuICAgIHZhciB6ID0gcG93KHhbMF0gLSBtZWFuWzBdLCAyKSAvIHBvdyhzZFswXSwgMikgK1xuICAgICAgICAgICAgcG93KHhbMV0gLSBtZWFuWzFdLCAyKSAvIHBvdyhzZFsxXSwgMikgLSBcbiAgICAgICAgICAgICgyICogY29yciAqICh4WzBdIC0gbWVhblswXSkgKiAoeFsxXSAtIG1lYW5bMV0pKSAvIChzZFswXSAqIHNkWzFdKTtcbiAgICB2YXIgbm9ybWFsaXppbmdfZmFjdG9yID0gLSggbG9nKDIpICsgbG9nKHBpKSArIGxvZyhzZFswXSkgKyBsb2coc2RbMV0pICsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNSAqIGxvZygxIC0gcG93KGNvcnIsIDIpKSApOyBcbiAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSApICk7IFxuICAgIHJldHVybiBiaXZhcl9sb2dfZGVucztcbiAgfTtcbiAgXG5cbiAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSkge1xuICAgIHJldHVybiAoLWFicyh4IC0gbG9jYXRpb24pL3NjYWxlKSAtIGxvZygyICogc2NhbGUpO1xuICB9O1xuICBcbiAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7XG4gIFxuICBsZC5nYW1tYSA9IGZ1bmN0aW9uKHgsIHNoYXBlLCByYXRlKSB7XG4gICAgdmFyIHNjYWxlID0gMSAvIHJhdGU7XG4gICAgaWYgKHggPCAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICBpZigoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgKSB7XG4gICAgICByZXR1cm4gLWxvZyhzY2FsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoc2hhcGUgLSAxKSAqIGxvZyh4KSAtIHggLyBzY2FsZSAtIGxnYW1tYShzaGFwZSkgLSBzaGFwZSAqIGxvZyhzY2FsZSk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbih4LCBzaGFwZSwgc2NhbGUpIHtcbiAgICAgIGlmICh4IDw9IDApIHtcbiAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAtKHNoYXBlICsgMSkgKiBsb2coeCkgLSBzY2FsZSAvIHggLSBsZ2FtbWEoc2hhcGUpICsgc2hhcGUgKiBsb2coc2NhbGUpO1xuICAgIH07XG4gIFxuICBsZC5sbm9ybSA9ICBmdW5jdGlvbih4LCBtZWFubG9nLCBzZGxvZykge1xuICAgIGlmICh4IDw9IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiAtbG9nKHgpIC0gMC41ICogbG9nKDIgKiBwaSkgLSBsb2coc2Rsb2cpIC0gXG4gICAgICAgICAgICBwb3cobG9nKHgpIC0gbWVhbmxvZywgMikgLyAoMiAqIHNkbG9nICogc2Rsb2cpO1xuICB9O1xuICBcbiAgbGQucGFyZXRvID0gZnVuY3Rpb24oeCwgc2NhbGUsIHNoYXBlKSB7XG4gICAgaWYgKHggPCBzY2FsZSkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZyhzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSkgLSAoc2hhcGUgKyAxKSAqIGxvZyh4KTtcbiAgfTtcbiAgXG4gIGxkLnQgID0gIGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSwgZGYpIHtcbiAgICBkZiA9IGRmID4gMWUxMDAgPyAxZTEwMCA6IGRmO1xuICAgIHJldHVybiBsZ2FtbWEoKGRmICsgMSkvMikgLSBsZ2FtbWEoZGYvMikgLSBsb2coc3FydChwaSAqIGRmKSAqIHNjYWxlKSArXG4gICAgICAgICAgIGxvZyhwb3coMSArICgxL2RmKSAqIHBvdygoeCAtIGxvY2F0aW9uKS9zY2FsZSwgMiksIC0oZGYgKyAxKS8yKSk7XG4gIH07XG4gIFxuICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlXG4gIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIHdlaWJ1bGwgZGlzdHJpYnV0aW9uOiBcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmNcbiAgbGQud2VpYnVsbCA9IGZ1bmN0aW9uKHgsIHNoYXBlLCBzY2FsZSkge1xuICAgIGlmICh4IDwgMCkgcmV0dXJuIC1JbmZpbml0eTtcbiAgICBpZih4ID09PSAwICYmIHNoYXBlIDwgMSkgcmV0dXJuIEluZmluaXR5O1xuICAgIHZhciB0bXAxID0gcG93KHggLyBzY2FsZSwgc2hhcGUgLSAxKTtcbiAgICB2YXIgdG1wMiA9IHRtcDEgKiAoeCAvIHNjYWxlKTtcblx0ICByZXR1cm4gLXRtcDIgKyBsb2coc2hhcGUgKiB0bXAxIC8gc2NhbGUpO1xuICB9O1xuICBcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZVxuICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSBsb2dpc3RpYyBkaXN0cmlidXRpb246IFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2NoL3Itc291cmNlL2Jsb2IvYjE1NmUzYTcxMTk2N2Y1ODEzMWUyM2MxYjFkYzFlYTkwZTJmMGM0My9zcmMvbm1hdGgvZGxvZ2lzLmNcbiAgbGQubG9naXMgPSBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUpIHtcbiAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpO1xuICAgIHZhciBlID0gZXhwKC14KTtcbiAgICB2YXIgZiA9IDEuMCArIGU7XG4gICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7ICAgIFxuICB9O1xuXG4gIGxkLmRpcmljaGxldCA9IGZ1bmN0aW9uKHgsIGFscGhhKSB7XG4gICAgdmFyIHN1bV9hbHBoYSA9IDA7XG4gICAgdmFyIHN1bV9sZ2FtbWFfYWxwaGEgPSAwO1xuICAgIHZhciBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggPSAwO1xuICAgIHZhciBuID0gYWxwaGEubGVuZ3RoO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIHN1bV9hbHBoYSArPSBhbHBoYVtpXTtcbiAgICAgIHN1bV9sZ2FtbWFfYWxwaGEgKz0gbGdhbW1hKGFscGhhW2ldKTtcbiAgICAgIHN1bV9hbHBoYV9zdWJfMV9sb2dfeCArPSAoYWxwaGFbaV0gLSAxKSAqIGxvZyh4W2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGxnYW1tYShzdW1fYWxwaGEpIC0gc3VtX2xnYW1tYV9hbHBoYSArIHN1bV9hbHBoYV9zdWJfMV9sb2dfeDtcbiAgfTtcbiAgIFxuICAgIFxuICBsZC5leHAgPSBmdW5jdGlvbih4LCByYXRlKSB7XG4gICAgICByZXR1cm4geCA8IDAgPyAtSW5maW5pdHkgOiBsb2cocmF0ZSkgLXJhdGUgKiB4O1xuICB9O1xuICBcbiAgbGQudW5pZiA9IGZ1bmN0aW9uKHgsIG1pbiwgbWF4KSB7XG4gICAgICByZXR1cm4gKHggPCBtaW4gfHwgeCA+IG1heCkgPyAtSW5maW5pdHkgOiBsb2coMSAvIChtYXggLSBtaW4pKTtcbiAgfTtcbiAgXG4gIC8vLy8vLy8vLy8gRGlzY3JldGUgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIFxuICBsZC5iZXJuID0gZnVuY3Rpb24oeCwgcHJvYikge1xuICAgICAgcmV0dXJuICEoeCA9PT0gMCB8fCB4ID09PSAxKSA/IC1JbmZpbml0eSA6IGxvZyh4ICogcHJvYiArICgxIC0geCkgKiAoMSAtIHByb2IpKTtcbiAgfTtcbiAgXG4gIGxkLmNhdCA9IGZ1bmN0aW9uKHgsIHByb2JzKSB7XG4gICAgaWYoeCA8IDEgfHwgeCA+IHByb2JzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvZyggcHJvYnNbeCAtIDFdICk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQuYmlub20gPSBmdW5jdGlvbih4LCBzaXplLCBwcm9iKSB7XG4gICAgaWYoeCA+IHNpemUgfHwgeCA8IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIGlmKHByb2IgPT09IDAgfHwgcHJvYiA9PT0gMSkge1xuICAgICAgcmV0dXJuIChzaXplICogcHJvYikgPT09IHggPyAwIDogLUluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTtcbiAgfTtcbiAgXG4gIHZhciBtdWx0aW5vbSA9IGZ1bmN0aW9uKHgsIHByb2JzKSB7XG4gICAgdmFyIG4gPSB4Lmxlbmd0aDtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgdmFyIHRtcF90ZXJtID0gMDtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBpZihwcm9ic1tpXSA9PT0gMCkge1xuICAgICAgICBpZih4W2ldICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsgIFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplICs9IHhbaV07XG4gICAgICAgIHRtcF90ZXJtICs9IHhbaV0gKiBsb2cocHJvYnNbaV0pIC0gbGdhbW1hKHhbaV0gKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxnYW1tYShzaXplICsgMSkgKyB0bXBfdGVybSA7XG4gIH07XG4gIFxuICBsZC5uYmlub20gPSBmdW5jdGlvbih4LCBzaXplLCBwcm9iKSB7XG4gICAgaWYoeCA8IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpO1xuICB9O1xuICBcbiAgbGQuaHlwZXIgPSBmdW5jdGlvbih4LCBtLCBuLCBrKSB7XG4gICAgaWYoeCA8IDAgfHwgeCA+IGspIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2Uobiwgay14KSAtIGxjaG9vc2UobStuLCBrKTtcbiAgICB9XG4gIH07XG4gIFxuICBsZC5wb2lzID0gZnVuY3Rpb24oeCwgbGFtYmRhKSB7XG4gICAgICByZXR1cm4geCA8IDAgPyAtSW5maW5pdHkgOiBsb2cobGFtYmRhKSAqIHggLSBsYW1iZGEgLSBsZmFjdG9yaWFsKHgpO1xuICB9O1xuICBcbiAgcmV0dXJuIGxkO1xufSkpOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanNcbi8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLFxuLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuXG4vLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWxcbi8vIG9iamVjdCBtY21jIC5cbihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxuICAgICAgICBkZWZpbmUoW10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0XG4gICAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLFxuICAgICAgICAvLyBsaWtlIE5vZGUuXG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpXG4gICAgICAgIHJvb3QubWNtYyA9IGZhY3RvcnkoKTtcbiAgfVxufSh0aGlzLCBmdW5jdGlvbigpe1xuXG4vLy8gVGhlIGFjdHVhbCBtb2R1bGUgY29kZSBzdGFydHMgaGVyZSAvLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgXG4gIFxuICAvLy8vLy8vLy8vIEhlbHBlciBGdW5jdGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgLyoqIFJldHVybnMgYSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqL1xuICB2YXIgcnVuaWYgPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKyBtaW47XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIGFuZCBtYXggKi9cbiAgdmFyIHJ1bmlmX2Rpc2NyZXRlID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcbiAgfTtcbiAgXG4gIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkXG4gICAqICBieSBtZWFuIGFuZCBzZC4gXG4gICAqICBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0L2pzdGF0L2Jsb2IvbWFzdGVyL3NyYy9zcGVjaWFsLmpzICovXG4gIHZhciBybm9ybSA9IGZ1bmN0aW9uKG1lYW4sIHNkKSB7XG4gICAgdmFyIHUsIHYsIHgsIHksIHE7XG4gICAgZG8ge1xuICAgICAgdSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICB2ID0gMS43MTU2ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICAgICAgeCA9IHUgLSAwLjQ0OTg3MTtcbiAgICAgIHkgPSBNYXRoLmFicyh2KSArIDAuMzg2NTk1O1xuICAgICAgcSA9IHggKiB4ICsgeSAqICgwLjE5NjAwICogeSAtIDAuMjU0NzIgKiB4KTtcbiAgICB9IHdoaWxlIChxID4gMC4yNzU5NyAmJiAocSA+IDAuMjc4NDYgfHwgdiAqIHYgPiAtNCAqIE1hdGgubG9nKHUpICogdSAqIHUpKTtcbiAgICBcbiAgICByZXR1cm4gKHYgLyB1KSAqIHNkICsgbWVhbjtcbiAgfTtcbiAgXG4gIFxuICAvKiogUmV0dXJucyBhIGRlZXAgY2xvbmUgb2Ygc3JjLCBzb3J0IG9mLi4uIEl0IG9ubHkgY29waWVzIGEgbGltaXRlZFxuICAgKiBudW1iZXIgb2YgdHlwZXMgYW5kLCBmb3IgZXhhbXBsZSwgZnVuY3Rpb24gYXJlIG5vdCBjb3BpZWQuIFxuICAgKiBGcm9tIGh0dHA6Ly9kYXZpZHdhbHNoLm5hbWUvamF2YXNjcmlwdC1jbG9uZVxuICAgKi9cbiAgdmFyIGRlZXBfY2xvbmUgPSBmdW5jdGlvbihzcmMpIHtcbiAgXHRmdW5jdGlvbiBtaXhpbihkZXN0LCBzb3VyY2UsIGNvcHlGdW5jKSB7XG4gIFx0XHR2YXIgbmFtZSwgcywgaSwgZW1wdHkgPSB7fTtcbiAgXHRcdGZvcihuYW1lIGluIHNvdXJjZSl7XG4gIFx0XHRcdC8vIHRoZSAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykgY29uZGl0aW9uIGF2b2lkcyBjb3B5aW5nIHByb3BlcnRpZXMgaW4gXCJzb3VyY2VcIlxuICBcdFx0XHQvLyBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlLlx0IEZvciBleGFtcGxlLCBpZiBkZXN0IGhhcyBhIGN1c3RvbSB0b1N0cmluZygpIG1ldGhvZCxcbiAgXHRcdFx0Ly8gZG9uJ3Qgb3ZlcndyaXRlIGl0IHdpdGggdGhlIHRvU3RyaW5nKCkgbWV0aG9kIHRoYXQgc291cmNlIGluaGVyaXRlZCBmcm9tIE9iamVjdC5wcm90b3R5cGVcbiAgXHRcdFx0cyA9IHNvdXJjZVtuYW1lXTtcbiAgXHRcdFx0aWYoIShuYW1lIGluIGRlc3QpIHx8IChkZXN0W25hbWVdICE9PSBzICYmICghKG5hbWUgaW4gZW1wdHkpIHx8IGVtcHR5W25hbWVdICE9PSBzKSkpe1xuICBcdFx0XHRcdGRlc3RbbmFtZV0gPSBjb3B5RnVuYyA/IGNvcHlGdW5jKHMpIDogcztcbiAgXHRcdFx0fVxuICBcdFx0fVxuICBcdFx0cmV0dXJuIGRlc3Q7XG4gIFx0fVxuICBcdGlmKCFzcmMgfHwgdHlwZW9mIHNyYyAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzcmMpID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCIpe1xuICBcdFx0Ly8gbnVsbCwgdW5kZWZpbmVkLCBhbnkgbm9uLW9iamVjdCwgb3IgZnVuY3Rpb25cbiAgXHRcdHJldHVybiBzcmM7XHQvLyBhbnl0aGluZ1xuICBcdH1cbiAgXHRpZihzcmMubm9kZVR5cGUgJiYgXCJjbG9uZU5vZGVcIiBpbiBzcmMpe1xuICBcdFx0Ly8gRE9NIE5vZGVcbiAgXHRcdHJldHVybiBzcmMuY2xvbmVOb2RlKHRydWUpOyAvLyBOb2RlXG4gIFx0fVxuICBcdGlmKHNyYyBpbnN0YW5jZW9mIERhdGUpe1xuICBcdFx0Ly8gRGF0ZVxuICBcdFx0cmV0dXJuIG5ldyBEYXRlKHNyYy5nZXRUaW1lKCkpO1x0Ly8gRGF0ZVxuICBcdH1cbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBSZWdFeHApe1xuICBcdFx0Ly8gUmVnRXhwXG4gIFx0XHRyZXR1cm4gbmV3IFJlZ0V4cChzcmMpOyAgIC8vIFJlZ0V4cFxuICBcdH1cbiAgXHR2YXIgciwgaSwgbDtcbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBBcnJheSl7XG4gIFx0XHQvLyBhcnJheVxuICBcdFx0ciA9IFtdO1xuICBcdFx0Zm9yKGkgPSAwLCBsID0gc3JjLmxlbmd0aDsgaSA8IGw7ICsraSl7XG4gIFx0XHRcdGlmKGkgaW4gc3JjKXtcbiAgXHRcdFx0XHRyLnB1c2goZGVlcF9jbG9uZShzcmNbaV0pKTtcbiAgXHRcdFx0fVxuICBcdFx0fVxuICBcdH0gZWxzZSB7XG4gIFx0XHQvLyBnZW5lcmljIG9iamVjdHNcbiAgXHRcdHIgPSBzcmMuY29uc3RydWN0b3IgPyBuZXcgc3JjLmNvbnN0cnVjdG9yKCkgOiB7fTtcbiAgXHR9XG4gIFx0cmV0dXJuIG1peGluKHIsIHNyYywgZGVlcF9jbG9uZSk7XG4gIH07XG4gIFxuICAvKiogU3BlY2lhbGl6ZWQgY2xvbmUgZnVuY3Rpb24gdGhhdCBvbmx5IGNsb25lcyBzY2FsYXJzIGFuZCBuZXN0ZWQgYXJyYXlzIHdoZXJlXG4gICAqIGVhY2ggYXJyYXkgZWl0aGVyIGNvbnNpc3RzIG9mIGFsbCBhcnJheXMgb3IgYWxsIG51bWJlcnMuIFRoaXMgZnVuY3Rpb25cbiAgICogaXMgbWVhbnQgYXMgYSBmYXN0IHdheSBvZiBjbG9uaW5nIHBhcmFtZXRlciBkcmF3cyB3aXRoaW4gdGhlIG1jbWMgc2FtcGxpbmdcbiAgICogbG9vcC5cbiAgICovXG4gIHZhciBjbG9uZV9wYXJhbV9kcmF3ID0gZnVuY3Rpb24oeCkge1xuICAgIGlmKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgIGlmKEFycmF5LmlzQXJyYXkoeFswXSkpIHtcbiAgICAgICAgLy8geCBpcyBhbiBhcnJheSBvZiBhcnJheXMgc28gd2UgbmVlZCB0byBjbG9uZSBpdCByZWN1cnNpdmVseVxuICAgICAgICB2YXIgeF9jb3B5ID0gW107XG4gICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB4X2NvcHkucHVzaChjbG9uZV9wYXJhbV9kcmF3KHhbaV0pKTtcbiAgICAgICAgfSBcbiAgICAgICAgcmV0dXJuIHhfY29weTtcbiAgICAgIH0gZWxzZSB7IC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgYXJyYXlzIG9mIHNjYWxhcnNcbiAgICAgICAgcmV0dXJuIHguc2xpY2UoMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXJcbiAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgbnVtYmVyLlxuICAgKi9cbiAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT0gXCJudW1iZXJcIiB8fCAodHlwZW9mIG9iamVjdCA9PSBcIm9iamVjdFwiICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIChwb3NzaWJseSBtdWx0aWRpbWVuc2lvbmFsL25lc3RlZCkgYXJyYXkuXG4gICAqIEBwYXJhbSBkaW0gLSBBbiBhcnJheSBnaXZpbmcgdGhlIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkuIEZvciBleGFtcGxlLFxuICAgKiAgIFs1XSB3b3VsZCB5aWVsZCBhIDUgZWxlbWVudCBhcnJheSwgYW5kIFszLDNdIHdvdWxkIHlpZWxkIGEgMyBieSAzIG1hdHJpeC5cbiAgICogQHBhcmFtIGluaXQgLSBBIHZhbHVlIG9yIGEgZnVuY3Rpb24gdXNlZCB0byBmaWxsIGluIHRoZSBlYWNoIGVsZW1lbnQgaW5cbiAgICogICB0aGUgYXJyYXkuIElmIGl0IGlzIGEgZnVuY3Rpb24gaXQgc2hvdWxkIHRha2Ugbm8gYXJndW1lbnRzLCBpdCB3aWxsIGJlIFxuICAgKiAgIGV2YWx1YXRlZCBvbmNlIGZvciBlYWNoIGVsZW1lbnQsIGFuZCBpdCdzIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWQgdG9cbiAgICogICBmaWxsIGluIGVhY2ggZWxlbWVudC5cbiAgICogQGV4YW1wbGUgXG4gICAqIC8vIFRoZSBmb2xsb3dpbmcgd291bGQgcmV0dXJuIFtbMSwxXSxbMSwxXSxbMSwxXV1cbiAgICogY3JlYXRlX2FycmF5KFsyLDNdLCAxKVxuICAgKi9cbiAgdmFyIGNyZWF0ZV9hcnJheSA9IGZ1bmN0aW9uKGRpbSwgaW5pdCkge1xuICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZGltWzBdKTtcbiAgICB2YXIgaTtcbiAgICBpZihkaW0ubGVuZ3RoID09IDEpIHsgLy8gRmlsbCBpdCB1cCB3aXRoIGluaXRcbiAgICAgIGlmKHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBhcnJbaV0gPSBpbml0KCk7XG4gICAgICAgIH0gIFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBhcnJbaV0gPSBpbml0O1xuICAgICAgICB9IFxuICAgICAgfVxuICAgIH0gZWxzZSBpZihkaW0ubGVuZ3RoID4gMSkge1xuICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gY3JlYXRlX2FycmF5KGRpbS5zbGljZSgxKSwgaW5pdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiY3JlYXRlX2FycmF5IGNhbid0IGNyZWF0ZSBhIGRpbWVuc2lvbmxlc3MgYXJyYXlcIjtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciBcbiAgICogZXhhbXBsZSwgYXJyYXlfZGltKCBbWzEsIDJdLCBbMSwgMl1dICkgc2hvdWxkIHJldHVybiBbMiwgMl1cbiAgICogQXNzdW1lcyB0aGF0IGFsbCBhcnJheXMgaW5zaWRlIGFub3RoZXIgYXJyYXkgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aC5cbiAgICogQGV4YW1wbGVcbiAgICogLy8gU2hvdWxkIHJldHVybiBbNCwgMiwgMV1cbiAgICogYXJyYXlfZGltKGNyZWF0ZV9hcnJheShbNCwgMiwgMV0sIDApKVxuICAgKi9cbiAgdmFyIGFycmF5X2RpbSA9IGZ1bmN0aW9uKGEpIHtcbiAgICBpZihBcnJheS5pc0FycmF5KGFbMF0pKSB7XG4gICAgICByZXR1cm4gW2EubGVuZ3RoXS5jb25jYXQoYXJyYXlfZGltKGFbMF0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFthLmxlbmd0aF07XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0d28gYXJyYXlzIGFyZSBlcXVhbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHNcbiAgICogYXMganVkZ2VkIGJ5IHRoZSBcIj09XCIgb3BlcmF0b3IuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS5cbiAgICogQWRhcHRlZCBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0ODUzOTc0LzEwMDE4NDhcbiAgICovIFxuICB2YXIgYXJyYXlfZXF1YWwgPSBmdW5jdGlvbiAoYTEsIGEyKSB7XG4gICAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5c1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGExW2ldKSAmJiBBcnJheS5pc0FycmF5KGEyW2ldKSkge1xuICAgICAgICAgICAgICAvLyByZWN1cnNlIGludG8gdGhlIG5lc3RlZCBhcnJheXNcbiAgICAgICAgICAgICAgaWYgKCFhcnJheV9lcXVhbChhMVtpXSwgYTJbaV0pKSByZXR1cm4gZmFsc2U7ICAgICAgIFxuICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgICAgIGVsc2UgaWYgKGExW2ldICE9IGEyW2ldKSB7IFxuICAgICAgICAgICAgICAvLyBXYXJuaW5nIC0gdHdvIGRpZmZlcmVudCBvYmplY3QgaW5zdGFuY2VzIHdpbGwgbmV2ZXIgYmUgZXF1YWw6IHt4OjIwfSAhPSB7eDoyMH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIFxuICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgfSAgICAgICBcbiAgICAgIHJldHVybiB0cnVlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRyYXZlcnNlcyBhIHBvc3NpYmx5IG5lc3RlZCBhcnJheSBhIGFuZCBhcHBsaWVzIGZ1biB0byBhbGwgXCJsZWFmIG5vZGVzXCIsIFxuICAgKiB0aGF0IGlzLCB2YWx1ZXMgdGhhdCBhcmUgbm90IGFycmF5cy4gUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaXplIGFzXG4gICAqIGEuXG4gICAqL1xuICB2YXIgbmVzdGVkX2FycmF5X2FwcGx5ID0gZnVuY3Rpb24oYSwgZnVuKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheShhLmxlbmd0aCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4oYSk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqIFJhbmRvbWl6aW5nIHRoZSBhcnJheSBlbGVtZW50IG9yZGVyIGluLXBsYWNlLiBVc2luZyBEdXJzdGVuZmVsZFxuICAgKiBzaHVmZmxlIGFsZ29yaXRobS4gQWRhcHRlZCBmcm9tIGhlcmU6IFxuICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4XG4gICAqL1xuICBmdW5jdGlvbiBzaHVmZmxlX2FycmF5KGFycmF5KSB7XG4gICAgICBmb3IgKHZhciBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgdmFyIHRlbXAgPSBhcnJheVtpXTtcbiAgICAgICAgICBhcnJheVtpXSA9IGFycmF5W2pdO1xuICAgICAgICAgIGFycmF5W2pdID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERvZXMgdGhlIHNhbWUgdGhpbmcgYXMgbmVzdGVkX2FycmF5X2FwcGx5LCB0aGF0IGlzLCB0cmF2ZXJzZXMgYSBwb3NzaWJseVxuICAgKiBuZXN0ZWQgYXJyYXkgYSBhbmQgYXBwbGllcyBmdW4gdG8gYWxsIFwibGVhZiBub2Rlc1wiIGFuZCByZXR1cm5zIGFuIGFycmF5IFxuICAgKiBvZiB0aGUgc2FtZSBzaXplIGFzIGEuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseVxuICAgKiBicmFuY2hlcyByYW5kb21seS5cbiAgICovXG4gIHZhciBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5ID0gZnVuY3Rpb24oYSwgZnVuKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgdmFyIGxlbiA9IGEubGVuZ3RoO1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgYXJyYXlfaXMgPSBbXTtcbiAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGFycmF5X2lzW2ldID0gaTtcbiAgICAgIH1cbiAgICAgIHNodWZmbGVfYXJyYXkoYXJyYXlfaXMpO1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgXG4gICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgYXJyYXlfaSA9IGFycmF5X2lzW2ldO1xuICAgICAgICByZXN1bHRbYXJyYXlfaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVthcnJheV9pXSwgZnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4oYSk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIEFsbG93cyBhIHByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZnVsdHMgY2FuIGJlXG4gICAqIG92ZXJyaWRkZW4gYnkgYW4gb3B0aW9ucyBvYmplY3QuXG4gICAqICBAcGFyYW0gb3B0aW9uX25hbWUgLSB0aGUgbmFtZSBvZiB0aGUgb3B0aW9uIGFzIGEgc3RyaW5nXG4gICAqICBAcGFyYW0gbXlfb3B0aW9ucyAtIGFuIG9wdGlvbiBvYmplY3QgdGhhdCBjb3VsZCBoYXZlIG9wdGlvbl9uYW1lIFxuICAgKiAgICBhcyBhIG1lbWJlci5cbiAgICogQHBhcmFtIGRlZmF1bF92YWx1ZSAtIGRlZnVsdCB2YWx1ZSB0aGF0IGlzIHJldHVybmVkIGlmIG9wdGlvbl9uYW1lIFxuICAgKiAgIGlzIG5vdCBkZWZpbmVkIGluIG15X29wdGlvbnMuXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBteV9vcHRpb25zID0ge3BpOiAzLjE0MTU5fVxuICAgKiB2YXIgcGkgPSBnZXRfb3B0aW9uKFwicGlcIiwgbXlfb3B0aW9ucywgMy4xNClcbiAgICovXG4gIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuXG4gIC8vIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LiBGb3IgZXhhbXBsZTpcbiAgLy8gdmFyIHBpID0gZ2V0X29wdGlvbihcInBpXCIsIG15X29wdGlvbnMsIDMuMTQpXG4gIHZhciBnZXRfb3B0aW9uID0gZnVuY3Rpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSkge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBvcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbl9uYW1lKSAmJiBcbiAgICAgICAgICAgb3B0aW9uc1tvcHRpb25fbmFtZV0gIT09IHVuZGVmaW5lZCAgJiYgXG4gICAgICAgICAgIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSBudWxsID8gb3B0aW9uc1tvcHRpb25fbmFtZV0gOiBkZWZhdWxfdmFsdWU7XG4gIH07XG4gIFxuICAvKiogVmVyc2lvbiBvZiBnZXRfb3B0aW9uIHdoZXJlIHRoZSBvcHRpb24gc2hvdWxkIGJlIGEgb25lIG9yIG11bHRpLWRpbWVuc2lvbmFsXG4gICAqIGFycmF5IGFuZCB3aGVyZSB0aGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBlaXRoZXIgYnkgYSBzY2FsYXIgb3IgYnkgYW4gYXJyYXkuXG4gICAqIElmIGl0J3MgYSBzY2FsYXIgdGhlIHRoYXQgc2NhbGFyIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBhcnJheSB3aXRoIFxuICAgKiBkaW0gZGltZW5zaW9ucy5cbiAgICogXG4gICAqL1xuICB2YXIgZ2V0X211bHRpZGltX29wdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkaW0sIGRlZmF1bF92YWx1ZSkge1xuICAgIHZhciB2YWx1ZSA9IGdldF9vcHRpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSk7XG4gICAgIGlmKCEgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICB2YWx1ZSA9IGNyZWF0ZV9hcnJheShkaW0sIHZhbHVlKTtcbiAgICAgfSBcbiAgICAgaWYoISBhcnJheV9lcXVhbCggYXJyYXlfZGltKHZhbHVlKSwgZGltKSkge1xuICAgICAgIHRocm93IFwiVGhlIG9wdGlvbiBcIiArIG9wdGlvbl9uYW1lICsgXCIgaXMgb2YgZGltZW5zaW9uIFtcIiArIFxuICAgICAgICAgICAgIGFycmF5X2RpbSh2YWx1ZSkgKyBcIl0gYnV0IHNob3VsZCBiZSBbXCIgKyBkaW0gKyBcIl0uXCI7XG4gICAgfVxuICAgICByZXR1cm4gdmFsdWU7XG4gIH07XG4gIFxuICAvLy8vLy8vLy8vIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcGFyYW1ldGVyIG9iamVjdHMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgLyoqXG4gICAqIFJldHVybnMgYSBmaXhlZCAoc2FtZSBldmVyeSB0aW1lKSBudW1iZXIgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgICogYSBwYXJhbWV0ZXIgb2YgYSBjZXJ0YWluIHR5cGUsIHBvc3NpYmx5IHdpdGggbG93ZXIgYW5kIHVwcGVyIGJvdW5kcy5cbiAgICogVGhlIHBvc3NpbGUgdHlwZXMgYXJlIFwicmVhbFwiLCBcImludFwiLCBhbmQgXCJiaW5hcnlcIi5cbiAgICovXG4gIHZhciBwYXJhbV9pbml0X2ZpeGVkID0gZnVuY3Rpb24odHlwZSwgbG93ZXIsIHVwcGVyKSB7XG4gICAgaWYobG93ZXIgPiB1cHBlcikge1xuICAgICAgdGhyb3cgXCJDYW4gbm90IGluaXRpYWxpemUgcGFyYW1ldGVyIHdoZXJlIGxvd2VyIGJvdW5kID4gdXBwZXIgYm91bmRcIjtcbiAgICB9XG4gICAgaWYodHlwZSA9PT0gXCJyZWFsXCIpIHtcbiAgICAgIGlmKGxvd2VyID09PSAtSW5maW5pdHkgJiYgdXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gdXBwZXIgLSAwLjU7XG4gICAgICB9IGVsc2UgaWYodXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiBsb3dlciArIDAuNTtcbiAgICAgIH0gZWxzZSBpZihsb3dlciA8PSB1cHBlcikge1xuICAgICAgICByZXR1cm4gKGxvd2VyICsgdXBwZXIpIC8gMjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYodHlwZSA9PT0gXCJpbnRcIikge1xuICAgICAgaWYobG93ZXIgPT09IC1JbmZpbml0eSAmJiB1cHBlciA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gdXBwZXIgLSAxO1xuICAgICAgfSBlbHNlIGlmKHVwcGVyID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gbG93ZXIgKyAxO1xuICAgICAgfSBlbHNlIGlmKGxvd2VyIDw9IHVwcGVyKXtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGxvd2VyICsgdXBwZXIpIC8gMik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHR5cGUgPT09IFwiYmluYXJ5XCIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB0aHJvdyBcIkNvdWxkIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciBvZiB0eXBlIFwiICsgdHlwZSArIFwiW1wiICsgbG93ZXIgKyBcIiwgXCIgKyB1cHBlciArIFwiXVwiO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIFxuICAgKiBhbmQgaW5pdGlhbGl6ZXMgbm9uLWluaXRpYWxpemVkIHBhcmFtZXRlcnMuIFRoaXMgbW9kaWZpZWQgdmVyc2lvbiBvZlxuICAgKiBwYXJhbXNfdG9fY29tcGxldGUgaXMgcmV0dXJuZWQgYXMgYSBkZWVwIGNvcHkgYW5kIG5vdCBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlXG4gICAqIGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikgdGhhdCBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlciBcbiAgICogKGxpa2UgcGFyYW1faW5pdF9maXhlZCwgZm9yIGV4YW1wbGUpLlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgcGFyYW1zID0geyBcIm11XCI6IHtcInR5cGVcIjogXCJyZWFsXCJ9IH1cbiAgICogcGFyYW1zID0gY29tcGxldGVfcGFyYW1zKHBhcmFtcyk7XG4gICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOlxuICAgKiAvLyAge1wibXVcIjogeyBcInR5cGVcIjogXCJyZWFsXCIsIFwiZGltXCI6IFsxXSwgXCJ1cHBlclwiOiBJbmZpbml0eSxcbiAgICogLy8gICAgICAgICAgIFwibG93ZXJcIjogLUluZmluaXR5LCBcImluaXRcIjogMC41IH19XG4gICAqLyBcbiAgdmFyIGNvbXBsZXRlX3BhcmFtcyAgPSBmdW5jdGlvbihwYXJhbXNfdG9fY29tcGxldGUsIHBhcmFtX2luaXQpIHtcbiAgICB2YXIgcGFyYW1zID0gZGVlcF9jbG9uZShwYXJhbXNfdG9fY29tcGxldGUpO1xuICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7IGlmICghcGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtX25hbWUpKSBjb250aW51ZTtcbiAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1twYXJhbV9uYW1lXTtcbiAgICAgIGlmKCAhcGFyYW0uaGFzT3duUHJvcGVydHkoXCJ0eXBlXCIpKSB7XG4gICAgICAgIHBhcmFtLnR5cGUgPSBcInJlYWxcIjtcbiAgICAgIH1cbiAgICAgIGlmKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eShcImRpbVwiKSkge1xuICAgICAgICBwYXJhbS5kaW0gPSBbMV07XG4gICAgICB9XG4gICAgICBpZihpc19udW1iZXIocGFyYW0uZGltKSkge1xuICAgICAgICBwYXJhbS5kaW0gPSBbcGFyYW0uZGltXTtcbiAgICAgIH1cbiAgICAgIGlmKHBhcmFtLnR5cGUgPT0gXCJiaW5hcnlcIikge1xuICAgICAgICBwYXJhbS51cHBlciA9IDE7XG4gICAgICAgIHBhcmFtLmxvd2VyID0gMDtcbiAgICAgIH1cbiAgICAgIGlmKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eShcInVwcGVyXCIpKSB7XG4gICAgICAgIHBhcmFtLnVwcGVyID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBpZighcGFyYW0uaGFzT3duUHJvcGVydHkoXCJsb3dlclwiKSkge1xuICAgICAgICBwYXJhbS5sb3dlciA9IC1JbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYocGFyYW0uaGFzT3duUHJvcGVydHkoXCJpbml0XCIpKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMganVzdCBhIG51bWJlciBvciBhIG5lc3RlZCBhcnJheSB3ZSBsZWF2ZSBpdCBhbG9uZSwgYnV0IGlmLi4uXG4gICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSAmJiB0eXBlb2YgcGFyYW0uaW5pdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gcGFyYW0uaW5pdCBpcyBhIGZ1bmN0aW9uLCB1c2UgdGhhdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtLmluaXQoKTtcbiAgICAgICAgfSBlbHNlIGlmKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyIHdoZXJlIHRoZSBwYXJhbS5pbml0IGV4aXN0IGJ1dFxuICAgICAgICAvLyBpcyBub3QgYW4gYXJyYXkuIFRoZW4gYXNzdW1lIGl0IGlzIGEgbnVtYmVyIG9yIGEgZnVuY3Rpb24gYW5kIHVzZVxuICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBwYXJhbS5pbml0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgLy8gV2UgdXNlIHRoZSBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLlxuICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbV9pbml0KHBhcmFtLnR5cGUsIHBhcmFtLmxvd2VyLCBwYXJhbS51cHBlcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfTtcbiAgXG4gIFxuICAvLy8vLy8vLy8vIFN0ZXBwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIFxuICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBBIFN0ZXBwZXIgaXMgYW4gb2JqZWN0IHJlc3BvbnNpYmxlIGZvciBwdXNoaW5nIGFyb3VuZCBvbmVcbiAgICogb3IgbW9yZSBwYXJhbWV0ZXIgdmFsdWVzIGluIGEgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBkaXN0cmlidXRpb25cbiAgICogZGVmaW5lZCBieSB0aGUgbG9nIHBvc3Rlcmlvci4gVGhpcyBkZWZpbmVzIHRoZSBTdGVwcGVyIFwiaW50ZXJmYWNlXCIsXG4gICAqIHdoZXJlIFwiaW50ZXJmYWNlXCIgbWVhbnMgdGhhdCBTdGVwcGVyIGRlZmluZXMgYSBjbGFzcyB0aGF0IGlzIG5ldmVyXG4gICAqIG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCwgYnV0IGp1c3QgdG8gYmUgc3ViY2xhc3NlZCBieSBzcGVjaWFsaXplZFxuICAgKiBzdGVwcGVyIGZ1bmN0aW9ucy5cbiAgICogQGludGVyZmFjZVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggcGFyYW1ldGVyIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZTpcbiAgICogICB7XCJtdVwiOiB7IFwidHlwZVwiOiBcInJlYWxcIiwgXCJkaW1cIjogWzFdLCBcInVwcGVyXCI6IEluZmluaXR5LCBcbiAgICogICBcImxvd2VyXCI6IC1JbmZpbml0eSwgXCJpbml0XCI6IDAuNSB9fVxuICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGJlIFwiY29tcGxldGVcIiwgdGhhdCBpcyxcbiAgICogICBzcGVjaWZ5aW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzIHN1Y2ggYXMgZGltLCBsb3dlciBhbmQgdXBwZXIuXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyBpbiBwYXJhbXNcbiAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzXG4gICAqICAgYXMgc2NhbGFycyBvciwgcG9zc2libHkgbmVzdGVkLCBhcnJheXMuIEZvciBleGFtcGxlOlxuICAgKiAgIHttdTogMTAsIHNpZ21hOiA1LCBiZXRhOiBbMSwgMi41XX1cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGVcbiAgICogICBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBUaGF0IGlzLCB0aGUgdmFsdWUgb2YgbG9nX3Bvc3RcbiAgICogICBzaG91bGQgY2hhbmdlIGlmIHRoZSB0aGUgdmFsdWVzIGluIHN0YXRlIGFyZSBjaGFuZ2VkLlxuICBcbiAgICovXG4gIHZhciBTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpIHtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2dfcG9zdCA9IGxvZ19wb3N0O1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBTaG91bGQgcmV0dXJuIHRoZSBuZXcgc3RhdGUsXG4gICAqIGJ1dCBpcyBtYWlubHkgY2FsbGVkIGZvciBpdCdzIHNpZGUgZWZmZWN0IG9mIG1ha2luZyBhIGNoYW5nZSBpbiB0aGVcbiAgICogc3RhdGUgb2JqZWN0LlxuICAgKi9cbiAgU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IFwiRXZlcnkgU3RlcHBlciBuZWVkIHRvIGltcGxlbWVudCBzdGVwKClcIjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgYWRhcHQgd2hpbGUgc3RlcHBpbmcuXG4gICAqLyBcbiAgU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gXG4gIH07XG4gIFxuICAvKipcbiAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGNlYXNlIGFkYXB0aW5nIHdoaWxlIHN0ZXBwaW5nLlxuICAgKi8gXG4gIFN0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gXG4gIH07XG4gIFxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmcgaW5mbyByZWdhcmRpbmcgdGhlIHN0ZXBwZXIuXG4gICAqLyBcbiAgU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHN0ZXBwZXIuXG4gICAgcmV0dXJuIHt9O1xuICB9O1xuICBcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBtZXRyb3BvbGlzIHN0ZXAgaW5cbiAgICogdGhlIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiBcIkV4YW1wbGVzIG9mIEFkYXB0aXZlIE1DTUNcIlxuICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICAqIEBwYXJhbSBnZW5lcmF0ZV9wcm9wb3NhbCAtIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgcHJvcG9zYWwgKGFzIGEgbnVtYmVyKVxuICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhXG4gICAqIG51bWJlciBhbmQgbG9nX3NjYWxlIGRlZmluZXMgdGhlIHNjYWxlIG9mIHRoZSBwcm9wb3NhbCBzb21laG93LlxuICAqL1xuICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgZ2VuZXJhdGVfcHJvcG9zYWwpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggICE9IDEpIHtcbiAgICAgIHRocm93IFwiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07XG4gICAgaWYoIWFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgdGhyb3cgXCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBjYW4gb25seSBoYW5kbGUgb25lIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjtcbiAgICB0aGlzLnVwcGVyID0gcGFyYW0udXBwZXI7XG4gICAgXG4gICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAgICAgPSBnZXRfb3B0aW9uKFwicHJvcF9sb2dfc2NhbGVcIiwgb3B0aW9ucywgMCk7XG4gICAgdGhpcy5iYXRjaF9zaXplICAgICAgICAgPSBnZXRfb3B0aW9uKFwiYmF0Y2hfc2l6ZVwiLCBvcHRpb25zLCA1MCk7XG4gICAgdGhpcy5tYXhfYWRhcHRhdGlvbiAgICAgPSBnZXRfb3B0aW9uKFwibWF4X2FkYXB0YXRpb25cIiwgb3B0aW9ucywgMC4zMyk7XG4gICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfb3B0aW9uKFwiaW5pdGlhbF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIDEuMCk7XG4gICAgdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUgPSBnZXRfb3B0aW9uKFwidGFyZ2V0X2FjY2VwdF9yYXRlXCIsIG9wdGlvbnMsIDAuNDQpO1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgICAgICAgID0gZ2V0X29wdGlvbihcImlzX2FkYXB0aW5nXCIsIG9wdGlvbnMsIHRydWUpO1xuICAgIFxuICAgIHRoaXMuZ2VuZXJhdGVfcHJvcG9zYWwgPSBnZW5lcmF0ZV9wcm9wb3NhbDtcbiAgICBcbiAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwO1xuICAgIHRoaXMuYmF0Y2hfY291bnQgPSAwO1xuICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7ICBcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT25lZGltTWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBhcmFtX3N0YXRlID0gdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdO1xuICAgICAgdmFyIHBhcmFtX3Byb3Bvc2FsID0gdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbChwYXJhbV9zdGF0ZSwgdGhpcy5wcm9wX2xvZ19zY2FsZSk7XG4gICAgICBpZihwYXJhbV9wcm9wb3NhbCA8IHRoaXMubG93ZXIgfHwgcGFyYW1fcHJvcG9zYWwgPiB0aGlzLnVwcGVyKSB7XG4gICAgICAgIC8vIE91dHNpZGUgb2YgbGltaXRzIG9mIHRoZSBwYXJhbWV0ZXIsIHJlamVjdCB0aGUgcHJvcG9zYWwgXG4gICAgICAgIC8vIGFuZCBzdGF5IGF0IHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgfSBlbHNlIHsgLy8gbWFrZSBhIE1ldHJvcG9saXMgc3RlcFxuICAgICAgICB2YXIgY3Vycl9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gcGFyYW1fcHJvcG9zYWw7XG4gICAgICAgIHZhciBwcm9wX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpO1xuICAgICAgICB2YXIgYWNjZXB0X3Byb2IgPSBNYXRoLmV4cChwcm9wX2xvZ19kZW5zIC0gY3Vycl9sb2dfZGVucyk7XG4gICAgICAgIGlmKGFjY2VwdF9wcm9iID4gTWF0aC5yYW5kb20oKSkge1xuICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWxcbiAgICAgICAgICBpZih0aGlzLmlzX2FkYXB0aW5nKSB0aGlzLmFjY2VwdGFuY2VfY291bnQrKyA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbVxuICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3N0YXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZih0aGlzLmlzX2FkYXB0aW5nKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiArKztcbiAgICAgICAgaWYodGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID49IHRoaXMuYmF0Y2hfc2l6ZSkgeyAvLyB0aGVuIGFkYXB0XG4gICAgICAgICAgdGhpcy5iYXRjaF9jb3VudCArKztcbiAgICAgICAgICB2YXIgbG9nX3NkX2FkanVzdG1lbnQgPSBcbiAgICAgICAgICAgIE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIFxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gLyBNYXRoLnNxcnQodGhpcy5iYXRjaF9jb3VudCkpO1xuICAgICAgICAgIGlmKHRoaXMuYWNjZXB0YW5jZV9jb3VudCAvIHRoaXMuYmF0Y2hfc2l6ZSA+IHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlICs9IGxvZ19zZF9hZGp1c3RtZW50O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlIC09IGxvZ19zZF9hZGp1c3RtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwO1xuICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07XG4gIH07XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgPSB0cnVlO1xuICB9O1xuICBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBmYWxzZTtcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BfbG9nX3NjYWxlOiB0aGlzLnByb3BfbG9nX3NjYWxlLFxuICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsXG4gICAgICBhY2NlcHRhbmNlX2NvdW50OiB0aGlzLmFjY2VwdGFuY2VfY291bnQsXG4gICAgICBpdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uOiB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24sXG4gICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudFxuICAgIH07XG4gIH07XG4gIFxuICBcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhIE5vcm1hbCBwcm9wb3NhbC5cbiAgICovXG4gIHZhciBub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHtcbiAgICByZXR1cm4gcm5vcm0ocGFyYW1fc3RhdGUgLCBNYXRoLmV4cChwcm9wX2xvZ19zY2FsZSkpO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge09uZWRpbU1ldHJvcG9saXNTdGVwcGVyfVxuICAgKiBBIFwic3ViY2xhc3NcIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgUmVhbE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBub3JtYWxfcHJvcG9zYWwpO1xuICB9O1xuICBcbiAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICAvKipcbiAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGlzY3JldGl6ZWQgTm9ybWFsIHByb3Bvc2FsLlxuICAgKi9cbiAgdmFyIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uKHBhcmFtX3N0YXRlLCBwcm9wX2xvZ19zY2FsZSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHJub3JtKHBhcmFtX3N0YXRlICwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKSk7XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGF1Z21lbnRzIHtPbmVkaW1NZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCk7XG4gIH07XG4gIFxuICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfVxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluXG4gICAqIHRoZSBBZGFwdGl2ZSBNZXRyb3BvbGlzLVdpdGhpbi1HaWJicyBhbGdvcml0aG0gaW4gXCJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DXCJcbiAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KSBmb3IgcG9zc2libHkgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMuIFRoYXRcbiAgICogaXMsIGluc3RlYWQgb2YganVzdCB0YWtpbmcgYSBzdGVwIGZvciBhIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIgbGlrZSBcbiAgICogT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIsIHRoaXMgU3RlcHBlciBpcyByZXNwb25zaWJsZSBmb3IgdGFraW5nIHN0ZXBzIFxuICAgKiBmb3IgYSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5LiBJdCdzIHN0aWxsIHByZXR0eSBkdW1iIGFuZCBqdXN0IHRha2VzXG4gICAqIG9uZS1kaW1lbnNpb25hbCBzdGVwcyBmb3IgZWFjaCBwYXJhbWV0ZXIgY29tcG9uZW50LCB0aG91Z2guXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgYSBcbiAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgICogQHBhcmFtIFN1YlN0ZXBwZXIgLSBhIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSBvZiBvbmUgZGltZW5zaW9uYWwgU3RlcHBlciB0byBhcHBseSBvblxuICAgKiAgIGFsbCB0aGUgY29tcG9uZW50cyBvZiB0aGUgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuXG4gICovXG4gIHZhciBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFN1YlN0ZXBwZXIpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggICE9IDEpIHtcbiAgICAgIHRocm93IFwiTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07XG4gICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyO1xuICAgIHRoaXMudXBwZXIgPSBwYXJhbS51cHBlcjtcbiAgICB0aGlzLmRpbSA9IHBhcmFtLmRpbTtcbiAgXG4gICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwicHJvcF9sb2dfc2NhbGVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDApO1xuICAgIHRoaXMuYmF0Y2hfc2l6ZSAgICAgICAgID0gZ2V0X211bHRpZGltX29wdGlvbihcImJhdGNoX3NpemVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDUwKTtcbiAgICB0aGlzLm1heF9hZGFwdGF0aW9uICAgICA9IGdldF9tdWx0aWRpbV9vcHRpb24oXCJtYXhfYWRhcHRhdGlvblwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMC4zMyk7XG4gICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwiaW5pdGlhbF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIHRoaXMuZGltLCAxLjApO1xuICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X211bHRpZGltX29wdGlvbihcInRhcmdldF9hY2NlcHRfcmF0ZVwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMC40NCk7XG4gICAgdGhpcy5pc19hZGFwdGluZyAgICAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwiaXNfYWRhcHRpbmdcIiwgb3B0aW9ucywgdGhpcy5kaW0sIHRydWUpO1xuICAgIFxuICAgIC8vIFRoaXMgaGFjayBiZWxvdyBpcyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJyYXkgb2YgXG4gICAgLy8gb25lIGRpbWVuc2lvbmFsIHN0ZXBwZXJzIGFjY29yZGluZyB0byBkaW0uXG4gICAgdmFyIGNyZWF0ZV9zdWJzdGVwcGVycyA9IFxuICAgICAgZnVuY3Rpb24oZGltLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHByb3BfbG9nX3NjYWxlLCBiYXRjaF9zaXplLCBtYXhfYWRhcHRhdGlvbiwgaW5pdGlhbF9hZGFwdGF0aW9uLCB0YXJnZXRfYWNjZXB0X3JhdGUsIGlzX2FkYXB0aW5nKSB7XG4gICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTtcbiAgICAgIGlmKGRpbS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgdmFyIHN1Ym9wdGlvbnMgPSB7cHJvcF9sb2dfc2NhbGU6IHByb3BfbG9nX3NjYWxlW2ldLCBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLFxuICAgICAgICAgICAgbWF4X2FkYXB0YXRpb246IG1heF9hZGFwdGF0aW9uW2ldLCBpbml0aWFsX2FkYXB0YXRpb246IGluaXRpYWxfYWRhcHRhdGlvbltpXSxcbiAgICAgICAgICAgIHRhcmdldF9hY2NlcHRfcmF0ZTogdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZzogaXNfYWRhcHRpbmdbaV19O1xuICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307XG4gICAgICAgICAgICBzdWJwYXJhbVtpXSA9IGRlZXBfY2xvbmUocGFyYW0pO1xuICAgICAgICAgICAgc3VicGFyYW1baV0uZGltID0gWzFdOyAvLyBBcyB0aGlzIHNob3VsZCBub3cgYmUgYSBvbmUtZGltIHBhcmFtZXRlclxuICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWRcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBTdWJTdGVwcGVyKHN1YnBhcmFtLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHN1Ym9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IGNyZWF0ZV9zdWJzdGVwcGVycyhkaW0uc2xpY2UoMSksIHN1YnN0YXRlW2ldLCBsb2dfcG9zdCwgcHJvcF9sb2dfc2NhbGVbaV0sIFxuICAgICAgICAgICAgYmF0Y2hfc2l6ZVtpXSwgbWF4X2FkYXB0YXRpb25baV0sIGluaXRpYWxfYWRhcHRhdGlvbltpXSwgdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZ1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdGVwcGVycztcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBjcmVhdGVfc3Vic3RlcHBlcnModGhpcy5kaW0sIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSwgdGhpcy5sb2dfcG9zdCxcbiAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUsIHRoaXMuYmF0Y2hfc2l6ZSwgdGhpcy5tYXhfYWRhcHRhdGlvbiwgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24sXG4gICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSwgdGhpcy5pc19hZGFwdGluZyk7XG4gICAgXG4gIH07XG4gIFxuICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEdvIHRocm91Z2ggdGhlIHN1YnN0ZXBwZXJzIGluIGEgcmFuZG9tIG9yZGVyIGFuZCBjYWxsIHN0ZXAoKSBvbiB0aGVtLlxuICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtyZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7IH0pO1xuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7c3Vic3RlcHBlci5zdGFydF9hZGFwdGF0aW9uKCk7IH0pO1xuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtzdWJzdGVwcGVyLnN0b3BfYWRhcHRhdGlvbigpOyB9KTtcbiAgfTtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtcbiAgICAgIHJldHVybiBzdWJzdGVwcGVyLmluZm8oKTsgXG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBhdWdtZW50cyB7TXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgUmVhbE1ldHJvcG9saXNTdGVwcGVyKTtcbiAgfTtcbiAgXG4gIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7XG5cbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9XG4gICAqIEEgXCJzdWJjbGFzc1wiIG9mIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqLyAgICBcbiAgdmFyIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgSW50TWV0cm9wb2xpc1N0ZXBwZXIpO1xuICB9O1xuICBcbiAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGEgc3RlcCBmb3IgYSBiaW5hcnkgcGFyYW1ldGVyLlxuICAgKiBUaGlzIGlzIGRvbmUgYnkgZXZhbHVhdGluZyB0aGUgbG9nIHBvc3RlcmlvciBmb3IgYm90aCBzdGF0ZXMgb2YgdGhlXG4gICAqIHBhcmFtZXRlciBhbmQgdGhlbiBzZWxlY3RpbmcgYSBzdGF0ZSByYW5kb21seSB3aXRoIHByb2JhYmlsaXR5IHJlbGF0aXZlIFxuICAgKiB0byB0aGUgcG9zdGVyaW9yIG9mIGVhY2ggc3RhdGUuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEJpbmFyeVN0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7XG4gICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIGlmKHBhcmFtX25hbWVzLmxlbmd0aCAgPT0gMSkge1xuICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiQmluYXJ5U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICB9O1xuICBcbiAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5U3RlcHBlcjtcbiAgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSAwO1xuICAgIHZhciB6ZXJvX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpO1xuICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDE7XG4gICAgdmFyIG9uZV9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICB2YXIgbWF4X2xvZ19kZW5zID0gTWF0aC5tYXgoemVyb19sb2dfZGVucywgb25lX2xvZ19kZW5zKTtcbiAgICB6ZXJvX2xvZ19kZW5zIC09IG1heF9sb2dfZGVucztcbiAgICBvbmVfbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zO1xuICAgIHZhciB6ZXJvX3Byb2IgPSBNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zIC0gTWF0aC5sb2coIE1hdGguZXhwKHplcm9fbG9nX2RlbnMpICsgTWF0aC5leHAob25lX2xvZ19kZW5zKSApICk7XG4gICAgaWYoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikge1xuICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC5cbiAgICByZXR1cm4gMTtcbiAgfTtcbiAgXG4gICAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogSnVzdCBsaWtlIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgdGhpcyBTdGVwcGVyIHRha2VzIGEgc3RlcHMgZm9yXG4gICAqIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgYnkgdXBkYXRpbmcgZWFjaCBjb21wb25lbnQgaW4gdHVybi4gVGhlIGRpZmZlcmVuY2VcbiAgICogaXMgdGhhdCB0aGlzIHN0ZXBwZXIgd29ya3Mgb24gYmluYXJ5IHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgYSBcbiAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7XG4gICAgXG4gICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIGlmKHBhcmFtX25hbWVzLmxlbmd0aCAgPT0gMSkge1xuICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07XG4gICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdO1xuICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiQmluYXJ5Q29tcG9uZW50U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIFxuICAgIHZhciBjcmVhdGVfc3Vic3RlcHBlcnMgPSBcbiAgICAgIGZ1bmN0aW9uKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0KSB7XG4gICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTtcbiAgICAgIHZhciBpO1xuICAgICAgaWYoZGltLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykge1xuICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTtcbiAgICAgICAgICBzdWJwYXJhbXNbaV0gPSBwYXJhbTtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBCaW5hcnlTdGVwcGVyKHN1YnBhcmFtcywgc3Vic3RhdGUsIGxvZ19wb3N0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IGNyZWF0ZV9zdWJzdGVwcGVycyhkaW0uc2xpY2UoMSksIHN1YnN0YXRlW2ldLCBsb2dfcG9zdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdGVwcGVycztcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBjcmVhdGVfc3Vic3RlcHBlcnModGhpcy5kaW0sIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSwgdGhpcy5sb2dfcG9zdCk7XG4gIH07XG4gIFxuICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlDb21wb25lbnRTdGVwcGVyO1xuICBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEdvIHRocm91Z2ggdGhlIHN1YnN0ZXBwZXJzIGluIGEgcmFuZG9tIG9yZGVyIGFuZCBjYWxsIHN0ZXAoKSBvbiB0aGVtLlxuICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtyZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7IH0pO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogVGhpcyBzdGVwcGVyIGNhbiBiZSByZXNwb25zaWJsZSBmb3IgdGFraW5nIGEgc3RlcCBmb3Igb25lIG9yIG1vcmUgcGFyYW1ldGVycy5cbiAgICogRm9yIHJlYWwgYW5kIGludCBwYXJhbWV0ZXJzIGl0IHRha2VzIE1ldHJvcG9saXMgd2l0aGluIEdpYmJzIHN0ZXBzLCBhbmQgZm9yIFxuICAgKiBiaW5hcnkgcGFyYW1ldGVycyBpdCBkb2VzIGV2YWx1YXRlcyB0aGUgcG9zdGVyaW9yIGZvciBib3RoIHBhcmFtdGVyIHZhbHVlcyBhbmRcbiAgICogcmFuZG9tbHkgY2hhbmdlcyB0byBhIGNlcnRhaW4gdmFsdWUgcHJvcG9ydGlvbmFsbHkgdG8gdGhhdCB2YWx1ZSdzIHBvc3RlcmlvclxuICAgKiAodGhpcyBpcyBhbHNvIGRvbmUgZm9yIGVhY2ggcGFyYW1ldGVyLCBzbyBhbHNvIGEgKiB3aXRoaW4gR2liYnMgYXBwcm9hY2gpLlxuICAgKiBUaGlzIHN0ZXBwZXIgaXMgYWxzbyBhZGFwdGl2ZSBhbmQgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyc1xuICAgKiBhcmUgbm90IHRvbyBoaWdoIGFuZCB0aGUgY29ycmVsYXRpb25zIGJldHdlZW4gcGFyYW1ldGVycyBhcmUgbG93LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnNcbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEFtd2dTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgdGhpcy5zdWJzdGVwcGVycyA9IFtdO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV07XG4gICAgICB2YXIgU2VsZWN0U3RlcHBlcjtcbiAgICAgIHN3aXRjaCAocGFyYW0udHlwZSkge1xuICAgICAgICBjYXNlIFwicmVhbFwiOlxuICAgICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImludFwiOlxuICAgICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEludE1ldHJvcG9saXNTdGVwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJiaW5hcnlcIjpcbiAgICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgXCJBbXdnU3RlcHBlciBjYW4ndCBoYW5kbGUgcGFyYW1ldGVyIFwiICsgdGhpcy5wYXJhbV9uYW1lc1tpXSAgK1wiIHdpdGggdHlwZSBcIiArIHBhcmFtLnR5cGU7IFxuICAgICAgfVxuICAgICAgdmFyIHBhcmFtX29iamVjdF93cmFwID0ge307XG4gICAgICBwYXJhbV9vYmplY3Rfd3JhcFt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHBhcmFtO1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICB2YXIgcGFyYW1fb3B0aW9ucyA9IG9wdGlvbnMucGFyYW1zICYmIG9wdGlvbnMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dIHx8IHt9O1xuICAgICAgcGFyYW1fb3B0aW9ucy5wcm9wX2xvZ19zY2FsZSAgICAgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlICAgICB8fCBvcHRpb25zLnByb3BfbG9nX3NjYWxlOyBcbiAgICAgIHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSAgICAgICAgID0gcGFyYW1fb3B0aW9ucy5iYXRjaF9zaXplICAgICAgICAgfHwgb3B0aW9ucy5iYXRjaF9zaXplOyBcbiAgICAgIHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gICAgID0gcGFyYW1fb3B0aW9ucy5tYXhfYWRhcHRhdGlvbiAgICAgfHwgb3B0aW9ucy5tYXhfYWRhcHRhdGlvbjtcbiAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247XG4gICAgICBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSA9IHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlIHx8IG9wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlOyBcbiAgICAgIHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgICAgICAgID0gcGFyYW1fb3B0aW9ucy5pc19hZGFwdGluZyAgICAgICAgfHwgb3B0aW9ucy5pc19hZGFwdGluZzsgXG4gICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldID0gbmV3IFNlbGVjdFN0ZXBwZXIocGFyYW1fb2JqZWN0X3dyYXAsIHN0YXRlLCBsb2dfcG9zdCwgcGFyYW1fb3B0aW9ucyk7XG4gICAgfVxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU3RlcHBlcjtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGVwKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGFydF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpO1xuICAgIH0gXG4gIH07XG4gIFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbmZvID0ge307XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGluZm9bdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnN1YnN0ZXBwZXJzW2ldLmluZm8oKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH07XG4gIFxuICBcbiAgXG4gIC8vLy8vLy8vLy8vIFNhbXBsZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgXG4gICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYVxuICAvLyBTYW1wbGVyIGlzIGhlcmUgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB3aGVyZSBhbiBpbnN0YW5jZSBvZiBTYW1wbGVyXG4gIC8vIHNldHMgdXAgdGhlIFN0ZXBwZXJzLCBjaGVja3MgdGhlIHBhcmFtZXRlciBkZWZpbml0aW9uLFxuICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyIFwiaW50ZXJmYWNlXCIuXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6XG4gICAqICAge1wibXVcIjoge1widHlwZVwiOiBcInJlYWxcIn0sIFwic2lnbWFcIjoge1widHlwZVwiOiBcInJlYWxcIiwgXCJsb3dlclwiID0gMH19XG4gICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBkb2Vzbid0IGhhdmUgdG8gYmUgXCJjb21wbGV0ZVwiIGFuZCBwcm9wZXJ0aWVzXG4gICAqICAgbGVmdCBvdXQgKGxpa2UgbG93ZXIgYW5kIHVwcGVyKSB3aWxsIGJlIGZpbGxlZCBpbiBieSBkZWZhdWx0cy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmVcbiAgICogICBzdGF0ZSB3aWxsIGJlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN0YXRlIHdpdGggZWFjaCBwYXJhbWV0ZXIgYXMgYSBcbiAgICogICBrZXkgYW5kIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFzIG51bWJlcnMgb3IgYXJyYXlzLiBGb3IgZXhhbXBsZTpcbiAgICogICB7XCJtdVwiOiAzLCBcInNpZ21hXCI6IDEuNX0uIFRoZSBkYXRhIGFyZ3VtZW50IHdpbGwgYmUgdGhlIHNhbWUgb2JqZWN0IGFzIFxuICAgKiAgIHRoZSBkYXRhIGFyZ3VtZW50IGdpdmVuIGJlbG93LlxuICAgKiBAcGFyYW0gZGF0YSAtIGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBsb2dfcG9zdCBmdW5jdGlvblxuICAgKiAgIHdoZW4gc2FtcGxpbmcuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc2FtcGxlci5cbiAgICovXG4gIHZhciBTYW1wbGVyID0gZnVuY3Rpb24ocGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucykge1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5wYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBcbiAgICAvLyBTZXR0aW5nIGRlZmF1bHQgb3B0aW9ucyBpZiBub3QgcGFzc2VkIHRocm91Z2ggdGhlIG9wdGlvbnMgb2JqZWN0XG4gICAgdGhpcy5wYXJhbV9pbml0X2Z1biAgID0gZ2V0X29wdGlvbihcInBhcmFtX2luaXRfZnVuXCIsIG9wdGlvbnMsIHBhcmFtX2luaXRfZml4ZWQpO1xuICAgIHZhciB0aGlubmluZ19pbnRlcnZhbCA9IGdldF9vcHRpb24oXCJ0aGluXCIsIG9wdGlvbnMsIDEpO1xuICAgIHZhciBwYXJhbXNfdG9fbW9uaXRvciA9IGdldF9vcHRpb24oXCJtb25pdG9yXCIsIG9wdGlvbnMsIG51bGwpO1xuICAgIHRoaXMudGhpbih0aGlubmluZ19pbnRlcnZhbCk7XG4gICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIC8vIENvbXBsZXRpbmcgdGhlIHBhcmFtcyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBzdGF0ZS5cbiAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7XG4gICAgdmFyIHN0YXRlID0ge307XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1fbmFtZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7XG4gICAgfVxuICAgIHRoaXMubG9nX3Bvc3QgPSBmdW5jdGlvbigpIHsgXG4gICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpO1xuICAgIH07XG4gICAgLy8gUnVubmluZyB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24gb25jZSBpbiBjYXNlIGl0IGZ1cnRoZXIgbW9kaWZpZXMgdGhlIHN0YXRlXG4gICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy5cbiAgICB0aGlzLmxvZ19wb3N0KCk7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpO1xuICB9O1xuICBcbiAgLyoqIFNob3VsZCByZXR1cm4gYSB2ZWN0b3Igb2Ygc3RlcHBlcnMgdGhhdCB3aGVuIGNhbGxlZCBcbiAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuXG4gICAqL1xuICBTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uKHN0YXRlLCBsb2dfcG9zdCl7XG4gICAgdGhyb3cgXCJFdmVyeSBTYW1wbGVyIG5lZWRzIHRvIGltcGxlbWVudCBjcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSgpXCI7XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgU2FtcGxlci5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtzdGF0ZTogdGhpcy5zdGF0ZSwgdGhpbjogdGhpcy50aGluLCBtb25pdG9yOiB0aGlzLm1vbml0b3IsXG4gICAgICAgICAgICBzdGVwcGVyczogdGhpcy5zdGVwcGVyc307XG4gIH07XG4gIFxuICAvKiogVGFrZXMgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuIFJldHVybnMgdGhlIG5ldyBzcGFjZVxuICAgKiBidXQgYWxzbyBtb2RpZmllcyB0aGUgc3RhdGUgaW4gcGxhY2UuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdGVwcGVycyk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RlcCgpO1xuICAgIH1cbiAgICBpZihPYmplY3Qua2V5cyh0aGlzLnN0YXRlKS5sZW5ndGggPiBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcykubGVuZ3RoKSB7XG4gICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2VcbiAgICAgIC8vIG5lZWQgdG8gcnVuIHRoZSBsb2dfcG9zdCBvbmNlIG1vcmUgaW4gb3JkZXIgdG8gc2V0IHRoZSBkZXJpdmVkIHF1YW50aXRpZXNcbiAgICAgIC8vIGZvciB0aGUgZmluYWwgcGFyYW1ldGVyIHN0YXRlXG4gICAgICB0aGlzLmxvZ19wb3N0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIG5faXRlcmF0aW9ucyBzdGVwcyBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlIGFuZCByZXR1cm5zIHRoZW1cbiAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZTpcbiAgICoge211OiBbMSwgLTEsIDIsIDMsIC4uLl0sIHNpZ21hOiBbMSwgMiwgMiwgMSwgLi4uXX0uXG4gICAqIElmIHRoaW4gaXMgPiAxIHRoZW4gbl9pdGVyYXRpb25zIC8gdGhpbiBzYW1wbGVzIGFyZSByZXR1cm5lZC5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5zYW1wbGUgPSBmdW5jdGlvbihuX2l0ZXJhdGlvbnMpIHtcbiAgICAgIC8vIEluaXRpYWxpemluZyBjdXJyX3NhbXBsZSB3aGVyZSB0aGUgc2FtcGxlIGlzIGdvaW5nIHRvIGJlIHNhdmVkXG4gICAgICAvLyBhcyBhbiBvYmplY3QgY29udGFpbmluZyBvbmUgYXJyYXkgcGVyIHBhcmFtZXRlciB0byBiZSBtb25pdG9yZWQuXG4gICAgICB2YXIgaSwgaiwgbW9uaXRvcmVkX3BhcmFtcztcbiAgICAgIGlmKHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9PT0gbnVsbCkge1xuICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gdGhpcy5tb25pdG9yZWRfcGFyYW1zO1xuICAgICAgfVxuICAgICAgXG4gICAgICB2YXIgY3Vycl9zYW1wbGUgPSB7fTtcbiAgICAgIGZvcihqID0gMDsgaiA8IG1vbml0b3JlZF9wYXJhbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY3Vycl9zYW1wbGVbbW9uaXRvcmVkX3BhcmFtc1tqXV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZm9yKGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHtcbiAgICAgICAgaWYoaSAlIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPT09IDApIHtcbiAgICAgICAgICBmb3IoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW0gPSBtb25pdG9yZWRfcGFyYW1zW2pdO1xuICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goIGNsb25lX3BhcmFtX2RyYXcodGhpcy5zdGF0ZVtwYXJhbV0pICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RlcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJfc2FtcGxlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIG5faXRlcmF0aW9uIHN0ZXBzIGluIHBhcmFtZXRlciBzcGFjZSBidXQgcmV0dXJucyBub3RoaW5nLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLmJ1cm4gPSBmdW5jdGlvbihuX2l0ZXJhdGlvbnMpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcCgpO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBTZXRzIHdoYXQgcGFyYW1ldGVycyBzaG91bGQgYmUgbW9uaXRvcmVkIGFuZCByZXR1cm5lZCB3aGVuIGNhbGxpbmdcbiAgICogc2FtcGxlLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLm1vbml0b3IgPSBmdW5jdGlvbihwYXJhbXNfdG9fbW9uaXRvcikge1xuICAgICAgdGhpcy5tb25pdG9yZWRfcGFyYW1zID0gcGFyYW1zX3RvX21vbml0b3I7XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyB0aGUgdGhpbm5pbmcuIEZvciBleGFtcGxlIHRoaW4gPT0gMTAgbWVhbnMgdGhhdCBldmVyeSAxMHRoIHBvc3RlcmlvclxuICAgKiBkcmF3IHdpbGwgYmUga2VwdC5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS50aGluID0gZnVuY3Rpb24odGhpbm5pbmdfaW50ZXJ2YWwpIHtcbiAgICB0aGlzLnRoaW5uaW5nX2ludGVydmFsID0gdGhpbm5pbmdfaW50ZXJ2YWw7XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyBhZGFwdGF0aW9uIG9uLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTtcbiAgICB9XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBTZXRzIGFkYXB0YXRpb24gb2ZmLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1NhbXBsZXJ9XG4gICAqIFRoaXMgc2FtcGxlciB1c2VzIHRoZSBBbXdnU3RlcHBlciBhcyB0aGUgc3RlcHBlciBmdW5jdGlvbiB3aGljaCBpbXBsZW1lbnRzIHRoZSBcbiAgICogQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluIFwiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQ1wiXG4gICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkuIEFuIGFkaXRpb24gaXMgdGhhdCBpdCBoYW5kbGVzIGludCBwYXJhbWV0ZXJzXG4gICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgXG4gICAqIHZhbHVlIHByb3BvcnRpb25hbCB0byB0aGUgcG9zdGVyaW9yIG9mIHRoZSB0d28gcG9zc2libGUgc3RhdGVzIG9mIHRoZVxuICAgKiBwYXJhbWV0ZXIuIFRoaXMgc2FtcGxlciBjYW4gYmUgZWZmaWNpZW50IHdoZW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIG9uZSBvciBtb3JlIHBhcmFtZXRlciBkZWZpbml0aW9uc1xuICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLlxuICAqL1xuICB2YXIgQW13Z1NhbXBsZXIgPSBmdW5jdGlvbihwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7XG4gICAgU2FtcGxlci5jYWxsKHRoaXMsIHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpO1xuICB9O1xuICBcbiAgQW13Z1NhbXBsZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTYW1wbGVyLnByb3RvdHlwZSk7IFxuICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU2FtcGxlcjtcbiAgXG4gIEFtd2dTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKXtcbiAgICByZXR1cm4gWyBuZXcgQW13Z1N0ZXBwZXIocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIF07XG4gIH07XG4gIFxuICBcbiAgLy8gUmV0dXJuaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgcHVibGljbHkgZXhwb3NlZCBieSB0aGlzIG1vZHVsZVxuICByZXR1cm4ge1xuICAgIHJ1bmlmOiBydW5pZixcbiAgICBydW5pZl9kaXNjcmV0ZTogcnVuaWZfZGlzY3JldGUsXG4gICAgcm5vcm06IHJub3JtLFxuICAgIHBhcmFtX2luaXRfZml4ZWQ6IHBhcmFtX2luaXRfZml4ZWQsIFxuICAgIGNvbXBsZXRlX3BhcmFtczogY29tcGxldGVfcGFyYW1zLCBcbiAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwgXG4gICAgSW50TWV0cm9wb2xpc1N0ZXBwZXI6IEludE1ldHJvcG9saXNTdGVwcGVyLCBcbiAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjogTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIEJpbmFyeVN0ZXBwZXI6IEJpbmFyeVN0ZXBwZXIsIFxuICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI6IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIsIFxuICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwgXG4gICAgQW13Z1NhbXBsZXI6IEFtd2dTYW1wbGVyXG4gIH07XG59KSk7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA9PSBudWxsIHx8IGIgPT0gbnVsbCA/IE5hTiA6IGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbnVtYmVyKHgpIHtcbiAgcmV0dXJuIHggPT09IG51bGwgPyBOYU4gOiAreDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBudW1iZXJzKHZhbHVlcywgdmFsdWVvZikge1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IHBlcm11dGUgZnJvbSBcIi4vcGVybXV0ZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0KHZhbHVlcywgLi4uRikge1xuICBpZiAodHlwZW9mIHZhbHVlc1tTeW1ib2wuaXRlcmF0b3JdICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWx1ZXMgaXMgbm90IGl0ZXJhYmxlXCIpO1xuICB2YWx1ZXMgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gIGxldCBbZl0gPSBGO1xuICBpZiAoKGYgJiYgZi5sZW5ndGggIT09IDIpIHx8IEYubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChkLCBpKSA9PiBpKTtcbiAgICBpZiAoRi5sZW5ndGggPiAxKSB7XG4gICAgICBGID0gRi5tYXAoZiA9PiB2YWx1ZXMubWFwKGYpKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIEYpIHtcbiAgICAgICAgICBjb25zdCBjID0gYXNjZW5kaW5nRGVmaW5lZChmW2ldLCBmW2pdKTtcbiAgICAgICAgICBpZiAoYykgcmV0dXJuIGM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmID0gdmFsdWVzLm1hcChmKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IGFzY2VuZGluZ0RlZmluZWQoZltpXSwgZltqXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcGVybXV0ZSh2YWx1ZXMsIGluZGV4KTtcbiAgfVxuICByZXR1cm4gdmFsdWVzLnNvcnQoY29tcGFyZURlZmluZWQoZikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZURlZmluZWQoY29tcGFyZSA9IGFzY2VuZGluZykge1xuICBpZiAoY29tcGFyZSA9PT0gYXNjZW5kaW5nKSByZXR1cm4gYXNjZW5kaW5nRGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBjb21wYXJlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjb21wYXJlIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTtcbiAgICBpZiAoeCB8fCB4ID09PSAwKSByZXR1cm4geDtcbiAgICByZXR1cm4gKGNvbXBhcmUoYiwgYikgPT09IDApIC0gKGNvbXBhcmUoYSwgYSkgPT09IDApO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNjZW5kaW5nRGVmaW5lZChhLCBiKSB7XG4gIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1pbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbjtcbn1cbiIsImltcG9ydCB7YXNjZW5kaW5nRGVmaW5lZCwgY29tcGFyZURlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcXVpY2tzZWxlY3Rcbi8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWlja3NlbGVjdChhcnJheSwgaywgbGVmdCA9IDAsIHJpZ2h0ID0gSW5maW5pdHksIGNvbXBhcmUpIHtcbiAgayA9IE1hdGguZmxvb3Ioayk7XG4gIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTtcbiAgcmlnaHQgPSBNYXRoLmZsb29yKE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIHJpZ2h0KSk7XG5cbiAgaWYgKCEobGVmdCA8PSBrICYmIGsgPD0gcmlnaHQpKSByZXR1cm4gYXJyYXk7XG5cbiAgY29tcGFyZSA9IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IGFzY2VuZGluZ0RlZmluZWQgOiBjb21wYXJlRGVmaW5lZChjb21wYXJlKTtcblxuICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdCA9IGFycmF5W2tdO1xuICAgIGxldCBpID0gbGVmdDtcbiAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgc3dhcChhcnJheSwgbGVmdCwgayk7XG4gICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTtcblxuICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbaV0sIHQpIDwgMCkgKytpO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbal0sIHQpID4gMCkgLS1qO1xuICAgIH1cblxuICAgIGlmIChjb21wYXJlKGFycmF5W2xlZnRdLCB0KSA9PT0gMCkgc3dhcChhcnJheSwgbGVmdCwgaik7XG4gICAgZWxzZSArK2osIHN3YXAoYXJyYXksIGosIHJpZ2h0KTtcblxuICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICBpZiAoayA8PSBqKSByaWdodCA9IGogLSAxO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBzd2FwKGFycmF5LCBpLCBqKSB7XG4gIGNvbnN0IHQgPSBhcnJheVtpXTtcbiAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgYXJyYXlbal0gPSB0O1xufVxuIiwiaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbmltcG9ydCBtYXhJbmRleCBmcm9tIFwiLi9tYXhJbmRleC5qc1wiO1xuaW1wb3J0IG1pbiBmcm9tIFwiLi9taW4uanNcIjtcbmltcG9ydCBtaW5JbmRleCBmcm9tIFwiLi9taW5JbmRleC5qc1wiO1xuaW1wb3J0IHF1aWNrc2VsZWN0IGZyb20gXCIuL3F1aWNrc2VsZWN0LmpzXCI7XG5pbXBvcnQgbnVtYmVyLCB7bnVtYmVyc30gZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge2FzY2VuZGluZ0RlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBncmVhdGVzdCBmcm9tIFwiLi9ncmVhdGVzdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHtcbiAgdmFsdWVzID0gRmxvYXQ2NEFycmF5LmZyb20obnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpKTtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpO1xuICBpZiAocCA+PSAxKSByZXR1cm4gbWF4KHZhbHVlcyk7XG4gIHZhciBuLFxuICAgICAgaSA9IChuIC0gMSkgKiBwLFxuICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLFxuICAgICAgdmFsdWUwID0gbWF4KHF1aWNrc2VsZWN0KHZhbHVlcywgaTApLnN1YmFycmF5KDAsIGkwICsgMSkpLFxuICAgICAgdmFsdWUxID0gbWluKHZhbHVlcy5zdWJhcnJheShpMCArIDEpKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZVNvcnRlZCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1swXSwgMCwgdmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9ICt2YWx1ZW9mKHZhbHVlc1tpMF0sIGkwLCB2YWx1ZXMpLFxuICAgICAgdmFsdWUxID0gK3ZhbHVlb2YodmFsdWVzW2kwICsgMV0sIGkwICsgMSwgdmFsdWVzKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZUluZGV4KHZhbHVlcywgcCwgdmFsdWVvZiA9IG51bWJlcikge1xuICBpZiAoaXNOYU4ocCA9ICtwKSkgcmV0dXJuO1xuICBudW1iZXJzID0gRmxvYXQ2NEFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSk7XG4gIGlmIChwIDw9IDApIHJldHVybiBtaW5JbmRleChudW1iZXJzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heEluZGV4KG51bWJlcnMpO1xuICB2YXIgbnVtYmVycyxcbiAgICAgIGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChfLCBpKSA9PiBpKSxcbiAgICAgIGogPSBudW1iZXJzLmxlbmd0aCAtIDEsXG4gICAgICBpID0gTWF0aC5mbG9vcihqICogcCk7XG4gIHF1aWNrc2VsZWN0KGluZGV4LCBpLCAwLCBqLCAoaSwgaikgPT4gYXNjZW5kaW5nRGVmaW5lZChudW1iZXJzW2ldLCBudW1iZXJzW2pdKSk7XG4gIGkgPSBncmVhdGVzdChpbmRleC5zdWJhcnJheSgwLCBpICsgMSksIChpKSA9PiBudW1iZXJzW2ldKTtcbiAgcmV0dXJuIGkgPj0gMCA/IGkgOiAtMTtcbn1cbiIsImltcG9ydCBxdWFudGlsZSwge3F1YW50aWxlSW5kZXh9IGZyb20gXCIuL3F1YW50aWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgcmV0dXJuIHF1YW50aWxlKHZhbHVlcywgMC41LCB2YWx1ZW9mKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lZGlhbkluZGV4KHZhbHVlcywgdmFsdWVvZikge1xuICByZXR1cm4gcXVhbnRpbGVJbmRleCh2YWx1ZXMsIDAuNSwgdmFsdWVvZik7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHtcbiAgdGhpcy5rID0gaztcbiAgdGhpcy54ID0geDtcbiAgdGhpcy55ID0geTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSxcbiAgc2NhbGU6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gayA9PT0gMSA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuayAqIGssIHRoaXMueCwgdGhpcy55KTtcbiAgfSxcbiAgdHJhbnNsYXRlOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIHggPT09IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlzLmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldO1xuICB9LFxuICBhcHBseVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geCAqIHRoaXMuayArIHRoaXMueDtcbiAgfSxcbiAgYXBwbHlZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24obG9jYXRpb24pIHtcbiAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdO1xuICB9LFxuICBpbnZlcnRYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuICh4IC0gdGhpcy54KSAvIHRoaXMuaztcbiAgfSxcbiAgaW52ZXJ0WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7XG4gIH0sXG4gIHJlc2NhbGVYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7XG4gIH0sXG4gIHJlc2NhbGVZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkuY29weSgpLmRvbWFpbih5LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSwgdGhpcykubWFwKHkuaW52ZXJ0LCB5KSk7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyB0aGlzLnggKyBcIixcIiArIHRoaXMueSArIFwiKSBzY2FsZShcIiArIHRoaXMuayArIFwiKVwiO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0gbmV3IFRyYW5zZm9ybSgxLCAwLCAwKTtcblxudHJhbnNmb3JtLnByb3RvdHlwZSA9IFRyYW5zZm9ybS5wcm90b3R5cGU7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlKSB7XG4gIHdoaWxlICghbm9kZS5fX3pvb20pIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHJldHVybiBub2RlLl9fem9vbTtcbn1cbiIsIlxuLypcbiAgSFRETWF0aCBTdGF0aWMgQ2xhc3MgLSBOb3QgaW50ZW5kZWQgZm9yIGluc3RhbnRpYXRpb24hXG5cbiAgVmFyaWFibGVzOlxuICAgIEEgPSBhbW91bnRcbiAgICBEID0gZGVsYXlcbiAgICBWID0gc3ViamVjdGl2ZSB2YWx1ZVxuXG4gICAgayA9IGRpc2NvdW50IGZhY3RvclxuXG4gIEVxdWF0aW9uczpcbiAgICBWID0gQSAvICgxICsga0QpXG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSFRETWF0aCB7XG4gIHN0YXRpYyBhZGsydihhLCBkLCBrKSB7XG4gICAgcmV0dXJuIGEgLyAoMSArIGsgKiBkKTtcbiAgfVxuXG4gIHN0YXRpYyBhZHYyayhhLCBkLCB2KSB7XG4gICAgcmV0dXJuIChhIC0gdikgLyAodiAqIGQpO1xuICB9XG59XG4iLCJcbi8vIEludGVybmFsIGRlcGVuZGVuY2llc1xuaW1wb3J0IEhURE1hdGggZnJvbSAnLi9odGQtbWF0aCc7XG5cbmV4cG9ydCBkZWZhdWx0IEhURE1hdGg7XG4iLCIvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1nbG9iYWxzOiBbXCJvZmZcIiwgXCJzZWxmXCJdICovXG5cbi8vIE5lZWRlZCBmb3IgZDMgaW4gV2ViV29ya2VyIVxuaW1wb3J0ICdyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUnO1xuXG5pbXBvcnQgKiBhcyBCYXllc0Rpc3RyaWJ1dGlvbnMgZnJvbSAnYmF5ZXMuanMvZGlzdHJpYnV0aW9ucyc7XG5pbXBvcnQgKiBhcyBCYXllc01jbWMgZnJvbSAnYmF5ZXMuanMvbWNtYyc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgSFRETWF0aCBmcm9tICdAZGVjaWRhYmxlcy9kaXNjb3VudGFibGUtbWF0aCc7XG5cbnNlbGYub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBrOiB7dHlwZTogJ3JlYWwnLCBsb3dlcjogMCwgdXBwZXI6IDEwMH0sXG4gICAgbHVjZToge3R5cGU6ICdyZWFsJywgbG93ZXI6IDAsIHVwcGVyOiAxMDB9LFxuICB9O1xuXG4gIGNvbnN0IGxvZ1Bvc3QgPSAoc3RhdGUsIGRhdGEpID0+IHtcbiAgICBsZXQgbHAgPSAwO1xuXG4gICAgLy8gUHJpb3JzXG4gICAgY29uc3Qga01lYW4gPSAyO1xuICAgIGNvbnN0IGtTaGFwZSA9IDM7XG4gICAgbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLmdhbW1hKFxuICAgICAgc3RhdGUuayxcbiAgICAgIGtTaGFwZSxcbiAgICAgIGtTaGFwZSAvIGtNZWFuLFxuICAgICk7XG4gICAgLy8gbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLnVuaWYoc3RhdGUuaywgMCwgMTAwKTtcblxuICAgIGNvbnN0IGx1Y2VNZWFuID0gMjtcbiAgICBjb25zdCBsdWNlU2hhcGUgPSAzO1xuICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5nYW1tYShcbiAgICAgIHN0YXRlLmx1Y2UsXG4gICAgICBsdWNlU2hhcGUsXG4gICAgICBsdWNlU2hhcGUgLyBsdWNlTWVhbixcbiAgICApO1xuICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7XG5cbiAgICAvLyBMaWtlbGlob29kXG4gICAgZGF0YS5mb3JFYWNoKChjaG9pY2UpID0+IHtcbiAgICAgIC8vIFZhbHVlc1xuICAgICAgY29uc3QgdnMgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hcywgY2hvaWNlLmRzLCBzdGF0ZS5rKTtcbiAgICAgIGNvbnN0IHZsID0gSFRETWF0aC5hZGsydihjaG9pY2UuYWwsIGNob2ljZS5kbCwgc3RhdGUuayk7XG5cbiAgICAgIC8vIENob2ljZSBvZiBzb29uZXIgb3IgbGF0ZXIgaXMgc2FtcGxlZCBmcm9tIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvblxuICAgICAgLy8gTHVjZSBjaG9pY2UgcnVsZSBpcyB1c2VkIHRvIGNvbXB1dGUgcHJvYmFiaWxpdHkgb2Ygd2FpdGluZyEgKDAgPSBzb29uZXIsIDEgPSBsYXRlcilcbiAgICAgIGNvbnN0IGJpbnZhbCA9IDEgLyAoMSArIE1hdGguZXhwKHN0YXRlLmx1Y2UgKiAodnMgLSB2bCkpKTtcblxuICAgICAgLy8gQWN0dWFsIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZSA9IChjaG9pY2UucmVzcG9uc2UgPT09ICdmaXJzdCcpID8gMCA6IDE7XG5cbiAgICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5iZXJuKHJlc3BvbnNlLCBiaW52YWwpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxwO1xuICB9O1xuXG4gIC8vIEluaXRpYWxpemluZyB0aGUgc2FtcGxlclxuICBjb25zdCBzYW1wbGVyID0gbmV3IEJheWVzTWNtYy5BbXdnU2FtcGxlcihwYXJhbXMsIGxvZ1Bvc3QsIGV2ZW50LmRhdGEpO1xuICAvLyBCdXJuaW5nIHNvbWUgc2FtcGxlcyB0byB0aGUgTUNNQyBnb2RzIGFuZCBzYW1wbGluZyA1MDAwIGRyYXdzXG4gIHNhbXBsZXIuYnVybigxMDAwKTtcbiAgY29uc3Qgc2FtcGxlcyA9IHNhbXBsZXIuc2FtcGxlKDUwMDApO1xuXG4gIC8vIEV4dHJhY3Qgc3VtbWFyeSBzdGF0c1xuICBjb25zdCByZXN1bHRzID0ge1xuICAgIGs6IGQzLm1lZGlhbihzYW1wbGVzLmspLFxuICAgIGx1Y2U6IGQzLm1lZGlhbihzYW1wbGVzLmx1Y2UpLFxuICB9O1xuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe3Jlc3VsdHM6IHJlc3VsdHMsIHNhbXBsZXM6IHNhbXBsZXN9KTtcbn07XG4iXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJtb2R1bGUiLCJleHBvcnRzIiwibGQiLCJ0aGlzIiwibGdhbW1hIiwieCIsImoiLCJjb2YiLCJzZXIiLCJ4eCIsInkiLCJ0bXAiLCJsb2ciLCJsZmFjdG9yaWFsIiwibiIsIk5hTiIsImxjaG9vc2UiLCJrIiwibGJldGEiLCJhIiwiYiIsIk1hdGgiLCJleHAiLCJhYnMiLCJwb3ciLCJzcXJ0IiwicGkiLCJQSSIsImJldGEiLCJzaGFwZTEiLCJzaGFwZTIiLCJJbmZpbml0eSIsImNhdWNoeSIsImxvY2F0aW9uIiwic2NhbGUiLCJub3JtIiwibWVhbiIsInNkIiwiYml2YXJub3JtIiwiY29yciIsInoiLCJub3JtYWxpemluZ19mYWN0b3IiLCJiaXZhcl9sb2dfZGVucyIsImxhcGxhY2UiLCJkZXhwIiwiZ2FtbWEiLCJzaGFwZSIsInJhdGUiLCJpbnZnYW1tYSIsImxub3JtIiwibWVhbmxvZyIsInNkbG9nIiwicGFyZXRvIiwidCIsImRmIiwid2VpYnVsbCIsInRtcDEiLCJ0bXAyIiwibG9naXMiLCJlIiwiZiIsImRpcmljaGxldCIsImFscGhhIiwic3VtX2FscGhhIiwic3VtX2xnYW1tYV9hbHBoYSIsInN1bV9hbHBoYV9zdWJfMV9sb2dfeCIsImxlbmd0aCIsImkiLCJ1bmlmIiwibWluIiwibWF4IiwiYmVybiIsInByb2IiLCJjYXQiLCJwcm9icyIsImJpbm9tIiwic2l6ZSIsIm5iaW5vbSIsImh5cGVyIiwibSIsInBvaXMiLCJsYW1iZGEiLCJtY21jIiwicnVuaWYiLCJyYW5kb20iLCJydW5pZl9kaXNjcmV0ZSIsImZsb29yIiwicm5vcm0iLCJ1IiwidiIsInEiLCJkZWVwX2Nsb25lIiwic3JjIiwibWl4aW4iLCJkZXN0Iiwic291cmNlIiwiY29weUZ1bmMiLCJuYW1lIiwicyIsImVtcHR5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwibm9kZVR5cGUiLCJjbG9uZU5vZGUiLCJEYXRlIiwiZ2V0VGltZSIsIlJlZ0V4cCIsInIiLCJsIiwiQXJyYXkiLCJwdXNoIiwiY29uc3RydWN0b3IiLCJjbG9uZV9wYXJhbV9kcmF3IiwiaXNBcnJheSIsInhfY29weSIsInNsaWNlIiwiaXNfbnVtYmVyIiwib2JqZWN0IiwiTnVtYmVyIiwiY3JlYXRlX2FycmF5IiwiZGltIiwiaW5pdCIsImFyciIsImFycmF5X2RpbSIsImNvbmNhdCIsImFycmF5X2VxdWFsIiwiYTEiLCJhMiIsIm5lc3RlZF9hcnJheV9hcHBseSIsImZ1biIsInJlc3VsdCIsInNodWZmbGVfYXJyYXkiLCJhcnJheSIsInRlbXAiLCJuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5IiwibGVuIiwiYXJyYXlfaXMiLCJhcnJheV9pIiwiZ2V0X29wdGlvbiIsIm9wdGlvbl9uYW1lIiwib3B0aW9ucyIsImRlZmF1bF92YWx1ZSIsImhhc093blByb3BlcnR5IiwidW5kZWZpbmVkIiwiZ2V0X211bHRpZGltX29wdGlvbiIsInZhbHVlIiwicGFyYW1faW5pdF9maXhlZCIsInR5cGUiLCJsb3dlciIsInVwcGVyIiwicm91bmQiLCJjb21wbGV0ZV9wYXJhbXMiLCJwYXJhbXNfdG9fY29tcGxldGUiLCJwYXJhbV9pbml0IiwicGFyYW1zIiwicGFyYW1fbmFtZSIsInBhcmFtIiwiU3RlcHBlciIsInN0YXRlIiwibG9nX3Bvc3QiLCJzdGVwIiwic3RhcnRfYWRhcHRhdGlvbiIsInN0b3BfYWRhcHRhdGlvbiIsImluZm8iLCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciIsImdlbmVyYXRlX3Byb3Bvc2FsIiwicGFyYW1fbmFtZXMiLCJrZXlzIiwicHJvcF9sb2dfc2NhbGUiLCJiYXRjaF9zaXplIiwibWF4X2FkYXB0YXRpb24iLCJpbml0aWFsX2FkYXB0YXRpb24iLCJ0YXJnZXRfYWNjZXB0X3JhdGUiLCJpc19hZGFwdGluZyIsImFjY2VwdGFuY2VfY291bnQiLCJiYXRjaF9jb3VudCIsIml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24iLCJjcmVhdGUiLCJwYXJhbV9zdGF0ZSIsInBhcmFtX3Byb3Bvc2FsIiwiY3Vycl9sb2dfZGVucyIsInByb3BfbG9nX2RlbnMiLCJhY2NlcHRfcHJvYiIsImxvZ19zZF9hZGp1c3RtZW50Iiwibm9ybWFsX3Byb3Bvc2FsIiwiUmVhbE1ldHJvcG9saXNTdGVwcGVyIiwiZGlzY3JldGVfbm9ybWFsX3Byb3Bvc2FsIiwiSW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiU3ViU3RlcHBlciIsImNyZWF0ZV9zdWJzdGVwcGVycyIsInN1YnN0YXRlIiwic3Vic3RlcHBlcnMiLCJzdWJvcHRpb25zIiwic3VicGFyYW0iLCJzdWJzdGVwcGVyIiwiTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiQmluYXJ5U3RlcHBlciIsInplcm9fbG9nX2RlbnMiLCJvbmVfbG9nX2RlbnMiLCJtYXhfbG9nX2RlbnMiLCJ6ZXJvX3Byb2IiLCJCaW5hcnlDb21wb25lbnRTdGVwcGVyIiwic3VicGFyYW1zIiwiQW13Z1N0ZXBwZXIiLCJTZWxlY3RTdGVwcGVyIiwicGFyYW1fb2JqZWN0X3dyYXAiLCJwYXJhbV9vcHRpb25zIiwiU2FtcGxlciIsImRhdGEiLCJwYXJhbV9pbml0X2Z1biIsInRoaW5uaW5nX2ludGVydmFsIiwicGFyYW1zX3RvX21vbml0b3IiLCJ0aGluIiwibW9uaXRvciIsInN0ZXBwZXJzIiwiY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUiLCJzYW1wbGUiLCJuX2l0ZXJhdGlvbnMiLCJtb25pdG9yZWRfcGFyYW1zIiwiY3Vycl9zYW1wbGUiLCJidXJuIiwiQW13Z1NhbXBsZXIiLCJhc2NlbmRpbmciLCJudW1iZXJzIiwidmFsdWVzIiwidmFsdWVvZiIsImluZGV4IiwiY29tcGFyZURlZmluZWQiLCJjb21wYXJlIiwiYXNjZW5kaW5nRGVmaW5lZCIsIlR5cGVFcnJvciIsInF1aWNrc2VsZWN0IiwibGVmdCIsInJpZ2h0IiwibmV3TGVmdCIsIm5ld1JpZ2h0Iiwic3dhcCIsInF1YW50aWxlIiwicCIsIkZsb2F0NjRBcnJheSIsImZyb20iLCJpc05hTiIsImkwIiwidmFsdWUwIiwic3ViYXJyYXkiLCJ2YWx1ZTEiLCJtZWRpYW4iLCJUcmFuc2Zvcm0iLCJ0cmFuc2xhdGUiLCJhcHBseSIsInBvaW50IiwiYXBwbHlYIiwiYXBwbHlZIiwiaW52ZXJ0IiwiaW52ZXJ0WCIsImludmVydFkiLCJyZXNjYWxlWCIsImNvcHkiLCJkb21haW4iLCJyYW5nZSIsIm1hcCIsInJlc2NhbGVZIiwiSFRETWF0aCIsImFkazJ2IiwiZCIsImFkdjJrIiwic2VsZiIsIm9ubWVzc2FnZSIsImV2ZW50IiwibHVjZSIsImxvZ1Bvc3QiLCJscCIsImtNZWFuIiwia1NoYXBlIiwiQmF5ZXNEaXN0cmlidXRpb25zIiwibHVjZU1lYW4iLCJsdWNlU2hhcGUiLCJmb3JFYWNoIiwiY2hvaWNlIiwidnMiLCJhcyIsImRzIiwidmwiLCJhbCIsImRsIiwiYmludmFsIiwicmVzcG9uc2UiLCJzYW1wbGVyIiwiQmF5ZXNNY21jIiwic2FtcGxlcyIsInJlc3VsdHMiLCJkMyIsInBvc3RNZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Q0FHQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FPQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7R0FDQyxDQUFVQSxVQUFBQSxJQUFJLEVBQUVDLE9BQU8sRUFBRTtLQUlmLElBQWtDQyxNQUFNLENBQUNDLE9BQU8sRUFBRTtDQUM3RDtDQUNBO0NBQ0E7Q0FDUUQsTUFBQUEsTUFBQSxDQUFBQyxPQUFBLEdBQWlCRixPQUFPLEVBQUUsQ0FBQTtDQUNsQyxLQUFLLE1BQU07Q0FDWDtDQUNRRCxNQUFBQSxJQUFJLENBQUNJLEVBQUUsR0FBR0gsT0FBTyxFQUFFLENBQUE7Q0FDeEIsS0FBQTtDQUNILEdBQUMsRUFBQ0ksY0FBSSxFQUFFLFlBQVc7Q0FDbkI7S0FDRSxJQUFJRCxFQUFFLEdBQUksRUFBRSxDQUFBOztDQUVkO0NBQ0E7O0NBRUUsSUFBQSxJQUFJRSxNQUFNLEdBQUcsVUFBU0MsQ0FBQyxFQUFFO09BQ3ZCLElBQUlDLENBQUMsR0FBRyxDQUFDLENBQUE7Q0FDVCxNQUFBLElBQUlDLEdBQUcsR0FBRyxDQUNSLGlCQUFpQixFQUFFLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQ3hELENBQUMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FDL0QsQ0FBQTtPQUNELElBQUlDLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQTtDQUMzQixNQUFBLElBQUlDLEVBQUUsRUFBRUMsQ0FBQyxFQUFFQyxHQUFHLENBQUE7T0FDZEEsR0FBRyxHQUFHLENBQUNELENBQUMsR0FBR0QsRUFBRSxHQUFHSixDQUFDLElBQUks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QixDQUM1QnRILEtBQUssQ0FBQ2lILElBQUksRUFDVk8sU0FBUyxFQUNUQSxTQUFTLEdBQUdELFFBQ2QsQ0FBQyxDQUFBO0NBQ0Q7O0NBRUE7Q0FDQW5FLElBQUFBLElBQUksQ0FBQ3FFLE9BQU8sQ0FBRUMsTUFBTSxJQUFLO0NBQ3ZCO0NBQ0EsTUFBQSxNQUFNQyxFQUFFLEdBQUdqQixPQUFPLENBQUNDLEtBQUssQ0FBQ2UsTUFBTSxDQUFDRSxFQUFFLEVBQUVGLE1BQU0sQ0FBQ0csRUFBRSxFQUFFN0gsS0FBSyxDQUFDL0ksQ0FBQyxDQUFDLENBQUE7Q0FDdkQsTUFBQSxNQUFNNlEsRUFBRSxHQUFHcEIsT0FBTyxDQUFDQyxLQUFLLENBQUNlLE1BQU0sQ0FBQ0ssRUFBRSxFQUFFTCxNQUFNLENBQUNNLEVBQUUsRUFBRWhJLEtBQUssQ0FBQy9JLENBQUMsQ0FBQyxDQUFBOztDQUV2RDtDQUNBO0NBQ0EsTUFBQSxNQUFNZ1IsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUc1USxJQUFJLENBQUNDLEdBQUcsQ0FBQzBJLEtBQUssQ0FBQ2lILElBQUksSUFBSVUsRUFBRSxHQUFHRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7O0NBRXpEO09BQ0EsTUFBTUksUUFBUSxHQUFJUixNQUFNLENBQUNRLFFBQVEsS0FBSyxPQUFPLEdBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtPQUV0RGYsRUFBRSxJQUFJRyx5QkFBdUIsQ0FBQ1ksUUFBUSxFQUFFRCxNQUFNLENBQUMsQ0FBQTtDQUNqRCxLQUFDLENBQUMsQ0FBQTtDQUVGLElBQUEsT0FBT2QsRUFBRSxDQUFBO0lBQ1YsQ0FBQTs7Q0FFRDtDQUNBLEVBQUEsTUFBTWdCLE9BQU8sR0FBRyxJQUFJQyx1QkFBcUIsQ0FBQ3hJLE1BQU0sRUFBRXNILE9BQU8sRUFBRUYsS0FBSyxDQUFDNUQsSUFBSSxDQUFDLENBQUE7Q0FDdEU7Q0FDQStFLEVBQUFBLE9BQU8sQ0FBQ25FLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtDQUNsQixFQUFBLE1BQU1xRSxPQUFPLEdBQUdGLE9BQU8sQ0FBQ3ZFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTs7Q0FFcEM7Q0FDQSxFQUFBLE1BQU0wRSxPQUFPLEdBQUc7S0FDZHJSLENBQUMsRUFBRXNSLE1BQVMsQ0FBQ0YsT0FBTyxDQUFDcFIsQ0FBQyxDQUFDO0NBQ3ZCZ1EsSUFBQUEsSUFBSSxFQUFFc0IsTUFBUyxDQUFDRixPQUFPLENBQUNwQixJQUFJLENBQUE7SUFDN0IsQ0FBQTtHQUVESCxJQUFJLENBQUMwQixXQUFXLENBQUM7Q0FBQ0YsSUFBQUEsT0FBTyxFQUFFQSxPQUFPO0NBQUVELElBQUFBLE9BQU8sRUFBRUEsT0FBQUE7Q0FBTyxHQUFDLENBQUMsQ0FBQTtDQUN4RCxDQUFDOzs7Ozs7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTBdfQ==",Gp=!1,function(t){return pp=pp||Cp(yp,fp,Gp),new Worker(pp,t)});class Ap extends xF{static get properties(){return{}}constructor(){super(),this.k=.05,this.choices=[],this.samples=null,this.working=!1,this.queued=!1,this.worker=new mp,this.worker.onmessage=t=>{this.working=!1,this.samples=t.data.samples,this.k=t.data.results.k,this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-fit-update",{detail:{k:this.k},bubbles:!0})),this.queued&&this.fit()},this.fit()}fit(){this.working?this.queued=!0:(this.worker.postMessage(this.choices),this.working=!0,this.queued=!1)}clear(){this.choices=[],this.fit()}get(t="default"){const e=this.choices.find((e=>e.name===t));return void 0===e?null:e}set(t,e,n,i,s,c="",a=""){const l=this.choices.find((t=>t.name===c));void 0===l?this.choices.push({as:t,ds:e,al:n,dl:i,response:s,name:c,label:a}):(l.as=t,l.ds=e,l.al=n,l.dl=i,l.response=s,l.label=a),this.fit()}static get styles(){return[super.styles,a`
|
|
1373
1373
|
/* :host {
|
|
1374
1374
|
display: inline-block;
|
|
1375
1375
|
} */
|
|
@@ -1542,7 +1542,7 @@ const RF=2;let NF=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1542
1542
|
amount-ll="${this.al}"
|
|
1543
1543
|
delay-ll="${this.dl}">
|
|
1544
1544
|
</itc-choice>
|
|
1545
|
-
</div>`}update(t){super.update(t),(this.firstUpdate||t.has("running"))&&(this.running?(this.pauseTime&&(this.baseTime+=nc()-this.pauseTime,this.pauseTime=0),this.runner=function(t,e,n){var i=new sc,s=e;return null==e?(i.restart(t,e,n),i):(i._restart=i.restart,i.restart=function(t,e,n){e=+e,n=null==n?nc():+n,i._restart((function c(a){a+=s,i._restart(c,s+=e,n),t(a)}),e,n)},i.restart(t,e,n),i)}(this.run.bind(this),20)):void 0!==this.runner&&(this.runner.stop(),this.pauseTime=nc())),this.firstUpdate=!1}reset(){this.runner.stop(),this.running=!1,this.trial=0,this.state="resetted",this.as=0,this.ds=0,this.al=0,this.dl=0,this.baseTime=0,this.pauseTime=0,this.startTime=0,this.lastTime=0}run(){const t=nc(),e=this.baseTime?t-this.baseTime:0,n=this.baseTime?e-this.startTime:0;this.lastTime=e,"resetted"===this.state?(this.state="iti",this.baseTime=t,this.startTime=0,this.dispatchEvent(new CustomEvent("itc-block-start",{detail:{trials:this.trials},bubbles:!0}))):"iti"===this.state&&n>=this.iti?(this.trial+=1,this.state="stimulus",this.startTime=e,this.as=this.range.as.values[Math.floor(Math.random()*this.range.as.values.length)],this.ds=this.range.ds.values[Math.floor(Math.random()*this.range.ds.values.length)],this.al=this.range.al.values[Math.floor(Math.random()*this.range.al.values.length)],this.dl=this.range.dl.values[Math.floor(Math.random()*this.range.dl.values.length)],this.dispatchEvent(new CustomEvent("itc-trial-start",{detail:{trials:this.trials,duration:this.duration,iti:this.iti,trial:this.trial,as:this.as,ds:this.ds,al:this.al,dl:this.dl},bubbles:!0}))):"stimulus"===this.state&&n>=this.duration&&(this.dispatchEvent(new CustomEvent("itc-trial-end",{detail:{trials:this.trials,duration:this.duration,iti:this.iti,trial:this.trial,as:this.as,ds:this.ds,al:this.al,dl:this.dl},bubbles:!0})),this.trial>=this.trials?(this.runner.stop(),this.running=!1,this.state="ended",this.baseTime=0,this.pauseTime=0,this.startTime=0,this.lastTime=0,this.dispatchEvent(new CustomEvent("itc-block-end",{detail:{trials:this.trial},bubbles:!0}))):(this.state="iti",this.startTime=e))}}customElements.define("itc-task",Sp);class Rp extends qF{static get properties(){return{a:{attribute:"amount",type:Number,reflect:!0},d:{attribute:"delay",type:Number,reflect:!0},k:{attribute:"k",type:Number,reflect:!0},v:{attribute:!1,type:Number,reflect:!1}}}constructor(){super(),this.a=100,this.d=30,this.k=.05,this.alignState()}alignState(){this.v=$F.adk2v(this.a,this.d,this.k)}sendEvent(){this.dispatchEvent(new CustomEvent("htd-equation-adk2v-change",{detail:{a:this.a,d:this.d,k:this.k,v:this.v},bubbles:!0}))}aInput(t){this.a=parseFloat(t.target.value),this.alignState(),this.sendEvent()}dInput(t){this.d=parseFloat(t.target.value),this.alignState(),this.sendEvent()}kInput(t){this.k=parseFloat(t.target.value),this.alignState(),this.sendEvent()}render(){let t,e,n,i;this.
|
|
1545
|
+
</div>`}update(t){super.update(t),(this.firstUpdate||t.has("running"))&&(this.running?(this.pauseTime&&(this.baseTime+=nc()-this.pauseTime,this.pauseTime=0),this.runner=function(t,e,n){var i=new sc,s=e;return null==e?(i.restart(t,e,n),i):(i._restart=i.restart,i.restart=function(t,e,n){e=+e,n=null==n?nc():+n,i._restart((function c(a){a+=s,i._restart(c,s+=e,n),t(a)}),e,n)},i.restart(t,e,n),i)}(this.run.bind(this),20)):void 0!==this.runner&&(this.runner.stop(),this.pauseTime=nc())),this.firstUpdate=!1}reset(){this.runner.stop(),this.running=!1,this.trial=0,this.state="resetted",this.as=0,this.ds=0,this.al=0,this.dl=0,this.baseTime=0,this.pauseTime=0,this.startTime=0,this.lastTime=0}run(){const t=nc(),e=this.baseTime?t-this.baseTime:0,n=this.baseTime?e-this.startTime:0;this.lastTime=e,"resetted"===this.state?(this.state="iti",this.baseTime=t,this.startTime=0,this.dispatchEvent(new CustomEvent("itc-block-start",{detail:{trials:this.trials},bubbles:!0}))):"iti"===this.state&&n>=this.iti?(this.trial+=1,this.state="stimulus",this.startTime=e,this.as=this.range.as.values[Math.floor(Math.random()*this.range.as.values.length)],this.ds=this.range.ds.values[Math.floor(Math.random()*this.range.ds.values.length)],this.al=this.range.al.values[Math.floor(Math.random()*this.range.al.values.length)],this.dl=this.range.dl.values[Math.floor(Math.random()*this.range.dl.values.length)],this.dispatchEvent(new CustomEvent("itc-trial-start",{detail:{trials:this.trials,duration:this.duration,iti:this.iti,trial:this.trial,as:this.as,ds:this.ds,al:this.al,dl:this.dl},bubbles:!0}))):"stimulus"===this.state&&n>=this.duration&&(this.dispatchEvent(new CustomEvent("itc-trial-end",{detail:{trials:this.trials,duration:this.duration,iti:this.iti,trial:this.trial,as:this.as,ds:this.ds,al:this.al,dl:this.dl},bubbles:!0})),this.trial>=this.trials?(this.runner.stop(),this.running=!1,this.state="ended",this.baseTime=0,this.pauseTime=0,this.startTime=0,this.lastTime=0,this.dispatchEvent(new CustomEvent("itc-block-end",{detail:{trials:this.trial},bubbles:!0}))):(this.state="iti",this.startTime=e))}}customElements.define("itc-task",Sp);class Rp extends qF{static get properties(){return{a:{attribute:"amount",type:Number,reflect:!0},d:{attribute:"delay",type:Number,reflect:!0},k:{attribute:"k",type:Number,reflect:!0},v:{attribute:!1,type:Number,reflect:!1}}}constructor(){super(),this.a=100,this.d=30,this.k=.05,this.alignState()}alignState(){this.v=$F.adk2v(this.a,this.d,this.k)}sendEvent(){this.dispatchEvent(new CustomEvent("htd-equation-adk2v-change",{detail:{a:this.a,d:this.d,k:this.k,v:this.v},bubbles:!0}))}aInput(t){this.a=parseFloat(t.target.value),this.alignState(),this.sendEvent()}dInput(t){this.d=parseFloat(t.target.value),this.alignState(),this.sendEvent()}kInput(t){this.k=parseFloat(t.target.value),this.alignState(),this.sendEvent()}willUpdate(){this.alignState()}render(){let t,e,n,i;this.numeric?(t=J`<decidables-spinner class="a bottom" ?disabled=${!this.interactive} step="1" .value="${this.a}" @input=${this.aInput.bind(this)}>
|
|
1546
1546
|
<var class="math-var">A</var>
|
|
1547
1547
|
</decidables-spinner>`,e=J`<decidables-spinner class="d bottom" ?disabled=${!this.interactive} min="0" step="1" .value="${this.d}" @input=${this.dInput.bind(this)}>
|
|
1548
1548
|
<var class="math-var">D</var>
|
|
@@ -1620,5 +1620,5 @@ const RF=2;let NF=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1620
1620
|
<div class="body">
|
|
1621
1621
|
<slot>Empty!</slot>
|
|
1622
1622
|
</div>
|
|
1623
|
-
</div>`}}customElements.define("htd-example",Np);class Xp extends Np{
|
|
1623
|
+
</div>`}}customElements.define("htd-example",Np);class Xp extends Np{connectedCallback(){super.connectedCallback(),this.discountableControl=this.querySelector("discountable-control"),this.itcTask=this.querySelector("itc-task"),this.discountableResponse=this.querySelector("discountable-response"),this.htdFit=this.querySelector("htd-fit"),this.htdCurves=this.querySelector("htd-curves"),this.discountableControl&&(this.discountableControl.hasAttribute("trials")&&this.discountableControl.addEventListener("discountable-control-trials",(t=>{this.itcTask&&(this.itcTask.trials=t.detail.trials),this.discountableResponse&&(this.discountableResponse.trialTotal=t.detail.trials)})),this.discountableControl.hasAttribute("duration")&&this.discountableControl.addEventListener("discountable-control-duration",(t=>{this.itcTask&&(this.itcTask.duration=t.detail.duration,this.itcTask.iti=t.detail.duration)})),this.discountableControl.hasAttribute("run")&&this.discountableControl.addEventListener("discountable-control-run",(()=>{this.itcTask&&(this.itcTask.running=!0)})),this.discountableControl.hasAttribute("pause")&&this.discountableControl.addEventListener("discountable-control-pause",(()=>{this.itcTask&&(this.itcTask.running=!1)})),this.discountableControl.hasAttribute("reset")&&this.discountableControl.addEventListener("discountable-control-reset",(()=>{this.itcTask&&this.itcTask.reset(),this.discountableResponse&&this.discountableResponse.reset(),this.htdFit&&this.htdFit.clear(),this.htdCurves&&this.htdCurves.clearOptions()}))),this.itcTask&&(this.discountableResponse&&(this.discountableResponse.trialTotal=this.itcTask.trials),this.itcTask.addEventListener("itc-trial-start",(t=>{this.discountableResponse&&this.discountableResponse.start(t.detail.as,t.detail.ds,t.detail.al,t.detail.dl,t.detail.trial),this.htdCurves&&(this.htdCurves.setOption(t.detail.as,t.detail.ds,"smaller-sooner","s"),this.htdCurves.setOption(t.detail.al,t.detail.dl,"larger-later","l"))})),this.itcTask.addEventListener("itc-trial-end",(()=>{this.discountableResponse&&this.discountableResponse.stop(),this.htdCurves&&(this.htdCurves.removeOption("smaller-sooner"),this.htdCurves.removeOption("larger-later"))})),this.itcTask.addEventListener("itc-block-end",(()=>{this.discountableControl&&this.discountableControl.complete()}))),this.discountableResponse&&this.discountableResponse.addEventListener("discountable-response",(t=>{this.htdFit&&this.htdFit.set(t.detail.as,t.detail.ds,t.detail.al,t.detail.dl,t.detail.response,t.detail.trial.toString(),t.detail.trial.toString())})),this.htdFit&&this.htdFit.addEventListener("htd-fit-update",(t=>{this.htdCurves&&(this.htdCurves.k=t.detail.k)}))}}customElements.define("htd-example-human",Xp);class vp extends Np{static get properties(){return{as:{attribute:"amount-ss",type:Number,reflect:!0},ds:{attribute:"delay-ss",type:Number,reflect:!0},al:{attribute:"amount-ll",type:Number,reflect:!0},dl:{attribute:"delay-ll",type:Number,reflect:!0},k:{attribute:"k",type:Number,reflect:!0}}}constructor(){super(),this.as=10,this.ds=1,this.al=50,this.dl=40,this.k=.05,this.htdCalculation=null,this.htdCurves=null,this.itcChoice=null}connectedCallback(){super.connectedCallback(),this.htdCalculation=this.querySelector("htd-calculation"),this.htdCurves=this.querySelector("htd-curves"),this.itcChoice=this.querySelector("itc-choice"),this.htdCalculation&&this.htdCalculation.addEventListener("htd-calculation-change",(t=>{this.as=t.detail.as,this.ds=t.detail.ds,this.al=t.detail.al,this.dl=t.detail.dl,this.k=t.detail.k})),this.htdCurves&&this.htdCurves.addEventListener("htd-curves-change",(t=>{this.k=t.detail.k,"default"===t.detail.name?(this.as=t.detail.a,this.ds=t.detail.d):"larger-later"===t.detail.name&&(this.al=t.detail.a,this.dl=t.detail.d)})),this.itcChoice&&this.itcChoice.addEventListener("itc-choice-change",(t=>{this.as=t.detail.as,this.ds=t.detail.ds,this.al=t.detail.al,this.dl=t.detail.dl})),this.requestUpdate()}update(t){super.update(t),this.htdCalculation&&(this.htdCalculation.as=this.as,this.htdCalculation.ds=this.ds,this.htdCalculation.al=this.al,this.htdCalculation.dl=this.dl,this.htdCalculation.k=this.k),this.htdCurves&&(this.htdCurves.setOption(this.as,this.ds,"default","s"),this.htdCurves.setOption(this.al,this.dl,"larger-later","l"),this.htdCurves.k=this.k),this.itcChoice&&(this.itcChoice.as=this.as,this.itcChoice.ds=this.ds,this.itcChoice.al=this.al,this.itcChoice.dl=this.dl)}}customElements.define("htd-example-interactive",vp);class Zp extends Np{static get properties(){return{k:{attribute:"k",type:Number,reflect:!0}}}constructor(){super(),this.k=.2,this.discountableControl=null,this.discountableResponse=null,this.htdCalculation=null,this.htdCurves=null,this.itcTask=null}connectedCallback(){super.connectedCallback(),this.discountableControl=this.querySelector("discountable-control"),this.discountableResponse=this.querySelector("discountable-response"),this.htdCalculation=this.querySelector("htd-calculation"),this.htdCurves=this.querySelector("htd-curves"),this.itcTask=this.querySelector("itc-task"),this.discountableControl&&(this.discountableControl.hasAttribute("trials")&&this.discountableControl.addEventListener("discountable-control-trials",(t=>{this.itcTask&&(this.itcTask.trials=t.detail.trials),this.discountableResponse&&(this.discountableResponse.trialTotal=t.detail.trials)})),this.discountableControl.hasAttribute("duration")&&this.discountableControl.addEventListener("discountable-control-duration",(t=>{this.itcTask&&(this.itcTask.duration=t.detail.duration,this.itcTask.iti=t.detail.duration)})),this.discountableControl.hasAttribute("run")&&this.discountableControl.addEventListener("discountable-control-run",(()=>{this.htdCurves&&this.htdCurves.resumeTrial(),this.itcTask&&(this.itcTask.running=!0)})),this.discountableControl.hasAttribute("pause")&&this.discountableControl.addEventListener("discountable-control-pause",(()=>{this.htdCurves&&this.htdCurves.pauseTrial(),this.itcTask&&(this.itcTask.running=!1)})),this.discountableControl.hasAttribute("reset")&&this.discountableControl.addEventListener("discountable-control-reset",(()=>{this.discountableResponse&&this.discountableResponse.reset(),this.htdCurves&&this.htdCurves.clearOptions(),this.itcTask&&this.itcTask.reset()}))),this.htdCurves&&(this.htdCurves.addEventListener("htd-curves-change",(t=>{this.k=t.detail.k})),this.htdCurves.addEventListener("discountable-response",(t=>{this.discountableResponse&&this.discountableResponse.responded(t.detail.response)}))),this.itcTask&&(this.discountableResponse&&(this.discountableResponse.trialTotal=this.itcTask.trials),this.itcTask.addEventListener("itc-trial-start",(t=>{this.discountableResponse&&this.discountableResponse.start(t.detail.as,t.detail.ds,t.detail.al,t.detail.dl,t.detail.trial);const e=$F.adk2v(t.detail.as,t.detail.ds,this.k)>$F.adk2v(t.detail.al,t.detail.dl,this.k)?"first":"second";this.htdCurves&&this.htdCurves.trial(t.detail.as,t.detail.ds,t.detail.al,t.detail.dl,t.detail.trial,e)})),this.itcTask.addEventListener("itc-trial-end",(()=>{this.discountableResponse&&this.discountableResponse.stop()})),this.itcTask.addEventListener("itc-block-end",(()=>{this.discountableControl&&this.discountableControl.complete()}))),this.requestUpdate()}update(t){super.update(t),this.htdCalculation&&(this.htdCalculation.k=this.k),this.htdCurves&&(this.htdCurves.k=this.k)}}customElements.define("htd-example-model",Zp);export{LF as DiscountableControl,xF as DiscountableElement,SF as DiscountableResponse,tu as HTDCalculation,eu as HTDCurves,Rp as HTDEquationADK2V,Xp as HTDExampleHuman,vp as HTDExampleInteractive,Zp as HTDExampleModel,Ap as HTDFit,Lp as ITCChoice,xp as ITCOption,Sp as ITCTask};
|
|
1624
1624
|
//# sourceMappingURL=discountableElements.esm.min.js.map
|