vis-core 0.28.0-beta.7 → 0.28.0-beta.9

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/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  (function(){"use strict";try{if(typeof document!="undefined"){var t=document.createElement("style");t.appendChild(document.createTextNode(".-translate-x-1\\/2,.-translate-y-1\\/2,.transform{--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1 }.shadow{--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000 }.invert,.filter{--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: }.visible{visibility:visible}.static{position:static}.absolute{position:absolute}.left-1\\/2{left:50%}.top-1\\/2{top:50%}.-translate-x-1\\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize{resize:both}.whitespace-nowrap{white-space:nowrap}.text-center{text-align:center}.text-sm{font-size:14px;line-height:20px}.leading-\\[1\\]{line-height:1}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.text-opacity-80{--tw-text-opacity: .8 }.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.invert{--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}")),document.head.appendChild(t)}}catch(a){console.error("vite-plugin-css-injected-by-js",a)}})();
2
- "use strict";var En=Object.defineProperty,In=Object.defineProperties;var zn=Object.getOwnPropertyDescriptors;var wn=Object.getOwnPropertySymbols,Nn=Object.getPrototypeOf,Fn=Object.prototype.hasOwnProperty,kn=Object.prototype.propertyIsEnumerable,Kn=Reflect.get;var Gn=(m,t)=>(t=Symbol[m])?t:Symbol.for("Symbol."+m),An=m=>{throw TypeError(m)},un=Math.pow,Zn=(m,t,r)=>t in m?En(m,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):m[t]=r,fi=(m,t)=>{for(var r in t||(t={}))Fn.call(t,r)&&Zn(m,r,t[r]);if(wn)for(var r of wn(t))kn.call(t,r)&&Zn(m,r,t[r]);return m},Ui=(m,t)=>In(m,zn(t));var T0=(m,t,r)=>Zn(m,typeof t!="symbol"?t+"":t,r);var fn=(m,t,r)=>Kn(Nn(m),r,t);var U0=(m,t,r)=>new Promise((d,g)=>{var v=I=>{try{w(r.next(I))}catch(O){g(O)}},C=I=>{try{w(r.throw(I))}catch(O){g(O)}},w=I=>I.done?d(I.value):Promise.resolve(I.value).then(v,C);w((r=r.apply(m,t)).next())}),Hn=function(m,t){this[0]=m,this[1]=t};var Vn=m=>{var t=m[Gn("asyncIterator")],r=!1,d,g={};return t==null?(t=m[Gn("iterator")](),d=v=>g[v]=C=>t[v](C)):(t=t.call(m),d=v=>g[v]=C=>{if(r){if(r=!1,v==="throw")throw C;return C}return r=!0,{done:!1,value:new Hn(new Promise(w=>{var I=t[v](C);I instanceof Object||An("Object expected"),w(I)}),1)}}),g[Gn("iterator")]=()=>g,d("next"),"throw"in t?d("throw"):g.throw=v=>{throw v},"return"in t&&d("return"),g},Wn=(m,t,r)=>(t=m[Gn("asyncIterator")])?t.call(m):(m=m[Gn("iterator")](),t={},r=(d,g)=>(g=m[d])&&(t[d]=v=>new Promise((C,w,I)=>(v=g.call(m,v),I=v.done,Promise.resolve(v.value).then(O=>C({value:O,done:I}),w)))),r("next"),r("return"),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const jsrsasign=require("jsrsasign"),CryptoJS=require("crypto-js"),esusLite=require("esus-lite"),events=require("events"),turf=require("@turf/turf"),world$1=require("geojson-cn/json/0.json"),json100000Lite=require("geojson-cn/json-lite/100000.json"),json100000=require("geojson-cn/json/100000.json"),adcodeAll=require("geojson-cn/json-lite/all.json"),geojsonCn=require("geojson-cn");Array.prototype.at||(Array.prototype.at=function(m){return m<0&&(m=this.length+m),this[m]});const publicKeyPEM="LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyTG1aVVQzVG9LZEVRRUdrdUU1QQo3dnlYTzRMM1Z6NDA5RFF2a2xzRHZ2SytNM2M2OGl4ZEVhZDZFcnZGS2FKQ1QrNTZNdU1XSXhUTnlDZDVQSkFGCjVYdzI4cW1iVkVCR3FGdXVIZTltSm5GUmRXN1NpK1Z1cTZvRWxwQkRkeEFIQ0dsWVVpU1R3WmhBbjJaVXJLSUYKd1J2c1k1bi9uWWNhZnl5QW9tRjhmNVRsTkpwS1JtbDU3WlRSWjBMdzdQRDFSeHFIbmJ0YWFETkpiSDV5eFd6cQpaVTBwQWhxMFNkNHdlOW1DUTJWWXc5czhtUERLbW4rU083eGovSUsrR1ZEaEJNOUpaZ3VIcGFZUGt3bWd5UkdwCkx6V0tHMkZULzJRalZUT1dRT09mRFVtVitDSVlsN1hVVlh1Q0toYWFNQ0ZVa1JQOHg4aEZucmNFeklHQ1JpM3IKK3dJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0t",accessToken={token:void 0,getInfo(){if(!this.token)return"";const[m,t,r]=this.token.split(":::"),d=jsrsasign.KEYUTIL.getKey(atob(publicKeyPEM)),g=CryptoJS.enc.Base64.parse(t),v=CryptoJS.enc.Base64.parse(r),C=CryptoJS.lib.WordArray.create(g.words.slice(0,4)),w=CryptoJS.lib.WordArray.create(g.words.slice(4)),I=jsrsasign.KJUR.crypto.Util.hashHex(g.toString(),"sha256"),O=d.verifyWithMessageHashPSS(I,jsrsasign.b64tohex(m),"sha256",32);if(!O)return this.token=void 0,"";const Se=CryptoJS.AES.decrypt({ciphertext:w},v,{iv:C,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8),Pe=JSON.parse(Se),Ne=Date.now();return!Pe.s||Pe.s>Ne?(this.token=void 0,""):Pe.e&&Pe.e<Ne?(this.token=void 0,""):(Pe.isValid=O,Pe)}},version="0.28.0-beta.6";/**
2
+ "use strict";var En=Object.defineProperty,In=Object.defineProperties;var zn=Object.getOwnPropertyDescriptors;var wn=Object.getOwnPropertySymbols,Nn=Object.getPrototypeOf,Fn=Object.prototype.hasOwnProperty,kn=Object.prototype.propertyIsEnumerable,Kn=Reflect.get;var Gn=(m,t)=>(t=Symbol[m])?t:Symbol.for("Symbol."+m),An=m=>{throw TypeError(m)},un=Math.pow,Zn=(m,t,r)=>t in m?En(m,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):m[t]=r,fi=(m,t)=>{for(var r in t||(t={}))Fn.call(t,r)&&Zn(m,r,t[r]);if(wn)for(var r of wn(t))kn.call(t,r)&&Zn(m,r,t[r]);return m},Ui=(m,t)=>In(m,zn(t));var T0=(m,t,r)=>Zn(m,typeof t!="symbol"?t+"":t,r);var fn=(m,t,r)=>Kn(Nn(m),r,t);var U0=(m,t,r)=>new Promise((d,g)=>{var v=I=>{try{w(r.next(I))}catch(O){g(O)}},C=I=>{try{w(r.throw(I))}catch(O){g(O)}},w=I=>I.done?d(I.value):Promise.resolve(I.value).then(v,C);w((r=r.apply(m,t)).next())}),Hn=function(m,t){this[0]=m,this[1]=t};var Vn=m=>{var t=m[Gn("asyncIterator")],r=!1,d,g={};return t==null?(t=m[Gn("iterator")](),d=v=>g[v]=C=>t[v](C)):(t=t.call(m),d=v=>g[v]=C=>{if(r){if(r=!1,v==="throw")throw C;return C}return r=!0,{done:!1,value:new Hn(new Promise(w=>{var I=t[v](C);I instanceof Object||An("Object expected"),w(I)}),1)}}),g[Gn("iterator")]=()=>g,d("next"),"throw"in t?d("throw"):g.throw=v=>{throw v},"return"in t&&d("return"),g},Wn=(m,t,r)=>(t=m[Gn("asyncIterator")])?t.call(m):(m=m[Gn("iterator")](),t={},r=(d,g)=>(g=m[d])&&(t[d]=v=>new Promise((C,w,I)=>(v=g.call(m,v),I=v.done,Promise.resolve(v.value).then(O=>C({value:O,done:I}),w)))),r("next"),r("return"),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const jsrsasign=require("jsrsasign"),CryptoJS=require("crypto-js"),esusLite=require("esus-lite"),events=require("events"),turf=require("@turf/turf"),world$1=require("geojson-cn/json/0.json"),json100000Lite=require("geojson-cn/json-lite/100000.json"),json100000=require("geojson-cn/json/100000.json"),adcodeAll=require("geojson-cn/json-lite/all.json"),geojsonCn=require("geojson-cn");Array.prototype.at||(Array.prototype.at=function(m){return m<0&&(m=this.length+m),this[m]});const publicKeyPEM="LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyTG1aVVQzVG9LZEVRRUdrdUU1QQo3dnlYTzRMM1Z6NDA5RFF2a2xzRHZ2SytNM2M2OGl4ZEVhZDZFcnZGS2FKQ1QrNTZNdU1XSXhUTnlDZDVQSkFGCjVYdzI4cW1iVkVCR3FGdXVIZTltSm5GUmRXN1NpK1Z1cTZvRWxwQkRkeEFIQ0dsWVVpU1R3WmhBbjJaVXJLSUYKd1J2c1k1bi9uWWNhZnl5QW9tRjhmNVRsTkpwS1JtbDU3WlRSWjBMdzdQRDFSeHFIbmJ0YWFETkpiSDV5eFd6cQpaVTBwQWhxMFNkNHdlOW1DUTJWWXc5czhtUERLbW4rU083eGovSUsrR1ZEaEJNOUpaZ3VIcGFZUGt3bWd5UkdwCkx6V0tHMkZULzJRalZUT1dRT09mRFVtVitDSVlsN1hVVlh1Q0toYWFNQ0ZVa1JQOHg4aEZucmNFeklHQ1JpM3IKK3dJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0t",accessToken={token:void 0,getInfo(){if(!this.token)return"";const[m,t,r]=this.token.split(":::"),d=jsrsasign.KEYUTIL.getKey(atob(publicKeyPEM)),g=CryptoJS.enc.Base64.parse(t),v=CryptoJS.enc.Base64.parse(r),C=CryptoJS.lib.WordArray.create(g.words.slice(0,4)),w=CryptoJS.lib.WordArray.create(g.words.slice(4)),I=jsrsasign.KJUR.crypto.Util.hashHex(g.toString(),"sha256"),O=d.verifyWithMessageHashPSS(I,jsrsasign.b64tohex(m),"sha256",32);if(!O)return this.token=void 0,"";const Se=CryptoJS.AES.decrypt({ciphertext:w},v,{iv:C,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8),Pe=JSON.parse(Se),Ne=Date.now();return!Pe.s||Pe.s>Ne?(this.token=void 0,""):Pe.e&&Pe.e<Ne?(this.token=void 0,""):(Pe.isValid=O,Pe)}},version="0.28.0-beta.9";/**
3
3
  * @license
4
4
  * Copyright 2010-2025 Three.js Authors
5
5
  * SPDX-License-Identifier: MIT
@@ -4756,7 +4756,7 @@ version 0.8.2
4756
4756
  By Ken Fyrstenberg
4757
4757
  Contributions by leeoniya.
4758
4758
  License: MIT, header required.
4759
- */const Matrix=function(){var m=Math.cos,t=Math.sin,r=Math.tan,d=Math.round;function g(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function v(e0){if(e0===0)return this;var Yt=m(e0),o0=t(e0);return this._t(Yt,-o0,0,0,o0,Yt,0,0,0,0,1,0,0,0,0,1)}function C(e0){if(e0===0)return this;var Yt=m(e0),o0=t(e0);return this._t(1,0,0,0,0,Yt,-o0,0,0,o0,Yt,0,0,0,0,1)}function w(e0){if(e0===0)return this;var Yt=m(e0),o0=t(e0);return this._t(Yt,0,o0,0,0,1,0,0,-o0,0,Yt,0,0,0,0,1)}function I(e0){if(e0===0)return this;var Yt=m(e0),o0=t(e0);return this._t(Yt,-o0,0,0,o0,Yt,0,0,0,0,1,0,0,0,0,1)}function O(e0,Yt){return this._t(1,Yt,e0,1,0,0)}function ye(e0,Yt){return this.shear(r(e0),r(Yt))}function Se(e0,Yt){var o0=m(Yt),b0=t(Yt);return this._t(o0,b0,0,0,-b0,o0,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,r(e0),1,0,0,0,0,1,0,0,0,0,1)._t(o0,-b0,0,0,b0,o0,0,0,0,0,1,0,0,0,0,1)}function Pe(e0,Yt,o0){return!o0&&o0!==0&&(o0=1),e0===1&&Yt===1&&o0===1?this:this._t(e0,0,0,0,0,Yt,0,0,0,0,o0,0,0,0,0,1)}function Ne(e0,Yt,o0,b0,f0,P0,q0,G0,I0,F0,D0,Si,Ti,Mi,Fi,Ni){return this.props[0]=e0,this.props[1]=Yt,this.props[2]=o0,this.props[3]=b0,this.props[4]=f0,this.props[5]=P0,this.props[6]=q0,this.props[7]=G0,this.props[8]=I0,this.props[9]=F0,this.props[10]=D0,this.props[11]=Si,this.props[12]=Ti,this.props[13]=Mi,this.props[14]=Fi,this.props[15]=Ni,this}function ke(e0,Yt,o0){return o0=o0||0,e0!==0||Yt!==0||o0!==0?this._t(1,0,0,0,0,1,0,0,0,0,1,0,e0,Yt,o0,1):this}function ht(e0,Yt,o0,b0,f0,P0,q0,G0,I0,F0,D0,Si,Ti,Mi,Fi,Ni){var B0=this.props;if(e0===1&&Yt===0&&o0===0&&b0===0&&f0===0&&P0===1&&q0===0&&G0===0&&I0===0&&F0===0&&D0===1&&Si===0)return B0[12]=B0[12]*e0+B0[15]*Ti,B0[13]=B0[13]*P0+B0[15]*Mi,B0[14]=B0[14]*D0+B0[15]*Fi,B0[15]*=Ni,this._identityCalculated=!1,this;var h0=B0[0],xi=B0[1],O0=B0[2],J0=B0[3],A0=B0[4],N0=B0[5],_0=B0[6],a0=B0[7],s0=B0[8],v0=B0[9],C0=B0[10],E0=B0[11],w0=B0[12],vi=B0[13],ui=B0[14],Ci=B0[15];return B0[0]=h0*e0+xi*f0+O0*I0+J0*Ti,B0[1]=h0*Yt+xi*P0+O0*F0+J0*Mi,B0[2]=h0*o0+xi*q0+O0*D0+J0*Fi,B0[3]=h0*b0+xi*G0+O0*Si+J0*Ni,B0[4]=A0*e0+N0*f0+_0*I0+a0*Ti,B0[5]=A0*Yt+N0*P0+_0*F0+a0*Mi,B0[6]=A0*o0+N0*q0+_0*D0+a0*Fi,B0[7]=A0*b0+N0*G0+_0*Si+a0*Ni,B0[8]=s0*e0+v0*f0+C0*I0+E0*Ti,B0[9]=s0*Yt+v0*P0+C0*F0+E0*Mi,B0[10]=s0*o0+v0*q0+C0*D0+E0*Fi,B0[11]=s0*b0+v0*G0+C0*Si+E0*Ni,B0[12]=w0*e0+vi*f0+ui*I0+Ci*Ti,B0[13]=w0*Yt+vi*P0+ui*F0+Ci*Mi,B0[14]=w0*o0+vi*q0+ui*D0+Ci*Fi,B0[15]=w0*b0+vi*G0+ui*Si+Ci*Ni,this._identityCalculated=!1,this}function He(){return this._identityCalculated||(this._identity=!(this.props[0]!==1||this.props[1]!==0||this.props[2]!==0||this.props[3]!==0||this.props[4]!==0||this.props[5]!==1||this.props[6]!==0||this.props[7]!==0||this.props[8]!==0||this.props[9]!==0||this.props[10]!==1||this.props[11]!==0||this.props[12]!==0||this.props[13]!==0||this.props[14]!==0||this.props[15]!==1),this._identityCalculated=!0),this._identity}function Fe(e0){for(var Yt=0;Yt<16;){if(e0.props[Yt]!==this.props[Yt])return!1;Yt+=1}return!0}function at(e0){var Yt;for(Yt=0;Yt<16;Yt+=1)e0.props[Yt]=this.props[Yt];return e0}function ct(e0){var Yt;for(Yt=0;Yt<16;Yt+=1)this.props[Yt]=e0[Yt]}function xt(e0,Yt,o0){return{x:e0*this.props[0]+Yt*this.props[4]+o0*this.props[8]+this.props[12],y:e0*this.props[1]+Yt*this.props[5]+o0*this.props[9]+this.props[13],z:e0*this.props[2]+Yt*this.props[6]+o0*this.props[10]+this.props[14]}}function Gt(e0,Yt,o0){return e0*this.props[0]+Yt*this.props[4]+o0*this.props[8]+this.props[12]}function Lt(e0,Yt,o0){return e0*this.props[1]+Yt*this.props[5]+o0*this.props[9]+this.props[13]}function Wt(e0,Yt,o0){return e0*this.props[2]+Yt*this.props[6]+o0*this.props[10]+this.props[14]}function Pt(){var e0=this.props[0]*this.props[5]-this.props[1]*this.props[4],Yt=this.props[5]/e0,o0=-this.props[1]/e0,b0=-this.props[4]/e0,f0=this.props[0]/e0,P0=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e0,q0=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e0,G0=new Matrix;return G0.props[0]=Yt,G0.props[1]=o0,G0.props[4]=b0,G0.props[5]=f0,G0.props[12]=P0,G0.props[13]=q0,G0}function Ft(e0){var Yt=this.getInverseMatrix();return Yt.applyToPointArray(e0[0],e0[1],e0[2]||0)}function kt(e0){var Yt,o0=e0.length,b0=[];for(Yt=0;Yt<o0;Yt+=1)b0[Yt]=Ft(e0[Yt]);return b0}function Kt(e0,Yt,o0){var b0=createTypedArray("float32",6);if(this.isIdentity())b0[0]=e0[0],b0[1]=e0[1],b0[2]=Yt[0],b0[3]=Yt[1],b0[4]=o0[0],b0[5]=o0[1];else{var f0=this.props[0],P0=this.props[1],q0=this.props[4],G0=this.props[5],I0=this.props[12],F0=this.props[13];b0[0]=e0[0]*f0+e0[1]*q0+I0,b0[1]=e0[0]*P0+e0[1]*G0+F0,b0[2]=Yt[0]*f0+Yt[1]*q0+I0,b0[3]=Yt[0]*P0+Yt[1]*G0+F0,b0[4]=o0[0]*f0+o0[1]*q0+I0,b0[5]=o0[0]*P0+o0[1]*G0+F0}return b0}function i0(e0,Yt,o0){var b0;return this.isIdentity()?b0=[e0,Yt,o0]:b0=[e0*this.props[0]+Yt*this.props[4]+o0*this.props[8]+this.props[12],e0*this.props[1]+Yt*this.props[5]+o0*this.props[9]+this.props[13],e0*this.props[2]+Yt*this.props[6]+o0*this.props[10]+this.props[14]],b0}function r0(e0,Yt){if(this.isIdentity())return e0+","+Yt;var o0=this.props;return Math.round((e0*o0[0]+Yt*o0[4]+o0[12])*100)/100+","+Math.round((e0*o0[1]+Yt*o0[5]+o0[13])*100)/100}function l0(){for(var e0=0,Yt=this.props,o0="matrix3d(",b0=1e4;e0<16;)o0+=d(Yt[e0]*b0)/b0,o0+=e0===15?")":",",e0+=1;return o0}function n0(e0){var Yt=1e4;return e0<1e-6&&e0>0||e0>-1e-6&&e0<0?d(e0*Yt)/Yt:e0}function Ut(){var e0=this.props,Yt=n0(e0[0]),o0=n0(e0[1]),b0=n0(e0[4]),f0=n0(e0[5]),P0=n0(e0[12]),q0=n0(e0[13]);return"matrix("+Yt+","+o0+","+b0+","+f0+","+P0+","+q0+")"}return function(){this.reset=g,this.rotate=v,this.rotateX=C,this.rotateY=w,this.rotateZ=I,this.skew=ye,this.skewFromAxis=Se,this.shear=O,this.scale=Pe,this.setTransform=Ne,this.translate=ke,this.transform=ht,this.applyToPoint=xt,this.applyToX=Gt,this.applyToY=Lt,this.applyToZ=Wt,this.applyToPointArray=i0,this.applyToTriplePoints=Kt,this.applyToPointStringified=r0,this.toCSS=l0,this.to2dCSS=Ut,this.clone=at,this.cloneFromProps=ct,this.equals=Fe,this.inversePoints=kt,this.inversePoint=Ft,this.getInverseMatrix=Pt,this._t=this.transform,this.isIdentity=He,this._identity=!0,this._identityCalculated=!1,this.props=createTypedArray("float32",16),this.reset()}}();var standalone="__[STANDALONE]__",animationData="__[ANIMATIONDATA]__",renderer="";lottie.play=animationManager.play,lottie.pause=animationManager.pause,lottie.setLocationHref=setLocation,lottie.togglePause=animationManager.togglePause,lottie.setSpeed=animationManager.setSpeed,lottie.setDirection=animationManager.setDirection,lottie.stop=animationManager.stop,lottie.searchAnimations=searchAnimations,lottie.registerAnimation=animationManager.registerAnimation,lottie.loadAnimation=loadAnimation,lottie.setSubframeRendering=setSubframeRendering,lottie.resize=animationManager.resize,lottie.goToAndStop=animationManager.goToAndStop,lottie.destroy=animationManager.destroy,lottie.setQuality=setQuality,lottie.inBrowser=inBrowser,lottie.installPlugin=installPlugin,lottie.freeze=animationManager.freeze,lottie.unfreeze=animationManager.unfreeze,lottie.setVolume=animationManager.setVolume,lottie.mute=animationManager.mute,lottie.unmute=animationManager.unmute,lottie.getRegisteredAnimations=animationManager.getRegisteredAnimations,lottie.useWebWorker=setWebWorker,lottie.setIDPrefix=setPrefix,lottie.__getFactory=getFactory,lottie.version="[[BM_VERSION]]";var queryString="";if(standalone){var scripts=document.getElementsByTagName("script"),index$2=scripts.length-1,myScript=scripts[index$2]||{src:""};queryString=myScript.src?myScript.src.replace(/^[^\?]+\??/,""):"",renderer=getQueryVariable("renderer")}var readyStateCheckInterval=setInterval(checkReady,100);try{!(typeof exports=="object"&&typeof module!="undefined")&&!(typeof define=="function"&&define.amd)&&(window.bodymovin=lottie)}catch(m){}const ShapeModifiers=function(){var m={},t={};m.registerModifier=r,m.getModifier=d;function r(g,v){t[g]||(t[g]=v)}function d(g,v,C){return new t[g](v,C)}return m}();ShapeModifier.prototype.initModifierProperties=function(){},ShapeModifier.prototype.addShapeToModifier=function(){},ShapeModifier.prototype.addShape=function(m){if(!this.closed){m.sh.container.addDynamicProperty(m.sh);var t={shape:m.sh,data:m,localShapeCollection:shapeCollectionPool.newShapeCollection()};this.shapes.push(t),this.addShapeToModifier(t),this._isAnimated&&m.setAsAnimated()}},ShapeModifier.prototype.init=function(m,t){this.shapes=[],this.elem=m,this.initDynamicPropertyContainer(m),this.initModifierProperties(m,t),this.frameId=initialDefaultFrame,this.closed=!1,this.k=!1,this.dynamicProperties.length?this.k=!0:this.getValue(!0)},ShapeModifier.prototype.processKeys=function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties())},extendPrototype([DynamicPropertyContainer],ShapeModifier),extendPrototype([ShapeModifier],TrimModifier),TrimModifier.prototype.initModifierProperties=function(m,t){this.s=PropertyFactory.getProp(m,t.s,0,.01,this),this.e=PropertyFactory.getProp(m,t.e,0,.01,this),this.o=PropertyFactory.getProp(m,t.o,0,0,this),this.sValue=0,this.eValue=0,this.getValue=this.processKeys,this.m=t.m,this._isAnimated=!!this.s.effectsSequence.length||!!this.e.effectsSequence.length||!!this.o.effectsSequence.length},TrimModifier.prototype.addShapeToModifier=function(m){m.pathsData=[]},TrimModifier.prototype.calculateShapeEdges=function(m,t,r,d,g){var v=[];t<=1?v.push({s:m,e:t}):m>=1?v.push({s:m-1,e:t-1}):(v.push({s:m,e:1}),v.push({s:0,e:t-1}));var C=[],w,I=v.length,O;for(w=0;w<I;w+=1)if(O=v[w],!(O.e*g<d||O.s*g>d+r)){var ye,Se;O.s*g<=d?ye=0:ye=(O.s*g-d)/r,O.e*g>=d+r?Se=1:Se=(O.e*g-d)/r,C.push([ye,Se])}return C.length||C.push([0,0]),C},TrimModifier.prototype.releasePathsData=function(m){var t,r=m.length;for(t=0;t<r;t+=1)segmentsLengthPool.release(m[t]);return m.length=0,m},TrimModifier.prototype.processShapes=function(m){var t,r;if(this._mdf||m){var d=this.o.v%360/360;if(d<0&&(d+=1),this.s.v>1?t=1+d:this.s.v<0?t=0+d:t=this.s.v+d,this.e.v>1?r=1+d:this.e.v<0?r=0+d:r=this.e.v+d,t>r){var g=t;t=r,r=g}t=Math.round(t*1e4)*1e-4,r=Math.round(r*1e4)*1e-4,this.sValue=t,this.eValue=r}else t=this.sValue,r=this.eValue;var v,C,w=this.shapes.length,I,O,ye,Se,Pe,Ne=0;if(r===t)for(C=0;C<w;C+=1)this.shapes[C].localShapeCollection.releaseShapes(),this.shapes[C].shape._mdf=!0,this.shapes[C].shape.paths=this.shapes[C].localShapeCollection,this._mdf&&(this.shapes[C].pathsData.length=0);else if(r===1&&t===0||r===0&&t===1){if(this._mdf)for(C=0;C<w;C+=1)this.shapes[C].pathsData.length=0,this.shapes[C].shape._mdf=!0}else{var ke=[],ht,He;for(C=0;C<w;C+=1)if(ht=this.shapes[C],!ht.shape._mdf&&!this._mdf&&!m&&this.m!==2)ht.shape.paths=ht.localShapeCollection;else{if(v=ht.shape.paths,O=v._length,Pe=0,!ht.shape._mdf&&ht.pathsData.length)Pe=ht.totalShapeLength;else{for(ye=this.releasePathsData(ht.pathsData),I=0;I<O;I+=1)Se=bez.getSegmentsLength(v.shapes[I]),ye.push(Se),Pe+=Se.totalLength;ht.totalShapeLength=Pe,ht.pathsData=ye}Ne+=Pe,ht.shape._mdf=!0}var Fe=t,at=r,ct=0,xt;for(C=w-1;C>=0;C-=1)if(ht=this.shapes[C],ht.shape._mdf){for(He=ht.localShapeCollection,He.releaseShapes(),this.m===2&&w>1?(xt=this.calculateShapeEdges(t,r,ht.totalShapeLength,ct,Ne),ct+=ht.totalShapeLength):xt=[[Fe,at]],O=xt.length,I=0;I<O;I+=1){Fe=xt[I][0],at=xt[I][1],ke.length=0,at<=1?ke.push({s:ht.totalShapeLength*Fe,e:ht.totalShapeLength*at}):Fe>=1?ke.push({s:ht.totalShapeLength*(Fe-1),e:ht.totalShapeLength*(at-1)}):(ke.push({s:ht.totalShapeLength*Fe,e:ht.totalShapeLength}),ke.push({s:0,e:ht.totalShapeLength*(at-1)}));var Gt=this.addShapes(ht,ke[0]);if(ke[0].s!==ke[0].e){if(ke.length>1){var Lt=ht.shape.paths.shapes[ht.shape.paths._length-1];if(Lt.c){var Wt=Gt.pop();this.addPaths(Gt,He),Gt=this.addShapes(ht,ke[1],Wt)}else this.addPaths(Gt,He),Gt=this.addShapes(ht,ke[1])}this.addPaths(Gt,He)}}ht.shape.paths=He}}},TrimModifier.prototype.addPaths=function(m,t){var r,d=m.length;for(r=0;r<d;r+=1)t.addShape(m[r])},TrimModifier.prototype.addSegment=function(m,t,r,d,g,v,C){g.setXYAt(t[0],t[1],"o",v),g.setXYAt(r[0],r[1],"i",v+1),C&&g.setXYAt(m[0],m[1],"v",v),g.setXYAt(d[0],d[1],"v",v+1)},TrimModifier.prototype.addSegmentFromArray=function(m,t,r,d){t.setXYAt(m[1],m[5],"o",r),t.setXYAt(m[2],m[6],"i",r+1),d&&t.setXYAt(m[0],m[4],"v",r),t.setXYAt(m[3],m[7],"v",r+1)},TrimModifier.prototype.addShapes=function(m,t,r){var d=m.pathsData,g=m.shape.paths.shapes,v,C=m.shape.paths._length,w,I,O=0,ye,Se,Pe,Ne,ke=[],ht,He=!0;for(r?(Se=r._length,ht=r._length):(r=shapePool.newElement(),Se=0,ht=0),ke.push(r),v=0;v<C;v+=1){for(Pe=d[v].lengths,r.c=g[v].c,I=g[v].c?Pe.length:Pe.length+1,w=1;w<I;w+=1)if(ye=Pe[w-1],O+ye.addedLength<t.s)O+=ye.addedLength,r.c=!1;else if(O>t.e){r.c=!1;break}else t.s<=O&&t.e>=O+ye.addedLength?(this.addSegment(g[v].v[w-1],g[v].o[w-1],g[v].i[w],g[v].v[w],r,Se,He),He=!1):(Ne=bez.getNewSegment(g[v].v[w-1],g[v].v[w],g[v].o[w-1],g[v].i[w],(t.s-O)/ye.addedLength,(t.e-O)/ye.addedLength,Pe[w-1]),this.addSegmentFromArray(Ne,r,Se,He),He=!1,r.c=!1),O+=ye.addedLength,Se+=1;if(g[v].c&&Pe.length){if(ye=Pe[w-1],O<=t.e){var Fe=Pe[w-1].addedLength;t.s<=O&&t.e>=O+Fe?(this.addSegment(g[v].v[w-1],g[v].o[w-1],g[v].i[0],g[v].v[0],r,Se,He),He=!1):(Ne=bez.getNewSegment(g[v].v[w-1],g[v].v[0],g[v].o[w-1],g[v].i[0],(t.s-O)/Fe,(t.e-O)/Fe,Pe[w-1]),this.addSegmentFromArray(Ne,r,Se,He),He=!1,r.c=!1)}else r.c=!1;O+=ye.addedLength,Se+=1}if(r._length&&(r.setXYAt(r.v[ht][0],r.v[ht][1],"i",ht),r.setXYAt(r.v[r._length-1][0],r.v[r._length-1][1],"o",r._length-1)),O>t.e)break;v<C-1&&(r=shapePool.newElement(),He=!0,ke.push(r),Se=0)}return ke},extendPrototype([ShapeModifier],PuckerAndBloatModifier),PuckerAndBloatModifier.prototype.initModifierProperties=function(m,t){this.getValue=this.processKeys,this.amount=PropertyFactory.getProp(m,t.a,0,null,this),this._isAnimated=!!this.amount.effectsSequence.length},PuckerAndBloatModifier.prototype.processPath=function(m,t){var r=t/100,d=[0,0],g=m._length,v=0;for(v=0;v<g;v+=1)d[0]+=m.v[v][0],d[1]+=m.v[v][1];d[0]/=g,d[1]/=g;var C=shapePool.newElement();C.c=m.c;var w,I,O,ye,Se,Pe;for(v=0;v<g;v+=1)w=m.v[v][0]+(d[0]-m.v[v][0])*r,I=m.v[v][1]+(d[1]-m.v[v][1])*r,O=m.o[v][0]+(d[0]-m.o[v][0])*-r,ye=m.o[v][1]+(d[1]-m.o[v][1])*-r,Se=m.i[v][0]+(d[0]-m.i[v][0])*-r,Pe=m.i[v][1]+(d[1]-m.i[v][1])*-r,C.setTripleAt(w,I,O,ye,Se,Pe,v);return C},PuckerAndBloatModifier.prototype.processShapes=function(m){var t,r,d=this.shapes.length,g,v,C=this.amount.v;if(C!==0){var w,I;for(r=0;r<d;r+=1){if(w=this.shapes[r],I=w.localShapeCollection,!(!w.shape._mdf&&!this._mdf&&!m))for(I.releaseShapes(),w.shape._mdf=!0,t=w.shape.paths.shapes,v=w.shape.paths._length,g=0;g<v;g+=1)I.addShape(this.processPath(t[g],C));w.shape.paths=w.localShapeCollection}}this.dynamicProperties.length||(this._mdf=!1)};const TransformPropertyFactory=function(){var m=[0,0];function t(I){var O=this._mdf;this.iterateDynamicProperties(),this._mdf=this._mdf||O,this.a&&I.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&I.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&I.skewFromAxis(-this.sk.v,this.sa.v),this.r?I.rotate(-this.r.v):I.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?I.translate(this.px.v,this.py.v,-this.pz.v):I.translate(this.px.v,this.py.v,0):I.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function r(I){if(this.elem.globalData.frameId!==this.frameId){if(this._isDirty&&(this.precalculateMatrix(),this._isDirty=!1),this.iterateDynamicProperties(),this._mdf||I){var O;if(this.v.cloneFromProps(this.pre.props),this.appliedTransformations<1&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations<2&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.appliedTransformations<3&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r&&this.appliedTransformations<4?this.v.rotate(-this.r.v):!this.r&&this.appliedTransformations<4&&this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented){var ye,Se;if(O=this.elem.globalData.frameRate,this.p&&this.p.keyframes&&this.p.getValueAtTime)this.p._caching.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(ye=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/O,0),Se=this.p.getValueAtTime(this.p.keyframes[0].t/O,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(ye=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/O,0),Se=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.05)/O,0)):(ye=this.p.pv,Se=this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/O,this.p.offsetTime));else if(this.px&&this.px.keyframes&&this.py.keyframes&&this.px.getValueAtTime&&this.py.getValueAtTime){ye=[],Se=[];var Pe=this.px,Ne=this.py;Pe._caching.lastFrame+Pe.offsetTime<=Pe.keyframes[0].t?(ye[0]=Pe.getValueAtTime((Pe.keyframes[0].t+.01)/O,0),ye[1]=Ne.getValueAtTime((Ne.keyframes[0].t+.01)/O,0),Se[0]=Pe.getValueAtTime(Pe.keyframes[0].t/O,0),Se[1]=Ne.getValueAtTime(Ne.keyframes[0].t/O,0)):Pe._caching.lastFrame+Pe.offsetTime>=Pe.keyframes[Pe.keyframes.length-1].t?(ye[0]=Pe.getValueAtTime(Pe.keyframes[Pe.keyframes.length-1].t/O,0),ye[1]=Ne.getValueAtTime(Ne.keyframes[Ne.keyframes.length-1].t/O,0),Se[0]=Pe.getValueAtTime((Pe.keyframes[Pe.keyframes.length-1].t-.01)/O,0),Se[1]=Ne.getValueAtTime((Ne.keyframes[Ne.keyframes.length-1].t-.01)/O,0)):(ye=[Pe.pv,Ne.pv],Se[0]=Pe.getValueAtTime((Pe._caching.lastFrame+Pe.offsetTime-.01)/O,Pe.offsetTime),Se[1]=Ne.getValueAtTime((Ne._caching.lastFrame+Ne.offsetTime-.01)/O,Ne.offsetTime))}else Se=m,ye=Se;this.v.rotate(-Math.atan2(ye[1]-Se[1],ye[0]-Se[0]))}this.data.p&&this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}}function d(){if(!this.a.k)this.pre.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations=1;else return;if(!this.s.effectsSequence.length)this.pre.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.appliedTransformations=2;else return;if(this.sk)if(!this.sk.effectsSequence.length&&!this.sa.effectsSequence.length)this.pre.skewFromAxis(-this.sk.v,this.sa.v),this.appliedTransformations=3;else return;this.r?this.r.effectsSequence.length||(this.pre.rotate(-this.r.v),this.appliedTransformations=4):!this.rz.effectsSequence.length&&!this.ry.effectsSequence.length&&!this.rx.effectsSequence.length&&!this.or.effectsSequence.length&&(this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.appliedTransformations=4)}function g(){}function v(I){this._addDynamicProperty(I),this.elem.addDynamicProperty(I),this._isDirty=!0}function C(I,O,ye){if(this.elem=I,this.frameId=-1,this.propType="transform",this.data=O,this.v=new Matrix,this.pre=new Matrix,this.appliedTransformations=0,this.initDynamicPropertyContainer(ye||I),O.p&&O.p.s?(this.px=PropertyFactory.getProp(I,O.p.x,0,0,this),this.py=PropertyFactory.getProp(I,O.p.y,0,0,this),O.p.z&&(this.pz=PropertyFactory.getProp(I,O.p.z,0,0,this))):this.p=PropertyFactory.getProp(I,O.p||{k:[0,0,0]},1,0,this),O.rx){if(this.rx=PropertyFactory.getProp(I,O.rx,0,degToRads,this),this.ry=PropertyFactory.getProp(I,O.ry,0,degToRads,this),this.rz=PropertyFactory.getProp(I,O.rz,0,degToRads,this),O.or.k[0].ti){var Se,Pe=O.or.k.length;for(Se=0;Se<Pe;Se+=1)O.or.k[Se].to=null,O.or.k[Se].ti=null}this.or=PropertyFactory.getProp(I,O.or,1,degToRads,this),this.or.sh=!0}else this.r=PropertyFactory.getProp(I,O.r||{k:0},0,degToRads,this);O.sk&&(this.sk=PropertyFactory.getProp(I,O.sk,0,degToRads,this),this.sa=PropertyFactory.getProp(I,O.sa,0,degToRads,this)),this.a=PropertyFactory.getProp(I,O.a||{k:[0,0,0]},1,0,this),this.s=PropertyFactory.getProp(I,O.s||{k:[100,100,100]},1,.01,this),O.o?this.o=PropertyFactory.getProp(I,O.o,0,.01,I):this.o={_mdf:!1,v:1},this._isDirty=!0,this.dynamicProperties.length||this.getValue(!0)}C.prototype={applyToMatrix:t,getValue:r,precalculateMatrix:d,autoOrient:g},extendPrototype([DynamicPropertyContainer],C),C.prototype.addDynamicProperty=v,C.prototype._addDynamicProperty=DynamicPropertyContainer.prototype.addDynamicProperty;function w(I,O,ye){return new C(I,O,ye)}return{getTransformProperty:w}}();extendPrototype([ShapeModifier],RepeaterModifier),RepeaterModifier.prototype.initModifierProperties=function(m,t){this.getValue=this.processKeys,this.c=PropertyFactory.getProp(m,t.c,0,null,this),this.o=PropertyFactory.getProp(m,t.o,0,null,this),this.tr=TransformPropertyFactory.getTransformProperty(m,t.tr,this),this.so=PropertyFactory.getProp(m,t.tr.so,0,.01,this),this.eo=PropertyFactory.getProp(m,t.tr.eo,0,.01,this),this.data=t,this.dynamicProperties.length||this.getValue(!0),this._isAnimated=!!this.dynamicProperties.length,this.pMatrix=new Matrix,this.rMatrix=new Matrix,this.sMatrix=new Matrix,this.tMatrix=new Matrix,this.matrix=new Matrix},RepeaterModifier.prototype.applyTransforms=function(m,t,r,d,g,v){var C=v?-1:1,w=d.s.v[0]+(1-d.s.v[0])*(1-g),I=d.s.v[1]+(1-d.s.v[1])*(1-g);m.translate(d.p.v[0]*C*g,d.p.v[1]*C*g,d.p.v[2]),t.translate(-d.a.v[0],-d.a.v[1],d.a.v[2]),t.rotate(-d.r.v*C*g),t.translate(d.a.v[0],d.a.v[1],d.a.v[2]),r.translate(-d.a.v[0],-d.a.v[1],d.a.v[2]),r.scale(v?1/w:w,v?1/I:I),r.translate(d.a.v[0],d.a.v[1],d.a.v[2])},RepeaterModifier.prototype.init=function(m,t,r,d){for(this.elem=m,this.arr=t,this.pos=r,this.elemsData=d,this._currentCopies=0,this._elements=[],this._groups=[],this.frameId=-1,this.initDynamicPropertyContainer(m),this.initModifierProperties(m,t[r]);r>0;)r-=1,this._elements.unshift(t[r]);this.dynamicProperties.length?this.k=!0:this.getValue(!0)},RepeaterModifier.prototype.resetElements=function(m){var t,r=m.length;for(t=0;t<r;t+=1)m[t]._processed=!1,m[t].ty==="gr"&&this.resetElements(m[t].it)},RepeaterModifier.prototype.cloneElements=function(m){var t=JSON.parse(JSON.stringify(m));return this.resetElements(t),t},RepeaterModifier.prototype.changeGroupRender=function(m,t){var r,d=m.length;for(r=0;r<d;r+=1)m[r]._render=t,m[r].ty==="gr"&&this.changeGroupRender(m[r].it,t)},RepeaterModifier.prototype.processShapes=function(m){var t,r,d,g,v,C=!1;if(this._mdf||m){var w=Math.ceil(this.c.v);if(this._groups.length<w){for(;this._groups.length<w;){var I={it:this.cloneElements(this._elements),ty:"gr"};I.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:1,ix:6,k:[{s:0,e:0,t:0},{s:0,e:0,t:1}]},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,I),this._groups.splice(0,0,I),this._currentCopies+=1}this.elem.reloadShapes(),C=!0}v=0;var O;for(d=0;d<=this._groups.length-1;d+=1){if(O=v<w,this._groups[d]._render=O,this.changeGroupRender(this._groups[d].it,O),!O){var ye=this.elemsData[d].it,Se=ye[ye.length-1];Se.transform.op.v!==0?(Se.transform.op._mdf=!0,Se.transform.op.v=0):Se.transform.op._mdf=!1}v+=1}this._currentCopies=w;var Pe=this.o.v,Ne=Pe%1,ke=Pe>0?Math.floor(Pe):Math.ceil(Pe),ht=this.pMatrix.props,He=this.rMatrix.props,Fe=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var at=0;if(Pe>0){for(;at<ke;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),at+=1;Ne&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,Ne,!1),at+=Ne)}else if(Pe<0){for(;at>ke;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),at-=1;Ne&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-Ne,!0),at-=Ne)}d=this.data.m===1?0:this._currentCopies-1,g=this.data.m===1?1:-1,v=this._currentCopies;for(var ct,xt;v;){if(t=this.elemsData[d].it,r=t[t.length-1].transform.mProps.v.props,xt=r.length,t[t.length-1].transform.mProps._mdf=!0,t[t.length-1].transform.op._mdf=!0,t[t.length-1].transform.op.v=this._currentCopies===1?this.so.v:this.so.v+(this.eo.v-this.so.v)*(d/(this._currentCopies-1)),at!==0){for((d!==0&&g===1||d!==this._currentCopies-1&&g===-1)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(He[0],He[1],He[2],He[3],He[4],He[5],He[6],He[7],He[8],He[9],He[10],He[11],He[12],He[13],He[14],He[15]),this.matrix.transform(Fe[0],Fe[1],Fe[2],Fe[3],Fe[4],Fe[5],Fe[6],Fe[7],Fe[8],Fe[9],Fe[10],Fe[11],Fe[12],Fe[13],Fe[14],Fe[15]),this.matrix.transform(ht[0],ht[1],ht[2],ht[3],ht[4],ht[5],ht[6],ht[7],ht[8],ht[9],ht[10],ht[11],ht[12],ht[13],ht[14],ht[15]),ct=0;ct<xt;ct+=1)r[ct]=this.matrix.props[ct];this.matrix.reset()}else for(this.matrix.reset(),ct=0;ct<xt;ct+=1)r[ct]=this.matrix.props[ct];at+=1,v-=1,d+=g}}else for(v=this._currentCopies,d=0,g=1;v;)t=this.elemsData[d].it,r=t[t.length-1].transform.mProps.v.props,t[t.length-1].transform.mProps._mdf=!1,t[t.length-1].transform.op._mdf=!1,v-=1,d+=g;return C},RepeaterModifier.prototype.addShape=function(){},extendPrototype([ShapeModifier],RoundCornersModifier),RoundCornersModifier.prototype.initModifierProperties=function(m,t){this.getValue=this.processKeys,this.rd=PropertyFactory.getProp(m,t.r,0,null,this),this._isAnimated=!!this.rd.effectsSequence.length},RoundCornersModifier.prototype.processPath=function(m,t){var r=shapePool.newElement();r.c=m.c;var d,g=m._length,v,C,w,I,O,ye,Se=0,Pe,Ne,ke,ht,He,Fe;for(d=0;d<g;d+=1)v=m.v[d],w=m.o[d],C=m.i[d],v[0]===w[0]&&v[1]===w[1]&&v[0]===C[0]&&v[1]===C[1]?(d===0||d===g-1)&&!m.c?(r.setTripleAt(v[0],v[1],w[0],w[1],C[0],C[1],Se),Se+=1):(d===0?I=m.v[g-1]:I=m.v[d-1],O=Math.sqrt(Math.pow(v[0]-I[0],2)+Math.pow(v[1]-I[1],2)),ye=O?Math.min(O/2,t)/O:0,He=v[0]+(I[0]-v[0])*ye,Pe=He,Fe=v[1]-(v[1]-I[1])*ye,Ne=Fe,ke=Pe-(Pe-v[0])*roundCorner,ht=Ne-(Ne-v[1])*roundCorner,r.setTripleAt(Pe,Ne,ke,ht,He,Fe,Se),Se+=1,d===g-1?I=m.v[0]:I=m.v[d+1],O=Math.sqrt(Math.pow(v[0]-I[0],2)+Math.pow(v[1]-I[1],2)),ye=O?Math.min(O/2,t)/O:0,ke=v[0]+(I[0]-v[0])*ye,Pe=ke,ht=v[1]+(I[1]-v[1])*ye,Ne=ht,He=Pe-(Pe-v[0])*roundCorner,Fe=Ne-(Ne-v[1])*roundCorner,r.setTripleAt(Pe,Ne,ke,ht,He,Fe,Se),Se+=1):(r.setTripleAt(m.v[d][0],m.v[d][1],m.o[d][0],m.o[d][1],m.i[d][0],m.i[d][1],Se),Se+=1);return r},RoundCornersModifier.prototype.processShapes=function(m){var t,r,d=this.shapes.length,g,v,C=this.rd.v;if(C!==0){var w,I;for(r=0;r<d;r+=1){if(w=this.shapes[r],I=w.localShapeCollection,!(!w.shape._mdf&&!this._mdf&&!m))for(I.releaseShapes(),w.shape._mdf=!0,t=w.shape.paths.shapes,v=w.shape.paths._length,g=0;g<v;g+=1)I.addShape(this.processPath(t[g],C));w.shape.paths=w.localShapeCollection}}this.dynamicProperties.length||(this._mdf=!1)};const FontManager=function(){var m=5e3,t={w:0,size:0,shapes:[],data:{shapes:[]}},r=[];r=r.concat([2304,2305,2306,2307,2362,2363,2364,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2387,2388,2389,2390,2391,2402,2403]);var d=["d83cdffb","d83cdffc","d83cdffd","d83cdffe","d83cdfff"],g=[65039,8205];function v(xt){var Gt=xt.split(","),Lt,Wt=Gt.length,Pt=[];for(Lt=0;Lt<Wt;Lt+=1)Gt[Lt]!=="sans-serif"&&Gt[Lt]!=="monospace"&&Pt.push(Gt[Lt]);return Pt.join(",")}function C(xt,Gt){var Lt=createTag("span");Lt.setAttribute("aria-hidden",!0),Lt.style.fontFamily=Gt;var Wt=createTag("span");Wt.innerText="giItT1WQy@!-/#",Lt.style.position="absolute",Lt.style.left="-10000px",Lt.style.top="-10000px",Lt.style.fontSize="300px",Lt.style.fontVariant="normal",Lt.style.fontStyle="normal",Lt.style.fontWeight="normal",Lt.style.letterSpacing="0",Lt.appendChild(Wt),document.body.appendChild(Lt);var Pt=Wt.offsetWidth;return Wt.style.fontFamily=v(xt)+", "+Gt,{node:Wt,w:Pt,parent:Lt}}function w(){var xt,Gt=this.fonts.length,Lt,Wt,Pt=Gt;for(xt=0;xt<Gt;xt+=1)this.fonts[xt].loaded?Pt-=1:this.fonts[xt].fOrigin==="n"||this.fonts[xt].origin===0?this.fonts[xt].loaded=!0:(Lt=this.fonts[xt].monoCase.node,Wt=this.fonts[xt].monoCase.w,Lt.offsetWidth!==Wt?(Pt-=1,this.fonts[xt].loaded=!0):(Lt=this.fonts[xt].sansCase.node,Wt=this.fonts[xt].sansCase.w,Lt.offsetWidth!==Wt&&(Pt-=1,this.fonts[xt].loaded=!0)),this.fonts[xt].loaded&&(this.fonts[xt].sansCase.parent.parentNode.removeChild(this.fonts[xt].sansCase.parent),this.fonts[xt].monoCase.parent.parentNode.removeChild(this.fonts[xt].monoCase.parent)));Pt!==0&&Date.now()-this.initTime<m?setTimeout(this.checkLoadedFontsBinded,20):setTimeout(this.setIsLoadedBinded,10)}function I(xt,Gt){var Lt=document.body&&Gt?"svg":"canvas",Wt,Pt=getFontProperties(xt);if(Lt==="svg"){var Ft=createNS("text");Ft.style.fontSize="100px",Ft.setAttribute("font-family",xt.fFamily),Ft.setAttribute("font-style",Pt.style),Ft.setAttribute("font-weight",Pt.weight),Ft.textContent="1",xt.fClass?(Ft.style.fontFamily="inherit",Ft.setAttribute("class",xt.fClass)):Ft.style.fontFamily=xt.fFamily,Gt.appendChild(Ft),Wt=Ft}else{var kt=new OffscreenCanvas(500,500).getContext("2d");kt.font=Pt.style+" "+Pt.weight+" 100px "+xt.fFamily,Wt=kt}function Kt(i0){return Lt==="svg"?(Wt.textContent=i0,Wt.getComputedTextLength()):Wt.measureText(i0).width}return{measureText:Kt}}function O(xt,Gt){if(!xt){this.isLoaded=!0;return}if(this.chars){this.isLoaded=!0,this.fonts=xt.list;return}if(!document.body){this.isLoaded=!0,xt.list.forEach(Ut=>{Ut.helper=I(Ut),Ut.cache={}}),this.fonts=xt.list;return}var Lt=xt.list,Wt,Pt=Lt.length,Ft=Pt;for(Wt=0;Wt<Pt;Wt+=1){var kt=!0,Kt,i0;if(Lt[Wt].loaded=!1,Lt[Wt].monoCase=C(Lt[Wt].fFamily,"monospace"),Lt[Wt].sansCase=C(Lt[Wt].fFamily,"sans-serif"),!Lt[Wt].fPath)Lt[Wt].loaded=!0,Ft-=1;else if(Lt[Wt].fOrigin==="p"||Lt[Wt].origin===3){if(Kt=document.querySelectorAll('style[f-forigin="p"][f-family="'+Lt[Wt].fFamily+'"], style[f-origin="3"][f-family="'+Lt[Wt].fFamily+'"]'),Kt.length>0&&(kt=!1),kt){var r0=createTag("style");r0.setAttribute("f-forigin",Lt[Wt].fOrigin),r0.setAttribute("f-origin",Lt[Wt].origin),r0.setAttribute("f-family",Lt[Wt].fFamily),r0.type="text/css",r0.innerText="@font-face {font-family: "+Lt[Wt].fFamily+"; font-style: normal; src: url('"+Lt[Wt].fPath+"');}",Gt.appendChild(r0)}}else if(Lt[Wt].fOrigin==="g"||Lt[Wt].origin===1){for(Kt=document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'),i0=0;i0<Kt.length;i0+=1)Kt[i0].href.indexOf(Lt[Wt].fPath)!==-1&&(kt=!1);if(kt){var l0=createTag("link");l0.setAttribute("f-forigin",Lt[Wt].fOrigin),l0.setAttribute("f-origin",Lt[Wt].origin),l0.type="text/css",l0.rel="stylesheet",l0.href=Lt[Wt].fPath,document.body.appendChild(l0)}}else if(Lt[Wt].fOrigin==="t"||Lt[Wt].origin===2){for(Kt=document.querySelectorAll('script[f-forigin="t"], script[f-origin="2"]'),i0=0;i0<Kt.length;i0+=1)Lt[Wt].fPath===Kt[i0].src&&(kt=!1);if(kt){var n0=createTag("link");n0.setAttribute("f-forigin",Lt[Wt].fOrigin),n0.setAttribute("f-origin",Lt[Wt].origin),n0.setAttribute("rel","stylesheet"),n0.setAttribute("href",Lt[Wt].fPath),Gt.appendChild(n0)}}Lt[Wt].helper=I(Lt[Wt],Gt),Lt[Wt].cache={},this.fonts.push(Lt[Wt])}Ft===0?this.isLoaded=!0:setTimeout(this.checkLoadedFonts.bind(this),100)}function ye(xt){if(xt){this.chars||(this.chars=[]);var Gt,Lt=xt.length,Wt,Pt=this.chars.length,Ft;for(Gt=0;Gt<Lt;Gt+=1){for(Wt=0,Ft=!1;Wt<Pt;)this.chars[Wt].style===xt[Gt].style&&this.chars[Wt].fFamily===xt[Gt].fFamily&&this.chars[Wt].ch===xt[Gt].ch&&(Ft=!0),Wt+=1;Ft||(this.chars.push(xt[Gt]),Pt+=1)}}}function Se(xt,Gt,Lt){for(var Wt=0,Pt=this.chars.length;Wt<Pt;){if(this.chars[Wt].ch===xt&&this.chars[Wt].style===Gt&&this.chars[Wt].fFamily===Lt)return this.chars[Wt];Wt+=1}return(typeof xt=="string"&&xt.charCodeAt(0)!==13||!xt)&&console&&console.warn&&!this._warned&&(this._warned=!0,console.warn("Missing character from exported characters list: ",xt,Gt,Lt)),t}function Pe(xt,Gt,Lt){var Wt=this.getFontByName(Gt),Pt=xt.charCodeAt(0);if(!Wt.cache[Pt+1]){var Ft=Wt.helper;if(xt===" "){var kt=Ft.measureText("|"+xt+"|"),Kt=Ft.measureText("||");Wt.cache[Pt+1]=(kt-Kt)/100}else Wt.cache[Pt+1]=Ft.measureText(xt)/100}return Wt.cache[Pt+1]*Lt}function Ne(xt){for(var Gt=0,Lt=this.fonts.length;Gt<Lt;){if(this.fonts[Gt].fName===xt)return this.fonts[Gt];Gt+=1}return this.fonts[0]}function ke(xt,Gt){var Lt=xt.toString(16)+Gt.toString(16);return d.indexOf(Lt)!==-1}function ht(xt,Gt){return Gt?xt===g[0]&&Gt===g[1]:xt===g[1]}function He(xt){return r.indexOf(xt)!==-1}function Fe(){this.isLoaded=!0}var at=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this._warned=!1,this.initTime=Date.now(),this.setIsLoadedBinded=this.setIsLoaded.bind(this),this.checkLoadedFontsBinded=this.checkLoadedFonts.bind(this)};at.isModifier=ke,at.isZeroWidthJoiner=ht,at.isCombinedCharacter=He;var ct={addChars:ye,addFonts:O,getCharData:Se,getFontByName:Ne,measureText:Pe,checkLoadedFonts:w,setIsLoaded:Fe};return at.prototype=ct,at}();RenderableElement.prototype={initRenderable:function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1,this.renderableComponents=[]},addRenderableComponent:function(m){this.renderableComponents.indexOf(m)===-1&&this.renderableComponents.push(m)},removeRenderableComponent:function(m){this.renderableComponents.indexOf(m)!==-1&&this.renderableComponents.splice(this.renderableComponents.indexOf(m),1)},prepareRenderableFrame:function(m){this.checkLayerLimits(m)},checkTransparency:function(){this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this.globalData.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},checkLayerLimits:function(m){this.data.ip-this.data.st<=m&&this.data.op-this.data.st>m?this.isInRange!==!0&&(this.globalData._mdf=!0,this._mdf=!0,this.isInRange=!0,this.show()):this.isInRange!==!1&&(this.globalData._mdf=!0,this.isInRange=!1,this.hide())},renderRenderable:function(){var m,t=this.renderableComponents.length;for(m=0;m<t;m+=1)this.renderableComponents[m].renderFrame(this._isFirstFrame)},sourceRectAtTime:function(){return{top:0,left:0,width:100,height:100}},getLayerSize:function(){return this.data.ty===5?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}}};const MaskManagerInterface=function(){function m(r,d){this._mask=r,this._data=d}Object.defineProperty(m.prototype,"maskPath",{get:function(){return this._mask.prop.k&&this._mask.prop.getValue(),this._mask.prop}}),Object.defineProperty(m.prototype,"maskOpacity",{get:function(){return this._mask.op.k&&this._mask.op.getValue(),this._mask.op.v*100}});var t=function(r){var d=createSizedArray(r.viewData.length),g,v=r.viewData.length;for(g=0;g<v;g+=1)d[g]=new m(r.viewData[g],r.masksProperties[g]);var C=function(w){for(g=0;g<v;){if(r.masksProperties[g].nm===w)return d[g];g+=1}return null};return C};return t}(),ExpressionPropertyInterface=function(){var m={pv:0,v:0,mult:1},t={pv:[0,0,0],v:[0,0,0],mult:1};function r(C,w,I){Object.defineProperty(C,"velocity",{get:function(){return w.getVelocityAtTime(w.comp.currentFrame)}}),C.numKeys=w.keyframes?w.keyframes.length:0,C.key=function(O){if(!C.numKeys)return 0;var ye="";"s"in w.keyframes[O-1]?ye=w.keyframes[O-1].s:"e"in w.keyframes[O-2]?ye=w.keyframes[O-2].e:ye=w.keyframes[O-2].s;var Se=I==="unidimensional"?new Number(ye):Object.assign({},ye);return Se.time=w.keyframes[O-1].t/w.elem.comp.globalData.frameRate,Se.value=I==="unidimensional"?ye[0]:ye,Se},C.valueAtTime=w.getValueAtTime,C.speedAtTime=w.getSpeedAtTime,C.velocityAtTime=w.getVelocityAtTime,C.propertyGroup=w.propertyGroup}function d(C){(!C||!("pv"in C))&&(C=m);var w=1/C.mult,I=C.pv*w,O=new Number(I);return O.value=I,r(O,C,"unidimensional"),function(){return C.k&&C.getValue(),I=C.v*w,O.value!==I&&(O=new Number(I),O.value=I,r(O,C,"unidimensional")),O}}function g(C){(!C||!("pv"in C))&&(C=t);var w=1/C.mult,I=C.data&&C.data.l||C.pv.length,O=createTypedArray("float32",I),ye=createTypedArray("float32",I);return O.value=ye,r(O,C,"multidimensional"),function(){C.k&&C.getValue();for(var Se=0;Se<I;Se+=1)ye[Se]=C.v[Se]*w,O[Se]=ye[Se];return O}}function v(){return m}return function(C){return C?C.propType==="unidimensional"?d(C):g(C):v}}(),TransformExpressionInterface=function(){return function(m){function t(C){switch(C){case"scale":case"Scale":case"ADBE Scale":case 6:return t.scale;case"rotation":case"Rotation":case"ADBE Rotation":case"ADBE Rotate Z":case 10:return t.rotation;case"ADBE Rotate X":return t.xRotation;case"ADBE Rotate Y":return t.yRotation;case"position":case"Position":case"ADBE Position":case 2:return t.position;case"ADBE Position_0":return t.xPosition;case"ADBE Position_1":return t.yPosition;case"ADBE Position_2":return t.zPosition;case"anchorPoint":case"AnchorPoint":case"Anchor Point":case"ADBE AnchorPoint":case 1:return t.anchorPoint;case"opacity":case"Opacity":case 11:return t.opacity;default:return null}}Object.defineProperty(t,"rotation",{get:ExpressionPropertyInterface(m.r||m.rz)}),Object.defineProperty(t,"zRotation",{get:ExpressionPropertyInterface(m.rz||m.r)}),Object.defineProperty(t,"xRotation",{get:ExpressionPropertyInterface(m.rx)}),Object.defineProperty(t,"yRotation",{get:ExpressionPropertyInterface(m.ry)}),Object.defineProperty(t,"scale",{get:ExpressionPropertyInterface(m.s)});var r,d,g,v;return m.p?v=ExpressionPropertyInterface(m.p):(r=ExpressionPropertyInterface(m.px),d=ExpressionPropertyInterface(m.py),m.pz&&(g=ExpressionPropertyInterface(m.pz))),Object.defineProperty(t,"position",{get:function(){return m.p?v():[r(),d(),g?g():0]}}),Object.defineProperty(t,"xPosition",{get:ExpressionPropertyInterface(m.px)}),Object.defineProperty(t,"yPosition",{get:ExpressionPropertyInterface(m.py)}),Object.defineProperty(t,"zPosition",{get:ExpressionPropertyInterface(m.pz)}),Object.defineProperty(t,"anchorPoint",{get:ExpressionPropertyInterface(m.a)}),Object.defineProperty(t,"opacity",{get:ExpressionPropertyInterface(m.o)}),Object.defineProperty(t,"skew",{get:ExpressionPropertyInterface(m.sk)}),Object.defineProperty(t,"skewAxis",{get:ExpressionPropertyInterface(m.sa)}),Object.defineProperty(t,"orientation",{get:ExpressionPropertyInterface(m.or)}),t}}(),LayerExpressionInterface=function(){function m(O){var ye=new Matrix;if(O!==void 0){var Se=this._elem.finalTransform.mProp.getValueAtTime(O);Se.clone(ye)}else{var Pe=this._elem.finalTransform.mProp;Pe.applyToMatrix(ye)}return ye}function t(O,ye){var Se=this.getMatrix(ye);return Se.props[12]=0,Se.props[13]=0,Se.props[14]=0,this.applyPoint(Se,O)}function r(O,ye){var Se=this.getMatrix(ye);return this.applyPoint(Se,O)}function d(O,ye){var Se=this.getMatrix(ye);return Se.props[12]=0,Se.props[13]=0,Se.props[14]=0,this.invertPoint(Se,O)}function g(O,ye){var Se=this.getMatrix(ye);return this.invertPoint(Se,O)}function v(O,ye){if(this._elem.hierarchy&&this._elem.hierarchy.length){var Se,Pe=this._elem.hierarchy.length;for(Se=0;Se<Pe;Se+=1)this._elem.hierarchy[Se].finalTransform.mProp.applyToMatrix(O)}return O.applyToPointArray(ye[0],ye[1],ye[2]||0)}function C(O,ye){if(this._elem.hierarchy&&this._elem.hierarchy.length){var Se,Pe=this._elem.hierarchy.length;for(Se=0;Se<Pe;Se+=1)this._elem.hierarchy[Se].finalTransform.mProp.applyToMatrix(O)}return O.inversePoint(ye)}function w(O){var ye=new Matrix;if(ye.reset(),this._elem.finalTransform.mProp.applyToMatrix(ye),this._elem.hierarchy&&this._elem.hierarchy.length){var Se,Pe=this._elem.hierarchy.length;for(Se=0;Se<Pe;Se+=1)this._elem.hierarchy[Se].finalTransform.mProp.applyToMatrix(ye);return ye.inversePoint(O)}return ye.inversePoint(O)}function I(){return[1,1,1,1]}return function(O){var ye;function Se(ht){Ne.mask=new MaskManagerInterface(ht,O)}function Pe(ht){Ne.effect=ht}function Ne(ht){switch(ht){case"ADBE Root Vectors Group":case"Contents":case 2:return Ne.shapeInterface;case 1:case 6:case"Transform":case"transform":case"ADBE Transform Group":return ye;case 4:case"ADBE Effect Parade":case"effects":case"Effects":return Ne.effect;case"ADBE Text Properties":return Ne.textInterface;default:return null}}Ne.getMatrix=m,Ne.invertPoint=C,Ne.applyPoint=v,Ne.toWorld=r,Ne.toWorldVec=t,Ne.fromWorld=g,Ne.fromWorldVec=d,Ne.toComp=r,Ne.fromComp=w,Ne.sampleImage=I,Ne.sourceRectAtTime=O.sourceRectAtTime.bind(O),Ne._elem=O,ye=TransformExpressionInterface(O.finalTransform.mProp);var ke=getDescriptor(ye,"anchorPoint");return Object.defineProperties(Ne,{hasParent:{get:function(){return O.hierarchy.length}},parent:{get:function(){return O.hierarchy[0].layerInterface}},rotation:getDescriptor(ye,"rotation"),scale:getDescriptor(ye,"scale"),position:getDescriptor(ye,"position"),opacity:getDescriptor(ye,"opacity"),anchorPoint:ke,anchor_point:ke,transform:{get:function(){return ye}},active:{get:function(){return O.isInRange}}}),Ne.startTime=O.data.st,Ne.index=O.data.ind,Ne.source=O.data.refId,Ne.height=O.data.ty===0?O.data.h:100,Ne.width=O.data.ty===0?O.data.w:100,Ne.inPoint=O.data.ip/O.comp.globalData.frameRate,Ne.outPoint=O.data.op/O.comp.globalData.frameRate,Ne._name=O.data.nm,Ne.registerMaskInterface=Se,Ne.registerEffectsInterface=Pe,Ne}}(),propertyGroupFactory=function(){return function(m,t){return function(r){return r=r===void 0?1:r,r<=0?m:t(r-1)}}}(),PropertyInterface=function(){return function(m,t){var r={_name:m};function d(g){return g=g===void 0?1:g,g<=0?r:t(g-1)}return d}}(),EffectsExpressionInterface=function(){var m={createEffectsInterface:t};function t(g,v){if(g.effectsManager){var C=[],w=g.data.ef,I,O=g.effectsManager.effectElements.length;for(I=0;I<O;I+=1)C.push(r(w[I],g.effectsManager.effectElements[I],v,g));var ye=g.data.ef||[],Se=function(Pe){for(I=0,O=ye.length;I<O;){if(Pe===ye[I].nm||Pe===ye[I].mn||Pe===ye[I].ix)return C[I];I+=1}return null};return Object.defineProperty(Se,"numProperties",{get:function(){return ye.length}}),Se}return null}function r(g,v,C,w){function I(Ne){for(var ke=g.ef,ht=0,He=ke.length;ht<He;){if(Ne===ke[ht].nm||Ne===ke[ht].mn||Ne===ke[ht].ix)return ke[ht].ty===5?ye[ht]:ye[ht]();ht+=1}throw new Error}var O=propertyGroupFactory(I,C),ye=[],Se,Pe=g.ef.length;for(Se=0;Se<Pe;Se+=1)g.ef[Se].ty===5?ye.push(r(g.ef[Se],v.effectElements[Se],v.effectElements[Se].propertyGroup,w)):ye.push(d(v.effectElements[Se],g.ef[Se].ty,w,O));return g.mn==="ADBE Color Control"&&Object.defineProperty(I,"color",{get:function(){return ye[0]()}}),Object.defineProperties(I,{numProperties:{get:function(){return g.np}},_name:{value:g.nm},propertyGroup:{value:O}}),I.enabled=g.en!==0,I.active=I.enabled,I}function d(g,v,C,w){var I=ExpressionPropertyInterface(g.p);function O(){return v===10?C.comp.compInterface(g.p.v):I()}return g.p.setGroupProperty&&g.p.setGroupProperty(PropertyInterface("",w)),O}return m}(),CompExpressionInterface=function(){return function(m){function t(r){for(var d=0,g=m.layers.length;d<g;){if(m.layers[d].nm===r||m.layers[d].ind===r)return m.elements[d].layerInterface;d+=1}return null}return Object.defineProperty(t,"_name",{value:m.data.nm}),t.layer=t,t.pixelAspect=1,t.height=m.data.h||m.globalData.compSize.h,t.width=m.data.w||m.globalData.compSize.w,t.pixelAspect=1,t.frameDuration=1/m.globalData.frameRate,t.displayStartTime=0,t.numLayers=m.layers.length,t}}(),ShapePathInterface=function(){return function(t,r,d){var g=r.sh;function v(w){return w==="Shape"||w==="shape"||w==="Path"||w==="path"||w==="ADBE Vector Shape"||w===2?v.path:null}var C=propertyGroupFactory(v,d);return g.setGroupProperty(PropertyInterface("Path",C)),Object.defineProperties(v,{path:{get:function(){return g.k&&g.getValue(),g}},shape:{get:function(){return g.k&&g.getValue(),g}},_name:{value:t.nm},ix:{value:t.ix},propertyIndex:{value:t.ix},mn:{value:t.mn},propertyGroup:{value:d}}),v}}(),ShapeExpressionInterface=function(){function m(ke,ht,He){var Fe=[],at,ct=ke?ke.length:0;for(at=0;at<ct;at+=1)ke[at].ty==="gr"?Fe.push(r(ke[at],ht[at],He)):ke[at].ty==="fl"?Fe.push(d(ke[at],ht[at],He)):ke[at].ty==="st"?Fe.push(C(ke[at],ht[at],He)):ke[at].ty==="tm"?Fe.push(w(ke[at],ht[at],He)):ke[at].ty==="tr"||(ke[at].ty==="el"?Fe.push(O(ke[at],ht[at],He)):ke[at].ty==="sr"?Fe.push(ye(ke[at],ht[at],He)):ke[at].ty==="sh"?Fe.push(ShapePathInterface(ke[at],ht[at],He)):ke[at].ty==="rc"?Fe.push(Se(ke[at],ht[at],He)):ke[at].ty==="rd"?Fe.push(Pe(ke[at],ht[at],He)):ke[at].ty==="rp"?Fe.push(Ne(ke[at],ht[at],He)):ke[at].ty==="gf"?Fe.push(g(ke[at],ht[at],He)):Fe.push(v(ke[at],ht[at])));return Fe}function t(ke,ht,He){var Fe,at=function(Gt){for(var Lt=0,Wt=Fe.length;Lt<Wt;){if(Fe[Lt]._name===Gt||Fe[Lt].mn===Gt||Fe[Lt].propertyIndex===Gt||Fe[Lt].ix===Gt||Fe[Lt].ind===Gt)return Fe[Lt];Lt+=1}return typeof Gt=="number"?Fe[Gt-1]:null};at.propertyGroup=propertyGroupFactory(at,He),Fe=m(ke.it,ht.it,at.propertyGroup),at.numProperties=Fe.length;var ct=I(ke.it[ke.it.length-1],ht.it[ht.it.length-1],at.propertyGroup);return at.transform=ct,at.propertyIndex=ke.cix,at._name=ke.nm,at}function r(ke,ht,He){var Fe=function(Gt){switch(Gt){case"ADBE Vectors Group":case"Contents":case 2:return Fe.content;default:return Fe.transform}};Fe.propertyGroup=propertyGroupFactory(Fe,He);var at=t(ke,ht,Fe.propertyGroup),ct=I(ke.it[ke.it.length-1],ht.it[ht.it.length-1],Fe.propertyGroup);return Fe.content=at,Fe.transform=ct,Object.defineProperty(Fe,"_name",{get:function(){return ke.nm}}),Fe.numProperties=ke.np,Fe.propertyIndex=ke.ix,Fe.nm=ke.nm,Fe.mn=ke.mn,Fe}function d(ke,ht,He){function Fe(at){return at==="Color"||at==="color"?Fe.color:at==="Opacity"||at==="opacity"?Fe.opacity:null}return Object.defineProperties(Fe,{color:{get:ExpressionPropertyInterface(ht.c)},opacity:{get:ExpressionPropertyInterface(ht.o)},_name:{value:ke.nm},mn:{value:ke.mn}}),ht.c.setGroupProperty(PropertyInterface("Color",He)),ht.o.setGroupProperty(PropertyInterface("Opacity",He)),Fe}function g(ke,ht,He){function Fe(at){return at==="Start Point"||at==="start point"?Fe.startPoint:at==="End Point"||at==="end point"?Fe.endPoint:at==="Opacity"||at==="opacity"?Fe.opacity:null}return Object.defineProperties(Fe,{startPoint:{get:ExpressionPropertyInterface(ht.s)},endPoint:{get:ExpressionPropertyInterface(ht.e)},opacity:{get:ExpressionPropertyInterface(ht.o)},type:{get:function(){return"a"}},_name:{value:ke.nm},mn:{value:ke.mn}}),ht.s.setGroupProperty(PropertyInterface("Start Point",He)),ht.e.setGroupProperty(PropertyInterface("End Point",He)),ht.o.setGroupProperty(PropertyInterface("Opacity",He)),Fe}function v(){function ke(){return null}return ke}function C(ke,ht,He){var Fe=propertyGroupFactory(Wt,He),at=propertyGroupFactory(Lt,Fe);function ct(Pt){Object.defineProperty(Lt,ke.d[Pt].nm,{get:ExpressionPropertyInterface(ht.d.dataProps[Pt].p)})}var xt,Gt=ke.d?ke.d.length:0,Lt={};for(xt=0;xt<Gt;xt+=1)ct(xt),ht.d.dataProps[xt].p.setGroupProperty(at);function Wt(Pt){return Pt==="Color"||Pt==="color"?Wt.color:Pt==="Opacity"||Pt==="opacity"?Wt.opacity:Pt==="Stroke Width"||Pt==="stroke width"?Wt.strokeWidth:null}return Object.defineProperties(Wt,{color:{get:ExpressionPropertyInterface(ht.c)},opacity:{get:ExpressionPropertyInterface(ht.o)},strokeWidth:{get:ExpressionPropertyInterface(ht.w)},dash:{get:function(){return Lt}},_name:{value:ke.nm},mn:{value:ke.mn}}),ht.c.setGroupProperty(PropertyInterface("Color",Fe)),ht.o.setGroupProperty(PropertyInterface("Opacity",Fe)),ht.w.setGroupProperty(PropertyInterface("Stroke Width",Fe)),Wt}function w(ke,ht,He){function Fe(ct){return ct===ke.e.ix||ct==="End"||ct==="end"?Fe.end:ct===ke.s.ix?Fe.start:ct===ke.o.ix?Fe.offset:null}var at=propertyGroupFactory(Fe,He);return Fe.propertyIndex=ke.ix,ht.s.setGroupProperty(PropertyInterface("Start",at)),ht.e.setGroupProperty(PropertyInterface("End",at)),ht.o.setGroupProperty(PropertyInterface("Offset",at)),Fe.propertyIndex=ke.ix,Fe.propertyGroup=He,Object.defineProperties(Fe,{start:{get:ExpressionPropertyInterface(ht.s)},end:{get:ExpressionPropertyInterface(ht.e)},offset:{get:ExpressionPropertyInterface(ht.o)},_name:{value:ke.nm}}),Fe.mn=ke.mn,Fe}function I(ke,ht,He){function Fe(ct){return ke.a.ix===ct||ct==="Anchor Point"?Fe.anchorPoint:ke.o.ix===ct||ct==="Opacity"?Fe.opacity:ke.p.ix===ct||ct==="Position"?Fe.position:ke.r.ix===ct||ct==="Rotation"||ct==="ADBE Vector Rotation"?Fe.rotation:ke.s.ix===ct||ct==="Scale"?Fe.scale:ke.sk&&ke.sk.ix===ct||ct==="Skew"?Fe.skew:ke.sa&&ke.sa.ix===ct||ct==="Skew Axis"?Fe.skewAxis:null}var at=propertyGroupFactory(Fe,He);return ht.transform.mProps.o.setGroupProperty(PropertyInterface("Opacity",at)),ht.transform.mProps.p.setGroupProperty(PropertyInterface("Position",at)),ht.transform.mProps.a.setGroupProperty(PropertyInterface("Anchor Point",at)),ht.transform.mProps.s.setGroupProperty(PropertyInterface("Scale",at)),ht.transform.mProps.r.setGroupProperty(PropertyInterface("Rotation",at)),ht.transform.mProps.sk&&(ht.transform.mProps.sk.setGroupProperty(PropertyInterface("Skew",at)),ht.transform.mProps.sa.setGroupProperty(PropertyInterface("Skew Angle",at))),ht.transform.op.setGroupProperty(PropertyInterface("Opacity",at)),Object.defineProperties(Fe,{opacity:{get:ExpressionPropertyInterface(ht.transform.mProps.o)},position:{get:ExpressionPropertyInterface(ht.transform.mProps.p)},anchorPoint:{get:ExpressionPropertyInterface(ht.transform.mProps.a)},scale:{get:ExpressionPropertyInterface(ht.transform.mProps.s)},rotation:{get:ExpressionPropertyInterface(ht.transform.mProps.r)},skew:{get:ExpressionPropertyInterface(ht.transform.mProps.sk)},skewAxis:{get:ExpressionPropertyInterface(ht.transform.mProps.sa)},_name:{value:ke.nm}}),Fe.ty="tr",Fe.mn=ke.mn,Fe.propertyGroup=He,Fe}function O(ke,ht,He){function Fe(xt){return ke.p.ix===xt?Fe.position:ke.s.ix===xt?Fe.size:null}var at=propertyGroupFactory(Fe,He);Fe.propertyIndex=ke.ix;var ct=ht.sh.ty==="tm"?ht.sh.prop:ht.sh;return ct.s.setGroupProperty(PropertyInterface("Size",at)),ct.p.setGroupProperty(PropertyInterface("Position",at)),Object.defineProperties(Fe,{size:{get:ExpressionPropertyInterface(ct.s)},position:{get:ExpressionPropertyInterface(ct.p)},_name:{value:ke.nm}}),Fe.mn=ke.mn,Fe}function ye(ke,ht,He){function Fe(xt){return ke.p.ix===xt?Fe.position:ke.r.ix===xt?Fe.rotation:ke.pt.ix===xt?Fe.points:ke.or.ix===xt||xt==="ADBE Vector Star Outer Radius"?Fe.outerRadius:ke.os.ix===xt?Fe.outerRoundness:ke.ir&&(ke.ir.ix===xt||xt==="ADBE Vector Star Inner Radius")?Fe.innerRadius:ke.is&&ke.is.ix===xt?Fe.innerRoundness:null}var at=propertyGroupFactory(Fe,He),ct=ht.sh.ty==="tm"?ht.sh.prop:ht.sh;return Fe.propertyIndex=ke.ix,ct.or.setGroupProperty(PropertyInterface("Outer Radius",at)),ct.os.setGroupProperty(PropertyInterface("Outer Roundness",at)),ct.pt.setGroupProperty(PropertyInterface("Points",at)),ct.p.setGroupProperty(PropertyInterface("Position",at)),ct.r.setGroupProperty(PropertyInterface("Rotation",at)),ke.ir&&(ct.ir.setGroupProperty(PropertyInterface("Inner Radius",at)),ct.is.setGroupProperty(PropertyInterface("Inner Roundness",at))),Object.defineProperties(Fe,{position:{get:ExpressionPropertyInterface(ct.p)},rotation:{get:ExpressionPropertyInterface(ct.r)},points:{get:ExpressionPropertyInterface(ct.pt)},outerRadius:{get:ExpressionPropertyInterface(ct.or)},outerRoundness:{get:ExpressionPropertyInterface(ct.os)},innerRadius:{get:ExpressionPropertyInterface(ct.ir)},innerRoundness:{get:ExpressionPropertyInterface(ct.is)},_name:{value:ke.nm}}),Fe.mn=ke.mn,Fe}function Se(ke,ht,He){function Fe(xt){return ke.p.ix===xt?Fe.position:ke.r.ix===xt?Fe.roundness:ke.s.ix===xt||xt==="Size"||xt==="ADBE Vector Rect Size"?Fe.size:null}var at=propertyGroupFactory(Fe,He),ct=ht.sh.ty==="tm"?ht.sh.prop:ht.sh;return Fe.propertyIndex=ke.ix,ct.p.setGroupProperty(PropertyInterface("Position",at)),ct.s.setGroupProperty(PropertyInterface("Size",at)),ct.r.setGroupProperty(PropertyInterface("Rotation",at)),Object.defineProperties(Fe,{position:{get:ExpressionPropertyInterface(ct.p)},roundness:{get:ExpressionPropertyInterface(ct.r)},size:{get:ExpressionPropertyInterface(ct.s)},_name:{value:ke.nm}}),Fe.mn=ke.mn,Fe}function Pe(ke,ht,He){function Fe(xt){return ke.r.ix===xt||xt==="Round Corners 1"?Fe.radius:null}var at=propertyGroupFactory(Fe,He),ct=ht;return Fe.propertyIndex=ke.ix,ct.rd.setGroupProperty(PropertyInterface("Radius",at)),Object.defineProperties(Fe,{radius:{get:ExpressionPropertyInterface(ct.rd)},_name:{value:ke.nm}}),Fe.mn=ke.mn,Fe}function Ne(ke,ht,He){function Fe(xt){return ke.c.ix===xt||xt==="Copies"?Fe.copies:ke.o.ix===xt||xt==="Offset"?Fe.offset:null}var at=propertyGroupFactory(Fe,He),ct=ht;return Fe.propertyIndex=ke.ix,ct.c.setGroupProperty(PropertyInterface("Copies",at)),ct.o.setGroupProperty(PropertyInterface("Offset",at)),Object.defineProperties(Fe,{copies:{get:ExpressionPropertyInterface(ct.c)},offset:{get:ExpressionPropertyInterface(ct.o)},_name:{value:ke.nm}}),Fe.mn=ke.mn,Fe}return function(ke,ht,He){var Fe;function at(xt){if(typeof xt=="number")return xt=xt===void 0?1:xt,xt===0?He:Fe[xt-1];for(var Gt=0,Lt=Fe.length;Gt<Lt;){if(Fe[Gt]._name===xt)return Fe[Gt];Gt+=1}return null}function ct(){return He}return at.propertyGroup=propertyGroupFactory(at,ct),Fe=m(ke,ht,at.propertyGroup),at.numProperties=Fe.length,at._name="Contents",at}}(),TextExpressionInterface=function(){return function(m){var t,r;function d(g){switch(g){case"ADBE Text Document":return d.sourceText;default:return null}}return Object.defineProperty(d,"sourceText",{get:function(){m.textProperty.getValue();var g=m.textProperty.currentData.t;return g!==t&&(m.textProperty.currentData.t=t,r=new String(g),r.value=g||new String(g)),r}}),d}}(),getBlendMode=function(){var m={0:"source-over",1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"};return function(t){return m[t]||""}}();extendPrototype([DynamicPropertyContainer],GroupEffect),GroupEffect.prototype.getValue=GroupEffect.prototype.iterateDynamicProperties,GroupEffect.prototype.init=function(m,t){this.data=m,this.effectElements=[],this.initDynamicPropertyContainer(t);var r,d=this.data.ef.length,g,v=this.data.ef;for(r=0;r<d;r+=1){switch(g=null,v[r].ty){case 0:g=new SliderEffect(v[r],t,this);break;case 1:g=new AngleEffect(v[r],t,this);break;case 2:g=new ColorEffect(v[r],t,this);break;case 3:g=new PointEffect(v[r],t,this);break;case 4:case 7:g=new CheckboxEffect(v[r],t,this);break;case 10:g=new LayerIndexEffect(v[r],t,this);break;case 11:g=new MaskIndexEffect(v[r],t,this);break;case 5:g=new EffectsManager(v[r],t);break;default:g=new NoValueEffect(v[r]);break}g&&this.effectElements.push(g)}},BaseElement.prototype={checkMasks:function(){if(!this.data.hasMask)return!1;for(var m=0,t=this.data.masksProperties.length;m<t;){if(this.data.masksProperties[m].mode!=="n"&&this.data.masksProperties[m].cl!==!1)return!0;m+=1}return!1},initExpressions:function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.maskManager&&this.layerInterface.registerMaskInterface(this.maskManager);var m=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(m),this.data.ty===0||this.data.xt?this.compInterface=CompExpressionInterface(this):this.data.ty===4?(this.layerInterface.shapeInterface=ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):this.data.ty===5&&(this.layerInterface.textInterface=TextExpressionInterface(this),this.layerInterface.text=this.layerInterface.textInterface)},setBlendMode:function(){var m=getBlendMode(this.data.bm),t=this.baseElement||this.layerElement;t.style["mix-blend-mode"]=m},initBaseData:function(m,t,r){this.globalData=t,this.comp=r,this.data=m,this.layerId=createElementID(),this.data.sr||(this.data.sr=1),this.effectsManager=new EffectsManager(this.data,this,this.dynamicProperties)},getType:function(){return this.type},sourceRectAtTime:function(){}},FrameElement.prototype={initFrame:function(){this._isFirstFrame=!1,this.dynamicProperties=[],this._mdf=!1},prepareProperties:function(m,t){var r,d=this.dynamicProperties.length;for(r=0;r<d;r+=1)(t||this._isParent&&this.dynamicProperties[r].propType==="transform")&&(this.dynamicProperties[r].getValue(),this.dynamicProperties[r]._mdf&&(this.globalData._mdf=!0,this._mdf=!0))},addDynamicProperty:function(m){this.dynamicProperties.indexOf(m)===-1&&this.dynamicProperties.push(m)}};const FootageInterface=function(){var m=function(r){var d="",g=r.getFootageData();function v(){return d="",g=r.getFootageData(),C}function C(w){if(g[w])return d=w,g=g[w],typeof g=="object"?C:g;var I=w.indexOf(d);if(I!==-1){var O=parseInt(w.substr(I+d.length),10);return g=g[O],typeof g=="object"?C:g}return""}return v},t=function(r){function d(g){return g==="Outline"?d.outlineInterface():null}return d._name="Outline",d.outlineInterface=m(r),d};return function(r){function d(g){return g==="Data"?d.dataInterface:null}return d._name="Data",d.dataInterface=t(r),d}}();FootageElement.prototype.prepareFrame=function(){},extendPrototype([RenderableElement,BaseElement,FrameElement],FootageElement),FootageElement.prototype.getBaseElement=function(){return null},FootageElement.prototype.renderFrame=function(){},FootageElement.prototype.destroy=function(){},FootageElement.prototype.initExpressions=function(){this.layerInterface=FootageInterface(this)},FootageElement.prototype.getFootageData=function(){return this.footageData},AudioElement.prototype.prepareFrame=function(m){if(this.prepareRenderableFrame(m,!0),this.prepareProperties(m,!0),this.tm._placeholder)this._currentTime=m/this.data.sr;else{var t=this.tm.v;this._currentTime=t}this._volume=this.lv.v[0];var r=this._volume*this._volumeMultiplier;this._previousVolume!==r&&(this._previousVolume=r,this.audio.volume(r))},extendPrototype([RenderableElement,BaseElement,FrameElement],AudioElement),AudioElement.prototype.renderFrame=function(){this.isInRange&&this._canPlay&&(this._isPlaying?(!this.audio.playing()||Math.abs(this._currentTime/this.globalData.frameRate-this.audio.seek())>.1)&&this.audio.seek(this._currentTime/this.globalData.frameRate):(this.audio.play(),this.audio.seek(this._currentTime/this.globalData.frameRate),this._isPlaying=!0))},AudioElement.prototype.show=function(){},AudioElement.prototype.hide=function(){this.audio.pause(),this._isPlaying=!1},AudioElement.prototype.pause=function(){this.audio.pause(),this._isPlaying=!1,this._canPlay=!1},AudioElement.prototype.resume=function(){this._canPlay=!0},AudioElement.prototype.setRate=function(m){this.audio.rate(m)},AudioElement.prototype.volume=function(m){this._volumeMultiplier=m,this._previousVolume=m*this._volume,this.audio.volume(this._previousVolume)},AudioElement.prototype.getBaseElement=function(){return null},AudioElement.prototype.destroy=function(){},AudioElement.prototype.sourceRectAtTime=function(){},AudioElement.prototype.initExpressions=function(){},BaseRenderer.prototype.checkLayers=function(m){var t,r=this.layers.length,d;for(this.completeLayers=!0,t=r-1;t>=0;t-=1)this.elements[t]||(d=this.layers[t],d.ip-d.st<=m-this.layers[t].st&&d.op-d.st>m-this.layers[t].st&&this.buildItem(t)),this.completeLayers=this.elements[t]?this.completeLayers:!1;this.checkPendingElements()},BaseRenderer.prototype.createItem=function(m){switch(m.ty){case 2:return this.createImage(m);case 0:return this.createComp(m);case 1:return this.createSolid(m);case 3:return this.createNull(m);case 4:return this.createShape(m);case 5:return this.createText(m);case 6:return this.createAudio(m);case 13:return this.createCamera(m);case 15:return this.createFootage(m);default:return this.createNull(m)}},BaseRenderer.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},BaseRenderer.prototype.createAudio=function(m){return new AudioElement(m,this.globalData,this)},BaseRenderer.prototype.createFootage=function(m){return new FootageElement(m,this.globalData,this)},BaseRenderer.prototype.buildAllItems=function(){var m,t=this.layers.length;for(m=0;m<t;m+=1)this.buildItem(m);this.checkPendingElements()},BaseRenderer.prototype.includeLayers=function(m){this.completeLayers=!1;var t,r=m.length,d,g=this.layers.length;for(t=0;t<r;t+=1)for(d=0;d<g;){if(this.layers[d].id===m[t].id){this.layers[d]=m[t];break}d+=1}},BaseRenderer.prototype.setProjectInterface=function(m){this.globalData.projectInterface=m},BaseRenderer.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},BaseRenderer.prototype.buildElementParenting=function(m,t,r){for(var d=this.elements,g=this.layers,v=0,C=g.length;v<C;)g[v].ind==t&&(!d[v]||d[v]===!0?(this.buildItem(v),this.addPendingElement(m)):(r.push(d[v]),d[v].setAsParent(),g[v].parent!==void 0?this.buildElementParenting(m,g[v].parent,r):m.setHierarchy(r))),v+=1},BaseRenderer.prototype.addPendingElement=function(m){this.pendingElements.push(m)},BaseRenderer.prototype.searchExtraCompositions=function(m){var t,r=m.length;for(t=0;t<r;t+=1)if(m[t].xt){var d=this.createComp(m[t]);d.initExpressions(),this.globalData.projectInterface.registerComposition(d)}},BaseRenderer.prototype.getElementByPath=function(m){var t=m.shift(),r;if(typeof t=="number")r=this.elements[t];else{var d,g=this.elements.length;for(d=0;d<g;d+=1)if(this.elements[d].data.nm===t){r=this.elements[d];break}}return m.length===0?r:r.getElementByPath(m)},BaseRenderer.prototype.setupGlobalData=function(m,t){this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(m.chars),this.globalData.fontManager.addFonts(m.fonts,t),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.imageLoader=this.animationItem.imagePreloader,this.globalData.audioController=this.animationItem.audioController,this.globalData.frameId=0,this.globalData.frameRate=m.fr,this.globalData.nm=m.nm,this.globalData.compSize={w:m.w,h:m.h}},TransformElement.prototype={initTransform:function(){this.finalTransform={mProp:this.data.ks?TransformPropertyFactory.getTransformProperty(this,this.data.ks,this):{o:0},_matMdf:!1,_opMdf:!1,mat:new Matrix},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.data.ty},renderTransform:function(){if(this.finalTransform._opMdf=this.finalTransform.mProp.o._mdf||this._isFirstFrame,this.finalTransform._matMdf=this.finalTransform.mProp._mdf||this._isFirstFrame,this.hierarchy){var m,t=this.finalTransform.mat,r=0,d=this.hierarchy.length;if(!this.finalTransform._matMdf)for(;r<d;){if(this.hierarchy[r].finalTransform.mProp._mdf){this.finalTransform._matMdf=!0;break}r+=1}if(this.finalTransform._matMdf)for(m=this.finalTransform.mProp.v.props,t.cloneFromProps(m),r=0;r<d;r+=1)m=this.hierarchy[r].finalTransform.mProp.v.props,t.transform(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15])}},globalToLocal:function(m){var t=[];t.push(this.finalTransform);for(var r=!0,d=this.comp;r;)d.finalTransform?(d.data.hasMask&&t.splice(0,0,d.finalTransform),d=d.comp):r=!1;var g,v=t.length,C;for(g=0;g<v;g+=1)C=t[g].mat.applyToPointArray(0,0,0),m=[m[0]-C[0],m[1]-C[1],0];return m},mHelper:new Matrix},MaskElement.prototype.getMaskProperty=function(m){return this.viewData[m].prop},MaskElement.prototype.renderFrame=function(m){var t=this.element.finalTransform.mat,r,d=this.masksProperties.length;for(r=0;r<d;r+=1)if((this.viewData[r].prop._mdf||m)&&this.drawPath(this.masksProperties[r],this.viewData[r].prop.v,this.viewData[r]),(this.viewData[r].op._mdf||m)&&this.viewData[r].elem.setAttribute("fill-opacity",this.viewData[r].op.v),this.masksProperties[r].mode!=="n"&&(this.viewData[r].invRect&&(this.element.finalTransform.mProp._mdf||m)&&this.viewData[r].invRect.setAttribute("transform",t.getInverseMatrix().to2dCSS()),this.storedData[r].x&&(this.storedData[r].x._mdf||m))){var g=this.storedData[r].expan;this.storedData[r].x.v<0?(this.storedData[r].lastOperator!=="erode"&&(this.storedData[r].lastOperator="erode",this.storedData[r].elem.setAttribute("filter","url("+getLocationHref()+"#"+this.storedData[r].filterId+")")),g.setAttribute("radius",-this.storedData[r].x.v)):(this.storedData[r].lastOperator!=="dilate"&&(this.storedData[r].lastOperator="dilate",this.storedData[r].elem.setAttribute("filter",null)),this.storedData[r].elem.setAttribute("stroke-width",this.storedData[r].x.v*2))}},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var m="M0,0 ";return m+=" h"+this.globalData.compSize.w,m+=" v"+this.globalData.compSize.h,m+=" h-"+this.globalData.compSize.w,m+=" v-"+this.globalData.compSize.h+" ",m},MaskElement.prototype.drawPath=function(m,t,r){var d=" M"+t.v[0][0]+","+t.v[0][1],g,v;for(v=t._length,g=1;g<v;g+=1)d+=" C"+t.o[g-1][0]+","+t.o[g-1][1]+" "+t.i[g][0]+","+t.i[g][1]+" "+t.v[g][0]+","+t.v[g][1];if(t.c&&v>1&&(d+=" C"+t.o[g-1][0]+","+t.o[g-1][1]+" "+t.i[0][0]+","+t.i[0][1]+" "+t.v[0][0]+","+t.v[0][1]),r.lastPath!==d){var C="";r.elem&&(t.c&&(C=m.inv?this.solidPath+d:d),r.elem.setAttribute("d",C)),r.lastPath=d}},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.masksProperties=null};const filtersFactory=function(){var m={};m.createFilter=t,m.createAlphaToLuminanceFilter=r;function t(d,g){var v=createNS("filter");return v.setAttribute("id",d),g!==!0&&(v.setAttribute("filterUnits","objectBoundingBox"),v.setAttribute("x","0%"),v.setAttribute("y","0%"),v.setAttribute("width","100%"),v.setAttribute("height","100%")),v}function r(){var d=createNS("feColorMatrix");return d.setAttribute("type","matrix"),d.setAttribute("color-interpolation-filters","sRGB"),d.setAttribute("values","0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1"),d}return m}(),featureSupport=function(){var m={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(m.maskType=!1),m}();var registeredEffects={},idPrefix="filter_result_";SVGEffects.prototype.renderFrame=function(m){var t,r=this.filters.length;for(t=0;t<r;t+=1)this.filters[t].renderFrame(m)},SVGBaseElement.prototype={initRendererElement:function(){this.layerElement=createNS("g")},createContainerElements:function(){this.matteElement=createNS("g"),this.transformedElement=this.layerElement,this.maskedElement=this.layerElement,this._sizeChanged=!1;var m=null,t,r,d;if(this.data.td){if(this.data.td==3||this.data.td==1){var g=createNS("mask");g.setAttribute("id",this.layerId),g.setAttribute("mask-type",this.data.td==3?"luminance":"alpha"),g.appendChild(this.layerElement),m=g,this.globalData.defs.appendChild(g),!featureSupport.maskType&&this.data.td==1&&(g.setAttribute("mask-type","luminance"),t=createElementID(),r=filtersFactory.createFilter(t),this.globalData.defs.appendChild(r),r.appendChild(filtersFactory.createAlphaToLuminanceFilter()),d=createNS("g"),d.appendChild(this.layerElement),m=d,g.appendChild(d),d.setAttribute("filter","url("+getLocationHref()+"#"+t+")"))}else if(this.data.td==2){var v=createNS("mask");v.setAttribute("id",this.layerId),v.setAttribute("mask-type","alpha");var C=createNS("g");v.appendChild(C),t=createElementID(),r=filtersFactory.createFilter(t);var w=createNS("feComponentTransfer");w.setAttribute("in","SourceGraphic"),r.appendChild(w);var I=createNS("feFuncA");I.setAttribute("type","table"),I.setAttribute("tableValues","1.0 0.0"),w.appendChild(I),this.globalData.defs.appendChild(r);var O=createNS("rect");O.setAttribute("width",this.comp.data.w),O.setAttribute("height",this.comp.data.h),O.setAttribute("x","0"),O.setAttribute("y","0"),O.setAttribute("fill","#ffffff"),O.setAttribute("opacity","0"),C.setAttribute("filter","url("+getLocationHref()+"#"+t+")"),C.appendChild(O),C.appendChild(this.layerElement),m=C,featureSupport.maskType||(v.setAttribute("mask-type","luminance"),r.appendChild(filtersFactory.createAlphaToLuminanceFilter()),d=createNS("g"),C.appendChild(O),d.appendChild(this.layerElement),m=d,C.appendChild(d)),this.globalData.defs.appendChild(v)}}else this.data.tt?(this.matteElement.appendChild(this.layerElement),m=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),this.data.ty===0&&!this.data.hd){var ye=createNS("clipPath"),Se=createNS("path");Se.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var Pe=createElementID();if(ye.setAttribute("id",Pe),ye.appendChild(Se),this.globalData.defs.appendChild(ye),this.checkMasks()){var Ne=createNS("g");Ne.setAttribute("clip-path","url("+getLocationHref()+"#"+Pe+")"),Ne.appendChild(this.layerElement),this.transformedElement=Ne,m?m.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url("+getLocationHref()+"#"+Pe+")")}this.data.bm!==0&&this.setBlendMode()},renderElement:function(){this.finalTransform._matMdf&&this.transformedElement.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform._opMdf&&this.transformedElement.setAttribute("opacity",this.finalTransform.mProp.o.v)},destroyBaseElement:function(){this.layerElement=null,this.matteElement=null,this.maskManager.destroy()},getBaseElement:function(){return this.data.hd?null:this.baseElement},createRenderableComponents:function(){this.maskManager=new MaskElement(this.data,this,this.globalData),this.renderableEffectsManager=new SVGEffects(this)},setMatte:function(m){this.matteElement&&this.matteElement.setAttribute("mask","url("+getLocationHref()+"#"+m+")")}},HierarchyElement.prototype={initHierarchy:function(){this.hierarchy=[],this._isParent=!1,this.checkParenting()},setHierarchy:function(m){this.hierarchy=m},setAsParent:function(){this._isParent=!0},checkParenting:function(){this.data.parent!==void 0&&this.comp.buildElementParenting(this,this.data.parent,[])}},function(){var m={initElement:function(t,r,d){this.initFrame(),this.initBaseData(t,r,d),this.initTransform(t,r,d),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide()},hide:function(){if(!this.hidden&&(!this.isInRange||this.isTransparent)){var t=this.baseElement||this.layerElement;t.style.display="none",this.hidden=!0}},show:function(){if(this.isInRange&&!this.isTransparent){if(!this.data.hd){var t=this.baseElement||this.layerElement;t.style.display="block"}this.hidden=!1,this._isFirstFrame=!0}},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},renderInnerContent:function(){},prepareFrame:function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.checkTransparency()},destroy:function(){this.innerElem=null,this.destroyBaseElement()}};extendPrototype([RenderableElement,createProxyFunction(m)],RenderableDOMElement)}(),extendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement],IImageElement),IImageElement.prototype.createContent=function(){var m=this.globalData.getAssetsPath(this.assetData);this.innerElem=createNS("image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio",this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",m),this.layerElement.appendChild(this.innerElem)},IImageElement.prototype.sourceRectAtTime=function(){return this.sourceRect},IShapeElement.prototype={addShapeToModifiers:function(m){var t,r=this.shapeModifiers.length;for(t=0;t<r;t+=1)this.shapeModifiers[t].addShape(m)},isShapeInAnimatedModifiers:function(m){for(var t=0,r=this.shapeModifiers.length;t<r;)if(this.shapeModifiers[t].isAnimatedWithShape(m))return!0;return!1},renderModifiers:function(){if(this.shapeModifiers.length){var m,t=this.shapes.length;for(m=0;m<t;m+=1)this.shapes[m].sh.reset();t=this.shapeModifiers.length;var r;for(m=t-1;m>=0&&(r=this.shapeModifiers[m].processShapes(this._isFirstFrame),!r);m-=1);}},searchProcessedElement:function(m){for(var t=this.processedElements,r=0,d=t.length;r<d;){if(t[r].elem===m)return t[r].pos;r+=1}return 0},addProcessedElement:function(m,t){for(var r=this.processedElements,d=r.length;d;)if(d-=1,r[d].elem===m){r[d].pos=t;return}r.push(new ProcessedElement(m,t))},prepareFrame:function(m){this.prepareRenderableFrame(m),this.prepareProperties(m,this.isInRange)}};const lineCapEnum={1:"butt",2:"round",3:"square"},lineJoinEnum={1:"miter",2:"round",3:"bevel"};SVGShapeData.prototype.setAsAnimated=function(){this._isAnimated=!0},SVGStyleData.prototype.reset=function(){this.d="",this._mdf=!1},DashProperty.prototype.getValue=function(m){if(!(this.elem.globalData.frameId===this.frameId&&!m)&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf=this._mdf||m,this._mdf)){var t=0,r=this.dataProps.length;for(this.renderer==="svg"&&(this.dashStr=""),t=0;t<r;t+=1)this.dataProps[t].n!=="o"?this.renderer==="svg"?this.dashStr+=" "+this.dataProps[t].p.v:this.dashArray[t]=this.dataProps[t].p.v:this.dashoffset[0]=this.dataProps[t].p.v}},extendPrototype([DynamicPropertyContainer],DashProperty),extendPrototype([DynamicPropertyContainer],SVGStrokeStyleData),extendPrototype([DynamicPropertyContainer],SVGFillStyleData),extendPrototype([DynamicPropertyContainer],SVGNoStyleData),GradientProperty.prototype.comparePoints=function(m,t){for(var r=0,d=this.o.length/2,g;r<d;){if(g=Math.abs(m[r*4]-m[t*4+r*2]),g>.01)return!1;r+=1}return!0},GradientProperty.prototype.checkCollapsable=function(){if(this.o.length/2!==this.c.length/4)return!1;if(this.data.k.k[0].s)for(var m=0,t=this.data.k.k.length;m<t;){if(!this.comparePoints(this.data.k.k[m].s,this.data.p))return!1;m+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},GradientProperty.prototype.getValue=function(m){if(this.prop.getValue(),this._mdf=!1,this._cmdf=!1,this._omdf=!1,this.prop._mdf||m){var t,r=this.data.p*4,d,g;for(t=0;t<r;t+=1)d=t%4===0?100:255,g=Math.round(this.prop.v[t]*d),this.c[t]!==g&&(this.c[t]=g,this._cmdf=!m);if(this.o.length)for(r=this.prop.v.length,t=this.data.p*4;t<r;t+=1)d=t%2===0?100:1,g=t%2===0?Math.round(this.prop.v[t]*100):this.prop.v[t],this.o[t-this.data.p*4]!==g&&(this.o[t-this.data.p*4]=g,this._omdf=!m);this._mdf=!m}},extendPrototype([DynamicPropertyContainer],GradientProperty),SVGGradientFillStyleData.prototype.initGradientData=function(m,t,r){this.o=PropertyFactory.getProp(m,t.o,0,.01,this),this.s=PropertyFactory.getProp(m,t.s,1,null,this),this.e=PropertyFactory.getProp(m,t.e,1,null,this),this.h=PropertyFactory.getProp(m,t.h||{k:0},0,.01,this),this.a=PropertyFactory.getProp(m,t.a||{k:0},0,degToRads,this),this.g=new GradientProperty(m,t.g,this),this.style=r,this.stops=[],this.setGradientData(r.pElem,t),this.setGradientOpacity(t,r),this._isAnimated=!!this._isAnimated},SVGGradientFillStyleData.prototype.setGradientData=function(m,t){var r=createElementID(),d=createNS(t.t===1?"linearGradient":"radialGradient");d.setAttribute("id",r),d.setAttribute("spreadMethod","pad"),d.setAttribute("gradientUnits","userSpaceOnUse");var g=[],v,C,w;for(w=t.g.p*4,C=0;C<w;C+=4)v=createNS("stop"),d.appendChild(v),g.push(v);m.setAttribute(t.ty==="gf"?"fill":"stroke","url("+getLocationHref()+"#"+r+")"),this.gf=d,this.cst=g},SVGGradientFillStyleData.prototype.setGradientOpacity=function(m,t){if(this.g._hasOpacity&&!this.g._collapsable){var r,d,g,v=createNS("mask"),C=createNS("path");v.appendChild(C);var w=createElementID(),I=createElementID();v.setAttribute("id",I);var O=createNS(m.t===1?"linearGradient":"radialGradient");O.setAttribute("id",w),O.setAttribute("spreadMethod","pad"),O.setAttribute("gradientUnits","userSpaceOnUse"),g=m.g.k.k[0].s?m.g.k.k[0].s.length:m.g.k.k.length;var ye=this.stops;for(d=m.g.p*4;d<g;d+=2)r=createNS("stop"),r.setAttribute("stop-color","rgb(255,255,255)"),O.appendChild(r),ye.push(r);C.setAttribute(m.ty==="gf"?"fill":"stroke","url("+getLocationHref()+"#"+w+")"),m.ty==="gs"&&(C.setAttribute("stroke-linecap",lineCapEnum[m.lc||2]),C.setAttribute("stroke-linejoin",lineJoinEnum[m.lj||2]),m.lj===1&&C.setAttribute("stroke-miterlimit",m.ml)),this.of=O,this.ms=v,this.ost=ye,this.maskId=I,t.msElem=C}},extendPrototype([DynamicPropertyContainer],SVGGradientFillStyleData),extendPrototype([SVGGradientFillStyleData,DynamicPropertyContainer],SVGGradientStrokeStyleData);const buildShapeString=function(m,t,r,d){if(t===0)return"";var g=m.o,v=m.i,C=m.v,w,I=" M"+d.applyToPointStringified(C[0][0],C[0][1]);for(w=1;w<t;w+=1)I+=" C"+d.applyToPointStringified(g[w-1][0],g[w-1][1])+" "+d.applyToPointStringified(v[w][0],v[w][1])+" "+d.applyToPointStringified(C[w][0],C[w][1]);return r&&t&&(I+=" C"+d.applyToPointStringified(g[w-1][0],g[w-1][1])+" "+d.applyToPointStringified(v[0][0],v[0][1])+" "+d.applyToPointStringified(C[0][0],C[0][1]),I+="z"),I},SVGElementsRenderer=function(){var m=new Matrix,t=new Matrix,r={createRenderFunction:d};function d(Se){switch(Se.ty){case"fl":return w;case"gf":return O;case"gs":return I;case"st":return ye;case"sh":case"el":case"rc":case"sr":return C;case"tr":return g;case"no":return v;default:return null}}function g(Se,Pe,Ne){(Ne||Pe.transform.op._mdf)&&Pe.transform.container.setAttribute("opacity",Pe.transform.op.v),(Ne||Pe.transform.mProps._mdf)&&Pe.transform.container.setAttribute("transform",Pe.transform.mProps.v.to2dCSS())}function v(){}function C(Se,Pe,Ne){var ke,ht,He,Fe,at,ct,xt=Pe.styles.length,Gt=Pe.lvl,Lt,Wt,Pt,Ft,kt;for(ct=0;ct<xt;ct+=1){if(Fe=Pe.sh._mdf||Ne,Pe.styles[ct].lvl<Gt){for(Wt=t.reset(),Ft=Gt-Pe.styles[ct].lvl,kt=Pe.transformers.length-1;!Fe&&Ft>0;)Fe=Pe.transformers[kt].mProps._mdf||Fe,Ft-=1,kt-=1;if(Fe)for(Ft=Gt-Pe.styles[ct].lvl,kt=Pe.transformers.length-1;Ft>0;)Pt=Pe.transformers[kt].mProps.v.props,Wt.transform(Pt[0],Pt[1],Pt[2],Pt[3],Pt[4],Pt[5],Pt[6],Pt[7],Pt[8],Pt[9],Pt[10],Pt[11],Pt[12],Pt[13],Pt[14],Pt[15]),Ft-=1,kt-=1}else Wt=m;if(Lt=Pe.sh.paths,ht=Lt._length,Fe){for(He="",ke=0;ke<ht;ke+=1)at=Lt.shapes[ke],at&&at._length&&(He+=buildShapeString(at,at._length,at.c,Wt));Pe.caches[ct]=He}else He=Pe.caches[ct];Pe.styles[ct].d+=Se.hd===!0?"":He,Pe.styles[ct]._mdf=Fe||Pe.styles[ct]._mdf}}function w(Se,Pe,Ne){var ke=Pe.style;(Pe.c._mdf||Ne)&&ke.pElem.setAttribute("fill","rgb("+bmFloor(Pe.c.v[0])+","+bmFloor(Pe.c.v[1])+","+bmFloor(Pe.c.v[2])+")"),(Pe.o._mdf||Ne)&&ke.pElem.setAttribute("fill-opacity",Pe.o.v)}function I(Se,Pe,Ne){O(Se,Pe,Ne),ye(Se,Pe,Ne)}function O(Se,Pe,Ne){var ke=Pe.gf,ht=Pe.g._hasOpacity,He=Pe.s.v,Fe=Pe.e.v;if(Pe.o._mdf||Ne){var at=Se.ty==="gf"?"fill-opacity":"stroke-opacity";Pe.style.pElem.setAttribute(at,Pe.o.v)}if(Pe.s._mdf||Ne){var ct=Se.t===1?"x1":"cx",xt=ct==="x1"?"y1":"cy";ke.setAttribute(ct,He[0]),ke.setAttribute(xt,He[1]),ht&&!Pe.g._collapsable&&(Pe.of.setAttribute(ct,He[0]),Pe.of.setAttribute(xt,He[1]))}var Gt,Lt,Wt,Pt;if(Pe.g._cmdf||Ne){Gt=Pe.cst;var Ft=Pe.g.c;for(Wt=Gt.length,Lt=0;Lt<Wt;Lt+=1)Pt=Gt[Lt],Pt.setAttribute("offset",Ft[Lt*4]+"%"),Pt.setAttribute("stop-color","rgb("+Ft[Lt*4+1]+","+Ft[Lt*4+2]+","+Ft[Lt*4+3]+")")}if(ht&&(Pe.g._omdf||Ne)){var kt=Pe.g.o;for(Pe.g._collapsable?Gt=Pe.cst:Gt=Pe.ost,Wt=Gt.length,Lt=0;Lt<Wt;Lt+=1)Pt=Gt[Lt],Pe.g._collapsable||Pt.setAttribute("offset",kt[Lt*2]+"%"),Pt.setAttribute("stop-opacity",kt[Lt*2+1])}if(Se.t===1)(Pe.e._mdf||Ne)&&(ke.setAttribute("x2",Fe[0]),ke.setAttribute("y2",Fe[1]),ht&&!Pe.g._collapsable&&(Pe.of.setAttribute("x2",Fe[0]),Pe.of.setAttribute("y2",Fe[1])));else{var Kt;if((Pe.s._mdf||Pe.e._mdf||Ne)&&(Kt=Math.sqrt(Math.pow(He[0]-Fe[0],2)+Math.pow(He[1]-Fe[1],2)),ke.setAttribute("r",Kt),ht&&!Pe.g._collapsable&&Pe.of.setAttribute("r",Kt)),Pe.e._mdf||Pe.h._mdf||Pe.a._mdf||Ne){Kt||(Kt=Math.sqrt(Math.pow(He[0]-Fe[0],2)+Math.pow(He[1]-Fe[1],2)));var i0=Math.atan2(Fe[1]-He[1],Fe[0]-He[0]),r0=Pe.h.v;r0>=1?r0=.99:r0<=-1&&(r0=-.99);var l0=Kt*r0,n0=Math.cos(i0+Pe.a.v)*l0+He[0],Ut=Math.sin(i0+Pe.a.v)*l0+He[1];ke.setAttribute("fx",n0),ke.setAttribute("fy",Ut),ht&&!Pe.g._collapsable&&(Pe.of.setAttribute("fx",n0),Pe.of.setAttribute("fy",Ut))}}}function ye(Se,Pe,Ne){var ke=Pe.style,ht=Pe.d;ht&&(ht._mdf||Ne)&&ht.dashStr&&(ke.pElem.setAttribute("stroke-dasharray",ht.dashStr),ke.pElem.setAttribute("stroke-dashoffset",ht.dashoffset[0])),Pe.c&&(Pe.c._mdf||Ne)&&ke.pElem.setAttribute("stroke","rgb("+bmFloor(Pe.c.v[0])+","+bmFloor(Pe.c.v[1])+","+bmFloor(Pe.c.v[2])+")"),(Pe.o._mdf||Ne)&&ke.pElem.setAttribute("stroke-opacity",Pe.o.v),(Pe.w._mdf||Ne)&&(ke.pElem.setAttribute("stroke-width",Pe.w.v),ke.msElem&&ke.msElem.setAttribute("stroke-width",Pe.w.v))}return r}();extendPrototype([BaseElement,TransformElement,SVGBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableDOMElement],SVGShapeElement),SVGShapeElement.prototype.initSecondaryElement=function(){},SVGShapeElement.prototype.identityMatrix=new Matrix,SVGShapeElement.prototype.buildExpressionInterface=function(){},SVGShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes()},SVGShapeElement.prototype.filterUniqueShapes=function(){var m,t=this.shapes.length,r,d,g=this.stylesList.length,v,C=[],w=!1;for(d=0;d<g;d+=1){for(v=this.stylesList[d],w=!1,C.length=0,m=0;m<t;m+=1)r=this.shapes[m],r.styles.indexOf(v)!==-1&&(C.push(r),w=r._isAnimated||w);C.length>1&&w&&this.setShapesAsAnimated(C)}},SVGShapeElement.prototype.setShapesAsAnimated=function(m){var t,r=m.length;for(t=0;t<r;t+=1)m[t].setAsAnimated()},SVGShapeElement.prototype.createStyleElement=function(m,t){var r,d=new SVGStyleData(m,t),g=d.pElem;if(m.ty==="st")r=new SVGStrokeStyleData(this,m,d);else if(m.ty==="fl")r=new SVGFillStyleData(this,m,d);else if(m.ty==="gf"||m.ty==="gs"){var v=m.ty==="gf"?SVGGradientFillStyleData:SVGGradientStrokeStyleData;r=new v(this,m,d),this.globalData.defs.appendChild(r.gf),r.maskId&&(this.globalData.defs.appendChild(r.ms),this.globalData.defs.appendChild(r.of),g.setAttribute("mask","url("+getLocationHref()+"#"+r.maskId+")"))}else m.ty==="no"&&(r=new SVGNoStyleData(this,m,d));return(m.ty==="st"||m.ty==="gs")&&(g.setAttribute("stroke-linecap",lineCapEnum[m.lc||2]),g.setAttribute("stroke-linejoin",lineJoinEnum[m.lj||2]),g.setAttribute("fill-opacity","0"),m.lj===1&&g.setAttribute("stroke-miterlimit",m.ml)),m.r===2&&g.setAttribute("fill-rule","evenodd"),m.ln&&g.setAttribute("id",m.ln),m.cl&&g.setAttribute("class",m.cl),m.bm&&(g.style["mix-blend-mode"]=getBlendMode(m.bm)),this.stylesList.push(d),this.addToAnimatedContents(m,r),r},SVGShapeElement.prototype.createGroupElement=function(m){var t=new ShapeGroupData;return m.ln&&t.gr.setAttribute("id",m.ln),m.cl&&t.gr.setAttribute("class",m.cl),m.bm&&(t.gr.style["mix-blend-mode"]=getBlendMode(m.bm)),t},SVGShapeElement.prototype.createTransformElement=function(m,t){var r=TransformPropertyFactory.getTransformProperty(this,m,this),d=new SVGTransformData(r,r.o,t);return this.addToAnimatedContents(m,d),d},SVGShapeElement.prototype.createShapeElement=function(m,t,r){var d=4;m.ty==="rc"?d=5:m.ty==="el"?d=6:m.ty==="sr"&&(d=7);var g=ShapePropertyFactory.getShapeProp(this,m,d,this),v=new SVGShapeData(t,r,g);return this.shapes.push(v),this.addShapeToModifiers(v),this.addToAnimatedContents(m,v),v},SVGShapeElement.prototype.addToAnimatedContents=function(m,t){for(var r=0,d=this.animatedContents.length;r<d;){if(this.animatedContents[r].element===t)return;r+=1}this.animatedContents.push({fn:SVGElementsRenderer.createRenderFunction(m),element:t,data:m})},SVGShapeElement.prototype.setElementStyles=function(m){var t=m.styles,r,d=this.stylesList.length;for(r=0;r<d;r+=1)this.stylesList[r].closed||t.push(this.stylesList[r])},SVGShapeElement.prototype.reloadShapes=function(){this._isFirstFrame=!0;var m,t=this.itemsData.length;for(m=0;m<t;m+=1)this.prevViewData[m]=this.itemsData[m];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes(),t=this.dynamicProperties.length,m=0;m<t;m+=1)this.dynamicProperties[m].getValue();this.renderModifiers()},SVGShapeElement.prototype.searchShapes=function(m,t,r,d,g,v,C){var w=[].concat(v),I,O=m.length-1,ye,Se,Pe=[],Ne=[],ke,ht,He;for(I=O;I>=0;I-=1){if(He=this.searchProcessedElement(m[I]),He?t[I]=r[He-1]:m[I]._render=C,m[I].ty==="fl"||m[I].ty==="st"||m[I].ty==="gf"||m[I].ty==="gs"||m[I].ty==="no")He?t[I].style.closed=!1:t[I]=this.createStyleElement(m[I],g),m[I]._render&&t[I].style.pElem.parentNode!==d&&d.appendChild(t[I].style.pElem),Pe.push(t[I].style);else if(m[I].ty==="gr"){if(!He)t[I]=this.createGroupElement(m[I]);else for(Se=t[I].it.length,ye=0;ye<Se;ye+=1)t[I].prevViewData[ye]=t[I].it[ye];this.searchShapes(m[I].it,t[I].it,t[I].prevViewData,t[I].gr,g+1,w,C),m[I]._render&&t[I].gr.parentNode!==d&&d.appendChild(t[I].gr)}else m[I].ty==="tr"?(He||(t[I]=this.createTransformElement(m[I],d)),ke=t[I].transform,w.push(ke)):m[I].ty==="sh"||m[I].ty==="rc"||m[I].ty==="el"||m[I].ty==="sr"?(He||(t[I]=this.createShapeElement(m[I],w,g)),this.setElementStyles(t[I])):m[I].ty==="tm"||m[I].ty==="rd"||m[I].ty==="ms"||m[I].ty==="pb"?(He?(ht=t[I],ht.closed=!1):(ht=ShapeModifiers.getModifier(m[I].ty),ht.init(this,m[I]),t[I]=ht,this.shapeModifiers.push(ht)),Ne.push(ht)):m[I].ty==="rp"&&(He?(ht=t[I],ht.closed=!0):(ht=ShapeModifiers.getModifier(m[I].ty),t[I]=ht,ht.init(this,m,I,t),this.shapeModifiers.push(ht),C=!1),Ne.push(ht));this.addProcessedElement(m[I],I+1)}for(O=Pe.length,I=0;I<O;I+=1)Pe[I].closed=!0;for(O=Ne.length,I=0;I<O;I+=1)Ne[I].closed=!0},SVGShapeElement.prototype.renderInnerContent=function(){this.renderModifiers();var m,t=this.stylesList.length;for(m=0;m<t;m+=1)this.stylesList[m].reset();for(this.renderShape(),m=0;m<t;m+=1)(this.stylesList[m]._mdf||this._isFirstFrame)&&(this.stylesList[m].msElem&&(this.stylesList[m].msElem.setAttribute("d",this.stylesList[m].d),this.stylesList[m].d="M0 0"+this.stylesList[m].d),this.stylesList[m].pElem.setAttribute("d",this.stylesList[m].d||"M0 0"))},SVGShapeElement.prototype.renderShape=function(){var m,t=this.animatedContents.length,r;for(m=0;m<t;m+=1)r=this.animatedContents[m],(this._isFirstFrame||r.element._isAnimated)&&r.data!==!0&&r.fn(r.data,r.element,this._isFirstFrame)},SVGShapeElement.prototype.destroy=function(){this.destroyBaseElement(),this.shapesData=null,this.itemsData=null},LetterProps.prototype.update=function(m,t,r,d,g,v){this._mdf.o=!1,this._mdf.sw=!1,this._mdf.sc=!1,this._mdf.fc=!1,this._mdf.m=!1,this._mdf.p=!1;var C=!1;return this.o!==m&&(this.o=m,this._mdf.o=!0,C=!0),this.sw!==t&&(this.sw=t,this._mdf.sw=!0,C=!0),this.sc!==r&&(this.sc=r,this._mdf.sc=!0,C=!0),this.fc!==d&&(this.fc=d,this._mdf.fc=!0,C=!0),this.m!==g&&(this.m=g,this._mdf.m=!0,C=!0),v.length&&(this.p[0]!==v[0]||this.p[1]!==v[1]||this.p[4]!==v[4]||this.p[5]!==v[5]||this.p[12]!==v[12]||this.p[13]!==v[13])&&(this.p=v,this._mdf.p=!0,C=!0),C},TextProperty.prototype.defaultBoxWidth=[0,0],TextProperty.prototype.copyData=function(m,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(m[r]=t[r]);return m},TextProperty.prototype.setCurrentData=function(m){m.__complete||this.completeTextData(m),this.currentData=m,this.currentData.boxWidth=this.currentData.boxWidth||this.defaultBoxWidth,this._mdf=!0},TextProperty.prototype.searchProperty=function(){return this.searchKeyframes()},TextProperty.prototype.searchKeyframes=function(){return this.kf=this.data.d.k.length>1,this.kf&&this.addEffect(this.getKeyframeValue.bind(this)),this.kf},TextProperty.prototype.addEffect=function(m){this.effectsSequence.push(m),this.elem.addDynamicProperty(this)},TextProperty.prototype.getValue=function(m){if(!((this.elem.globalData.frameId===this.frameId||!this.effectsSequence.length)&&!m)){this.currentData.t=this.data.d.k[this.keysIndex].s.t;var t=this.currentData,r=this.keysIndex;if(this.lock){this.setCurrentData(this.currentData);return}this.lock=!0,this._mdf=!1;var d,g=this.effectsSequence.length,v=m||this.data.d.k[this.keysIndex].s;for(d=0;d<g;d+=1)r!==this.keysIndex?v=this.effectsSequence[d](v,v.t):v=this.effectsSequence[d](this.currentData,v.t);t!==v&&this.setCurrentData(v),this.v=this.currentData,this.pv=this.v,this.lock=!1,this.frameId=this.elem.globalData.frameId}},TextProperty.prototype.getKeyframeValue=function(){for(var m=this.data.d.k,t=this.elem.comp.renderedFrame,r=0,d=m.length;r<=d-1&&!(r===d-1||m[r+1].t>t);)r+=1;return this.keysIndex!==r&&(this.keysIndex=r),this.data.d.k[this.keysIndex].s},TextProperty.prototype.buildFinalText=function(m){for(var t=[],r=0,d=m.length,g,v,C=!1;r<d;)g=m.charCodeAt(r),FontManager.isCombinedCharacter(g)?t[t.length-1]+=m.charAt(r):g>=55296&&g<=56319?(v=m.charCodeAt(r+1),v>=56320&&v<=57343?(C||FontManager.isModifier(g,v)?(t[t.length-1]+=m.substr(r,2),C=!1):t.push(m.substr(r,2)),r+=1):t.push(m.charAt(r))):g>56319?(v=m.charCodeAt(r+1),FontManager.isZeroWidthJoiner(g,v)?(C=!0,t[t.length-1]+=m.substr(r,2),r+=1):t.push(m.charAt(r))):FontManager.isZeroWidthJoiner(g)?(t[t.length-1]+=m.charAt(r),C=!0):t.push(m.charAt(r)),r+=1;return t},TextProperty.prototype.completeTextData=function(m){m.__complete=!0;var t=this.elem.globalData.fontManager,r=this.data,d=[],g,v,C,w=0,I,O=r.m.g,ye=0,Se=0,Pe=0,Ne=[],ke=0,ht=0,He,Fe,at=t.getFontByName(m.f),ct,xt=0,Gt=getFontProperties(at);m.fWeight=Gt.weight,m.fStyle=Gt.style,m.finalSize=m.s,m.finalText=this.buildFinalText(m.t),v=m.finalText.length,m.finalLineHeight=m.lh;var Lt=m.tr/1e3*m.finalSize,Wt;if(m.sz)for(var Pt=!0,Ft=m.sz[0],kt=m.sz[1],Kt,i0;Pt;){i0=this.buildFinalText(m.t),Kt=0,ke=0,v=i0.length,Lt=m.tr/1e3*m.finalSize;var r0=-1;for(g=0;g<v;g+=1)Wt=i0[g].charCodeAt(0),C=!1,i0[g]===" "?r0=g:(Wt===13||Wt===3)&&(ke=0,C=!0,Kt+=m.finalLineHeight||m.finalSize*1.2),t.chars?(ct=t.getCharData(i0[g],at.fStyle,at.fFamily),xt=C?0:ct.w*m.finalSize/100):xt=t.measureText(i0[g],m.f,m.finalSize),ke+xt>Ft&&i0[g]!==" "?(r0===-1?v+=1:g=r0,Kt+=m.finalLineHeight||m.finalSize*1.2,i0.splice(g,r0===g?1:0,"\r"),r0=-1,ke=0):(ke+=xt,ke+=Lt);Kt+=at.ascent*m.finalSize/100,this.canResize&&m.finalSize>this.minimumFontSize&&kt<Kt?(m.finalSize-=1,m.finalLineHeight=m.finalSize*m.lh/m.s):(m.finalText=i0,v=m.finalText.length,Pt=!1)}ke=-Lt,xt=0;var l0=0,n0;for(g=0;g<v;g+=1)if(C=!1,n0=m.finalText[g],Wt=n0.charCodeAt(0),Wt===13||Wt===3?(l0=0,Ne.push(ke),ht=ke>ht?ke:ht,ke=-2*Lt,I="",C=!0,Pe+=1):I=n0,t.chars?(ct=t.getCharData(n0,at.fStyle,t.getFontByName(m.f).fFamily),xt=C?0:ct.w*m.finalSize/100):xt=t.measureText(I,m.f,m.finalSize),n0===" "?l0+=xt+Lt:(ke+=xt+Lt+l0,l0=0),d.push({l:xt,an:xt,add:ye,n:C,anIndexes:[],val:I,line:Pe,animatorJustifyOffset:0}),O==2){if(ye+=xt,I===""||I===" "||g===v-1){for((I===""||I===" ")&&(ye-=xt);Se<=g;)d[Se].an=ye,d[Se].ind=w,d[Se].extra=xt,Se+=1;w+=1,ye=0}}else if(O==3){if(ye+=xt,I===""||g===v-1){for(I===""&&(ye-=xt);Se<=g;)d[Se].an=ye,d[Se].ind=w,d[Se].extra=xt,Se+=1;ye=0,w+=1}}else d[w].ind=w,d[w].extra=0,w+=1;if(m.l=d,ht=ke>ht?ke:ht,Ne.push(ke),m.sz)m.boxWidth=m.sz[0],m.justifyOffset=0;else switch(m.boxWidth=ht,m.j){case 1:m.justifyOffset=-m.boxWidth;break;case 2:m.justifyOffset=-m.boxWidth/2;break;default:m.justifyOffset=0}m.lineWidths=Ne;var Ut=r.a,e0,Yt;Fe=Ut.length;var o0,b0,f0=[];for(He=0;He<Fe;He+=1){for(e0=Ut[He],e0.a.sc&&(m.strokeColorAnim=!0),e0.a.sw&&(m.strokeWidthAnim=!0),(e0.a.fc||e0.a.fh||e0.a.fs||e0.a.fb)&&(m.fillColorAnim=!0),b0=0,o0=e0.s.b,g=0;g<v;g+=1)Yt=d[g],Yt.anIndexes[He]=b0,(o0==1&&Yt.val!==""||o0==2&&Yt.val!==""&&Yt.val!==" "||o0==3&&(Yt.n||Yt.val==" "||g==v-1)||o0==4&&(Yt.n||g==v-1))&&(e0.s.rn===1&&f0.push(b0),b0+=1);r.a[He].s.totalChars=b0;var P0=-1,q0;if(e0.s.rn===1)for(g=0;g<v;g+=1)Yt=d[g],P0!=Yt.anIndexes[He]&&(P0=Yt.anIndexes[He],q0=f0.splice(Math.floor(Math.random()*f0.length),1)[0]),Yt.anIndexes[He]=q0}m.yOffset=m.finalLineHeight||m.finalSize*1.2,m.ls=m.ls||0,m.ascent=at.ascent*m.finalSize/100},TextProperty.prototype.updateDocumentData=function(m,t){t=t===void 0?this.keysIndex:t;var r=this.copyData({},this.data.d.k[t].s);r=this.copyData(r,m),this.data.d.k[t].s=r,this.recalculate(t),this.elem.addDynamicProperty(this)},TextProperty.prototype.recalculate=function(m){var t=this.data.d.k[m].s;t.__complete=!1,this.keysIndex=0,this._isFirstFrame=!0,this.getValue(t)},TextProperty.prototype.canResizeFont=function(m){this.canResize=m,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)},TextProperty.prototype.setMinimumFontSize=function(m){this.minimumFontSize=Math.floor(m)||1,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)};const TextSelectorProp=function(){var m=Math.max,t=Math.min,r=Math.floor;function d(v,C){this._currentTextLength=-1,this.k=!1,this.data=C,this.elem=v,this.comp=v.comp,this.finalS=0,this.finalE=0,this.initDynamicPropertyContainer(v),this.s=PropertyFactory.getProp(v,C.s||{k:0},0,0,this),"e"in C?this.e=PropertyFactory.getProp(v,C.e,0,0,this):this.e={v:100},this.o=PropertyFactory.getProp(v,C.o||{k:0},0,0,this),this.xe=PropertyFactory.getProp(v,C.xe||{k:0},0,0,this),this.ne=PropertyFactory.getProp(v,C.ne||{k:0},0,0,this),this.sm=PropertyFactory.getProp(v,C.sm||{k:100},0,0,this),this.a=PropertyFactory.getProp(v,C.a,0,.01,this),this.dynamicProperties.length||this.getValue()}d.prototype={getMult:function(v){this._currentTextLength!==this.elem.textProperty.currentData.l.length&&this.getValue();var C=0,w=0,I=1,O=1;this.ne.v>0?C=this.ne.v/100:w=-this.ne.v/100,this.xe.v>0?I=1-this.xe.v/100:O=1+this.xe.v/100;var ye=BezierFactory.getBezierEasing(C,w,I,O).get,Se=0,Pe=this.finalS,Ne=this.finalE,ke=this.data.sh;if(ke===2)Ne===Pe?Se=v>=Ne?1:0:Se=m(0,t(.5/(Ne-Pe)+(v-Pe)/(Ne-Pe),1)),Se=ye(Se);else if(ke===3)Ne===Pe?Se=v>=Ne?0:1:Se=1-m(0,t(.5/(Ne-Pe)+(v-Pe)/(Ne-Pe),1)),Se=ye(Se);else if(ke===4)Ne===Pe?Se=0:(Se=m(0,t(.5/(Ne-Pe)+(v-Pe)/(Ne-Pe),1)),Se<.5?Se*=2:Se=1-2*(Se-.5)),Se=ye(Se);else if(ke===5){if(Ne===Pe)Se=0;else{var ht=Ne-Pe;v=t(m(0,v+.5-Pe),Ne-Pe);var He=-ht/2+v,Fe=ht/2;Se=Math.sqrt(1-He*He/(Fe*Fe))}Se=ye(Se)}else ke===6?(Ne===Pe?Se=0:(v=t(m(0,v+.5-Pe),Ne-Pe),Se=(1+Math.cos(Math.PI+Math.PI*2*v/(Ne-Pe)))/2),Se=ye(Se)):(v>=r(Pe)&&(v-Pe<0?Se=m(0,t(t(Ne,1)-(Pe-v),1)):Se=m(0,t(Ne-v,1))),Se=ye(Se));if(this.sm.v!==100){var at=this.sm.v*.01;at===0&&(at=1e-8);var ct=.5-at*.5;Se<ct?Se=0:(Se=(Se-ct)/at,Se>1&&(Se=1))}return Se*this.a.v},getValue:function(v){this.iterateDynamicProperties(),this._mdf=v||this._mdf,this._currentTextLength=this.elem.textProperty.currentData.l.length||0,v&&this.data.r===2&&(this.e.v=this._currentTextLength);var C=this.data.r===2?1:100/this.data.totalChars,w=this.o.v/C,I=this.s.v/C+w,O=this.e.v/C+w;if(I>O){var ye=I;I=O,O=ye}this.finalS=I,this.finalE=O}},extendPrototype([DynamicPropertyContainer],d);function g(v,C,w){return new d(v,C)}return{getTextSelectorProp:g}}();TextAnimatorProperty.prototype.searchProperties=function(){var m,t=this._textData.a.length,r,d=PropertyFactory.getProp;for(m=0;m<t;m+=1)r=this._textData.a[m],this._animatorsData[m]=new TextAnimatorDataProperty(this._elem,r,this);this._textData.p&&"m"in this._textData.p?(this._pathData={a:d(this._elem,this._textData.p.a,0,0,this),f:d(this._elem,this._textData.p.f,0,0,this),l:d(this._elem,this._textData.p.l,0,0,this),r:d(this._elem,this._textData.p.r,0,0,this),p:d(this._elem,this._textData.p.p,0,0,this),m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=d(this._elem,this._textData.m.a,1,0,this)},TextAnimatorProperty.prototype.getMeasures=function(m,t){if(this.lettersChangedFlag=t,!(!this._mdf&&!this._isFirstFrame&&!t&&(!this._hasMaskedPath||!this._pathData.m._mdf))){this._isFirstFrame=!1;var r=this._moreOptions.alignment.v,d=this._animatorsData,g=this._textData,v=this.mHelper,C=this._renderType,w=this.renderedLetters.length,I,O,ye,Se,Pe=m.l,Ne,ke,ht,He,Fe,at,ct,xt,Gt,Lt,Wt,Pt,Ft,kt,Kt;if(this._hasMaskedPath){if(Kt=this._pathData.m,!this._pathData.n||this._pathData._mdf){var i0=Kt.v;this._pathData.r.v&&(i0=i0.reverse()),Ne={tLength:0,segments:[]},Se=i0._length-1;var r0;for(Pt=0,ye=0;ye<Se;ye+=1)r0=bez.buildBezierData(i0.v[ye],i0.v[ye+1],[i0.o[ye][0]-i0.v[ye][0],i0.o[ye][1]-i0.v[ye][1]],[i0.i[ye+1][0]-i0.v[ye+1][0],i0.i[ye+1][1]-i0.v[ye+1][1]]),Ne.tLength+=r0.segmentLength,Ne.segments.push(r0),Pt+=r0.segmentLength;ye=Se,Kt.v.c&&(r0=bez.buildBezierData(i0.v[ye],i0.v[0],[i0.o[ye][0]-i0.v[ye][0],i0.o[ye][1]-i0.v[ye][1]],[i0.i[0][0]-i0.v[0][0],i0.i[0][1]-i0.v[0][1]]),Ne.tLength+=r0.segmentLength,Ne.segments.push(r0),Pt+=r0.segmentLength),this._pathData.pi=Ne}if(Ne=this._pathData.pi,ke=this._pathData.f.v,ct=0,at=1,He=0,Fe=!0,Lt=Ne.segments,ke<0&&Kt.v.c)for(Ne.tLength<Math.abs(ke)&&(ke=-Math.abs(ke)%Ne.tLength),ct=Lt.length-1,Gt=Lt[ct].points,at=Gt.length-1;ke<0;)ke+=Gt[at].partialLength,at-=1,at<0&&(ct-=1,Gt=Lt[ct].points,at=Gt.length-1);Gt=Lt[ct].points,xt=Gt[at-1],ht=Gt[at],Wt=ht.partialLength}Se=Pe.length,I=0,O=0;var l0=m.finalSize*1.2*.714,n0=!0,Ut,e0,Yt,o0,b0;o0=d.length;var f0,P0=-1,q0,G0,I0,F0=ke,D0=ct,Si=at,Ti=-1,Mi,Fi,Ni,B0,h0,xi,O0,J0,A0="",N0=this.defaultPropsArray,_0;if(m.j===2||m.j===1){var a0=0,s0=0,v0=m.j===2?-.5:-1,C0=0,E0=!0;for(ye=0;ye<Se;ye+=1)if(Pe[ye].n){for(a0&&(a0+=s0);C0<ye;)Pe[C0].animatorJustifyOffset=a0,C0+=1;a0=0,E0=!0}else{for(Yt=0;Yt<o0;Yt+=1)Ut=d[Yt].a,Ut.t.propType&&(E0&&m.j===2&&(s0+=Ut.t.v*v0),e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),f0.length?a0+=Ut.t.v*f0[0]*v0:a0+=Ut.t.v*f0*v0);E0=!1}for(a0&&(a0+=s0);C0<ye;)Pe[C0].animatorJustifyOffset=a0,C0+=1}for(ye=0;ye<Se;ye+=1){if(v.reset(),Mi=1,Pe[ye].n)I=0,O+=m.yOffset,O+=n0?1:0,ke=F0,n0=!1,this._hasMaskedPath&&(ct=D0,at=Si,Gt=Lt[ct].points,xt=Gt[at-1],ht=Gt[at],Wt=ht.partialLength,He=0),A0="",J0="",xi="",_0="",N0=this.defaultPropsArray;else{if(this._hasMaskedPath){if(Ti!==Pe[ye].line){switch(m.j){case 1:ke+=Pt-m.lineWidths[Pe[ye].line];break;case 2:ke+=(Pt-m.lineWidths[Pe[ye].line])/2;break}Ti=Pe[ye].line}P0!==Pe[ye].ind&&(Pe[P0]&&(ke+=Pe[P0].extra),ke+=Pe[ye].an/2,P0=Pe[ye].ind),ke+=r[0]*Pe[ye].an*.005;var w0=0;for(Yt=0;Yt<o0;Yt+=1)Ut=d[Yt].a,Ut.p.propType&&(e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),f0.length?w0+=Ut.p.v[0]*f0[0]:w0+=Ut.p.v[0]*f0),Ut.a.propType&&(e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),f0.length?w0+=Ut.a.v[0]*f0[0]:w0+=Ut.a.v[0]*f0);for(Fe=!0,this._pathData.a.v&&(ke=Pe[0].an*.5+(Pt-this._pathData.f.v-Pe[0].an*.5-Pe[Pe.length-1].an*.5)*P0/(Se-1),ke+=this._pathData.f.v);Fe;)He+Wt>=ke+w0||!Gt?(Ft=(ke+w0-He)/ht.partialLength,G0=xt.point[0]+(ht.point[0]-xt.point[0])*Ft,I0=xt.point[1]+(ht.point[1]-xt.point[1])*Ft,v.translate(-r[0]*Pe[ye].an*.005,-(r[1]*l0)*.01),Fe=!1):Gt&&(He+=ht.partialLength,at+=1,at>=Gt.length&&(at=0,ct+=1,Lt[ct]?Gt=Lt[ct].points:Kt.v.c?(at=0,ct=0,Gt=Lt[ct].points):(He-=ht.partialLength,Gt=null)),Gt&&(xt=ht,ht=Gt[at],Wt=ht.partialLength));q0=Pe[ye].an/2-Pe[ye].add,v.translate(-q0,0,0)}else q0=Pe[ye].an/2-Pe[ye].add,v.translate(-q0,0,0),v.translate(-r[0]*Pe[ye].an*.005,-r[1]*l0*.01,0);for(Yt=0;Yt<o0;Yt+=1)Ut=d[Yt].a,Ut.t.propType&&(e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),(I!==0||m.j!==0)&&(this._hasMaskedPath?f0.length?ke+=Ut.t.v*f0[0]:ke+=Ut.t.v*f0:f0.length?I+=Ut.t.v*f0[0]:I+=Ut.t.v*f0));for(m.strokeWidthAnim&&(Ni=m.sw||0),m.strokeColorAnim&&(m.sc?Fi=[m.sc[0],m.sc[1],m.sc[2]]:Fi=[0,0,0]),m.fillColorAnim&&m.fc&&(B0=[m.fc[0],m.fc[1],m.fc[2]]),Yt=0;Yt<o0;Yt+=1)Ut=d[Yt].a,Ut.a.propType&&(e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),f0.length?v.translate(-Ut.a.v[0]*f0[0],-Ut.a.v[1]*f0[1],Ut.a.v[2]*f0[2]):v.translate(-Ut.a.v[0]*f0,-Ut.a.v[1]*f0,Ut.a.v[2]*f0));for(Yt=0;Yt<o0;Yt+=1)Ut=d[Yt].a,Ut.s.propType&&(e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),f0.length?v.scale(1+(Ut.s.v[0]-1)*f0[0],1+(Ut.s.v[1]-1)*f0[1],1):v.scale(1+(Ut.s.v[0]-1)*f0,1+(Ut.s.v[1]-1)*f0,1));for(Yt=0;Yt<o0;Yt+=1){if(Ut=d[Yt].a,e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),Ut.sk.propType&&(f0.length?v.skewFromAxis(-Ut.sk.v*f0[0],Ut.sa.v*f0[1]):v.skewFromAxis(-Ut.sk.v*f0,Ut.sa.v*f0)),Ut.r.propType&&(f0.length?v.rotateZ(-Ut.r.v*f0[2]):v.rotateZ(-Ut.r.v*f0)),Ut.ry.propType&&(f0.length?v.rotateY(Ut.ry.v*f0[1]):v.rotateY(Ut.ry.v*f0)),Ut.rx.propType&&(f0.length?v.rotateX(Ut.rx.v*f0[0]):v.rotateX(Ut.rx.v*f0)),Ut.o.propType&&(f0.length?Mi+=(Ut.o.v*f0[0]-Mi)*f0[0]:Mi+=(Ut.o.v*f0-Mi)*f0),m.strokeWidthAnim&&Ut.sw.propType&&(f0.length?Ni+=Ut.sw.v*f0[0]:Ni+=Ut.sw.v*f0),m.strokeColorAnim&&Ut.sc.propType)for(h0=0;h0<3;h0+=1)f0.length?Fi[h0]+=(Ut.sc.v[h0]-Fi[h0])*f0[0]:Fi[h0]+=(Ut.sc.v[h0]-Fi[h0])*f0;if(m.fillColorAnim&&m.fc){if(Ut.fc.propType)for(h0=0;h0<3;h0+=1)f0.length?B0[h0]+=(Ut.fc.v[h0]-B0[h0])*f0[0]:B0[h0]+=(Ut.fc.v[h0]-B0[h0])*f0;Ut.fh.propType&&(f0.length?B0=addHueToRGB(B0,Ut.fh.v*f0[0]):B0=addHueToRGB(B0,Ut.fh.v*f0)),Ut.fs.propType&&(f0.length?B0=addSaturationToRGB(B0,Ut.fs.v*f0[0]):B0=addSaturationToRGB(B0,Ut.fs.v*f0)),Ut.fb.propType&&(f0.length?B0=addBrightnessToRGB(B0,Ut.fb.v*f0[0]):B0=addBrightnessToRGB(B0,Ut.fb.v*f0))}}for(Yt=0;Yt<o0;Yt+=1)Ut=d[Yt].a,Ut.p.propType&&(e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),this._hasMaskedPath?f0.length?v.translate(0,Ut.p.v[1]*f0[0],-Ut.p.v[2]*f0[1]):v.translate(0,Ut.p.v[1]*f0,-Ut.p.v[2]*f0):f0.length?v.translate(Ut.p.v[0]*f0[0],Ut.p.v[1]*f0[1],-Ut.p.v[2]*f0[2]):v.translate(Ut.p.v[0]*f0,Ut.p.v[1]*f0,-Ut.p.v[2]*f0));if(m.strokeWidthAnim&&(xi=Ni<0?0:Ni),m.strokeColorAnim&&(O0="rgb("+Math.round(Fi[0]*255)+","+Math.round(Fi[1]*255)+","+Math.round(Fi[2]*255)+")"),m.fillColorAnim&&m.fc&&(J0="rgb("+Math.round(B0[0]*255)+","+Math.round(B0[1]*255)+","+Math.round(B0[2]*255)+")"),this._hasMaskedPath){if(v.translate(0,-m.ls),v.translate(0,r[1]*l0*.01+O,0),this._pathData.p.v){kt=(ht.point[1]-xt.point[1])/(ht.point[0]-xt.point[0]);var vi=Math.atan(kt)*180/Math.PI;ht.point[0]<xt.point[0]&&(vi+=180),v.rotate(-vi*Math.PI/180)}v.translate(G0,I0,0),ke-=r[0]*Pe[ye].an*.005,Pe[ye+1]&&P0!==Pe[ye+1].ind&&(ke+=Pe[ye].an/2,ke+=m.tr*.001*m.finalSize)}else{switch(v.translate(I,O,0),m.ps&&v.translate(m.ps[0],m.ps[1]+m.ascent,0),m.j){case 1:v.translate(Pe[ye].animatorJustifyOffset+m.justifyOffset+(m.boxWidth-m.lineWidths[Pe[ye].line]),0,0);break;case 2:v.translate(Pe[ye].animatorJustifyOffset+m.justifyOffset+(m.boxWidth-m.lineWidths[Pe[ye].line])/2,0,0);break}v.translate(0,-m.ls),v.translate(q0,0,0),v.translate(r[0]*Pe[ye].an*.005,r[1]*l0*.01,0),I+=Pe[ye].l+m.tr*.001*m.finalSize}C==="html"?A0=v.toCSS():C==="svg"?A0=v.to2dCSS():N0=[v.props[0],v.props[1],v.props[2],v.props[3],v.props[4],v.props[5],v.props[6],v.props[7],v.props[8],v.props[9],v.props[10],v.props[11],v.props[12],v.props[13],v.props[14],v.props[15]],_0=Mi}w<=ye?(b0=new LetterProps(_0,xi,O0,J0,A0,N0),this.renderedLetters.push(b0),w+=1,this.lettersChangedFlag=!0):(b0=this.renderedLetters[ye],this.lettersChangedFlag=b0.update(_0,xi,O0,J0,A0,N0)||this.lettersChangedFlag)}}},TextAnimatorProperty.prototype.getValue=function(){this._elem.globalData.frameId!==this._frameId&&(this._frameId=this._elem.globalData.frameId,this.iterateDynamicProperties())},TextAnimatorProperty.prototype.mHelper=new Matrix,TextAnimatorProperty.prototype.defaultPropsArray=[],extendPrototype([DynamicPropertyContainer],TextAnimatorProperty),ITextElement.prototype.initElement=function(m,t,r){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(m,t,r),this.textProperty=new TextProperty(this,m.t,this.dynamicProperties),this.textAnimator=new TextAnimatorProperty(m.t,this.renderType,this),this.initTransform(m,t,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide(),this.textAnimator.searchProperties(this.dynamicProperties)},ITextElement.prototype.prepareFrame=function(m){this._mdf=!1,this.prepareRenderableFrame(m),this.prepareProperties(m,this.isInRange),(this.textProperty._mdf||this.textProperty._isFirstFrame)&&(this.buildNewText(),this.textProperty._isFirstFrame=!1,this.textProperty._mdf=!1)},ITextElement.prototype.createPathShape=function(m,t){var r,d=t.length,g,v="";for(r=0;r<d;r+=1)t[r].ty==="sh"&&(g=t[r].ks.k,v+=buildShapeString(g,g.i.length,!0,m));return v},ITextElement.prototype.updateDocumentData=function(m,t){this.textProperty.updateDocumentData(m,t)},ITextElement.prototype.canResizeFont=function(m){this.textProperty.canResizeFont(m)},ITextElement.prototype.setMinimumFontSize=function(m){this.textProperty.setMinimumFontSize(m)},ITextElement.prototype.applyTextPropertiesToMatrix=function(m,t,r,d,g){switch(m.ps&&t.translate(m.ps[0],m.ps[1]+m.ascent,0),t.translate(0,-m.ls,0),m.j){case 1:t.translate(m.justifyOffset+(m.boxWidth-m.lineWidths[r]),0,0);break;case 2:t.translate(m.justifyOffset+(m.boxWidth-m.lineWidths[r])/2,0,0);break}t.translate(d,g,0)},ITextElement.prototype.buildColor=function(m){return"rgb("+Math.round(m[0]*255)+","+Math.round(m[1]*255)+","+Math.round(m[2]*255)+")"},ITextElement.prototype.emptyProp=new LetterProps,ITextElement.prototype.destroy=function(){};var emptyShapeData={shapes:[]};extendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement,ITextElement],SVGTextLottieElement),SVGTextLottieElement.prototype.createContent=function(){this.data.singleShape&&!this.globalData.fontManager.chars&&(this.textContainer=createNS("text"))},SVGTextLottieElement.prototype.buildTextContents=function(m){for(var t=0,r=m.length,d=[],g="";t<r;)m[t]==="\r"||m[t]===""?(d.push(g),g=""):g+=m[t],t+=1;return d.push(g),d},SVGTextLottieElement.prototype.buildShapeData=function(m,t){if(m.shapes&&m.shapes.length){var r=m.shapes[0];if(r.it){var d=r.it[r.it.length-1];d.s&&(d.s.k[0]=t,d.s.k[1]=t)}}return m},SVGTextLottieElement.prototype.buildNewText=function(){this.addDynamicProperty(this);var m,t,r=this.textProperty.currentData;this.renderedLetters=createSizedArray(r?r.l.length:0),r.fc?this.layerElement.setAttribute("fill",this.buildColor(r.fc)):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),r.sc&&(this.layerElement.setAttribute("stroke",this.buildColor(r.sc)),this.layerElement.setAttribute("stroke-width",r.sw)),this.layerElement.setAttribute("font-size",r.finalSize);var d=this.globalData.fontManager.getFontByName(r.f);if(d.fClass)this.layerElement.setAttribute("class",d.fClass);else{this.layerElement.setAttribute("font-family",d.fFamily);var g=r.fWeight,v=r.fStyle;this.layerElement.setAttribute("font-style",v),this.layerElement.setAttribute("font-weight",g)}this.layerElement.setAttribute("aria-label",r.t);var C=r.l||[],w=!!this.globalData.fontManager.chars;t=C.length;var I,O=this.mHelper,ye="",Se=this.data.singleShape,Pe=0,Ne=0,ke=!0,ht=r.tr*.001*r.finalSize;if(Se&&!w&&!r.sz){var He=this.textContainer,Fe="start";switch(r.j){case 1:Fe="end";break;case 2:Fe="middle";break;default:Fe="start";break}He.setAttribute("text-anchor",Fe),He.setAttribute("letter-spacing",ht);var at=this.buildTextContents(r.finalText);for(t=at.length,Ne=r.ps?r.ps[1]+r.ascent:0,m=0;m<t;m+=1)I=this.textSpans[m].span||createNS("tspan"),I.textContent=at[m],I.setAttribute("x",0),I.setAttribute("y",Ne),I.style.display="inherit",He.appendChild(I),this.textSpans[m]||(this.textSpans[m]={span:null,glyph:null}),this.textSpans[m].span=I,Ne+=r.finalLineHeight;this.layerElement.appendChild(He)}else{var ct=this.textSpans.length,xt;for(m=0;m<t;m+=1){if(this.textSpans[m]||(this.textSpans[m]={span:null,childSpan:null,glyph:null}),!w||!Se||m===0){if(I=ct>m?this.textSpans[m].span:createNS(w?"g":"text"),ct<=m){if(I.setAttribute("stroke-linecap","butt"),I.setAttribute("stroke-linejoin","round"),I.setAttribute("stroke-miterlimit","4"),this.textSpans[m].span=I,w){var Gt=createNS("g");I.appendChild(Gt),this.textSpans[m].childSpan=Gt}this.textSpans[m].span=I,this.layerElement.appendChild(I)}I.style.display="inherit"}if(O.reset(),Se&&(C[m].n&&(Pe=-ht,Ne+=r.yOffset,Ne+=ke?1:0,ke=!1),this.applyTextPropertiesToMatrix(r,O,C[m].line,Pe,Ne),Pe+=C[m].l||0,Pe+=ht),w){xt=this.globalData.fontManager.getCharData(r.finalText[m],d.fStyle,this.globalData.fontManager.getFontByName(r.f).fFamily);var Lt;if(xt.t===1)Lt=new SVGCompElement(xt.data,this.globalData,this);else{var Wt=emptyShapeData;xt.data&&xt.data.shapes&&(Wt=this.buildShapeData(xt.data,r.finalSize)),Lt=new SVGShapeElement(Wt,this.globalData,this)}if(this.textSpans[m].glyph){var Pt=this.textSpans[m].glyph;this.textSpans[m].childSpan.removeChild(Pt.layerElement),Pt.destroy()}this.textSpans[m].glyph=Lt,Lt._debug=!0,Lt.prepareFrame(0),Lt.renderFrame(),this.textSpans[m].childSpan.appendChild(Lt.layerElement),xt.t===1&&this.textSpans[m].childSpan.setAttribute("transform","scale("+r.finalSize/100+","+r.finalSize/100+")")}else Se&&I.setAttribute("transform","translate("+O.props[12]+","+O.props[13]+")"),I.textContent=C[m].val,I.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve")}Se&&I&&I.setAttribute("d",ye)}for(;m<this.textSpans.length;)this.textSpans[m].span.style.display="none",m+=1;this._sizeChanged=!0},SVGTextLottieElement.prototype.sourceRectAtTime=function(){if(this.prepareFrame(this.comp.renderedFrame-this.data.st),this.renderInnerContent(),this._sizeChanged){this._sizeChanged=!1;var m=this.layerElement.getBBox();this.bbox={top:m.y,left:m.x,width:m.width,height:m.height}}return this.bbox},SVGTextLottieElement.prototype.getValue=function(){var m,t=this.textSpans.length,r;for(this.renderedFrame=this.comp.renderedFrame,m=0;m<t;m+=1)r=this.textSpans[m].glyph,r&&(r.prepareFrame(this.comp.renderedFrame-this.data.st),r._mdf&&(this._mdf=!0))},SVGTextLottieElement.prototype.renderInnerContent=function(){if((!this.data.singleShape||this._mdf)&&(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag)){this._sizeChanged=!0;var m,t,r=this.textAnimator.renderedLetters,d=this.textProperty.currentData.l;t=d.length;var g,v,C;for(m=0;m<t;m+=1)d[m].n||(g=r[m],v=this.textSpans[m].span,C=this.textSpans[m].glyph,C&&C.renderFrame(),g._mdf.m&&v.setAttribute("transform",g.m),g._mdf.o&&v.setAttribute("opacity",g.o),g._mdf.sw&&v.setAttribute("stroke-width",g.sw),g._mdf.sc&&v.setAttribute("stroke",g.sc),g._mdf.fc&&v.setAttribute("fill",g.fc))}},extendPrototype([IImageElement],ISolidElement),ISolidElement.prototype.createContent=function(){var m=createNS("rect");m.setAttribute("width",this.data.sw),m.setAttribute("height",this.data.sh),m.setAttribute("fill",this.data.sc),this.layerElement.appendChild(m)},NullElement.prototype.prepareFrame=function(m){this.prepareProperties(m,!0)},NullElement.prototype.renderFrame=function(){},NullElement.prototype.getBaseElement=function(){return null},NullElement.prototype.destroy=function(){},NullElement.prototype.sourceRectAtTime=function(){},NullElement.prototype.hide=function(){},extendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement],NullElement),extendPrototype([BaseRenderer],SVGRendererBase),SVGRendererBase.prototype.createNull=function(m){return new NullElement(m,this.globalData,this)},SVGRendererBase.prototype.createShape=function(m){return new SVGShapeElement(m,this.globalData,this)},SVGRendererBase.prototype.createText=function(m){return new SVGTextLottieElement(m,this.globalData,this)},SVGRendererBase.prototype.createImage=function(m){return new IImageElement(m,this.globalData,this)},SVGRendererBase.prototype.createSolid=function(m){return new ISolidElement(m,this.globalData,this)},SVGRendererBase.prototype.configAnimation=function(m){this.svgElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this.svgElement.setAttribute("viewBox",this.renderConfig.viewBoxSize):this.svgElement.setAttribute("viewBox","0 0 "+m.w+" "+m.h),this.renderConfig.viewBoxOnly||(this.svgElement.setAttribute("width",m.w),this.svgElement.setAttribute("height",m.h),this.svgElement.style.width="100%",this.svgElement.style.height="100%",this.svgElement.style.transform="translate3d(0,0,0)",this.svgElement.style.contentVisibility=this.renderConfig.contentVisibility),this.renderConfig.width&&this.svgElement.setAttribute("width",this.renderConfig.width),this.renderConfig.height&&this.svgElement.setAttribute("height",this.renderConfig.height),this.renderConfig.className&&this.svgElement.setAttribute("class",this.renderConfig.className),this.renderConfig.id&&this.svgElement.setAttribute("id",this.renderConfig.id),this.renderConfig.focusable!==void 0&&this.svgElement.setAttribute("focusable",this.renderConfig.focusable),this.svgElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.animationItem.wrapper.appendChild(this.svgElement);var t=this.globalData.defs;this.setupGlobalData(m,t),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.data=m;var r=createNS("clipPath"),d=createNS("rect");d.setAttribute("width",m.w),d.setAttribute("height",m.h),d.setAttribute("x",0),d.setAttribute("y",0);var g=createElementID();r.setAttribute("id",g),r.appendChild(d),this.layerElement.setAttribute("clip-path","url("+getLocationHref()+"#"+g+")"),t.appendChild(r),this.layers=m.layers,this.elements=createSizedArray(m.layers.length)},SVGRendererBase.prototype.destroy=function(){this.animationItem.wrapper&&(this.animationItem.wrapper.innerText=""),this.layerElement=null,this.globalData.defs=null;var m,t=this.layers?this.layers.length:0;for(m=0;m<t;m+=1)this.elements[m]&&this.elements[m].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},SVGRendererBase.prototype.updateContainerSize=function(){},SVGRendererBase.prototype.buildItem=function(m){var t=this.elements;if(!(t[m]||this.layers[m].ty===99)){t[m]=!0;var r=this.createItem(this.layers[m]);t[m]=r,getExpressionsPlugin()&&(this.layers[m].ty===0&&this.globalData.projectInterface.registerComposition(r),r.initExpressions()),this.appendElementInPos(r,m),this.layers[m].tt&&(!this.elements[m-1]||this.elements[m-1]===!0?(this.buildItem(m-1),this.addPendingElement(r)):r.setMatte(t[m-1].layerId))}},SVGRendererBase.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var m=this.pendingElements.pop();if(m.checkParenting(),m.data.tt)for(var t=0,r=this.elements.length;t<r;){if(this.elements[t]===m){m.setMatte(this.elements[t-1].layerId);break}t+=1}}},SVGRendererBase.prototype.renderFrame=function(m){if(!(this.renderedFrame===m||this.destroyed)){m===null?m=this.renderedFrame:this.renderedFrame=m,this.globalData.frameNum=m,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=m,this.globalData._mdf=!1;var t,r=this.layers.length;for(this.completeLayers||this.checkLayers(m),t=r-1;t>=0;t-=1)(this.completeLayers||this.elements[t])&&this.elements[t].prepareFrame(m-this.layers[t].st);if(this.globalData._mdf)for(t=0;t<r;t+=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()}},SVGRendererBase.prototype.appendElementInPos=function(m,t){var r=m.getBaseElement();if(r){for(var d=0,g;d<t;)this.elements[d]&&this.elements[d]!==!0&&this.elements[d].getBaseElement()&&(g=this.elements[d].getBaseElement()),d+=1;g?this.layerElement.insertBefore(r,g):this.layerElement.appendChild(r)}},SVGRendererBase.prototype.hide=function(){this.layerElement.style.display="none"},SVGRendererBase.prototype.show=function(){this.layerElement.style.display="block"},extendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement,RenderableDOMElement],ICompElement),ICompElement.prototype.initElement=function(m,t,r){this.initFrame(),this.initBaseData(m,t,r),this.initTransform(m,t,r),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),(this.data.xt||!t.progressiveLoad)&&this.buildAllItems(),this.hide()},ICompElement.prototype.prepareFrame=function(m){if(this._mdf=!1,this.prepareRenderableFrame(m),this.prepareProperties(m,this.isInRange),!(!this.isInRange&&!this.data.xt)){if(this.tm._placeholder)this.renderedFrame=m/this.data.sr;else{var t=this.tm.v;t===this.data.op&&(t=this.data.op-1),this.renderedFrame=t}var r,d=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),r=d-1;r>=0;r-=1)(this.completeLayers||this.elements[r])&&(this.elements[r].prepareFrame(this.renderedFrame-this.layers[r].st),this.elements[r]._mdf&&(this._mdf=!0))}},ICompElement.prototype.renderInnerContent=function(){var m,t=this.layers.length;for(m=0;m<t;m+=1)(this.completeLayers||this.elements[m])&&this.elements[m].renderFrame()},ICompElement.prototype.setElements=function(m){this.elements=m},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroyElements=function(){var m,t=this.layers.length;for(m=0;m<t;m+=1)this.elements[m]&&this.elements[m].destroy()},ICompElement.prototype.destroy=function(){this.destroyElements(),this.destroyBaseElement()},extendPrototype([SVGRendererBase,ICompElement,SVGBaseElement],SVGCompElement),SVGCompElement.prototype.createComp=function(m){return new SVGCompElement(m,this.globalData,this)},extendPrototype([SVGRendererBase],SVGRenderer),SVGRenderer.prototype.createComp=function(m){return new SVGCompElement(m,this.globalData,this)},CVContextData.prototype.duplicate=function(){var m=this._length*2,t=this.savedOp;this.savedOp=createTypedArray("float32",m),this.savedOp.set(t);var r=0;for(r=this._length;r<m;r+=1)this.saved[r]=createTypedArray("float32",16);this._length=m},CVContextData.prototype.reset=function(){this.cArrPos=0,this.cTr.reset(),this.cO=1},ShapeTransformManager.prototype={addTransformSequence:function(m){var t,r=m.length,d="_";for(t=0;t<r;t+=1)d+=m[t].transform.key+"_";var g=this.sequences[d];return g||(g={transforms:[].concat(m),finalTransform:new Matrix,_mdf:!1},this.sequences[d]=g,this.sequenceList.push(g)),g},processSequence:function(m,t){for(var r=0,d=m.transforms.length,g=t;r<d&&!t;){if(m.transforms[r].transform.mProps._mdf){g=!0;break}r+=1}if(g){var v;for(m.finalTransform.reset(),r=d-1;r>=0;r-=1)v=m.transforms[r].transform.mProps.v.props,m.finalTransform.transform(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11],v[12],v[13],v[14],v[15])}m._mdf=g},processSequences:function(m){var t,r=this.sequenceList.length;for(t=0;t<r;t+=1)this.processSequence(this.sequenceList[t],m)},getNewKey:function(){return this.transform_key_count+=1,"_"+this.transform_key_count}},CVEffects.prototype.renderFrame=function(){},CVMaskElement.prototype.renderFrame=function(){if(this.hasMasks){var m=this.element.finalTransform.mat,t=this.element.canvasContext,r,d=this.masksProperties.length,g,v,C;for(t.beginPath(),r=0;r<d;r+=1)if(this.masksProperties[r].mode!=="n"){this.masksProperties[r].inv&&(t.moveTo(0,0),t.lineTo(this.element.globalData.compSize.w,0),t.lineTo(this.element.globalData.compSize.w,this.element.globalData.compSize.h),t.lineTo(0,this.element.globalData.compSize.h),t.lineTo(0,0)),C=this.viewData[r].v,g=m.applyToPointArray(C.v[0][0],C.v[0][1],0),t.moveTo(g[0],g[1]);var w,I=C._length;for(w=1;w<I;w+=1)v=m.applyToTriplePoints(C.o[w-1],C.i[w],C.v[w]),t.bezierCurveTo(v[0],v[1],v[2],v[3],v[4],v[5]);v=m.applyToTriplePoints(C.o[w-1],C.i[0],C.v[0]),t.bezierCurveTo(v[0],v[1],v[2],v[3],v[4],v[5])}this.element.globalData.renderer.save(!0),t.clip()}},CVMaskElement.prototype.getMaskProperty=MaskElement.prototype.getMaskProperty,CVMaskElement.prototype.destroy=function(){this.element=null},CVBaseElement.prototype={createElements:function(){},initRendererElement:function(){},createContainerElements:function(){this.canvasContext=this.globalData.canvasContext,this.renderableEffectsManager=new CVEffects},createContent:function(){},setBlendMode:function(){var m=this.globalData;if(m.blendMode!==this.data.bm){m.blendMode=this.data.bm;var t=getBlendMode(this.data.bm);m.canvasContext.globalCompositeOperation=t}},createRenderableComponents:function(){this.maskManager=new CVMaskElement(this.data,this)},hideElement:function(){!this.hidden&&(!this.isInRange||this.isTransparent)&&(this.hidden=!0)},showElement:function(){this.isInRange&&!this.isTransparent&&(this.hidden=!1,this._isFirstFrame=!0,this.maskManager._isFirstFrame=!0)},renderFrame:function(){if(!(this.hidden||this.data.hd)){this.renderTransform(),this.renderRenderable(),this.setBlendMode();var m=this.data.ty===0;this.globalData.renderer.save(m),this.globalData.renderer.ctxTransform(this.finalTransform.mat.props),this.globalData.renderer.ctxOpacity(this.finalTransform.mProp.o.v),this.renderInnerContent(),this.globalData.renderer.restore(m),this.maskManager.hasMasks&&this.globalData.renderer.restore(!0),this._isFirstFrame&&(this._isFirstFrame=!1)}},destroy:function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager.destroy()},mHelper:new Matrix},CVBaseElement.prototype.hide=CVBaseElement.prototype.hideElement,CVBaseElement.prototype.show=CVBaseElement.prototype.showElement,CVShapeData.prototype.setAsAnimated=SVGShapeData.prototype.setAsAnimated,extendPrototype([BaseElement,TransformElement,CVBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableElement],CVShapeElement),CVShapeElement.prototype.initElement=RenderableDOMElement.prototype.initElement,CVShapeElement.prototype.transformHelper={opacity:1,_opMdf:!1},CVShapeElement.prototype.dashResetter=[],CVShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[])},CVShapeElement.prototype.createStyleElement=function(m,t){var r={data:m,type:m.ty,preTransforms:this.transformsManager.addTransformSequence(t),transforms:[],elements:[],closed:m.hd===!0},d={};if(m.ty==="fl"||m.ty==="st"?(d.c=PropertyFactory.getProp(this,m.c,1,255,this),d.c.k||(r.co="rgb("+bmFloor(d.c.v[0])+","+bmFloor(d.c.v[1])+","+bmFloor(d.c.v[2])+")")):(m.ty==="gf"||m.ty==="gs")&&(d.s=PropertyFactory.getProp(this,m.s,1,null,this),d.e=PropertyFactory.getProp(this,m.e,1,null,this),d.h=PropertyFactory.getProp(this,m.h||{k:0},0,.01,this),d.a=PropertyFactory.getProp(this,m.a||{k:0},0,degToRads,this),d.g=new GradientProperty(this,m.g,this)),d.o=PropertyFactory.getProp(this,m.o,0,.01,this),m.ty==="st"||m.ty==="gs"){if(r.lc=lineCapEnum[m.lc||2],r.lj=lineJoinEnum[m.lj||2],m.lj==1&&(r.ml=m.ml),d.w=PropertyFactory.getProp(this,m.w,0,null,this),d.w.k||(r.wi=d.w.v),m.d){var g=new DashProperty(this,m.d,"canvas",this);d.d=g,d.d.k||(r.da=d.d.dashArray,r.do=d.d.dashoffset[0])}}else r.r=m.r===2?"evenodd":"nonzero";return this.stylesList.push(r),d.style=r,d},CVShapeElement.prototype.createGroupElement=function(){var m={it:[],prevViewData:[]};return m},CVShapeElement.prototype.createTransformElement=function(m){var t={transform:{opacity:1,_opMdf:!1,key:this.transformsManager.getNewKey(),op:PropertyFactory.getProp(this,m.o,0,.01,this),mProps:TransformPropertyFactory.getTransformProperty(this,m,this)}};return t},CVShapeElement.prototype.createShapeElement=function(m){var t=new CVShapeData(this,m,this.stylesList,this.transformsManager);return this.shapes.push(t),this.addShapeToModifiers(t),t},CVShapeElement.prototype.reloadShapes=function(){this._isFirstFrame=!0;var m,t=this.itemsData.length;for(m=0;m<t;m+=1)this.prevViewData[m]=this.itemsData[m];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[]),t=this.dynamicProperties.length,m=0;m<t;m+=1)this.dynamicProperties[m].getValue();this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame)},CVShapeElement.prototype.addTransformToStyleList=function(m){var t,r=this.stylesList.length;for(t=0;t<r;t+=1)this.stylesList[t].closed||this.stylesList[t].transforms.push(m)},CVShapeElement.prototype.removeTransformFromStyleList=function(){var m,t=this.stylesList.length;for(m=0;m<t;m+=1)this.stylesList[m].closed||this.stylesList[m].transforms.pop()},CVShapeElement.prototype.closeStyles=function(m){var t,r=m.length;for(t=0;t<r;t+=1)m[t].closed=!0},CVShapeElement.prototype.searchShapes=function(m,t,r,d,g){var v,C=m.length-1,w,I,O=[],ye=[],Se,Pe,Ne,ke=[].concat(g);for(v=C;v>=0;v-=1){if(Se=this.searchProcessedElement(m[v]),Se?t[v]=r[Se-1]:m[v]._shouldRender=d,m[v].ty==="fl"||m[v].ty==="st"||m[v].ty==="gf"||m[v].ty==="gs")Se?t[v].style.closed=!1:t[v]=this.createStyleElement(m[v],ke),O.push(t[v].style);else if(m[v].ty==="gr"){if(!Se)t[v]=this.createGroupElement(m[v]);else for(I=t[v].it.length,w=0;w<I;w+=1)t[v].prevViewData[w]=t[v].it[w];this.searchShapes(m[v].it,t[v].it,t[v].prevViewData,d,ke)}else m[v].ty==="tr"?(Se||(Ne=this.createTransformElement(m[v]),t[v]=Ne),ke.push(t[v]),this.addTransformToStyleList(t[v])):m[v].ty==="sh"||m[v].ty==="rc"||m[v].ty==="el"||m[v].ty==="sr"?Se||(t[v]=this.createShapeElement(m[v])):m[v].ty==="tm"||m[v].ty==="rd"||m[v].ty==="pb"?(Se?(Pe=t[v],Pe.closed=!1):(Pe=ShapeModifiers.getModifier(m[v].ty),Pe.init(this,m[v]),t[v]=Pe,this.shapeModifiers.push(Pe)),ye.push(Pe)):m[v].ty==="rp"&&(Se?(Pe=t[v],Pe.closed=!0):(Pe=ShapeModifiers.getModifier(m[v].ty),t[v]=Pe,Pe.init(this,m,v,t),this.shapeModifiers.push(Pe),d=!1),ye.push(Pe));this.addProcessedElement(m[v],v+1)}for(this.removeTransformFromStyleList(),this.closeStyles(O),C=ye.length,v=0;v<C;v+=1)ye[v].closed=!0},CVShapeElement.prototype.renderInnerContent=function(){this.transformHelper.opacity=1,this.transformHelper._opMdf=!1,this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame),this.renderShape(this.transformHelper,this.shapesData,this.itemsData,!0)},CVShapeElement.prototype.renderShapeTransform=function(m,t){(m._opMdf||t.op._mdf||this._isFirstFrame)&&(t.opacity=m.opacity,t.opacity*=t.op.v,t._opMdf=!0)},CVShapeElement.prototype.drawLayer=function(){var m,t=this.stylesList.length,r,d,g,v,C,w,I=this.globalData.renderer,O=this.globalData.canvasContext,ye,Se;for(m=0;m<t;m+=1)if(Se=this.stylesList[m],ye=Se.type,!((ye==="st"||ye==="gs")&&Se.wi===0||!Se.data._shouldRender||Se.coOp===0||this.globalData.currentGlobalAlpha===0)){for(I.save(),C=Se.elements,ye==="st"||ye==="gs"?(O.strokeStyle=ye==="st"?Se.co:Se.grd,O.lineWidth=Se.wi,O.lineCap=Se.lc,O.lineJoin=Se.lj,O.miterLimit=Se.ml||0):O.fillStyle=ye==="fl"?Se.co:Se.grd,I.ctxOpacity(Se.coOp),ye!=="st"&&ye!=="gs"&&O.beginPath(),I.ctxTransform(Se.preTransforms.finalTransform.props),d=C.length,r=0;r<d;r+=1){for((ye==="st"||ye==="gs")&&(O.beginPath(),Se.da&&(O.setLineDash(Se.da),O.lineDashOffset=Se.do)),w=C[r].trNodes,v=w.length,g=0;g<v;g+=1)w[g].t==="m"?O.moveTo(w[g].p[0],w[g].p[1]):w[g].t==="c"?O.bezierCurveTo(w[g].pts[0],w[g].pts[1],w[g].pts[2],w[g].pts[3],w[g].pts[4],w[g].pts[5]):O.closePath();(ye==="st"||ye==="gs")&&(O.stroke(),Se.da&&O.setLineDash(this.dashResetter))}ye!=="st"&&ye!=="gs"&&O.fill(Se.r),I.restore()}},CVShapeElement.prototype.renderShape=function(m,t,r,d){var g,v=t.length-1,C;for(C=m,g=v;g>=0;g-=1)t[g].ty==="tr"?(C=r[g].transform,this.renderShapeTransform(m,C)):t[g].ty==="sh"||t[g].ty==="el"||t[g].ty==="rc"||t[g].ty==="sr"?this.renderPath(t[g],r[g]):t[g].ty==="fl"?this.renderFill(t[g],r[g],C):t[g].ty==="st"?this.renderStroke(t[g],r[g],C):t[g].ty==="gf"||t[g].ty==="gs"?this.renderGradientFill(t[g],r[g],C):t[g].ty==="gr"?this.renderShape(C,t[g].it,r[g].it):t[g].ty;d&&this.drawLayer()},CVShapeElement.prototype.renderStyledShape=function(m,t){if(this._isFirstFrame||t._mdf||m.transforms._mdf){var r=m.trNodes,d=t.paths,g,v,C,w=d._length;r.length=0;var I=m.transforms.finalTransform;for(C=0;C<w;C+=1){var O=d.shapes[C];if(O&&O.v){for(v=O._length,g=1;g<v;g+=1)g===1&&r.push({t:"m",p:I.applyToPointArray(O.v[0][0],O.v[0][1],0)}),r.push({t:"c",pts:I.applyToTriplePoints(O.o[g-1],O.i[g],O.v[g])});v===1&&r.push({t:"m",p:I.applyToPointArray(O.v[0][0],O.v[0][1],0)}),O.c&&v&&(r.push({t:"c",pts:I.applyToTriplePoints(O.o[g-1],O.i[0],O.v[0])}),r.push({t:"z"}))}}m.trNodes=r}},CVShapeElement.prototype.renderPath=function(m,t){if(m.hd!==!0&&m._shouldRender){var r,d=t.styledShapes.length;for(r=0;r<d;r+=1)this.renderStyledShape(t.styledShapes[r],t.sh)}},CVShapeElement.prototype.renderFill=function(m,t,r){var d=t.style;(t.c._mdf||this._isFirstFrame)&&(d.co="rgb("+bmFloor(t.c.v[0])+","+bmFloor(t.c.v[1])+","+bmFloor(t.c.v[2])+")"),(t.o._mdf||r._opMdf||this._isFirstFrame)&&(d.coOp=t.o.v*r.opacity)},CVShapeElement.prototype.renderGradientFill=function(m,t,r){var d=t.style,g;if(!d.grd||t.g._mdf||t.s._mdf||t.e._mdf||m.t!==1&&(t.h._mdf||t.a._mdf)){var v=this.globalData.canvasContext,C=t.s.v,w=t.e.v;if(m.t===1)g=v.createLinearGradient(C[0],C[1],w[0],w[1]);else{var I=Math.sqrt(Math.pow(C[0]-w[0],2)+Math.pow(C[1]-w[1],2)),O=Math.atan2(w[1]-C[1],w[0]-C[0]),ye=t.h.v;ye>=1?ye=.99:ye<=-1&&(ye=-.99);var Se=I*ye,Pe=Math.cos(O+t.a.v)*Se+C[0],Ne=Math.sin(O+t.a.v)*Se+C[1];g=v.createRadialGradient(Pe,Ne,0,C[0],C[1],I)}var ke,ht=m.g.p,He=t.g.c,Fe=1;for(ke=0;ke<ht;ke+=1)t.g._hasOpacity&&t.g._collapsable&&(Fe=t.g.o[ke*2+1]),g.addColorStop(He[ke*4]/100,"rgba("+He[ke*4+1]+","+He[ke*4+2]+","+He[ke*4+3]+","+Fe+")");d.grd=g}d.coOp=t.o.v*r.opacity},CVShapeElement.prototype.renderStroke=function(m,t,r){var d=t.style,g=t.d;g&&(g._mdf||this._isFirstFrame)&&(d.da=g.dashArray,d.do=g.dashoffset[0]),(t.c._mdf||this._isFirstFrame)&&(d.co="rgb("+bmFloor(t.c.v[0])+","+bmFloor(t.c.v[1])+","+bmFloor(t.c.v[2])+")"),(t.o._mdf||r._opMdf||this._isFirstFrame)&&(d.coOp=t.o.v*r.opacity),(t.w._mdf||this._isFirstFrame)&&(d.wi=t.w.v)},CVShapeElement.prototype.destroy=function(){this.shapesData=null,this.globalData=null,this.canvasContext=null,this.stylesList.length=0,this.itemsData.length=0},extendPrototype([BaseElement,TransformElement,CVBaseElement,HierarchyElement,FrameElement,RenderableElement,ITextElement],CVTextElement),CVTextElement.prototype.tHelper=createTag("canvas").getContext("2d"),CVTextElement.prototype.buildNewText=function(){var m=this.textProperty.currentData;this.renderedLetters=createSizedArray(m.l?m.l.length:0);var t=!1;m.fc?(t=!0,this.values.fill=this.buildColor(m.fc)):this.values.fill="rgba(0,0,0,0)",this.fill=t;var r=!1;m.sc&&(r=!0,this.values.stroke=this.buildColor(m.sc),this.values.sWidth=m.sw);var d=this.globalData.fontManager.getFontByName(m.f),g,v,C=m.l,w=this.mHelper;this.stroke=r,this.values.fValue=m.finalSize+"px "+this.globalData.fontManager.getFontByName(m.f).fFamily,v=m.finalText.length;var I,O,ye,Se,Pe,Ne,ke,ht,He,Fe,at=this.data.singleShape,ct=m.tr*.001*m.finalSize,xt=0,Gt=0,Lt=!0,Wt=0;for(g=0;g<v;g+=1){I=this.globalData.fontManager.getCharData(m.finalText[g],d.fStyle,this.globalData.fontManager.getFontByName(m.f).fFamily),O=I&&I.data||{},w.reset(),at&&C[g].n&&(xt=-ct,Gt+=m.yOffset,Gt+=Lt?1:0,Lt=!1),Pe=O.shapes?O.shapes[0].it:[],ke=Pe.length,w.scale(m.finalSize/100,m.finalSize/100),at&&this.applyTextPropertiesToMatrix(m,w,C[g].line,xt,Gt),He=createSizedArray(ke-1);var Pt=0;for(Ne=0;Ne<ke;Ne+=1)if(Pe[Ne].ty==="sh"){for(Se=Pe[Ne].ks.k.i.length,ht=Pe[Ne].ks.k,Fe=[],ye=1;ye<Se;ye+=1)ye===1&&Fe.push(w.applyToX(ht.v[0][0],ht.v[0][1],0),w.applyToY(ht.v[0][0],ht.v[0][1],0)),Fe.push(w.applyToX(ht.o[ye-1][0],ht.o[ye-1][1],0),w.applyToY(ht.o[ye-1][0],ht.o[ye-1][1],0),w.applyToX(ht.i[ye][0],ht.i[ye][1],0),w.applyToY(ht.i[ye][0],ht.i[ye][1],0),w.applyToX(ht.v[ye][0],ht.v[ye][1],0),w.applyToY(ht.v[ye][0],ht.v[ye][1],0));Fe.push(w.applyToX(ht.o[ye-1][0],ht.o[ye-1][1],0),w.applyToY(ht.o[ye-1][0],ht.o[ye-1][1],0),w.applyToX(ht.i[0][0],ht.i[0][1],0),w.applyToY(ht.i[0][0],ht.i[0][1],0),w.applyToX(ht.v[0][0],ht.v[0][1],0),w.applyToY(ht.v[0][0],ht.v[0][1],0)),He[Pt]=Fe,Pt+=1}at&&(xt+=C[g].l,xt+=ct),this.textSpans[Wt]?this.textSpans[Wt].elem=He:this.textSpans[Wt]={elem:He},Wt+=1}},CVTextElement.prototype.renderInnerContent=function(){var m=this.canvasContext;m.font=this.values.fValue,m.lineCap="butt",m.lineJoin="miter",m.miterLimit=4,this.data.singleShape||this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag);var t,r,d,g,v,C,w=this.textAnimator.renderedLetters,I=this.textProperty.currentData.l;r=I.length;var O,ye=null,Se=null,Pe=null,Ne,ke;for(t=0;t<r;t+=1)if(!I[t].n){if(O=w[t],O&&(this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(O.p),this.globalData.renderer.ctxOpacity(O.o)),this.fill){for(O&&O.fc?ye!==O.fc&&(ye=O.fc,m.fillStyle=O.fc):ye!==this.values.fill&&(ye=this.values.fill,m.fillStyle=this.values.fill),Ne=this.textSpans[t].elem,g=Ne.length,this.globalData.canvasContext.beginPath(),d=0;d<g;d+=1)for(ke=Ne[d],C=ke.length,this.globalData.canvasContext.moveTo(ke[0],ke[1]),v=2;v<C;v+=6)this.globalData.canvasContext.bezierCurveTo(ke[v],ke[v+1],ke[v+2],ke[v+3],ke[v+4],ke[v+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.fill()}if(this.stroke){for(O&&O.sw?Pe!==O.sw&&(Pe=O.sw,m.lineWidth=O.sw):Pe!==this.values.sWidth&&(Pe=this.values.sWidth,m.lineWidth=this.values.sWidth),O&&O.sc?Se!==O.sc&&(Se=O.sc,m.strokeStyle=O.sc):Se!==this.values.stroke&&(Se=this.values.stroke,m.strokeStyle=this.values.stroke),Ne=this.textSpans[t].elem,g=Ne.length,this.globalData.canvasContext.beginPath(),d=0;d<g;d+=1)for(ke=Ne[d],C=ke.length,this.globalData.canvasContext.moveTo(ke[0],ke[1]),v=2;v<C;v+=6)this.globalData.canvasContext.bezierCurveTo(ke[v],ke[v+1],ke[v+2],ke[v+3],ke[v+4],ke[v+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.stroke()}O&&this.globalData.renderer.restore()}},extendPrototype([BaseElement,TransformElement,CVBaseElement,HierarchyElement,FrameElement,RenderableElement],CVImageElement),CVImageElement.prototype.initElement=SVGShapeElement.prototype.initElement,CVImageElement.prototype.prepareFrame=IImageElement.prototype.prepareFrame,CVImageElement.prototype.createContent=function(){if(this.img.width&&(this.assetData.w!==this.img.width||this.assetData.h!==this.img.height)){var m=createTag("canvas");m.width=this.assetData.w,m.height=this.assetData.h;var t=m.getContext("2d"),r=this.img.width,d=this.img.height,g=r/d,v=this.assetData.w/this.assetData.h,C,w,I=this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio;g>v&&I==="xMidYMid slice"||g<v&&I!=="xMidYMid slice"?(w=d,C=w*v):(C=r,w=C/v),t.drawImage(this.img,(r-C)/2,(d-w)/2,C,w,0,0,this.assetData.w,this.assetData.h),this.img=m}},CVImageElement.prototype.renderInnerContent=function(){this.canvasContext.drawImage(this.img,0,0)},CVImageElement.prototype.destroy=function(){this.img=null},extendPrototype([BaseElement,TransformElement,CVBaseElement,HierarchyElement,FrameElement,RenderableElement],CVSolidElement),CVSolidElement.prototype.initElement=SVGShapeElement.prototype.initElement,CVSolidElement.prototype.prepareFrame=IImageElement.prototype.prepareFrame,CVSolidElement.prototype.renderInnerContent=function(){var m=this.canvasContext;m.fillStyle=this.data.sc,m.fillRect(0,0,this.data.sw,this.data.sh)},extendPrototype([BaseRenderer],CanvasRendererBase),CanvasRendererBase.prototype.createShape=function(m){return new CVShapeElement(m,this.globalData,this)},CanvasRendererBase.prototype.createText=function(m){return new CVTextElement(m,this.globalData,this)},CanvasRendererBase.prototype.createImage=function(m){return new CVImageElement(m,this.globalData,this)},CanvasRendererBase.prototype.createSolid=function(m){return new CVSolidElement(m,this.globalData,this)},CanvasRendererBase.prototype.createNull=SVGRenderer.prototype.createNull,CanvasRendererBase.prototype.ctxTransform=function(m){if(!(m[0]===1&&m[1]===0&&m[4]===0&&m[5]===1&&m[12]===0&&m[13]===0)){if(!this.renderConfig.clearCanvas){this.canvasContext.transform(m[0],m[1],m[4],m[5],m[12],m[13]);return}this.transformMat.cloneFromProps(m);var t=this.contextData.cTr.props;this.transformMat.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15]),this.contextData.cTr.cloneFromProps(this.transformMat.props);var r=this.contextData.cTr.props;this.canvasContext.setTransform(r[0],r[1],r[4],r[5],r[12],r[13])}},CanvasRendererBase.prototype.ctxOpacity=function(m){if(!this.renderConfig.clearCanvas){this.canvasContext.globalAlpha*=m<0?0:m,this.globalData.currentGlobalAlpha=this.contextData.cO;return}this.contextData.cO*=m<0?0:m,this.globalData.currentGlobalAlpha!==this.contextData.cO&&(this.canvasContext.globalAlpha=this.contextData.cO,this.globalData.currentGlobalAlpha=this.contextData.cO)},CanvasRendererBase.prototype.reset=function(){if(!this.renderConfig.clearCanvas){this.canvasContext.restore();return}this.contextData.reset()},CanvasRendererBase.prototype.save=function(m){if(!this.renderConfig.clearCanvas){this.canvasContext.save();return}m&&this.canvasContext.save();var t=this.contextData.cTr.props;this.contextData._length<=this.contextData.cArrPos&&this.contextData.duplicate();var r,d=this.contextData.saved[this.contextData.cArrPos];for(r=0;r<16;r+=1)d[r]=t[r];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1},CanvasRendererBase.prototype.restore=function(m){if(!this.renderConfig.clearCanvas){this.canvasContext.restore();return}m&&(this.canvasContext.restore(),this.globalData.blendMode="source-over"),this.contextData.cArrPos-=1;var t=this.contextData.saved[this.contextData.cArrPos],r,d=this.contextData.cTr.props;for(r=0;r<16;r+=1)d[r]=t[r];this.canvasContext.setTransform(t[0],t[1],t[4],t[5],t[12],t[13]),t=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=t,this.globalData.currentGlobalAlpha!==t&&(this.canvasContext.globalAlpha=t,this.globalData.currentGlobalAlpha=t)},CanvasRendererBase.prototype.configAnimation=function(m){if(this.animationItem.wrapper){this.animationItem.container=createTag("canvas");var t=this.animationItem.container.style;t.width="100%",t.height="100%";var r="0px 0px 0px";t.transformOrigin=r,t.mozTransformOrigin=r,t.webkitTransformOrigin=r,t["-webkit-transform"]=r,t.contentVisibility=this.renderConfig.contentVisibility,this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d"),this.renderConfig.className&&this.animationItem.container.setAttribute("class",this.renderConfig.className),this.renderConfig.id&&this.animationItem.container.setAttribute("id",this.renderConfig.id)}else this.canvasContext=this.renderConfig.context;this.data=m,this.layers=m.layers,this.transformCanvas={w:m.w,h:m.h,sx:0,sy:0,tx:0,ty:0},this.setupGlobalData(m,document.body),this.globalData.canvasContext=this.canvasContext,this.globalData.renderer=this,this.globalData.isDashed=!1,this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.transformCanvas=this.transformCanvas,this.elements=createSizedArray(m.layers.length),this.updateContainerSize()},CanvasRendererBase.prototype.updateContainerSize=function(){this.reset();var m,t;this.animationItem.wrapper&&this.animationItem.container?(m=this.animationItem.wrapper.offsetWidth,t=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",m*this.renderConfig.dpr),this.animationItem.container.setAttribute("height",t*this.renderConfig.dpr)):(m=this.canvasContext.canvas.width*this.renderConfig.dpr,t=this.canvasContext.canvas.height*this.renderConfig.dpr);var r,d;if(this.renderConfig.preserveAspectRatio.indexOf("meet")!==-1||this.renderConfig.preserveAspectRatio.indexOf("slice")!==-1){var g=this.renderConfig.preserveAspectRatio.split(" "),v=g[1]||"meet",C=g[0]||"xMidYMid",w=C.substr(0,4),I=C.substr(4);r=m/t,d=this.transformCanvas.w/this.transformCanvas.h,d>r&&v==="meet"||d<r&&v==="slice"?(this.transformCanvas.sx=m/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=m/(this.transformCanvas.w/this.renderConfig.dpr)):(this.transformCanvas.sx=t/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.sy=t/(this.transformCanvas.h/this.renderConfig.dpr)),w==="xMid"&&(d<r&&v==="meet"||d>r&&v==="slice")?this.transformCanvas.tx=(m-this.transformCanvas.w*(t/this.transformCanvas.h))/2*this.renderConfig.dpr:w==="xMax"&&(d<r&&v==="meet"||d>r&&v==="slice")?this.transformCanvas.tx=(m-this.transformCanvas.w*(t/this.transformCanvas.h))*this.renderConfig.dpr:this.transformCanvas.tx=0,I==="YMid"&&(d>r&&v==="meet"||d<r&&v==="slice")?this.transformCanvas.ty=(t-this.transformCanvas.h*(m/this.transformCanvas.w))/2*this.renderConfig.dpr:I==="YMax"&&(d>r&&v==="meet"||d<r&&v==="slice")?this.transformCanvas.ty=(t-this.transformCanvas.h*(m/this.transformCanvas.w))*this.renderConfig.dpr:this.transformCanvas.ty=0}else this.renderConfig.preserveAspectRatio==="none"?(this.transformCanvas.sx=m/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=t/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.tx=0,this.transformCanvas.ty=0):(this.transformCanvas.sx=this.renderConfig.dpr,this.transformCanvas.sy=this.renderConfig.dpr,this.transformCanvas.tx=0,this.transformCanvas.ty=0);this.transformCanvas.props=[this.transformCanvas.sx,0,0,0,0,this.transformCanvas.sy,0,0,0,0,1,0,this.transformCanvas.tx,this.transformCanvas.ty,0,1],this.ctxTransform(this.transformCanvas.props),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.closePath(),this.canvasContext.clip(),this.renderFrame(this.renderedFrame,!0)},CanvasRendererBase.prototype.destroy=function(){this.renderConfig.clearCanvas&&this.animationItem.wrapper&&(this.animationItem.wrapper.innerText="");var m,t=this.layers?this.layers.length:0;for(m=t-1;m>=0;m-=1)this.elements[m]&&this.elements[m].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRendererBase.prototype.renderFrame=function(m,t){if(!(this.renderedFrame===m&&this.renderConfig.clearCanvas===!0&&!t||this.destroyed||m===-1)){this.renderedFrame=m,this.globalData.frameNum=m-this.animationItem._isFirstFrame,this.globalData.frameId+=1,this.globalData._mdf=!this.renderConfig.clearCanvas||t,this.globalData.projectInterface.currentFrame=m;var r,d=this.layers.length;for(this.completeLayers||this.checkLayers(m),r=0;r<d;r+=1)(this.completeLayers||this.elements[r])&&this.elements[r].prepareFrame(m-this.layers[r].st);if(this.globalData._mdf){for(this.renderConfig.clearCanvas===!0?this.canvasContext.clearRect(0,0,this.transformCanvas.w,this.transformCanvas.h):this.save(),r=d-1;r>=0;r-=1)(this.completeLayers||this.elements[r])&&this.elements[r].renderFrame();this.renderConfig.clearCanvas!==!0&&this.restore()}}},CanvasRendererBase.prototype.buildItem=function(m){var t=this.elements;if(!(t[m]||this.layers[m].ty===99)){var r=this.createItem(this.layers[m],this,this.globalData);t[m]=r,r.initExpressions()}},CanvasRendererBase.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var m=this.pendingElements.pop();m.checkParenting()}},CanvasRendererBase.prototype.hide=function(){this.animationItem.container.style.display="none"},CanvasRendererBase.prototype.show=function(){this.animationItem.container.style.display="block"},extendPrototype([CanvasRendererBase,ICompElement,CVBaseElement],CVCompElement),CVCompElement.prototype.renderInnerContent=function(){var m=this.canvasContext;m.beginPath(),m.moveTo(0,0),m.lineTo(this.data.w,0),m.lineTo(this.data.w,this.data.h),m.lineTo(0,this.data.h),m.lineTo(0,0),m.clip();var t,r=this.layers.length;for(t=r-1;t>=0;t-=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},CVCompElement.prototype.destroy=function(){var m,t=this.layers.length;for(m=t-1;m>=0;m-=1)this.elements[m]&&this.elements[m].destroy();this.layers=null,this.elements=null},CVCompElement.prototype.createComp=function(m){return new CVCompElement(m,this.globalData,this)},extendPrototype([CanvasRendererBase],CanvasRenderer),CanvasRenderer.prototype.createComp=function(m){return new CVCompElement(m,this.globalData,this)},registerRenderer("canvas",CanvasRenderer),ShapeModifiers.registerModifier("tm",TrimModifier),ShapeModifiers.registerModifier("pb",PuckerAndBloatModifier),ShapeModifiers.registerModifier("rp",RepeaterModifier),ShapeModifiers.registerModifier("rd",RoundCornersModifier);const Expressions=function(){var m={};m.initExpressions=t;function t(r){var d=0,g=[];function v(){d+=1}function C(){d-=1,d===0&&I()}function w(O){g.indexOf(O)===-1&&g.push(O)}function I(){var O,ye=g.length;for(O=0;O<ye;O+=1)g[O].release();g.length=0}r.renderer.compInterface=CompExpressionInterface(r.renderer),r.renderer.globalData.projectInterface.registerComposition(r.renderer),r.renderer.globalData.pushExpression=v,r.renderer.globalData.popExpression=C,r.renderer.globalData.registerExpressionProperty=w}return m}();var propTypes={SHAPE:"shape"};const ExpressionManager=function(){var ob={},Math=BMMath,window=null,document=null,XMLHttpRequest=null,fetch=null,frames=null;initialize$2(BMMath);function $bm_isInstanceOfArray(m){return m.constructor===Array||m.constructor===Float32Array}function isNumerable(m,t){return m==="number"||m==="boolean"||m==="string"||t instanceof Number}function $bm_neg(m){var t=typeof m;if(t==="number"||t==="boolean"||m instanceof Number)return-m;if($bm_isInstanceOfArray(m)){var r,d=m.length,g=[];for(r=0;r<d;r+=1)g[r]=-m[r];return g}return m.propType?m.v:-m}var easeInBez=BezierFactory.getBezierEasing(.333,0,.833,.833,"easeIn").get,easeOutBez=BezierFactory.getBezierEasing(.167,.167,.667,1,"easeOut").get,easeInOutBez=BezierFactory.getBezierEasing(.33,0,.667,1,"easeInOut").get;function sum(m,t){var r=typeof m,d=typeof t;if(r==="string"||d==="string"||isNumerable(r,m)&&isNumerable(d,t))return m+t;if($bm_isInstanceOfArray(m)&&isNumerable(d,t))return m=m.slice(0),m[0]+=t,m;if(isNumerable(r,m)&&$bm_isInstanceOfArray(t))return t=t.slice(0),t[0]=m+t[0],t;if($bm_isInstanceOfArray(m)&&$bm_isInstanceOfArray(t)){for(var g=0,v=m.length,C=t.length,w=[];g<v||g<C;)(typeof m[g]=="number"||m[g]instanceof Number)&&(typeof t[g]=="number"||t[g]instanceof Number)?w[g]=m[g]+t[g]:w[g]=t[g]===void 0?m[g]:m[g]||t[g],g+=1;return w}return 0}var add=sum;function sub(m,t){var r=typeof m,d=typeof t;if(isNumerable(r,m)&&isNumerable(d,t))return r==="string"&&(m=parseInt(m,10)),d==="string"&&(t=parseInt(t,10)),m-t;if($bm_isInstanceOfArray(m)&&isNumerable(d,t))return m=m.slice(0),m[0]-=t,m;if(isNumerable(r,m)&&$bm_isInstanceOfArray(t))return t=t.slice(0),t[0]=m-t[0],t;if($bm_isInstanceOfArray(m)&&$bm_isInstanceOfArray(t)){for(var g=0,v=m.length,C=t.length,w=[];g<v||g<C;)(typeof m[g]=="number"||m[g]instanceof Number)&&(typeof t[g]=="number"||t[g]instanceof Number)?w[g]=m[g]-t[g]:w[g]=t[g]===void 0?m[g]:m[g]||t[g],g+=1;return w}return 0}function mul(m,t){var r=typeof m,d=typeof t,g;if(isNumerable(r,m)&&isNumerable(d,t))return m*t;var v,C;if($bm_isInstanceOfArray(m)&&isNumerable(d,t)){for(C=m.length,g=createTypedArray("float32",C),v=0;v<C;v+=1)g[v]=m[v]*t;return g}if(isNumerable(r,m)&&$bm_isInstanceOfArray(t)){for(C=t.length,g=createTypedArray("float32",C),v=0;v<C;v+=1)g[v]=m*t[v];return g}return 0}function div(m,t){var r=typeof m,d=typeof t,g;if(isNumerable(r,m)&&isNumerable(d,t))return m/t;var v,C;if($bm_isInstanceOfArray(m)&&isNumerable(d,t)){for(C=m.length,g=createTypedArray("float32",C),v=0;v<C;v+=1)g[v]=m[v]/t;return g}if(isNumerable(r,m)&&$bm_isInstanceOfArray(t)){for(C=t.length,g=createTypedArray("float32",C),v=0;v<C;v+=1)g[v]=m/t[v];return g}return 0}function mod(m,t){return typeof m=="string"&&(m=parseInt(m,10)),typeof t=="string"&&(t=parseInt(t,10)),m%t}var $bm_sum=sum,$bm_sub=sub,$bm_mul=mul,$bm_div=div,$bm_mod=mod;function clamp(m,t,r){if(t>r){var d=r;r=t,t=d}return Math.min(Math.max(m,t),r)}function radiansToDegrees(m){return m/degToRads}var radians_to_degrees=radiansToDegrees;function degreesToRadians(m){return m*degToRads}var degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];function length(m,t){if(typeof m=="number"||m instanceof Number)return t=t||0,Math.abs(m-t);t||(t=helperLengthArray);var r,d=Math.min(m.length,t.length),g=0;for(r=0;r<d;r+=1)g+=Math.pow(t[r]-m[r],2);return Math.sqrt(g)}function normalize(m){return div(m,length(m))}function rgbToHsl(m){var t=m[0],r=m[1],d=m[2],g=Math.max(t,r,d),v=Math.min(t,r,d),C,w,I=(g+v)/2;if(g===v)C=0,w=0;else{var O=g-v;switch(w=I>.5?O/(2-g-v):O/(g+v),g){case t:C=(r-d)/O+(r<d?6:0);break;case r:C=(d-t)/O+2;break;case d:C=(t-r)/O+4;break}C/=6}return[C,w,I,m[3]]}function hue2rgb(m,t,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?m+(t-m)*6*r:r<1/2?t:r<2/3?m+(t-m)*(2/3-r)*6:m}function hslToRgb(m){var t=m[0],r=m[1],d=m[2],g,v,C;if(r===0)g=d,C=d,v=d;else{var w=d<.5?d*(1+r):d+r-d*r,I=2*d-w;g=hue2rgb(I,w,t+1/3),v=hue2rgb(I,w,t),C=hue2rgb(I,w,t-1/3)}return[g,v,C,m[3]]}function linear(m,t,r,d,g){if((d===void 0||g===void 0)&&(d=t,g=r,t=0,r=1),r<t){var v=r;r=t,t=v}if(m<=t)return d;if(m>=r)return g;var C=r===t?0:(m-t)/(r-t);if(!d.length)return d+(g-d)*C;var w,I=d.length,O=createTypedArray("float32",I);for(w=0;w<I;w+=1)O[w]=d[w]+(g[w]-d[w])*C;return O}function random(m,t){if(t===void 0&&(m===void 0?(m=0,t=1):(t=m,m=void 0)),t.length){var r,d=t.length;m||(m=createTypedArray("float32",d));var g=createTypedArray("float32",d),v=BMMath.random();for(r=0;r<d;r+=1)g[r]=m[r]+v*(t[r]-m[r]);return g}m===void 0&&(m=0);var C=BMMath.random();return m+C*(t-m)}function createPath(m,t,r,d){var g,v=m.length,C=shapePool.newElement();C.setPathData(!!d,v);var w=[0,0],I,O;for(g=0;g<v;g+=1)I=t&&t[g]?t[g]:w,O=r&&r[g]?r[g]:w,C.setTripleAt(m[g][0],m[g][1],O[0]+m[g][0],O[1]+m[g][1],I[0]+m[g][0],I[1]+m[g][1],g,!0);return C}function initiateExpression(elem,data,property){var val=data.x,needsVelocity=/velocity(?![\w\d])/.test(val),_needsRandom=val.indexOf("random")!==-1,elemType=elem.data.ty,transform,$bm_transform,content,effect,thisProperty=property;thisProperty.valueAtTime=thisProperty.getValueAtTime,Object.defineProperty(thisProperty,"value",{get:function(){return thisProperty.v}}),elem.comp.frameDuration=1/elem.comp.globalData.frameRate,elem.comp.displayStartTime=0;var inPoint=elem.data.ip/elem.comp.globalData.frameRate,outPoint=elem.data.op/elem.comp.globalData.frameRate,width=elem.data.sw?elem.data.sw:0,height=elem.data.sh?elem.data.sh:0,name=elem.data.nm,loopIn,loop_in,loopOut,loop_out,smooth,toWorld,fromWorld,fromComp,toComp,fromCompToSurface,position,rotation,anchorPoint,scale,thisLayer,thisComp,mask,valueAtTime,velocityAtTime,scoped_bm_rt,expression_function=eval("[function _expression_function(){"+val+";scoped_bm_rt=$bm_rt}]")[0],numKeys=property.kf?data.k.length:0,active=!this.data||this.data.hd!==!0,wiggle=function m(t,r){var d,g,v=this.pv.length?this.pv.length:1,C=createTypedArray("float32",v);t=5;var w=Math.floor(time*t);for(d=0,g=0;d<w;){for(g=0;g<v;g+=1)C[g]+=-r+r*2*BMMath.random();d+=1}var I=time*t,O=I-Math.floor(I),ye=createTypedArray("float32",v);if(v>1){for(g=0;g<v;g+=1)ye[g]=this.pv[g]+C[g]+(-r+r*2*BMMath.random())*O;return ye}return this.pv+C[0]+(-r+r*2*BMMath.random())*O}.bind(this);thisProperty.loopIn&&(loopIn=thisProperty.loopIn.bind(thisProperty),loop_in=loopIn),thisProperty.loopOut&&(loopOut=thisProperty.loopOut.bind(thisProperty),loop_out=loopOut),thisProperty.smooth&&(smooth=thisProperty.smooth.bind(thisProperty));function loopInDuration(m,t){return loopIn(m,t,!0)}function loopOutDuration(m,t){return loopOut(m,t,!0)}this.getValueAtTime&&(valueAtTime=this.getValueAtTime.bind(this)),this.getVelocityAtTime&&(velocityAtTime=this.getVelocityAtTime.bind(this));var comp=elem.comp.globalData.projectInterface.bind(elem.comp.globalData.projectInterface);function lookAt(m,t){var r=[t[0]-m[0],t[1]-m[1],t[2]-m[2]],d=Math.atan2(r[0],Math.sqrt(r[1]*r[1]+r[2]*r[2]))/degToRads,g=-Math.atan2(r[1],r[2])/degToRads;return[g,d,0]}function easeOut(m,t,r,d,g){return applyEase(easeOutBez,m,t,r,d,g)}function easeIn(m,t,r,d,g){return applyEase(easeInBez,m,t,r,d,g)}function ease(m,t,r,d,g){return applyEase(easeInOutBez,m,t,r,d,g)}function applyEase(m,t,r,d,g,v){g===void 0?(g=r,v=d):t=(t-r)/(d-r),t>1?t=1:t<0&&(t=0);var C=m(t);if($bm_isInstanceOfArray(g)){var w,I=g.length,O=createTypedArray("float32",I);for(w=0;w<I;w+=1)O[w]=(v[w]-g[w])*C+g[w];return O}return(v-g)*C+g}function nearestKey(m){var t,r=data.k.length,d,g;if(!data.k.length||typeof data.k[0]=="number")d=0,g=0;else if(d=-1,m*=elem.comp.globalData.frameRate,m<data.k[0].t)d=1,g=data.k[0].t;else{for(t=0;t<r-1;t+=1)if(m===data.k[t].t){d=t+1,g=data.k[t].t;break}else if(m>data.k[t].t&&m<data.k[t+1].t){m-data.k[t].t>data.k[t+1].t-m?(d=t+2,g=data.k[t+1].t):(d=t+1,g=data.k[t].t);break}d===-1&&(d=t+1,g=data.k[t].t)}var v={};return v.index=d,v.time=g/elem.comp.globalData.frameRate,v}function key(m){var t,r,d;if(!data.k.length||typeof data.k[0]=="number")throw new Error("The property has no keyframe at index "+m);m-=1,t={time:data.k[m].t/elem.comp.globalData.frameRate,value:[]};var g=Object.prototype.hasOwnProperty.call(data.k[m],"s")?data.k[m].s:data.k[m-1].e;for(d=g.length,r=0;r<d;r+=1)t[r]=g[r],t.value[r]=g[r];return t}function framesToTime(m,t){return t||(t=elem.comp.globalData.frameRate),m/t}function timeToFrames(m,t){return!m&&m!==0&&(m=time),t||(t=elem.comp.globalData.frameRate),m*t}function seedRandom(m){BMMath.seedrandom(randSeed+m)}function sourceRectAtTime(){return elem.sourceRectAtTime()}function substring(m,t){return typeof value=="string"?t===void 0?value.substring(m):value.substring(m,t):""}function substr(m,t){return typeof value=="string"?t===void 0?value.substr(m):value.substr(m,t):""}function posterizeTime(m){time=m===0?0:Math.floor(time*m)/m,value=valueAtTime(time)}var time,velocity,value,text,textIndex,textTotal,selectorValue,index=elem.data.ind,hasParent=!!(elem.hierarchy&&elem.hierarchy.length),parent,randSeed=Math.floor(Math.random()*1e6),globalData=elem.globalData;function executeExpression(m){return value=m,this.frameExpressionId===elem.globalData.frameId&&this.propType!=="textSelector"?value:(this.propType==="textSelector"&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),thisLayer||(text=elem.layerInterface.text,thisLayer=elem.layerInterface,thisComp=elem.comp.compInterface,toWorld=thisLayer.toWorld.bind(thisLayer),fromWorld=thisLayer.fromWorld.bind(thisLayer),fromComp=thisLayer.fromComp.bind(thisLayer),toComp=thisLayer.toComp.bind(thisLayer),mask=thisLayer.mask?thisLayer.mask.bind(thisLayer):null,fromCompToSurface=fromComp),transform||(transform=elem.layerInterface("ADBE Transform Group"),$bm_transform=transform,transform&&(anchorPoint=transform.anchorPoint)),elemType===4&&!content&&(content=thisLayer("ADBE Root Vectors Group")),effect||(effect=thisLayer(4)),hasParent=!!(elem.hierarchy&&elem.hierarchy.length),hasParent&&!parent&&(parent=elem.hierarchy[0].layerInterface),time=this.comp.renderedFrame/this.comp.globalData.frameRate,_needsRandom&&seedRandom(randSeed+time),needsVelocity&&(velocity=velocityAtTime(time)),expression_function(),this.frameExpressionId=elem.globalData.frameId,scoped_bm_rt=scoped_bm_rt.propType===propTypes.SHAPE?scoped_bm_rt.v:scoped_bm_rt,scoped_bm_rt)}return executeExpression.__preventDeadCodeRemoval=[$bm_transform,anchorPoint,time,velocity,inPoint,outPoint,width,height,name,loop_in,loop_out,smooth,toComp,fromCompToSurface,toWorld,fromWorld,mask,position,rotation,scale,thisComp,numKeys,active,wiggle,loopInDuration,loopOutDuration,comp,lookAt,easeOut,easeIn,ease,nearestKey,key,text,textIndex,textTotal,selectorValue,framesToTime,timeToFrames,sourceRectAtTime,substring,substr,posterizeTime,index,globalData],executeExpression}return ob.initiateExpression=initiateExpression,ob.__preventDeadCodeRemoval=[window,document,XMLHttpRequest,fetch,frames,$bm_neg,add,$bm_sum,$bm_sub,$bm_mul,$bm_div,$bm_mod,clamp,radians_to_degrees,degreesToRadians,degrees_to_radians,normalize,rgbToHsl,hslToRgb,linear,random,createPath],ob}(),expressionHelpers=function(){function m(C,w,I){w.x&&(I.k=!0,I.x=!0,I.initiateExpression=ExpressionManager.initiateExpression,I.effectsSequence.push(I.initiateExpression(C,w,I).bind(I)))}function t(C){return C*=this.elem.globalData.frameRate,C-=this.offsetTime,C!==this._cachingAtTime.lastFrame&&(this._cachingAtTime.lastIndex=this._cachingAtTime.lastFrame<C?this._cachingAtTime.lastIndex:0,this._cachingAtTime.value=this.interpolateValue(C,this._cachingAtTime),this._cachingAtTime.lastFrame=C),this._cachingAtTime.value}function r(C){var w=-.01,I=this.getValueAtTime(C),O=this.getValueAtTime(C+w),ye=0;if(I.length){var Se;for(Se=0;Se<I.length;Se+=1)ye+=Math.pow(O[Se]-I[Se],2);ye=Math.sqrt(ye)*100}else ye=0;return ye}function d(C){if(this.vel!==void 0)return this.vel;var w=-.001,I=this.getValueAtTime(C),O=this.getValueAtTime(C+w),ye;if(I.length){ye=createTypedArray("float32",I.length);var Se;for(Se=0;Se<I.length;Se+=1)ye[Se]=(O[Se]-I[Se])/w}else ye=(O-I)/w;return ye}function g(){return this.pv}function v(C){this.propertyGroup=C}return{searchExpressions:m,getSpeedAtTime:r,getVelocityAtTime:d,getValueAtTime:t,getStaticValueAtTime:g,setGroupProperty:v}}();setExpressionsPlugin(Expressions),initialize$1(),initialize()}class LottieLoader extends Loader{constructor(t){super(t),console.warn("THREE.LottieLoader: The loader has been deprecated and will be removed with r186. Use lottie-web instead and create your animated texture manually.")}setQuality(t){this._quality=t}load(t,r,d,g){const v=this._quality||1,C=new CanvasTexture;C.minFilter=NearestFilter,C.generateMipmaps=!1,C.colorSpace=SRGBColorSpace;const w=new FileLoader(this.manager);return w.setPath(this.path),w.setWithCredentials(this.withCredentials),w.load(t,function(I){const O=JSON.parse(I),ye=document.createElement("div");ye.style.width=O.w+"px",ye.style.height=O.h+"px",document.body.appendChild(ye);const Se=lottie.loadAnimation({container:ye,animType:"canvas",loop:!0,autoplay:!0,animationData:O,rendererSettings:{dpr:v}});C.animation=Se,C.image=Se.container,Se.addEventListener("enterFrame",function(){C.needsUpdate=!0}),ye.style.display="none",r!==void 0&&r(C)},d,g),C}}var St=Object.defineProperty,At=Object.defineProperties,Mt=Object.getOwnPropertyDescriptors,Me=Object.getOwnPropertySymbols,Rt=Object.prototype.hasOwnProperty,Dt$1=Object.prototype.propertyIsEnumerable,Re=(m,t,r)=>t in m?St(m,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):m[t]=r,U=(m,t)=>{for(var r in t||(t={}))Rt.call(t,r)&&Re(m,r,t[r]);if(Me)for(var r of Me(t))Dt$1.call(t,r)&&Re(m,r,t[r]);return m},te=(m,t)=>At(m,Mt(t)),se=(m,t,r)=>new Promise((d,g)=>{var v=I=>{try{w(r.next(I))}catch(O){g(O)}},C=I=>{try{w(r.throw(I))}catch(O){g(O)}},w=I=>I.done?d(I.value):Promise.resolve(I.value).then(v,C);w((r=r.apply(m,t)).next())});const M={LEFT:1,RIGHT:2,MIDDLE:4},c=Object.freeze({NONE:0,ROTATE:1,TRUCK:2,OFFSET:4,DOLLY:8,ZOOM:16,TOUCH_ROTATE:32,TOUCH_TRUCK:64,TOUCH_OFFSET:128,TOUCH_DOLLY:256,TOUCH_ZOOM:512,TOUCH_DOLLY_TRUCK:1024,TOUCH_DOLLY_OFFSET:2048,TOUCH_DOLLY_ROTATE:4096,TOUCH_ZOOM_TRUCK:8192,TOUCH_ZOOM_OFFSET:16384,TOUCH_ZOOM_ROTATE:32768,SCREEN_PAN:65536,TOUCH_SCREEN_PAN:131072,TOUCH_DOLLY_SCREEN_PAN:262144,TOUCH_ZOOM_SCREEN_PAN:524288}),K={NONE:0,IN:1,OUT:-1};function Y$1(m){return m.isPerspectiveCamera}function j(m){return m.isOrthographicCamera}const G$1=Math.PI*2,Ie$1=Math.PI/2,ft=1e-5,ie=Math.PI/180;function k(m,t,r){return Math.max(t,Math.min(r,m))}function A(m,t=ft){return Math.abs(m)<t}function P$1(m,t,r=ft){return A(m-t,r)}function je(m,t){return Math.round(m/t)*t}function re(m){return isFinite(m)?m:m<0?-Number.MAX_VALUE:Number.MAX_VALUE}function oe(m){return Math.abs(m)<Number.MAX_VALUE?m:m*(1/0)}function he(m,t,r,d,g=1/0,v){d=Math.max(1e-4,d);const C=2/d,w=C*v,I=1/(1+w+.48*w*w+.235*w*w*w);let O=m-t;const ye=t,Se=g*d;O=k(O,-Se,Se),t=m-O;const Pe=(r.value+C*O)*v;r.value=(r.value-C*Pe)*I;let Ne=t+(O+Pe)*I;return ye-m>0==Ne>ye&&(Ne=ye,r.value=(Ne-ye)/v),Ne}function Be$1(m,t,r,d,g=1/0,v,C){d=Math.max(1e-4,d);const w=2/d,I=w*v,O=1/(1+I+.48*I*I+.235*I*I*I);let ye=t.x,Se=t.y,Pe=t.z,Ne=m.x-ye,ke=m.y-Se,ht=m.z-Pe;const He=ye,Fe=Se,at=Pe,ct=g*d,xt=ct*ct,Gt=Ne*Ne+ke*ke+ht*ht;if(Gt>xt){const n0=Math.sqrt(Gt);Ne=Ne/n0*ct,ke=ke/n0*ct,ht=ht/n0*ct}ye=m.x-Ne,Se=m.y-ke,Pe=m.z-ht;const Lt=(r.x+w*Ne)*v,Wt=(r.y+w*ke)*v,Pt=(r.z+w*ht)*v;r.x=(r.x-w*Lt)*O,r.y=(r.y-w*Wt)*O,r.z=(r.z-w*Pt)*O,C.x=ye+(Ne+Lt)*O,C.y=Se+(ke+Wt)*O,C.z=Pe+(ht+Pt)*O;const Ft=He-m.x,kt=Fe-m.y,Kt=at-m.z,i0=C.x-He,r0=C.y-Fe,l0=C.z-at;return Ft*i0+kt*r0+Kt*l0>0&&(C.x=He,C.y=Fe,C.z=at,r.x=(C.x-He)/v,r.y=(C.y-Fe)/v,r.z=(C.z-at)/v),C}function Ee(m,t){t.set(0,0),m.forEach(r=>{t.x+=r.clientX,t.y+=r.clientY}),t.x/=m.length,t.y/=m.length}function Oe(m,t){return j(m)?(console.warn(`${t} is not supported in OrthographicCamera`),!0):!1}class Es{constructor(){this._listeners={}}addEventListener(t,r){const d=this._listeners;d[t]===void 0&&(d[t]=[]),d[t].indexOf(r)===-1&&d[t].push(r)}hasEventListener(t,r){const d=this._listeners;return d[t]!==void 0&&d[t].indexOf(r)!==-1}removeEventListener(t,r){const d=this._listeners[t];if(d!==void 0){const g=d.indexOf(r);g!==-1&&d.splice(g,1)}}removeAllEventListeners(t){if(!t){this._listeners={};return}Array.isArray(this._listeners[t])&&(this._listeners[t].length=0)}dispatchEvent(t){const r=this._listeners[t.type];if(r!==void 0){t.target=this;const d=r.slice(0);for(let g=0,v=d.length;g<v;g++)d[g].call(this,t)}}}const ce=1/8,Os=/Mac/.test(navigator.platform);let T$1,Ve$1,de,Te,D,x$1,L,X,ne,F,N$1,Z$1,Ye,Ze$1,z$1,ae,$,We,we,Ke$1,xe,be,me;class J extends Es{static install(t){T$1=t.THREE,Ve$1=Object.freeze(new T$1.Vector3(0,0,0)),de=Object.freeze(new T$1.Vector3(0,1,0)),Te=Object.freeze(new T$1.Vector3(0,0,1)),D=new T$1.Vector2,x$1=new T$1.Vector3,L=new T$1.Vector3,X=new T$1.Vector3,ne=new T$1.Vector3,F=new T$1.Vector3,N$1=new T$1.Vector3,Z$1=new T$1.Vector3,Ye=new T$1.Vector3,Ze$1=new T$1.Vector3,z$1=new T$1.Spherical,ae=new T$1.Spherical,$=new T$1.Box3,We=new T$1.Box3,we=new T$1.Sphere,Ke$1=new T$1.Quaternion,xe=new T$1.Quaternion,be=new T$1.Matrix4,me=new T$1.Raycaster}static get ACTION(){return c}constructor(t,r){super(),this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.minDistance=Number.EPSILON,this.maxDistance=1/0,this.infinityDolly=!1,this.minZoom=.01,this.maxZoom=1/0,this.smoothTime=.25,this.draggingSmoothTime=.125,this.maxSpeed=1/0,this.azimuthRotateSpeed=1,this.polarRotateSpeed=1,this.dollySpeed=1,this.dollyDragInverted=!1,this.truckSpeed=2,this.dollyToCursor=!1,this.dragToOffset=!1,this.boundaryFriction=0,this.restThreshold=.01,this.colliderMeshes=[],this.cancel=()=>{},this._enabled=!0,this._state=c.NONE,this._viewport=null,this._changedDolly=0,this._changedZoom=0,this._hasRested=!0,this._boundaryEnclosesCamera=!1,this._needsUpdate=!0,this._updatedLastTime=!1,this._elementRect=new DOMRect,this._isDragging=!1,this._dragNeedsUpdate=!0,this._activePointers=[],this._lockedPointer=null,this._interactiveArea=new DOMRect(0,0,1,1),this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._isUserControllingOffset=!1,this._isUserControllingZoom=!1,this._lastDollyDirection=K.NONE,this._thetaVelocity={value:0},this._phiVelocity={value:0},this._radiusVelocity={value:0},this._targetVelocity=new T$1.Vector3,this._focalOffsetVelocity=new T$1.Vector3,this._zoomVelocity={value:0},this._truckInternal=(Fe,at,ct,xt)=>{let Gt,Lt;if(Y$1(this._camera)){const Wt=x$1.copy(this._camera.position).sub(this._target),Pt=this._camera.getEffectiveFOV()*ie,Ft=Wt.length()*Math.tan(Pt*.5);Gt=this.truckSpeed*Fe*Ft/this._elementRect.height,Lt=this.truckSpeed*at*Ft/this._elementRect.height}else if(j(this._camera)){const Wt=this._camera;Gt=this.truckSpeed*Fe*(Wt.right-Wt.left)/Wt.zoom/this._elementRect.width,Lt=this.truckSpeed*at*(Wt.top-Wt.bottom)/Wt.zoom/this._elementRect.height}else return;xt?(ct?this.setFocalOffset(this._focalOffsetEnd.x+Gt,this._focalOffsetEnd.y,this._focalOffsetEnd.z,!0):this.truck(Gt,0,!0),this.forward(-Lt,!0)):ct?this.setFocalOffset(this._focalOffsetEnd.x+Gt,this._focalOffsetEnd.y+Lt,this._focalOffsetEnd.z,!0):this.truck(Gt,Lt,!0)},this._rotateInternal=(Fe,at)=>{const ct=G$1*this.azimuthRotateSpeed*Fe/this._elementRect.height,xt=G$1*this.polarRotateSpeed*at/this._elementRect.height;this.rotate(ct,xt,!0)},this._dollyInternal=(Fe,at,ct)=>{const xt=Math.pow(.95,-Fe*this.dollySpeed),Gt=this._sphericalEnd.radius,Lt=this._sphericalEnd.radius*xt,Wt=k(Lt,this.minDistance,this.maxDistance),Pt=Wt-Lt;this.infinityDolly&&this.dollyToCursor?this._dollyToNoClamp(Lt,!0):this.infinityDolly&&!this.dollyToCursor?(this.dollyInFixed(Pt,!0),this._dollyToNoClamp(Wt,!0)):this._dollyToNoClamp(Wt,!0),this.dollyToCursor&&(this._changedDolly+=(this.infinityDolly?Lt:Wt)-Gt,this._dollyControlCoord.set(at,ct)),this._lastDollyDirection=Math.sign(-Fe)},this._zoomInternal=(Fe,at,ct)=>{const xt=Math.pow(.95,Fe*this.dollySpeed),Gt=this._zoom,Lt=this._zoom*xt;this.zoomTo(Lt,!0),this.dollyToCursor&&(this._changedZoom+=Lt-Gt,this._dollyControlCoord.set(at,ct))},typeof T$1=="undefined"&&console.error("camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information."),this._camera=t,this._yAxisUpSpace=new T$1.Quaternion().setFromUnitVectors(this._camera.up,de),this._yAxisUpSpaceInverse=this._yAxisUpSpace.clone().invert(),this._state=c.NONE,this._target=new T$1.Vector3,this._targetEnd=this._target.clone(),this._focalOffset=new T$1.Vector3,this._focalOffsetEnd=this._focalOffset.clone(),this._spherical=new T$1.Spherical().setFromVector3(x$1.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace)),this._sphericalEnd=this._spherical.clone(),this._lastDistance=this._spherical.radius,this._zoom=this._camera.zoom,this._zoomEnd=this._zoom,this._lastZoom=this._zoom,this._nearPlaneCorners=[new T$1.Vector3,new T$1.Vector3,new T$1.Vector3,new T$1.Vector3],this._updateNearPlaneCorners(),this._boundary=new T$1.Box3(new T$1.Vector3(-1/0,-1/0,-1/0),new T$1.Vector3(1/0,1/0,1/0)),this._cameraUp0=this._camera.up.clone(),this._target0=this._target.clone(),this._position0=this._camera.position.clone(),this._zoom0=this._zoom,this._focalOffset0=this._focalOffset.clone(),this._dollyControlCoord=new T$1.Vector2,this.mouseButtons={left:c.ROTATE,middle:c.DOLLY,right:c.TRUCK,wheel:Y$1(this._camera)?c.DOLLY:j(this._camera)?c.ZOOM:c.NONE},this.touches={one:c.TOUCH_ROTATE,two:Y$1(this._camera)?c.TOUCH_DOLLY_TRUCK:j(this._camera)?c.TOUCH_ZOOM_TRUCK:c.NONE,three:c.TOUCH_TRUCK};const d=new T$1.Vector2,g=new T$1.Vector2,v=new T$1.Vector2,C=Fe=>{if(!this._enabled||!this._domElement)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const xt=this._domElement.getBoundingClientRect(),Gt=(Fe.clientX-xt.left)/(xt.right-xt.left),Lt=(Fe.clientY-xt.top)/(xt.bottom-xt.top);if(Gt<this._interactiveArea.left||Gt>this._interactiveArea.right||Lt<this._interactiveArea.top||Lt>this._interactiveArea.bottom)return}const at=Fe.pointerType!=="mouse"?null:(Fe.buttons&M.LEFT)===M.LEFT?M.LEFT:(Fe.buttons&M.MIDDLE)===M.MIDDLE?M.MIDDLE:(Fe.buttons&M.RIGHT)===M.RIGHT?M.RIGHT:null;if(at!==null){const xt=this._findPointerByMouseButton(at);xt&&this._disposePointer(xt)}if((Fe.buttons&M.LEFT)===M.LEFT&&this._lockedPointer)return;const ct={pointerId:Fe.pointerId,clientX:Fe.clientX,clientY:Fe.clientY,deltaX:0,deltaY:0,mouseButton:at};this._activePointers.push(ct),this._domElement.ownerDocument.removeEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",I),this._domElement.ownerDocument.addEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",I),this._isDragging=!0,Pe(Fe)},w=Fe=>{Fe.cancelable&&Fe.preventDefault();const at=Fe.pointerId,ct=this._lockedPointer||this._findPointerById(at);if(ct){if(ct.clientX=Fe.clientX,ct.clientY=Fe.clientY,ct.deltaX=Fe.movementX,ct.deltaY=Fe.movementY,this._state=0,Fe.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else(!this._isDragging&&this._lockedPointer||this._isDragging&&(Fe.buttons&M.LEFT)===M.LEFT)&&(this._state=this._state|this.mouseButtons.left),this._isDragging&&(Fe.buttons&M.MIDDLE)===M.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),this._isDragging&&(Fe.buttons&M.RIGHT)===M.RIGHT&&(this._state=this._state|this.mouseButtons.right);Ne()}},I=Fe=>{const at=this._findPointerById(Fe.pointerId);if(!(at&&at===this._lockedPointer)){if(at&&this._disposePointer(at),Fe.pointerType==="touch")switch(this._activePointers.length){case 0:this._state=c.NONE;break;case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=c.NONE;ke()}};let O=-1;const ye=Fe=>{if(!this._domElement||!this._enabled||this.mouseButtons.wheel===c.NONE)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const Lt=this._domElement.getBoundingClientRect(),Wt=(Fe.clientX-Lt.left)/(Lt.right-Lt.left),Pt=(Fe.clientY-Lt.top)/(Lt.bottom-Lt.top);if(Wt<this._interactiveArea.left||Wt>this._interactiveArea.right||Pt<this._interactiveArea.top||Pt>this._interactiveArea.bottom)return}if(Fe.preventDefault(),this.dollyToCursor||this.mouseButtons.wheel===c.ROTATE||this.mouseButtons.wheel===c.TRUCK){const Lt=performance.now();O-Lt<1e3&&this._getClientRect(this._elementRect),O=Lt}const at=Os?-1:-3,ct=Fe.deltaMode===1||Fe.ctrlKey?Fe.deltaY/at:Fe.deltaY/(at*10),xt=this.dollyToCursor?(Fe.clientX-this._elementRect.x)/this._elementRect.width*2-1:0,Gt=this.dollyToCursor?(Fe.clientY-this._elementRect.y)/this._elementRect.height*-2+1:0;switch(this.mouseButtons.wheel){case c.ROTATE:{this._rotateInternal(Fe.deltaX,Fe.deltaY),this._isUserControllingRotate=!0;break}case c.TRUCK:{this._truckInternal(Fe.deltaX,Fe.deltaY,!1,!1),this._isUserControllingTruck=!0;break}case c.SCREEN_PAN:{this._truckInternal(Fe.deltaX,Fe.deltaY,!1,!0),this._isUserControllingTruck=!0;break}case c.OFFSET:{this._truckInternal(Fe.deltaX,Fe.deltaY,!0,!1),this._isUserControllingOffset=!0;break}case c.DOLLY:{this._dollyInternal(-ct,xt,Gt),this._isUserControllingDolly=!0;break}case c.ZOOM:{this._zoomInternal(-ct,xt,Gt),this._isUserControllingZoom=!0;break}}this.dispatchEvent({type:"control"})},Se=Fe=>{if(!(!this._domElement||!this._enabled)){if(this.mouseButtons.right===J.ACTION.NONE){const at=Fe instanceof PointerEvent?Fe.pointerId:0,ct=this._findPointerById(at);ct&&this._disposePointer(ct),this._domElement.ownerDocument.removeEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",I);return}Fe.preventDefault()}},Pe=Fe=>{if(this._enabled){if(Ee(this._activePointers,D),this._getClientRect(this._elementRect),d.copy(D),g.copy(D),this._activePointers.length>=2){const at=D.x-this._activePointers[1].clientX,ct=D.y-this._activePointers[1].clientY,xt=Math.sqrt(at*at+ct*ct);v.set(0,xt);const Gt=(this._activePointers[0].clientX+this._activePointers[1].clientX)*.5,Lt=(this._activePointers[0].clientY+this._activePointers[1].clientY)*.5;g.set(Gt,Lt)}if(this._state=0,!Fe)this._lockedPointer&&(this._state=this._state|this.mouseButtons.left);else if("pointerType"in Fe&&Fe.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else!this._lockedPointer&&(Fe.buttons&M.LEFT)===M.LEFT&&(this._state=this._state|this.mouseButtons.left),(Fe.buttons&M.MIDDLE)===M.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(Fe.buttons&M.RIGHT)===M.RIGHT&&(this._state=this._state|this.mouseButtons.right);((this._state&c.ROTATE)===c.ROTATE||(this._state&c.TOUCH_ROTATE)===c.TOUCH_ROTATE||(this._state&c.TOUCH_DOLLY_ROTATE)===c.TOUCH_DOLLY_ROTATE||(this._state&c.TOUCH_ZOOM_ROTATE)===c.TOUCH_ZOOM_ROTATE)&&(this._sphericalEnd.theta=this._spherical.theta,this._sphericalEnd.phi=this._spherical.phi,this._thetaVelocity.value=0,this._phiVelocity.value=0),((this._state&c.TRUCK)===c.TRUCK||(this._state&c.SCREEN_PAN)===c.SCREEN_PAN||(this._state&c.TOUCH_TRUCK)===c.TOUCH_TRUCK||(this._state&c.TOUCH_SCREEN_PAN)===c.TOUCH_SCREEN_PAN||(this._state&c.TOUCH_DOLLY_TRUCK)===c.TOUCH_DOLLY_TRUCK||(this._state&c.TOUCH_DOLLY_SCREEN_PAN)===c.TOUCH_DOLLY_SCREEN_PAN||(this._state&c.TOUCH_ZOOM_TRUCK)===c.TOUCH_ZOOM_TRUCK||(this._state&c.TOUCH_ZOOM_SCREEN_PAN)===c.TOUCH_DOLLY_SCREEN_PAN)&&(this._targetEnd.copy(this._target),this._targetVelocity.set(0,0,0)),((this._state&c.DOLLY)===c.DOLLY||(this._state&c.TOUCH_DOLLY)===c.TOUCH_DOLLY||(this._state&c.TOUCH_DOLLY_TRUCK)===c.TOUCH_DOLLY_TRUCK||(this._state&c.TOUCH_DOLLY_SCREEN_PAN)===c.TOUCH_DOLLY_SCREEN_PAN||(this._state&c.TOUCH_DOLLY_OFFSET)===c.TOUCH_DOLLY_OFFSET||(this._state&c.TOUCH_DOLLY_ROTATE)===c.TOUCH_DOLLY_ROTATE)&&(this._sphericalEnd.radius=this._spherical.radius,this._radiusVelocity.value=0),((this._state&c.ZOOM)===c.ZOOM||(this._state&c.TOUCH_ZOOM)===c.TOUCH_ZOOM||(this._state&c.TOUCH_ZOOM_TRUCK)===c.TOUCH_ZOOM_TRUCK||(this._state&c.TOUCH_ZOOM_SCREEN_PAN)===c.TOUCH_ZOOM_SCREEN_PAN||(this._state&c.TOUCH_ZOOM_OFFSET)===c.TOUCH_ZOOM_OFFSET||(this._state&c.TOUCH_ZOOM_ROTATE)===c.TOUCH_ZOOM_ROTATE)&&(this._zoomEnd=this._zoom,this._zoomVelocity.value=0),((this._state&c.OFFSET)===c.OFFSET||(this._state&c.TOUCH_OFFSET)===c.TOUCH_OFFSET||(this._state&c.TOUCH_DOLLY_OFFSET)===c.TOUCH_DOLLY_OFFSET||(this._state&c.TOUCH_ZOOM_OFFSET)===c.TOUCH_ZOOM_OFFSET)&&(this._focalOffsetEnd.copy(this._focalOffset),this._focalOffsetVelocity.set(0,0,0)),this.dispatchEvent({type:"controlstart"})}},Ne=()=>{if(!this._enabled||!this._dragNeedsUpdate)return;this._dragNeedsUpdate=!1,Ee(this._activePointers,D);const Fe=this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement?this._lockedPointer||this._activePointers[0]:null,at=Fe?-Fe.deltaX:g.x-D.x,ct=Fe?-Fe.deltaY:g.y-D.y;if(g.copy(D),((this._state&c.ROTATE)===c.ROTATE||(this._state&c.TOUCH_ROTATE)===c.TOUCH_ROTATE||(this._state&c.TOUCH_DOLLY_ROTATE)===c.TOUCH_DOLLY_ROTATE||(this._state&c.TOUCH_ZOOM_ROTATE)===c.TOUCH_ZOOM_ROTATE)&&(this._rotateInternal(at,ct),this._isUserControllingRotate=!0),(this._state&c.DOLLY)===c.DOLLY||(this._state&c.ZOOM)===c.ZOOM){const xt=this.dollyToCursor?(d.x-this._elementRect.x)/this._elementRect.width*2-1:0,Gt=this.dollyToCursor?(d.y-this._elementRect.y)/this._elementRect.height*-2+1:0,Lt=this.dollyDragInverted?-1:1;(this._state&c.DOLLY)===c.DOLLY?(this._dollyInternal(Lt*ct*ce,xt,Gt),this._isUserControllingDolly=!0):(this._zoomInternal(Lt*ct*ce,xt,Gt),this._isUserControllingZoom=!0)}if((this._state&c.TOUCH_DOLLY)===c.TOUCH_DOLLY||(this._state&c.TOUCH_ZOOM)===c.TOUCH_ZOOM||(this._state&c.TOUCH_DOLLY_TRUCK)===c.TOUCH_DOLLY_TRUCK||(this._state&c.TOUCH_ZOOM_TRUCK)===c.TOUCH_ZOOM_TRUCK||(this._state&c.TOUCH_DOLLY_SCREEN_PAN)===c.TOUCH_DOLLY_SCREEN_PAN||(this._state&c.TOUCH_ZOOM_SCREEN_PAN)===c.TOUCH_ZOOM_SCREEN_PAN||(this._state&c.TOUCH_DOLLY_OFFSET)===c.TOUCH_DOLLY_OFFSET||(this._state&c.TOUCH_ZOOM_OFFSET)===c.TOUCH_ZOOM_OFFSET||(this._state&c.TOUCH_DOLLY_ROTATE)===c.TOUCH_DOLLY_ROTATE||(this._state&c.TOUCH_ZOOM_ROTATE)===c.TOUCH_ZOOM_ROTATE){const xt=D.x-this._activePointers[1].clientX,Gt=D.y-this._activePointers[1].clientY,Lt=Math.sqrt(xt*xt+Gt*Gt),Wt=v.y-Lt;v.set(0,Lt);const Pt=this.dollyToCursor?(g.x-this._elementRect.x)/this._elementRect.width*2-1:0,Ft=this.dollyToCursor?(g.y-this._elementRect.y)/this._elementRect.height*-2+1:0;(this._state&c.TOUCH_DOLLY)===c.TOUCH_DOLLY||(this._state&c.TOUCH_DOLLY_ROTATE)===c.TOUCH_DOLLY_ROTATE||(this._state&c.TOUCH_DOLLY_TRUCK)===c.TOUCH_DOLLY_TRUCK||(this._state&c.TOUCH_DOLLY_SCREEN_PAN)===c.TOUCH_DOLLY_SCREEN_PAN||(this._state&c.TOUCH_DOLLY_OFFSET)===c.TOUCH_DOLLY_OFFSET?(this._dollyInternal(Wt*ce,Pt,Ft),this._isUserControllingDolly=!0):(this._zoomInternal(Wt*ce,Pt,Ft),this._isUserControllingZoom=!0)}((this._state&c.TRUCK)===c.TRUCK||(this._state&c.TOUCH_TRUCK)===c.TOUCH_TRUCK||(this._state&c.TOUCH_DOLLY_TRUCK)===c.TOUCH_DOLLY_TRUCK||(this._state&c.TOUCH_ZOOM_TRUCK)===c.TOUCH_ZOOM_TRUCK)&&(this._truckInternal(at,ct,!1,!1),this._isUserControllingTruck=!0),((this._state&c.SCREEN_PAN)===c.SCREEN_PAN||(this._state&c.TOUCH_SCREEN_PAN)===c.TOUCH_SCREEN_PAN||(this._state&c.TOUCH_DOLLY_SCREEN_PAN)===c.TOUCH_DOLLY_SCREEN_PAN||(this._state&c.TOUCH_ZOOM_SCREEN_PAN)===c.TOUCH_ZOOM_SCREEN_PAN)&&(this._truckInternal(at,ct,!1,!0),this._isUserControllingTruck=!0),((this._state&c.OFFSET)===c.OFFSET||(this._state&c.TOUCH_OFFSET)===c.TOUCH_OFFSET||(this._state&c.TOUCH_DOLLY_OFFSET)===c.TOUCH_DOLLY_OFFSET||(this._state&c.TOUCH_ZOOM_OFFSET)===c.TOUCH_ZOOM_OFFSET)&&(this._truckInternal(at,ct,!0,!1),this._isUserControllingOffset=!0),this.dispatchEvent({type:"control"})},ke=()=>{Ee(this._activePointers,D),g.copy(D),this._dragNeedsUpdate=!1,(this._activePointers.length===0||this._activePointers.length===1&&this._activePointers[0]===this._lockedPointer)&&(this._isDragging=!1),this._activePointers.length===0&&this._domElement&&(this._domElement.ownerDocument.removeEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",I),this.dispatchEvent({type:"controlend"}))};this.lockPointer=()=>{!this._enabled||!this._domElement||(this.cancel(),this._lockedPointer={pointerId:-1,clientX:0,clientY:0,deltaX:0,deltaY:0,mouseButton:null},this._activePointers.push(this._lockedPointer),this._domElement.ownerDocument.removeEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",I),this._domElement.requestPointerLock(),this._domElement.ownerDocument.addEventListener("pointerlockchange",ht),this._domElement.ownerDocument.addEventListener("pointerlockerror",He),this._domElement.ownerDocument.addEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",I),Pe())},this.unlockPointer=()=>{var Fe,at,ct;this._lockedPointer!==null&&(this._disposePointer(this._lockedPointer),this._lockedPointer=null),(Fe=this._domElement)===null||Fe===void 0||Fe.ownerDocument.exitPointerLock(),(at=this._domElement)===null||at===void 0||at.ownerDocument.removeEventListener("pointerlockchange",ht),(ct=this._domElement)===null||ct===void 0||ct.ownerDocument.removeEventListener("pointerlockerror",He),this.cancel()};const ht=()=>{this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement||this.unlockPointer()},He=()=>{this.unlockPointer()};this._addAllEventListeners=Fe=>{this._domElement=Fe,this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none",this._domElement.addEventListener("pointerdown",C),this._domElement.addEventListener("pointercancel",I),this._domElement.addEventListener("wheel",ye,{passive:!1}),this._domElement.addEventListener("contextmenu",Se)},this._removeAllEventListeners=()=>{this._domElement&&(this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect="",this._domElement.removeEventListener("pointerdown",C),this._domElement.removeEventListener("pointercancel",I),this._domElement.removeEventListener("wheel",ye,{passive:!1}),this._domElement.removeEventListener("contextmenu",Se),this._domElement.ownerDocument.removeEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",I),this._domElement.ownerDocument.removeEventListener("pointerlockchange",ht),this._domElement.ownerDocument.removeEventListener("pointerlockerror",He))},this.cancel=()=>{this._state!==c.NONE&&(this._state=c.NONE,this._activePointers.length=0,ke())},r&&this.connect(r),this.update(0)}get camera(){return this._camera}set camera(t){this._camera=t,this.updateCameraUp(),this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0}get enabled(){return this._enabled}set enabled(t){this._enabled=t,this._domElement&&(t?(this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none"):(this.cancel(),this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect=""))}get active(){return!this._hasRested}get currentAction(){return this._state}get distance(){return this._spherical.radius}set distance(t){this._spherical.radius===t&&this._sphericalEnd.radius===t||(this._spherical.radius=t,this._sphericalEnd.radius=t,this._needsUpdate=!0)}get azimuthAngle(){return this._spherical.theta}set azimuthAngle(t){this._spherical.theta===t&&this._sphericalEnd.theta===t||(this._spherical.theta=t,this._sphericalEnd.theta=t,this._needsUpdate=!0)}get polarAngle(){return this._spherical.phi}set polarAngle(t){this._spherical.phi===t&&this._sphericalEnd.phi===t||(this._spherical.phi=t,this._sphericalEnd.phi=t,this._needsUpdate=!0)}get boundaryEnclosesCamera(){return this._boundaryEnclosesCamera}set boundaryEnclosesCamera(t){this._boundaryEnclosesCamera=t,this._needsUpdate=!0}set interactiveArea(t){this._interactiveArea.width=k(t.width,0,1),this._interactiveArea.height=k(t.height,0,1),this._interactiveArea.x=k(t.x,0,1-this._interactiveArea.width),this._interactiveArea.y=k(t.y,0,1-this._interactiveArea.height)}addEventListener(t,r){super.addEventListener(t,r)}removeEventListener(t,r){super.removeEventListener(t,r)}rotate(t,r,d=!1){return this.rotateTo(this._sphericalEnd.theta+t,this._sphericalEnd.phi+r,d)}rotateAzimuthTo(t,r=!1){return this.rotateTo(t,this._sphericalEnd.phi,r)}rotatePolarTo(t,r=!1){return this.rotateTo(this._sphericalEnd.theta,t,r)}rotateTo(t,r,d=!1){this._isUserControllingRotate=!1;const g=k(t,this.minAzimuthAngle,this.maxAzimuthAngle),v=k(r,this.minPolarAngle,this.maxPolarAngle);this._sphericalEnd.theta=g,this._sphericalEnd.phi=v,this._sphericalEnd.makeSafe(),this._needsUpdate=!0,d||(this._spherical.theta=this._sphericalEnd.theta,this._spherical.phi=this._sphericalEnd.phi);const C=!d||P$1(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&P$1(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold);return this._createOnRestPromise(C)}dolly(t,r=!1){return this.dollyTo(this._sphericalEnd.radius-t,r)}dollyTo(t,r=!1){return this._isUserControllingDolly=!1,this._lastDollyDirection=K.NONE,this._changedDolly=0,this._dollyToNoClamp(k(t,this.minDistance,this.maxDistance),r)}_dollyToNoClamp(t,r=!1){const d=this._sphericalEnd.radius;if(this.colliderMeshes.length>=1){const v=this._collisionTest(),C=P$1(v,this._spherical.radius);if(!(d>t)&&C)return Promise.resolve();this._sphericalEnd.radius=Math.min(t,v)}else this._sphericalEnd.radius=t;this._needsUpdate=!0,r||(this._spherical.radius=this._sphericalEnd.radius);const g=!r||P$1(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(g)}dollyInFixed(t,r=!1){this._targetEnd.add(this._getCameraDirection(ne).multiplyScalar(t)),r||this._target.copy(this._targetEnd);const d=!r||P$1(this._target.x,this._targetEnd.x,this.restThreshold)&&P$1(this._target.y,this._targetEnd.y,this.restThreshold)&&P$1(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(d)}zoom(t,r=!1){return this.zoomTo(this._zoomEnd+t,r)}zoomTo(t,r=!1){this._isUserControllingZoom=!1,this._zoomEnd=k(t,this.minZoom,this.maxZoom),this._needsUpdate=!0,r||(this._zoom=this._zoomEnd);const d=!r||P$1(this._zoom,this._zoomEnd,this.restThreshold);return this._changedZoom=0,this._createOnRestPromise(d)}pan(t,r,d=!1){return console.warn("`pan` has been renamed to `truck`"),this.truck(t,r,d)}truck(t,r,d=!1){this._camera.updateMatrix(),F.setFromMatrixColumn(this._camera.matrix,0),N$1.setFromMatrixColumn(this._camera.matrix,1),F.multiplyScalar(t),N$1.multiplyScalar(-r);const g=x$1.copy(F).add(N$1),v=L.copy(this._targetEnd).add(g);return this.moveTo(v.x,v.y,v.z,d)}forward(t,r=!1){x$1.setFromMatrixColumn(this._camera.matrix,0),x$1.crossVectors(this._camera.up,x$1),x$1.multiplyScalar(t);const d=L.copy(this._targetEnd).add(x$1);return this.moveTo(d.x,d.y,d.z,r)}elevate(t,r=!1){return x$1.copy(this._camera.up).multiplyScalar(t),this.moveTo(this._targetEnd.x+x$1.x,this._targetEnd.y+x$1.y,this._targetEnd.z+x$1.z,r)}moveTo(t,r,d,g=!1){this._isUserControllingTruck=!1;const v=x$1.set(t,r,d).sub(this._targetEnd);this._encloseToBoundary(this._targetEnd,v,this.boundaryFriction),this._needsUpdate=!0,g||this._target.copy(this._targetEnd);const C=!g||P$1(this._target.x,this._targetEnd.x,this.restThreshold)&&P$1(this._target.y,this._targetEnd.y,this.restThreshold)&&P$1(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(C)}lookInDirectionOf(t,r,d,g=!1){const v=x$1.set(t,r,d).sub(this._targetEnd).normalize().multiplyScalar(-this._sphericalEnd.radius).add(this._targetEnd);return this.setPosition(v.x,v.y,v.z,g)}fitToBox(t,r,{cover:d=!1,paddingLeft:g=0,paddingRight:v=0,paddingBottom:C=0,paddingTop:w=0}={}){const I=[],O=t.isBox3?$.copy(t):$.setFromObject(t);O.isEmpty()&&(console.warn("camera-controls: fitTo() cannot be used with an empty box. Aborting"),Promise.resolve());const ye=je(this._sphericalEnd.theta,Ie$1),Se=je(this._sphericalEnd.phi,Ie$1);I.push(this.rotateTo(ye,Se,r));const Pe=x$1.setFromSpherical(this._sphericalEnd).normalize(),Ne=Ke$1.setFromUnitVectors(Pe,Te),ke=P$1(Math.abs(Pe.y),1);ke&&Ne.multiply(xe.setFromAxisAngle(de,ye)),Ne.multiply(this._yAxisUpSpaceInverse);const ht=We.makeEmpty();L.copy(O.min).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.min).setX(O.max.x).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.min).setY(O.max.y).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.max).setZ(O.min.z).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.min).setZ(O.max.z).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.max).setY(O.min.y).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.max).setX(O.min.x).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.max).applyQuaternion(Ne),ht.expandByPoint(L),ht.min.x-=g,ht.min.y-=C,ht.max.x+=v,ht.max.y+=w,Ne.setFromUnitVectors(Te,Pe),ke&&Ne.premultiply(xe.invert()),Ne.premultiply(this._yAxisUpSpace);const He=ht.getSize(x$1),Fe=ht.getCenter(L).applyQuaternion(Ne);if(Y$1(this._camera)){const at=this.getDistanceToFitBox(He.x,He.y,He.z,d);I.push(this.moveTo(Fe.x,Fe.y,Fe.z,r)),I.push(this.dollyTo(at,r)),I.push(this.setFocalOffset(0,0,0,r))}else if(j(this._camera)){const at=this._camera,ct=at.right-at.left,xt=at.top-at.bottom,Gt=d?Math.max(ct/He.x,xt/He.y):Math.min(ct/He.x,xt/He.y);I.push(this.moveTo(Fe.x,Fe.y,Fe.z,r)),I.push(this.zoomTo(Gt,r)),I.push(this.setFocalOffset(0,0,0,r))}return Promise.all(I)}fitToSphere(t,r){const d=[],g="isObject3D"in t?J.createBoundingSphere(t,we):we.copy(t);if(d.push(this.moveTo(g.center.x,g.center.y,g.center.z,r)),Y$1(this._camera)){const v=this.getDistanceToFitSphere(g.radius);d.push(this.dollyTo(v,r))}else if(j(this._camera)){const v=this._camera.right-this._camera.left,C=this._camera.top-this._camera.bottom,w=2*g.radius,I=Math.min(v/w,C/w);d.push(this.zoomTo(I,r))}return d.push(this.setFocalOffset(0,0,0,r)),Promise.all(d)}setLookAt(t,r,d,g,v,C,w=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=K.NONE,this._changedDolly=0;const I=L.set(g,v,C),O=x$1.set(t,r,d);this._targetEnd.copy(I),this._sphericalEnd.setFromVector3(O.sub(I).applyQuaternion(this._yAxisUpSpace)),this.normalizeRotations(),this._needsUpdate=!0,w||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const ye=!w||P$1(this._target.x,this._targetEnd.x,this.restThreshold)&&P$1(this._target.y,this._targetEnd.y,this.restThreshold)&&P$1(this._target.z,this._targetEnd.z,this.restThreshold)&&P$1(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&P$1(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&P$1(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(ye)}lerpLookAt(t,r,d,g,v,C,w,I,O,ye,Se,Pe,Ne,ke=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=K.NONE,this._changedDolly=0;const ht=x$1.set(g,v,C),He=L.set(t,r,d);z$1.setFromVector3(He.sub(ht).applyQuaternion(this._yAxisUpSpace));const Fe=X.set(ye,Se,Pe),at=L.set(w,I,O);ae.setFromVector3(at.sub(Fe).applyQuaternion(this._yAxisUpSpace)),this._targetEnd.copy(ht.lerp(Fe,Ne));const ct=ae.theta-z$1.theta,xt=ae.phi-z$1.phi,Gt=ae.radius-z$1.radius;this._sphericalEnd.set(z$1.radius+Gt*Ne,z$1.phi+xt*Ne,z$1.theta+ct*Ne),this.normalizeRotations(),this._needsUpdate=!0,ke||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const Lt=!ke||P$1(this._target.x,this._targetEnd.x,this.restThreshold)&&P$1(this._target.y,this._targetEnd.y,this.restThreshold)&&P$1(this._target.z,this._targetEnd.z,this.restThreshold)&&P$1(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&P$1(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&P$1(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(Lt)}setPosition(t,r,d,g=!1){return this.setLookAt(t,r,d,this._targetEnd.x,this._targetEnd.y,this._targetEnd.z,g)}setTarget(t,r,d,g=!1){const v=this.getPosition(x$1),C=this.setLookAt(v.x,v.y,v.z,t,r,d,g);return this._sphericalEnd.phi=k(this._sphericalEnd.phi,this.minPolarAngle,this.maxPolarAngle),C}setFocalOffset(t,r,d,g=!1){this._isUserControllingOffset=!1,this._focalOffsetEnd.set(t,r,d),this._needsUpdate=!0,g||this._focalOffset.copy(this._focalOffsetEnd);const v=!g||P$1(this._focalOffset.x,this._focalOffsetEnd.x,this.restThreshold)&&P$1(this._focalOffset.y,this._focalOffsetEnd.y,this.restThreshold)&&P$1(this._focalOffset.z,this._focalOffsetEnd.z,this.restThreshold);return this._createOnRestPromise(v)}setOrbitPoint(t,r,d){this._camera.updateMatrixWorld(),F.setFromMatrixColumn(this._camera.matrixWorldInverse,0),N$1.setFromMatrixColumn(this._camera.matrixWorldInverse,1),Z$1.setFromMatrixColumn(this._camera.matrixWorldInverse,2);const g=x$1.set(t,r,d),v=g.distanceTo(this._camera.position),C=g.sub(this._camera.position);F.multiplyScalar(C.x),N$1.multiplyScalar(C.y),Z$1.multiplyScalar(C.z),x$1.copy(F).add(N$1).add(Z$1),x$1.z=x$1.z+v,this.dollyTo(v,!1),this.setFocalOffset(-x$1.x,x$1.y,-x$1.z,!1),this.moveTo(t,r,d,!1)}setBoundary(t){if(!t){this._boundary.min.set(-1/0,-1/0,-1/0),this._boundary.max.set(1/0,1/0,1/0),this._needsUpdate=!0;return}this._boundary.copy(t),this._boundary.clampPoint(this._targetEnd,this._targetEnd),this._needsUpdate=!0}setViewport(t,r,d,g){if(t===null){this._viewport=null;return}this._viewport=this._viewport||new T$1.Vector4,typeof t=="number"?this._viewport.set(t,r,d,g):this._viewport.copy(t)}getDistanceToFitBox(t,r,d,g=!1){if(Oe(this._camera,"getDistanceToFitBox"))return this._spherical.radius;const v=t/r,C=this._camera.getEffectiveFOV()*ie,w=this._camera.aspect;return((g?v>w:v<w)?r:t/w)*.5/Math.tan(C*.5)+d*.5}getDistanceToFitSphere(t){if(Oe(this._camera,"getDistanceToFitSphere"))return this._spherical.radius;const r=this._camera.getEffectiveFOV()*ie,d=Math.atan(Math.tan(r*.5)*this._camera.aspect)*2,g=1<this._camera.aspect?r:d;return t/Math.sin(g*.5)}getTarget(t,r=!0){return(t&&t.isVector3?t:new T$1.Vector3).copy(r?this._targetEnd:this._target)}getPosition(t,r=!0){return(t&&t.isVector3?t:new T$1.Vector3).setFromSpherical(r?this._sphericalEnd:this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(r?this._targetEnd:this._target)}getSpherical(t,r=!0){return(t||new T$1.Spherical).copy(r?this._sphericalEnd:this._spherical)}getFocalOffset(t,r=!0){return(t&&t.isVector3?t:new T$1.Vector3).copy(r?this._focalOffsetEnd:this._focalOffset)}normalizeRotations(){this._sphericalEnd.theta=this._sphericalEnd.theta%G$1,this._sphericalEnd.theta<0&&(this._sphericalEnd.theta+=G$1),this._spherical.theta+=G$1*Math.round((this._sphericalEnd.theta-this._spherical.theta)/G$1)}stop(){this._focalOffset.copy(this._focalOffsetEnd),this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd),this._zoom=this._zoomEnd}reset(t=!1){if(!P$1(this._camera.up.x,this._cameraUp0.x)||!P$1(this._camera.up.y,this._cameraUp0.y)||!P$1(this._camera.up.z,this._cameraUp0.z)){this._camera.up.copy(this._cameraUp0);const d=this.getPosition(x$1);this.updateCameraUp(),this.setPosition(d.x,d.y,d.z)}const r=[this.setLookAt(this._position0.x,this._position0.y,this._position0.z,this._target0.x,this._target0.y,this._target0.z,t),this.setFocalOffset(this._focalOffset0.x,this._focalOffset0.y,this._focalOffset0.z,t),this.zoomTo(this._zoom0,t)];return Promise.all(r)}saveState(){this._cameraUp0.copy(this._camera.up),this.getTarget(this._target0),this.getPosition(this._position0),this._zoom0=this._zoom,this._focalOffset0.copy(this._focalOffset)}updateCameraUp(){this._yAxisUpSpace.setFromUnitVectors(this._camera.up,de),this._yAxisUpSpaceInverse.copy(this._yAxisUpSpace).invert()}applyCameraUp(){const t=x$1.subVectors(this._target,this._camera.position).normalize(),r=L.crossVectors(t,this._camera.up);this._camera.up.crossVectors(r,t).normalize(),this._camera.updateMatrixWorld();const d=this.getPosition(x$1);this.updateCameraUp(),this.setPosition(d.x,d.y,d.z)}update(t){const r=this._sphericalEnd.theta-this._spherical.theta,d=this._sphericalEnd.phi-this._spherical.phi,g=this._sphericalEnd.radius-this._spherical.radius,v=Ye.subVectors(this._targetEnd,this._target),C=Ze$1.subVectors(this._focalOffsetEnd,this._focalOffset),w=this._zoomEnd-this._zoom;if(A(r))this._thetaVelocity.value=0,this._spherical.theta=this._sphericalEnd.theta;else{const ye=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.theta=he(this._spherical.theta,this._sphericalEnd.theta,this._thetaVelocity,ye,1/0,t),this._needsUpdate=!0}if(A(d))this._phiVelocity.value=0,this._spherical.phi=this._sphericalEnd.phi;else{const ye=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.phi=he(this._spherical.phi,this._sphericalEnd.phi,this._phiVelocity,ye,1/0,t),this._needsUpdate=!0}if(A(g))this._radiusVelocity.value=0,this._spherical.radius=this._sphericalEnd.radius;else{const ye=this._isUserControllingDolly?this.draggingSmoothTime:this.smoothTime;this._spherical.radius=he(this._spherical.radius,this._sphericalEnd.radius,this._radiusVelocity,ye,this.maxSpeed,t),this._needsUpdate=!0}if(A(v.x)&&A(v.y)&&A(v.z))this._targetVelocity.set(0,0,0),this._target.copy(this._targetEnd);else{const ye=this._isUserControllingTruck?this.draggingSmoothTime:this.smoothTime;Be$1(this._target,this._targetEnd,this._targetVelocity,ye,this.maxSpeed,t,this._target),this._needsUpdate=!0}if(A(C.x)&&A(C.y)&&A(C.z))this._focalOffsetVelocity.set(0,0,0),this._focalOffset.copy(this._focalOffsetEnd);else{const ye=this._isUserControllingOffset?this.draggingSmoothTime:this.smoothTime;Be$1(this._focalOffset,this._focalOffsetEnd,this._focalOffsetVelocity,ye,this.maxSpeed,t,this._focalOffset),this._needsUpdate=!0}if(A(w))this._zoomVelocity.value=0,this._zoom=this._zoomEnd;else{const ye=this._isUserControllingZoom?this.draggingSmoothTime:this.smoothTime;this._zoom=he(this._zoom,this._zoomEnd,this._zoomVelocity,ye,1/0,t)}if(this.dollyToCursor){if(Y$1(this._camera)&&this._changedDolly!==0){const ye=this._spherical.radius-this._lastDistance,Se=this._camera,Pe=this._getCameraDirection(ne),Ne=x$1.copy(Pe).cross(Se.up).normalize();Ne.lengthSq()===0&&(Ne.x=1);const ke=L.crossVectors(Ne,Pe),ht=this._sphericalEnd.radius*Math.tan(Se.getEffectiveFOV()*ie*.5),He=(this._sphericalEnd.radius-ye-this._sphericalEnd.radius)/this._sphericalEnd.radius,Fe=X.copy(this._targetEnd).add(Ne.multiplyScalar(this._dollyControlCoord.x*ht*Se.aspect)).add(ke.multiplyScalar(this._dollyControlCoord.y*ht)),at=x$1.copy(this._targetEnd).lerp(Fe,He),ct=this._lastDollyDirection===K.IN&&this._spherical.radius<=this.minDistance,xt=this._lastDollyDirection===K.OUT&&this.maxDistance<=this._spherical.radius;if(this.infinityDolly&&(ct||xt)){this._sphericalEnd.radius-=ye,this._spherical.radius-=ye;const Lt=L.copy(Pe).multiplyScalar(-ye);at.add(Lt)}this._boundary.clampPoint(at,at);const Gt=L.subVectors(at,this._targetEnd);this._targetEnd.copy(at),this._target.add(Gt),this._changedDolly-=ye,A(this._changedDolly)&&(this._changedDolly=0)}else if(j(this._camera)&&this._changedZoom!==0){const ye=this._zoom-this._lastZoom,Se=this._camera,Pe=x$1.set(this._dollyControlCoord.x,this._dollyControlCoord.y,(Se.near+Se.far)/(Se.near-Se.far)).unproject(Se),Ne=L.set(0,0,-1).applyQuaternion(Se.quaternion),ke=X.copy(Pe).add(Ne.multiplyScalar(-Pe.dot(Se.up))),ht=-(this._zoom-ye-this._zoom)/this._zoom,He=this._getCameraDirection(ne),Fe=this._targetEnd.dot(He),at=x$1.copy(this._targetEnd).lerp(ke,ht),ct=at.dot(He),xt=He.multiplyScalar(ct-Fe);at.sub(xt),this._boundary.clampPoint(at,at);const Gt=L.subVectors(at,this._targetEnd);this._targetEnd.copy(at),this._target.add(Gt),this._changedZoom-=ye,A(this._changedZoom)&&(this._changedZoom=0)}}this._camera.zoom!==this._zoom&&(this._camera.zoom=this._zoom,this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0),this._dragNeedsUpdate=!0;const I=this._collisionTest();this._spherical.radius=Math.min(this._spherical.radius,I),this._spherical.makeSafe(),this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target),this._camera.lookAt(this._target),(!A(this._focalOffset.x)||!A(this._focalOffset.y)||!A(this._focalOffset.z))&&(F.setFromMatrixColumn(this._camera.matrix,0),N$1.setFromMatrixColumn(this._camera.matrix,1),Z$1.setFromMatrixColumn(this._camera.matrix,2),F.multiplyScalar(this._focalOffset.x),N$1.multiplyScalar(-this._focalOffset.y),Z$1.multiplyScalar(this._focalOffset.z),x$1.copy(F).add(N$1).add(Z$1),this._camera.position.add(x$1),this._camera.updateMatrixWorld()),this._boundaryEnclosesCamera&&this._encloseToBoundary(this._camera.position.copy(this._target),x$1.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse),1);const O=this._needsUpdate;return O&&!this._updatedLastTime?(this._hasRested=!1,this.dispatchEvent({type:"wake"}),this.dispatchEvent({type:"update"})):O?(this.dispatchEvent({type:"update"}),A(r,this.restThreshold)&&A(d,this.restThreshold)&&A(g,this.restThreshold)&&A(v.x,this.restThreshold)&&A(v.y,this.restThreshold)&&A(v.z,this.restThreshold)&&A(C.x,this.restThreshold)&&A(C.y,this.restThreshold)&&A(C.z,this.restThreshold)&&A(w,this.restThreshold)&&!this._hasRested&&(this._hasRested=!0,this.dispatchEvent({type:"rest"}))):!O&&this._updatedLastTime&&(this._hasRested||(this._hasRested=!0,this.dispatchEvent({type:"rest"})),this.dispatchEvent({type:"sleep"})),this._lastDistance=this._spherical.radius,this._lastZoom=this._zoom,this._updatedLastTime=O,this._needsUpdate=!1,O}toJSON(){return JSON.stringify({enabled:this._enabled,minDistance:this.minDistance,maxDistance:re(this.maxDistance),minZoom:this.minZoom,maxZoom:re(this.maxZoom),minPolarAngle:this.minPolarAngle,maxPolarAngle:re(this.maxPolarAngle),minAzimuthAngle:re(this.minAzimuthAngle),maxAzimuthAngle:re(this.maxAzimuthAngle),smoothTime:this.smoothTime,draggingSmoothTime:this.draggingSmoothTime,dollySpeed:this.dollySpeed,truckSpeed:this.truckSpeed,dollyToCursor:this.dollyToCursor,target:this._targetEnd.toArray(),position:x$1.setFromSpherical(this._sphericalEnd).add(this._targetEnd).toArray(),zoom:this._zoomEnd,focalOffset:this._focalOffsetEnd.toArray(),target0:this._target0.toArray(),position0:this._position0.toArray(),zoom0:this._zoom0,focalOffset0:this._focalOffset0.toArray()})}fromJSON(t,r=!1){const d=JSON.parse(t);this.enabled=d.enabled,this.minDistance=d.minDistance,this.maxDistance=oe(d.maxDistance),this.minZoom=d.minZoom,this.maxZoom=oe(d.maxZoom),this.minPolarAngle=d.minPolarAngle,this.maxPolarAngle=oe(d.maxPolarAngle),this.minAzimuthAngle=oe(d.minAzimuthAngle),this.maxAzimuthAngle=oe(d.maxAzimuthAngle),this.smoothTime=d.smoothTime,this.draggingSmoothTime=d.draggingSmoothTime,this.dollySpeed=d.dollySpeed,this.truckSpeed=d.truckSpeed,this.dollyToCursor=d.dollyToCursor,this._target0.fromArray(d.target0),this._position0.fromArray(d.position0),this._zoom0=d.zoom0,this._focalOffset0.fromArray(d.focalOffset0),this.moveTo(d.target[0],d.target[1],d.target[2],r),z$1.setFromVector3(x$1.fromArray(d.position).sub(this._targetEnd).applyQuaternion(this._yAxisUpSpace)),this.rotateTo(z$1.theta,z$1.phi,r),this.dollyTo(z$1.radius,r),this.zoomTo(d.zoom,r),this.setFocalOffset(d.focalOffset[0],d.focalOffset[1],d.focalOffset[2],r),this._needsUpdate=!0}connect(t){if(this._domElement){console.warn("camera-controls is already connected.");return}this._addAllEventListeners(t),this._getClientRect(this._elementRect)}disconnect(){this.cancel(),this._removeAllEventListeners(),this._domElement&&(this._domElement=void 0)}dispose(){this.removeAllEventListeners(),this.disconnect()}_getTargetDirection(t){return t.setFromSpherical(this._spherical).divideScalar(this._spherical.radius).applyQuaternion(this._yAxisUpSpaceInverse)}_getCameraDirection(t){return this._getTargetDirection(t).negate()}_findPointerById(t){return this._activePointers.find(r=>r.pointerId===t)}_findPointerByMouseButton(t){return this._activePointers.find(r=>r.mouseButton===t)}_disposePointer(t){this._activePointers.splice(this._activePointers.indexOf(t),1)}_encloseToBoundary(t,r,d){const g=r.lengthSq();if(g===0)return t;const v=L.copy(r).add(t),C=this._boundary.clampPoint(v,X).sub(v),w=C.lengthSq();if(w===0)return t.add(r);if(w===g)return t;if(d===0)return t.add(r).add(C);{const I=1+d*w/r.dot(C);return t.add(L.copy(r).multiplyScalar(I)).add(C.multiplyScalar(1-d))}}_updateNearPlaneCorners(){if(Y$1(this._camera)){const t=this._camera,r=t.near,d=t.getEffectiveFOV()*ie,g=Math.tan(d*.5)*r,v=g*t.aspect;this._nearPlaneCorners[0].set(-v,-g,0),this._nearPlaneCorners[1].set(v,-g,0),this._nearPlaneCorners[2].set(v,g,0),this._nearPlaneCorners[3].set(-v,g,0)}else if(j(this._camera)){const t=this._camera,r=1/t.zoom,d=t.left*r,g=t.right*r,v=t.top*r,C=t.bottom*r;this._nearPlaneCorners[0].set(d,v,0),this._nearPlaneCorners[1].set(g,v,0),this._nearPlaneCorners[2].set(g,C,0),this._nearPlaneCorners[3].set(d,C,0)}}_collisionTest(){let t=1/0;if(!(this.colliderMeshes.length>=1)||Oe(this._camera,"_collisionTest"))return t;const r=this._getTargetDirection(ne);be.lookAt(Ve$1,r,this._camera.up);for(let d=0;d<4;d++){const g=L.copy(this._nearPlaneCorners[d]);g.applyMatrix4(be);const v=X.addVectors(this._target,g);me.set(v,r),me.far=this._spherical.radius+1;const C=me.intersectObjects(this.colliderMeshes);C.length!==0&&C[0].distance<t&&(t=C[0].distance)}return t}_getClientRect(t){if(!this._domElement)return;const r=this._domElement.getBoundingClientRect();return t.x=r.left,t.y=r.top,this._viewport?(t.x+=this._viewport.x,t.y+=r.height-this._viewport.w-this._viewport.y,t.width=this._viewport.z,t.height=this._viewport.w):(t.width=r.width,t.height=r.height),t}_createOnRestPromise(t){return t?Promise.resolve():(this._hasRested=!1,this.dispatchEvent({type:"transitionstart"}),new Promise(r=>{const d=()=>{this.removeEventListener("rest",d),r()};this.addEventListener("rest",d)}))}_addAllEventListeners(t){}_removeAllEventListeners(){}get dampingFactor(){return console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead."),0}set dampingFactor(t){console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead.")}get draggingDampingFactor(){return console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead."),0}set draggingDampingFactor(t){console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead.")}static createBoundingSphere(t,r=new T$1.Sphere){const d=r,g=d.center;$.makeEmpty(),t.traverseVisible(C=>{C.isMesh&&$.expandByObject(C)}),$.getCenter(g);let v=0;return t.traverseVisible(C=>{if(!C.isMesh)return;const w=C;if(!w.geometry)return;const I=w.geometry.clone();I.applyMatrix4(w.matrixWorld);const O=I.attributes.position;for(let ye=0,Se=O.count;ye<Se;ye++)x$1.fromBufferAttribute(O,ye),v=Math.max(v,g.distanceToSquared(x$1))}),d.radius=Math.sqrt(v),d}}var Ae={exports:{}},Q$1=typeof Reflect=="object"?Reflect:null,Ge=Q$1&&typeof Q$1.apply=="function"?Q$1.apply:function(m,t,r){return Function.prototype.apply.call(m,t,r)},ue;Q$1&&typeof Q$1.ownKeys=="function"?ue=Q$1.ownKeys:Object.getOwnPropertySymbols?ue=function(m){return Object.getOwnPropertyNames(m).concat(Object.getOwnPropertySymbols(m))}:ue=function(m){return Object.getOwnPropertyNames(m)};function Ts(m){console&&console.warn&&console.warn(m)}var _t=Number.isNaN||function(m){return m!==m};function S(){S.init.call(this)}Ae.exports=S;Ae.exports.once=Ls;S.EventEmitter=S;S.prototype._events=void 0;S.prototype._eventsCount=0;S.prototype._maxListeners=void 0;var Xe$1=10;function ge(m){if(typeof m!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof m)}Object.defineProperty(S,"defaultMaxListeners",{enumerable:!0,get:function(){return Xe$1},set:function(m){if(typeof m!="number"||m<0||_t(m))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+m+".");Xe$1=m}});S.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};S.prototype.setMaxListeners=function(m){if(typeof m!="number"||m<0||_t(m))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+m+".");return this._maxListeners=m,this};function gt$1(m){return m._maxListeners===void 0?S.defaultMaxListeners:m._maxListeners}S.prototype.getMaxListeners=function(){return gt$1(this)};S.prototype.emit=function(m){for(var t=[],r=1;r<arguments.length;r++)t.push(arguments[r]);var d=m==="error",g=this._events;if(g!==void 0)d=d&&g.error===void 0;else if(!d)return!1;if(d){var v;if(t.length>0&&(v=t[0]),v instanceof Error)throw v;var C=new Error("Unhandled error."+(v?" ("+v.message+")":""));throw C.context=v,C}var w=g[m];if(w===void 0)return!1;if(typeof w=="function")Ge(w,this,t);else for(var I=w.length,O=Ot$1(w,I),r=0;r<I;++r)Ge(O[r],this,t);return!0};function vt(m,t,r,d){var g,v,C;if(ge(r),v=m._events,v===void 0?(v=m._events=Object.create(null),m._eventsCount=0):(v.newListener!==void 0&&(m.emit("newListener",t,r.listener?r.listener:r),v=m._events),C=v[t]),C===void 0)C=v[t]=r,++m._eventsCount;else if(typeof C=="function"?C=v[t]=d?[r,C]:[C,r]:d?C.unshift(r):C.push(r),g=gt$1(m),g>0&&C.length>g&&!C.warned){C.warned=!0;var w=new Error("Possible EventEmitter memory leak detected. "+C.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");w.name="MaxListenersExceededWarning",w.emitter=m,w.type=t,w.count=C.length,Ts(w)}return m}S.prototype.addListener=function(m,t){return vt(this,m,t,!1)};S.prototype.on=S.prototype.addListener;S.prototype.prependListener=function(m,t){return vt(this,m,t,!0)};function ws(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function yt$1(m,t,r){var d={fired:!1,wrapFn:void 0,target:m,type:t,listener:r},g=ws.bind(d);return g.listener=r,d.wrapFn=g,g}S.prototype.once=function(m,t){return ge(t),this.on(m,yt$1(this,m,t)),this};S.prototype.prependOnceListener=function(m,t){return ge(t),this.prependListener(m,yt$1(this,m,t)),this};S.prototype.removeListener=function(m,t){var r,d,g,v,C;if(ge(t),d=this._events,d===void 0)return this;if(r=d[m],r===void 0)return this;if(r===t||r.listener===t)--this._eventsCount===0?this._events=Object.create(null):(delete d[m],d.removeListener&&this.emit("removeListener",m,r.listener||t));else if(typeof r!="function"){for(g=-1,v=r.length-1;v>=0;v--)if(r[v]===t||r[v].listener===t){C=r[v].listener,g=v;break}if(g<0)return this;g===0?r.shift():xs(r,g),r.length===1&&(d[m]=r[0]),d.removeListener!==void 0&&this.emit("removeListener",m,C||t)}return this};S.prototype.off=S.prototype.removeListener;S.prototype.removeAllListeners=function(m){var t,r,d;if(r=this._events,r===void 0)return this;if(r.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):r[m]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete r[m]),this;if(arguments.length===0){var g=Object.keys(r),v;for(d=0;d<g.length;++d)v=g[d],v!=="removeListener"&&this.removeAllListeners(v);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(t=r[m],typeof t=="function")this.removeListener(m,t);else if(t!==void 0)for(d=t.length-1;d>=0;d--)this.removeListener(m,t[d]);return this};function Ct(m,t,r){var d=m._events;if(d===void 0)return[];var g=d[t];return g===void 0?[]:typeof g=="function"?r?[g.listener||g]:[g]:r?bs(g):Ot$1(g,g.length)}S.prototype.listeners=function(m){return Ct(this,m,!0)};S.prototype.rawListeners=function(m){return Ct(this,m,!1)};S.listenerCount=function(m,t){return typeof m.listenerCount=="function"?m.listenerCount(t):Et.call(m,t)};S.prototype.listenerCount=Et;function Et(m){var t=this._events;if(t!==void 0){var r=t[m];if(typeof r=="function")return 1;if(r!==void 0)return r.length}return 0}S.prototype.eventNames=function(){return this._eventsCount>0?ue(this._events):[]};function Ot$1(m,t){for(var r=new Array(t),d=0;d<t;++d)r[d]=m[d];return r}function xs(m,t){for(;t+1<m.length;t++)m[t]=m[t+1];m.pop()}function bs(m){for(var t=new Array(m.length),r=0;r<t.length;++r)t[r]=m[r].listener||m[r];return t}function Ls(m,t){return new Promise(function(r,d){function g(C){m.removeListener(t,v),d(C)}function v(){typeof m.removeListener=="function"&&m.removeListener("error",g),r([].slice.call(arguments))}Tt(m,t,v,{once:!0}),t!=="error"&&Ps(m,g,{once:!0})})}function Ps(m,t,r){typeof m.on=="function"&&Tt(m,"error",t,r)}function Tt(m,t,r,d){if(typeof m.on=="function")d.once?m.once(t,r):m.on(t,r);else if(typeof m.addEventListener=="function")m.addEventListener(t,function g(v){d.once&&m.removeEventListener(t,g),r(v)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof m)}var ve=Ae.exports;const Ss={antialias:!1,devicePixelRatio:window.devicePixelRatio,powerPreference:"high-performance",toneMappingExposure:1,alpha:!1,outputColorSpace:e.sRGB,logarithmicDepthBuffer:!1,preserveDrawingBuffer:!1,stencil:!1,depth:!1};class As{constructor(t){this.options=t;const{width:r,height:d,rendererParams:g}=t,{alpha:v,devicePixelRatio:C,antialias:w,powerPreference:I,toneMappingExposure:O,outputColorSpace:ye,logarithmicDepthBuffer:Se,preserveDrawingBuffer:Pe,stencil:Ne,depth:ke}=g,ht=new WebGLRenderer({alpha:v,antialias:w,powerPreference:I,logarithmicDepthBuffer:Se,preserveDrawingBuffer:Pe,stencil:Ne,depth:ke});ht.setSize(r,d),ht.setPixelRatio(C),ht.toneMappingExposure=O,ht.outputColorSpace=ye,this.renderer=ht}setSize(t,r){this.renderer.setSize(t,r)}setPixelRatio(t){this.renderer.setPixelRatio(t)}render(t,r){this.renderer.render(t,r)}setViewport(t){var r,d;const{x:g,y:v,width:C,height:w}=t,I=(r=t.scissor)!=null?r:!1,O=(d=t.scissorTest)!=null?d:!1;this.renderer.setViewport(g,v,C,w),I&&(this.renderer.setScissor(g,v,C,w),this.renderer.setScissorTest(O))}setViewPadding(t=0,r=0,d=0,g=0){const{width:v,height:C}=this.renderer.getSize(new Vector2),w={x:g,y:d,width:v-g-r,height:C-t-d};this.setViewport(w)}dispose(){var t,r;this.setSize(1,1),(t=this.renderer)==null||t.clear(),(r=this.renderer)==null||r.dispose()}}const Ms={antialias:!0,devicePixelRatio:window.devicePixelRatio};class Rs{constructor(t){this.options=t;const{width:r,height:d,rendererParams:g,renderer:v}=t,{devicePixelRatio:C,antialias:w}=g,I=new v({antialias:w});I.setSize(r,d),I.setPixelRatio(C),this.renderer=I}setSize(t,r){this.renderer.setSize(t,r)}render(t,r){this.renderer.render(t,r)}dispose(){var t,r;this.setSize(1,1),(t=this.renderer)==null||t.clear(),(r=this.renderer)==null||r.dispose()}}let Ds=class{constructor(){this.mask=1}set(m){this.mask=(1<<m|0)>>>0}enable(m){this.mask|=1<<m|0}enableAll(){this.mask=-1}toggle(m){this.mask^=1<<m|0}disable(m){this.mask&=~(1<<m|0)}disableAll(){this.mask=0}isEnabled(m){return(this.mask&(1<<m|0))!==0}};class ee{constructor(){this.event=new ve.EventEmitter,this.controllerMap=new Map,this.activeIndex=-1,this.activeControllerSet=new Set}addController(t,r){const d=new Ds;return d.disableAll(),r!==void 0&&d.set(r),this.controllerMap.set(t,d),r===this.activeIndex&&this.activeControllerSet.add(t),t}removePage(t,r){this.controllerMap.forEach((d,g)=>{d.isEnabled(t)&&(d.disable(t),d.mask===0&&(r==null||r(g),this.controllerMap.delete(g),this.activeControllerSet.delete(g)))})}setPageActive(t,r){this.activeIndex=t,this.activeControllerSet.clear(),this.controller=(Array.from(this.controllerMap.entries()).find(([d,g])=>{const v=g.isEnabled(t);return v&&this.activeControllerSet.add(d),r==null||r(d,v),v})||[])[0],this.event.emit("pageChange",this.controller)}update(t,r){this.activeControllerSet.forEach(d=>{var g;(g=d.update)==null||g.call(d,t,r)})}dispose(){this.controllerMap.forEach((t,r)=>{t.set(0)}),this.removePage(0),this.controllerMap.clear(),this.event.removeAllListeners(),this.activeControllerSet.clear()}}const wt={fov:45,near:1,far:1e3,up:new Vector3(0,1,0)};class Us extends ee{constructor(t){super(),this.width=0,this.height=0,this.width=t.width,this.height=t.height}get camera(){return this.controller}addPerspectiveCamera(t=wt,r){const{fov:d,far:g,near:v,up:C,aspect:w}=t,I=w!=null?w:this.width/this.height,O=new PerspectiveCamera(d,I,v,g);return O.up=C,this.addController(O,r)}setPageActive(t){super.setPageActive(t,(r,d)=>{d&&this.setAspect(this.width/this.height,r)})}setSize(t,r){this.width=t,this.height=r,this.setAspect(t/r)}setAspect(t,r){const d=r||this.camera;d.aspect!==t&&(d.aspect=t,d.updateProjectionMatrix())}cloneCamera(t){const r=this.addPerspectiveCamera({fov:this.camera.fov,aspect:this.camera.aspect,near:this.camera.near,far:this.camera.far,up:this.camera.up},t);return r.position.copy(this.camera.position),r}sync(t){if(t.type==="PerspectiveCamera"){const r=t;(!this.camera.matrixWorld.equals(r.matrixWorld)||this.camera.far!==r.far||this.camera.near!==r.near||this.camera.fov!==r.fov||this.camera.aspect!==r.aspect)&&this.camera.copy(r)}else{const r=t,d=r.viewMatrix,g=r.inverseViewMatrix,v=new Matrix4(g[0],g[4],g[8],g[12],g[1],g[5],g[9],g[13],g[2],g[6],g[10],g[14],g[3],g[7],g[11],g[15]),C=new Matrix4(d[0],d[4],d[8],d[12],d[1],d[5],d[9],d[13],d[2],d[6],d[10],d[14],d[3],d[7],d[11],d[15]),{width:w,height:I}=this,O=w/I;(this.camera.fov!==r.fov||this.camera.aspect!==O||!this.camera.matrixWorld.equals(v)||!this.camera.matrixWorldInverse.equals(C))&&(this.camera.fov=r.fov,this.camera.updateProjectionMatrix(),this.camera.matrixAutoUpdate=!1,this.camera.matrixWorld.copy(v),this.camera.matrixWorldInverse.copy(C),this.camera.aspect=O,this.camera.updateProjectionMatrix())}}}const zs={background:null};class ks extends ee{get scene(){return this.controller}constructor(t){super(),this.options=t}addScene(t,r){const d=new Scene;return t!=null&&t.background&&(d.background=t.background),this.addController(d,r)}removePage(t){super.removePage(t,r=>{const d=new ie$1;d.track(r),d.dispose()})}setPageActive(t){super.setPageActive(t,(r,d)=>{r.visible=d})}}class Fs{constructor(t){this.helpers={},this.options=t}add(t){const r=t.uuid,{sceneController:d}=this.options;let g=this.helpers[r];if(g===void 0){if(t.isScene)g=new AxesHelper(100);else if(t.isCamera)g=new CameraHelper(t);else if(t.isPointLight)g=new PointLightHelper(t,1);else if(t.isDirectionalLight)g=new DirectionalLightHelper(t,1);else if(t.isSpotLight)g=new SpotLightHelper(t);else if(t.isHemisphereLight)g=new HemisphereLightHelper(t,10);else if(t.isRectAreaLight)g=new RectAreaLightHelper(t);else{const v=new Box3;if(v.setFromObject(t,!0),v.isEmpty()===!1){g=new Box3Helper(v);const C=g.material;C.userData.object=t,C.depthTest=!1,C.transparent=!0}else return}d.scene.add(g),this.helpers[r]=g}}addViewHelper(){const{cameraController:t,container:r}=this.options,d=new ViewHelper(t.camera,r);r.addEventListener("pointerdown",g=>{g.preventDefault(),d.handleClick(g)}),this.viewHelper=d}remove(t){var r;const d=t.uuid,{sceneController:g}=this.options;if(this.helpers[d]!==void 0){const v=this.helpers[d];g.scene.remove(v),delete this.helpers[d],(r=v.dispose)==null||r.call(v)}}removeAll(){Object.keys(this.helpers).forEach(t=>{this.remove({uuid:t})}),this.helpers={}}removeAllExcludeScene(){Object.keys(this.helpers).forEach(t=>{this.helpers[t]instanceof AxesHelper||this.remove({uuid:t})})}update(t,r,d){var g,v;const{cameraController:C}=this.options;Object.values(this.helpers).forEach(w=>{if(w.update&&w.update(),w instanceof Box3Helper){const I=w.material,{object:O}=I.userData;O&&w.box.setFromObject(O,!0)}}),((g=this.viewHelper)==null?void 0:g.animating)===!0&&(this.viewHelper.update(t),(v=r.cameraControls)==null||v.setPosition(...C.camera.position.toArray()),this.viewHelper.center.copy(d))}renderViewHelper(t){if(!this.viewHelper)return;const r=t.autoClear;t.autoClear=!1,this.viewHelper.render(t),t.autoClear=r}dispose(){var t;this.helpers={},(t=this.viewHelper)==null||t.dispose()}}class Ns extends ee{constructor(t){super(),this.autoRotateSpeed=0,this.options=t;const r={Vector2,Vector3,Vector4,Quaternion,Matrix4,Spherical,Box3,Sphere:Sphere$1,Raycaster};J.install({THREE:r})}get cameraControls(){return this.controller}addCameraControls(t,r){const{domElement:d}=this.options.controlsParams,g=new J(t,d);return g.setLookAt(0,0,400,0,0,0,!1),this.addController(g,r)}setPageActive(t){super.setPageActive(t,(r,d)=>{r.enabled=d})}removePage(t){super.removePage(t,r=>{r.dispose()})}enable(){this.activeControllerSet.forEach(t=>{t.enabled=!0})}disable(){this.activeControllerSet.forEach(t=>{t.enabled=!1})}update(t,r){super.update(t,r),this.autoRotateSpeed&&this.cameraControls&&(this.cameraControls.azimuthAngle+=this.autoRotateSpeed*t*MathUtils.DEG2RAD)}}class Hs{constructor(t){this.event=new ve.EventEmitter;const{renderer:r,scene:d,camera:g}=t,v=new TransformControls(g,r.domElement);if(v.getHelper){const C=v.getHelper();d.add(C),+REVISION<170}else v instanceof Object3D&&d.add(v);this.controls=v,this.addEvent()}get detach(){return this.controls.detach.bind(this.controls)}get attach(){return this.controls.attach.bind(this.controls)}addEvent(){let t=null,r=null,d=null;const g=this.controls;g.addEventListener("change",()=>{const v=g.object;v!==void 0&&this.event.emit("change",v)}),g.addEventListener("mouseDown",()=>{const v=g.object;t=v.position.clone(),r=v.rotation.clone(),d=v.scale.clone(),this.event.emit("mouseDown",v)}),g.addEventListener("mouseUp",()=>{const v=g.object;if(v!==void 0)switch(g.getMode()){case"translate":t.equals(v.position)||this.event.emit("translate",v,v.position,t);break;case"rotate":r.equals(v.rotation)||this.event.emit("rotate",v,v.rotation,r);break;case"scale":d.equals(v.scale)||this.event.emit("scale",v,v.scale,d);break}this.event.emit("mouseUp")})}dispose(){var t;this.event.removeAllListeners(),(t=this.controls)==null||t.dispose()}}const $e=new Vector3,Is=new Quaternion,qe=new Vector3,H$1=new Matrix4,js=new Matrix4;class Bs{constructor(t={}){const r=this;let d,g,v,C;const w={camera:{style:""},objects:new WeakMap},I=t.element!==void 0?t.element:document.createElement("div");I.style.overflow="hidden",this.domElement=I;const O=document.createElement("div");O.style.transformOrigin="0 0",O.style.pointerEvents="none",I.appendChild(O);const ye=document.createElement("div");ye.style.transformStyle="preserve-3d",O.appendChild(ye),this.getSize=function(){return{width:d,height:g}},this.render=function(He,Fe){const at=Fe.projectionMatrix.elements[5]*C;Fe.view&&Fe.view.enabled?(O.style.transform=`translate( ${-Fe.view.offsetX*(d/Fe.view.width)}px, ${-Fe.view.offsetY*(g/Fe.view.height)}px )`,O.style.transform+=`scale( ${Fe.view.fullWidth/Fe.view.width}, ${Fe.view.fullHeight/Fe.view.height} )`):O.style.transform="",He.matrixWorldAutoUpdate===!0&&He.updateMatrixWorld(),Fe.parent===null&&Fe.matrixWorldAutoUpdate===!0&&Fe.updateMatrixWorld();let ct,xt;Fe.isOrthographicCamera&&(ct=-(Fe.right+Fe.left)/2,xt=(Fe.top+Fe.bottom)/2);const Gt=Fe.view&&Fe.view.enabled?Fe.view.height/Fe.view.fullHeight:1,Lt=Fe.isOrthographicCamera?`scale( ${Gt} )scale(`+at+")translate("+Se(ct)+"px,"+Se(xt)+"px)"+Pe(Fe.matrixWorldInverse):`scale( ${Gt} )translateZ(`+at+"px)"+Pe(Fe.matrixWorldInverse),Wt=(Fe.isPerspectiveCamera?"perspective("+at+"px) ":"")+Lt+"translate("+v+"px,"+C+"px)";w.camera.style!==Wt&&(ye.style.transform=Wt,w.camera.style=Wt),ht(He,He,Fe)},this.setSize=function(He,Fe){d=He,g=Fe,v=d/2,C=g/2,I.style.width=He+"px",I.style.height=Fe+"px",O.style.width=He+"px",O.style.height=Fe+"px",ye.style.width=He+"px",ye.style.height=Fe+"px"};function Se(He){return Math.abs(He)<1e-10?0:He}function Pe(He){const Fe=He.elements;return"matrix3d("+Se(Fe[0])+","+Se(-Fe[1])+","+Se(Fe[2])+","+Se(Fe[3])+","+Se(Fe[4])+","+Se(-Fe[5])+","+Se(Fe[6])+","+Se(Fe[7])+","+Se(Fe[8])+","+Se(-Fe[9])+","+Se(Fe[10])+","+Se(Fe[11])+","+Se(Fe[12])+","+Se(-Fe[13])+","+Se(Fe[14])+","+Se(Fe[15])+")"}function Ne(He){const Fe=He.elements;return"translate(-50%,-50%)"+("matrix3d("+Se(Fe[0])+","+Se(Fe[1])+","+Se(Fe[2])+","+Se(Fe[3])+","+Se(-Fe[4])+","+Se(-Fe[5])+","+Se(-Fe[6])+","+Se(-Fe[7])+","+Se(Fe[8])+","+Se(Fe[9])+","+Se(Fe[10])+","+Se(Fe[11])+","+Se(Fe[12])+","+Se(Fe[13])+","+Se(Fe[14])+","+Se(Fe[15])+")")}function ke(He){He.isCSS3DObject&&(He.element.style.display="none");for(let Fe=0,at=He.children.length;Fe<at;Fe++)ke(He.children[Fe])}function ht(He,Fe,at,ct){if(He.visible===!1){ke(He);return}if(He.isCSS3DObject){const xt=He.layers.test(at.layers)===!0,Gt=He.element;if(Gt.style.display=xt===!0?"":"none",xt===!0){He.onBeforeRender(r,Fe,at);let Lt;He.isCSS3DSprite?(H$1.copy(at.matrixWorldInverse),H$1.transpose(),He.rotation2D!==0&&H$1.multiply(js.makeRotationZ(He.rotation2D)),He.matrixWorld.decompose($e,Is,qe),H$1.setPosition($e),H$1.scale(qe),H$1.elements[3]=0,H$1.elements[7]=0,H$1.elements[11]=0,H$1.elements[15]=1,Lt=Ne(H$1)):Lt=Ne(He.matrixWorld);const Wt=w.objects.get(He);if(Wt===void 0||Wt.style!==Lt){Gt.style.transform=Lt;const Pt={style:Lt};w.objects.set(He,Pt)}Gt.parentNode!==ye&&ye.appendChild(Gt),He.onAfterRender(r,Fe,at)}}for(let xt=0,Gt=He.children.length;xt<Gt;xt++)ht(He.children[xt],Fe,at)}}}const q=new Vector3,Qe$1=new Matrix4,Je=new Matrix4,et=new Vector3,tt=new Vector3;class Vs{constructor(t={}){const r=this;let d,g,v,C;const w={objects:new WeakMap},I=t.element!==void 0?t.element:document.createElement("div");I.style.overflow="hidden",this.domElement=I,this.getSize=function(){return{width:d,height:g}},this.render=function(ke,ht){ke.matrixWorldAutoUpdate===!0&&ke.updateMatrixWorld(),ht.parent===null&&ht.matrixWorldAutoUpdate===!0&&ht.updateMatrixWorld(),Qe$1.copy(ht.matrixWorldInverse),Je.multiplyMatrices(ht.projectionMatrix,Qe$1),ye(ke,ke,ht),Ne(ke)},this.setSize=function(ke,ht){d=ke,g=ht,v=d/2,C=g/2,I.style.width=ke+"px",I.style.height=ht+"px"};function O(ke){ke.isCSS2DObject&&(ke.element.style.display="none");for(let ht=0,He=ke.children.length;ht<He;ht++)O(ke.children[ht])}function ye(ke,ht,He){if(ke.visible===!1){O(ke);return}if(ke.isCSS2DObject){q.setFromMatrixPosition(ke.matrixWorld),q.applyMatrix4(Je);const Fe=q.z>=-1&&q.z<=1&&ke.layers.test(He.layers)===!0,at=ke.element;at.style.display=Fe===!0?"":"none",Fe===!0&&(ke.onBeforeRender(r,ht,He),at.style.transform="translate("+-100*ke.center.x+"%,"+-100*ke.center.y+"%)translate("+(q.x*v+v)+"px,"+(-q.y*C+C)+"px)",at.parentNode!==I&&I.appendChild(at),ke.onAfterRender(r,ht,He));const ct={distanceToCameraSquared:Se(He,ke)};w.objects.set(ke,ct)}for(let Fe=0,at=ke.children.length;Fe<at;Fe++)ye(ke.children[Fe],ht,He)}function Se(ke,ht){return et.setFromMatrixPosition(ke.matrixWorld),tt.setFromMatrixPosition(ht.matrixWorld),et.distanceToSquared(tt)}function Pe(ke){const ht=[];return ke.traverseVisible(function(He){He.isCSS2DObject&&ht.push(He)}),ht}function Ne(ke){const ht=Pe(ke).sort(function(Fe,at){if(Fe.renderOrder!==at.renderOrder)return at.renderOrder-Fe.renderOrder;const ct=w.objects.get(Fe).distanceToCameraSquared,xt=w.objects.get(at).distanceToCameraSquared;return ct-xt}),He=ht.length;for(let Fe=0,at=ht.length;Fe<at;Fe++)ht[Fe].element.style.zIndex=He-Fe}}}const st={zIndex:"auto"};class Ys{constructor(t){this.container=t}addRenderer(t,r){const d=r.container||this.container,g=d.offsetWidth,v=d.offsetHeight,C=t==="css2d"?new Vs:new Bs;C.domElement.style.position="absolute",C.domElement.style.top="0",C.domElement.style.pointerEvents="none",C.domElement.style.zIndex=r.zIndex,C.setSize(g,v),d.appendChild(C.domElement),t==="css2d"?this.css2Drenderer=C:t==="css3d"&&(this.css3Drenderer=C)}setSize(t,r){var d,g;(d=this.css2Drenderer)==null||d.setSize(t,r),(g=this.css3Drenderer)==null||g.setSize(t,r)}render(t,r){var d,g;(d=this.css2Drenderer)==null||d.render(t,r),(g=this.css3Drenderer)==null||g.render(t,r)}dispose(){var t,r;(t=this.css2Drenderer)==null||t.domElement.remove(),(r=this.css3Drenderer)==null||r.domElement.remove(),this.css2Drenderer=void 0,this.css3Drenderer=void 0}}const Zs={name:"OutputShader",uniforms:{tDiffuse:{value:null},toneMappingExposure:{value:1},premultiplieAlpha:{value:0}},vertexShader:`
4759
+ */const Matrix=function(){var m=Math.cos,t=Math.sin,r=Math.tan,d=Math.round;function g(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function v(e0){if(e0===0)return this;var Yt=m(e0),o0=t(e0);return this._t(Yt,-o0,0,0,o0,Yt,0,0,0,0,1,0,0,0,0,1)}function C(e0){if(e0===0)return this;var Yt=m(e0),o0=t(e0);return this._t(1,0,0,0,0,Yt,-o0,0,0,o0,Yt,0,0,0,0,1)}function w(e0){if(e0===0)return this;var Yt=m(e0),o0=t(e0);return this._t(Yt,0,o0,0,0,1,0,0,-o0,0,Yt,0,0,0,0,1)}function I(e0){if(e0===0)return this;var Yt=m(e0),o0=t(e0);return this._t(Yt,-o0,0,0,o0,Yt,0,0,0,0,1,0,0,0,0,1)}function O(e0,Yt){return this._t(1,Yt,e0,1,0,0)}function ye(e0,Yt){return this.shear(r(e0),r(Yt))}function Se(e0,Yt){var o0=m(Yt),b0=t(Yt);return this._t(o0,b0,0,0,-b0,o0,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,r(e0),1,0,0,0,0,1,0,0,0,0,1)._t(o0,-b0,0,0,b0,o0,0,0,0,0,1,0,0,0,0,1)}function Pe(e0,Yt,o0){return!o0&&o0!==0&&(o0=1),e0===1&&Yt===1&&o0===1?this:this._t(e0,0,0,0,0,Yt,0,0,0,0,o0,0,0,0,0,1)}function Ne(e0,Yt,o0,b0,f0,P0,q0,G0,I0,F0,D0,Si,Ti,Mi,Fi,Ni){return this.props[0]=e0,this.props[1]=Yt,this.props[2]=o0,this.props[3]=b0,this.props[4]=f0,this.props[5]=P0,this.props[6]=q0,this.props[7]=G0,this.props[8]=I0,this.props[9]=F0,this.props[10]=D0,this.props[11]=Si,this.props[12]=Ti,this.props[13]=Mi,this.props[14]=Fi,this.props[15]=Ni,this}function ke(e0,Yt,o0){return o0=o0||0,e0!==0||Yt!==0||o0!==0?this._t(1,0,0,0,0,1,0,0,0,0,1,0,e0,Yt,o0,1):this}function ht(e0,Yt,o0,b0,f0,P0,q0,G0,I0,F0,D0,Si,Ti,Mi,Fi,Ni){var B0=this.props;if(e0===1&&Yt===0&&o0===0&&b0===0&&f0===0&&P0===1&&q0===0&&G0===0&&I0===0&&F0===0&&D0===1&&Si===0)return B0[12]=B0[12]*e0+B0[15]*Ti,B0[13]=B0[13]*P0+B0[15]*Mi,B0[14]=B0[14]*D0+B0[15]*Fi,B0[15]*=Ni,this._identityCalculated=!1,this;var h0=B0[0],xi=B0[1],O0=B0[2],J0=B0[3],A0=B0[4],N0=B0[5],_0=B0[6],a0=B0[7],s0=B0[8],v0=B0[9],C0=B0[10],E0=B0[11],w0=B0[12],vi=B0[13],ui=B0[14],Ci=B0[15];return B0[0]=h0*e0+xi*f0+O0*I0+J0*Ti,B0[1]=h0*Yt+xi*P0+O0*F0+J0*Mi,B0[2]=h0*o0+xi*q0+O0*D0+J0*Fi,B0[3]=h0*b0+xi*G0+O0*Si+J0*Ni,B0[4]=A0*e0+N0*f0+_0*I0+a0*Ti,B0[5]=A0*Yt+N0*P0+_0*F0+a0*Mi,B0[6]=A0*o0+N0*q0+_0*D0+a0*Fi,B0[7]=A0*b0+N0*G0+_0*Si+a0*Ni,B0[8]=s0*e0+v0*f0+C0*I0+E0*Ti,B0[9]=s0*Yt+v0*P0+C0*F0+E0*Mi,B0[10]=s0*o0+v0*q0+C0*D0+E0*Fi,B0[11]=s0*b0+v0*G0+C0*Si+E0*Ni,B0[12]=w0*e0+vi*f0+ui*I0+Ci*Ti,B0[13]=w0*Yt+vi*P0+ui*F0+Ci*Mi,B0[14]=w0*o0+vi*q0+ui*D0+Ci*Fi,B0[15]=w0*b0+vi*G0+ui*Si+Ci*Ni,this._identityCalculated=!1,this}function He(){return this._identityCalculated||(this._identity=!(this.props[0]!==1||this.props[1]!==0||this.props[2]!==0||this.props[3]!==0||this.props[4]!==0||this.props[5]!==1||this.props[6]!==0||this.props[7]!==0||this.props[8]!==0||this.props[9]!==0||this.props[10]!==1||this.props[11]!==0||this.props[12]!==0||this.props[13]!==0||this.props[14]!==0||this.props[15]!==1),this._identityCalculated=!0),this._identity}function Fe(e0){for(var Yt=0;Yt<16;){if(e0.props[Yt]!==this.props[Yt])return!1;Yt+=1}return!0}function at(e0){var Yt;for(Yt=0;Yt<16;Yt+=1)e0.props[Yt]=this.props[Yt];return e0}function ct(e0){var Yt;for(Yt=0;Yt<16;Yt+=1)this.props[Yt]=e0[Yt]}function xt(e0,Yt,o0){return{x:e0*this.props[0]+Yt*this.props[4]+o0*this.props[8]+this.props[12],y:e0*this.props[1]+Yt*this.props[5]+o0*this.props[9]+this.props[13],z:e0*this.props[2]+Yt*this.props[6]+o0*this.props[10]+this.props[14]}}function Gt(e0,Yt,o0){return e0*this.props[0]+Yt*this.props[4]+o0*this.props[8]+this.props[12]}function Lt(e0,Yt,o0){return e0*this.props[1]+Yt*this.props[5]+o0*this.props[9]+this.props[13]}function Wt(e0,Yt,o0){return e0*this.props[2]+Yt*this.props[6]+o0*this.props[10]+this.props[14]}function Pt(){var e0=this.props[0]*this.props[5]-this.props[1]*this.props[4],Yt=this.props[5]/e0,o0=-this.props[1]/e0,b0=-this.props[4]/e0,f0=this.props[0]/e0,P0=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e0,q0=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e0,G0=new Matrix;return G0.props[0]=Yt,G0.props[1]=o0,G0.props[4]=b0,G0.props[5]=f0,G0.props[12]=P0,G0.props[13]=q0,G0}function Ft(e0){var Yt=this.getInverseMatrix();return Yt.applyToPointArray(e0[0],e0[1],e0[2]||0)}function kt(e0){var Yt,o0=e0.length,b0=[];for(Yt=0;Yt<o0;Yt+=1)b0[Yt]=Ft(e0[Yt]);return b0}function Kt(e0,Yt,o0){var b0=createTypedArray("float32",6);if(this.isIdentity())b0[0]=e0[0],b0[1]=e0[1],b0[2]=Yt[0],b0[3]=Yt[1],b0[4]=o0[0],b0[5]=o0[1];else{var f0=this.props[0],P0=this.props[1],q0=this.props[4],G0=this.props[5],I0=this.props[12],F0=this.props[13];b0[0]=e0[0]*f0+e0[1]*q0+I0,b0[1]=e0[0]*P0+e0[1]*G0+F0,b0[2]=Yt[0]*f0+Yt[1]*q0+I0,b0[3]=Yt[0]*P0+Yt[1]*G0+F0,b0[4]=o0[0]*f0+o0[1]*q0+I0,b0[5]=o0[0]*P0+o0[1]*G0+F0}return b0}function i0(e0,Yt,o0){var b0;return this.isIdentity()?b0=[e0,Yt,o0]:b0=[e0*this.props[0]+Yt*this.props[4]+o0*this.props[8]+this.props[12],e0*this.props[1]+Yt*this.props[5]+o0*this.props[9]+this.props[13],e0*this.props[2]+Yt*this.props[6]+o0*this.props[10]+this.props[14]],b0}function r0(e0,Yt){if(this.isIdentity())return e0+","+Yt;var o0=this.props;return Math.round((e0*o0[0]+Yt*o0[4]+o0[12])*100)/100+","+Math.round((e0*o0[1]+Yt*o0[5]+o0[13])*100)/100}function l0(){for(var e0=0,Yt=this.props,o0="matrix3d(",b0=1e4;e0<16;)o0+=d(Yt[e0]*b0)/b0,o0+=e0===15?")":",",e0+=1;return o0}function n0(e0){var Yt=1e4;return e0<1e-6&&e0>0||e0>-1e-6&&e0<0?d(e0*Yt)/Yt:e0}function Ut(){var e0=this.props,Yt=n0(e0[0]),o0=n0(e0[1]),b0=n0(e0[4]),f0=n0(e0[5]),P0=n0(e0[12]),q0=n0(e0[13]);return"matrix("+Yt+","+o0+","+b0+","+f0+","+P0+","+q0+")"}return function(){this.reset=g,this.rotate=v,this.rotateX=C,this.rotateY=w,this.rotateZ=I,this.skew=ye,this.skewFromAxis=Se,this.shear=O,this.scale=Pe,this.setTransform=Ne,this.translate=ke,this.transform=ht,this.applyToPoint=xt,this.applyToX=Gt,this.applyToY=Lt,this.applyToZ=Wt,this.applyToPointArray=i0,this.applyToTriplePoints=Kt,this.applyToPointStringified=r0,this.toCSS=l0,this.to2dCSS=Ut,this.clone=at,this.cloneFromProps=ct,this.equals=Fe,this.inversePoints=kt,this.inversePoint=Ft,this.getInverseMatrix=Pt,this._t=this.transform,this.isIdentity=He,this._identity=!0,this._identityCalculated=!1,this.props=createTypedArray("float32",16),this.reset()}}();var standalone="__[STANDALONE]__",animationData="__[ANIMATIONDATA]__",renderer="";lottie.play=animationManager.play,lottie.pause=animationManager.pause,lottie.setLocationHref=setLocation,lottie.togglePause=animationManager.togglePause,lottie.setSpeed=animationManager.setSpeed,lottie.setDirection=animationManager.setDirection,lottie.stop=animationManager.stop,lottie.searchAnimations=searchAnimations,lottie.registerAnimation=animationManager.registerAnimation,lottie.loadAnimation=loadAnimation,lottie.setSubframeRendering=setSubframeRendering,lottie.resize=animationManager.resize,lottie.goToAndStop=animationManager.goToAndStop,lottie.destroy=animationManager.destroy,lottie.setQuality=setQuality,lottie.inBrowser=inBrowser,lottie.installPlugin=installPlugin,lottie.freeze=animationManager.freeze,lottie.unfreeze=animationManager.unfreeze,lottie.setVolume=animationManager.setVolume,lottie.mute=animationManager.mute,lottie.unmute=animationManager.unmute,lottie.getRegisteredAnimations=animationManager.getRegisteredAnimations,lottie.useWebWorker=setWebWorker,lottie.setIDPrefix=setPrefix,lottie.__getFactory=getFactory,lottie.version="[[BM_VERSION]]";var queryString="";if(standalone){var scripts=document.getElementsByTagName("script"),index$2=scripts.length-1,myScript=scripts[index$2]||{src:""};queryString=myScript.src?myScript.src.replace(/^[^\?]+\??/,""):"",renderer=getQueryVariable("renderer")}var readyStateCheckInterval=setInterval(checkReady,100);try{!(typeof exports=="object"&&typeof module!="undefined")&&!(typeof define=="function"&&define.amd)&&(window.bodymovin=lottie)}catch(m){}const ShapeModifiers=function(){var m={},t={};m.registerModifier=r,m.getModifier=d;function r(g,v){t[g]||(t[g]=v)}function d(g,v,C){return new t[g](v,C)}return m}();ShapeModifier.prototype.initModifierProperties=function(){},ShapeModifier.prototype.addShapeToModifier=function(){},ShapeModifier.prototype.addShape=function(m){if(!this.closed){m.sh.container.addDynamicProperty(m.sh);var t={shape:m.sh,data:m,localShapeCollection:shapeCollectionPool.newShapeCollection()};this.shapes.push(t),this.addShapeToModifier(t),this._isAnimated&&m.setAsAnimated()}},ShapeModifier.prototype.init=function(m,t){this.shapes=[],this.elem=m,this.initDynamicPropertyContainer(m),this.initModifierProperties(m,t),this.frameId=initialDefaultFrame,this.closed=!1,this.k=!1,this.dynamicProperties.length?this.k=!0:this.getValue(!0)},ShapeModifier.prototype.processKeys=function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties())},extendPrototype([DynamicPropertyContainer],ShapeModifier),extendPrototype([ShapeModifier],TrimModifier),TrimModifier.prototype.initModifierProperties=function(m,t){this.s=PropertyFactory.getProp(m,t.s,0,.01,this),this.e=PropertyFactory.getProp(m,t.e,0,.01,this),this.o=PropertyFactory.getProp(m,t.o,0,0,this),this.sValue=0,this.eValue=0,this.getValue=this.processKeys,this.m=t.m,this._isAnimated=!!this.s.effectsSequence.length||!!this.e.effectsSequence.length||!!this.o.effectsSequence.length},TrimModifier.prototype.addShapeToModifier=function(m){m.pathsData=[]},TrimModifier.prototype.calculateShapeEdges=function(m,t,r,d,g){var v=[];t<=1?v.push({s:m,e:t}):m>=1?v.push({s:m-1,e:t-1}):(v.push({s:m,e:1}),v.push({s:0,e:t-1}));var C=[],w,I=v.length,O;for(w=0;w<I;w+=1)if(O=v[w],!(O.e*g<d||O.s*g>d+r)){var ye,Se;O.s*g<=d?ye=0:ye=(O.s*g-d)/r,O.e*g>=d+r?Se=1:Se=(O.e*g-d)/r,C.push([ye,Se])}return C.length||C.push([0,0]),C},TrimModifier.prototype.releasePathsData=function(m){var t,r=m.length;for(t=0;t<r;t+=1)segmentsLengthPool.release(m[t]);return m.length=0,m},TrimModifier.prototype.processShapes=function(m){var t,r;if(this._mdf||m){var d=this.o.v%360/360;if(d<0&&(d+=1),this.s.v>1?t=1+d:this.s.v<0?t=0+d:t=this.s.v+d,this.e.v>1?r=1+d:this.e.v<0?r=0+d:r=this.e.v+d,t>r){var g=t;t=r,r=g}t=Math.round(t*1e4)*1e-4,r=Math.round(r*1e4)*1e-4,this.sValue=t,this.eValue=r}else t=this.sValue,r=this.eValue;var v,C,w=this.shapes.length,I,O,ye,Se,Pe,Ne=0;if(r===t)for(C=0;C<w;C+=1)this.shapes[C].localShapeCollection.releaseShapes(),this.shapes[C].shape._mdf=!0,this.shapes[C].shape.paths=this.shapes[C].localShapeCollection,this._mdf&&(this.shapes[C].pathsData.length=0);else if(r===1&&t===0||r===0&&t===1){if(this._mdf)for(C=0;C<w;C+=1)this.shapes[C].pathsData.length=0,this.shapes[C].shape._mdf=!0}else{var ke=[],ht,He;for(C=0;C<w;C+=1)if(ht=this.shapes[C],!ht.shape._mdf&&!this._mdf&&!m&&this.m!==2)ht.shape.paths=ht.localShapeCollection;else{if(v=ht.shape.paths,O=v._length,Pe=0,!ht.shape._mdf&&ht.pathsData.length)Pe=ht.totalShapeLength;else{for(ye=this.releasePathsData(ht.pathsData),I=0;I<O;I+=1)Se=bez.getSegmentsLength(v.shapes[I]),ye.push(Se),Pe+=Se.totalLength;ht.totalShapeLength=Pe,ht.pathsData=ye}Ne+=Pe,ht.shape._mdf=!0}var Fe=t,at=r,ct=0,xt;for(C=w-1;C>=0;C-=1)if(ht=this.shapes[C],ht.shape._mdf){for(He=ht.localShapeCollection,He.releaseShapes(),this.m===2&&w>1?(xt=this.calculateShapeEdges(t,r,ht.totalShapeLength,ct,Ne),ct+=ht.totalShapeLength):xt=[[Fe,at]],O=xt.length,I=0;I<O;I+=1){Fe=xt[I][0],at=xt[I][1],ke.length=0,at<=1?ke.push({s:ht.totalShapeLength*Fe,e:ht.totalShapeLength*at}):Fe>=1?ke.push({s:ht.totalShapeLength*(Fe-1),e:ht.totalShapeLength*(at-1)}):(ke.push({s:ht.totalShapeLength*Fe,e:ht.totalShapeLength}),ke.push({s:0,e:ht.totalShapeLength*(at-1)}));var Gt=this.addShapes(ht,ke[0]);if(ke[0].s!==ke[0].e){if(ke.length>1){var Lt=ht.shape.paths.shapes[ht.shape.paths._length-1];if(Lt.c){var Wt=Gt.pop();this.addPaths(Gt,He),Gt=this.addShapes(ht,ke[1],Wt)}else this.addPaths(Gt,He),Gt=this.addShapes(ht,ke[1])}this.addPaths(Gt,He)}}ht.shape.paths=He}}},TrimModifier.prototype.addPaths=function(m,t){var r,d=m.length;for(r=0;r<d;r+=1)t.addShape(m[r])},TrimModifier.prototype.addSegment=function(m,t,r,d,g,v,C){g.setXYAt(t[0],t[1],"o",v),g.setXYAt(r[0],r[1],"i",v+1),C&&g.setXYAt(m[0],m[1],"v",v),g.setXYAt(d[0],d[1],"v",v+1)},TrimModifier.prototype.addSegmentFromArray=function(m,t,r,d){t.setXYAt(m[1],m[5],"o",r),t.setXYAt(m[2],m[6],"i",r+1),d&&t.setXYAt(m[0],m[4],"v",r),t.setXYAt(m[3],m[7],"v",r+1)},TrimModifier.prototype.addShapes=function(m,t,r){var d=m.pathsData,g=m.shape.paths.shapes,v,C=m.shape.paths._length,w,I,O=0,ye,Se,Pe,Ne,ke=[],ht,He=!0;for(r?(Se=r._length,ht=r._length):(r=shapePool.newElement(),Se=0,ht=0),ke.push(r),v=0;v<C;v+=1){for(Pe=d[v].lengths,r.c=g[v].c,I=g[v].c?Pe.length:Pe.length+1,w=1;w<I;w+=1)if(ye=Pe[w-1],O+ye.addedLength<t.s)O+=ye.addedLength,r.c=!1;else if(O>t.e){r.c=!1;break}else t.s<=O&&t.e>=O+ye.addedLength?(this.addSegment(g[v].v[w-1],g[v].o[w-1],g[v].i[w],g[v].v[w],r,Se,He),He=!1):(Ne=bez.getNewSegment(g[v].v[w-1],g[v].v[w],g[v].o[w-1],g[v].i[w],(t.s-O)/ye.addedLength,(t.e-O)/ye.addedLength,Pe[w-1]),this.addSegmentFromArray(Ne,r,Se,He),He=!1,r.c=!1),O+=ye.addedLength,Se+=1;if(g[v].c&&Pe.length){if(ye=Pe[w-1],O<=t.e){var Fe=Pe[w-1].addedLength;t.s<=O&&t.e>=O+Fe?(this.addSegment(g[v].v[w-1],g[v].o[w-1],g[v].i[0],g[v].v[0],r,Se,He),He=!1):(Ne=bez.getNewSegment(g[v].v[w-1],g[v].v[0],g[v].o[w-1],g[v].i[0],(t.s-O)/Fe,(t.e-O)/Fe,Pe[w-1]),this.addSegmentFromArray(Ne,r,Se,He),He=!1,r.c=!1)}else r.c=!1;O+=ye.addedLength,Se+=1}if(r._length&&(r.setXYAt(r.v[ht][0],r.v[ht][1],"i",ht),r.setXYAt(r.v[r._length-1][0],r.v[r._length-1][1],"o",r._length-1)),O>t.e)break;v<C-1&&(r=shapePool.newElement(),He=!0,ke.push(r),Se=0)}return ke},extendPrototype([ShapeModifier],PuckerAndBloatModifier),PuckerAndBloatModifier.prototype.initModifierProperties=function(m,t){this.getValue=this.processKeys,this.amount=PropertyFactory.getProp(m,t.a,0,null,this),this._isAnimated=!!this.amount.effectsSequence.length},PuckerAndBloatModifier.prototype.processPath=function(m,t){var r=t/100,d=[0,0],g=m._length,v=0;for(v=0;v<g;v+=1)d[0]+=m.v[v][0],d[1]+=m.v[v][1];d[0]/=g,d[1]/=g;var C=shapePool.newElement();C.c=m.c;var w,I,O,ye,Se,Pe;for(v=0;v<g;v+=1)w=m.v[v][0]+(d[0]-m.v[v][0])*r,I=m.v[v][1]+(d[1]-m.v[v][1])*r,O=m.o[v][0]+(d[0]-m.o[v][0])*-r,ye=m.o[v][1]+(d[1]-m.o[v][1])*-r,Se=m.i[v][0]+(d[0]-m.i[v][0])*-r,Pe=m.i[v][1]+(d[1]-m.i[v][1])*-r,C.setTripleAt(w,I,O,ye,Se,Pe,v);return C},PuckerAndBloatModifier.prototype.processShapes=function(m){var t,r,d=this.shapes.length,g,v,C=this.amount.v;if(C!==0){var w,I;for(r=0;r<d;r+=1){if(w=this.shapes[r],I=w.localShapeCollection,!(!w.shape._mdf&&!this._mdf&&!m))for(I.releaseShapes(),w.shape._mdf=!0,t=w.shape.paths.shapes,v=w.shape.paths._length,g=0;g<v;g+=1)I.addShape(this.processPath(t[g],C));w.shape.paths=w.localShapeCollection}}this.dynamicProperties.length||(this._mdf=!1)};const TransformPropertyFactory=function(){var m=[0,0];function t(I){var O=this._mdf;this.iterateDynamicProperties(),this._mdf=this._mdf||O,this.a&&I.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&I.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&I.skewFromAxis(-this.sk.v,this.sa.v),this.r?I.rotate(-this.r.v):I.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?I.translate(this.px.v,this.py.v,-this.pz.v):I.translate(this.px.v,this.py.v,0):I.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function r(I){if(this.elem.globalData.frameId!==this.frameId){if(this._isDirty&&(this.precalculateMatrix(),this._isDirty=!1),this.iterateDynamicProperties(),this._mdf||I){var O;if(this.v.cloneFromProps(this.pre.props),this.appliedTransformations<1&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations<2&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.appliedTransformations<3&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r&&this.appliedTransformations<4?this.v.rotate(-this.r.v):!this.r&&this.appliedTransformations<4&&this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented){var ye,Se;if(O=this.elem.globalData.frameRate,this.p&&this.p.keyframes&&this.p.getValueAtTime)this.p._caching.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(ye=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/O,0),Se=this.p.getValueAtTime(this.p.keyframes[0].t/O,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(ye=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/O,0),Se=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.05)/O,0)):(ye=this.p.pv,Se=this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/O,this.p.offsetTime));else if(this.px&&this.px.keyframes&&this.py.keyframes&&this.px.getValueAtTime&&this.py.getValueAtTime){ye=[],Se=[];var Pe=this.px,Ne=this.py;Pe._caching.lastFrame+Pe.offsetTime<=Pe.keyframes[0].t?(ye[0]=Pe.getValueAtTime((Pe.keyframes[0].t+.01)/O,0),ye[1]=Ne.getValueAtTime((Ne.keyframes[0].t+.01)/O,0),Se[0]=Pe.getValueAtTime(Pe.keyframes[0].t/O,0),Se[1]=Ne.getValueAtTime(Ne.keyframes[0].t/O,0)):Pe._caching.lastFrame+Pe.offsetTime>=Pe.keyframes[Pe.keyframes.length-1].t?(ye[0]=Pe.getValueAtTime(Pe.keyframes[Pe.keyframes.length-1].t/O,0),ye[1]=Ne.getValueAtTime(Ne.keyframes[Ne.keyframes.length-1].t/O,0),Se[0]=Pe.getValueAtTime((Pe.keyframes[Pe.keyframes.length-1].t-.01)/O,0),Se[1]=Ne.getValueAtTime((Ne.keyframes[Ne.keyframes.length-1].t-.01)/O,0)):(ye=[Pe.pv,Ne.pv],Se[0]=Pe.getValueAtTime((Pe._caching.lastFrame+Pe.offsetTime-.01)/O,Pe.offsetTime),Se[1]=Ne.getValueAtTime((Ne._caching.lastFrame+Ne.offsetTime-.01)/O,Ne.offsetTime))}else Se=m,ye=Se;this.v.rotate(-Math.atan2(ye[1]-Se[1],ye[0]-Se[0]))}this.data.p&&this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}}function d(){if(!this.a.k)this.pre.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations=1;else return;if(!this.s.effectsSequence.length)this.pre.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.appliedTransformations=2;else return;if(this.sk)if(!this.sk.effectsSequence.length&&!this.sa.effectsSequence.length)this.pre.skewFromAxis(-this.sk.v,this.sa.v),this.appliedTransformations=3;else return;this.r?this.r.effectsSequence.length||(this.pre.rotate(-this.r.v),this.appliedTransformations=4):!this.rz.effectsSequence.length&&!this.ry.effectsSequence.length&&!this.rx.effectsSequence.length&&!this.or.effectsSequence.length&&(this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.appliedTransformations=4)}function g(){}function v(I){this._addDynamicProperty(I),this.elem.addDynamicProperty(I),this._isDirty=!0}function C(I,O,ye){if(this.elem=I,this.frameId=-1,this.propType="transform",this.data=O,this.v=new Matrix,this.pre=new Matrix,this.appliedTransformations=0,this.initDynamicPropertyContainer(ye||I),O.p&&O.p.s?(this.px=PropertyFactory.getProp(I,O.p.x,0,0,this),this.py=PropertyFactory.getProp(I,O.p.y,0,0,this),O.p.z&&(this.pz=PropertyFactory.getProp(I,O.p.z,0,0,this))):this.p=PropertyFactory.getProp(I,O.p||{k:[0,0,0]},1,0,this),O.rx){if(this.rx=PropertyFactory.getProp(I,O.rx,0,degToRads,this),this.ry=PropertyFactory.getProp(I,O.ry,0,degToRads,this),this.rz=PropertyFactory.getProp(I,O.rz,0,degToRads,this),O.or.k[0].ti){var Se,Pe=O.or.k.length;for(Se=0;Se<Pe;Se+=1)O.or.k[Se].to=null,O.or.k[Se].ti=null}this.or=PropertyFactory.getProp(I,O.or,1,degToRads,this),this.or.sh=!0}else this.r=PropertyFactory.getProp(I,O.r||{k:0},0,degToRads,this);O.sk&&(this.sk=PropertyFactory.getProp(I,O.sk,0,degToRads,this),this.sa=PropertyFactory.getProp(I,O.sa,0,degToRads,this)),this.a=PropertyFactory.getProp(I,O.a||{k:[0,0,0]},1,0,this),this.s=PropertyFactory.getProp(I,O.s||{k:[100,100,100]},1,.01,this),O.o?this.o=PropertyFactory.getProp(I,O.o,0,.01,I):this.o={_mdf:!1,v:1},this._isDirty=!0,this.dynamicProperties.length||this.getValue(!0)}C.prototype={applyToMatrix:t,getValue:r,precalculateMatrix:d,autoOrient:g},extendPrototype([DynamicPropertyContainer],C),C.prototype.addDynamicProperty=v,C.prototype._addDynamicProperty=DynamicPropertyContainer.prototype.addDynamicProperty;function w(I,O,ye){return new C(I,O,ye)}return{getTransformProperty:w}}();extendPrototype([ShapeModifier],RepeaterModifier),RepeaterModifier.prototype.initModifierProperties=function(m,t){this.getValue=this.processKeys,this.c=PropertyFactory.getProp(m,t.c,0,null,this),this.o=PropertyFactory.getProp(m,t.o,0,null,this),this.tr=TransformPropertyFactory.getTransformProperty(m,t.tr,this),this.so=PropertyFactory.getProp(m,t.tr.so,0,.01,this),this.eo=PropertyFactory.getProp(m,t.tr.eo,0,.01,this),this.data=t,this.dynamicProperties.length||this.getValue(!0),this._isAnimated=!!this.dynamicProperties.length,this.pMatrix=new Matrix,this.rMatrix=new Matrix,this.sMatrix=new Matrix,this.tMatrix=new Matrix,this.matrix=new Matrix},RepeaterModifier.prototype.applyTransforms=function(m,t,r,d,g,v){var C=v?-1:1,w=d.s.v[0]+(1-d.s.v[0])*(1-g),I=d.s.v[1]+(1-d.s.v[1])*(1-g);m.translate(d.p.v[0]*C*g,d.p.v[1]*C*g,d.p.v[2]),t.translate(-d.a.v[0],-d.a.v[1],d.a.v[2]),t.rotate(-d.r.v*C*g),t.translate(d.a.v[0],d.a.v[1],d.a.v[2]),r.translate(-d.a.v[0],-d.a.v[1],d.a.v[2]),r.scale(v?1/w:w,v?1/I:I),r.translate(d.a.v[0],d.a.v[1],d.a.v[2])},RepeaterModifier.prototype.init=function(m,t,r,d){for(this.elem=m,this.arr=t,this.pos=r,this.elemsData=d,this._currentCopies=0,this._elements=[],this._groups=[],this.frameId=-1,this.initDynamicPropertyContainer(m),this.initModifierProperties(m,t[r]);r>0;)r-=1,this._elements.unshift(t[r]);this.dynamicProperties.length?this.k=!0:this.getValue(!0)},RepeaterModifier.prototype.resetElements=function(m){var t,r=m.length;for(t=0;t<r;t+=1)m[t]._processed=!1,m[t].ty==="gr"&&this.resetElements(m[t].it)},RepeaterModifier.prototype.cloneElements=function(m){var t=JSON.parse(JSON.stringify(m));return this.resetElements(t),t},RepeaterModifier.prototype.changeGroupRender=function(m,t){var r,d=m.length;for(r=0;r<d;r+=1)m[r]._render=t,m[r].ty==="gr"&&this.changeGroupRender(m[r].it,t)},RepeaterModifier.prototype.processShapes=function(m){var t,r,d,g,v,C=!1;if(this._mdf||m){var w=Math.ceil(this.c.v);if(this._groups.length<w){for(;this._groups.length<w;){var I={it:this.cloneElements(this._elements),ty:"gr"};I.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:1,ix:6,k:[{s:0,e:0,t:0},{s:0,e:0,t:1}]},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,I),this._groups.splice(0,0,I),this._currentCopies+=1}this.elem.reloadShapes(),C=!0}v=0;var O;for(d=0;d<=this._groups.length-1;d+=1){if(O=v<w,this._groups[d]._render=O,this.changeGroupRender(this._groups[d].it,O),!O){var ye=this.elemsData[d].it,Se=ye[ye.length-1];Se.transform.op.v!==0?(Se.transform.op._mdf=!0,Se.transform.op.v=0):Se.transform.op._mdf=!1}v+=1}this._currentCopies=w;var Pe=this.o.v,Ne=Pe%1,ke=Pe>0?Math.floor(Pe):Math.ceil(Pe),ht=this.pMatrix.props,He=this.rMatrix.props,Fe=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var at=0;if(Pe>0){for(;at<ke;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),at+=1;Ne&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,Ne,!1),at+=Ne)}else if(Pe<0){for(;at>ke;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),at-=1;Ne&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-Ne,!0),at-=Ne)}d=this.data.m===1?0:this._currentCopies-1,g=this.data.m===1?1:-1,v=this._currentCopies;for(var ct,xt;v;){if(t=this.elemsData[d].it,r=t[t.length-1].transform.mProps.v.props,xt=r.length,t[t.length-1].transform.mProps._mdf=!0,t[t.length-1].transform.op._mdf=!0,t[t.length-1].transform.op.v=this._currentCopies===1?this.so.v:this.so.v+(this.eo.v-this.so.v)*(d/(this._currentCopies-1)),at!==0){for((d!==0&&g===1||d!==this._currentCopies-1&&g===-1)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(He[0],He[1],He[2],He[3],He[4],He[5],He[6],He[7],He[8],He[9],He[10],He[11],He[12],He[13],He[14],He[15]),this.matrix.transform(Fe[0],Fe[1],Fe[2],Fe[3],Fe[4],Fe[5],Fe[6],Fe[7],Fe[8],Fe[9],Fe[10],Fe[11],Fe[12],Fe[13],Fe[14],Fe[15]),this.matrix.transform(ht[0],ht[1],ht[2],ht[3],ht[4],ht[5],ht[6],ht[7],ht[8],ht[9],ht[10],ht[11],ht[12],ht[13],ht[14],ht[15]),ct=0;ct<xt;ct+=1)r[ct]=this.matrix.props[ct];this.matrix.reset()}else for(this.matrix.reset(),ct=0;ct<xt;ct+=1)r[ct]=this.matrix.props[ct];at+=1,v-=1,d+=g}}else for(v=this._currentCopies,d=0,g=1;v;)t=this.elemsData[d].it,r=t[t.length-1].transform.mProps.v.props,t[t.length-1].transform.mProps._mdf=!1,t[t.length-1].transform.op._mdf=!1,v-=1,d+=g;return C},RepeaterModifier.prototype.addShape=function(){},extendPrototype([ShapeModifier],RoundCornersModifier),RoundCornersModifier.prototype.initModifierProperties=function(m,t){this.getValue=this.processKeys,this.rd=PropertyFactory.getProp(m,t.r,0,null,this),this._isAnimated=!!this.rd.effectsSequence.length},RoundCornersModifier.prototype.processPath=function(m,t){var r=shapePool.newElement();r.c=m.c;var d,g=m._length,v,C,w,I,O,ye,Se=0,Pe,Ne,ke,ht,He,Fe;for(d=0;d<g;d+=1)v=m.v[d],w=m.o[d],C=m.i[d],v[0]===w[0]&&v[1]===w[1]&&v[0]===C[0]&&v[1]===C[1]?(d===0||d===g-1)&&!m.c?(r.setTripleAt(v[0],v[1],w[0],w[1],C[0],C[1],Se),Se+=1):(d===0?I=m.v[g-1]:I=m.v[d-1],O=Math.sqrt(Math.pow(v[0]-I[0],2)+Math.pow(v[1]-I[1],2)),ye=O?Math.min(O/2,t)/O:0,He=v[0]+(I[0]-v[0])*ye,Pe=He,Fe=v[1]-(v[1]-I[1])*ye,Ne=Fe,ke=Pe-(Pe-v[0])*roundCorner,ht=Ne-(Ne-v[1])*roundCorner,r.setTripleAt(Pe,Ne,ke,ht,He,Fe,Se),Se+=1,d===g-1?I=m.v[0]:I=m.v[d+1],O=Math.sqrt(Math.pow(v[0]-I[0],2)+Math.pow(v[1]-I[1],2)),ye=O?Math.min(O/2,t)/O:0,ke=v[0]+(I[0]-v[0])*ye,Pe=ke,ht=v[1]+(I[1]-v[1])*ye,Ne=ht,He=Pe-(Pe-v[0])*roundCorner,Fe=Ne-(Ne-v[1])*roundCorner,r.setTripleAt(Pe,Ne,ke,ht,He,Fe,Se),Se+=1):(r.setTripleAt(m.v[d][0],m.v[d][1],m.o[d][0],m.o[d][1],m.i[d][0],m.i[d][1],Se),Se+=1);return r},RoundCornersModifier.prototype.processShapes=function(m){var t,r,d=this.shapes.length,g,v,C=this.rd.v;if(C!==0){var w,I;for(r=0;r<d;r+=1){if(w=this.shapes[r],I=w.localShapeCollection,!(!w.shape._mdf&&!this._mdf&&!m))for(I.releaseShapes(),w.shape._mdf=!0,t=w.shape.paths.shapes,v=w.shape.paths._length,g=0;g<v;g+=1)I.addShape(this.processPath(t[g],C));w.shape.paths=w.localShapeCollection}}this.dynamicProperties.length||(this._mdf=!1)};const FontManager=function(){var m=5e3,t={w:0,size:0,shapes:[],data:{shapes:[]}},r=[];r=r.concat([2304,2305,2306,2307,2362,2363,2364,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2387,2388,2389,2390,2391,2402,2403]);var d=["d83cdffb","d83cdffc","d83cdffd","d83cdffe","d83cdfff"],g=[65039,8205];function v(xt){var Gt=xt.split(","),Lt,Wt=Gt.length,Pt=[];for(Lt=0;Lt<Wt;Lt+=1)Gt[Lt]!=="sans-serif"&&Gt[Lt]!=="monospace"&&Pt.push(Gt[Lt]);return Pt.join(",")}function C(xt,Gt){var Lt=createTag("span");Lt.setAttribute("aria-hidden",!0),Lt.style.fontFamily=Gt;var Wt=createTag("span");Wt.innerText="giItT1WQy@!-/#",Lt.style.position="absolute",Lt.style.left="-10000px",Lt.style.top="-10000px",Lt.style.fontSize="300px",Lt.style.fontVariant="normal",Lt.style.fontStyle="normal",Lt.style.fontWeight="normal",Lt.style.letterSpacing="0",Lt.appendChild(Wt),document.body.appendChild(Lt);var Pt=Wt.offsetWidth;return Wt.style.fontFamily=v(xt)+", "+Gt,{node:Wt,w:Pt,parent:Lt}}function w(){var xt,Gt=this.fonts.length,Lt,Wt,Pt=Gt;for(xt=0;xt<Gt;xt+=1)this.fonts[xt].loaded?Pt-=1:this.fonts[xt].fOrigin==="n"||this.fonts[xt].origin===0?this.fonts[xt].loaded=!0:(Lt=this.fonts[xt].monoCase.node,Wt=this.fonts[xt].monoCase.w,Lt.offsetWidth!==Wt?(Pt-=1,this.fonts[xt].loaded=!0):(Lt=this.fonts[xt].sansCase.node,Wt=this.fonts[xt].sansCase.w,Lt.offsetWidth!==Wt&&(Pt-=1,this.fonts[xt].loaded=!0)),this.fonts[xt].loaded&&(this.fonts[xt].sansCase.parent.parentNode.removeChild(this.fonts[xt].sansCase.parent),this.fonts[xt].monoCase.parent.parentNode.removeChild(this.fonts[xt].monoCase.parent)));Pt!==0&&Date.now()-this.initTime<m?setTimeout(this.checkLoadedFontsBinded,20):setTimeout(this.setIsLoadedBinded,10)}function I(xt,Gt){var Lt=document.body&&Gt?"svg":"canvas",Wt,Pt=getFontProperties(xt);if(Lt==="svg"){var Ft=createNS("text");Ft.style.fontSize="100px",Ft.setAttribute("font-family",xt.fFamily),Ft.setAttribute("font-style",Pt.style),Ft.setAttribute("font-weight",Pt.weight),Ft.textContent="1",xt.fClass?(Ft.style.fontFamily="inherit",Ft.setAttribute("class",xt.fClass)):Ft.style.fontFamily=xt.fFamily,Gt.appendChild(Ft),Wt=Ft}else{var kt=new OffscreenCanvas(500,500).getContext("2d");kt.font=Pt.style+" "+Pt.weight+" 100px "+xt.fFamily,Wt=kt}function Kt(i0){return Lt==="svg"?(Wt.textContent=i0,Wt.getComputedTextLength()):Wt.measureText(i0).width}return{measureText:Kt}}function O(xt,Gt){if(!xt){this.isLoaded=!0;return}if(this.chars){this.isLoaded=!0,this.fonts=xt.list;return}if(!document.body){this.isLoaded=!0,xt.list.forEach(Ut=>{Ut.helper=I(Ut),Ut.cache={}}),this.fonts=xt.list;return}var Lt=xt.list,Wt,Pt=Lt.length,Ft=Pt;for(Wt=0;Wt<Pt;Wt+=1){var kt=!0,Kt,i0;if(Lt[Wt].loaded=!1,Lt[Wt].monoCase=C(Lt[Wt].fFamily,"monospace"),Lt[Wt].sansCase=C(Lt[Wt].fFamily,"sans-serif"),!Lt[Wt].fPath)Lt[Wt].loaded=!0,Ft-=1;else if(Lt[Wt].fOrigin==="p"||Lt[Wt].origin===3){if(Kt=document.querySelectorAll('style[f-forigin="p"][f-family="'+Lt[Wt].fFamily+'"], style[f-origin="3"][f-family="'+Lt[Wt].fFamily+'"]'),Kt.length>0&&(kt=!1),kt){var r0=createTag("style");r0.setAttribute("f-forigin",Lt[Wt].fOrigin),r0.setAttribute("f-origin",Lt[Wt].origin),r0.setAttribute("f-family",Lt[Wt].fFamily),r0.type="text/css",r0.innerText="@font-face {font-family: "+Lt[Wt].fFamily+"; font-style: normal; src: url('"+Lt[Wt].fPath+"');}",Gt.appendChild(r0)}}else if(Lt[Wt].fOrigin==="g"||Lt[Wt].origin===1){for(Kt=document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'),i0=0;i0<Kt.length;i0+=1)Kt[i0].href.indexOf(Lt[Wt].fPath)!==-1&&(kt=!1);if(kt){var l0=createTag("link");l0.setAttribute("f-forigin",Lt[Wt].fOrigin),l0.setAttribute("f-origin",Lt[Wt].origin),l0.type="text/css",l0.rel="stylesheet",l0.href=Lt[Wt].fPath,document.body.appendChild(l0)}}else if(Lt[Wt].fOrigin==="t"||Lt[Wt].origin===2){for(Kt=document.querySelectorAll('script[f-forigin="t"], script[f-origin="2"]'),i0=0;i0<Kt.length;i0+=1)Lt[Wt].fPath===Kt[i0].src&&(kt=!1);if(kt){var n0=createTag("link");n0.setAttribute("f-forigin",Lt[Wt].fOrigin),n0.setAttribute("f-origin",Lt[Wt].origin),n0.setAttribute("rel","stylesheet"),n0.setAttribute("href",Lt[Wt].fPath),Gt.appendChild(n0)}}Lt[Wt].helper=I(Lt[Wt],Gt),Lt[Wt].cache={},this.fonts.push(Lt[Wt])}Ft===0?this.isLoaded=!0:setTimeout(this.checkLoadedFonts.bind(this),100)}function ye(xt){if(xt){this.chars||(this.chars=[]);var Gt,Lt=xt.length,Wt,Pt=this.chars.length,Ft;for(Gt=0;Gt<Lt;Gt+=1){for(Wt=0,Ft=!1;Wt<Pt;)this.chars[Wt].style===xt[Gt].style&&this.chars[Wt].fFamily===xt[Gt].fFamily&&this.chars[Wt].ch===xt[Gt].ch&&(Ft=!0),Wt+=1;Ft||(this.chars.push(xt[Gt]),Pt+=1)}}}function Se(xt,Gt,Lt){for(var Wt=0,Pt=this.chars.length;Wt<Pt;){if(this.chars[Wt].ch===xt&&this.chars[Wt].style===Gt&&this.chars[Wt].fFamily===Lt)return this.chars[Wt];Wt+=1}return(typeof xt=="string"&&xt.charCodeAt(0)!==13||!xt)&&console&&console.warn&&!this._warned&&(this._warned=!0,console.warn("Missing character from exported characters list: ",xt,Gt,Lt)),t}function Pe(xt,Gt,Lt){var Wt=this.getFontByName(Gt),Pt=xt.charCodeAt(0);if(!Wt.cache[Pt+1]){var Ft=Wt.helper;if(xt===" "){var kt=Ft.measureText("|"+xt+"|"),Kt=Ft.measureText("||");Wt.cache[Pt+1]=(kt-Kt)/100}else Wt.cache[Pt+1]=Ft.measureText(xt)/100}return Wt.cache[Pt+1]*Lt}function Ne(xt){for(var Gt=0,Lt=this.fonts.length;Gt<Lt;){if(this.fonts[Gt].fName===xt)return this.fonts[Gt];Gt+=1}return this.fonts[0]}function ke(xt,Gt){var Lt=xt.toString(16)+Gt.toString(16);return d.indexOf(Lt)!==-1}function ht(xt,Gt){return Gt?xt===g[0]&&Gt===g[1]:xt===g[1]}function He(xt){return r.indexOf(xt)!==-1}function Fe(){this.isLoaded=!0}var at=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this._warned=!1,this.initTime=Date.now(),this.setIsLoadedBinded=this.setIsLoaded.bind(this),this.checkLoadedFontsBinded=this.checkLoadedFonts.bind(this)};at.isModifier=ke,at.isZeroWidthJoiner=ht,at.isCombinedCharacter=He;var ct={addChars:ye,addFonts:O,getCharData:Se,getFontByName:Ne,measureText:Pe,checkLoadedFonts:w,setIsLoaded:Fe};return at.prototype=ct,at}();RenderableElement.prototype={initRenderable:function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1,this.renderableComponents=[]},addRenderableComponent:function(m){this.renderableComponents.indexOf(m)===-1&&this.renderableComponents.push(m)},removeRenderableComponent:function(m){this.renderableComponents.indexOf(m)!==-1&&this.renderableComponents.splice(this.renderableComponents.indexOf(m),1)},prepareRenderableFrame:function(m){this.checkLayerLimits(m)},checkTransparency:function(){this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this.globalData.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},checkLayerLimits:function(m){this.data.ip-this.data.st<=m&&this.data.op-this.data.st>m?this.isInRange!==!0&&(this.globalData._mdf=!0,this._mdf=!0,this.isInRange=!0,this.show()):this.isInRange!==!1&&(this.globalData._mdf=!0,this.isInRange=!1,this.hide())},renderRenderable:function(){var m,t=this.renderableComponents.length;for(m=0;m<t;m+=1)this.renderableComponents[m].renderFrame(this._isFirstFrame)},sourceRectAtTime:function(){return{top:0,left:0,width:100,height:100}},getLayerSize:function(){return this.data.ty===5?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}}};const MaskManagerInterface=function(){function m(r,d){this._mask=r,this._data=d}Object.defineProperty(m.prototype,"maskPath",{get:function(){return this._mask.prop.k&&this._mask.prop.getValue(),this._mask.prop}}),Object.defineProperty(m.prototype,"maskOpacity",{get:function(){return this._mask.op.k&&this._mask.op.getValue(),this._mask.op.v*100}});var t=function(r){var d=createSizedArray(r.viewData.length),g,v=r.viewData.length;for(g=0;g<v;g+=1)d[g]=new m(r.viewData[g],r.masksProperties[g]);var C=function(w){for(g=0;g<v;){if(r.masksProperties[g].nm===w)return d[g];g+=1}return null};return C};return t}(),ExpressionPropertyInterface=function(){var m={pv:0,v:0,mult:1},t={pv:[0,0,0],v:[0,0,0],mult:1};function r(C,w,I){Object.defineProperty(C,"velocity",{get:function(){return w.getVelocityAtTime(w.comp.currentFrame)}}),C.numKeys=w.keyframes?w.keyframes.length:0,C.key=function(O){if(!C.numKeys)return 0;var ye="";"s"in w.keyframes[O-1]?ye=w.keyframes[O-1].s:"e"in w.keyframes[O-2]?ye=w.keyframes[O-2].e:ye=w.keyframes[O-2].s;var Se=I==="unidimensional"?new Number(ye):Object.assign({},ye);return Se.time=w.keyframes[O-1].t/w.elem.comp.globalData.frameRate,Se.value=I==="unidimensional"?ye[0]:ye,Se},C.valueAtTime=w.getValueAtTime,C.speedAtTime=w.getSpeedAtTime,C.velocityAtTime=w.getVelocityAtTime,C.propertyGroup=w.propertyGroup}function d(C){(!C||!("pv"in C))&&(C=m);var w=1/C.mult,I=C.pv*w,O=new Number(I);return O.value=I,r(O,C,"unidimensional"),function(){return C.k&&C.getValue(),I=C.v*w,O.value!==I&&(O=new Number(I),O.value=I,r(O,C,"unidimensional")),O}}function g(C){(!C||!("pv"in C))&&(C=t);var w=1/C.mult,I=C.data&&C.data.l||C.pv.length,O=createTypedArray("float32",I),ye=createTypedArray("float32",I);return O.value=ye,r(O,C,"multidimensional"),function(){C.k&&C.getValue();for(var Se=0;Se<I;Se+=1)ye[Se]=C.v[Se]*w,O[Se]=ye[Se];return O}}function v(){return m}return function(C){return C?C.propType==="unidimensional"?d(C):g(C):v}}(),TransformExpressionInterface=function(){return function(m){function t(C){switch(C){case"scale":case"Scale":case"ADBE Scale":case 6:return t.scale;case"rotation":case"Rotation":case"ADBE Rotation":case"ADBE Rotate Z":case 10:return t.rotation;case"ADBE Rotate X":return t.xRotation;case"ADBE Rotate Y":return t.yRotation;case"position":case"Position":case"ADBE Position":case 2:return t.position;case"ADBE Position_0":return t.xPosition;case"ADBE Position_1":return t.yPosition;case"ADBE Position_2":return t.zPosition;case"anchorPoint":case"AnchorPoint":case"Anchor Point":case"ADBE AnchorPoint":case 1:return t.anchorPoint;case"opacity":case"Opacity":case 11:return t.opacity;default:return null}}Object.defineProperty(t,"rotation",{get:ExpressionPropertyInterface(m.r||m.rz)}),Object.defineProperty(t,"zRotation",{get:ExpressionPropertyInterface(m.rz||m.r)}),Object.defineProperty(t,"xRotation",{get:ExpressionPropertyInterface(m.rx)}),Object.defineProperty(t,"yRotation",{get:ExpressionPropertyInterface(m.ry)}),Object.defineProperty(t,"scale",{get:ExpressionPropertyInterface(m.s)});var r,d,g,v;return m.p?v=ExpressionPropertyInterface(m.p):(r=ExpressionPropertyInterface(m.px),d=ExpressionPropertyInterface(m.py),m.pz&&(g=ExpressionPropertyInterface(m.pz))),Object.defineProperty(t,"position",{get:function(){return m.p?v():[r(),d(),g?g():0]}}),Object.defineProperty(t,"xPosition",{get:ExpressionPropertyInterface(m.px)}),Object.defineProperty(t,"yPosition",{get:ExpressionPropertyInterface(m.py)}),Object.defineProperty(t,"zPosition",{get:ExpressionPropertyInterface(m.pz)}),Object.defineProperty(t,"anchorPoint",{get:ExpressionPropertyInterface(m.a)}),Object.defineProperty(t,"opacity",{get:ExpressionPropertyInterface(m.o)}),Object.defineProperty(t,"skew",{get:ExpressionPropertyInterface(m.sk)}),Object.defineProperty(t,"skewAxis",{get:ExpressionPropertyInterface(m.sa)}),Object.defineProperty(t,"orientation",{get:ExpressionPropertyInterface(m.or)}),t}}(),LayerExpressionInterface=function(){function m(O){var ye=new Matrix;if(O!==void 0){var Se=this._elem.finalTransform.mProp.getValueAtTime(O);Se.clone(ye)}else{var Pe=this._elem.finalTransform.mProp;Pe.applyToMatrix(ye)}return ye}function t(O,ye){var Se=this.getMatrix(ye);return Se.props[12]=0,Se.props[13]=0,Se.props[14]=0,this.applyPoint(Se,O)}function r(O,ye){var Se=this.getMatrix(ye);return this.applyPoint(Se,O)}function d(O,ye){var Se=this.getMatrix(ye);return Se.props[12]=0,Se.props[13]=0,Se.props[14]=0,this.invertPoint(Se,O)}function g(O,ye){var Se=this.getMatrix(ye);return this.invertPoint(Se,O)}function v(O,ye){if(this._elem.hierarchy&&this._elem.hierarchy.length){var Se,Pe=this._elem.hierarchy.length;for(Se=0;Se<Pe;Se+=1)this._elem.hierarchy[Se].finalTransform.mProp.applyToMatrix(O)}return O.applyToPointArray(ye[0],ye[1],ye[2]||0)}function C(O,ye){if(this._elem.hierarchy&&this._elem.hierarchy.length){var Se,Pe=this._elem.hierarchy.length;for(Se=0;Se<Pe;Se+=1)this._elem.hierarchy[Se].finalTransform.mProp.applyToMatrix(O)}return O.inversePoint(ye)}function w(O){var ye=new Matrix;if(ye.reset(),this._elem.finalTransform.mProp.applyToMatrix(ye),this._elem.hierarchy&&this._elem.hierarchy.length){var Se,Pe=this._elem.hierarchy.length;for(Se=0;Se<Pe;Se+=1)this._elem.hierarchy[Se].finalTransform.mProp.applyToMatrix(ye);return ye.inversePoint(O)}return ye.inversePoint(O)}function I(){return[1,1,1,1]}return function(O){var ye;function Se(ht){Ne.mask=new MaskManagerInterface(ht,O)}function Pe(ht){Ne.effect=ht}function Ne(ht){switch(ht){case"ADBE Root Vectors Group":case"Contents":case 2:return Ne.shapeInterface;case 1:case 6:case"Transform":case"transform":case"ADBE Transform Group":return ye;case 4:case"ADBE Effect Parade":case"effects":case"Effects":return Ne.effect;case"ADBE Text Properties":return Ne.textInterface;default:return null}}Ne.getMatrix=m,Ne.invertPoint=C,Ne.applyPoint=v,Ne.toWorld=r,Ne.toWorldVec=t,Ne.fromWorld=g,Ne.fromWorldVec=d,Ne.toComp=r,Ne.fromComp=w,Ne.sampleImage=I,Ne.sourceRectAtTime=O.sourceRectAtTime.bind(O),Ne._elem=O,ye=TransformExpressionInterface(O.finalTransform.mProp);var ke=getDescriptor(ye,"anchorPoint");return Object.defineProperties(Ne,{hasParent:{get:function(){return O.hierarchy.length}},parent:{get:function(){return O.hierarchy[0].layerInterface}},rotation:getDescriptor(ye,"rotation"),scale:getDescriptor(ye,"scale"),position:getDescriptor(ye,"position"),opacity:getDescriptor(ye,"opacity"),anchorPoint:ke,anchor_point:ke,transform:{get:function(){return ye}},active:{get:function(){return O.isInRange}}}),Ne.startTime=O.data.st,Ne.index=O.data.ind,Ne.source=O.data.refId,Ne.height=O.data.ty===0?O.data.h:100,Ne.width=O.data.ty===0?O.data.w:100,Ne.inPoint=O.data.ip/O.comp.globalData.frameRate,Ne.outPoint=O.data.op/O.comp.globalData.frameRate,Ne._name=O.data.nm,Ne.registerMaskInterface=Se,Ne.registerEffectsInterface=Pe,Ne}}(),propertyGroupFactory=function(){return function(m,t){return function(r){return r=r===void 0?1:r,r<=0?m:t(r-1)}}}(),PropertyInterface=function(){return function(m,t){var r={_name:m};function d(g){return g=g===void 0?1:g,g<=0?r:t(g-1)}return d}}(),EffectsExpressionInterface=function(){var m={createEffectsInterface:t};function t(g,v){if(g.effectsManager){var C=[],w=g.data.ef,I,O=g.effectsManager.effectElements.length;for(I=0;I<O;I+=1)C.push(r(w[I],g.effectsManager.effectElements[I],v,g));var ye=g.data.ef||[],Se=function(Pe){for(I=0,O=ye.length;I<O;){if(Pe===ye[I].nm||Pe===ye[I].mn||Pe===ye[I].ix)return C[I];I+=1}return null};return Object.defineProperty(Se,"numProperties",{get:function(){return ye.length}}),Se}return null}function r(g,v,C,w){function I(Ne){for(var ke=g.ef,ht=0,He=ke.length;ht<He;){if(Ne===ke[ht].nm||Ne===ke[ht].mn||Ne===ke[ht].ix)return ke[ht].ty===5?ye[ht]:ye[ht]();ht+=1}throw new Error}var O=propertyGroupFactory(I,C),ye=[],Se,Pe=g.ef.length;for(Se=0;Se<Pe;Se+=1)g.ef[Se].ty===5?ye.push(r(g.ef[Se],v.effectElements[Se],v.effectElements[Se].propertyGroup,w)):ye.push(d(v.effectElements[Se],g.ef[Se].ty,w,O));return g.mn==="ADBE Color Control"&&Object.defineProperty(I,"color",{get:function(){return ye[0]()}}),Object.defineProperties(I,{numProperties:{get:function(){return g.np}},_name:{value:g.nm},propertyGroup:{value:O}}),I.enabled=g.en!==0,I.active=I.enabled,I}function d(g,v,C,w){var I=ExpressionPropertyInterface(g.p);function O(){return v===10?C.comp.compInterface(g.p.v):I()}return g.p.setGroupProperty&&g.p.setGroupProperty(PropertyInterface("",w)),O}return m}(),CompExpressionInterface=function(){return function(m){function t(r){for(var d=0,g=m.layers.length;d<g;){if(m.layers[d].nm===r||m.layers[d].ind===r)return m.elements[d].layerInterface;d+=1}return null}return Object.defineProperty(t,"_name",{value:m.data.nm}),t.layer=t,t.pixelAspect=1,t.height=m.data.h||m.globalData.compSize.h,t.width=m.data.w||m.globalData.compSize.w,t.pixelAspect=1,t.frameDuration=1/m.globalData.frameRate,t.displayStartTime=0,t.numLayers=m.layers.length,t}}(),ShapePathInterface=function(){return function(t,r,d){var g=r.sh;function v(w){return w==="Shape"||w==="shape"||w==="Path"||w==="path"||w==="ADBE Vector Shape"||w===2?v.path:null}var C=propertyGroupFactory(v,d);return g.setGroupProperty(PropertyInterface("Path",C)),Object.defineProperties(v,{path:{get:function(){return g.k&&g.getValue(),g}},shape:{get:function(){return g.k&&g.getValue(),g}},_name:{value:t.nm},ix:{value:t.ix},propertyIndex:{value:t.ix},mn:{value:t.mn},propertyGroup:{value:d}}),v}}(),ShapeExpressionInterface=function(){function m(ke,ht,He){var Fe=[],at,ct=ke?ke.length:0;for(at=0;at<ct;at+=1)ke[at].ty==="gr"?Fe.push(r(ke[at],ht[at],He)):ke[at].ty==="fl"?Fe.push(d(ke[at],ht[at],He)):ke[at].ty==="st"?Fe.push(C(ke[at],ht[at],He)):ke[at].ty==="tm"?Fe.push(w(ke[at],ht[at],He)):ke[at].ty==="tr"||(ke[at].ty==="el"?Fe.push(O(ke[at],ht[at],He)):ke[at].ty==="sr"?Fe.push(ye(ke[at],ht[at],He)):ke[at].ty==="sh"?Fe.push(ShapePathInterface(ke[at],ht[at],He)):ke[at].ty==="rc"?Fe.push(Se(ke[at],ht[at],He)):ke[at].ty==="rd"?Fe.push(Pe(ke[at],ht[at],He)):ke[at].ty==="rp"?Fe.push(Ne(ke[at],ht[at],He)):ke[at].ty==="gf"?Fe.push(g(ke[at],ht[at],He)):Fe.push(v(ke[at],ht[at])));return Fe}function t(ke,ht,He){var Fe,at=function(Gt){for(var Lt=0,Wt=Fe.length;Lt<Wt;){if(Fe[Lt]._name===Gt||Fe[Lt].mn===Gt||Fe[Lt].propertyIndex===Gt||Fe[Lt].ix===Gt||Fe[Lt].ind===Gt)return Fe[Lt];Lt+=1}return typeof Gt=="number"?Fe[Gt-1]:null};at.propertyGroup=propertyGroupFactory(at,He),Fe=m(ke.it,ht.it,at.propertyGroup),at.numProperties=Fe.length;var ct=I(ke.it[ke.it.length-1],ht.it[ht.it.length-1],at.propertyGroup);return at.transform=ct,at.propertyIndex=ke.cix,at._name=ke.nm,at}function r(ke,ht,He){var Fe=function(Gt){switch(Gt){case"ADBE Vectors Group":case"Contents":case 2:return Fe.content;default:return Fe.transform}};Fe.propertyGroup=propertyGroupFactory(Fe,He);var at=t(ke,ht,Fe.propertyGroup),ct=I(ke.it[ke.it.length-1],ht.it[ht.it.length-1],Fe.propertyGroup);return Fe.content=at,Fe.transform=ct,Object.defineProperty(Fe,"_name",{get:function(){return ke.nm}}),Fe.numProperties=ke.np,Fe.propertyIndex=ke.ix,Fe.nm=ke.nm,Fe.mn=ke.mn,Fe}function d(ke,ht,He){function Fe(at){return at==="Color"||at==="color"?Fe.color:at==="Opacity"||at==="opacity"?Fe.opacity:null}return Object.defineProperties(Fe,{color:{get:ExpressionPropertyInterface(ht.c)},opacity:{get:ExpressionPropertyInterface(ht.o)},_name:{value:ke.nm},mn:{value:ke.mn}}),ht.c.setGroupProperty(PropertyInterface("Color",He)),ht.o.setGroupProperty(PropertyInterface("Opacity",He)),Fe}function g(ke,ht,He){function Fe(at){return at==="Start Point"||at==="start point"?Fe.startPoint:at==="End Point"||at==="end point"?Fe.endPoint:at==="Opacity"||at==="opacity"?Fe.opacity:null}return Object.defineProperties(Fe,{startPoint:{get:ExpressionPropertyInterface(ht.s)},endPoint:{get:ExpressionPropertyInterface(ht.e)},opacity:{get:ExpressionPropertyInterface(ht.o)},type:{get:function(){return"a"}},_name:{value:ke.nm},mn:{value:ke.mn}}),ht.s.setGroupProperty(PropertyInterface("Start Point",He)),ht.e.setGroupProperty(PropertyInterface("End Point",He)),ht.o.setGroupProperty(PropertyInterface("Opacity",He)),Fe}function v(){function ke(){return null}return ke}function C(ke,ht,He){var Fe=propertyGroupFactory(Wt,He),at=propertyGroupFactory(Lt,Fe);function ct(Pt){Object.defineProperty(Lt,ke.d[Pt].nm,{get:ExpressionPropertyInterface(ht.d.dataProps[Pt].p)})}var xt,Gt=ke.d?ke.d.length:0,Lt={};for(xt=0;xt<Gt;xt+=1)ct(xt),ht.d.dataProps[xt].p.setGroupProperty(at);function Wt(Pt){return Pt==="Color"||Pt==="color"?Wt.color:Pt==="Opacity"||Pt==="opacity"?Wt.opacity:Pt==="Stroke Width"||Pt==="stroke width"?Wt.strokeWidth:null}return Object.defineProperties(Wt,{color:{get:ExpressionPropertyInterface(ht.c)},opacity:{get:ExpressionPropertyInterface(ht.o)},strokeWidth:{get:ExpressionPropertyInterface(ht.w)},dash:{get:function(){return Lt}},_name:{value:ke.nm},mn:{value:ke.mn}}),ht.c.setGroupProperty(PropertyInterface("Color",Fe)),ht.o.setGroupProperty(PropertyInterface("Opacity",Fe)),ht.w.setGroupProperty(PropertyInterface("Stroke Width",Fe)),Wt}function w(ke,ht,He){function Fe(ct){return ct===ke.e.ix||ct==="End"||ct==="end"?Fe.end:ct===ke.s.ix?Fe.start:ct===ke.o.ix?Fe.offset:null}var at=propertyGroupFactory(Fe,He);return Fe.propertyIndex=ke.ix,ht.s.setGroupProperty(PropertyInterface("Start",at)),ht.e.setGroupProperty(PropertyInterface("End",at)),ht.o.setGroupProperty(PropertyInterface("Offset",at)),Fe.propertyIndex=ke.ix,Fe.propertyGroup=He,Object.defineProperties(Fe,{start:{get:ExpressionPropertyInterface(ht.s)},end:{get:ExpressionPropertyInterface(ht.e)},offset:{get:ExpressionPropertyInterface(ht.o)},_name:{value:ke.nm}}),Fe.mn=ke.mn,Fe}function I(ke,ht,He){function Fe(ct){return ke.a.ix===ct||ct==="Anchor Point"?Fe.anchorPoint:ke.o.ix===ct||ct==="Opacity"?Fe.opacity:ke.p.ix===ct||ct==="Position"?Fe.position:ke.r.ix===ct||ct==="Rotation"||ct==="ADBE Vector Rotation"?Fe.rotation:ke.s.ix===ct||ct==="Scale"?Fe.scale:ke.sk&&ke.sk.ix===ct||ct==="Skew"?Fe.skew:ke.sa&&ke.sa.ix===ct||ct==="Skew Axis"?Fe.skewAxis:null}var at=propertyGroupFactory(Fe,He);return ht.transform.mProps.o.setGroupProperty(PropertyInterface("Opacity",at)),ht.transform.mProps.p.setGroupProperty(PropertyInterface("Position",at)),ht.transform.mProps.a.setGroupProperty(PropertyInterface("Anchor Point",at)),ht.transform.mProps.s.setGroupProperty(PropertyInterface("Scale",at)),ht.transform.mProps.r.setGroupProperty(PropertyInterface("Rotation",at)),ht.transform.mProps.sk&&(ht.transform.mProps.sk.setGroupProperty(PropertyInterface("Skew",at)),ht.transform.mProps.sa.setGroupProperty(PropertyInterface("Skew Angle",at))),ht.transform.op.setGroupProperty(PropertyInterface("Opacity",at)),Object.defineProperties(Fe,{opacity:{get:ExpressionPropertyInterface(ht.transform.mProps.o)},position:{get:ExpressionPropertyInterface(ht.transform.mProps.p)},anchorPoint:{get:ExpressionPropertyInterface(ht.transform.mProps.a)},scale:{get:ExpressionPropertyInterface(ht.transform.mProps.s)},rotation:{get:ExpressionPropertyInterface(ht.transform.mProps.r)},skew:{get:ExpressionPropertyInterface(ht.transform.mProps.sk)},skewAxis:{get:ExpressionPropertyInterface(ht.transform.mProps.sa)},_name:{value:ke.nm}}),Fe.ty="tr",Fe.mn=ke.mn,Fe.propertyGroup=He,Fe}function O(ke,ht,He){function Fe(xt){return ke.p.ix===xt?Fe.position:ke.s.ix===xt?Fe.size:null}var at=propertyGroupFactory(Fe,He);Fe.propertyIndex=ke.ix;var ct=ht.sh.ty==="tm"?ht.sh.prop:ht.sh;return ct.s.setGroupProperty(PropertyInterface("Size",at)),ct.p.setGroupProperty(PropertyInterface("Position",at)),Object.defineProperties(Fe,{size:{get:ExpressionPropertyInterface(ct.s)},position:{get:ExpressionPropertyInterface(ct.p)},_name:{value:ke.nm}}),Fe.mn=ke.mn,Fe}function ye(ke,ht,He){function Fe(xt){return ke.p.ix===xt?Fe.position:ke.r.ix===xt?Fe.rotation:ke.pt.ix===xt?Fe.points:ke.or.ix===xt||xt==="ADBE Vector Star Outer Radius"?Fe.outerRadius:ke.os.ix===xt?Fe.outerRoundness:ke.ir&&(ke.ir.ix===xt||xt==="ADBE Vector Star Inner Radius")?Fe.innerRadius:ke.is&&ke.is.ix===xt?Fe.innerRoundness:null}var at=propertyGroupFactory(Fe,He),ct=ht.sh.ty==="tm"?ht.sh.prop:ht.sh;return Fe.propertyIndex=ke.ix,ct.or.setGroupProperty(PropertyInterface("Outer Radius",at)),ct.os.setGroupProperty(PropertyInterface("Outer Roundness",at)),ct.pt.setGroupProperty(PropertyInterface("Points",at)),ct.p.setGroupProperty(PropertyInterface("Position",at)),ct.r.setGroupProperty(PropertyInterface("Rotation",at)),ke.ir&&(ct.ir.setGroupProperty(PropertyInterface("Inner Radius",at)),ct.is.setGroupProperty(PropertyInterface("Inner Roundness",at))),Object.defineProperties(Fe,{position:{get:ExpressionPropertyInterface(ct.p)},rotation:{get:ExpressionPropertyInterface(ct.r)},points:{get:ExpressionPropertyInterface(ct.pt)},outerRadius:{get:ExpressionPropertyInterface(ct.or)},outerRoundness:{get:ExpressionPropertyInterface(ct.os)},innerRadius:{get:ExpressionPropertyInterface(ct.ir)},innerRoundness:{get:ExpressionPropertyInterface(ct.is)},_name:{value:ke.nm}}),Fe.mn=ke.mn,Fe}function Se(ke,ht,He){function Fe(xt){return ke.p.ix===xt?Fe.position:ke.r.ix===xt?Fe.roundness:ke.s.ix===xt||xt==="Size"||xt==="ADBE Vector Rect Size"?Fe.size:null}var at=propertyGroupFactory(Fe,He),ct=ht.sh.ty==="tm"?ht.sh.prop:ht.sh;return Fe.propertyIndex=ke.ix,ct.p.setGroupProperty(PropertyInterface("Position",at)),ct.s.setGroupProperty(PropertyInterface("Size",at)),ct.r.setGroupProperty(PropertyInterface("Rotation",at)),Object.defineProperties(Fe,{position:{get:ExpressionPropertyInterface(ct.p)},roundness:{get:ExpressionPropertyInterface(ct.r)},size:{get:ExpressionPropertyInterface(ct.s)},_name:{value:ke.nm}}),Fe.mn=ke.mn,Fe}function Pe(ke,ht,He){function Fe(xt){return ke.r.ix===xt||xt==="Round Corners 1"?Fe.radius:null}var at=propertyGroupFactory(Fe,He),ct=ht;return Fe.propertyIndex=ke.ix,ct.rd.setGroupProperty(PropertyInterface("Radius",at)),Object.defineProperties(Fe,{radius:{get:ExpressionPropertyInterface(ct.rd)},_name:{value:ke.nm}}),Fe.mn=ke.mn,Fe}function Ne(ke,ht,He){function Fe(xt){return ke.c.ix===xt||xt==="Copies"?Fe.copies:ke.o.ix===xt||xt==="Offset"?Fe.offset:null}var at=propertyGroupFactory(Fe,He),ct=ht;return Fe.propertyIndex=ke.ix,ct.c.setGroupProperty(PropertyInterface("Copies",at)),ct.o.setGroupProperty(PropertyInterface("Offset",at)),Object.defineProperties(Fe,{copies:{get:ExpressionPropertyInterface(ct.c)},offset:{get:ExpressionPropertyInterface(ct.o)},_name:{value:ke.nm}}),Fe.mn=ke.mn,Fe}return function(ke,ht,He){var Fe;function at(xt){if(typeof xt=="number")return xt=xt===void 0?1:xt,xt===0?He:Fe[xt-1];for(var Gt=0,Lt=Fe.length;Gt<Lt;){if(Fe[Gt]._name===xt)return Fe[Gt];Gt+=1}return null}function ct(){return He}return at.propertyGroup=propertyGroupFactory(at,ct),Fe=m(ke,ht,at.propertyGroup),at.numProperties=Fe.length,at._name="Contents",at}}(),TextExpressionInterface=function(){return function(m){var t,r;function d(g){switch(g){case"ADBE Text Document":return d.sourceText;default:return null}}return Object.defineProperty(d,"sourceText",{get:function(){m.textProperty.getValue();var g=m.textProperty.currentData.t;return g!==t&&(m.textProperty.currentData.t=t,r=new String(g),r.value=g||new String(g)),r}}),d}}(),getBlendMode=function(){var m={0:"source-over",1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"};return function(t){return m[t]||""}}();extendPrototype([DynamicPropertyContainer],GroupEffect),GroupEffect.prototype.getValue=GroupEffect.prototype.iterateDynamicProperties,GroupEffect.prototype.init=function(m,t){this.data=m,this.effectElements=[],this.initDynamicPropertyContainer(t);var r,d=this.data.ef.length,g,v=this.data.ef;for(r=0;r<d;r+=1){switch(g=null,v[r].ty){case 0:g=new SliderEffect(v[r],t,this);break;case 1:g=new AngleEffect(v[r],t,this);break;case 2:g=new ColorEffect(v[r],t,this);break;case 3:g=new PointEffect(v[r],t,this);break;case 4:case 7:g=new CheckboxEffect(v[r],t,this);break;case 10:g=new LayerIndexEffect(v[r],t,this);break;case 11:g=new MaskIndexEffect(v[r],t,this);break;case 5:g=new EffectsManager(v[r],t);break;default:g=new NoValueEffect(v[r]);break}g&&this.effectElements.push(g)}},BaseElement.prototype={checkMasks:function(){if(!this.data.hasMask)return!1;for(var m=0,t=this.data.masksProperties.length;m<t;){if(this.data.masksProperties[m].mode!=="n"&&this.data.masksProperties[m].cl!==!1)return!0;m+=1}return!1},initExpressions:function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.maskManager&&this.layerInterface.registerMaskInterface(this.maskManager);var m=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(m),this.data.ty===0||this.data.xt?this.compInterface=CompExpressionInterface(this):this.data.ty===4?(this.layerInterface.shapeInterface=ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):this.data.ty===5&&(this.layerInterface.textInterface=TextExpressionInterface(this),this.layerInterface.text=this.layerInterface.textInterface)},setBlendMode:function(){var m=getBlendMode(this.data.bm),t=this.baseElement||this.layerElement;t.style["mix-blend-mode"]=m},initBaseData:function(m,t,r){this.globalData=t,this.comp=r,this.data=m,this.layerId=createElementID(),this.data.sr||(this.data.sr=1),this.effectsManager=new EffectsManager(this.data,this,this.dynamicProperties)},getType:function(){return this.type},sourceRectAtTime:function(){}},FrameElement.prototype={initFrame:function(){this._isFirstFrame=!1,this.dynamicProperties=[],this._mdf=!1},prepareProperties:function(m,t){var r,d=this.dynamicProperties.length;for(r=0;r<d;r+=1)(t||this._isParent&&this.dynamicProperties[r].propType==="transform")&&(this.dynamicProperties[r].getValue(),this.dynamicProperties[r]._mdf&&(this.globalData._mdf=!0,this._mdf=!0))},addDynamicProperty:function(m){this.dynamicProperties.indexOf(m)===-1&&this.dynamicProperties.push(m)}};const FootageInterface=function(){var m=function(r){var d="",g=r.getFootageData();function v(){return d="",g=r.getFootageData(),C}function C(w){if(g[w])return d=w,g=g[w],typeof g=="object"?C:g;var I=w.indexOf(d);if(I!==-1){var O=parseInt(w.substr(I+d.length),10);return g=g[O],typeof g=="object"?C:g}return""}return v},t=function(r){function d(g){return g==="Outline"?d.outlineInterface():null}return d._name="Outline",d.outlineInterface=m(r),d};return function(r){function d(g){return g==="Data"?d.dataInterface:null}return d._name="Data",d.dataInterface=t(r),d}}();FootageElement.prototype.prepareFrame=function(){},extendPrototype([RenderableElement,BaseElement,FrameElement],FootageElement),FootageElement.prototype.getBaseElement=function(){return null},FootageElement.prototype.renderFrame=function(){},FootageElement.prototype.destroy=function(){},FootageElement.prototype.initExpressions=function(){this.layerInterface=FootageInterface(this)},FootageElement.prototype.getFootageData=function(){return this.footageData},AudioElement.prototype.prepareFrame=function(m){if(this.prepareRenderableFrame(m,!0),this.prepareProperties(m,!0),this.tm._placeholder)this._currentTime=m/this.data.sr;else{var t=this.tm.v;this._currentTime=t}this._volume=this.lv.v[0];var r=this._volume*this._volumeMultiplier;this._previousVolume!==r&&(this._previousVolume=r,this.audio.volume(r))},extendPrototype([RenderableElement,BaseElement,FrameElement],AudioElement),AudioElement.prototype.renderFrame=function(){this.isInRange&&this._canPlay&&(this._isPlaying?(!this.audio.playing()||Math.abs(this._currentTime/this.globalData.frameRate-this.audio.seek())>.1)&&this.audio.seek(this._currentTime/this.globalData.frameRate):(this.audio.play(),this.audio.seek(this._currentTime/this.globalData.frameRate),this._isPlaying=!0))},AudioElement.prototype.show=function(){},AudioElement.prototype.hide=function(){this.audio.pause(),this._isPlaying=!1},AudioElement.prototype.pause=function(){this.audio.pause(),this._isPlaying=!1,this._canPlay=!1},AudioElement.prototype.resume=function(){this._canPlay=!0},AudioElement.prototype.setRate=function(m){this.audio.rate(m)},AudioElement.prototype.volume=function(m){this._volumeMultiplier=m,this._previousVolume=m*this._volume,this.audio.volume(this._previousVolume)},AudioElement.prototype.getBaseElement=function(){return null},AudioElement.prototype.destroy=function(){},AudioElement.prototype.sourceRectAtTime=function(){},AudioElement.prototype.initExpressions=function(){},BaseRenderer.prototype.checkLayers=function(m){var t,r=this.layers.length,d;for(this.completeLayers=!0,t=r-1;t>=0;t-=1)this.elements[t]||(d=this.layers[t],d.ip-d.st<=m-this.layers[t].st&&d.op-d.st>m-this.layers[t].st&&this.buildItem(t)),this.completeLayers=this.elements[t]?this.completeLayers:!1;this.checkPendingElements()},BaseRenderer.prototype.createItem=function(m){switch(m.ty){case 2:return this.createImage(m);case 0:return this.createComp(m);case 1:return this.createSolid(m);case 3:return this.createNull(m);case 4:return this.createShape(m);case 5:return this.createText(m);case 6:return this.createAudio(m);case 13:return this.createCamera(m);case 15:return this.createFootage(m);default:return this.createNull(m)}},BaseRenderer.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},BaseRenderer.prototype.createAudio=function(m){return new AudioElement(m,this.globalData,this)},BaseRenderer.prototype.createFootage=function(m){return new FootageElement(m,this.globalData,this)},BaseRenderer.prototype.buildAllItems=function(){var m,t=this.layers.length;for(m=0;m<t;m+=1)this.buildItem(m);this.checkPendingElements()},BaseRenderer.prototype.includeLayers=function(m){this.completeLayers=!1;var t,r=m.length,d,g=this.layers.length;for(t=0;t<r;t+=1)for(d=0;d<g;){if(this.layers[d].id===m[t].id){this.layers[d]=m[t];break}d+=1}},BaseRenderer.prototype.setProjectInterface=function(m){this.globalData.projectInterface=m},BaseRenderer.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},BaseRenderer.prototype.buildElementParenting=function(m,t,r){for(var d=this.elements,g=this.layers,v=0,C=g.length;v<C;)g[v].ind==t&&(!d[v]||d[v]===!0?(this.buildItem(v),this.addPendingElement(m)):(r.push(d[v]),d[v].setAsParent(),g[v].parent!==void 0?this.buildElementParenting(m,g[v].parent,r):m.setHierarchy(r))),v+=1},BaseRenderer.prototype.addPendingElement=function(m){this.pendingElements.push(m)},BaseRenderer.prototype.searchExtraCompositions=function(m){var t,r=m.length;for(t=0;t<r;t+=1)if(m[t].xt){var d=this.createComp(m[t]);d.initExpressions(),this.globalData.projectInterface.registerComposition(d)}},BaseRenderer.prototype.getElementByPath=function(m){var t=m.shift(),r;if(typeof t=="number")r=this.elements[t];else{var d,g=this.elements.length;for(d=0;d<g;d+=1)if(this.elements[d].data.nm===t){r=this.elements[d];break}}return m.length===0?r:r.getElementByPath(m)},BaseRenderer.prototype.setupGlobalData=function(m,t){this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(m.chars),this.globalData.fontManager.addFonts(m.fonts,t),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.imageLoader=this.animationItem.imagePreloader,this.globalData.audioController=this.animationItem.audioController,this.globalData.frameId=0,this.globalData.frameRate=m.fr,this.globalData.nm=m.nm,this.globalData.compSize={w:m.w,h:m.h}},TransformElement.prototype={initTransform:function(){this.finalTransform={mProp:this.data.ks?TransformPropertyFactory.getTransformProperty(this,this.data.ks,this):{o:0},_matMdf:!1,_opMdf:!1,mat:new Matrix},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.data.ty},renderTransform:function(){if(this.finalTransform._opMdf=this.finalTransform.mProp.o._mdf||this._isFirstFrame,this.finalTransform._matMdf=this.finalTransform.mProp._mdf||this._isFirstFrame,this.hierarchy){var m,t=this.finalTransform.mat,r=0,d=this.hierarchy.length;if(!this.finalTransform._matMdf)for(;r<d;){if(this.hierarchy[r].finalTransform.mProp._mdf){this.finalTransform._matMdf=!0;break}r+=1}if(this.finalTransform._matMdf)for(m=this.finalTransform.mProp.v.props,t.cloneFromProps(m),r=0;r<d;r+=1)m=this.hierarchy[r].finalTransform.mProp.v.props,t.transform(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15])}},globalToLocal:function(m){var t=[];t.push(this.finalTransform);for(var r=!0,d=this.comp;r;)d.finalTransform?(d.data.hasMask&&t.splice(0,0,d.finalTransform),d=d.comp):r=!1;var g,v=t.length,C;for(g=0;g<v;g+=1)C=t[g].mat.applyToPointArray(0,0,0),m=[m[0]-C[0],m[1]-C[1],0];return m},mHelper:new Matrix},MaskElement.prototype.getMaskProperty=function(m){return this.viewData[m].prop},MaskElement.prototype.renderFrame=function(m){var t=this.element.finalTransform.mat,r,d=this.masksProperties.length;for(r=0;r<d;r+=1)if((this.viewData[r].prop._mdf||m)&&this.drawPath(this.masksProperties[r],this.viewData[r].prop.v,this.viewData[r]),(this.viewData[r].op._mdf||m)&&this.viewData[r].elem.setAttribute("fill-opacity",this.viewData[r].op.v),this.masksProperties[r].mode!=="n"&&(this.viewData[r].invRect&&(this.element.finalTransform.mProp._mdf||m)&&this.viewData[r].invRect.setAttribute("transform",t.getInverseMatrix().to2dCSS()),this.storedData[r].x&&(this.storedData[r].x._mdf||m))){var g=this.storedData[r].expan;this.storedData[r].x.v<0?(this.storedData[r].lastOperator!=="erode"&&(this.storedData[r].lastOperator="erode",this.storedData[r].elem.setAttribute("filter","url("+getLocationHref()+"#"+this.storedData[r].filterId+")")),g.setAttribute("radius",-this.storedData[r].x.v)):(this.storedData[r].lastOperator!=="dilate"&&(this.storedData[r].lastOperator="dilate",this.storedData[r].elem.setAttribute("filter",null)),this.storedData[r].elem.setAttribute("stroke-width",this.storedData[r].x.v*2))}},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var m="M0,0 ";return m+=" h"+this.globalData.compSize.w,m+=" v"+this.globalData.compSize.h,m+=" h-"+this.globalData.compSize.w,m+=" v-"+this.globalData.compSize.h+" ",m},MaskElement.prototype.drawPath=function(m,t,r){var d=" M"+t.v[0][0]+","+t.v[0][1],g,v;for(v=t._length,g=1;g<v;g+=1)d+=" C"+t.o[g-1][0]+","+t.o[g-1][1]+" "+t.i[g][0]+","+t.i[g][1]+" "+t.v[g][0]+","+t.v[g][1];if(t.c&&v>1&&(d+=" C"+t.o[g-1][0]+","+t.o[g-1][1]+" "+t.i[0][0]+","+t.i[0][1]+" "+t.v[0][0]+","+t.v[0][1]),r.lastPath!==d){var C="";r.elem&&(t.c&&(C=m.inv?this.solidPath+d:d),r.elem.setAttribute("d",C)),r.lastPath=d}},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.masksProperties=null};const filtersFactory=function(){var m={};m.createFilter=t,m.createAlphaToLuminanceFilter=r;function t(d,g){var v=createNS("filter");return v.setAttribute("id",d),g!==!0&&(v.setAttribute("filterUnits","objectBoundingBox"),v.setAttribute("x","0%"),v.setAttribute("y","0%"),v.setAttribute("width","100%"),v.setAttribute("height","100%")),v}function r(){var d=createNS("feColorMatrix");return d.setAttribute("type","matrix"),d.setAttribute("color-interpolation-filters","sRGB"),d.setAttribute("values","0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1"),d}return m}(),featureSupport=function(){var m={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(m.maskType=!1),m}();var registeredEffects={},idPrefix="filter_result_";SVGEffects.prototype.renderFrame=function(m){var t,r=this.filters.length;for(t=0;t<r;t+=1)this.filters[t].renderFrame(m)},SVGBaseElement.prototype={initRendererElement:function(){this.layerElement=createNS("g")},createContainerElements:function(){this.matteElement=createNS("g"),this.transformedElement=this.layerElement,this.maskedElement=this.layerElement,this._sizeChanged=!1;var m=null,t,r,d;if(this.data.td){if(this.data.td==3||this.data.td==1){var g=createNS("mask");g.setAttribute("id",this.layerId),g.setAttribute("mask-type",this.data.td==3?"luminance":"alpha"),g.appendChild(this.layerElement),m=g,this.globalData.defs.appendChild(g),!featureSupport.maskType&&this.data.td==1&&(g.setAttribute("mask-type","luminance"),t=createElementID(),r=filtersFactory.createFilter(t),this.globalData.defs.appendChild(r),r.appendChild(filtersFactory.createAlphaToLuminanceFilter()),d=createNS("g"),d.appendChild(this.layerElement),m=d,g.appendChild(d),d.setAttribute("filter","url("+getLocationHref()+"#"+t+")"))}else if(this.data.td==2){var v=createNS("mask");v.setAttribute("id",this.layerId),v.setAttribute("mask-type","alpha");var C=createNS("g");v.appendChild(C),t=createElementID(),r=filtersFactory.createFilter(t);var w=createNS("feComponentTransfer");w.setAttribute("in","SourceGraphic"),r.appendChild(w);var I=createNS("feFuncA");I.setAttribute("type","table"),I.setAttribute("tableValues","1.0 0.0"),w.appendChild(I),this.globalData.defs.appendChild(r);var O=createNS("rect");O.setAttribute("width",this.comp.data.w),O.setAttribute("height",this.comp.data.h),O.setAttribute("x","0"),O.setAttribute("y","0"),O.setAttribute("fill","#ffffff"),O.setAttribute("opacity","0"),C.setAttribute("filter","url("+getLocationHref()+"#"+t+")"),C.appendChild(O),C.appendChild(this.layerElement),m=C,featureSupport.maskType||(v.setAttribute("mask-type","luminance"),r.appendChild(filtersFactory.createAlphaToLuminanceFilter()),d=createNS("g"),C.appendChild(O),d.appendChild(this.layerElement),m=d,C.appendChild(d)),this.globalData.defs.appendChild(v)}}else this.data.tt?(this.matteElement.appendChild(this.layerElement),m=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),this.data.ty===0&&!this.data.hd){var ye=createNS("clipPath"),Se=createNS("path");Se.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var Pe=createElementID();if(ye.setAttribute("id",Pe),ye.appendChild(Se),this.globalData.defs.appendChild(ye),this.checkMasks()){var Ne=createNS("g");Ne.setAttribute("clip-path","url("+getLocationHref()+"#"+Pe+")"),Ne.appendChild(this.layerElement),this.transformedElement=Ne,m?m.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url("+getLocationHref()+"#"+Pe+")")}this.data.bm!==0&&this.setBlendMode()},renderElement:function(){this.finalTransform._matMdf&&this.transformedElement.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform._opMdf&&this.transformedElement.setAttribute("opacity",this.finalTransform.mProp.o.v)},destroyBaseElement:function(){this.layerElement=null,this.matteElement=null,this.maskManager.destroy()},getBaseElement:function(){return this.data.hd?null:this.baseElement},createRenderableComponents:function(){this.maskManager=new MaskElement(this.data,this,this.globalData),this.renderableEffectsManager=new SVGEffects(this)},setMatte:function(m){this.matteElement&&this.matteElement.setAttribute("mask","url("+getLocationHref()+"#"+m+")")}},HierarchyElement.prototype={initHierarchy:function(){this.hierarchy=[],this._isParent=!1,this.checkParenting()},setHierarchy:function(m){this.hierarchy=m},setAsParent:function(){this._isParent=!0},checkParenting:function(){this.data.parent!==void 0&&this.comp.buildElementParenting(this,this.data.parent,[])}},function(){var m={initElement:function(t,r,d){this.initFrame(),this.initBaseData(t,r,d),this.initTransform(t,r,d),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide()},hide:function(){if(!this.hidden&&(!this.isInRange||this.isTransparent)){var t=this.baseElement||this.layerElement;t.style.display="none",this.hidden=!0}},show:function(){if(this.isInRange&&!this.isTransparent){if(!this.data.hd){var t=this.baseElement||this.layerElement;t.style.display="block"}this.hidden=!1,this._isFirstFrame=!0}},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},renderInnerContent:function(){},prepareFrame:function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.checkTransparency()},destroy:function(){this.innerElem=null,this.destroyBaseElement()}};extendPrototype([RenderableElement,createProxyFunction(m)],RenderableDOMElement)}(),extendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement],IImageElement),IImageElement.prototype.createContent=function(){var m=this.globalData.getAssetsPath(this.assetData);this.innerElem=createNS("image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio",this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",m),this.layerElement.appendChild(this.innerElem)},IImageElement.prototype.sourceRectAtTime=function(){return this.sourceRect},IShapeElement.prototype={addShapeToModifiers:function(m){var t,r=this.shapeModifiers.length;for(t=0;t<r;t+=1)this.shapeModifiers[t].addShape(m)},isShapeInAnimatedModifiers:function(m){for(var t=0,r=this.shapeModifiers.length;t<r;)if(this.shapeModifiers[t].isAnimatedWithShape(m))return!0;return!1},renderModifiers:function(){if(this.shapeModifiers.length){var m,t=this.shapes.length;for(m=0;m<t;m+=1)this.shapes[m].sh.reset();t=this.shapeModifiers.length;var r;for(m=t-1;m>=0&&(r=this.shapeModifiers[m].processShapes(this._isFirstFrame),!r);m-=1);}},searchProcessedElement:function(m){for(var t=this.processedElements,r=0,d=t.length;r<d;){if(t[r].elem===m)return t[r].pos;r+=1}return 0},addProcessedElement:function(m,t){for(var r=this.processedElements,d=r.length;d;)if(d-=1,r[d].elem===m){r[d].pos=t;return}r.push(new ProcessedElement(m,t))},prepareFrame:function(m){this.prepareRenderableFrame(m),this.prepareProperties(m,this.isInRange)}};const lineCapEnum={1:"butt",2:"round",3:"square"},lineJoinEnum={1:"miter",2:"round",3:"bevel"};SVGShapeData.prototype.setAsAnimated=function(){this._isAnimated=!0},SVGStyleData.prototype.reset=function(){this.d="",this._mdf=!1},DashProperty.prototype.getValue=function(m){if(!(this.elem.globalData.frameId===this.frameId&&!m)&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf=this._mdf||m,this._mdf)){var t=0,r=this.dataProps.length;for(this.renderer==="svg"&&(this.dashStr=""),t=0;t<r;t+=1)this.dataProps[t].n!=="o"?this.renderer==="svg"?this.dashStr+=" "+this.dataProps[t].p.v:this.dashArray[t]=this.dataProps[t].p.v:this.dashoffset[0]=this.dataProps[t].p.v}},extendPrototype([DynamicPropertyContainer],DashProperty),extendPrototype([DynamicPropertyContainer],SVGStrokeStyleData),extendPrototype([DynamicPropertyContainer],SVGFillStyleData),extendPrototype([DynamicPropertyContainer],SVGNoStyleData),GradientProperty.prototype.comparePoints=function(m,t){for(var r=0,d=this.o.length/2,g;r<d;){if(g=Math.abs(m[r*4]-m[t*4+r*2]),g>.01)return!1;r+=1}return!0},GradientProperty.prototype.checkCollapsable=function(){if(this.o.length/2!==this.c.length/4)return!1;if(this.data.k.k[0].s)for(var m=0,t=this.data.k.k.length;m<t;){if(!this.comparePoints(this.data.k.k[m].s,this.data.p))return!1;m+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},GradientProperty.prototype.getValue=function(m){if(this.prop.getValue(),this._mdf=!1,this._cmdf=!1,this._omdf=!1,this.prop._mdf||m){var t,r=this.data.p*4,d,g;for(t=0;t<r;t+=1)d=t%4===0?100:255,g=Math.round(this.prop.v[t]*d),this.c[t]!==g&&(this.c[t]=g,this._cmdf=!m);if(this.o.length)for(r=this.prop.v.length,t=this.data.p*4;t<r;t+=1)d=t%2===0?100:1,g=t%2===0?Math.round(this.prop.v[t]*100):this.prop.v[t],this.o[t-this.data.p*4]!==g&&(this.o[t-this.data.p*4]=g,this._omdf=!m);this._mdf=!m}},extendPrototype([DynamicPropertyContainer],GradientProperty),SVGGradientFillStyleData.prototype.initGradientData=function(m,t,r){this.o=PropertyFactory.getProp(m,t.o,0,.01,this),this.s=PropertyFactory.getProp(m,t.s,1,null,this),this.e=PropertyFactory.getProp(m,t.e,1,null,this),this.h=PropertyFactory.getProp(m,t.h||{k:0},0,.01,this),this.a=PropertyFactory.getProp(m,t.a||{k:0},0,degToRads,this),this.g=new GradientProperty(m,t.g,this),this.style=r,this.stops=[],this.setGradientData(r.pElem,t),this.setGradientOpacity(t,r),this._isAnimated=!!this._isAnimated},SVGGradientFillStyleData.prototype.setGradientData=function(m,t){var r=createElementID(),d=createNS(t.t===1?"linearGradient":"radialGradient");d.setAttribute("id",r),d.setAttribute("spreadMethod","pad"),d.setAttribute("gradientUnits","userSpaceOnUse");var g=[],v,C,w;for(w=t.g.p*4,C=0;C<w;C+=4)v=createNS("stop"),d.appendChild(v),g.push(v);m.setAttribute(t.ty==="gf"?"fill":"stroke","url("+getLocationHref()+"#"+r+")"),this.gf=d,this.cst=g},SVGGradientFillStyleData.prototype.setGradientOpacity=function(m,t){if(this.g._hasOpacity&&!this.g._collapsable){var r,d,g,v=createNS("mask"),C=createNS("path");v.appendChild(C);var w=createElementID(),I=createElementID();v.setAttribute("id",I);var O=createNS(m.t===1?"linearGradient":"radialGradient");O.setAttribute("id",w),O.setAttribute("spreadMethod","pad"),O.setAttribute("gradientUnits","userSpaceOnUse"),g=m.g.k.k[0].s?m.g.k.k[0].s.length:m.g.k.k.length;var ye=this.stops;for(d=m.g.p*4;d<g;d+=2)r=createNS("stop"),r.setAttribute("stop-color","rgb(255,255,255)"),O.appendChild(r),ye.push(r);C.setAttribute(m.ty==="gf"?"fill":"stroke","url("+getLocationHref()+"#"+w+")"),m.ty==="gs"&&(C.setAttribute("stroke-linecap",lineCapEnum[m.lc||2]),C.setAttribute("stroke-linejoin",lineJoinEnum[m.lj||2]),m.lj===1&&C.setAttribute("stroke-miterlimit",m.ml)),this.of=O,this.ms=v,this.ost=ye,this.maskId=I,t.msElem=C}},extendPrototype([DynamicPropertyContainer],SVGGradientFillStyleData),extendPrototype([SVGGradientFillStyleData,DynamicPropertyContainer],SVGGradientStrokeStyleData);const buildShapeString=function(m,t,r,d){if(t===0)return"";var g=m.o,v=m.i,C=m.v,w,I=" M"+d.applyToPointStringified(C[0][0],C[0][1]);for(w=1;w<t;w+=1)I+=" C"+d.applyToPointStringified(g[w-1][0],g[w-1][1])+" "+d.applyToPointStringified(v[w][0],v[w][1])+" "+d.applyToPointStringified(C[w][0],C[w][1]);return r&&t&&(I+=" C"+d.applyToPointStringified(g[w-1][0],g[w-1][1])+" "+d.applyToPointStringified(v[0][0],v[0][1])+" "+d.applyToPointStringified(C[0][0],C[0][1]),I+="z"),I},SVGElementsRenderer=function(){var m=new Matrix,t=new Matrix,r={createRenderFunction:d};function d(Se){switch(Se.ty){case"fl":return w;case"gf":return O;case"gs":return I;case"st":return ye;case"sh":case"el":case"rc":case"sr":return C;case"tr":return g;case"no":return v;default:return null}}function g(Se,Pe,Ne){(Ne||Pe.transform.op._mdf)&&Pe.transform.container.setAttribute("opacity",Pe.transform.op.v),(Ne||Pe.transform.mProps._mdf)&&Pe.transform.container.setAttribute("transform",Pe.transform.mProps.v.to2dCSS())}function v(){}function C(Se,Pe,Ne){var ke,ht,He,Fe,at,ct,xt=Pe.styles.length,Gt=Pe.lvl,Lt,Wt,Pt,Ft,kt;for(ct=0;ct<xt;ct+=1){if(Fe=Pe.sh._mdf||Ne,Pe.styles[ct].lvl<Gt){for(Wt=t.reset(),Ft=Gt-Pe.styles[ct].lvl,kt=Pe.transformers.length-1;!Fe&&Ft>0;)Fe=Pe.transformers[kt].mProps._mdf||Fe,Ft-=1,kt-=1;if(Fe)for(Ft=Gt-Pe.styles[ct].lvl,kt=Pe.transformers.length-1;Ft>0;)Pt=Pe.transformers[kt].mProps.v.props,Wt.transform(Pt[0],Pt[1],Pt[2],Pt[3],Pt[4],Pt[5],Pt[6],Pt[7],Pt[8],Pt[9],Pt[10],Pt[11],Pt[12],Pt[13],Pt[14],Pt[15]),Ft-=1,kt-=1}else Wt=m;if(Lt=Pe.sh.paths,ht=Lt._length,Fe){for(He="",ke=0;ke<ht;ke+=1)at=Lt.shapes[ke],at&&at._length&&(He+=buildShapeString(at,at._length,at.c,Wt));Pe.caches[ct]=He}else He=Pe.caches[ct];Pe.styles[ct].d+=Se.hd===!0?"":He,Pe.styles[ct]._mdf=Fe||Pe.styles[ct]._mdf}}function w(Se,Pe,Ne){var ke=Pe.style;(Pe.c._mdf||Ne)&&ke.pElem.setAttribute("fill","rgb("+bmFloor(Pe.c.v[0])+","+bmFloor(Pe.c.v[1])+","+bmFloor(Pe.c.v[2])+")"),(Pe.o._mdf||Ne)&&ke.pElem.setAttribute("fill-opacity",Pe.o.v)}function I(Se,Pe,Ne){O(Se,Pe,Ne),ye(Se,Pe,Ne)}function O(Se,Pe,Ne){var ke=Pe.gf,ht=Pe.g._hasOpacity,He=Pe.s.v,Fe=Pe.e.v;if(Pe.o._mdf||Ne){var at=Se.ty==="gf"?"fill-opacity":"stroke-opacity";Pe.style.pElem.setAttribute(at,Pe.o.v)}if(Pe.s._mdf||Ne){var ct=Se.t===1?"x1":"cx",xt=ct==="x1"?"y1":"cy";ke.setAttribute(ct,He[0]),ke.setAttribute(xt,He[1]),ht&&!Pe.g._collapsable&&(Pe.of.setAttribute(ct,He[0]),Pe.of.setAttribute(xt,He[1]))}var Gt,Lt,Wt,Pt;if(Pe.g._cmdf||Ne){Gt=Pe.cst;var Ft=Pe.g.c;for(Wt=Gt.length,Lt=0;Lt<Wt;Lt+=1)Pt=Gt[Lt],Pt.setAttribute("offset",Ft[Lt*4]+"%"),Pt.setAttribute("stop-color","rgb("+Ft[Lt*4+1]+","+Ft[Lt*4+2]+","+Ft[Lt*4+3]+")")}if(ht&&(Pe.g._omdf||Ne)){var kt=Pe.g.o;for(Pe.g._collapsable?Gt=Pe.cst:Gt=Pe.ost,Wt=Gt.length,Lt=0;Lt<Wt;Lt+=1)Pt=Gt[Lt],Pe.g._collapsable||Pt.setAttribute("offset",kt[Lt*2]+"%"),Pt.setAttribute("stop-opacity",kt[Lt*2+1])}if(Se.t===1)(Pe.e._mdf||Ne)&&(ke.setAttribute("x2",Fe[0]),ke.setAttribute("y2",Fe[1]),ht&&!Pe.g._collapsable&&(Pe.of.setAttribute("x2",Fe[0]),Pe.of.setAttribute("y2",Fe[1])));else{var Kt;if((Pe.s._mdf||Pe.e._mdf||Ne)&&(Kt=Math.sqrt(Math.pow(He[0]-Fe[0],2)+Math.pow(He[1]-Fe[1],2)),ke.setAttribute("r",Kt),ht&&!Pe.g._collapsable&&Pe.of.setAttribute("r",Kt)),Pe.e._mdf||Pe.h._mdf||Pe.a._mdf||Ne){Kt||(Kt=Math.sqrt(Math.pow(He[0]-Fe[0],2)+Math.pow(He[1]-Fe[1],2)));var i0=Math.atan2(Fe[1]-He[1],Fe[0]-He[0]),r0=Pe.h.v;r0>=1?r0=.99:r0<=-1&&(r0=-.99);var l0=Kt*r0,n0=Math.cos(i0+Pe.a.v)*l0+He[0],Ut=Math.sin(i0+Pe.a.v)*l0+He[1];ke.setAttribute("fx",n0),ke.setAttribute("fy",Ut),ht&&!Pe.g._collapsable&&(Pe.of.setAttribute("fx",n0),Pe.of.setAttribute("fy",Ut))}}}function ye(Se,Pe,Ne){var ke=Pe.style,ht=Pe.d;ht&&(ht._mdf||Ne)&&ht.dashStr&&(ke.pElem.setAttribute("stroke-dasharray",ht.dashStr),ke.pElem.setAttribute("stroke-dashoffset",ht.dashoffset[0])),Pe.c&&(Pe.c._mdf||Ne)&&ke.pElem.setAttribute("stroke","rgb("+bmFloor(Pe.c.v[0])+","+bmFloor(Pe.c.v[1])+","+bmFloor(Pe.c.v[2])+")"),(Pe.o._mdf||Ne)&&ke.pElem.setAttribute("stroke-opacity",Pe.o.v),(Pe.w._mdf||Ne)&&(ke.pElem.setAttribute("stroke-width",Pe.w.v),ke.msElem&&ke.msElem.setAttribute("stroke-width",Pe.w.v))}return r}();extendPrototype([BaseElement,TransformElement,SVGBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableDOMElement],SVGShapeElement),SVGShapeElement.prototype.initSecondaryElement=function(){},SVGShapeElement.prototype.identityMatrix=new Matrix,SVGShapeElement.prototype.buildExpressionInterface=function(){},SVGShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes()},SVGShapeElement.prototype.filterUniqueShapes=function(){var m,t=this.shapes.length,r,d,g=this.stylesList.length,v,C=[],w=!1;for(d=0;d<g;d+=1){for(v=this.stylesList[d],w=!1,C.length=0,m=0;m<t;m+=1)r=this.shapes[m],r.styles.indexOf(v)!==-1&&(C.push(r),w=r._isAnimated||w);C.length>1&&w&&this.setShapesAsAnimated(C)}},SVGShapeElement.prototype.setShapesAsAnimated=function(m){var t,r=m.length;for(t=0;t<r;t+=1)m[t].setAsAnimated()},SVGShapeElement.prototype.createStyleElement=function(m,t){var r,d=new SVGStyleData(m,t),g=d.pElem;if(m.ty==="st")r=new SVGStrokeStyleData(this,m,d);else if(m.ty==="fl")r=new SVGFillStyleData(this,m,d);else if(m.ty==="gf"||m.ty==="gs"){var v=m.ty==="gf"?SVGGradientFillStyleData:SVGGradientStrokeStyleData;r=new v(this,m,d),this.globalData.defs.appendChild(r.gf),r.maskId&&(this.globalData.defs.appendChild(r.ms),this.globalData.defs.appendChild(r.of),g.setAttribute("mask","url("+getLocationHref()+"#"+r.maskId+")"))}else m.ty==="no"&&(r=new SVGNoStyleData(this,m,d));return(m.ty==="st"||m.ty==="gs")&&(g.setAttribute("stroke-linecap",lineCapEnum[m.lc||2]),g.setAttribute("stroke-linejoin",lineJoinEnum[m.lj||2]),g.setAttribute("fill-opacity","0"),m.lj===1&&g.setAttribute("stroke-miterlimit",m.ml)),m.r===2&&g.setAttribute("fill-rule","evenodd"),m.ln&&g.setAttribute("id",m.ln),m.cl&&g.setAttribute("class",m.cl),m.bm&&(g.style["mix-blend-mode"]=getBlendMode(m.bm)),this.stylesList.push(d),this.addToAnimatedContents(m,r),r},SVGShapeElement.prototype.createGroupElement=function(m){var t=new ShapeGroupData;return m.ln&&t.gr.setAttribute("id",m.ln),m.cl&&t.gr.setAttribute("class",m.cl),m.bm&&(t.gr.style["mix-blend-mode"]=getBlendMode(m.bm)),t},SVGShapeElement.prototype.createTransformElement=function(m,t){var r=TransformPropertyFactory.getTransformProperty(this,m,this),d=new SVGTransformData(r,r.o,t);return this.addToAnimatedContents(m,d),d},SVGShapeElement.prototype.createShapeElement=function(m,t,r){var d=4;m.ty==="rc"?d=5:m.ty==="el"?d=6:m.ty==="sr"&&(d=7);var g=ShapePropertyFactory.getShapeProp(this,m,d,this),v=new SVGShapeData(t,r,g);return this.shapes.push(v),this.addShapeToModifiers(v),this.addToAnimatedContents(m,v),v},SVGShapeElement.prototype.addToAnimatedContents=function(m,t){for(var r=0,d=this.animatedContents.length;r<d;){if(this.animatedContents[r].element===t)return;r+=1}this.animatedContents.push({fn:SVGElementsRenderer.createRenderFunction(m),element:t,data:m})},SVGShapeElement.prototype.setElementStyles=function(m){var t=m.styles,r,d=this.stylesList.length;for(r=0;r<d;r+=1)this.stylesList[r].closed||t.push(this.stylesList[r])},SVGShapeElement.prototype.reloadShapes=function(){this._isFirstFrame=!0;var m,t=this.itemsData.length;for(m=0;m<t;m+=1)this.prevViewData[m]=this.itemsData[m];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes(),t=this.dynamicProperties.length,m=0;m<t;m+=1)this.dynamicProperties[m].getValue();this.renderModifiers()},SVGShapeElement.prototype.searchShapes=function(m,t,r,d,g,v,C){var w=[].concat(v),I,O=m.length-1,ye,Se,Pe=[],Ne=[],ke,ht,He;for(I=O;I>=0;I-=1){if(He=this.searchProcessedElement(m[I]),He?t[I]=r[He-1]:m[I]._render=C,m[I].ty==="fl"||m[I].ty==="st"||m[I].ty==="gf"||m[I].ty==="gs"||m[I].ty==="no")He?t[I].style.closed=!1:t[I]=this.createStyleElement(m[I],g),m[I]._render&&t[I].style.pElem.parentNode!==d&&d.appendChild(t[I].style.pElem),Pe.push(t[I].style);else if(m[I].ty==="gr"){if(!He)t[I]=this.createGroupElement(m[I]);else for(Se=t[I].it.length,ye=0;ye<Se;ye+=1)t[I].prevViewData[ye]=t[I].it[ye];this.searchShapes(m[I].it,t[I].it,t[I].prevViewData,t[I].gr,g+1,w,C),m[I]._render&&t[I].gr.parentNode!==d&&d.appendChild(t[I].gr)}else m[I].ty==="tr"?(He||(t[I]=this.createTransformElement(m[I],d)),ke=t[I].transform,w.push(ke)):m[I].ty==="sh"||m[I].ty==="rc"||m[I].ty==="el"||m[I].ty==="sr"?(He||(t[I]=this.createShapeElement(m[I],w,g)),this.setElementStyles(t[I])):m[I].ty==="tm"||m[I].ty==="rd"||m[I].ty==="ms"||m[I].ty==="pb"?(He?(ht=t[I],ht.closed=!1):(ht=ShapeModifiers.getModifier(m[I].ty),ht.init(this,m[I]),t[I]=ht,this.shapeModifiers.push(ht)),Ne.push(ht)):m[I].ty==="rp"&&(He?(ht=t[I],ht.closed=!0):(ht=ShapeModifiers.getModifier(m[I].ty),t[I]=ht,ht.init(this,m,I,t),this.shapeModifiers.push(ht),C=!1),Ne.push(ht));this.addProcessedElement(m[I],I+1)}for(O=Pe.length,I=0;I<O;I+=1)Pe[I].closed=!0;for(O=Ne.length,I=0;I<O;I+=1)Ne[I].closed=!0},SVGShapeElement.prototype.renderInnerContent=function(){this.renderModifiers();var m,t=this.stylesList.length;for(m=0;m<t;m+=1)this.stylesList[m].reset();for(this.renderShape(),m=0;m<t;m+=1)(this.stylesList[m]._mdf||this._isFirstFrame)&&(this.stylesList[m].msElem&&(this.stylesList[m].msElem.setAttribute("d",this.stylesList[m].d),this.stylesList[m].d="M0 0"+this.stylesList[m].d),this.stylesList[m].pElem.setAttribute("d",this.stylesList[m].d||"M0 0"))},SVGShapeElement.prototype.renderShape=function(){var m,t=this.animatedContents.length,r;for(m=0;m<t;m+=1)r=this.animatedContents[m],(this._isFirstFrame||r.element._isAnimated)&&r.data!==!0&&r.fn(r.data,r.element,this._isFirstFrame)},SVGShapeElement.prototype.destroy=function(){this.destroyBaseElement(),this.shapesData=null,this.itemsData=null},LetterProps.prototype.update=function(m,t,r,d,g,v){this._mdf.o=!1,this._mdf.sw=!1,this._mdf.sc=!1,this._mdf.fc=!1,this._mdf.m=!1,this._mdf.p=!1;var C=!1;return this.o!==m&&(this.o=m,this._mdf.o=!0,C=!0),this.sw!==t&&(this.sw=t,this._mdf.sw=!0,C=!0),this.sc!==r&&(this.sc=r,this._mdf.sc=!0,C=!0),this.fc!==d&&(this.fc=d,this._mdf.fc=!0,C=!0),this.m!==g&&(this.m=g,this._mdf.m=!0,C=!0),v.length&&(this.p[0]!==v[0]||this.p[1]!==v[1]||this.p[4]!==v[4]||this.p[5]!==v[5]||this.p[12]!==v[12]||this.p[13]!==v[13])&&(this.p=v,this._mdf.p=!0,C=!0),C},TextProperty.prototype.defaultBoxWidth=[0,0],TextProperty.prototype.copyData=function(m,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(m[r]=t[r]);return m},TextProperty.prototype.setCurrentData=function(m){m.__complete||this.completeTextData(m),this.currentData=m,this.currentData.boxWidth=this.currentData.boxWidth||this.defaultBoxWidth,this._mdf=!0},TextProperty.prototype.searchProperty=function(){return this.searchKeyframes()},TextProperty.prototype.searchKeyframes=function(){return this.kf=this.data.d.k.length>1,this.kf&&this.addEffect(this.getKeyframeValue.bind(this)),this.kf},TextProperty.prototype.addEffect=function(m){this.effectsSequence.push(m),this.elem.addDynamicProperty(this)},TextProperty.prototype.getValue=function(m){if(!((this.elem.globalData.frameId===this.frameId||!this.effectsSequence.length)&&!m)){this.currentData.t=this.data.d.k[this.keysIndex].s.t;var t=this.currentData,r=this.keysIndex;if(this.lock){this.setCurrentData(this.currentData);return}this.lock=!0,this._mdf=!1;var d,g=this.effectsSequence.length,v=m||this.data.d.k[this.keysIndex].s;for(d=0;d<g;d+=1)r!==this.keysIndex?v=this.effectsSequence[d](v,v.t):v=this.effectsSequence[d](this.currentData,v.t);t!==v&&this.setCurrentData(v),this.v=this.currentData,this.pv=this.v,this.lock=!1,this.frameId=this.elem.globalData.frameId}},TextProperty.prototype.getKeyframeValue=function(){for(var m=this.data.d.k,t=this.elem.comp.renderedFrame,r=0,d=m.length;r<=d-1&&!(r===d-1||m[r+1].t>t);)r+=1;return this.keysIndex!==r&&(this.keysIndex=r),this.data.d.k[this.keysIndex].s},TextProperty.prototype.buildFinalText=function(m){for(var t=[],r=0,d=m.length,g,v,C=!1;r<d;)g=m.charCodeAt(r),FontManager.isCombinedCharacter(g)?t[t.length-1]+=m.charAt(r):g>=55296&&g<=56319?(v=m.charCodeAt(r+1),v>=56320&&v<=57343?(C||FontManager.isModifier(g,v)?(t[t.length-1]+=m.substr(r,2),C=!1):t.push(m.substr(r,2)),r+=1):t.push(m.charAt(r))):g>56319?(v=m.charCodeAt(r+1),FontManager.isZeroWidthJoiner(g,v)?(C=!0,t[t.length-1]+=m.substr(r,2),r+=1):t.push(m.charAt(r))):FontManager.isZeroWidthJoiner(g)?(t[t.length-1]+=m.charAt(r),C=!0):t.push(m.charAt(r)),r+=1;return t},TextProperty.prototype.completeTextData=function(m){m.__complete=!0;var t=this.elem.globalData.fontManager,r=this.data,d=[],g,v,C,w=0,I,O=r.m.g,ye=0,Se=0,Pe=0,Ne=[],ke=0,ht=0,He,Fe,at=t.getFontByName(m.f),ct,xt=0,Gt=getFontProperties(at);m.fWeight=Gt.weight,m.fStyle=Gt.style,m.finalSize=m.s,m.finalText=this.buildFinalText(m.t),v=m.finalText.length,m.finalLineHeight=m.lh;var Lt=m.tr/1e3*m.finalSize,Wt;if(m.sz)for(var Pt=!0,Ft=m.sz[0],kt=m.sz[1],Kt,i0;Pt;){i0=this.buildFinalText(m.t),Kt=0,ke=0,v=i0.length,Lt=m.tr/1e3*m.finalSize;var r0=-1;for(g=0;g<v;g+=1)Wt=i0[g].charCodeAt(0),C=!1,i0[g]===" "?r0=g:(Wt===13||Wt===3)&&(ke=0,C=!0,Kt+=m.finalLineHeight||m.finalSize*1.2),t.chars?(ct=t.getCharData(i0[g],at.fStyle,at.fFamily),xt=C?0:ct.w*m.finalSize/100):xt=t.measureText(i0[g],m.f,m.finalSize),ke+xt>Ft&&i0[g]!==" "?(r0===-1?v+=1:g=r0,Kt+=m.finalLineHeight||m.finalSize*1.2,i0.splice(g,r0===g?1:0,"\r"),r0=-1,ke=0):(ke+=xt,ke+=Lt);Kt+=at.ascent*m.finalSize/100,this.canResize&&m.finalSize>this.minimumFontSize&&kt<Kt?(m.finalSize-=1,m.finalLineHeight=m.finalSize*m.lh/m.s):(m.finalText=i0,v=m.finalText.length,Pt=!1)}ke=-Lt,xt=0;var l0=0,n0;for(g=0;g<v;g+=1)if(C=!1,n0=m.finalText[g],Wt=n0.charCodeAt(0),Wt===13||Wt===3?(l0=0,Ne.push(ke),ht=ke>ht?ke:ht,ke=-2*Lt,I="",C=!0,Pe+=1):I=n0,t.chars?(ct=t.getCharData(n0,at.fStyle,t.getFontByName(m.f).fFamily),xt=C?0:ct.w*m.finalSize/100):xt=t.measureText(I,m.f,m.finalSize),n0===" "?l0+=xt+Lt:(ke+=xt+Lt+l0,l0=0),d.push({l:xt,an:xt,add:ye,n:C,anIndexes:[],val:I,line:Pe,animatorJustifyOffset:0}),O==2){if(ye+=xt,I===""||I===" "||g===v-1){for((I===""||I===" ")&&(ye-=xt);Se<=g;)d[Se].an=ye,d[Se].ind=w,d[Se].extra=xt,Se+=1;w+=1,ye=0}}else if(O==3){if(ye+=xt,I===""||g===v-1){for(I===""&&(ye-=xt);Se<=g;)d[Se].an=ye,d[Se].ind=w,d[Se].extra=xt,Se+=1;ye=0,w+=1}}else d[w].ind=w,d[w].extra=0,w+=1;if(m.l=d,ht=ke>ht?ke:ht,Ne.push(ke),m.sz)m.boxWidth=m.sz[0],m.justifyOffset=0;else switch(m.boxWidth=ht,m.j){case 1:m.justifyOffset=-m.boxWidth;break;case 2:m.justifyOffset=-m.boxWidth/2;break;default:m.justifyOffset=0}m.lineWidths=Ne;var Ut=r.a,e0,Yt;Fe=Ut.length;var o0,b0,f0=[];for(He=0;He<Fe;He+=1){for(e0=Ut[He],e0.a.sc&&(m.strokeColorAnim=!0),e0.a.sw&&(m.strokeWidthAnim=!0),(e0.a.fc||e0.a.fh||e0.a.fs||e0.a.fb)&&(m.fillColorAnim=!0),b0=0,o0=e0.s.b,g=0;g<v;g+=1)Yt=d[g],Yt.anIndexes[He]=b0,(o0==1&&Yt.val!==""||o0==2&&Yt.val!==""&&Yt.val!==" "||o0==3&&(Yt.n||Yt.val==" "||g==v-1)||o0==4&&(Yt.n||g==v-1))&&(e0.s.rn===1&&f0.push(b0),b0+=1);r.a[He].s.totalChars=b0;var P0=-1,q0;if(e0.s.rn===1)for(g=0;g<v;g+=1)Yt=d[g],P0!=Yt.anIndexes[He]&&(P0=Yt.anIndexes[He],q0=f0.splice(Math.floor(Math.random()*f0.length),1)[0]),Yt.anIndexes[He]=q0}m.yOffset=m.finalLineHeight||m.finalSize*1.2,m.ls=m.ls||0,m.ascent=at.ascent*m.finalSize/100},TextProperty.prototype.updateDocumentData=function(m,t){t=t===void 0?this.keysIndex:t;var r=this.copyData({},this.data.d.k[t].s);r=this.copyData(r,m),this.data.d.k[t].s=r,this.recalculate(t),this.elem.addDynamicProperty(this)},TextProperty.prototype.recalculate=function(m){var t=this.data.d.k[m].s;t.__complete=!1,this.keysIndex=0,this._isFirstFrame=!0,this.getValue(t)},TextProperty.prototype.canResizeFont=function(m){this.canResize=m,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)},TextProperty.prototype.setMinimumFontSize=function(m){this.minimumFontSize=Math.floor(m)||1,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)};const TextSelectorProp=function(){var m=Math.max,t=Math.min,r=Math.floor;function d(v,C){this._currentTextLength=-1,this.k=!1,this.data=C,this.elem=v,this.comp=v.comp,this.finalS=0,this.finalE=0,this.initDynamicPropertyContainer(v),this.s=PropertyFactory.getProp(v,C.s||{k:0},0,0,this),"e"in C?this.e=PropertyFactory.getProp(v,C.e,0,0,this):this.e={v:100},this.o=PropertyFactory.getProp(v,C.o||{k:0},0,0,this),this.xe=PropertyFactory.getProp(v,C.xe||{k:0},0,0,this),this.ne=PropertyFactory.getProp(v,C.ne||{k:0},0,0,this),this.sm=PropertyFactory.getProp(v,C.sm||{k:100},0,0,this),this.a=PropertyFactory.getProp(v,C.a,0,.01,this),this.dynamicProperties.length||this.getValue()}d.prototype={getMult:function(v){this._currentTextLength!==this.elem.textProperty.currentData.l.length&&this.getValue();var C=0,w=0,I=1,O=1;this.ne.v>0?C=this.ne.v/100:w=-this.ne.v/100,this.xe.v>0?I=1-this.xe.v/100:O=1+this.xe.v/100;var ye=BezierFactory.getBezierEasing(C,w,I,O).get,Se=0,Pe=this.finalS,Ne=this.finalE,ke=this.data.sh;if(ke===2)Ne===Pe?Se=v>=Ne?1:0:Se=m(0,t(.5/(Ne-Pe)+(v-Pe)/(Ne-Pe),1)),Se=ye(Se);else if(ke===3)Ne===Pe?Se=v>=Ne?0:1:Se=1-m(0,t(.5/(Ne-Pe)+(v-Pe)/(Ne-Pe),1)),Se=ye(Se);else if(ke===4)Ne===Pe?Se=0:(Se=m(0,t(.5/(Ne-Pe)+(v-Pe)/(Ne-Pe),1)),Se<.5?Se*=2:Se=1-2*(Se-.5)),Se=ye(Se);else if(ke===5){if(Ne===Pe)Se=0;else{var ht=Ne-Pe;v=t(m(0,v+.5-Pe),Ne-Pe);var He=-ht/2+v,Fe=ht/2;Se=Math.sqrt(1-He*He/(Fe*Fe))}Se=ye(Se)}else ke===6?(Ne===Pe?Se=0:(v=t(m(0,v+.5-Pe),Ne-Pe),Se=(1+Math.cos(Math.PI+Math.PI*2*v/(Ne-Pe)))/2),Se=ye(Se)):(v>=r(Pe)&&(v-Pe<0?Se=m(0,t(t(Ne,1)-(Pe-v),1)):Se=m(0,t(Ne-v,1))),Se=ye(Se));if(this.sm.v!==100){var at=this.sm.v*.01;at===0&&(at=1e-8);var ct=.5-at*.5;Se<ct?Se=0:(Se=(Se-ct)/at,Se>1&&(Se=1))}return Se*this.a.v},getValue:function(v){this.iterateDynamicProperties(),this._mdf=v||this._mdf,this._currentTextLength=this.elem.textProperty.currentData.l.length||0,v&&this.data.r===2&&(this.e.v=this._currentTextLength);var C=this.data.r===2?1:100/this.data.totalChars,w=this.o.v/C,I=this.s.v/C+w,O=this.e.v/C+w;if(I>O){var ye=I;I=O,O=ye}this.finalS=I,this.finalE=O}},extendPrototype([DynamicPropertyContainer],d);function g(v,C,w){return new d(v,C)}return{getTextSelectorProp:g}}();TextAnimatorProperty.prototype.searchProperties=function(){var m,t=this._textData.a.length,r,d=PropertyFactory.getProp;for(m=0;m<t;m+=1)r=this._textData.a[m],this._animatorsData[m]=new TextAnimatorDataProperty(this._elem,r,this);this._textData.p&&"m"in this._textData.p?(this._pathData={a:d(this._elem,this._textData.p.a,0,0,this),f:d(this._elem,this._textData.p.f,0,0,this),l:d(this._elem,this._textData.p.l,0,0,this),r:d(this._elem,this._textData.p.r,0,0,this),p:d(this._elem,this._textData.p.p,0,0,this),m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=d(this._elem,this._textData.m.a,1,0,this)},TextAnimatorProperty.prototype.getMeasures=function(m,t){if(this.lettersChangedFlag=t,!(!this._mdf&&!this._isFirstFrame&&!t&&(!this._hasMaskedPath||!this._pathData.m._mdf))){this._isFirstFrame=!1;var r=this._moreOptions.alignment.v,d=this._animatorsData,g=this._textData,v=this.mHelper,C=this._renderType,w=this.renderedLetters.length,I,O,ye,Se,Pe=m.l,Ne,ke,ht,He,Fe,at,ct,xt,Gt,Lt,Wt,Pt,Ft,kt,Kt;if(this._hasMaskedPath){if(Kt=this._pathData.m,!this._pathData.n||this._pathData._mdf){var i0=Kt.v;this._pathData.r.v&&(i0=i0.reverse()),Ne={tLength:0,segments:[]},Se=i0._length-1;var r0;for(Pt=0,ye=0;ye<Se;ye+=1)r0=bez.buildBezierData(i0.v[ye],i0.v[ye+1],[i0.o[ye][0]-i0.v[ye][0],i0.o[ye][1]-i0.v[ye][1]],[i0.i[ye+1][0]-i0.v[ye+1][0],i0.i[ye+1][1]-i0.v[ye+1][1]]),Ne.tLength+=r0.segmentLength,Ne.segments.push(r0),Pt+=r0.segmentLength;ye=Se,Kt.v.c&&(r0=bez.buildBezierData(i0.v[ye],i0.v[0],[i0.o[ye][0]-i0.v[ye][0],i0.o[ye][1]-i0.v[ye][1]],[i0.i[0][0]-i0.v[0][0],i0.i[0][1]-i0.v[0][1]]),Ne.tLength+=r0.segmentLength,Ne.segments.push(r0),Pt+=r0.segmentLength),this._pathData.pi=Ne}if(Ne=this._pathData.pi,ke=this._pathData.f.v,ct=0,at=1,He=0,Fe=!0,Lt=Ne.segments,ke<0&&Kt.v.c)for(Ne.tLength<Math.abs(ke)&&(ke=-Math.abs(ke)%Ne.tLength),ct=Lt.length-1,Gt=Lt[ct].points,at=Gt.length-1;ke<0;)ke+=Gt[at].partialLength,at-=1,at<0&&(ct-=1,Gt=Lt[ct].points,at=Gt.length-1);Gt=Lt[ct].points,xt=Gt[at-1],ht=Gt[at],Wt=ht.partialLength}Se=Pe.length,I=0,O=0;var l0=m.finalSize*1.2*.714,n0=!0,Ut,e0,Yt,o0,b0;o0=d.length;var f0,P0=-1,q0,G0,I0,F0=ke,D0=ct,Si=at,Ti=-1,Mi,Fi,Ni,B0,h0,xi,O0,J0,A0="",N0=this.defaultPropsArray,_0;if(m.j===2||m.j===1){var a0=0,s0=0,v0=m.j===2?-.5:-1,C0=0,E0=!0;for(ye=0;ye<Se;ye+=1)if(Pe[ye].n){for(a0&&(a0+=s0);C0<ye;)Pe[C0].animatorJustifyOffset=a0,C0+=1;a0=0,E0=!0}else{for(Yt=0;Yt<o0;Yt+=1)Ut=d[Yt].a,Ut.t.propType&&(E0&&m.j===2&&(s0+=Ut.t.v*v0),e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),f0.length?a0+=Ut.t.v*f0[0]*v0:a0+=Ut.t.v*f0*v0);E0=!1}for(a0&&(a0+=s0);C0<ye;)Pe[C0].animatorJustifyOffset=a0,C0+=1}for(ye=0;ye<Se;ye+=1){if(v.reset(),Mi=1,Pe[ye].n)I=0,O+=m.yOffset,O+=n0?1:0,ke=F0,n0=!1,this._hasMaskedPath&&(ct=D0,at=Si,Gt=Lt[ct].points,xt=Gt[at-1],ht=Gt[at],Wt=ht.partialLength,He=0),A0="",J0="",xi="",_0="",N0=this.defaultPropsArray;else{if(this._hasMaskedPath){if(Ti!==Pe[ye].line){switch(m.j){case 1:ke+=Pt-m.lineWidths[Pe[ye].line];break;case 2:ke+=(Pt-m.lineWidths[Pe[ye].line])/2;break}Ti=Pe[ye].line}P0!==Pe[ye].ind&&(Pe[P0]&&(ke+=Pe[P0].extra),ke+=Pe[ye].an/2,P0=Pe[ye].ind),ke+=r[0]*Pe[ye].an*.005;var w0=0;for(Yt=0;Yt<o0;Yt+=1)Ut=d[Yt].a,Ut.p.propType&&(e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),f0.length?w0+=Ut.p.v[0]*f0[0]:w0+=Ut.p.v[0]*f0),Ut.a.propType&&(e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),f0.length?w0+=Ut.a.v[0]*f0[0]:w0+=Ut.a.v[0]*f0);for(Fe=!0,this._pathData.a.v&&(ke=Pe[0].an*.5+(Pt-this._pathData.f.v-Pe[0].an*.5-Pe[Pe.length-1].an*.5)*P0/(Se-1),ke+=this._pathData.f.v);Fe;)He+Wt>=ke+w0||!Gt?(Ft=(ke+w0-He)/ht.partialLength,G0=xt.point[0]+(ht.point[0]-xt.point[0])*Ft,I0=xt.point[1]+(ht.point[1]-xt.point[1])*Ft,v.translate(-r[0]*Pe[ye].an*.005,-(r[1]*l0)*.01),Fe=!1):Gt&&(He+=ht.partialLength,at+=1,at>=Gt.length&&(at=0,ct+=1,Lt[ct]?Gt=Lt[ct].points:Kt.v.c?(at=0,ct=0,Gt=Lt[ct].points):(He-=ht.partialLength,Gt=null)),Gt&&(xt=ht,ht=Gt[at],Wt=ht.partialLength));q0=Pe[ye].an/2-Pe[ye].add,v.translate(-q0,0,0)}else q0=Pe[ye].an/2-Pe[ye].add,v.translate(-q0,0,0),v.translate(-r[0]*Pe[ye].an*.005,-r[1]*l0*.01,0);for(Yt=0;Yt<o0;Yt+=1)Ut=d[Yt].a,Ut.t.propType&&(e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),(I!==0||m.j!==0)&&(this._hasMaskedPath?f0.length?ke+=Ut.t.v*f0[0]:ke+=Ut.t.v*f0:f0.length?I+=Ut.t.v*f0[0]:I+=Ut.t.v*f0));for(m.strokeWidthAnim&&(Ni=m.sw||0),m.strokeColorAnim&&(m.sc?Fi=[m.sc[0],m.sc[1],m.sc[2]]:Fi=[0,0,0]),m.fillColorAnim&&m.fc&&(B0=[m.fc[0],m.fc[1],m.fc[2]]),Yt=0;Yt<o0;Yt+=1)Ut=d[Yt].a,Ut.a.propType&&(e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),f0.length?v.translate(-Ut.a.v[0]*f0[0],-Ut.a.v[1]*f0[1],Ut.a.v[2]*f0[2]):v.translate(-Ut.a.v[0]*f0,-Ut.a.v[1]*f0,Ut.a.v[2]*f0));for(Yt=0;Yt<o0;Yt+=1)Ut=d[Yt].a,Ut.s.propType&&(e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),f0.length?v.scale(1+(Ut.s.v[0]-1)*f0[0],1+(Ut.s.v[1]-1)*f0[1],1):v.scale(1+(Ut.s.v[0]-1)*f0,1+(Ut.s.v[1]-1)*f0,1));for(Yt=0;Yt<o0;Yt+=1){if(Ut=d[Yt].a,e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),Ut.sk.propType&&(f0.length?v.skewFromAxis(-Ut.sk.v*f0[0],Ut.sa.v*f0[1]):v.skewFromAxis(-Ut.sk.v*f0,Ut.sa.v*f0)),Ut.r.propType&&(f0.length?v.rotateZ(-Ut.r.v*f0[2]):v.rotateZ(-Ut.r.v*f0)),Ut.ry.propType&&(f0.length?v.rotateY(Ut.ry.v*f0[1]):v.rotateY(Ut.ry.v*f0)),Ut.rx.propType&&(f0.length?v.rotateX(Ut.rx.v*f0[0]):v.rotateX(Ut.rx.v*f0)),Ut.o.propType&&(f0.length?Mi+=(Ut.o.v*f0[0]-Mi)*f0[0]:Mi+=(Ut.o.v*f0-Mi)*f0),m.strokeWidthAnim&&Ut.sw.propType&&(f0.length?Ni+=Ut.sw.v*f0[0]:Ni+=Ut.sw.v*f0),m.strokeColorAnim&&Ut.sc.propType)for(h0=0;h0<3;h0+=1)f0.length?Fi[h0]+=(Ut.sc.v[h0]-Fi[h0])*f0[0]:Fi[h0]+=(Ut.sc.v[h0]-Fi[h0])*f0;if(m.fillColorAnim&&m.fc){if(Ut.fc.propType)for(h0=0;h0<3;h0+=1)f0.length?B0[h0]+=(Ut.fc.v[h0]-B0[h0])*f0[0]:B0[h0]+=(Ut.fc.v[h0]-B0[h0])*f0;Ut.fh.propType&&(f0.length?B0=addHueToRGB(B0,Ut.fh.v*f0[0]):B0=addHueToRGB(B0,Ut.fh.v*f0)),Ut.fs.propType&&(f0.length?B0=addSaturationToRGB(B0,Ut.fs.v*f0[0]):B0=addSaturationToRGB(B0,Ut.fs.v*f0)),Ut.fb.propType&&(f0.length?B0=addBrightnessToRGB(B0,Ut.fb.v*f0[0]):B0=addBrightnessToRGB(B0,Ut.fb.v*f0))}}for(Yt=0;Yt<o0;Yt+=1)Ut=d[Yt].a,Ut.p.propType&&(e0=d[Yt].s,f0=e0.getMult(Pe[ye].anIndexes[Yt],g.a[Yt].s.totalChars),this._hasMaskedPath?f0.length?v.translate(0,Ut.p.v[1]*f0[0],-Ut.p.v[2]*f0[1]):v.translate(0,Ut.p.v[1]*f0,-Ut.p.v[2]*f0):f0.length?v.translate(Ut.p.v[0]*f0[0],Ut.p.v[1]*f0[1],-Ut.p.v[2]*f0[2]):v.translate(Ut.p.v[0]*f0,Ut.p.v[1]*f0,-Ut.p.v[2]*f0));if(m.strokeWidthAnim&&(xi=Ni<0?0:Ni),m.strokeColorAnim&&(O0="rgb("+Math.round(Fi[0]*255)+","+Math.round(Fi[1]*255)+","+Math.round(Fi[2]*255)+")"),m.fillColorAnim&&m.fc&&(J0="rgb("+Math.round(B0[0]*255)+","+Math.round(B0[1]*255)+","+Math.round(B0[2]*255)+")"),this._hasMaskedPath){if(v.translate(0,-m.ls),v.translate(0,r[1]*l0*.01+O,0),this._pathData.p.v){kt=(ht.point[1]-xt.point[1])/(ht.point[0]-xt.point[0]);var vi=Math.atan(kt)*180/Math.PI;ht.point[0]<xt.point[0]&&(vi+=180),v.rotate(-vi*Math.PI/180)}v.translate(G0,I0,0),ke-=r[0]*Pe[ye].an*.005,Pe[ye+1]&&P0!==Pe[ye+1].ind&&(ke+=Pe[ye].an/2,ke+=m.tr*.001*m.finalSize)}else{switch(v.translate(I,O,0),m.ps&&v.translate(m.ps[0],m.ps[1]+m.ascent,0),m.j){case 1:v.translate(Pe[ye].animatorJustifyOffset+m.justifyOffset+(m.boxWidth-m.lineWidths[Pe[ye].line]),0,0);break;case 2:v.translate(Pe[ye].animatorJustifyOffset+m.justifyOffset+(m.boxWidth-m.lineWidths[Pe[ye].line])/2,0,0);break}v.translate(0,-m.ls),v.translate(q0,0,0),v.translate(r[0]*Pe[ye].an*.005,r[1]*l0*.01,0),I+=Pe[ye].l+m.tr*.001*m.finalSize}C==="html"?A0=v.toCSS():C==="svg"?A0=v.to2dCSS():N0=[v.props[0],v.props[1],v.props[2],v.props[3],v.props[4],v.props[5],v.props[6],v.props[7],v.props[8],v.props[9],v.props[10],v.props[11],v.props[12],v.props[13],v.props[14],v.props[15]],_0=Mi}w<=ye?(b0=new LetterProps(_0,xi,O0,J0,A0,N0),this.renderedLetters.push(b0),w+=1,this.lettersChangedFlag=!0):(b0=this.renderedLetters[ye],this.lettersChangedFlag=b0.update(_0,xi,O0,J0,A0,N0)||this.lettersChangedFlag)}}},TextAnimatorProperty.prototype.getValue=function(){this._elem.globalData.frameId!==this._frameId&&(this._frameId=this._elem.globalData.frameId,this.iterateDynamicProperties())},TextAnimatorProperty.prototype.mHelper=new Matrix,TextAnimatorProperty.prototype.defaultPropsArray=[],extendPrototype([DynamicPropertyContainer],TextAnimatorProperty),ITextElement.prototype.initElement=function(m,t,r){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(m,t,r),this.textProperty=new TextProperty(this,m.t,this.dynamicProperties),this.textAnimator=new TextAnimatorProperty(m.t,this.renderType,this),this.initTransform(m,t,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide(),this.textAnimator.searchProperties(this.dynamicProperties)},ITextElement.prototype.prepareFrame=function(m){this._mdf=!1,this.prepareRenderableFrame(m),this.prepareProperties(m,this.isInRange),(this.textProperty._mdf||this.textProperty._isFirstFrame)&&(this.buildNewText(),this.textProperty._isFirstFrame=!1,this.textProperty._mdf=!1)},ITextElement.prototype.createPathShape=function(m,t){var r,d=t.length,g,v="";for(r=0;r<d;r+=1)t[r].ty==="sh"&&(g=t[r].ks.k,v+=buildShapeString(g,g.i.length,!0,m));return v},ITextElement.prototype.updateDocumentData=function(m,t){this.textProperty.updateDocumentData(m,t)},ITextElement.prototype.canResizeFont=function(m){this.textProperty.canResizeFont(m)},ITextElement.prototype.setMinimumFontSize=function(m){this.textProperty.setMinimumFontSize(m)},ITextElement.prototype.applyTextPropertiesToMatrix=function(m,t,r,d,g){switch(m.ps&&t.translate(m.ps[0],m.ps[1]+m.ascent,0),t.translate(0,-m.ls,0),m.j){case 1:t.translate(m.justifyOffset+(m.boxWidth-m.lineWidths[r]),0,0);break;case 2:t.translate(m.justifyOffset+(m.boxWidth-m.lineWidths[r])/2,0,0);break}t.translate(d,g,0)},ITextElement.prototype.buildColor=function(m){return"rgb("+Math.round(m[0]*255)+","+Math.round(m[1]*255)+","+Math.round(m[2]*255)+")"},ITextElement.prototype.emptyProp=new LetterProps,ITextElement.prototype.destroy=function(){};var emptyShapeData={shapes:[]};extendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement,ITextElement],SVGTextLottieElement),SVGTextLottieElement.prototype.createContent=function(){this.data.singleShape&&!this.globalData.fontManager.chars&&(this.textContainer=createNS("text"))},SVGTextLottieElement.prototype.buildTextContents=function(m){for(var t=0,r=m.length,d=[],g="";t<r;)m[t]==="\r"||m[t]===""?(d.push(g),g=""):g+=m[t],t+=1;return d.push(g),d},SVGTextLottieElement.prototype.buildShapeData=function(m,t){if(m.shapes&&m.shapes.length){var r=m.shapes[0];if(r.it){var d=r.it[r.it.length-1];d.s&&(d.s.k[0]=t,d.s.k[1]=t)}}return m},SVGTextLottieElement.prototype.buildNewText=function(){this.addDynamicProperty(this);var m,t,r=this.textProperty.currentData;this.renderedLetters=createSizedArray(r?r.l.length:0),r.fc?this.layerElement.setAttribute("fill",this.buildColor(r.fc)):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),r.sc&&(this.layerElement.setAttribute("stroke",this.buildColor(r.sc)),this.layerElement.setAttribute("stroke-width",r.sw)),this.layerElement.setAttribute("font-size",r.finalSize);var d=this.globalData.fontManager.getFontByName(r.f);if(d.fClass)this.layerElement.setAttribute("class",d.fClass);else{this.layerElement.setAttribute("font-family",d.fFamily);var g=r.fWeight,v=r.fStyle;this.layerElement.setAttribute("font-style",v),this.layerElement.setAttribute("font-weight",g)}this.layerElement.setAttribute("aria-label",r.t);var C=r.l||[],w=!!this.globalData.fontManager.chars;t=C.length;var I,O=this.mHelper,ye="",Se=this.data.singleShape,Pe=0,Ne=0,ke=!0,ht=r.tr*.001*r.finalSize;if(Se&&!w&&!r.sz){var He=this.textContainer,Fe="start";switch(r.j){case 1:Fe="end";break;case 2:Fe="middle";break;default:Fe="start";break}He.setAttribute("text-anchor",Fe),He.setAttribute("letter-spacing",ht);var at=this.buildTextContents(r.finalText);for(t=at.length,Ne=r.ps?r.ps[1]+r.ascent:0,m=0;m<t;m+=1)I=this.textSpans[m].span||createNS("tspan"),I.textContent=at[m],I.setAttribute("x",0),I.setAttribute("y",Ne),I.style.display="inherit",He.appendChild(I),this.textSpans[m]||(this.textSpans[m]={span:null,glyph:null}),this.textSpans[m].span=I,Ne+=r.finalLineHeight;this.layerElement.appendChild(He)}else{var ct=this.textSpans.length,xt;for(m=0;m<t;m+=1){if(this.textSpans[m]||(this.textSpans[m]={span:null,childSpan:null,glyph:null}),!w||!Se||m===0){if(I=ct>m?this.textSpans[m].span:createNS(w?"g":"text"),ct<=m){if(I.setAttribute("stroke-linecap","butt"),I.setAttribute("stroke-linejoin","round"),I.setAttribute("stroke-miterlimit","4"),this.textSpans[m].span=I,w){var Gt=createNS("g");I.appendChild(Gt),this.textSpans[m].childSpan=Gt}this.textSpans[m].span=I,this.layerElement.appendChild(I)}I.style.display="inherit"}if(O.reset(),Se&&(C[m].n&&(Pe=-ht,Ne+=r.yOffset,Ne+=ke?1:0,ke=!1),this.applyTextPropertiesToMatrix(r,O,C[m].line,Pe,Ne),Pe+=C[m].l||0,Pe+=ht),w){xt=this.globalData.fontManager.getCharData(r.finalText[m],d.fStyle,this.globalData.fontManager.getFontByName(r.f).fFamily);var Lt;if(xt.t===1)Lt=new SVGCompElement(xt.data,this.globalData,this);else{var Wt=emptyShapeData;xt.data&&xt.data.shapes&&(Wt=this.buildShapeData(xt.data,r.finalSize)),Lt=new SVGShapeElement(Wt,this.globalData,this)}if(this.textSpans[m].glyph){var Pt=this.textSpans[m].glyph;this.textSpans[m].childSpan.removeChild(Pt.layerElement),Pt.destroy()}this.textSpans[m].glyph=Lt,Lt._debug=!0,Lt.prepareFrame(0),Lt.renderFrame(),this.textSpans[m].childSpan.appendChild(Lt.layerElement),xt.t===1&&this.textSpans[m].childSpan.setAttribute("transform","scale("+r.finalSize/100+","+r.finalSize/100+")")}else Se&&I.setAttribute("transform","translate("+O.props[12]+","+O.props[13]+")"),I.textContent=C[m].val,I.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve")}Se&&I&&I.setAttribute("d",ye)}for(;m<this.textSpans.length;)this.textSpans[m].span.style.display="none",m+=1;this._sizeChanged=!0},SVGTextLottieElement.prototype.sourceRectAtTime=function(){if(this.prepareFrame(this.comp.renderedFrame-this.data.st),this.renderInnerContent(),this._sizeChanged){this._sizeChanged=!1;var m=this.layerElement.getBBox();this.bbox={top:m.y,left:m.x,width:m.width,height:m.height}}return this.bbox},SVGTextLottieElement.prototype.getValue=function(){var m,t=this.textSpans.length,r;for(this.renderedFrame=this.comp.renderedFrame,m=0;m<t;m+=1)r=this.textSpans[m].glyph,r&&(r.prepareFrame(this.comp.renderedFrame-this.data.st),r._mdf&&(this._mdf=!0))},SVGTextLottieElement.prototype.renderInnerContent=function(){if((!this.data.singleShape||this._mdf)&&(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag)){this._sizeChanged=!0;var m,t,r=this.textAnimator.renderedLetters,d=this.textProperty.currentData.l;t=d.length;var g,v,C;for(m=0;m<t;m+=1)d[m].n||(g=r[m],v=this.textSpans[m].span,C=this.textSpans[m].glyph,C&&C.renderFrame(),g._mdf.m&&v.setAttribute("transform",g.m),g._mdf.o&&v.setAttribute("opacity",g.o),g._mdf.sw&&v.setAttribute("stroke-width",g.sw),g._mdf.sc&&v.setAttribute("stroke",g.sc),g._mdf.fc&&v.setAttribute("fill",g.fc))}},extendPrototype([IImageElement],ISolidElement),ISolidElement.prototype.createContent=function(){var m=createNS("rect");m.setAttribute("width",this.data.sw),m.setAttribute("height",this.data.sh),m.setAttribute("fill",this.data.sc),this.layerElement.appendChild(m)},NullElement.prototype.prepareFrame=function(m){this.prepareProperties(m,!0)},NullElement.prototype.renderFrame=function(){},NullElement.prototype.getBaseElement=function(){return null},NullElement.prototype.destroy=function(){},NullElement.prototype.sourceRectAtTime=function(){},NullElement.prototype.hide=function(){},extendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement],NullElement),extendPrototype([BaseRenderer],SVGRendererBase),SVGRendererBase.prototype.createNull=function(m){return new NullElement(m,this.globalData,this)},SVGRendererBase.prototype.createShape=function(m){return new SVGShapeElement(m,this.globalData,this)},SVGRendererBase.prototype.createText=function(m){return new SVGTextLottieElement(m,this.globalData,this)},SVGRendererBase.prototype.createImage=function(m){return new IImageElement(m,this.globalData,this)},SVGRendererBase.prototype.createSolid=function(m){return new ISolidElement(m,this.globalData,this)},SVGRendererBase.prototype.configAnimation=function(m){this.svgElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this.svgElement.setAttribute("viewBox",this.renderConfig.viewBoxSize):this.svgElement.setAttribute("viewBox","0 0 "+m.w+" "+m.h),this.renderConfig.viewBoxOnly||(this.svgElement.setAttribute("width",m.w),this.svgElement.setAttribute("height",m.h),this.svgElement.style.width="100%",this.svgElement.style.height="100%",this.svgElement.style.transform="translate3d(0,0,0)",this.svgElement.style.contentVisibility=this.renderConfig.contentVisibility),this.renderConfig.width&&this.svgElement.setAttribute("width",this.renderConfig.width),this.renderConfig.height&&this.svgElement.setAttribute("height",this.renderConfig.height),this.renderConfig.className&&this.svgElement.setAttribute("class",this.renderConfig.className),this.renderConfig.id&&this.svgElement.setAttribute("id",this.renderConfig.id),this.renderConfig.focusable!==void 0&&this.svgElement.setAttribute("focusable",this.renderConfig.focusable),this.svgElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.animationItem.wrapper.appendChild(this.svgElement);var t=this.globalData.defs;this.setupGlobalData(m,t),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.data=m;var r=createNS("clipPath"),d=createNS("rect");d.setAttribute("width",m.w),d.setAttribute("height",m.h),d.setAttribute("x",0),d.setAttribute("y",0);var g=createElementID();r.setAttribute("id",g),r.appendChild(d),this.layerElement.setAttribute("clip-path","url("+getLocationHref()+"#"+g+")"),t.appendChild(r),this.layers=m.layers,this.elements=createSizedArray(m.layers.length)},SVGRendererBase.prototype.destroy=function(){this.animationItem.wrapper&&(this.animationItem.wrapper.innerText=""),this.layerElement=null,this.globalData.defs=null;var m,t=this.layers?this.layers.length:0;for(m=0;m<t;m+=1)this.elements[m]&&this.elements[m].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},SVGRendererBase.prototype.updateContainerSize=function(){},SVGRendererBase.prototype.buildItem=function(m){var t=this.elements;if(!(t[m]||this.layers[m].ty===99)){t[m]=!0;var r=this.createItem(this.layers[m]);t[m]=r,getExpressionsPlugin()&&(this.layers[m].ty===0&&this.globalData.projectInterface.registerComposition(r),r.initExpressions()),this.appendElementInPos(r,m),this.layers[m].tt&&(!this.elements[m-1]||this.elements[m-1]===!0?(this.buildItem(m-1),this.addPendingElement(r)):r.setMatte(t[m-1].layerId))}},SVGRendererBase.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var m=this.pendingElements.pop();if(m.checkParenting(),m.data.tt)for(var t=0,r=this.elements.length;t<r;){if(this.elements[t]===m){m.setMatte(this.elements[t-1].layerId);break}t+=1}}},SVGRendererBase.prototype.renderFrame=function(m){if(!(this.renderedFrame===m||this.destroyed)){m===null?m=this.renderedFrame:this.renderedFrame=m,this.globalData.frameNum=m,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=m,this.globalData._mdf=!1;var t,r=this.layers.length;for(this.completeLayers||this.checkLayers(m),t=r-1;t>=0;t-=1)(this.completeLayers||this.elements[t])&&this.elements[t].prepareFrame(m-this.layers[t].st);if(this.globalData._mdf)for(t=0;t<r;t+=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()}},SVGRendererBase.prototype.appendElementInPos=function(m,t){var r=m.getBaseElement();if(r){for(var d=0,g;d<t;)this.elements[d]&&this.elements[d]!==!0&&this.elements[d].getBaseElement()&&(g=this.elements[d].getBaseElement()),d+=1;g?this.layerElement.insertBefore(r,g):this.layerElement.appendChild(r)}},SVGRendererBase.prototype.hide=function(){this.layerElement.style.display="none"},SVGRendererBase.prototype.show=function(){this.layerElement.style.display="block"},extendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement,RenderableDOMElement],ICompElement),ICompElement.prototype.initElement=function(m,t,r){this.initFrame(),this.initBaseData(m,t,r),this.initTransform(m,t,r),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),(this.data.xt||!t.progressiveLoad)&&this.buildAllItems(),this.hide()},ICompElement.prototype.prepareFrame=function(m){if(this._mdf=!1,this.prepareRenderableFrame(m),this.prepareProperties(m,this.isInRange),!(!this.isInRange&&!this.data.xt)){if(this.tm._placeholder)this.renderedFrame=m/this.data.sr;else{var t=this.tm.v;t===this.data.op&&(t=this.data.op-1),this.renderedFrame=t}var r,d=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),r=d-1;r>=0;r-=1)(this.completeLayers||this.elements[r])&&(this.elements[r].prepareFrame(this.renderedFrame-this.layers[r].st),this.elements[r]._mdf&&(this._mdf=!0))}},ICompElement.prototype.renderInnerContent=function(){var m,t=this.layers.length;for(m=0;m<t;m+=1)(this.completeLayers||this.elements[m])&&this.elements[m].renderFrame()},ICompElement.prototype.setElements=function(m){this.elements=m},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroyElements=function(){var m,t=this.layers.length;for(m=0;m<t;m+=1)this.elements[m]&&this.elements[m].destroy()},ICompElement.prototype.destroy=function(){this.destroyElements(),this.destroyBaseElement()},extendPrototype([SVGRendererBase,ICompElement,SVGBaseElement],SVGCompElement),SVGCompElement.prototype.createComp=function(m){return new SVGCompElement(m,this.globalData,this)},extendPrototype([SVGRendererBase],SVGRenderer),SVGRenderer.prototype.createComp=function(m){return new SVGCompElement(m,this.globalData,this)},CVContextData.prototype.duplicate=function(){var m=this._length*2,t=this.savedOp;this.savedOp=createTypedArray("float32",m),this.savedOp.set(t);var r=0;for(r=this._length;r<m;r+=1)this.saved[r]=createTypedArray("float32",16);this._length=m},CVContextData.prototype.reset=function(){this.cArrPos=0,this.cTr.reset(),this.cO=1},ShapeTransformManager.prototype={addTransformSequence:function(m){var t,r=m.length,d="_";for(t=0;t<r;t+=1)d+=m[t].transform.key+"_";var g=this.sequences[d];return g||(g={transforms:[].concat(m),finalTransform:new Matrix,_mdf:!1},this.sequences[d]=g,this.sequenceList.push(g)),g},processSequence:function(m,t){for(var r=0,d=m.transforms.length,g=t;r<d&&!t;){if(m.transforms[r].transform.mProps._mdf){g=!0;break}r+=1}if(g){var v;for(m.finalTransform.reset(),r=d-1;r>=0;r-=1)v=m.transforms[r].transform.mProps.v.props,m.finalTransform.transform(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11],v[12],v[13],v[14],v[15])}m._mdf=g},processSequences:function(m){var t,r=this.sequenceList.length;for(t=0;t<r;t+=1)this.processSequence(this.sequenceList[t],m)},getNewKey:function(){return this.transform_key_count+=1,"_"+this.transform_key_count}},CVEffects.prototype.renderFrame=function(){},CVMaskElement.prototype.renderFrame=function(){if(this.hasMasks){var m=this.element.finalTransform.mat,t=this.element.canvasContext,r,d=this.masksProperties.length,g,v,C;for(t.beginPath(),r=0;r<d;r+=1)if(this.masksProperties[r].mode!=="n"){this.masksProperties[r].inv&&(t.moveTo(0,0),t.lineTo(this.element.globalData.compSize.w,0),t.lineTo(this.element.globalData.compSize.w,this.element.globalData.compSize.h),t.lineTo(0,this.element.globalData.compSize.h),t.lineTo(0,0)),C=this.viewData[r].v,g=m.applyToPointArray(C.v[0][0],C.v[0][1],0),t.moveTo(g[0],g[1]);var w,I=C._length;for(w=1;w<I;w+=1)v=m.applyToTriplePoints(C.o[w-1],C.i[w],C.v[w]),t.bezierCurveTo(v[0],v[1],v[2],v[3],v[4],v[5]);v=m.applyToTriplePoints(C.o[w-1],C.i[0],C.v[0]),t.bezierCurveTo(v[0],v[1],v[2],v[3],v[4],v[5])}this.element.globalData.renderer.save(!0),t.clip()}},CVMaskElement.prototype.getMaskProperty=MaskElement.prototype.getMaskProperty,CVMaskElement.prototype.destroy=function(){this.element=null},CVBaseElement.prototype={createElements:function(){},initRendererElement:function(){},createContainerElements:function(){this.canvasContext=this.globalData.canvasContext,this.renderableEffectsManager=new CVEffects},createContent:function(){},setBlendMode:function(){var m=this.globalData;if(m.blendMode!==this.data.bm){m.blendMode=this.data.bm;var t=getBlendMode(this.data.bm);m.canvasContext.globalCompositeOperation=t}},createRenderableComponents:function(){this.maskManager=new CVMaskElement(this.data,this)},hideElement:function(){!this.hidden&&(!this.isInRange||this.isTransparent)&&(this.hidden=!0)},showElement:function(){this.isInRange&&!this.isTransparent&&(this.hidden=!1,this._isFirstFrame=!0,this.maskManager._isFirstFrame=!0)},renderFrame:function(){if(!(this.hidden||this.data.hd)){this.renderTransform(),this.renderRenderable(),this.setBlendMode();var m=this.data.ty===0;this.globalData.renderer.save(m),this.globalData.renderer.ctxTransform(this.finalTransform.mat.props),this.globalData.renderer.ctxOpacity(this.finalTransform.mProp.o.v),this.renderInnerContent(),this.globalData.renderer.restore(m),this.maskManager.hasMasks&&this.globalData.renderer.restore(!0),this._isFirstFrame&&(this._isFirstFrame=!1)}},destroy:function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager.destroy()},mHelper:new Matrix},CVBaseElement.prototype.hide=CVBaseElement.prototype.hideElement,CVBaseElement.prototype.show=CVBaseElement.prototype.showElement,CVShapeData.prototype.setAsAnimated=SVGShapeData.prototype.setAsAnimated,extendPrototype([BaseElement,TransformElement,CVBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableElement],CVShapeElement),CVShapeElement.prototype.initElement=RenderableDOMElement.prototype.initElement,CVShapeElement.prototype.transformHelper={opacity:1,_opMdf:!1},CVShapeElement.prototype.dashResetter=[],CVShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[])},CVShapeElement.prototype.createStyleElement=function(m,t){var r={data:m,type:m.ty,preTransforms:this.transformsManager.addTransformSequence(t),transforms:[],elements:[],closed:m.hd===!0},d={};if(m.ty==="fl"||m.ty==="st"?(d.c=PropertyFactory.getProp(this,m.c,1,255,this),d.c.k||(r.co="rgb("+bmFloor(d.c.v[0])+","+bmFloor(d.c.v[1])+","+bmFloor(d.c.v[2])+")")):(m.ty==="gf"||m.ty==="gs")&&(d.s=PropertyFactory.getProp(this,m.s,1,null,this),d.e=PropertyFactory.getProp(this,m.e,1,null,this),d.h=PropertyFactory.getProp(this,m.h||{k:0},0,.01,this),d.a=PropertyFactory.getProp(this,m.a||{k:0},0,degToRads,this),d.g=new GradientProperty(this,m.g,this)),d.o=PropertyFactory.getProp(this,m.o,0,.01,this),m.ty==="st"||m.ty==="gs"){if(r.lc=lineCapEnum[m.lc||2],r.lj=lineJoinEnum[m.lj||2],m.lj==1&&(r.ml=m.ml),d.w=PropertyFactory.getProp(this,m.w,0,null,this),d.w.k||(r.wi=d.w.v),m.d){var g=new DashProperty(this,m.d,"canvas",this);d.d=g,d.d.k||(r.da=d.d.dashArray,r.do=d.d.dashoffset[0])}}else r.r=m.r===2?"evenodd":"nonzero";return this.stylesList.push(r),d.style=r,d},CVShapeElement.prototype.createGroupElement=function(){var m={it:[],prevViewData:[]};return m},CVShapeElement.prototype.createTransformElement=function(m){var t={transform:{opacity:1,_opMdf:!1,key:this.transformsManager.getNewKey(),op:PropertyFactory.getProp(this,m.o,0,.01,this),mProps:TransformPropertyFactory.getTransformProperty(this,m,this)}};return t},CVShapeElement.prototype.createShapeElement=function(m){var t=new CVShapeData(this,m,this.stylesList,this.transformsManager);return this.shapes.push(t),this.addShapeToModifiers(t),t},CVShapeElement.prototype.reloadShapes=function(){this._isFirstFrame=!0;var m,t=this.itemsData.length;for(m=0;m<t;m+=1)this.prevViewData[m]=this.itemsData[m];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[]),t=this.dynamicProperties.length,m=0;m<t;m+=1)this.dynamicProperties[m].getValue();this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame)},CVShapeElement.prototype.addTransformToStyleList=function(m){var t,r=this.stylesList.length;for(t=0;t<r;t+=1)this.stylesList[t].closed||this.stylesList[t].transforms.push(m)},CVShapeElement.prototype.removeTransformFromStyleList=function(){var m,t=this.stylesList.length;for(m=0;m<t;m+=1)this.stylesList[m].closed||this.stylesList[m].transforms.pop()},CVShapeElement.prototype.closeStyles=function(m){var t,r=m.length;for(t=0;t<r;t+=1)m[t].closed=!0},CVShapeElement.prototype.searchShapes=function(m,t,r,d,g){var v,C=m.length-1,w,I,O=[],ye=[],Se,Pe,Ne,ke=[].concat(g);for(v=C;v>=0;v-=1){if(Se=this.searchProcessedElement(m[v]),Se?t[v]=r[Se-1]:m[v]._shouldRender=d,m[v].ty==="fl"||m[v].ty==="st"||m[v].ty==="gf"||m[v].ty==="gs")Se?t[v].style.closed=!1:t[v]=this.createStyleElement(m[v],ke),O.push(t[v].style);else if(m[v].ty==="gr"){if(!Se)t[v]=this.createGroupElement(m[v]);else for(I=t[v].it.length,w=0;w<I;w+=1)t[v].prevViewData[w]=t[v].it[w];this.searchShapes(m[v].it,t[v].it,t[v].prevViewData,d,ke)}else m[v].ty==="tr"?(Se||(Ne=this.createTransformElement(m[v]),t[v]=Ne),ke.push(t[v]),this.addTransformToStyleList(t[v])):m[v].ty==="sh"||m[v].ty==="rc"||m[v].ty==="el"||m[v].ty==="sr"?Se||(t[v]=this.createShapeElement(m[v])):m[v].ty==="tm"||m[v].ty==="rd"||m[v].ty==="pb"?(Se?(Pe=t[v],Pe.closed=!1):(Pe=ShapeModifiers.getModifier(m[v].ty),Pe.init(this,m[v]),t[v]=Pe,this.shapeModifiers.push(Pe)),ye.push(Pe)):m[v].ty==="rp"&&(Se?(Pe=t[v],Pe.closed=!0):(Pe=ShapeModifiers.getModifier(m[v].ty),t[v]=Pe,Pe.init(this,m,v,t),this.shapeModifiers.push(Pe),d=!1),ye.push(Pe));this.addProcessedElement(m[v],v+1)}for(this.removeTransformFromStyleList(),this.closeStyles(O),C=ye.length,v=0;v<C;v+=1)ye[v].closed=!0},CVShapeElement.prototype.renderInnerContent=function(){this.transformHelper.opacity=1,this.transformHelper._opMdf=!1,this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame),this.renderShape(this.transformHelper,this.shapesData,this.itemsData,!0)},CVShapeElement.prototype.renderShapeTransform=function(m,t){(m._opMdf||t.op._mdf||this._isFirstFrame)&&(t.opacity=m.opacity,t.opacity*=t.op.v,t._opMdf=!0)},CVShapeElement.prototype.drawLayer=function(){var m,t=this.stylesList.length,r,d,g,v,C,w,I=this.globalData.renderer,O=this.globalData.canvasContext,ye,Se;for(m=0;m<t;m+=1)if(Se=this.stylesList[m],ye=Se.type,!((ye==="st"||ye==="gs")&&Se.wi===0||!Se.data._shouldRender||Se.coOp===0||this.globalData.currentGlobalAlpha===0)){for(I.save(),C=Se.elements,ye==="st"||ye==="gs"?(O.strokeStyle=ye==="st"?Se.co:Se.grd,O.lineWidth=Se.wi,O.lineCap=Se.lc,O.lineJoin=Se.lj,O.miterLimit=Se.ml||0):O.fillStyle=ye==="fl"?Se.co:Se.grd,I.ctxOpacity(Se.coOp),ye!=="st"&&ye!=="gs"&&O.beginPath(),I.ctxTransform(Se.preTransforms.finalTransform.props),d=C.length,r=0;r<d;r+=1){for((ye==="st"||ye==="gs")&&(O.beginPath(),Se.da&&(O.setLineDash(Se.da),O.lineDashOffset=Se.do)),w=C[r].trNodes,v=w.length,g=0;g<v;g+=1)w[g].t==="m"?O.moveTo(w[g].p[0],w[g].p[1]):w[g].t==="c"?O.bezierCurveTo(w[g].pts[0],w[g].pts[1],w[g].pts[2],w[g].pts[3],w[g].pts[4],w[g].pts[5]):O.closePath();(ye==="st"||ye==="gs")&&(O.stroke(),Se.da&&O.setLineDash(this.dashResetter))}ye!=="st"&&ye!=="gs"&&O.fill(Se.r),I.restore()}},CVShapeElement.prototype.renderShape=function(m,t,r,d){var g,v=t.length-1,C;for(C=m,g=v;g>=0;g-=1)t[g].ty==="tr"?(C=r[g].transform,this.renderShapeTransform(m,C)):t[g].ty==="sh"||t[g].ty==="el"||t[g].ty==="rc"||t[g].ty==="sr"?this.renderPath(t[g],r[g]):t[g].ty==="fl"?this.renderFill(t[g],r[g],C):t[g].ty==="st"?this.renderStroke(t[g],r[g],C):t[g].ty==="gf"||t[g].ty==="gs"?this.renderGradientFill(t[g],r[g],C):t[g].ty==="gr"?this.renderShape(C,t[g].it,r[g].it):t[g].ty;d&&this.drawLayer()},CVShapeElement.prototype.renderStyledShape=function(m,t){if(this._isFirstFrame||t._mdf||m.transforms._mdf){var r=m.trNodes,d=t.paths,g,v,C,w=d._length;r.length=0;var I=m.transforms.finalTransform;for(C=0;C<w;C+=1){var O=d.shapes[C];if(O&&O.v){for(v=O._length,g=1;g<v;g+=1)g===1&&r.push({t:"m",p:I.applyToPointArray(O.v[0][0],O.v[0][1],0)}),r.push({t:"c",pts:I.applyToTriplePoints(O.o[g-1],O.i[g],O.v[g])});v===1&&r.push({t:"m",p:I.applyToPointArray(O.v[0][0],O.v[0][1],0)}),O.c&&v&&(r.push({t:"c",pts:I.applyToTriplePoints(O.o[g-1],O.i[0],O.v[0])}),r.push({t:"z"}))}}m.trNodes=r}},CVShapeElement.prototype.renderPath=function(m,t){if(m.hd!==!0&&m._shouldRender){var r,d=t.styledShapes.length;for(r=0;r<d;r+=1)this.renderStyledShape(t.styledShapes[r],t.sh)}},CVShapeElement.prototype.renderFill=function(m,t,r){var d=t.style;(t.c._mdf||this._isFirstFrame)&&(d.co="rgb("+bmFloor(t.c.v[0])+","+bmFloor(t.c.v[1])+","+bmFloor(t.c.v[2])+")"),(t.o._mdf||r._opMdf||this._isFirstFrame)&&(d.coOp=t.o.v*r.opacity)},CVShapeElement.prototype.renderGradientFill=function(m,t,r){var d=t.style,g;if(!d.grd||t.g._mdf||t.s._mdf||t.e._mdf||m.t!==1&&(t.h._mdf||t.a._mdf)){var v=this.globalData.canvasContext,C=t.s.v,w=t.e.v;if(m.t===1)g=v.createLinearGradient(C[0],C[1],w[0],w[1]);else{var I=Math.sqrt(Math.pow(C[0]-w[0],2)+Math.pow(C[1]-w[1],2)),O=Math.atan2(w[1]-C[1],w[0]-C[0]),ye=t.h.v;ye>=1?ye=.99:ye<=-1&&(ye=-.99);var Se=I*ye,Pe=Math.cos(O+t.a.v)*Se+C[0],Ne=Math.sin(O+t.a.v)*Se+C[1];g=v.createRadialGradient(Pe,Ne,0,C[0],C[1],I)}var ke,ht=m.g.p,He=t.g.c,Fe=1;for(ke=0;ke<ht;ke+=1)t.g._hasOpacity&&t.g._collapsable&&(Fe=t.g.o[ke*2+1]),g.addColorStop(He[ke*4]/100,"rgba("+He[ke*4+1]+","+He[ke*4+2]+","+He[ke*4+3]+","+Fe+")");d.grd=g}d.coOp=t.o.v*r.opacity},CVShapeElement.prototype.renderStroke=function(m,t,r){var d=t.style,g=t.d;g&&(g._mdf||this._isFirstFrame)&&(d.da=g.dashArray,d.do=g.dashoffset[0]),(t.c._mdf||this._isFirstFrame)&&(d.co="rgb("+bmFloor(t.c.v[0])+","+bmFloor(t.c.v[1])+","+bmFloor(t.c.v[2])+")"),(t.o._mdf||r._opMdf||this._isFirstFrame)&&(d.coOp=t.o.v*r.opacity),(t.w._mdf||this._isFirstFrame)&&(d.wi=t.w.v)},CVShapeElement.prototype.destroy=function(){this.shapesData=null,this.globalData=null,this.canvasContext=null,this.stylesList.length=0,this.itemsData.length=0},extendPrototype([BaseElement,TransformElement,CVBaseElement,HierarchyElement,FrameElement,RenderableElement,ITextElement],CVTextElement),CVTextElement.prototype.tHelper=createTag("canvas").getContext("2d"),CVTextElement.prototype.buildNewText=function(){var m=this.textProperty.currentData;this.renderedLetters=createSizedArray(m.l?m.l.length:0);var t=!1;m.fc?(t=!0,this.values.fill=this.buildColor(m.fc)):this.values.fill="rgba(0,0,0,0)",this.fill=t;var r=!1;m.sc&&(r=!0,this.values.stroke=this.buildColor(m.sc),this.values.sWidth=m.sw);var d=this.globalData.fontManager.getFontByName(m.f),g,v,C=m.l,w=this.mHelper;this.stroke=r,this.values.fValue=m.finalSize+"px "+this.globalData.fontManager.getFontByName(m.f).fFamily,v=m.finalText.length;var I,O,ye,Se,Pe,Ne,ke,ht,He,Fe,at=this.data.singleShape,ct=m.tr*.001*m.finalSize,xt=0,Gt=0,Lt=!0,Wt=0;for(g=0;g<v;g+=1){I=this.globalData.fontManager.getCharData(m.finalText[g],d.fStyle,this.globalData.fontManager.getFontByName(m.f).fFamily),O=I&&I.data||{},w.reset(),at&&C[g].n&&(xt=-ct,Gt+=m.yOffset,Gt+=Lt?1:0,Lt=!1),Pe=O.shapes?O.shapes[0].it:[],ke=Pe.length,w.scale(m.finalSize/100,m.finalSize/100),at&&this.applyTextPropertiesToMatrix(m,w,C[g].line,xt,Gt),He=createSizedArray(ke-1);var Pt=0;for(Ne=0;Ne<ke;Ne+=1)if(Pe[Ne].ty==="sh"){for(Se=Pe[Ne].ks.k.i.length,ht=Pe[Ne].ks.k,Fe=[],ye=1;ye<Se;ye+=1)ye===1&&Fe.push(w.applyToX(ht.v[0][0],ht.v[0][1],0),w.applyToY(ht.v[0][0],ht.v[0][1],0)),Fe.push(w.applyToX(ht.o[ye-1][0],ht.o[ye-1][1],0),w.applyToY(ht.o[ye-1][0],ht.o[ye-1][1],0),w.applyToX(ht.i[ye][0],ht.i[ye][1],0),w.applyToY(ht.i[ye][0],ht.i[ye][1],0),w.applyToX(ht.v[ye][0],ht.v[ye][1],0),w.applyToY(ht.v[ye][0],ht.v[ye][1],0));Fe.push(w.applyToX(ht.o[ye-1][0],ht.o[ye-1][1],0),w.applyToY(ht.o[ye-1][0],ht.o[ye-1][1],0),w.applyToX(ht.i[0][0],ht.i[0][1],0),w.applyToY(ht.i[0][0],ht.i[0][1],0),w.applyToX(ht.v[0][0],ht.v[0][1],0),w.applyToY(ht.v[0][0],ht.v[0][1],0)),He[Pt]=Fe,Pt+=1}at&&(xt+=C[g].l,xt+=ct),this.textSpans[Wt]?this.textSpans[Wt].elem=He:this.textSpans[Wt]={elem:He},Wt+=1}},CVTextElement.prototype.renderInnerContent=function(){var m=this.canvasContext;m.font=this.values.fValue,m.lineCap="butt",m.lineJoin="miter",m.miterLimit=4,this.data.singleShape||this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag);var t,r,d,g,v,C,w=this.textAnimator.renderedLetters,I=this.textProperty.currentData.l;r=I.length;var O,ye=null,Se=null,Pe=null,Ne,ke;for(t=0;t<r;t+=1)if(!I[t].n){if(O=w[t],O&&(this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(O.p),this.globalData.renderer.ctxOpacity(O.o)),this.fill){for(O&&O.fc?ye!==O.fc&&(ye=O.fc,m.fillStyle=O.fc):ye!==this.values.fill&&(ye=this.values.fill,m.fillStyle=this.values.fill),Ne=this.textSpans[t].elem,g=Ne.length,this.globalData.canvasContext.beginPath(),d=0;d<g;d+=1)for(ke=Ne[d],C=ke.length,this.globalData.canvasContext.moveTo(ke[0],ke[1]),v=2;v<C;v+=6)this.globalData.canvasContext.bezierCurveTo(ke[v],ke[v+1],ke[v+2],ke[v+3],ke[v+4],ke[v+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.fill()}if(this.stroke){for(O&&O.sw?Pe!==O.sw&&(Pe=O.sw,m.lineWidth=O.sw):Pe!==this.values.sWidth&&(Pe=this.values.sWidth,m.lineWidth=this.values.sWidth),O&&O.sc?Se!==O.sc&&(Se=O.sc,m.strokeStyle=O.sc):Se!==this.values.stroke&&(Se=this.values.stroke,m.strokeStyle=this.values.stroke),Ne=this.textSpans[t].elem,g=Ne.length,this.globalData.canvasContext.beginPath(),d=0;d<g;d+=1)for(ke=Ne[d],C=ke.length,this.globalData.canvasContext.moveTo(ke[0],ke[1]),v=2;v<C;v+=6)this.globalData.canvasContext.bezierCurveTo(ke[v],ke[v+1],ke[v+2],ke[v+3],ke[v+4],ke[v+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.stroke()}O&&this.globalData.renderer.restore()}},extendPrototype([BaseElement,TransformElement,CVBaseElement,HierarchyElement,FrameElement,RenderableElement],CVImageElement),CVImageElement.prototype.initElement=SVGShapeElement.prototype.initElement,CVImageElement.prototype.prepareFrame=IImageElement.prototype.prepareFrame,CVImageElement.prototype.createContent=function(){if(this.img.width&&(this.assetData.w!==this.img.width||this.assetData.h!==this.img.height)){var m=createTag("canvas");m.width=this.assetData.w,m.height=this.assetData.h;var t=m.getContext("2d"),r=this.img.width,d=this.img.height,g=r/d,v=this.assetData.w/this.assetData.h,C,w,I=this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio;g>v&&I==="xMidYMid slice"||g<v&&I!=="xMidYMid slice"?(w=d,C=w*v):(C=r,w=C/v),t.drawImage(this.img,(r-C)/2,(d-w)/2,C,w,0,0,this.assetData.w,this.assetData.h),this.img=m}},CVImageElement.prototype.renderInnerContent=function(){this.canvasContext.drawImage(this.img,0,0)},CVImageElement.prototype.destroy=function(){this.img=null},extendPrototype([BaseElement,TransformElement,CVBaseElement,HierarchyElement,FrameElement,RenderableElement],CVSolidElement),CVSolidElement.prototype.initElement=SVGShapeElement.prototype.initElement,CVSolidElement.prototype.prepareFrame=IImageElement.prototype.prepareFrame,CVSolidElement.prototype.renderInnerContent=function(){var m=this.canvasContext;m.fillStyle=this.data.sc,m.fillRect(0,0,this.data.sw,this.data.sh)},extendPrototype([BaseRenderer],CanvasRendererBase),CanvasRendererBase.prototype.createShape=function(m){return new CVShapeElement(m,this.globalData,this)},CanvasRendererBase.prototype.createText=function(m){return new CVTextElement(m,this.globalData,this)},CanvasRendererBase.prototype.createImage=function(m){return new CVImageElement(m,this.globalData,this)},CanvasRendererBase.prototype.createSolid=function(m){return new CVSolidElement(m,this.globalData,this)},CanvasRendererBase.prototype.createNull=SVGRenderer.prototype.createNull,CanvasRendererBase.prototype.ctxTransform=function(m){if(!(m[0]===1&&m[1]===0&&m[4]===0&&m[5]===1&&m[12]===0&&m[13]===0)){if(!this.renderConfig.clearCanvas){this.canvasContext.transform(m[0],m[1],m[4],m[5],m[12],m[13]);return}this.transformMat.cloneFromProps(m);var t=this.contextData.cTr.props;this.transformMat.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15]),this.contextData.cTr.cloneFromProps(this.transformMat.props);var r=this.contextData.cTr.props;this.canvasContext.setTransform(r[0],r[1],r[4],r[5],r[12],r[13])}},CanvasRendererBase.prototype.ctxOpacity=function(m){if(!this.renderConfig.clearCanvas){this.canvasContext.globalAlpha*=m<0?0:m,this.globalData.currentGlobalAlpha=this.contextData.cO;return}this.contextData.cO*=m<0?0:m,this.globalData.currentGlobalAlpha!==this.contextData.cO&&(this.canvasContext.globalAlpha=this.contextData.cO,this.globalData.currentGlobalAlpha=this.contextData.cO)},CanvasRendererBase.prototype.reset=function(){if(!this.renderConfig.clearCanvas){this.canvasContext.restore();return}this.contextData.reset()},CanvasRendererBase.prototype.save=function(m){if(!this.renderConfig.clearCanvas){this.canvasContext.save();return}m&&this.canvasContext.save();var t=this.contextData.cTr.props;this.contextData._length<=this.contextData.cArrPos&&this.contextData.duplicate();var r,d=this.contextData.saved[this.contextData.cArrPos];for(r=0;r<16;r+=1)d[r]=t[r];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1},CanvasRendererBase.prototype.restore=function(m){if(!this.renderConfig.clearCanvas){this.canvasContext.restore();return}m&&(this.canvasContext.restore(),this.globalData.blendMode="source-over"),this.contextData.cArrPos-=1;var t=this.contextData.saved[this.contextData.cArrPos],r,d=this.contextData.cTr.props;for(r=0;r<16;r+=1)d[r]=t[r];this.canvasContext.setTransform(t[0],t[1],t[4],t[5],t[12],t[13]),t=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=t,this.globalData.currentGlobalAlpha!==t&&(this.canvasContext.globalAlpha=t,this.globalData.currentGlobalAlpha=t)},CanvasRendererBase.prototype.configAnimation=function(m){if(this.animationItem.wrapper){this.animationItem.container=createTag("canvas");var t=this.animationItem.container.style;t.width="100%",t.height="100%";var r="0px 0px 0px";t.transformOrigin=r,t.mozTransformOrigin=r,t.webkitTransformOrigin=r,t["-webkit-transform"]=r,t.contentVisibility=this.renderConfig.contentVisibility,this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d"),this.renderConfig.className&&this.animationItem.container.setAttribute("class",this.renderConfig.className),this.renderConfig.id&&this.animationItem.container.setAttribute("id",this.renderConfig.id)}else this.canvasContext=this.renderConfig.context;this.data=m,this.layers=m.layers,this.transformCanvas={w:m.w,h:m.h,sx:0,sy:0,tx:0,ty:0},this.setupGlobalData(m,document.body),this.globalData.canvasContext=this.canvasContext,this.globalData.renderer=this,this.globalData.isDashed=!1,this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.transformCanvas=this.transformCanvas,this.elements=createSizedArray(m.layers.length),this.updateContainerSize()},CanvasRendererBase.prototype.updateContainerSize=function(){this.reset();var m,t;this.animationItem.wrapper&&this.animationItem.container?(m=this.animationItem.wrapper.offsetWidth,t=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",m*this.renderConfig.dpr),this.animationItem.container.setAttribute("height",t*this.renderConfig.dpr)):(m=this.canvasContext.canvas.width*this.renderConfig.dpr,t=this.canvasContext.canvas.height*this.renderConfig.dpr);var r,d;if(this.renderConfig.preserveAspectRatio.indexOf("meet")!==-1||this.renderConfig.preserveAspectRatio.indexOf("slice")!==-1){var g=this.renderConfig.preserveAspectRatio.split(" "),v=g[1]||"meet",C=g[0]||"xMidYMid",w=C.substr(0,4),I=C.substr(4);r=m/t,d=this.transformCanvas.w/this.transformCanvas.h,d>r&&v==="meet"||d<r&&v==="slice"?(this.transformCanvas.sx=m/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=m/(this.transformCanvas.w/this.renderConfig.dpr)):(this.transformCanvas.sx=t/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.sy=t/(this.transformCanvas.h/this.renderConfig.dpr)),w==="xMid"&&(d<r&&v==="meet"||d>r&&v==="slice")?this.transformCanvas.tx=(m-this.transformCanvas.w*(t/this.transformCanvas.h))/2*this.renderConfig.dpr:w==="xMax"&&(d<r&&v==="meet"||d>r&&v==="slice")?this.transformCanvas.tx=(m-this.transformCanvas.w*(t/this.transformCanvas.h))*this.renderConfig.dpr:this.transformCanvas.tx=0,I==="YMid"&&(d>r&&v==="meet"||d<r&&v==="slice")?this.transformCanvas.ty=(t-this.transformCanvas.h*(m/this.transformCanvas.w))/2*this.renderConfig.dpr:I==="YMax"&&(d>r&&v==="meet"||d<r&&v==="slice")?this.transformCanvas.ty=(t-this.transformCanvas.h*(m/this.transformCanvas.w))*this.renderConfig.dpr:this.transformCanvas.ty=0}else this.renderConfig.preserveAspectRatio==="none"?(this.transformCanvas.sx=m/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=t/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.tx=0,this.transformCanvas.ty=0):(this.transformCanvas.sx=this.renderConfig.dpr,this.transformCanvas.sy=this.renderConfig.dpr,this.transformCanvas.tx=0,this.transformCanvas.ty=0);this.transformCanvas.props=[this.transformCanvas.sx,0,0,0,0,this.transformCanvas.sy,0,0,0,0,1,0,this.transformCanvas.tx,this.transformCanvas.ty,0,1],this.ctxTransform(this.transformCanvas.props),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.closePath(),this.canvasContext.clip(),this.renderFrame(this.renderedFrame,!0)},CanvasRendererBase.prototype.destroy=function(){this.renderConfig.clearCanvas&&this.animationItem.wrapper&&(this.animationItem.wrapper.innerText="");var m,t=this.layers?this.layers.length:0;for(m=t-1;m>=0;m-=1)this.elements[m]&&this.elements[m].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRendererBase.prototype.renderFrame=function(m,t){if(!(this.renderedFrame===m&&this.renderConfig.clearCanvas===!0&&!t||this.destroyed||m===-1)){this.renderedFrame=m,this.globalData.frameNum=m-this.animationItem._isFirstFrame,this.globalData.frameId+=1,this.globalData._mdf=!this.renderConfig.clearCanvas||t,this.globalData.projectInterface.currentFrame=m;var r,d=this.layers.length;for(this.completeLayers||this.checkLayers(m),r=0;r<d;r+=1)(this.completeLayers||this.elements[r])&&this.elements[r].prepareFrame(m-this.layers[r].st);if(this.globalData._mdf){for(this.renderConfig.clearCanvas===!0?this.canvasContext.clearRect(0,0,this.transformCanvas.w,this.transformCanvas.h):this.save(),r=d-1;r>=0;r-=1)(this.completeLayers||this.elements[r])&&this.elements[r].renderFrame();this.renderConfig.clearCanvas!==!0&&this.restore()}}},CanvasRendererBase.prototype.buildItem=function(m){var t=this.elements;if(!(t[m]||this.layers[m].ty===99)){var r=this.createItem(this.layers[m],this,this.globalData);t[m]=r,r.initExpressions()}},CanvasRendererBase.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var m=this.pendingElements.pop();m.checkParenting()}},CanvasRendererBase.prototype.hide=function(){this.animationItem.container.style.display="none"},CanvasRendererBase.prototype.show=function(){this.animationItem.container.style.display="block"},extendPrototype([CanvasRendererBase,ICompElement,CVBaseElement],CVCompElement),CVCompElement.prototype.renderInnerContent=function(){var m=this.canvasContext;m.beginPath(),m.moveTo(0,0),m.lineTo(this.data.w,0),m.lineTo(this.data.w,this.data.h),m.lineTo(0,this.data.h),m.lineTo(0,0),m.clip();var t,r=this.layers.length;for(t=r-1;t>=0;t-=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},CVCompElement.prototype.destroy=function(){var m,t=this.layers.length;for(m=t-1;m>=0;m-=1)this.elements[m]&&this.elements[m].destroy();this.layers=null,this.elements=null},CVCompElement.prototype.createComp=function(m){return new CVCompElement(m,this.globalData,this)},extendPrototype([CanvasRendererBase],CanvasRenderer),CanvasRenderer.prototype.createComp=function(m){return new CVCompElement(m,this.globalData,this)},registerRenderer("canvas",CanvasRenderer),ShapeModifiers.registerModifier("tm",TrimModifier),ShapeModifiers.registerModifier("pb",PuckerAndBloatModifier),ShapeModifiers.registerModifier("rp",RepeaterModifier),ShapeModifiers.registerModifier("rd",RoundCornersModifier);const Expressions=function(){var m={};m.initExpressions=t;function t(r){var d=0,g=[];function v(){d+=1}function C(){d-=1,d===0&&I()}function w(O){g.indexOf(O)===-1&&g.push(O)}function I(){var O,ye=g.length;for(O=0;O<ye;O+=1)g[O].release();g.length=0}r.renderer.compInterface=CompExpressionInterface(r.renderer),r.renderer.globalData.projectInterface.registerComposition(r.renderer),r.renderer.globalData.pushExpression=v,r.renderer.globalData.popExpression=C,r.renderer.globalData.registerExpressionProperty=w}return m}();var propTypes={SHAPE:"shape"};const ExpressionManager=function(){var ob={},Math=BMMath,window=null,document=null,XMLHttpRequest=null,fetch=null,frames=null;initialize$2(BMMath);function $bm_isInstanceOfArray(m){return m.constructor===Array||m.constructor===Float32Array}function isNumerable(m,t){return m==="number"||m==="boolean"||m==="string"||t instanceof Number}function $bm_neg(m){var t=typeof m;if(t==="number"||t==="boolean"||m instanceof Number)return-m;if($bm_isInstanceOfArray(m)){var r,d=m.length,g=[];for(r=0;r<d;r+=1)g[r]=-m[r];return g}return m.propType?m.v:-m}var easeInBez=BezierFactory.getBezierEasing(.333,0,.833,.833,"easeIn").get,easeOutBez=BezierFactory.getBezierEasing(.167,.167,.667,1,"easeOut").get,easeInOutBez=BezierFactory.getBezierEasing(.33,0,.667,1,"easeInOut").get;function sum(m,t){var r=typeof m,d=typeof t;if(r==="string"||d==="string"||isNumerable(r,m)&&isNumerable(d,t))return m+t;if($bm_isInstanceOfArray(m)&&isNumerable(d,t))return m=m.slice(0),m[0]+=t,m;if(isNumerable(r,m)&&$bm_isInstanceOfArray(t))return t=t.slice(0),t[0]=m+t[0],t;if($bm_isInstanceOfArray(m)&&$bm_isInstanceOfArray(t)){for(var g=0,v=m.length,C=t.length,w=[];g<v||g<C;)(typeof m[g]=="number"||m[g]instanceof Number)&&(typeof t[g]=="number"||t[g]instanceof Number)?w[g]=m[g]+t[g]:w[g]=t[g]===void 0?m[g]:m[g]||t[g],g+=1;return w}return 0}var add=sum;function sub(m,t){var r=typeof m,d=typeof t;if(isNumerable(r,m)&&isNumerable(d,t))return r==="string"&&(m=parseInt(m,10)),d==="string"&&(t=parseInt(t,10)),m-t;if($bm_isInstanceOfArray(m)&&isNumerable(d,t))return m=m.slice(0),m[0]-=t,m;if(isNumerable(r,m)&&$bm_isInstanceOfArray(t))return t=t.slice(0),t[0]=m-t[0],t;if($bm_isInstanceOfArray(m)&&$bm_isInstanceOfArray(t)){for(var g=0,v=m.length,C=t.length,w=[];g<v||g<C;)(typeof m[g]=="number"||m[g]instanceof Number)&&(typeof t[g]=="number"||t[g]instanceof Number)?w[g]=m[g]-t[g]:w[g]=t[g]===void 0?m[g]:m[g]||t[g],g+=1;return w}return 0}function mul(m,t){var r=typeof m,d=typeof t,g;if(isNumerable(r,m)&&isNumerable(d,t))return m*t;var v,C;if($bm_isInstanceOfArray(m)&&isNumerable(d,t)){for(C=m.length,g=createTypedArray("float32",C),v=0;v<C;v+=1)g[v]=m[v]*t;return g}if(isNumerable(r,m)&&$bm_isInstanceOfArray(t)){for(C=t.length,g=createTypedArray("float32",C),v=0;v<C;v+=1)g[v]=m*t[v];return g}return 0}function div(m,t){var r=typeof m,d=typeof t,g;if(isNumerable(r,m)&&isNumerable(d,t))return m/t;var v,C;if($bm_isInstanceOfArray(m)&&isNumerable(d,t)){for(C=m.length,g=createTypedArray("float32",C),v=0;v<C;v+=1)g[v]=m[v]/t;return g}if(isNumerable(r,m)&&$bm_isInstanceOfArray(t)){for(C=t.length,g=createTypedArray("float32",C),v=0;v<C;v+=1)g[v]=m/t[v];return g}return 0}function mod(m,t){return typeof m=="string"&&(m=parseInt(m,10)),typeof t=="string"&&(t=parseInt(t,10)),m%t}var $bm_sum=sum,$bm_sub=sub,$bm_mul=mul,$bm_div=div,$bm_mod=mod;function clamp(m,t,r){if(t>r){var d=r;r=t,t=d}return Math.min(Math.max(m,t),r)}function radiansToDegrees(m){return m/degToRads}var radians_to_degrees=radiansToDegrees;function degreesToRadians(m){return m*degToRads}var degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];function length(m,t){if(typeof m=="number"||m instanceof Number)return t=t||0,Math.abs(m-t);t||(t=helperLengthArray);var r,d=Math.min(m.length,t.length),g=0;for(r=0;r<d;r+=1)g+=Math.pow(t[r]-m[r],2);return Math.sqrt(g)}function normalize(m){return div(m,length(m))}function rgbToHsl(m){var t=m[0],r=m[1],d=m[2],g=Math.max(t,r,d),v=Math.min(t,r,d),C,w,I=(g+v)/2;if(g===v)C=0,w=0;else{var O=g-v;switch(w=I>.5?O/(2-g-v):O/(g+v),g){case t:C=(r-d)/O+(r<d?6:0);break;case r:C=(d-t)/O+2;break;case d:C=(t-r)/O+4;break}C/=6}return[C,w,I,m[3]]}function hue2rgb(m,t,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?m+(t-m)*6*r:r<1/2?t:r<2/3?m+(t-m)*(2/3-r)*6:m}function hslToRgb(m){var t=m[0],r=m[1],d=m[2],g,v,C;if(r===0)g=d,C=d,v=d;else{var w=d<.5?d*(1+r):d+r-d*r,I=2*d-w;g=hue2rgb(I,w,t+1/3),v=hue2rgb(I,w,t),C=hue2rgb(I,w,t-1/3)}return[g,v,C,m[3]]}function linear(m,t,r,d,g){if((d===void 0||g===void 0)&&(d=t,g=r,t=0,r=1),r<t){var v=r;r=t,t=v}if(m<=t)return d;if(m>=r)return g;var C=r===t?0:(m-t)/(r-t);if(!d.length)return d+(g-d)*C;var w,I=d.length,O=createTypedArray("float32",I);for(w=0;w<I;w+=1)O[w]=d[w]+(g[w]-d[w])*C;return O}function random(m,t){if(t===void 0&&(m===void 0?(m=0,t=1):(t=m,m=void 0)),t.length){var r,d=t.length;m||(m=createTypedArray("float32",d));var g=createTypedArray("float32",d),v=BMMath.random();for(r=0;r<d;r+=1)g[r]=m[r]+v*(t[r]-m[r]);return g}m===void 0&&(m=0);var C=BMMath.random();return m+C*(t-m)}function createPath(m,t,r,d){var g,v=m.length,C=shapePool.newElement();C.setPathData(!!d,v);var w=[0,0],I,O;for(g=0;g<v;g+=1)I=t&&t[g]?t[g]:w,O=r&&r[g]?r[g]:w,C.setTripleAt(m[g][0],m[g][1],O[0]+m[g][0],O[1]+m[g][1],I[0]+m[g][0],I[1]+m[g][1],g,!0);return C}function initiateExpression(elem,data,property){var val=data.x,needsVelocity=/velocity(?![\w\d])/.test(val),_needsRandom=val.indexOf("random")!==-1,elemType=elem.data.ty,transform,$bm_transform,content,effect,thisProperty=property;thisProperty.valueAtTime=thisProperty.getValueAtTime,Object.defineProperty(thisProperty,"value",{get:function(){return thisProperty.v}}),elem.comp.frameDuration=1/elem.comp.globalData.frameRate,elem.comp.displayStartTime=0;var inPoint=elem.data.ip/elem.comp.globalData.frameRate,outPoint=elem.data.op/elem.comp.globalData.frameRate,width=elem.data.sw?elem.data.sw:0,height=elem.data.sh?elem.data.sh:0,name=elem.data.nm,loopIn,loop_in,loopOut,loop_out,smooth,toWorld,fromWorld,fromComp,toComp,fromCompToSurface,position,rotation,anchorPoint,scale,thisLayer,thisComp,mask,valueAtTime,velocityAtTime,scoped_bm_rt,expression_function=eval("[function _expression_function(){"+val+";scoped_bm_rt=$bm_rt}]")[0],numKeys=property.kf?data.k.length:0,active=!this.data||this.data.hd!==!0,wiggle=function m(t,r){var d,g,v=this.pv.length?this.pv.length:1,C=createTypedArray("float32",v);t=5;var w=Math.floor(time*t);for(d=0,g=0;d<w;){for(g=0;g<v;g+=1)C[g]+=-r+r*2*BMMath.random();d+=1}var I=time*t,O=I-Math.floor(I),ye=createTypedArray("float32",v);if(v>1){for(g=0;g<v;g+=1)ye[g]=this.pv[g]+C[g]+(-r+r*2*BMMath.random())*O;return ye}return this.pv+C[0]+(-r+r*2*BMMath.random())*O}.bind(this);thisProperty.loopIn&&(loopIn=thisProperty.loopIn.bind(thisProperty),loop_in=loopIn),thisProperty.loopOut&&(loopOut=thisProperty.loopOut.bind(thisProperty),loop_out=loopOut),thisProperty.smooth&&(smooth=thisProperty.smooth.bind(thisProperty));function loopInDuration(m,t){return loopIn(m,t,!0)}function loopOutDuration(m,t){return loopOut(m,t,!0)}this.getValueAtTime&&(valueAtTime=this.getValueAtTime.bind(this)),this.getVelocityAtTime&&(velocityAtTime=this.getVelocityAtTime.bind(this));var comp=elem.comp.globalData.projectInterface.bind(elem.comp.globalData.projectInterface);function lookAt(m,t){var r=[t[0]-m[0],t[1]-m[1],t[2]-m[2]],d=Math.atan2(r[0],Math.sqrt(r[1]*r[1]+r[2]*r[2]))/degToRads,g=-Math.atan2(r[1],r[2])/degToRads;return[g,d,0]}function easeOut(m,t,r,d,g){return applyEase(easeOutBez,m,t,r,d,g)}function easeIn(m,t,r,d,g){return applyEase(easeInBez,m,t,r,d,g)}function ease(m,t,r,d,g){return applyEase(easeInOutBez,m,t,r,d,g)}function applyEase(m,t,r,d,g,v){g===void 0?(g=r,v=d):t=(t-r)/(d-r),t>1?t=1:t<0&&(t=0);var C=m(t);if($bm_isInstanceOfArray(g)){var w,I=g.length,O=createTypedArray("float32",I);for(w=0;w<I;w+=1)O[w]=(v[w]-g[w])*C+g[w];return O}return(v-g)*C+g}function nearestKey(m){var t,r=data.k.length,d,g;if(!data.k.length||typeof data.k[0]=="number")d=0,g=0;else if(d=-1,m*=elem.comp.globalData.frameRate,m<data.k[0].t)d=1,g=data.k[0].t;else{for(t=0;t<r-1;t+=1)if(m===data.k[t].t){d=t+1,g=data.k[t].t;break}else if(m>data.k[t].t&&m<data.k[t+1].t){m-data.k[t].t>data.k[t+1].t-m?(d=t+2,g=data.k[t+1].t):(d=t+1,g=data.k[t].t);break}d===-1&&(d=t+1,g=data.k[t].t)}var v={};return v.index=d,v.time=g/elem.comp.globalData.frameRate,v}function key(m){var t,r,d;if(!data.k.length||typeof data.k[0]=="number")throw new Error("The property has no keyframe at index "+m);m-=1,t={time:data.k[m].t/elem.comp.globalData.frameRate,value:[]};var g=Object.prototype.hasOwnProperty.call(data.k[m],"s")?data.k[m].s:data.k[m-1].e;for(d=g.length,r=0;r<d;r+=1)t[r]=g[r],t.value[r]=g[r];return t}function framesToTime(m,t){return t||(t=elem.comp.globalData.frameRate),m/t}function timeToFrames(m,t){return!m&&m!==0&&(m=time),t||(t=elem.comp.globalData.frameRate),m*t}function seedRandom(m){BMMath.seedrandom(randSeed+m)}function sourceRectAtTime(){return elem.sourceRectAtTime()}function substring(m,t){return typeof value=="string"?t===void 0?value.substring(m):value.substring(m,t):""}function substr(m,t){return typeof value=="string"?t===void 0?value.substr(m):value.substr(m,t):""}function posterizeTime(m){time=m===0?0:Math.floor(time*m)/m,value=valueAtTime(time)}var time,velocity,value,text,textIndex,textTotal,selectorValue,index=elem.data.ind,hasParent=!!(elem.hierarchy&&elem.hierarchy.length),parent,randSeed=Math.floor(Math.random()*1e6),globalData=elem.globalData;function executeExpression(m){return value=m,this.frameExpressionId===elem.globalData.frameId&&this.propType!=="textSelector"?value:(this.propType==="textSelector"&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),thisLayer||(text=elem.layerInterface.text,thisLayer=elem.layerInterface,thisComp=elem.comp.compInterface,toWorld=thisLayer.toWorld.bind(thisLayer),fromWorld=thisLayer.fromWorld.bind(thisLayer),fromComp=thisLayer.fromComp.bind(thisLayer),toComp=thisLayer.toComp.bind(thisLayer),mask=thisLayer.mask?thisLayer.mask.bind(thisLayer):null,fromCompToSurface=fromComp),transform||(transform=elem.layerInterface("ADBE Transform Group"),$bm_transform=transform,transform&&(anchorPoint=transform.anchorPoint)),elemType===4&&!content&&(content=thisLayer("ADBE Root Vectors Group")),effect||(effect=thisLayer(4)),hasParent=!!(elem.hierarchy&&elem.hierarchy.length),hasParent&&!parent&&(parent=elem.hierarchy[0].layerInterface),time=this.comp.renderedFrame/this.comp.globalData.frameRate,_needsRandom&&seedRandom(randSeed+time),needsVelocity&&(velocity=velocityAtTime(time)),expression_function(),this.frameExpressionId=elem.globalData.frameId,scoped_bm_rt=scoped_bm_rt.propType===propTypes.SHAPE?scoped_bm_rt.v:scoped_bm_rt,scoped_bm_rt)}return executeExpression.__preventDeadCodeRemoval=[$bm_transform,anchorPoint,time,velocity,inPoint,outPoint,width,height,name,loop_in,loop_out,smooth,toComp,fromCompToSurface,toWorld,fromWorld,mask,position,rotation,scale,thisComp,numKeys,active,wiggle,loopInDuration,loopOutDuration,comp,lookAt,easeOut,easeIn,ease,nearestKey,key,text,textIndex,textTotal,selectorValue,framesToTime,timeToFrames,sourceRectAtTime,substring,substr,posterizeTime,index,globalData],executeExpression}return ob.initiateExpression=initiateExpression,ob.__preventDeadCodeRemoval=[window,document,XMLHttpRequest,fetch,frames,$bm_neg,add,$bm_sum,$bm_sub,$bm_mul,$bm_div,$bm_mod,clamp,radians_to_degrees,degreesToRadians,degrees_to_radians,normalize,rgbToHsl,hslToRgb,linear,random,createPath],ob}(),expressionHelpers=function(){function m(C,w,I){w.x&&(I.k=!0,I.x=!0,I.initiateExpression=ExpressionManager.initiateExpression,I.effectsSequence.push(I.initiateExpression(C,w,I).bind(I)))}function t(C){return C*=this.elem.globalData.frameRate,C-=this.offsetTime,C!==this._cachingAtTime.lastFrame&&(this._cachingAtTime.lastIndex=this._cachingAtTime.lastFrame<C?this._cachingAtTime.lastIndex:0,this._cachingAtTime.value=this.interpolateValue(C,this._cachingAtTime),this._cachingAtTime.lastFrame=C),this._cachingAtTime.value}function r(C){var w=-.01,I=this.getValueAtTime(C),O=this.getValueAtTime(C+w),ye=0;if(I.length){var Se;for(Se=0;Se<I.length;Se+=1)ye+=Math.pow(O[Se]-I[Se],2);ye=Math.sqrt(ye)*100}else ye=0;return ye}function d(C){if(this.vel!==void 0)return this.vel;var w=-.001,I=this.getValueAtTime(C),O=this.getValueAtTime(C+w),ye;if(I.length){ye=createTypedArray("float32",I.length);var Se;for(Se=0;Se<I.length;Se+=1)ye[Se]=(O[Se]-I[Se])/w}else ye=(O-I)/w;return ye}function g(){return this.pv}function v(C){this.propertyGroup=C}return{searchExpressions:m,getSpeedAtTime:r,getVelocityAtTime:d,getValueAtTime:t,getStaticValueAtTime:g,setGroupProperty:v}}();setExpressionsPlugin(Expressions),initialize$1(),initialize()}class LottieLoader extends Loader{constructor(t){super(t),console.warn("THREE.LottieLoader: The loader has been deprecated and will be removed with r186. Use lottie-web instead and create your animated texture manually.")}setQuality(t){this._quality=t}load(t,r,d,g){const v=this._quality||1,C=new CanvasTexture;C.minFilter=NearestFilter,C.generateMipmaps=!1,C.colorSpace=SRGBColorSpace;const w=new FileLoader(this.manager);return w.setPath(this.path),w.setWithCredentials(this.withCredentials),w.load(t,function(I){const O=JSON.parse(I),ye=document.createElement("div");ye.style.width=O.w+"px",ye.style.height=O.h+"px",document.body.appendChild(ye);const Se=lottie.loadAnimation({container:ye,animType:"canvas",loop:!0,autoplay:!0,animationData:O,rendererSettings:{dpr:v}});C.animation=Se,C.image=Se.container,Se.addEventListener("enterFrame",function(){C.needsUpdate=!0}),ye.style.display="none",r!==void 0&&r(C)},d,g),C}}var St=Object.defineProperty,At=Object.defineProperties,Mt=Object.getOwnPropertyDescriptors,Me=Object.getOwnPropertySymbols,Rt=Object.prototype.hasOwnProperty,Dt$1=Object.prototype.propertyIsEnumerable,Re=(m,t,r)=>t in m?St(m,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):m[t]=r,U=(m,t)=>{for(var r in t||(t={}))Rt.call(t,r)&&Re(m,r,t[r]);if(Me)for(var r of Me(t))Dt$1.call(t,r)&&Re(m,r,t[r]);return m},te=(m,t)=>At(m,Mt(t)),se=(m,t,r)=>new Promise((d,g)=>{var v=I=>{try{w(r.next(I))}catch(O){g(O)}},C=I=>{try{w(r.throw(I))}catch(O){g(O)}},w=I=>I.done?d(I.value):Promise.resolve(I.value).then(v,C);w((r=r.apply(m,t)).next())});const M={LEFT:1,RIGHT:2,MIDDLE:4},c=Object.freeze({NONE:0,ROTATE:1,TRUCK:2,OFFSET:4,DOLLY:8,ZOOM:16,TOUCH_ROTATE:32,TOUCH_TRUCK:64,TOUCH_OFFSET:128,TOUCH_DOLLY:256,TOUCH_ZOOM:512,TOUCH_DOLLY_TRUCK:1024,TOUCH_DOLLY_OFFSET:2048,TOUCH_DOLLY_ROTATE:4096,TOUCH_ZOOM_TRUCK:8192,TOUCH_ZOOM_OFFSET:16384,TOUCH_ZOOM_ROTATE:32768,SCREEN_PAN:65536,TOUCH_SCREEN_PAN:131072,TOUCH_DOLLY_SCREEN_PAN:262144,TOUCH_ZOOM_SCREEN_PAN:524288}),K={NONE:0,IN:1,OUT:-1};function Y$1(m){return m.isPerspectiveCamera}function j(m){return m.isOrthographicCamera}const G$1=Math.PI*2,Ie$1=Math.PI/2,ft=1e-5,ie=Math.PI/180;function k(m,t,r){return Math.max(t,Math.min(r,m))}function A(m,t=ft){return Math.abs(m)<t}function P$1(m,t,r=ft){return A(m-t,r)}function je(m,t){return Math.round(m/t)*t}function re(m){return isFinite(m)?m:m<0?-Number.MAX_VALUE:Number.MAX_VALUE}function oe(m){return Math.abs(m)<Number.MAX_VALUE?m:m*(1/0)}function he(m,t,r,d,g=1/0,v){d=Math.max(1e-4,d);const C=2/d,w=C*v,I=1/(1+w+.48*w*w+.235*w*w*w);let O=m-t;const ye=t,Se=g*d;O=k(O,-Se,Se),t=m-O;const Pe=(r.value+C*O)*v;r.value=(r.value-C*Pe)*I;let Ne=t+(O+Pe)*I;return ye-m>0==Ne>ye&&(Ne=ye,r.value=(Ne-ye)/v),Ne}function Be$1(m,t,r,d,g=1/0,v,C){d=Math.max(1e-4,d);const w=2/d,I=w*v,O=1/(1+I+.48*I*I+.235*I*I*I);let ye=t.x,Se=t.y,Pe=t.z,Ne=m.x-ye,ke=m.y-Se,ht=m.z-Pe;const He=ye,Fe=Se,at=Pe,ct=g*d,xt=ct*ct,Gt=Ne*Ne+ke*ke+ht*ht;if(Gt>xt){const n0=Math.sqrt(Gt);Ne=Ne/n0*ct,ke=ke/n0*ct,ht=ht/n0*ct}ye=m.x-Ne,Se=m.y-ke,Pe=m.z-ht;const Lt=(r.x+w*Ne)*v,Wt=(r.y+w*ke)*v,Pt=(r.z+w*ht)*v;r.x=(r.x-w*Lt)*O,r.y=(r.y-w*Wt)*O,r.z=(r.z-w*Pt)*O,C.x=ye+(Ne+Lt)*O,C.y=Se+(ke+Wt)*O,C.z=Pe+(ht+Pt)*O;const Ft=He-m.x,kt=Fe-m.y,Kt=at-m.z,i0=C.x-He,r0=C.y-Fe,l0=C.z-at;return Ft*i0+kt*r0+Kt*l0>0&&(C.x=He,C.y=Fe,C.z=at,r.x=(C.x-He)/v,r.y=(C.y-Fe)/v,r.z=(C.z-at)/v),C}function Ee(m,t){t.set(0,0),m.forEach(r=>{t.x+=r.clientX,t.y+=r.clientY}),t.x/=m.length,t.y/=m.length}function Oe(m,t){return j(m)?(console.warn(`${t} is not supported in OrthographicCamera`),!0):!1}class Es{constructor(){this._listeners={}}addEventListener(t,r){const d=this._listeners;d[t]===void 0&&(d[t]=[]),d[t].indexOf(r)===-1&&d[t].push(r)}hasEventListener(t,r){const d=this._listeners;return d[t]!==void 0&&d[t].indexOf(r)!==-1}removeEventListener(t,r){const d=this._listeners[t];if(d!==void 0){const g=d.indexOf(r);g!==-1&&d.splice(g,1)}}removeAllEventListeners(t){if(!t){this._listeners={};return}Array.isArray(this._listeners[t])&&(this._listeners[t].length=0)}dispatchEvent(t){const r=this._listeners[t.type];if(r!==void 0){t.target=this;const d=r.slice(0);for(let g=0,v=d.length;g<v;g++)d[g].call(this,t)}}}const ce=1/8,Os=/Mac/.test(navigator.platform);let T$1,Ve$1,de,Te,D,x$1,L,X,ne,F,N$1,Z$1,Ye,Ze$1,z$1,ae,$,We,we,Ke$1,xe,be,me;class J extends Es{static install(t){T$1=t.THREE,Ve$1=Object.freeze(new T$1.Vector3(0,0,0)),de=Object.freeze(new T$1.Vector3(0,1,0)),Te=Object.freeze(new T$1.Vector3(0,0,1)),D=new T$1.Vector2,x$1=new T$1.Vector3,L=new T$1.Vector3,X=new T$1.Vector3,ne=new T$1.Vector3,F=new T$1.Vector3,N$1=new T$1.Vector3,Z$1=new T$1.Vector3,Ye=new T$1.Vector3,Ze$1=new T$1.Vector3,z$1=new T$1.Spherical,ae=new T$1.Spherical,$=new T$1.Box3,We=new T$1.Box3,we=new T$1.Sphere,Ke$1=new T$1.Quaternion,xe=new T$1.Quaternion,be=new T$1.Matrix4,me=new T$1.Raycaster}static get ACTION(){return c}constructor(t,r){super(),this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.minDistance=Number.EPSILON,this.maxDistance=1/0,this.infinityDolly=!1,this.minZoom=.01,this.maxZoom=1/0,this.smoothTime=.25,this.draggingSmoothTime=.125,this.maxSpeed=1/0,this.azimuthRotateSpeed=1,this.polarRotateSpeed=1,this.dollySpeed=1,this.dollyDragInverted=!1,this.truckSpeed=2,this.dollyToCursor=!1,this.dragToOffset=!1,this.boundaryFriction=0,this.restThreshold=.01,this.colliderMeshes=[],this.cancel=()=>{},this._enabled=!0,this._state=c.NONE,this._viewport=null,this._changedDolly=0,this._changedZoom=0,this._hasRested=!0,this._boundaryEnclosesCamera=!1,this._needsUpdate=!0,this._updatedLastTime=!1,this._elementRect=new DOMRect,this._isDragging=!1,this._dragNeedsUpdate=!0,this._activePointers=[],this._lockedPointer=null,this._interactiveArea=new DOMRect(0,0,1,1),this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._isUserControllingOffset=!1,this._isUserControllingZoom=!1,this._lastDollyDirection=K.NONE,this._thetaVelocity={value:0},this._phiVelocity={value:0},this._radiusVelocity={value:0},this._targetVelocity=new T$1.Vector3,this._focalOffsetVelocity=new T$1.Vector3,this._zoomVelocity={value:0},this._truckInternal=(Fe,at,ct,xt)=>{let Gt,Lt;if(Y$1(this._camera)){const Wt=x$1.copy(this._camera.position).sub(this._target),Pt=this._camera.getEffectiveFOV()*ie,Ft=Wt.length()*Math.tan(Pt*.5);Gt=this.truckSpeed*Fe*Ft/this._elementRect.height,Lt=this.truckSpeed*at*Ft/this._elementRect.height}else if(j(this._camera)){const Wt=this._camera;Gt=this.truckSpeed*Fe*(Wt.right-Wt.left)/Wt.zoom/this._elementRect.width,Lt=this.truckSpeed*at*(Wt.top-Wt.bottom)/Wt.zoom/this._elementRect.height}else return;xt?(ct?this.setFocalOffset(this._focalOffsetEnd.x+Gt,this._focalOffsetEnd.y,this._focalOffsetEnd.z,!0):this.truck(Gt,0,!0),this.forward(-Lt,!0)):ct?this.setFocalOffset(this._focalOffsetEnd.x+Gt,this._focalOffsetEnd.y+Lt,this._focalOffsetEnd.z,!0):this.truck(Gt,Lt,!0)},this._rotateInternal=(Fe,at)=>{const ct=G$1*this.azimuthRotateSpeed*Fe/this._elementRect.height,xt=G$1*this.polarRotateSpeed*at/this._elementRect.height;this.rotate(ct,xt,!0)},this._dollyInternal=(Fe,at,ct)=>{const xt=Math.pow(.95,-Fe*this.dollySpeed),Gt=this._sphericalEnd.radius,Lt=this._sphericalEnd.radius*xt,Wt=k(Lt,this.minDistance,this.maxDistance),Pt=Wt-Lt;this.infinityDolly&&this.dollyToCursor?this._dollyToNoClamp(Lt,!0):this.infinityDolly&&!this.dollyToCursor?(this.dollyInFixed(Pt,!0),this._dollyToNoClamp(Wt,!0)):this._dollyToNoClamp(Wt,!0),this.dollyToCursor&&(this._changedDolly+=(this.infinityDolly?Lt:Wt)-Gt,this._dollyControlCoord.set(at,ct)),this._lastDollyDirection=Math.sign(-Fe)},this._zoomInternal=(Fe,at,ct)=>{const xt=Math.pow(.95,Fe*this.dollySpeed),Gt=this._zoom,Lt=this._zoom*xt;this.zoomTo(Lt,!0),this.dollyToCursor&&(this._changedZoom+=Lt-Gt,this._dollyControlCoord.set(at,ct))},typeof T$1=="undefined"&&console.error("camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information."),this._camera=t,this._yAxisUpSpace=new T$1.Quaternion().setFromUnitVectors(this._camera.up,de),this._yAxisUpSpaceInverse=this._yAxisUpSpace.clone().invert(),this._state=c.NONE,this._target=new T$1.Vector3,this._targetEnd=this._target.clone(),this._focalOffset=new T$1.Vector3,this._focalOffsetEnd=this._focalOffset.clone(),this._spherical=new T$1.Spherical().setFromVector3(x$1.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace)),this._sphericalEnd=this._spherical.clone(),this._lastDistance=this._spherical.radius,this._zoom=this._camera.zoom,this._zoomEnd=this._zoom,this._lastZoom=this._zoom,this._nearPlaneCorners=[new T$1.Vector3,new T$1.Vector3,new T$1.Vector3,new T$1.Vector3],this._updateNearPlaneCorners(),this._boundary=new T$1.Box3(new T$1.Vector3(-1/0,-1/0,-1/0),new T$1.Vector3(1/0,1/0,1/0)),this._cameraUp0=this._camera.up.clone(),this._target0=this._target.clone(),this._position0=this._camera.position.clone(),this._zoom0=this._zoom,this._focalOffset0=this._focalOffset.clone(),this._dollyControlCoord=new T$1.Vector2,this.mouseButtons={left:c.ROTATE,middle:c.DOLLY,right:c.TRUCK,wheel:Y$1(this._camera)?c.DOLLY:j(this._camera)?c.ZOOM:c.NONE},this.touches={one:c.TOUCH_ROTATE,two:Y$1(this._camera)?c.TOUCH_DOLLY_TRUCK:j(this._camera)?c.TOUCH_ZOOM_TRUCK:c.NONE,three:c.TOUCH_TRUCK};const d=new T$1.Vector2,g=new T$1.Vector2,v=new T$1.Vector2,C=Fe=>{if(!this._enabled||!this._domElement)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const xt=this._domElement.getBoundingClientRect(),Gt=(Fe.clientX-xt.left)/(xt.right-xt.left),Lt=(Fe.clientY-xt.top)/(xt.bottom-xt.top);if(Gt<this._interactiveArea.left||Gt>this._interactiveArea.right||Lt<this._interactiveArea.top||Lt>this._interactiveArea.bottom)return}const at=Fe.pointerType!=="mouse"?null:(Fe.buttons&M.LEFT)===M.LEFT?M.LEFT:(Fe.buttons&M.MIDDLE)===M.MIDDLE?M.MIDDLE:(Fe.buttons&M.RIGHT)===M.RIGHT?M.RIGHT:null;if(at!==null){const xt=this._findPointerByMouseButton(at);xt&&this._disposePointer(xt)}if((Fe.buttons&M.LEFT)===M.LEFT&&this._lockedPointer)return;const ct={pointerId:Fe.pointerId,clientX:Fe.clientX,clientY:Fe.clientY,deltaX:0,deltaY:0,mouseButton:at};this._activePointers.push(ct),this._domElement.ownerDocument.removeEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",I),this._domElement.ownerDocument.addEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",I),this._isDragging=!0,Pe(Fe)},w=Fe=>{Fe.cancelable&&Fe.preventDefault();const at=Fe.pointerId,ct=this._lockedPointer||this._findPointerById(at);if(ct){if(ct.clientX=Fe.clientX,ct.clientY=Fe.clientY,ct.deltaX=Fe.movementX,ct.deltaY=Fe.movementY,this._state=0,Fe.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else(!this._isDragging&&this._lockedPointer||this._isDragging&&(Fe.buttons&M.LEFT)===M.LEFT)&&(this._state=this._state|this.mouseButtons.left),this._isDragging&&(Fe.buttons&M.MIDDLE)===M.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),this._isDragging&&(Fe.buttons&M.RIGHT)===M.RIGHT&&(this._state=this._state|this.mouseButtons.right);Ne()}},I=Fe=>{const at=this._findPointerById(Fe.pointerId);if(!(at&&at===this._lockedPointer)){if(at&&this._disposePointer(at),Fe.pointerType==="touch")switch(this._activePointers.length){case 0:this._state=c.NONE;break;case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=c.NONE;ke()}};let O=-1;const ye=Fe=>{if(!this._domElement||!this._enabled||this.mouseButtons.wheel===c.NONE)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const Lt=this._domElement.getBoundingClientRect(),Wt=(Fe.clientX-Lt.left)/(Lt.right-Lt.left),Pt=(Fe.clientY-Lt.top)/(Lt.bottom-Lt.top);if(Wt<this._interactiveArea.left||Wt>this._interactiveArea.right||Pt<this._interactiveArea.top||Pt>this._interactiveArea.bottom)return}if(Fe.preventDefault(),this.dollyToCursor||this.mouseButtons.wheel===c.ROTATE||this.mouseButtons.wheel===c.TRUCK){const Lt=performance.now();O-Lt<1e3&&this._getClientRect(this._elementRect),O=Lt}const at=Os?-1:-3,ct=Fe.deltaMode===1||Fe.ctrlKey?Fe.deltaY/at:Fe.deltaY/(at*10),xt=this.dollyToCursor?(Fe.clientX-this._elementRect.x)/this._elementRect.width*2-1:0,Gt=this.dollyToCursor?(Fe.clientY-this._elementRect.y)/this._elementRect.height*-2+1:0;switch(this.mouseButtons.wheel){case c.ROTATE:{this._rotateInternal(Fe.deltaX,Fe.deltaY),this._isUserControllingRotate=!0;break}case c.TRUCK:{this._truckInternal(Fe.deltaX,Fe.deltaY,!1,!1),this._isUserControllingTruck=!0;break}case c.SCREEN_PAN:{this._truckInternal(Fe.deltaX,Fe.deltaY,!1,!0),this._isUserControllingTruck=!0;break}case c.OFFSET:{this._truckInternal(Fe.deltaX,Fe.deltaY,!0,!1),this._isUserControllingOffset=!0;break}case c.DOLLY:{this._dollyInternal(-ct,xt,Gt),this._isUserControllingDolly=!0;break}case c.ZOOM:{this._zoomInternal(-ct,xt,Gt),this._isUserControllingZoom=!0;break}}this.dispatchEvent({type:"control"})},Se=Fe=>{if(!(!this._domElement||!this._enabled)){if(this.mouseButtons.right===J.ACTION.NONE){const at=Fe instanceof PointerEvent?Fe.pointerId:0,ct=this._findPointerById(at);ct&&this._disposePointer(ct),this._domElement.ownerDocument.removeEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",I);return}Fe.preventDefault()}},Pe=Fe=>{if(this._enabled){if(Ee(this._activePointers,D),this._getClientRect(this._elementRect),d.copy(D),g.copy(D),this._activePointers.length>=2){const at=D.x-this._activePointers[1].clientX,ct=D.y-this._activePointers[1].clientY,xt=Math.sqrt(at*at+ct*ct);v.set(0,xt);const Gt=(this._activePointers[0].clientX+this._activePointers[1].clientX)*.5,Lt=(this._activePointers[0].clientY+this._activePointers[1].clientY)*.5;g.set(Gt,Lt)}if(this._state=0,!Fe)this._lockedPointer&&(this._state=this._state|this.mouseButtons.left);else if("pointerType"in Fe&&Fe.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else!this._lockedPointer&&(Fe.buttons&M.LEFT)===M.LEFT&&(this._state=this._state|this.mouseButtons.left),(Fe.buttons&M.MIDDLE)===M.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(Fe.buttons&M.RIGHT)===M.RIGHT&&(this._state=this._state|this.mouseButtons.right);((this._state&c.ROTATE)===c.ROTATE||(this._state&c.TOUCH_ROTATE)===c.TOUCH_ROTATE||(this._state&c.TOUCH_DOLLY_ROTATE)===c.TOUCH_DOLLY_ROTATE||(this._state&c.TOUCH_ZOOM_ROTATE)===c.TOUCH_ZOOM_ROTATE)&&(this._sphericalEnd.theta=this._spherical.theta,this._sphericalEnd.phi=this._spherical.phi,this._thetaVelocity.value=0,this._phiVelocity.value=0),((this._state&c.TRUCK)===c.TRUCK||(this._state&c.SCREEN_PAN)===c.SCREEN_PAN||(this._state&c.TOUCH_TRUCK)===c.TOUCH_TRUCK||(this._state&c.TOUCH_SCREEN_PAN)===c.TOUCH_SCREEN_PAN||(this._state&c.TOUCH_DOLLY_TRUCK)===c.TOUCH_DOLLY_TRUCK||(this._state&c.TOUCH_DOLLY_SCREEN_PAN)===c.TOUCH_DOLLY_SCREEN_PAN||(this._state&c.TOUCH_ZOOM_TRUCK)===c.TOUCH_ZOOM_TRUCK||(this._state&c.TOUCH_ZOOM_SCREEN_PAN)===c.TOUCH_DOLLY_SCREEN_PAN)&&(this._targetEnd.copy(this._target),this._targetVelocity.set(0,0,0)),((this._state&c.DOLLY)===c.DOLLY||(this._state&c.TOUCH_DOLLY)===c.TOUCH_DOLLY||(this._state&c.TOUCH_DOLLY_TRUCK)===c.TOUCH_DOLLY_TRUCK||(this._state&c.TOUCH_DOLLY_SCREEN_PAN)===c.TOUCH_DOLLY_SCREEN_PAN||(this._state&c.TOUCH_DOLLY_OFFSET)===c.TOUCH_DOLLY_OFFSET||(this._state&c.TOUCH_DOLLY_ROTATE)===c.TOUCH_DOLLY_ROTATE)&&(this._sphericalEnd.radius=this._spherical.radius,this._radiusVelocity.value=0),((this._state&c.ZOOM)===c.ZOOM||(this._state&c.TOUCH_ZOOM)===c.TOUCH_ZOOM||(this._state&c.TOUCH_ZOOM_TRUCK)===c.TOUCH_ZOOM_TRUCK||(this._state&c.TOUCH_ZOOM_SCREEN_PAN)===c.TOUCH_ZOOM_SCREEN_PAN||(this._state&c.TOUCH_ZOOM_OFFSET)===c.TOUCH_ZOOM_OFFSET||(this._state&c.TOUCH_ZOOM_ROTATE)===c.TOUCH_ZOOM_ROTATE)&&(this._zoomEnd=this._zoom,this._zoomVelocity.value=0),((this._state&c.OFFSET)===c.OFFSET||(this._state&c.TOUCH_OFFSET)===c.TOUCH_OFFSET||(this._state&c.TOUCH_DOLLY_OFFSET)===c.TOUCH_DOLLY_OFFSET||(this._state&c.TOUCH_ZOOM_OFFSET)===c.TOUCH_ZOOM_OFFSET)&&(this._focalOffsetEnd.copy(this._focalOffset),this._focalOffsetVelocity.set(0,0,0)),this.dispatchEvent({type:"controlstart"})}},Ne=()=>{if(!this._enabled||!this._dragNeedsUpdate)return;this._dragNeedsUpdate=!1,Ee(this._activePointers,D);const Fe=this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement?this._lockedPointer||this._activePointers[0]:null,at=Fe?-Fe.deltaX:g.x-D.x,ct=Fe?-Fe.deltaY:g.y-D.y;if(g.copy(D),((this._state&c.ROTATE)===c.ROTATE||(this._state&c.TOUCH_ROTATE)===c.TOUCH_ROTATE||(this._state&c.TOUCH_DOLLY_ROTATE)===c.TOUCH_DOLLY_ROTATE||(this._state&c.TOUCH_ZOOM_ROTATE)===c.TOUCH_ZOOM_ROTATE)&&(this._rotateInternal(at,ct),this._isUserControllingRotate=!0),(this._state&c.DOLLY)===c.DOLLY||(this._state&c.ZOOM)===c.ZOOM){const xt=this.dollyToCursor?(d.x-this._elementRect.x)/this._elementRect.width*2-1:0,Gt=this.dollyToCursor?(d.y-this._elementRect.y)/this._elementRect.height*-2+1:0,Lt=this.dollyDragInverted?-1:1;(this._state&c.DOLLY)===c.DOLLY?(this._dollyInternal(Lt*ct*ce,xt,Gt),this._isUserControllingDolly=!0):(this._zoomInternal(Lt*ct*ce,xt,Gt),this._isUserControllingZoom=!0)}if((this._state&c.TOUCH_DOLLY)===c.TOUCH_DOLLY||(this._state&c.TOUCH_ZOOM)===c.TOUCH_ZOOM||(this._state&c.TOUCH_DOLLY_TRUCK)===c.TOUCH_DOLLY_TRUCK||(this._state&c.TOUCH_ZOOM_TRUCK)===c.TOUCH_ZOOM_TRUCK||(this._state&c.TOUCH_DOLLY_SCREEN_PAN)===c.TOUCH_DOLLY_SCREEN_PAN||(this._state&c.TOUCH_ZOOM_SCREEN_PAN)===c.TOUCH_ZOOM_SCREEN_PAN||(this._state&c.TOUCH_DOLLY_OFFSET)===c.TOUCH_DOLLY_OFFSET||(this._state&c.TOUCH_ZOOM_OFFSET)===c.TOUCH_ZOOM_OFFSET||(this._state&c.TOUCH_DOLLY_ROTATE)===c.TOUCH_DOLLY_ROTATE||(this._state&c.TOUCH_ZOOM_ROTATE)===c.TOUCH_ZOOM_ROTATE){const xt=D.x-this._activePointers[1].clientX,Gt=D.y-this._activePointers[1].clientY,Lt=Math.sqrt(xt*xt+Gt*Gt),Wt=v.y-Lt;v.set(0,Lt);const Pt=this.dollyToCursor?(g.x-this._elementRect.x)/this._elementRect.width*2-1:0,Ft=this.dollyToCursor?(g.y-this._elementRect.y)/this._elementRect.height*-2+1:0;(this._state&c.TOUCH_DOLLY)===c.TOUCH_DOLLY||(this._state&c.TOUCH_DOLLY_ROTATE)===c.TOUCH_DOLLY_ROTATE||(this._state&c.TOUCH_DOLLY_TRUCK)===c.TOUCH_DOLLY_TRUCK||(this._state&c.TOUCH_DOLLY_SCREEN_PAN)===c.TOUCH_DOLLY_SCREEN_PAN||(this._state&c.TOUCH_DOLLY_OFFSET)===c.TOUCH_DOLLY_OFFSET?(this._dollyInternal(Wt*ce,Pt,Ft),this._isUserControllingDolly=!0):(this._zoomInternal(Wt*ce,Pt,Ft),this._isUserControllingZoom=!0)}((this._state&c.TRUCK)===c.TRUCK||(this._state&c.TOUCH_TRUCK)===c.TOUCH_TRUCK||(this._state&c.TOUCH_DOLLY_TRUCK)===c.TOUCH_DOLLY_TRUCK||(this._state&c.TOUCH_ZOOM_TRUCK)===c.TOUCH_ZOOM_TRUCK)&&(this._truckInternal(at,ct,!1,!1),this._isUserControllingTruck=!0),((this._state&c.SCREEN_PAN)===c.SCREEN_PAN||(this._state&c.TOUCH_SCREEN_PAN)===c.TOUCH_SCREEN_PAN||(this._state&c.TOUCH_DOLLY_SCREEN_PAN)===c.TOUCH_DOLLY_SCREEN_PAN||(this._state&c.TOUCH_ZOOM_SCREEN_PAN)===c.TOUCH_ZOOM_SCREEN_PAN)&&(this._truckInternal(at,ct,!1,!0),this._isUserControllingTruck=!0),((this._state&c.OFFSET)===c.OFFSET||(this._state&c.TOUCH_OFFSET)===c.TOUCH_OFFSET||(this._state&c.TOUCH_DOLLY_OFFSET)===c.TOUCH_DOLLY_OFFSET||(this._state&c.TOUCH_ZOOM_OFFSET)===c.TOUCH_ZOOM_OFFSET)&&(this._truckInternal(at,ct,!0,!1),this._isUserControllingOffset=!0),this.dispatchEvent({type:"control"})},ke=()=>{Ee(this._activePointers,D),g.copy(D),this._dragNeedsUpdate=!1,(this._activePointers.length===0||this._activePointers.length===1&&this._activePointers[0]===this._lockedPointer)&&(this._isDragging=!1),this._activePointers.length===0&&this._domElement&&(this._domElement.ownerDocument.removeEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",I),this.dispatchEvent({type:"controlend"}))};this.lockPointer=()=>{!this._enabled||!this._domElement||(this.cancel(),this._lockedPointer={pointerId:-1,clientX:0,clientY:0,deltaX:0,deltaY:0,mouseButton:null},this._activePointers.push(this._lockedPointer),this._domElement.ownerDocument.removeEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",I),this._domElement.requestPointerLock(),this._domElement.ownerDocument.addEventListener("pointerlockchange",ht),this._domElement.ownerDocument.addEventListener("pointerlockerror",He),this._domElement.ownerDocument.addEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",I),Pe())},this.unlockPointer=()=>{var Fe,at,ct;this._lockedPointer!==null&&(this._disposePointer(this._lockedPointer),this._lockedPointer=null),(Fe=this._domElement)===null||Fe===void 0||Fe.ownerDocument.exitPointerLock(),(at=this._domElement)===null||at===void 0||at.ownerDocument.removeEventListener("pointerlockchange",ht),(ct=this._domElement)===null||ct===void 0||ct.ownerDocument.removeEventListener("pointerlockerror",He),this.cancel()};const ht=()=>{this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement||this.unlockPointer()},He=()=>{this.unlockPointer()};this._addAllEventListeners=Fe=>{this._domElement=Fe,this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none",this._domElement.addEventListener("pointerdown",C),this._domElement.addEventListener("pointercancel",I),this._domElement.addEventListener("wheel",ye,{passive:!1}),this._domElement.addEventListener("contextmenu",Se)},this._removeAllEventListeners=()=>{this._domElement&&(this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect="",this._domElement.removeEventListener("pointerdown",C),this._domElement.removeEventListener("pointercancel",I),this._domElement.removeEventListener("wheel",ye,{passive:!1}),this._domElement.removeEventListener("contextmenu",Se),this._domElement.ownerDocument.removeEventListener("pointermove",w,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",I),this._domElement.ownerDocument.removeEventListener("pointerlockchange",ht),this._domElement.ownerDocument.removeEventListener("pointerlockerror",He))},this.cancel=()=>{this._state!==c.NONE&&(this._state=c.NONE,this._activePointers.length=0,ke())},r&&this.connect(r),this.update(0)}get camera(){return this._camera}set camera(t){this._camera=t,this.updateCameraUp(),this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0}get enabled(){return this._enabled}set enabled(t){this._enabled=t,this._domElement&&(t?(this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none"):(this.cancel(),this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect=""))}get active(){return!this._hasRested}get currentAction(){return this._state}get distance(){return this._spherical.radius}set distance(t){this._spherical.radius===t&&this._sphericalEnd.radius===t||(this._spherical.radius=t,this._sphericalEnd.radius=t,this._needsUpdate=!0)}get azimuthAngle(){return this._spherical.theta}set azimuthAngle(t){this._spherical.theta===t&&this._sphericalEnd.theta===t||(this._spherical.theta=t,this._sphericalEnd.theta=t,this._needsUpdate=!0)}get polarAngle(){return this._spherical.phi}set polarAngle(t){this._spherical.phi===t&&this._sphericalEnd.phi===t||(this._spherical.phi=t,this._sphericalEnd.phi=t,this._needsUpdate=!0)}get boundaryEnclosesCamera(){return this._boundaryEnclosesCamera}set boundaryEnclosesCamera(t){this._boundaryEnclosesCamera=t,this._needsUpdate=!0}set interactiveArea(t){this._interactiveArea.width=k(t.width,0,1),this._interactiveArea.height=k(t.height,0,1),this._interactiveArea.x=k(t.x,0,1-this._interactiveArea.width),this._interactiveArea.y=k(t.y,0,1-this._interactiveArea.height)}addEventListener(t,r){super.addEventListener(t,r)}removeEventListener(t,r){super.removeEventListener(t,r)}rotate(t,r,d=!1){return this.rotateTo(this._sphericalEnd.theta+t,this._sphericalEnd.phi+r,d)}rotateAzimuthTo(t,r=!1){return this.rotateTo(t,this._sphericalEnd.phi,r)}rotatePolarTo(t,r=!1){return this.rotateTo(this._sphericalEnd.theta,t,r)}rotateTo(t,r,d=!1){this._isUserControllingRotate=!1;const g=k(t,this.minAzimuthAngle,this.maxAzimuthAngle),v=k(r,this.minPolarAngle,this.maxPolarAngle);this._sphericalEnd.theta=g,this._sphericalEnd.phi=v,this._sphericalEnd.makeSafe(),this._needsUpdate=!0,d||(this._spherical.theta=this._sphericalEnd.theta,this._spherical.phi=this._sphericalEnd.phi);const C=!d||P$1(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&P$1(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold);return this._createOnRestPromise(C)}dolly(t,r=!1){return this.dollyTo(this._sphericalEnd.radius-t,r)}dollyTo(t,r=!1){return this._isUserControllingDolly=!1,this._lastDollyDirection=K.NONE,this._changedDolly=0,this._dollyToNoClamp(k(t,this.minDistance,this.maxDistance),r)}_dollyToNoClamp(t,r=!1){const d=this._sphericalEnd.radius;if(this.colliderMeshes.length>=1){const v=this._collisionTest(),C=P$1(v,this._spherical.radius);if(!(d>t)&&C)return Promise.resolve();this._sphericalEnd.radius=Math.min(t,v)}else this._sphericalEnd.radius=t;this._needsUpdate=!0,r||(this._spherical.radius=this._sphericalEnd.radius);const g=!r||P$1(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(g)}dollyInFixed(t,r=!1){this._targetEnd.add(this._getCameraDirection(ne).multiplyScalar(t)),r||this._target.copy(this._targetEnd);const d=!r||P$1(this._target.x,this._targetEnd.x,this.restThreshold)&&P$1(this._target.y,this._targetEnd.y,this.restThreshold)&&P$1(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(d)}zoom(t,r=!1){return this.zoomTo(this._zoomEnd+t,r)}zoomTo(t,r=!1){this._isUserControllingZoom=!1,this._zoomEnd=k(t,this.minZoom,this.maxZoom),this._needsUpdate=!0,r||(this._zoom=this._zoomEnd);const d=!r||P$1(this._zoom,this._zoomEnd,this.restThreshold);return this._changedZoom=0,this._createOnRestPromise(d)}pan(t,r,d=!1){return console.warn("`pan` has been renamed to `truck`"),this.truck(t,r,d)}truck(t,r,d=!1){this._camera.updateMatrix(),F.setFromMatrixColumn(this._camera.matrix,0),N$1.setFromMatrixColumn(this._camera.matrix,1),F.multiplyScalar(t),N$1.multiplyScalar(-r);const g=x$1.copy(F).add(N$1),v=L.copy(this._targetEnd).add(g);return this.moveTo(v.x,v.y,v.z,d)}forward(t,r=!1){x$1.setFromMatrixColumn(this._camera.matrix,0),x$1.crossVectors(this._camera.up,x$1),x$1.multiplyScalar(t);const d=L.copy(this._targetEnd).add(x$1);return this.moveTo(d.x,d.y,d.z,r)}elevate(t,r=!1){return x$1.copy(this._camera.up).multiplyScalar(t),this.moveTo(this._targetEnd.x+x$1.x,this._targetEnd.y+x$1.y,this._targetEnd.z+x$1.z,r)}moveTo(t,r,d,g=!1){this._isUserControllingTruck=!1;const v=x$1.set(t,r,d).sub(this._targetEnd);this._encloseToBoundary(this._targetEnd,v,this.boundaryFriction),this._needsUpdate=!0,g||this._target.copy(this._targetEnd);const C=!g||P$1(this._target.x,this._targetEnd.x,this.restThreshold)&&P$1(this._target.y,this._targetEnd.y,this.restThreshold)&&P$1(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(C)}lookInDirectionOf(t,r,d,g=!1){const v=x$1.set(t,r,d).sub(this._targetEnd).normalize().multiplyScalar(-this._sphericalEnd.radius).add(this._targetEnd);return this.setPosition(v.x,v.y,v.z,g)}fitToBox(t,r,{cover:d=!1,paddingLeft:g=0,paddingRight:v=0,paddingBottom:C=0,paddingTop:w=0}={}){const I=[],O=t.isBox3?$.copy(t):$.setFromObject(t);O.isEmpty()&&(console.warn("camera-controls: fitTo() cannot be used with an empty box. Aborting"),Promise.resolve());const ye=je(this._sphericalEnd.theta,Ie$1),Se=je(this._sphericalEnd.phi,Ie$1);I.push(this.rotateTo(ye,Se,r));const Pe=x$1.setFromSpherical(this._sphericalEnd).normalize(),Ne=Ke$1.setFromUnitVectors(Pe,Te),ke=P$1(Math.abs(Pe.y),1);ke&&Ne.multiply(xe.setFromAxisAngle(de,ye)),Ne.multiply(this._yAxisUpSpaceInverse);const ht=We.makeEmpty();L.copy(O.min).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.min).setX(O.max.x).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.min).setY(O.max.y).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.max).setZ(O.min.z).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.min).setZ(O.max.z).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.max).setY(O.min.y).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.max).setX(O.min.x).applyQuaternion(Ne),ht.expandByPoint(L),L.copy(O.max).applyQuaternion(Ne),ht.expandByPoint(L),ht.min.x-=g,ht.min.y-=C,ht.max.x+=v,ht.max.y+=w,Ne.setFromUnitVectors(Te,Pe),ke&&Ne.premultiply(xe.invert()),Ne.premultiply(this._yAxisUpSpace);const He=ht.getSize(x$1),Fe=ht.getCenter(L).applyQuaternion(Ne);if(Y$1(this._camera)){const at=this.getDistanceToFitBox(He.x,He.y,He.z,d);I.push(this.moveTo(Fe.x,Fe.y,Fe.z,r)),I.push(this.dollyTo(at,r)),I.push(this.setFocalOffset(0,0,0,r))}else if(j(this._camera)){const at=this._camera,ct=at.right-at.left,xt=at.top-at.bottom,Gt=d?Math.max(ct/He.x,xt/He.y):Math.min(ct/He.x,xt/He.y);I.push(this.moveTo(Fe.x,Fe.y,Fe.z,r)),I.push(this.zoomTo(Gt,r)),I.push(this.setFocalOffset(0,0,0,r))}return Promise.all(I)}fitToSphere(t,r){const d=[],g="isObject3D"in t?J.createBoundingSphere(t,we):we.copy(t);if(d.push(this.moveTo(g.center.x,g.center.y,g.center.z,r)),Y$1(this._camera)){const v=this.getDistanceToFitSphere(g.radius);d.push(this.dollyTo(v,r))}else if(j(this._camera)){const v=this._camera.right-this._camera.left,C=this._camera.top-this._camera.bottom,w=2*g.radius,I=Math.min(v/w,C/w);d.push(this.zoomTo(I,r))}return d.push(this.setFocalOffset(0,0,0,r)),Promise.all(d)}setLookAt(t,r,d,g,v,C,w=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=K.NONE,this._changedDolly=0;const I=L.set(g,v,C),O=x$1.set(t,r,d);this._targetEnd.copy(I),this._sphericalEnd.setFromVector3(O.sub(I).applyQuaternion(this._yAxisUpSpace)),this.normalizeRotations(),this._needsUpdate=!0,w||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const ye=!w||P$1(this._target.x,this._targetEnd.x,this.restThreshold)&&P$1(this._target.y,this._targetEnd.y,this.restThreshold)&&P$1(this._target.z,this._targetEnd.z,this.restThreshold)&&P$1(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&P$1(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&P$1(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(ye)}lerpLookAt(t,r,d,g,v,C,w,I,O,ye,Se,Pe,Ne,ke=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=K.NONE,this._changedDolly=0;const ht=x$1.set(g,v,C),He=L.set(t,r,d);z$1.setFromVector3(He.sub(ht).applyQuaternion(this._yAxisUpSpace));const Fe=X.set(ye,Se,Pe),at=L.set(w,I,O);ae.setFromVector3(at.sub(Fe).applyQuaternion(this._yAxisUpSpace)),this._targetEnd.copy(ht.lerp(Fe,Ne));const ct=ae.theta-z$1.theta,xt=ae.phi-z$1.phi,Gt=ae.radius-z$1.radius;this._sphericalEnd.set(z$1.radius+Gt*Ne,z$1.phi+xt*Ne,z$1.theta+ct*Ne),this.normalizeRotations(),this._needsUpdate=!0,ke||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const Lt=!ke||P$1(this._target.x,this._targetEnd.x,this.restThreshold)&&P$1(this._target.y,this._targetEnd.y,this.restThreshold)&&P$1(this._target.z,this._targetEnd.z,this.restThreshold)&&P$1(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&P$1(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&P$1(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(Lt)}setPosition(t,r,d,g=!1){return this.setLookAt(t,r,d,this._targetEnd.x,this._targetEnd.y,this._targetEnd.z,g)}setTarget(t,r,d,g=!1){const v=this.getPosition(x$1),C=this.setLookAt(v.x,v.y,v.z,t,r,d,g);return this._sphericalEnd.phi=k(this._sphericalEnd.phi,this.minPolarAngle,this.maxPolarAngle),C}setFocalOffset(t,r,d,g=!1){this._isUserControllingOffset=!1,this._focalOffsetEnd.set(t,r,d),this._needsUpdate=!0,g||this._focalOffset.copy(this._focalOffsetEnd);const v=!g||P$1(this._focalOffset.x,this._focalOffsetEnd.x,this.restThreshold)&&P$1(this._focalOffset.y,this._focalOffsetEnd.y,this.restThreshold)&&P$1(this._focalOffset.z,this._focalOffsetEnd.z,this.restThreshold);return this._createOnRestPromise(v)}setOrbitPoint(t,r,d){this._camera.updateMatrixWorld(),F.setFromMatrixColumn(this._camera.matrixWorldInverse,0),N$1.setFromMatrixColumn(this._camera.matrixWorldInverse,1),Z$1.setFromMatrixColumn(this._camera.matrixWorldInverse,2);const g=x$1.set(t,r,d),v=g.distanceTo(this._camera.position),C=g.sub(this._camera.position);F.multiplyScalar(C.x),N$1.multiplyScalar(C.y),Z$1.multiplyScalar(C.z),x$1.copy(F).add(N$1).add(Z$1),x$1.z=x$1.z+v,this.dollyTo(v,!1),this.setFocalOffset(-x$1.x,x$1.y,-x$1.z,!1),this.moveTo(t,r,d,!1)}setBoundary(t){if(!t){this._boundary.min.set(-1/0,-1/0,-1/0),this._boundary.max.set(1/0,1/0,1/0),this._needsUpdate=!0;return}this._boundary.copy(t),this._boundary.clampPoint(this._targetEnd,this._targetEnd),this._needsUpdate=!0}setViewport(t,r,d,g){if(t===null){this._viewport=null;return}this._viewport=this._viewport||new T$1.Vector4,typeof t=="number"?this._viewport.set(t,r,d,g):this._viewport.copy(t)}getDistanceToFitBox(t,r,d,g=!1){if(Oe(this._camera,"getDistanceToFitBox"))return this._spherical.radius;const v=t/r,C=this._camera.getEffectiveFOV()*ie,w=this._camera.aspect;return((g?v>w:v<w)?r:t/w)*.5/Math.tan(C*.5)+d*.5}getDistanceToFitSphere(t){if(Oe(this._camera,"getDistanceToFitSphere"))return this._spherical.radius;const r=this._camera.getEffectiveFOV()*ie,d=Math.atan(Math.tan(r*.5)*this._camera.aspect)*2,g=1<this._camera.aspect?r:d;return t/Math.sin(g*.5)}getTarget(t,r=!0){return(t&&t.isVector3?t:new T$1.Vector3).copy(r?this._targetEnd:this._target)}getPosition(t,r=!0){return(t&&t.isVector3?t:new T$1.Vector3).setFromSpherical(r?this._sphericalEnd:this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(r?this._targetEnd:this._target)}getSpherical(t,r=!0){return(t||new T$1.Spherical).copy(r?this._sphericalEnd:this._spherical)}getFocalOffset(t,r=!0){return(t&&t.isVector3?t:new T$1.Vector3).copy(r?this._focalOffsetEnd:this._focalOffset)}normalizeRotations(){this._sphericalEnd.theta=this._sphericalEnd.theta%G$1,this._sphericalEnd.theta<0&&(this._sphericalEnd.theta+=G$1),this._spherical.theta+=G$1*Math.round((this._sphericalEnd.theta-this._spherical.theta)/G$1)}stop(){this._focalOffset.copy(this._focalOffsetEnd),this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd),this._zoom=this._zoomEnd}reset(t=!1){if(!P$1(this._camera.up.x,this._cameraUp0.x)||!P$1(this._camera.up.y,this._cameraUp0.y)||!P$1(this._camera.up.z,this._cameraUp0.z)){this._camera.up.copy(this._cameraUp0);const d=this.getPosition(x$1);this.updateCameraUp(),this.setPosition(d.x,d.y,d.z)}const r=[this.setLookAt(this._position0.x,this._position0.y,this._position0.z,this._target0.x,this._target0.y,this._target0.z,t),this.setFocalOffset(this._focalOffset0.x,this._focalOffset0.y,this._focalOffset0.z,t),this.zoomTo(this._zoom0,t)];return Promise.all(r)}saveState(){this._cameraUp0.copy(this._camera.up),this.getTarget(this._target0),this.getPosition(this._position0),this._zoom0=this._zoom,this._focalOffset0.copy(this._focalOffset)}updateCameraUp(){this._yAxisUpSpace.setFromUnitVectors(this._camera.up,de),this._yAxisUpSpaceInverse.copy(this._yAxisUpSpace).invert()}applyCameraUp(){const t=x$1.subVectors(this._target,this._camera.position).normalize(),r=L.crossVectors(t,this._camera.up);this._camera.up.crossVectors(r,t).normalize(),this._camera.updateMatrixWorld();const d=this.getPosition(x$1);this.updateCameraUp(),this.setPosition(d.x,d.y,d.z)}update(t){const r=this._sphericalEnd.theta-this._spherical.theta,d=this._sphericalEnd.phi-this._spherical.phi,g=this._sphericalEnd.radius-this._spherical.radius,v=Ye.subVectors(this._targetEnd,this._target),C=Ze$1.subVectors(this._focalOffsetEnd,this._focalOffset),w=this._zoomEnd-this._zoom;if(A(r))this._thetaVelocity.value=0,this._spherical.theta=this._sphericalEnd.theta;else{const ye=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.theta=he(this._spherical.theta,this._sphericalEnd.theta,this._thetaVelocity,ye,1/0,t),this._needsUpdate=!0}if(A(d))this._phiVelocity.value=0,this._spherical.phi=this._sphericalEnd.phi;else{const ye=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.phi=he(this._spherical.phi,this._sphericalEnd.phi,this._phiVelocity,ye,1/0,t),this._needsUpdate=!0}if(A(g))this._radiusVelocity.value=0,this._spherical.radius=this._sphericalEnd.radius;else{const ye=this._isUserControllingDolly?this.draggingSmoothTime:this.smoothTime;this._spherical.radius=he(this._spherical.radius,this._sphericalEnd.radius,this._radiusVelocity,ye,this.maxSpeed,t),this._needsUpdate=!0}if(A(v.x)&&A(v.y)&&A(v.z))this._targetVelocity.set(0,0,0),this._target.copy(this._targetEnd);else{const ye=this._isUserControllingTruck?this.draggingSmoothTime:this.smoothTime;Be$1(this._target,this._targetEnd,this._targetVelocity,ye,this.maxSpeed,t,this._target),this._needsUpdate=!0}if(A(C.x)&&A(C.y)&&A(C.z))this._focalOffsetVelocity.set(0,0,0),this._focalOffset.copy(this._focalOffsetEnd);else{const ye=this._isUserControllingOffset?this.draggingSmoothTime:this.smoothTime;Be$1(this._focalOffset,this._focalOffsetEnd,this._focalOffsetVelocity,ye,this.maxSpeed,t,this._focalOffset),this._needsUpdate=!0}if(A(w))this._zoomVelocity.value=0,this._zoom=this._zoomEnd;else{const ye=this._isUserControllingZoom?this.draggingSmoothTime:this.smoothTime;this._zoom=he(this._zoom,this._zoomEnd,this._zoomVelocity,ye,1/0,t)}if(this.dollyToCursor){if(Y$1(this._camera)&&this._changedDolly!==0){const ye=this._spherical.radius-this._lastDistance,Se=this._camera,Pe=this._getCameraDirection(ne),Ne=x$1.copy(Pe).cross(Se.up).normalize();Ne.lengthSq()===0&&(Ne.x=1);const ke=L.crossVectors(Ne,Pe),ht=this._sphericalEnd.radius*Math.tan(Se.getEffectiveFOV()*ie*.5),He=(this._sphericalEnd.radius-ye-this._sphericalEnd.radius)/this._sphericalEnd.radius,Fe=X.copy(this._targetEnd).add(Ne.multiplyScalar(this._dollyControlCoord.x*ht*Se.aspect)).add(ke.multiplyScalar(this._dollyControlCoord.y*ht)),at=x$1.copy(this._targetEnd).lerp(Fe,He),ct=this._lastDollyDirection===K.IN&&this._spherical.radius<=this.minDistance,xt=this._lastDollyDirection===K.OUT&&this.maxDistance<=this._spherical.radius;if(this.infinityDolly&&(ct||xt)){this._sphericalEnd.radius-=ye,this._spherical.radius-=ye;const Lt=L.copy(Pe).multiplyScalar(-ye);at.add(Lt)}this._boundary.clampPoint(at,at);const Gt=L.subVectors(at,this._targetEnd);this._targetEnd.copy(at),this._target.add(Gt),this._changedDolly-=ye,A(this._changedDolly)&&(this._changedDolly=0)}else if(j(this._camera)&&this._changedZoom!==0){const ye=this._zoom-this._lastZoom,Se=this._camera,Pe=x$1.set(this._dollyControlCoord.x,this._dollyControlCoord.y,(Se.near+Se.far)/(Se.near-Se.far)).unproject(Se),Ne=L.set(0,0,-1).applyQuaternion(Se.quaternion),ke=X.copy(Pe).add(Ne.multiplyScalar(-Pe.dot(Se.up))),ht=-(this._zoom-ye-this._zoom)/this._zoom,He=this._getCameraDirection(ne),Fe=this._targetEnd.dot(He),at=x$1.copy(this._targetEnd).lerp(ke,ht),ct=at.dot(He),xt=He.multiplyScalar(ct-Fe);at.sub(xt),this._boundary.clampPoint(at,at);const Gt=L.subVectors(at,this._targetEnd);this._targetEnd.copy(at),this._target.add(Gt),this._changedZoom-=ye,A(this._changedZoom)&&(this._changedZoom=0)}}this._camera.zoom!==this._zoom&&(this._camera.zoom=this._zoom,this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0),this._dragNeedsUpdate=!0;const I=this._collisionTest();this._spherical.radius=Math.min(this._spherical.radius,I),this._spherical.makeSafe(),this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target),this._camera.lookAt(this._target),(!A(this._focalOffset.x)||!A(this._focalOffset.y)||!A(this._focalOffset.z))&&(F.setFromMatrixColumn(this._camera.matrix,0),N$1.setFromMatrixColumn(this._camera.matrix,1),Z$1.setFromMatrixColumn(this._camera.matrix,2),F.multiplyScalar(this._focalOffset.x),N$1.multiplyScalar(-this._focalOffset.y),Z$1.multiplyScalar(this._focalOffset.z),x$1.copy(F).add(N$1).add(Z$1),this._camera.position.add(x$1),this._camera.updateMatrixWorld()),this._boundaryEnclosesCamera&&this._encloseToBoundary(this._camera.position.copy(this._target),x$1.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse),1);const O=this._needsUpdate;return O&&!this._updatedLastTime?(this._hasRested=!1,this.dispatchEvent({type:"wake"}),this.dispatchEvent({type:"update"})):O?(this.dispatchEvent({type:"update"}),A(r,this.restThreshold)&&A(d,this.restThreshold)&&A(g,this.restThreshold)&&A(v.x,this.restThreshold)&&A(v.y,this.restThreshold)&&A(v.z,this.restThreshold)&&A(C.x,this.restThreshold)&&A(C.y,this.restThreshold)&&A(C.z,this.restThreshold)&&A(w,this.restThreshold)&&!this._hasRested&&(this._hasRested=!0,this.dispatchEvent({type:"rest"}))):!O&&this._updatedLastTime&&(this._hasRested||(this._hasRested=!0,this.dispatchEvent({type:"rest"})),this.dispatchEvent({type:"sleep"})),this._lastDistance=this._spherical.radius,this._lastZoom=this._zoom,this._updatedLastTime=O,this._needsUpdate=!1,O}toJSON(){return JSON.stringify({enabled:this._enabled,minDistance:this.minDistance,maxDistance:re(this.maxDistance),minZoom:this.minZoom,maxZoom:re(this.maxZoom),minPolarAngle:this.minPolarAngle,maxPolarAngle:re(this.maxPolarAngle),minAzimuthAngle:re(this.minAzimuthAngle),maxAzimuthAngle:re(this.maxAzimuthAngle),smoothTime:this.smoothTime,draggingSmoothTime:this.draggingSmoothTime,dollySpeed:this.dollySpeed,truckSpeed:this.truckSpeed,dollyToCursor:this.dollyToCursor,target:this._targetEnd.toArray(),position:x$1.setFromSpherical(this._sphericalEnd).add(this._targetEnd).toArray(),zoom:this._zoomEnd,focalOffset:this._focalOffsetEnd.toArray(),target0:this._target0.toArray(),position0:this._position0.toArray(),zoom0:this._zoom0,focalOffset0:this._focalOffset0.toArray()})}fromJSON(t,r=!1){const d=JSON.parse(t);this.enabled=d.enabled,this.minDistance=d.minDistance,this.maxDistance=oe(d.maxDistance),this.minZoom=d.minZoom,this.maxZoom=oe(d.maxZoom),this.minPolarAngle=d.minPolarAngle,this.maxPolarAngle=oe(d.maxPolarAngle),this.minAzimuthAngle=oe(d.minAzimuthAngle),this.maxAzimuthAngle=oe(d.maxAzimuthAngle),this.smoothTime=d.smoothTime,this.draggingSmoothTime=d.draggingSmoothTime,this.dollySpeed=d.dollySpeed,this.truckSpeed=d.truckSpeed,this.dollyToCursor=d.dollyToCursor,this._target0.fromArray(d.target0),this._position0.fromArray(d.position0),this._zoom0=d.zoom0,this._focalOffset0.fromArray(d.focalOffset0),this.moveTo(d.target[0],d.target[1],d.target[2],r),z$1.setFromVector3(x$1.fromArray(d.position).sub(this._targetEnd).applyQuaternion(this._yAxisUpSpace)),this.rotateTo(z$1.theta,z$1.phi,r),this.dollyTo(z$1.radius,r),this.zoomTo(d.zoom,r),this.setFocalOffset(d.focalOffset[0],d.focalOffset[1],d.focalOffset[2],r),this._needsUpdate=!0}connect(t){if(this._domElement){console.warn("camera-controls is already connected.");return}this._addAllEventListeners(t),this._getClientRect(this._elementRect)}disconnect(){this.cancel(),this._removeAllEventListeners(),this._domElement&&(this._domElement=void 0)}dispose(){this.removeAllEventListeners(),this.disconnect()}_getTargetDirection(t){return t.setFromSpherical(this._spherical).divideScalar(this._spherical.radius).applyQuaternion(this._yAxisUpSpaceInverse)}_getCameraDirection(t){return this._getTargetDirection(t).negate()}_findPointerById(t){return this._activePointers.find(r=>r.pointerId===t)}_findPointerByMouseButton(t){return this._activePointers.find(r=>r.mouseButton===t)}_disposePointer(t){this._activePointers.splice(this._activePointers.indexOf(t),1)}_encloseToBoundary(t,r,d){const g=r.lengthSq();if(g===0)return t;const v=L.copy(r).add(t),C=this._boundary.clampPoint(v,X).sub(v),w=C.lengthSq();if(w===0)return t.add(r);if(w===g)return t;if(d===0)return t.add(r).add(C);{const I=1+d*w/r.dot(C);return t.add(L.copy(r).multiplyScalar(I)).add(C.multiplyScalar(1-d))}}_updateNearPlaneCorners(){if(Y$1(this._camera)){const t=this._camera,r=t.near,d=t.getEffectiveFOV()*ie,g=Math.tan(d*.5)*r,v=g*t.aspect;this._nearPlaneCorners[0].set(-v,-g,0),this._nearPlaneCorners[1].set(v,-g,0),this._nearPlaneCorners[2].set(v,g,0),this._nearPlaneCorners[3].set(-v,g,0)}else if(j(this._camera)){const t=this._camera,r=1/t.zoom,d=t.left*r,g=t.right*r,v=t.top*r,C=t.bottom*r;this._nearPlaneCorners[0].set(d,v,0),this._nearPlaneCorners[1].set(g,v,0),this._nearPlaneCorners[2].set(g,C,0),this._nearPlaneCorners[3].set(d,C,0)}}_collisionTest(){let t=1/0;if(!(this.colliderMeshes.length>=1)||Oe(this._camera,"_collisionTest"))return t;const r=this._getTargetDirection(ne);be.lookAt(Ve$1,r,this._camera.up);for(let d=0;d<4;d++){const g=L.copy(this._nearPlaneCorners[d]);g.applyMatrix4(be);const v=X.addVectors(this._target,g);me.set(v,r),me.far=this._spherical.radius+1;const C=me.intersectObjects(this.colliderMeshes);C.length!==0&&C[0].distance<t&&(t=C[0].distance)}return t}_getClientRect(t){if(!this._domElement)return;const r=this._domElement.getBoundingClientRect();return t.x=r.left,t.y=r.top,this._viewport?(t.x+=this._viewport.x,t.y+=r.height-this._viewport.w-this._viewport.y,t.width=this._viewport.z,t.height=this._viewport.w):(t.width=r.width,t.height=r.height),t}_createOnRestPromise(t){return t?Promise.resolve():(this._hasRested=!1,this.dispatchEvent({type:"transitionstart"}),new Promise(r=>{const d=()=>{this.removeEventListener("rest",d),r()};this.addEventListener("rest",d)}))}_addAllEventListeners(t){}_removeAllEventListeners(){}get dampingFactor(){return console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead."),0}set dampingFactor(t){console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead.")}get draggingDampingFactor(){return console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead."),0}set draggingDampingFactor(t){console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead.")}static createBoundingSphere(t,r=new T$1.Sphere){const d=r,g=d.center;$.makeEmpty(),t.traverseVisible(C=>{C.isMesh&&$.expandByObject(C)}),$.getCenter(g);let v=0;return t.traverseVisible(C=>{if(!C.isMesh)return;const w=C;if(!w.geometry)return;const I=w.geometry.clone();I.applyMatrix4(w.matrixWorld);const O=I.attributes.position;for(let ye=0,Se=O.count;ye<Se;ye++)x$1.fromBufferAttribute(O,ye),v=Math.max(v,g.distanceToSquared(x$1))}),d.radius=Math.sqrt(v),d}}var Ae={exports:{}},Q$1=typeof Reflect=="object"?Reflect:null,Ge=Q$1&&typeof Q$1.apply=="function"?Q$1.apply:function(m,t,r){return Function.prototype.apply.call(m,t,r)},ue;Q$1&&typeof Q$1.ownKeys=="function"?ue=Q$1.ownKeys:Object.getOwnPropertySymbols?ue=function(m){return Object.getOwnPropertyNames(m).concat(Object.getOwnPropertySymbols(m))}:ue=function(m){return Object.getOwnPropertyNames(m)};function Ts(m){console&&console.warn&&console.warn(m)}var _t=Number.isNaN||function(m){return m!==m};function S(){S.init.call(this)}Ae.exports=S;Ae.exports.once=Ls;S.EventEmitter=S;S.prototype._events=void 0;S.prototype._eventsCount=0;S.prototype._maxListeners=void 0;var Xe$1=10;function ge(m){if(typeof m!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof m)}Object.defineProperty(S,"defaultMaxListeners",{enumerable:!0,get:function(){return Xe$1},set:function(m){if(typeof m!="number"||m<0||_t(m))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+m+".");Xe$1=m}});S.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};S.prototype.setMaxListeners=function(m){if(typeof m!="number"||m<0||_t(m))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+m+".");return this._maxListeners=m,this};function gt$1(m){return m._maxListeners===void 0?S.defaultMaxListeners:m._maxListeners}S.prototype.getMaxListeners=function(){return gt$1(this)};S.prototype.emit=function(m){for(var t=[],r=1;r<arguments.length;r++)t.push(arguments[r]);var d=m==="error",g=this._events;if(g!==void 0)d=d&&g.error===void 0;else if(!d)return!1;if(d){var v;if(t.length>0&&(v=t[0]),v instanceof Error)throw v;var C=new Error("Unhandled error."+(v?" ("+v.message+")":""));throw C.context=v,C}var w=g[m];if(w===void 0)return!1;if(typeof w=="function")Ge(w,this,t);else for(var I=w.length,O=Ot$1(w,I),r=0;r<I;++r)Ge(O[r],this,t);return!0};function vt(m,t,r,d){var g,v,C;if(ge(r),v=m._events,v===void 0?(v=m._events=Object.create(null),m._eventsCount=0):(v.newListener!==void 0&&(m.emit("newListener",t,r.listener?r.listener:r),v=m._events),C=v[t]),C===void 0)C=v[t]=r,++m._eventsCount;else if(typeof C=="function"?C=v[t]=d?[r,C]:[C,r]:d?C.unshift(r):C.push(r),g=gt$1(m),g>0&&C.length>g&&!C.warned){C.warned=!0;var w=new Error("Possible EventEmitter memory leak detected. "+C.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");w.name="MaxListenersExceededWarning",w.emitter=m,w.type=t,w.count=C.length,Ts(w)}return m}S.prototype.addListener=function(m,t){return vt(this,m,t,!1)};S.prototype.on=S.prototype.addListener;S.prototype.prependListener=function(m,t){return vt(this,m,t,!0)};function ws(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function yt$1(m,t,r){var d={fired:!1,wrapFn:void 0,target:m,type:t,listener:r},g=ws.bind(d);return g.listener=r,d.wrapFn=g,g}S.prototype.once=function(m,t){return ge(t),this.on(m,yt$1(this,m,t)),this};S.prototype.prependOnceListener=function(m,t){return ge(t),this.prependListener(m,yt$1(this,m,t)),this};S.prototype.removeListener=function(m,t){var r,d,g,v,C;if(ge(t),d=this._events,d===void 0)return this;if(r=d[m],r===void 0)return this;if(r===t||r.listener===t)--this._eventsCount===0?this._events=Object.create(null):(delete d[m],d.removeListener&&this.emit("removeListener",m,r.listener||t));else if(typeof r!="function"){for(g=-1,v=r.length-1;v>=0;v--)if(r[v]===t||r[v].listener===t){C=r[v].listener,g=v;break}if(g<0)return this;g===0?r.shift():xs(r,g),r.length===1&&(d[m]=r[0]),d.removeListener!==void 0&&this.emit("removeListener",m,C||t)}return this};S.prototype.off=S.prototype.removeListener;S.prototype.removeAllListeners=function(m){var t,r,d;if(r=this._events,r===void 0)return this;if(r.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):r[m]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete r[m]),this;if(arguments.length===0){var g=Object.keys(r),v;for(d=0;d<g.length;++d)v=g[d],v!=="removeListener"&&this.removeAllListeners(v);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(t=r[m],typeof t=="function")this.removeListener(m,t);else if(t!==void 0)for(d=t.length-1;d>=0;d--)this.removeListener(m,t[d]);return this};function Ct(m,t,r){var d=m._events;if(d===void 0)return[];var g=d[t];return g===void 0?[]:typeof g=="function"?r?[g.listener||g]:[g]:r?bs(g):Ot$1(g,g.length)}S.prototype.listeners=function(m){return Ct(this,m,!0)};S.prototype.rawListeners=function(m){return Ct(this,m,!1)};S.listenerCount=function(m,t){return typeof m.listenerCount=="function"?m.listenerCount(t):Et.call(m,t)};S.prototype.listenerCount=Et;function Et(m){var t=this._events;if(t!==void 0){var r=t[m];if(typeof r=="function")return 1;if(r!==void 0)return r.length}return 0}S.prototype.eventNames=function(){return this._eventsCount>0?ue(this._events):[]};function Ot$1(m,t){for(var r=new Array(t),d=0;d<t;++d)r[d]=m[d];return r}function xs(m,t){for(;t+1<m.length;t++)m[t]=m[t+1];m.pop()}function bs(m){for(var t=new Array(m.length),r=0;r<t.length;++r)t[r]=m[r].listener||m[r];return t}function Ls(m,t){return new Promise(function(r,d){function g(C){m.removeListener(t,v),d(C)}function v(){typeof m.removeListener=="function"&&m.removeListener("error",g),r([].slice.call(arguments))}Tt(m,t,v,{once:!0}),t!=="error"&&Ps(m,g,{once:!0})})}function Ps(m,t,r){typeof m.on=="function"&&Tt(m,"error",t,r)}function Tt(m,t,r,d){if(typeof m.on=="function")d.once?m.once(t,r):m.on(t,r);else if(typeof m.addEventListener=="function")m.addEventListener(t,function g(v){d.once&&m.removeEventListener(t,g),r(v)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof m)}var ve=Ae.exports;const Ss={antialias:!1,devicePixelRatio:window.devicePixelRatio,powerPreference:"high-performance",toneMappingExposure:1,alpha:!1,outputColorSpace:e.sRGB,logarithmicDepthBuffer:!1,preserveDrawingBuffer:!1,stencil:!1,depth:!1};class As{constructor(t){this.options=t;const{width:r,height:d,rendererParams:g}=t,{alpha:v,devicePixelRatio:C,antialias:w,powerPreference:I,toneMappingExposure:O,outputColorSpace:ye,logarithmicDepthBuffer:Se,preserveDrawingBuffer:Pe,stencil:Ne,depth:ke}=g,ht=new WebGLRenderer({alpha:v,antialias:w,powerPreference:I,logarithmicDepthBuffer:Se,preserveDrawingBuffer:Pe,stencil:Ne,depth:ke});ht.setSize(r,d),ht.setPixelRatio(C),ht.toneMappingExposure=O,ht.outputColorSpace=ye,this.renderer=ht}setSize(t,r){this.renderer.setSize(t,r)}setPixelRatio(t){this.renderer.setPixelRatio(t)}render(t,r){this.renderer.render(t,r)}setViewport(t){var r,d;const{x:g,y:v,width:C,height:w}=t,I=(r=t.scissor)!=null?r:!1,O=(d=t.scissorTest)!=null?d:!1;this.renderer.setViewport(g,v,C,w),I&&(this.renderer.setScissor(g,v,C,w),this.renderer.setScissorTest(O))}dispose(){var t,r;this.setSize(1,1),(t=this.renderer)==null||t.clear(),(r=this.renderer)==null||r.dispose()}}const Ms={antialias:!0,devicePixelRatio:window.devicePixelRatio};class Rs{constructor(t){this.options=t;const{width:r,height:d,rendererParams:g,renderer:v}=t,{devicePixelRatio:C,antialias:w}=g,I=new v({antialias:w});I.setSize(r,d),I.setPixelRatio(C),this.renderer=I}setSize(t,r){this.renderer.setSize(t,r)}render(t,r){this.renderer.render(t,r)}dispose(){var t,r;this.setSize(1,1),(t=this.renderer)==null||t.clear(),(r=this.renderer)==null||r.dispose()}}let Ds=class{constructor(){this.mask=1}set(m){this.mask=(1<<m|0)>>>0}enable(m){this.mask|=1<<m|0}enableAll(){this.mask=-1}toggle(m){this.mask^=1<<m|0}disable(m){this.mask&=~(1<<m|0)}disableAll(){this.mask=0}isEnabled(m){return(this.mask&(1<<m|0))!==0}};class ee{constructor(){this.event=new ve.EventEmitter,this.controllerMap=new Map,this.activeIndex=-1,this.activeControllerSet=new Set}addController(t,r){const d=new Ds;return d.disableAll(),r!==void 0&&d.set(r),this.controllerMap.set(t,d),r===this.activeIndex&&this.activeControllerSet.add(t),t}removePage(t,r){this.controllerMap.forEach((d,g)=>{d.isEnabled(t)&&(d.disable(t),d.mask===0&&(r==null||r(g),this.controllerMap.delete(g),this.activeControllerSet.delete(g)))})}setPageActive(t,r){this.activeIndex=t,this.activeControllerSet.clear(),this.controller=(Array.from(this.controllerMap.entries()).find(([d,g])=>{const v=g.isEnabled(t);return v&&this.activeControllerSet.add(d),r==null||r(d,v),v})||[])[0],this.event.emit("pageChange",this.controller)}update(t,r){this.activeControllerSet.forEach(d=>{var g;(g=d.update)==null||g.call(d,t,r)})}dispose(){this.controllerMap.forEach((t,r)=>{t.set(0)}),this.removePage(0),this.controllerMap.clear(),this.event.removeAllListeners(),this.activeControllerSet.clear()}}const wt={fov:45,near:1,far:1e3,up:new Vector3(0,1,0)};class Us extends ee{constructor(t){super(),this.width=0,this.height=0,this.width=t.width,this.height=t.height}get camera(){return this.controller}addPerspectiveCamera(t=wt,r){const{fov:d,far:g,near:v,up:C,aspect:w}=t,I=w!=null?w:this.width/this.height,O=new PerspectiveCamera(d,I,v,g);return O.up=C,this.addController(O,r)}setPageActive(t){super.setPageActive(t,(r,d)=>{d&&this.setAspect(this.width/this.height,r)})}setSize(t,r){this.width=t,this.height=r,this.setAspect(t/r)}setAspect(t,r){const d=r||this.camera;d.aspect!==t&&(d.aspect=t,d.updateProjectionMatrix())}cloneCamera(t){const r=this.addPerspectiveCamera({fov:this.camera.fov,aspect:this.camera.aspect,near:this.camera.near,far:this.camera.far,up:this.camera.up},t);return r.position.copy(this.camera.position),r}sync(t){if(t.type==="PerspectiveCamera"){const r=t;(!this.camera.matrixWorld.equals(r.matrixWorld)||this.camera.far!==r.far||this.camera.near!==r.near||this.camera.fov!==r.fov||this.camera.aspect!==r.aspect)&&this.camera.copy(r)}else{const r=t,d=r.viewMatrix,g=r.inverseViewMatrix,v=new Matrix4(g[0],g[4],g[8],g[12],g[1],g[5],g[9],g[13],g[2],g[6],g[10],g[14],g[3],g[7],g[11],g[15]),C=new Matrix4(d[0],d[4],d[8],d[12],d[1],d[5],d[9],d[13],d[2],d[6],d[10],d[14],d[3],d[7],d[11],d[15]),{width:w,height:I}=this,O=w/I;(this.camera.fov!==r.fov||this.camera.aspect!==O||!this.camera.matrixWorld.equals(v)||!this.camera.matrixWorldInverse.equals(C))&&(this.camera.fov=r.fov,this.camera.updateProjectionMatrix(),this.camera.matrixAutoUpdate=!1,this.camera.matrixWorld.copy(v),this.camera.matrixWorldInverse.copy(C),this.camera.aspect=O,this.camera.updateProjectionMatrix())}}}const zs={background:null};class ks extends ee{get scene(){return this.controller}constructor(t){super(),this.options=t}addScene(t,r){const d=new Scene;return t!=null&&t.background&&(d.background=t.background),this.addController(d,r)}removePage(t){super.removePage(t,r=>{const d=new ie$1;d.track(r),d.dispose()})}setPageActive(t){super.setPageActive(t,(r,d)=>{r.visible=d})}}class Fs{constructor(t){this.helpers={},this.options=t}add(t){const r=t.uuid,{sceneController:d}=this.options;let g=this.helpers[r];if(g===void 0){if(t.isScene)g=new AxesHelper(100);else if(t.isCamera)g=new CameraHelper(t);else if(t.isPointLight)g=new PointLightHelper(t,1);else if(t.isDirectionalLight)g=new DirectionalLightHelper(t,1);else if(t.isSpotLight)g=new SpotLightHelper(t);else if(t.isHemisphereLight)g=new HemisphereLightHelper(t,10);else if(t.isRectAreaLight)g=new RectAreaLightHelper(t);else{const v=new Box3;if(v.setFromObject(t,!0),v.isEmpty()===!1){g=new Box3Helper(v);const C=g.material;C.userData.object=t,C.depthTest=!1,C.transparent=!0}else return}d.scene.add(g),this.helpers[r]=g}}addViewHelper(){const{cameraController:t,container:r}=this.options,d=new ViewHelper(t.camera,r);r.addEventListener("pointerdown",g=>{g.preventDefault(),d.handleClick(g)}),this.viewHelper=d}remove(t){var r;const d=t.uuid,{sceneController:g}=this.options;if(this.helpers[d]!==void 0){const v=this.helpers[d];g.scene.remove(v),delete this.helpers[d],(r=v.dispose)==null||r.call(v)}}removeAll(){Object.keys(this.helpers).forEach(t=>{this.remove({uuid:t})}),this.helpers={}}removeAllExcludeScene(){Object.keys(this.helpers).forEach(t=>{this.helpers[t]instanceof AxesHelper||this.remove({uuid:t})})}update(t,r,d){var g,v;const{cameraController:C}=this.options;Object.values(this.helpers).forEach(w=>{if(w.update&&w.update(),w instanceof Box3Helper){const I=w.material,{object:O}=I.userData;O&&w.box.setFromObject(O,!0)}}),((g=this.viewHelper)==null?void 0:g.animating)===!0&&(this.viewHelper.update(t),(v=r.cameraControls)==null||v.setPosition(...C.camera.position.toArray()),this.viewHelper.center.copy(d))}renderViewHelper(t){if(!this.viewHelper)return;const r=t.autoClear;t.autoClear=!1,this.viewHelper.render(t),t.autoClear=r}dispose(){var t;this.helpers={},(t=this.viewHelper)==null||t.dispose()}}class Ns extends ee{constructor(t){super(),this.autoRotateSpeed=0,this.options=t;const r={Vector2,Vector3,Vector4,Quaternion,Matrix4,Spherical,Box3,Sphere:Sphere$1,Raycaster};J.install({THREE:r})}get cameraControls(){return this.controller}addCameraControls(t,r){const{domElement:d}=this.options.controlsParams,g=new J(t,d);return g.setLookAt(0,0,400,0,0,0,!1),this.addController(g,r)}setPageActive(t){super.setPageActive(t,(r,d)=>{r.enabled=d})}removePage(t){super.removePage(t,r=>{r.dispose()})}enable(){this.activeControllerSet.forEach(t=>{t.enabled=!0})}disable(){this.activeControllerSet.forEach(t=>{t.enabled=!1})}update(t,r){super.update(t,r),this.autoRotateSpeed&&this.cameraControls&&(this.cameraControls.azimuthAngle+=this.autoRotateSpeed*t*MathUtils.DEG2RAD)}}class Hs{constructor(t){this.event=new ve.EventEmitter;const{renderer:r,scene:d,camera:g}=t,v=new TransformControls(g,r.domElement);if(v.getHelper){const C=v.getHelper();d.add(C),+REVISION<170}else v instanceof Object3D&&d.add(v);this.controls=v,this.addEvent()}get detach(){return this.controls.detach.bind(this.controls)}get attach(){return this.controls.attach.bind(this.controls)}addEvent(){let t=null,r=null,d=null;const g=this.controls;g.addEventListener("change",()=>{const v=g.object;v!==void 0&&this.event.emit("change",v)}),g.addEventListener("mouseDown",()=>{const v=g.object;t=v.position.clone(),r=v.rotation.clone(),d=v.scale.clone(),this.event.emit("mouseDown",v)}),g.addEventListener("mouseUp",()=>{const v=g.object;if(v!==void 0)switch(g.getMode()){case"translate":t.equals(v.position)||this.event.emit("translate",v,v.position,t);break;case"rotate":r.equals(v.rotation)||this.event.emit("rotate",v,v.rotation,r);break;case"scale":d.equals(v.scale)||this.event.emit("scale",v,v.scale,d);break}this.event.emit("mouseUp")})}dispose(){var t;this.event.removeAllListeners(),(t=this.controls)==null||t.dispose()}}const $e=new Vector3,Is=new Quaternion,qe=new Vector3,H$1=new Matrix4,js=new Matrix4;class Bs{constructor(t={}){const r=this;let d,g,v,C;const w={camera:{style:""},objects:new WeakMap},I=t.element!==void 0?t.element:document.createElement("div");I.style.overflow="hidden",this.domElement=I;const O=document.createElement("div");O.style.transformOrigin="0 0",O.style.pointerEvents="none",I.appendChild(O);const ye=document.createElement("div");ye.style.transformStyle="preserve-3d",O.appendChild(ye),this.getSize=function(){return{width:d,height:g}},this.render=function(He,Fe){const at=Fe.projectionMatrix.elements[5]*C;Fe.view&&Fe.view.enabled?(O.style.transform=`translate( ${-Fe.view.offsetX*(d/Fe.view.width)}px, ${-Fe.view.offsetY*(g/Fe.view.height)}px )`,O.style.transform+=`scale( ${Fe.view.fullWidth/Fe.view.width}, ${Fe.view.fullHeight/Fe.view.height} )`):O.style.transform="",He.matrixWorldAutoUpdate===!0&&He.updateMatrixWorld(),Fe.parent===null&&Fe.matrixWorldAutoUpdate===!0&&Fe.updateMatrixWorld();let ct,xt;Fe.isOrthographicCamera&&(ct=-(Fe.right+Fe.left)/2,xt=(Fe.top+Fe.bottom)/2);const Gt=Fe.view&&Fe.view.enabled?Fe.view.height/Fe.view.fullHeight:1,Lt=Fe.isOrthographicCamera?`scale( ${Gt} )scale(`+at+")translate("+Se(ct)+"px,"+Se(xt)+"px)"+Pe(Fe.matrixWorldInverse):`scale( ${Gt} )translateZ(`+at+"px)"+Pe(Fe.matrixWorldInverse),Wt=(Fe.isPerspectiveCamera?"perspective("+at+"px) ":"")+Lt+"translate("+v+"px,"+C+"px)";w.camera.style!==Wt&&(ye.style.transform=Wt,w.camera.style=Wt),ht(He,He,Fe)},this.setSize=function(He,Fe){d=He,g=Fe,v=d/2,C=g/2,I.style.width=He+"px",I.style.height=Fe+"px",O.style.width=He+"px",O.style.height=Fe+"px",ye.style.width=He+"px",ye.style.height=Fe+"px"};function Se(He){return Math.abs(He)<1e-10?0:He}function Pe(He){const Fe=He.elements;return"matrix3d("+Se(Fe[0])+","+Se(-Fe[1])+","+Se(Fe[2])+","+Se(Fe[3])+","+Se(Fe[4])+","+Se(-Fe[5])+","+Se(Fe[6])+","+Se(Fe[7])+","+Se(Fe[8])+","+Se(-Fe[9])+","+Se(Fe[10])+","+Se(Fe[11])+","+Se(Fe[12])+","+Se(-Fe[13])+","+Se(Fe[14])+","+Se(Fe[15])+")"}function Ne(He){const Fe=He.elements;return"translate(-50%,-50%)"+("matrix3d("+Se(Fe[0])+","+Se(Fe[1])+","+Se(Fe[2])+","+Se(Fe[3])+","+Se(-Fe[4])+","+Se(-Fe[5])+","+Se(-Fe[6])+","+Se(-Fe[7])+","+Se(Fe[8])+","+Se(Fe[9])+","+Se(Fe[10])+","+Se(Fe[11])+","+Se(Fe[12])+","+Se(Fe[13])+","+Se(Fe[14])+","+Se(Fe[15])+")")}function ke(He){He.isCSS3DObject&&(He.element.style.display="none");for(let Fe=0,at=He.children.length;Fe<at;Fe++)ke(He.children[Fe])}function ht(He,Fe,at,ct){if(He.visible===!1){ke(He);return}if(He.isCSS3DObject){const xt=He.layers.test(at.layers)===!0,Gt=He.element;if(Gt.style.display=xt===!0?"":"none",xt===!0){He.onBeforeRender(r,Fe,at);let Lt;He.isCSS3DSprite?(H$1.copy(at.matrixWorldInverse),H$1.transpose(),He.rotation2D!==0&&H$1.multiply(js.makeRotationZ(He.rotation2D)),He.matrixWorld.decompose($e,Is,qe),H$1.setPosition($e),H$1.scale(qe),H$1.elements[3]=0,H$1.elements[7]=0,H$1.elements[11]=0,H$1.elements[15]=1,Lt=Ne(H$1)):Lt=Ne(He.matrixWorld);const Wt=w.objects.get(He);if(Wt===void 0||Wt.style!==Lt){Gt.style.transform=Lt;const Pt={style:Lt};w.objects.set(He,Pt)}Gt.parentNode!==ye&&ye.appendChild(Gt),He.onAfterRender(r,Fe,at)}}for(let xt=0,Gt=He.children.length;xt<Gt;xt++)ht(He.children[xt],Fe,at)}}}const q=new Vector3,Qe$1=new Matrix4,Je=new Matrix4,et=new Vector3,tt=new Vector3;class Vs{constructor(t={}){const r=this;let d,g,v,C;const w={objects:new WeakMap},I=t.element!==void 0?t.element:document.createElement("div");I.style.overflow="hidden",this.domElement=I,this.getSize=function(){return{width:d,height:g}},this.render=function(ke,ht){ke.matrixWorldAutoUpdate===!0&&ke.updateMatrixWorld(),ht.parent===null&&ht.matrixWorldAutoUpdate===!0&&ht.updateMatrixWorld(),Qe$1.copy(ht.matrixWorldInverse),Je.multiplyMatrices(ht.projectionMatrix,Qe$1),ye(ke,ke,ht),Ne(ke)},this.setSize=function(ke,ht){d=ke,g=ht,v=d/2,C=g/2,I.style.width=ke+"px",I.style.height=ht+"px"};function O(ke){ke.isCSS2DObject&&(ke.element.style.display="none");for(let ht=0,He=ke.children.length;ht<He;ht++)O(ke.children[ht])}function ye(ke,ht,He){if(ke.visible===!1){O(ke);return}if(ke.isCSS2DObject){q.setFromMatrixPosition(ke.matrixWorld),q.applyMatrix4(Je);const Fe=q.z>=-1&&q.z<=1&&ke.layers.test(He.layers)===!0,at=ke.element;at.style.display=Fe===!0?"":"none",Fe===!0&&(ke.onBeforeRender(r,ht,He),at.style.transform="translate("+-100*ke.center.x+"%,"+-100*ke.center.y+"%)translate("+(q.x*v+v)+"px,"+(-q.y*C+C)+"px)",at.parentNode!==I&&I.appendChild(at),ke.onAfterRender(r,ht,He));const ct={distanceToCameraSquared:Se(He,ke)};w.objects.set(ke,ct)}for(let Fe=0,at=ke.children.length;Fe<at;Fe++)ye(ke.children[Fe],ht,He)}function Se(ke,ht){return et.setFromMatrixPosition(ke.matrixWorld),tt.setFromMatrixPosition(ht.matrixWorld),et.distanceToSquared(tt)}function Pe(ke){const ht=[];return ke.traverseVisible(function(He){He.isCSS2DObject&&ht.push(He)}),ht}function Ne(ke){const ht=Pe(ke).sort(function(Fe,at){if(Fe.renderOrder!==at.renderOrder)return at.renderOrder-Fe.renderOrder;const ct=w.objects.get(Fe).distanceToCameraSquared,xt=w.objects.get(at).distanceToCameraSquared;return ct-xt}),He=ht.length;for(let Fe=0,at=ht.length;Fe<at;Fe++)ht[Fe].element.style.zIndex=He-Fe}}}const st={zIndex:"auto"};class Ys{constructor(t){this.container=t}addRenderer(t,r){const d=r.container||this.container,g=d.offsetWidth,v=d.offsetHeight,C=t==="css2d"?new Vs:new Bs;C.domElement.style.position="absolute",C.domElement.style.top="0",C.domElement.style.pointerEvents="none",C.domElement.style.zIndex=r.zIndex,C.setSize(g,v),d.appendChild(C.domElement),t==="css2d"?this.css2Drenderer=C:t==="css3d"&&(this.css3Drenderer=C)}setSize(t,r){var d,g;(d=this.css2Drenderer)==null||d.setSize(t,r),(g=this.css3Drenderer)==null||g.setSize(t,r)}render(t,r){var d,g;(d=this.css2Drenderer)==null||d.render(t,r),(g=this.css3Drenderer)==null||g.render(t,r)}dispose(){var t,r;(t=this.css2Drenderer)==null||t.domElement.remove(),(r=this.css3Drenderer)==null||r.domElement.remove(),this.css2Drenderer=void 0,this.css3Drenderer=void 0}}const Zs={name:"OutputShader",uniforms:{tDiffuse:{value:null},toneMappingExposure:{value:1},premultiplieAlpha:{value:0}},vertexShader:`
4760
4760
  precision highp float;
4761
4761
 
4762
4762
  uniform mat4 modelViewMatrix;
@@ -4853,7 +4853,7 @@ version 0.8.2
4853
4853
  gl_FragColor = ( base_color + vec4( 1.0 ) * bloom_color );
4854
4854
  }
4855
4855
  }
4856
- `,defines:{}}),"baseTexture");return t.needsSwap=!0,t},Le=1,pe=!1,Gs=new MeshBasicMaterial({color:"black"}),Xs=new PointsMaterial({color:"black",sizeAttenuation:!1}),$s=new PointsMaterial({color:"black",sizeAttenuation:!0}),qs=new SpriteMaterial({color:"black",sizeAttenuation:!0}),Qs=new SpriteMaterial({color:"black",sizeAttenuation:!1}),Js=new Ie$2({color:"black",sizeAttenuation:0,lineWidth:0}),ei={kernelRadius:8,minDistance:.005,maxDistance:.1},ti={threshold:0,strength:.4,radius:.1,bloomAlphaType:0},si={multisampling:4,premultiplieAlpha:!1};class ii{constructor(t){this.bloomComposerActive=!1,this.active=!0,this.bloomSelection=new Set,this.bloomLayer=new Layers,this.bloomMaterials={},this.bloomVisible={},this.bloomComposerRenderIng=!1,this.pipViewportState=null,this.options=t;const{rendererController:r,sceneController:d,cameraController:g,composerParams:v}=t,{renderer:C}=r;this.renderer=C;const{multisampling:w}=v,{maxSamples:I}=C.capabilities,O=C.getDrawingBufferSize(new Vector2),ye=new WebGLRenderTarget(O.width,O.height,{samples:Math.min(w,I),type:HalfFloatType}),Se=new EffectComposer(C,ye),Pe=this.getSize();Se.setSize(Pe.width,Pe.height);const Ne=new RenderPass(d.scene,g.camera);Se.addPass(Ne),this.scene=d.scene,this.camera=g.camera,this.finalComposer=Se,this.renderPass=Ne,g.event.on("pageChange",ke=>{this.changeCamera(ke)}),d.event.on("pageChange",ke=>{this.changeScene(ke)})}changeCamera(t){this.renderPass.camera=t,this.camera=t}changeScene(t){this.renderPass.scene=t,this.ssaoPass&&(this.ssaoPass.scene=t),this.scene=t}addOutputPass(){const{premultiplieAlpha:t}=this.options.composerParams,r=new Ws;this.outputPass=r,this.setPremultiplieAlpha(t),this.finalComposer.addPass(r)}setPremultiplieAlpha(t){this.outputPass&&(this.outputPass.uniforms.premultiplieAlpha.value=t?1:0)}addSSAOPass(t){const{scene:r,camera:d,renderer:g}=this,v=g.getSize(new Vector2),C=v.width,w=v.height,I=new SSAOPass(r,d,C,w);I.kernelRadius=t.kernelRadius,I.minDistance=t.minDistance,I.maxDistance=t.maxDistance,this.ssaoPass=I,this.finalComposer.addPass(I)}addBloomPass(t){const{renderer:r}=this,{threshold:d,strength:g,radius:v,bloomAlphaType:C}=t,w=new UnrealBloomPass(new Vector2(window.innerWidth,window.innerHeight),g,v,d);this.bloomPass=w;const I=new EffectComposer(r);I.renderToScreen=!1,I.addPass(this.renderPass),I.addPass(w),this.bloomComposer=I;const O=Ks(I);O.uniforms.bloomAlphaType.value=C,this.bloomComposer=I,this.finalComposer.addPass(O),this.mixPass=O,this.bloomLayer.set(Le)}setBloomSelection(t,r){if(!this.bloomComposer){console.warn("err:pencil.options.bloom");return}t.traverse(d=>{const{object3d:g}=d;g&&(r?(this.bloomSelection.add(d),g.layers.enable(Le)):(this.bloomSelection.delete(d),g.layers.disable(Le)))}),this.bloomSelection.size===0?this.bloomComposerActive=!1:this.bloomComposerActive=!0}enable(){this.active||(this.active=!0)}disable(){this.active&&(this.active=!1)}setSize(t,r){var d;(d=this.bloomComposer)==null||d.setSize(t,r),this.finalComposer.setSize(t,r)}setPixelRatio(t){var r;(r=this.bloomComposer)==null||r.setPixelRatio(t),this.finalComposer.setPixelRatio(t)}darkenNonBloomed(){const t=[],r=[];this.scene.children.forEach(d=>{d.isTransformControls||d.isTransformControlsRoot||d.type==="RectAreaLightHelper"?t.push(d):r.push(d)}),r.forEach(d=>{d.traverse(g=>{var v;const C=g,w=g,I=g;(v=C.material)!=null&&v.isShadowMaterial?t.push(C):C.material&&this.bloomLayer.test(C.layers)===!1&&(this.bloomMaterials[C.uuid]=C.material,w.isSprite?w.material.sizeAttenuation?w.material=qs:w.material=Qs:C.material instanceof Ie$2?C.material=Js:I.isPoints?I.material.sizeAttenuation?I.material=$s:I.material=Xs:C.material=Gs)})}),t.forEach(d=>{this.bloomVisible[d.uuid]=d.visible,d.visible=!1})}restoreNonBloomed(){this.scene.traverse(t=>{const r=t;this.bloomMaterials[r.uuid]?(r.material=this.bloomMaterials[r.uuid],delete this.bloomMaterials[r.uuid]):this.bloomVisible[r.uuid]!==void 0&&(r.visible=this.bloomVisible[r.uuid],delete this.bloomVisible[r.uuid])})}finalComposerRender(){this.bloomComposerActive&&this.bloomComposer?(this.bloomComposerRenderIng=!0,this.mixPass.enabled=!0,this.darkenNonBloomed(),this.bloomComposer.render(),this.restoreNonBloomed(),this.bloomComposerRenderIng=!1):this.mixPass&&(this.mixPass.enabled=!1),this.finalComposer.render()}getSize(){return this.renderer.getSize(new Vector2)}render(){if(!this.active)return;const{cameraController:t,rendererController:r,sceneController:d}=this.options;if(this.finalComposerRender(),this.pipViewportState){t.setPageActive(31),t.setAspect(this.pipViewportState.width/this.pipViewportState.height),r.setViewport(te(U({},this.pipViewportState),{scissor:!0,scissorTest:!0})),this.finalComposerRender(),t.setPageActive(d.activeIndex);const g=this.getSize();r.setViewport({x:0,y:0,width:g.width,height:g.height,scissor:!0,scissorTest:!1})}}dispose(){var t;this.bloomMaterials={},this.bloomVisible={},this.bloomSelection.clear(),this.finalComposer.dispose(),(t=this.bloomComposer)==null||t.dispose()}}class it extends Loader{constructor(t){super(t),this.options={type:"image"}}setOptions(t){return this.options=t,this}load(t,r,d,g){let v,C;this.options.type==="image"?(C=document.createElement("img"),v=new Texture(C)):this.options.type==="video"?(C=document.createElement("video"),C.preload="auto",C.autoplay=!1,C.loop=!1,C.muted=!0,C.setAttribute("webkit-playsinline","webkit-playsinline"),C.setAttribute("playsinline",""),v=new VideoTexture(C)):v=new Texture;const w=new FileLoader(this.manager);return w.setResponseType("blob"),w.setRequestHeader(this.requestHeader),w.setPath(this.path),w.setWithCredentials(this.withCredentials),w.load(t,I=>{let O=I;const ye=t.split(".").pop(),Se=this.options.type==="image"?`image/${ye||"png"}`:`video/${ye||"mp4"}`;O=O.slice(0,I.size,Se);const Pe=()=>{C.removeEventListener("load",Ne,!1),C.removeEventListener("error",ke,!1)},Ne=()=>{Pe(),v.needsUpdate=!0,r&&r(v)},ke=He=>{Pe(),g&&g(He),this.manager.itemError(t),this.manager.itemEnd(t)};C.addEventListener("load",Ne,!1),C.addEventListener("error",ke,!1);const ht=window.URL.createObjectURL(O);C.src=ht},d,g),v}}class ri extends Loader{constructor(t){super(t)}load(t,r,d,g){const v=new FileLoader(this.manager);v.setResponseType("blob"),v.setRequestHeader(this.requestHeader),v.setPath(this.path),v.setWithCredentials(this.withCredentials),v.load(t,C=>{const w=C,I=new DecompressionStream("gzip"),O=w.stream().pipeThrough(I);new Response(O).json().then(ye=>{r==null||r(ye)}).catch(ye=>{g==null||g(ye)})},d,g)}}const oi={images:["png","jpg","jpeg","ico","webp","avif"],media:["mp4","webm","ogg"],gltf:["gltf","glb"],json:["json","geojson"],gzipJson:["json.gzip"],exr:["exr"],lottie:["lottie.json"]};class ni{constructor(t){this.loadObj=[],this.delLoadArr=[],this.assets=new Map,this.event=new ve.EventEmitter,this.options=U({simpleTexture4deleted:!1,prefix:""},t),this.loadingManager=new LoadingManager(()=>{},(r,d,g)=>{this.emit("progress",d,g)},r=>{console.warn(`Failed to load ${r}`)})}emit(t,...r){this.event.emit(t,...r)}on(t,r){this.event.on(t,r)}getAsset(t){const r=this.getAssetType(t);if(!r)return;const d=this.assets.get(t);if(!d){if((r==="images"||r==="media"||r==="exr")&&this.options.simpleTexture4deleted&&this.delLoadArr.includes(t))return new Texture;console.warn(`Asset ${t} not found`)}return d}getAssetType(t){var r;const d=(r=t.split(".").pop())==null?void 0:r.toLowerCase();if(d){if(t.endsWith("lottie.json"))return"lottie";if(t.endsWith("json.gzip"))return"gzipJson"}else return;for(const[g,v]of Object.entries(oi))if(v.includes(d))return g}getLoader(t,r){if(t==="images")return this.textureLoader||(this.textureLoader=new it(this.loadingManager),this.options.prefix&&this.textureLoader.setPath(this.options.prefix)),this.textureLoader;if(t==="media")return this.videoTextureLoader||(this.videoTextureLoader=new it(this.loadingManager),this.videoTextureLoader.setOptions({type:"video"}),this.options.prefix&&this.videoTextureLoader.setPath(this.options.prefix)),this.videoTextureLoader;if(t==="gltf"&&r!=null&&r.dracoPath)return this.dracoGltfLoader||(this.dracoGltfLoader=new GLTFLoader(this.loadingManager),this.dracoLoader=new DRACOLoader,this.dracoLoader.setDecoderPath(r==null?void 0:r.dracoPath),this.dracoGltfLoader.setDRACOLoader(this.dracoLoader),this.options.prefix&&this.dracoGltfLoader.setPath(this.options.prefix)),this.dracoGltfLoader;if(t==="gltf")return this.gltfLoader||(this.gltfLoader=new GLTFLoader(this.loadingManager),this.options.prefix&&this.gltfLoader.setPath(this.options.prefix)),this.gltfLoader;if(t==="lottie")return this.lottieLoader||(this.lottieLoader=new LottieLoader(this.loadingManager),this.options.prefix&&this.lottieLoader.setPath(this.options.prefix)),this.lottieLoader;if(t==="gzipJson")return this.gzipJsonLoader||(this.gzipJsonLoader=new ri(this.loadingManager),this.options.prefix&&this.gzipJsonLoader.setPath(this.options.prefix)),this.gzipJsonLoader;if(t==="json")return this.jsonLoader||(this.jsonLoader=new FileLoader(this.loadingManager),this.jsonLoader.setResponseType("json"),this.options.prefix&&this.jsonLoader.setPath(this.options.prefix)),this.jsonLoader;if(t==="exr")return this.exrLoader||(this.exrLoader=new EXRLoader(this.loadingManager),this.options.prefix&&this.exrLoader.setPath(this.options.prefix)),this.exrLoader}add(t,r){typeof t=="string"&&(t=[t]),t.forEach(d=>{const g=U({src:d},r);this.loadObj.push(g)})}getSrcByAsset(t,r=this.assets){let d;return r.forEach((g,v)=>{g===t&&(d=v)}),d}get textureAssets(){const t=new Map;return this.assets.forEach((r,d)=>{(r instanceof Texture||r instanceof DataTexture||r instanceof VideoTexture)&&t.set(d,r)}),t}loadAll(){return se(this,null,function*(){const t=this.loadObj.filter(r=>!this.delLoadArr.includes(r.src));return yield Promise.all(t.map(r=>this.load(r.src,r)))})}load(t,r){return se(this,null,function*(){var d,g;const v=(d=r==null?void 0:r.type)!=null?d:this.getAssetType(t);if(!v)return;const C=(r==null?void 0:r.cache)!==!1,w=esusLite.makePromiseCreator();if(C){if(this.assets.has(t))return this.assets.get(t);this.assets.set(t,w.promise)}const I=this.getLoader(v,r);try{const O=yield I.loadAsync(t);if(this.assets.set(t,O),w.resolve(O),v==="images"||v==="media"||v==="exr"||v==="lottie"){(r==null?void 0:r.colorCorrection)!==!1&&l$1({texture:O});const ye=(g=r==null?void 0:r.anisotropy)!=null?g:this.options.anisotropy;O.anisotropy=ye}return O}catch(O){w.reject(`Failed to load ${t}`);return}})}getUnusedAssets(){const{scene:t}=this.options;if(!t)return[...this.delLoadArr];const r=new Set,d=this.textureAssets;t.traverse(v=>{const C=v;C.material&&(Array.isArray(C.material)?C.material:[C.material]).forEach(w=>{[w.map,w.emissiveMap,w.normalMap,w.roughnessMap,w.metalnessMap,w.aoMap].forEach(I=>{if(I){const O=this.getSrcByAsset(I,d);O&&r.add(O)}})})});const g=new Set(this.textureAssets.keys());return r.forEach(v=>{g.delete(v)}),[...g,...this.delLoadArr]}dispose(){var t;this.assets.clear(),(t=this.dracoLoader)==null||t.dispose(),this.event.removeAllListeners(),this.delLoadArr.length=0,this.loadObj.length=0}}const ai={prefix:""};class li extends ee{get loader(){return this.controller}constructor(t){super(),this.options=t}addLoader(t,r){const{loaderParams:d}=this.options,g=new ni(te(U({},d),{scene:t}));return this.addController(g,r)}removePage(t){super.removePage(t,r=>{r.dispose()})}}function rt(m){let t=!1,r=[];return function(...d){r=d,t||(t=!0,requestAnimationFrame(()=>{t=!1,m(...r)}))}}class hi{constructor(t){var r;this.enabled=!0,this.pickFunctionsMap=new Map,this.pickNodeFunctionsMap=new Map,this.pickFunctionsMapIndex=-1,this.pickNodeFunctionsMapIndex=-1,this.activeObjects=new Set,this.prevActiveObjects=new Set,this.objCallbackMap=new Map,this.pickListener={move:!1,down:!1},this.pencil=t,this.domElement=((r=t.options.controls)==null?void 0:r.domElement)||t.options.container}addPickListener(t){const r=new Set(["move","enter","leave"]),d=new Set(["down","downOutside","click"]),g=v=>{var C;if(!this.enabled)return;v.preventDefault();const w=t==="move"?r:d,I=[];if(this.pickFunctionsMap.forEach(Ne=>{w.has(Ne.type)&&I.push(te(U({},Ne),{objArr:Ne.objArr instanceof Function?Ne.objArr():Ne.objArr}))}),I.length===0)return;this.activeObjects.clear(),this.objCallbackMap.clear();const O=this.objCallbackMap;for(const Ne of I)for(const ke of Ne.objArr){if(!ke.object3d||!ke.visibleWithAncestors)continue;O.has(ke)||O.set(ke,new Map);const ht=O.get(ke);ht.has(Ne.type)||ht.set(Ne.type,[]),ht.get(Ne.type).push(Ne.cb)}if(O.size===0)return;const ye=[...O.keys()].map(Ne=>Ne.object3d);console.time(`Pick:listener:${t}:pick`);const Se=(C=this.pencil.pick(v,ye,!0))==null?void 0:C.intersects;if(console.timeEnd(`Pick:listener:${t}:pick`),!Se||Se.length===0)t==="down"?this.handleDownOutside(v):t==="move"&&this.handleLeaveEvents(v);else{const Ne=Se[0];this.processIntersection(Ne,v,t)}const Pe=this.prevActiveObjects;this.prevActiveObjects=this.activeObjects,this.activeObjects=Pe,this.activeObjects.clear()};this.domElement.addEventListener(`pointer${t}`,rt(g),{passive:!1})}processIntersection(t,r,d){const g=this.objCallbackMap,v=t.index||-1;let C=t.object;for(;C;){const w=this.pencil.lead.objMap.get(C);w&&g.has(w)&&this.activeObjects.add(w),C=C.parent}d==="move"?this.handleLeaveEvents(r):d==="down"&&this.handleDownOutside(r),this.processObjectHierarchy(r,d,v)}processObjectHierarchy(t,r,d){const g=this.objCallbackMap;let v=!1;const C=()=>{v=!0};for(const w of this.activeObjects){if(v)break;const I=g.get(w);if(I)if(r==="move"){const O=I.get("enter");if(O&&!this.prevActiveObjects.has(w))for(const Se of O)Se({baseObject:w,mouseEvent:t,sp:C,intersectionIndex:d});const ye=I.get("move");if(ye)for(const Se of ye)Se({baseObject:w,mouseEvent:t,sp:C,intersectionIndex:d})}else{const O=I.get("down");if(O)for(const Se of O)Se({baseObject:w,mouseEvent:t,sp:C,intersectionIndex:d});const ye=I.get("click");if(ye){const Se=Pe=>{Pe.preventDefault();const Ne=5;if(!v&&Math.abs(Pe.clientX-t.clientX)<=Ne&&Math.abs(Pe.clientY-t.clientY)<=Ne)for(const ke of ye)ke({baseObject:w,mouseEvent:t,sp:C,intersectionIndex:d});this.domElement.removeEventListener("pointerup",Se)};this.domElement.addEventListener("pointerup",Se)}}}}handleLeaveEvents(t){this.objCallbackMap.forEach((r,d)=>{const g=r.get("leave");if(g&&this.prevActiveObjects.has(d)&&!this.activeObjects.has(d))for(const v of g)v({baseObject:d,mouseEvent:t})})}handleDownOutside(t){this.objCallbackMap.forEach((r,d)=>{const g=r.get("downOutside");if(g&&!this.activeObjects.has(d))for(const v of g)v({baseObject:d,mouseEvent:t})})}handlePick(t,r,d){let g=r;g==="mousemove"?g="move":g==="mouseenter"?g="enter":g==="mouseleave"&&(g="leave"),this.pickFunctionsMapIndex+=1;const v=this.pickFunctionsMapIndex;return this.pickFunctionsMap.set(v,{objArr:t,type:g,cb:d}),this.pickListener.move||Array.from(this.pickFunctionsMap.values()).some(C=>["move","enter","leave"].includes(C.type))&&(this.pickListener.move=!0,this.addPickListener("move")),this.pickListener.down||Array.from(this.pickFunctionsMap.values()).some(C=>["down","downOutside","click"].includes(C.type))&&(this.pickListener.down=!0,this.addPickListener("down")),v}removePick(t){this.pickFunctionsMap.delete(t)}handlePickNode(t,r,d){if(r==="downOutside")return console.warn("handlePickNode:err:不支持 downOutside"),-1;this.pickNodeFunctionsMapIndex+=1;const g=this.pickNodeFunctionsMapIndex,v=t instanceof Function?t():t,C=[];for(const w of v){const I=w;I.element.style.pointerEvents="auto";const O=Se=>{this.enabled&&(Se.preventDefault(),d({baseObject:I,mouseEvent:Se}))},ye=`pointer${r}`;I.element.addEventListener(ye,rt(O),!1),C.push({arr:I,type:ye,listener:O})}return this.pickNodeFunctionsMap.set(g,C),g}removePickNode(t){const r=this.pickNodeFunctionsMap.get(t);if(r){for(const d of r)d.arr.element.style.pointerEvents="none",d.arr.element.removeEventListener(d.type,d.listener,!1);this.pickNodeFunctionsMap.delete(t)}}dispose(){this.pickFunctionsMap.clear(),this.pickNodeFunctionsMap.clear(),this.activeObjects.clear(),this.prevActiveObjects.clear(),this.objCallbackMap.clear()}}class ci extends hi{constructor(t,r){super(t),this.objMap=new Map,this.objects=new Map,this.objectsPm=new Map,this.objectNamesToFactories=new Map,this.mList=r.mList,this.scene=this.createBaseObject(r.scene||new Scene,{key:"@Scene",name:"场景"}),this.group=this.createBaseObject(new Group$1,{key:"@Group",name:"物体组",target:this.scene}),this.prefabGroup=this.createBaseObject(new Group$1,{key:"@PrefabGroup",name:"预制组",target:this.scene})}get objectsPromise(){return this.objectsPm.values()}createBaseObject(t,r){const d=new ft$1;return d.object3d=t,d.pencil=this.pencil,d.lead=this,d.mList=this.mList,r!=null&&r.key&&(d.key=r.key),r!=null&&r.name&&(t.name=r.name),r!=null&&r.target&&(r==null||r.target.add(d.object3d)),this.objects.set(d.key,d),this.objMap.set(d.object3d,d),d}init(t){return Object.keys(t).forEach(r=>{const d=class{create(g={}){return new t[r](g)}};this.objectNamesToFactories.set(r,d)}),this}getObject(t,r){t.includes("#")&&console.warn("getObject:err:不支持 #",t);const{key:d}=r||{},g=`${t}${d?`#${d}`:""}`;return this.objects.get(g)}getAllObject(t,r){t.includes("#")&&console.warn("getAllObject:err:不支持 #",t);const{key:d}=r||{},g=`${t}${d?`#${d}`:""}`,v=[];return this.objects.forEach((C,w)=>{(w.startsWith(d?g:`${g}#`)||w===g)&&v.push(C)}),v}draw(t,r,d){return se(this,null,function*(){var g,v,C,w;const I=this.objectNamesToFactories.get(t);if(I){r||(r={}),r.target===void 0&&(r.target=d);const O=r.target,ye=(g=r.onTop)!=null?g:0,Se=(v=r.prefab)!=null?v:!1,Pe=(C=r.create)!=null?C:!0,Ne=new I().create(r);let ke;return O===null?ke=null:typeof O=="string"?ke=this.objects.get(O):(w=O==null?void 0:O.objectType)!=null&&w.startsWith("BaseObject")||O?ke=O:Se?ke=this.prefabGroup:ke=this.group,Pe===!1?Ne.create=()=>{}:Pe!==!0&&(Ne.create=()=>{Pe(Ne)}),Ne.pencil=this.pencil,Ne.lead=this,Ne.mList=this.mList,Ne.prefab=Se,Ne.objectType=`BaseObject#${t}`,Ne.objectOptions=r,this.setBaseObjectKey(Ne,r.key?`$t:#${r.key}`:"$t:",ke==null?void 0:ke.key),this.objectsPm.set(Ne,this.addBaseObject(Ne,ke,ye)),yield this.objectsPm.get(Ne),this.objectsPm.delete(Ne),Ne}throw new Error(`Unrecognized:${t}`)})}setBaseObjectKey(t,r,d){const g=t.objectType,[,v]=g.split("#");let C=r.replace("$t:",v);if(d){const[,w]=d.split("#");C=C.replace("$p:",w)}return this.objects.has(C)&&(C.includes("#")?C+=`-${esusLite.generateUUID()}`:C+=`#${esusLite.generateUUID()}`),t.key=C,this.objects.set(C,t),C}updateBaseObjectKey(t,r){var d;let g;for(const[w,I]of this.objects.entries())if(I===t){g=w;break}const v=(d=t.parent)==null?void 0:d.key,C=this.setBaseObjectKey(t,r,v);return g&&this.objects.delete(g),this.pencil.event.emit("updateKey",t,C,g),C}addBaseObject(t,r,d){return se(this,null,function*(){yield t.create(),t.object3d&&(this.pencil.options.mList&&(this.mList.proxyBaseObject(t),this.mList.addBaseObjectMap(t)),d&&t.setTop(d),r!==null&&(r.add(t.object3d),this.objMap.set(t.object3d,t))),t.render(),this.pencil.event.emit("draw",t)})}erase(...t){this.handleErase(!0,...t)}eraseWithoutMaterial(...t){this.handleErase(!1,...t)}handleErase(t,...r){[...r].forEach(d=>{const g=[];if(typeof d=="string"){const[v,C]=d.split("#");g.push(...this.getAllObject(v,{key:C}))}else g.push(d);g.forEach(v=>{v.disposeMaterialIfNotUsed=t,v.dispose()})}),this.pencil.event.emit("erase",...r)}update(t,r){this.objects.forEach(d=>{d.update(t,r)})}setSize(t,r){this.objects.forEach(d=>{d.resize(t,r)})}eraseAll(){this.group&&(this.objects.forEach(t=>{t.key.startsWith("Node")&&this.erase(t)}),this.erase(this.group))}dispose(){super.dispose(),this.scene.erase(),this.objects.forEach(t=>{t.erase()}),this.objects.clear(),this.objectsPm.clear(),this.objMap.clear(),this.objectNamesToFactories.clear()}}class di extends ee{get lead(){return this.controller}constructor(t){super(),this.options=t}addLead(t,r,d){const{pencil:g}=this.options,v=new ci(g,{scene:t,mList:r});return this.addController(v,d)}removePage(t){super.removePage(t,r=>{r.dispose()})}setPageActive(t){super.setPageActive(t,(r,d)=>{r.enabled=d})}setSize(t,r){this.controllerMap.forEach((d,g)=>{g.setSize(t,r)})}}class mi{constructor(t){this.materials=new Map,this.fixBaseObjects=new Map,this.materialBaseObjectMap=new Map,this.pencil=t}add(t,r){this.materials.set(t,r);const d={object3d:new Proxy({material:r},{set:(g,v,C)=>{var w;if(v==="material"&&!((w=this.pencil.composerController)!=null&&w.bloomComposerRenderIng)){const I=g.material;return g.material=C,this.materials.set(t,C),this.disposeMaterial(I),this.syncChangeMaterial(I,C),!0}return g[v]=C,!0}})};this.fixBaseObjects.set(t,d)}get(t){const r=this.materials.get(t);return r||console.warn(`Material with key "${t}" not found.`),r}getKey(t){for(const[r,d]of this.materials.entries())if(d===t)return r}getFixBaseObject(t){return this.fixBaseObjects.get(t)||null}addMultiple(t,r){for(const[d,g]of Object.entries(r)){const v=`${t}#${d}`;g&&this.add(v,g)}}getMultiple(t){const r={},d=`${t}#`;let g=!1;for(const[v,C]of this.materials.entries())if(v.startsWith(d)){const w=v.substring(d.length);r[w]=C,g=!0}return g?r:null}copy(t,r){const d=this.get(t);if(!d)return console.warn(`Material with key "${t}" not found.`),null;const g=d.clone();return this.add(r,g),g}copyMultiple(t,r){const d={},g=`${t}#`;for(const[v,C]of this.materials.entries())if(v.startsWith(g)){const w=v.substring(g.length),I=C.clone();d[w]=I;const O=`${r}#${w}`;this.add(O,I)}return d}disposeMaterial(t){if(!t)return;const r=new ie$1;r.track(Array.isArray(t)?t:[t]),r.dispose()}remove(t){const r=this.materials.get(t);r&&this.disposeMaterial(r),this.materials.delete(t),this.fixBaseObjects.delete(t)}removeByMaterial(t){[...this.materials.entries()].some(([r,d])=>d===t?(this.remove(r),!0):!1)}proxyBaseObject(t){const r=t.object3d;t.materialList&&(t.materialList=new Proxy(t.materialList,{set:(v,C,w)=>{if(typeof C=="string"){const I=v[C];return this.rmBaseObjectMap(t,I),v[C]=w,w&&this.addBaseObjectMap(t),!0}return v[C]=w,!0},deleteProperty:(v,C)=>{if(typeof C=="string"&&v[C]){const w=v[C];this.rmBaseObjectMap(t,w)}return delete v[C],!0}}));const d=r.material,g="_enhancedMaterial";r[g]=d,Object.defineProperty(r,"material",{get:()=>r[g],set:v=>{var C;if((C=this.pencil.composerController)!=null&&C.bloomComposerRenderIng)r[g]=v;else{if(t.materialList&&Object.values(t.materialList).includes(v)){r[g]=v;return}this.rmBaseObjectMap(t),r[g]=v,this.addBaseObjectMap(t)}},enumerable:!0,configurable:!0})}addBaseObjectMap(t){const r=t.object3d;[...Object.values(t.materialList),r.material].forEach(d=>{if(d){const g=this.materialBaseObjectMap.get(d);g?g.add(t):this.materialBaseObjectMap.set(d,new Set([t]))}})}rmBaseObjectMap(t,r,d=!0){this.materialBaseObjectMap.forEach((g,v)=>{r&&v!==r||g.has(t)&&(g.delete(t),g.size===0&&d&&(this.materialBaseObjectMap.delete(v),this.disposeMaterial(v)))})}syncChangeMaterial(t,r){this.materialBaseObjectMap.forEach((d,g)=>{g===t?d.forEach(v=>{const C=v.object3d;C.material===t&&(C.material=r),v.materialList&&Object.keys(v.materialList).forEach(w=>{v.materialList[w]===t&&(v.materialList[w]=r)})}):Array.isArray(g)&&g.includes(t)&&g.forEach((v,C)=>{v===t&&(g[C]=r)})})}dispose(){const t=new ie$1;t.track([...this.materials.values()]),t.dispose(),this.materials.clear(),this.fixBaseObjects.clear(),this.materialBaseObjectMap.clear()}}class pi extends ee{get mList(){return this.controller}constructor(t){super(),this.options=t}addMList(t,r){const{pencil:d}=this.options,g=new mi(d);return this.addController(g,r)}removePage(t){super.removePage(t,r=>{r.dispose()})}}const _e=class Pn{constructor(t){var r,d;this.raycaster=new Raycaster,this.maxBackufferArea=5760*5760,this.installPlugins=new Map,this._cameraPositon=new Vector3,this._cameraTarget=new Vector3,this.event=new ve.EventEmitter,this.timer=new Timer,this.userData={},this.pageActiveIndex=0,this.pageCountIndex=0,this.userSetDprCache=1,this.event.setMaxListeners(1/0),(d=(r=this.timer).connect)==null||d.call(r,document),this.options=is$1(Pn.options,t,{isMergeableObject:f$1}),this.userSetDprCache=this.options.renderer.devicePixelRatio;const{container:g,stats:v,transformControls:C}=this.options;if(this.init(),this.options.WebGPUTHREE||this.initComposer(),this.initCSSRenderer(),C&&this.initTransformControls(),v){const w=new Stats({horizontal:!1});w.dom.style.position="absolute",w.init(this.renderer),g.appendChild(w.dom),this.stats=w}this.initResizeObserver(),this.tweenUpdateRaf()}getPlugin(t){return this.installPlugins.get(t)}get renderer(){return this.rendererController.renderer}get maxAnisotropy(){return this.options.WebGPUTHREE?0:this.renderer.capabilities.getMaxAnisotropy()}get controls(){return this.controlsController.cameraControls}get cameraPositon(){return this.controls.getPosition(this._cameraPositon,!1)}get cameraTarget(){return this.controls.getTarget(this._cameraTarget,!1)}get camera(){return this.cameraController.camera}get scene(){return this.sceneController.scene}get loader(){return this.loaderController.loader}get lead(){return this.leadController.lead}get mList(){return this.mListController.mList}tweenUpdateRaf(){update(),this.TweenRaf=requestAnimationFrame(this.tweenUpdateRaf.bind(this))}use(t,...r){this.installPlugins.has(t.pluginName)?console.log("plugin already installed"):typeof t.install=="function"&&(t.install(this,...r),this.installPlugins.set(t.pluginName,t))}addPage({sceneOptions:t,cameraOptions:r}={}){const d=this.pageCountIndex+1,g=this.cameraController.addPerspectiveCamera(r,d),v=this.sceneController.addScene(t,d);v.add(g),this.controlsController.addCameraControls(g,d),this.loaderController.addLoader(v,d);const C=this.mListController.addMList(null,d);return this.leadController.addLead(v,C,d),this.pageCountIndex=d,d}removePage(t){this.cameraController.removePage(t),this.sceneController.removePage(t),this.controlsController.removePage(t),this.loaderController.removePage(t),this.mListController.removePage(t),this.leadController.removePage(t),this.pageCountIndex===t&&(this.pageCountIndex-=1),this.pageActiveIndex===t&&(this.render(),this.showPage(0))}showPage(t){var r;if(t===this.pageActiveIndex)return;const d=this.scene;this.sceneController.setPageActive(t),d&&((r=this.cssRendererController)==null||r.render(d,this.camera)),this.cameraController.setPageActive(t),this.controlsController.setPageActive(t),this.loaderController.setPageActive(t),this.mListController.setPageActive(t),this.leadController.setPageActive(t),this.pageActiveIndex=t}init(){var t;const{container:r,WebGPUTHREE:d,helper:g,viewHelper:v,renderer:C,controls:w,loader:I}=this.options,{width:O,height:ye}=this.getSize(),Se=d?new Rs({width:O,height:ye,renderer:d.WebGPURenderer,rendererParams:Ms}):new As({width:O,height:ye,rendererParams:te(U({},C),{antialias:!1})}),Pe=new Us({width:O,height:ye}),Ne=new ks({}),ke=new Ns({controlsParams:{domElement:(t=w==null?void 0:w.domElement)!=null?t:Se.renderer.domElement}}),ht=new li({loaderParams:U({anisotropy:Se.renderer.capabilities.getMaxAnisotropy()},I)}),He=new pi({pencil:this}),Fe=new di({pencil:this});this.sceneController=Ne,this.cameraController=Pe,this.controlsController=ke,this.rendererController=Se,this.loaderController=ht,this.mListController=He,this.leadController=Fe;const at=this.addPage({sceneOptions:this.options.scene,cameraOptions:this.options.camera});if(this.showPage(at),g){const ct=new Fs({container:r,sceneController:Ne,cameraController:Pe});ct.add(Ne.scene),this.helperController=ct,v&&ct.addViewHelper()}r.appendChild(Se.renderer.domElement)}initComposer(){const{bloom:t,bloomParams:r,ssao:d,ssaoParams:g,composer:v}=this.options,C=new ii({rendererController:this.rendererController,sceneController:this.sceneController,cameraController:this.cameraController,composerParams:v});this.composerController=C,t&&C.addBloomPass(U({},r)),d&&C.addSSAOPass(U({},g)),C.addOutputPass()}initCSSRenderer(){const{container:t,css2DRenderer:r,css3DRenderer:d,css2DRendererParams:g,css3DRendererParams:v}=this.options;if(r||d){const C=new Ys(t);r&&C.addRenderer("css2d",g),d&&C.addRenderer("css3d",v),this.cssRendererController=C}}initTransformControls(){const t=new Hs({camera:this.camera,renderer:this.renderer,scene:this.scene});t.event.on("mouseDown",()=>{var r;(r=this.controlsController)==null||r.disable()}),t.event.on("mouseUp",()=>{var r;(r=this.controlsController)==null||r.enable()}),this.transformController=t}getSize(){const{container:t}=this.options;return{width:t.offsetWidth,height:t.offsetHeight}}initResizeObserver(){const{container:t}=this.options;if(this.resizeObserver)return;const r=new ResizeObserver(d=>{for(const g of d){const v=g.contentRect;this.handeleResize(v.width,v.height),this.setDevicePixelRatio(this.userSetDprCache)}});r.observe(t),this.resizeObserver=r}handeleResize(t,r,d=!0){const{rendererController:g,cameraController:v,composerController:C,cssRendererController:w,leadController:I}=this,O=this.renderer.getSize(new Vector2);O.x===t&&O.y===r||(v.setSize(t,r),g.setSize(t,r),C==null||C.setSize(t,r),w==null||w.setSize(t,r),I.setSize(t,r),this.installPlugins.forEach(ye=>{var Se;(Se=ye.setSize)==null||Se.call(ye,t,r)}),this.render(),d&&this.event.emit("resize",{width:t,height:r}))}setDevicePixelRatio(t){var r;this.userSetDprCache=t;const{width:d,height:g}=this.getSize();let v=Math.sqrt(this.maxBackufferArea/(d*g));v=(v*100|0)/100;const C=Math.min(t,v);C!==t&&console.warn("maxBackufferArea:",this.maxBackufferArea," the pixel ratio is set to",C);const w=this.renderer.getPixelRatio();C!==w&&(this.rendererController.setPixelRatio(C),(r=this.composerController)==null||r.setPixelRatio(C))}pick(t,r,d=!0){const{raycaster:g,options:v}=this,{container:C}=v,w=new Vector2,I=C.getBoundingClientRect();if(w.x=(t.clientX-I.left)/(I.right-I.left)*2-1,w.y=-((t.clientY-I.top)/(I.bottom-I.top))*2+1,this.camera&&this.scene){g.setFromCamera(w,this.camera);const O=g.intersectObjects(r||this.scene.children,d);if(O.length)return{object:O[0].object,index:O[0].index,intersects:O}}}render(){var t,r,d,g,v,C;if(!this.camera||!this.scene)return;this.timer.update(),update();const w=this.timer.getDelta(),I=this.timer.getElapsed();this.controlsController.update(w,I),this.leadController.update(w,I),this.installPlugins.forEach(O=>{var ye;(ye=O.update)==null||ye.call(O,w,I)}),(t=this.helperController)==null||t.update(w,this.controlsController,this.cameraTarget),(r=this.composerController)!=null&&r.active?this.composerController.render():(d=this.rendererController)==null||d.render(this.scene,this.camera),(g=this.helperController)==null||g.renderViewHelper(this.renderer),(v=this.cssRendererController)==null||v.render(this.scene,this.camera),(C=this.stats)==null||C.update(),this.event.emit("render",{delta:w,elapsed:I})}start(){window.cancelAnimationFrame(this.TweenRaf),this.renderer.setAnimationLoop(this.render.bind(this)),this.event.emit("start")}stop(){this.tweenUpdateRaf(),this.renderer.setAnimationLoop(null),this.event.emit("stop")}autoRotate(t){this.controlsController.autoRotateSpeed=t}showPipViewport(t){this.composerController.pipViewportState=t;let r=this.pipCameraControls;if(t){const{width:d,height:g}=this.getSize(),v=new DOMRect(t.x/d,(g-t.y-t.height)/g,t.width/d,t.height/g);if(r)r.enabled=!0,r.camera.position.copy(this.camera.position);else{const C=this.cameraController.cloneCamera(31);C.aspect=t.width/t.height,C.updateProjectionMatrix(),r=this.controlsController.addCameraControls(C,this.sceneController.activeIndex),r.addEventListener("update",()=>{this.controls.enabled=!1}),r.addEventListener("sleep",()=>{this.controls.enabled=!0}),this.pipCameraControls=r}r.interactiveArea=v}}dispose(){var t,r,d,g,v,C,w,I,O,ye,Se,Pe,Ne,ke;this.stop(),this.timer.dispose(),removeAll(),this.event.removeAllListeners(),(t=this.resizeObserver)==null||t.unobserve(this.options.container),this.installPlugins.forEach(ht=>{var He;(He=ht.dispose)==null||He.call(ht)}),(r=this.controlsController)==null||r.dispose(),(d=this.transformController)==null||d.dispose(),(g=this.cssRendererController)==null||g.dispose(),(v=this.sceneController)==null||v.dispose(),(C=this.cameraController)==null||C.dispose(),(w=this.helperController)==null||w.dispose(),(I=this.composerController)==null||I.dispose(),(O=this.rendererController)==null||O.dispose(),(ye=this.loaderController)==null||ye.dispose(),(Se=this.leadController)==null||Se.dispose(),(Pe=this.mListController)==null||Pe.dispose(),this.cssRendererController=void 0,this.installPlugins.clear(),(Ne=this.stats)==null||Ne.dom.remove(),(ke=this.renderer)==null||ke.domElement.remove()}};_e.options={stats:pe,helper:pe,viewHelper:pe,controls:!0,transformControls:pe,renderer:Ss,composer:si,scene:zs,camera:wt,bloom:!1,bloomParams:ti,ssao:!1,loader:ai,ssaoParams:ei,css2DRenderer:!1,css2DRendererParams:U({},st),css3DRenderer:!1,css3DRendererParams:U({},st),mList:!0};let ot=_e;const Gi=J.ACTION,b$1=new Map,R$2=(m={})=>({generateTopUV(t,r,d,g,v){const C=r[d*3],w=r[d*3+1],I=r[g*3],O=r[g*3+1],ye=r[v*3],Se=r[v*3+1];let Pe;if(b$1.has(t))Pe=b$1.get(t);else{let He=m.box3;if(!He){He=new Box3;const at=t.parameters.shapes.getPoints().map(ct=>[ct.x,ct.y,0]).flat();He.setFromArray(at)}const Fe=He.getSize(new Vector3);m.split&&(Fe.y/=m.split),Pe={box:He,size:Fe},b$1.set(t,Pe)}const{box:Ne,size:ke}=Pe,ht=m.split?1-m.split:0;return[new Vector2((C-Ne.min.x)/ke.x,(w-Ne.min.y)/ke.y+ht),new Vector2((I-Ne.min.x)/ke.x,(O-Ne.min.y)/ke.y+ht),new Vector2((ye-Ne.min.x)/ke.x,(Se-Ne.min.y)/ke.y+ht)]},generateSideWallUV(t,r,d,g,v,C){const w=r[d*3],I=r[d*3+1],O=r[d*3+2],ye=r[g*3],Se=r[g*3+1],Pe=r[g*3+2],Ne=r[v*3],ke=r[v*3+1],ht=r[v*3+2],He=r[C*3],Fe=r[C*3+1],at=r[C*3+2];let ct;if(b$1.has(r))ct=b$1.get(r);else{const Lt=new Box3;Lt.setFromArray(r);const Wt=Lt.getSize(new Vector3);m.split&&(Wt.z/=1-m.split),m.sideRepeat&&(Wt.z/=m.sideRepeat),ct={box:Lt,size:Wt},b$1.set(r,ct)}const{box:xt,size:Gt}=ct;return Math.abs(I-Se)<Math.abs(w-ye)?[new Vector2((w-xt.min.x)/Gt.x,(O-xt.min.z)/Gt.z),new Vector2((ye-xt.min.x)/Gt.x,(Pe-xt.min.z)/Gt.z),new Vector2((Ne-xt.min.x)/Gt.x,(ht-xt.min.z)/Gt.z),new Vector2((He-xt.min.x)/Gt.x,(at-xt.min.z)/Gt.z)]:[new Vector2((I-xt.min.y)/Gt.y,(O-xt.min.z)/Gt.z),new Vector2((Se-xt.min.y)/Gt.y,(Pe-xt.min.z)/Gt.z),new Vector2((ke-xt.min.y)/Gt.y,(ht-xt.min.z)/Gt.z),new Vector2((Fe-xt.min.y)/Gt.y,(at-xt.min.z)/Gt.z)]}}),P=()=>{b$1.clear()};var Jt=Object.defineProperty,Xt=Object.defineProperties,Qt=Object.getOwnPropertyDescriptors,lt=Object.getOwnPropertySymbols,Bt=Object.prototype.hasOwnProperty,Vt=Object.prototype.propertyIsEnumerable,It=(m,t,r)=>t in m?Jt(m,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):m[t]=r,G=(m,t)=>{for(var r in t||(t={}))Bt.call(t,r)&&It(m,r,t[r]);if(lt)for(var r of lt(t))Vt.call(t,r)&&It(m,r,t[r]);return m},ut=(m,t)=>Xt(m,Qt(t)),gt=(m,t)=>{var r={};for(var d in m)Bt.call(m,d)&&t.indexOf(d)<0&&(r[d]=m[d]);if(m!=null&&lt)for(var d of lt(m))t.indexOf(d)<0&&Vt.call(m,d)&&(r[d]=m[d]);return r},nt=(m,t,r)=>new Promise((d,g)=>{var v=I=>{try{w(r.next(I))}catch(O){g(O)}},C=I=>{try{w(r.throw(I))}catch(O){g(O)}},w=I=>I.done?d(I.value):Promise.resolve(I.value).then(v,C);w((r=r.apply(m,t)).next())});class Xe extends ft$1{constructor(t){super(),this.objectType="BaseObject#Node",this.onNodePointerIndex=[],this.options=G({type:"2d"},t)}create(){const{position:t,children:r}=this.options,d=document.createElement("div");this.element=d,r&&d.appendChild(r),this.options.type==="3d"?this.createCSS3DObject(d):this.options.type==="3dSprite"?this.createCSS3DSprite(d):this.createCSS2DObject(d),t&&this.object3d.position.copy(t)}setChildren(t){this.options.children=t,this.element.innerHTML="",this.element.appendChild(t)}showAndEnsureVisible(){const t=this.options.children;t&&(t.style.visibility="hidden",this.show(),setTimeout(()=>{t.style.visibility="",this.ensureVisible()}))}moveElementToViewport(){const t=this.options.children;if(!t)return;const r=t.getBoundingClientRect(),d=window.innerWidth,g=window.innerHeight;let v=0,C=0;r.left<0?v=-r.left:r.right>d&&(v=d-r.right),r.top<0?C=-r.top:r.bottom>g&&(C=g-r.bottom),r.left+v<0&&(v=-r.left),r.top+C<0&&(C=-r.top),(v!==0||C!==0)&&(t.style.transform=`translate(${v}px, ${C}px)`)}ensureVisible(){const t=this.options.children;if(!t)return;t.style.transform&&(t.style.transform="");const r=new IntersectionObserver(d=>{d.forEach(g=>{g.isIntersecting&&(this.moveElementToViewport(),r.disconnect())})});r.observe(t)}onPointerEvent(t,r){const d=this.lead.handlePickNode([this],t,r);this.onNodePointerIndex.push(d)}dispose(){this.onNodePointerIndex.forEach(t=>{this.lead.removePickNode(t)}),super.dispose()}}class Qe extends ft$1{create(){this.createGroup()}}const Ue={ArcCurve,CatmullRomCurve3,CubicBezierCurve,CubicBezierCurve3,EllipseCurve,LineCurve,LineCurve3,QuadraticBezierCurve,QuadraticBezierCurve3,SplineCurve};class Z extends BufferGeometry{constructor(t=new Shape([new Vector2(.5,.5),new Vector2(-.5,.5),new Vector2(-.5,-.5),new Vector2(.5,-.5)]),r={}){super(),this.type="ExtrudeGeometry",this.parameters={shapes:t,options:r},t=Array.isArray(t)?t:[t];const d=this,g=[],v=[];for(let w=0,I=t.length;w<I;w++){const O=t[w];C(O)}this.setAttribute("position",new Float32BufferAttribute(g,3)),this.setAttribute("uv",new Float32BufferAttribute(v,2)),this.computeVertexNormals();function C(w){var I,O,ye;const Se=[],Pe=r.curveSegments!==void 0?r.curveSegments:12,Ne=r.steps!==void 0?r.steps:1,ke=r.depth!==void 0?r.depth:1;let ht=r.bevelEnabled!==void 0?r.bevelEnabled:!0,He=r.bevelThickness!==void 0?r.bevelThickness:.2,Fe=r.bevelSize!==void 0?r.bevelSize:He-.1,at=r.bevelOffset!==void 0?r.bevelOffset:0,ct=r.bevelSegments!==void 0?r.bevelSegments:3;const xt=r.extrudePath,Gt=r.UVGenerator!==void 0?r.UVGenerator:Ce,Lt=(I=r.hasTop)!=null?I:!0,Wt=(O=r.hasBottom)!=null?O:!0,Pt=(ye=r.hasSide)!=null?ye:!0;let Ft,kt=!1,Kt,i0,r0,l0;xt&&(Ft=xt.getSpacedPoints(Ne),kt=!0,ht=!1,Kt=xt.computeFrenetFrames(Ne,!1),i0=new Vector3,r0=new Vector3,l0=new Vector3),ht||(ct=0,He=0,Fe=0,at=0);const n0=w.extractPoints(Pe);let Ut=n0.shape;const e0=n0.holes;if(!ShapeUtils.isClockWise(Ut)){Ut=Ut.reverse();for(let N0=0,_0=e0.length;N0<_0;N0++){const a0=e0[N0];ShapeUtils.isClockWise(a0)&&(e0[N0]=a0.reverse())}}function Yt(N0){const _0=10000000000000001e-36;let a0=N0[0];for(let s0=1;s0<=N0.length;s0++){const v0=s0%N0.length,C0=N0[v0],E0=C0.x-a0.x,w0=C0.y-a0.y,vi=E0*E0+w0*w0,ui=Math.max(Math.abs(C0.x),Math.abs(C0.y),Math.abs(a0.x),Math.abs(a0.y)),Ci=_0*ui*ui;if(vi<=Ci){N0.splice(v0,1),s0--;continue}a0=C0}}Yt(Ut),e0.forEach(Yt);const o0=e0.length,b0=Ut;for(let N0=0;N0<o0;N0++){const _0=e0[N0];Ut=Ut.concat(_0)}function f0(N0,_0,a0){return _0||console.error("THREE.ExtrudeGeometry: vec does not exist"),N0.clone().addScaledVector(_0,a0)}const P0=Ut.length;function q0(N0,_0,a0){let s0,v0,C0;const E0=N0.x-_0.x,w0=N0.y-_0.y,vi=a0.x-N0.x,ui=a0.y-N0.y,Ci=E0*E0+w0*w0,Ei=E0*ui-w0*vi;if(Math.abs(Ei)>Number.EPSILON){const j0=Math.sqrt(Ci),Xi=Math.sqrt(vi*vi+ui*ui),wi=_0.x-w0/j0,Ii=_0.y+E0/j0,Zi=a0.x-ui/Xi,Yi=a0.y+vi/Xi,zi=((Zi-wi)*ui-(Yi-Ii)*vi)/(E0*ui-w0*vi);s0=wi+E0*zi-N0.x,v0=Ii+w0*zi-N0.y;const Ki=s0*s0+v0*v0;if(Ki<=2)return new Vector2(s0,v0);C0=Math.sqrt(Ki/2)}else{let j0=!1;E0>Number.EPSILON?vi>Number.EPSILON&&(j0=!0):E0<-Number.EPSILON?vi<-Number.EPSILON&&(j0=!0):Math.sign(w0)===Math.sign(ui)&&(j0=!0),j0?(s0=-w0,v0=E0,C0=Math.sqrt(Ci)):(s0=E0,v0=w0,C0=Math.sqrt(Ci/2))}return new Vector2(s0/C0,v0/C0)}const G0=[];for(let N0=0,_0=b0.length,a0=_0-1,s0=N0+1;N0<_0;N0++,a0++,s0++)a0===_0&&(a0=0),s0===_0&&(s0=0),G0[N0]=q0(b0[N0],b0[a0],b0[s0]);const I0=[];let F0,D0=G0.concat();for(let N0=0,_0=o0;N0<_0;N0++){const a0=e0[N0];F0=[];for(let s0=0,v0=a0.length,C0=v0-1,E0=s0+1;s0<v0;s0++,C0++,E0++)C0===v0&&(C0=0),E0===v0&&(E0=0),F0[s0]=q0(a0[s0],a0[C0],a0[E0]);I0.push(F0),D0=D0.concat(F0)}let Si;if(ct===0)Si=ShapeUtils.triangulateShape(b0,e0);else{const N0=[],_0=[];for(let a0=0;a0<ct;a0++){const s0=a0/ct,v0=He*Math.cos(s0*Math.PI/2),C0=Fe*Math.sin(s0*Math.PI/2)+at;for(let E0=0,w0=b0.length;E0<w0;E0++){const vi=f0(b0[E0],G0[E0],C0);h0(vi.x,vi.y,-v0),s0===0&&N0.push(vi)}for(let E0=0,w0=o0;E0<w0;E0++){const vi=e0[E0];F0=I0[E0];const ui=[];for(let Ci=0,Ei=vi.length;Ci<Ei;Ci++){const j0=f0(vi[Ci],F0[Ci],C0);h0(j0.x,j0.y,-v0),s0===0&&ui.push(j0)}s0===0&&_0.push(ui)}}Si=ShapeUtils.triangulateShape(N0,_0)}const Ti=Si.length,Mi=Fe+at;for(let N0=0;N0<P0;N0++){const _0=ht?f0(Ut[N0],D0[N0],Mi):Ut[N0];kt?(r0.copy(Kt.normals[0]).multiplyScalar(_0.x),i0.copy(Kt.binormals[0]).multiplyScalar(_0.y),l0.copy(Ft[0]).add(r0).add(i0),h0(l0.x,l0.y,l0.z)):h0(_0.x,_0.y,0)}for(let N0=1;N0<=Ne;N0++)for(let _0=0;_0<P0;_0++){const a0=ht?f0(Ut[_0],D0[_0],Mi):Ut[_0];kt?(r0.copy(Kt.normals[N0]).multiplyScalar(a0.x),i0.copy(Kt.binormals[N0]).multiplyScalar(a0.y),l0.copy(Ft[N0]).add(r0).add(i0),h0(l0.x,l0.y,l0.z)):h0(a0.x,a0.y,ke/Ne*N0)}for(let N0=ct-1;N0>=0;N0--){const _0=N0/ct,a0=He*Math.cos(_0*Math.PI/2),s0=Fe*Math.sin(_0*Math.PI/2)+at;for(let v0=0,C0=b0.length;v0<C0;v0++){const E0=f0(b0[v0],G0[v0],s0);h0(E0.x,E0.y,ke+a0)}for(let v0=0,C0=e0.length;v0<C0;v0++){const E0=e0[v0];F0=I0[v0];for(let w0=0,vi=E0.length;w0<vi;w0++){const ui=f0(E0[w0],F0[w0],s0);kt?h0(ui.x,ui.y+Ft[Ne-1].y,Ft[Ne-1].x+a0):h0(ui.x,ui.y,ke+a0)}}}Fi(),Pt&&Ni();function Fi(){const N0=g.length/3;if(ht){let _0=0,a0=P0*_0;if(Wt)for(let s0=0;s0<Ti;s0++){const v0=Si[s0];xi(v0[2]+a0,v0[1]+a0,v0[0]+a0)}if(_0=Ne+ct*2,a0=P0*_0,Lt)for(let s0=0;s0<Ti;s0++){const v0=Si[s0];xi(v0[0]+a0,v0[1]+a0,v0[2]+a0)}}else{if(Wt)for(let _0=0;_0<Ti;_0++){const a0=Si[_0];xi(a0[2],a0[1],a0[0])}if(Lt)for(let _0=0;_0<Ti;_0++){const a0=Si[_0];xi(a0[0]+P0*Ne,a0[1]+P0*Ne,a0[2]+P0*Ne)}}d.addGroup(N0,g.length/3-N0,0)}function Ni(){const N0=g.length/3;let _0=0;B0(b0,_0),_0+=b0.length;for(let a0=0,s0=e0.length;a0<s0;a0++){const v0=e0[a0];B0(v0,_0),_0+=v0.length}d.addGroup(N0,g.length/3-N0,1)}function B0(N0,_0){let a0=N0.length;for(;--a0>=0;){const s0=a0;let v0=a0-1;v0<0&&(v0=N0.length-1);for(let C0=0,E0=Ne+ct*2;C0<E0;C0++){const w0=P0*C0,vi=P0*(C0+1),ui=_0+s0+w0,Ci=_0+v0+w0,Ei=_0+v0+vi,j0=_0+s0+vi;O0(ui,Ci,Ei,j0)}}}function h0(N0,_0,a0){Se.push(N0),Se.push(_0),Se.push(a0)}function xi(N0,_0,a0){J0(N0),J0(_0),J0(a0);const s0=g.length/3,v0=Gt.generateTopUV(d,g,s0-3,s0-2,s0-1);A0(v0[0]),A0(v0[1]),A0(v0[2])}function O0(N0,_0,a0,s0){J0(N0),J0(_0),J0(s0),J0(_0),J0(a0),J0(s0);const v0=g.length/3,C0=Gt.generateSideWallUV(d,g,v0-6,v0-3,v0-2,v0-1);A0(C0[0]),A0(C0[1]),A0(C0[3]),A0(C0[1]),A0(C0[2]),A0(C0[3])}function J0(N0){g.push(Se[N0*3+0]),g.push(Se[N0*3+1]),g.push(Se[N0*3+2])}function A0(N0){v.push(N0.x),v.push(N0.y)}}}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}toJSON(){const t=super.toJSON(),r=this.parameters.shapes,d=this.parameters.options;return Ie(r,d,t)}static fromJSON(t,r){const d=[];for(let v=0,C=t.shapes.length;v<C;v++){const w=r[t.shapes[v]];d.push(w)}const g=t.options.extrudePath;return g!==void 0&&(t.options.extrudePath=new Ue[`${g.type}`]().fromJSON(g)),new Z(d,t.options)}}const Ce={generateTopUV:function(m,t,r,d,g){const v=t[r*3],C=t[r*3+1],w=t[d*3],I=t[d*3+1],O=t[g*3],ye=t[g*3+1];return[new Vector2(v,C),new Vector2(w,I),new Vector2(O,ye)]},generateSideWallUV:function(m,t,r,d,g,v){const C=t[r*3],w=t[r*3+1],I=t[r*3+2],O=t[d*3],ye=t[d*3+1],Se=t[d*3+2],Pe=t[g*3],Ne=t[g*3+1],ke=t[g*3+2],ht=t[v*3],He=t[v*3+1],Fe=t[v*3+2];return Math.abs(w-ye)<Math.abs(C-O)?[new Vector2(C,1-I),new Vector2(O,1-Se),new Vector2(Pe,1-ke),new Vector2(ht,1-Fe)]:[new Vector2(w,1-I),new Vector2(ye,1-Se),new Vector2(Ne,1-ke),new Vector2(He,1-Fe)]}};function Ie(m,t,r){if(r.shapes=[],Array.isArray(m))for(let d=0,g=m.length;d<g;d++){const v=m[d];r.shapes.push(v.uuid)}else r.shapes.push(m.uuid);return r.options=Object.assign({},t),t.extrudePath!==void 0&&(r.options.extrudePath=t.extrudePath.toJSON()),r}class Ze extends ft$1{constructor(t){super(),this.rectAreaLightUniformsLibInit=!1,this.options=t}create(){var t,r,d,g,v,C,w,I,O,ye,Se,Pe,Ne,ke,ht,He,Fe;const at=this.options;if(at.type==="AmbientLight"){const ct=new AmbientLight(at.color);ct.name="环境光",this.object3d=ct}else if(at.type==="DirectionalLight"){const ct=new DirectionalLight(at.color,at.intensity);ct.name="平行光",ct.target.position.set(0,0,0),this.object3d=ct,ct.target.name="平行光目标",ct.shadow.camera.name="平行光阴影相机",ct.shadow.camera.userData.directionalLightShadow=!0,this.directionalLight=ct}else if(at.type==="PointLight"){const ct=new PointLight((t=at.color)!=null?t:16777215,(r=at.intensity)!=null?r:1,(d=at.distance)!=null?d:0,(g=at.decay)!=null?g:2);ct.name="点光源",this.object3d=ct,this.pointLight=ct}else if(at.type==="SpotLight"){const ct=new SpotLight((v=at.color)!=null?v:16777215,(C=at.intensity)!=null?C:1,(w=at.distance)!=null?w:0,(I=at.angle)!=null?I:Math.PI/3,(O=at.penumbra)!=null?O:1,(ye=at.decay)!=null?ye:2);ct.name="聚光灯",this.object3d=ct,this.spotLight=ct,ct.target.name="聚光灯目标"}else if(at.type==="HemisphereLight"){const ct=new HemisphereLight((Se=at.color)!=null?Se:16777215,(Pe=at.groundColor)!=null?Pe:16777215,(Ne=at.intensity)!=null?Ne:1);ct.name="半球光",this.object3d=ct,this.hemisphereLight=ct}else if(at.type==="RectAreaLight"){this.rectAreaLightUniformsLibInit||(RectAreaLightUniformsLib.init(),this.rectAreaLightUniformsLibInit=!0);const ct=new RectAreaLight((ke=at.color)!=null?ke:16777215,(ht=at.intensity)!=null?ht:1,(He=at.width)!=null?He:10,(Fe=at.height)!=null?Fe:10);ct.name="矩形区域光",this.object3d=ct,this.rectAreaLight=ct}}render(){const t=this.object3d;t.target&&this.pencil.scene.add(t.target);const r=this.pencil.cameraTarget;if(this.spotLight||this.directionalLight){const d=this.spotLight||this.directionalLight;d.position.copy(r),d.target.position.copy(r)}else this.pointLight&&this.pointLight.position.copy(r)}dispose(){const t=this.object3d;t.target&&this.pencil.scene.remove(t.target),super.dispose()}}function R$1(m,t=0){const r=m[0].index!==null,d=new Set(Object.keys(m[0].attributes)),g=new Set(Object.keys(m[0].morphAttributes)),v={},C={},w=m[0].morphTargetsRelative,I=new BufferGeometry;let O=0;for(let ye=0;ye<m.length;++ye){const Se=m[ye];let Pe=0;if(r!==(Se.index!==null))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+ye+". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them."),null;for(const Ne in Se.attributes){if(!d.has(Ne))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+ye+'. All geometries must have compatible attributes; make sure "'+Ne+'" attribute exists among all geometries, or in none of them.'),null;v[Ne]===void 0&&(v[Ne]=[]),v[Ne].push(Se.attributes[Ne]),Pe++}if(Pe!==d.size)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+ye+". Make sure all geometries have the same number of attributes."),null;if(w!==Se.morphTargetsRelative)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+ye+". .morphTargetsRelative must be consistent throughout all geometries."),null;for(const Ne in Se.morphAttributes){if(!g.has(Ne))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+ye+". .morphAttributes must be consistent throughout all geometries."),null;C[Ne]===void 0&&(C[Ne]=[]),C[Ne].push(Se.morphAttributes[Ne])}if(t){let Ne;if(r)Ne=Se.index.count;else if(Se.attributes.position!==void 0)Ne=Se.attributes.position.count;else return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+ye+". The geometry must have either an index or a position attribute"),null;if(t===1)I.addGroup(O,Ne,ye);else if(t===2&&Se.groups.length>0)for(let ke of Se.groups){let ht=ke.materialIndex;I.addGroup(O+ke.start,Math.min(ke.count,Ne),ht)}O+=Ne}}if(r){let ye=0;const Se=[];for(let Pe=0;Pe<m.length;++Pe){const Ne=m[Pe].index;for(let ke=0;ke<Ne.count;++ke)Se.push(Ne.getX(ke)+ye);ye+=m[Pe].attributes.position.count}I.setIndex(Se)}for(const ye in v){const Se=mergeAttributes(v[ye]);if(!Se)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the "+ye+" attribute."),null;I.setAttribute(ye,Se)}for(const ye in C){const Se=C[ye][0].length;if(Se===0)break;I.morphAttributes=I.morphAttributes||{},I.morphAttributes[ye]=[];for(let Pe=0;Pe<Se;++Pe){const Ne=[];for(let ht=0;ht<C[ye].length;++ht)Ne.push(C[ye][ht][Pe]);const ke=mergeAttributes(Ne);if(!ke)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the "+ye+" morphAttribute."),null;I.morphAttributes[ye].push(ke)}}return t===2?mergeGroups(I):I}const Dt=m=>{const{points:t}=m,r=t.reduce((d,g,v)=>(v<t.length-1&&d.push(g,t[v+1]),d),[]);return new BufferGeometry().setFromPoints(r)};let Ke=class extends ft$1{constructor(m={}){super(),this.options=G({},m)}get material(){var m;return(m=this.object3d)==null?void 0:m.material}create(){return nt(this,null,function*(){const{points:m,pointsArr:t,geometry:r,geometryArr:d,material:g,useGroups:v,setPointWidth:C,lineWidthArr:w,materialParameters:I,instanceCount:O}=this.options;let ye=g,Se=r;!ye&&I&&(ye=this.getMaterial(I)),!Se&&m?Se=Dt({points:m}):!Se&&t?Se=R$1(t.map(Ne=>Dt({points:Ne})),v!=null?v:0):!Se&&d&&d.length>1?Se=R$1(d,v!=null?v:0):!Se&&d&&d.length===1&&([Se]=d);const Pe=new LineSegmentsGeometry().fromLineSegments(new LineSegments(Se));if(this.pencil.options.WebGPUTHREE){O&&(Pe.instanceCount=O);const Ne=new ze$1(Pe,ye);Ne.computeLineDistances(),this.object3d=Ne}else{const Ne=new LineSegments2(Pe,ye);Ne.computeLineDistances(),this.object3d=Ne}})}getMaterial(m){return new LineMaterial(G({color:new Color$1("#ffffff")},m))}};function yt(m,t,r,d,g){let v;if(m=m.subarray||m.slice?m:m.buffer,r=r.subarray||r.slice?r:r.buffer,m=t?m.subarray?m.subarray(t,g&&t+g):m.slice(t,g&&t+g):m,r.set)r.set(m,d);else for(v=0;v<m.length;v++)r[v+d]=m[v];return r}function Be(m){return m instanceof Float32Array?m:m instanceof BufferGeometry?m.getAttribute("position").array:m.map(t=>{const r=Array.isArray(t);return t instanceof Vector3?[t.x,t.y,t.z]:t instanceof Vector2?[t.x,t.y,0]:r&&t.length===3?[t[0],t[1],t[2]]:r&&t.length===2?[t[0],t[1],0]:t}).flat()}class Ve extends BufferGeometry{constructor(){super(),this.type="MeshLine",this.isMeshLine=!0,this.positions=[],this.previous=[],this.next=[],this.side=[],this.width=[],this.indices_array=[],this.uvs=[],this.counters=[],this.widthCallback=null,this._points=[],this.matrixWorld=new Matrix4,Object.defineProperties(this,{points:{enumerable:!0,get(){return this._points},set(t){this.setPoints(t,this.widthCallback)}}})}setMatrixWorld(t){this.matrixWorld=t}setPoints(t,r){if(t=Be(t),this._points=t,this.widthCallback=r!=null?r:null,this.positions=[],this.counters=[],t.length&&t[0]instanceof Vector3)for(let d=0;d<t.length;d++){const g=t[d],v=d/(t.length-1);this.positions.push(g.x,g.y,g.z),this.positions.push(g.x,g.y,g.z),this.counters.push(v),this.counters.push(v)}else for(let d=0;d<t.length;d+=3){const g=d/(t.length-1);this.positions.push(t[d],t[d+1],t[d+2]),this.positions.push(t[d],t[d+1],t[d+2]),this.counters.push(g),this.counters.push(g)}this.process()}compareV3(t,r){const d=t*6,g=r*6;return this.positions[d]===this.positions[g]&&this.positions[d+1]===this.positions[g+1]&&this.positions[d+2]===this.positions[g+2]}copyV3(t){const r=t*6;return[this.positions[r],this.positions[r+1],this.positions[r+2]]}process(){const t=this.positions.length/6;this.previous=[],this.next=[],this.side=[],this.width=[],this.indices_array=[],this.uvs=[];let r,d;this.compareV3(0,t-1)?d=this.copyV3(t-2):d=this.copyV3(0),this.previous.push(d[0],d[1],d[2]),this.previous.push(d[0],d[1],d[2]);for(let g=0;g<t;g++){if(this.side.push(1),this.side.push(-1),this.widthCallback?r=this.widthCallback(g/(t-1)):r=1,this.width.push(r),this.width.push(r),this.uvs.push(g/(t-1),0),this.uvs.push(g/(t-1),1),g<t-1){d=this.copyV3(g),this.previous.push(d[0],d[1],d[2]),this.previous.push(d[0],d[1],d[2]);const v=g*2;this.indices_array.push(v,v+1,v+2),this.indices_array.push(v+2,v+1,v+3)}g>0&&(d=this.copyV3(g),this.next.push(d[0],d[1],d[2]),this.next.push(d[0],d[1],d[2]))}this.compareV3(t-1,0)?d=this.copyV3(1):d=this.copyV3(t-1),this.next.push(d[0],d[1],d[2]),this.next.push(d[0],d[1],d[2]),!this._attributes||this._attributes.position.count!==this.counters.length?this._attributes={position:new BufferAttribute(new Float32Array(this.positions),3),previous:new BufferAttribute(new Float32Array(this.previous),3),next:new BufferAttribute(new Float32Array(this.next),3),side:new BufferAttribute(new Float32Array(this.side),1),width:new BufferAttribute(new Float32Array(this.width),1),uv:new BufferAttribute(new Float32Array(this.uvs),2),index:new BufferAttribute(new Uint16Array(this.indices_array),1),counters:new BufferAttribute(new Float32Array(this.counters),1)}:(this._attributes.position.copyArray(new Float32Array(this.positions)),this._attributes.position.needsUpdate=!0,this._attributes.previous.copyArray(new Float32Array(this.previous)),this._attributes.previous.needsUpdate=!0,this._attributes.next.copyArray(new Float32Array(this.next)),this._attributes.next.needsUpdate=!0,this._attributes.side.copyArray(new Float32Array(this.side)),this._attributes.side.needsUpdate=!0,this._attributes.width.copyArray(new Float32Array(this.width)),this._attributes.width.needsUpdate=!0,this._attributes.uv.copyArray(new Float32Array(this.uvs)),this._attributes.uv.needsUpdate=!0,this._attributes.index.copyArray(new Uint16Array(this.indices_array)),this._attributes.index.needsUpdate=!0),this.setAttribute("position",this._attributes.position),this.setAttribute("previous",this._attributes.previous),this.setAttribute("next",this._attributes.next),this.setAttribute("side",this._attributes.side),this.setAttribute("width",this._attributes.width),this.setAttribute("uv",this._attributes.uv),this.setAttribute("counters",this._attributes.counters),this.setAttribute("position",this._attributes.position),this.setAttribute("previous",this._attributes.previous),this.setAttribute("next",this._attributes.next),this.setAttribute("side",this._attributes.side),this.setAttribute("width",this._attributes.width),this.setAttribute("uv",this._attributes.uv),this.setAttribute("counters",this._attributes.counters),this.setIndex(this._attributes.index),this.computeBoundingSphere(),this.computeBoundingBox()}advance({x:t,y:r,z:d}){const g=this._attributes.position.array,v=this._attributes.previous.array,C=this._attributes.next.array,w=g.length;yt(g,0,v,0,w),yt(g,6,g,0,w-6),g[w-6]=t,g[w-5]=r,g[w-4]=d,g[w-3]=t,g[w-2]=r,g[w-1]=d,yt(g,6,C,0,w-6),C[w-6]=t,C[w-5]=r,C[w-4]=d,C[w-3]=t,C[w-2]=r,C[w-1]=d,this._attributes.position.needsUpdate=!0,this._attributes.previous.needsUpdate=!0,this._attributes.next.needsUpdate=!0}}const bt=m=>{const{setPointWidth:t,nodes:r}=m,d=new Ve;return d.setPoints(r,t),d};class es extends ft$1{constructor(t={}){super(),this.options=G({},t)}get material(){var t;return(t=this.object3d)==null?void 0:t.material}create(){return nt(this,null,function*(){const{nodes:t,nodesArr:r,geometry:d,geometryArr:g,material:v,useGroups:C,setPointWidth:w,lineWidthArr:I,materialParameters:O}=this.options;let ye=v,Se=d;!ye&&O&&(ye=this.getMaterial(O)),!Se&&t?Se=bt({nodes:t,setPointWidth:w}):!Se&&r?Se=R$1(r.map((Pe,Ne)=>{let ke=w;return!ke&&I&&(ke=()=>{var ht;return(ht=I[Ne])!=null?ht:I[0]}),bt({nodes:Pe,setPointWidth:ke})}),C!=null?C:0):!Se&&g&&g.length>1?Se=R$1(g,C!=null?C:0):!Se&&g&&g.length===1&&([Se]=g),this.createMesh(Se,ye)})}setGeometry(t,r){const d=bt({nodes:t,setPointWidth:r}),g=this.object3d,v=g.geometry;g.geometry=d,v.dispose()}getMaterial(t){const{width:r,height:d}=this.pencil.getSize();return new Ie$2(G({color:new Color$1("#ffffff"),resolution:new Vector2(r,d)},t))}addGeometries(t){const r=this.object3d,d=R$1([r.geometry,...t]);r.geometry=d}resize(t,r){var d,g;(g=(d=this.material)==null?void 0:d.uniforms)==null||g.resolution.value.set(t,r)}useMaterial(t){super.useMaterial(t);const{width:r,height:d}=this.pencil.getSize();this.resize(r,d)}animate({duration:t=1e3,delay:r=0,repeat:d=0,lineLoop:g,onRepeat:v,onUpdate:C,onComplete:w,startShow:I}={}){const{offset:O,offsetLoop:ye}=this.material.uniforms;if(this.material.userData.tween)return;const Se=g!=null?g:!0;O.value.x=1,ye.value=Se&&I?1:0;let Pe=0;const Ne=new Tween(O.value).to({x:-1},t).delay(r).repeat(d).onUpdate(({x:ke})=>{Se&&ke<=0&&ye.value===0&&(ye.value=1),C&&C(ke)}).onRepeat(()=>{Pe+=1,v&&v(Pe)}).onComplete(()=>{w&&w()}).start();this.material.userData.tween=Ne}render(){const{width:t,height:r}=this.pencil.getSize();this.resize(t,r)}dispose(){this.material.userData.tween&&(this.material.userData.tween.stop(),remove(this.material.userData.tween)),super.dispose()}}const Ot=m=>{const t=m,{coordinate:r,startHeight:d,height:g}=t,v=gt(t,["coordinate","startHeight","height"]);let C=d||0;return typeof d!="undefined"&&typeof g!="undefined"&&(C=d+g),new De([r],ut(G({},v),{startHeight:d,endHeight:C}))};class ss extends ft$1{constructor(t){super(),this.options=G({},t)}create(){const t=this.options,{geometry:r,coordinateArr:d,coordinate:g,material:v,useGroups:C}=t,w=gt(t,["geometry","coordinateArr","coordinate","material","useGroups"]);let I=r;if(!I&&g)I=Ot(G({coordinate:g},w));else if(!I&&d){const O=d.map(ye=>Ot(G({coordinate:ye},w)));I=R$1(O,C!=null?C:0)}this.createMesh(I,v)}}class ze extends Z{constructor(t,r){super(t,r);const d=new Brush(new Z(t,ut(G({},r),{hasTop:!0,hasSide:!0,hasBottom:!1})));d.updateMatrixWorld();const g=new Box3().setFromObject(d),v=new Vector3;g.getSize(v);const C=new Vector3(g.min.x+v.x/2,g.min.y+v.y/2,0);let w=r.topSegments,I=r.box3;if(I){I=I.union(g);const He=new Vector3;I.getSize(He);const Fe=Math.max(v.x/He.x,v.y/He.y);w=Math.ceil(r.topSegments*Fe)}if(w<4)return this;const O=new PlaneGeometry(v.x,v.y,w,w),ye=new Brush(O);ye.position.set(C.x,C.y,C.z),ye.updateMatrixWorld();const Se=new Evaluator().evaluate(ye,d,INTERSECTION),Pe=Se.geometry.getAttribute("position"),Ne=new Float32BufferAttribute(Pe.count*2,2);for(let He=0;He<Pe.count;He++){const Fe=Pe.getZ(He);Pe.setZ(He,r.depth+Fe)}if(I){const He=I.min,Fe=I.max,at=new Vector3().subVectors(Fe,He);for(let ct=0;ct<Pe.count;ct++){const xt=Pe.getX(ct),Gt=Pe.getY(ct),Lt=(xt-He.x)/at.x,Wt=(Gt-He.y)/at.y;Ne.setXY(ct,Lt,Wt)}Se.geometry.setAttribute("uv",Ne)}Pe.needsUpdate=!0;const ke=new Z(t,ut(G({},r),{hasTop:!1})),ht=R$1([Se.geometry,ke],2);this.copy(ht.toNonIndexed())}}const Ht=m=>{const{split:t,depth:r,points:d,box3:g,hasTop:v,hasBottom:C,hasSide:w,sideRepeat:I,topSegments:O}=m,ye=O?ze:Z,Se=new ye(new Shape(d),{depth:r,bevelEnabled:!1,box3:g,UVGenerator:R$2({split:t,box3:g,sideRepeat:I}),hasTop:v,hasBottom:C,hasSide:w,topSegments:O});return P(),Se};class is extends ft$1{constructor(t){super(),this.options=G({depth:1},t)}create(){return nt(this,null,function*(){const{points:t,pointsArr:r,useGroups:d,depth:g,geometry:v,geometryArr:C,material:w,box3:I,split:O,hasTop:ye,hasBottom:Se,hasSide:Pe}=this.options,Ne=Array.isArray(g)?g:[g],ke=Array.isArray(I)?I:[I],ht=w;let He=v;ht||console.log("material is null"),!He&&t?He=Ht({points:t,depth:Ne[0],box3:ke[0],split:O,hasTop:ye,hasBottom:Se,hasSide:Pe}):!He&&r?He=R$1(r.map((Fe,at)=>{var ct,xt;return Ht({points:Fe,depth:(ct=Ne[at])!=null?ct:Ne[0],box3:(xt=ke[at])!=null?xt:ke[0],split:O,hasTop:ye,hasBottom:Se,hasSide:Pe})}),d!=null?d:0):!He&&C&&C.length>1?He=R$1(C,d!=null?d:0):!He&&C&&C.length===1&&([He]=C),this.createMesh(He,ht)})}addGeometries(t){const r=this.object3d,d=R$1([r.geometry,...t]);r.geometry=d}setTextureAnisotropic(t,r){t.anisotropy=r||this.pencil.renderer.capabilities.getMaxAnisotropy()}}class Light extends Ze{update(t,r){var g;super.update(t,r);const d=this.object3d;(g=d.shadow)!=null&&g.camera&&(d.shadow.camera.near!==this.pencil.camera.near&&(d.shadow.camera.near=this.pencil.camera.near),d.shadow.camera.far!=this.pencil.camera.far&&(d.shadow.camera.far=this.pencil.camera.far))}render(){super.render();const t=this.object3d;t.userData=new Proxy({},{set:(w,I,O)=>(I==="keepCamera"&&(O?(this.pencil.render(),t.userData.parent=t.parent,this.pencil.camera.attach(t),t.target&&this.pencil.camera.attach(t.target)):!O&&t.userData.parent&&(this.pencil.render(),t.userData.parent.attach(t),t.target&&t.userData.parent.attach(t.target))),Reflect.set(w,I,O))});const{type:r,key:d}=this.options;d?(this.lead.updateBaseObjectKey(this,`${r}_${d}`),this.userData.updateKey=!1):this.lead.updateBaseObjectKey(this,`${r}`),t.target&&(t.target.userData.light=t);const g=this.object3d;g.isDirectionalLight&&(g.shadow.mapSize.width=1024,g.shadow.mapSize.height=1024);const v=this.object3d;v.isSpotLight&&v.shadow.mapSize.set(1024,1024);const C=this.object3d;C.isPointLight&&(C.shadow.mapSize.width=1024,C.shadow.mapSize.height=1024)}}class Point extends ft$1{constructor(r){super();T0(this,"options");T0(this,"scaleValue",1);this.options=fi({sprite:!0},r)}get material(){var r;return(r=this.object3d)==null?void 0:r.material}getMaterial(){const{sprite:r}=this.options,d=document.createElement("canvas");d.width=100,d.height=100;const g=d.getContext("2d");g.beginPath(),g.arc(50,50,50,0,2*Math.PI),g.fillStyle="#ffffff",g.fill(),g.closePath();const v=new CanvasTexture(d);return r?new SpriteMaterial({transparent:!0,map:v}):new MeshBasicMaterial({color:16777215,transparent:!0,map:v})}create(){return U0(this,null,function*(){const{sprite:r}=this.options,d=this.getMaterial();r?this.createSprite(d):this.createMesh(new PlaneGeometry(1,1),d),this.setScale(1),this.object3d.scale.multiplyScalar(.1)})}setScale(r){this.scaleValue=r;const d=this.material.map;d!=null&&d.image?this.object3d.scale.set(d.image.width*r,d.image.height*r,1):this.object3d.scale.set(r,r,1)}}const p={mercator:i$2,equirectangular:s$1,winkel3:l},a$1={},f=m=>{var t,r,d;const g=JSON.stringify(m);if(a$1[g])return a$1[g];const v=p[(t=m.projectionType)!=null?t:"mercator"]().center(m.center).scale(m.scale).translate((r=m.translate)!=null?r:[0,0]).precision((d=m.precision)!=null?d:.1);return m.rotate&&v.rotate(m.rotate),a$1[g]=v,v},getLineTexture=(m,t="rgba(255,255,255,1)",r="rgba(0,0,0,0)")=>{const d=document.createElement("canvas");d.width=256,d.height=1;const g=d.getContext("2d"),v=g.createLinearGradient(0,0,256,1);v.addColorStop(0,t),v.addColorStop(m,t),v.addColorStop(m,r),v.addColorStop(1,r),g.fillStyle=v,g.fillRect(0,0,256,1);const C=new CanvasTexture(d);return C.wrapS=RepeatWrapping,C.wrapT=RepeatWrapping,C.needsUpdate=!0,C},createFlyPath=(m,t,r=40)=>{const d=m.angleTo(t);let g=m.clone().add(t);g=g.normalize().multiplyScalar(r);let v;d<=1?v=r/5*d:d>1&&d<2?v=r/5*un(d,2):v=r/5*un(d,1.5);const C=m.clone().add(g).normalize().multiplyScalar(r+v),w=t.clone().add(g).normalize().multiplyScalar(r+v);return new CubicBezierCurve3(m,C,w,t)},createFlyPath2=(m,t,r=40)=>{const d=new Vector3().lerpVectors(m,t,.25),g=new Vector3().lerpVectors(m,t,.75);return d.z+=r,g.z+=r,new CubicBezierCurve3(m,d,g,t)},pixel2unit=(m,t)=>{const d=m.camera.fov*Math.PI/180,g=m.controls.getPosition(new Vector3,!1),v=2*Math.tan(d/2)*g.z,C=m.getSize(),w=C.width/C.width,I=v*w;return t*m.renderer.getPixelRatio()/C.width/(1/I)};let map;class Arc extends ft$1{constructor(r){super();T0(this,"options");T0(this,"line");T0(this,"helperMesh");T0(this,"helperMeshPosition");T0(this,"pickTube",null);this.options=fi({color:"#ffffff",lineWidth:6,globe:!1,offsetLoop:!0},r),this.options.repeat&&this.options.repeat[0]===.5&&(this.options.offsetLoop=!1)}static getInitOptions(r,d){const g=pixel2unit(r,200),v=d.globe?new Vector3(0,0,0).add(new Vector3(-g/2,g/2,0)):new Vector3(0,0,0).sub(new Vector3(g/2,g/2,g/2)),C=d.globe?new Vector3(0,0,0).add(new Vector3(g/2,g/2,0)):new Vector3(0,0,0).add(new Vector3(g/2,g/2,g/2));return{from:v.toArray(),to:C.toArray()}}create(){return U0(this,null,function*(){map||(map=getLineTexture(.5));const{color:r,lineWidth:d,globe:g}=this.options;let{radius:v}=this.options;const C=h(this.options.from||[0,0,0]),w=h(this.options.to||[0,0,0]);v=v!=null?v:C.distanceTo(w);const I=g?createFlyPath(C,w,v):createFlyPath2(C,w,v),O=I.getPoints(1500),ye=this.pencil.lead,Se=yield ye.draw("Line",{nodes:O,setPointWidth:He=>He*1,materialParameters:{color:r,map,useMap:1,transparent:!0,sizeAttenuation:0,lineWidth:d}},null);this.line=Se,this.object3d=Se.object3d;const[Pe,Ne,ke,ht]=yield Promise.all([{key:"Arc_起点",position:I.v0},{key:"Arc_第一控制点",position:I.v1},{key:"Arc_第二控制点",position:I.v2},{key:"Arc_终点",position:I.v3}].map(at=>U0(this,[at],function*({key:He,position:Fe}){const ct=yield ye.draw("Group",{},this);return ct.position.copy(Fe),ct.userData.disabledCR=!0,ct.userData.disabledTC=!1,ye.updateBaseObjectKey(ct,`${He}_${this.options.key}`),ct})));this.helperMesh=[Pe,Ne,ke,ht],this.helperMeshPosition=[Pe.position.clone(),Ne.position.clone(),ke.position.clone(),ht.position.clone()]})}instantiate(){return U0(this,null,function*(){this.update();const r=yield this.line.instantiate(void 0,{recursive:!1}),d=yield fn(Arc.prototype,this,"instantiate").call(this,void 0,{create:g=>{g.line=r,g.object3d=r.object3d}});return d.position.set(0,0,0),d.rotation.set(0,0,0),d.scale.set(1,1,1),d})}setPath(r,d,g,v=C=>C*1){const{globe:C}=this.options;r=h(r),d=h(d);const I=(C?createFlyPath(r,d,g):createFlyPath2(r,d,g)).getPoints(1500);this.line.options.nodes=I,this.line.setGeometry(I,v),this.pickTube&&this.addPickTarget(this.pickTube.options.radius)}addPickTarget(r=1,d=!1){return U0(this,null,function*(){const g=this.pickTube,v=this.pencil.lead,C=this.line.options.nodes,w=new CurvePath;for(let ye=0;ye<C.length-1;ye++)w.add(new LineCurve3(C[ye],C[ye+1]));const I=yield v.draw("Tube",{path:w,radius:r,multiplyScalar:1},this),O=I.object3d;return O.material=new MeshBasicMaterial({color:16711680,transparent:!0,opacity:d?1:0}),g&&(g.userData._pe_&&I.onPointerEvent(...g.userData._pe_),g.erase()),this.pickTube=I,I})}onPointerEvent(...r){this.pickTube?(this.pickTube.onPointerEvent(...r),this.pickTube.userData._pe_=[...r]):this.pencil.userData.EditorEnv||console.warn("addPickTarget first")}setColor(r){this.line&&(this.line.material.uniforms.color.value=new Color$1(r))}animateIn({duration:r=2e3,delay:d=0,repeat:g=1/0,onComplete:v,onRepeat:C}={}){this.line.material.userData.tween&&(this.line.material.userData.tween.stop(),remove(this.line.material.userData.tween),this.line.material.userData.tween=null,this.line.material.uniforms.offset.value.x=0),r&&(this.line.material.uniforms.offset.value.x=1,this.line.material.uniforms.offsetLoop.value=0,this.line.animate({duration:r,repeat:g,delay:d,lineLoop:this.options.offsetLoop,onRepeat:C,onComplete:v}))}update(){var r;if((r=this.helperMesh)!=null&&r.length&&this.helperMesh.find((g,v)=>g.position.distanceTo(this.helperMeshPosition[v])>.01)){this.helperMesh.forEach((C,w)=>{this.helperMeshPosition[w].copy(C.position)});const v=new CubicBezierCurve3(this.helperMeshPosition[0],this.helperMeshPosition[1],this.helperMeshPosition[2],this.helperMeshPosition[3]).getPoints(1500);this.line.setGeometry(v,this.line.object3d.geometry.widthCallback)}}render(){this.mList.rmBaseObjectMap(this.line),setTimeout(()=>{!this.pencil.userData.EditorEnv&&this.prefab||this.line.material.userData.tween||this.animateIn()})}dispose(){this.line.dispose(),super.dispose()}}class CrossPlane extends ft$1{constructor(r){super();T0(this,"options");this.options=fi({},r)}create(){return U0(this,null,function*(){this.createGroup();const r=this.options.material||new MeshBasicMaterial({color:"#ffffff",side:DoubleSide,blending:AdditiveBlending});r.depthWrite=!1;const d=this.pencil.lead,[g,v]=yield Promise.all([d.draw("Plane",{key:"crossPlane_item1_"+this.options.key},this),d.draw("Plane",{key:"crossPlane_item2_"+this.options.key},this)]);g.object3d.material=r,v.object3d.material=r,g.rotation.x=-Math.PI*.5,v.rotation.x=-Math.PI*.5,v.rotation.y=-Math.PI*.5,this.userData.disabledTC=!1})}}class PlaneShadow extends ft$1{create(){return U0(this,null,function*(){const t=new PlaneGeometry(100,100,2,2),r=new ShadowMaterial;r.opacity=.5,r.depthWrite=!1,this.createMesh(t,r),this.object3d.receiveShadow=!0,this.position.z=.1,this.object3d.name="阴影接受"})}}class Model extends ft$1{constructor(r){super();T0(this,"options");this.options=fi({},r)}create(){return U0(this,null,function*(){const r=this.pencil.loader,d=this.options.src;if(!d)throw new Error("src is required");let g=r.getAsset(d);g||(g=yield r.load(d)),this.object3d=g.scene,this.scale.multiplyScalar(20)})}}class Box extends ft$1{create(){const t=new BoxGeometry(1,1,1,1,1,1);this.createMesh(t),this.scale.multiplyScalar(20)}}class Capsule extends ft$1{create(){const t=new CapsuleGeometry(1,1,4,8);this.createMesh(t),this.scale.multiplyScalar(20)}}class Circle extends ft$1{create(){const t=new CircleGeometry(1,32,0,Math.PI*2);this.createMesh(t),this.scale.multiplyScalar(20)}}class Cylinder extends ft$1{create(){const t=new CylinderGeometry(1,1,1,32,1,!1,0,Math.PI*2);this.createMesh(t),this.scale.multiplyScalar(20)}}class Dodecahedron extends ft$1{create(){const t=new DodecahedronGeometry(1,0);this.createMesh(t),this.scale.multiplyScalar(20)}}class Icosahedron extends ft$1{create(){const t=new IcosahedronGeometry(1,0);this.createMesh(t),this.scale.multiplyScalar(20)}}class Lathe extends ft$1{create(){const t=new LatheGeometry;this.createMesh(t,new MeshStandardMaterial({side:DoubleSide})),this.scale.multiplyScalar(20)}}class Octahedron extends ft$1{create(){const t=new OctahedronGeometry(1,0);this.createMesh(t),this.scale.multiplyScalar(20)}}class Plane extends ft$1{create(){const t=new PlaneGeometry(1,1,2,2);this.createMesh(t),this.scale.multiplyScalar(20)}}class Ring extends ft$1{create(){const t=new RingGeometry(.5,1,32,1,0,Math.PI*2);this.createMesh(t),this.scale.multiplyScalar(20)}}class Sphere extends ft$1{constructor(){super(...arguments);T0(this,"radius",100);T0(this,"material");T0(this,"options")}create(){var d;(d=this.options)!=null&&d.radius&&(this.radius=this.options.radius);const r=new SphereGeometry(this.radius,128,90);this.createMesh(r,this.material),this.object3d.rotation.y=Math.PI/180*90}}class Sprite extends ft$1{create(){this.createSprite(new SpriteMaterial),this.scale.multiplyScalar(20)}setDesiredPixelSize(t){var d;const r=this.object3d;if((d=r.material.map)!=null&&d.image){const g=this.pencil.camera,v=new Vector3;g.matrixWorld.decompose(v,new Quaternion,new Vector3);const C=MathUtils.degToRad(g.fov),I=this.pencil.getSize().height*(1/(2*Math.tan(C/2))),O=t/I,{width:ye,height:Se}=r.material.map.image;r.scale.set(ye/Se*O,O,1)}}}class Tetrahedron extends ft$1{create(){const t=new TetrahedronGeometry(1,0);this.createMesh(t),this.scale.multiplyScalar(20)}}class Torus extends ft$1{create(){const t=new TorusGeometry(1,.4,12,48,Math.PI*2);this.createMesh(t),this.scale.multiplyScalar(20)}}class TorusKnot extends ft$1{create(){const t=new TorusKnotGeometry(1,.4,64,8,2,3);this.createMesh(t),this.scale.multiplyScalar(20)}}class Tube extends ft$1{constructor(r){super();T0(this,"options");this.options=r}create(){var C,w;const r=this.options.path||new CatmullRomCurve3([new Vector3(2,2,-2),new Vector3(2,-2,-.6666666666666667),new Vector3(-2,-2,.6666666666666667),new Vector3(-2,2,2)]),d=(C=this.options.radius)!=null?C:1,g=(w=this.options.multiplyScalar)!=null?w:20,v=new TubeGeometry(r,64,d,8,!1);this.createMesh(v),this.scale.multiplyScalar(g)}}const baseObjs={Node:Xe,Line:es,Line2:Ke,ExtrudePolygon:is,ConicPolygon:ss,Group:Qe,Light,Point,Arc,Model},expObjs={Plane,CrossPlane,PlaneShadow,Ring,Sphere,Sprite,Tetrahedron,Torus,TorusKnot,Tube,Box,Capsule,Circle,Cylinder,Dodecahedron,Icosahedron,Lathe,Octahedron},prefabType=Object.keys(Ui(fi({},expObjs),{Arc,Model})).map(m=>m),objs$3=fi(fi({},baseObjs),expObjs);function promisifyRequest(m){return new Promise((t,r)=>{m.oncomplete=m.onsuccess=()=>t(m.result),m.onabort=m.onerror=()=>r(m.error)})}function createStore(m,t){const r=indexedDB.open(m);r.onupgradeneeded=()=>r.result.createObjectStore(t);const d=promisifyRequest(r);return(g,v)=>d.then(C=>v(C.transaction(t,g).objectStore(t)))}let defaultGetStoreFunc;function defaultGetStore(){return defaultGetStoreFunc||(defaultGetStoreFunc=createStore("keyval-store","keyval")),defaultGetStoreFunc}function get(m,t=defaultGetStore()){return t("readonly",r=>promisifyRequest(r.get(m)))}function setMany(m,t=defaultGetStore()){return t("readwrite",r=>(m.forEach(d=>r.put(d[1],d[0])),promisifyRequest(r.transaction)))}var H=Object.defineProperty,u=Object.getOwnPropertySymbols,Y=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable,V=(m,t,r)=>t in m?H(m,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):m[t]=r,W=(m,t)=>{for(var r in t||(t={}))Y.call(t,r)&&V(m,r,t[r]);if(u)for(var r of u(t))a.call(t,r)&&V(m,r,t[r]);return m},x=(m,t)=>{var r={};for(var d in m)Y.call(m,d)&&t.indexOf(d)<0&&(r[d]=m[d]);if(m!=null&&u)for(var d of u(m))t.indexOf(d)<0&&a.call(m,d)&&(r[d]=m[d]);return r},s=(m,t,r)=>new Promise((d,g)=>{var v=I=>{try{w(r.next(I))}catch(O){g(O)}},C=I=>{try{w(r.throw(I))}catch(O){g(O)}},w=I=>I.done?d(I.value):Promise.resolve(I.value).then(v,C);w((r=r.apply(m,t)).next())});const o="dmFyIFBnPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxFZz1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgQ2c9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIFFyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIEh1PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksV3U9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgbWM9KEosUSk9PihRPVN5bWJvbFtKXSk/UTpTeW1ib2wuZm9yKCJTeW1ib2wuIitKKSxCZz1KPT57dGhyb3cgVHlwZUVycm9yKEopfSx5aT1NYXRoLnBvdyxxdT0oSixRLG10KT0+USBpbiBKP1BnKEosUSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bXR9KTpKW1FdPW10LEZ0PShKLFEpPT57Zm9yKHZhciBtdCBpbiBRfHwoUT17fSkpSHUuY2FsbChRLG10KSYmcXUoSixtdCxRW210XSk7aWYoUXIpZm9yKHZhciBtdCBvZiBRcihRKSlXdS5jYWxsKFEsbXQpJiZxdShKLG10LFFbbXRdKTtyZXR1cm4gSn0sWmU9KEosUSk9PkVnKEosQ2coUSkpO3ZhciBHdT0oSixRKT0+e3ZhciBtdD17fTtmb3IodmFyIE10IGluIEopSHUuY2FsbChKLE10KSYmUS5pbmRleE9mKE10KTwwJiYobXRbTXRdPUpbTXRdKTtpZihKIT1udWxsJiZRcilmb3IodmFyIE10IG9mIFFyKEopKVEuaW5kZXhPZihNdCk8MCYmV3UuY2FsbChKLE10KSYmKG10W010XT1KW010XSk7cmV0dXJuIG10fTt2YXIgRmc9ZnVuY3Rpb24oSixRKXt0aGlzWzBdPUosdGhpc1sxXT1RfTt2YXIgWnU9Sj0+e3ZhciBRPUpbbWMoImFzeW5jSXRlcmF0b3IiKV0sbXQ9ITEsTXQsY249e307cmV0dXJuIFE9PW51bGw/KFE9SlttYygiaXRlcmF0b3IiKV0oKSxNdD1fZT0+Y25bX2VdPUJuPT5RW19lXShCbikpOihRPVEuY2FsbChKKSxNdD1fZT0+Y25bX2VdPUJuPT57aWYobXQpe2lmKG10PSExLF9lPT09InRocm93Iil0aHJvdyBCbjtyZXR1cm4gQm59cmV0dXJuIG10PSEwLHtkb25lOiExLHZhbHVlOm5ldyBGZyhuZXcgUHJvbWlzZShnYz0+e3ZhciBLcj1RW19lXShCbik7S3IgaW5zdGFuY2VvZiBPYmplY3R8fEJnKCJPYmplY3QgZXhwZWN0ZWQiKSxnYyhLcil9KSwxKX19KSxjblttYygiaXRlcmF0b3IiKV09KCk9PmNuLE10KCJuZXh0IiksInRocm93ImluIFE/TXQoInRocm93Iik6Y24udGhyb3c9X2U9Pnt0aHJvdyBfZX0sInJldHVybiJpbiBRJiZNdCgicmV0dXJuIiksY259OyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjsvKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IDIwMTAtMjAyNSBUaHJlZS5qcyBBdXRob3JzCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICovY29uc3QgSj0iMTc2Iix4Yz0iIixvZT0ic3JnYiIsd2M9InNyZ2ItbGluZWFyIixiYz0ibGluZWFyIix0bz0ic3JnYiI7Y2xhc3Mgb3N7YWRkRXZlbnRMaXN0ZW5lcih0LGUpe3RoaXMuX2xpc3RlbmVycz09PXZvaWQgMCYmKHRoaXMuX2xpc3RlbmVycz17fSk7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7blt0XT09PXZvaWQgMCYmKG5bdF09W10pLG5bdF0uaW5kZXhPZihlKT09PS0xJiZuW3RdLnB1c2goZSl9aGFzRXZlbnRMaXN0ZW5lcih0LGUpe2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiBuPT09dm9pZCAwPyExOm5bdF0hPT12b2lkIDAmJm5bdF0uaW5kZXhPZihlKSE9PS0xfXJlbW92ZUV2ZW50TGlzdGVuZXIodCxlKXtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztpZihuPT09dm9pZCAwKXJldHVybjtjb25zdCBzPW5bdF07aWYocyE9PXZvaWQgMCl7Y29uc3Qgcj1zLmluZGV4T2YoZSk7ciE9PS0xJiZzLnNwbGljZShyLDEpfX1kaXNwYXRjaEV2ZW50KHQpe2NvbnN0IGU9dGhpcy5fbGlzdGVuZXJzO2lmKGU9PT12b2lkIDApcmV0dXJuO2NvbnN0IG49ZVt0LnR5cGVdO2lmKG4hPT12b2lkIDApe3QudGFyZ2V0PXRoaXM7Y29uc3Qgcz1uLnNsaWNlKDApO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKylzW3JdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgQXQ9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2Z1bmN0aW9uIEZuKCl7Y29uc3QgaT1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCx0PU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLGU9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsbj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MDtyZXR1cm4oQXRbaSYyNTVdK0F0W2k+PjgmMjU1XStBdFtpPj4xNiYyNTVdK0F0W2k+PjI0JjI1NV0rIi0iK0F0W3QmMjU1XStBdFt0Pj44JjI1NV0rIi0iK0F0W3Q+PjE2JjE1fDY0XStBdFt0Pj4yNCYyNTVdKyItIitBdFtlJjYzfDEyOF0rQXRbZT4+OCYyNTVdKyItIitBdFtlPj4xNiYyNTVdK0F0W2U+PjI0JjI1NV0rQXRbbiYyNTVdK0F0W24+PjgmMjU1XStBdFtuPj4xNiYyNTVdK0F0W24+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gWihpLHQsZSl7cmV0dXJuIE1hdGgubWF4KHQsTWF0aC5taW4oZSxpKSl9ZnVuY3Rpb24gWHUoaSx0KXtyZXR1cm4oaSV0K3QpJXR9ZnVuY3Rpb24gZW8oaSx0LGUpe3JldHVybigxLWUpKmkrZSp0fWZ1bmN0aW9uIG1pKGksdCl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiBpO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIGkvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiBpLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gaS8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChpLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoaS8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KGkvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24gSXQoaSx0KXtzd2l0Y2godC5jb25zdHJ1Y3Rvcil7Y2FzZSBGbG9hdDMyQXJyYXk6cmV0dXJuIGk7Y2FzZSBVaW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjQyOTQ5NjcyOTUpO2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSo2NTUzNSk7Y2FzZSBVaW50OEFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqMjU1KTtjYXNlIEludDMyQXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoyMTQ3NDgzNjQ3KTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSozMjc2Nyk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoxMjcpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX1jbGFzcyBSe2NvbnN0cnVjdG9yKHQ9MCxlPTApe1IucHJvdG90eXBlLmlzVmVjdG9yMj0hMCx0aGlzLng9dCx0aGlzLnk9ZX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy54fXNldCB3aWR0aCh0KXt0aGlzLng9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMueX1zZXQgaGVpZ2h0KHQpe3RoaXMueT10fXNldCh0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHM9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PXNbMF0qZStzWzNdKm4rc1s2XSx0aGlzLnk9c1sxXSplK3NbNF0qbitzWzddLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PVoodGhpcy54LHQueCxlLngpLHRoaXMueT1aKHRoaXMueSx0LnksZS55KSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1aKHRoaXMueCx0LGUpLHRoaXMueT1aKHRoaXMueSx0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKFoobix0LGUpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX1jcm9zcyh0KXtyZXR1cm4gdGhpcy54KnQueS10aGlzLnkqdC54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZihlPT09MClyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKFoobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnk7cmV0dXJuIGUqZStuKm59bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXN9cm90YXRlQXJvdW5kKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxzPU1hdGguc2luKGUpLHI9dGhpcy54LXQueCxvPXRoaXMueS10Lnk7cmV0dXJuIHRoaXMueD1yKm4tbypzK3QueCx0aGlzLnk9cipzK28qbit0LnksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55fX1jbGFzcyBnZXtjb25zdHJ1Y3Rvcih0LGUsbixzLHIsbyxhLGMsbCl7Z2UucHJvdG90eXBlLmlzTWF0cml4Mz0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDEsMCwwLDAsMV0sdCE9PXZvaWQgMCYmdGhpcy5zZXQodCxlLG4scyxyLG8sYSxjLGwpfXNldCh0LGUsbixzLHIsbyxhLGMsbCl7Y29uc3QgaD10aGlzLmVsZW1lbnRzO3JldHVybiBoWzBdPXQsaFsxXT1zLGhbMl09YSxoWzNdPWUsaFs0XT1yLGhbNV09YyxoWzZdPW4saFs3XT1vLGhbOF09bCx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMSwwLDAsMCwxKSx0aGlzfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sdGhpc31leHRyYWN0QmFzaXModCxlLG4pe3JldHVybiB0LnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywyKSx0aGlzfXNldEZyb21NYXRyaXg0KHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzRdLGVbOF0sZVsxXSxlWzVdLGVbOV0sZVsyXSxlWzZdLGVbMTBdKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxzPWUuZWxlbWVudHMscj10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bM10sYz1uWzZdLGw9blsxXSxoPW5bNF0sdT1uWzddLGY9blsyXSxkPW5bNV0scD1uWzhdLHk9c1swXSxtPXNbM10sZz1zWzZdLGI9c1sxXSx3PXNbNF0seD1zWzddLE09c1syXSxBPXNbNV0sXz1zWzhdO3JldHVybiByWzBdPW8qeSthKmIrYypNLHJbM109byptK2EqdytjKkEscls2XT1vKmcrYSp4K2MqXyxyWzFdPWwqeStoKmIrdSpNLHJbNF09bCptK2gqdyt1KkEscls3XT1sKmcraCp4K3UqXyxyWzJdPWYqeStkKmIrcCpNLHJbNV09ZiptK2QqdytwKkEscls4XT1mKmcrZCp4K3AqXyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzNdKj10LGVbNl0qPXQsZVsxXSo9dCxlWzRdKj10LGVbN10qPXQsZVsyXSo9dCxlWzVdKj10LGVbOF0qPXQsdGhpc31kZXRlcm1pbmFudCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sbD10WzddLGg9dFs4XTtyZXR1cm4gZSpvKmgtZSphKmwtbipyKmgrbiphKmMrcypyKmwtcypvKmN9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0scz10WzJdLHI9dFszXSxvPXRbNF0sYT10WzVdLGM9dFs2XSxsPXRbN10saD10WzhdLHU9aCpvLWEqbCxmPWEqYy1oKnIsZD1sKnItbypjLHA9ZSp1K24qZitzKmQ7aWYocD09PTApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCB5PTEvcDtyZXR1cm4gdFswXT11KnksdFsxXT0ocypsLWgqbikqeSx0WzJdPShhKm4tcypvKSp5LHRbM109Zip5LHRbNF09KGgqZS1zKmMpKnksdFs1XT0ocypyLWEqZSkqeSx0WzZdPWQqeSx0WzddPShuKmMtbCplKSp5LHRbOF09KG8qZS1uKnIpKnksdGhpc310cmFuc3Bvc2UoKXtsZXQgdDtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQ9ZVsxXSxlWzFdPWVbM10sZVszXT10LHQ9ZVsyXSxlWzJdPWVbNl0sZVs2XT10LHQ9ZVs1XSxlWzVdPWVbN10sZVs3XT10LHRoaXN9Z2V0Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KHQpLmludmVydCgpLnRyYW5zcG9zZSgpfXRyYW5zcG9zZUludG9BcnJheSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbM10sdFsyXT1lWzZdLHRbM109ZVsxXSx0WzRdPWVbNF0sdFs1XT1lWzddLHRbNl09ZVsyXSx0WzddPWVbNV0sdFs4XT1lWzhdLHRoaXN9c2V0VXZUcmFuc2Zvcm0odCxlLG4scyxyLG8sYSl7Y29uc3QgYz1NYXRoLmNvcyhyKSxsPU1hdGguc2luKHIpO3JldHVybiB0aGlzLnNldChuKmMsbipsLC1uKihjKm8rbCphKStvK3QsLXMqbCxzKmMsLXMqKC1sKm8rYyphKSthK2UsMCwwLDEpLHRoaXN9c2NhbGUodCxlKXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShuby5tYWtlU2NhbGUodCxlKSksdGhpc31yb3RhdGUodCl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkobm8ubWFrZVJvdGF0aW9uKC10KSksdGhpc310cmFuc2xhdGUodCxlKXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShuby5tYWtlVHJhbnNsYXRpb24odCxlKSksdGhpc31tYWtlVHJhbnNsYXRpb24odCxlKXtyZXR1cm4gdC5pc1ZlY3RvcjI/dGhpcy5zZXQoMSwwLHQueCwwLDEsdC55LDAsMCwxKTp0aGlzLnNldCgxLDAsdCwwLDEsZSwwLDAsMSksdGhpc31tYWtlUm90YXRpb24odCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsbixlLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSl7cmV0dXJuIHRoaXMuc2V0KHQsMCwwLDAsZSwwLDAsMCwxKSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgcz0wO3M8OTtzKyspaWYoZVtzXSE9PW5bc10pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDk7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9fWNvbnN0IG5vPW5ldyBnZTtmdW5jdGlvbiBKdShpKXtmb3IobGV0IHQ9aS5sZW5ndGgtMTt0Pj0wOy0tdClpZihpW3RdPj02NTUzNSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBNYyhpKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixpKX1jb25zdCBBYz1uZXcgZ2UoKS5zZXQoLjQxMjM5MDgsLjM1NzU4NDMsLjE4MDQ4MDgsLjIxMjYzOSwuNzE1MTY4NywuMDcyMTkyMywuMDE5MzMwOCwuMTE5MTk0OCwuOTUwNTMyMiksX2M9bmV3IGdlKCkuc2V0KDMuMjQwOTY5OSwtMS41MzczODMyLC0uNDk4NjEwOCwtLjk2OTI0MzYsMS44NzU5Njc1LC4wNDE1NTUxLC4wNTU2MzAxLC0uMjAzOTc3LDEuMDU2OTcxNSk7ZnVuY3Rpb24gWXUoKXtjb25zdCBpPXtlbmFibGVkOiEwLHdvcmtpbmdDb2xvclNwYWNlOndjLHNwYWNlczp7fSxjb252ZXJ0OmZ1bmN0aW9uKHMscixvKXtyZXR1cm4gdGhpcy5lbmFibGVkPT09ITF8fHI9PT1vfHwhcnx8IW98fCh0aGlzLnNwYWNlc1tyXS50cmFuc2Zlcj09PXRvJiYocy5yPXZlKHMucikscy5nPXZlKHMuZykscy5iPXZlKHMuYikpLHRoaXMuc3BhY2VzW3JdLnByaW1hcmllcyE9PXRoaXMuc3BhY2VzW29dLnByaW1hcmllcyYmKHMuYXBwbHlNYXRyaXgzKHRoaXMuc3BhY2VzW3JdLnRvWFlaKSxzLmFwcGx5TWF0cml4Myh0aGlzLnNwYWNlc1tvXS5mcm9tWFlaKSksdGhpcy5zcGFjZXNbb10udHJhbnNmZXI9PT10byYmKHMucj1JbihzLnIpLHMuZz1JbihzLmcpLHMuYj1JbihzLmIpKSksc30sZnJvbVdvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHMscil7cmV0dXJuIHRoaXMuY29udmVydChzLHRoaXMud29ya2luZ0NvbG9yU3BhY2Uscil9LHRvV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24ocyxyKXtyZXR1cm4gdGhpcy5jb252ZXJ0KHMscix0aGlzLndvcmtpbmdDb2xvclNwYWNlKX0sZ2V0UHJpbWFyaWVzOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNwYWNlc1tzXS5wcmltYXJpZXN9LGdldFRyYW5zZmVyOmZ1bmN0aW9uKHMpe3JldHVybiBzPT09eGM/YmM6dGhpcy5zcGFjZXNbc10udHJhbnNmZXJ9LGdldEx1bWluYW5jZUNvZWZmaWNpZW50czpmdW5jdGlvbihzLHI9dGhpcy53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHMuZnJvbUFycmF5KHRoaXMuc3BhY2VzW3JdLmx1bWluYW5jZUNvZWZmaWNpZW50cyl9LGRlZmluZTpmdW5jdGlvbihzKXtPYmplY3QuYXNzaWduKHRoaXMuc3BhY2VzLHMpfSxfZ2V0TWF0cml4OmZ1bmN0aW9uKHMscixvKXtyZXR1cm4gcy5jb3B5KHRoaXMuc3BhY2VzW3JdLnRvWFlaKS5tdWx0aXBseSh0aGlzLnNwYWNlc1tvXS5mcm9tWFlaKX0sX2dldERyYXdpbmdCdWZmZXJDb2xvclNwYWNlOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNwYWNlc1tzXS5vdXRwdXRDb2xvclNwYWNlQ29uZmlnLmRyYXdpbmdCdWZmZXJDb2xvclNwYWNlfSxfZ2V0VW5wYWNrQ29sb3JTcGFjZTpmdW5jdGlvbihzPXRoaXMud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB0aGlzLnNwYWNlc1tzXS53b3JraW5nQ29sb3JTcGFjZUNvbmZpZy51bnBhY2tDb2xvclNwYWNlfX0sdD1bLjY0LC4zMywuMywuNiwuMTUsLjA2XSxlPVsuMjEyNiwuNzE1MiwuMDcyMl0sbj1bLjMxMjcsLjMyOV07cmV0dXJuIGkuZGVmaW5lKHtbd2NdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6YmMsdG9YWVo6QWMsZnJvbVhZWjpfYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSx3b3JraW5nQ29sb3JTcGFjZUNvbmZpZzp7dW5wYWNrQ29sb3JTcGFjZTpvZX0sb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzp7ZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6b2V9fSxbb2VdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6dG8sdG9YWVo6QWMsZnJvbVhZWjpfYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSxvdXRwdXRDb2xvclNwYWNlQ29uZmlnOntkcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTpvZX19fSksaX1jb25zdCBhZT1ZdSgpO2Z1bmN0aW9uIHZlKGkpe3JldHVybiBpPC4wNDA0NT9pKi4wNzczOTkzODA4Ok1hdGgucG93KGkqLjk0Nzg2NzI5ODYrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBJbihpKXtyZXR1cm4gaTwuMDAzMTMwOD9pKjEyLjkyOjEuMDU1Kk1hdGgucG93KGksLjQxNjY2KS0uMDU1fWxldCBrbjtjbGFzcyBqdXtzdGF0aWMgZ2V0RGF0YVVSTCh0LGU9ImltYWdlL3BuZyIpe2lmKC9eZGF0YTovaS50ZXN0KHQuc3JjKXx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PT0idW5kZWZpbmVkIilyZXR1cm4gdC5zcmM7bGV0IG47aWYodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KW49dDtlbHNle2tuPT09dm9pZCAwJiYoa249TWMoImNhbnZhcyIpKSxrbi53aWR0aD10LndpZHRoLGtuLmhlaWdodD10LmhlaWdodDtjb25zdCBzPWtuLmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9zLnB1dEltYWdlRGF0YSh0LDAsMCk6cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksbj1rbn1yZXR1cm4gbi50b0RhdGFVUkwoZSl9c3RhdGljIHNSR0JUb0xpbmVhcih0KXtpZih0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHR5cGVvZiBJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgZT1NYygiY2FudmFzIik7ZS53aWR0aD10LndpZHRoLGUuaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ZS5nZXRDb250ZXh0KCIyZCIpO24uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpO2NvbnN0IHM9bi5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLHI9cy5kYXRhO2ZvcihsZXQgbz0wO288ci5sZW5ndGg7bysrKXJbb109dmUocltvXS8yNTUpKjI1NTtyZXR1cm4gbi5wdXRJbWFnZURhdGEocywwLDApLGV9ZWxzZSBpZih0LmRhdGEpe2NvbnN0IGU9dC5kYXRhLnNsaWNlKDApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/ZVtuXT1NYXRoLmZsb29yKHZlKGVbbl0vMjU1KSoyNTUpOmVbbl09dmUoZVtuXSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19ZWxzZSByZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuIiksdH19bGV0IFF1PTA7Y2xhc3MgS3V7Y29uc3RydWN0b3IodD1udWxsKXt0aGlzLmlzU291cmNlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlF1Kyt9KSx0aGlzLnV1aWQ9Rm4oKSx0aGlzLmRhdGE9dCx0aGlzLmRhdGFSZWFkeT0hMCx0aGlzLnZlcnNpb249MH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQuaW1hZ2VzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIHQuaW1hZ2VzW3RoaXMudXVpZF07Y29uc3Qgbj17dXVpZDp0aGlzLnV1aWQsdXJsOiIifSxzPXRoaXMuZGF0YTtpZihzIT09bnVsbCl7bGV0IHI7aWYoQXJyYXkuaXNBcnJheShzKSl7cj1bXTtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YTtvKyspc1tvXS5pc0RhdGFUZXh0dXJlP3IucHVzaChpbyhzW29dLmltYWdlKSk6ci5wdXNoKGlvKHNbb10pKX1lbHNlIHI9aW8ocyk7bi51cmw9cn1yZXR1cm4gZXx8KHQuaW1hZ2VzW3RoaXMudXVpZF09biksbn19ZnVuY3Rpb24gaW8oaSl7cmV0dXJuIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCE9InVuZGVmaW5lZCImJmkgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEltYWdlQml0bWFwP2p1LmdldERhdGFVUkwoaSk6aS5kYXRhP3tkYXRhOkFycmF5LmZyb20oaS5kYXRhKSx3aWR0aDppLndpZHRoLGhlaWdodDppLmhlaWdodCx0eXBlOmkuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTooY29uc29sZS53YXJuKCJUSFJFRS5UZXh0dXJlOiBVbmFibGUgdG8gc2VyaWFsaXplIFRleHR1cmUuIikse30pfWxldCB0Zj0wO2NsYXNzIGxuIGV4dGVuZHMgb3N7Y29uc3RydWN0b3IodD1sbi5ERUZBVUxUX0lNQUdFLGU9bG4uREVGQVVMVF9NQVBQSU5HLG49MTAwMSxzPTEwMDEscj0xMDA2LG89MTAwOCxhPTEwMjMsYz0xMDA5LGw9bG4uREVGQVVMVF9BTklTT1RST1BZLGg9eGMpe3N1cGVyKCksdGhpcy5pc1RleHR1cmU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6dGYrK30pLHRoaXMudXVpZD1GbigpLHRoaXMubmFtZT0iIix0aGlzLnNvdXJjZT1uZXcgS3UodCksdGhpcy5taXBtYXBzPVtdLHRoaXMubWFwcGluZz1lLHRoaXMuY2hhbm5lbD0wLHRoaXMud3JhcFM9bix0aGlzLndyYXBUPXMsdGhpcy5tYWdGaWx0ZXI9cix0aGlzLm1pbkZpbHRlcj1vLHRoaXMuYW5pc290cm9weT1sLHRoaXMuZm9ybWF0PWEsdGhpcy5pbnRlcm5hbEZvcm1hdD1udWxsLHRoaXMudHlwZT1jLHRoaXMub2Zmc2V0PW5ldyBSKDAsMCksdGhpcy5yZXBlYXQ9bmV3IFIoMSwxKSx0aGlzLmNlbnRlcj1uZXcgUigwLDApLHRoaXMucm90YXRpb249MCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITAsdGhpcy5tYXRyaXg9bmV3IGdlLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5jb2xvclNwYWNlPWgsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLm9uVXBkYXRlPW51bGwsdGhpcy5yZW5kZXJUYXJnZXQ9bnVsbCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMSx0aGlzLmlzVGV4dHVyZUFycmF5PSExLHRoaXMucG1yZW1WZXJzaW9uPTB9Z2V0IGltYWdlKCl7cmV0dXJuIHRoaXMuc291cmNlLmRhdGF9c2V0IGltYWdlKHQ9bnVsbCl7dGhpcy5zb3VyY2UuZGF0YT10fXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueSx0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnksdGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnkpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuc291cmNlPXQuc291cmNlLHRoaXMubWlwbWFwcz10Lm1pcG1hcHMuc2xpY2UoMCksdGhpcy5tYXBwaW5nPXQubWFwcGluZyx0aGlzLmNoYW5uZWw9dC5jaGFubmVsLHRoaXMud3JhcFM9dC53cmFwUyx0aGlzLndyYXBUPXQud3JhcFQsdGhpcy5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXIsdGhpcy5taW5GaWx0ZXI9dC5taW5GaWx0ZXIsdGhpcy5hbmlzb3Ryb3B5PXQuYW5pc290cm9weSx0aGlzLmZvcm1hdD10LmZvcm1hdCx0aGlzLmludGVybmFsRm9ybWF0PXQuaW50ZXJuYWxGb3JtYXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLm9mZnNldC5jb3B5KHQub2Zmc2V0KSx0aGlzLnJlcGVhdC5jb3B5KHQucmVwZWF0KSx0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnByZW11bHRpcGx5QWxwaGE9dC5wcmVtdWx0aXBseUFscGhhLHRoaXMuZmxpcFk9dC5mbGlwWSx0aGlzLnVucGFja0FsaWdubWVudD10LnVucGFja0FsaWdubWVudCx0aGlzLmNvbG9yU3BhY2U9dC5jb2xvclNwYWNlLHRoaXMucmVuZGVyVGFyZ2V0PXQucmVuZGVyVGFyZ2V0LHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPXQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlLHRoaXMuaXNUZXh0dXJlQXJyYXk9dC5pc1RleHR1cmVBcnJheSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQudGV4dHVyZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcsY2hhbm5lbDp0aGlzLmNoYW5uZWwscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCxpbnRlcm5hbEZvcm1hdDp0aGlzLmludGVybmFsRm9ybWF0LHR5cGU6dGhpcy50eXBlLGNvbG9yU3BhY2U6dGhpcy5jb2xvclNwYWNlLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09biksbn1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKHRoaXMubWFwcGluZyE9PTMwMClyZXR1cm4gdDtpZih0LmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksdC54PDB8fHQueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFlMzp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVhaztjYXNlIDEwMDE6dC54PXQueDwwPzA6MTticmVhaztjYXNlIDEwMDI6TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpPT09MT90Lng9TWF0aC5jZWlsKHQueCktdC54OnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrfWlmKHQueTwwfHx0Lnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxZTM6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWs7Y2FzZSAxMDAxOnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSAxMDAyOk1hdGguYWJzKE1hdGguZmxvb3IodC55KSUyKT09PTE/dC55PU1hdGguY2VpbCh0LnkpLXQueTp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVha31yZXR1cm4gdGhpcy5mbGlwWSYmKHQueT0xLXQueSksdH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiYodGhpcy52ZXJzaW9uKyssdGhpcy5zb3VyY2UubmVlZHNVcGRhdGU9ITApfXNldCBuZWVkc1BNUkVNVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy5wbXJlbVZlcnNpb24rK319bG4uREVGQVVMVF9JTUFHRT1udWxsLGxuLkRFRkFVTFRfTUFQUElORz0zMDAsbG4uREVGQVVMVF9BTklTT1RST1BZPTE7Y2xhc3MgWXR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscz0xKXtZdC5wcm90b3R5cGUuaXNWZWN0b3I0PSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1zfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxuLHMpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9cyx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXQudyE9PXZvaWQgMD90Lnc6MSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcy53Kz10LncsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXMudy09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpcy53PXQudy1lLncsdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcy53Kj10LncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpcy53Kj10LHRoaXN9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHM9dGhpcy56LHI9dGhpcy53LG89dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW9bMF0qZStvWzRdKm4rb1s4XSpzK29bMTJdKnIsdGhpcy55PW9bMV0qZStvWzVdKm4rb1s5XSpzK29bMTNdKnIsdGhpcy56PW9bMl0qZStvWzZdKm4rb1sxMF0qcytvWzE0XSpyLHRoaXMudz1vWzNdKmUrb1s3XSpuK29bMTFdKnMrb1sxNV0qcix0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpcy53Lz10LncsdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1zZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbih0KXt0aGlzLnc9MipNYXRoLmFjb3ModC53KTtjb25zdCBlPU1hdGguc3FydCgxLXQudyp0LncpO3JldHVybiBlPDFlLTQ/KHRoaXMueD0xLHRoaXMueT0wLHRoaXMuej0wKToodGhpcy54PXQueC9lLHRoaXMueT10LnkvZSx0aGlzLno9dC56L2UpLHRoaXN9c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KHQpe2xldCBlLG4scyxyO2NvbnN0IGM9dC5lbGVtZW50cyxsPWNbMF0saD1jWzRdLHU9Y1s4XSxmPWNbMV0sZD1jWzVdLHA9Y1s5XSx5PWNbMl0sbT1jWzZdLGc9Y1sxMF07aWYoTWF0aC5hYnMoaC1mKTwuMDEmJk1hdGguYWJzKHUteSk8LjAxJiZNYXRoLmFicyhwLW0pPC4wMSl7aWYoTWF0aC5hYnMoaCtmKTwuMSYmTWF0aC5hYnModSt5KTwuMSYmTWF0aC5hYnMocCttKTwuMSYmTWF0aC5hYnMobCtkK2ctMyk8LjEpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7ZT1NYXRoLlBJO2NvbnN0IHc9KGwrMSkvMix4PShkKzEpLzIsTT0oZysxKS8yLEE9KGgrZikvNCxfPSh1K3kpLzQsdj0ocCttKS80O3JldHVybiB3PngmJnc+TT93PC4wMT8obj0wLHM9LjcwNzEwNjc4MSxyPS43MDcxMDY3ODEpOihuPU1hdGguc3FydCh3KSxzPUEvbixyPV8vbik6eD5NP3g8LjAxPyhuPS43MDcxMDY3ODEscz0wLHI9LjcwNzEwNjc4MSk6KHM9TWF0aC5zcXJ0KHgpLG49QS9zLHI9di9zKTpNPC4wMT8obj0uNzA3MTA2NzgxLHM9LjcwNzEwNjc4MSxyPTApOihyPU1hdGguc3FydChNKSxuPV8vcixzPXYvciksdGhpcy5zZXQobixzLHIsZSksdGhpc31sZXQgYj1NYXRoLnNxcnQoKG0tcCkqKG0tcCkrKHUteSkqKHUteSkrKGYtaCkqKGYtaCkpO3JldHVybiBNYXRoLmFicyhiKTwuMDAxJiYoYj0xKSx0aGlzLng9KG0tcCkvYix0aGlzLnk9KHUteSkvYix0aGlzLno9KGYtaCkvYix0aGlzLnc9TWF0aC5hY29zKChsK2QrZy0xKS8yKSx0aGlzfXNldEZyb21NYXRyaXhQb3NpdGlvbih0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1lWzEyXSx0aGlzLnk9ZVsxM10sdGhpcy56PWVbMTRdLHRoaXMudz1lWzE1XSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpcy53PU1hdGgubWluKHRoaXMudyx0LncpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5tYXgodGhpcy53LHQudyksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdC54LGUueCksdGhpcy55PVoodGhpcy55LHQueSxlLnkpLHRoaXMuej1aKHRoaXMueix0LnosZS56KSx0aGlzLnc9Wih0aGlzLncsdC53LGUudyksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdCxlKSx0aGlzLnk9Wih0aGlzLnksdCxlKSx0aGlzLno9Wih0aGlzLnosdCxlKSx0aGlzLnc9Wih0aGlzLncsdCxlKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihaKG4sdCxlKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpcy53PU1hdGguZmxvb3IodGhpcy53KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpcy53PU1hdGguY2VpbCh0aGlzLncpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpcy53PU1hdGgucm91bmQodGhpcy53KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXMudz1NYXRoLnRydW5jKHRoaXMudyksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpcy53PS10aGlzLncsdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56K3RoaXMudyp0Lnd9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLncpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzLncrPSh0LnctdGhpcy53KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzLnc9dC53KyhlLnctdC53KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56JiZ0Lnc9PT10aGlzLnd9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXMudz10W2UrM10sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHRbZSszXT10aGlzLncsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXMudz10LmdldFcoZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpcy53PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMueix5aWVsZCB0aGlzLnd9fWNsYXNzIGdpe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHM9MSl7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1zfXN0YXRpYyBzbGVycEZsYXQodCxlLG4scyxyLG8sYSl7bGV0IGM9bltzKzBdLGw9bltzKzFdLGg9bltzKzJdLHU9bltzKzNdO2NvbnN0IGY9cltvKzBdLGQ9cltvKzFdLHA9cltvKzJdLHk9cltvKzNdO2lmKGE9PT0wKXt0W2UrMF09Yyx0W2UrMV09bCx0W2UrMl09aCx0W2UrM109dTtyZXR1cm59aWYoYT09PTEpe3RbZSswXT1mLHRbZSsxXT1kLHRbZSsyXT1wLHRbZSszXT15O3JldHVybn1pZih1IT09eXx8YyE9PWZ8fGwhPT1kfHxoIT09cCl7bGV0IG09MS1hO2NvbnN0IGc9YypmK2wqZCtoKnArdSp5LGI9Zz49MD8xOi0xLHc9MS1nKmc7aWYodz5OdW1iZXIuRVBTSUxPTil7Y29uc3QgTT1NYXRoLnNxcnQodyksQT1NYXRoLmF0YW4yKE0sZypiKTttPU1hdGguc2luKG0qQSkvTSxhPU1hdGguc2luKGEqQSkvTX1jb25zdCB4PWEqYjtpZihjPWMqbStmKngsbD1sKm0rZCp4LGg9aCptK3AqeCx1PXUqbSt5KngsbT09PTEtYSl7Y29uc3QgTT0xL01hdGguc3FydChjKmMrbCpsK2gqaCt1KnUpO2MqPU0sbCo9TSxoKj1NLHUqPU19fXRbZV09Yyx0W2UrMV09bCx0W2UrMl09aCx0W2UrM109dX1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodCxlLG4scyxyLG8pe2NvbnN0IGE9bltzXSxjPW5bcysxXSxsPW5bcysyXSxoPW5bcyszXSx1PXJbb10sZj1yW28rMV0sZD1yW28rMl0scD1yW28rM107cmV0dXJuIHRbZV09YSpwK2gqdStjKmQtbCpmLHRbZSsxXT1jKnAraCpmK2wqdS1hKmQsdFtlKzJdPWwqcCtoKmQrYSpmLWMqdSx0W2UrM109aCpwLWEqdS1jKmYtbCpkLHR9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyh0KXt0aGlzLl93PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixzKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1zLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC54LHRoaXMuX3k9dC55LHRoaXMuX3o9dC56LHRoaXMuX3c9dC53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcih0LGU9ITApe2NvbnN0IG49dC5feCxzPXQuX3kscj10Ll96LG89dC5fb3JkZXIsYT1NYXRoLmNvcyxjPU1hdGguc2luLGw9YShuLzIpLGg9YShzLzIpLHU9YShyLzIpLGY9YyhuLzIpLGQ9YyhzLzIpLHA9YyhyLzIpO3N3aXRjaChvKXtjYXNlIlhZWiI6dGhpcy5feD1mKmgqdStsKmQqcCx0aGlzLl95PWwqZCp1LWYqaCpwLHRoaXMuX3o9bCpoKnArZipkKnUsdGhpcy5fdz1sKmgqdS1mKmQqcDticmVhaztjYXNlIllYWiI6dGhpcy5feD1mKmgqdStsKmQqcCx0aGlzLl95PWwqZCp1LWYqaCpwLHRoaXMuX3o9bCpoKnAtZipkKnUsdGhpcy5fdz1sKmgqdStmKmQqcDticmVhaztjYXNlIlpYWSI6dGhpcy5feD1mKmgqdS1sKmQqcCx0aGlzLl95PWwqZCp1K2YqaCpwLHRoaXMuX3o9bCpoKnArZipkKnUsdGhpcy5fdz1sKmgqdS1mKmQqcDticmVhaztjYXNlIlpZWCI6dGhpcy5feD1mKmgqdS1sKmQqcCx0aGlzLl95PWwqZCp1K2YqaCpwLHRoaXMuX3o9bCpoKnAtZipkKnUsdGhpcy5fdz1sKmgqdStmKmQqcDticmVhaztjYXNlIllaWCI6dGhpcy5feD1mKmgqdStsKmQqcCx0aGlzLl95PWwqZCp1K2YqaCpwLHRoaXMuX3o9bCpoKnAtZipkKnUsdGhpcy5fdz1sKmgqdS1mKmQqcDticmVhaztjYXNlIlhaWSI6dGhpcy5feD1mKmgqdS1sKmQqcCx0aGlzLl95PWwqZCp1LWYqaCpwLHRoaXMuX3o9bCpoKnArZipkKnUsdGhpcy5fdz1sKmgqdStmKmQqcDticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrbyl9cmV0dXJuIGU9PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUF4aXNBbmdsZSh0LGUpe2NvbnN0IG49ZS8yLHM9TWF0aC5zaW4obik7cmV0dXJuIHRoaXMuX3g9dC54KnMsdGhpcy5feT10Lnkqcyx0aGlzLl96PXQueipzLHRoaXMuX3c9TWF0aC5jb3MobiksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpe2NvbnN0IGU9dC5lbGVtZW50cyxuPWVbMF0scz1lWzRdLHI9ZVs4XSxvPWVbMV0sYT1lWzVdLGM9ZVs5XSxsPWVbMl0saD1lWzZdLHU9ZVsxMF0sZj1uK2ErdTtpZihmPjApe2NvbnN0IGQ9LjUvTWF0aC5zcXJ0KGYrMSk7dGhpcy5fdz0uMjUvZCx0aGlzLl94PShoLWMpKmQsdGhpcy5feT0oci1sKSpkLHRoaXMuX3o9KG8tcykqZH1lbHNlIGlmKG4+YSYmbj51KXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErbi1hLXUpO3RoaXMuX3c9KGgtYykvZCx0aGlzLl94PS4yNSpkLHRoaXMuX3k9KHMrbykvZCx0aGlzLl96PShyK2wpL2R9ZWxzZSBpZihhPnUpe2NvbnN0IGQ9MipNYXRoLnNxcnQoMSthLW4tdSk7dGhpcy5fdz0oci1sKS9kLHRoaXMuX3g9KHMrbykvZCx0aGlzLl95PS4yNSpkLHRoaXMuX3o9KGMraCkvZH1lbHNle2NvbnN0IGQ9MipNYXRoLnNxcnQoMSt1LW4tYSk7dGhpcy5fdz0oby1zKS9kLHRoaXMuX3g9KHIrbCkvZCx0aGlzLl95PShjK2gpL2QsdGhpcy5fej0uMjUqZH1yZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVVuaXRWZWN0b3JzKHQsZSl7bGV0IG49dC5kb3QoZSkrMTtyZXR1cm4gbjxOdW1iZXIuRVBTSUxPTj8obj0wLE1hdGguYWJzKHQueCk+TWF0aC5hYnModC56KT8odGhpcy5feD0tdC55LHRoaXMuX3k9dC54LHRoaXMuX3o9MCx0aGlzLl93PW4pOih0aGlzLl94PTAsdGhpcy5feT0tdC56LHRoaXMuX3o9dC55LHRoaXMuX3c9bikpOih0aGlzLl94PXQueSplLnotdC56KmUueSx0aGlzLl95PXQueiplLngtdC54KmUueix0aGlzLl96PXQueCplLnktdC55KmUueCx0aGlzLl93PW4pLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyh0KXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoWih0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZihuPT09MClyZXR1cm4gdGhpcztjb25zdCBzPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LHMpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdD09PTA/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gscz10Ll95LHI9dC5feixvPXQuX3csYT1lLl94LGM9ZS5feSxsPWUuX3osaD1lLl93O3JldHVybiB0aGlzLl94PW4qaCtvKmErcypsLXIqYyx0aGlzLl95PXMqaCtvKmMrciphLW4qbCx0aGlzLl96PXIqaCtvKmwrbipjLXMqYSx0aGlzLl93PW8qaC1uKmEtcypjLXIqbCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKGU9PT0wKXJldHVybiB0aGlzO2lmKGU9PT0xKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3Qgbj10aGlzLl94LHM9dGhpcy5feSxyPXRoaXMuX3osbz10aGlzLl93O2xldCBhPW8qdC5fdytuKnQuX3grcyp0Ll95K3IqdC5fejtpZihhPDA/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3osYT0tYSk6dGhpcy5jb3B5KHQpLGE+PTEpcmV0dXJuIHRoaXMuX3c9byx0aGlzLl94PW4sdGhpcy5feT1zLHRoaXMuX3o9cix0aGlzO2NvbnN0IGM9MS1hKmE7aWYoYzw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IGQ9MS1lO3JldHVybiB0aGlzLl93PWQqbytlKnRoaXMuX3csdGhpcy5feD1kKm4rZSp0aGlzLl94LHRoaXMuX3k9ZCpzK2UqdGhpcy5feSx0aGlzLl96PWQqcitlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzfWNvbnN0IGw9TWF0aC5zcXJ0KGMpLGg9TWF0aC5hdGFuMihsLGEpLHU9TWF0aC5zaW4oKDEtZSkqaCkvbCxmPU1hdGguc2luKGUqaCkvbDtyZXR1cm4gdGhpcy5fdz1vKnUrdGhpcy5fdypmLHRoaXMuX3g9bip1K3RoaXMuX3gqZix0aGlzLl95PXMqdSt0aGlzLl95KmYsdGhpcy5fej1yKnUrdGhpcy5feipmLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1yYW5kb20oKXtjb25zdCB0PTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLGU9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksbj1NYXRoLnJhbmRvbSgpLHM9TWF0aC5zcXJ0KDEtbikscj1NYXRoLnNxcnQobik7cmV0dXJuIHRoaXMuc2V0KHMqTWF0aC5zaW4odCkscypNYXRoLmNvcyh0KSxyKk1hdGguc2luKGUpLHIqTWF0aC5jb3MoZSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX3d9fWNsYXNzIFR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTApe1QucHJvdG90eXBlLmlzVmVjdG9yMz0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bn1zZXQodCxlLG4pe3JldHVybiBuPT09dm9pZCAwJiYobj10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24odmMuc2V0RnJvbUV1bGVyKHQpKX1hcHBseUF4aXNBbmdsZSh0LGUpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbih2Yy5zZXRGcm9tQXhpc0FuZ2xlKHQsZSkpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrclszXSpuK3JbNl0qcyx0aGlzLnk9clsxXSplK3JbNF0qbityWzddKnMsdGhpcy56PXJbMl0qZStyWzVdKm4rcls4XSpzLHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKHQpLm5vcm1hbGl6ZSgpfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHMsbz0xLyhyWzNdKmUrcls3XSpuK3JbMTFdKnMrclsxNV0pO3JldHVybiB0aGlzLng9KHJbMF0qZStyWzRdKm4rcls4XSpzK3JbMTJdKSpvLHRoaXMueT0oclsxXSplK3JbNV0qbityWzldKnMrclsxM10pKm8sdGhpcy56PShyWzJdKmUrcls2XSpuK3JbMTBdKnMrclsxNF0pKm8sdGhpc31hcHBseVF1YXRlcm5pb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10Lngsbz10LnksYT10LnosYz10LncsbD0yKihvKnMtYSpuKSxoPTIqKGEqZS1yKnMpLHU9MioocipuLW8qZSk7cmV0dXJuIHRoaXMueD1lK2MqbCtvKnUtYSpoLHRoaXMueT1uK2MqaCthKmwtcip1LHRoaXMuej1zK2MqdStyKmgtbypsLHRoaXN9cHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXRyYW5zZm9ybURpcmVjdGlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrcls0XSpuK3JbOF0qcyx0aGlzLnk9clsxXSplK3JbNV0qbityWzldKnMsdGhpcy56PXJbMl0qZStyWzZdKm4rclsxMF0qcyx0aGlzLm5vcm1hbGl6ZSgpfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1aKHRoaXMueCx0LngsZS54KSx0aGlzLnk9Wih0aGlzLnksdC55LGUueSksdGhpcy56PVoodGhpcy56LHQueixlLnopLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PVoodGhpcy54LHQsZSksdGhpcy55PVoodGhpcy55LHQsZSksdGhpcy56PVoodGhpcy56LHQsZSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoWihuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgbj10Lngscz10Lnkscj10Lnosbz1lLngsYT1lLnksYz1lLno7cmV0dXJuIHRoaXMueD1zKmMtciphLHRoaXMueT1yKm8tbipjLHRoaXMuej1uKmEtcypvLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKGU9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgbj10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIobil9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIHNvLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKHNvKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1Yihzby5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKGU9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoWihuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueSxzPXRoaXMuei10Lno7cmV0dXJuIGUqZStuKm4rcypzfW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpK01hdGguYWJzKHRoaXMuei10LnopfXNldEZyb21TcGhlcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnBoaSx0LnRoZXRhKX1zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQsZSxuKXtjb25zdCBzPU1hdGguc2luKGUpKnQ7cmV0dXJuIHRoaXMueD1zKk1hdGguc2luKG4pLHRoaXMueT1NYXRoLmNvcyhlKSp0LHRoaXMuej1zKk1hdGguY29zKG4pLHRoaXN9c2V0RnJvbUN5bGluZHJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnRoZXRhLHQueSl9c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQqTWF0aC5zaW4oZSksdGhpcy55PW4sdGhpcy56PXQqTWF0aC5jb3MoZSksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzfXNldEZyb21NYXRyaXhTY2FsZSh0KXtjb25zdCBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCkscz10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gdGhpcy54PWUsdGhpcy55PW4sdGhpcy56PXMsdGhpc31zZXRGcm9tTWF0cml4Q29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsZSo0KX1zZXRGcm9tTWF0cml4M0NvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLGUqMyl9c2V0RnJvbUV1bGVyKHQpe3JldHVybiB0aGlzLng9dC5feCx0aGlzLnk9dC5feSx0aGlzLno9dC5feix0aGlzfXNldEZyb21Db2xvcih0KXtyZXR1cm4gdGhpcy54PXQucix0aGlzLnk9dC5nLHRoaXMuej10LmIsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnp9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpc31yYW5kb21EaXJlY3Rpb24oKXtjb25zdCB0PU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLGU9TWF0aC5yYW5kb20oKSoyLTEsbj1NYXRoLnNxcnQoMS1lKmUpO3JldHVybiB0aGlzLng9bipNYXRoLmNvcyh0KSx0aGlzLnk9ZSx0aGlzLno9bipNYXRoLnNpbih0KSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56fX1jb25zdCBzbz1uZXcgVCx2Yz1uZXcgZ2k7Y2xhc3MgZ3R7Y29uc3RydWN0b3IodD1uZXcgVCgxLzAsMS8wLDEvMCksZT1uZXcgVCgtMS8wLC0xLzAsLTEvMCkpe3RoaXMuaXNCb3gzPSEwLHRoaXMubWluPXQsdGhpcy5tYXg9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXN9c2V0RnJvbUFycmF5KHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSs9Myl0aGlzLmV4cGFuZEJ5UG9pbnQoY2UuZnJvbUFycmF5KHQsZSkpO3JldHVybiB0aGlzfXNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQuY291bnQ7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoY2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tUG9pbnRzKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTtyZXR1cm4gdGhpc31zZXRGcm9tQ2VudGVyQW5kU2l6ZSh0LGUpe2NvbnN0IG49Y2UuY29weShlKS5tdWx0aXBseVNjYWxhciguNSk7cmV0dXJuIHRoaXMubWluLmNvcHkodCkuc3ViKG4pLHRoaXMubWF4LmNvcHkodCkuYWRkKG4pLHRoaXN9c2V0RnJvbU9iamVjdCh0LGU9ITEpe3JldHVybiB0aGlzLm1ha2VFbXB0eSgpLHRoaXMuZXhwYW5kQnlPYmplY3QodCxlKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PXRoaXMubWluLno9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS0xLzAsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fHx0aGlzLm1heC56PHRoaXMubWluLnp9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9ZXhwYW5kQnlQb2ludCh0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQpLHRoaXMubWF4Lm1heCh0KSx0aGlzfWV4cGFuZEJ5VmVjdG9yKHQpe3JldHVybiB0aGlzLm1pbi5zdWIodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXhwYW5kQnlTY2FsYXIodCl7cmV0dXJuIHRoaXMubWluLmFkZFNjYWxhcigtdCksdGhpcy5tYXguYWRkU2NhbGFyKHQpLHRoaXN9ZXhwYW5kQnlPYmplY3QodCxlPSExKXt0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTtjb25zdCBuPXQuZ2VvbWV0cnk7aWYobiE9PXZvaWQgMCl7Y29uc3Qgcj1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlPT09ITAmJnIhPT12b2lkIDAmJnQuaXNJbnN0YW5jZWRNZXNoIT09ITApZm9yKGxldCBvPTAsYT1yLmNvdW50O288YTtvKyspdC5pc01lc2g9PT0hMD90LmdldFZlcnRleFBvc2l0aW9uKG8sY2UpOmNlLmZyb21CdWZmZXJBdHRyaWJ1dGUocixvKSxjZS5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KGNlKTtlbHNlIHQuYm91bmRpbmdCb3ghPT12b2lkIDA/KHQuYm91bmRpbmdCb3g9PT1udWxsJiZ0LmNvbXB1dGVCb3VuZGluZ0JveCgpLGFzLmNvcHkodC5ib3VuZGluZ0JveCkpOihuLmJvdW5kaW5nQm94PT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdCb3goKSxhcy5jb3B5KG4uYm91bmRpbmdCb3gpKSxhcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy51bmlvbihhcyl9Y29uc3Qgcz10LmNoaWxkcmVuO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKyl0aGlzLmV4cGFuZEJ5T2JqZWN0KHNbcl0sZSk7cmV0dXJuIHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC54Pj10aGlzLm1pbi54JiZ0Lng8PXRoaXMubWF4LngmJnQueT49dGhpcy5taW4ueSYmdC55PD10aGlzLm1heC55JiZ0Lno+PXRoaXMubWluLnomJnQuejw9dGhpcy5tYXguen1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9dC5taW4ueiYmdC5tYXguejw9dGhpcy5tYXguen1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLCh0LnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQubWF4Lng+PXRoaXMubWluLngmJnQubWluLng8PXRoaXMubWF4LngmJnQubWF4Lnk+PXRoaXMubWluLnkmJnQubWluLnk8PXRoaXMubWF4LnkmJnQubWF4Lno+PXRoaXMubWluLnomJnQubWluLno8PXRoaXMubWF4Lnp9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQuY2VudGVyLGNlKSxjZS5kaXN0YW5jZVRvU3F1YXJlZCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWludGVyc2VjdHNQbGFuZSh0KXtsZXQgZSxuO3JldHVybiB0Lm5vcm1hbC54PjA/KGU9dC5ub3JtYWwueCp0aGlzLm1pbi54LG49dC5ub3JtYWwueCp0aGlzLm1heC54KTooZT10Lm5vcm1hbC54KnRoaXMubWF4Lngsbj10Lm5vcm1hbC54KnRoaXMubWluLngpLHQubm9ybWFsLnk+MD8oZSs9dC5ub3JtYWwueSp0aGlzLm1pbi55LG4rPXQubm9ybWFsLnkqdGhpcy5tYXgueSk6KGUrPXQubm9ybWFsLnkqdGhpcy5tYXgueSxuKz10Lm5vcm1hbC55KnRoaXMubWluLnkpLHQubm9ybWFsLno+MD8oZSs9dC5ub3JtYWwueip0aGlzLm1pbi56LG4rPXQubm9ybWFsLnoqdGhpcy5tYXgueik6KGUrPXQubm9ybWFsLnoqdGhpcy5tYXgueixuKz10Lm5vcm1hbC56KnRoaXMubWluLnopLGU8PS10LmNvbnN0YW50JiZuPj0tdC5jb25zdGFudH1pbnRlcnNlY3RzVHJpYW5nbGUodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIoeGkpLGNzLnN1YlZlY3RvcnModGhpcy5tYXgseGkpLE5uLnN1YlZlY3RvcnModC5hLHhpKSxSbi5zdWJWZWN0b3JzKHQuYix4aSksTG4uc3ViVmVjdG9ycyh0LmMseGkpLFhlLnN1YlZlY3RvcnMoUm4sTm4pLEplLnN1YlZlY3RvcnMoTG4sUm4pLGhuLnN1YlZlY3RvcnMoTm4sTG4pO2xldCBlPVswLC1YZS56LFhlLnksMCwtSmUueixKZS55LDAsLWhuLnosaG4ueSxYZS56LDAsLVhlLngsSmUueiwwLC1KZS54LGhuLnosMCwtaG4ueCwtWGUueSxYZS54LDAsLUplLnksSmUueCwwLC1obi55LGhuLngsMF07cmV0dXJuIXJvKGUsTm4sUm4sTG4sY3MpfHwoZT1bMSwwLDAsMCwxLDAsMCwwLDFdLCFybyhlLE5uLFJuLExuLGNzKSk/ITE6KGxzLmNyb3NzVmVjdG9ycyhYZSxKZSksZT1bbHMueCxscy55LGxzLnpdLHJvKGUsTm4sUm4sTG4sY3MpKX1jbGFtcFBvaW50KHQsZSl7cmV0dXJuIGUuY29weSh0KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodCxjZSkuZGlzdGFuY2VUbyh0KX1nZXRCb3VuZGluZ1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5tYWtlRW1wdHkoKToodGhpcy5nZXRDZW50ZXIodC5jZW50ZXIpLHQucmFkaXVzPXRoaXMuZ2V0U2l6ZShjZSkubGVuZ3RoKCkqLjUpLHR9aW50ZXJzZWN0KHQpe3JldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLHRoaXMubWF4Lm1pbih0Lm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbih0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQubWluKSx0aGlzLm1heC5tYXgodC5tYXgpLHRoaXN9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90aGlzOihTZVswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxTZVsxXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxTZVsyXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxTZVszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxTZVs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxTZVs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxTZVs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxTZVs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldEZyb21Qb2ludHMoU2UpLHRoaXMpfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5taW4uYWRkKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5taW4uZXF1YWxzKHRoaXMubWluKSYmdC5tYXguZXF1YWxzKHRoaXMubWF4KX19Y29uc3QgU2U9W25ldyBULG5ldyBULG5ldyBULG5ldyBULG5ldyBULG5ldyBULG5ldyBULG5ldyBUXSxjZT1uZXcgVCxhcz1uZXcgZ3QsTm49bmV3IFQsUm49bmV3IFQsTG49bmV3IFQsWGU9bmV3IFQsSmU9bmV3IFQsaG49bmV3IFQseGk9bmV3IFQsY3M9bmV3IFQsbHM9bmV3IFQsdW49bmV3IFQ7ZnVuY3Rpb24gcm8oaSx0LGUsbixzKXtmb3IobGV0IHI9MCxvPWkubGVuZ3RoLTM7cjw9bztyKz0zKXt1bi5mcm9tQXJyYXkoaSxyKTtjb25zdCBhPXMueCpNYXRoLmFicyh1bi54KStzLnkqTWF0aC5hYnModW4ueSkrcy56Kk1hdGguYWJzKHVuLnopLGM9dC5kb3QodW4pLGw9ZS5kb3QodW4pLGg9bi5kb3QodW4pO2lmKE1hdGgubWF4KC1NYXRoLm1heChjLGwsaCksTWF0aC5taW4oYyxsLGgpKT5hKXJldHVybiExfXJldHVybiEwfWNvbnN0IGVmPW5ldyBndCx3aT1uZXcgVCxvbz1uZXcgVDtjbGFzcyBhb3tjb25zdHJ1Y3Rvcih0PW5ldyBULGU9LTEpe3RoaXMuaXNTcGhlcmU9ITAsdGhpcy5jZW50ZXI9dCx0aGlzLnJhZGl1cz1lfXNldCh0LGUpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQpLHRoaXMucmFkaXVzPWUsdGhpc31zZXRGcm9tUG9pbnRzKHQsZSl7Y29uc3Qgbj10aGlzLmNlbnRlcjtlIT09dm9pZCAwP24uY29weShlKTplZi5zZXRGcm9tUG9pbnRzKHQpLmdldENlbnRlcihuKTtsZXQgcz0wO2ZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKylzPU1hdGgubWF4KHMsbi5kaXN0YW5jZVRvU3F1YXJlZCh0W3JdKSk7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChzKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucmFkaXVzPXQucmFkaXVzLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLnJhZGl1czwwfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLmNlbnRlci5zZXQoMCwwLDApLHRoaXMucmFkaXVzPS0xLHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PXRoaXMucmFkaXVzKnRoaXMucmFkaXVzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKS10aGlzLnJhZGl1c31pbnRlcnNlY3RzU3BoZXJlKHQpe2NvbnN0IGU9dGhpcy5yYWRpdXMrdC5yYWRpdXM7cmV0dXJuIHQuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9ZSplfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX1pbnRlcnNlY3RzUGxhbmUodCl7cmV0dXJuIE1hdGguYWJzKHQuZGlzdGFuY2VUb1BvaW50KHRoaXMuY2VudGVyKSk8PXRoaXMucmFkaXVzfWNsYW1wUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHQpO3JldHVybiBlLmNvcHkodCksbj50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyYmKGUuc3ViKHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKSxlLm11bHRpcGx5U2NhbGFyKHRoaXMucmFkaXVzKS5hZGQodGhpcy5jZW50ZXIpKSxlfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT8odC5tYWtlRW1wdHkoKSx0KToodC5zZXQodGhpcy5jZW50ZXIsdGhpcy5jZW50ZXIpLHQuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpLHQpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KHQpLHRoaXMucmFkaXVzPXRoaXMucmFkaXVzKnQuZ2V0TWF4U2NhbGVPbkF4aXMoKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYWRkKHQpLHRoaXN9ZXhwYW5kQnlQb2ludCh0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz0wLHRoaXM7d2kuc3ViVmVjdG9ycyh0LHRoaXMuY2VudGVyKTtjb25zdCBlPXdpLmxlbmd0aFNxKCk7aWYoZT50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyl7Y29uc3Qgbj1NYXRoLnNxcnQoZSkscz0obi10aGlzLnJhZGl1cykqLjU7dGhpcy5jZW50ZXIuYWRkU2NhbGVkVmVjdG9yKHdpLHMvbiksdGhpcy5yYWRpdXMrPXN9cmV0dXJuIHRoaXN9dW5pb24odCl7cmV0dXJuIHQuaXNFbXB0eSgpP3RoaXM6dGhpcy5pc0VtcHR5KCk/KHRoaXMuY29weSh0KSx0aGlzKToodGhpcy5jZW50ZXIuZXF1YWxzKHQuY2VudGVyKT09PSEwP3RoaXMucmFkaXVzPU1hdGgubWF4KHRoaXMucmFkaXVzLHQucmFkaXVzKToob28uc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLmNlbnRlcikuc2V0TGVuZ3RoKHQucmFkaXVzKSx0aGlzLmV4cGFuZEJ5UG9pbnQod2kuY29weSh0LmNlbnRlcikuYWRkKG9vKSksdGhpcy5leHBhbmRCeVBvaW50KHdpLmNvcHkodC5jZW50ZXIpLnN1YihvbykpKSx0aGlzKX1lcXVhbHModCl7cmV0dXJuIHQuY2VudGVyLmVxdWFscyh0aGlzLmNlbnRlcikmJnQucmFkaXVzPT09dGhpcy5yYWRpdXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jb25zdCB6ZT1uZXcgVCxjbz1uZXcgVCxocz1uZXcgVCxZZT1uZXcgVCxsbz1uZXcgVCx1cz1uZXcgVCxobz1uZXcgVDtjbGFzcyB1b3tjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQoMCwwLC0xKSl7dGhpcy5vcmlnaW49dCx0aGlzLmRpcmVjdGlvbj1lfXNldCh0LGUpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLHRoaXMuZGlyZWN0aW9uLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQub3JpZ2luKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSx0aGlzfWF0KHQsZSl7cmV0dXJuIGUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLHQpfWxvb2tBdCh0KXtyZXR1cm4gdGhpcy5kaXJlY3Rpb24uY29weSh0KS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpLHRoaXN9cmVjYXN0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHRoaXMuYXQodCx6ZSkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sbil9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSl9ZGlzdGFuY2VTcVRvUG9pbnQodCl7Y29uc3QgZT16ZS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIGU8MD90aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCh0KTooemUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGUpLHplLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVNxVG9TZWdtZW50KHQsZSxuLHMpe2NvLmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSxocy5jb3B5KGUpLnN1Yih0KS5ub3JtYWxpemUoKSxZZS5jb3B5KHRoaXMub3JpZ2luKS5zdWIoY28pO2NvbnN0IHI9dC5kaXN0YW5jZVRvKGUpKi41LG89LXRoaXMuZGlyZWN0aW9uLmRvdChocyksYT1ZZS5kb3QodGhpcy5kaXJlY3Rpb24pLGM9LVllLmRvdChocyksbD1ZZS5sZW5ndGhTcSgpLGg9TWF0aC5hYnMoMS1vKm8pO2xldCB1LGYsZCxwO2lmKGg+MClpZih1PW8qYy1hLGY9byphLWMscD1yKmgsdT49MClpZihmPj0tcClpZihmPD1wKXtjb25zdCB5PTEvaDt1Kj15LGYqPXksZD11Kih1K28qZisyKmEpK2YqKG8qdStmKzIqYykrbH1lbHNlIGY9cix1PU1hdGgubWF4KDAsLShvKmYrYSkpLGQ9LXUqdStmKihmKzIqYykrbDtlbHNlIGY9LXIsdT1NYXRoLm1heCgwLC0obypmK2EpKSxkPS11KnUrZiooZisyKmMpK2w7ZWxzZSBmPD0tcD8odT1NYXRoLm1heCgwLC0oLW8qcithKSksZj11PjA/LXI6TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9LXUqdStmKihmKzIqYykrbCk6Zjw9cD8odT0wLGY9TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9ZiooZisyKmMpK2wpOih1PU1hdGgubWF4KDAsLShvKnIrYSkpLGY9dT4wP3I6TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9LXUqdStmKihmKzIqYykrbCk7ZWxzZSBmPW8+MD8tcjpyLHU9TWF0aC5tYXgoMCwtKG8qZithKSksZD0tdSp1K2YqKGYrMipjKStsO3JldHVybiBuJiZuLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbix1KSxzJiZzLmNvcHkoY28pLmFkZFNjYWxlZFZlY3RvcihocyxmKSxkfWludGVyc2VjdFNwaGVyZSh0LGUpe3plLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5vcmlnaW4pO2NvbnN0IG49emUuZG90KHRoaXMuZGlyZWN0aW9uKSxzPXplLmRvdCh6ZSktbipuLHI9dC5yYWRpdXMqdC5yYWRpdXM7aWYocz5yKXJldHVybiBudWxsO2NvbnN0IG89TWF0aC5zcXJ0KHItcyksYT1uLW8sYz1uK287cmV0dXJuIGM8MD9udWxsOmE8MD90aGlzLmF0KGMsZSk6dGhpcy5hdChhLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31kaXN0YW5jZVRvUGxhbmUodCl7Y29uc3QgZT10Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKGU9PT0wKXJldHVybiB0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik9PT0wPzA6bnVsbDtjb25zdCBuPS0odGhpcy5vcmlnaW4uZG90KHQubm9ybWFsKSt0LmNvbnN0YW50KS9lO3JldHVybiBuPj0wP246bnVsbH1pbnRlcnNlY3RQbGFuZSh0LGUpe2NvbnN0IG49dGhpcy5kaXN0YW5jZVRvUGxhbmUodCk7cmV0dXJuIG49PT1udWxsP251bGw6dGhpcy5hdChuLGUpfWludGVyc2VjdHNQbGFuZSh0KXtjb25zdCBlPXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTtyZXR1cm4gZT09PTB8fHQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZTwwfWludGVyc2VjdEJveCh0LGUpe2xldCBuLHMscixvLGEsYztjb25zdCBsPTEvdGhpcy5kaXJlY3Rpb24ueCxoPTEvdGhpcy5kaXJlY3Rpb24ueSx1PTEvdGhpcy5kaXJlY3Rpb24ueixmPXRoaXMub3JpZ2luO3JldHVybiBsPj0wPyhuPSh0Lm1pbi54LWYueCkqbCxzPSh0Lm1heC54LWYueCkqbCk6KG49KHQubWF4LngtZi54KSpsLHM9KHQubWluLngtZi54KSpsKSxoPj0wPyhyPSh0Lm1pbi55LWYueSkqaCxvPSh0Lm1heC55LWYueSkqaCk6KHI9KHQubWF4LnktZi55KSpoLG89KHQubWluLnktZi55KSpoKSxuPm98fHI+c3x8KChyPm58fGlzTmFOKG4pKSYmKG49ciksKG88c3x8aXNOYU4ocykpJiYocz1vKSx1Pj0wPyhhPSh0Lm1pbi56LWYueikqdSxjPSh0Lm1heC56LWYueikqdSk6KGE9KHQubWF4LnotZi56KSp1LGM9KHQubWluLnotZi56KSp1KSxuPmN8fGE+cyl8fCgoYT5ufHxuIT09bikmJihuPWEpLChjPHN8fHMhPT1zKSYmKHM9YyksczwwKT9udWxsOnRoaXMuYXQobj49MD9uOnMsZSl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3godCx6ZSkhPT1udWxsfWludGVyc2VjdFRyaWFuZ2xlKHQsZSxuLHMscil7bG8uc3ViVmVjdG9ycyhlLHQpLHVzLnN1YlZlY3RvcnMobix0KSxoby5jcm9zc1ZlY3RvcnMobG8sdXMpO2xldCBvPXRoaXMuZGlyZWN0aW9uLmRvdChobyksYTtpZihvPjApe2lmKHMpcmV0dXJuIG51bGw7YT0xfWVsc2UgaWYobzwwKWE9LTEsbz0tbztlbHNlIHJldHVybiBudWxsO1llLnN1YlZlY3RvcnModGhpcy5vcmlnaW4sdCk7Y29uc3QgYz1hKnRoaXMuZGlyZWN0aW9uLmRvdCh1cy5jcm9zc1ZlY3RvcnMoWWUsdXMpKTtpZihjPDApcmV0dXJuIG51bGw7Y29uc3QgbD1hKnRoaXMuZGlyZWN0aW9uLmRvdChsby5jcm9zcyhZZSkpO2lmKGw8MHx8YytsPm8pcmV0dXJuIG51bGw7Y29uc3QgaD0tYSpZZS5kb3QoaG8pO3JldHVybiBoPDA/bnVsbDp0aGlzLmF0KGgvbyxyKX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCh0KSx0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24odCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQub3JpZ2luLmVxdWFscyh0aGlzLm9yaWdpbikmJnQuZGlyZWN0aW9uLmVxdWFscyh0aGlzLmRpcmVjdGlvbil9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jbGFzcyBzdHtjb25zdHJ1Y3Rvcih0LGUsbixzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxtKXtzdC5wcm90b3R5cGUuaXNNYXRyaXg0PSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdLHQhPT12b2lkIDAmJnRoaXMuc2V0KHQsZSxuLHMscixvLGEsYyxsLGgsdSxmLGQscCx5LG0pfXNldCh0LGUsbixzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxtKXtjb25zdCBnPXRoaXMuZWxlbWVudHM7cmV0dXJuIGdbMF09dCxnWzRdPWUsZ1s4XT1uLGdbMTJdPXMsZ1sxXT1yLGdbNV09byxnWzldPWEsZ1sxM109YyxnWzJdPWwsZ1s2XT1oLGdbMTBdPXUsZ1sxNF09ZixnWzNdPWQsZ1s3XT1wLGdbMTFdPXksZ1sxNV09bSx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHN0KCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sZVs5XT1uWzldLGVbMTBdPW5bMTBdLGVbMTFdPW5bMTFdLGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLGVbMTVdPW5bMTVdLHRoaXN9Y29weVBvc2l0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLHRoaXN9c2V0RnJvbU1hdHJpeDModCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbM10sZVs2XSwwLGVbMV0sZVs0XSxlWzddLDAsZVsyXSxlWzVdLGVbOF0sMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpLHRoaXN9bWFrZUJhc2lzKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodC54LGUueCxuLngsMCx0LnksZS55LG4ueSwwLHQueixlLnosbi56LDAsMCwwLDAsMSksdGhpc31leHRyYWN0Um90YXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cyxzPTEvT24uc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLHI9MS9Pbi5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCksbz0xL09uLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gZVswXT1uWzBdKnMsZVsxXT1uWzFdKnMsZVsyXT1uWzJdKnMsZVszXT0wLGVbNF09bls0XSpyLGVbNV09bls1XSpyLGVbNl09bls2XSpyLGVbN109MCxlWzhdPW5bOF0qbyxlWzldPW5bOV0qbyxlWzEwXT1uWzEwXSpvLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21FdWxlcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10Lngscz10Lnkscj10Lnosbz1NYXRoLmNvcyhuKSxhPU1hdGguc2luKG4pLGM9TWF0aC5jb3MocyksbD1NYXRoLnNpbihzKSxoPU1hdGguY29zKHIpLHU9TWF0aC5zaW4ocik7aWYodC5vcmRlcj09PSJYWVoiKXtjb25zdCBmPW8qaCxkPW8qdSxwPWEqaCx5PWEqdTtlWzBdPWMqaCxlWzRdPS1jKnUsZVs4XT1sLGVbMV09ZCtwKmwsZVs1XT1mLXkqbCxlWzldPS1hKmMsZVsyXT15LWYqbCxlWzZdPXArZCpsLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWVhaIil7Y29uc3QgZj1jKmgsZD1jKnUscD1sKmgseT1sKnU7ZVswXT1mK3kqYSxlWzRdPXAqYS1kLGVbOF09bypsLGVbMV09byp1LGVbNV09bypoLGVbOV09LWEsZVsyXT1kKmEtcCxlWzZdPXkrZiphLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWlhZIil7Y29uc3QgZj1jKmgsZD1jKnUscD1sKmgseT1sKnU7ZVswXT1mLXkqYSxlWzRdPS1vKnUsZVs4XT1wK2QqYSxlWzFdPWQrcCphLGVbNV09bypoLGVbOV09eS1mKmEsZVsyXT0tbypsLGVbNl09YSxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IlpZWCIpe2NvbnN0IGY9bypoLGQ9byp1LHA9YSpoLHk9YSp1O2VbMF09YypoLGVbNF09cCpsLWQsZVs4XT1mKmwreSxlWzFdPWMqdSxlWzVdPXkqbCtmLGVbOV09ZCpsLXAsZVsyXT0tbCxlWzZdPWEqYyxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IllaWCIpe2NvbnN0IGY9bypjLGQ9bypsLHA9YSpjLHk9YSpsO2VbMF09YypoLGVbNF09eS1mKnUsZVs4XT1wKnUrZCxlWzFdPXUsZVs1XT1vKmgsZVs5XT0tYSpoLGVbMl09LWwqaCxlWzZdPWQqdStwLGVbMTBdPWYteSp1fWVsc2UgaWYodC5vcmRlcj09PSJYWlkiKXtjb25zdCBmPW8qYyxkPW8qbCxwPWEqYyx5PWEqbDtlWzBdPWMqaCxlWzRdPS11LGVbOF09bCpoLGVbMV09Zip1K3ksZVs1XT1vKmgsZVs5XT1kKnUtcCxlWzJdPXAqdS1kLGVbNl09YSpoLGVbMTBdPXkqdStmfXJldHVybiBlWzNdPTAsZVs3XT0wLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLmNvbXBvc2UobmYsdCxzZil9bG9va0F0KHQsZSxuKXtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuICR0LnN1YlZlY3RvcnModCxlKSwkdC5sZW5ndGhTcSgpPT09MCYmKCR0Lno9MSksJHQubm9ybWFsaXplKCksamUuY3Jvc3NWZWN0b3JzKG4sJHQpLGplLmxlbmd0aFNxKCk9PT0wJiYoTWF0aC5hYnMobi56KT09PTE/JHQueCs9MWUtNDokdC56Kz0xZS00LCR0Lm5vcm1hbGl6ZSgpLGplLmNyb3NzVmVjdG9ycyhuLCR0KSksamUubm9ybWFsaXplKCksZnMuY3Jvc3NWZWN0b3JzKCR0LGplKSxzWzBdPWplLngsc1s0XT1mcy54LHNbOF09JHQueCxzWzFdPWplLnksc1s1XT1mcy55LHNbOV09JHQueSxzWzJdPWplLnosc1s2XT1mcy56LHNbMTBdPSR0LnosdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscz1lLmVsZW1lbnRzLHI9dGhpcy5lbGVtZW50cyxvPW5bMF0sYT1uWzRdLGM9bls4XSxsPW5bMTJdLGg9blsxXSx1PW5bNV0sZj1uWzldLGQ9blsxM10scD1uWzJdLHk9bls2XSxtPW5bMTBdLGc9blsxNF0sYj1uWzNdLHc9bls3XSx4PW5bMTFdLE09blsxNV0sQT1zWzBdLF89c1s0XSx2PXNbOF0sUD1zWzEyXSx6PXNbMV0sUz1zWzVdLEM9c1s5XSxFPXNbMTNdLEY9c1syXSxCPXNbNl0sST1zWzEwXSxrPXNbMTRdLEQ9c1szXSxWPXNbN10saj1zWzExXSxkdD1zWzE1XTtyZXR1cm4gclswXT1vKkErYSp6K2MqRitsKkQscls0XT1vKl8rYSpTK2MqQitsKlYscls4XT1vKnYrYSpDK2MqSStsKmosclsxMl09bypQK2EqRStjKmsrbCpkdCxyWzFdPWgqQSt1KnorZipGK2QqRCxyWzVdPWgqXyt1KlMrZipCK2QqVixyWzldPWgqdit1KkMrZipJK2QqaixyWzEzXT1oKlArdSpFK2YqaytkKmR0LHJbMl09cCpBK3kqeittKkYrZypELHJbNl09cCpfK3kqUyttKkIrZypWLHJbMTBdPXAqdit5KkMrbSpJK2cqaixyWzE0XT1wKlAreSpFK20qaytnKmR0LHJbM109YipBK3cqeit4KkYrTSpELHJbN109YipfK3cqUyt4KkIrTSpWLHJbMTFdPWIqdit3KkMreCpJK00qaixyWzE1XT1iKlArdypFK3gqaytNKmR0LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFs0XSxzPXRbOF0scj10WzEyXSxvPXRbMV0sYT10WzVdLGM9dFs5XSxsPXRbMTNdLGg9dFsyXSx1PXRbNl0sZj10WzEwXSxkPXRbMTRdLHA9dFszXSx5PXRbN10sbT10WzExXSxnPXRbMTVdO3JldHVybiBwKigrcipjKnUtcypsKnUtciphKmYrbipsKmYrcyphKmQtbipjKmQpK3kqKCtlKmMqZC1lKmwqZityKm8qZi1zKm8qZCtzKmwqaC1yKmMqaCkrbSooK2UqbCp1LWUqYSpkLXIqbyp1K24qbypkK3IqYSpoLW4qbCpoKStnKigtcyphKmgtZSpjKnUrZSphKmYrcypvKnUtbipvKmYrbipjKmgpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxuKXtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhzWzEyXT10Lngsc1sxM109dC55LHNbMTRdPXQueik6KHNbMTJdPXQsc1sxM109ZSxzWzE0XT1uKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sbD10WzddLGg9dFs4XSx1PXRbOV0sZj10WzEwXSxkPXRbMTFdLHA9dFsxMl0seT10WzEzXSxtPXRbMTRdLGc9dFsxNV0sYj11Km0qbC15KmYqbCt5KmMqZC1hKm0qZC11KmMqZythKmYqZyx3PXAqZipsLWgqbSpsLXAqYypkK28qbSpkK2gqYypnLW8qZipnLHg9aCp5KmwtcCp1KmwrcCphKmQtbyp5KmQtaCphKmcrbyp1KmcsTT1wKnUqYy1oKnkqYy1wKmEqZitvKnkqZitoKmEqbS1vKnUqbSxBPWUqYituKncrcyp4K3IqTTtpZihBPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgXz0xL0E7cmV0dXJuIHRbMF09YipfLHRbMV09KHkqZipyLXUqbSpyLXkqcypkK24qbSpkK3UqcypnLW4qZipnKSpfLHRbMl09KGEqbSpyLXkqYypyK3kqcypsLW4qbSpsLWEqcypnK24qYypnKSpfLHRbM109KHUqYypyLWEqZipyLXUqcypsK24qZipsK2EqcypkLW4qYypkKSpfLHRbNF09dypfLHRbNV09KGgqbSpyLXAqZipyK3AqcypkLWUqbSpkLWgqcypnK2UqZipnKSpfLHRbNl09KHAqYypyLW8qbSpyLXAqcypsK2UqbSpsK28qcypnLWUqYypnKSpfLHRbN109KG8qZipyLWgqYypyK2gqcypsLWUqZipsLW8qcypkK2UqYypkKSpfLHRbOF09eCpfLHRbOV09KHAqdSpyLWgqeSpyLXAqbipkK2UqeSpkK2gqbipnLWUqdSpnKSpfLHRbMTBdPShvKnkqci1wKmEqcitwKm4qbC1lKnkqbC1vKm4qZytlKmEqZykqXyx0WzExXT0oaCphKnItbyp1KnItaCpuKmwrZSp1KmwrbypuKmQtZSphKmQpKl8sdFsxMl09TSpfLHRbMTNdPShoKnkqcy1wKnUqcytwKm4qZi1lKnkqZi1oKm4qbStlKnUqbSkqXyx0WzE0XT0ocCphKnMtbyp5KnMtcCpuKmMrZSp5KmMrbypuKm0tZSphKm0pKl8sdFsxNV09KG8qdSpzLWgqYSpzK2gqbipjLWUqdSpjLW8qbipmK2UqYSpmKSpfLHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LHM9dC55LHI9dC56O3JldHVybiBlWzBdKj1uLGVbNF0qPXMsZVs4XSo9cixlWzFdKj1uLGVbNV0qPXMsZVs5XSo9cixlWzJdKj1uLGVbNl0qPXMsZVsxMF0qPXIsZVszXSo9bixlWzddKj1zLGVbMTFdKj1yLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSxuPXRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLHM9dFs4XSp0WzhdK3RbOV0qdFs5XSt0WzEwXSp0WzEwXTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGUsbixzKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxuKXtyZXR1cm4gdC5pc1ZlY3RvcjM/dGhpcy5zZXQoMSwwLDAsdC54LDAsMSwwLHQueSwwLDAsMSx0LnosMCwwLDAsMSk6dGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLG4sMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxuLDAsMCwxLDAsMCwtbiwwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsMCxuLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxzPU1hdGguc2luKGUpLHI9MS1uLG89dC54LGE9dC55LGM9dC56LGw9cipvLGg9ciphO3JldHVybiB0aGlzLnNldChsKm8rbixsKmEtcypjLGwqYytzKmEsMCxsKmErcypjLGgqYStuLGgqYy1zKm8sMCxsKmMtcyphLGgqYytzKm8scipjKmMrbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxuLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLG4scyxyLG8pe3JldHVybiB0aGlzLnNldCgxLG4sciwwLHQsMSxvLDAsZSxzLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLG4pe2NvbnN0IHM9dGhpcy5lbGVtZW50cyxyPWUuX3gsbz1lLl95LGE9ZS5feixjPWUuX3csbD1yK3IsaD1vK28sdT1hK2EsZj1yKmwsZD1yKmgscD1yKnUseT1vKmgsbT1vKnUsZz1hKnUsYj1jKmwsdz1jKmgseD1jKnUsTT1uLngsQT1uLnksXz1uLno7cmV0dXJuIHNbMF09KDEtKHkrZykpKk0sc1sxXT0oZCt4KSpNLHNbMl09KHAtdykqTSxzWzNdPTAsc1s0XT0oZC14KSpBLHNbNV09KDEtKGYrZykpKkEsc1s2XT0obStiKSpBLHNbN109MCxzWzhdPShwK3cpKl8sc1s5XT0obS1iKSpfLHNbMTBdPSgxLShmK3kpKSpfLHNbMTFdPTAsc1sxMl09dC54LHNbMTNdPXQueSxzWzE0XT10Lnosc1sxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUsbil7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO2xldCByPU9uLnNldChzWzBdLHNbMV0sc1syXSkubGVuZ3RoKCk7Y29uc3Qgbz1Pbi5zZXQoc1s0XSxzWzVdLHNbNl0pLmxlbmd0aCgpLGE9T24uc2V0KHNbOF0sc1s5XSxzWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihyPS1yKSx0Lng9c1sxMl0sdC55PXNbMTNdLHQuej1zWzE0XSxsZS5jb3B5KHRoaXMpO2NvbnN0IGw9MS9yLGg9MS9vLHU9MS9hO3JldHVybiBsZS5lbGVtZW50c1swXSo9bCxsZS5lbGVtZW50c1sxXSo9bCxsZS5lbGVtZW50c1syXSo9bCxsZS5lbGVtZW50c1s0XSo9aCxsZS5lbGVtZW50c1s1XSo9aCxsZS5lbGVtZW50c1s2XSo9aCxsZS5lbGVtZW50c1s4XSo9dSxsZS5lbGVtZW50c1s5XSo9dSxsZS5lbGVtZW50c1sxMF0qPXUsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgobGUpLG4ueD1yLG4ueT1vLG4uej1hLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxuLHMscixvLGE9MmUzKXtjb25zdCBjPXRoaXMuZWxlbWVudHMsbD0yKnIvKGUtdCksaD0yKnIvKG4tcyksdT0oZSt0KS8oZS10KSxmPShuK3MpLyhuLXMpO2xldCBkLHA7aWYoYT09PTJlMylkPS0obytyKS8oby1yKSxwPS0yKm8qci8oby1yKTtlbHNlIGlmKGE9PT0yMDAxKWQ9LW8vKG8tcikscD0tbypyLyhvLXIpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBjWzBdPWwsY1s0XT0wLGNbOF09dSxjWzEyXT0wLGNbMV09MCxjWzVdPWgsY1s5XT1mLGNbMTNdPTAsY1syXT0wLGNbNl09MCxjWzEwXT1kLGNbMTRdPXAsY1szXT0wLGNbN109MCxjWzExXT0tMSxjWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUsbixzLHIsbyxhPTJlMyl7Y29uc3QgYz10aGlzLmVsZW1lbnRzLGw9MS8oZS10KSxoPTEvKG4tcyksdT0xLyhvLXIpLGY9KGUrdCkqbCxkPShuK3MpKmg7bGV0IHAseTtpZihhPT09MmUzKXA9KG8rcikqdSx5PS0yKnU7ZWxzZSBpZihhPT09MjAwMSlwPXIqdSx5PS0xKnU7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZU9ydGhvZ3JhcGhpYygpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBjWzBdPTIqbCxjWzRdPTAsY1s4XT0wLGNbMTJdPS1mLGNbMV09MCxjWzVdPTIqaCxjWzldPTAsY1sxM109LWQsY1syXT0wLGNbNl09MCxjWzEwXT15LGNbMTRdPS1wLGNbM109MCxjWzddPTAsY1sxMV09MCxjWzE1XT0xLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCBzPTA7czwxNjtzKyspaWYoZVtzXSE9PW5bc10pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDE2O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0W2UrOV09bls5XSx0W2UrMTBdPW5bMTBdLHRbZSsxMV09blsxMV0sdFtlKzEyXT1uWzEyXSx0W2UrMTNdPW5bMTNdLHRbZSsxNF09blsxNF0sdFtlKzE1XT1uWzE1XSx0fX1jb25zdCBPbj1uZXcgVCxsZT1uZXcgc3QsbmY9bmV3IFQoMCwwLDApLHNmPW5ldyBUKDEsMSwxKSxqZT1uZXcgVCxmcz1uZXcgVCwkdD1uZXcgVCxTYz1uZXcgc3QsemM9bmV3IGdpO2NsYXNzIGJpe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHM9YmkuREVGQVVMVF9PUkRFUil7dGhpcy5pc0V1bGVyPSEwLHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPXN9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IG9yZGVyKCl7cmV0dXJuIHRoaXMuX29yZGVyfXNldCBvcmRlcih0KXt0aGlzLl9vcmRlcj10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4scz10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPXMsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fb3JkZXIpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC5feCx0aGlzLl95PXQuX3ksdGhpcy5fej10Ll96LHRoaXMuX29yZGVyPXQuX29yZGVyLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0LGU9dGhpcy5fb3JkZXIsbj0hMCl7Y29uc3Qgcz10LmVsZW1lbnRzLHI9c1swXSxvPXNbNF0sYT1zWzhdLGM9c1sxXSxsPXNbNV0saD1zWzldLHU9c1syXSxmPXNbNl0sZD1zWzEwXTtzd2l0Y2goZSl7Y2FzZSJYWVoiOnRoaXMuX3k9TWF0aC5hc2luKFooYSwtMSwxKSksTWF0aC5hYnMoYSk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxkKSx0aGlzLl96PU1hdGguYXRhbjIoLW8scikpOih0aGlzLl94PU1hdGguYXRhbjIoZixsKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PU1hdGguYXNpbigtWihoLC0xLDEpKSxNYXRoLmFicyhoKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKGEsZCksdGhpcy5fej1NYXRoLmF0YW4yKGMsbCkpOih0aGlzLl95PU1hdGguYXRhbjIoLXUsciksdGhpcy5fej0wKTticmVhaztjYXNlIlpYWSI6dGhpcy5feD1NYXRoLmFzaW4oWihmLC0xLDEpKSxNYXRoLmFicyhmKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKC11LGQpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxsKSk6KHRoaXMuX3k9MCx0aGlzLl96PU1hdGguYXRhbjIoYyxyKSk7YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3k9TWF0aC5hc2luKC1aKHUsLTEsMSkpLE1hdGguYWJzKHUpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZixkKSx0aGlzLl96PU1hdGguYXRhbjIoYyxyKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLW8sbCkpO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl96PU1hdGguYXNpbihaKGMsLTEsMSkpLE1hdGguYWJzKGMpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWgsbCksdGhpcy5feT1NYXRoLmF0YW4yKC11LHIpKToodGhpcy5feD0wLHRoaXMuX3k9TWF0aC5hdGFuMihhLGQpKTticmVhaztjYXNlIlhaWSI6dGhpcy5fej1NYXRoLmFzaW4oLVoobywtMSwxKSksTWF0aC5hYnMobyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihmLGwpLHRoaXMuX3k9TWF0aC5hdGFuMihhLHIpKToodGhpcy5feD1NYXRoLmF0YW4yKC1oLGQpLHRoaXMuX3k9MCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIitlKX1yZXR1cm4gdGhpcy5fb3JkZXI9ZSxuPT09ITAmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21RdWF0ZXJuaW9uKHQsZSxuKXtyZXR1cm4gU2MubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCksdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoU2MsZSxuKX1zZXRGcm9tVmVjdG9yMyh0LGU9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLnNldCh0LngsdC55LHQueixlKX1yZW9yZGVyKHQpe3JldHVybiB6Yy5zZXRGcm9tRXVsZXIodGhpcyksdGhpcy5zZXRGcm9tUXVhdGVybmlvbih6Yyx0KX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX29yZGVyPT09dGhpcy5fb3JkZXJ9ZnJvbUFycmF5KHQpe3JldHVybiB0aGlzLl94PXRbMF0sdGhpcy5feT10WzFdLHRoaXMuX3o9dFsyXSx0WzNdIT09dm9pZCAwJiYodGhpcy5fb3JkZXI9dFszXSksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5feCx0W2UrMV09dGhpcy5feSx0W2UrMl09dGhpcy5feix0W2UrM109dGhpcy5fb3JkZXIsdH1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX29yZGVyfX1iaS5ERUZBVUxUX09SREVSPSJYWVoiO2NsYXNzIHJme2NvbnN0cnVjdG9yKCl7dGhpcy5tYXNrPTF9c2V0KHQpe3RoaXMubWFzaz0oMTw8dHwwKT4+PjB9ZW5hYmxlKHQpe3RoaXMubWFza3w9MTw8dHwwfWVuYWJsZUFsbCgpe3RoaXMubWFzaz0tMX10b2dnbGUodCl7dGhpcy5tYXNrXj0xPDx0fDB9ZGlzYWJsZSh0KXt0aGlzLm1hc2smPX4oMTw8dHwwKX1kaXNhYmxlQWxsKCl7dGhpcy5tYXNrPTB9dGVzdCh0KXtyZXR1cm4odGhpcy5tYXNrJnQubWFzaykhPT0wfWlzRW5hYmxlZCh0KXtyZXR1cm4odGhpcy5tYXNrJigxPDx0fDApKSE9PTB9fWxldCBvZj0wO2NvbnN0IFRjPW5ldyBULERuPW5ldyBnaSxUZT1uZXcgc3QsZHM9bmV3IFQsTWk9bmV3IFQsYWY9bmV3IFQsY2Y9bmV3IGdpLFBjPW5ldyBUKDEsMCwwKSxFYz1uZXcgVCgwLDEsMCksQ2M9bmV3IFQoMCwwLDEpLEJjPXt0eXBlOiJhZGRlZCJ9LGxmPXt0eXBlOiJyZW1vdmVkIn0sJG49e3R5cGU6ImNoaWxkYWRkZWQiLGNoaWxkOm51bGx9LGZvPXt0eXBlOiJjaGlsZHJlbW92ZWQiLGNoaWxkOm51bGx9O2NsYXNzIFBlIGV4dGVuZHMgb3N7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNPYmplY3QzRD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpvZisrfSksdGhpcy51dWlkPUZuKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iT2JqZWN0M0QiLHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnVwPVBlLkRFRkFVTFRfVVAuY2xvbmUoKTtjb25zdCB0PW5ldyBULGU9bmV3IGJpLG49bmV3IGdpLHM9bmV3IFQoMSwxLDEpO2Z1bmN0aW9uIHIoKXtuLnNldEZyb21FdWxlcihlLCExKX1mdW5jdGlvbiBvKCl7ZS5zZXRGcm9tUXVhdGVybmlvbihuLHZvaWQgMCwhMSl9ZS5fb25DaGFuZ2Uociksbi5fb25DaGFuZ2UobyksT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9zaXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnR9LHJvdGF0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplfSxxdWF0ZXJuaW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpufSxzY2FsZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6c30sbW9kZWxWaWV3TWF0cml4Ont2YWx1ZTpuZXcgc3R9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3IGdlfX0pLHRoaXMubWF0cml4PW5ldyBzdCx0aGlzLm1hdHJpeFdvcmxkPW5ldyBzdCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9UGUuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9UGUuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHRoaXMubGF5ZXJzPW5ldyByZix0aGlzLnZpc2libGU9ITAsdGhpcy5jYXN0U2hhZG93PSExLHRoaXMucmVjZWl2ZVNoYWRvdz0hMSx0aGlzLmZydXN0dW1DdWxsZWQ9ITAsdGhpcy5yZW5kZXJPcmRlcj0wLHRoaXMuYW5pbWF0aW9ucz1bXSx0aGlzLmN1c3RvbURlcHRoTWF0ZXJpYWw9dm9pZCAwLHRoaXMuY3VzdG9tRGlzdGFuY2VNYXRlcmlhbD12b2lkIDAsdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVNoYWRvdygpe31vbkFmdGVyU2hhZG93KCl7fW9uQmVmb3JlUmVuZGVyKCl7fW9uQWZ0ZXJSZW5kZXIoKXt9YXBwbHlNYXRyaXg0KHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSh0KSx0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodCksdGhpc31zZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUodCxlKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0LGUpfXNldFJvdGF0aW9uRnJvbUV1bGVyKHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIodCwhMCl9c2V0Um90YXRpb25Gcm9tTWF0cml4KHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodCl9c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbih0KXt0aGlzLnF1YXRlcm5pb24uY29weSh0KX1yb3RhdGVPbkF4aXModCxlKXtyZXR1cm4gRG4uc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShEbiksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiBEbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KERuKSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKFBjLHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKEVjLHQpfXJvdGF0ZVoodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKENjLHQpfXRyYW5zbGF0ZU9uQXhpcyh0LGUpe3JldHVybiBUYy5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKFRjLm11bHRpcGx5U2NhbGFyKGUpKSx0aGlzfXRyYW5zbGF0ZVgodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKFBjLHQpfXRyYW5zbGF0ZVkodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKEVjLHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKENjLHQpfWxvY2FsVG9Xb3JsZCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9d29ybGRUb0xvY2FsKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NChUZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQodCxlLG4pe3QuaXNWZWN0b3IzP2RzLmNvcHkodCk6ZHMuc2V0KHQsZSxuKTtjb25zdCBzPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLE1pLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/VGUubG9va0F0KE1pLGRzLHRoaXMudXApOlRlLmxvb2tBdChkcyxNaSx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KFRlKSxzJiYoVGUuZXh0cmFjdFJvdGF0aW9uKHMubWF0cml4V29ybGQpLERuLnNldEZyb21Sb3RhdGlvbk1hdHJpeChUZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KERuLmludmVydCgpKSl9YWRkKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCBlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0aGlzLmFkZChhcmd1bWVudHNbZV0pO3JldHVybiB0aGlzfXJldHVybiB0PT09dGhpcz8oY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIix0KSx0aGlzKToodCYmdC5pc09iamVjdDNEPyh0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LmRpc3BhdGNoRXZlbnQoQmMpLCRuLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KCRuKSwkbi5jaGlsZD1udWxsKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIix0KSx0aGlzKX1yZW1vdmUodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1tuXSk7cmV0dXJuIHRoaXN9Y29uc3QgZT10aGlzLmNoaWxkcmVuLmluZGV4T2YodCk7cmV0dXJuIGUhPT0tMSYmKHQucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbi5zcGxpY2UoZSwxKSx0LmRpc3BhdGNoRXZlbnQobGYpLGZvLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KGZvKSxmby5jaGlsZD1udWxsKSx0aGlzfXJlbW92ZUZyb21QYXJlbnQoKXtjb25zdCB0PXRoaXMucGFyZW50O3JldHVybiB0IT09bnVsbCYmdC5yZW1vdmUodGhpcyksdGhpc31jbGVhcigpe3JldHVybiB0aGlzLnJlbW92ZSguLi50aGlzLmNoaWxkcmVuKX1hdHRhY2godCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFRlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksdC5wYXJlbnQhPT1udWxsJiYodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFRlLm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQoVGUpLHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQudXBkYXRlV29ybGRNYXRyaXgoITEsITApLHQuZGlzcGF0Y2hFdmVudChCYyksJG4uY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoJG4pLCRuLmNoaWxkPW51bGwsdGhpc31nZXRPYmplY3RCeUlkKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoImlkIix0KX1nZXRPYmplY3RCeU5hbWUodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsdCl9Z2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpe2lmKHRoaXNbdF09PT1lKXJldHVybiB0aGlzO2ZvcihsZXQgbj0wLHM9dGhpcy5jaGlsZHJlbi5sZW5ndGg7bjxzO24rKyl7Y29uc3Qgbz10aGlzLmNoaWxkcmVuW25dLmdldE9iamVjdEJ5UHJvcGVydHkodCxlKTtpZihvIT09dm9pZCAwKXJldHVybiBvfX1nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUsbj1bXSl7dGhpc1t0XT09PWUmJm4ucHVzaCh0aGlzKTtjb25zdCBzPXRoaXMuY2hpbGRyZW47Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cisrKXNbcl0uZ2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLG4pO3JldHVybiBufWdldFdvcmxkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfWdldFdvcmxkUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoTWksdCxhZiksdH1nZXRXb3JsZFNjYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShNaSxjZix0KSx0fWdldFdvcmxkRGlyZWN0aW9uKHQpe3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpO2NvbnN0IGU9dGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztyZXR1cm4gdC5zZXQoZVs4XSxlWzldLGVbMTBdKS5ub3JtYWxpemUoKX1yYXljYXN0KCl7fXRyYXZlcnNlKHQpe3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyllW25dLnRyYXZlcnNlKHQpfXRyYXZlcnNlVmlzaWJsZSh0KXtpZih0aGlzLnZpc2libGU9PT0hMSlyZXR1cm47dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscz1lLmxlbmd0aDtuPHM7bisrKWVbbl0udHJhdmVyc2VWaXNpYmxlKHQpfXRyYXZlcnNlQW5jZXN0b3JzKHQpe2NvbnN0IGU9dGhpcy5wYXJlbnQ7ZSE9PW51bGwmJih0KGUpLGUudHJhdmVyc2VBbmNlc3RvcnModCkpfXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSwodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHx0KSYmKHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITAmJih0aGlzLnBhcmVudD09PW51bGw/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyllW25dLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7Y29uc3Qgbj10aGlzLnBhcmVudDtpZih0PT09ITAmJm4hPT1udWxsJiZuLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmKHRoaXMucGFyZW50PT09bnVsbD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLGU9PT0hMCl7Y29uc3Qgcz10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKylzW3JdLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciLG49e307ZSYmKHQ9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e30sc2tlbGV0b25zOnt9LGFuaW1hdGlvbnM6e30sbm9kZXM6e319LG4ubWV0YWRhdGE9e3ZlcnNpb246NC42LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7Y29uc3Qgcz17fTtzLnV1aWQ9dGhpcy51dWlkLHMudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJihzLm5hbWU9dGhpcy5uYW1lKSx0aGlzLmNhc3RTaGFkb3c9PT0hMCYmKHMuY2FzdFNoYWRvdz0hMCksdGhpcy5yZWNlaXZlU2hhZG93PT09ITAmJihzLnJlY2VpdmVTaGFkb3c9ITApLHRoaXMudmlzaWJsZT09PSExJiYocy52aXNpYmxlPSExKSx0aGlzLmZydXN0dW1DdWxsZWQ9PT0hMSYmKHMuZnJ1c3R1bUN1bGxlZD0hMSksdGhpcy5yZW5kZXJPcmRlciE9PTAmJihzLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYocy51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxzLmxheWVycz10aGlzLmxheWVycy5tYXNrLHMubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSxzLnVwPXRoaXMudXAudG9BcnJheSgpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT09PSExJiYocy5tYXRyaXhBdXRvVXBkYXRlPSExKSx0aGlzLmlzSW5zdGFuY2VkTWVzaCYmKHMudHlwZT0iSW5zdGFuY2VkTWVzaCIscy5jb3VudD10aGlzLmNvdW50LHMuaW5zdGFuY2VNYXRyaXg9dGhpcy5pbnN0YW5jZU1hdHJpeC50b0pTT04oKSx0aGlzLmluc3RhbmNlQ29sb3IhPT1udWxsJiYocy5pbnN0YW5jZUNvbG9yPXRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKSkpLHRoaXMuaXNCYXRjaGVkTWVzaCYmKHMudHlwZT0iQmF0Y2hlZE1lc2giLHMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQscy5zb3J0T2JqZWN0cz10aGlzLnNvcnRPYmplY3RzLHMuZHJhd1Jhbmdlcz10aGlzLl9kcmF3UmFuZ2VzLHMucmVzZXJ2ZWRSYW5nZXM9dGhpcy5fcmVzZXJ2ZWRSYW5nZXMscy5nZW9tZXRyeUluZm89dGhpcy5fZ2VvbWV0cnlJbmZvLm1hcChhPT5aZShGdCh7fSxhKSx7Ym91bmRpbmdCb3g6YS5ib3VuZGluZ0JveD97bWluOmEuYm91bmRpbmdCb3gubWluLnRvQXJyYXkoKSxtYXg6YS5ib3VuZGluZ0JveC5tYXgudG9BcnJheSgpfTp2b2lkIDAsYm91bmRpbmdTcGhlcmU6YS5ib3VuZGluZ1NwaGVyZT97cmFkaXVzOmEuYm91bmRpbmdTcGhlcmUucmFkaXVzLGNlbnRlcjphLmJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCl9OnZvaWQgMH0pKSxzLmluc3RhbmNlSW5mbz10aGlzLl9pbnN0YW5jZUluZm8ubWFwKGE9PkZ0KHt9LGEpKSxzLmF2YWlsYWJsZUluc3RhbmNlSWRzPXRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLnNsaWNlKCkscy5hdmFpbGFibGVHZW9tZXRyeUlkcz10aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5zbGljZSgpLHMubmV4dEluZGV4U3RhcnQ9dGhpcy5fbmV4dEluZGV4U3RhcnQscy5uZXh0VmVydGV4U3RhcnQ9dGhpcy5fbmV4dFZlcnRleFN0YXJ0LHMuZ2VvbWV0cnlDb3VudD10aGlzLl9nZW9tZXRyeUNvdW50LHMubWF4SW5zdGFuY2VDb3VudD10aGlzLl9tYXhJbnN0YW5jZUNvdW50LHMubWF4VmVydGV4Q291bnQ9dGhpcy5fbWF4VmVydGV4Q291bnQscy5tYXhJbmRleENvdW50PXRoaXMuX21heEluZGV4Q291bnQscy5nZW9tZXRyeUluaXRpYWxpemVkPXRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQscy5tYXRyaWNlc1RleHR1cmU9dGhpcy5fbWF0cmljZXNUZXh0dXJlLnRvSlNPTih0KSxzLmluZGlyZWN0VGV4dHVyZT10aGlzLl9pbmRpcmVjdFRleHR1cmUudG9KU09OKHQpLHRoaXMuX2NvbG9yc1RleHR1cmUhPT1udWxsJiYocy5jb2xvcnNUZXh0dXJlPXRoaXMuX2NvbG9yc1RleHR1cmUudG9KU09OKHQpKSx0aGlzLmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmKHMuYm91bmRpbmdTcGhlcmU9e2NlbnRlcjp0aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCkscmFkaXVzOnRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzfSksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJihzLmJvdW5kaW5nQm94PXttaW46dGhpcy5ib3VuZGluZ0JveC5taW4udG9BcnJheSgpLG1heDp0aGlzLmJvdW5kaW5nQm94Lm1heC50b0FycmF5KCl9KSk7ZnVuY3Rpb24gcihhLGMpe3JldHVybiBhW2MudXVpZF09PT12b2lkIDAmJihhW2MudXVpZF09Yy50b0pTT04odCkpLGMudXVpZH1pZih0aGlzLmlzU2NlbmUpdGhpcy5iYWNrZ3JvdW5kJiYodGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3I/cy5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oKTp0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlJiYocy5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04odCkudXVpZCkpLHRoaXMuZW52aXJvbm1lbnQmJnRoaXMuZW52aXJvbm1lbnQuaXNUZXh0dXJlJiZ0aGlzLmVudmlyb25tZW50LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSE9PSEwJiYocy5lbnZpcm9ubWVudD10aGlzLmVudmlyb25tZW50LnRvSlNPTih0KS51dWlkKTtlbHNlIGlmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7cy5nZW9tZXRyeT1yKHQuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTtjb25zdCBhPXRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztpZihhIT09dm9pZCAwJiZhLnNoYXBlcyE9PXZvaWQgMCl7Y29uc3QgYz1hLnNoYXBlcztpZihBcnJheS5pc0FycmF5KGMpKWZvcihsZXQgbD0wLGg9Yy5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgdT1jW2xdO3IodC5zaGFwZXMsdSl9ZWxzZSByKHQuc2hhcGVzLGMpfX1pZih0aGlzLmlzU2tpbm5lZE1lc2gmJihzLmJpbmRNb2RlPXRoaXMuYmluZE1vZGUscy5iaW5kTWF0cml4PXRoaXMuYmluZE1hdHJpeC50b0FycmF5KCksdGhpcy5za2VsZXRvbiE9PXZvaWQgMCYmKHIodC5za2VsZXRvbnMsdGhpcy5za2VsZXRvbikscy5za2VsZXRvbj10aGlzLnNrZWxldG9uLnV1aWQpKSx0aGlzLm1hdGVyaWFsIT09dm9pZCAwKWlmKEFycmF5LmlzQXJyYXkodGhpcy5tYXRlcmlhbCkpe2NvbnN0IGE9W107Zm9yKGxldCBjPTAsbD10aGlzLm1hdGVyaWFsLmxlbmd0aDtjPGw7YysrKWEucHVzaChyKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbY10pKTtzLm1hdGVyaWFsPWF9ZWxzZSBzLm1hdGVyaWFsPXIodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYodGhpcy5jaGlsZHJlbi5sZW5ndGg+MCl7cy5jaGlsZHJlbj1bXTtmb3IobGV0IGE9MDthPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2ErKylzLmNoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlblthXS50b0pTT04odCkub2JqZWN0KX1pZih0aGlzLmFuaW1hdGlvbnMubGVuZ3RoPjApe3MuYW5pbWF0aW9ucz1bXTtmb3IobGV0IGE9MDthPHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7YSsrKXtjb25zdCBjPXRoaXMuYW5pbWF0aW9uc1thXTtzLmFuaW1hdGlvbnMucHVzaChyKHQuYW5pbWF0aW9ucyxjKSl9fWlmKGUpe2NvbnN0IGE9byh0Lmdlb21ldHJpZXMpLGM9byh0Lm1hdGVyaWFscyksbD1vKHQudGV4dHVyZXMpLGg9byh0LmltYWdlcyksdT1vKHQuc2hhcGVzKSxmPW8odC5za2VsZXRvbnMpLGQ9byh0LmFuaW1hdGlvbnMpLHA9byh0Lm5vZGVzKTthLmxlbmd0aD4wJiYobi5nZW9tZXRyaWVzPWEpLGMubGVuZ3RoPjAmJihuLm1hdGVyaWFscz1jKSxsLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1sKSxoLmxlbmd0aD4wJiYobi5pbWFnZXM9aCksdS5sZW5ndGg+MCYmKG4uc2hhcGVzPXUpLGYubGVuZ3RoPjAmJihuLnNrZWxldG9ucz1mKSxkLmxlbmd0aD4wJiYobi5hbmltYXRpb25zPWQpLHAubGVuZ3RoPjAmJihuLm5vZGVzPXApfXJldHVybiBuLm9iamVjdD1zLG47ZnVuY3Rpb24gbyhhKXtjb25zdCBjPVtdO2Zvcihjb25zdCBsIGluIGEpe2NvbnN0IGg9YVtsXTtkZWxldGUgaC5tZXRhZGF0YSxjLnB1c2goaCl9cmV0dXJuIGN9fWNsb25lKHQpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyx0KX1jb3B5KHQsZT0hMCl7aWYodGhpcy5uYW1lPXQubmFtZSx0aGlzLnVwLmNvcHkodC51cCksdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLHRoaXMucm90YXRpb24ub3JkZXI9dC5yb3RhdGlvbi5vcmRlcix0aGlzLnF1YXRlcm5pb24uY29weSh0LnF1YXRlcm5pb24pLHRoaXMuc2NhbGUuY29weSh0LnNjYWxlKSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT10Lm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlLHRoaXMubGF5ZXJzLm1hc2s9dC5sYXllcnMubWFzayx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMuY2FzdFNoYWRvdz10LmNhc3RTaGFkb3csdGhpcy5yZWNlaXZlU2hhZG93PXQucmVjZWl2ZVNoYWRvdyx0aGlzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkLHRoaXMucmVuZGVyT3JkZXI9dC5yZW5kZXJPcmRlcix0aGlzLmFuaW1hdGlvbnM9dC5hbmltYXRpb25zLnNsaWNlKCksdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSxlPT09ITApZm9yKGxldCBuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe2NvbnN0IHM9dC5jaGlsZHJlbltuXTt0aGlzLmFkZChzLmNsb25lKCkpfXJldHVybiB0aGlzfX1QZS5ERUZBVUxUX1VQPW5ldyBUKDAsMSwwKSxQZS5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURT0hMCxQZS5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURT0hMDtjb25zdCBoZT1uZXcgVCxFZT1uZXcgVCxwbz1uZXcgVCxDZT1uZXcgVCxVbj1uZXcgVCxWbj1uZXcgVCxGYz1uZXcgVCx5bz1uZXcgVCxtbz1uZXcgVCxnbz1uZXcgVCx4bz1uZXcgWXQsd289bmV3IFl0LGJvPW5ldyBZdDtjbGFzcyBldHtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQsbj1uZXcgVCl7dGhpcy5hPXQsdGhpcy5iPWUsdGhpcy5jPW59c3RhdGljIGdldE5vcm1hbCh0LGUsbixzKXtzLnN1YlZlY3RvcnMobixlKSxoZS5zdWJWZWN0b3JzKHQsZSkscy5jcm9zcyhoZSk7Y29uc3Qgcj1zLmxlbmd0aFNxKCk7cmV0dXJuIHI+MD9zLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHIpKTpzLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZCh0LGUsbixzLHIpe2hlLnN1YlZlY3RvcnMocyxlKSxFZS5zdWJWZWN0b3JzKG4sZSkscG8uc3ViVmVjdG9ycyh0LGUpO2NvbnN0IG89aGUuZG90KGhlKSxhPWhlLmRvdChFZSksYz1oZS5kb3QocG8pLGw9RWUuZG90KEVlKSxoPUVlLmRvdChwbyksdT1vKmwtYSphO2lmKHU9PT0wKXJldHVybiByLnNldCgwLDAsMCksbnVsbDtjb25zdCBmPTEvdSxkPShsKmMtYSpoKSpmLHA9KG8qaC1hKmMpKmY7cmV0dXJuIHIuc2V0KDEtZC1wLHAsZCl9c3RhdGljIGNvbnRhaW5zUG9pbnQodCxlLG4scyl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLHMsQ2UpPT09bnVsbD8hMTpDZS54Pj0wJiZDZS55Pj0wJiZDZS54K0NlLnk8PTF9c3RhdGljIGdldEludGVycG9sYXRpb24odCxlLG4scyxyLG8sYSxjKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLG4scyxDZSk9PT1udWxsPyhjLng9MCxjLnk9MCwieiJpbiBjJiYoYy56PTApLCJ3ImluIGMmJihjLnc9MCksbnVsbCk6KGMuc2V0U2NhbGFyKDApLGMuYWRkU2NhbGVkVmVjdG9yKHIsQ2UueCksYy5hZGRTY2FsZWRWZWN0b3IobyxDZS55KSxjLmFkZFNjYWxlZFZlY3RvcihhLENlLnopLGMpfXN0YXRpYyBnZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUodCxlLG4scyxyLG8pe3JldHVybiB4by5zZXRTY2FsYXIoMCksd28uc2V0U2NhbGFyKDApLGJvLnNldFNjYWxhcigwKSx4by5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksd28uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLGJvLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSxvLnNldFNjYWxhcigwKSxvLmFkZFNjYWxlZFZlY3Rvcih4byxyLngpLG8uYWRkU2NhbGVkVmVjdG9yKHdvLHIueSksby5hZGRTY2FsZWRWZWN0b3IoYm8sci56KSxvfXN0YXRpYyBpc0Zyb250RmFjaW5nKHQsZSxuLHMpe3JldHVybiBoZS5zdWJWZWN0b3JzKG4sZSksRWUuc3ViVmVjdG9ycyh0LGUpLGhlLmNyb3NzKEVlKS5kb3Qocyk8MH1zZXQodCxlLG4pe3JldHVybiB0aGlzLmEuY29weSh0KSx0aGlzLmIuY29weShlKSx0aGlzLmMuY29weShuKSx0aGlzfXNldEZyb21Qb2ludHNBbmRJbmRpY2VzKHQsZSxuLHMpe3JldHVybiB0aGlzLmEuY29weSh0W2VdKSx0aGlzLmIuY29weSh0W25dKSx0aGlzLmMuY29weSh0W3NdKSx0aGlzfXNldEZyb21BdHRyaWJ1dGVBbmRJbmRpY2VzKHQsZSxuLHMpe3JldHVybiB0aGlzLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLHRoaXMuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbiksdGhpcy5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmEuY29weSh0LmEpLHRoaXMuYi5jb3B5KHQuYiksdGhpcy5jLmNvcHkodC5jKSx0aGlzfWdldEFyZWEoKXtyZXR1cm4gaGUuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKSxFZS5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLGhlLmNyb3NzKEVlKS5sZW5ndGgoKSouNX1nZXRNaWRwb2ludCh0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9Z2V0Tm9ybWFsKHQpe3JldHVybiBldC5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9Z2V0UGxhbmUodCl7cmV0dXJuIHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1nZXRCYXJ5Y29vcmQodCxlKXtyZXR1cm4gZXQuZ2V0QmFyeWNvb3JkKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9Z2V0SW50ZXJwb2xhdGlvbih0LGUsbixzLHIpe3JldHVybiBldC5nZXRJbnRlcnBvbGF0aW9uKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxuLHMscil9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gZXQuY29udGFpbnNQb2ludCh0LHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1pc0Zyb250RmFjaW5nKHQpe3JldHVybiBldC5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHQpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1RyaWFuZ2xlKHRoaXMpfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuYSxzPXRoaXMuYixyPXRoaXMuYztsZXQgbyxhO1VuLnN1YlZlY3RvcnMocyxuKSxWbi5zdWJWZWN0b3JzKHIsbikseW8uc3ViVmVjdG9ycyh0LG4pO2NvbnN0IGM9VW4uZG90KHlvKSxsPVZuLmRvdCh5byk7aWYoYzw9MCYmbDw9MClyZXR1cm4gZS5jb3B5KG4pO21vLnN1YlZlY3RvcnModCxzKTtjb25zdCBoPVVuLmRvdChtbyksdT1Wbi5kb3QobW8pO2lmKGg+PTAmJnU8PWgpcmV0dXJuIGUuY29weShzKTtjb25zdCBmPWMqdS1oKmw7aWYoZjw9MCYmYz49MCYmaDw9MClyZXR1cm4gbz1jLyhjLWgpLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoVW4sbyk7Z28uc3ViVmVjdG9ycyh0LHIpO2NvbnN0IGQ9VW4uZG90KGdvKSxwPVZuLmRvdChnbyk7aWYocD49MCYmZDw9cClyZXR1cm4gZS5jb3B5KHIpO2NvbnN0IHk9ZCpsLWMqcDtpZih5PD0wJiZsPj0wJiZwPD0wKXJldHVybiBhPWwvKGwtcCksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihWbixhKTtjb25zdCBtPWgqcC1kKnU7aWYobTw9MCYmdS1oPj0wJiZkLXA+PTApcmV0dXJuIEZjLnN1YlZlY3RvcnMocixzKSxhPSh1LWgpLyh1LWgrKGQtcCkpLGUuY29weShzKS5hZGRTY2FsZWRWZWN0b3IoRmMsYSk7Y29uc3QgZz0xLyhtK3krZik7cmV0dXJuIG89eSpnLGE9ZipnLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoVW4sbykuYWRkU2NhbGVkVmVjdG9yKFZuLGEpfWVxdWFscyh0KXtyZXR1cm4gdC5hLmVxdWFscyh0aGlzLmEpJiZ0LmIuZXF1YWxzKHRoaXMuYikmJnQuYy5lcXVhbHModGhpcy5jKX19Y29uc3QgSWM9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0sUWU9e2g6MCxzOjAsbDowfSxwcz17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIE1vKGksdCxlKXtyZXR1cm4gZTwwJiYoZSs9MSksZT4xJiYoZS09MSksZTwxLzY/aSsodC1pKSo2KmU6ZTwxLzI/dDplPDIvMz9pKyh0LWkpKjYqKDIvMy1lKTppfWxldCB5cz1jbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbil7cmV0dXJuIHRoaXMuaXNDb2xvcj0hMCx0aGlzLnI9MSx0aGlzLmc9MSx0aGlzLmI9MSx0aGlzLnNldCh0LGUsbil9c2V0KHQsZSxuKXtpZihlPT09dm9pZCAwJiZuPT09dm9pZCAwKXtjb25zdCBzPXQ7cyYmcy5pc0NvbG9yP3RoaXMuY29weShzKTp0eXBlb2Ygcz09Im51bWJlciI/dGhpcy5zZXRIZXgocyk6dHlwZW9mIHM9PSJzdHJpbmciJiZ0aGlzLnNldFN0eWxlKHMpfWVsc2UgdGhpcy5zZXRSR0IodCxlLG4pO3JldHVybiB0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPXQsdGhpcy5iPXQsdGhpc31zZXRIZXgodCxlPW9lKXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLHRoaXMucj0odD4+MTYmMjU1KS8yNTUsdGhpcy5nPSh0Pj44JjI1NSkvMjU1LHRoaXMuYj0odCYyNTUpLzI1NSxhZS50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsZSksdGhpc31zZXRSR0IodCxlLG4scz1hZS53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz1lLHRoaXMuYj1uLGFlLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxzKSx0aGlzfXNldEhTTCh0LGUsbixzPWFlLndvcmtpbmdDb2xvclNwYWNlKXtpZih0PVh1KHQsMSksZT1aKGUsMCwxKSxuPVoobiwwLDEpLGU9PT0wKXRoaXMucj10aGlzLmc9dGhpcy5iPW47ZWxzZXtjb25zdCByPW48PS41P24qKDErZSk6bitlLW4qZSxvPTIqbi1yO3RoaXMucj1NbyhvLHIsdCsxLzMpLHRoaXMuZz1NbyhvLHIsdCksdGhpcy5iPU1vKG8scix0LTEvMyl9cmV0dXJuIGFlLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxzKSx0aGlzfXNldFN0eWxlKHQsZT1vZSl7ZnVuY3Rpb24gbihyKXtyIT09dm9pZCAwJiZwYXJzZUZsb2F0KHIpPDEmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK3QrIiB3aWxsIGJlIGlnbm9yZWQuIil9bGV0IHM7aWYocz0vXihcdyspXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgcjtjb25zdCBvPXNbMV0sYT1zWzJdO3N3aXRjaChvKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZihyPS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbMV0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbMl0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbM10sMTApKS8yNTUsZSk7aWYocj0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGEpKXJldHVybiBuKHJbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDEwMCxwYXJzZUludChyWzFdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChyWzJdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChyWzNdLDEwKSkvMTAwLGUpO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKHI9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQqXC4/XGQrKVwlXHMqLFxzKihcZCpcLj9cZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRIU0wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAsZSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yIG1vZGVsICIrdCl9fWVsc2UgaWYocz0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IHI9c1sxXSxvPXIubGVuZ3RoO2lmKG89PT0zKXJldHVybiB0aGlzLnNldFJHQihwYXJzZUludChyLmNoYXJBdCgwKSwxNikvMTUscGFyc2VJbnQoci5jaGFyQXQoMSksMTYpLzE1LHBhcnNlSW50KHIuY2hhckF0KDIpLDE2KS8xNSxlKTtpZihvPT09NilyZXR1cm4gdGhpcy5zZXRIZXgocGFyc2VJbnQociwxNiksZSk7Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogSW52YWxpZCBoZXggY29sb3IgIit0KX1lbHNlIGlmKHQmJnQubGVuZ3RoPjApcmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKHQsZSk7cmV0dXJuIHRoaXN9c2V0Q29sb3JOYW1lKHQsZT1vZSl7Y29uc3Qgbj1JY1t0LnRvTG93ZXJDYXNlKCldO3JldHVybiBuIT09dm9pZCAwP3RoaXMuc2V0SGV4KG4sZSk6Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK3QpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfWNvcHkodCl7cmV0dXJuIHRoaXMucj10LnIsdGhpcy5nPXQuZyx0aGlzLmI9dC5iLHRoaXN9Y29weVNSR0JUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5yPXZlKHQuciksdGhpcy5nPXZlKHQuZyksdGhpcy5iPXZlKHQuYiksdGhpc31jb3B5TGluZWFyVG9TUkdCKHQpe3JldHVybiB0aGlzLnI9SW4odC5yKSx0aGlzLmc9SW4odC5nKSx0aGlzLmI9SW4odC5iKSx0aGlzfWNvbnZlcnRTUkdCVG9MaW5lYXIoKXtyZXR1cm4gdGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpLHRoaXN9Y29udmVydExpbmVhclRvU1JHQigpe3JldHVybiB0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyksdGhpc31nZXRIZXgodD1vZSl7cmV0dXJuIGFlLmZyb21Xb3JraW5nQ29sb3JTcGFjZShfdC5jb3B5KHRoaXMpLHQpLE1hdGgucm91bmQoWihfdC5yKjI1NSwwLDI1NSkpKjY1NTM2K01hdGgucm91bmQoWihfdC5nKjI1NSwwLDI1NSkpKjI1NitNYXRoLnJvdW5kKFooX3QuYioyNTUsMCwyNTUpKX1nZXRIZXhTdHJpbmcodD1vZSl7cmV0dXJuKCIwMDAwMDAiK3RoaXMuZ2V0SGV4KHQpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWdldEhTTCh0LGU9YWUud29ya2luZ0NvbG9yU3BhY2Upe2FlLmZyb21Xb3JraW5nQ29sb3JTcGFjZShfdC5jb3B5KHRoaXMpLGUpO2NvbnN0IG49X3QucixzPV90Lmcscj1fdC5iLG89TWF0aC5tYXgobixzLHIpLGE9TWF0aC5taW4obixzLHIpO2xldCBjLGw7Y29uc3QgaD0oYStvKS8yO2lmKGE9PT1vKWM9MCxsPTA7ZWxzZXtjb25zdCB1PW8tYTtzd2l0Y2gobD1oPD0uNT91LyhvK2EpOnUvKDItby1hKSxvKXtjYXNlIG46Yz0ocy1yKS91KyhzPHI/NjowKTticmVhaztjYXNlIHM6Yz0oci1uKS91KzI7YnJlYWs7Y2FzZSByOmM9KG4tcykvdSs0O2JyZWFrfWMvPTZ9cmV0dXJuIHQuaD1jLHQucz1sLHQubD1oLHR9Z2V0UkdCKHQsZT1hZS53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIGFlLmZyb21Xb3JraW5nQ29sb3JTcGFjZShfdC5jb3B5KHRoaXMpLGUpLHQucj1fdC5yLHQuZz1fdC5nLHQuYj1fdC5iLHR9Z2V0U3R5bGUodD1vZSl7YWUuZnJvbVdvcmtpbmdDb2xvclNwYWNlKF90LmNvcHkodGhpcyksdCk7Y29uc3QgZT1fdC5yLG49X3QuZyxzPV90LmI7cmV0dXJuIHQhPT1vZT9gY29sb3IoJHt0fSAke2UudG9GaXhlZCgzKX0gJHtuLnRvRml4ZWQoMyl9ICR7cy50b0ZpeGVkKDMpfSlgOmByZ2IoJHtNYXRoLnJvdW5kKGUqMjU1KX0sJHtNYXRoLnJvdW5kKG4qMjU1KX0sJHtNYXRoLnJvdW5kKHMqMjU1KX0pYH1vZmZzZXRIU0wodCxlLG4pe3JldHVybiB0aGlzLmdldEhTTChRZSksdGhpcy5zZXRIU0woUWUuaCt0LFFlLnMrZSxRZS5sK24pfWFkZCh0KXtyZXR1cm4gdGhpcy5yKz10LnIsdGhpcy5nKz10LmcsdGhpcy5iKz10LmIsdGhpc31hZGRDb2xvcnModCxlKXtyZXR1cm4gdGhpcy5yPXQucitlLnIsdGhpcy5nPXQuZytlLmcsdGhpcy5iPXQuYitlLmIsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMucis9dCx0aGlzLmcrPXQsdGhpcy5iKz10LHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItdC5yKSx0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctdC5nKSx0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItdC5iKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLnIqPXQucix0aGlzLmcqPXQuZyx0aGlzLmIqPXQuYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLnIqPXQsdGhpcy5nKj10LHRoaXMuYio9dCx0aGlzfWxlcnAodCxlKXtyZXR1cm4gdGhpcy5yKz0odC5yLXRoaXMucikqZSx0aGlzLmcrPSh0LmctdGhpcy5nKSplLHRoaXMuYis9KHQuYi10aGlzLmIpKmUsdGhpc31sZXJwQ29sb3JzKHQsZSxuKXtyZXR1cm4gdGhpcy5yPXQucisoZS5yLXQucikqbix0aGlzLmc9dC5nKyhlLmctdC5nKSpuLHRoaXMuYj10LmIrKGUuYi10LmIpKm4sdGhpc31sZXJwSFNMKHQsZSl7dGhpcy5nZXRIU0woUWUpLHQuZ2V0SFNMKHBzKTtjb25zdCBuPWVvKFFlLmgscHMuaCxlKSxzPWVvKFFlLnMscHMucyxlKSxyPWVvKFFlLmwscHMubCxlKTtyZXR1cm4gdGhpcy5zZXRIU0wobixzLHIpLHRoaXN9c2V0RnJvbVZlY3RvcjModCl7cmV0dXJuIHRoaXMucj10LngsdGhpcy5nPXQueSx0aGlzLmI9dC56LHRoaXN9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy5yLG49dGhpcy5nLHM9dGhpcy5iLHI9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5yPXJbMF0qZStyWzNdKm4rcls2XSpzLHRoaXMuZz1yWzFdKmUrcls0XSpuK3JbN10qcyx0aGlzLmI9clsyXSplK3JbNV0qbityWzhdKnMsdGhpc31lcXVhbHModCl7cmV0dXJuIHQucj09PXRoaXMuciYmdC5nPT09dGhpcy5nJiZ0LmI9PT10aGlzLmJ9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5yLHRbZSsxXT10aGlzLmcsdFtlKzJdPXRoaXMuYix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5yPXQuZ2V0WChlKSx0aGlzLmc9dC5nZXRZKGUpLHRoaXMuYj10LmdldFooZSksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX0qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLnIseWllbGQgdGhpcy5nLHlpZWxkIHRoaXMuYn19O2NvbnN0IF90PW5ldyB5czt5cy5OQU1FUz1JYztsZXQgaGY9MDtjbGFzcyB1ZiBleHRlbmRzIG9ze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzTWF0ZXJpYWw9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6aGYrK30pLHRoaXMudXVpZD1GbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik1hdGVyaWFsIix0aGlzLmJsZW5kaW5nPTEsdGhpcy5zaWRlPTAsdGhpcy52ZXJ0ZXhDb2xvcnM9ITEsdGhpcy5vcGFjaXR5PTEsdGhpcy50cmFuc3BhcmVudD0hMSx0aGlzLmFscGhhSGFzaD0hMSx0aGlzLmJsZW5kU3JjPTIwNCx0aGlzLmJsZW5kRHN0PTIwNSx0aGlzLmJsZW5kRXF1YXRpb249MTAwLHRoaXMuYmxlbmRTcmNBbHBoYT1udWxsLHRoaXMuYmxlbmREc3RBbHBoYT1udWxsLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPW51bGwsdGhpcy5ibGVuZENvbG9yPW5ldyB5cygwLDAsMCksdGhpcy5ibGVuZEFscGhhPTAsdGhpcy5kZXB0aEZ1bmM9Myx0aGlzLmRlcHRoVGVzdD0hMCx0aGlzLmRlcHRoV3JpdGU9ITAsdGhpcy5zdGVuY2lsV3JpdGVNYXNrPTI1NSx0aGlzLnN0ZW5jaWxGdW5jPTUxOSx0aGlzLnN0ZW5jaWxSZWY9MCx0aGlzLnN0ZW5jaWxGdW5jTWFzaz0yNTUsdGhpcy5zdGVuY2lsRmFpbD03NjgwLHRoaXMuc3RlbmNpbFpGYWlsPTc2ODAsdGhpcy5zdGVuY2lsWlBhc3M9NzY4MCx0aGlzLnN0ZW5jaWxXcml0ZT0hMSx0aGlzLmNsaXBwaW5nUGxhbmVzPW51bGwsdGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExLHRoaXMuY2xpcFNoYWRvd3M9ITEsdGhpcy5zaGFkb3dTaWRlPW51bGwsdGhpcy5jb2xvcldyaXRlPSEwLHRoaXMucHJlY2lzaW9uPW51bGwsdGhpcy5wb2x5Z29uT2Zmc2V0PSExLHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPTAsdGhpcy5kaXRoZXJpbmc9ITEsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9ITEsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9ITEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9ITEsdGhpcy5hbGxvd092ZXJyaWRlPSEwLHRoaXMudmlzaWJsZT0hMCx0aGlzLnRvbmVNYXBwZWQ9ITAsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLl9hbHBoYVRlc3Q9MH1nZXQgYWxwaGFUZXN0KCl7cmV0dXJuIHRoaXMuX2FscGhhVGVzdH1zZXQgYWxwaGFUZXN0KHQpe3RoaXMuX2FscGhhVGVzdD4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX2FscGhhVGVzdD10fW9uQmVmb3JlUmVuZGVyKCl7fW9uQmVmb3JlQ29tcGlsZSgpe31jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKXtyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKX1zZXRWYWx1ZXModCl7aWYodCE9PXZvaWQgMClmb3IoY29uc3QgZSBpbiB0KXtjb25zdCBuPXRbZV07aWYobj09PXZvaWQgMCl7Y29uc29sZS53YXJuKGBUSFJFRS5NYXRlcmlhbDogcGFyYW1ldGVyICcke2V9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmApO2NvbnRpbnVlfWNvbnN0IHM9dGhpc1tlXTtpZihzPT09dm9pZCAwKXtjb25zb2xlLndhcm4oYFRIUkVFLk1hdGVyaWFsOiAnJHtlfScgaXMgbm90IGEgcHJvcGVydHkgb2YgVEhSRUUuJHt0aGlzLnR5cGV9LmApO2NvbnRpbnVlfXMmJnMuaXNDb2xvcj9zLnNldChuKTpzJiZzLmlzVmVjdG9yMyYmbiYmbi5pc1ZlY3RvcjM/cy5jb3B5KG4pOnRoaXNbZV09bn19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO2UmJih0PXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O24udXVpZD10aGlzLnV1aWQsbi50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKG4ubmFtZT10aGlzLm5hbWUpLHRoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKG4uY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSksdGhpcy5yb3VnaG5lc3MhPT12b2lkIDAmJihuLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyksdGhpcy5tZXRhbG5lc3MhPT12b2lkIDAmJihuLm1ldGFsbmVzcz10aGlzLm1ldGFsbmVzcyksdGhpcy5zaGVlbiE9PXZvaWQgMCYmKG4uc2hlZW49dGhpcy5zaGVlbiksdGhpcy5zaGVlbkNvbG9yJiZ0aGlzLnNoZWVuQ29sb3IuaXNDb2xvciYmKG4uc2hlZW5Db2xvcj10aGlzLnNoZWVuQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hlZW5Sb3VnaG5lc3MhPT12b2lkIDAmJihuLnNoZWVuUm91Z2huZXNzPXRoaXMuc2hlZW5Sb3VnaG5lc3MpLHRoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKG4uZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSksdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PXZvaWQgMCYmdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PTEmJihuLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKG4uc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSksdGhpcy5zcGVjdWxhckludGVuc2l0eSE9PXZvaWQgMCYmKG4uc3BlY3VsYXJJbnRlbnNpdHk9dGhpcy5zcGVjdWxhckludGVuc2l0eSksdGhpcy5zcGVjdWxhckNvbG9yJiZ0aGlzLnNwZWN1bGFyQ29sb3IuaXNDb2xvciYmKG4uc3BlY3VsYXJDb2xvcj10aGlzLnNwZWN1bGFyQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hpbmluZXNzIT09dm9pZCAwJiYobi5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpLHRoaXMuY2xlYXJjb2F0IT09dm9pZCAwJiYobi5jbGVhcmNvYXQ9dGhpcy5jbGVhcmNvYXQpLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzIT09dm9pZCAwJiYobi5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MpLHRoaXMuY2xlYXJjb2F0TWFwJiZ0aGlzLmNsZWFyY29hdE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE1hcD10aGlzLmNsZWFyY29hdE1hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJnRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCYmdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXROb3JtYWxNYXA9dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5jbGVhcmNvYXROb3JtYWxTY2FsZT10aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5kaXNwZXJzaW9uIT09dm9pZCAwJiYobi5kaXNwZXJzaW9uPXRoaXMuZGlzcGVyc2lvbiksdGhpcy5pcmlkZXNjZW5jZSE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2U9dGhpcy5pcmlkZXNjZW5jZSksdGhpcy5pcmlkZXNjZW5jZUlPUiE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2VJT1I9dGhpcy5pcmlkZXNjZW5jZUlPUiksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSksdGhpcy5pcmlkZXNjZW5jZU1hcCYmdGhpcy5pcmlkZXNjZW5jZU1hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlTWFwPXRoaXMuaXJpZGVzY2VuY2VNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAmJnRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD10aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmFuaXNvdHJvcHkhPT12b2lkIDAmJihuLmFuaXNvdHJvcHk9dGhpcy5hbmlzb3Ryb3B5KSx0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiE9PXZvaWQgMCYmKG4uYW5pc290cm9weVJvdGF0aW9uPXRoaXMuYW5pc290cm9weVJvdGF0aW9uKSx0aGlzLmFuaXNvdHJvcHlNYXAmJnRoaXMuYW5pc290cm9weU1hcC5pc1RleHR1cmUmJihuLmFuaXNvdHJvcHlNYXA9dGhpcy5hbmlzb3Ryb3B5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYobi5tYXA9dGhpcy5tYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihuLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04odCkudXVpZCksdGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihuLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYobi5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTih0KS51dWlkLG4ubGlnaHRNYXBJbnRlbnNpdHk9dGhpcy5saWdodE1hcEludGVuc2l0eSksdGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihuLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKHQpLnV1aWQsbi5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KSx0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihuLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTih0KS51dWlkLG4uYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKSx0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYobi5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxuLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYobi5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKHQpLnV1aWQsbi5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG4uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpLHRoaXMucm91Z2huZXNzTWFwJiZ0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLnJvdWdobmVzc01hcD10aGlzLnJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5tZXRhbG5lc3NNYXAmJnRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSYmKG4ubWV0YWxuZXNzTWFwPXRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVtaXNzaXZlTWFwJiZ0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSYmKG4uZW1pc3NpdmVNYXA9dGhpcy5lbWlzc2l2ZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhck1hcCYmdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyTWFwPXRoaXMuc3BlY3VsYXJNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJnRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhckludGVuc2l0eU1hcD10aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyQ29sb3JNYXAmJnRoaXMuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyQ29sb3JNYXA9dGhpcy5zcGVjdWxhckNvbG9yTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobi5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKHQpLnV1aWQsdGhpcy5jb21iaW5lIT09dm9pZCAwJiYobi5jb21iaW5lPXRoaXMuY29tYmluZSkpLHRoaXMuZW52TWFwUm90YXRpb24hPT12b2lkIDAmJihuLmVudk1hcFJvdGF0aW9uPXRoaXMuZW52TWFwUm90YXRpb24udG9BcnJheSgpKSx0aGlzLmVudk1hcEludGVuc2l0eSE9PXZvaWQgMCYmKG4uZW52TWFwSW50ZW5zaXR5PXRoaXMuZW52TWFwSW50ZW5zaXR5KSx0aGlzLnJlZmxlY3Rpdml0eSE9PXZvaWQgMCYmKG4ucmVmbGVjdGl2aXR5PXRoaXMucmVmbGVjdGl2aXR5KSx0aGlzLnJlZnJhY3Rpb25SYXRpbyE9PXZvaWQgMCYmKG4ucmVmcmFjdGlvblJhdGlvPXRoaXMucmVmcmFjdGlvblJhdGlvKSx0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKG4uZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04odCkudXVpZCksdGhpcy50cmFuc21pc3Npb24hPT12b2lkIDAmJihuLnRyYW5zbWlzc2lvbj10aGlzLnRyYW5zbWlzc2lvbiksdGhpcy50cmFuc21pc3Npb25NYXAmJnRoaXMudHJhbnNtaXNzaW9uTWFwLmlzVGV4dHVyZSYmKG4udHJhbnNtaXNzaW9uTWFwPXRoaXMudHJhbnNtaXNzaW9uTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnRoaWNrbmVzcyE9PXZvaWQgMCYmKG4udGhpY2tuZXNzPXRoaXMudGhpY2tuZXNzKSx0aGlzLnRoaWNrbmVzc01hcCYmdGhpcy50aGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi50aGlja25lc3NNYXA9dGhpcy50aGlja25lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSE9PXZvaWQgMCYmdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlIT09MS8wJiYobi5hdHRlbnVhdGlvbkRpc3RhbmNlPXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksdGhpcy5hdHRlbnVhdGlvbkNvbG9yIT09dm9pZCAwJiYobi5hdHRlbnVhdGlvbkNvbG9yPXRoaXMuYXR0ZW51YXRpb25Db2xvci5nZXRIZXgoKSksdGhpcy5zaXplIT09dm9pZCAwJiYobi5zaXplPXRoaXMuc2l6ZSksdGhpcy5zaGFkb3dTaWRlIT09bnVsbCYmKG4uc2hhZG93U2lkZT10aGlzLnNoYWRvd1NpZGUpLHRoaXMuc2l6ZUF0dGVudWF0aW9uIT09dm9pZCAwJiYobi5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pLHRoaXMuYmxlbmRpbmchPT0xJiYobi5ibGVuZGluZz10aGlzLmJsZW5kaW5nKSx0aGlzLnNpZGUhPT0wJiYobi5zaWRlPXRoaXMuc2lkZSksdGhpcy52ZXJ0ZXhDb2xvcnM9PT0hMCYmKG4udmVydGV4Q29sb3JzPSEwKSx0aGlzLm9wYWNpdHk8MSYmKG4ub3BhY2l0eT10aGlzLm9wYWNpdHkpLHRoaXMudHJhbnNwYXJlbnQ9PT0hMCYmKG4udHJhbnNwYXJlbnQ9ITApLHRoaXMuYmxlbmRTcmMhPT0yMDQmJihuLmJsZW5kU3JjPXRoaXMuYmxlbmRTcmMpLHRoaXMuYmxlbmREc3QhPT0yMDUmJihuLmJsZW5kRHN0PXRoaXMuYmxlbmREc3QpLHRoaXMuYmxlbmRFcXVhdGlvbiE9PTEwMCYmKG4uYmxlbmRFcXVhdGlvbj10aGlzLmJsZW5kRXF1YXRpb24pLHRoaXMuYmxlbmRTcmNBbHBoYSE9PW51bGwmJihuLmJsZW5kU3JjQWxwaGE9dGhpcy5ibGVuZFNyY0FscGhhKSx0aGlzLmJsZW5kRHN0QWxwaGEhPT1udWxsJiYobi5ibGVuZERzdEFscGhhPXRoaXMuYmxlbmREc3RBbHBoYSksdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEhPT1udWxsJiYobi5ibGVuZEVxdWF0aW9uQWxwaGE9dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEpLHRoaXMuYmxlbmRDb2xvciYmdGhpcy5ibGVuZENvbG9yLmlzQ29sb3ImJihuLmJsZW5kQ29sb3I9dGhpcy5ibGVuZENvbG9yLmdldEhleCgpKSx0aGlzLmJsZW5kQWxwaGEhPT0wJiYobi5ibGVuZEFscGhhPXRoaXMuYmxlbmRBbHBoYSksdGhpcy5kZXB0aEZ1bmMhPT0zJiYobi5kZXB0aEZ1bmM9dGhpcy5kZXB0aEZ1bmMpLHRoaXMuZGVwdGhUZXN0PT09ITEmJihuLmRlcHRoVGVzdD10aGlzLmRlcHRoVGVzdCksdGhpcy5kZXB0aFdyaXRlPT09ITEmJihuLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFdyaXRlKSx0aGlzLmNvbG9yV3JpdGU9PT0hMSYmKG4uY29sb3JXcml0ZT10aGlzLmNvbG9yV3JpdGUpLHRoaXMuc3RlbmNpbFdyaXRlTWFzayE9PTI1NSYmKG4uc3RlbmNpbFdyaXRlTWFzaz10aGlzLnN0ZW5jaWxXcml0ZU1hc2spLHRoaXMuc3RlbmNpbEZ1bmMhPT01MTkmJihuLnN0ZW5jaWxGdW5jPXRoaXMuc3RlbmNpbEZ1bmMpLHRoaXMuc3RlbmNpbFJlZiE9PTAmJihuLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmKSx0aGlzLnN0ZW5jaWxGdW5jTWFzayE9PTI1NSYmKG4uc3RlbmNpbEZ1bmNNYXNrPXRoaXMuc3RlbmNpbEZ1bmNNYXNrKSx0aGlzLnN0ZW5jaWxGYWlsIT09NzY4MCYmKG4uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbCksdGhpcy5zdGVuY2lsWkZhaWwhPT03NjgwJiYobi5zdGVuY2lsWkZhaWw9dGhpcy5zdGVuY2lsWkZhaWwpLHRoaXMuc3RlbmNpbFpQYXNzIT09NzY4MCYmKG4uc3RlbmNpbFpQYXNzPXRoaXMuc3RlbmNpbFpQYXNzKSx0aGlzLnN0ZW5jaWxXcml0ZT09PSEwJiYobi5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGUpLHRoaXMucm90YXRpb24hPT12b2lkIDAmJnRoaXMucm90YXRpb24hPT0wJiYobi5yb3RhdGlvbj10aGlzLnJvdGF0aW9uKSx0aGlzLnBvbHlnb25PZmZzZXQ9PT0hMCYmKG4ucG9seWdvbk9mZnNldD0hMCksdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yIT09MCYmKG4ucG9seWdvbk9mZnNldEZhY3Rvcj10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IpLHRoaXMucG9seWdvbk9mZnNldFVuaXRzIT09MCYmKG4ucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldFVuaXRzKSx0aGlzLmxpbmV3aWR0aCE9PXZvaWQgMCYmdGhpcy5saW5ld2lkdGghPT0xJiYobi5saW5ld2lkdGg9dGhpcy5saW5ld2lkdGgpLHRoaXMuZGFzaFNpemUhPT12b2lkIDAmJihuLmRhc2hTaXplPXRoaXMuZGFzaFNpemUpLHRoaXMuZ2FwU2l6ZSE9PXZvaWQgMCYmKG4uZ2FwU2l6ZT10aGlzLmdhcFNpemUpLHRoaXMuc2NhbGUhPT12b2lkIDAmJihuLnNjYWxlPXRoaXMuc2NhbGUpLHRoaXMuZGl0aGVyaW5nPT09ITAmJihuLmRpdGhlcmluZz0hMCksdGhpcy5hbHBoYVRlc3Q+MCYmKG4uYWxwaGFUZXN0PXRoaXMuYWxwaGFUZXN0KSx0aGlzLmFscGhhSGFzaD09PSEwJiYobi5hbHBoYUhhc2g9ITApLHRoaXMuYWxwaGFUb0NvdmVyYWdlPT09ITAmJihuLmFscGhhVG9Db3ZlcmFnZT0hMCksdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9PT0hMCYmKG4ucHJlbXVsdGlwbGllZEFscGhhPSEwKSx0aGlzLmZvcmNlU2luZ2xlUGFzcz09PSEwJiYobi5mb3JjZVNpbmdsZVBhc3M9ITApLHRoaXMud2lyZWZyYW1lPT09ITAmJihuLndpcmVmcmFtZT0hMCksdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg+MSYmKG4ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKSx0aGlzLndpcmVmcmFtZUxpbmVjYXAhPT0icm91bmQiJiYobi53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCksdGhpcy53aXJlZnJhbWVMaW5lam9pbiE9PSJyb3VuZCImJihuLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pLHRoaXMuZmxhdFNoYWRpbmc9PT0hMCYmKG4uZmxhdFNoYWRpbmc9ITApLHRoaXMudmlzaWJsZT09PSExJiYobi52aXNpYmxlPSExKSx0aGlzLnRvbmVNYXBwZWQ9PT0hMSYmKG4udG9uZU1hcHBlZD0hMSksdGhpcy5mb2c9PT0hMSYmKG4uZm9nPSExKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSk7ZnVuY3Rpb24gcyhyKXtjb25zdCBvPVtdO2Zvcihjb25zdCBhIGluIHIpe2NvbnN0IGM9clthXTtkZWxldGUgYy5tZXRhZGF0YSxvLnB1c2goYyl9cmV0dXJuIG99aWYoZSl7Y29uc3Qgcj1zKHQudGV4dHVyZXMpLG89cyh0LmltYWdlcyk7ci5sZW5ndGg+MCYmKG4udGV4dHVyZXM9ciksby5sZW5ndGg+MCYmKG4uaW1hZ2VzPW8pfXJldHVybiBufWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMubmFtZT10Lm5hbWUsdGhpcy5ibGVuZGluZz10LmJsZW5kaW5nLHRoaXMuc2lkZT10LnNpZGUsdGhpcy52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnMsdGhpcy5vcGFjaXR5PXQub3BhY2l0eSx0aGlzLnRyYW5zcGFyZW50PXQudHJhbnNwYXJlbnQsdGhpcy5ibGVuZFNyYz10LmJsZW5kU3JjLHRoaXMuYmxlbmREc3Q9dC5ibGVuZERzdCx0aGlzLmJsZW5kRXF1YXRpb249dC5ibGVuZEVxdWF0aW9uLHRoaXMuYmxlbmRTcmNBbHBoYT10LmJsZW5kU3JjQWxwaGEsdGhpcy5ibGVuZERzdEFscGhhPXQuYmxlbmREc3RBbHBoYSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT10LmJsZW5kRXF1YXRpb25BbHBoYSx0aGlzLmJsZW5kQ29sb3IuY29weSh0LmJsZW5kQ29sb3IpLHRoaXMuYmxlbmRBbHBoYT10LmJsZW5kQWxwaGEsdGhpcy5kZXB0aEZ1bmM9dC5kZXB0aEZ1bmMsdGhpcy5kZXB0aFRlc3Q9dC5kZXB0aFRlc3QsdGhpcy5kZXB0aFdyaXRlPXQuZGVwdGhXcml0ZSx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9dC5zdGVuY2lsV3JpdGVNYXNrLHRoaXMuc3RlbmNpbEZ1bmM9dC5zdGVuY2lsRnVuYyx0aGlzLnN0ZW5jaWxSZWY9dC5zdGVuY2lsUmVmLHRoaXMuc3RlbmNpbEZ1bmNNYXNrPXQuc3RlbmNpbEZ1bmNNYXNrLHRoaXMuc3RlbmNpbEZhaWw9dC5zdGVuY2lsRmFpbCx0aGlzLnN0ZW5jaWxaRmFpbD10LnN0ZW5jaWxaRmFpbCx0aGlzLnN0ZW5jaWxaUGFzcz10LnN0ZW5jaWxaUGFzcyx0aGlzLnN0ZW5jaWxXcml0ZT10LnN0ZW5jaWxXcml0ZTtjb25zdCBlPXQuY2xpcHBpbmdQbGFuZXM7bGV0IG49bnVsbDtpZihlIT09bnVsbCl7Y29uc3Qgcz1lLmxlbmd0aDtuPW5ldyBBcnJheShzKTtmb3IobGV0IHI9MDtyIT09czsrK3IpbltyXT1lW3JdLmNsb25lKCl9cmV0dXJuIHRoaXMuY2xpcHBpbmdQbGFuZXM9bix0aGlzLmNsaXBJbnRlcnNlY3Rpb249dC5jbGlwSW50ZXJzZWN0aW9uLHRoaXMuY2xpcFNoYWRvd3M9dC5jbGlwU2hhZG93cyx0aGlzLnNoYWRvd1NpZGU9dC5zaGFkb3dTaWRlLHRoaXMuY29sb3JXcml0ZT10LmNvbG9yV3JpdGUsdGhpcy5wcmVjaXNpb249dC5wcmVjaXNpb24sdGhpcy5wb2x5Z29uT2Zmc2V0PXQucG9seWdvbk9mZnNldCx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9dC5wb2x5Z29uT2Zmc2V0RmFjdG9yLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPXQucG9seWdvbk9mZnNldFVuaXRzLHRoaXMuZGl0aGVyaW5nPXQuZGl0aGVyaW5nLHRoaXMuYWxwaGFUZXN0PXQuYWxwaGFUZXN0LHRoaXMuYWxwaGFIYXNoPXQuYWxwaGFIYXNoLHRoaXMuYWxwaGFUb0NvdmVyYWdlPXQuYWxwaGFUb0NvdmVyYWdlLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPXQucHJlbXVsdGlwbGllZEFscGhhLHRoaXMuZm9yY2VTaW5nbGVQYXNzPXQuZm9yY2VTaW5nbGVQYXNzLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy50b25lTWFwcGVkPXQudG9uZU1hcHBlZCx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK319Y2xhc3MgZmYgZXh0ZW5kcyB1Zntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5cygxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuZW52TWFwUm90YXRpb249bmV3IGJpLHRoaXMuY29tYmluZT0wLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLnNwZWN1bGFyTWFwPXQuc3BlY3VsYXJNYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZW52TWFwPXQuZW52TWFwLHRoaXMuZW52TWFwUm90YXRpb24uY29weSh0LmVudk1hcFJvdGF0aW9uKSx0aGlzLmNvbWJpbmU9dC5jb21iaW5lLHRoaXMucmVmbGVjdGl2aXR5PXQucmVmbGVjdGl2aXR5LHRoaXMucmVmcmFjdGlvblJhdGlvPXQucmVmcmFjdGlvblJhdGlvLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNvbnN0IHB0PW5ldyBULG1zPW5ldyBSO2xldCBkZj0wO2NsYXNzIHh0e2NvbnN0cnVjdG9yKHQsZSxuPSExKXtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7dGhpcy5pc0J1ZmZlckF0dHJpYnV0ZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpkZisrfSksdGhpcy5uYW1lPSIiLHRoaXMuYXJyYXk9dCx0aGlzLml0ZW1TaXplPWUsdGhpcy5jb3VudD10IT09dm9pZCAwP3QubGVuZ3RoL2U6MCx0aGlzLm5vcm1hbGl6ZWQ9bix0aGlzLnVzYWdlPTM1MDQ0LHRoaXMudXBkYXRlUmFuZ2VzPVtdLHRoaXMuZ3B1VHlwZT0xMDE1LHRoaXMudmVyc2lvbj0wfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy52ZXJzaW9uKyt9c2V0VXNhZ2UodCl7cmV0dXJuIHRoaXMudXNhZ2U9dCx0aGlzfWFkZFVwZGF0ZVJhbmdlKHQsZSl7dGhpcy51cGRhdGVSYW5nZXMucHVzaCh7c3RhcnQ6dCxjb3VudDplfSl9Y2xlYXJVcGRhdGVSYW5nZXMoKXt0aGlzLnVwZGF0ZVJhbmdlcy5sZW5ndGg9MH1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuYXJyYXk9bmV3IHQuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheSksdGhpcy5pdGVtU2l6ZT10Lml0ZW1TaXplLHRoaXMuY291bnQ9dC5jb3VudCx0aGlzLm5vcm1hbGl6ZWQ9dC5ub3JtYWxpemVkLHRoaXMudXNhZ2U9dC51c2FnZSx0aGlzLmdwdVR5cGU9dC5ncHVUeXBlLHRoaXN9Y29weUF0KHQsZSxuKXt0Kj10aGlzLml0ZW1TaXplLG4qPWUuaXRlbVNpemU7Zm9yKGxldCBzPTAscj10aGlzLml0ZW1TaXplO3M8cjtzKyspdGhpcy5hcnJheVt0K3NdPWUuYXJyYXlbbitzXTtyZXR1cm4gdGhpc31jb3B5QXJyYXkodCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQpLHRoaXN9YXBwbHlNYXRyaXgzKHQpe2lmKHRoaXMuaXRlbVNpemU9PT0yKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKW1zLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxtcy5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWShlLG1zLngsbXMueSk7ZWxzZSBpZih0aGlzLml0ZW1TaXplPT09Mylmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylwdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSkscHQuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylwdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSkscHQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKXB0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxwdC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLHB0LngscHQueSxwdC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspcHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLHB0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLHB0LngscHQueSxwdC56KTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IG49dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49bWkobix0aGlzLmFycmF5KSksbn1zZXRDb21wb25lbnQodCxlLG4pe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihuPUl0KG4sdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplK2VdPW4sdGhpc31nZXRYKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1taShlLHRoaXMuYXJyYXkpKSxlfXNldFgodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1JdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV09ZSx0aGlzfWdldFkodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9bWkoZSx0aGlzLmFycmF5KSksZX1zZXRZKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV09ZSx0aGlzfWdldFoodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9bWkoZSx0aGlzLmFycmF5KSksZX1zZXRaKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl09ZSx0aGlzfWdldFcodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM107cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9bWkoZSx0aGlzLmFycmF5KSksZX1zZXRXKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM109ZSx0aGlzfXNldFhZKHQsZSxuKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPUl0KGUsdGhpcy5hcnJheSksbj1JdChuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzfXNldFhZWih0LGUsbixzKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPUl0KGUsdGhpcy5hcnJheSksbj1JdChuLHRoaXMuYXJyYXkpLHM9SXQocyx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpcy5hcnJheVt0KzJdPXMsdGhpc31zZXRYWVpXKHQsZSxuLHMscil7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT1JdChlLHRoaXMuYXJyYXkpLG49SXQobix0aGlzLmFycmF5KSxzPUl0KHMsdGhpcy5hcnJheSkscj1JdChyLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09cyx0aGlzLmFycmF5W3QrM109cix0aGlzfW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCB0PXtpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LmZyb20odGhpcy5hcnJheSksbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9O3JldHVybiB0aGlzLm5hbWUhPT0iIiYmKHQubmFtZT10aGlzLm5hbWUpLHRoaXMudXNhZ2UhPT0zNTA0NCYmKHQudXNhZ2U9dGhpcy51c2FnZSksdH19Y2xhc3MgcGYgZXh0ZW5kcyB4dHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbil9fWNsYXNzIHlmIGV4dGVuZHMgeHR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50MzJBcnJheSh0KSxlLG4pfX1jbGFzcyBCZSBleHRlbmRzIHh0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgRmxvYXQzMkFycmF5KHQpLGUsbil9fWxldCBtZj0wO2NvbnN0IGp0PW5ldyBzdCxBbz1uZXcgUGUscW49bmV3IFQsVXQ9bmV3IGd0LEFpPW5ldyBndCxidD1uZXcgVDtjbGFzcyB1ZSBleHRlbmRzIG9ze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzQnVmZmVyR2VvbWV0cnk9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6bWYrK30pLHRoaXMudXVpZD1GbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9IkJ1ZmZlckdlb21ldHJ5Iix0aGlzLmluZGV4PW51bGwsdGhpcy5pbmRpcmVjdD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dGhpcy5pbmRleD1uZXcoSnUodCk/eWY6cGYpKHQsMSk6dGhpcy5pbmRleD10LHRoaXN9c2V0SW5kaXJlY3QodCl7cmV0dXJuIHRoaXMuaW5kaXJlY3Q9dCx0aGlzfWdldEluZGlyZWN0KCl7cmV0dXJuIHRoaXMuaW5kaXJlY3R9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF19c2V0QXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XT1lLHRoaXN9ZGVsZXRlQXR0cmlidXRlKHQpe3JldHVybiBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW3RdLHRoaXN9aGFzQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF0hPT12b2lkIDB9YWRkR3JvdXAodCxlLG49MCl7dGhpcy5ncm91cHMucHVzaCh7c3RhcnQ6dCxjb3VudDplLG1hdGVyaWFsSW5kZXg6bn0pfWNsZWFyR3JvdXBzKCl7dGhpcy5ncm91cHM9W119c2V0RHJhd1JhbmdlKHQsZSl7dGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dCx0aGlzLmRyYXdSYW5nZS5jb3VudD1lfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtlIT09dm9pZCAwJiYoZS5hcHBseU1hdHJpeDQodCksZS5uZWVkc1VwZGF0ZT0hMCk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2lmKG4hPT12b2lkIDApe2NvbnN0IHI9bmV3IGdlKCkuZ2V0Tm9ybWFsTWF0cml4KHQpO24uYXBwbHlOb3JtYWxNYXRyaXgociksbi5uZWVkc1VwZGF0ZT0hMH1jb25zdCBzPXRoaXMuYXR0cmlidXRlcy50YW5nZW50O3JldHVybiBzIT09dm9pZCAwJiYocy50cmFuc2Zvcm1EaXJlY3Rpb24odCkscy5uZWVkc1VwZGF0ZT0hMCksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ1NwaGVyZSE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpc31hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIGp0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIGp0Lm1ha2VSb3RhdGlvblgodCksdGhpcy5hcHBseU1hdHJpeDQoanQpLHRoaXN9cm90YXRlWSh0KXtyZXR1cm4ganQubWFrZVJvdGF0aW9uWSh0KSx0aGlzLmFwcGx5TWF0cml4NChqdCksdGhpc31yb3RhdGVaKHQpe3JldHVybiBqdC5tYWtlUm90YXRpb25aKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfXRyYW5zbGF0ZSh0LGUsbil7cmV0dXJuIGp0Lm1ha2VUcmFuc2xhdGlvbih0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoanQpLHRoaXN9c2NhbGUodCxlLG4pe3JldHVybiBqdC5tYWtlU2NhbGUodCxlLG4pLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfWxvb2tBdCh0KXtyZXR1cm4gQW8ubG9va0F0KHQpLEFvLnVwZGF0ZU1hdHJpeCgpLHRoaXMuYXBwbHlNYXRyaXg0KEFvLm1hdHJpeCksdGhpc31jZW50ZXIoKXtyZXR1cm4gdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihxbikubmVnYXRlKCksdGhpcy50cmFuc2xhdGUocW4ueCxxbi55LHFuLnopLHRoaXN9c2V0RnJvbVBvaW50cyh0KXtjb25zdCBlPXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKGU9PT12b2lkIDApe2NvbnN0IG49W107Zm9yKGxldCBzPTAscj10Lmxlbmd0aDtzPHI7cysrKXtjb25zdCBvPXRbc107bi5wdXNoKG8ueCxvLnksby56fHwwKX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBCZShuLDMpKX1lbHNle2NvbnN0IG49TWF0aC5taW4odC5sZW5ndGgsZS5jb3VudCk7Zm9yKGxldCBzPTA7czxuO3MrKyl7Y29uc3Qgcj10W3NdO2Uuc2V0WFlaKHMsci54LHIueSxyLnp8fDApfXQubGVuZ3RoPmUuY291bnQmJmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IEJ1ZmZlciBzaXplIHRvbyBzbWFsbCBmb3IgcG9pbnRzIGRhdGEuIFVzZSAuZGlzcG9zZSgpIGFuZCBjcmVhdGUgYSBuZXcgZ2VvbWV0cnkuIiksZS5uZWVkc1VwZGF0ZT0hMH1yZXR1cm4gdGhpc31jb21wdXRlQm91bmRpbmdCb3goKXt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IGd0KTtjb25zdCB0PXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbixlPXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHQmJnQuaXNHTEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIGJveC4iLHRoaXMpLHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBUKC0xLzAsLTEvMCwtMS8wKSxuZXcgVCgxLzAsMS8wLDEvMCkpO3JldHVybn1pZih0IT09dm9pZCAwKXtpZih0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IG49MCxzPWUubGVuZ3RoO248cztuKyspe2NvbnN0IHI9ZVtuXTtVdC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHIpLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KGJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5taW4sVXQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoYnQpLGJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5tYXgsVXQubWF4KSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoYnQpKToodGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFV0Lm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFV0Lm1heCkpfX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7KGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLngpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi55KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueikpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7dGhpcy5ib3VuZGluZ1NwaGVyZT09PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPW5ldyBhbyk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBzcGhlcmUuIix0aGlzKSx0aGlzLmJvdW5kaW5nU3BoZXJlLnNldChuZXcgVCwxLzApO3JldHVybn1pZih0KXtjb25zdCBuPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO2lmKFV0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVtyXTtBaS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGEpLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KGJ0LmFkZFZlY3RvcnMoVXQubWluLEFpLm1pbiksVXQuZXhwYW5kQnlQb2ludChidCksYnQuYWRkVmVjdG9ycyhVdC5tYXgsQWkubWF4KSxVdC5leHBhbmRCeVBvaW50KGJ0KSk6KFV0LmV4cGFuZEJ5UG9pbnQoQWkubWluKSxVdC5leHBhbmRCeVBvaW50KEFpLm1heCkpfVV0LmdldENlbnRlcihuKTtsZXQgcz0wO2ZvcihsZXQgcj0wLG89dC5jb3VudDtyPG87cisrKWJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxyKSxzPU1hdGgubWF4KHMsbi5kaXN0YW5jZVRvU3F1YXJlZChidCkpO2lmKGUpZm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPWVbcl0sYz10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2ZvcihsZXQgbD0wLGg9YS5jb3VudDtsPGg7bCsrKWJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxsKSxjJiYocW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGwpLGJ0LmFkZChxbikpLHM9TWF0aC5tYXgocyxuLmRpc3RhbmNlVG9TcXVhcmVkKGJ0KSl9dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM9TWF0aC5zcXJ0KHMpLGlzTmFOKHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9fWNvbXB1dGVUYW5nZW50cygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuYXR0cmlidXRlcztpZih0PT09bnVsbHx8ZS5wb3NpdGlvbj09PXZvaWQgMHx8ZS5ub3JtYWw9PT12b2lkIDB8fGUudXY9PT12b2lkIDApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgZmFpbGVkLiBNaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZXMgKGluZGV4LCBwb3NpdGlvbiwgbm9ybWFsIG9yIHV2KSIpO3JldHVybn1jb25zdCBuPWUucG9zaXRpb24scz1lLm5vcm1hbCxyPWUudXY7dGhpcy5oYXNBdHRyaWJ1dGUoInRhbmdlbnQiKT09PSExJiZ0aGlzLnNldEF0dHJpYnV0ZSgidGFuZ2VudCIsbmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkoNCpuLmNvdW50KSw0KSk7Y29uc3Qgbz10aGlzLmdldEF0dHJpYnV0ZSgidGFuZ2VudCIpLGE9W10sYz1bXTtmb3IobGV0IHY9MDt2PG4uY291bnQ7disrKWFbdl09bmV3IFQsY1t2XT1uZXcgVDtjb25zdCBsPW5ldyBULGg9bmV3IFQsdT1uZXcgVCxmPW5ldyBSLGQ9bmV3IFIscD1uZXcgUix5PW5ldyBULG09bmV3IFQ7ZnVuY3Rpb24gZyh2LFAseil7bC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sdiksaC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sUCksdS5mcm9tQnVmZmVyQXR0cmlidXRlKG4seiksZi5mcm9tQnVmZmVyQXR0cmlidXRlKHIsdiksZC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsUCkscC5mcm9tQnVmZmVyQXR0cmlidXRlKHIseiksaC5zdWIobCksdS5zdWIobCksZC5zdWIoZikscC5zdWIoZik7Y29uc3QgUz0xLyhkLngqcC55LXAueCpkLnkpO2lzRmluaXRlKFMpJiYoeS5jb3B5KGgpLm11bHRpcGx5U2NhbGFyKHAueSkuYWRkU2NhbGVkVmVjdG9yKHUsLWQueSkubXVsdGlwbHlTY2FsYXIoUyksbS5jb3B5KHUpLm11bHRpcGx5U2NhbGFyKGQueCkuYWRkU2NhbGVkVmVjdG9yKGgsLXAueCkubXVsdGlwbHlTY2FsYXIoUyksYVt2XS5hZGQoeSksYVtQXS5hZGQoeSksYVt6XS5hZGQoeSksY1t2XS5hZGQobSksY1tQXS5hZGQobSksY1t6XS5hZGQobSkpfWxldCBiPXRoaXMuZ3JvdXBzO2IubGVuZ3RoPT09MCYmKGI9W3tzdGFydDowLGNvdW50OnQuY291bnR9XSk7Zm9yKGxldCB2PTAsUD1iLmxlbmd0aDt2PFA7Kyt2KXtjb25zdCB6PWJbdl0sUz16LnN0YXJ0LEM9ei5jb3VudDtmb3IobGV0IEU9UyxGPVMrQztFPEY7RSs9MylnKHQuZ2V0WChFKzApLHQuZ2V0WChFKzEpLHQuZ2V0WChFKzIpKX1jb25zdCB3PW5ldyBULHg9bmV3IFQsTT1uZXcgVCxBPW5ldyBUO2Z1bmN0aW9uIF8odil7TS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsdiksQS5jb3B5KE0pO2NvbnN0IFA9YVt2XTt3LmNvcHkoUCksdy5zdWIoTS5tdWx0aXBseVNjYWxhcihNLmRvdChQKSkpLm5vcm1hbGl6ZSgpLHguY3Jvc3NWZWN0b3JzKEEsUCk7Y29uc3QgUz14LmRvdChjW3ZdKTwwPy0xOjE7by5zZXRYWVpXKHYsdy54LHcueSx3LnosUyl9Zm9yKGxldCB2PTAsUD1iLmxlbmd0aDt2PFA7Kyt2KXtjb25zdCB6PWJbdl0sUz16LnN0YXJ0LEM9ei5jb3VudDtmb3IobGV0IEU9UyxGPVMrQztFPEY7RSs9MylfKHQuZ2V0WChFKzApKSxfKHQuZ2V0WChFKzEpKSxfKHQuZ2V0WChFKzIpKX19Y29tcHV0ZVZlcnRleE5vcm1hbHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlIT09dm9pZCAwKXtsZXQgbj10aGlzLmdldEF0dHJpYnV0ZSgibm9ybWFsIik7aWYobj09PXZvaWQgMCluPW5ldyB4dChuZXcgRmxvYXQzMkFycmF5KGUuY291bnQqMyksMyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbik7ZWxzZSBmb3IobGV0IGY9MCxkPW4uY291bnQ7ZjxkO2YrKyluLnNldFhZWihmLDAsMCwwKTtjb25zdCBzPW5ldyBULHI9bmV3IFQsbz1uZXcgVCxhPW5ldyBULGM9bmV3IFQsbD1uZXcgVCxoPW5ldyBULHU9bmV3IFQ7aWYodClmb3IobGV0IGY9MCxkPXQuY291bnQ7ZjxkO2YrPTMpe2NvbnN0IHA9dC5nZXRYKGYrMCkseT10LmdldFgoZisxKSxtPXQuZ2V0WChmKzIpO3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHApLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHkpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG0pLGguc3ViVmVjdG9ycyhvLHIpLHUuc3ViVmVjdG9ycyhzLHIpLGguY3Jvc3ModSksYS5mcm9tQnVmZmVyQXR0cmlidXRlKG4scCksYy5mcm9tQnVmZmVyQXR0cmlidXRlKG4seSksbC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sbSksYS5hZGQoaCksYy5hZGQoaCksbC5hZGQoaCksbi5zZXRYWVoocCxhLngsYS55LGEueiksbi5zZXRYWVooeSxjLngsYy55LGMueiksbi5zZXRYWVoobSxsLngsbC55LGwueil9ZWxzZSBmb3IobGV0IGY9MCxkPWUuY291bnQ7ZjxkO2YrPTMpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZiswKSxyLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxmKzEpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYrMiksaC5zdWJWZWN0b3JzKG8sciksdS5zdWJWZWN0b3JzKHMsciksaC5jcm9zcyh1KSxuLnNldFhZWihmKzAsaC54LGgueSxoLnopLG4uc2V0WFlaKGYrMSxoLngsaC55LGgueiksbi5zZXRYWVooZisyLGgueCxoLnksaC56KTt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKSxuLm5lZWRzVXBkYXRlPSEwfX1ub3JtYWxpemVOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2ZvcihsZXQgZT0wLG49dC5jb3VudDtlPG47ZSsrKWJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxidC5ub3JtYWxpemUoKSx0LnNldFhZWihlLGJ0LngsYnQueSxidC56KX10b05vbkluZGV4ZWQoKXtmdW5jdGlvbiB0KGEsYyl7Y29uc3QgbD1hLmFycmF5LGg9YS5pdGVtU2l6ZSx1PWEubm9ybWFsaXplZCxmPW5ldyBsLmNvbnN0cnVjdG9yKGMubGVuZ3RoKmgpO2xldCBkPTAscD0wO2ZvcihsZXQgeT0wLG09Yy5sZW5ndGg7eTxtO3krKyl7YS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2Q9Y1t5XSphLmRhdGEuc3RyaWRlK2Eub2Zmc2V0OmQ9Y1t5XSpoO2ZvcihsZXQgZz0wO2c8aDtnKyspZltwKytdPWxbZCsrXX1yZXR1cm4gbmV3IHh0KGYsaCx1KX1pZih0aGlzLmluZGV4PT09bnVsbClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogQnVmZmVyR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO2NvbnN0IGU9bmV3IHVlLG49dGhpcy5pbmRleC5hcnJheSxzPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgYSBpbiBzKXtjb25zdCBjPXNbYV0sbD10KGMsbik7ZS5zZXRBdHRyaWJ1dGUoYSxsKX1jb25zdCByPXRoaXMubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBhIGluIHIpe2NvbnN0IGM9W10sbD1yW2FdO2ZvcihsZXQgaD0wLHU9bC5sZW5ndGg7aDx1O2grKyl7Y29uc3QgZj1sW2hdLGQ9dChmLG4pO2MucHVzaChkKX1lLm1vcnBoQXR0cmlidXRlc1thXT1jfWUubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXRoaXMuZ3JvdXBzO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKyl7Y29uc3QgbD1vW2FdO2UuYWRkR3JvdXAobC5zdGFydCxsLmNvdW50LGwubWF0ZXJpYWxJbmRleCl9cmV0dXJuIGV9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC42LHR5cGU6IkJ1ZmZlckdlb21ldHJ5IixnZW5lcmF0b3I6IkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiJ9fTtpZih0LnV1aWQ9dGhpcy51dWlkLHQudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJih0Lm5hbWU9dGhpcy5uYW1lKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHQudXNlckRhdGE9dGhpcy51c2VyRGF0YSksdGhpcy5wYXJhbWV0ZXJzIT09dm9pZCAwKXtjb25zdCBjPXRoaXMucGFyYW1ldGVycztmb3IoY29uc3QgbCBpbiBjKWNbbF0hPT12b2lkIDAmJih0W2xdPWNbbF0pO3JldHVybiB0fXQuZGF0YT17YXR0cmlidXRlczp7fX07Y29uc3QgZT10aGlzLmluZGV4O2UhPT1udWxsJiYodC5kYXRhLmluZGV4PXt0eXBlOmUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmFycmF5KX0pO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBjIGluIG4pe2NvbnN0IGw9bltjXTt0LmRhdGEuYXR0cmlidXRlc1tjXT1sLnRvSlNPTih0LmRhdGEpfWNvbnN0IHM9e307bGV0IHI9ITE7Zm9yKGNvbnN0IGMgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IGw9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbY10saD1bXTtmb3IobGV0IHU9MCxmPWwubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9bFt1XTtoLnB1c2goZC50b0pTT04odC5kYXRhKSl9aC5sZW5ndGg+MCYmKHNbY109aCxyPSEwKX1yJiYodC5kYXRhLm1vcnBoQXR0cmlidXRlcz1zLHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBvPXRoaXMuZ3JvdXBzO28ubGVuZ3RoPjAmJih0LmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobykpKTtjb25zdCBhPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGEhPT1udWxsJiYodC5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6YS5jZW50ZXIudG9BcnJheSgpLHJhZGl1czphLnJhZGl1c30pLHR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsO2NvbnN0IGU9e307dGhpcy5uYW1lPXQubmFtZTtjb25zdCBuPXQuaW5kZXg7biE9PW51bGwmJnRoaXMuc2V0SW5kZXgobi5jbG9uZSgpKTtjb25zdCBzPXQuYXR0cmlidXRlcztmb3IoY29uc3QgbCBpbiBzKXtjb25zdCBoPXNbbF07dGhpcy5zZXRBdHRyaWJ1dGUobCxoLmNsb25lKGUpKX1jb25zdCByPXQubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBsIGluIHIpe2NvbnN0IGg9W10sdT1yW2xdO2ZvcihsZXQgZj0wLGQ9dS5sZW5ndGg7ZjxkO2YrKyloLnB1c2godVtmXS5jbG9uZShlKSk7dGhpcy5tb3JwaEF0dHJpYnV0ZXNbbF09aH10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXQubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10Lmdyb3Vwcztmb3IobGV0IGw9MCxoPW8ubGVuZ3RoO2w8aDtsKyspe2NvbnN0IHU9b1tsXTt0aGlzLmFkZEdyb3VwKHUuc3RhcnQsdS5jb3VudCx1Lm1hdGVyaWFsSW5kZXgpfWNvbnN0IGE9dC5ib3VuZGluZ0JveDthIT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9YS5jbG9uZSgpKTtjb25zdCBjPXQuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGMhPT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1jLmNsb25lKCkpLHRoaXMuZHJhd1JhbmdlLnN0YXJ0PXQuZHJhd1JhbmdlLnN0YXJ0LHRoaXMuZHJhd1JhbmdlLmNvdW50PXQuZHJhd1JhbmdlLmNvdW50LHRoaXMudXNlckRhdGE9dC51c2VyRGF0YSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNvbnN0IGtjPW5ldyBzdCxmbj1uZXcgdW8sZ3M9bmV3IGFvLE5jPW5ldyBULHhzPW5ldyBULHdzPW5ldyBULGJzPW5ldyBULF9vPW5ldyBULE1zPW5ldyBULFJjPW5ldyBULEFzPW5ldyBUO2NsYXNzIGdmIGV4dGVuZHMgUGV7Y29uc3RydWN0b3IodD1uZXcgdWUsZT1uZXcgZmYpe3N1cGVyKCksdGhpcy5pc01lc2g9ITAsdGhpcy50eXBlPSJNZXNoIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXZvaWQgMCx0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz12b2lkIDAsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyE9PXZvaWQgMCYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPXQubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpLHQubW9ycGhUYXJnZXREaWN0aW9uYXJ5IT09dm9pZCAwJiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpLHRoaXMubWF0ZXJpYWw9QXJyYXkuaXNBcnJheSh0Lm1hdGVyaWFsKT90Lm1hdGVyaWFsLnNsaWNlKCk6dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc311cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCBlPXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3Qgcz1lW25bMF1dO2lmKHMhPT12b2lkIDApe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1zW3JdLm5hbWV8fFN0cmluZyhyKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2FdPXJ9fX19Z2V0VmVydGV4UG9zaXRpb24odCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnkscz1uLmF0dHJpYnV0ZXMucG9zaXRpb24scj1uLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixvPW4ubW9ycGhUYXJnZXRzUmVsYXRpdmU7ZS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsdCk7Y29uc3QgYT10aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztpZihyJiZhKXtNcy5zZXQoMCwwLDApO2ZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1hW2NdLHU9cltjXTtoIT09MCYmKF9vLmZyb21CdWZmZXJBdHRyaWJ1dGUodSx0KSxvP01zLmFkZFNjYWxlZFZlY3RvcihfbyxoKTpNcy5hZGRTY2FsZWRWZWN0b3IoX28uc3ViKGUpLGgpKX1lLmFkZChNcyl9cmV0dXJuIGV9cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxzPXRoaXMubWF0ZXJpYWwscj10aGlzLm1hdHJpeFdvcmxkO3MhPT12b2lkIDAmJihuLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxncy5jb3B5KG4uYm91bmRpbmdTcGhlcmUpLGdzLmFwcGx5TWF0cml4NChyKSxmbi5jb3B5KHQucmF5KS5yZWNhc3QodC5uZWFyKSwhKGdzLmNvbnRhaW5zUG9pbnQoZm4ub3JpZ2luKT09PSExJiYoZm4uaW50ZXJzZWN0U3BoZXJlKGdzLE5jKT09PW51bGx8fGZuLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZChOYyk+eWkodC5mYXItdC5uZWFyLDIpKSkmJihrYy5jb3B5KHIpLmludmVydCgpLGZuLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChrYyksIShuLmJvdW5kaW5nQm94IT09bnVsbCYmZm4uaW50ZXJzZWN0c0JveChuLmJvdW5kaW5nQm94KT09PSExKSYmdGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnModCxlLGZuKSkpfV9jb21wdXRlSW50ZXJzZWN0aW9ucyh0LGUsbil7bGV0IHM7Y29uc3Qgcj10aGlzLmdlb21ldHJ5LG89dGhpcy5tYXRlcmlhbCxhPXIuaW5kZXgsYz1yLmF0dHJpYnV0ZXMucG9zaXRpb24sbD1yLmF0dHJpYnV0ZXMudXYsaD1yLmF0dHJpYnV0ZXMudXYxLHU9ci5hdHRyaWJ1dGVzLm5vcm1hbCxmPXIuZ3JvdXBzLGQ9ci5kcmF3UmFuZ2U7aWYoYSE9PW51bGwpaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IG09ZltwXSxnPW9bbS5tYXRlcmlhbEluZGV4XSxiPU1hdGgubWF4KG0uc3RhcnQsZC5zdGFydCksdz1NYXRoLm1pbihhLmNvdW50LE1hdGgubWluKG0uc3RhcnQrbS5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IHg9YixNPXc7eDxNO3grPTMpe2NvbnN0IEE9YS5nZXRYKHgpLF89YS5nZXRYKHgrMSksdj1hLmdldFgoeCsyKTtzPV9zKHRoaXMsZyx0LG4sbCxoLHUsQSxfLHYpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKHgvMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9bS5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4oYS5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgbT1wLGc9eTttPGc7bSs9Myl7Y29uc3QgYj1hLmdldFgobSksdz1hLmdldFgobSsxKSx4PWEuZ2V0WChtKzIpO3M9X3ModGhpcyxvLHQsbixsLGgsdSxiLHcseCkscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IobS8zKSxlLnB1c2gocykpfX1lbHNlIGlmKGMhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IG09ZltwXSxnPW9bbS5tYXRlcmlhbEluZGV4XSxiPU1hdGgubWF4KG0uc3RhcnQsZC5zdGFydCksdz1NYXRoLm1pbihjLmNvdW50LE1hdGgubWluKG0uc3RhcnQrbS5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IHg9YixNPXc7eDxNO3grPTMpe2NvbnN0IEE9eCxfPXgrMSx2PXgrMjtzPV9zKHRoaXMsZyx0LG4sbCxoLHUsQSxfLHYpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKHgvMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9bS5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4oYy5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgbT1wLGc9eTttPGc7bSs9Myl7Y29uc3QgYj1tLHc9bSsxLHg9bSsyO3M9X3ModGhpcyxvLHQsbixsLGgsdSxiLHcseCkscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IobS8zKSxlLnB1c2gocykpfX19fWZ1bmN0aW9uIHhmKGksdCxlLG4scyxyLG8sYSl7bGV0IGM7aWYodC5zaWRlPT09MT9jPW4uaW50ZXJzZWN0VHJpYW5nbGUobyxyLHMsITAsYSk6Yz1uLmludGVyc2VjdFRyaWFuZ2xlKHMscixvLHQuc2lkZT09PTAsYSksYz09PW51bGwpcmV0dXJuIG51bGw7QXMuY29weShhKSxBcy5hcHBseU1hdHJpeDQoaS5tYXRyaXhXb3JsZCk7Y29uc3QgbD1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhBcyk7cmV0dXJuIGw8ZS5uZWFyfHxsPmUuZmFyP251bGw6e2Rpc3RhbmNlOmwscG9pbnQ6QXMuY2xvbmUoKSxvYmplY3Q6aX19ZnVuY3Rpb24gX3MoaSx0LGUsbixzLHIsbyxhLGMsbCl7aS5nZXRWZXJ0ZXhQb3NpdGlvbihhLHhzKSxpLmdldFZlcnRleFBvc2l0aW9uKGMsd3MpLGkuZ2V0VmVydGV4UG9zaXRpb24obCxicyk7Y29uc3QgaD14ZihpLHQsZSxuLHhzLHdzLGJzLFJjKTtpZihoKXtjb25zdCB1PW5ldyBUO2V0LmdldEJhcnljb29yZChSYyx4cyx3cyxicyx1KSxzJiYoaC51dj1ldC5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUocyxhLGMsbCx1LG5ldyBSKSksciYmKGgudXYxPWV0LmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShyLGEsYyxsLHUsbmV3IFIpKSxvJiYoaC5ub3JtYWw9ZXQuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKG8sYSxjLGwsdSxuZXcgVCksaC5ub3JtYWwuZG90KG4uZGlyZWN0aW9uKT4wJiZoLm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSkpO2NvbnN0IGY9e2EsYjpjLGM6bCxub3JtYWw6bmV3IFQsbWF0ZXJpYWxJbmRleDowfTtldC5nZXROb3JtYWwoeHMsd3MsYnMsZi5ub3JtYWwpLGguZmFjZT1mLGguYmFyeWNvb3JkPXV9cmV0dXJuIGh9Y29uc3Qgdm89bmV3IFQsd2Y9bmV3IFQsYmY9bmV3IGdlO2NsYXNzIFNve2NvbnN0cnVjdG9yKHQ9bmV3IFQoMSwwLDApLGU9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPXQsdGhpcy5jb25zdGFudD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9ZSx0aGlzfXNldENvbXBvbmVudHModCxlLG4scyl7cmV0dXJuIHRoaXMubm9ybWFsLnNldCh0LGUsbiksdGhpcy5jb25zdGFudD1zLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PS1lLmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHModCxlLG4pe2NvbnN0IHM9dm8uc3ViVmVjdG9ycyhuLGUpLmNyb3NzKHdmLnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQocyx0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSl9aW50ZXJzZWN0TGluZSh0LGUpe2NvbnN0IG49dC5kZWx0YSh2bykscz10aGlzLm5vcm1hbC5kb3Qobik7aWYocz09PTApcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpPT09MD9lLmNvcHkodC5zdGFydCk6bnVsbDtjb25zdCByPS0odC5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL3M7cmV0dXJuIHI8MHx8cj4xP251bGw6ZS5jb3B5KHQuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihuLHIpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCksbj10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmbj4wfHxuPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBuPWV8fGJmLmdldE5vcm1hbE1hdHJpeCh0KSxzPXRoaXMuY29wbGFuYXJQb2ludCh2bykuYXBwbHlNYXRyaXg0KHQpLHI9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKG4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1zLmRvdChyKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWxldCB4ZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZT0iQ3VydmUiLHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPTIwMCx0aGlzLm5lZWRzVXBkYXRlPSExLHRoaXMuY2FjaGVBcmNMZW5ndGhzPW51bGx9Z2V0UG9pbnQoKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuIil9Z2V0UG9pbnRBdCh0LGUpe2NvbnN0IG49dGhpcy5nZXRVdG9UbWFwcGluZyh0KTtyZXR1cm4gdGhpcy5nZXRQb2ludChuLGUpfWdldFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnQobi90KSk7cmV0dXJuIGV9Z2V0U3BhY2VkUG9pbnRzKHQ9NSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPD10O24rKyllLnB1c2godGhpcy5nZXRQb2ludEF0KG4vdCkpO3JldHVybiBlfWdldExlbmd0aCgpe2NvbnN0IHQ9dGhpcy5nZXRMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19Z2V0TGVuZ3Rocyh0PXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zKXtpZih0aGlzLmNhY2hlQXJjTGVuZ3RocyYmdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoPT09dCsxJiYhdGhpcy5uZWVkc1VwZGF0ZSlyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7dGhpcy5uZWVkc1VwZGF0ZT0hMTtjb25zdCBlPVtdO2xldCBuLHM9dGhpcy5nZXRQb2ludCgwKSxyPTA7ZS5wdXNoKDApO2ZvcihsZXQgbz0xO288PXQ7bysrKW49dGhpcy5nZXRQb2ludChvL3QpLHIrPW4uZGlzdGFuY2VUbyhzKSxlLnB1c2gocikscz1uO3JldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Rocz1lLGV9dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5nZXRMZW5ndGhzKCl9Z2V0VXRvVG1hcHBpbmcodCxlPW51bGwpe2NvbnN0IG49dGhpcy5nZXRMZW5ndGhzKCk7bGV0IHM9MDtjb25zdCByPW4ubGVuZ3RoO2xldCBvO2U/bz1lOm89dCpuW3ItMV07bGV0IGE9MCxjPXItMSxsO2Zvcig7YTw9YzspaWYocz1NYXRoLmZsb29yKGErKGMtYSkvMiksbD1uW3NdLW8sbDwwKWE9cysxO2Vsc2UgaWYobD4wKWM9cy0xO2Vsc2V7Yz1zO2JyZWFrfWlmKHM9YyxuW3NdPT09bylyZXR1cm4gcy8oci0xKTtjb25zdCBoPW5bc10sZj1uW3MrMV0taCxkPShvLWgpL2Y7cmV0dXJuKHMrZCkvKHItMSl9Z2V0VGFuZ2VudCh0LGUpe2xldCBzPXQtMWUtNCxyPXQrMWUtNDtzPDAmJihzPTApLHI+MSYmKHI9MSk7Y29uc3Qgbz10aGlzLmdldFBvaW50KHMpLGE9dGhpcy5nZXRQb2ludChyKSxjPWV8fChvLmlzVmVjdG9yMj9uZXcgUjpuZXcgVCk7cmV0dXJuIGMuY29weShhKS5zdWIobykubm9ybWFsaXplKCksY31nZXRUYW5nZW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChuLGUpfWNvbXB1dGVGcmVuZXRGcmFtZXModCxlPSExKXtjb25zdCBuPW5ldyBULHM9W10scj1bXSxvPVtdLGE9bmV3IFQsYz1uZXcgc3Q7Zm9yKGxldCBkPTA7ZDw9dDtkKyspe2NvbnN0IHA9ZC90O3NbZF09dGhpcy5nZXRUYW5nZW50QXQocCxuZXcgVCl9clswXT1uZXcgVCxvWzBdPW5ldyBUO2xldCBsPU51bWJlci5NQVhfVkFMVUU7Y29uc3QgaD1NYXRoLmFicyhzWzBdLngpLHU9TWF0aC5hYnMoc1swXS55KSxmPU1hdGguYWJzKHNbMF0ueik7aDw9bCYmKGw9aCxuLnNldCgxLDAsMCkpLHU8PWwmJihsPXUsbi5zZXQoMCwxLDApKSxmPD1sJiZuLnNldCgwLDAsMSksYS5jcm9zc1ZlY3RvcnMoc1swXSxuKS5ub3JtYWxpemUoKSxyWzBdLmNyb3NzVmVjdG9ycyhzWzBdLGEpLG9bMF0uY3Jvc3NWZWN0b3JzKHNbMF0sclswXSk7Zm9yKGxldCBkPTE7ZDw9dDtkKyspe2lmKHJbZF09cltkLTFdLmNsb25lKCksb1tkXT1vW2QtMV0uY2xvbmUoKSxhLmNyb3NzVmVjdG9ycyhzW2QtMV0sc1tkXSksYS5sZW5ndGgoKT5OdW1iZXIuRVBTSUxPTil7YS5ub3JtYWxpemUoKTtjb25zdCBwPU1hdGguYWNvcyhaKHNbZC0xXS5kb3Qoc1tkXSksLTEsMSkpO3JbZF0uYXBwbHlNYXRyaXg0KGMubWFrZVJvdGF0aW9uQXhpcyhhLHApKX1vW2RdLmNyb3NzVmVjdG9ycyhzW2RdLHJbZF0pfWlmKGU9PT0hMCl7bGV0IGQ9TWF0aC5hY29zKFooclswXS5kb3Qoclt0XSksLTEsMSkpO2QvPXQsc1swXS5kb3QoYS5jcm9zc1ZlY3RvcnMoclswXSxyW3RdKSk+MCYmKGQ9LWQpO2ZvcihsZXQgcD0xO3A8PXQ7cCsrKXJbcF0uYXBwbHlNYXRyaXg0KGMubWFrZVJvdGF0aW9uQXhpcyhzW3BdLGQqcCkpLG9bcF0uY3Jvc3NWZWN0b3JzKHNbcF0scltwXSl9cmV0dXJue3RhbmdlbnRzOnMsbm9ybWFsczpyLGJpbm9ybWFsczpvfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9dC5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc310b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O3JldHVybiB0LmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyx0LnR5cGU9dGhpcy50eXBlLHR9ZnJvbUpTT04odCl7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPXQuYXJjTGVuZ3RoRGl2aXNpb25zLHRoaXN9fTtjbGFzcyB2cyBleHRlbmRzIHhle2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0xLHM9MSxyPTAsbz1NYXRoLlBJKjIsYT0hMSxjPTApe3N1cGVyKCksdGhpcy5pc0VsbGlwc2VDdXJ2ZT0hMCx0aGlzLnR5cGU9IkVsbGlwc2VDdXJ2ZSIsdGhpcy5hWD10LHRoaXMuYVk9ZSx0aGlzLnhSYWRpdXM9bix0aGlzLnlSYWRpdXM9cyx0aGlzLmFTdGFydEFuZ2xlPXIsdGhpcy5hRW5kQW5nbGU9byx0aGlzLmFDbG9ja3dpc2U9YSx0aGlzLmFSb3RhdGlvbj1jfWdldFBvaW50KHQsZT1uZXcgUil7Y29uc3Qgbj1lLHM9TWF0aC5QSSoyO2xldCByPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGU7Y29uc3Qgbz1NYXRoLmFicyhyKTxOdW1iZXIuRVBTSUxPTjtmb3IoO3I8MDspcis9cztmb3IoO3I+czspci09cztyPE51bWJlci5FUFNJTE9OJiYobz9yPTA6cj1zKSx0aGlzLmFDbG9ja3dpc2U9PT0hMCYmIW8mJihyPT09cz9yPS1zOnI9ci1zKTtjb25zdCBhPXRoaXMuYVN0YXJ0QW5nbGUrdCpyO2xldCBjPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGEpLGw9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4oYSk7aWYodGhpcy5hUm90YXRpb24hPT0wKXtjb25zdCBoPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSx1PU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxmPWMtdGhpcy5hWCxkPWwtdGhpcy5hWTtjPWYqaC1kKnUrdGhpcy5hWCxsPWYqdStkKmgrdGhpcy5hWX1yZXR1cm4gbi5zZXQoYyxsKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5hWD10aGlzLmFYLHQuYVk9dGhpcy5hWSx0LnhSYWRpdXM9dGhpcy54UmFkaXVzLHQueVJhZGl1cz10aGlzLnlSYWRpdXMsdC5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLHQuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLHQuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsdC5hUm90YXRpb249dGhpcy5hUm90YXRpb24sdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc319Y2xhc3MgTGMgZXh0ZW5kcyB2c3tjb25zdHJ1Y3Rvcih0LGUsbixzLHIsbyl7c3VwZXIodCxlLG4sbixzLHIsbyksdGhpcy5pc0FyY0N1cnZlPSEwLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiB6bygpe2xldCBpPTAsdD0wLGU9MCxuPTA7ZnVuY3Rpb24gcyhyLG8sYSxjKXtpPXIsdD1hLGU9LTMqciszKm8tMiphLWMsbj0yKnItMipvK2ErY31yZXR1cm57aW5pdENhdG11bGxSb206ZnVuY3Rpb24ocixvLGEsYyxsKXtzKG8sYSxsKihhLXIpLGwqKGMtbykpfSxpbml0Tm9udW5pZm9ybUNhdG11bGxSb206ZnVuY3Rpb24ocixvLGEsYyxsLGgsdSl7bGV0IGY9KG8tcikvbC0oYS1yKS8obCtoKSsoYS1vKS9oLGQ9KGEtbykvaC0oYy1vKS8oaCt1KSsoYy1hKS91O2YqPWgsZCo9aCxzKG8sYSxmLGQpfSxjYWxjOmZ1bmN0aW9uKHIpe2NvbnN0IG89cipyLGE9bypyO3JldHVybiBpK3QqcitlKm8rbiphfX19Y29uc3QgU3M9bmV3IFQsVG89bmV3IHpvLFBvPW5ldyB6byxFbz1uZXcgem87Y2xhc3MgT2MgZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PVtdLGU9ITEsbj0iY2VudHJpcGV0YWwiLHM9LjUpe3N1cGVyKCksdGhpcy5pc0NhdG11bGxSb21DdXJ2ZTM9ITAsdGhpcy50eXBlPSJDYXRtdWxsUm9tQ3VydmUzIix0aGlzLnBvaW50cz10LHRoaXMuY2xvc2VkPWUsdGhpcy5jdXJ2ZVR5cGU9bix0aGlzLnRlbnNpb249c31nZXRQb2ludCh0LGU9bmV3IFQpe2NvbnN0IG49ZSxzPXRoaXMucG9pbnRzLHI9cy5sZW5ndGgsbz0oci0odGhpcy5jbG9zZWQ/MDoxKSkqdDtsZXQgYT1NYXRoLmZsb29yKG8pLGM9by1hO3RoaXMuY2xvc2VkP2ErPWE+MD8wOihNYXRoLmZsb29yKE1hdGguYWJzKGEpL3IpKzEpKnI6Yz09PTAmJmE9PT1yLTEmJihhPXItMixjPTEpO2xldCBsLGg7dGhpcy5jbG9zZWR8fGE+MD9sPXNbKGEtMSklcl06KFNzLnN1YlZlY3RvcnMoc1swXSxzWzFdKS5hZGQoc1swXSksbD1Tcyk7Y29uc3QgdT1zW2Elcl0sZj1zWyhhKzEpJXJdO2lmKHRoaXMuY2xvc2VkfHxhKzI8cj9oPXNbKGErMiklcl06KFNzLnN1YlZlY3RvcnMoc1tyLTFdLHNbci0yXSkuYWRkKHNbci0xXSksaD1TcyksdGhpcy5jdXJ2ZVR5cGU9PT0iY2VudHJpcGV0YWwifHx0aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIil7Y29uc3QgZD10aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIj8uNTouMjU7bGV0IHA9TWF0aC5wb3cobC5kaXN0YW5jZVRvU3F1YXJlZCh1KSxkKSx5PU1hdGgucG93KHUuZGlzdGFuY2VUb1NxdWFyZWQoZiksZCksbT1NYXRoLnBvdyhmLmRpc3RhbmNlVG9TcXVhcmVkKGgpLGQpO3k8MWUtNCYmKHk9MSkscDwxZS00JiYocD15KSxtPDFlLTQmJihtPXkpLFRvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLngsdS54LGYueCxoLngscCx5LG0pLFBvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLnksdS55LGYueSxoLnkscCx5LG0pLEVvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLnosdS56LGYueixoLnoscCx5LG0pfWVsc2UgdGhpcy5jdXJ2ZVR5cGU9PT0iY2F0bXVsbHJvbSImJihUby5pbml0Q2F0bXVsbFJvbShsLngsdS54LGYueCxoLngsdGhpcy50ZW5zaW9uKSxQby5pbml0Q2F0bXVsbFJvbShsLnksdS55LGYueSxoLnksdGhpcy50ZW5zaW9uKSxFby5pbml0Q2F0bXVsbFJvbShsLnosdS56LGYueixoLnosdGhpcy50ZW5zaW9uKSk7cmV0dXJuIG4uc2V0KFRvLmNhbGMoYyksUG8uY2FsYyhjKSxFby5jYWxjKGMpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpcy5jbG9zZWQ9dC5jbG9zZWQsdGhpcy5jdXJ2ZVR5cGU9dC5jdXJ2ZVR5cGUsdGhpcy50ZW5zaW9uPXQudGVuc2lvbix0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHMudG9BcnJheSgpKX1yZXR1cm4gdC5jbG9zZWQ9dGhpcy5jbG9zZWQsdC5jdXJ2ZVR5cGU9dGhpcy5jdXJ2ZVR5cGUsdC50ZW5zaW9uPXRoaXMudGVuc2lvbix0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChuZXcgVCgpLmZyb21BcnJheShzKSl9cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc319ZnVuY3Rpb24gRGMoaSx0LGUsbixzKXtjb25zdCByPShuLXQpKi41LG89KHMtZSkqLjUsYT1pKmksYz1pKmE7cmV0dXJuKDIqZS0yKm4rcitvKSpjKygtMyplKzMqbi0yKnItbykqYStyKmkrZX1mdW5jdGlvbiBNZihpLHQpe2NvbnN0IGU9MS1pO3JldHVybiBlKmUqdH1mdW5jdGlvbiBBZihpLHQpe3JldHVybiAyKigxLWkpKmkqdH1mdW5jdGlvbiBfZihpLHQpe3JldHVybiBpKmkqdH1mdW5jdGlvbiBfaShpLHQsZSxuKXtyZXR1cm4gTWYoaSx0KStBZihpLGUpK19mKGksbil9ZnVuY3Rpb24gdmYoaSx0KXtjb25zdCBlPTEtaTtyZXR1cm4gZSplKmUqdH1mdW5jdGlvbiBTZihpLHQpe2NvbnN0IGU9MS1pO3JldHVybiAzKmUqZSppKnR9ZnVuY3Rpb24gemYoaSx0KXtyZXR1cm4gMyooMS1pKSppKmkqdH1mdW5jdGlvbiBUZihpLHQpe3JldHVybiBpKmkqaSp0fWZ1bmN0aW9uIHZpKGksdCxlLG4scyl7cmV0dXJuIHZmKGksdCkrU2YoaSxlKSt6ZihpLG4pK1RmKGkscyl9Y2xhc3MgQ28gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBSLGU9bmV3IFIsbj1uZXcgUixzPW5ldyBSKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlPSEwLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1zfWdldFBvaW50KHQsZT1uZXcgUil7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyLGE9dGhpcy52MztyZXR1cm4gbi5zZXQodmkodCxzLngsci54LG8ueCxhLngpLHZpKHQscy55LHIueSxvLnksYS55KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3MgJGMgZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQsbj1uZXcgVCxzPW5ldyBUKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlMz0hMCx0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bix0aGlzLnYzPXN9Z2V0UG9pbnQodCxlPW5ldyBUKXtjb25zdCBuPWUscz10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjIsYT10aGlzLnYzO3JldHVybiBuLnNldCh2aSh0LHMueCxyLngsby54LGEueCksdmkodCxzLnksci55LG8ueSxhLnkpLHZpKHQscy56LHIueixvLnosYS56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3MgQm8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBSLGU9bmV3IFIpe3N1cGVyKCksdGhpcy5pc0xpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZSIsdGhpcy52MT10LHRoaXMudjI9ZX1nZXRQb2ludCh0LGU9bmV3IFIpe2NvbnN0IG49ZTtyZXR1cm4gdD09PTE/bi5jb3B5KHRoaXMudjIpOihuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLG4ubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMudjEpKSxufWdldFBvaW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRQb2ludCh0LGUpfWdldFRhbmdlbnQodCxlPW5ldyBSKXtyZXR1cm4gZS5zdWJWZWN0b3JzKHRoaXMudjIsdGhpcy52MSkubm9ybWFsaXplKCl9Z2V0VGFuZ2VudEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCh0LGUpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBVYyBleHRlbmRzIHhle2NvbnN0cnVjdG9yKHQ9bmV3IFQsZT1uZXcgVCl7c3VwZXIoKSx0aGlzLmlzTGluZUN1cnZlMz0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiLHRoaXMudjE9dCx0aGlzLnYyPWV9Z2V0UG9pbnQodCxlPW5ldyBUKXtjb25zdCBuPWU7cmV0dXJuIHQ9PT0xP24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZT1uZXcgVCl7cmV0dXJuIGUuc3ViVmVjdG9ycyh0aGlzLnYyLHRoaXMudjEpLm5vcm1hbGl6ZSgpfWdldFRhbmdlbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFRhbmdlbnQodCxlKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgRm8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBSLGU9bmV3IFIsbj1uZXcgUil7c3VwZXIoKSx0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW59Z2V0UG9pbnQodCxlPW5ldyBSKXtjb25zdCBuPWUscz10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjI7cmV0dXJuIG4uc2V0KF9pKHQscy54LHIueCxvLngpLF9pKHQscy55LHIueSxvLnkpKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBWYyBleHRlbmRzIHhle2NvbnN0cnVjdG9yKHQ9bmV3IFQsZT1uZXcgVCxuPW5ldyBUKXtzdXBlcigpLHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgVCl7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyO3JldHVybiBuLnNldChfaSh0LHMueCxyLngsby54KSxfaSh0LHMueSxyLnksby55KSxfaSh0LHMueixyLnosby56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgSW8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMuaXNTcGxpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IlNwbGluZUN1cnZlIix0aGlzLnBvaW50cz10fWdldFBvaW50KHQsZT1uZXcgUil7Y29uc3Qgbj1lLHM9dGhpcy5wb2ludHMscj0ocy5sZW5ndGgtMSkqdCxvPU1hdGguZmxvb3IociksYT1yLW8sYz1zW289PT0wP286by0xXSxsPXNbb10saD1zW28+cy5sZW5ndGgtMj9zLmxlbmd0aC0xOm8rMV0sdT1zW28+cy5sZW5ndGgtMz9zLmxlbmd0aC0xOm8rMl07cmV0dXJuIG4uc2V0KERjKGEsYy54LGwueCxoLngsdS54KSxEYyhhLGMueSxsLnksaC55LHUueSkpLG59Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChzLmNsb25lKCkpfXJldHVybiB0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHMudG9BcnJheSgpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gobmV3IFIoKS5mcm9tQXJyYXkocykpfXJldHVybiB0aGlzfX12YXIgcWM9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6TGMsQ2F0bXVsbFJvbUN1cnZlMzpPYyxDdWJpY0JlemllckN1cnZlOkNvLEN1YmljQmV6aWVyQ3VydmUzOiRjLEVsbGlwc2VDdXJ2ZTp2cyxMaW5lQ3VydmU6Qm8sTGluZUN1cnZlMzpVYyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpGbyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6VmMsU3BsaW5lQ3VydmU6SW99KTtjbGFzcyBQZiBleHRlbmRzIHhle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkN1cnZlUGF0aCIsdGhpcy5jdXJ2ZXM9W10sdGhpcy5hdXRvQ2xvc2U9ITF9YWRkKHQpe3RoaXMuY3VydmVzLnB1c2godCl9Y2xvc2VQYXRoKCl7Y29uc3QgdD10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSxlPXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTtpZighdC5lcXVhbHMoZSkpe2NvbnN0IG49dC5pc1ZlY3RvcjI9PT0hMD8iTGluZUN1cnZlIjoiTGluZUN1cnZlMyI7dGhpcy5jdXJ2ZXMucHVzaChuZXcgcWNbbl0oZSx0KSl9cmV0dXJuIHRoaXN9Z2V0UG9pbnQodCxlKXtjb25zdCBuPXQqdGhpcy5nZXRMZW5ndGgoKSxzPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7bGV0IHI9MDtmb3IoO3I8cy5sZW5ndGg7KXtpZihzW3JdPj1uKXtjb25zdCBvPXNbcl0tbixhPXRoaXMuY3VydmVzW3JdLGM9YS5nZXRMZW5ndGgoKSxsPWM9PT0wPzA6MS1vL2M7cmV0dXJuIGEuZ2V0UG9pbnRBdChsLGUpfXIrK31yZXR1cm4gbnVsbH1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5jYWNoZUxlbmd0aHM9bnVsbCx0aGlzLmdldEN1cnZlTGVuZ3RocygpfWdldEN1cnZlTGVuZ3Rocygpe2lmKHRoaXMuY2FjaGVMZW5ndGhzJiZ0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGg9PT10aGlzLmN1cnZlcy5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO2NvbnN0IHQ9W107bGV0IGU9MDtmb3IobGV0IG49MCxzPXRoaXMuY3VydmVzLmxlbmd0aDtuPHM7bisrKWUrPXRoaXMuY3VydmVzW25dLmdldExlbmd0aCgpLHQucHVzaChlKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9dCx0fWdldFNwYWNlZFBvaW50cyh0PTQwKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5wdXNoKGVbMF0pLGV9Z2V0UG9pbnRzKHQ9MTIpe2NvbnN0IGU9W107bGV0IG47Zm9yKGxldCBzPTAscj10aGlzLmN1cnZlcztzPHIubGVuZ3RoO3MrKyl7Y29uc3Qgbz1yW3NdLGE9by5pc0VsbGlwc2VDdXJ2ZT90KjI6by5pc0xpbmVDdXJ2ZXx8by5pc0xpbmVDdXJ2ZTM/MTpvLmlzU3BsaW5lQ3VydmU/dCpvLnBvaW50cy5sZW5ndGg6dCxjPW8uZ2V0UG9pbnRzKGEpO2ZvcihsZXQgbD0wO2w8Yy5sZW5ndGg7bCsrKXtjb25zdCBoPWNbbF07biYmbi5lcXVhbHMoaCl8fChlLnB1c2goaCksbj1oKX19cmV0dXJuIHRoaXMuYXV0b0Nsb3NlJiZlLmxlbmd0aD4xJiYhZVtlLmxlbmd0aC0xXS5lcXVhbHMoZVswXSkmJmUucHVzaChlWzBdKSxlfWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlLHQuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dGhpcy5jdXJ2ZXNbZV07dC5jdXJ2ZXMucHVzaChzLnRvSlNPTigpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2gobmV3IHFjW3MudHlwZV0oKS5mcm9tSlNPTihzKSl9cmV0dXJuIHRoaXN9fWxldCBIYz1jbGFzcyBleHRlbmRzIFBme2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJQYXRoIix0aGlzLmN1cnJlbnRQb2ludD1uZXcgUix0JiZ0aGlzLnNldEZyb21Qb2ludHModCl9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1vdmVUbyh0WzBdLngsdFswXS55KTtmb3IobGV0IGU9MSxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5saW5lVG8odFtlXS54LHRbZV0ueSk7cmV0dXJuIHRoaXN9bW92ZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBvaW50LnNldCh0LGUpLHRoaXN9bGluZVRvKHQsZSl7Y29uc3Qgbj1uZXcgQm8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgUih0LGUpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQodCxlKSx0aGlzfXF1YWRyYXRpY0N1cnZlVG8odCxlLG4scyl7Y29uc3Qgcj1uZXcgRm8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgUih0LGUpLG5ldyBSKG4scykpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKHIpLHRoaXMuY3VycmVudFBvaW50LnNldChuLHMpLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsbixzLHIsbyl7Y29uc3QgYT1uZXcgQ28odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgUih0LGUpLG5ldyBSKG4scyksbmV3IFIocixvKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2goYSksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHIsbyksdGhpc31zcGxpbmVUaHJ1KHQpe2NvbnN0IGU9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdCh0KSxuPW5ldyBJbyhlKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHRbdC5sZW5ndGgtMV0pLHRoaXN9YXJjKHQsZSxuLHMscixvKXtjb25zdCBhPXRoaXMuY3VycmVudFBvaW50LngsYz10aGlzLmN1cnJlbnRQb2ludC55O3JldHVybiB0aGlzLmFic2FyYyh0K2EsZStjLG4scyxyLG8pLHRoaXN9YWJzYXJjKHQsZSxuLHMscixvKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQsZSxuLG4scyxyLG8pLHRoaXN9ZWxsaXBzZSh0LGUsbixzLHIsbyxhLGMpe2NvbnN0IGw9dGhpcy5jdXJyZW50UG9pbnQueCxoPXRoaXMuY3VycmVudFBvaW50Lnk7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0K2wsZStoLG4scyxyLG8sYSxjKSx0aGlzfWFic2VsbGlwc2UodCxlLG4scyxyLG8sYSxjKXtjb25zdCBsPW5ldyB2cyh0LGUsbixzLHIsbyxhLGMpO2lmKHRoaXMuY3VydmVzLmxlbmd0aD4wKXtjb25zdCB1PWwuZ2V0UG9pbnQoMCk7dS5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyh1LngsdS55KX10aGlzLmN1cnZlcy5wdXNoKGwpO2NvbnN0IGg9bC5nZXRQb2ludCgxKTtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuY29weShoKSx0aGlzfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jdXJyZW50UG9pbnQuY29weSh0LmN1cnJlbnRQb2ludCksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KHQuY3VycmVudFBvaW50KSx0aGlzfX07Y2xhc3MgV2MgZXh0ZW5kcyBIY3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnV1aWQ9Rm4oKSx0aGlzLnR5cGU9IlNoYXBlIix0aGlzLmhvbGVzPVtdfWdldFBvaW50c0hvbGVzKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTAscz10aGlzLmhvbGVzLmxlbmd0aDtuPHM7bisrKWVbbl09dGhpcy5ob2xlc1tuXS5nZXRQb2ludHModCk7cmV0dXJuIGV9ZXh0cmFjdFBvaW50cyh0KXtyZXR1cm57c2hhcGU6dGhpcy5nZXRQb2ludHModCksaG9sZXM6dGhpcy5nZXRQb2ludHNIb2xlcyh0KX19Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10LmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuaG9sZXNbZV07dGhpcy5ob2xlcy5wdXNoKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnV1aWQ9dGhpcy51dWlkLHQuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10aGlzLmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXRoaXMuaG9sZXNbZV07dC5ob2xlcy5wdXNoKHMudG9KU09OKCkpfXJldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMudXVpZD10LnV1aWQsdGhpcy5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXQuaG9sZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5ob2xlc1tlXTt0aGlzLmhvbGVzLnB1c2gobmV3IEhjKCkuZnJvbUpTT04ocykpfXJldHVybiB0aGlzfX1mdW5jdGlvbiBFZihpLHQsZT0yKXtjb25zdCBuPXQmJnQubGVuZ3RoLHM9bj90WzBdKmU6aS5sZW5ndGg7bGV0IHI9R2MoaSwwLHMsZSwhMCk7Y29uc3Qgbz1bXTtpZighcnx8ci5uZXh0PT09ci5wcmV2KXJldHVybiBvO2xldCBhLGMsbDtpZihuJiYocj1rZihpLHQscixlKSksaS5sZW5ndGg+ODAqZSl7YT0xLzAsYz0xLzA7bGV0IGg9LTEvMCx1PS0xLzA7Zm9yKGxldCBmPWU7ZjxzO2YrPWUpe2NvbnN0IGQ9aVtmXSxwPWlbZisxXTtkPGEmJihhPWQpLHA8YyYmKGM9cCksZD5oJiYoaD1kKSxwPnUmJih1PXApfWw9TWF0aC5tYXgoaC1hLHUtYyksbD1sIT09MD8zMjc2Ny9sOjB9cmV0dXJuIFNpKHIsbyxlLGEsYyxsLDApLG99ZnVuY3Rpb24gR2MoaSx0LGUsbixzKXtsZXQgcjtpZihzPT09V2YoaSx0LGUsbik+MClmb3IobGV0IG89dDtvPGU7bys9bilyPVljKG8vbnwwLGlbb10saVtvKzFdLHIpO2Vsc2UgZm9yKGxldCBvPWUtbjtvPj10O28tPW4pcj1ZYyhvL258MCxpW29dLGlbbysxXSxyKTtyZXR1cm4gciYmSG4ocixyLm5leHQpJiYoUGkocikscj1yLm5leHQpLHJ9ZnVuY3Rpb24gZG4oaSx0KXtpZighaSlyZXR1cm4gaTt0fHwodD1pKTtsZXQgZT1pLG47ZG8gaWYobj0hMSwhZS5zdGVpbmVyJiYoSG4oZSxlLm5leHQpfHxydChlLnByZXYsZSxlLm5leHQpPT09MCkpe2lmKFBpKGUpLGU9dD1lLnByZXYsZT09PWUubmV4dClicmVhaztuPSEwfWVsc2UgZT1lLm5leHQ7d2hpbGUobnx8ZSE9PXQpO3JldHVybiB0fWZ1bmN0aW9uIFNpKGksdCxlLG4scyxyLG8pe2lmKCFpKXJldHVybjshbyYmciYmRGYoaSxuLHMscik7bGV0IGE9aTtmb3IoO2kucHJldiE9PWkubmV4dDspe2NvbnN0IGM9aS5wcmV2LGw9aS5uZXh0O2lmKHI/QmYoaSxuLHMscik6Q2YoaSkpe3QucHVzaChjLmksaS5pLGwuaSksUGkoaSksaT1sLm5leHQsYT1sLm5leHQ7Y29udGludWV9aWYoaT1sLGk9PT1hKXtvP289PT0xPyhpPUZmKGRuKGkpLHQpLFNpKGksdCxlLG4scyxyLDIpKTpvPT09MiYmSWYoaSx0LGUsbixzLHIpOlNpKGRuKGkpLHQsZSxuLHMsciwxKTticmVha319fWZ1bmN0aW9uIENmKGkpe2NvbnN0IHQ9aS5wcmV2LGU9aSxuPWkubmV4dDtpZihydCh0LGUsbik+PTApcmV0dXJuITE7Y29uc3Qgcz10Lngscj1lLngsbz1uLngsYT10LnksYz1lLnksbD1uLnksaD1NYXRoLm1pbihzLHIsbyksdT1NYXRoLm1pbihhLGMsbCksZj1NYXRoLm1heChzLHIsbyksZD1NYXRoLm1heChhLGMsbCk7bGV0IHA9bi5uZXh0O2Zvcig7cCE9PXQ7KXtpZihwLng+PWgmJnAueDw9ZiYmcC55Pj11JiZwLnk8PWQmJnppKHMsYSxyLGMsbyxsLHAueCxwLnkpJiZydChwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIEJmKGksdCxlLG4pe2NvbnN0IHM9aS5wcmV2LHI9aSxvPWkubmV4dDtpZihydChzLHIsbyk+PTApcmV0dXJuITE7Y29uc3QgYT1zLngsYz1yLngsbD1vLngsaD1zLnksdT1yLnksZj1vLnksZD1NYXRoLm1pbihhLGMsbCkscD1NYXRoLm1pbihoLHUsZikseT1NYXRoLm1heChhLGMsbCksbT1NYXRoLm1heChoLHUsZiksZz1rbyhkLHAsdCxlLG4pLGI9a28oeSxtLHQsZSxuKTtsZXQgdz1pLnByZXZaLHg9aS5uZXh0Wjtmb3IoO3cmJncuej49ZyYmeCYmeC56PD1iOyl7aWYody54Pj1kJiZ3Lng8PXkmJncueT49cCYmdy55PD1tJiZ3IT09cyYmdyE9PW8mJnppKGEsaCxjLHUsbCxmLHcueCx3LnkpJiZydCh3LnByZXYsdyx3Lm5leHQpPj0wfHwodz13LnByZXZaLHgueD49ZCYmeC54PD15JiZ4Lnk+PXAmJngueTw9bSYmeCE9PXMmJnghPT1vJiZ6aShhLGgsYyx1LGwsZix4LngseC55KSYmcnQoeC5wcmV2LHgseC5uZXh0KT49MCkpcmV0dXJuITE7eD14Lm5leHRafWZvcig7dyYmdy56Pj1nOyl7aWYody54Pj1kJiZ3Lng8PXkmJncueT49cCYmdy55PD1tJiZ3IT09cyYmdyE9PW8mJnppKGEsaCxjLHUsbCxmLHcueCx3LnkpJiZydCh3LnByZXYsdyx3Lm5leHQpPj0wKXJldHVybiExO3c9dy5wcmV2Wn1mb3IoO3gmJnguejw9Yjspe2lmKHgueD49ZCYmeC54PD15JiZ4Lnk+PXAmJngueTw9bSYmeCE9PXMmJnghPT1vJiZ6aShhLGgsYyx1LGwsZix4LngseC55KSYmcnQoeC5wcmV2LHgseC5uZXh0KT49MClyZXR1cm4hMTt4PXgubmV4dFp9cmV0dXJuITB9ZnVuY3Rpb24gRmYoaSx0KXtsZXQgZT1pO2Rve2NvbnN0IG49ZS5wcmV2LHM9ZS5uZXh0Lm5leHQ7IUhuKG4scykmJlhjKG4sZSxlLm5leHQscykmJlRpKG4scykmJlRpKHMsbikmJih0LnB1c2gobi5pLGUuaSxzLmkpLFBpKGUpLFBpKGUubmV4dCksZT1pPXMpLGU9ZS5uZXh0fXdoaWxlKGUhPT1pKTtyZXR1cm4gZG4oZSl9ZnVuY3Rpb24gSWYoaSx0LGUsbixzLHIpe2xldCBvPWk7ZG97bGV0IGE9by5uZXh0Lm5leHQ7Zm9yKDthIT09by5wcmV2Oyl7aWYoby5pIT09YS5pJiZWZihvLGEpKXtsZXQgYz1KYyhvLGEpO289ZG4obyxvLm5leHQpLGM9ZG4oYyxjLm5leHQpLFNpKG8sdCxlLG4scyxyLDApLFNpKGMsdCxlLG4scyxyLDApO3JldHVybn1hPWEubmV4dH1vPW8ubmV4dH13aGlsZShvIT09aSl9ZnVuY3Rpb24ga2YoaSx0LGUsbil7Y29uc3Qgcz1bXTtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9dFtyXSpuLGM9cjxvLTE/dFtyKzFdKm46aS5sZW5ndGgsbD1HYyhpLGEsYyxuLCExKTtsPT09bC5uZXh0JiYobC5zdGVpbmVyPSEwKSxzLnB1c2goVWYobCkpfXMuc29ydChOZik7Zm9yKGxldCByPTA7cjxzLmxlbmd0aDtyKyspZT1SZihzW3JdLGUpO3JldHVybiBlfWZ1bmN0aW9uIE5mKGksdCl7bGV0IGU9aS54LXQueDtpZihlPT09MCYmKGU9aS55LXQueSxlPT09MCkpe2NvbnN0IG49KGkubmV4dC55LWkueSkvKGkubmV4dC54LWkueCkscz0odC5uZXh0LnktdC55KS8odC5uZXh0LngtdC54KTtlPW4tc31yZXR1cm4gZX1mdW5jdGlvbiBSZihpLHQpe2NvbnN0IGU9TGYoaSx0KTtpZighZSlyZXR1cm4gdDtjb25zdCBuPUpjKGUsaSk7cmV0dXJuIGRuKG4sbi5uZXh0KSxkbihlLGUubmV4dCl9ZnVuY3Rpb24gTGYoaSx0KXtsZXQgZT10O2NvbnN0IG49aS54LHM9aS55O2xldCByPS0xLzAsbztpZihIbihpLGUpKXJldHVybiBlO2Rve2lmKEhuKGksZS5uZXh0KSlyZXR1cm4gZS5uZXh0O2lmKHM8PWUueSYmcz49ZS5uZXh0LnkmJmUubmV4dC55IT09ZS55KXtjb25zdCB1PWUueCsocy1lLnkpKihlLm5leHQueC1lLngpLyhlLm5leHQueS1lLnkpO2lmKHU8PW4mJnU+ciYmKHI9dSxvPWUueDxlLm5leHQueD9lOmUubmV4dCx1PT09bikpcmV0dXJuIG99ZT1lLm5leHR9d2hpbGUoZSE9PXQpO2lmKCFvKXJldHVybiBudWxsO2NvbnN0IGE9byxjPW8ueCxsPW8ueTtsZXQgaD0xLzA7ZT1vO2Rve2lmKG4+PWUueCYmZS54Pj1jJiZuIT09ZS54JiZaYyhzPGw/bjpyLHMsYyxsLHM8bD9yOm4scyxlLngsZS55KSl7Y29uc3QgdT1NYXRoLmFicyhzLWUueSkvKG4tZS54KTtUaShlLGkpJiYodTxofHx1PT09aCYmKGUueD5vLnh8fGUueD09PW8ueCYmT2YobyxlKSkpJiYobz1lLGg9dSl9ZT1lLm5leHR9d2hpbGUoZSE9PWEpO3JldHVybiBvfWZ1bmN0aW9uIE9mKGksdCl7cmV0dXJuIHJ0KGkucHJldixpLHQucHJldik8MCYmcnQodC5uZXh0LGksaS5uZXh0KTwwfWZ1bmN0aW9uIERmKGksdCxlLG4pe2xldCBzPWk7ZG8gcy56PT09MCYmKHMuej1rbyhzLngscy55LHQsZSxuKSkscy5wcmV2Wj1zLnByZXYscy5uZXh0Wj1zLm5leHQscz1zLm5leHQ7d2hpbGUocyE9PWkpO3MucHJldloubmV4dFo9bnVsbCxzLnByZXZaPW51bGwsJGYocyl9ZnVuY3Rpb24gJGYoaSl7bGV0IHQsZT0xO2Rve2xldCBuPWkscztpPW51bGw7bGV0IHI9bnVsbDtmb3IodD0wO247KXt0Kys7bGV0IG89bixhPTA7Zm9yKGxldCBsPTA7bDxlJiYoYSsrLG89by5uZXh0WiwhIW8pO2wrKyk7bGV0IGM9ZTtmb3IoO2E+MHx8Yz4wJiZvOylhIT09MCYmKGM9PT0wfHwhb3x8bi56PD1vLnopPyhzPW4sbj1uLm5leHRaLGEtLSk6KHM9byxvPW8ubmV4dFosYy0tKSxyP3IubmV4dFo9czppPXMscy5wcmV2Wj1yLHI9cztuPW99ci5uZXh0Wj1udWxsLGUqPTJ9d2hpbGUodD4xKTtyZXR1cm4gaX1mdW5jdGlvbiBrbyhpLHQsZSxuLHMpe3JldHVybiBpPShpLWUpKnN8MCx0PSh0LW4pKnN8MCxpPShpfGk8PDgpJjE2NzExOTM1LGk9KGl8aTw8NCkmMjUyNjQ1MTM1LGk9KGl8aTw8MikmODU4OTkzNDU5LGk9KGl8aTw8MSkmMTQzMTY1NTc2NSx0PSh0fHQ8PDgpJjE2NzExOTM1LHQ9KHR8dDw8NCkmMjUyNjQ1MTM1LHQ9KHR8dDw8MikmODU4OTkzNDU5LHQ9KHR8dDw8MSkmMTQzMTY1NTc2NSxpfHQ8PDF9ZnVuY3Rpb24gVWYoaSl7bGV0IHQ9aSxlPWk7ZG8odC54PGUueHx8dC54PT09ZS54JiZ0Lnk8ZS55KSYmKGU9dCksdD10Lm5leHQ7d2hpbGUodCE9PWkpO3JldHVybiBlfWZ1bmN0aW9uIFpjKGksdCxlLG4scyxyLG8sYSl7cmV0dXJuKHMtbykqKHQtYSk+PShpLW8pKihyLWEpJiYoaS1vKSoobi1hKT49KGUtbykqKHQtYSkmJihlLW8pKihyLWEpPj0ocy1vKSoobi1hKX1mdW5jdGlvbiB6aShpLHQsZSxuLHMscixvLGEpe3JldHVybiEoaT09PW8mJnQ9PT1hKSYmWmMoaSx0LGUsbixzLHIsbyxhKX1mdW5jdGlvbiBWZihpLHQpe3JldHVybiBpLm5leHQuaSE9PXQuaSYmaS5wcmV2LmkhPT10LmkmJiFxZihpLHQpJiYoVGkoaSx0KSYmVGkodCxpKSYmSGYoaSx0KSYmKHJ0KGkucHJldixpLHQucHJldil8fHJ0KGksdC5wcmV2LHQpKXx8SG4oaSx0KSYmcnQoaS5wcmV2LGksaS5uZXh0KT4wJiZydCh0LnByZXYsdCx0Lm5leHQpPjApfWZ1bmN0aW9uIHJ0KGksdCxlKXtyZXR1cm4odC55LWkueSkqKGUueC10LngpLSh0LngtaS54KSooZS55LXQueSl9ZnVuY3Rpb24gSG4oaSx0KXtyZXR1cm4gaS54PT09dC54JiZpLnk9PT10Lnl9ZnVuY3Rpb24gWGMoaSx0LGUsbil7Y29uc3Qgcz1UcyhydChpLHQsZSkpLHI9VHMocnQoaSx0LG4pKSxvPVRzKHJ0KGUsbixpKSksYT1UcyhydChlLG4sdCkpO3JldHVybiEhKHMhPT1yJiZvIT09YXx8cz09PTAmJnpzKGksZSx0KXx8cj09PTAmJnpzKGksbix0KXx8bz09PTAmJnpzKGUsaSxuKXx8YT09PTAmJnpzKGUsdCxuKSl9ZnVuY3Rpb24genMoaSx0LGUpe3JldHVybiB0Lng8PU1hdGgubWF4KGkueCxlLngpJiZ0Lng+PU1hdGgubWluKGkueCxlLngpJiZ0Lnk8PU1hdGgubWF4KGkueSxlLnkpJiZ0Lnk+PU1hdGgubWluKGkueSxlLnkpfWZ1bmN0aW9uIFRzKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH1mdW5jdGlvbiBxZihpLHQpe2xldCBlPWk7ZG97aWYoZS5pIT09aS5pJiZlLm5leHQuaSE9PWkuaSYmZS5pIT09dC5pJiZlLm5leHQuaSE9PXQuaSYmWGMoZSxlLm5leHQsaSx0KSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuITF9ZnVuY3Rpb24gVGkoaSx0KXtyZXR1cm4gcnQoaS5wcmV2LGksaS5uZXh0KTwwP3J0KGksdCxpLm5leHQpPj0wJiZydChpLGkucHJldix0KT49MDpydChpLHQsaS5wcmV2KTwwfHxydChpLGkubmV4dCx0KTwwfWZ1bmN0aW9uIEhmKGksdCl7bGV0IGU9aSxuPSExO2NvbnN0IHM9KGkueCt0LngpLzIscj0oaS55K3QueSkvMjtkbyBlLnk+ciE9ZS5uZXh0Lnk+ciYmZS5uZXh0LnkhPT1lLnkmJnM8KGUubmV4dC54LWUueCkqKHItZS55KS8oZS5uZXh0LnktZS55KStlLngmJihuPSFuKSxlPWUubmV4dDt3aGlsZShlIT09aSk7cmV0dXJuIG59ZnVuY3Rpb24gSmMoaSx0KXtjb25zdCBlPU5vKGkuaSxpLngsaS55KSxuPU5vKHQuaSx0LngsdC55KSxzPWkubmV4dCxyPXQucHJldjtyZXR1cm4gaS5uZXh0PXQsdC5wcmV2PWksZS5uZXh0PXMscy5wcmV2PWUsbi5uZXh0PWUsZS5wcmV2PW4sci5uZXh0PW4sbi5wcmV2PXIsbn1mdW5jdGlvbiBZYyhpLHQsZSxuKXtjb25zdCBzPU5vKGksdCxlKTtyZXR1cm4gbj8ocy5uZXh0PW4ubmV4dCxzLnByZXY9bixuLm5leHQucHJldj1zLG4ubmV4dD1zKToocy5wcmV2PXMscy5uZXh0PXMpLHN9ZnVuY3Rpb24gUGkoaSl7aS5uZXh0LnByZXY9aS5wcmV2LGkucHJldi5uZXh0PWkubmV4dCxpLnByZXZaJiYoaS5wcmV2Wi5uZXh0Wj1pLm5leHRaKSxpLm5leHRaJiYoaS5uZXh0Wi5wcmV2Wj1pLnByZXZaKX1mdW5jdGlvbiBObyhpLHQsZSl7cmV0dXJue2kseDp0LHk6ZSxwcmV2Om51bGwsbmV4dDpudWxsLHo6MCxwcmV2WjpudWxsLG5leHRaOm51bGwsc3RlaW5lcjohMX19ZnVuY3Rpb24gV2YoaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPWUtbjtyPGU7cis9bilzKz0oaVtvXS1pW3JdKSooaVtyKzFdK2lbbysxXSksbz1yO3JldHVybiBzfWNsYXNzIEdme3N0YXRpYyB0cmlhbmd1bGF0ZSh0LGUsbj0yKXtyZXR1cm4gRWYodCxlLG4pfX1jbGFzcyBXbntzdGF0aWMgYXJlYSh0KXtjb25zdCBlPXQubGVuZ3RoO2xldCBuPTA7Zm9yKGxldCBzPWUtMSxyPTA7cjxlO3M9cisrKW4rPXRbc10ueCp0W3JdLnktdFtyXS54KnRbc10ueTtyZXR1cm4gbiouNX1zdGF0aWMgaXNDbG9ja1dpc2UodCl7cmV0dXJuIFduLmFyZWEodCk8MH1zdGF0aWMgdHJpYW5ndWxhdGVTaGFwZSh0LGUpe2NvbnN0IG49W10scz1bXSxyPVtdO2pjKHQpLFFjKG4sdCk7bGV0IG89dC5sZW5ndGg7ZS5mb3JFYWNoKGpjKTtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrKylzLnB1c2gobyksbys9ZVtjXS5sZW5ndGgsUWMobixlW2NdKTtjb25zdCBhPUdmLnRyaWFuZ3VsYXRlKG4scyk7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKz0zKXIucHVzaChhLnNsaWNlKGMsYyszKSk7cmV0dXJuIHJ9fWZ1bmN0aW9uIGpjKGkpe2NvbnN0IHQ9aS5sZW5ndGg7dD4yJiZpW3QtMV0uZXF1YWxzKGlbMF0pJiZpLnBvcCgpfWZ1bmN0aW9uIFFjKGksdCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaS5wdXNoKHRbZV0ueCksaS5wdXNoKHRbZV0ueSl9Y2xhc3MgUm8gZXh0ZW5kcyB1ZXtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxzPTEpe3N1cGVyKCksdGhpcy50eXBlPSJQbGFuZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsd2lkdGhTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOnN9O2NvbnN0IHI9dC8yLG89ZS8yLGE9TWF0aC5mbG9vcihuKSxjPU1hdGguZmxvb3IocyksbD1hKzEsaD1jKzEsdT10L2EsZj1lL2MsZD1bXSxwPVtdLHk9W10sbT1bXTtmb3IobGV0IGc9MDtnPGg7ZysrKXtjb25zdCBiPWcqZi1vO2ZvcihsZXQgdz0wO3c8bDt3Kyspe2NvbnN0IHg9dyp1LXI7cC5wdXNoKHgsLWIsMCkseS5wdXNoKDAsMCwxKSxtLnB1c2gody9hKSxtLnB1c2goMS1nL2MpfX1mb3IobGV0IGc9MDtnPGM7ZysrKWZvcihsZXQgYj0wO2I8YTtiKyspe2NvbnN0IHc9YitsKmcseD1iK2wqKGcrMSksTT1iKzErbCooZysxKSxBPWIrMStsKmc7ZC5wdXNoKHcseCxBKSxkLnB1c2goeCxNLEEpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQmUocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IEJlKHksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEJlKG0sMikpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IFJvKHQud2lkdGgsdC5oZWlnaHQsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMpfX1jb25zdCBLYz1uZXcgVCxQcz1uZXcgVDtjbGFzcyBRdHtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQpe3RoaXMuc3RhcnQ9dCx0aGlzLmVuZD1lfXNldCh0LGUpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkodCksdGhpcy5lbmQuY29weShlKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0LnN0YXJ0KSx0aGlzLmVuZC5jb3B5KHQuZW5kKSx0aGlzfWdldENlbnRlcih0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsdGhpcy5lbmQpLm11bHRpcGx5U2NhbGFyKC41KX1kZWx0YSh0KXtyZXR1cm4gdC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpfWRpc3RhbmNlU3EoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmVuZCl9ZGlzdGFuY2UoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX1hdCh0LGUpe3JldHVybiB0aGlzLmRlbHRhKGUpLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnN0YXJ0KX1jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKHQsZSl7S2Muc3ViVmVjdG9ycyh0LHRoaXMuc3RhcnQpLFBzLnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCk7Y29uc3Qgbj1Qcy5kb3QoUHMpO2xldCByPVBzLmRvdChLYykvbjtyZXR1cm4gZSYmKHI9WihyLDAsMSkpLHJ9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUsbil7Y29uc3Qgcz10aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKTtyZXR1cm4gdGhpcy5kZWx0YShuKS5tdWx0aXBseVNjYWxhcihzKS5hZGQodGhpcy5zdGFydCl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCh0KSx0aGlzLmVuZC5hcHBseU1hdHJpeDQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQuc3RhcnQuZXF1YWxzKHRoaXMuc3RhcnQpJiZ0LmVuZC5lcXVhbHModGhpcy5lbmQpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyE9InVuZGVmaW5lZCImJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicmVnaXN0ZXIiLHtkZXRhaWw6e3JldmlzaW9uOkp9fSkpLHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiYod2luZG93Ll9fVEhSRUVfXz9jb25zb2xlLndhcm4oIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4iKTp3aW5kb3cuX19USFJFRV9fPUopO2NvbnN0IHBuPW5ldyBNYXAsWmY9KGk9e30pPT4oe2dlbmVyYXRlVG9wVVYodCxlLG4scyxyKXtjb25zdCBvPWVbbiozXSxhPWVbbiozKzFdLGM9ZVtzKjNdLGw9ZVtzKjMrMV0saD1lW3IqM10sdT1lW3IqMysxXTtsZXQgZjtpZihwbi5oYXModCkpZj1wbi5nZXQodCk7ZWxzZXtsZXQgbT1pLmJveDM7aWYoIW0pe209bmV3IGd0O2NvbnN0IHc9dC5wYXJhbWV0ZXJzLnNoYXBlcy5nZXRQb2ludHMoKS5tYXAoeD0+W3gueCx4LnksMF0pLmZsYXQoKTttLnNldEZyb21BcnJheSh3KX1jb25zdCBnPW0uZ2V0U2l6ZShuZXcgVCk7aS5zcGxpdCYmKGcueS89aS5zcGxpdCksZj17Ym94Om0sc2l6ZTpnfSxwbi5zZXQodCxmKX1jb25zdHtib3g6ZCxzaXplOnB9PWYseT1pLnNwbGl0PzEtaS5zcGxpdDowO3JldHVybltuZXcgUigoby1kLm1pbi54KS9wLngsKGEtZC5taW4ueSkvcC55K3kpLG5ldyBSKChjLWQubWluLngpL3AueCwobC1kLm1pbi55KS9wLnkreSksbmV3IFIoKGgtZC5taW4ueCkvcC54LCh1LWQubWluLnkpL3AueSt5KV19LGdlbmVyYXRlU2lkZVdhbGxVVih0LGUsbixzLHIsbyl7Y29uc3QgYT1lW24qM10sYz1lW24qMysxXSxsPWVbbiozKzJdLGg9ZVtzKjNdLHU9ZVtzKjMrMV0sZj1lW3MqMysyXSxkPWVbciozXSxwPWVbciozKzFdLHk9ZVtyKjMrMl0sbT1lW28qM10sZz1lW28qMysxXSxiPWVbbyozKzJdO2xldCB3O2lmKHBuLmhhcyhlKSl3PXBuLmdldChlKTtlbHNle2NvbnN0IEE9bmV3IGd0O0Euc2V0RnJvbUFycmF5KGUpO2NvbnN0IF89QS5nZXRTaXplKG5ldyBUKTtpLnNwbGl0JiYoXy56Lz0xLWkuc3BsaXQpLGkuc2lkZVJlcGVhdCYmKF8uei89aS5zaWRlUmVwZWF0KSx3PXtib3g6QSxzaXplOl99LHBuLnNldChlLHcpfWNvbnN0e2JveDp4LHNpemU6TX09dztyZXR1cm4gTWF0aC5hYnMoYy11KTxNYXRoLmFicyhhLWgpP1tuZXcgUigoYS14Lm1pbi54KS9NLngsKGwteC5taW4ueikvTS56KSxuZXcgUigoaC14Lm1pbi54KS9NLngsKGYteC5taW4ueikvTS56KSxuZXcgUigoZC14Lm1pbi54KS9NLngsKHkteC5taW4ueikvTS56KSxuZXcgUigobS14Lm1pbi54KS9NLngsKGIteC5taW4ueikvTS56KV06W25ldyBSKChjLXgubWluLnkpL00ueSwobC14Lm1pbi56KS9NLnopLG5ldyBSKCh1LXgubWluLnkpL00ueSwoZi14Lm1pbi56KS9NLnopLG5ldyBSKChwLXgubWluLnkpL00ueSwoeS14Lm1pbi56KS9NLnopLG5ldyBSKChnLXgubWluLnkpL00ueSwoYi14Lm1pbi56KS9NLnopXX19KSxYZj0oKT0+e3BuLmNsZWFyKCl9LEpmPXtBcmNDdXJ2ZTpMYyxDYXRtdWxsUm9tQ3VydmUzOk9jLEN1YmljQmV6aWVyQ3VydmU6Q28sQ3ViaWNCZXppZXJDdXJ2ZTM6JGMsRWxsaXBzZUN1cnZlOnZzLExpbmVDdXJ2ZTpCbyxMaW5lQ3VydmUzOlVjLFF1YWRyYXRpY0JlemllckN1cnZlOkZvLFF1YWRyYXRpY0JlemllckN1cnZlMzpWYyxTcGxpbmVDdXJ2ZTpJb307Y2xhc3MgR24gZXh0ZW5kcyB1ZXtjb25zdHJ1Y3Rvcih0PW5ldyBXYyhbbmV3IFIoLjUsLjUpLG5ldyBSKC0uNSwuNSksbmV3IFIoLS41LC0uNSksbmV3IFIoLjUsLS41KV0pLGU9e30pe3N1cGVyKCksdGhpcy50eXBlPSJFeHRydWRlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17c2hhcGVzOnQsb3B0aW9uczplfSx0PUFycmF5LmlzQXJyYXkodCk/dDpbdF07Y29uc3Qgbj10aGlzLHM9W10scj1bXTtmb3IobGV0IGE9MCxjPXQubGVuZ3RoO2E8YzthKyspe2NvbnN0IGw9dFthXTtvKGwpfXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEJlKHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEJlKHIsMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtmdW5jdGlvbiBvKGEpe3ZhciBOdSxSdSxMdTtjb25zdCBjPVtdLGw9ZS5jdXJ2ZVNlZ21lbnRzIT09dm9pZCAwP2UuY3VydmVTZWdtZW50czoxMixoPWUuc3RlcHMhPT12b2lkIDA/ZS5zdGVwczoxLHU9ZS5kZXB0aCE9PXZvaWQgMD9lLmRlcHRoOjE7bGV0IGY9ZS5iZXZlbEVuYWJsZWQhPT12b2lkIDA/ZS5iZXZlbEVuYWJsZWQ6ITAsZD1lLmJldmVsVGhpY2tuZXNzIT09dm9pZCAwP2UuYmV2ZWxUaGlja25lc3M6LjIscD1lLmJldmVsU2l6ZSE9PXZvaWQgMD9lLmJldmVsU2l6ZTpkLS4xLHk9ZS5iZXZlbE9mZnNldCE9PXZvaWQgMD9lLmJldmVsT2Zmc2V0OjAsbT1lLmJldmVsU2VnbWVudHMhPT12b2lkIDA/ZS5iZXZlbFNlZ21lbnRzOjM7Y29uc3QgZz1lLmV4dHJ1ZGVQYXRoLGI9ZS5VVkdlbmVyYXRvciE9PXZvaWQgMD9lLlVWR2VuZXJhdG9yOllmLHc9KE51PWUuaGFzVG9wKSE9bnVsbD9OdTohMCx4PShSdT1lLmhhc0JvdHRvbSkhPW51bGw/UnU6ITAsTT0oTHU9ZS5oYXNTaWRlKSE9bnVsbD9MdTohMDtsZXQgQSxfPSExLHYsUCx6LFM7ZyYmKEE9Zy5nZXRTcGFjZWRQb2ludHMoaCksXz0hMCxmPSExLHY9Zy5jb21wdXRlRnJlbmV0RnJhbWVzKGgsITEpLFA9bmV3IFQsej1uZXcgVCxTPW5ldyBUKSxmfHwobT0wLGQ9MCxwPTAseT0wKTtjb25zdCBDPWEuZXh0cmFjdFBvaW50cyhsKTtsZXQgRT1DLnNoYXBlO2NvbnN0IEY9Qy5ob2xlcztpZighV24uaXNDbG9ja1dpc2UoRSkpe0U9RS5yZXZlcnNlKCk7Zm9yKGxldCBOPTAsTD1GLmxlbmd0aDtOPEw7TisrKXtjb25zdCBPPUZbTl07V24uaXNDbG9ja1dpc2UoTykmJihGW05dPU8ucmV2ZXJzZSgpKX19ZnVuY3Rpb24gSShOKXtjb25zdCBPPTEwMDAwMDAwMDAwMDAwMDAxZS0zNjtsZXQgVT1OWzBdO2ZvcihsZXQgJD0xOyQ8PU4ubGVuZ3RoOyQrKyl7Y29uc3QgWT0kJU4ubGVuZ3RoLEc9TltZXSxpdD1HLngtVS54LGN0PUcueS1VLnksd3Q9aXQqaXQrY3QqY3QsWHQ9TWF0aC5tYXgoTWF0aC5hYnMoRy54KSxNYXRoLmFicyhHLnkpLE1hdGguYWJzKFUueCksTWF0aC5hYnMoVS55KSksQ249TypYdCpYdDtpZih3dDw9Q24pe04uc3BsaWNlKFksMSksJC0tO2NvbnRpbnVlfVU9R319SShFKSxGLmZvckVhY2goSSk7Y29uc3Qgaz1GLmxlbmd0aCxEPUU7Zm9yKGxldCBOPTA7TjxrO04rKyl7Y29uc3QgTD1GW05dO0U9RS5jb25jYXQoTCl9ZnVuY3Rpb24gVihOLEwsTyl7cmV0dXJuIEx8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0IiksTi5jbG9uZSgpLmFkZFNjYWxlZFZlY3RvcihMLE8pfWNvbnN0IGo9RS5sZW5ndGg7ZnVuY3Rpb24gZHQoTixMLE8pe2xldCBVLCQsWTtjb25zdCBHPU4ueC1MLngsaXQ9Ti55LUwueSxjdD1PLngtTi54LHd0PU8ueS1OLnksWHQ9RypHK2l0Kml0LENuPUcqd3QtaXQqY3Q7aWYoTWF0aC5hYnMoQ24pPk51bWJlci5FUFNJTE9OKXtjb25zdCBKdD1NYXRoLnNxcnQoWHQpLE91PU1hdGguc3FydChjdCpjdCt3dCp3dCksRHU9TC54LWl0L0p0LCR1PUwueStHL0p0LHpnPU8ueC13dC9PdSxUZz1PLnkrY3QvT3UsVXU9KCh6Zy1EdSkqd3QtKFRnLSR1KSpjdCkvKEcqd3QtaXQqY3QpO1U9RHUrRypVdS1OLngsJD0kdStpdCpVdS1OLnk7Y29uc3QgVnU9VSpVKyQqJDtpZihWdTw9MilyZXR1cm4gbmV3IFIoVSwkKTtZPU1hdGguc3FydChWdS8yKX1lbHNle2xldCBKdD0hMTtHPk51bWJlci5FUFNJTE9OP2N0Pk51bWJlci5FUFNJTE9OJiYoSnQ9ITApOkc8LU51bWJlci5FUFNJTE9OP2N0PC1OdW1iZXIuRVBTSUxPTiYmKEp0PSEwKTpNYXRoLnNpZ24oaXQpPT09TWF0aC5zaWduKHd0KSYmKEp0PSEwKSxKdD8oVT0taXQsJD1HLFk9TWF0aC5zcXJ0KFh0KSk6KFU9RywkPWl0LFk9TWF0aC5zcXJ0KFh0LzIpKX1yZXR1cm4gbmV3IFIoVS9ZLCQvWSl9Y29uc3QgRHQ9W107Zm9yKGxldCBOPTAsTD1ELmxlbmd0aCxPPUwtMSxVPU4rMTtOPEw7TisrLE8rKyxVKyspTz09PUwmJihPPTApLFU9PT1MJiYoVT0wKSxEdFtOXT1kdChEW05dLERbT10sRFtVXSk7Y29uc3QgR3Q9W107bGV0IFp0LG1lPUR0LmNvbmNhdCgpO2ZvcihsZXQgTj0wLEw9aztOPEw7TisrKXtjb25zdCBPPUZbTl07WnQ9W107Zm9yKGxldCBVPTAsJD1PLmxlbmd0aCxZPSQtMSxHPVUrMTtVPCQ7VSsrLFkrKyxHKyspWT09PSQmJihZPTApLEc9PT0kJiYoRz0wKSxadFtVXT1kdChPW1VdLE9bWV0sT1tHXSk7R3QucHVzaChadCksbWU9bWUuY29uY2F0KFp0KX1sZXQgRW47aWYobT09PTApRW49V24udHJpYW5ndWxhdGVTaGFwZShELEYpO2Vsc2V7Y29uc3QgTj1bXSxMPVtdO2ZvcihsZXQgTz0wO088bTtPKyspe2NvbnN0IFU9Ty9tLCQ9ZCpNYXRoLmNvcyhVKk1hdGguUEkvMiksWT1wKk1hdGguc2luKFUqTWF0aC5QSS8yKSt5O2ZvcihsZXQgRz0wLGl0PUQubGVuZ3RoO0c8aXQ7RysrKXtjb25zdCBjdD1WKERbR10sRHRbR10sWSk7SGUoY3QueCxjdC55LC0kKSxVPT09MCYmTi5wdXNoKGN0KX1mb3IobGV0IEc9MCxpdD1rO0c8aXQ7RysrKXtjb25zdCBjdD1GW0ddO1p0PUd0W0ddO2NvbnN0IHd0PVtdO2ZvcihsZXQgWHQ9MCxDbj1jdC5sZW5ndGg7WHQ8Q247WHQrKyl7Y29uc3QgSnQ9VihjdFtYdF0sWnRbWHRdLFkpO0hlKEp0LngsSnQueSwtJCksVT09PTAmJnd0LnB1c2goSnQpfVU9PT0wJiZMLnB1c2god3QpfX1Fbj1Xbi50cmlhbmd1bGF0ZVNoYXBlKE4sTCl9Y29uc3QgWXI9RW4ubGVuZ3RoLEl1PXAreTtmb3IobGV0IE49MDtOPGo7TisrKXtjb25zdCBMPWY/VihFW05dLG1lW05dLEl1KTpFW05dO18/KHouY29weSh2Lm5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKEwueCksUC5jb3B5KHYuYmlub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihMLnkpLFMuY29weShBWzBdKS5hZGQoeikuYWRkKFApLEhlKFMueCxTLnksUy56KSk6SGUoTC54LEwueSwwKX1mb3IobGV0IE49MTtOPD1oO04rKylmb3IobGV0IEw9MDtMPGo7TCsrKXtjb25zdCBPPWY/VihFW0xdLG1lW0xdLEl1KTpFW0xdO18/KHouY29weSh2Lm5vcm1hbHNbTl0pLm11bHRpcGx5U2NhbGFyKE8ueCksUC5jb3B5KHYuYmlub3JtYWxzW05dKS5tdWx0aXBseVNjYWxhcihPLnkpLFMuY29weShBW05dKS5hZGQoeikuYWRkKFApLEhlKFMueCxTLnksUy56KSk6SGUoTy54LE8ueSx1L2gqTil9Zm9yKGxldCBOPW0tMTtOPj0wO04tLSl7Y29uc3QgTD1OL20sTz1kKk1hdGguY29zKEwqTWF0aC5QSS8yKSxVPXAqTWF0aC5zaW4oTCpNYXRoLlBJLzIpK3k7Zm9yKGxldCAkPTAsWT1ELmxlbmd0aDskPFk7JCsrKXtjb25zdCBHPVYoRFskXSxEdFskXSxVKTtIZShHLngsRy55LHUrTyl9Zm9yKGxldCAkPTAsWT1GLmxlbmd0aDskPFk7JCsrKXtjb25zdCBHPUZbJF07WnQ9R3RbJF07Zm9yKGxldCBpdD0wLGN0PUcubGVuZ3RoO2l0PGN0O2l0Kyspe2NvbnN0IHd0PVYoR1tpdF0sWnRbaXRdLFUpO18/SGUod3QueCx3dC55K0FbaC0xXS55LEFbaC0xXS54K08pOkhlKHd0Lngsd3QueSx1K08pfX19X2coKSxNJiZ2ZygpO2Z1bmN0aW9uIF9nKCl7Y29uc3QgTj1zLmxlbmd0aC8zO2lmKGYpe2xldCBMPTAsTz1qKkw7aWYoeClmb3IobGV0IFU9MDtVPFlyO1UrKyl7Y29uc3QgJD1FbltVXTtqcigkWzJdK08sJFsxXStPLCRbMF0rTyl9aWYoTD1oK20qMixPPWoqTCx3KWZvcihsZXQgVT0wO1U8WXI7VSsrKXtjb25zdCAkPUVuW1VdO2pyKCRbMF0rTywkWzFdK08sJFsyXStPKX19ZWxzZXtpZih4KWZvcihsZXQgTD0wO0w8WXI7TCsrKXtjb25zdCBPPUVuW0xdO2pyKE9bMl0sT1sxXSxPWzBdKX1pZih3KWZvcihsZXQgTD0wO0w8WXI7TCsrKXtjb25zdCBPPUVuW0xdO2pyKE9bMF0raipoLE9bMV0raipoLE9bMl0raipoKX19bi5hZGRHcm91cChOLHMubGVuZ3RoLzMtTiwwKX1mdW5jdGlvbiB2Zygpe2NvbnN0IE49cy5sZW5ndGgvMztsZXQgTD0wO2t1KEQsTCksTCs9RC5sZW5ndGg7Zm9yKGxldCBPPTAsVT1GLmxlbmd0aDtPPFU7TysrKXtjb25zdCAkPUZbT107a3UoJCxMKSxMKz0kLmxlbmd0aH1uLmFkZEdyb3VwKE4scy5sZW5ndGgvMy1OLDEpfWZ1bmN0aW9uIGt1KE4sTCl7bGV0IE89Ti5sZW5ndGg7Zm9yKDstLU8+PTA7KXtjb25zdCBVPU87bGV0ICQ9Ty0xOyQ8MCYmKCQ9Ti5sZW5ndGgtMSk7Zm9yKGxldCBZPTAsRz1oK20qMjtZPEc7WSsrKXtjb25zdCBpdD1qKlksY3Q9aiooWSsxKSx3dD1MK1UraXQsWHQ9TCskK2l0LENuPUwrJCtjdCxKdD1MK1UrY3Q7U2cod3QsWHQsQ24sSnQpfX19ZnVuY3Rpb24gSGUoTixMLE8pe2MucHVzaChOKSxjLnB1c2goTCksYy5wdXNoKE8pfWZ1bmN0aW9uIGpyKE4sTCxPKXtXZShOKSxXZShMKSxXZShPKTtjb25zdCBVPXMubGVuZ3RoLzMsJD1iLmdlbmVyYXRlVG9wVVYobixzLFUtMyxVLTIsVS0xKTtHZSgkWzBdKSxHZSgkWzFdKSxHZSgkWzJdKX1mdW5jdGlvbiBTZyhOLEwsTyxVKXtXZShOKSxXZShMKSxXZShVKSxXZShMKSxXZShPKSxXZShVKTtjb25zdCAkPXMubGVuZ3RoLzMsWT1iLmdlbmVyYXRlU2lkZVdhbGxVVihuLHMsJC02LCQtMywkLTIsJC0xKTtHZShZWzBdKSxHZShZWzFdKSxHZShZWzNdKSxHZShZWzFdKSxHZShZWzJdKSxHZShZWzNdKX1mdW5jdGlvbiBXZShOKXtzLnB1c2goY1tOKjMrMF0pLHMucHVzaChjW04qMysxXSkscy5wdXNoKGNbTiozKzJdKX1mdW5jdGlvbiBHZShOKXtyLnB1c2goTi54KSxyLnB1c2goTi55KX19fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCksZT10aGlzLnBhcmFtZXRlcnMuc2hhcGVzLG49dGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7cmV0dXJuIGpmKGUsbix0KX1zdGF0aWMgZnJvbUpTT04odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgcj0wLG89dC5zaGFwZXMubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVt0LnNoYXBlc1tyXV07bi5wdXNoKGEpfWNvbnN0IHM9dC5vcHRpb25zLmV4dHJ1ZGVQYXRoO3JldHVybiBzIT09dm9pZCAwJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPW5ldyBKZltgJHtzLnR5cGV9YF0oKS5mcm9tSlNPTihzKSksbmV3IEduKG4sdC5vcHRpb25zKX19Y29uc3QgWWY9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24oaSx0LGUsbixzKXtjb25zdCByPXRbZSozXSxvPXRbZSozKzFdLGE9dFtuKjNdLGM9dFtuKjMrMV0sbD10W3MqM10saD10W3MqMysxXTtyZXR1cm5bbmV3IFIocixvKSxuZXcgUihhLGMpLG5ldyBSKGwsaCldfSxnZW5lcmF0ZVNpZGVXYWxsVVY6ZnVuY3Rpb24oaSx0LGUsbixzLHIpe2NvbnN0IG89dFtlKjNdLGE9dFtlKjMrMV0sYz10W2UqMysyXSxsPXRbbiozXSxoPXRbbiozKzFdLHU9dFtuKjMrMl0sZj10W3MqM10sZD10W3MqMysxXSxwPXRbcyozKzJdLHk9dFtyKjNdLG09dFtyKjMrMV0sZz10W3IqMysyXTtyZXR1cm4gTWF0aC5hYnMoYS1oKTxNYXRoLmFicyhvLWwpP1tuZXcgUihvLDEtYyksbmV3IFIobCwxLXUpLG5ldyBSKGYsMS1wKSxuZXcgUih5LDEtZyldOltuZXcgUihhLDEtYyksbmV3IFIoaCwxLXUpLG5ldyBSKGQsMS1wKSxuZXcgUihtLDEtZyldfX07ZnVuY3Rpb24gamYoaSx0LGUpe2lmKGUuc2hhcGVzPVtdLEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBuPTAscz1pLmxlbmd0aDtuPHM7bisrKXtjb25zdCByPWlbbl07ZS5zaGFwZXMucHVzaChyLnV1aWQpfWVsc2UgZS5zaGFwZXMucHVzaChpLnV1aWQpO3JldHVybiBlLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSx0KSx0LmV4dHJ1ZGVQYXRoIT09dm9pZCAwJiYoZS5vcHRpb25zLmV4dHJ1ZGVQYXRoPXQuZXh0cnVkZVBhdGgudG9KU09OKCkpLGV9Y29uc3QgdGw9MCxRZj0xLEtmPTIsZWw9MixMbz0xLjI1LG5sPTEsRWk9Nio0KzQrNCxFcz02NTUzNSx0ZD1NYXRoLnBvdygyLC0yNCksT289U3ltYm9sKCJTS0lQX0dFTkVSQVRJT04iKTtmdW5jdGlvbiBlZChpKXtyZXR1cm4gaS5pbmRleD9pLmluZGV4LmNvdW50OmkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1mdW5jdGlvbiBabihpKXtyZXR1cm4gZWQoaSkvM31mdW5jdGlvbiBuZChpLHQ9QXJyYXlCdWZmZXIpe3JldHVybiBpPjY1NTM1P25ldyBVaW50MzJBcnJheShuZXcgdCg0KmkpKTpuZXcgVWludDE2QXJyYXkobmV3IHQoMippKSl9ZnVuY3Rpb24gaWQoaSx0KXtpZighaS5pbmRleCl7Y29uc3QgZT1pLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQsbj10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLHM9bmQoZSxuKTtpLnNldEluZGV4KG5ldyB4dChzLDEpKTtmb3IobGV0IHI9MDtyPGU7cisrKXNbcl09cn19ZnVuY3Rpb24gaWwoaSx0KXtjb25zdCBlPVpuKGkpLG49dHx8aS5kcmF3UmFuZ2Uscz1uLnN0YXJ0LzMscj0obi5zdGFydCtuLmNvdW50KS8zLG89TWF0aC5tYXgoMCxzKSxhPU1hdGgubWluKGUsciktbztyZXR1cm5be29mZnNldDpNYXRoLmZsb29yKG8pLGNvdW50Ok1hdGguZmxvb3IoYSl9XX1mdW5jdGlvbiBzbChpLHQpe2lmKCFpLmdyb3Vwc3x8IWkuZ3JvdXBzLmxlbmd0aClyZXR1cm4gaWwoaSx0KTtjb25zdCBlPVtdLG49bmV3IFNldCxzPXR8fGkuZHJhd1JhbmdlLHI9cy5zdGFydC8zLG89KHMuc3RhcnQrcy5jb3VudCkvMztmb3IoY29uc3QgYyBvZiBpLmdyb3Vwcyl7Y29uc3QgbD1jLnN0YXJ0LzMsaD0oYy5zdGFydCtjLmNvdW50KS8zO24uYWRkKE1hdGgubWF4KHIsbCkpLG4uYWRkKE1hdGgubWluKG8saCkpfWNvbnN0IGE9QXJyYXkuZnJvbShuLnZhbHVlcygpKS5zb3J0KChjLGwpPT5jLWwpO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGgtMTtjKyspe2NvbnN0IGw9YVtjXSxoPWFbYysxXTtlLnB1c2goe29mZnNldDpNYXRoLmZsb29yKGwpLGNvdW50Ok1hdGguZmxvb3IoaC1sKX0pfXJldHVybiBlfWZ1bmN0aW9uIHNkKGksdCl7Y29uc3QgZT1abihpKSxuPXNsKGksdCkuc29ydCgobyxhKT0+by5vZmZzZXQtYS5vZmZzZXQpLHM9bltuLmxlbmd0aC0xXTtzLmNvdW50PU1hdGgubWluKGUtcy5vZmZzZXQscy5jb3VudCk7bGV0IHI9MDtyZXR1cm4gbi5mb3JFYWNoKCh7Y291bnQ6b30pPT5yKz1vKSxlIT09cn1mdW5jdGlvbiBEbyhpLHQsZSxuLHMpe2xldCByPTEvMCxvPTEvMCxhPTEvMCxjPS0xLzAsbD0tMS8wLGg9LTEvMCx1PTEvMCxmPTEvMCxkPTEvMCxwPS0xLzAseT0tMS8wLG09LTEvMDtmb3IobGV0IGc9dCo2LGI9KHQrZSkqNjtnPGI7Zys9Nil7Y29uc3Qgdz1pW2crMF0seD1pW2crMV0sTT13LXgsQT13K3g7TTxyJiYocj1NKSxBPmMmJihjPUEpLHc8dSYmKHU9dyksdz5wJiYocD13KTtjb25zdCBfPWlbZysyXSx2PWlbZyszXSxQPV8tdix6PV8rdjtQPG8mJihvPVApLHo+bCYmKGw9eiksXzxmJiYoZj1fKSxfPnkmJih5PV8pO2NvbnN0IFM9aVtnKzRdLEM9aVtnKzVdLEU9Uy1DLEY9UytDO0U8YSYmKGE9RSksRj5oJiYoaD1GKSxTPGQmJihkPVMpLFM+bSYmKG09Uyl9blswXT1yLG5bMV09byxuWzJdPWEsblszXT1jLG5bNF09bCxuWzVdPWgsc1swXT11LHNbMV09ZixzWzJdPWQsc1szXT1wLHNbNF09eSxzWzVdPW19ZnVuY3Rpb24gcmQoaSx0PW51bGwsZT1udWxsLG49bnVsbCl7Y29uc3Qgcz1pLmF0dHJpYnV0ZXMucG9zaXRpb24scj1pLmluZGV4P2kuaW5kZXguYXJyYXk6bnVsbCxvPVpuKGkpLGE9cy5ub3JtYWxpemVkO2xldCBjO3Q9PT1udWxsPyhjPW5ldyBGbG9hdDMyQXJyYXkobyo2KSxlPTAsbj1vKTooYz10LGU9ZXx8MCxuPW58fG8pO2NvbnN0IGw9cy5hcnJheSxoPXMub2Zmc2V0fHwwO2xldCB1PTM7cy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYodT1zLmRhdGEuc3RyaWRlKTtjb25zdCBmPVsiZ2V0WCIsImdldFkiLCJnZXRaIl07Zm9yKGxldCBkPWU7ZDxlK247ZCsrKXtjb25zdCBwPWQqMyx5PWQqNjtsZXQgbT1wKzAsZz1wKzEsYj1wKzI7ciYmKG09clttXSxnPXJbZ10sYj1yW2JdKSxhfHwobT1tKnUraCxnPWcqdStoLGI9Yip1K2gpO2ZvcihsZXQgdz0wO3c8Mzt3Kyspe2xldCB4LE0sQTthPyh4PXNbZlt3XV0obSksTT1zW2Zbd11dKGcpLEE9c1tmW3ddXShiKSk6KHg9bFttK3ddLE09bFtnK3ddLEE9bFtiK3ddKTtsZXQgXz14O008XyYmKF89TSksQTxfJiYoXz1BKTtsZXQgdj14O00+diYmKHY9TSksQT52JiYodj1BKTtjb25zdCBQPSh2LV8pLzIsej13KjI7Y1t5K3orMF09XytQLGNbeSt6KzFdPVArKE1hdGguYWJzKF8pK1ApKnRkfX1yZXR1cm4gY31mdW5jdGlvbiBsdChpLHQsZSl7cmV0dXJuIGUubWluLng9dFtpXSxlLm1pbi55PXRbaSsxXSxlLm1pbi56PXRbaSsyXSxlLm1heC54PXRbaSszXSxlLm1heC55PXRbaSs0XSxlLm1heC56PXRbaSs1XSxlfWZ1bmN0aW9uIHJsKGkpe2xldCB0PS0xLGU9LTEvMDtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBzPWlbbiszXS1pW25dO3M+ZSYmKGU9cyx0PW4pfXJldHVybiB0fWZ1bmN0aW9uIG9sKGksdCl7dC5zZXQoaSl9ZnVuY3Rpb24gYWwoaSx0LGUpe2xldCBuLHM7Zm9yKGxldCByPTA7cjwzO3IrKyl7Y29uc3Qgbz1yKzM7bj1pW3JdLHM9dFtyXSxlW3JdPW48cz9uOnMsbj1pW29dLHM9dFtvXSxlW29dPW4+cz9uOnN9fWZ1bmN0aW9uIENzKGksdCxlKXtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBzPXRbaSsyKm5dLHI9dFtpKzIqbisxXSxvPXMtcixhPXMrcjtvPGVbbl0mJihlW25dPW8pLGE+ZVtuKzNdJiYoZVtuKzNdPWEpfX1mdW5jdGlvbiBDaShpKXtjb25zdCB0PWlbM10taVswXSxlPWlbNF0taVsxXSxuPWlbNV0taVsyXTtyZXR1cm4gMioodCplK2UqbituKnQpfWNvbnN0IEZlPTMyLG9kPShpLHQpPT5pLmNhbmRpZGF0ZS10LmNhbmRpZGF0ZSxLZT1uZXcgQXJyYXkoRmUpLmZpbGwoKS5tYXAoKCk9Pih7Y291bnQ6MCxib3VuZHM6bmV3IEZsb2F0MzJBcnJheSg2KSxyaWdodENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksbGVmdENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksY2FuZGlkYXRlOjB9KSksQnM9bmV3IEZsb2F0MzJBcnJheSg2KTtmdW5jdGlvbiBhZChpLHQsZSxuLHMscil7bGV0IG89LTEsYT0wO2lmKHI9PT10bClvPXJsKHQpLG8hPT0tMSYmKGE9KHRbb10rdFtvKzNdKS8yKTtlbHNlIGlmKHI9PT1RZilvPXJsKGkpLG8hPT0tMSYmKGE9Y2QoZSxuLHMsbykpO2Vsc2UgaWYocj09PUtmKXtjb25zdCBjPUNpKGkpO2xldCBsPUxvKnM7Y29uc3QgaD1uKjYsdT0obitzKSo2O2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9dFtmXSxtPSh0W2YrM10tZCkvRmU7aWYoczxGZS80KXtjb25zdCBnPVsuLi5LZV07Zy5sZW5ndGg9cztsZXQgYj0wO2ZvcihsZXQgeD1oO3g8dTt4Kz02LGIrKyl7Y29uc3QgTT1nW2JdO00uY2FuZGlkYXRlPWVbeCsyKmZdLE0uY291bnQ9MDtjb25zdHtib3VuZHM6QSxsZWZ0Q2FjaGVCb3VuZHM6XyxyaWdodENhY2hlQm91bmRzOnZ9PU07Zm9yKGxldCBQPTA7UDwzO1ArKyl2W1BdPTEvMCx2W1ArM109LTEvMCxfW1BdPTEvMCxfW1ArM109LTEvMCxBW1BdPTEvMCxBW1ArM109LTEvMDtDcyh4LGUsQSl9Zy5zb3J0KG9kKTtsZXQgdz1zO2ZvcihsZXQgeD0wO3g8dzt4Kyspe2NvbnN0IE09Z1t4XTtmb3IoO3grMTx3JiZnW3grMV0uY2FuZGlkYXRlPT09TS5jYW5kaWRhdGU7KWcuc3BsaWNlKHgrMSwxKSx3LS19Zm9yKGxldCB4PWg7eDx1O3grPTYpe2NvbnN0IE09ZVt4KzIqZl07Zm9yKGxldCBBPTA7QTx3O0ErKyl7Y29uc3QgXz1nW0FdO00+PV8uY2FuZGlkYXRlP0NzKHgsZSxfLnJpZ2h0Q2FjaGVCb3VuZHMpOihDcyh4LGUsXy5sZWZ0Q2FjaGVCb3VuZHMpLF8uY291bnQrKyl9fWZvcihsZXQgeD0wO3g8dzt4Kyspe2NvbnN0IE09Z1t4XSxBPU0uY291bnQsXz1zLU0uY291bnQsdj1NLmxlZnRDYWNoZUJvdW5kcyxQPU0ucmlnaHRDYWNoZUJvdW5kcztsZXQgej0wO0EhPT0wJiYoej1DaSh2KS9jKTtsZXQgUz0wO18hPT0wJiYoUz1DaShQKS9jKTtjb25zdCBDPW5sK0xvKih6KkErUypfKTtDPGwmJihvPWYsbD1DLGE9TS5jYW5kaWRhdGUpfX1lbHNle2ZvcihsZXQgdz0wO3c8RmU7dysrKXtjb25zdCB4PUtlW3ddO3guY291bnQ9MCx4LmNhbmRpZGF0ZT1kK20rdyptO2NvbnN0IE09eC5ib3VuZHM7Zm9yKGxldCBBPTA7QTwzO0ErKylNW0FdPTEvMCxNW0ErM109LTEvMH1mb3IobGV0IHc9aDt3PHU7dys9Nil7bGV0IEE9fn4oKGVbdysyKmZdLWQpL20pO0E+PUZlJiYoQT1GZS0xKTtjb25zdCBfPUtlW0FdO18uY291bnQrKyxDcyh3LGUsXy5ib3VuZHMpfWNvbnN0IGc9S2VbRmUtMV07b2woZy5ib3VuZHMsZy5yaWdodENhY2hlQm91bmRzKTtmb3IobGV0IHc9RmUtMjt3Pj0wO3ctLSl7Y29uc3QgeD1LZVt3XSxNPUtlW3crMV07YWwoeC5ib3VuZHMsTS5yaWdodENhY2hlQm91bmRzLHgucmlnaHRDYWNoZUJvdW5kcyl9bGV0IGI9MDtmb3IobGV0IHc9MDt3PEZlLTE7dysrKXtjb25zdCB4PUtlW3ddLE09eC5jb3VudCxBPXguYm91bmRzLHY9S2VbdysxXS5yaWdodENhY2hlQm91bmRzO00hPT0wJiYoYj09PTA/b2woQSxCcyk6YWwoQSxCcyxCcykpLGIrPU07bGV0IFA9MCx6PTA7YiE9PTAmJihQPUNpKEJzKS9jKTtjb25zdCBTPXMtYjtTIT09MCYmKHo9Q2kodikvYyk7Y29uc3QgQz1ubCtMbyooUCpiK3oqUyk7QzxsJiYobz1mLGw9QyxhPXguY2FuZGlkYXRlKX19fX1lbHNlIGNvbnNvbGUud2FybihgTWVzaEJWSDogSW52YWxpZCBidWlsZCBzdHJhdGVneSB2YWx1ZSAke3J9IHVzZWQuYCk7cmV0dXJue2F4aXM6byxwb3M6YX19ZnVuY3Rpb24gY2QoaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPXQrZTtyPG87cisrKXMrPWlbcio2K24qMl07cmV0dXJuIHMvZX1jbGFzcyAkb3tjb25zdHJ1Y3Rvcigpe3RoaXMuYm91bmRpbmdEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNil9fWZ1bmN0aW9uIGxkKGksdCxlLG4scyxyKXtsZXQgbz1uLGE9bitzLTE7Y29uc3QgYz1yLnBvcyxsPXIuYXhpcyoyO2Zvcig7Oyl7Zm9yKDtvPD1hJiZlW28qNitsXTxjOylvKys7Zm9yKDtvPD1hJiZlW2EqNitsXT49YzspYS0tO2lmKG88YSl7Zm9yKGxldCBoPTA7aDwzO2grKyl7bGV0IHU9dFtvKjMraF07dFtvKjMraF09dFthKjMraF0sdFthKjMraF09dX1mb3IobGV0IGg9MDtoPDY7aCsrKXtsZXQgdT1lW28qNitoXTtlW28qNitoXT1lW2EqNitoXSxlW2EqNitoXT11fW8rKyxhLS19ZWxzZSByZXR1cm4gb319ZnVuY3Rpb24gaGQoaSx0LGUsbixzLHIpe2xldCBvPW4sYT1uK3MtMTtjb25zdCBjPXIucG9zLGw9ci5heGlzKjI7Zm9yKDs7KXtmb3IoO288PWEmJmVbbyo2K2xdPGM7KW8rKztmb3IoO288PWEmJmVbYSo2K2xdPj1jOylhLS07aWYobzxhKXtsZXQgaD1pW29dO2lbb109aVthXSxpW2FdPWg7Zm9yKGxldCB1PTA7dTw2O3UrKyl7bGV0IGY9ZVtvKjYrdV07ZVtvKjYrdV09ZVthKjYrdV0sZVthKjYrdV09Zn1vKyssYS0tfWVsc2UgcmV0dXJuIG99fWZ1bmN0aW9uIGt0KGksdCl7cmV0dXJuIHRbaSsxNV09PT02NTUzNX1mdW5jdGlvbiBWdChpLHQpe3JldHVybiB0W2krNl19ZnVuY3Rpb24gS3QoaSx0KXtyZXR1cm4gdFtpKzE0XX1mdW5jdGlvbiB0ZShpKXtyZXR1cm4gaSs4fWZ1bmN0aW9uIGVlKGksdCl7cmV0dXJuIHRbaSs2XX1mdW5jdGlvbiBjbChpLHQpe3JldHVybiB0W2krN119ZnVuY3Rpb24gWGcoaSl7cmV0dXJuIGl9bGV0IGxsLEJpLEZzLGhsO2NvbnN0IHVkPU1hdGgucG93KDIsMzIpO2Z1bmN0aW9uIFVvKGkpe3JldHVybiJjb3VudCJpbiBpPzE6MStVbyhpLmxlZnQpK1VvKGkucmlnaHQpfWZ1bmN0aW9uIGZkKGksdCxlKXtyZXR1cm4gbGw9bmV3IEZsb2F0MzJBcnJheShlKSxCaT1uZXcgVWludDMyQXJyYXkoZSksRnM9bmV3IFVpbnQxNkFycmF5KGUpLGhsPW5ldyBVaW50OEFycmF5KGUpLFZvKGksdCl9ZnVuY3Rpb24gVm8oaSx0KXtjb25zdCBlPWkvNCxuPWkvMixzPSJjb3VudCJpbiB0LHI9dC5ib3VuZGluZ0RhdGE7Zm9yKGxldCBvPTA7bzw2O28rKylsbFtlK29dPXJbb107aWYocylpZih0LmJ1ZmZlcil7Y29uc3Qgbz10LmJ1ZmZlcjtobC5zZXQobmV3IFVpbnQ4QXJyYXkobyksaSk7Zm9yKGxldCBhPWksYz1pK28uYnl0ZUxlbmd0aDthPGM7YSs9RWkpe2NvbnN0IGw9YS8yO2t0KGwsRnMpfHwoQmlbYS80KzZdKz1lKX1yZXR1cm4gaStvLmJ5dGVMZW5ndGh9ZWxzZXtjb25zdCBvPXQub2Zmc2V0LGE9dC5jb3VudDtyZXR1cm4gQmlbZSs2XT1vLEZzW24rMTRdPWEsRnNbbisxNV09RXMsaStFaX1lbHNle2NvbnN0IG89dC5sZWZ0LGE9dC5yaWdodCxjPXQuc3BsaXRBeGlzO2xldCBsO2lmKGw9Vm8oaStFaSxvKSxsLzQ+dWQpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBDYW5ub3Qgc3RvcmUgY2hpbGQgcG9pbnRlciBncmVhdGVyIHRoYW4gMzIgYml0cy4iKTtyZXR1cm4gQmlbZSs2XT1sLzQsbD1WbyhsLGEpLEJpW2UrN109YyxsfX1mdW5jdGlvbiBkZChpLHQpe2NvbnN0IGU9KGkuaW5kZXg/aS5pbmRleC5jb3VudDppLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQpLzMsbj1lPnlpKDIsMTYpLHM9bj80OjIscj10P25ldyBTaGFyZWRBcnJheUJ1ZmZlcihlKnMpOm5ldyBBcnJheUJ1ZmZlcihlKnMpLG89bj9uZXcgVWludDMyQXJyYXkocik6bmV3IFVpbnQxNkFycmF5KHIpO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKylvW2FdPWE7cmV0dXJuIG99ZnVuY3Rpb24gcGQoaSx0LGUsbixzKXtjb25zdHttYXhEZXB0aDpyLHZlcmJvc2U6byxtYXhMZWFmVHJpczphLHN0cmF0ZWd5OmMsb25Qcm9ncmVzczpsLGluZGlyZWN0Omh9PXMsdT1pLl9pbmRpcmVjdEJ1ZmZlcixmPWkuZ2VvbWV0cnksZD1mLmluZGV4P2YuaW5kZXguYXJyYXk6bnVsbCxwPWg/aGQ6bGQseT1abihmKSxtPW5ldyBGbG9hdDMyQXJyYXkoNik7bGV0IGc9ITE7Y29uc3QgYj1uZXcgJG87cmV0dXJuIERvKHQsZSxuLGIuYm91bmRpbmdEYXRhLG0pLHgoYixlLG4sbSksYjtmdW5jdGlvbiB3KE0pe2wmJmwoTS95KX1mdW5jdGlvbiB4KE0sQSxfLHY9bnVsbCxQPTApe2lmKCFnJiZQPj1yJiYoZz0hMCxvJiYoY29uc29sZS53YXJuKGBNZXNoQlZIOiBNYXggZGVwdGggb2YgJHtyfSByZWFjaGVkIHdoZW4gZ2VuZXJhdGluZyBCVkguIENvbnNpZGVyIGluY3JlYXNpbmcgbWF4RGVwdGguYCksY29uc29sZS53YXJuKGYpKSksXzw9YXx8UD49cilyZXR1cm4gdyhBK18pLE0ub2Zmc2V0PUEsTS5jb3VudD1fLE07Y29uc3Qgej1hZChNLmJvdW5kaW5nRGF0YSx2LHQsQSxfLGMpO2lmKHouYXhpcz09PS0xKXJldHVybiB3KEErXyksTS5vZmZzZXQ9QSxNLmNvdW50PV8sTTtjb25zdCBTPXAodSxkLHQsQSxfLHopO2lmKFM9PT1BfHxTPT09QStfKXcoQStfKSxNLm9mZnNldD1BLE0uY291bnQ9XztlbHNle00uc3BsaXRBeGlzPXouYXhpcztjb25zdCBDPW5ldyAkbyxFPUEsRj1TLUE7TS5sZWZ0PUMsRG8odCxFLEYsQy5ib3VuZGluZ0RhdGEsbSkseChDLEUsRixtLFArMSk7Y29uc3QgQj1uZXcgJG8sST1TLGs9Xy1GO00ucmlnaHQ9QixEbyh0LEksayxCLmJvdW5kaW5nRGF0YSxtKSx4KEIsSSxrLG0sUCsxKX1yZXR1cm4gTX19ZnVuY3Rpb24geWQoaSx0KXtjb25zdCBlPWkuZ2VvbWV0cnk7dC5pbmRpcmVjdCYmKGkuX2luZGlyZWN0QnVmZmVyPWRkKGUsdC51c2VTaGFyZWRBcnJheUJ1ZmZlciksc2QoZSx0LnJhbmdlKSYmIXQudmVyYm9zZSYmY29uc29sZS53YXJuKCdNZXNoQlZIOiBQcm92aWRlZCBnZW9tZXRyeSBjb250YWlucyBncm91cHMgb3IgYSByYW5nZSB0aGF0IGRvIG5vdCBmdWxseSBzcGFuIHRoZSB2ZXJ0ZXggY29udGVudHMgd2hpbGUgdXNpbmcgdGhlICJpbmRpcmVjdCIgb3B0aW9uLiBCVkggbWF5IGluY29ycmVjdGx5IHJlcG9ydCBpbnRlcnNlY3Rpb25zIG9uIHVucmVuZGVyZWQgcG9ydGlvbnMgb2YgdGhlIGdlb21ldHJ5LicpKSxpLl9pbmRpcmVjdEJ1ZmZlcnx8aWQoZSx0KTtjb25zdCBuPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz1yZChlKSxyPXQuaW5kaXJlY3Q/aWwoZSx0LnJhbmdlKTpzbChlLHQucmFuZ2UpO2kuX3Jvb3RzPXIubWFwKG89Pntjb25zdCBhPXBkKGkscyxvLm9mZnNldCxvLmNvdW50LHQpLGM9VW8oYSksbD1uZXcgbihFaSpjKTtyZXR1cm4gZmQoMCxhLGwpLGx9KX1jbGFzcyBJZXtjb25zdHJ1Y3Rvcigpe3RoaXMubWluPTEvMCx0aGlzLm1heD0tMS8wfXNldEZyb21Qb2ludHNGaWVsZCh0LGUpe2xldCBuPTEvMCxzPS0xLzA7Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXtjb25zdCBjPXRbcl1bZV07bj1jPG4/YzpuLHM9Yz5zP2M6c310aGlzLm1pbj1uLHRoaXMubWF4PXN9c2V0RnJvbVBvaW50cyh0LGUpe2xldCBuPTEvMCxzPS0xLzA7Zm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPWVbcl0sYz10LmRvdChhKTtuPWM8bj9jOm4scz1jPnM/YzpzfXRoaXMubWluPW4sdGhpcy5tYXg9c31pc1NlcGFyYXRlZCh0KXtyZXR1cm4gdGhpcy5taW4+dC5tYXh8fHQubWluPnRoaXMubWF4fX1JZS5wcm90b3R5cGUuc2V0RnJvbUJveD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKGUsbil7Y29uc3Qgcz1uLm1pbixyPW4ubWF4O2xldCBvPTEvMCxhPS0xLzA7Zm9yKGxldCBjPTA7Yzw9MTtjKyspZm9yKGxldCBsPTA7bDw9MTtsKyspZm9yKGxldCBoPTA7aDw9MTtoKyspe2kueD1zLngqYytyLngqKDEtYyksaS55PXMueSpsK3IueSooMS1sKSxpLno9cy56Kmgrci56KigxLWgpO2NvbnN0IHU9ZS5kb3QoaSk7bz1NYXRoLm1pbih1LG8pLGE9TWF0aC5tYXgodSxhKX10aGlzLm1pbj1vLHRoaXMubWF4PWF9fSgpO2NvbnN0IG1kPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVCx0PW5ldyBULGU9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKHMscixvKXtjb25zdCBhPXMuc3RhcnQsYz1pLGw9ci5zdGFydCxoPXQ7ZS5zdWJWZWN0b3JzKGEsbCksaS5zdWJWZWN0b3JzKHMuZW5kLHMuc3RhcnQpLHQuc3ViVmVjdG9ycyhyLmVuZCxyLnN0YXJ0KTtjb25zdCB1PWUuZG90KGgpLGY9aC5kb3QoYyksZD1oLmRvdChoKSxwPWUuZG90KGMpLG09Yy5kb3QoYykqZC1mKmY7bGV0IGcsYjttIT09MD9nPSh1KmYtcCpkKS9tOmc9MCxiPSh1K2cqZikvZCxvLng9ZyxvLnk9Yn19KCkscW89ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBSLHQ9bmV3IFQsZT1uZXcgVDtyZXR1cm4gZnVuY3Rpb24ocyxyLG8sYSl7bWQocyxyLGkpO2xldCBjPWkueCxsPWkueTtpZihjPj0wJiZjPD0xJiZsPj0wJiZsPD0xKXtzLmF0KGMsbyksci5hdChsLGEpO3JldHVybn1lbHNlIGlmKGM+PTAmJmM8PTEpe2w8MD9yLmF0KDAsYSk6ci5hdCgxLGEpLHMuY2xvc2VzdFBvaW50VG9Qb2ludChhLCEwLG8pO3JldHVybn1lbHNlIGlmKGw+PTAmJmw8PTEpe2M8MD9zLmF0KDAsbyk6cy5hdCgxLG8pLHIuY2xvc2VzdFBvaW50VG9Qb2ludChvLCEwLGEpO3JldHVybn1lbHNle2xldCBoO2M8MD9oPXMuc3RhcnQ6aD1zLmVuZDtsZXQgdTtsPDA/dT1yLnN0YXJ0OnU9ci5lbmQ7Y29uc3QgZj10LGQ9ZTtpZihzLmNsb3Nlc3RQb2ludFRvUG9pbnQodSwhMCx0KSxyLmNsb3Nlc3RQb2ludFRvUG9pbnQoaCwhMCxlKSxmLmRpc3RhbmNlVG9TcXVhcmVkKHUpPD1kLmRpc3RhbmNlVG9TcXVhcmVkKGgpKXtvLmNvcHkoZiksYS5jb3B5KHUpO3JldHVybn1lbHNle28uY29weShoKSxhLmNvcHkoZCk7cmV0dXJufX19fSgpLGdkPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVCx0PW5ldyBULGU9bmV3IFNvLG49bmV3IFF0O3JldHVybiBmdW5jdGlvbihyLG8pe2NvbnN0e3JhZGl1czphLGNlbnRlcjpjfT1yLHthOmwsYjpoLGM6dX09bztpZihuLnN0YXJ0PWwsbi5lbmQ9aCxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYywhMCxpKS5kaXN0YW5jZVRvKGMpPD1hfHwobi5zdGFydD1sLG4uZW5kPXUsbi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAsaSkuZGlzdGFuY2VUbyhjKTw9YSl8fChuLnN0YXJ0PWgsbi5lbmQ9dSxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYywhMCxpKS5kaXN0YW5jZVRvKGMpPD1hKSlyZXR1cm4hMDtjb25zdCB5PW8uZ2V0UGxhbmUoZSk7aWYoTWF0aC5hYnMoeS5kaXN0YW5jZVRvUG9pbnQoYykpPD1hKXtjb25zdCBnPXkucHJvamVjdFBvaW50KGMsdCk7aWYoby5jb250YWluc1BvaW50KGcpKXJldHVybiEwfXJldHVybiExfX0oKSx4ZD0xZS0xNTtmdW5jdGlvbiBIbyhpKXtyZXR1cm4gTWF0aC5hYnMoaSk8eGR9Y2xhc3MgbmUgZXh0ZW5kcyBldHtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLmlzRXh0ZW5kZWRUcmlhbmdsZT0hMCx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCk9Pm5ldyBUKSx0aGlzLnNhdEJvdW5kcz1uZXcgQXJyYXkoNCkuZmlsbCgpLm1hcCgoKT0+bmV3IEllKSx0aGlzLnBvaW50cz1bdGhpcy5hLHRoaXMuYix0aGlzLmNdLHRoaXMuc3BoZXJlPW5ldyBhbyx0aGlzLnBsYW5lPW5ldyBTbyx0aGlzLm5lZWRzVXBkYXRlPSEwfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIGdkKHQsdGhpcyl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmEsZT10aGlzLmIsbj10aGlzLmMscz10aGlzLnBvaW50cyxyPXRoaXMuc2F0QXhlcyxvPXRoaXMuc2F0Qm91bmRzLGE9clswXSxjPW9bMF07dGhpcy5nZXROb3JtYWwoYSksYy5zZXRGcm9tUG9pbnRzKGEscyk7Y29uc3QgbD1yWzFdLGg9b1sxXTtsLnN1YlZlY3RvcnModCxlKSxoLnNldEZyb21Qb2ludHMobCxzKTtjb25zdCB1PXJbMl0sZj1vWzJdO3Uuc3ViVmVjdG9ycyhlLG4pLGYuc2V0RnJvbVBvaW50cyh1LHMpO2NvbnN0IGQ9clszXSxwPW9bM107ZC5zdWJWZWN0b3JzKG4sdCkscC5zZXRGcm9tUG9pbnRzKGQscyksdGhpcy5zcGhlcmUuc2V0RnJvbVBvaW50cyh0aGlzLnBvaW50cyksdGhpcy5wbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChhLHQpLHRoaXMubmVlZHNVcGRhdGU9ITF9fW5lLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1NlZ21lbnQ9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBULHQ9bmV3IFQsZT1uZXcgUXQ7cmV0dXJuIGZ1bmN0aW9uKHMscj1udWxsLG89bnVsbCl7Y29uc3R7c3RhcnQ6YSxlbmQ6Y309cyxsPXRoaXMucG9pbnRzO2xldCBoLHU9MS8wO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9KGYrMSklMztlLnN0YXJ0LmNvcHkobFtmXSksZS5lbmQuY29weShsW2RdKSxxbyhlLHMsaSx0KSxoPWkuZGlzdGFuY2VUb1NxdWFyZWQodCksaDx1JiYodT1oLHImJnIuY29weShpKSxvJiZvLmNvcHkodCkpfXJldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSxpKSxoPWEuZGlzdGFuY2VUb1NxdWFyZWQoaSksaDx1JiYodT1oLHImJnIuY29weShpKSxvJiZvLmNvcHkoYSkpLHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChjLGkpLGg9Yy5kaXN0YW5jZVRvU3F1YXJlZChpKSxoPHUmJih1PWgsciYmci5jb3B5KGkpLG8mJm8uY29weShjKSksTWF0aC5zcXJ0KHUpfX0oKSxuZS5wcm90b3R5cGUuaW50ZXJzZWN0c1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgbmUsdD1uZXcgQXJyYXkoMyksZT1uZXcgQXJyYXkoMyksbj1uZXcgSWUscz1uZXcgSWUscj1uZXcgVCxvPW5ldyBULGE9bmV3IFQsYz1uZXcgVCxsPW5ldyBULGg9bmV3IFF0LHU9bmV3IFF0LGY9bmV3IFF0LGQ9bmV3IFQ7ZnVuY3Rpb24gcCh5LG0sZyl7Y29uc3QgYj15LnBvaW50cztsZXQgdz0wLHg9LTE7Zm9yKGxldCBNPTA7TTwzO00rKyl7Y29uc3R7c3RhcnQ6QSxlbmQ6X309aDtBLmNvcHkoYltNXSksXy5jb3B5KGJbKE0rMSklM10pLGguZGVsdGEobyk7Y29uc3Qgdj1IbyhtLmRpc3RhbmNlVG9Qb2ludChBKSk7aWYoSG8obS5ub3JtYWwuZG90KG8pKSYmdil7Zy5jb3B5KGgpLHc9MjticmVha31jb25zdCBQPW0uaW50ZXJzZWN0TGluZShoLGQpO2lmKCFQJiZ2JiZkLmNvcHkoQSksKFB8fHYpJiYhSG8oZC5kaXN0YW5jZVRvKF8pKSl7aWYodzw9MSkodz09PTE/Zy5zdGFydDpnLmVuZCkuY29weShkKSx2JiYoeD13KTtlbHNlIGlmKHc+PTIpeyh4PT09MT9nLnN0YXJ0OmcuZW5kKS5jb3B5KGQpLHc9MjticmVha31pZih3Kyssdz09PTImJng9PT0tMSlicmVha319cmV0dXJuIHd9cmV0dXJuIGZ1bmN0aW9uKG0sZz1udWxsLGI9ITEpe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksbS5pc0V4dGVuZGVkVHJpYW5nbGU/bS5uZWVkc1VwZGF0ZSYmbS51cGRhdGUoKTooaS5jb3B5KG0pLGkudXBkYXRlKCksbT1pKTtjb25zdCB3PXRoaXMucGxhbmUseD1tLnBsYW5lO2lmKE1hdGguYWJzKHcubm9ybWFsLmRvdCh4Lm5vcm1hbCkpPjEtMWUtMTApe2NvbnN0IE09dGhpcy5zYXRCb3VuZHMsQT10aGlzLnNhdEF4ZXM7ZVswXT1tLmEsZVsxXT1tLmIsZVsyXT1tLmM7Zm9yKGxldCBQPTA7UDw0O1ArKyl7Y29uc3Qgej1NW1BdLFM9QVtQXTtpZihuLnNldEZyb21Qb2ludHMoUyxlKSx6LmlzU2VwYXJhdGVkKG4pKXJldHVybiExfWNvbnN0IF89bS5zYXRCb3VuZHMsdj1tLnNhdEF4ZXM7dFswXT10aGlzLmEsdFsxXT10aGlzLmIsdFsyXT10aGlzLmM7Zm9yKGxldCBQPTA7UDw0O1ArKyl7Y29uc3Qgej1fW1BdLFM9dltQXTtpZihuLnNldEZyb21Qb2ludHMoUyx0KSx6LmlzU2VwYXJhdGVkKG4pKXJldHVybiExfWZvcihsZXQgUD0wO1A8NDtQKyspe2NvbnN0IHo9QVtQXTtmb3IobGV0IFM9MDtTPDQ7UysrKXtjb25zdCBDPXZbU107aWYoci5jcm9zc1ZlY3RvcnMoeixDKSxuLnNldEZyb21Qb2ludHMocix0KSxzLnNldEZyb21Qb2ludHMocixlKSxuLmlzU2VwYXJhdGVkKHMpKXJldHVybiExfX1yZXR1cm4gZyYmKGJ8fGNvbnNvbGUud2FybigiRXh0ZW5kZWRUcmlhbmdsZS5pbnRlcnNlY3RzVHJpYW5nbGU6IFRyaWFuZ2xlcyBhcmUgY29wbGFuYXIgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBhbiBvdXRwdXQgZWRnZS4gU2V0dGluZyBlZGdlIHRvIDAsIDAsIDAuIiksZy5zdGFydC5zZXQoMCwwLDApLGcuZW5kLnNldCgwLDAsMCkpLCEwfWVsc2V7Y29uc3QgTT1wKHRoaXMseCx1KTtpZihNPT09MSYmbS5jb250YWluc1BvaW50KHUuZW5kKSlyZXR1cm4gZyYmKGcuc3RhcnQuY29weSh1LmVuZCksZy5lbmQuY29weSh1LmVuZCkpLCEwO2lmKE0hPT0yKXJldHVybiExO2NvbnN0IEE9cChtLHcsZik7aWYoQT09PTEmJnRoaXMuY29udGFpbnNQb2ludChmLmVuZCkpcmV0dXJuIGcmJihnLnN0YXJ0LmNvcHkoZi5lbmQpLGcuZW5kLmNvcHkoZi5lbmQpKSwhMDtpZihBIT09MilyZXR1cm4hMTtpZih1LmRlbHRhKGEpLGYuZGVsdGEoYyksYS5kb3QoYyk8MCl7bGV0IEU9Zi5zdGFydDtmLnN0YXJ0PWYuZW5kLGYuZW5kPUV9Y29uc3QgXz11LnN0YXJ0LmRvdChhKSx2PXUuZW5kLmRvdChhKSxQPWYuc3RhcnQuZG90KGEpLHo9Zi5lbmQuZG90KGEpLFM9djxQLEM9Xzx6O3JldHVybiBfIT09eiYmUCE9PXYmJlM9PT1DPyExOihnJiYobC5zdWJWZWN0b3JzKHUuc3RhcnQsZi5zdGFydCksbC5kb3QoYSk+MD9nLnN0YXJ0LmNvcHkodS5zdGFydCk6Zy5zdGFydC5jb3B5KGYuc3RhcnQpLGwuc3ViVmVjdG9ycyh1LmVuZCxmLmVuZCksbC5kb3QoYSk8MD9nLmVuZC5jb3B5KHUuZW5kKTpnLmVuZC5jb3B5KGYuZW5kKSksITApfX19KCksbmUucHJvdG90eXBlLmRpc3RhbmNlVG9Qb2ludD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoZSxpKSxlLmRpc3RhbmNlVG8oaSl9fSgpLG5lLnByb3RvdHlwZS5kaXN0YW5jZVRvVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBULHQ9bmV3IFQsZT1bImEiLCJiIiwiYyJdLG49bmV3IFF0LHM9bmV3IFF0O3JldHVybiBmdW5jdGlvbihvLGE9bnVsbCxjPW51bGwpe2NvbnN0IGw9YXx8Yz9uOm51bGw7aWYodGhpcy5pbnRlcnNlY3RzVHJpYW5nbGUobyxsKSlyZXR1cm4oYXx8YykmJihhJiZsLmdldENlbnRlcihhKSxjJiZsLmdldENlbnRlcihjKSksMDtsZXQgaD0xLzA7Zm9yKGxldCB1PTA7dTwzO3UrKyl7bGV0IGY7Y29uc3QgZD1lW3VdLHA9b1tkXTt0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocCxpKSxmPXAuZGlzdGFuY2VUb1NxdWFyZWQoaSksZjxoJiYoaD1mLGEmJmEuY29weShpKSxjJiZjLmNvcHkocCkpO2NvbnN0IHk9dGhpc1tkXTtvLmNsb3Nlc3RQb2ludFRvUG9pbnQoeSxpKSxmPXkuZGlzdGFuY2VUb1NxdWFyZWQoaSksZjxoJiYoaD1mLGEmJmEuY29weSh5KSxjJiZjLmNvcHkoaSkpfWZvcihsZXQgdT0wO3U8Mzt1Kyspe2NvbnN0IGY9ZVt1XSxkPWVbKHUrMSklM107bi5zZXQodGhpc1tmXSx0aGlzW2RdKTtmb3IobGV0IHA9MDtwPDM7cCsrKXtjb25zdCB5PWVbcF0sbT1lWyhwKzEpJTNdO3Muc2V0KG9beV0sb1ttXSkscW8obixzLGksdCk7Y29uc3QgZz1pLmRpc3RhbmNlVG9TcXVhcmVkKHQpO2c8aCYmKGg9ZyxhJiZhLmNvcHkoaSksYyYmYy5jb3B5KHQpKX19cmV0dXJuIE1hdGguc3FydChoKX19KCk7Y2xhc3MgenR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuaXNPcmllbnRlZEJveD0hMCx0aGlzLm1pbj1uZXcgVCx0aGlzLm1heD1uZXcgVCx0aGlzLm1hdHJpeD1uZXcgc3QsdGhpcy5pbnZNYXRyaXg9bmV3IHN0LHRoaXMucG9pbnRzPW5ldyBBcnJheSg4KS5maWxsKCkubWFwKCgpPT5uZXcgVCksdGhpcy5zYXRBeGVzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgVCksdGhpcy5zYXRCb3VuZHM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCk9Pm5ldyBJZSksdGhpcy5hbGlnbmVkU2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgSWUpLHRoaXMubmVlZHNVcGRhdGU9ITEsdCYmdGhpcy5taW4uY29weSh0KSxlJiZ0aGlzLm1heC5jb3B5KGUpLG4mJnRoaXMubWF0cml4LmNvcHkobil9c2V0KHQsZSxuKXt0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpcy5tYXRyaXguY29weShuKSx0aGlzLm5lZWRzVXBkYXRlPSEwfWNvcHkodCl7dGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5uZWVkc1VwZGF0ZT0hMH19enQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5tYXRyaXgsZT10aGlzLm1pbixuPXRoaXMubWF4LHM9dGhpcy5wb2ludHM7Zm9yKGxldCBsPTA7bDw9MTtsKyspZm9yKGxldCBoPTA7aDw9MTtoKyspZm9yKGxldCB1PTA7dTw9MTt1Kyspe2NvbnN0IGY9MSpsfDIqaHw0KnUsZD1zW2ZdO2QueD1sP24ueDplLngsZC55PWg/bi55OmUueSxkLno9dT9uLno6ZS56LGQuYXBwbHlNYXRyaXg0KHQpfWNvbnN0IHI9dGhpcy5zYXRCb3VuZHMsbz10aGlzLnNhdEF4ZXMsYT1zWzBdO2ZvcihsZXQgbD0wO2w8MztsKyspe2NvbnN0IGg9b1tsXSx1PXJbbF0sZj0xPDxsLGQ9c1tmXTtoLnN1YlZlY3RvcnMoYSxkKSx1LnNldEZyb21Qb2ludHMoaCxzKX1jb25zdCBjPXRoaXMuYWxpZ25lZFNhdEJvdW5kcztjWzBdLnNldEZyb21Qb2ludHNGaWVsZChzLCJ4IiksY1sxXS5zZXRGcm9tUG9pbnRzRmllbGQocywieSIpLGNbMl0uc2V0RnJvbVBvaW50c0ZpZWxkKHMsInoiKSx0aGlzLmludk1hdHJpeC5jb3B5KHRoaXMubWF0cml4KS5pbnZlcnQoKSx0aGlzLm5lZWRzVXBkYXRlPSExfX0oKSx6dC5wcm90b3R5cGUuaW50ZXJzZWN0c0JveD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IEllO3JldHVybiBmdW5jdGlvbihlKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpO2NvbnN0IG49ZS5taW4scz1lLm1heCxyPXRoaXMuc2F0Qm91bmRzLG89dGhpcy5zYXRBeGVzLGE9dGhpcy5hbGlnbmVkU2F0Qm91bmRzO2lmKGkubWluPW4ueCxpLm1heD1zLngsYVswXS5pc1NlcGFyYXRlZChpKXx8KGkubWluPW4ueSxpLm1heD1zLnksYVsxXS5pc1NlcGFyYXRlZChpKSl8fChpLm1pbj1uLnosaS5tYXg9cy56LGFbMl0uaXNTZXBhcmF0ZWQoaSkpKXJldHVybiExO2ZvcihsZXQgYz0wO2M8MztjKyspe2NvbnN0IGw9b1tjXSxoPXJbY107aWYoaS5zZXRGcm9tQm94KGwsZSksaC5pc1NlcGFyYXRlZChpKSlyZXR1cm4hMX1yZXR1cm4hMH19KCksenQucHJvdG90eXBlLmludGVyc2VjdHNUcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IG5lLHQ9bmV3IEFycmF5KDMpLGU9bmV3IEllLG49bmV3IEllLHM9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKG8pe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksby5pc0V4dGVuZGVkVHJpYW5nbGU/by5uZWVkc1VwZGF0ZSYmby51cGRhdGUoKTooaS5jb3B5KG8pLGkudXBkYXRlKCksbz1pKTtjb25zdCBhPXRoaXMuc2F0Qm91bmRzLGM9dGhpcy5zYXRBeGVzO3RbMF09by5hLHRbMV09by5iLHRbMl09by5jO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9YVtmXSxwPWNbZl07aWYoZS5zZXRGcm9tUG9pbnRzKHAsdCksZC5pc1NlcGFyYXRlZChlKSlyZXR1cm4hMX1jb25zdCBsPW8uc2F0Qm91bmRzLGg9by5zYXRBeGVzLHU9dGhpcy5wb2ludHM7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD1sW2ZdLHA9aFtmXTtpZihlLnNldEZyb21Qb2ludHMocCx1KSxkLmlzU2VwYXJhdGVkKGUpKXJldHVybiExfWZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9Y1tmXTtmb3IobGV0IHA9MDtwPDQ7cCsrKXtjb25zdCB5PWhbcF07aWYocy5jcm9zc1ZlY3RvcnMoZCx5KSxlLnNldEZyb21Qb2ludHMocyx0KSxuLnNldEZyb21Qb2ludHMocyx1KSxlLmlzU2VwYXJhdGVkKG4pKXJldHVybiExfX1yZXR1cm4hMH19KCksenQucHJvdG90eXBlLmNsb3Nlc3RQb2ludFRvUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSxlLmNvcHkodCkuYXBwbHlNYXRyaXg0KHRoaXMuaW52TWF0cml4KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4KSxlfX0oKSx6dC5wcm90b3R5cGUuZGlzdGFuY2VUb1BvaW50PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChlLGkpLGUuZGlzdGFuY2VUbyhpKX19KCksenQucHJvdG90eXBlLmRpc3RhbmNlVG9Cb3g9ZnVuY3Rpb24oKXtjb25zdCBpPVsieCIsInkiLCJ6Il0sdD1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyBRdCksZT1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyBRdCksbj1uZXcgVCxzPW5ldyBUO3JldHVybiBmdW5jdGlvbihvLGE9MCxjPW51bGwsbD1udWxsKXtpZih0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLHRoaXMuaW50ZXJzZWN0c0JveChvKSlyZXR1cm4oY3x8bCkmJihvLmdldENlbnRlcihzKSx0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocyxuKSxvLmNsb3Nlc3RQb2ludFRvUG9pbnQobixzKSxjJiZjLmNvcHkobiksbCYmbC5jb3B5KHMpKSwwO2NvbnN0IGg9YSphLHU9by5taW4sZj1vLm1heCxkPXRoaXMucG9pbnRzO2xldCBwPTEvMDtmb3IobGV0IG09MDttPDg7bSsrKXtjb25zdCBnPWRbbV07cy5jb3B5KGcpLmNsYW1wKHUsZik7Y29uc3QgYj1nLmRpc3RhbmNlVG9TcXVhcmVkKHMpO2lmKGI8cCYmKHA9YixjJiZjLmNvcHkoZyksbCYmbC5jb3B5KHMpLGI8aCkpcmV0dXJuIE1hdGguc3FydChiKX1sZXQgeT0wO2ZvcihsZXQgbT0wO208MzttKyspZm9yKGxldCBnPTA7Zzw9MTtnKyspZm9yKGxldCBiPTA7Yjw9MTtiKyspe2NvbnN0IHc9KG0rMSklMyx4PShtKzIpJTMsTT1nPDx3fGI8PHgsQT0xPDxtfGc8PHd8Yjw8eCxfPWRbTV0sdj1kW0FdO3RbeV0uc2V0KF8sdik7Y29uc3Qgej1pW21dLFM9aVt3XSxDPWlbeF0sRT1lW3ldLEY9RS5zdGFydCxCPUUuZW5kO0Zbel09dVt6XSxGW1NdPWc/dVtTXTpmW1NdLEZbQ109Yj91W0NdOmZbU10sQlt6XT1mW3pdLEJbU109Zz91W1NdOmZbU10sQltDXT1iP3VbQ106ZltTXSx5Kyt9Zm9yKGxldCBtPTA7bTw9MTttKyspZm9yKGxldCBnPTA7Zzw9MTtnKyspZm9yKGxldCBiPTA7Yjw9MTtiKyspe3MueD1tP2YueDp1Lngscy55PWc/Zi55OnUueSxzLno9Yj9mLno6dS56LHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChzLG4pO2NvbnN0IHc9cy5kaXN0YW5jZVRvU3F1YXJlZChuKTtpZih3PHAmJihwPXcsYyYmYy5jb3B5KG4pLGwmJmwuY29weShzKSx3PGgpKXJldHVybiBNYXRoLnNxcnQodyl9Zm9yKGxldCBtPTA7bTwxMjttKyspe2NvbnN0IGc9dFttXTtmb3IobGV0IGI9MDtiPDEyO2IrKyl7Y29uc3Qgdz1lW2JdO3FvKGcsdyxuLHMpO2NvbnN0IHg9bi5kaXN0YW5jZVRvU3F1YXJlZChzKTtpZih4PHAmJihwPXgsYyYmYy5jb3B5KG4pLGwmJmwuY29weShzKSx4PGgpKXJldHVybiBNYXRoLnNxcnQoeCl9fXJldHVybiBNYXRoLnNxcnQocCl9fSgpO2NsYXNzIFdve2NvbnN0cnVjdG9yKHQpe3RoaXMuX2dldE5ld1ByaW1pdGl2ZT10LHRoaXMuX3ByaW1pdGl2ZXM9W119Z2V0UHJpbWl0aXZlKCl7Y29uc3QgdD10aGlzLl9wcmltaXRpdmVzO3JldHVybiB0Lmxlbmd0aD09PTA/dGhpcy5fZ2V0TmV3UHJpbWl0aXZlKCk6dC5wb3AoKX1yZWxlYXNlUHJpbWl0aXZlKHQpe3RoaXMuX3ByaW1pdGl2ZXMucHVzaCh0KX19Y2xhc3Mgd2QgZXh0ZW5kcyBXb3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCgpPT5uZXcgbmUpfX1jb25zdCBpZT1uZXcgd2Q7Y2xhc3MgYmR7Y29uc3RydWN0b3IoKXt0aGlzLmZsb2F0MzJBcnJheT1udWxsLHRoaXMudWludDE2QXJyYXk9bnVsbCx0aGlzLnVpbnQzMkFycmF5PW51bGw7Y29uc3QgdD1bXTtsZXQgZT1udWxsO3RoaXMuc2V0QnVmZmVyPW49PntlJiZ0LnB1c2goZSksZT1uLHRoaXMuZmxvYXQzMkFycmF5PW5ldyBGbG9hdDMyQXJyYXkobiksdGhpcy51aW50MTZBcnJheT1uZXcgVWludDE2QXJyYXkobiksdGhpcy51aW50MzJBcnJheT1uZXcgVWludDMyQXJyYXkobil9LHRoaXMuY2xlYXJCdWZmZXI9KCk9PntlPW51bGwsdGhpcy5mbG9hdDMyQXJyYXk9bnVsbCx0aGlzLnVpbnQxNkFycmF5PW51bGwsdGhpcy51aW50MzJBcnJheT1udWxsLHQubGVuZ3RoIT09MCYmdGhpcy5zZXRCdWZmZXIodC5wb3AoKSl9fX1jb25zdCBudD1uZXcgYmQ7bGV0IHRuLFhuO2NvbnN0IEpuPVtdLElzPW5ldyBXbygoKT0+bmV3IGd0KTtmdW5jdGlvbiBNZChpLHQsZSxuLHMscil7dG49SXMuZ2V0UHJpbWl0aXZlKCksWG49SXMuZ2V0UHJpbWl0aXZlKCksSm4ucHVzaCh0bixYbiksbnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBvPUdvKDAsaS5nZW9tZXRyeSxlLG4scyxyKTtudC5jbGVhckJ1ZmZlcigpLElzLnJlbGVhc2VQcmltaXRpdmUodG4pLElzLnJlbGVhc2VQcmltaXRpdmUoWG4pLEpuLnBvcCgpLEpuLnBvcCgpO2NvbnN0IGE9Sm4ubGVuZ3RoO3JldHVybiBhPjAmJihYbj1KblthLTFdLHRuPUpuW2EtMl0pLG99ZnVuY3Rpb24gR28oaSx0LGUsbixzPW51bGwscj0wLG89MCl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT1udDtsZXQgaD1pKjI7aWYoa3QoaCxjKSl7Y29uc3QgZj1WdChpLGwpLGQ9S3QoaCxjKTtyZXR1cm4gbHQoaSxhLHRuKSxuKGYsZCwhMSxvLHIraSx0bil9ZWxzZXtsZXQgej1mdW5jdGlvbihDKXtjb25zdHt1aW50MTZBcnJheTpFLHVpbnQzMkFycmF5OkZ9PW50O2xldCBCPUMqMjtmb3IoOyFrdChCLEUpOylDPXRlKEMpLEI9QyoyO3JldHVybiBWdChDLEYpfSxTPWZ1bmN0aW9uKEMpe2NvbnN0e3VpbnQxNkFycmF5OkUsdWludDMyQXJyYXk6Rn09bnQ7bGV0IEI9QyoyO2Zvcig7IWt0KEIsRSk7KUM9ZWUoQyxGKSxCPUMqMjtyZXR1cm4gVnQoQyxGKStLdChCLEUpfTtjb25zdCBmPXRlKGkpLGQ9ZWUoaSxsKTtsZXQgcD1mLHk9ZCxtLGcsYix3O2lmKHMmJihiPXRuLHc9WG4sbHQocCxhLGIpLGx0KHksYSx3KSxtPXMoYiksZz1zKHcpLGc8bSkpe3A9ZCx5PWY7Y29uc3QgQz1tO209ZyxnPUMsYj13fWJ8fChiPXRuLGx0KHAsYSxiKSk7Y29uc3QgeD1rdChwKjIsYyksTT1lKGIseCxtLG8rMSxyK3ApO2xldCBBO2lmKE09PT1lbCl7Y29uc3QgQz16KHApLEY9UyhwKS1DO0E9bihDLEYsITAsbysxLHIrcCxiKX1lbHNlIEE9TSYmR28ocCx0LGUsbixzLHIsbysxKTtpZihBKXJldHVybiEwO3c9WG4sbHQoeSxhLHcpO2NvbnN0IF89a3QoeSoyLGMpLHY9ZSh3LF8sZyxvKzEscit5KTtsZXQgUDtpZih2PT09ZWwpe2NvbnN0IEM9eih5KSxGPVMoeSktQztQPW4oQyxGLCEwLG8rMSxyK3ksdyl9ZWxzZSBQPXYmJkdvKHksdCxlLG4scyxyLG8rMSk7cmV0dXJuISFQfX1jb25zdCBGaT1uZXcgVCxabz1uZXcgVDtmdW5jdGlvbiBBZChpLHQsZT17fSxuPTAscz0xLzApe2NvbnN0IHI9bipuLG89cypzO2xldCBhPTEvMCxjPW51bGw7aWYoaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6aD0+KEZpLmNvcHkodCkuY2xhbXAoaC5taW4saC5tYXgpLEZpLmRpc3RhbmNlVG9TcXVhcmVkKHQpKSxpbnRlcnNlY3RzQm91bmRzOihoLHUsZik9PmY8YSYmZjxvLGludGVyc2VjdHNUcmlhbmdsZTooaCx1KT0+e2guY2xvc2VzdFBvaW50VG9Qb2ludCh0LEZpKTtjb25zdCBmPXQuZGlzdGFuY2VUb1NxdWFyZWQoRmkpO3JldHVybiBmPGEmJihaby5jb3B5KEZpKSxhPWYsYz11KSxmPHJ9fSksYT09PTEvMClyZXR1cm4gbnVsbDtjb25zdCBsPU1hdGguc3FydChhKTtyZXR1cm4gZS5wb2ludD9lLnBvaW50LmNvcHkoWm8pOmUucG9pbnQ9Wm8uY2xvbmUoKSxlLmRpc3RhbmNlPWwsZS5mYWNlSW5kZXg9YyxlfWNvbnN0IF9kPXBhcnNlSW50KEopPj0xNjkseW49bmV3IFQsbW49bmV3IFQsZ249bmV3IFQsa3M9bmV3IFIsTnM9bmV3IFIsUnM9bmV3IFIsdWw9bmV3IFQsZmw9bmV3IFQsZGw9bmV3IFQsSWk9bmV3IFQ7ZnVuY3Rpb24gdmQoaSx0LGUsbixzLHIsbyxhKXtsZXQgYztpZihyPT09MT9jPWkuaW50ZXJzZWN0VHJpYW5nbGUobixlLHQsITAscyk6Yz1pLmludGVyc2VjdFRyaWFuZ2xlKHQsZSxuLHIhPT0yLHMpLGM9PT1udWxsKXJldHVybiBudWxsO2NvbnN0IGw9aS5vcmlnaW4uZGlzdGFuY2VUbyhzKTtyZXR1cm4gbDxvfHxsPmE/bnVsbDp7ZGlzdGFuY2U6bCxwb2ludDpzLmNsb25lKCl9fWZ1bmN0aW9uIFNkKGksdCxlLG4scyxyLG8sYSxjLGwsaCl7eW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHIpLG1uLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxvKSxnbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsYSk7Y29uc3QgdT12ZChpLHluLG1uLGduLElpLGMsbCxoKTtpZih1KXtjb25zdCBmPW5ldyBUO2V0LmdldEJhcnljb29yZChJaSx5bixtbixnbixmKSxuJiYoa3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHIpLE5zLmZyb21CdWZmZXJBdHRyaWJ1dGUobixvKSxScy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sYSksdS51dj1ldC5nZXRJbnRlcnBvbGF0aW9uKElpLHluLG1uLGduLGtzLE5zLFJzLG5ldyBSKSkscyYmKGtzLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxyKSxOcy5mcm9tQnVmZmVyQXR0cmlidXRlKHMsbyksUnMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGEpLHUudXYxPWV0LmdldEludGVycG9sYXRpb24oSWkseW4sbW4sZ24sa3MsTnMsUnMsbmV3IFIpKSxlJiYodWwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHIpLGZsLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxvKSxkbC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsYSksdS5ub3JtYWw9ZXQuZ2V0SW50ZXJwb2xhdGlvbihJaSx5bixtbixnbix1bCxmbCxkbCxuZXcgVCksdS5ub3JtYWwuZG90KGkuZGlyZWN0aW9uKT4wJiZ1Lm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSkpO2NvbnN0IGQ9e2E6cixiOm8sYzphLG5vcm1hbDpuZXcgVCxtYXRlcmlhbEluZGV4OjB9O2V0LmdldE5vcm1hbCh5bixtbixnbixkLm5vcm1hbCksdS5mYWNlPWQsdS5mYWNlSW5kZXg9cixfZCYmKHUuYmFyeWNvb3JkPWYpfXJldHVybiB1fWZ1bmN0aW9uIExzKGksdCxlLG4scyxyLG8pe2NvbnN0IGE9biozO2xldCBjPWErMCxsPWErMSxoPWErMjtjb25zdCB1PWkuaW5kZXg7aS5pbmRleCYmKGM9dS5nZXRYKGMpLGw9dS5nZXRYKGwpLGg9dS5nZXRYKGgpKTtjb25zdHtwb3NpdGlvbjpmLG5vcm1hbDpkLHV2OnAsdXYxOnl9PWkuYXR0cmlidXRlcyxtPVNkKGUsZixkLHAseSxjLGwsaCx0LHIsbyk7cmV0dXJuIG0/KG0uZmFjZUluZGV4PW4scyYmcy5wdXNoKG0pLG0pOm51bGx9ZnVuY3Rpb24geXQoaSx0LGUsbil7Y29uc3Qgcz1pLmEscj1pLmIsbz1pLmM7bGV0IGE9dCxjPXQrMSxsPXQrMjtlJiYoYT1lLmdldFgoYSksYz1lLmdldFgoYyksbD1lLmdldFgobCkpLHMueD1uLmdldFgoYSkscy55PW4uZ2V0WShhKSxzLno9bi5nZXRaKGEpLHIueD1uLmdldFgoYyksci55PW4uZ2V0WShjKSxyLno9bi5nZXRaKGMpLG8ueD1uLmdldFgobCksby55PW4uZ2V0WShsKSxvLno9bi5nZXRaKGwpfWZ1bmN0aW9uIHpkKGksdCxlLG4scyxyLG8sYSl7Y29uc3R7Z2VvbWV0cnk6YyxfaW5kaXJlY3RCdWZmZXI6bH09aTtmb3IobGV0IGg9bix1PW4rcztoPHU7aCsrKUxzKGMsdCxlLGgscixvLGEpfWZ1bmN0aW9uIFRkKGksdCxlLG4scyxyLG8pe2NvbnN0e2dlb21ldHJ5OmEsX2luZGlyZWN0QnVmZmVyOmN9PWk7bGV0IGw9MS8wLGg9bnVsbDtmb3IobGV0IHU9bixmPW4rczt1PGY7dSsrKXtsZXQgZDtkPUxzKGEsdCxlLHUsbnVsbCxyLG8pLGQmJmQuZGlzdGFuY2U8bCYmKGg9ZCxsPWQuZGlzdGFuY2UpfXJldHVybiBofWZ1bmN0aW9uIFBkKGksdCxlLG4scyxyLG8pe2NvbnN0e2dlb21ldHJ5OmF9PWUse2luZGV4OmN9PWEsbD1hLmF0dHJpYnV0ZXMucG9zaXRpb247Zm9yKGxldCBoPWksdT10K2k7aDx1O2grKyl7bGV0IGY7aWYoZj1oLHl0KG8sZiozLGMsbCksby5uZWVkc1VwZGF0ZT0hMCxuKG8sZixzLHIpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIEVkKGksdD1udWxsKXt0JiZBcnJheS5pc0FycmF5KHQpJiYodD1uZXcgU2V0KHQpKTtjb25zdCBlPWkuZ2VvbWV0cnksbj1lLmluZGV4P2UuaW5kZXguYXJyYXk6bnVsbCxzPWUuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgcixvLGEsYyxsPTA7Y29uc3QgaD1pLl9yb290cztmb3IobGV0IGY9MCxkPWgubGVuZ3RoO2Y8ZDtmKyspcj1oW2ZdLG89bmV3IFVpbnQzMkFycmF5KHIpLGE9bmV3IFVpbnQxNkFycmF5KHIpLGM9bmV3IEZsb2F0MzJBcnJheShyKSx1KDAsbCksbCs9ci5ieXRlTGVuZ3RoO2Z1bmN0aW9uIHUoZixkLHA9ITEpe2NvbnN0IHk9ZioyO2lmKGFbeSsxNV09PT1Fcyl7Y29uc3QgZz1vW2YrNl0sYj1hW3krMTRdO2xldCB3PTEvMCx4PTEvMCxNPTEvMCxBPS0xLzAsXz0tMS8wLHY9LTEvMDtmb3IobGV0IFA9MypnLHo9MyooZytiKTtQPHo7UCsrKXtsZXQgUz1uW1BdO2NvbnN0IEM9cy5nZXRYKFMpLEU9cy5nZXRZKFMpLEY9cy5nZXRaKFMpO0M8dyYmKHc9QyksQz5BJiYoQT1DKSxFPHgmJih4PUUpLEU+XyYmKF89RSksRjxNJiYoTT1GKSxGPnYmJih2PUYpfXJldHVybiBjW2YrMF0hPT13fHxjW2YrMV0hPT14fHxjW2YrMl0hPT1NfHxjW2YrM10hPT1BfHxjW2YrNF0hPT1ffHxjW2YrNV0hPT12PyhjW2YrMF09dyxjW2YrMV09eCxjW2YrMl09TSxjW2YrM109QSxjW2YrNF09XyxjW2YrNV09diwhMCk6ITF9ZWxzZXtjb25zdCBnPWYrOCxiPW9bZis2XSx3PWcrZCx4PWIrZDtsZXQgTT1wLEE9ITEsXz0hMTt0P018fChBPXQuaGFzKHcpLF89dC5oYXMoeCksTT0hQSYmIV8pOihBPSEwLF89ITApO2NvbnN0IHY9TXx8QSxQPU18fF87bGV0IHo9ITE7diYmKHo9dShnLGQsTSkpO2xldCBTPSExO1AmJihTPXUoYixkLE0pKTtjb25zdCBDPXp8fFM7aWYoQylmb3IobGV0IEU9MDtFPDM7RSsrKXtjb25zdCBGPWcrRSxCPWIrRSxJPWNbRl0saz1jW0YrM10sRD1jW0JdLFY9Y1tCKzNdO2NbZitFXT1JPEQ/STpELGNbZitFKzNdPWs+Vj9rOlZ9cmV0dXJuIEN9fX1mdW5jdGlvbiBlbihpLHQsZSxuLHMpe2xldCByLG8sYSxjLGwsaDtjb25zdCB1PTEvZS5kaXJlY3Rpb24ueCxmPTEvZS5kaXJlY3Rpb24ueSxkPTEvZS5kaXJlY3Rpb24ueixwPWUub3JpZ2luLngseT1lLm9yaWdpbi55LG09ZS5vcmlnaW4uejtsZXQgZz10W2ldLGI9dFtpKzNdLHc9dFtpKzFdLHg9dFtpKzMrMV0sTT10W2krMl0sQT10W2krMysyXTtyZXR1cm4gdT49MD8ocj0oZy1wKSp1LG89KGItcCkqdSk6KHI9KGItcCkqdSxvPShnLXApKnUpLGY+PTA/KGE9KHcteSkqZixjPSh4LXkpKmYpOihhPSh4LXkpKmYsYz0ody15KSpmKSxyPmN8fGE+b3x8KChhPnJ8fGlzTmFOKHIpKSYmKHI9YSksKGM8b3x8aXNOYU4obykpJiYobz1jKSxkPj0wPyhsPShNLW0pKmQsaD0oQS1tKSpkKToobD0oQS1tKSpkLGg9KE0tbSkqZCkscj5ofHxsPm8pPyExOigobD5yfHxyIT09cikmJihyPWwpLChoPG98fG8hPT1vKSYmKG89aCkscjw9cyYmbz49bil9ZnVuY3Rpb24gQ2QoaSx0LGUsbixzLHIsbyxhKXtjb25zdHtnZW9tZXRyeTpjLF9pbmRpcmVjdEJ1ZmZlcjpsfT1pO2ZvcihsZXQgaD1uLHU9bitzO2g8dTtoKyspe2xldCBmPWw/bFtoXTpoO0xzKGMsdCxlLGYscixvLGEpfX1mdW5jdGlvbiBCZChpLHQsZSxuLHMscixvKXtjb25zdHtnZW9tZXRyeTphLF9pbmRpcmVjdEJ1ZmZlcjpjfT1pO2xldCBsPTEvMCxoPW51bGw7Zm9yKGxldCB1PW4sZj1uK3M7dTxmO3UrKyl7bGV0IGQ7ZD1McyhhLHQsZSxjP2NbdV06dSxudWxsLHIsbyksZCYmZC5kaXN0YW5jZTxsJiYoaD1kLGw9ZC5kaXN0YW5jZSl9cmV0dXJuIGh9ZnVuY3Rpb24gRmQoaSx0LGUsbixzLHIsbyl7Y29uc3R7Z2VvbWV0cnk6YX09ZSx7aW5kZXg6Y309YSxsPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IGg9aSx1PXQraTtoPHU7aCsrKXtsZXQgZjtpZihmPWUucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoaCkseXQobyxmKjMsYyxsKSxvLm5lZWRzVXBkYXRlPSEwLG4obyxmLHMscikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gSWQoaSx0LGUsbixzLHIsbyl7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKSxYbygwLGksZSxuLHMscixvKSxudC5jbGVhckJ1ZmZlcigpfWZ1bmN0aW9uIFhvKGksdCxlLG4scyxyLG8pe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6bH09bnQsaD1pKjI7aWYoa3QoaCxjKSl7Y29uc3QgZj1WdChpLGwpLGQ9S3QoaCxjKTt6ZCh0LGUsbixmLGQscyxyLG8pfWVsc2V7Y29uc3QgZj10ZShpKTtlbihmLGEsbixyLG8pJiZYbyhmLHQsZSxuLHMscixvKTtjb25zdCBkPWVlKGksbCk7ZW4oZCxhLG4scixvKSYmWG8oZCx0LGUsbixzLHIsbyl9fWNvbnN0IGtkPVsieCIsInkiLCJ6Il07ZnVuY3Rpb24gTmQoaSx0LGUsbixzLHIpe250LnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgbz1KbygwLGksZSxuLHMscik7cmV0dXJuIG50LmNsZWFyQnVmZmVyKCksb31mdW5jdGlvbiBKbyhpLHQsZSxuLHMscil7Y29uc3R7ZmxvYXQzMkFycmF5Om8sdWludDE2QXJyYXk6YSx1aW50MzJBcnJheTpjfT1udDtsZXQgbD1pKjI7aWYoa3QobCxhKSl7Y29uc3QgdT1WdChpLGMpLGY9S3QobCxhKTtyZXR1cm4gVGQodCxlLG4sdSxmLHMscil9ZWxzZXtjb25zdCB1PWNsKGksYyksZj1rZFt1XSxwPW4uZGlyZWN0aW9uW2ZdPj0wO2xldCB5LG07cD8oeT10ZShpKSxtPWVlKGksYykpOih5PWVlKGksYyksbT10ZShpKSk7Y29uc3QgYj1lbih5LG8sbixzLHIpP0pvKHksdCxlLG4scyxyKTpudWxsO2lmKGIpe2NvbnN0IE09Yi5wb2ludFtmXTtpZihwP008PW9bbSt1XTpNPj1vW20rdSszXSlyZXR1cm4gYn1jb25zdCB4PWVuKG0sbyxuLHMscik/Sm8obSx0LGUsbixzLHIpOm51bGw7cmV0dXJuIGImJng/Yi5kaXN0YW5jZTw9eC5kaXN0YW5jZT9iOng6Ynx8eHx8bnVsbH19Y29uc3QgT3M9bmV3IGd0LFluPW5ldyBuZSxqbj1uZXcgbmUsa2k9bmV3IHN0LHBsPW5ldyB6dCxEcz1uZXcgenQ7ZnVuY3Rpb24gUmQoaSx0LGUsbil7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBzPVlvKDAsaSxlLG4pO3JldHVybiBudC5jbGVhckJ1ZmZlcigpLHN9ZnVuY3Rpb24gWW8oaSx0LGUsbixzPW51bGwpe2NvbnN0e2Zsb2F0MzJBcnJheTpyLHVpbnQxNkFycmF5Om8sdWludDMyQXJyYXk6YX09bnQ7bGV0IGM9aSoyO2lmKHM9PT1udWxsJiYoZS5ib3VuZGluZ0JveHx8ZS5jb21wdXRlQm91bmRpbmdCb3goKSxwbC5zZXQoZS5ib3VuZGluZ0JveC5taW4sZS5ib3VuZGluZ0JveC5tYXgsbikscz1wbCksa3QoYyxvKSl7Y29uc3QgaD10Lmdlb21ldHJ5LHU9aC5pbmRleCxmPWguYXR0cmlidXRlcy5wb3NpdGlvbixkPWUuaW5kZXgscD1lLmF0dHJpYnV0ZXMucG9zaXRpb24seT1WdChpLGEpLG09S3QoYyxvKTtpZihraS5jb3B5KG4pLmludmVydCgpLGUuYm91bmRzVHJlZSlyZXR1cm4gbHQoaSxyLERzKSxEcy5tYXRyaXguY29weShraSksRHMubmVlZHNVcGRhdGU9ITAsZS5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpiPT5Ecy5pbnRlcnNlY3RzQm94KGIpLGludGVyc2VjdHNUcmlhbmdsZTpiPT57Yi5hLmFwcGx5TWF0cml4NChuKSxiLmIuYXBwbHlNYXRyaXg0KG4pLGIuYy5hcHBseU1hdHJpeDQobiksYi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHc9eSozLHg9KG0reSkqMzt3PHg7dys9MylpZih5dChqbix3LHUsZiksam4ubmVlZHNVcGRhdGU9ITAsYi5pbnRlcnNlY3RzVHJpYW5nbGUoam4pKXJldHVybiEwO3JldHVybiExfX0pO2ZvcihsZXQgZz15KjMsYj0obSt5KSozO2c8YjtnKz0zKXt5dChZbixnLHUsZiksWW4uYS5hcHBseU1hdHJpeDQoa2kpLFluLmIuYXBwbHlNYXRyaXg0KGtpKSxZbi5jLmFwcGx5TWF0cml4NChraSksWW4ubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB3PTAseD1kLmNvdW50O3c8eDt3Kz0zKWlmKHl0KGpuLHcsZCxwKSxqbi5uZWVkc1VwZGF0ZT0hMCxZbi5pbnRlcnNlY3RzVHJpYW5nbGUoam4pKXJldHVybiEwfX1lbHNle2NvbnN0IGg9aSs4LHU9YVtpKzZdO3JldHVybiBsdChoLHIsT3MpLCEhKHMuaW50ZXJzZWN0c0JveChPcykmJllvKGgsdCxlLG4scyl8fChsdCh1LHIsT3MpLHMuaW50ZXJzZWN0c0JveChPcykmJllvKHUsdCxlLG4scykpKX19Y29uc3QgJHM9bmV3IHN0LGpvPW5ldyB6dCxOaT1uZXcgenQsTGQ9bmV3IFQsT2Q9bmV3IFQsRGQ9bmV3IFQsJGQ9bmV3IFQ7ZnVuY3Rpb24gVWQoaSx0LGUsbj17fSxzPXt9LHI9MCxvPTEvMCl7dC5ib3VuZGluZ0JveHx8dC5jb21wdXRlQm91bmRpbmdCb3goKSxqby5zZXQodC5ib3VuZGluZ0JveC5taW4sdC5ib3VuZGluZ0JveC5tYXgsZSksam8ubmVlZHNVcGRhdGU9ITA7Y29uc3QgYT1pLmdlb21ldHJ5LGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9YS5pbmRleCxoPXQuYXR0cmlidXRlcy5wb3NpdGlvbix1PXQuaW5kZXgsZj1pZS5nZXRQcmltaXRpdmUoKSxkPWllLmdldFByaW1pdGl2ZSgpO2xldCBwPUxkLHk9T2QsbT1udWxsLGc9bnVsbDtzJiYobT1EZCxnPSRkKTtsZXQgYj0xLzAsdz1udWxsLHg9bnVsbDtyZXR1cm4gJHMuY29weShlKS5pbnZlcnQoKSxOaS5tYXRyaXguY29weSgkcyksaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6TT0+am8uZGlzdGFuY2VUb0JveChNKSxpbnRlcnNlY3RzQm91bmRzOihNLEEsXyk9Pl88YiYmXzxvPyhBJiYoTmkubWluLmNvcHkoTS5taW4pLE5pLm1heC5jb3B5KE0ubWF4KSxOaS5uZWVkc1VwZGF0ZT0hMCksITApOiExLGludGVyc2VjdHNSYW5nZTooTSxBKT0+e2lmKHQuYm91bmRzVHJlZSlyZXR1cm4gdC5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjp2PT5OaS5kaXN0YW5jZVRvQm94KHYpLGludGVyc2VjdHNCb3VuZHM6KHYsUCx6KT0+ejxiJiZ6PG8saW50ZXJzZWN0c1JhbmdlOih2LFApPT57Zm9yKGxldCB6PXYsUz12K1A7ejxTO3orKyl7eXQoZCwzKnosdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgQz1NLEU9TStBO0M8RTtDKyspe3l0KGYsMypDLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBGPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihGPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9Rix3PUMseD16KSxGPHIpcmV0dXJuITB9fX19KTt7Y29uc3QgXz1abih0KTtmb3IobGV0IHY9MCxQPV87djxQO3YrKyl7eXQoZCwzKnYsdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgej1NLFM9TStBO3o8Uzt6Kyspe3l0KGYsMyp6LGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBDPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihDPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9Qyx3PXoseD12KSxDPHIpcmV0dXJuITB9fX19fSksaWUucmVsZWFzZVByaW1pdGl2ZShmKSxpZS5yZWxlYXNlUHJpbWl0aXZlKGQpLGI9PT0xLzA/bnVsbDoobi5wb2ludD9uLnBvaW50LmNvcHkoeSk6bi5wb2ludD15LmNsb25lKCksbi5kaXN0YW5jZT1iLG4uZmFjZUluZGV4PXcscyYmKHMucG9pbnQ/cy5wb2ludC5jb3B5KGcpOnMucG9pbnQ9Zy5jbG9uZSgpLHMucG9pbnQuYXBwbHlNYXRyaXg0KCRzKSx5LmFwcGx5TWF0cml4NCgkcykscy5kaXN0YW5jZT15LnN1YihzLnBvaW50KS5sZW5ndGgoKSxzLmZhY2VJbmRleD14KSxuKX1mdW5jdGlvbiBWZChpLHQ9bnVsbCl7dCYmQXJyYXkuaXNBcnJheSh0KSYmKHQ9bmV3IFNldCh0KSk7Y29uc3QgZT1pLmdlb21ldHJ5LG49ZS5pbmRleD9lLmluZGV4LmFycmF5Om51bGwscz1lLmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHIsbyxhLGMsbD0wO2NvbnN0IGg9aS5fcm9vdHM7Zm9yKGxldCBmPTAsZD1oLmxlbmd0aDtmPGQ7ZisrKXI9aFtmXSxvPW5ldyBVaW50MzJBcnJheShyKSxhPW5ldyBVaW50MTZBcnJheShyKSxjPW5ldyBGbG9hdDMyQXJyYXkociksdSgwLGwpLGwrPXIuYnl0ZUxlbmd0aDtmdW5jdGlvbiB1KGYsZCxwPSExKXtjb25zdCB5PWYqMjtpZihhW3krMTVdPT09RXMpe2NvbnN0IGc9b1tmKzZdLGI9YVt5KzE0XTtsZXQgdz0xLzAseD0xLzAsTT0xLzAsQT0tMS8wLF89LTEvMCx2PS0xLzA7Zm9yKGxldCBQPWcsej1nK2I7UDx6O1ArKyl7Y29uc3QgUz0zKmkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoUCk7Zm9yKGxldCBDPTA7QzwzO0MrKyl7bGV0IEU9UytDO0U9bj9uW0VdOkU7Y29uc3QgRj1zLmdldFgoRSksQj1zLmdldFkoRSksST1zLmdldFooRSk7Rjx3JiYodz1GKSxGPkEmJihBPUYpLEI8eCYmKHg9QiksQj5fJiYoXz1CKSxJPE0mJihNPUkpLEk+diYmKHY9SSl9fXJldHVybiBjW2YrMF0hPT13fHxjW2YrMV0hPT14fHxjW2YrMl0hPT1NfHxjW2YrM10hPT1BfHxjW2YrNF0hPT1ffHxjW2YrNV0hPT12PyhjW2YrMF09dyxjW2YrMV09eCxjW2YrMl09TSxjW2YrM109QSxjW2YrNF09XyxjW2YrNV09diwhMCk6ITF9ZWxzZXtjb25zdCBnPWYrOCxiPW9bZis2XSx3PWcrZCx4PWIrZDtsZXQgTT1wLEE9ITEsXz0hMTt0P018fChBPXQuaGFzKHcpLF89dC5oYXMoeCksTT0hQSYmIV8pOihBPSEwLF89ITApO2NvbnN0IHY9TXx8QSxQPU18fF87bGV0IHo9ITE7diYmKHo9dShnLGQsTSkpO2xldCBTPSExO1AmJihTPXUoYixkLE0pKTtjb25zdCBDPXp8fFM7aWYoQylmb3IobGV0IEU9MDtFPDM7RSsrKXtjb25zdCBGPWcrRSxCPWIrRSxJPWNbRl0saz1jW0YrM10sRD1jW0JdLFY9Y1tCKzNdO2NbZitFXT1JPEQ/STpELGNbZitFKzNdPWs+Vj9rOlZ9cmV0dXJuIEN9fX1mdW5jdGlvbiBxZChpLHQsZSxuLHMscixvKXtudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pLFFvKDAsaSxlLG4scyxyLG8pLG50LmNsZWFyQnVmZmVyKCl9ZnVuY3Rpb24gUW8oaSx0LGUsbixzLHIsbyl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT1udCxoPWkqMjtpZihrdChoLGMpKXtjb25zdCBmPVZ0KGksbCksZD1LdChoLGMpO0NkKHQsZSxuLGYsZCxzLHIsbyl9ZWxzZXtjb25zdCBmPXRlKGkpO2VuKGYsYSxuLHIsbykmJlFvKGYsdCxlLG4scyxyLG8pO2NvbnN0IGQ9ZWUoaSxsKTtlbihkLGEsbixyLG8pJiZRbyhkLHQsZSxuLHMscixvKX19Y29uc3QgSGQ9WyJ4IiwieSIsInoiXTtmdW5jdGlvbiBXZChpLHQsZSxuLHMscil7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBvPUtvKDAsaSxlLG4scyxyKTtyZXR1cm4gbnQuY2xlYXJCdWZmZXIoKSxvfWZ1bmN0aW9uIEtvKGksdCxlLG4scyxyKXtjb25zdHtmbG9hdDMyQXJyYXk6byx1aW50MTZBcnJheTphLHVpbnQzMkFycmF5OmN9PW50O2xldCBsPWkqMjtpZihrdChsLGEpKXtjb25zdCB1PVZ0KGksYyksZj1LdChsLGEpO3JldHVybiBCZCh0LGUsbix1LGYscyxyKX1lbHNle2NvbnN0IHU9Y2woaSxjKSxmPUhkW3VdLHA9bi5kaXJlY3Rpb25bZl0+PTA7bGV0IHksbTtwPyh5PXRlKGkpLG09ZWUoaSxjKSk6KHk9ZWUoaSxjKSxtPXRlKGkpKTtjb25zdCBiPWVuKHksbyxuLHMscik/S28oeSx0LGUsbixzLHIpOm51bGw7aWYoYil7Y29uc3QgTT1iLnBvaW50W2ZdO2lmKHA/TTw9b1ttK3VdOk0+PW9bbSt1KzNdKXJldHVybiBifWNvbnN0IHg9ZW4obSxvLG4scyxyKT9LbyhtLHQsZSxuLHMscik6bnVsbDtyZXR1cm4gYiYmeD9iLmRpc3RhbmNlPD14LmRpc3RhbmNlP2I6eDpifHx4fHxudWxsfX1jb25zdCBVcz1uZXcgZ3QsUW49bmV3IG5lLEtuPW5ldyBuZSxSaT1uZXcgc3QseWw9bmV3IHp0LFZzPW5ldyB6dDtmdW5jdGlvbiBHZChpLHQsZSxuKXtudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IHM9dGEoMCxpLGUsbik7cmV0dXJuIG50LmNsZWFyQnVmZmVyKCksc31mdW5jdGlvbiB0YShpLHQsZSxuLHM9bnVsbCl7Y29uc3R7ZmxvYXQzMkFycmF5OnIsdWludDE2QXJyYXk6byx1aW50MzJBcnJheTphfT1udDtsZXQgYz1pKjI7aWYocz09PW51bGwmJihlLmJvdW5kaW5nQm94fHxlLmNvbXB1dGVCb3VuZGluZ0JveCgpLHlsLnNldChlLmJvdW5kaW5nQm94Lm1pbixlLmJvdW5kaW5nQm94Lm1heCxuKSxzPXlsKSxrdChjLG8pKXtjb25zdCBoPXQuZ2VvbWV0cnksdT1oLmluZGV4LGY9aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGQ9ZS5pbmRleCxwPWUuYXR0cmlidXRlcy5wb3NpdGlvbix5PVZ0KGksYSksbT1LdChjLG8pO2lmKFJpLmNvcHkobikuaW52ZXJ0KCksZS5ib3VuZHNUcmVlKXJldHVybiBsdChpLHIsVnMpLFZzLm1hdHJpeC5jb3B5KFJpKSxWcy5uZWVkc1VwZGF0ZT0hMCxlLmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOmI9PlZzLmludGVyc2VjdHNCb3goYiksaW50ZXJzZWN0c1RyaWFuZ2xlOmI9PntiLmEuYXBwbHlNYXRyaXg0KG4pLGIuYi5hcHBseU1hdHJpeDQobiksYi5jLmFwcGx5TWF0cml4NChuKSxiLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgdz15LHg9bSt5O3c8eDt3KyspaWYoeXQoS24sMyp0LnJlc29sdmVUcmlhbmdsZUluZGV4KHcpLHUsZiksS24ubmVlZHNVcGRhdGU9ITAsYi5pbnRlcnNlY3RzVHJpYW5nbGUoS24pKXJldHVybiEwO3JldHVybiExfX0pO2ZvcihsZXQgZz15LGI9bSt5O2c8YjtnKyspe2NvbnN0IHc9dC5yZXNvbHZlVHJpYW5nbGVJbmRleChnKTt5dChRbiwzKncsdSxmKSxRbi5hLmFwcGx5TWF0cml4NChSaSksUW4uYi5hcHBseU1hdHJpeDQoUmkpLFFuLmMuYXBwbHlNYXRyaXg0KFJpKSxRbi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHg9MCxNPWQuY291bnQ7eDxNO3grPTMpaWYoeXQoS24seCxkLHApLEtuLm5lZWRzVXBkYXRlPSEwLFFuLmludGVyc2VjdHNUcmlhbmdsZShLbikpcmV0dXJuITB9fWVsc2V7Y29uc3QgaD1pKzgsdT1hW2krNl07cmV0dXJuIGx0KGgscixVcyksISEocy5pbnRlcnNlY3RzQm94KFVzKSYmdGEoaCx0LGUsbixzKXx8KGx0KHUscixVcykscy5pbnRlcnNlY3RzQm94KFVzKSYmdGEodSx0LGUsbixzKSkpfX1jb25zdCBxcz1uZXcgc3QsZWE9bmV3IHp0LExpPW5ldyB6dCxaZD1uZXcgVCxYZD1uZXcgVCxKZD1uZXcgVCxZZD1uZXcgVDtmdW5jdGlvbiBqZChpLHQsZSxuPXt9LHM9e30scj0wLG89MS8wKXt0LmJvdW5kaW5nQm94fHx0LmNvbXB1dGVCb3VuZGluZ0JveCgpLGVhLnNldCh0LmJvdW5kaW5nQm94Lm1pbix0LmJvdW5kaW5nQm94Lm1heCxlKSxlYS5uZWVkc1VwZGF0ZT0hMDtjb25zdCBhPWkuZ2VvbWV0cnksYz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sbD1hLmluZGV4LGg9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLHU9dC5pbmRleCxmPWllLmdldFByaW1pdGl2ZSgpLGQ9aWUuZ2V0UHJpbWl0aXZlKCk7bGV0IHA9WmQseT1YZCxtPW51bGwsZz1udWxsO3MmJihtPUpkLGc9WWQpO2xldCBiPTEvMCx3PW51bGwseD1udWxsO3JldHVybiBxcy5jb3B5KGUpLmludmVydCgpLExpLm1hdHJpeC5jb3B5KHFzKSxpLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpNPT5lYS5kaXN0YW5jZVRvQm94KE0pLGludGVyc2VjdHNCb3VuZHM6KE0sQSxfKT0+XzxiJiZfPG8/KEEmJihMaS5taW4uY29weShNLm1pbiksTGkubWF4LmNvcHkoTS5tYXgpLExpLm5lZWRzVXBkYXRlPSEwKSwhMCk6ITEsaW50ZXJzZWN0c1JhbmdlOihNLEEpPT57aWYodC5ib3VuZHNUcmVlKXtjb25zdCBfPXQuYm91bmRzVHJlZTtyZXR1cm4gXy5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6dj0+TGkuZGlzdGFuY2VUb0JveCh2KSxpbnRlcnNlY3RzQm91bmRzOih2LFAseik9Pno8YiYmejxvLGludGVyc2VjdHNSYW5nZToodixQKT0+e2ZvcihsZXQgej12LFM9ditQO3o8Uzt6Kyspe2NvbnN0IEM9Xy5yZXNvbHZlVHJpYW5nbGVJbmRleCh6KTt5dChkLDMqQyx1LGgpLGQuYS5hcHBseU1hdHJpeDQoZSksZC5iLmFwcGx5TWF0cml4NChlKSxkLmMuYXBwbHlNYXRyaXg0KGUpLGQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBFPU0sRj1NK0E7RTxGO0UrKyl7Y29uc3QgQj1pLnJlc29sdmVUcmlhbmdsZUluZGV4KEUpO3l0KGYsMypCLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBJPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihJPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9SSx3PUUseD16KSxJPHIpcmV0dXJuITB9fX19KX1lbHNle2NvbnN0IF89Wm4odCk7Zm9yKGxldCB2PTAsUD1fO3Y8UDt2Kyspe3l0KGQsMyp2LHUsaCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHo9TSxTPU0rQTt6PFM7eisrKXtjb25zdCBDPWkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoeik7eXQoZiwzKkMsbCxjKSxmLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEU9Zi5kaXN0YW5jZVRvVHJpYW5nbGUoZCxwLG0pO2lmKEU8YiYmKHkuY29weShwKSxnJiZnLmNvcHkobSksYj1FLHc9eix4PXYpLEU8cilyZXR1cm4hMH19fX19KSxpZS5yZWxlYXNlUHJpbWl0aXZlKGYpLGllLnJlbGVhc2VQcmltaXRpdmUoZCksYj09PTEvMD9udWxsOihuLnBvaW50P24ucG9pbnQuY29weSh5KTpuLnBvaW50PXkuY2xvbmUoKSxuLmRpc3RhbmNlPWIsbi5mYWNlSW5kZXg9dyxzJiYocy5wb2ludD9zLnBvaW50LmNvcHkoZyk6cy5wb2ludD1nLmNsb25lKCkscy5wb2ludC5hcHBseU1hdHJpeDQocXMpLHkuYXBwbHlNYXRyaXg0KHFzKSxzLmRpc3RhbmNlPXkuc3ViKHMucG9pbnQpLmxlbmd0aCgpLHMuZmFjZUluZGV4PXgpLG4pfWZ1bmN0aW9uIFFkKCl7cmV0dXJuIHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCJ9Y29uc3QgT2k9bmV3IG50LmNvbnN0cnVjdG9yLEhzPW5ldyBudC5jb25zdHJ1Y3Rvcixubj1uZXcgV28oKCk9Pm5ldyBndCksdGk9bmV3IGd0LGVpPW5ldyBndCxuYT1uZXcgZ3QsaWE9bmV3IGd0O2xldCBzYT0hMTtmdW5jdGlvbiBLZChpLHQsZSxuKXtpZihzYSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFJlY3Vyc2l2ZSBjYWxscyB0byBidmhjYXN0IG5vdCBzdXBwb3J0ZWQuIik7c2E9ITA7Y29uc3Qgcz1pLl9yb290cyxyPXQuX3Jvb3RzO2xldCBvLGE9MCxjPTA7Y29uc3QgbD1uZXcgc3QoKS5jb3B5KGUpLmludmVydCgpO2ZvcihsZXQgaD0wLHU9cy5sZW5ndGg7aDx1O2grKyl7T2kuc2V0QnVmZmVyKHNbaF0pLGM9MDtjb25zdCBmPW5uLmdldFByaW1pdGl2ZSgpO2x0KDAsT2kuZmxvYXQzMkFycmF5LGYpLGYuYXBwbHlNYXRyaXg0KGwpO2ZvcihsZXQgZD0wLHA9ci5sZW5ndGg7ZDxwJiYoSHMuc2V0QnVmZmVyKHJbZF0pLG89ZmUoMCwwLGUsbCxuLGEsYywwLDAsZiksSHMuY2xlYXJCdWZmZXIoKSxjKz1yW2RdLmxlbmd0aCwhbyk7ZCsrKTtpZihubi5yZWxlYXNlUHJpbWl0aXZlKGYpLE9pLmNsZWFyQnVmZmVyKCksYSs9c1toXS5sZW5ndGgsbylicmVha31yZXR1cm4gc2E9ITEsb31mdW5jdGlvbiBmZShpLHQsZSxuLHMscj0wLG89MCxhPTAsYz0wLGw9bnVsbCxoPSExKXtsZXQgdSxmO2g/KHU9SHMsZj1PaSk6KHU9T2ksZj1Icyk7Y29uc3QgZD11LmZsb2F0MzJBcnJheSxwPXUudWludDMyQXJyYXkseT11LnVpbnQxNkFycmF5LG09Zi5mbG9hdDMyQXJyYXksZz1mLnVpbnQzMkFycmF5LGI9Zi51aW50MTZBcnJheSx3PWkqMix4PXQqMixNPWt0KHcseSksQT1rdCh4LGIpO2xldCBfPSExO2lmKEEmJk0paD9fPXMoVnQodCxnKSxLdCh0KjIsYiksVnQoaSxwKSxLdChpKjIseSksYyxvK3QsYSxyK2kpOl89cyhWdChpLHApLEt0KGkqMix5KSxWdCh0LGcpLEt0KHQqMixiKSxhLHIraSxjLG8rdCk7ZWxzZSBpZihBKXtjb25zdCB2PW5uLmdldFByaW1pdGl2ZSgpO2x0KHQsbSx2KSx2LmFwcGx5TWF0cml4NChlKTtjb25zdCBQPXRlKGkpLHo9ZWUoaSxwKTtsdChQLGQsdGkpLGx0KHosZCxlaSk7Y29uc3QgUz12LmludGVyc2VjdHNCb3godGkpLEM9di5pbnRlcnNlY3RzQm94KGVpKTtfPVMmJmZlKHQsUCxuLGUscyxvLHIsYyxhKzEsdiwhaCl8fEMmJmZlKHQseixuLGUscyxvLHIsYyxhKzEsdiwhaCksbm4ucmVsZWFzZVByaW1pdGl2ZSh2KX1lbHNle2NvbnN0IHY9dGUodCksUD1lZSh0LGcpO2x0KHYsbSxuYSksbHQoUCxtLGlhKTtjb25zdCB6PWwuaW50ZXJzZWN0c0JveChuYSksUz1sLmludGVyc2VjdHNCb3goaWEpO2lmKHomJlMpXz1mZShpLHYsZSxuLHMscixvLGEsYysxLGwsaCl8fGZlKGksUCxlLG4scyxyLG8sYSxjKzEsbCxoKTtlbHNlIGlmKHopaWYoTSlfPWZlKGksdixlLG4scyxyLG8sYSxjKzEsbCxoKTtlbHNle2NvbnN0IEM9bm4uZ2V0UHJpbWl0aXZlKCk7Qy5jb3B5KG5hKS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgRT10ZShpKSxGPWVlKGkscCk7bHQoRSxkLHRpKSxsdChGLGQsZWkpO2NvbnN0IEI9Qy5pbnRlcnNlY3RzQm94KHRpKSxJPUMuaW50ZXJzZWN0c0JveChlaSk7Xz1CJiZmZSh2LEUsbixlLHMsbyxyLGMsYSsxLEMsIWgpfHxJJiZmZSh2LEYsbixlLHMsbyxyLGMsYSsxLEMsIWgpLG5uLnJlbGVhc2VQcmltaXRpdmUoQyl9ZWxzZSBpZihTKWlmKE0pXz1mZShpLFAsZSxuLHMscixvLGEsYysxLGwsaCk7ZWxzZXtjb25zdCBDPW5uLmdldFByaW1pdGl2ZSgpO0MuY29weShpYSkuYXBwbHlNYXRyaXg0KGUpO2NvbnN0IEU9dGUoaSksRj1lZShpLHApO2x0KEUsZCx0aSksbHQoRixkLGVpKTtjb25zdCBCPUMuaW50ZXJzZWN0c0JveCh0aSksST1DLmludGVyc2VjdHNCb3goZWkpO189QiYmZmUoUCxFLG4sZSxzLG8scixjLGErMSxDLCFoKXx8SSYmZmUoUCxGLG4sZSxzLG8scixjLGErMSxDLCFoKSxubi5yZWxlYXNlUHJpbWl0aXZlKEMpfX1yZXR1cm4gX31jb25zdCBXcz1uZXcgenQsbWw9bmV3IGd0LHQwPXtzdHJhdGVneTp0bCxtYXhEZXB0aDo0MCxtYXhMZWFmVHJpczoxMCx1c2VTaGFyZWRBcnJheUJ1ZmZlcjohMSxzZXRCb3VuZGluZ0JveDohMCxvblByb2dyZXNzOm51bGwsaW5kaXJlY3Q6ITEsdmVyYm9zZTohMCxyYW5nZTpudWxsfTtjbGFzcyByYXtzdGF0aWMgc2VyaWFsaXplKHQsZT17fSl7ZT1GdCh7Y2xvbmVCdWZmZXJzOiEwfSxlKTtjb25zdCBuPXQuZ2VvbWV0cnkscz10Ll9yb290cyxyPXQuX2luZGlyZWN0QnVmZmVyLG89bi5nZXRJbmRleCgpO2xldCBhO3JldHVybiBlLmNsb25lQnVmZmVycz9hPXtyb290czpzLm1hcChjPT5jLnNsaWNlKCkpLGluZGV4Om8/by5hcnJheS5zbGljZSgpOm51bGwsaW5kaXJlY3RCdWZmZXI6cj9yLnNsaWNlKCk6bnVsbH06YT17cm9vdHM6cyxpbmRleDpvP28uYXJyYXk6bnVsbCxpbmRpcmVjdEJ1ZmZlcjpyfSxhfXN0YXRpYyBkZXNlcmlhbGl6ZSh0LGUsbj17fSl7bj1GdCh7c2V0SW5kZXg6ITAsaW5kaXJlY3Q6ISF0LmluZGlyZWN0QnVmZmVyfSxuKTtjb25zdHtpbmRleDpzLHJvb3RzOnIsaW5kaXJlY3RCdWZmZXI6b309dCxhPW5ldyByYShlLFplKEZ0KHt9LG4pLHtbT29dOiEwfSkpO2lmKGEuX3Jvb3RzPXIsYS5faW5kaXJlY3RCdWZmZXI9b3x8bnVsbCxuLnNldEluZGV4KXtjb25zdCBjPWUuZ2V0SW5kZXgoKTtpZihjPT09bnVsbCl7Y29uc3QgbD1uZXcgeHQodC5pbmRleCwxLCExKTtlLnNldEluZGV4KGwpfWVsc2UgYy5hcnJheSE9PXMmJihjLmFycmF5LnNldChzKSxjLm5lZWRzVXBkYXRlPSEwKX1yZXR1cm4gYX1nZXQgaW5kaXJlY3QoKXtyZXR1cm4hIXRoaXMuX2luZGlyZWN0QnVmZmVyfWNvbnN0cnVjdG9yKHQsZT17fSl7aWYodC5pc0J1ZmZlckdlb21ldHJ5KXtpZih0LmluZGV4JiZ0LmluZGV4LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgaW5kZXggYXR0cmlidXRlLiIpfWVsc2UgdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBPbmx5IEJ1ZmZlckdlb21ldHJpZXMgYXJlIHN1cHBvcnRlZC4iKTtpZihlPU9iamVjdC5hc3NpZ24oWmUoRnQoe30sdDApLHtbT29dOiExfSksZSksZS51c2VTaGFyZWRBcnJheUJ1ZmZlciYmIVFkKCkpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYXZhaWxhYmxlLiIpO3RoaXMuZ2VvbWV0cnk9dCx0aGlzLl9yb290cz1udWxsLHRoaXMuX2luZGlyZWN0QnVmZmVyPW51bGwsZVtPb118fCh5ZCh0aGlzLGUpLCF0LmJvdW5kaW5nQm94JiZlLnNldEJvdW5kaW5nQm94JiYodC5ib3VuZGluZ0JveD10aGlzLmdldEJvdW5kaW5nQm94KG5ldyBndCkpKSx0aGlzLnJlc29sdmVUcmlhbmdsZUluZGV4PWUuaW5kaXJlY3Q/bj0+dGhpcy5faW5kaXJlY3RCdWZmZXJbbl06bj0+bn1yZWZpdCh0PW51bGwpe3JldHVybih0aGlzLmluZGlyZWN0P1ZkOkVkKSh0aGlzLHQpfXRyYXZlcnNlKHQsZT0wKXtjb25zdCBuPXRoaXMuX3Jvb3RzW2VdLHM9bmV3IFVpbnQzMkFycmF5KG4pLHI9bmV3IFVpbnQxNkFycmF5KG4pO28oMCk7ZnVuY3Rpb24gbyhhLGM9MCl7Y29uc3QgbD1hKjIsaD1yW2wrMTVdPT09RXM7aWYoaCl7Y29uc3QgdT1zW2ErNl0sZj1yW2wrMTRdO3QoYyxoLG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksdSxmKX1lbHNle2NvbnN0IHU9YStFaS80LGY9c1thKzZdLGQ9c1thKzddO3QoYyxoLG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksZCl8fChvKHUsYysxKSxvKGYsYysxKSl9fX1yYXljYXN0KHQsZT0wLG49MCxzPTEvMCl7Y29uc3Qgcj10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1bXSxjPWUuaXNNYXRlcmlhbCxsPUFycmF5LmlzQXJyYXkoZSksaD1vLmdyb3Vwcyx1PWM/ZS5zaWRlOmUsZj10aGlzLmluZGlyZWN0P3FkOklkO2ZvcihsZXQgZD0wLHA9ci5sZW5ndGg7ZDxwO2QrKyl7Y29uc3QgeT1sP2VbaFtkXS5tYXRlcmlhbEluZGV4XS5zaWRlOnUsbT1hLmxlbmd0aDtpZihmKHRoaXMsZCx5LHQsYSxuLHMpLGwpe2NvbnN0IGc9aFtkXS5tYXRlcmlhbEluZGV4O2ZvcihsZXQgYj1tLHc9YS5sZW5ndGg7Yjx3O2IrKylhW2JdLmZhY2UubWF0ZXJpYWxJbmRleD1nfX1yZXR1cm4gYX1yYXljYXN0Rmlyc3QodCxlPTAsbj0wLHM9MS8wKXtjb25zdCByPXRoaXMuX3Jvb3RzLG89dGhpcy5nZW9tZXRyeSxhPWUuaXNNYXRlcmlhbCxjPUFycmF5LmlzQXJyYXkoZSk7bGV0IGw9bnVsbDtjb25zdCBoPW8uZ3JvdXBzLHU9YT9lLnNpZGU6ZSxmPXRoaXMuaW5kaXJlY3Q/V2Q6TmQ7Zm9yKGxldCBkPTAscD1yLmxlbmd0aDtkPHA7ZCsrKXtjb25zdCB5PWM/ZVtoW2RdLm1hdGVyaWFsSW5kZXhdLnNpZGU6dSxtPWYodGhpcyxkLHksdCxuLHMpO20hPW51bGwmJihsPT1udWxsfHxtLmRpc3RhbmNlPGwuZGlzdGFuY2UpJiYobD1tLGMmJihtLmZhY2UubWF0ZXJpYWxJbmRleD1oW2RdLm1hdGVyaWFsSW5kZXgpKX1yZXR1cm4gbH1pbnRlcnNlY3RzR2VvbWV0cnkodCxlKXtsZXQgbj0hMTtjb25zdCBzPXRoaXMuX3Jvb3RzLHI9dGhpcy5pbmRpcmVjdD9HZDpSZDtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YSYmKG49cih0aGlzLG8sdCxlKSwhbik7bysrKTtyZXR1cm4gbn1zaGFwZWNhc3QodCl7Y29uc3QgZT1pZS5nZXRQcmltaXRpdmUoKSxuPXRoaXMuaW5kaXJlY3Q/RmQ6UGQ7bGV0e2JvdW5kc1RyYXZlcnNlT3JkZXI6cyxpbnRlcnNlY3RzQm91bmRzOnIsaW50ZXJzZWN0c1JhbmdlOm8saW50ZXJzZWN0c1RyaWFuZ2xlOmF9PXQ7aWYobyYmYSl7Y29uc3QgdT1vO289KGYsZCxwLHksbSk9PnUoZixkLHAseSxtKT8hMDpuKGYsZCx0aGlzLGEscCx5LGUpfWVsc2Ugb3x8KGE/bz0odSxmLGQscCk9Pm4odSxmLHRoaXMsYSxkLHAsZSk6bz0odSxmLGQpPT5kKTtsZXQgYz0hMSxsPTA7Y29uc3QgaD10aGlzLl9yb290cztmb3IobGV0IHU9MCxmPWgubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9aFt1XTtpZihjPU1kKHRoaXMsdSxyLG8scyxsKSxjKWJyZWFrO2wrPWQuYnl0ZUxlbmd0aH1yZXR1cm4gaWUucmVsZWFzZVByaW1pdGl2ZShlKSxjfWJ2aGNhc3QodCxlLG4pe2xldHtpbnRlcnNlY3RzUmFuZ2VzOnMsaW50ZXJzZWN0c1RyaWFuZ2xlczpyfT1uO2NvbnN0IG89aWUuZ2V0UHJpbWl0aXZlKCksYT10aGlzLmdlb21ldHJ5LmluZGV4LGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9dGhpcy5pbmRpcmVjdD9wPT57Y29uc3QgeT10aGlzLnJlc29sdmVUcmlhbmdsZUluZGV4KHApO3l0KG8seSozLGEsYyl9OnA9Pnt5dChvLHAqMyxhLGMpfSxoPWllLmdldFByaW1pdGl2ZSgpLHU9dC5nZW9tZXRyeS5pbmRleCxmPXQuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixkPXQuaW5kaXJlY3Q/cD0+e2NvbnN0IHk9dC5yZXNvbHZlVHJpYW5nbGVJbmRleChwKTt5dChoLHkqMyx1LGYpfTpwPT57eXQoaCxwKjMsdSxmKX07aWYocil7Y29uc3QgcD0oeSxtLGcsYix3LHgsTSxBKT0+e2ZvcihsZXQgXz1nLHY9ZytiO188djtfKyspe2QoXyksaC5hLmFwcGx5TWF0cml4NChlKSxoLmIuYXBwbHlNYXRyaXg0KGUpLGguYy5hcHBseU1hdHJpeDQoZSksaC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IFA9eSx6PXkrbTtQPHo7UCsrKWlmKGwoUCksby5uZWVkc1VwZGF0ZT0hMCxyKG8saCxQLF8sdyx4LE0sQSkpcmV0dXJuITB9cmV0dXJuITF9O2lmKHMpe2NvbnN0IHk9cztzPWZ1bmN0aW9uKG0sZyxiLHcseCxNLEEsXyl7cmV0dXJuIHkobSxnLGIsdyx4LE0sQSxfKT8hMDpwKG0sZyxiLHcseCxNLEEsXyl9fWVsc2Ugcz1wfXJldHVybiBLZCh0aGlzLHQsZSxzKX1pbnRlcnNlY3RzQm94KHQsZSl7cmV0dXJuIFdzLnNldCh0Lm1pbix0Lm1heCxlKSxXcy5uZWVkc1VwZGF0ZT0hMCx0aGlzLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpuPT5Xcy5pbnRlcnNlY3RzQm94KG4pLGludGVyc2VjdHNUcmlhbmdsZTpuPT5Xcy5pbnRlcnNlY3RzVHJpYW5nbGUobil9KX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczplPT50LmludGVyc2VjdHNCb3goZSksaW50ZXJzZWN0c1RyaWFuZ2xlOmU9PmUuaW50ZXJzZWN0c1NwaGVyZSh0KX0pfWNsb3Nlc3RQb2ludFRvR2VvbWV0cnkodCxlLG49e30scz17fSxyPTAsbz0xLzApe3JldHVybih0aGlzLmluZGlyZWN0P2pkOlVkKSh0aGlzLHQsZSxuLHMscixvKX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZT17fSxuPTAscz0xLzApe3JldHVybiBBZCh0aGlzLHQsZSxuLHMpfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0Lm1ha2VFbXB0eSgpLHRoaXMuX3Jvb3RzLmZvckVhY2gobj0+e2x0KDAsbmV3IEZsb2F0MzJBcnJheShuKSxtbCksdC51bmlvbihtbCl9KSx0fX1jb25zdCBnbD0xZS02LGUwPWdsKi41LHhsPU1hdGgucG93KDEwLC1NYXRoLmxvZzEwKGdsKSksbjA9ZTAqeGw7ZnVuY3Rpb24gd2UoaSl7cmV0dXJufn4oaSp4bCtuMCl9ZnVuY3Rpb24gaTAoaSl7cmV0dXJuYCR7d2UoaS54KX0sJHt3ZShpLnkpfWB9ZnVuY3Rpb24gd2woaSl7cmV0dXJuYCR7d2UoaS54KX0sJHt3ZShpLnkpfSwke3dlKGkueil9YH1mdW5jdGlvbiBzMChpKXtyZXR1cm5gJHt3ZShpLngpfSwke3dlKGkueSl9LCR7d2UoaS56KX0sJHt3ZShpLncpfWB9ZnVuY3Rpb24gcjAoaSx0LGUpe2UuZGlyZWN0aW9uLnN1YlZlY3RvcnModCxpKS5ub3JtYWxpemUoKTtjb25zdCBuPWkuZG90KGUuZGlyZWN0aW9uKTtyZXR1cm4gZS5vcmlnaW4uY29weShpKS5hZGRTY2FsZWRWZWN0b3IoZS5kaXJlY3Rpb24sLW4pLGV9ZnVuY3Rpb24gYmwoKXtyZXR1cm4gdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIn1mdW5jdGlvbiBvMChpKXtpZihpLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKXJldHVybiBpO2NvbnN0IHQ9aS5jb25zdHJ1Y3RvcixlPWkuYnVmZmVyLG49bmV3IFNoYXJlZEFycmF5QnVmZmVyKGUuYnl0ZUxlbmd0aCkscz1uZXcgVWludDhBcnJheShlKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobikuc2V0KHMsMCksbmV3IHQobil9ZnVuY3Rpb24gYTAoaSx0PUFycmF5QnVmZmVyKXtyZXR1cm4gaT42NTUzNT9uZXcgVWludDMyQXJyYXkobmV3IHQoNCppKSk6bmV3IFVpbnQxNkFycmF5KG5ldyB0KDIqaSkpfWZ1bmN0aW9uIGMwKGksdCl7aWYoIWkuaW5kZXgpe2NvbnN0IGU9aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50LG49dC51c2VTaGFyZWRBcnJheUJ1ZmZlcj9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcixzPWEwKGUsbik7aS5zZXRJbmRleChuZXcgeHQocywxKSk7Zm9yKGxldCByPTA7cjxlO3IrKylzW3JdPXJ9fWZ1bmN0aW9uIGwwKGkpe3JldHVybiBpLmluZGV4P2kuaW5kZXguY291bnQ6aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWZ1bmN0aW9uIG9hKGkpe3JldHVybiBsMChpKS8zfWNvbnN0IGgwPTFlLTgsdTA9bmV3IFQ7ZnVuY3Rpb24gZjAoaSl7cmV0dXJufn4oaS8zKX1mdW5jdGlvbiBkMChpKXtyZXR1cm4gaSUzfWZ1bmN0aW9uIE1sKGksdCl7cmV0dXJuIGkuc3RhcnQtdC5zdGFydH1mdW5jdGlvbiBBbChpLHQpe3JldHVybiB1MC5zdWJWZWN0b3JzKHQsaS5vcmlnaW4pLmRvdChpLmRpcmVjdGlvbil9ZnVuY3Rpb24gcDAoaSx0LGUsbj1oMCl7aS5zb3J0KE1sKSx0LnNvcnQoTWwpO2ZvcihsZXQgYT0wO2E8aS5sZW5ndGg7YSsrKXtjb25zdCBjPWlbYV07Zm9yKGxldCBsPTA7bDx0Lmxlbmd0aDtsKyspe2NvbnN0IGg9dFtsXTtpZighKGguc3RhcnQ+Yy5lbmQpKXtpZihjLmVuZDxoLnN0YXJ0fHxoLmVuZDxjLnN0YXJ0KWNvbnRpbnVlO2lmKGMuc3RhcnQ8PWguc3RhcnQmJmMuZW5kPj1oLmVuZClyKGguZW5kLGMuZW5kKXx8aS5zcGxpY2UoYSsxLDAse3N0YXJ0OmguZW5kLGVuZDpjLmVuZCxpbmRleDpjLmluZGV4fSksYy5lbmQ9aC5zdGFydCxoLnN0YXJ0PTAsaC5lbmQ9MDtlbHNlIGlmKGMuc3RhcnQ+PWguc3RhcnQmJmMuZW5kPD1oLmVuZClyKGMuZW5kLGguZW5kKXx8dC5zcGxpY2UobCsxLDAse3N0YXJ0OmMuZW5kLGVuZDpoLmVuZCxpbmRleDpoLmluZGV4fSksaC5lbmQ9Yy5zdGFydCxjLnN0YXJ0PTAsYy5lbmQ9MDtlbHNlIGlmKGMuc3RhcnQ8PWguc3RhcnQmJmMuZW5kPD1oLmVuZCl7Y29uc3QgdT1jLmVuZDtjLmVuZD1oLnN0YXJ0LGguc3RhcnQ9dX1lbHNlIGlmKGMuc3RhcnQ+PWguc3RhcnQmJmMuZW5kPj1oLmVuZCl7Y29uc3QgdT1oLmVuZDtoLmVuZD1jLnN0YXJ0LGMuc3RhcnQ9dX1lbHNlIHRocm93IG5ldyBFcnJvcn1pZihlLmhhcyhjLmluZGV4KXx8ZS5zZXQoYy5pbmRleCxbXSksZS5oYXMoaC5pbmRleCl8fGUuc2V0KGguaW5kZXgsW10pLGUuZ2V0KGMuaW5kZXgpLnB1c2goaC5pbmRleCksZS5nZXQoaC5pbmRleCkucHVzaChjLmluZGV4KSxvKGgpJiYodC5zcGxpY2UobCwxKSxsLS0pLG8oYykpe2kuc3BsaWNlKGEsMSksYS0tO2JyZWFrfX19cyhpKSxzKHQpO2Z1bmN0aW9uIHMoYSl7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspbyhhW2NdKSYmKGEuc3BsaWNlKGMsMSksYy0tKX1mdW5jdGlvbiByKGEsYyl7cmV0dXJuIE1hdGguYWJzKGMtYSk8bn1mdW5jdGlvbiBvKGEpe3JldHVybiBNYXRoLmFicyhhLmVuZC1hLnN0YXJ0KTxufX1jb25zdCBfbD0xZS01LHZsPTFlLTQ7Y2xhc3MgeTB7Y29uc3RydWN0b3IoKXt0aGlzLl9yYXlzPVtdfWFkZFJheSh0KXt0aGlzLl9yYXlzLnB1c2godCl9ZmluZENsb3Nlc3RSYXkodCl7Y29uc3QgZT10aGlzLl9yYXlzLG49dC5jbG9uZSgpO24uZGlyZWN0aW9uLm11bHRpcGx5U2NhbGFyKC0xKTtsZXQgcz0xLzAscj1udWxsO2ZvcihsZXQgYz0wLGw9ZS5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1lW2NdO2lmKG8oaCx0KSYmbyhoLG4pKWNvbnRpbnVlO2NvbnN0IHU9YShoLHQpLGY9YShoLG4pLGQ9TWF0aC5taW4odSxmKTtkPHMmJihzPWQscj1oKX1yZXR1cm4gcjtmdW5jdGlvbiBvKGMsbCl7Y29uc3QgaD1jLm9yaWdpbi5kaXN0YW5jZVRvKGwub3JpZ2luKT5fbDtyZXR1cm4gYy5kaXJlY3Rpb24uYW5nbGVUbyhsLmRpcmVjdGlvbik+dmx8fGh9ZnVuY3Rpb24gYShjLGwpe2NvbnN0IGg9Yy5vcmlnaW4uZGlzdGFuY2VUbyhsLm9yaWdpbiksdT1jLmRpcmVjdGlvbi5hbmdsZVRvKGwuZGlyZWN0aW9uKTtyZXR1cm4gaC9fbCt1L3ZsfX19Y29uc3QgYWE9bmV3IFQsY2E9bmV3IFQsR3M9bmV3IHVvO2Z1bmN0aW9uIG0wKGksdCxlKXtjb25zdCBuPWkuYXR0cmlidXRlcyxzPWkuaW5kZXgscj1uLnBvc2l0aW9uLG89bmV3IE1hcCxhPW5ldyBNYXAsYz1BcnJheS5mcm9tKHQpLGw9bmV3IHkwO2ZvcihsZXQgaD0wLHU9Yy5sZW5ndGg7aDx1O2grKyl7Y29uc3QgZj1jW2hdLGQ9ZjAoZikscD1kMChmKTtsZXQgeT0zKmQrcCxtPTMqZCsocCsxKSUzO3MmJih5PXMuZ2V0WCh5KSxtPXMuZ2V0WChtKSksYWEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLHkpLGNhLmZyb21CdWZmZXJBdHRyaWJ1dGUocixtKSxyMChhYSxjYSxHcyk7bGV0IGcsYj1sLmZpbmRDbG9zZXN0UmF5KEdzKTtiPT09bnVsbCYmKGI9R3MuY2xvbmUoKSxsLmFkZFJheShiKSksYS5oYXMoYil8fGEuc2V0KGIse2ZvcndhcmQ6W10scmV2ZXJzZTpbXSxyYXk6Yn0pLGc9YS5nZXQoYik7bGV0IHc9QWwoYixhYSkseD1BbChiLGNhKTt3PngmJihbdyx4XT1beCx3XSksR3MuZGlyZWN0aW9uLmRvdChiLmRpcmVjdGlvbik8MD9nLnJldmVyc2UucHVzaCh7c3RhcnQ6dyxlbmQ6eCxpbmRleDpmfSk6Zy5mb3J3YXJkLnB1c2goe3N0YXJ0OncsZW5kOngsaW5kZXg6Zn0pfXJldHVybiBhLmZvckVhY2goKHtmb3J3YXJkOmgscmV2ZXJzZTp1fSxmKT0+e3AwKGgsdSxvLGUpLGgubGVuZ3RoPT09MCYmdS5sZW5ndGg9PT0wJiZhLmRlbGV0ZShmKX0pLHtkaXNqb2ludENvbm5lY3Rpdml0eU1hcDpvLGZyYWdtZW50TWFwOmF9fWNvbnN0IGcwPW5ldyBSLGxhPW5ldyBULHgwPW5ldyBZdCxoYT1bIiIsIiIsIiJdO2NsYXNzIHcwe2NvbnN0cnVjdG9yKHQ9bnVsbCl7dGhpcy5kYXRhPW51bGwsdGhpcy5kaXNqb2ludENvbm5lY3Rpb25zPW51bGwsdGhpcy51bm1hdGNoZWREaXNqb2ludEVkZ2VzPW51bGwsdGhpcy51bm1hdGNoZWRFZGdlcz0tMSx0aGlzLm1hdGNoZWRFZGdlcz0tMSx0aGlzLnVzZURyYXdSYW5nZT0hMCx0aGlzLnVzZUFsbEF0dHJpYnV0ZXM9ITEsdGhpcy5tYXRjaERpc2pvaW50RWRnZXM9ITEsdGhpcy5kZWdlbmVyYXRlRXBzaWxvbj0xZS04LHQmJnRoaXMudXBkYXRlRnJvbSh0KX1nZXRTaWJsaW5nVHJpYW5nbGVJbmRleCh0LGUpe2NvbnN0IG49dGhpcy5kYXRhW3QqMytlXTtyZXR1cm4gbj09PS0xPy0xOn5+KG4vMyl9Z2V0U2libGluZ0VkZ2VJbmRleCh0LGUpe2NvbnN0IG49dGhpcy5kYXRhW3QqMytlXTtyZXR1cm4gbj09PS0xPy0xOm4lM31nZXREaXNqb2ludFNpYmxpbmdUcmlhbmdsZUluZGljZXModCxlKXtjb25zdCBuPXQqMytlLHM9dGhpcy5kaXNqb2ludENvbm5lY3Rpb25zLmdldChuKTtyZXR1cm4gcz9zLm1hcChyPT5+fihyLzMpKTpbXX1nZXREaXNqb2ludFNpYmxpbmdFZGdlSW5kaWNlcyh0LGUpe2NvbnN0IG49dCozK2Uscz10aGlzLmRpc2pvaW50Q29ubmVjdGlvbnMuZ2V0KG4pO3JldHVybiBzP3MubWFwKHI9PnIlMyk6W119aXNGdWxseUNvbm5lY3RlZCgpe3JldHVybiB0aGlzLnVubWF0Y2hlZEVkZ2VzPT09MH11cGRhdGVGcm9tKHQpe2NvbnN0e3VzZUFsbEF0dHJpYnV0ZXM6ZSx1c2VEcmF3UmFuZ2U6bixtYXRjaERpc2pvaW50RWRnZXM6cyxkZWdlbmVyYXRlRXBzaWxvbjpyfT10aGlzLG89ZT93OmIsYT1uZXcgTWFwLHthdHRyaWJ1dGVzOmN9PXQsbD1lP09iamVjdC5rZXlzKGMpOm51bGwsaD10LmluZGV4LHU9Yy5wb3NpdGlvbjtsZXQgZj1vYSh0KTtjb25zdCBkPWY7bGV0IHA9MDtuJiYocD10LmRyYXdSYW5nZS5zdGFydCx0LmRyYXdSYW5nZS5jb3VudCE9PTEvMCYmKGY9fn4odC5kcmF3UmFuZ2UuY291bnQvMykpKTtsZXQgeT10aGlzLmRhdGE7KCF5fHx5Lmxlbmd0aDwzKmQpJiYoeT1uZXcgSW50MzJBcnJheSgzKmQpKSx5LmZpbGwoLTEpO2xldCBtPTAsZz1uZXcgU2V0O2ZvcihsZXQgeD1wLE09ZiozK3A7eDxNO3grPTMpe2NvbnN0IEE9eDtmb3IobGV0IF89MDtfPDM7XysrKXtsZXQgdj1BK187aCYmKHY9aC5nZXRYKHYpKSxoYVtfXT1vKHYpfWZvcihsZXQgXz0wO188MztfKyspe2NvbnN0IHY9KF8rMSklMyxQPWhhW19dLHo9aGFbdl0sUz1gJHt6fV8ke1B9YDtpZihhLmhhcyhTKSl7Y29uc3QgQz1BK18sRT1hLmdldChTKTt5W0NdPUUseVtFXT1DLGEuZGVsZXRlKFMpLG0rPTIsZy5kZWxldGUoRSl9ZWxzZXtjb25zdCBDPWAke1B9XyR7en1gLEU9QStfO2Euc2V0KEMsRSksZy5hZGQoRSl9fX1pZihzKXtjb25zdHtmcmFnbWVudE1hcDp4LGRpc2pvaW50Q29ubmVjdGl2aXR5TWFwOk19PW0wKHQsZyxyKTtnLmNsZWFyKCkseC5mb3JFYWNoKCh7Zm9yd2FyZDpBLHJldmVyc2U6X30pPT57QS5mb3JFYWNoKCh7aW5kZXg6dn0pPT5nLmFkZCh2KSksXy5mb3JFYWNoKCh7aW5kZXg6dn0pPT5nLmFkZCh2KSl9KSx0aGlzLnVubWF0Y2hlZERpc2pvaW50RWRnZXM9eCx0aGlzLmRpc2pvaW50Q29ubmVjdGlvbnM9TSxtPWYqMy1nLnNpemV9dGhpcy5tYXRjaGVkRWRnZXM9bSx0aGlzLnVubWF0Y2hlZEVkZ2VzPWcuc2l6ZSx0aGlzLmRhdGE9eTtmdW5jdGlvbiBiKHgpe3JldHVybiBsYS5mcm9tQnVmZmVyQXR0cmlidXRlKHUseCksd2wobGEpfWZ1bmN0aW9uIHcoeCl7bGV0IE09IiI7Zm9yKGxldCBBPTAsXz1sLmxlbmd0aDtBPF87QSsrKXtjb25zdCB2PWNbbFtBXV07bGV0IFA7c3dpdGNoKHYuaXRlbVNpemUpe2Nhc2UgMTpQPXdlKHYuZ2V0WCh4KSk7YnJlYWs7Y2FzZSAyOlA9aTAoZzAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh2LHgpKTticmVhaztjYXNlIDM6UD13bChsYS5mcm9tQnVmZmVyQXR0cmlidXRlKHYseCkpO2JyZWFrO2Nhc2UgNDpQPXMwKHgwLmZyb21CdWZmZXJBdHRyaWJ1dGUodix4KSk7YnJlYWt9TSE9PSIiJiYoTSs9InwiKSxNKz1QfXJldHVybiBNfX19Y2xhc3MgWnMgZXh0ZW5kcyBnZntjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLmlzQnJ1c2g9ITAsdGhpcy5fcHJldmlvdXNNYXRyaXg9bmV3IHN0LHRoaXMuX3ByZXZpb3VzTWF0cml4LmVsZW1lbnRzLmZpbGwoMCl9bWFya1VwZGF0ZWQoKXt0aGlzLl9wcmV2aW91c01hdHJpeC5jb3B5KHRoaXMubWF0cml4KX1pc0RpcnR5KCl7Y29uc3R7bWF0cml4OnQsX3ByZXZpb3VzTWF0cml4OmV9PXRoaXMsbj10LmVsZW1lbnRzLHM9ZS5lbGVtZW50cztmb3IobGV0IHI9MDtyPDE2O3IrKylpZihuW3JdIT09c1tyXSlyZXR1cm4hMDtyZXR1cm4hMX1wcmVwYXJlR2VvbWV0cnkoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnksZT10LmF0dHJpYnV0ZXMsbj1ibCgpO2lmKG4pZm9yKGNvbnN0IHMgaW4gZSl7Y29uc3Qgcj1lW3NdO2lmKHIuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl0aHJvdyBuZXcgRXJyb3IoIkJydXNoOiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7ci5hcnJheT1vMChyLmFycmF5KX1pZih0LmJvdW5kc1RyZWV8fChjMCh0LHt1c2VTaGFyZWRBcnJheUJ1ZmZlcjpufSksdC5ib3VuZHNUcmVlPW5ldyByYSh0LHttYXhMZWFmVHJpczozLGluZGlyZWN0OiEwLHVzZVNoYXJlZEFycmF5QnVmZmVyOm59KSksdC5oYWxmRWRnZXN8fCh0LmhhbGZFZGdlcz1uZXcgdzAodCkpLCF0Lmdyb3VwSW5kaWNlcyl7Y29uc3Qgcz1vYSh0KSxyPW5ldyBVaW50MTZBcnJheShzKSxvPXQuZ3JvdXBzO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKyl7Y29uc3R7c3RhcnQ6bCxjb3VudDpofT1vW2FdO2ZvcihsZXQgdT1sLzMsZj0obCtoKS8zO3U8Zjt1Kyspclt1XT1hfXQuZ3JvdXBJbmRpY2VzPXJ9fWRpc3Bvc2VDYWNoZURhdGEoKXtjb25zdHtnZW9tZXRyeTp0fT10aGlzO3QuaGFsZkVkZ2VzPW51bGwsdC5ib3VuZHNUcmVlPW51bGwsdC5ncm91cEluZGljZXM9bnVsbH19Y29uc3QgYjA9MWUtMTQsdWE9bmV3IFQsU2w9bmV3IFQsemw9bmV3IFQ7ZnVuY3Rpb24gc24oaSx0PWIwKXt1YS5zdWJWZWN0b3JzKGkuYixpLmEpLFNsLnN1YlZlY3RvcnMoaS5jLGkuYSksemwuc3ViVmVjdG9ycyhpLmIsaS5jKTtjb25zdCBlPXVhLmFuZ2xlVG8oU2wpLG49dWEuYW5nbGVUbyh6bCkscz1NYXRoLlBJLWUtbjtyZXR1cm4gTWF0aC5hYnMoZSk8dHx8TWF0aC5hYnMobik8dHx8TWF0aC5hYnMocyk8dHx8aS5hLmRpc3RhbmNlVG9TcXVhcmVkKGkuYik8dHx8aS5hLmRpc3RhbmNlVG9TcXVhcmVkKGkuYyk8dHx8aS5iLmRpc3RhbmNlVG9TcXVhcmVkKGkuYyk8dH1jb25zdCBmYT0xZS0xMCxEaT0xZS0xMCxNMD0xZS0xMCxrZT1uZXcgUXQsZnQ9bmV3IFF0LE5lPW5ldyBULGRhPW5ldyBULFRsPW5ldyBULFhzPW5ldyBTbyxwYT1uZXcgbmU7Y2xhc3MgQTB7Y29uc3RydWN0b3IoKXt0aGlzLl9wb29sPVtdLHRoaXMuX2luZGV4PTB9Z2V0VHJpYW5nbGUoKXtyZXR1cm4gdGhpcy5faW5kZXg+PXRoaXMuX3Bvb2wubGVuZ3RoJiZ0aGlzLl9wb29sLnB1c2gobmV3IGV0KSx0aGlzLl9wb29sW3RoaXMuX2luZGV4KytdfWNsZWFyKCl7dGhpcy5faW5kZXg9MH1yZXNldCgpe3RoaXMuX3Bvb2wubGVuZ3RoPTAsdGhpcy5faW5kZXg9MH19Y2xhc3MgXzB7Y29uc3RydWN0b3IoKXt0aGlzLnRyaWFuZ2xlUG9vbD1uZXcgQTAsdGhpcy50cmlhbmdsZXM9W10sdGhpcy5ub3JtYWw9bmV3IFQsdGhpcy5jb3BsYW5hclRyaWFuZ2xlVXNlZD0hMX1pbml0aWFsaXplKHQpe3RoaXMucmVzZXQoKTtjb25zdHt0cmlhbmdsZXM6ZSx0cmlhbmdsZVBvb2w6bixub3JtYWw6c309dGhpcztpZihBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT10W3JdO2lmKHI9PT0wKWEuZ2V0Tm9ybWFsKHMpO2Vsc2UgaWYoTWF0aC5hYnMoMS1hLmdldE5vcm1hbChOZSkuZG90KHMpKT5mYSl0aHJvdyBuZXcgRXJyb3IoIlRyaWFuZ2xlIFNwbGl0dGVyOiBDYW5ub3QgaW5pdGlhbGl6ZSB3aXRoIHRyaWFuZ2xlcyB0aGF0IGhhdmUgZGlmZmVyZW50IG5vcm1hbHMuIik7Y29uc3QgYz1uLmdldFRyaWFuZ2xlKCk7Yy5jb3B5KGEpLGUucHVzaChjKX1lbHNle3QuZ2V0Tm9ybWFsKHMpO2NvbnN0IHI9bi5nZXRUcmlhbmdsZSgpO3IuY29weSh0KSxlLnB1c2gocil9fXNwbGl0QnlUcmlhbmdsZSh0KXtjb25zdHtub3JtYWw6ZSx0cmlhbmdsZXM6bn09dGhpcztpZih0LmdldE5vcm1hbChkYSkubm9ybWFsaXplKCksTWF0aC5hYnMoMS1NYXRoLmFicyhkYS5kb3QoZSkpKTxNMCl7dGhpcy5jb3BsYW5hclRyaWFuZ2xlVXNlZD0hMDtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9bltyXTthLmNvcGxhbmFyQ291bnQ9MH1jb25zdCBzPVt0LmEsdC5iLHQuY107Zm9yKGxldCByPTA7cjwzO3IrKyl7Y29uc3Qgbz0ocisxKSUzLGE9c1tyXSxjPXNbb107TmUuc3ViVmVjdG9ycyhjLGEpLm5vcm1hbGl6ZSgpLFRsLmNyb3NzVmVjdG9ycyhkYSxOZSksWHMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoVGwsYSksdGhpcy5zcGxpdEJ5UGxhbmUoWHMsdCl9fWVsc2UgdC5nZXRQbGFuZShYcyksdGhpcy5zcGxpdEJ5UGxhbmUoWHMsdCl9c3BsaXRCeVBsYW5lKHQsZSl7Y29uc3R7dHJpYW5nbGVzOm4sdHJpYW5nbGVQb29sOnN9PXRoaXM7cGEuY29weShlKSxwYS5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9bltyXTtpZighcGEuaW50ZXJzZWN0c1RyaWFuZ2xlKGEsa2UsITApKWNvbnRpbnVlO2NvbnN0e2E6YyxiOmwsYzpofT1hO2xldCB1PTAsZj0tMSxkPSExLHA9W10seT1bXTtjb25zdCBtPVtjLGwsaF07Zm9yKGxldCBnPTA7ZzwzO2crKyl7Y29uc3QgYj0oZysxKSUzO2tlLnN0YXJ0LmNvcHkobVtnXSksa2UuZW5kLmNvcHkobVtiXSk7Y29uc3Qgdz10LmRpc3RhbmNlVG9Qb2ludChrZS5zdGFydCkseD10LmRpc3RhbmNlVG9Qb2ludChrZS5lbmQpO2lmKE1hdGguYWJzKHcpPERpJiZNYXRoLmFicyh4KTxEaSl7ZD0hMDticmVha31pZih3PjA/cC5wdXNoKGcpOnkucHVzaChnKSxNYXRoLmFicyh3KTxEaSljb250aW51ZTtsZXQgTT0hIXQuaW50ZXJzZWN0TGluZShrZSxOZSk7IU0mJk1hdGguYWJzKHgpPERpJiYoTmUuY29weShrZS5lbmQpLE09ITApLE0mJiEoTmUuZGlzdGFuY2VUbyhrZS5zdGFydCk8ZmEpJiYoTmUuZGlzdGFuY2VUbyhrZS5lbmQpPGZhJiYoZj1nKSx1PT09MD9mdC5zdGFydC5jb3B5KE5lKTpmdC5lbmQuY29weShOZSksdSsrKX1pZighZCYmdT09PTImJmZ0LmRpc3RhbmNlKCk+RGkpaWYoZiE9PS0xKXtmPShmKzEpJTM7bGV0IGc9MDtnPT09ZiYmKGc9KGcrMSklMyk7bGV0IGI9ZysxO2I9PT1mJiYoYj0oYisxKSUzKTtjb25zdCB3PXMuZ2V0VHJpYW5nbGUoKTt3LmEuY29weShtW2JdKSx3LmIuY29weShmdC5lbmQpLHcuYy5jb3B5KGZ0LnN0YXJ0KSxzbih3KXx8bi5wdXNoKHcpLGEuYS5jb3B5KG1bZ10pLGEuYi5jb3B5KGZ0LnN0YXJ0KSxhLmMuY29weShmdC5lbmQpLHNuKGEpJiYobi5zcGxpY2UociwxKSxyLS0sby0tKX1lbHNle2NvbnN0IGc9cC5sZW5ndGg+PTI/eVswXTpwWzBdO2lmKGc9PT0wKXtsZXQgQT1mdC5zdGFydDtmdC5zdGFydD1mdC5lbmQsZnQuZW5kPUF9Y29uc3QgYj0oZysxKSUzLHc9KGcrMiklMyx4PXMuZ2V0VHJpYW5nbGUoKSxNPXMuZ2V0VHJpYW5nbGUoKTttW2JdLmRpc3RhbmNlVG9TcXVhcmVkKGZ0LnN0YXJ0KTxtW3ddLmRpc3RhbmNlVG9TcXVhcmVkKGZ0LmVuZCk/KHguYS5jb3B5KG1bYl0pLHguYi5jb3B5KGZ0LnN0YXJ0KSx4LmMuY29weShmdC5lbmQpLE0uYS5jb3B5KG1bYl0pLE0uYi5jb3B5KG1bd10pLE0uYy5jb3B5KGZ0LnN0YXJ0KSk6KHguYS5jb3B5KG1bd10pLHguYi5jb3B5KGZ0LnN0YXJ0KSx4LmMuY29weShmdC5lbmQpLE0uYS5jb3B5KG1bYl0pLE0uYi5jb3B5KG1bd10pLE0uYy5jb3B5KGZ0LmVuZCkpLGEuYS5jb3B5KG1bZ10pLGEuYi5jb3B5KGZ0LmVuZCksYS5jLmNvcHkoZnQuc3RhcnQpLHNuKHgpfHxuLnB1c2goeCksc24oTSl8fG4ucHVzaChNKSxzbihhKSYmKG4uc3BsaWNlKHIsMSksci0tLG8tLSl9ZWxzZSB1PT09MyYmY29uc29sZS53YXJuKCJUcmlhbmdsZUNsaXBwZXI6IENvcGxhbmFyIGNsaXAgbm90IGhhbmRsZWQiKX19cmVzZXQoKXt0aGlzLnRyaWFuZ2xlcy5sZW5ndGg9MCx0aGlzLnRyaWFuZ2xlUG9vbC5jbGVhcigpLHRoaXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ9ITF9fWZ1bmN0aW9uIHYwKGkpe3JldHVybiBpPX5+aSxpKzQtaSU0fWNsYXNzIFBse2NvbnN0cnVjdG9yKHQsZT01MDApe3RoaXMuZXhwYW5zaW9uRmFjdG9yPTEuNSx0aGlzLnR5cGU9dCx0aGlzLmxlbmd0aD0wLHRoaXMuYXJyYXk9bnVsbCx0aGlzLnNldFNpemUoZSl9c2V0VHlwZSh0KXtpZih0aGlzLmxlbmd0aCE9PTApdGhyb3cgbmV3IEVycm9yKCJUeXBlQmFja2VkQXJyYXk6IENhbm5vdCBjaGFuZ2UgdGhlIHR5cGUgd2hpbGUgdGhlcmUgaXMgdXNlZCBkYXRhIGluIHRoZSBidWZmZXIuIik7Y29uc3QgZT10aGlzLmFycmF5LmJ1ZmZlcjt0aGlzLmFycmF5PW5ldyB0KGUpLHRoaXMudHlwZT10fXNldFNpemUodCl7aWYodGhpcy5hcnJheSYmdD09PXRoaXMuYXJyYXkubGVuZ3RoKXJldHVybjtjb25zdCBlPXRoaXMudHlwZSxuPWJsKCk/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz1uZXcgZShuZXcgbih2MCh0KmUuQllURVNfUEVSX0VMRU1FTlQpKSk7dGhpcy5hcnJheSYmcy5zZXQodGhpcy5hcnJheSwwKSx0aGlzLmFycmF5PXN9ZXhwYW5kKCl7Y29uc3R7YXJyYXk6dCxleHBhbnNpb25GYWN0b3I6ZX09dGhpczt0aGlzLnNldFNpemUodC5sZW5ndGgqZSl9cHVzaCguLi50KXtsZXR7YXJyYXk6ZSxsZW5ndGg6bn09dGhpcztuK3QubGVuZ3RoPmUubGVuZ3RoJiYodGhpcy5leHBhbmQoKSxlPXRoaXMuYXJyYXkpO2ZvcihsZXQgcz0wLHI9dC5sZW5ndGg7czxyO3MrKyllW24rc109dFtzXTt0aGlzLmxlbmd0aCs9dC5sZW5ndGh9Y2xlYXIoKXt0aGlzLmxlbmd0aD0wfX1jbGFzcyBTMHtjb25zdHJ1Y3Rvcigpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzPVt7fV0sdGhpcy5ncm91cENvdW50PTB9Z2V0VHlwZSh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0udHlwZX1nZXRJdGVtU2l6ZSh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0uaXRlbVNpemV9Z2V0Tm9ybWFsaXplZCh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0ubm9ybWFsaXplZH1nZXRDb3VudCh0KXtpZih0aGlzLmdyb3VwQ291bnQ8PXQpcmV0dXJuIDA7Y29uc3QgZT10aGlzLmdldEdyb3VwQXR0ckFycmF5KCJwb3NpdGlvbiIsdCk7cmV0dXJuIGUubGVuZ3RoL2UuaXRlbVNpemV9Z2V0VG90YWxMZW5ndGgodCl7Y29uc3R7Z3JvdXBDb3VudDplLGdyb3VwQXR0cmlidXRlczpufT10aGlzO2xldCBzPTA7Zm9yKGxldCByPTA7cjxlO3IrKyl7Y29uc3Qgbz1uW3JdO3MrPW9bdF0ubGVuZ3RofXJldHVybiBzfWdldEdyb3VwQXR0clNldCh0PTApe2NvbnN0e2dyb3VwQXR0cmlidXRlczplfT10aGlzO2lmKGVbdF0pcmV0dXJuIHRoaXMuZ3JvdXBDb3VudD1NYXRoLm1heCh0aGlzLmdyb3VwQ291bnQsdCsxKSxlW3RdO2NvbnN0IG49ZVswXTtmb3IodGhpcy5ncm91cENvdW50PU1hdGgubWF4KHRoaXMuZ3JvdXBDb3VudCx0KzEpO3Q+PWUubGVuZ3RoOyl7Y29uc3Qgcz17fTtlLnB1c2gocyk7Zm9yKGNvbnN0IHIgaW4gbil7Y29uc3Qgbz1uW3JdLGE9bmV3IFBsKG8udHlwZSk7YS5pdGVtU2l6ZT1vLml0ZW1TaXplLGEubm9ybWFsaXplZD1vLm5vcm1hbGl6ZWQsc1tyXT1hfX1yZXR1cm4gZVt0XX1nZXRHcm91cEF0dHJBcnJheSh0LGU9MCl7Y29uc3R7Z3JvdXBBdHRyaWJ1dGVzOm59PXRoaXM7aWYoIW5bMF1bdF0pdGhyb3cgbmV3IEVycm9yKGBUeXBlZEF0dHJpYnV0ZURhdGE6IEF0dHJpYnV0ZSB3aXRoICIke3R9IiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRgKTtyZXR1cm4gdGhpcy5nZXRHcm91cEF0dHJTZXQoZSlbdF19aW5pdGlhbGl6ZUFycmF5KHQsZSxuLHMpe2NvbnN0e2dyb3VwQXR0cmlidXRlczpyfT10aGlzLGE9clswXVt0XTtpZihhKXtpZihhLnR5cGUhPT1lKWZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1yW2NdW3RdO2guc2V0VHlwZShlKSxoLml0ZW1TaXplPW4saC5ub3JtYWxpemVkPXN9fWVsc2UgZm9yKGxldCBjPTAsbD1yLmxlbmd0aDtjPGw7YysrKXtjb25zdCBoPW5ldyBQbChlKTtoLml0ZW1TaXplPW4saC5ub3JtYWxpemVkPXMscltjXVt0XT1ofX1jbGVhcigpe3RoaXMuZ3JvdXBDb3VudD0wO2NvbnN0e2dyb3VwQXR0cmlidXRlczp0fT10aGlzO3QuZm9yRWFjaChlPT57Zm9yKGNvbnN0IG4gaW4gZSllW25dLmNsZWFyKCl9KX1kZWxldGUodCl7dGhpcy5ncm91cEF0dHJpYnV0ZXMuZm9yRWFjaChlPT57ZGVsZXRlIGVbdF19KX1yZXNldCgpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzPVtdLHRoaXMuZ3JvdXBDb3VudD0wfX1jbGFzcyBFbHtjb25zdHJ1Y3Rvcigpe3RoaXMuaW50ZXJzZWN0aW9uU2V0PXt9LHRoaXMuaWRzPVtdfWFkZCh0LGUpe2NvbnN0e2ludGVyc2VjdGlvblNldDpuLGlkczpzfT10aGlzO25bdF18fChuW3RdPVtdLHMucHVzaCh0KSksblt0XS5wdXNoKGUpfX1jb25zdCB6MD0wLFQwPTEsUDA9MixDbD0zLEUwPTQsQmw9NSxGbD02LHNlPW5ldyB1byxJbD1uZXcgc3QsVHQ9bmV3IGV0LFJlPW5ldyBULGtsPW5ldyBZdCxObD1uZXcgWXQsUmw9bmV3IFl0LHlhPW5ldyBZdCxKcz1uZXcgWXQsWXM9bmV3IFl0LExsPW5ldyBRdCxtYT1uZXcgVCxnYT0xZS04LEMwPTFlLTE1LHhuPS0xLHduPTEsanM9LTIsUXM9MiwkaT0wLGJuPTEseGE9MixCMD0xZS0xNDtsZXQgS3M9bnVsbDtmdW5jdGlvbiBPbChpKXtLcz1pfWZ1bmN0aW9uIERsKGksdCl7aS5nZXRNaWRwb2ludChzZS5vcmlnaW4pLGkuZ2V0Tm9ybWFsKHNlLmRpcmVjdGlvbik7Y29uc3QgZT10LnJheWNhc3RGaXJzdChzZSwyKTtyZXR1cm4hIShlJiZzZS5kaXJlY3Rpb24uZG90KGUuZmFjZS5ub3JtYWwpPjApP3huOndufWZ1bmN0aW9uIEYwKGksdCl7ZnVuY3Rpb24gZSgpe3JldHVybiBNYXRoLnJhbmRvbSgpLS41fWkuZ2V0Tm9ybWFsKG1hKSxzZS5kaXJlY3Rpb24uY29weShtYSksaS5nZXRNaWRwb2ludChzZS5vcmlnaW4pO2NvbnN0IG49MztsZXQgcz0wLHI9MS8wO2ZvcihsZXQgbz0wO288bjtvKyspe3NlLmRpcmVjdGlvbi54Kz1lKCkqZ2Esc2UuZGlyZWN0aW9uLnkrPWUoKSpnYSxzZS5kaXJlY3Rpb24ueis9ZSgpKmdhLHNlLmRpcmVjdGlvbi5tdWx0aXBseVNjYWxhcigtMSk7Y29uc3QgYT10LnJheWNhc3RGaXJzdChzZSwyKTtpZighIShhJiZzZS5kaXJlY3Rpb24uZG90KGEuZmFjZS5ub3JtYWwpPjApJiZzKyssYSE9PW51bGwmJihyPU1hdGgubWluKHIsYS5kaXN0YW5jZSkpLHI8PUMwKXJldHVybiBhLmZhY2Uubm9ybWFsLmRvdChtYSk+MD9RczpqcztpZihzL24+LjV8fChvLXMrMSkvbj4uNSlicmVha31yZXR1cm4gcy9uPi41P3huOndufWZ1bmN0aW9uIEkwKGksdCl7Y29uc3QgZT1uZXcgRWwsbj1uZXcgRWw7cmV0dXJuIElsLmNvcHkoaS5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkodC5tYXRyaXhXb3JsZCksaS5nZW9tZXRyeS5ib3VuZHNUcmVlLmJ2aGNhc3QodC5nZW9tZXRyeS5ib3VuZHNUcmVlLElsLHtpbnRlcnNlY3RzVHJpYW5nbGVzKHMscixvLGEpe2lmKCFzbihzKSYmIXNuKHIpKXtsZXQgYz1zLmludGVyc2VjdHNUcmlhbmdsZShyLExsLCEwKTtpZighYyl7Y29uc3QgbD1zLnBsYW5lLGg9ci5wbGFuZSx1PWwubm9ybWFsLGY9aC5ub3JtYWw7dS5kb3QoZik9PT0xJiZNYXRoLmFicyhsLmNvbnN0YW50LWguY29uc3RhbnQpPEIwJiYoYz0hMCl9aWYoYyl7bGV0IGw9aS5nZW9tZXRyeS5ib3VuZHNUcmVlLnJlc29sdmVUcmlhbmdsZUluZGV4KG8pLGg9dC5nZW9tZXRyeS5ib3VuZHNUcmVlLnJlc29sdmVUcmlhbmdsZUluZGV4KGEpO2UuYWRkKGwsaCksbi5hZGQoaCxsKSxLcyYmKEtzLmFkZEVkZ2UoTGwpLEtzLmFkZEludGVyc2VjdGluZ1RyaWFuZ2xlcyhvLHMsYSxyKSl9fXJldHVybiExfX0pLHthSW50ZXJzZWN0aW9uczplLGJJbnRlcnNlY3Rpb25zOm59fWZ1bmN0aW9uIGswKGksdCxlLG4scyxyLG89ITEpe2NvbnN0IGE9ZS5hdHRyaWJ1dGVzLGM9ZS5pbmRleCxsPWkqMyxoPWMuZ2V0WChsKzApLHU9Yy5nZXRYKGwrMSksZj1jLmdldFgobCsyKTtmb3IoY29uc3QgZCBpbiByKXtjb25zdCBwPWFbZF0seT1yW2RdO2lmKCEoZCBpbiBhKSl0aHJvdyBuZXcgRXJyb3IoYENTRyBPcGVyYXRpb25zOiBBdHRyaWJ1dGUgJHtkfSBub3QgYXZhaWxhYmxlIG9uIGdlb21ldHJ5LmApO2NvbnN0IG09cC5pdGVtU2l6ZTtkPT09InBvc2l0aW9uIj8oVHQuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCkuYXBwbHlNYXRyaXg0KG4pLFR0LmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLHUpLmFwcGx5TWF0cml4NChuKSxUdC5jLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxmKS5hcHBseU1hdHJpeDQobiksd2EoVHQuYSxUdC5iLFR0LmMsdCwzLHksbykpOmQ9PT0ibm9ybWFsIj8oVHQuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCkuYXBwbHlOb3JtYWxNYXRyaXgocyksVHQuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSkuYXBwbHlOb3JtYWxNYXRyaXgocyksVHQuYy5mcm9tQnVmZmVyQXR0cmlidXRlKHAsZikuYXBwbHlOb3JtYWxNYXRyaXgocyksbyYmKFR0LmEubXVsdGlwbHlTY2FsYXIoLTEpLFR0LmIubXVsdGlwbHlTY2FsYXIoLTEpLFR0LmMubXVsdGlwbHlTY2FsYXIoLTEpKSx3YShUdC5hLFR0LmIsVHQuYyx0LDMseSxvLCEwKSk6KGtsLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxoKSxObC5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSksUmwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGYpLHdhKGtsLE5sLFJsLHQsbSx5LG8pKX19ZnVuY3Rpb24gTjAoaSx0LGUsbixzLHIsbyxhPSExKXtiYShpLG4scyxyLG8sYSksYmEoYT9lOnQsbixzLHIsbyxhKSxiYShhP3Q6ZSxuLHMscixvLGEpfWZ1bmN0aW9uICRsKGksdCxlPSExKXtzd2l0Y2goaSl7Y2FzZSB6MDppZih0PT09d258fHQ9PT1RcyYmIWUpcmV0dXJuIGJuO2JyZWFrO2Nhc2UgVDA6aWYoZSl7aWYodD09PXhuKXJldHVybiAkaX1lbHNlIGlmKHQ9PT13bnx8dD09PWpzKXJldHVybiBibjticmVhaztjYXNlIFAwOmlmKGUpe2lmKHQ9PT13bnx8dD09PWpzKXJldHVybiBibn1lbHNlIGlmKHQ9PT14bilyZXR1cm4gJGk7YnJlYWs7Y2FzZSBFMDppZih0PT09eG4pcmV0dXJuICRpO2lmKHQ9PT13bilyZXR1cm4gYm47YnJlYWs7Y2FzZSBDbDppZih0PT09eG58fHQ9PT1RcyYmIWUpcmV0dXJuIGJuO2JyZWFrO2Nhc2UgQmw6aWYoIWUmJih0PT09d258fHQ9PT1qcykpcmV0dXJuIGJuO2JyZWFrO2Nhc2UgRmw6aWYoIWUmJih0PT09eG58fHQ9PT1RcykpcmV0dXJuIGJuO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgQ1NHIG9wZXJhdGlvbiBlbnVtICIke2l9Ii5gKX1yZXR1cm4geGF9ZnVuY3Rpb24gd2EoaSx0LGUsbixzLHIsbz0hMSxhPSExKXtjb25zdCBjPWw9PntyLnB1c2gobC54KSxzPjEmJnIucHVzaChsLnkpLHM+MiYmci5wdXNoKGwueikscz4zJiZyLnB1c2gobC53KX07eWEuc2V0KDAsMCwwLDApLmFkZFNjYWxlZFZlY3RvcihpLG4uYS54KS5hZGRTY2FsZWRWZWN0b3IodCxuLmEueSkuYWRkU2NhbGVkVmVjdG9yKGUsbi5hLnopLEpzLnNldCgwLDAsMCwwKS5hZGRTY2FsZWRWZWN0b3IoaSxuLmIueCkuYWRkU2NhbGVkVmVjdG9yKHQsbi5iLnkpLmFkZFNjYWxlZFZlY3RvcihlLG4uYi56KSxZcy5zZXQoMCwwLDAsMCkuYWRkU2NhbGVkVmVjdG9yKGksbi5jLngpLmFkZFNjYWxlZFZlY3Rvcih0LG4uYy55KS5hZGRTY2FsZWRWZWN0b3IoZSxuLmMueiksYSYmKHlhLm5vcm1hbGl6ZSgpLEpzLm5vcm1hbGl6ZSgpLFlzLm5vcm1hbGl6ZSgpKSxjKHlhKSxvPyhjKFlzKSxjKEpzKSk6KGMoSnMpLGMoWXMpKX1mdW5jdGlvbiBiYShpLHQsZSxuLHMscj0hMSl7Zm9yKGNvbnN0IG8gaW4gcyl7Y29uc3QgYT10W29dLGM9c1tvXTtpZighKG8gaW4gdCkpdGhyb3cgbmV3IEVycm9yKGBDU0cgT3BlcmF0aW9uczogQXR0cmlidXRlICR7b30gbm8gYXZhaWxhYmxlIG9uIGdlb21ldHJ5LmApO2NvbnN0IGw9YS5pdGVtU2l6ZTtvPT09InBvc2l0aW9uIj8oUmUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGkpLmFwcGx5TWF0cml4NChlKSxjLnB1c2goUmUueCxSZS55LFJlLnopKTpvPT09Im5vcm1hbCI/KFJlLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxpKS5hcHBseU5vcm1hbE1hdHJpeChuKSxyJiZSZS5tdWx0aXBseVNjYWxhcigtMSksYy5wdXNoKFJlLngsUmUueSxSZS56KSk6KGMucHVzaChhLmdldFgoaSkpLGw+MSYmYy5wdXNoKGEuZ2V0WShpKSksbD4yJiZjLnB1c2goYS5nZXRaKGkpKSxsPjMmJmMucHVzaChhLmdldFcoaSkpKX19Y2xhc3MgUjB7Y29uc3RydWN0b3IodCl7dGhpcy50cmlhbmdsZT1uZXcgZXQoKS5jb3B5KHQpLHRoaXMuaW50ZXJzZWN0cz17fX1hZGRUcmlhbmdsZSh0LGUpe3RoaXMuaW50ZXJzZWN0c1t0XT1uZXcgZXQoKS5jb3B5KGUpfWdldEludGVyc2VjdEFycmF5KCl7Y29uc3QgdD1bXSx7aW50ZXJzZWN0czplfT10aGlzO2Zvcihjb25zdCBuIGluIGUpdC5wdXNoKGVbbl0pO3JldHVybiB0fX1jbGFzcyBVbHtjb25zdHJ1Y3Rvcigpe3RoaXMuZGF0YT17fX1hZGRUcmlhbmdsZUludGVyc2VjdGlvbih0LGUsbixzKXtjb25zdHtkYXRhOnJ9PXRoaXM7clt0XXx8KHJbdF09bmV3IFIwKGUpKSxyW3RdLmFkZFRyaWFuZ2xlKG4scyl9Z2V0VHJpYW5nbGVzQXNBcnJheSh0PW51bGwpe2NvbnN0e2RhdGE6ZX09dGhpcyxuPVtdO2lmKHQhPT1udWxsKXQgaW4gZSYmbi5wdXNoKGVbdF0udHJpYW5nbGUpO2Vsc2UgZm9yKGNvbnN0IHMgaW4gZSluLnB1c2goZVtzXS50cmlhbmdsZSk7cmV0dXJuIG59Z2V0VHJpYW5nbGVJbmRpY2VzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubWFwKHQ9PnBhcnNlSW50KHQpKX1nZXRJbnRlcnNlY3Rpb25JbmRpY2VzKHQpe2NvbnN0e2RhdGE6ZX09dGhpcztyZXR1cm4gZVt0XT9PYmplY3Qua2V5cyhlW3RdLmludGVyc2VjdHMpLm1hcChuPT5wYXJzZUludChuKSk6W119Z2V0SW50ZXJzZWN0aW9uc0FzQXJyYXkodD1udWxsLGU9bnVsbCl7Y29uc3R7ZGF0YTpufT10aGlzLHM9bmV3IFNldCxyPVtdLG89YT0+e2lmKG5bYV0paWYoZSE9PW51bGwpblthXS5pbnRlcnNlY3RzW2VdJiZyLnB1c2goblthXS5pbnRlcnNlY3RzW2VdKTtlbHNle2NvbnN0IGM9blthXS5pbnRlcnNlY3RzO2Zvcihjb25zdCBsIGluIGMpcy5oYXMobCl8fChzLmFkZChsKSxyLnB1c2goY1tsXSkpfX07aWYodCE9PW51bGwpbyh0KTtlbHNlIGZvcihjb25zdCBhIGluIG4pbyhhKTtyZXR1cm4gcn1yZXNldCgpe3RoaXMuZGF0YT17fX19Y2xhc3MgTDB7Y29uc3RydWN0b3IoKXt0aGlzLmVuYWJsZWQ9ITEsdGhpcy50cmlhbmdsZUludGVyc2VjdHNBPW5ldyBVbCx0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0I9bmV3IFVsLHRoaXMuaW50ZXJzZWN0aW9uRWRnZXM9W119YWRkSW50ZXJzZWN0aW5nVHJpYW5nbGVzKHQsZSxuLHMpe2NvbnN0e3RyaWFuZ2xlSW50ZXJzZWN0c0E6cix0cmlhbmdsZUludGVyc2VjdHNCOm99PXRoaXM7ci5hZGRUcmlhbmdsZUludGVyc2VjdGlvbih0LGUsbixzKSxvLmFkZFRyaWFuZ2xlSW50ZXJzZWN0aW9uKG4scyx0LGUpfWFkZEVkZ2UodCl7dGhpcy5pbnRlcnNlY3Rpb25FZGdlcy5wdXNoKHQuY2xvbmUoKSl9cmVzZXQoKXt0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0EucmVzZXQoKSx0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0IucmVzZXQoKSx0aGlzLmludGVyc2VjdGlvbkVkZ2VzPVtdfWluaXQoKXt0aGlzLmVuYWJsZWQmJih0aGlzLnJlc2V0KCksT2wodGhpcykpfWNvbXBsZXRlKCl7dGhpcy5lbmFibGVkJiZPbChudWxsKX19Y29uc3Qgcm49bmV3IHN0LHRyPW5ldyBnZSxNbj1uZXcgZXQsZXI9bmV3IGV0LG9uPW5ldyBldCxucj1uZXcgZXQsZGU9W10sQW49W107ZnVuY3Rpb24gTzAoaSl7Zm9yKGNvbnN0IHQgb2YgaSlyZXR1cm4gdH1mdW5jdGlvbiBEMChpLHQsZSxuLHMscj17fSl7Y29uc3R7dXNlR3JvdXBzOm89ITB9PXIse2FJbnRlcnNlY3Rpb25zOmEsYkludGVyc2VjdGlvbnM6Y309STAoaSx0KSxsPVtdO2xldCBoPW51bGwsdTtyZXR1cm4gdT1vPzA6LTEsVmwoaSx0LGEsZSwhMSxuLHMsdSkscWwoaSx0LGEsZSwhMSxzLHUpLGUuZmluZEluZGV4KGQ9PmQhPT1GbCYmZCE9PUJsKSE9PS0xJiYodT1vP2kuZ2VvbWV0cnkuZ3JvdXBzLmxlbmd0aHx8MTotMSxWbCh0LGksYyxlLCEwLG4scyx1KSxxbCh0LGksYyxlLCEwLHMsdSkpLGRlLmxlbmd0aD0wLEFuLmxlbmd0aD0wLHtncm91cHM6bCxtYXRlcmlhbHM6aH19ZnVuY3Rpb24gVmwoaSx0LGUsbixzLHIsbyxhPTApe2NvbnN0IGM9aS5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpPDA7cm4uY29weSh0Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKS5tdWx0aXBseShpLm1hdHJpeFdvcmxkKSx0ci5nZXROb3JtYWxNYXRyaXgoaS5tYXRyaXhXb3JsZCkubXVsdGlwbHlTY2FsYXIoYz8tMToxKTtjb25zdCBsPWkuZ2VvbWV0cnkuZ3JvdXBJbmRpY2VzLGg9aS5nZW9tZXRyeS5pbmRleCx1PWkuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixmPXQuZ2VvbWV0cnkuYm91bmRzVHJlZSxkPXQuZ2VvbWV0cnkuaW5kZXgscD10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24seT1lLmlkcyxtPWUuaW50ZXJzZWN0aW9uU2V0O2ZvcihsZXQgZz0wLGI9eS5sZW5ndGg7ZzxiO2crKyl7Y29uc3Qgdz15W2ddLHg9YT09PS0xPzA6bFt3XSthLE09Myp3LEE9aC5nZXRYKE0rMCksXz1oLmdldFgoTSsxKSx2PWguZ2V0WChNKzIpO01uLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LEEpLmFwcGx5TWF0cml4NChybiksTW4uYi5mcm9tQnVmZmVyQXR0cmlidXRlKHUsXykuYXBwbHlNYXRyaXg0KHJuKSxNbi5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodSx2KS5hcHBseU1hdHJpeDQocm4pLHIucmVzZXQoKSxyLmluaXRpYWxpemUoTW4pO2NvbnN0IFA9bVt3XTtmb3IobGV0IFM9MCxDPVAubGVuZ3RoO1M8QztTKyspe2NvbnN0IEU9MypQW1NdLEY9ZC5nZXRYKEUrMCksQj1kLmdldFgoRSsxKSxJPWQuZ2V0WChFKzIpO2VyLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEYpLGVyLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEIpLGVyLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEkpLHIuc3BsaXRCeVRyaWFuZ2xlKGVyKX1jb25zdCB6PXIudHJpYW5nbGVzO2ZvcihsZXQgUz0wLEM9ei5sZW5ndGg7UzxDO1MrKyl7Y29uc3QgRT16W1NdLEY9ci5jb3BsYW5hclRyaWFuZ2xlVXNlZD9GMChFLGYpOkRsKEUsZik7ZGUubGVuZ3RoPTAsQW4ubGVuZ3RoPTA7Zm9yKGxldCBCPTAsST1uLmxlbmd0aDtCPEk7QisrKXtjb25zdCBrPSRsKG5bQl0sRixzKTtrIT09eGEmJihBbi5wdXNoKGspLGRlLnB1c2gob1tCXS5nZXRHcm91cEF0dHJTZXQoeCkpKX1pZihkZS5sZW5ndGghPT0wKXtNbi5nZXRCYXJ5Y29vcmQoRS5hLG5yLmEpLE1uLmdldEJhcnljb29yZChFLmIsbnIuYiksTW4uZ2V0QmFyeWNvb3JkKEUuYyxuci5jKTtmb3IobGV0IEI9MCxJPWRlLmxlbmd0aDtCPEk7QisrKXtjb25zdCBrPWRlW0JdLFY9QW5bQl09PT0kaTtrMCh3LG5yLGkuZ2VvbWV0cnksaS5tYXRyaXhXb3JsZCx0cixrLGMhPT1WKX19fX1yZXR1cm4geS5sZW5ndGh9ZnVuY3Rpb24gcWwoaSx0LGUsbixzLHIsbz0wKXtjb25zdCBhPWkubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKTwwO3JuLmNvcHkodC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkoaS5tYXRyaXhXb3JsZCksdHIuZ2V0Tm9ybWFsTWF0cml4KGkubWF0cml4V29ybGQpLm11bHRpcGx5U2NhbGFyKGE/LTE6MSk7Y29uc3QgYz10Lmdlb21ldHJ5LmJvdW5kc1RyZWUsbD1pLmdlb21ldHJ5Lmdyb3VwSW5kaWNlcyxoPWkuZ2VvbWV0cnkuaW5kZXgsdT1pLmdlb21ldHJ5LmF0dHJpYnV0ZXMsZj11LnBvc2l0aW9uLGQ9W10scD1pLmdlb21ldHJ5LmhhbGZFZGdlcyx5PW5ldyBTZXQsbT1vYShpLmdlb21ldHJ5KTtmb3IobGV0IGc9MCxiPW07ZzxiO2crKylnIGluIGUuaW50ZXJzZWN0aW9uU2V0fHx5LmFkZChnKTtmb3IoO3kuc2l6ZT4wOyl7Y29uc3QgZz1PMCh5KTt5LmRlbGV0ZShnKSxkLnB1c2goZyk7Y29uc3QgYj0zKmcsdz1oLmdldFgoYiswKSx4PWguZ2V0WChiKzEpLE09aC5nZXRYKGIrMik7b24uYS5mcm9tQnVmZmVyQXR0cmlidXRlKGYsdykuYXBwbHlNYXRyaXg0KHJuKSxvbi5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoZix4KS5hcHBseU1hdHJpeDQocm4pLG9uLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLE0pLmFwcGx5TWF0cml4NChybik7Y29uc3QgQT1EbChvbixjKTtBbi5sZW5ndGg9MCxkZS5sZW5ndGg9MDtmb3IobGV0IF89MCx2PW4ubGVuZ3RoO188djtfKyspe2NvbnN0IFA9JGwobltfXSxBLHMpO1AhPT14YSYmKEFuLnB1c2goUCksZGUucHVzaChyW19dKSl9Zm9yKDtkLmxlbmd0aD4wOyl7Y29uc3QgXz1kLnBvcCgpO2ZvcihsZXQgdj0wO3Y8Mzt2Kyspe2NvbnN0IFA9cC5nZXRTaWJsaW5nVHJpYW5nbGVJbmRleChfLHYpO1AhPT0tMSYmeS5oYXMoUCkmJihkLnB1c2goUCkseS5kZWxldGUoUCkpfWlmKGRlLmxlbmd0aCE9PTApe2NvbnN0IHY9MypfLFA9aC5nZXRYKHYrMCksej1oLmdldFgodisxKSxTPWguZ2V0WCh2KzIpLEM9bz09PS0xPzA6bFtfXStvO2lmKG9uLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLFApLG9uLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLHopLG9uLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLFMpLCFzbihvbikpZm9yKGxldCBFPTAsRj1kZS5sZW5ndGg7RTxGO0UrKyl7Y29uc3QgQj1BbltFXSxJPWRlW0VdLmdldEdyb3VwQXR0clNldChDKSxrPUI9PT0kaTtOMChQLHosUyx1LGkubWF0cml4V29ybGQsdHIsSSxrIT09YSl9fX19fWZ1bmN0aW9uICQwKGkpe2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGgtMTt0Kyspe2NvbnN0IGU9aVt0XSxuPWlbdCsxXTtpZihlLm1hdGVyaWFsSW5kZXg9PT1uLm1hdGVyaWFsSW5kZXgpe2NvbnN0IHM9ZS5zdGFydCxyPW4uc3RhcnQrbi5jb3VudDtuLnN0YXJ0PXMsbi5jb3VudD1yLXMsaS5zcGxpY2UodCwxKSx0LS19fX1mdW5jdGlvbiBVMChpLHQsZSxuKXtlLmNsZWFyKCk7Y29uc3Qgcz1pLmF0dHJpYnV0ZXM7Zm9yKGxldCByPTAsbz1uLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPW5bcl0sYz1zW2FdO2UuaW5pdGlhbGl6ZUFycmF5KGEsYy5hcnJheS5jb25zdHJ1Y3RvcixjLml0ZW1TaXplLGMubm9ybWFsaXplZCl9Zm9yKGNvbnN0IHIgaW4gZS5hdHRyaWJ1dGVzKW4uaW5jbHVkZXMocil8fGUuZGVsZXRlKHIpO2Zvcihjb25zdCByIGluIHQuYXR0cmlidXRlcyluLmluY2x1ZGVzKHIpfHwodC5kZWxldGVBdHRyaWJ1dGUociksdC5kaXNwb3NlKCkpfWZ1bmN0aW9uIFYwKGksdCxlKXtsZXQgbj0hMSxzPS0xO2NvbnN0IHI9aS5hdHRyaWJ1dGVzLG89dC5ncm91cEF0dHJpYnV0ZXNbMF07Zm9yKGNvbnN0IGMgaW4gbyl7Y29uc3QgbD10LmdldFRvdGFsTGVuZ3RoKGMpLGg9dC5nZXRUeXBlKGMpLHU9dC5nZXRJdGVtU2l6ZShjKSxmPXQuZ2V0Tm9ybWFsaXplZChjKTtsZXQgZD1yW2NdOyghZHx8ZC5hcnJheS5sZW5ndGg8bCkmJihkPW5ldyB4dChuZXcgaChsKSx1LGYpLGkuc2V0QXR0cmlidXRlKGMsZCksbj0hMCk7bGV0IHA9MDtmb3IobGV0IHk9MCxtPU1hdGgubWluKGUubGVuZ3RoLHQuZ3JvdXBDb3VudCk7eTxtO3krKyl7Y29uc3QgZz1lW3ldLmluZGV4LHthcnJheTpiLHR5cGU6dyxsZW5ndGg6eH09dC5ncm91cEF0dHJpYnV0ZXNbZ11bY10sTT1uZXcgdyhiLmJ1ZmZlciwwLHgpO2QuYXJyYXkuc2V0KE0scCkscCs9TS5sZW5ndGh9ZC5uZWVkc1VwZGF0ZT0hMCxzPWwvZC5pdGVtU2l6ZX1pZihpLmluZGV4KXtjb25zdCBjPWkuaW5kZXguYXJyYXk7aWYoYy5sZW5ndGg8cylpLmluZGV4PW51bGwsbj0hMDtlbHNlIGZvcihsZXQgbD0wLGg9Yy5sZW5ndGg7bDxoO2wrKyljW2xdPWx9bGV0IGE9MDtpLmNsZWFyR3JvdXBzKCk7Zm9yKGxldCBjPTAsbD1NYXRoLm1pbihlLmxlbmd0aCx0Lmdyb3VwQ291bnQpO2M8bDtjKyspe2NvbnN0e2luZGV4OmgsbWF0ZXJpYWxJbmRleDp1fT1lW2NdLGY9dC5nZXRDb3VudChoKTtmIT09MCYmKGkuYWRkR3JvdXAoYSxmLHUpLGErPWYpfWkuc2V0RHJhd1JhbmdlKDAscyksaS5ib3VuZHNUcmVlPW51bGwsbiYmaS5kaXNwb3NlKCl9ZnVuY3Rpb24gSGwoaSx0KXtsZXQgZT10O3JldHVybiBBcnJheS5pc0FycmF5KHQpfHwoZT1bXSxpLmZvckVhY2gobj0+e2Vbbi5tYXRlcmlhbEluZGV4XT10fSkpLGV9Y2xhc3MgcTB7Y29uc3RydWN0b3IoKXt0aGlzLnRyaWFuZ2xlU3BsaXR0ZXI9bmV3IF8wLHRoaXMuYXR0cmlidXRlRGF0YT1bXSx0aGlzLmF0dHJpYnV0ZXM9WyJwb3NpdGlvbiIsInV2Iiwibm9ybWFsIl0sdGhpcy51c2VHcm91cHM9ITAsdGhpcy5jb25zb2xpZGF0ZUdyb3Vwcz0hMCx0aGlzLmRlYnVnPW5ldyBMMH1nZXRHcm91cFJhbmdlcyh0KXtyZXR1cm4hdGhpcy51c2VHcm91cHN8fHQuZ3JvdXBzLmxlbmd0aD09PTA/W3tzdGFydDowLGNvdW50OjEvMCxtYXRlcmlhbEluZGV4OjB9XTp0Lmdyb3Vwcy5tYXAoZT0+RnQoe30sZSkpfWV2YWx1YXRlKHQsZSxuLHM9bmV3IFpzKXtsZXQgcj0hMDtpZihBcnJheS5pc0FycmF5KG4pfHwobj1bbl0pLEFycmF5LmlzQXJyYXkocyl8fChzPVtzXSxyPSExKSxzLmxlbmd0aCE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRXZhbHVhdG9yOiBvcGVyYXRpb25zIGFuZCB0YXJnZXQgYXJyYXkgcGFzc2VkIGFzIGRpZmZlcmVudCBzaXplcy4iKTt0LnByZXBhcmVHZW9tZXRyeSgpLGUucHJlcGFyZUdlb21ldHJ5KCk7Y29uc3R7dHJpYW5nbGVTcGxpdHRlcjpvLGF0dHJpYnV0ZURhdGE6YSxhdHRyaWJ1dGVzOmMsdXNlR3JvdXBzOmwsY29uc29saWRhdGVHcm91cHM6aCxkZWJ1Zzp1fT10aGlzO2Zvcig7YS5sZW5ndGg8cy5sZW5ndGg7KWEucHVzaChuZXcgUzApO3MuZm9yRWFjaCgoZyxiKT0+e1UwKHQuZ2VvbWV0cnksZy5nZW9tZXRyeSxhW2JdLGMpfSksdS5pbml0KCksRDAodCxlLG4sbyxhLHt1c2VHcm91cHM6bH0pLHUuY29tcGxldGUoKTtjb25zdCBmPXRoaXMuZ2V0R3JvdXBSYW5nZXModC5nZW9tZXRyeSksZD1IbChmLHQubWF0ZXJpYWwpLHA9dGhpcy5nZXRHcm91cFJhbmdlcyhlLmdlb21ldHJ5KSx5PUhsKHAsZS5tYXRlcmlhbCk7cC5mb3JFYWNoKGc9PmcubWF0ZXJpYWxJbmRleCs9ZC5sZW5ndGgpO2xldCBtPVsuLi5mLC4uLnBdLm1hcCgoZyxiKT0+WmUoRnQoe30sZykse2luZGV4OmJ9KSk7aWYobCl7Y29uc3QgZz1bLi4uZCwuLi55XTtoJiYobT1tLm1hcCh3PT57Y29uc3QgeD1nW3cubWF0ZXJpYWxJbmRleF07cmV0dXJuIHcubWF0ZXJpYWxJbmRleD1nLmluZGV4T2YoeCksd30pLnNvcnQoKHcseCk9PncubWF0ZXJpYWxJbmRleC14Lm1hdGVyaWFsSW5kZXgpKTtjb25zdCBiPVtdO2ZvcihsZXQgdz0wLHg9Zy5sZW5ndGg7dzx4O3crKyl7bGV0IE09ITE7Zm9yKGxldCBBPTAsXz1tLmxlbmd0aDtBPF87QSsrKXtjb25zdCB2PW1bQV07di5tYXRlcmlhbEluZGV4PT09dyYmKE09ITAsdi5tYXRlcmlhbEluZGV4PWIubGVuZ3RoKX1NJiZiLnB1c2goZ1t3XSl9cy5mb3JFYWNoKHc9Pnt3Lm1hdGVyaWFsPWJ9KX1lbHNlIG09W3tzdGFydDowLGNvdW50OjEvMCxpbmRleDowLG1hdGVyaWFsSW5kZXg6MH1dLHMuZm9yRWFjaChnPT57Zy5tYXRlcmlhbD1kWzBdfSk7cmV0dXJuIHMuZm9yRWFjaCgoZyxiKT0+e2NvbnN0IHc9Zy5nZW9tZXRyeTtWMCh3LGFbYl0sbSksaCYmJDAody5ncm91cHMpfSkscj9zOnNbMF19ZXZhbHVhdGVIaWVyYXJjaHkodCxlPW5ldyBacyl7dC51cGRhdGVNYXRyaXhXb3JsZCghMCk7Y29uc3Qgbj0ocixvKT0+e2NvbnN0IGE9ci5jaGlsZHJlbjtmb3IobGV0IGM9MCxsPWEubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9YVtjXTtoLmlzT3BlcmF0aW9uR3JvdXA/bihoLG8pOm8oaCl9fSxzPXI9Pntjb25zdCBvPXIuY2hpbGRyZW47bGV0IGE9ITE7Zm9yKGxldCBsPTAsaD1vLmxlbmd0aDtsPGg7bCsrKXtjb25zdCB1PW9bbF07YT1zKHUpfHxhfWNvbnN0IGM9ci5pc0RpcnR5KCk7aWYoYyYmci5tYXJrVXBkYXRlZCgpLGEmJiFyLmlzT3BlcmF0aW9uR3JvdXApe2xldCBsO3JldHVybiBuKHIsaD0+e2w/bD10aGlzLmV2YWx1YXRlKGwsaCxoLm9wZXJhdGlvbik6bD10aGlzLmV2YWx1YXRlKHIsaCxoLm9wZXJhdGlvbil9KSxyLl9jYWNoZWRHZW9tZXRyeT1sLmdlb21ldHJ5LHIuX2NhY2hlZE1hdGVyaWFscz1sLm1hdGVyaWFsLCEwfWVsc2UgcmV0dXJuIGF8fGN9O3JldHVybiBzKHQpLGUuZ2VvbWV0cnk9dC5fY2FjaGVkR2VvbWV0cnksZS5tYXRlcmlhbD10Ll9jYWNoZWRNYXRlcmlhbHMsZX1yZXNldCgpe3RoaXMudHJpYW5nbGVTcGxpdHRlci5yZXNldCgpfX1mdW5jdGlvbiBXbChpKXtsZXQgdCxlLG4scz0tMSxyPTA7Zm9yKGxldCBsPTA7bDxpLmxlbmd0aDsrK2wpe2NvbnN0IGg9aVtsXTtpZih0PT09dm9pZCAwJiYodD1oLmFycmF5LmNvbnN0cnVjdG9yKSx0IT09aC5hcnJheS5jb25zdHJ1Y3RvcilyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmFycmF5IG11c3QgYmUgb2YgY29uc2lzdGVudCBhcnJheSB0eXBlcyBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKGU9PT12b2lkIDAmJihlPWguaXRlbVNpemUpLGUhPT1oLml0ZW1TaXplKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUuaXRlbVNpemUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYobj09PXZvaWQgMCYmKG49aC5ub3JtYWxpemVkKSxuIT09aC5ub3JtYWxpemVkKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUubm9ybWFsaXplZCBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihzPT09LTEmJihzPWguZ3B1VHlwZSkscyE9PWguZ3B1VHlwZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmdwdVR5cGUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7cis9aC5jb3VudCplfWNvbnN0IG89bmV3IHQociksYT1uZXcgeHQobyxlLG4pO2xldCBjPTA7Zm9yKGxldCBsPTA7bDxpLmxlbmd0aDsrK2wpe2NvbnN0IGg9aVtsXTtpZihoLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IHU9Yy9lO2ZvcihsZXQgZj0wLGQ9aC5jb3VudDtmPGQ7ZisrKWZvcihsZXQgcD0wO3A8ZTtwKyspe2NvbnN0IHk9aC5nZXRDb21wb25lbnQoZixwKTthLnNldENvbXBvbmVudChmK3UscCx5KX19ZWxzZSBvLnNldChoLmFycmF5LGMpO2MrPWguY291bnQqZX1yZXR1cm4gcyE9PXZvaWQgMCYmKGEuZ3B1VHlwZT1zKSxhfWZ1bmN0aW9uIEgwKGkpe2lmKGkuZ3JvdXBzLmxlbmd0aD09PTApcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUdyb3VwcygpOiBObyBncm91cHMgYXJlIGRlZmluZWQuIE5vdGhpbmcgdG8gbWVyZ2UuIiksaTtsZXQgdD1pLmdyb3VwcztpZih0PXQuc29ydCgobyxhKT0+by5tYXRlcmlhbEluZGV4IT09YS5tYXRlcmlhbEluZGV4P28ubWF0ZXJpYWxJbmRleC1hLm1hdGVyaWFsSW5kZXg6by5zdGFydC1hLnN0YXJ0KSxpLmdldEluZGV4KCk9PT1udWxsKXtjb25zdCBvPWkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLGE9W107Zm9yKGxldCBjPTA7YzxvLmNvdW50O2MrPTMpYS5wdXNoKGMsYysxLGMrMik7aS5zZXRJbmRleChhKX1jb25zdCBlPWkuZ2V0SW5kZXgoKSxuPVtdO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb10sYz1hLnN0YXJ0LGw9YythLmNvdW50O2ZvcihsZXQgaD1jO2g8bDtoKyspbi5wdXNoKGUuZ2V0WChoKSl9aS5kaXNwb3NlKCksaS5zZXRJbmRleChuKTtsZXQgcz0wO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb107YS5zdGFydD1zLHMrPWEuY291bnR9bGV0IHI9dFswXTtpLmdyb3Vwcz1bcl07Zm9yKGxldCBvPTE7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGE9dFtvXTtyLm1hdGVyaWFsSW5kZXg9PT1hLm1hdGVyaWFsSW5kZXg/ci5jb3VudCs9YS5jb3VudDoocj1hLGkuZ3JvdXBzLnB1c2gocikpfXJldHVybiBpfWZ1bmN0aW9uIEdsKGksdD0wKXtjb25zdCBlPWlbMF0uaW5kZXghPT1udWxsLG49bmV3IFNldChPYmplY3Qua2V5cyhpWzBdLmF0dHJpYnV0ZXMpKSxzPW5ldyBTZXQoT2JqZWN0LmtleXMoaVswXS5tb3JwaEF0dHJpYnV0ZXMpKSxyPXt9LG89e30sYT1pWzBdLm1vcnBoVGFyZ2V0c1JlbGF0aXZlLGM9bmV3IHVlO2xldCBsPTA7Zm9yKGxldCBoPTA7aDxpLmxlbmd0aDsrK2gpe2NvbnN0IHU9aVtoXTtsZXQgZj0wO2lmKGUhPT0odS5pbmRleCE9PW51bGwpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuIEFsbCBnZW9tZXRyaWVzIG11c3QgaGF2ZSBjb21wYXRpYmxlIGF0dHJpYnV0ZXM7IG1ha2Ugc3VyZSBpbmRleCBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1LmF0dHJpYnV0ZXMpe2lmKCFuLmhhcyhkKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsnLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzOyBtYWtlIHN1cmUgIicrZCsnIiBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uJyksbnVsbDtyW2RdPT09dm9pZCAwJiYocltkXT1bXSkscltkXS5wdXNoKHUuYXR0cmlidXRlc1tkXSksZisrfWlmKGYhPT1uLnNpemUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gTWFrZSBzdXJlIGFsbCBnZW9tZXRyaWVzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihhIT09dS5tb3JwaFRhcmdldHNSZWxhdGl2ZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiAubW9ycGhUYXJnZXRzUmVsYXRpdmUgbXVzdCBiZSBjb25zaXN0ZW50IHRocm91Z2hvdXQgYWxsIGdlb21ldHJpZXMuIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1Lm1vcnBoQXR0cmlidXRlcyl7aWYoIXMuaGFzKGQpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuICAubW9ycGhBdHRyaWJ1dGVzIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLG51bGw7b1tkXT09PXZvaWQgMCYmKG9bZF09W10pLG9bZF0ucHVzaCh1Lm1vcnBoQXR0cmlidXRlc1tkXSl9aWYodCl7bGV0IGQ7aWYoZSlkPXUuaW5kZXguY291bnQ7ZWxzZSBpZih1LmF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDApZD11LmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQ7ZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiBUaGUgZ2VvbWV0cnkgbXVzdCBoYXZlIGVpdGhlciBhbiBpbmRleCBvciBhIHBvc2l0aW9uIGF0dHJpYnV0ZSIpLG51bGw7aWYodD09PTEpYy5hZGRHcm91cChsLGQsaCk7ZWxzZSBpZih0PT09MiYmdS5ncm91cHMubGVuZ3RoPjApZm9yKGxldCBwIG9mIHUuZ3JvdXBzKXtsZXQgeT1wLm1hdGVyaWFsSW5kZXg7Yy5hZGRHcm91cChsK3Auc3RhcnQsTWF0aC5taW4ocC5jb3VudCxkKSx5KX1sKz1kfX1pZihlKXtsZXQgaD0wO2NvbnN0IHU9W107Zm9yKGxldCBmPTA7ZjxpLmxlbmd0aDsrK2Ype2NvbnN0IGQ9aVtmXS5pbmRleDtmb3IobGV0IHA9MDtwPGQuY291bnQ7KytwKXUucHVzaChkLmdldFgocCkraCk7aCs9aVtmXS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWMuc2V0SW5kZXgodSl9Zm9yKGNvbnN0IGggaW4gcil7Y29uc3QgdT1XbChyW2hdKTtpZighdSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIGF0dHJpYnV0ZS4iKSxudWxsO2Muc2V0QXR0cmlidXRlKGgsdSl9Zm9yKGNvbnN0IGggaW4gbyl7Y29uc3QgdT1vW2hdWzBdLmxlbmd0aDtpZih1PT09MClicmVhaztjLm1vcnBoQXR0cmlidXRlcz1jLm1vcnBoQXR0cmlidXRlc3x8e30sYy5tb3JwaEF0dHJpYnV0ZXNbaF09W107Zm9yKGxldCBmPTA7Zjx1OysrZil7Y29uc3QgZD1bXTtmb3IobGV0IHk9MDt5PG9baF0ubGVuZ3RoOysreSlkLnB1c2gob1toXVt5XVtmXSk7Y29uc3QgcD1XbChkKTtpZighcClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIG1vcnBoQXR0cmlidXRlLiIpLG51bGw7Yy5tb3JwaEF0dHJpYnV0ZXNbaF0ucHVzaChwKX19cmV0dXJuIHQ9PT0yP0gwKGMpOmN9Y2xhc3MgVzAgZXh0ZW5kcyBHbntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSk7Y29uc3Qgbj1uZXcgWnMobmV3IEduKHQsWmUoRnQoe30sZSkse2hhc1RvcDohMCxoYXNTaWRlOiEwLGhhc0JvdHRvbTohMX0pKSk7bi51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0IHM9bmV3IGd0KCkuc2V0RnJvbU9iamVjdChuKSxyPW5ldyBUO3MuZ2V0U2l6ZShyKTtjb25zdCBvPW5ldyBUKHMubWluLngrci54LzIscy5taW4ueStyLnkvMiwwKTtsZXQgYT1lLnRvcFNlZ21lbnRzLGM9ZS5ib3gzO2lmKGMpe2M9Yy51bmlvbihzKTtjb25zdCBnPW5ldyBUO2MuZ2V0U2l6ZShnKTtjb25zdCBiPU1hdGgubWF4KHIueC9nLngsci55L2cueSk7YT1NYXRoLmNlaWwoZS50b3BTZWdtZW50cypiKX1pZihhPDQpcmV0dXJuIHRoaXM7Y29uc3QgbD1uZXcgUm8oci54LHIueSxhLGEpLGg9bmV3IFpzKGwpO2gucG9zaXRpb24uc2V0KG8ueCxvLnksby56KSxoLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Y29uc3QgZj1uZXcgcTAoKS5ldmFsdWF0ZShoLG4sQ2wpLGQ9Zi5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikscD1uZXcgQmUoZC5jb3VudCoyLDIpO2ZvcihsZXQgZz0wO2c8ZC5jb3VudDtnKyspe2NvbnN0IGI9ZC5nZXRaKGcpO2Quc2V0WihnLGUuZGVwdGgrYil9aWYoYyl7Y29uc3QgZz1jLm1pbixiPWMubWF4LHc9bmV3IFQoKS5zdWJWZWN0b3JzKGIsZyk7Zm9yKGxldCB4PTA7eDxkLmNvdW50O3grKyl7Y29uc3QgTT1kLmdldFgoeCksQT1kLmdldFkoeCksXz0oTS1nLngpL3cueCx2PShBLWcueSkvdy55O3Auc2V0WFkoeCxfLHYpfWYuZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCJ1diIscCl9ZC5uZWVkc1VwZGF0ZT0hMDtjb25zdCB5PW5ldyBHbih0LFplKEZ0KHt9LGUpLHtoYXNUb3A6ITF9KSksbT1HbChbZi5nZW9tZXRyeSx5XSwyKTt0aGlzLmNvcHkobS50b05vbkluZGV4ZWQoKSl9fXZhciBHMD1pPT57Y29uc3R7c3BsaXQ6dCxkZXB0aDplLHBvaW50czpuLGJveDM6cyxoYXNUb3A6cixoYXNCb3R0b206byxoYXNTaWRlOmEsc2lkZVJlcGVhdDpjLHRvcFNlZ21lbnRzOmx9PWksaD1sP1cwOkduLHU9bmV3IGgobmV3IFdjKG4pLHtkZXB0aDplLGJldmVsRW5hYmxlZDohMSxib3gzOnMsVVZHZW5lcmF0b3I6WmYoe3NwbGl0OnQsYm94MzpzLHNpZGVSZXBlYXQ6Y30pLGhhc1RvcDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSx0b3BTZWdtZW50czpsfSk7cmV0dXJuIFhmKCksdX07ZnVuY3Rpb24gWjAoaSx0LGU9MCl7Y29uc3Qgbj0oOTAtdCkqTWF0aC5QSS8xODAscz0oOTAtaSkqTWF0aC5QSS8xODA7cmV0dXJuW2UqTWF0aC5zaW4obikqTWF0aC5jb3MocyksZSpNYXRoLmNvcyhuKSxlKk1hdGguc2luKG4pKk1hdGguc2luKHMpXX1mdW5jdGlvbiBpcihpLHQpe3JldHVybiBpPT1udWxsfHx0PT1udWxsP05hTjppPHQ/LTE6aT50PzE6aT49dD8wOk5hTn1mdW5jdGlvbiBYMChpLHQpe3JldHVybiBpPT1udWxsfHx0PT1udWxsP05hTjp0PGk/LTE6dD5pPzE6dD49aT8wOk5hTn1mdW5jdGlvbiBabChpKXtsZXQgdCxlLG47aS5sZW5ndGghPT0yPyh0PWlyLGU9KGEsYyk9PmlyKGkoYSksYyksbj0oYSxjKT0+aShhKS1jKToodD1pPT09aXJ8fGk9PT1YMD9pOkowLGU9aSxuPWkpO2Z1bmN0aW9uIHMoYSxjLGw9MCxoPWEubGVuZ3RoKXtpZihsPGgpe2lmKHQoYyxjKSE9PTApcmV0dXJuIGg7ZG97Y29uc3QgdT1sK2g+Pj4xO2UoYVt1XSxjKTwwP2w9dSsxOmg9dX13aGlsZShsPGgpfXJldHVybiBsfWZ1bmN0aW9uIHIoYSxjLGw9MCxoPWEubGVuZ3RoKXtpZihsPGgpe2lmKHQoYyxjKSE9PTApcmV0dXJuIGg7ZG97Y29uc3QgdT1sK2g+Pj4xO2UoYVt1XSxjKTw9MD9sPXUrMTpoPXV9d2hpbGUobDxoKX1yZXR1cm4gbH1mdW5jdGlvbiBvKGEsYyxsPTAsaD1hLmxlbmd0aCl7Y29uc3QgdT1zKGEsYyxsLGgtMSk7cmV0dXJuIHU+bCYmbihhW3UtMV0sYyk+LW4oYVt1XSxjKT91LTE6dX1yZXR1cm57bGVmdDpzLGNlbnRlcjpvLHJpZ2h0OnJ9fWZ1bmN0aW9uIEowKCl7cmV0dXJuIDB9ZnVuY3Rpb24gWTAoaSl7cmV0dXJuIGk9PT1udWxsP05hTjoraX1jb25zdCBqMD1abChpcikucmlnaHQ7WmwoWTApLmNlbnRlcjtmdW5jdGlvbiBzcihpLHQpe2xldCBlLG47aWYodD09PXZvaWQgMClmb3IoY29uc3QgcyBvZiBpKXMhPW51bGwmJihlPT09dm9pZCAwP3M+PXMmJihlPW49cyk6KGU+cyYmKGU9cyksbjxzJiYobj1zKSkpO2Vsc2V7bGV0IHM9LTE7Zm9yKGxldCByIG9mIGkpKHI9dChyLCsrcyxpKSkhPW51bGwmJihlPT09dm9pZCAwP3I+PXImJihlPW49cik6KGU+ciYmKGU9ciksbjxyJiYobj1yKSkpfXJldHVybltlLG5dfWNsYXNzIExle2NvbnN0cnVjdG9yKCl7dGhpcy5fcGFydGlhbHM9bmV3IEZsb2F0NjRBcnJheSgzMiksdGhpcy5fbj0wfWFkZCh0KXtjb25zdCBlPXRoaXMuX3BhcnRpYWxzO2xldCBuPTA7Zm9yKGxldCBzPTA7czx0aGlzLl9uJiZzPDMyO3MrKyl7Y29uc3Qgcj1lW3NdLG89dCtyLGE9TWF0aC5hYnModCk8TWF0aC5hYnMocik/dC0oby1yKTpyLShvLXQpO2EmJihlW24rK109YSksdD1vfXJldHVybiBlW25dPXQsdGhpcy5fbj1uKzEsdGhpc312YWx1ZU9mKCl7Y29uc3QgdD10aGlzLl9wYXJ0aWFscztsZXQgZT10aGlzLl9uLG4scyxyLG89MDtpZihlPjApe2ZvcihvPXRbLS1lXTtlPjAmJihuPW8scz10Wy0tZV0sbz1uK3Mscj1zLShvLW4pLCFyKTspO2U+MCYmKHI8MCYmdFtlLTFdPDB8fHI+MCYmdFtlLTFdPjApJiYocz1yKjIsbj1vK3Mscz09bi1vJiYobz1uKSl9cmV0dXJuIG99fWNvbnN0IFEwPU1hdGguc3FydCg1MCksSzA9TWF0aC5zcXJ0KDEwKSx0cD1NYXRoLnNxcnQoMik7ZnVuY3Rpb24gcnIoaSx0LGUpe2NvbnN0IG49KHQtaSkvTWF0aC5tYXgoMCxlKSxzPU1hdGguZmxvb3IoTWF0aC5sb2cxMChuKSkscj1uL01hdGgucG93KDEwLHMpLG89cj49UTA/MTA6cj49SzA/NTpyPj10cD8yOjE7bGV0IGEsYyxsO3JldHVybiBzPDA/KGw9TWF0aC5wb3coMTAsLXMpL28sYT1NYXRoLnJvdW5kKGkqbCksYz1NYXRoLnJvdW5kKHQqbCksYS9sPGkmJisrYSxjL2w+dCYmLS1jLGw9LWwpOihsPU1hdGgucG93KDEwLHMpKm8sYT1NYXRoLnJvdW5kKGkvbCksYz1NYXRoLnJvdW5kKHQvbCksYSpsPGkmJisrYSxjKmw+dCYmLS1jKSxjPGEmJi41PD1lJiZlPDI/cnIoaSx0LGUqMik6W2EsYyxsXX1mdW5jdGlvbiBlcChpLHQsZSl7aWYodD0rdCxpPStpLGU9K2UsIShlPjApKXJldHVybltdO2lmKGk9PT10KXJldHVybltpXTtjb25zdCBuPXQ8aSxbcyxyLG9dPW4/cnIodCxpLGUpOnJyKGksdCxlKTtpZighKHI+PXMpKXJldHVybltdO2NvbnN0IGE9ci1zKzEsYz1uZXcgQXJyYXkoYSk7aWYobilpZihvPDApZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShyLWwpLy1vO2Vsc2UgZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShyLWwpKm87ZWxzZSBpZihvPDApZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShzK2wpLy1vO2Vsc2UgZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShzK2wpKm87cmV0dXJuIGN9ZnVuY3Rpb24gTWEoaSx0LGUpe3JldHVybiB0PSt0LGk9K2ksZT0rZSxycihpLHQsZSlbMl19ZnVuY3Rpb24gbnAoaSx0LGUpe3Q9K3QsaT0raSxlPStlO2NvbnN0IG49dDxpLHM9bj9NYSh0LGksZSk6TWEoaSx0LGUpO3JldHVybihuPy0xOjEpKihzPDA/MS8tczpzKX1mdW5jdGlvbiBpcChpLHQpe2xldCBlPTAsbj0wO2lmKHQ9PT12b2lkIDApZm9yKGxldCBzIG9mIGkpcyE9bnVsbCYmKHM9K3MpPj1zJiYoKytlLG4rPXMpO2Vsc2V7bGV0IHM9LTE7Zm9yKGxldCByIG9mIGkpKHI9dChyLCsrcyxpKSkhPW51bGwmJihyPStyKT49ciYmKCsrZSxuKz1yKX1pZihlKXJldHVybiBuL2V9ZnVuY3Rpb24qc3AoaSl7Zm9yKGNvbnN0IHQgb2YgaSl5aWVsZCpadSh0KX1mdW5jdGlvbiBVaShpKXtyZXR1cm4gQXJyYXkuZnJvbShzcChpKSl9dmFyIEs9MWUtNixvcj0xZS0xMixYPU1hdGguUEksTnQ9WC8yLGFyPVgvNCxSdD1YKjIsaHQ9MTgwL1gsSD1YLzE4MCx0dD1NYXRoLmFicyxBYT1NYXRoLmF0YW4scmU9TWF0aC5hdGFuMixXPU1hdGguY29zLHJwPU1hdGguZXhwLF9hPU1hdGguaHlwb3Qsb3A9TWF0aC5sb2cscT1NYXRoLnNpbixhcD1NYXRoLnNpZ258fGZ1bmN0aW9uKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH0sT2U9TWF0aC5zcXJ0LGNwPU1hdGgudGFuO2Z1bmN0aW9uIGxwKGkpe3JldHVybiBpPjE/MDppPC0xP1g6TWF0aC5hY29zKGkpfWZ1bmN0aW9uIERlKGkpe3JldHVybiBpPjE/TnQ6aTwtMT8tTnQ6TWF0aC5hc2luKGkpfWZ1bmN0aW9uIFhsKGkpe3JldHVybihpPXEoaS8yKSkqaX1mdW5jdGlvbiB2dCgpe31mdW5jdGlvbiBjcihpLHQpe2kmJllsLmhhc093blByb3BlcnR5KGkudHlwZSkmJllsW2kudHlwZV0oaSx0KX12YXIgSmw9e0ZlYXR1cmU6ZnVuY3Rpb24oaSx0KXtjcihpLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmZlYXR1cmVzLG49LTEscz1lLmxlbmd0aDsrK248czspY3IoZVtuXS5nZW9tZXRyeSx0KX19LFlsPXtTcGhlcmU6ZnVuY3Rpb24oaSx0KXt0LnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbihpLHQpe2k9aS5jb29yZGluYXRlcyx0LnBvaW50KGlbMF0saVsxXSxpWzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaT1lW25dLHQucG9pbnQoaVswXSxpWzFdLGlbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7dmEoaS5jb29yZGluYXRlcyx0LDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KXZhKGVbbl0sdCwwKX0sUG9seWdvbjpmdW5jdGlvbihpLHQpe2psKGkuY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspamwoZVtuXSx0KX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZ2VvbWV0cmllcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWNyKGVbbl0sdCl9fTtmdW5jdGlvbiB2YShpLHQsZSl7dmFyIG49LTEscz1pLmxlbmd0aC1lLHI7Zm9yKHQubGluZVN0YXJ0KCk7KytuPHM7KXI9aVtuXSx0LnBvaW50KHJbMF0sclsxXSxyWzJdKTt0LmxpbmVFbmQoKX1mdW5jdGlvbiBqbChpLHQpe3ZhciBlPS0xLG49aS5sZW5ndGg7Zm9yKHQucG9seWdvblN0YXJ0KCk7KytlPG47KXZhKGlbZV0sdCwxKTt0LnBvbHlnb25FbmQoKX1mdW5jdGlvbiBscihpLHQpe2kmJkpsLmhhc093blByb3BlcnR5KGkudHlwZSk/SmxbaS50eXBlXShpLHQpOmNyKGksdCl9dmFyIGhyPW5ldyBMZSxRbD1uZXcgTGUsS2wsdGgsU2EsemEsVGEsJGU9e3BvaW50OnZ0LGxpbmVTdGFydDp2dCxsaW5lRW5kOnZ0LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2hyPW5ldyBMZSwkZS5saW5lU3RhcnQ9aHAsJGUubGluZUVuZD11cH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBpPStocjtRbC5hZGQoaTwwP1J0K2k6aSksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9dnR9LHNwaGVyZTpmdW5jdGlvbigpe1FsLmFkZChSdCl9fTtmdW5jdGlvbiBocCgpeyRlLnBvaW50PWZwfWZ1bmN0aW9uIHVwKCl7ZWgoS2wsdGgpfWZ1bmN0aW9uIGZwKGksdCl7JGUucG9pbnQ9ZWgsS2w9aSx0aD10LGkqPUgsdCo9SCxTYT1pLHphPVcodD10LzIrYXIpLFRhPXEodCl9ZnVuY3Rpb24gZWgoaSx0KXtpKj1ILHQqPUgsdD10LzIrYXI7dmFyIGU9aS1TYSxuPWU+PTA/MTotMSxzPW4qZSxyPVcodCksbz1xKHQpLGE9VGEqbyxjPXphKnIrYSpXKHMpLGw9YSpuKnEocyk7aHIuYWRkKHJlKGwsYykpLFNhPWksemE9cixUYT1vfWZ1bmN0aW9uIHVyKGkpe3JldHVybltyZShpWzFdLGlbMF0pLERlKGlbMl0pXX1mdW5jdGlvbiBfbihpKXt2YXIgdD1pWzBdLGU9aVsxXSxuPVcoZSk7cmV0dXJuW24qVyh0KSxuKnEodCkscShlKV19ZnVuY3Rpb24gZnIoaSx0KXtyZXR1cm4gaVswXSp0WzBdK2lbMV0qdFsxXStpWzJdKnRbMl19ZnVuY3Rpb24gbmkoaSx0KXtyZXR1cm5baVsxXSp0WzJdLWlbMl0qdFsxXSxpWzJdKnRbMF0taVswXSp0WzJdLGlbMF0qdFsxXS1pWzFdKnRbMF1dfWZ1bmN0aW9uIFBhKGksdCl7aVswXSs9dFswXSxpWzFdKz10WzFdLGlbMl0rPXRbMl19ZnVuY3Rpb24gZHIoaSx0KXtyZXR1cm5baVswXSp0LGlbMV0qdCxpWzJdKnRdfWZ1bmN0aW9uIHByKGkpe3ZhciB0PU9lKGlbMF0qaVswXStpWzFdKmlbMV0raVsyXSppWzJdKTtpWzBdLz10LGlbMV0vPXQsaVsyXS89dH12YXIgb3QsTHQsdXQscXQsdm4sbmgsaWgsaWksVmksYW4sVWUsVmU9e3BvaW50OkVhLGxpbmVTdGFydDpyaCxsaW5lRW5kOm9oLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1ZlLnBvaW50PWFoLFZlLmxpbmVTdGFydD1kcCxWZS5saW5lRW5kPXBwLFZpPW5ldyBMZSwkZS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpeyRlLnBvbHlnb25FbmQoKSxWZS5wb2ludD1FYSxWZS5saW5lU3RhcnQ9cmgsVmUubGluZUVuZD1vaCxocjwwPyhvdD0tKHV0PTE4MCksTHQ9LShxdD05MCkpOlZpPks/cXQ9OTA6Vmk8LUsmJihMdD0tOTApLFVlWzBdPW90LFVlWzFdPXV0fSxzcGhlcmU6ZnVuY3Rpb24oKXtvdD0tKHV0PTE4MCksTHQ9LShxdD05MCl9fTtmdW5jdGlvbiBFYShpLHQpe2FuLnB1c2goVWU9W290PWksdXQ9aV0pLHQ8THQmJihMdD10KSx0PnF0JiYocXQ9dCl9ZnVuY3Rpb24gc2goaSx0KXt2YXIgZT1fbihbaSpILHQqSF0pO2lmKGlpKXt2YXIgbj1uaShpaSxlKSxzPVtuWzFdLC1uWzBdLDBdLHI9bmkocyxuKTtwcihyKSxyPXVyKHIpO3ZhciBvPWktdm4sYT1vPjA/MTotMSxjPXJbMF0qaHQqYSxsLGg9dHQobyk+MTgwO2heKGEqdm48YyYmYzxhKmkpPyhsPXJbMV0qaHQsbD5xdCYmKHF0PWwpKTooYz0oYyszNjApJTM2MC0xODAsaF4oYSp2bjxjJiZjPGEqaSk/KGw9LXJbMV0qaHQsbDxMdCYmKEx0PWwpKToodDxMdCYmKEx0PXQpLHQ+cXQmJihxdD10KSkpLGg/aTx2bj9IdChvdCxpKT5IdChvdCx1dCkmJih1dD1pKTpIdChpLHV0KT5IdChvdCx1dCkmJihvdD1pKTp1dD49b3Q/KGk8b3QmJihvdD1pKSxpPnV0JiYodXQ9aSkpOmk+dm4/SHQob3QsaSk+SHQob3QsdXQpJiYodXQ9aSk6SHQoaSx1dCk+SHQob3QsdXQpJiYob3Q9aSl9ZWxzZSBhbi5wdXNoKFVlPVtvdD1pLHV0PWldKTt0PEx0JiYoTHQ9dCksdD5xdCYmKHF0PXQpLGlpPWUsdm49aX1mdW5jdGlvbiByaCgpe1ZlLnBvaW50PXNofWZ1bmN0aW9uIG9oKCl7VWVbMF09b3QsVWVbMV09dXQsVmUucG9pbnQ9RWEsaWk9bnVsbH1mdW5jdGlvbiBhaChpLHQpe2lmKGlpKXt2YXIgZT1pLXZuO1ZpLmFkZCh0dChlKT4xODA/ZSsoZT4wPzM2MDotMzYwKTplKX1lbHNlIG5oPWksaWg9dDskZS5wb2ludChpLHQpLHNoKGksdCl9ZnVuY3Rpb24gZHAoKXskZS5saW5lU3RhcnQoKX1mdW5jdGlvbiBwcCgpe2FoKG5oLGloKSwkZS5saW5lRW5kKCksdHQoVmkpPksmJihvdD0tKHV0PTE4MCkpLFVlWzBdPW90LFVlWzFdPXV0LGlpPW51bGx9ZnVuY3Rpb24gSHQoaSx0KXtyZXR1cm4odC09aSk8MD90KzM2MDp0fWZ1bmN0aW9uIHlwKGksdCl7cmV0dXJuIGlbMF0tdFswXX1mdW5jdGlvbiBjaChpLHQpe3JldHVybiBpWzBdPD1pWzFdP2lbMF08PXQmJnQ8PWlbMV06dDxpWzBdfHxpWzFdPHR9ZnVuY3Rpb24gbGgoaSl7dmFyIHQsZSxuLHMscixvLGE7aWYocXQ9dXQ9LShvdD1MdD0xLzApLGFuPVtdLGxyKGksVmUpLGU9YW4ubGVuZ3RoKXtmb3IoYW4uc29ydCh5cCksdD0xLG49YW5bMF0scj1bbl07dDxlOysrdClzPWFuW3RdLGNoKG4sc1swXSl8fGNoKG4sc1sxXSk/KEh0KG5bMF0sc1sxXSk+SHQoblswXSxuWzFdKSYmKG5bMV09c1sxXSksSHQoc1swXSxuWzFdKT5IdChuWzBdLG5bMV0pJiYoblswXT1zWzBdKSk6ci5wdXNoKG49cyk7Zm9yKG89LTEvMCxlPXIubGVuZ3RoLTEsdD0wLG49cltlXTt0PD1lO249cywrK3Qpcz1yW3RdLChhPUh0KG5bMV0sc1swXSkpPm8mJihvPWEsb3Q9c1swXSx1dD1uWzFdKX1yZXR1cm4gYW49VWU9bnVsbCxvdD09PTEvMHx8THQ9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbb3QsTHRdLFt1dCxxdF1dfXZhciBxaSx5cixtcixncix4cix3cixicixNcixDYSxCYSxGYSxoaCx1aCxQdCxFdCxDdCxwZT17c3BoZXJlOnZ0LHBvaW50OklhLGxpbmVTdGFydDpmaCxsaW5lRW5kOmRoLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3BlLmxpbmVTdGFydD14cCxwZS5saW5lRW5kPXdwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7cGUubGluZVN0YXJ0PWZoLHBlLmxpbmVFbmQ9ZGh9fTtmdW5jdGlvbiBJYShpLHQpe2kqPUgsdCo9SDt2YXIgZT1XKHQpO0hpKGUqVyhpKSxlKnEoaSkscSh0KSl9ZnVuY3Rpb24gSGkoaSx0LGUpeysrcWksbXIrPShpLW1yKS9xaSxncis9KHQtZ3IpL3FpLHhyKz0oZS14cikvcWl9ZnVuY3Rpb24gZmgoKXtwZS5wb2ludD1tcH1mdW5jdGlvbiBtcChpLHQpe2kqPUgsdCo9SDt2YXIgZT1XKHQpO1B0PWUqVyhpKSxFdD1lKnEoaSksQ3Q9cSh0KSxwZS5wb2ludD1ncCxIaShQdCxFdCxDdCl9ZnVuY3Rpb24gZ3AoaSx0KXtpKj1ILHQqPUg7dmFyIGU9Vyh0KSxuPWUqVyhpKSxzPWUqcShpKSxyPXEodCksbz1yZShPZSgobz1FdCpyLUN0KnMpKm8rKG89Q3Qqbi1QdCpyKSpvKyhvPVB0KnMtRXQqbikqbyksUHQqbitFdCpzK0N0KnIpO3lyKz1vLHdyKz1vKihQdCsoUHQ9bikpLGJyKz1vKihFdCsoRXQ9cykpLE1yKz1vKihDdCsoQ3Q9cikpLEhpKFB0LEV0LEN0KX1mdW5jdGlvbiBkaCgpe3BlLnBvaW50PUlhfWZ1bmN0aW9uIHhwKCl7cGUucG9pbnQ9YnB9ZnVuY3Rpb24gd3AoKXtwaChoaCx1aCkscGUucG9pbnQ9SWF9ZnVuY3Rpb24gYnAoaSx0KXtoaD1pLHVoPXQsaSo9SCx0Kj1ILHBlLnBvaW50PXBoO3ZhciBlPVcodCk7UHQ9ZSpXKGkpLEV0PWUqcShpKSxDdD1xKHQpLEhpKFB0LEV0LEN0KX1mdW5jdGlvbiBwaChpLHQpe2kqPUgsdCo9SDt2YXIgZT1XKHQpLG49ZSpXKGkpLHM9ZSpxKGkpLHI9cSh0KSxvPUV0KnItQ3QqcyxhPUN0Km4tUHQqcixjPVB0KnMtRXQqbixsPV9hKG8sYSxjKSxoPURlKGwpLHU9bCYmLWgvbDtDYS5hZGQodSpvKSxCYS5hZGQodSphKSxGYS5hZGQodSpjKSx5cis9aCx3cis9aCooUHQrKFB0PW4pKSxicis9aCooRXQrKEV0PXMpKSxNcis9aCooQ3QrKEN0PXIpKSxIaShQdCxFdCxDdCl9ZnVuY3Rpb24geWgoaSl7cWk9eXI9bXI9Z3I9eHI9d3I9YnI9TXI9MCxDYT1uZXcgTGUsQmE9bmV3IExlLEZhPW5ldyBMZSxscihpLHBlKTt2YXIgdD0rQ2EsZT0rQmEsbj0rRmEscz1fYSh0LGUsbik7cmV0dXJuIHM8b3ImJih0PXdyLGU9YnIsbj1Ncix5cjxLJiYodD1tcixlPWdyLG49eHIpLHM9X2EodCxlLG4pLHM8b3IpP1tOYU4sTmFOXTpbcmUoZSx0KSpodCxEZShuL3MpKmh0XX1mdW5jdGlvbiBrYShpLHQpe2Z1bmN0aW9uIGUobixzKXtyZXR1cm4gbj1pKG4scyksdChuWzBdLG5bMV0pfXJldHVybiBpLmludmVydCYmdC5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihuLHMpe3JldHVybiBuPXQuaW52ZXJ0KG4scyksbiYmaS5pbnZlcnQoblswXSxuWzFdKX0pLGV9ZnVuY3Rpb24gTmEoaSx0KXtyZXR1cm4gdHQoaSk+WCYmKGktPU1hdGgucm91bmQoaS9SdCkqUnQpLFtpLHRdfU5hLmludmVydD1OYTtmdW5jdGlvbiBtaChpLHQsZSl7cmV0dXJuKGklPVJ0KT90fHxlP2thKHhoKGkpLHdoKHQsZSkpOnhoKGkpOnR8fGU/d2godCxlKTpOYX1mdW5jdGlvbiBnaChpKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdCs9aSx0dCh0KT5YJiYodC09TWF0aC5yb3VuZCh0L1J0KSpSdCksW3QsZV19fWZ1bmN0aW9uIHhoKGkpe3ZhciB0PWdoKGkpO3JldHVybiB0LmludmVydD1naCgtaSksdH1mdW5jdGlvbiB3aChpLHQpe3ZhciBlPVcoaSksbj1xKGkpLHM9Vyh0KSxyPXEodCk7ZnVuY3Rpb24gbyhhLGMpe3ZhciBsPVcoYyksaD1XKGEpKmwsdT1xKGEpKmwsZj1xKGMpLGQ9ZiplK2gqbjtyZXR1cm5bcmUodSpzLWQqcixoKmUtZipuKSxEZShkKnMrdSpyKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKGEsYyl7dmFyIGw9VyhjKSxoPVcoYSkqbCx1PXEoYSkqbCxmPXEoYyksZD1mKnMtdSpyO3JldHVybltyZSh1KnMrZipyLGgqZStkKm4pLERlKGQqZS1oKm4pXX0sb31mdW5jdGlvbiBiaChpKXtpPW1oKGlbMF0qSCxpWzFdKkgsaS5sZW5ndGg+Mj9pWzJdKkg6MCk7ZnVuY3Rpb24gdChlKXtyZXR1cm4gZT1pKGVbMF0qSCxlWzFdKkgpLGVbMF0qPWh0LGVbMV0qPWh0LGV9cmV0dXJuIHQuaW52ZXJ0PWZ1bmN0aW9uKGUpe3JldHVybiBlPWkuaW52ZXJ0KGVbMF0qSCxlWzFdKkgpLGVbMF0qPWh0LGVbMV0qPWh0LGV9LHR9ZnVuY3Rpb24gTXAoaSx0LGUsbixzLHIpe2lmKGUpe3ZhciBvPVcodCksYT1xKHQpLGM9biplO3M9PW51bGw/KHM9dCtuKlJ0LHI9dC1jLzIpOihzPU1oKG8scykscj1NaChvLHIpLChuPjA/czxyOnM+cikmJihzKz1uKlJ0KSk7Zm9yKHZhciBsLGg9cztuPjA/aD5yOmg8cjtoLT1jKWw9dXIoW28sLWEqVyhoKSwtYSpxKGgpXSksaS5wb2ludChsWzBdLGxbMV0pfX1mdW5jdGlvbiBNaChpLHQpe3Q9X24odCksdFswXS09aSxwcih0KTt2YXIgZT1scCgtdFsxXSk7cmV0dXJuKCgtdFsyXTwwPy1lOmUpK1J0LUspJVJ0fWZ1bmN0aW9uIEFoKCl7dmFyIGk9W10sdDtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24oZSxuLHMpe3QucHVzaChbZSxuLHNdKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7aS5wdXNoKHQ9W10pfSxsaW5lRW5kOnZ0LHJlam9pbjpmdW5jdGlvbigpe2kubGVuZ3RoPjEmJmkucHVzaChpLnBvcCgpLmNvbmNhdChpLnNoaWZ0KCkpKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGU9aTtyZXR1cm4gaT1bXSx0PW51bGwsZX19fWZ1bmN0aW9uIEFyKGksdCl7cmV0dXJuIHR0KGlbMF0tdFswXSk8SyYmdHQoaVsxXS10WzFdKTxLfWZ1bmN0aW9uIF9yKGksdCxlLG4pe3RoaXMueD1pLHRoaXMuej10LHRoaXMubz1lLHRoaXMuZT1uLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gX2goaSx0LGUsbixzKXt2YXIgcj1bXSxvPVtdLGEsYztpZihpLmZvckVhY2goZnVuY3Rpb24ocCl7aWYoISgoeT1wLmxlbmd0aC0xKTw9MCkpe3ZhciB5LG09cFswXSxnPXBbeV0sYjtpZihBcihtLGcpKXtpZighbVsyXSYmIWdbMl0pe2ZvcihzLmxpbmVTdGFydCgpLGE9MDthPHk7KythKXMucG9pbnQoKG09cFthXSlbMF0sbVsxXSk7cy5saW5lRW5kKCk7cmV0dXJufWdbMF0rPTIqS31yLnB1c2goYj1uZXcgX3IobSxwLG51bGwsITApKSxvLnB1c2goYi5vPW5ldyBfcihtLG51bGwsYiwhMSkpLHIucHVzaChiPW5ldyBfcihnLHAsbnVsbCwhMSkpLG8ucHVzaChiLm89bmV3IF9yKGcsbnVsbCxiLCEwKSl9fSksISFyLmxlbmd0aCl7Zm9yKG8uc29ydCh0KSx2aChyKSx2aChvKSxhPTAsYz1vLmxlbmd0aDthPGM7KythKW9bYV0uZT1lPSFlO2Zvcih2YXIgbD1yWzBdLGgsdTs7KXtmb3IodmFyIGY9bCxkPSEwO2YudjspaWYoKGY9Zi5uKT09PWwpcmV0dXJuO2g9Zi56LHMubGluZVN0YXJ0KCk7ZG97aWYoZi52PWYuby52PSEwLGYuZSl7aWYoZClmb3IoYT0wLGM9aC5sZW5ndGg7YTxjOysrYSlzLnBvaW50KCh1PWhbYV0pWzBdLHVbMV0pO2Vsc2UgbihmLngsZi5uLngsMSxzKTtmPWYubn1lbHNle2lmKGQpZm9yKGg9Zi5wLnosYT1oLmxlbmd0aC0xO2E+PTA7LS1hKXMucG9pbnQoKHU9aFthXSlbMF0sdVsxXSk7ZWxzZSBuKGYueCxmLnAueCwtMSxzKTtmPWYucH1mPWYubyxoPWYueixkPSFkfXdoaWxlKCFmLnYpO3MubGluZUVuZCgpfX19ZnVuY3Rpb24gdmgoaSl7aWYodD1pLmxlbmd0aCl7Zm9yKHZhciB0LGU9MCxuPWlbMF0sczsrK2U8dDspbi5uPXM9aVtlXSxzLnA9bixuPXM7bi5uPXM9aVswXSxzLnA9bn19ZnVuY3Rpb24gUmEoaSl7cmV0dXJuIHR0KGlbMF0pPD1YP2lbMF06YXAoaVswXSkqKCh0dChpWzBdKStYKSVSdC1YKX1mdW5jdGlvbiBTaChpLHQpe3ZhciBlPVJhKHQpLG49dFsxXSxzPXEobikscj1bcShlKSwtVyhlKSwwXSxvPTAsYT0wLGM9bmV3IExlO3M9PT0xP249TnQrSzpzPT09LTEmJihuPS1OdC1LKTtmb3IodmFyIGw9MCxoPWkubGVuZ3RoO2w8aDsrK2wpaWYoZj0odT1pW2xdKS5sZW5ndGgpZm9yKHZhciB1LGYsZD11W2YtMV0scD1SYShkKSx5PWRbMV0vMithcixtPXEoeSksZz1XKHkpLGI9MDtiPGY7KytiLHA9eCxtPUEsZz1fLGQ9dyl7dmFyIHc9dVtiXSx4PVJhKHcpLE09d1sxXS8yK2FyLEE9cShNKSxfPVcoTSksdj14LXAsUD12Pj0wPzE6LTEsej1QKnYsUz16PlgsQz1tKkE7aWYoYy5hZGQocmUoQypQKnEoeiksZypfK0MqVyh6KSkpLG8rPVM/ditQKlJ0OnYsU15wPj1lXng+PWUpe3ZhciBFPW5pKF9uKGQpLF9uKHcpKTtwcihFKTt2YXIgRj1uaShyLEUpO3ByKEYpO3ZhciBCPShTXnY+PTA/LTE6MSkqRGUoRlsyXSk7KG4+Qnx8bj09PUImJihFWzBdfHxFWzFdKSkmJihhKz1TXnY+PTA/MTotMSl9fXJldHVybihvPC1LfHxvPEsmJmM8LW9yKV5hJjF9ZnVuY3Rpb24gemgoaSx0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHMpe3ZhciByPXQocyksbz1BaCgpLGE9dChvKSxjPSExLGwsaCx1LGY9e3BvaW50OmQsbGluZVN0YXJ0OnksbGluZUVuZDptLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2YucG9pbnQ9ZyxmLmxpbmVTdGFydD1iLGYubGluZUVuZD13LGg9W10sbD1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2YucG9pbnQ9ZCxmLmxpbmVTdGFydD15LGYubGluZUVuZD1tLGg9VWkoaCk7dmFyIHg9U2gobCxuKTtoLmxlbmd0aD8oY3x8KHMucG9seWdvblN0YXJ0KCksYz0hMCksX2goaCxfcCx4LGUscykpOngmJihjfHwocy5wb2x5Z29uU3RhcnQoKSxjPSEwKSxzLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEscykscy5saW5lRW5kKCkpLGMmJihzLnBvbHlnb25FbmQoKSxjPSExKSxoPWw9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7cy5wb2x5Z29uU3RhcnQoKSxzLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEscykscy5saW5lRW5kKCkscy5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKHgsTSl7aSh4LE0pJiZzLnBvaW50KHgsTSl9ZnVuY3Rpb24gcCh4LE0pe3IucG9pbnQoeCxNKX1mdW5jdGlvbiB5KCl7Zi5wb2ludD1wLHIubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbSgpe2YucG9pbnQ9ZCxyLmxpbmVFbmQoKX1mdW5jdGlvbiBnKHgsTSl7dS5wdXNoKFt4LE1dKSxhLnBvaW50KHgsTSl9ZnVuY3Rpb24gYigpe2EubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiB3KCl7Zyh1WzBdWzBdLHVbMF1bMV0pLGEubGluZUVuZCgpO3ZhciB4PWEuY2xlYW4oKSxNPW8ucmVzdWx0KCksQSxfPU0ubGVuZ3RoLHYsUCx6O2lmKHUucG9wKCksbC5wdXNoKHUpLHU9bnVsbCwhIV8pe2lmKHgmMSl7aWYoUD1NWzBdLCh2PVAubGVuZ3RoLTEpPjApe2ZvcihjfHwocy5wb2x5Z29uU3RhcnQoKSxjPSEwKSxzLmxpbmVTdGFydCgpLEE9MDtBPHY7KytBKXMucG9pbnQoKHo9UFtBXSlbMF0selsxXSk7cy5saW5lRW5kKCl9cmV0dXJufV8+MSYmeCYyJiZNLnB1c2goTS5wb3AoKS5jb25jYXQoTS5zaGlmdCgpKSksaC5wdXNoKE0uZmlsdGVyKEFwKSl9fXJldHVybiBmfX1mdW5jdGlvbiBBcChpKXtyZXR1cm4gaS5sZW5ndGg+MX1mdW5jdGlvbiBfcChpLHQpe3JldHVybigoaT1pLngpWzBdPDA/aVsxXS1OdC1LOk50LWlbMV0pLSgodD10LngpWzBdPDA/dFsxXS1OdC1LOk50LXRbMV0pfXZhciBUaD16aChmdW5jdGlvbigpe3JldHVybiEwfSx2cCx6cCxbLVgsLU50XSk7ZnVuY3Rpb24gdnAoaSl7dmFyIHQ9TmFOLGU9TmFOLG49TmFOLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2kubGluZVN0YXJ0KCkscz0xfSxwb2ludDpmdW5jdGlvbihyLG8pe3ZhciBhPXI+MD9YOi1YLGM9dHQoci10KTt0dChjLVgpPEs/KGkucG9pbnQodCxlPShlK28pLzI+MD9OdDotTnQpLGkucG9pbnQobixlKSxpLmxpbmVFbmQoKSxpLmxpbmVTdGFydCgpLGkucG9pbnQoYSxlKSxpLnBvaW50KHIsZSkscz0wKTpuIT09YSYmYz49WCYmKHR0KHQtbik8SyYmKHQtPW4qSyksdHQoci1hKTxLJiYoci09YSpLKSxlPVNwKHQsZSxyLG8pLGkucG9pbnQobixlKSxpLmxpbmVFbmQoKSxpLmxpbmVTdGFydCgpLGkucG9pbnQoYSxlKSxzPTApLGkucG9pbnQodD1yLGU9byksbj1hfSxsaW5lRW5kOmZ1bmN0aW9uKCl7aS5saW5lRW5kKCksdD1lPU5hTn0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi1zfX19ZnVuY3Rpb24gU3AoaSx0LGUsbil7dmFyIHMscixvPXEoaS1lKTtyZXR1cm4gdHQobyk+Sz9BYSgocSh0KSoocj1XKG4pKSpxKGUpLXEobikqKHM9Vyh0KSkqcShpKSkvKHMqcipvKSk6KHQrbikvMn1mdW5jdGlvbiB6cChpLHQsZSxuKXt2YXIgcztpZihpPT1udWxsKXM9ZSpOdCxuLnBvaW50KC1YLHMpLG4ucG9pbnQoMCxzKSxuLnBvaW50KFgscyksbi5wb2ludChYLDApLG4ucG9pbnQoWCwtcyksbi5wb2ludCgwLC1zKSxuLnBvaW50KC1YLC1zKSxuLnBvaW50KC1YLDApLG4ucG9pbnQoLVgscyk7ZWxzZSBpZih0dChpWzBdLXRbMF0pPkspe3ZhciByPWlbMF08dFswXT9YOi1YO3M9ZSpyLzIsbi5wb2ludCgtcixzKSxuLnBvaW50KDAscyksbi5wb2ludChyLHMpfWVsc2Ugbi5wb2ludCh0WzBdLHRbMV0pfWZ1bmN0aW9uIFRwKGkpe3ZhciB0PVcoaSksZT0yKkgsbj10PjAscz10dCh0KT5LO2Z1bmN0aW9uIHIoaCx1LGYsZCl7TXAoZCxpLGUsZixoLHUpfWZ1bmN0aW9uIG8oaCx1KXtyZXR1cm4gVyhoKSpXKHUpPnR9ZnVuY3Rpb24gYShoKXt2YXIgdSxmLGQscCx5O3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtwPWQ9ITEseT0xfSxwb2ludDpmdW5jdGlvbihtLGcpe3ZhciBiPVttLGddLHcseD1vKG0sZyksTT1uP3g/MDpsKG0sZyk6eD9sKG0rKG08MD9YOi1YKSxnKTowO2lmKCF1JiYocD1kPXgpJiZoLmxpbmVTdGFydCgpLHghPT1kJiYodz1jKHUsYiksKCF3fHxBcih1LHcpfHxBcihiLHcpKSYmKGJbMl09MSkpLHghPT1kKXk9MCx4PyhoLmxpbmVTdGFydCgpLHc9YyhiLHUpLGgucG9pbnQod1swXSx3WzFdKSk6KHc9Yyh1LGIpLGgucG9pbnQod1swXSx3WzFdLDIpLGgubGluZUVuZCgpKSx1PXc7ZWxzZSBpZihzJiZ1JiZuXngpe3ZhciBBOyEoTSZmKSYmKEE9YyhiLHUsITApKSYmKHk9MCxuPyhoLmxpbmVTdGFydCgpLGgucG9pbnQoQVswXVswXSxBWzBdWzFdKSxoLnBvaW50KEFbMV1bMF0sQVsxXVsxXSksaC5saW5lRW5kKCkpOihoLnBvaW50KEFbMV1bMF0sQVsxXVsxXSksaC5saW5lRW5kKCksaC5saW5lU3RhcnQoKSxoLnBvaW50KEFbMF1bMF0sQVswXVsxXSwzKSkpfXgmJighdXx8IUFyKHUsYikpJiZoLnBvaW50KGJbMF0sYlsxXSksdT1iLGQ9eCxmPU19LGxpbmVFbmQ6ZnVuY3Rpb24oKXtkJiZoLmxpbmVFbmQoKSx1PW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIHl8KHAmJmQpPDwxfX19ZnVuY3Rpb24gYyhoLHUsZil7dmFyIGQ9X24oaCkscD1fbih1KSx5PVsxLDAsMF0sbT1uaShkLHApLGc9ZnIobSxtKSxiPW1bMF0sdz1nLWIqYjtpZighdylyZXR1cm4hZiYmaDt2YXIgeD10KmcvdyxNPS10KmIvdyxBPW5pKHksbSksXz1kcih5LHgpLHY9ZHIobSxNKTtQYShfLHYpO3ZhciBQPUEsej1mcihfLFApLFM9ZnIoUCxQKSxDPXoqei1TKihmcihfLF8pLTEpO2lmKCEoQzwwKSl7dmFyIEU9T2UoQyksRj1kcihQLCgtei1FKS9TKTtpZihQYShGLF8pLEY9dXIoRiksIWYpcmV0dXJuIEY7dmFyIEI9aFswXSxJPXVbMF0saz1oWzFdLEQ9dVsxXSxWO0k8QiYmKFY9QixCPUksST1WKTt2YXIgaj1JLUIsZHQ9dHQoai1YKTxLLER0PWR0fHxqPEs7aWYoIWR0JiZEPGsmJihWPWssaz1ELEQ9ViksRHQ/ZHQ/aytEPjBeRlsxXTwodHQoRlswXS1CKTxLP2s6RCk6azw9RlsxXSYmRlsxXTw9RDpqPlheKEI8PUZbMF0mJkZbMF08PUkpKXt2YXIgR3Q9ZHIoUCwoLXorRSkvUyk7cmV0dXJuIFBhKEd0LF8pLFtGLHVyKEd0KV19fX1mdW5jdGlvbiBsKGgsdSl7dmFyIGY9bj9pOlgtaSxkPTA7cmV0dXJuIGg8LWY/ZHw9MTpoPmYmJihkfD0yKSx1PC1mP2R8PTQ6dT5mJiYoZHw9OCksZH1yZXR1cm4gemgobyxhLHIsbj9bMCwtaV06Wy1YLGktWF0pfWZ1bmN0aW9uIFBwKGksdCxlLG4scyxyKXt2YXIgbz1pWzBdLGE9aVsxXSxjPXRbMF0sbD10WzFdLGg9MCx1PTEsZj1jLW8sZD1sLWEscDtpZihwPWUtbywhKCFmJiZwPjApKXtpZihwLz1mLGY8MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWVsc2UgaWYoZj4wKXtpZihwPnUpcmV0dXJuO3A+aCYmKGg9cCl9aWYocD1zLW8sISghZiYmcDwwKSl7aWYocC89ZixmPDApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1lbHNlIGlmKGY+MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWlmKHA9bi1hLCEoIWQmJnA+MCkpe2lmKHAvPWQsZDwwKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9ZWxzZSBpZihkPjApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1pZihwPXItYSwhKCFkJiZwPDApKXtpZihwLz1kLGQ8MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWVsc2UgaWYoZD4wKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9cmV0dXJuIGg+MCYmKGlbMF09bytoKmYsaVsxXT1hK2gqZCksdTwxJiYodFswXT1vK3UqZix0WzFdPWErdSpkKSwhMH19fX19dmFyIFdpPTFlOSx2cj0tV2k7ZnVuY3Rpb24gRXAoaSx0LGUsbil7ZnVuY3Rpb24gcyhsLGgpe3JldHVybiBpPD1sJiZsPD1lJiZ0PD1oJiZoPD1ufWZ1bmN0aW9uIHIobCxoLHUsZil7dmFyIGQ9MCxwPTA7aWYobD09bnVsbHx8KGQ9byhsLHUpKSE9PShwPW8oaCx1KSl8fGMobCxoKTwwXnU+MClkbyBmLnBvaW50KGQ9PT0wfHxkPT09Mz9pOmUsZD4xP246dCk7d2hpbGUoKGQ9KGQrdSs0KSU0KSE9PXApO2Vsc2UgZi5wb2ludChoWzBdLGhbMV0pfWZ1bmN0aW9uIG8obCxoKXtyZXR1cm4gdHQobFswXS1pKTxLP2g+MD8wOjM6dHQobFswXS1lKTxLP2g+MD8yOjE6dHQobFsxXS10KTxLP2g+MD8xOjA6aD4wPzM6Mn1mdW5jdGlvbiBhKGwsaCl7cmV0dXJuIGMobC54LGgueCl9ZnVuY3Rpb24gYyhsLGgpe3ZhciB1PW8obCwxKSxmPW8oaCwxKTtyZXR1cm4gdSE9PWY/dS1mOnU9PT0wP2hbMV0tbFsxXTp1PT09MT9sWzBdLWhbMF06dT09PTI/bFsxXS1oWzFdOmhbMF0tbFswXX1yZXR1cm4gZnVuY3Rpb24obCl7dmFyIGg9bCx1PUFoKCksZixkLHAseSxtLGcsYix3LHgsTSxBLF89e3BvaW50OnYsbGluZVN0YXJ0OkMsbGluZUVuZDpFLHBvbHlnb25TdGFydDp6LHBvbHlnb25FbmQ6U307ZnVuY3Rpb24gdihCLEkpe3MoQixJKSYmaC5wb2ludChCLEkpfWZ1bmN0aW9uIFAoKXtmb3IodmFyIEI9MCxJPTAsaz1kLmxlbmd0aDtJPGs7KytJKWZvcih2YXIgRD1kW0ldLFY9MSxqPUQubGVuZ3RoLGR0PURbMF0sRHQsR3QsWnQ9ZHRbMF0sbWU9ZHRbMV07VjxqOysrVilEdD1adCxHdD1tZSxkdD1EW1ZdLFp0PWR0WzBdLG1lPWR0WzFdLEd0PD1uP21lPm4mJihadC1EdCkqKG4tR3QpPihtZS1HdCkqKGktRHQpJiYrK0I6bWU8PW4mJihadC1EdCkqKG4tR3QpPChtZS1HdCkqKGktRHQpJiYtLUI7cmV0dXJuIEJ9ZnVuY3Rpb24geigpe2g9dSxmPVtdLGQ9W10sQT0hMH1mdW5jdGlvbiBTKCl7dmFyIEI9UCgpLEk9QSYmQixrPShmPVVpKGYpKS5sZW5ndGg7KEl8fGspJiYobC5wb2x5Z29uU3RhcnQoKSxJJiYobC5saW5lU3RhcnQoKSxyKG51bGwsbnVsbCwxLGwpLGwubGluZUVuZCgpKSxrJiZfaChmLGEsQixyLGwpLGwucG9seWdvbkVuZCgpKSxoPWwsZj1kPXA9bnVsbH1mdW5jdGlvbiBDKCl7Xy5wb2ludD1GLGQmJmQucHVzaChwPVtdKSxNPSEwLHg9ITEsYj13PU5hTn1mdW5jdGlvbiBFKCl7ZiYmKEYoeSxtKSxnJiZ4JiZ1LnJlam9pbigpLGYucHVzaCh1LnJlc3VsdCgpKSksXy5wb2ludD12LHgmJmgubGluZUVuZCgpfWZ1bmN0aW9uIEYoQixJKXt2YXIgaz1zKEIsSSk7aWYoZCYmcC5wdXNoKFtCLEldKSxNKXk9QixtPUksZz1rLE09ITEsayYmKGgubGluZVN0YXJ0KCksaC5wb2ludChCLEkpKTtlbHNlIGlmKGsmJngpaC5wb2ludChCLEkpO2Vsc2V7dmFyIEQ9W2I9TWF0aC5tYXgodnIsTWF0aC5taW4oV2ksYikpLHc9TWF0aC5tYXgodnIsTWF0aC5taW4oV2ksdykpXSxWPVtCPU1hdGgubWF4KHZyLE1hdGgubWluKFdpLEIpKSxJPU1hdGgubWF4KHZyLE1hdGgubWluKFdpLEkpKV07UHAoRCxWLGksdCxlLG4pPyh4fHwoaC5saW5lU3RhcnQoKSxoLnBvaW50KERbMF0sRFsxXSkpLGgucG9pbnQoVlswXSxWWzFdKSxrfHxoLmxpbmVFbmQoKSxBPSExKTprJiYoaC5saW5lU3RhcnQoKSxoLnBvaW50KEIsSSksQT0hMSl9Yj1CLHc9SSx4PWt9cmV0dXJuIF99fXZhciBMYSxPYSxTcix6cixzaT17c3BoZXJlOnZ0LHBvaW50OnZ0LGxpbmVTdGFydDpDcCxsaW5lRW5kOnZ0LHBvbHlnb25TdGFydDp2dCxwb2x5Z29uRW5kOnZ0fTtmdW5jdGlvbiBDcCgpe3NpLnBvaW50PUZwLHNpLmxpbmVFbmQ9QnB9ZnVuY3Rpb24gQnAoKXtzaS5wb2ludD1zaS5saW5lRW5kPXZ0fWZ1bmN0aW9uIEZwKGksdCl7aSo9SCx0Kj1ILE9hPWksU3I9cSh0KSx6cj1XKHQpLHNpLnBvaW50PUlwfWZ1bmN0aW9uIElwKGksdCl7aSo9SCx0Kj1IO3ZhciBlPXEodCksbj1XKHQpLHM9dHQoaS1PYSkscj1XKHMpLG89cShzKSxhPW4qbyxjPXpyKmUtU3IqbipyLGw9U3IqZSt6cipuKnI7TGEuYWRkKHJlKE9lKGEqYStjKmMpLGwpKSxPYT1pLFNyPWUsenI9bn1mdW5jdGlvbiBrcChpKXtyZXR1cm4gTGE9bmV3IExlLGxyKGksc2kpLCtMYX12YXIgRGE9W251bGwsbnVsbF0sTnA9e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOkRhfTtmdW5jdGlvbiByaShpLHQpe3JldHVybiBEYVswXT1pLERhWzFdPXQsa3AoTnApfXZhciBQaD17RmVhdHVyZTpmdW5jdGlvbihpLHQpe3JldHVybiBUcihpLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmZlYXR1cmVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoVHIoZVtuXS5nZW9tZXRyeSx0KSlyZXR1cm4hMDtyZXR1cm4hMX19LEVoPXtTcGhlcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUG9pbnQ6ZnVuY3Rpb24oaSx0KXtyZXR1cm4gQ2goaS5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2ludDpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoQ2goZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe3JldHVybiBCaChpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWlmKEJoKGVbbl0sdCkpcmV0dXJuITA7cmV0dXJuITF9LFBvbHlnb246ZnVuY3Rpb24oaSx0KXtyZXR1cm4gRmgoaS5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZihGaChlW25dLHQpKXJldHVybiEwO3JldHVybiExfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5nZW9tZXRyaWVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoVHIoZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX19O2Z1bmN0aW9uIFRyKGksdCl7cmV0dXJuIGkmJkVoLmhhc093blByb3BlcnR5KGkudHlwZSk/RWhbaS50eXBlXShpLHQpOiExfWZ1bmN0aW9uIENoKGksdCl7cmV0dXJuIHJpKGksdCk9PT0wfWZ1bmN0aW9uIEJoKGksdCl7Zm9yKHZhciBlLG4scyxyPTAsbz1pLmxlbmd0aDtyPG87cisrKXtpZihuPXJpKGlbcl0sdCksbj09PTB8fHI+MCYmKHM9cmkoaVtyXSxpW3ItMV0pLHM+MCYmZTw9cyYmbjw9cyYmKGUrbi1zKSooMS1NYXRoLnBvdygoZS1uKS9zLDIpKTxvcipzKSlyZXR1cm4hMDtlPW59cmV0dXJuITF9ZnVuY3Rpb24gRmgoaSx0KXtyZXR1cm4hIVNoKGkubWFwKFJwKSxJaCh0KSl9ZnVuY3Rpb24gUnAoaSl7cmV0dXJuIGk9aS5tYXAoSWgpLGkucG9wKCksaX1mdW5jdGlvbiBJaChpKXtyZXR1cm5baVswXSpILGlbMV0qSF19ZnVuY3Rpb24gTHAoaSx0KXtyZXR1cm4oaSYmUGguaGFzT3duUHJvcGVydHkoaS50eXBlKT9QaFtpLnR5cGVdOlRyKShpLHQpfWZ1bmN0aW9uIE9wKGksdCl7dmFyIGU9aVswXSpILG49aVsxXSpILHM9dFswXSpILHI9dFsxXSpILG89VyhuKSxhPXEobiksYz1XKHIpLGw9cShyKSxoPW8qVyhlKSx1PW8qcShlKSxmPWMqVyhzKSxkPWMqcShzKSxwPTIqRGUoT2UoWGwoci1uKStvKmMqWGwocy1lKSkpLHk9cShwKSxtPXA/ZnVuY3Rpb24oZyl7dmFyIGI9cShnKj1wKS95LHc9cShwLWcpL3kseD13KmgrYipmLE09dyp1K2IqZCxBPXcqYStiKmw7cmV0dXJuW3JlKE0seCkqaHQscmUoQSxPZSh4KngrTSpNKSkqaHRdfTpmdW5jdGlvbigpe3JldHVybltlKmh0LG4qaHRdfTtyZXR1cm4gbS5kaXN0YW5jZT1wLG19dmFyIGtoPWk9Pmksb2k9MS8wLFByPW9pLEdpPS1vaSxFcj1HaSxOaD17cG9pbnQ6RHAsbGluZVN0YXJ0OnZ0LGxpbmVFbmQ6dnQscG9seWdvblN0YXJ0OnZ0LHBvbHlnb25FbmQ6dnQscmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGk9W1tvaSxQcl0sW0dpLEVyXV07cmV0dXJuIEdpPUVyPS0oUHI9b2k9MS8wKSxpfX07ZnVuY3Rpb24gRHAoaSx0KXtpPG9pJiYob2k9aSksaT5HaSYmKEdpPWkpLHQ8UHImJihQcj10KSx0PkVyJiYoRXI9dCl9ZnVuY3Rpb24gJGEoaSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBVYTtmb3IodmFyIG4gaW4gaSllW25dPWlbbl07cmV0dXJuIGUuc3RyZWFtPXQsZX19ZnVuY3Rpb24gVWEoKXt9VWEucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpVYSxwb2ludDpmdW5jdGlvbihpLHQpe3RoaXMuc3RyZWFtLnBvaW50KGksdCl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBWYShpLHQsZSl7dmFyIG49aS5jbGlwRXh0ZW50JiZpLmNsaXBFeHRlbnQoKTtyZXR1cm4gaS5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbiE9bnVsbCYmaS5jbGlwRXh0ZW50KG51bGwpLGxyKGUsaS5zdHJlYW0oTmgpKSx0KE5oLnJlc3VsdCgpKSxuIT1udWxsJiZpLmNsaXBFeHRlbnQobiksaX1mdW5jdGlvbiBSaChpLHQsZSl7cmV0dXJuIFZhKGksZnVuY3Rpb24obil7dmFyIHM9dFsxXVswXS10WzBdWzBdLHI9dFsxXVsxXS10WzBdWzFdLG89TWF0aC5taW4ocy8oblsxXVswXS1uWzBdWzBdKSxyLyhuWzFdWzFdLW5bMF1bMV0pKSxhPSt0WzBdWzBdKyhzLW8qKG5bMV1bMF0rblswXVswXSkpLzIsYz0rdFswXVsxXSsoci1vKihuWzFdWzFdK25bMF1bMV0pKS8yO2kuc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSxjXSl9LGUpfWZ1bmN0aW9uICRwKGksdCxlKXtyZXR1cm4gUmgoaSxbWzAsMF0sdF0sZSl9ZnVuY3Rpb24gVXAoaSx0LGUpe3JldHVybiBWYShpLGZ1bmN0aW9uKG4pe3ZhciBzPSt0LHI9cy8oblsxXVswXS1uWzBdWzBdKSxvPShzLXIqKG5bMV1bMF0rblswXVswXSkpLzIsYT0tcipuWzBdWzFdO2kuc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfWZ1bmN0aW9uIFZwKGksdCxlKXtyZXR1cm4gVmEoaSxmdW5jdGlvbihuKXt2YXIgcz0rdCxyPXMvKG5bMV1bMV0tblswXVsxXSksbz0tcipuWzBdWzBdLGE9KHMtciooblsxXVsxXStuWzBdWzFdKSkvMjtpLnNjYWxlKDE1MCpyKS50cmFuc2xhdGUoW28sYV0pfSxlKX12YXIgTGg9MTYscXA9VygzMCpIKTtmdW5jdGlvbiBPaChpLHQpe3JldHVybit0P1dwKGksdCk6SHAoaSl9ZnVuY3Rpb24gSHAoaSl7cmV0dXJuICRhKHtwb2ludDpmdW5jdGlvbih0LGUpe3Q9aSh0LGUpLHRoaXMuc3RyZWFtLnBvaW50KHRbMF0sdFsxXSl9fSl9ZnVuY3Rpb24gV3AoaSx0KXtmdW5jdGlvbiBlKG4scyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksbSl7dmFyIGc9bC1uLGI9aC1zLHc9ZypnK2IqYjtpZih3PjQqdCYmeS0tKXt2YXIgeD1vK2YsTT1hK2QsQT1jK3AsXz1PZSh4KngrTSpNK0EqQSksdj1EZShBLz1fKSxQPXR0KHR0KEEpLTEpPEt8fHR0KHItdSk8Sz8ocit1KS8yOnJlKE0seCksej1pKFAsdiksUz16WzBdLEM9elsxXSxFPVMtbixGPUMtcyxCPWIqRS1nKkY7KEIqQi93PnR8fHR0KChnKkUrYipGKS93LS41KT4uM3x8bypmK2EqZCtjKnA8cXApJiYoZShuLHMscixvLGEsYyxTLEMsUCx4Lz1fLE0vPV8sQSx5LG0pLG0ucG9pbnQoUyxDKSxlKFMsQyxQLHgsTSxBLGwsaCx1LGYsZCxwLHksbSkpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHMscixvLGEsYyxsLGgsdSxmLGQscCx5LG09e3BvaW50OmcsbGluZVN0YXJ0OmIsbGluZUVuZDp4LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksbS5saW5lU3RhcnQ9TX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLG0ubGluZVN0YXJ0PWJ9fTtmdW5jdGlvbiBnKHYsUCl7dj1pKHYsUCksbi5wb2ludCh2WzBdLHZbMV0pfWZ1bmN0aW9uIGIoKXt1PU5hTixtLnBvaW50PXcsbi5saW5lU3RhcnQoKX1mdW5jdGlvbiB3KHYsUCl7dmFyIHo9X24oW3YsUF0pLFM9aSh2LFApO2UodSxmLGgsZCxwLHksdT1TWzBdLGY9U1sxXSxoPXYsZD16WzBdLHA9elsxXSx5PXpbMl0sTGgsbiksbi5wb2ludCh1LGYpfWZ1bmN0aW9uIHgoKXttLnBvaW50PWcsbi5saW5lRW5kKCl9ZnVuY3Rpb24gTSgpe2IoKSxtLnBvaW50PUEsbS5saW5lRW5kPV99ZnVuY3Rpb24gQSh2LFApe3cocz12LFApLHI9dSxvPWYsYT1kLGM9cCxsPXksbS5wb2ludD13fWZ1bmN0aW9uIF8oKXtlKHUsZixoLGQscCx5LHIsbyxzLGEsYyxsLExoLG4pLG0ubGluZUVuZD14LHgoKX1yZXR1cm4gbX19dmFyIEdwPSRhKHtwb2ludDpmdW5jdGlvbihpLHQpe3RoaXMuc3RyZWFtLnBvaW50KGkqSCx0KkgpfX0pO2Z1bmN0aW9uIFpwKGkpe3JldHVybiAkYSh7cG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgbj1pKHQsZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9ZnVuY3Rpb24gWHAoaSx0LGUsbixzKXtmdW5jdGlvbiByKG8sYSl7cmV0dXJuIG8qPW4sYSo9cyxbdCtpKm8sZS1pKmFdfXJldHVybiByLmludmVydD1mdW5jdGlvbihvLGEpe3JldHVyblsoby10KS9pKm4sKGUtYSkvaSpzXX0scn1mdW5jdGlvbiBEaChpLHQsZSxuLHMscil7aWYoIXIpcmV0dXJuIFhwKGksdCxlLG4scyk7dmFyIG89VyhyKSxhPXEociksYz1vKmksbD1hKmksaD1vL2ksdT1hL2ksZj0oYSplLW8qdCkvaSxkPShhKnQrbyplKS9pO2Z1bmN0aW9uIHAoeSxtKXtyZXR1cm4geSo9bixtKj1zLFtjKnktbCptK3QsZS1sKnktYyptXX1yZXR1cm4gcC5pbnZlcnQ9ZnVuY3Rpb24oeSxtKXtyZXR1cm5bbiooaCp5LXUqbStmKSxzKihkLXUqeS1oKm0pXX0scH1mdW5jdGlvbiBDcihpKXtyZXR1cm4gSnAoZnVuY3Rpb24oKXtyZXR1cm4gaX0pKCl9ZnVuY3Rpb24gSnAoaSl7dmFyIHQsZT0xNTAsbj00ODAscz0yNTAscj0wLG89MCxhPTAsYz0wLGw9MCxoLHU9MCxmPTEsZD0xLHA9bnVsbCx5PVRoLG09bnVsbCxnLGIsdyx4PWtoLE09LjUsQSxfLHYsUCx6O2Z1bmN0aW9uIFMoQil7cmV0dXJuIHYoQlswXSpILEJbMV0qSCl9ZnVuY3Rpb24gQyhCKXtyZXR1cm4gQj12LmludmVydChCWzBdLEJbMV0pLEImJltCWzBdKmh0LEJbMV0qaHRdfVMuc3RyZWFtPWZ1bmN0aW9uKEIpe3JldHVybiBQJiZ6PT09Qj9QOlA9R3AoWnAoaCkoeShBKHgoej1CKSkpKSl9LFMucHJlY2xpcD1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1CLHA9dm9pZCAwLEYoKSk6eX0sUy5wb3N0Y2xpcD1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1CLG09Zz1iPXc9bnVsbCxGKCkpOnh9LFMuY2xpcEFuZ2xlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PStCP1RwKHA9QipIKToocD1udWxsLFRoKSxGKCkpOnAqaHR9LFMuY2xpcEV4dGVudD1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1CPT1udWxsPyhtPWc9Yj13PW51bGwsa2gpOkVwKG09K0JbMF1bMF0sZz0rQlswXVsxXSxiPStCWzFdWzBdLHc9K0JbMV1bMV0pLEYoKSk6bT09bnVsbD9udWxsOltbbSxnXSxbYix3XV19LFMuc2NhbGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K0IsRSgpKTplfSxTLnRyYW5zbGF0ZT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rQlswXSxzPStCWzFdLEUoKSk6W24sc119LFMuY2VudGVyPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUJbMF0lMzYwKkgsbz1CWzFdJTM2MCpILEUoKSk6W3IqaHQsbypodF19LFMucm90YXRlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUJbMF0lMzYwKkgsYz1CWzFdJTM2MCpILGw9Qi5sZW5ndGg+Mj9CWzJdJTM2MCpIOjAsRSgpKTpbYSpodCxjKmh0LGwqaHRdfSxTLmFuZ2xlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PUIlMzYwKkgsRSgpKTp1Kmh0fSxTLnJlZmxlY3RYPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPUI/LTE6MSxFKCkpOmY8MH0sUy5yZWZsZWN0WT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1CPy0xOjEsRSgpKTpkPDB9LFMucHJlY2lzaW9uPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPU9oKF8sTT1CKkIpLEYoKSk6T2UoTSl9LFMuZml0RXh0ZW50PWZ1bmN0aW9uKEIsSSl7cmV0dXJuIFJoKFMsQixJKX0sUy5maXRTaXplPWZ1bmN0aW9uKEIsSSl7cmV0dXJuICRwKFMsQixJKX0sUy5maXRXaWR0aD1mdW5jdGlvbihCLEkpe3JldHVybiBVcChTLEIsSSl9LFMuZml0SGVpZ2h0PWZ1bmN0aW9uKEIsSSl7cmV0dXJuIFZwKFMsQixJKX07ZnVuY3Rpb24gRSgpe3ZhciBCPURoKGUsMCwwLGYsZCx1KS5hcHBseShudWxsLHQocixvKSksST1EaChlLG4tQlswXSxzLUJbMV0sZixkLHUpO3JldHVybiBoPW1oKGEsYyxsKSxfPWthKHQsSSksdj1rYShoLF8pLEE9T2goXyxNKSxGKCl9ZnVuY3Rpb24gRigpe3JldHVybiBQPXo9bnVsbCxTfXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLFMuaW52ZXJ0PXQuaW52ZXJ0JiZDLEUoKX19ZnVuY3Rpb24gWXAoaSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49T2UodCp0K2UqZSkscz1pKG4pLHI9cShzKSxvPVcocyk7cmV0dXJuW3JlKHQqcixuKm8pLERlKG4mJmUqci9uKV19fWZ1bmN0aW9uIHFhKGksdCl7cmV0dXJuW2ksb3AoY3AoKE50K3QpLzIpKV19cWEuaW52ZXJ0PWZ1bmN0aW9uKGksdCl7cmV0dXJuW2ksMipBYShycCh0KSktTnRdfTtmdW5jdGlvbiBqcCgpe3JldHVybiBRcChxYSkuc2NhbGUoOTYxL1J0KX1mdW5jdGlvbiBRcChpKXt2YXIgdD1DcihpKSxlPXQuY2VudGVyLG49dC5zY2FsZSxzPXQudHJhbnNsYXRlLHI9dC5jbGlwRXh0ZW50LG89bnVsbCxhLGMsbDt0LnNjYWxlPWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuKHUpLGgoKSk6bigpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocyh1KSxoKCkpOnMoKX0sdC5jZW50ZXI9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGUodSksaCgpKTplKCl9LHQuY2xpcEV4dGVudD1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT09bnVsbD9vPWE9Yz1sPW51bGw6KG89K3VbMF1bMF0sYT0rdVswXVsxXSxjPSt1WzFdWzBdLGw9K3VbMV1bMV0pLGgoKSk6bz09bnVsbD9udWxsOltbbyxhXSxbYyxsXV19O2Z1bmN0aW9uIGgoKXt2YXIgdT1YKm4oKSxmPXQoYmgodC5yb3RhdGUoKSkuaW52ZXJ0KFswLDBdKSk7cmV0dXJuIHIobz09bnVsbD9bW2ZbMF0tdSxmWzFdLXVdLFtmWzBdK3UsZlsxXSt1XV06aT09PXFhP1tbTWF0aC5tYXgoZlswXS11LG8pLGFdLFtNYXRoLm1pbihmWzBdK3UsYyksbF1dOltbbyxNYXRoLm1heChmWzFdLXUsYSldLFtjLE1hdGgubWluKGZbMV0rdSxsKV1dKX1yZXR1cm4gaCgpfWZ1bmN0aW9uIEhhKGksdCl7cmV0dXJuW2ksdF19SGEuaW52ZXJ0PUhhO2Z1bmN0aW9uIEtwKCl7cmV0dXJuIENyKEhhKS5zY2FsZSgxNTIuNjMpfWZ1bmN0aW9uICRoKGksdCl7dmFyIGU9Vyh0KSxuPTErVyhpKSplO3JldHVybltlKnEoaSkvbixxKHQpL25dfSRoLmludmVydD1ZcChmdW5jdGlvbihpKXtyZXR1cm4gMipBYShpKX0pO2Z1bmN0aW9uIHR5KCl7cmV0dXJuIENyKCRoKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfXZhciBCcj1NYXRoLmFicyxhaT1NYXRoLmNvcyxiZT1NYXRoLnNpbixaaT0xZS02LEZyPU1hdGguUEksV2E9RnIvMjtmdW5jdGlvbiBleShpKXtyZXR1cm4gaT9pL01hdGguc2luKGkpOjF9ZnVuY3Rpb24gR2EoaSl7cmV0dXJuIGk+MT8wOmk8LTE/RnI6TWF0aC5hY29zKGkpfWZ1bmN0aW9uIFVoKGkpe3JldHVybiBpPjA/TWF0aC5zcXJ0KGkpOjB9ZnVuY3Rpb24gVmgoaSx0KXt2YXIgZT1haSh0KSxuPWV5KEdhKGUqYWkoaS89MikpKTtyZXR1cm5bMiplKmJlKGkpKm4sYmUodCkqbl19VmguaW52ZXJ0PWZ1bmN0aW9uKGksdCl7aWYoIShpKmkrNCp0KnQ+RnIqRnIrWmkpKXt2YXIgZT1pLG49dCxzPTI1O2Rve3ZhciByPWJlKGUpLG89YmUoZS8yKSxhPWFpKGUvMiksYz1iZShuKSxsPWFpKG4pLGg9YmUoMipuKSx1PWMqYyxmPWwqbCxkPW8qbyxwPTEtZiphKmEseT1wP0dhKGwqYSkqVWgobT0xL3ApOm09MCxtLGc9Mip5Kmwqby1pLGI9eSpjLXQsdz1tKihmKmQreSpsKmEqdSkseD1tKiguNSpyKmgteSoyKmMqbyksTT1tKi4yNSooaCpvLXkqYypmKnIpLEE9bSoodSphK3kqZCpsKSxfPXgqTS1BKnc7aWYoIV8pYnJlYWs7dmFyIHY9KGIqeC1nKkEpL18sUD0oZypNLWIqdykvXztlLT12LG4tPVB9d2hpbGUoKEJyKHYpPlppfHxCcihQKT5aaSkmJi0tcz4wKTtyZXR1cm5bZSxuXX19O2Z1bmN0aW9uIHFoKGksdCl7dmFyIGU9VmgoaSx0KTtyZXR1cm5bKGVbMF0raS9XYSkvMiwoZVsxXSt0KS8yXX1xaC5pbnZlcnQ9ZnVuY3Rpb24oaSx0KXt2YXIgZT1pLG49dCxzPTI1O2Rve3ZhciByPWFpKG4pLG89YmUobiksYT1iZSgyKm4pLGM9bypvLGw9cipyLGg9YmUoZSksdT1haShlLzIpLGY9YmUoZS8yKSxkPWYqZixwPTEtbCp1KnUseT1wP0dhKHIqdSkqVWgobT0xL3ApOm09MCxtLGc9LjUqKDIqeSpyKmYrZS9XYSktaSxiPS41Kih5Km8rbiktdCx3PS41Km0qKGwqZCt5KnIqdSpjKSsuNS9XYSx4PW0qKGgqYS80LXkqbypmKSxNPS4xMjUqbSooYSpmLXkqbypsKmgpLEE9LjUqbSooYyp1K3kqZCpyKSsuNSxfPXgqTS1BKncsdj0oYip4LWcqQSkvXyxQPShnKk0tYip3KS9fO2UtPXYsbi09UH13aGlsZSgoQnIodik+Wml8fEJyKFApPlppKSYmLS1zPjApO3JldHVybltlLG5dfTtmdW5jdGlvbiBueSgpe3JldHVybiBDcihxaCkuc2NhbGUoMTU4LjgzNyl9Y29uc3QgaXk9e21lcmNhdG9yOmpwLGVxdWlyZWN0YW5ndWxhcjpLcCx3aW5rZWwzOm55fSxaYT17fSxYaT1pPT57dmFyIG4scyxyO2NvbnN0IHQ9SlNPTi5zdHJpbmdpZnkoaSk7aWYoWmFbdF0pcmV0dXJuIFphW3RdO2NvbnN0IGU9aXlbKG49aS5wcm9qZWN0aW9uVHlwZSkhPW51bGw/bjoibWVyY2F0b3IiXSgpLmNlbnRlcihpLmNlbnRlcikuc2NhbGUoaS5zY2FsZSkudHJhbnNsYXRlKChzPWkudHJhbnNsYXRlKSE9bnVsbD9zOlswLDBdKS5wcmVjaXNpb24oKHI9aS5wcmVjaXNpb24pIT1udWxsP3I6LjEpO3JldHVybiBpLnJvdGF0ZSYmZS5yb3RhdGUoaS5yb3RhdGUpLFphW3RdPWUsZX0sSXI9KGksdCk9PmkubWFwKChbZSxuXSk9PntsZXQgcztpZih0KXtjb25zdFtyLG9dPXQoW2Usbl0pO3M9bmV3IFIociwtbyl9ZWxzZSBzPW5ldyBSKGUsbik7cmV0dXJuIHN9KTt2YXIgSmk9KGksdCk9Pntjb25zdCBlPUdsKGksdCE9bnVsbD90OjApLG49e30scz1bXSxyPU9iamVjdC5rZXlzKGUuYXR0cmlidXRlcyk7cmV0dXJuIGUuaW5kZXgmJnIucHVzaCgiaW5kZXgiKSxyLmZvckVhY2gobz0+e2NvbnN0IGE9bz09PSJpbmRleCI/ZS5pbmRleDplLmF0dHJpYnV0ZXNbb107bltvXT17YXJyYXk6YS5hcnJheSxpdGVtU2l6ZTphLml0ZW1TaXplfSxzLnB1c2goYS5hcnJheS5idWZmZXIpfSksdCYmKG4uZ3JvdXBzPWUuZ3JvdXBzKSxlLmRpc3Bvc2UoKSxpLmZvckVhY2gobz0+e28uZGlzcG9zZSgpfSkse21lc3NhZ2U6bix0cmFuc2ZlcjpzfX0sWGE9KGksdD0zMDApPT57Y29uc3QgZT1bXTtyZXR1cm4gaS5mb3JFYWNoKG49PntsZXQgcz0hMTtmb3IobGV0IHI9MTtyPG4ubGVuZ3RoO3IrKylpZihNYXRoLmFicyhuW3JdLngtbltyLTFdLngpPnQpe3M9ITA7YnJlYWt9aWYocyl7Y29uc3Qgcj1bXSxvPVtdO24uZm9yRWFjaChhPT57YS54PDA/ci5wdXNoKGEpOm8ucHVzaChhKX0pLGUucHVzaChyLG8pfWVsc2UgZS5wdXNoKG4pfSksZX07ZnVuY3Rpb24gc3koaSx0LGU9MCl7Y29uc3RbbixzLHIsb109aTtsZXQgYT0xLzAsYz0xLzAsbD0tMS8wLGg9LTEvMDtmb3IobGV0IHU9MDt1PD1lO3UrKyl7Y29uc3QgZj1lJiZ1L2U7SXIoW1tuK2YqKHItbiksc10sW24rZiooci1uKSxvXSxbbixzK2YqKG8tcyldLFtyLHMrZiooby1zKV1dLHQpLmZvckVhY2goZD0+e2E9TWF0aC5taW4oYSxkLngpLGM9TWF0aC5taW4oYyxkLnkpLGw9TWF0aC5tYXgobCxkLngpLGg9TWF0aC5tYXgoaCxkLnkpfSl9cmV0dXJuW1thLGNdLFtsLGhdXX1jb25zdCByeT0oe2Nvb3JkaW5hdGVzQXJyOmksc3BsaXQ6dCxzaWRlUmVwZWF0OmUsYmJveDpuLGRlcHRoOnMscHJvamVjdGlvbjpyLHVzZUdyb3VwczpvLGhhc1RvcDphLGhhc0JvdHRvbTpjLGhhc1NpZGU6bCxzcGxpdFBvbHlnb25zOmgsdG9wU2VnbWVudHM6dX0pPT57Y29uc3QgZj1yJiZYaShyKTtsZXQgZD1pLm1hcChtPT5JcihtLGYpKTtoJiYoZD1YYShkLGgpKTtsZXQgcDtpZihuKXtjb25zdFttLGddPXN5KG4sciE9bnVsbCYmci5yb3RhdGU/WGkoWmUoRnQoe30scikse3JvdGF0ZTp2b2lkIDB9KSk6Ziwocj09bnVsbD92b2lkIDA6ci5wcm9qZWN0aW9uVHlwZSk9PT0id2lua2VsMyI/MTA6MCk7cD1uZXcgZ3QobmV3IFQobVswXSxtWzFdLDApLG5ldyBUKGdbMF0sZ1sxXSwwKSl9Y29uc3QgeT1kLm1hcCgobSxnKT0+e3ZhciBiO3JldHVybiBHMCh7cG9pbnRzOm0sc3BsaXQ6dCxzaWRlUmVwZWF0OmUsZGVwdGg6KGI9c1tnXSkhPW51bGw/YjpzWzBdLGhhc1RvcDphLGhhc0JvdHRvbTpjLGhhc1NpZGU6bCxib3gzOnAsdG9wU2VnbWVudHM6dX0pfSk7cmV0dXJuIEppKHksbyl9O2Z1bmN0aW9uIEphKGksdCxlLG4scyl7bGV0IHI7aWYoaT1pLnN1YmFycmF5fHxpLnNsaWNlP2k6aS5idWZmZXIsZT1lLnN1YmFycmF5fHxlLnNsaWNlP2U6ZS5idWZmZXIsaT10P2kuc3ViYXJyYXk/aS5zdWJhcnJheSh0LHMmJnQrcyk6aS5zbGljZSh0LHMmJnQrcyk6aSxlLnNldCllLnNldChpLG4pO2Vsc2UgZm9yKHI9MDtyPGkubGVuZ3RoO3IrKyllW3Irbl09aVtyXTtyZXR1cm4gZX1mdW5jdGlvbiBveShpKXtyZXR1cm4gaSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheT9pOmkgaW5zdGFuY2VvZiB1ZT9pLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5hcnJheTppLm1hcCh0PT57Y29uc3QgZT1BcnJheS5pc0FycmF5KHQpO3JldHVybiB0IGluc3RhbmNlb2YgVD9bdC54LHQueSx0LnpdOnQgaW5zdGFuY2VvZiBSP1t0LngsdC55LDBdOmUmJnQubGVuZ3RoPT09Mz9bdFswXSx0WzFdLHRbMl1dOmUmJnQubGVuZ3RoPT09Mj9bdFswXSx0WzFdLDBdOnR9KS5mbGF0KCl9Y2xhc3MgYXkgZXh0ZW5kcyB1ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJNZXNoTGluZSIsdGhpcy5pc01lc2hMaW5lPSEwLHRoaXMucG9zaXRpb25zPVtdLHRoaXMucHJldmlvdXM9W10sdGhpcy5uZXh0PVtdLHRoaXMuc2lkZT1bXSx0aGlzLndpZHRoPVtdLHRoaXMuaW5kaWNlc19hcnJheT1bXSx0aGlzLnV2cz1bXSx0aGlzLmNvdW50ZXJzPVtdLHRoaXMud2lkdGhDYWxsYmFjaz1udWxsLHRoaXMuX3BvaW50cz1bXSx0aGlzLm1hdHJpeFdvcmxkPW5ldyBzdCxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb2ludHM6e2VudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIHRoaXMuX3BvaW50c30sc2V0KHQpe3RoaXMuc2V0UG9pbnRzKHQsdGhpcy53aWR0aENhbGxiYWNrKX19fSl9c2V0TWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhXb3JsZD10fXNldFBvaW50cyh0LGUpe2lmKHQ9b3kodCksdGhpcy5fcG9pbnRzPXQsdGhpcy53aWR0aENhbGxiYWNrPWUhPW51bGw/ZTpudWxsLHRoaXMucG9zaXRpb25zPVtdLHRoaXMuY291bnRlcnM9W10sdC5sZW5ndGgmJnRbMF1pbnN0YW5jZW9mIFQpZm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHM9dFtuXSxyPW4vKHQubGVuZ3RoLTEpO3RoaXMucG9zaXRpb25zLnB1c2gocy54LHMueSxzLnopLHRoaXMucG9zaXRpb25zLnB1c2gocy54LHMueSxzLnopLHRoaXMuY291bnRlcnMucHVzaChyKSx0aGlzLmNvdW50ZXJzLnB1c2gocil9ZWxzZSBmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rPTMpe2NvbnN0IHM9bi8odC5sZW5ndGgtMSk7dGhpcy5wb3NpdGlvbnMucHVzaCh0W25dLHRbbisxXSx0W24rMl0pLHRoaXMucG9zaXRpb25zLnB1c2godFtuXSx0W24rMV0sdFtuKzJdKSx0aGlzLmNvdW50ZXJzLnB1c2gocyksdGhpcy5jb3VudGVycy5wdXNoKHMpfXRoaXMucHJvY2VzcygpfWNvbXBhcmVWMyh0LGUpe2NvbnN0IG49dCo2LHM9ZSo2O3JldHVybiB0aGlzLnBvc2l0aW9uc1tuXT09PXRoaXMucG9zaXRpb25zW3NdJiZ0aGlzLnBvc2l0aW9uc1tuKzFdPT09dGhpcy5wb3NpdGlvbnNbcysxXSYmdGhpcy5wb3NpdGlvbnNbbisyXT09PXRoaXMucG9zaXRpb25zW3MrMl19Y29weVYzKHQpe2NvbnN0IGU9dCo2O3JldHVyblt0aGlzLnBvc2l0aW9uc1tlXSx0aGlzLnBvc2l0aW9uc1tlKzFdLHRoaXMucG9zaXRpb25zW2UrMl1dfXByb2Nlc3MoKXtjb25zdCB0PXRoaXMucG9zaXRpb25zLmxlbmd0aC82O3RoaXMucHJldmlvdXM9W10sdGhpcy5uZXh0PVtdLHRoaXMuc2lkZT1bXSx0aGlzLndpZHRoPVtdLHRoaXMuaW5kaWNlc19hcnJheT1bXSx0aGlzLnV2cz1bXTtsZXQgZSxuO3RoaXMuY29tcGFyZVYzKDAsdC0xKT9uPXRoaXMuY29weVYzKHQtMik6bj10aGlzLmNvcHlWMygwKSx0aGlzLnByZXZpb3VzLnB1c2goblswXSxuWzFdLG5bMl0pLHRoaXMucHJldmlvdXMucHVzaChuWzBdLG5bMV0sblsyXSk7Zm9yKGxldCBzPTA7czx0O3MrKyl7aWYodGhpcy5zaWRlLnB1c2goMSksdGhpcy5zaWRlLnB1c2goLTEpLHRoaXMud2lkdGhDYWxsYmFjaz9lPXRoaXMud2lkdGhDYWxsYmFjayhzLyh0LTEpKTplPTEsdGhpcy53aWR0aC5wdXNoKGUpLHRoaXMud2lkdGgucHVzaChlKSx0aGlzLnV2cy5wdXNoKHMvKHQtMSksMCksdGhpcy51dnMucHVzaChzLyh0LTEpLDEpLHM8dC0xKXtuPXRoaXMuY29weVYzKHMpLHRoaXMucHJldmlvdXMucHVzaChuWzBdLG5bMV0sblsyXSksdGhpcy5wcmV2aW91cy5wdXNoKG5bMF0sblsxXSxuWzJdKTtjb25zdCByPXMqMjt0aGlzLmluZGljZXNfYXJyYXkucHVzaChyLHIrMSxyKzIpLHRoaXMuaW5kaWNlc19hcnJheS5wdXNoKHIrMixyKzEsciszKX1zPjAmJihuPXRoaXMuY29weVYzKHMpLHRoaXMubmV4dC5wdXNoKG5bMF0sblsxXSxuWzJdKSx0aGlzLm5leHQucHVzaChuWzBdLG5bMV0sblsyXSkpfXRoaXMuY29tcGFyZVYzKHQtMSwwKT9uPXRoaXMuY29weVYzKDEpOm49dGhpcy5jb3B5VjModC0xKSx0aGlzLm5leHQucHVzaChuWzBdLG5bMV0sblsyXSksdGhpcy5uZXh0LnB1c2goblswXSxuWzFdLG5bMl0pLCF0aGlzLl9hdHRyaWJ1dGVzfHx0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50IT09dGhpcy5jb3VudGVycy5sZW5ndGg/dGhpcy5fYXR0cmlidXRlcz17cG9zaXRpb246bmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb3NpdGlvbnMpLDMpLHByZXZpb3VzOm5ldyB4dChuZXcgRmxvYXQzMkFycmF5KHRoaXMucHJldmlvdXMpLDMpLG5leHQ6bmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5uZXh0KSwzKSxzaWRlOm5ldyB4dChuZXcgRmxvYXQzMkFycmF5KHRoaXMuc2lkZSksMSksd2lkdGg6bmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy53aWR0aCksMSksdXY6bmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy51dnMpLDIpLGluZGV4Om5ldyB4dChuZXcgVWludDE2QXJyYXkodGhpcy5pbmRpY2VzX2FycmF5KSwxKSxjb3VudGVyczpuZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLmNvdW50ZXJzKSwxKX06KHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24uY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb3NpdGlvbnMpKSx0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMuY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wcmV2aW91cykpLHRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5uZXh0LmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMubmV4dCkpLHRoaXMuX2F0dHJpYnV0ZXMubmV4dC5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLnNpZGUuY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5zaWRlKSksdGhpcy5fYXR0cmlidXRlcy5zaWRlLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMud2lkdGguY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy53aWR0aCkpLHRoaXMuX2F0dHJpYnV0ZXMud2lkdGgubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy51di5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLnV2cykpLHRoaXMuX2F0dHJpYnV0ZXMudXYubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5pbmRleC5jb3B5QXJyYXkobmV3IFVpbnQxNkFycmF5KHRoaXMuaW5kaWNlc19hcnJheSkpLHRoaXMuX2F0dHJpYnV0ZXMuaW5kZXgubmVlZHNVcGRhdGU9ITApLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsdGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbiksdGhpcy5zZXRBdHRyaWJ1dGUoInByZXZpb3VzIix0aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzKSx0aGlzLnNldEF0dHJpYnV0ZSgibmV4dCIsdGhpcy5fYXR0cmlidXRlcy5uZXh0KSx0aGlzLnNldEF0dHJpYnV0ZSgic2lkZSIsdGhpcy5fYXR0cmlidXRlcy5zaWRlKSx0aGlzLnNldEF0dHJpYnV0ZSgid2lkdGgiLHRoaXMuX2F0dHJpYnV0ZXMud2lkdGgpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsdGhpcy5fYXR0cmlidXRlcy51diksdGhpcy5zZXRBdHRyaWJ1dGUoImNvdW50ZXJzIix0aGlzLl9hdHRyaWJ1dGVzLmNvdW50ZXJzKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24pLHRoaXMuc2V0QXR0cmlidXRlKCJwcmV2aW91cyIsdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5leHQiLHRoaXMuX2F0dHJpYnV0ZXMubmV4dCksdGhpcy5zZXRBdHRyaWJ1dGUoInNpZGUiLHRoaXMuX2F0dHJpYnV0ZXMuc2lkZSksdGhpcy5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLl9hdHRyaWJ1dGVzLndpZHRoKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLHRoaXMuX2F0dHJpYnV0ZXMudXYpLHRoaXMuc2V0QXR0cmlidXRlKCJjb3VudGVycyIsdGhpcy5fYXR0cmlidXRlcy5jb3VudGVycyksdGhpcy5zZXRJbmRleCh0aGlzLl9hdHRyaWJ1dGVzLmluZGV4KSx0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCl9YWR2YW5jZSh7eDp0LHk6ZSx6Om59KXtjb25zdCBzPXRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXkscj10aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzLmFycmF5LG89dGhpcy5fYXR0cmlidXRlcy5uZXh0LmFycmF5LGE9cy5sZW5ndGg7SmEocywwLHIsMCxhKSxKYShzLDYscywwLGEtNiksc1thLTZdPXQsc1thLTVdPWUsc1thLTRdPW4sc1thLTNdPXQsc1thLTJdPWUsc1thLTFdPW4sSmEocyw2LG8sMCxhLTYpLG9bYS02XT10LG9bYS01XT1lLG9bYS00XT1uLG9bYS0zXT10LG9bYS0yXT1lLG9bYS0xXT1uLHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24ubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cy5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLm5leHQubmVlZHNVcGRhdGU9ITB9fXZhciBIaD1pPT57Y29uc3R7c2V0UG9pbnRXaWR0aDp0LG5vZGVzOmV9PWksbj1uZXcgYXk7cmV0dXJuIG4uc2V0UG9pbnRzKGUsdCksbn07Y29uc3QgY3k9KHtjb29yZGluYXRlc0FycjppLHByb2plY3Rpb246dCxsaW5lV2lkdGg6ZSx1c2VHcm91cHM6bixzcGxpdFBvbHlnb25zOnN9KT0+e2NvbnN0IHI9dCYmWGkodCk7bGV0IG89aS5tYXAoYz0+SXIoYyxyKSk7cyYmKG89WGEobyxzKSk7Y29uc3QgYT1vLm1hcCgoYyxsKT0+e3ZhciB1O2NvbnN0IGg9KHU9ZVtsXSkhPW51bGw/dTplWzBdO3JldHVybiBIaCh7bm9kZXM6YyxzZXRQb2ludFdpZHRoOigpPT5ofSl9KTtyZXR1cm4gSmkoYSxuKX07dmFyIGx5PWk9Pntjb25zdHtwb2ludHM6dH09aSxlPXQucmVkdWNlKChzLHIsbyk9PihvPHQubGVuZ3RoLTEmJnMucHVzaChyLHRbbysxXSkscyksW10pO3JldHVybiBuZXcgdWUoKS5zZXRGcm9tUG9pbnRzKGUpfTtjb25zdCBoeT0oe2Nvb3JkaW5hdGVzQXJyOmkscHJvamVjdGlvbjp0LGxpbmVXaWR0aDplLHVzZUdyb3VwczpuLHNwbGl0UG9seWdvbnM6c30pPT57Y29uc3Qgcj10JiZYaSh0KTtsZXQgbz1pLm1hcChjPT5JcihjLHIpKTtzJiYobz1YYShvLHMpKTtjb25zdCBhPW8ubWFwKChjLGwpPT5seSh7cG9pbnRzOmMubWFwKGg9Pm5ldyBUKGgueCxoLnksMCkpfSkpO3JldHVybiBKaShhLG4pfTtmdW5jdGlvbiB1eShpLHQsZT0yKXtjb25zdCBuPXQmJnQubGVuZ3RoLHM9bj90WzBdKmU6aS5sZW5ndGg7bGV0IHI9V2goaSwwLHMsZSwhMCk7Y29uc3Qgbz1bXTtpZighcnx8ci5uZXh0PT09ci5wcmV2KXJldHVybiBvO2xldCBhLGMsbDtpZihuJiYocj1teShpLHQscixlKSksaS5sZW5ndGg+ODAqZSl7YT0xLzAsYz0xLzA7bGV0IGg9LTEvMCx1PS0xLzA7Zm9yKGxldCBmPWU7ZjxzO2YrPWUpe2NvbnN0IGQ9aVtmXSxwPWlbZisxXTtkPGEmJihhPWQpLHA8YyYmKGM9cCksZD5oJiYoaD1kKSxwPnUmJih1PXApfWw9TWF0aC5tYXgoaC1hLHUtYyksbD1sIT09MD8zMjc2Ny9sOjB9cmV0dXJuIFlpKHIsbyxlLGEsYyxsLDApLG99ZnVuY3Rpb24gV2goaSx0LGUsbixzKXtsZXQgcjtpZihzPT09VHkoaSx0LGUsbik+MClmb3IobGV0IG89dDtvPGU7bys9bilyPVhoKG8vbnwwLGlbb10saVtvKzFdLHIpO2Vsc2UgZm9yKGxldCBvPWUtbjtvPj10O28tPW4pcj1YaChvL258MCxpW29dLGlbbysxXSxyKTtyZXR1cm4gciYma3IocixyLm5leHQpJiYoUWkocikscj1yLm5leHQpLHJ9ZnVuY3Rpb24gU24oaSx0KXtpZighaSlyZXR1cm4gaTt0fHwodD1pKTtsZXQgZT1pLG47ZG8gaWYobj0hMSwhZS5zdGVpbmVyJiYoa3IoZSxlLm5leHQpfHxhdChlLnByZXYsZSxlLm5leHQpPT09MCkpe2lmKFFpKGUpLGU9dD1lLnByZXYsZT09PWUubmV4dClicmVhaztuPSEwfWVsc2UgZT1lLm5leHQ7d2hpbGUobnx8ZSE9PXQpO3JldHVybiB0fWZ1bmN0aW9uIFlpKGksdCxlLG4scyxyLG8pe2lmKCFpKXJldHVybjshbyYmciYmTXkoaSxuLHMscik7bGV0IGE9aTtmb3IoO2kucHJldiE9PWkubmV4dDspe2NvbnN0IGM9aS5wcmV2LGw9aS5uZXh0O2lmKHI/ZHkoaSxuLHMscik6ZnkoaSkpe3QucHVzaChjLmksaS5pLGwuaSksUWkoaSksaT1sLm5leHQsYT1sLm5leHQ7Y29udGludWV9aWYoaT1sLGk9PT1hKXtvP289PT0xPyhpPXB5KFNuKGkpLHQpLFlpKGksdCxlLG4scyxyLDIpKTpvPT09MiYmeXkoaSx0LGUsbixzLHIpOllpKFNuKGkpLHQsZSxuLHMsciwxKTticmVha319fWZ1bmN0aW9uIGZ5KGkpe2NvbnN0IHQ9aS5wcmV2LGU9aSxuPWkubmV4dDtpZihhdCh0LGUsbik+PTApcmV0dXJuITE7Y29uc3Qgcz10Lngscj1lLngsbz1uLngsYT10LnksYz1lLnksbD1uLnksaD1zPHI/czxvP3M6bzpyPG8/cjpvLHU9YTxjP2E8bD9hOmw6YzxsP2M6bCxmPXM+cj9zPm8/czpvOnI+bz9yOm8sZD1hPmM/YT5sP2E6bDpjPmw/YzpsO2xldCBwPW4ubmV4dDtmb3IoO3AhPT10Oyl7aWYocC54Pj1oJiZwLng8PWYmJnAueT49dSYmcC55PD1kJiZjaShzLGEscixjLG8sbCxwLngscC55KSYmYXQocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBkeShpLHQsZSxuKXtjb25zdCBzPWkucHJldixyPWksbz1pLm5leHQ7aWYoYXQocyxyLG8pPj0wKXJldHVybiExO2NvbnN0IGE9cy54LGM9ci54LGw9by54LGg9cy55LHU9ci55LGY9by55LGQ9YTxjP2E8bD9hOmw6YzxsP2M6bCxwPWg8dT9oPGY/aDpmOnU8Zj91OmYseT1hPmM/YT5sP2E6bDpjPmw/YzpsLG09aD51P2g+Zj9oOmY6dT5mP3U6ZixnPVlhKGQscCx0LGUsbiksYj1ZYSh5LG0sdCxlLG4pO2xldCB3PWkucHJldloseD1pLm5leHRaO2Zvcig7dyYmdy56Pj1nJiZ4JiZ4Lno8PWI7KXtpZih3Lng+PWQmJncueDw9eSYmdy55Pj1wJiZ3Lnk8PW0mJnchPT1zJiZ3IT09byYmY2koYSxoLGMsdSxsLGYsdy54LHcueSkmJmF0KHcucHJldix3LHcubmV4dCk+PTB8fCh3PXcucHJldloseC54Pj1kJiZ4Lng8PXkmJngueT49cCYmeC55PD1tJiZ4IT09cyYmeCE9PW8mJmNpKGEsaCxjLHUsbCxmLHgueCx4LnkpJiZhdCh4LnByZXYseCx4Lm5leHQpPj0wKSlyZXR1cm4hMTt4PXgubmV4dFp9Zm9yKDt3JiZ3Lno+PWc7KXtpZih3Lng+PWQmJncueDw9eSYmdy55Pj1wJiZ3Lnk8PW0mJnchPT1zJiZ3IT09byYmY2koYSxoLGMsdSxsLGYsdy54LHcueSkmJmF0KHcucHJldix3LHcubmV4dCk+PTApcmV0dXJuITE7dz13LnByZXZafWZvcig7eCYmeC56PD1iOyl7aWYoeC54Pj1kJiZ4Lng8PXkmJngueT49cCYmeC55PD1tJiZ4IT09cyYmeCE9PW8mJmNpKGEsaCxjLHUsbCxmLHgueCx4LnkpJiZhdCh4LnByZXYseCx4Lm5leHQpPj0wKXJldHVybiExO3g9eC5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiBweShpLHQpe2xldCBlPWk7ZG97Y29uc3Qgbj1lLnByZXYscz1lLm5leHQubmV4dDsha3IobixzKSYmR2gobixlLGUubmV4dCxzKSYmamkobixzKSYmamkocyxuKSYmKHQucHVzaChuLmksZS5pLHMuaSksUWkoZSksUWkoZS5uZXh0KSxlPWk9cyksZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiBTbihlKX1mdW5jdGlvbiB5eShpLHQsZSxuLHMscil7bGV0IG89aTtkb3tsZXQgYT1vLm5leHQubmV4dDtmb3IoO2EhPT1vLnByZXY7KXtpZihvLmkhPT1hLmkmJnZ5KG8sYSkpe2xldCBjPVpoKG8sYSk7bz1TbihvLG8ubmV4dCksYz1TbihjLGMubmV4dCksWWkobyx0LGUsbixzLHIsMCksWWkoYyx0LGUsbixzLHIsMCk7cmV0dXJufWE9YS5uZXh0fW89by5uZXh0fXdoaWxlKG8hPT1pKX1mdW5jdGlvbiBteShpLHQsZSxuKXtjb25zdCBzPVtdO2ZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT10W3JdKm4sYz1yPG8tMT90W3IrMV0qbjppLmxlbmd0aCxsPVdoKGksYSxjLG4sITEpO2w9PT1sLm5leHQmJihsLnN0ZWluZXI9ITApLHMucHVzaChfeShsKSl9cy5zb3J0KGd5KTtmb3IobGV0IHI9MDtyPHMubGVuZ3RoO3IrKyllPXh5KHNbcl0sZSk7cmV0dXJuIGV9ZnVuY3Rpb24gZ3koaSx0KXtyZXR1cm4gaS54LXQueH1mdW5jdGlvbiB4eShpLHQpe2NvbnN0IGU9d3koaSx0KTtpZighZSlyZXR1cm4gdDtjb25zdCBuPVpoKGUsaSk7cmV0dXJuIFNuKG4sbi5uZXh0KSxTbihlLGUubmV4dCl9ZnVuY3Rpb24gd3koaSx0KXtsZXQgZT10O2NvbnN0IG49aS54LHM9aS55O2xldCByPS0xLzAsbztkb3tpZihzPD1lLnkmJnM+PWUubmV4dC55JiZlLm5leHQueSE9PWUueSl7Y29uc3QgdT1lLngrKHMtZS55KSooZS5uZXh0LngtZS54KS8oZS5uZXh0LnktZS55KTtpZih1PD1uJiZ1PnImJihyPXUsbz1lLng8ZS5uZXh0Lng/ZTplLm5leHQsdT09PW4pKXJldHVybiBvfWU9ZS5uZXh0fXdoaWxlKGUhPT10KTtpZighbylyZXR1cm4gbnVsbDtjb25zdCBhPW8sYz1vLngsbD1vLnk7bGV0IGg9MS8wO2U9bztkb3tpZihuPj1lLngmJmUueD49YyYmbiE9PWUueCYmY2koczxsP246cixzLGMsbCxzPGw/cjpuLHMsZS54LGUueSkpe2NvbnN0IHU9TWF0aC5hYnMocy1lLnkpLyhuLWUueCk7amkoZSxpKSYmKHU8aHx8dT09PWgmJihlLng+by54fHxlLng9PT1vLngmJmJ5KG8sZSkpKSYmKG89ZSxoPXUpfWU9ZS5uZXh0fXdoaWxlKGUhPT1hKTtyZXR1cm4gb31mdW5jdGlvbiBieShpLHQpe3JldHVybiBhdChpLnByZXYsaSx0LnByZXYpPDAmJmF0KHQubmV4dCxpLGkubmV4dCk8MH1mdW5jdGlvbiBNeShpLHQsZSxuKXtsZXQgcz1pO2RvIHMuej09PTAmJihzLno9WWEocy54LHMueSx0LGUsbikpLHMucHJldlo9cy5wcmV2LHMubmV4dFo9cy5uZXh0LHM9cy5uZXh0O3doaWxlKHMhPT1pKTtzLnByZXZaLm5leHRaPW51bGwscy5wcmV2Wj1udWxsLEF5KHMpfWZ1bmN0aW9uIEF5KGkpe2xldCB0LGU9MTtkb3tsZXQgbj1pLHM7aT1udWxsO2xldCByPW51bGw7Zm9yKHQ9MDtuOyl7dCsrO2xldCBvPW4sYT0wO2ZvcihsZXQgbD0wO2w8ZSYmKGErKyxvPW8ubmV4dFosISFvKTtsKyspO2xldCBjPWU7Zm9yKDthPjB8fGM+MCYmbzspYSE9PTAmJihjPT09MHx8IW98fG4uejw9by56KT8ocz1uLG49bi5uZXh0WixhLS0pOihzPW8sbz1vLm5leHRaLGMtLSkscj9yLm5leHRaPXM6aT1zLHMucHJldlo9cixyPXM7bj1vfXIubmV4dFo9bnVsbCxlKj0yfXdoaWxlKHQ+MSk7cmV0dXJuIGl9ZnVuY3Rpb24gWWEoaSx0LGUsbixzKXtyZXR1cm4gaT0oaS1lKSpzfDAsdD0odC1uKSpzfDAsaT0oaXxpPDw4KSYxNjcxMTkzNSxpPShpfGk8PDQpJjI1MjY0NTEzNSxpPShpfGk8PDIpJjg1ODk5MzQ1OSxpPShpfGk8PDEpJjE0MzE2NTU3NjUsdD0odHx0PDw4KSYxNjcxMTkzNSx0PSh0fHQ8PDQpJjI1MjY0NTEzNSx0PSh0fHQ8PDIpJjg1ODk5MzQ1OSx0PSh0fHQ8PDEpJjE0MzE2NTU3NjUsaXx0PDwxfWZ1bmN0aW9uIF95KGkpe2xldCB0PWksZT1pO2RvKHQueDxlLnh8fHQueD09PWUueCYmdC55PGUueSkmJihlPXQpLHQ9dC5uZXh0O3doaWxlKHQhPT1pKTtyZXR1cm4gZX1mdW5jdGlvbiBjaShpLHQsZSxuLHMscixvLGEpe3JldHVybihzLW8pKih0LWEpPj0oaS1vKSooci1hKSYmKGktbykqKG4tYSk+PShlLW8pKih0LWEpJiYoZS1vKSooci1hKT49KHMtbykqKG4tYSl9ZnVuY3Rpb24gdnkoaSx0KXtyZXR1cm4gaS5uZXh0LmkhPT10LmkmJmkucHJldi5pIT09dC5pJiYhU3koaSx0KSYmKGppKGksdCkmJmppKHQsaSkmJnp5KGksdCkmJihhdChpLnByZXYsaSx0LnByZXYpfHxhdChpLHQucHJldix0KSl8fGtyKGksdCkmJmF0KGkucHJldixpLGkubmV4dCk+MCYmYXQodC5wcmV2LHQsdC5uZXh0KT4wKX1mdW5jdGlvbiBhdChpLHQsZSl7cmV0dXJuKHQueS1pLnkpKihlLngtdC54KS0odC54LWkueCkqKGUueS10LnkpfWZ1bmN0aW9uIGtyKGksdCl7cmV0dXJuIGkueD09PXQueCYmaS55PT09dC55fWZ1bmN0aW9uIEdoKGksdCxlLG4pe2NvbnN0IHM9UnIoYXQoaSx0LGUpKSxyPVJyKGF0KGksdCxuKSksbz1ScihhdChlLG4saSkpLGE9UnIoYXQoZSxuLHQpKTtyZXR1cm4hIShzIT09ciYmbyE9PWF8fHM9PT0wJiZOcihpLGUsdCl8fHI9PT0wJiZOcihpLG4sdCl8fG89PT0wJiZOcihlLGksbil8fGE9PT0wJiZOcihlLHQsbikpfWZ1bmN0aW9uIE5yKGksdCxlKXtyZXR1cm4gdC54PD1NYXRoLm1heChpLngsZS54KSYmdC54Pj1NYXRoLm1pbihpLngsZS54KSYmdC55PD1NYXRoLm1heChpLnksZS55KSYmdC55Pj1NYXRoLm1pbihpLnksZS55KX1mdW5jdGlvbiBScihpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9ZnVuY3Rpb24gU3koaSx0KXtsZXQgZT1pO2Rve2lmKGUuaSE9PWkuaSYmZS5uZXh0LmkhPT1pLmkmJmUuaSE9PXQuaSYmZS5uZXh0LmkhPT10LmkmJkdoKGUsZS5uZXh0LGksdCkpcmV0dXJuITA7ZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiExfWZ1bmN0aW9uIGppKGksdCl7cmV0dXJuIGF0KGkucHJldixpLGkubmV4dCk8MD9hdChpLHQsaS5uZXh0KT49MCYmYXQoaSxpLnByZXYsdCk+PTA6YXQoaSx0LGkucHJldik8MHx8YXQoaSxpLm5leHQsdCk8MH1mdW5jdGlvbiB6eShpLHQpe2xldCBlPWksbj0hMTtjb25zdCBzPShpLngrdC54KS8yLHI9KGkueSt0LnkpLzI7ZG8gZS55PnIhPWUubmV4dC55PnImJmUubmV4dC55IT09ZS55JiZzPChlLm5leHQueC1lLngpKihyLWUueSkvKGUubmV4dC55LWUueSkrZS54JiYobj0hbiksZT1lLm5leHQ7d2hpbGUoZSE9PWkpO3JldHVybiBufWZ1bmN0aW9uIFpoKGksdCl7Y29uc3QgZT1qYShpLmksaS54LGkueSksbj1qYSh0LmksdC54LHQueSkscz1pLm5leHQscj10LnByZXY7cmV0dXJuIGkubmV4dD10LHQucHJldj1pLGUubmV4dD1zLHMucHJldj1lLG4ubmV4dD1lLGUucHJldj1uLHIubmV4dD1uLG4ucHJldj1yLG59ZnVuY3Rpb24gWGgoaSx0LGUsbil7Y29uc3Qgcz1qYShpLHQsZSk7cmV0dXJuIG4/KHMubmV4dD1uLm5leHQscy5wcmV2PW4sbi5uZXh0LnByZXY9cyxuLm5leHQ9cyk6KHMucHJldj1zLHMubmV4dD1zKSxzfWZ1bmN0aW9uIFFpKGkpe2kubmV4dC5wcmV2PWkucHJldixpLnByZXYubmV4dD1pLm5leHQsaS5wcmV2WiYmKGkucHJldloubmV4dFo9aS5uZXh0WiksaS5uZXh0WiYmKGkubmV4dFoucHJldlo9aS5wcmV2Wil9ZnVuY3Rpb24gamEoaSx0LGUpe3JldHVybntpLHg6dCx5OmUscHJldjpudWxsLG5leHQ6bnVsbCx6OjAscHJldlo6bnVsbCxuZXh0WjpudWxsLHN0ZWluZXI6ITF9fWZ1bmN0aW9uIFR5KGksdCxlLG4pe2xldCBzPTA7Zm9yKGxldCByPXQsbz1lLW47cjxlO3IrPW4pcys9KGlbb10taVtyXSkqKGlbcisxXStpW28rMV0pLG89cjtyZXR1cm4gc31mdW5jdGlvbiBKaChpKXtjb25zdCB0PVtdLGU9W10sbj1pWzBdWzBdLmxlbmd0aDtsZXQgcz0wLHI9MDtmb3IoY29uc3QgbyBvZiBpKXtmb3IoY29uc3QgYSBvZiBvKWZvcihsZXQgYz0wO2M8bjtjKyspdC5wdXNoKGFbY10pO3ImJihzKz1yLGUucHVzaChzKSkscj1vLmxlbmd0aH1yZXR1cm57dmVydGljZXM6dCxob2xlczplLGRpbWVuc2lvbnM6bn19ZnVuY3Rpb24gUHkoaSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJjb29yZCBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KGkpKXtpZihpLnR5cGU9PT0iRmVhdHVyZSImJmkuZ2VvbWV0cnkhPT1udWxsJiZpLmdlb21ldHJ5LnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5pLmdlb21ldHJ5LmNvb3JkaW5hdGVzXTtpZihpLnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5pLmNvb3JkaW5hdGVzXX1pZihBcnJheS5pc0FycmF5KGkpJiZpLmxlbmd0aD49MiYmIUFycmF5LmlzQXJyYXkoaVswXSkmJiFBcnJheS5pc0FycmF5KGlbMV0pKXJldHVyblsuLi5pXTt0aHJvdyBuZXcgRXJyb3IoImNvb3JkIG11c3QgYmUgR2VvSlNPTiBQb2ludCBvciBhbiBBcnJheSBvZiBudW1iZXJzIil9ZnVuY3Rpb24gRXkoaSl7aWYoQXJyYXkuaXNBcnJheShpKSlyZXR1cm4gaTtpZihpLnR5cGU9PT0iRmVhdHVyZSIpe2lmKGkuZ2VvbWV0cnkhPT1udWxsKXJldHVybiBpLmdlb21ldHJ5LmNvb3JkaW5hdGVzfWVsc2UgaWYoaS5jb29yZGluYXRlcylyZXR1cm4gaS5jb29yZGluYXRlczt0aHJvdyBuZXcgRXJyb3IoImNvb3JkcyBtdXN0IGJlIEdlb0pTT04gRmVhdHVyZSwgR2VvbWV0cnkgT2JqZWN0IG9yIGFuIEFycmF5Iil9ZnVuY3Rpb24gQ3koaSl7cmV0dXJuIGkudHlwZT09PSJGZWF0dXJlIj9pLmdlb21ldHJ5Oml9ZnVuY3Rpb24gQnkoaSl7Y29uc3QgdD1FeShpKTtsZXQgZT0wLG49MSxzLHI7Zm9yKDtuPHQubGVuZ3RoOylzPXJ8fHRbMF0scj10W25dLGUrPShyWzBdLXNbMF0pKihyWzFdK3NbMV0pLG4rKztyZXR1cm4gZT4wfXZhciBGeT1CeTtjb25zdCBxZT0xMTEwMjIzMDI0NjI1MTU2NWUtMzIsU3Q9MTM0MjE3NzI5LEl5PSgzKzgqcWUpKnFlO2Z1bmN0aW9uIFFhKGksdCxlLG4scyl7bGV0IHIsbyxhLGMsbD10WzBdLGg9blswXSx1PTAsZj0wO2g+bD09aD4tbD8ocj1sLGw9dFsrK3VdKToocj1oLGg9blsrK2ZdKTtsZXQgZD0wO2lmKHU8aSYmZjxlKWZvcihoPmw9PWg+LWw/KG89bCtyLGE9ci0oby1sKSxsPXRbKyt1XSk6KG89aCtyLGE9ci0oby1oKSxoPW5bKytmXSkscj1vLGEhPT0wJiYoc1tkKytdPWEpO3U8aSYmZjxlOyloPmw9PWg+LWw/KG89citsLGM9by1yLGE9ci0oby1jKSsobC1jKSxsPXRbKyt1XSk6KG89citoLGM9by1yLGE9ci0oby1jKSsoaC1jKSxoPW5bKytmXSkscj1vLGEhPT0wJiYoc1tkKytdPWEpO2Zvcig7dTxpOylvPXIrbCxjPW8tcixhPXItKG8tYykrKGwtYyksbD10WysrdV0scj1vLGEhPT0wJiYoc1tkKytdPWEpO2Zvcig7ZjxlOylvPXIraCxjPW8tcixhPXItKG8tYykrKGgtYyksaD1uWysrZl0scj1vLGEhPT0wJiYoc1tkKytdPWEpO3JldHVybihyIT09MHx8ZD09PTApJiYoc1tkKytdPXIpLGR9ZnVuY3Rpb24ga3koaSx0KXtsZXQgZT10WzBdO2ZvcihsZXQgbj0xO248aTtuKyspZSs9dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBLaShpKXtyZXR1cm4gbmV3IEZsb2F0NjRBcnJheShpKX1jb25zdCBOeT0oMysxNipxZSkqcWUsUnk9KDIrMTIqcWUpKnFlLEx5PSg5KzY0KnFlKSpxZSpxZSxsaT1LaSg0KSxZaD1LaSg4KSxqaD1LaSgxMiksUWg9S2koMTYpLEJ0PUtpKDQpO2Z1bmN0aW9uIE95KGksdCxlLG4scyxyLG8pe2xldCBhLGMsbCxoLHUsZixkLHAseSxtLGcsYix3LHgsTSxBLF8sdjtjb25zdCBQPWktcyx6PWUtcyxTPXQtcixDPW4tcjt4PVAqQyxmPVN0KlAsZD1mLShmLVApLHA9UC1kLGY9U3QqQyx5PWYtKGYtQyksbT1DLXksTT1wKm0tKHgtZCp5LXAqeS1kKm0pLEE9Uyp6LGY9U3QqUyxkPWYtKGYtUykscD1TLWQsZj1TdCp6LHk9Zi0oZi16KSxtPXoteSxfPXAqbS0oQS1kKnktcCp5LWQqbSksZz1NLV8sdT1NLWcsbGlbMF09TS0oZyt1KSsodS1fKSxiPXgrZyx1PWIteCx3PXgtKGItdSkrKGctdSksZz13LUEsdT13LWcsbGlbMV09dy0oZyt1KSsodS1BKSx2PWIrZyx1PXYtYixsaVsyXT1iLSh2LXUpKyhnLXUpLGxpWzNdPXY7bGV0IEU9a3koNCxsaSksRj1SeSpvO2lmKEU+PUZ8fC1FPj1GfHwodT1pLVAsYT1pLShQK3UpKyh1LXMpLHU9ZS16LGw9ZS0oeit1KSsodS1zKSx1PXQtUyxjPXQtKFMrdSkrKHUtciksdT1uLUMsaD1uLShDK3UpKyh1LXIpLGE9PT0wJiZjPT09MCYmbD09PTAmJmg9PT0wKXx8KEY9THkqbytJeSpNYXRoLmFicyhFKSxFKz1QKmgrQyphLShTKmwreipjKSxFPj1GfHwtRT49RikpcmV0dXJuIEU7eD1hKkMsZj1TdCphLGQ9Zi0oZi1hKSxwPWEtZCxmPVN0KkMseT1mLShmLUMpLG09Qy15LE09cCptLSh4LWQqeS1wKnktZCptKSxBPWMqeixmPVN0KmMsZD1mLShmLWMpLHA9Yy1kLGY9U3Qqeix5PWYtKGYteiksbT16LXksXz1wKm0tKEEtZCp5LXAqeS1kKm0pLGc9TS1fLHU9TS1nLEJ0WzBdPU0tKGcrdSkrKHUtXyksYj14K2csdT1iLXgsdz14LShiLXUpKyhnLXUpLGc9dy1BLHU9dy1nLEJ0WzFdPXctKGcrdSkrKHUtQSksdj1iK2csdT12LWIsQnRbMl09Yi0odi11KSsoZy11KSxCdFszXT12O2NvbnN0IEI9UWEoNCxsaSw0LEJ0LFloKTt4PVAqaCxmPVN0KlAsZD1mLShmLVApLHA9UC1kLGY9U3QqaCx5PWYtKGYtaCksbT1oLXksTT1wKm0tKHgtZCp5LXAqeS1kKm0pLEE9UypsLGY9U3QqUyxkPWYtKGYtUykscD1TLWQsZj1TdCpsLHk9Zi0oZi1sKSxtPWwteSxfPXAqbS0oQS1kKnktcCp5LWQqbSksZz1NLV8sdT1NLWcsQnRbMF09TS0oZyt1KSsodS1fKSxiPXgrZyx1PWIteCx3PXgtKGItdSkrKGctdSksZz13LUEsdT13LWcsQnRbMV09dy0oZyt1KSsodS1BKSx2PWIrZyx1PXYtYixCdFsyXT1iLSh2LXUpKyhnLXUpLEJ0WzNdPXY7Y29uc3QgST1RYShCLFloLDQsQnQsamgpO3g9YSpoLGY9U3QqYSxkPWYtKGYtYSkscD1hLWQsZj1TdCpoLHk9Zi0oZi1oKSxtPWgteSxNPXAqbS0oeC1kKnktcCp5LWQqbSksQT1jKmwsZj1TdCpjLGQ9Zi0oZi1jKSxwPWMtZCxmPVN0KmwseT1mLShmLWwpLG09bC15LF89cCptLShBLWQqeS1wKnktZCptKSxnPU0tXyx1PU0tZyxCdFswXT1NLShnK3UpKyh1LV8pLGI9eCtnLHU9Yi14LHc9eC0oYi11KSsoZy11KSxnPXctQSx1PXctZyxCdFsxXT13LShnK3UpKyh1LUEpLHY9YitnLHU9di1iLEJ0WzJdPWItKHYtdSkrKGctdSksQnRbM109djtjb25zdCBrPVFhKEksamgsNCxCdCxRaCk7cmV0dXJuIFFoW2stMV19ZnVuY3Rpb24gTHIoaSx0LGUsbixzLHIpe2NvbnN0IG89KHQtcikqKGUtcyksYT0oaS1zKSoobi1yKSxjPW8tYTtpZihvPT09MHx8YT09PTB8fG8+MCE9YT4wKXJldHVybiBjO2NvbnN0IGw9TWF0aC5hYnMobythKTtyZXR1cm4gTWF0aC5hYnMoYyk+PU55Kmw/YzotT3koaSx0LGUsbixzLHIsbCl9Y29uc3QgS2g9TWF0aC5wb3coMiwtNTIpLE9yPW5ldyBVaW50MzJBcnJheSg1MTIpO2NsYXNzIHRze3N0YXRpYyBmcm9tKHQsZT1xeSxuPUh5KXtjb25zdCBzPXQubGVuZ3RoLHI9bmV3IEZsb2F0NjRBcnJheShzKjIpO2ZvcihsZXQgbz0wO288cztvKyspe2NvbnN0IGE9dFtvXTtyWzIqb109ZShhKSxyWzIqbysxXT1uKGEpfXJldHVybiBuZXcgdHMocil9Y29uc3RydWN0b3IodCl7Y29uc3QgZT10Lmxlbmd0aD4+MTtpZihlPjAmJnR5cGVvZiB0WzBdIT0ibnVtYmVyIil0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGNvb3JkcyB0byBjb250YWluIG51bWJlcnMuIik7dGhpcy5jb29yZHM9dDtjb25zdCBuPU1hdGgubWF4KDIqZS01LDApO3RoaXMuX3RyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkobiozKSx0aGlzLl9oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkobiozKSx0aGlzLl9oYXNoU2l6ZT1NYXRoLmNlaWwoTWF0aC5zcXJ0KGUpKSx0aGlzLl9odWxsUHJldj1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbE5leHQ9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxUcmk9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxIYXNoPW5ldyBJbnQzMkFycmF5KHRoaXMuX2hhc2hTaXplKS5maWxsKC0xKSx0aGlzLl9pZHM9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2Rpc3RzPW5ldyBGbG9hdDY0QXJyYXkoZSksdGhpcy51cGRhdGUoKX11cGRhdGUoKXtjb25zdHtjb29yZHM6dCxfaHVsbFByZXY6ZSxfaHVsbE5leHQ6bixfaHVsbFRyaTpzLF9odWxsSGFzaDpyfT10aGlzLG89dC5sZW5ndGg+PjE7bGV0IGE9MS8wLGM9MS8wLGw9LTEvMCxoPS0xLzA7Zm9yKGxldCB6PTA7ejxvO3orKyl7Y29uc3QgUz10WzIqel0sQz10WzIqeisxXTtTPGEmJihhPVMpLEM8YyYmKGM9QyksUz5sJiYobD1TKSxDPmgmJihoPUMpLHRoaXMuX2lkc1t6XT16fWNvbnN0IHU9KGErbCkvMixmPShjK2gpLzI7bGV0IGQ9MS8wLHAseSxtO2ZvcihsZXQgej0wO3o8bzt6Kyspe2NvbnN0IFM9S2EodSxmLHRbMip6XSx0WzIqeisxXSk7UzxkJiYocD16LGQ9Uyl9Y29uc3QgZz10WzIqcF0sYj10WzIqcCsxXTtkPTEvMDtmb3IobGV0IHo9MDt6PG87eisrKXtpZih6PT09cCljb250aW51ZTtjb25zdCBTPUthKGcsYix0WzIqel0sdFsyKnorMV0pO1M8ZCYmUz4wJiYoeT16LGQ9Uyl9bGV0IHc9dFsyKnldLHg9dFsyKnkrMV0sTT0xLzA7Zm9yKGxldCB6PTA7ejxvO3orKyl7aWYoej09PXB8fHo9PT15KWNvbnRpbnVlO2NvbnN0IFM9VXkoZyxiLHcseCx0WzIqel0sdFsyKnorMV0pO1M8TSYmKG09eixNPVMpfWxldCBBPXRbMiptXSxfPXRbMiptKzFdO2lmKE09PT0xLzApe2ZvcihsZXQgQz0wO0M8bztDKyspdGhpcy5fZGlzdHNbQ109dFsyKkNdLXRbMF18fHRbMipDKzFdLXRbMV07aGkodGhpcy5faWRzLHRoaXMuX2Rpc3RzLDAsby0xKTtjb25zdCB6PW5ldyBVaW50MzJBcnJheShvKTtsZXQgUz0wO2ZvcihsZXQgQz0wLEU9LTEvMDtDPG87QysrKXtjb25zdCBGPXRoaXMuX2lkc1tDXTt0aGlzLl9kaXN0c1tGXT5FJiYoeltTKytdPUYsRT10aGlzLl9kaXN0c1tGXSl9dGhpcy5odWxsPXouc3ViYXJyYXkoMCxTKSx0aGlzLnRyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkoMCksdGhpcy5oYWxmZWRnZXM9bmV3IFVpbnQzMkFycmF5KDApO3JldHVybn1pZihMcihnLGIsdyx4LEEsXyk8MCl7Y29uc3Qgej15LFM9dyxDPXg7eT1tLHc9QSx4PV8sbT16LEE9UyxfPUN9Y29uc3Qgdj1WeShnLGIsdyx4LEEsXyk7dGhpcy5fY3g9di54LHRoaXMuX2N5PXYueTtmb3IobGV0IHo9MDt6PG87eisrKXRoaXMuX2Rpc3RzW3pdPUthKHRbMip6XSx0WzIqeisxXSx2Lngsdi55KTtoaSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpLHRoaXMuX2h1bGxTdGFydD1wO2xldCBQPTM7bltwXT1lW21dPXksblt5XT1lW3BdPW0sblttXT1lW3ldPXAsc1twXT0wLHNbeV09MSxzW21dPTIsci5maWxsKC0xKSxyW3RoaXMuX2hhc2hLZXkoZyxiKV09cCxyW3RoaXMuX2hhc2hLZXkodyx4KV09eSxyW3RoaXMuX2hhc2hLZXkoQSxfKV09bSx0aGlzLnRyaWFuZ2xlc0xlbj0wLHRoaXMuX2FkZFRyaWFuZ2xlKHAseSxtLC0xLC0xLC0xKTtmb3IobGV0IHo9MCxTLEM7ejx0aGlzLl9pZHMubGVuZ3RoO3orKyl7Y29uc3QgRT10aGlzLl9pZHNbel0sRj10WzIqRV0sQj10WzIqRSsxXTtpZih6PjAmJk1hdGguYWJzKEYtUyk8PUtoJiZNYXRoLmFicyhCLUMpPD1LaHx8KFM9RixDPUIsRT09PXB8fEU9PT15fHxFPT09bSkpY29udGludWU7bGV0IEk9MDtmb3IobGV0IGR0PTAsRHQ9dGhpcy5faGFzaEtleShGLEIpO2R0PHRoaXMuX2hhc2hTaXplJiYoST1yWyhEdCtkdCkldGhpcy5faGFzaFNpemVdLCEoSSE9PS0xJiZJIT09bltJXSkpO2R0KyspO0k9ZVtJXTtsZXQgaz1JLEQ7Zm9yKDtEPW5ba10sTHIoRixCLHRbMiprXSx0WzIqaysxXSx0WzIqRF0sdFsyKkQrMV0pPj0wOylpZihrPUQsaz09PUkpe2s9LTE7YnJlYWt9aWYoaz09PS0xKWNvbnRpbnVlO2xldCBWPXRoaXMuX2FkZFRyaWFuZ2xlKGssRSxuW2tdLC0xLC0xLHNba10pO3NbRV09dGhpcy5fbGVnYWxpemUoVisyKSxzW2tdPVYsUCsrO2xldCBqPW5ba107Zm9yKDtEPW5bal0sTHIoRixCLHRbMipqXSx0WzIqaisxXSx0WzIqRF0sdFsyKkQrMV0pPDA7KVY9dGhpcy5fYWRkVHJpYW5nbGUoaixFLEQsc1tFXSwtMSxzW2pdKSxzW0VdPXRoaXMuX2xlZ2FsaXplKFYrMiksbltqXT1qLFAtLSxqPUQ7aWYoaz09PUkpZm9yKDtEPWVba10sTHIoRixCLHRbMipEXSx0WzIqRCsxXSx0WzIqa10sdFsyKmsrMV0pPDA7KVY9dGhpcy5fYWRkVHJpYW5nbGUoRCxFLGssLTEsc1trXSxzW0RdKSx0aGlzLl9sZWdhbGl6ZShWKzIpLHNbRF09VixuW2tdPWssUC0tLGs9RDt0aGlzLl9odWxsU3RhcnQ9ZVtFXT1rLG5ba109ZVtqXT1FLG5bRV09aixyW3RoaXMuX2hhc2hLZXkoRixCKV09RSxyW3RoaXMuX2hhc2hLZXkodFsyKmtdLHRbMiprKzFdKV09a310aGlzLmh1bGw9bmV3IFVpbnQzMkFycmF5KFApO2ZvcihsZXQgej0wLFM9dGhpcy5faHVsbFN0YXJ0O3o8UDt6KyspdGhpcy5odWxsW3pdPVMsUz1uW1NdO3RoaXMudHJpYW5nbGVzPXRoaXMuX3RyaWFuZ2xlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKSx0aGlzLmhhbGZlZGdlcz10aGlzLl9oYWxmZWRnZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbil9X2hhc2hLZXkodCxlKXtyZXR1cm4gTWF0aC5mbG9vcihEeSh0LXRoaXMuX2N4LGUtdGhpcy5fY3kpKnRoaXMuX2hhc2hTaXplKSV0aGlzLl9oYXNoU2l6ZX1fbGVnYWxpemUodCl7Y29uc3R7X3RyaWFuZ2xlczplLF9oYWxmZWRnZXM6bixjb29yZHM6c309dGhpcztsZXQgcj0wLG89MDtmb3IoOzspe2NvbnN0IGE9blt0XSxjPXQtdCUzO2lmKG89YysodCsyKSUzLGE9PT0tMSl7aWYocj09PTApYnJlYWs7dD1PclstLXJdO2NvbnRpbnVlfWNvbnN0IGw9YS1hJTMsaD1jKyh0KzEpJTMsdT1sKyhhKzIpJTMsZj1lW29dLGQ9ZVt0XSxwPWVbaF0seT1lW3VdO2lmKCR5KHNbMipmXSxzWzIqZisxXSxzWzIqZF0sc1syKmQrMV0sc1syKnBdLHNbMipwKzFdLHNbMip5XSxzWzIqeSsxXSkpe2VbdF09eSxlW2FdPWY7Y29uc3QgZz1uW3VdO2lmKGc9PT0tMSl7bGV0IHc9dGhpcy5faHVsbFN0YXJ0O2Rve2lmKHRoaXMuX2h1bGxUcmlbd109PT11KXt0aGlzLl9odWxsVHJpW3ddPXQ7YnJlYWt9dz10aGlzLl9odWxsUHJldlt3XX13aGlsZSh3IT09dGhpcy5faHVsbFN0YXJ0KX10aGlzLl9saW5rKHQsZyksdGhpcy5fbGluayhhLG5bb10pLHRoaXMuX2xpbmsobyx1KTtjb25zdCBiPWwrKGErMSklMztyPE9yLmxlbmd0aCYmKE9yW3IrK109Yil9ZWxzZXtpZihyPT09MClicmVhazt0PU9yWy0tcl19fXJldHVybiBvfV9saW5rKHQsZSl7dGhpcy5faGFsZmVkZ2VzW3RdPWUsZSE9PS0xJiYodGhpcy5faGFsZmVkZ2VzW2VdPXQpfV9hZGRUcmlhbmdsZSh0LGUsbixzLHIsbyl7Y29uc3QgYT10aGlzLnRyaWFuZ2xlc0xlbjtyZXR1cm4gdGhpcy5fdHJpYW5nbGVzW2FdPXQsdGhpcy5fdHJpYW5nbGVzW2ErMV09ZSx0aGlzLl90cmlhbmdsZXNbYSsyXT1uLHRoaXMuX2xpbmsoYSxzKSx0aGlzLl9saW5rKGErMSxyKSx0aGlzLl9saW5rKGErMixvKSx0aGlzLnRyaWFuZ2xlc0xlbis9MyxhfX1mdW5jdGlvbiBEeShpLHQpe2NvbnN0IGU9aS8oTWF0aC5hYnMoaSkrTWF0aC5hYnModCkpO3JldHVybih0PjA/My1lOjErZSkvNH1mdW5jdGlvbiBLYShpLHQsZSxuKXtjb25zdCBzPWktZSxyPXQtbjtyZXR1cm4gcypzK3Iqcn1mdW5jdGlvbiAkeShpLHQsZSxuLHMscixvLGEpe2NvbnN0IGM9aS1vLGw9dC1hLGg9ZS1vLHU9bi1hLGY9cy1vLGQ9ci1hLHA9YypjK2wqbCx5PWgqaCt1KnUsbT1mKmYrZCpkO3JldHVybiBjKih1Km0teSpkKS1sKihoKm0teSpmKStwKihoKmQtdSpmKTwwfWZ1bmN0aW9uIFV5KGksdCxlLG4scyxyKXtjb25zdCBvPWUtaSxhPW4tdCxjPXMtaSxsPXItdCxoPW8qbythKmEsdT1jKmMrbCpsLGY9LjUvKG8qbC1hKmMpLGQ9KGwqaC1hKnUpKmYscD0obyp1LWMqaCkqZjtyZXR1cm4gZCpkK3AqcH1mdW5jdGlvbiBWeShpLHQsZSxuLHMscil7Y29uc3Qgbz1lLWksYT1uLXQsYz1zLWksbD1yLXQsaD1vKm8rYSphLHU9YypjK2wqbCxmPS41LyhvKmwtYSpjKSxkPWkrKGwqaC1hKnUpKmYscD10KyhvKnUtYypoKSpmO3JldHVybnt4OmQseTpwfX1mdW5jdGlvbiBoaShpLHQsZSxuKXtpZihuLWU8PTIwKWZvcihsZXQgcz1lKzE7czw9bjtzKyspe2NvbnN0IHI9aVtzXSxvPXRbcl07bGV0IGE9cy0xO2Zvcig7YT49ZSYmdFtpW2FdXT5vOylpW2ErMV09aVthLS1dO2lbYSsxXT1yfWVsc2V7Y29uc3Qgcz1lK24+PjE7bGV0IHI9ZSsxLG89bjtlcyhpLHMsciksdFtpW2VdXT50W2lbbl1dJiZlcyhpLGUsbiksdFtpW3JdXT50W2lbbl1dJiZlcyhpLHIsbiksdFtpW2VdXT50W2lbcl1dJiZlcyhpLGUscik7Y29uc3QgYT1pW3JdLGM9dFthXTtmb3IoOzspe2RvIHIrKzt3aGlsZSh0W2lbcl1dPGMpO2RvIG8tLTt3aGlsZSh0W2lbb11dPmMpO2lmKG88cilicmVhaztlcyhpLHIsbyl9aVtlKzFdPWlbb10saVtvXT1hLG4tcisxPj1vLWU/KGhpKGksdCxyLG4pLGhpKGksdCxlLG8tMSkpOihoaShpLHQsZSxvLTEpLGhpKGksdCxyLG4pKX19ZnVuY3Rpb24gZXMoaSx0LGUpe2NvbnN0IG49aVt0XTtpW3RdPWlbZV0saVtlXT1ufWZ1bmN0aW9uIHF5KGkpe3JldHVybiBpWzBdfWZ1bmN0aW9uIEh5KGkpe3JldHVybiBpWzFdfWZ1bmN0aW9uIFd5KGksdCl7dmFyIGU9MCxuPTAscz0wLHI9MCxvPTAsYT0wLGM9MCxsPTAsaD1udWxsLHU9bnVsbCxmPWlbMF0sZD1pWzFdLHA9dC5sZW5ndGg7Zm9yKGU7ZTxwO2UrKyl7bj0wO3ZhciB5PXRbZV0ubGVuZ3RoLTEsbT10W2VdO2lmKGg9bVswXSxoWzBdIT09bVt5XVswXSYmaFsxXSE9PW1beV1bMV0pdGhyb3cgbmV3IEVycm9yKCJGaXJzdCBhbmQgbGFzdCBjb29yZGluYXRlcyBpbiBhIHJpbmcgbXVzdCBiZSB0aGUgc2FtZSIpO2ZvcihvPWhbMF0tZixhPWhbMV0tZCxuO248eTtuKyspe2lmKHU9bVtuKzFdLGw9dVsxXS1kLGE8MCYmbDwwfHxhPjAmJmw+MCl7aD11LGE9bCxvPWhbMF0tZjtjb250aW51ZX1pZihjPXVbMF0taVswXSxsPjAmJmE8PTApe2lmKHI9bypsLWMqYSxyPjApcz1zKzE7ZWxzZSBpZihyPT09MClyZXR1cm4gMH1lbHNlIGlmKGE+MCYmbDw9MCl7aWYocj1vKmwtYyphLHI8MClzPXMrMTtlbHNlIGlmKHI9PT0wKXJldHVybiAwfWVsc2UgaWYobD09PTAmJmE8MCl7aWYocj1vKmwtYyphLHI9PT0wKXJldHVybiAwfWVsc2UgaWYoYT09PTAmJmw8MCl7aWYocj1vKmwtYyphLHI9PT0wKXJldHVybiAwfWVsc2UgaWYoYT09PTAmJmw9PT0wKXtpZihjPD0wJiZvPj0wKXJldHVybiAwO2lmKG88PTAmJmM+PTApcmV0dXJuIDB9aD11LGE9bCxvPWN9fXJldHVybiBzJTIhPT0wfWZ1bmN0aW9uIEd5KGksdCxlPXt9KXtpZighaSl0aHJvdyBuZXcgRXJyb3IoInBvaW50IGlzIHJlcXVpcmVkIik7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJwb2x5Z29uIGlzIHJlcXVpcmVkIik7Y29uc3Qgbj1QeShpKSxzPUN5KHQpLHI9cy50eXBlLG89dC5iYm94O2xldCBhPXMuY29vcmRpbmF0ZXM7aWYobyYmWnkobixvKT09PSExKXJldHVybiExO3I9PT0iUG9seWdvbiImJihhPVthXSk7bGV0IGM9ITE7Zm9yKHZhciBsPTA7bDxhLmxlbmd0aDsrK2wpe2NvbnN0IGg9V3kobixhW2xdKTtpZihoPT09MClyZXR1cm4hZS5pZ25vcmVCb3VuZGFyeTtoJiYoYz0hMCl9cmV0dXJuIGN9ZnVuY3Rpb24gWnkoaSx0KXtyZXR1cm4gdFswXTw9aVswXSYmdFsxXTw9aVsxXSYmdFsyXT49aVswXSYmdFszXT49aVsxXX12YXIgWHk9R3k7Y29uc3QgdHU9MWUtNjtjbGFzcyB6bntjb25zdHJ1Y3Rvcigpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifW1vdmVUbyh0LGUpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPSt0fSwke3RoaXMuX3kwPXRoaXMuX3kxPStlfWB9Y2xvc2VQYXRoKCl7dGhpcy5feDEhPT1udWxsJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfWxpbmVUbyh0LGUpe3RoaXMuXys9YEwke3RoaXMuX3gxPSt0fSwke3RoaXMuX3kxPStlfWB9YXJjKHQsZSxuKXt0PSt0LGU9K2Usbj0rbjtjb25zdCBzPXQrbixyPWU7aWYobjwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzIik7dGhpcy5feDE9PT1udWxsP3RoaXMuXys9YE0ke3N9LCR7cn1gOihNYXRoLmFicyh0aGlzLl94MS1zKT50dXx8TWF0aC5hYnModGhpcy5feTEtcik+dHUpJiYodGhpcy5fKz0iTCIrcysiLCIrciksbiYmKHRoaXMuXys9YEEke259LCR7bn0sMCwxLDEsJHt0LW59LCR7ZX1BJHtufSwke259LDAsMSwxLCR7dGhpcy5feDE9c30sJHt0aGlzLl95MT1yfWApfXJlY3QodCxlLG4scyl7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K2V9aCR7K259diR7K3N9aCR7LW59WmB9dmFsdWUoKXtyZXR1cm4gdGhpcy5ffHxudWxsfX1jbGFzcyB0Y3tjb25zdHJ1Y3Rvcigpe3RoaXMuXz1bXX1tb3ZlVG8odCxlKXt0aGlzLl8ucHVzaChbdCxlXSl9Y2xvc2VQYXRoKCl7dGhpcy5fLnB1c2godGhpcy5fWzBdLnNsaWNlKCkpfWxpbmVUbyh0LGUpe3RoaXMuXy5wdXNoKFt0LGVdKX12YWx1ZSgpe3JldHVybiB0aGlzLl8ubGVuZ3RoP3RoaXMuXzpudWxsfX1jbGFzcyBKeXtjb25zdHJ1Y3Rvcih0LFtlLG4scyxyXT1bMCwwLDk2MCw1MDBdKXtpZighKChzPStzKT49KGU9K2UpKXx8ISgocj0rcik+PShuPStuKSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJvdW5kcyIpO3RoaXMuZGVsYXVuYXk9dCx0aGlzLl9jaXJjdW1jZW50ZXJzPW5ldyBGbG9hdDY0QXJyYXkodC5wb2ludHMubGVuZ3RoKjIpLHRoaXMudmVjdG9ycz1uZXcgRmxvYXQ2NEFycmF5KHQucG9pbnRzLmxlbmd0aCoyKSx0aGlzLnhtYXg9cyx0aGlzLnhtaW49ZSx0aGlzLnltYXg9cix0aGlzLnltaW49bix0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuZGVsYXVuYXkudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnQsaHVsbDplLHRyaWFuZ2xlczpufSx2ZWN0b3JzOnN9PXRoaXMscj10aGlzLmNpcmN1bWNlbnRlcnM9dGhpcy5fY2lyY3VtY2VudGVycy5zdWJhcnJheSgwLG4ubGVuZ3RoLzMqMik7Zm9yKGxldCBkPTAscD0wLHk9bi5sZW5ndGgsbSxnO2Q8eTtkKz0zLHArPTIpe2NvbnN0IGI9bltkXSoyLHc9bltkKzFdKjIseD1uW2QrMl0qMixNPXRbYl0sQT10W2IrMV0sXz10W3ddLHY9dFt3KzFdLFA9dFt4XSx6PXRbeCsxXSxTPV8tTSxDPXYtQSxFPVAtTSxGPXotQSxCPShTKkYtQypFKSoyO2lmKE1hdGguYWJzKEIpPDFlLTkpe2xldCBJPTFlOTtjb25zdCBrPW5bMF0qMjtJKj1NYXRoLnNpZ24oKHRba10tTSkqRi0odFtrKzFdLUEpKkUpLG09KE0rUCkvMi1JKkYsZz0oQSt6KS8yK0kqRX1lbHNle2NvbnN0IEk9MS9CLGs9UypTK0MqQyxEPUUqRStGKkY7bT1NKyhGKmstQypEKSpJLGc9QSsoUypELUUqaykqSX1yW3BdPW0scltwKzFdPWd9bGV0IG89ZVtlLmxlbmd0aC0xXSxhLGM9byo0LGwsaD10WzIqb10sdSxmPXRbMipvKzFdO3MuZmlsbCgwKTtmb3IobGV0IGQ9MDtkPGUubGVuZ3RoOysrZClvPWVbZF0sYT1jLGw9aCx1PWYsYz1vKjQsaD10WzIqb10sZj10WzIqbysxXSxzW2ErMl09c1tjXT11LWYsc1thKzNdPXNbYysxXT1oLWx9cmVuZGVyKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyB6bjp2b2lkIDAse2RlbGF1bmF5OntoYWxmZWRnZXM6bixpbmVkZ2VzOnMsaHVsbDpyfSxjaXJjdW1jZW50ZXJzOm8sdmVjdG9yczphfT10aGlzO2lmKHIubGVuZ3RoPD0xKXJldHVybiBudWxsO2ZvcihsZXQgaD0wLHU9bi5sZW5ndGg7aDx1OysraCl7Y29uc3QgZj1uW2hdO2lmKGY8aCljb250aW51ZTtjb25zdCBkPU1hdGguZmxvb3IoaC8zKSoyLHA9TWF0aC5mbG9vcihmLzMpKjIseT1vW2RdLG09b1tkKzFdLGc9b1twXSxiPW9bcCsxXTt0aGlzLl9yZW5kZXJTZWdtZW50KHksbSxnLGIsdCl9bGV0IGMsbD1yW3IubGVuZ3RoLTFdO2ZvcihsZXQgaD0wO2g8ci5sZW5ndGg7KytoKXtjPWwsbD1yW2hdO2NvbnN0IHU9TWF0aC5mbG9vcihzW2xdLzMpKjIsZj1vW3VdLGQ9b1t1KzFdLHA9Yyo0LHk9dGhpcy5fcHJvamVjdChmLGQsYVtwKzJdLGFbcCszXSk7eSYmdGhpcy5fcmVuZGVyU2VnbWVudChmLGQseVswXSx5WzFdLHQpfXJldHVybiBlJiZlLnZhbHVlKCl9cmVuZGVyQm91bmRzKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyB6bjp2b2lkIDA7cmV0dXJuIHQucmVjdCh0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heC10aGlzLnhtaW4sdGhpcy55bWF4LXRoaXMueW1pbiksZSYmZS52YWx1ZSgpfXJlbmRlckNlbGwodCxlKXtjb25zdCBuPWU9PW51bGw/ZT1uZXcgem46dm9pZCAwLHM9dGhpcy5fY2xpcCh0KTtpZihzPT09bnVsbHx8IXMubGVuZ3RoKXJldHVybjtlLm1vdmVUbyhzWzBdLHNbMV0pO2xldCByPXMubGVuZ3RoO2Zvcig7c1swXT09PXNbci0yXSYmc1sxXT09PXNbci0xXSYmcj4xOylyLT0yO2ZvcihsZXQgbz0yO288cjtvKz0yKShzW29dIT09c1tvLTJdfHxzW28rMV0hPT1zW28tMV0pJiZlLmxpbmVUbyhzW29dLHNbbysxXSk7cmV0dXJuIGUuY2xvc2VQYXRoKCksbiYmbi52YWx1ZSgpfSpjZWxsUG9seWdvbnMoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnR9fT10aGlzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGgvMjtlPG47KytlKXtjb25zdCBzPXRoaXMuY2VsbFBvbHlnb24oZSk7cyYmKHMuaW5kZXg9ZSx5aWVsZCBzKX19Y2VsbFBvbHlnb24odCl7Y29uc3QgZT1uZXcgdGM7cmV0dXJuIHRoaXMucmVuZGVyQ2VsbCh0LGUpLGUudmFsdWUoKX1fcmVuZGVyU2VnbWVudCh0LGUsbixzLHIpe2xldCBvO2NvbnN0IGE9dGhpcy5fcmVnaW9uY29kZSh0LGUpLGM9dGhpcy5fcmVnaW9uY29kZShuLHMpO2E9PT0wJiZjPT09MD8oci5tb3ZlVG8odCxlKSxyLmxpbmVUbyhuLHMpKToobz10aGlzLl9jbGlwU2VnbWVudCh0LGUsbixzLGEsYykpJiYoci5tb3ZlVG8ob1swXSxvWzFdKSxyLmxpbmVUbyhvWzJdLG9bM10pKX1jb250YWlucyh0LGUsbil7cmV0dXJuIGU9K2UsZSE9PWV8fChuPStuLG4hPT1uKT8hMTp0aGlzLmRlbGF1bmF5Ll9zdGVwKHQsZSxuKT09PXR9Km5laWdoYm9ycyh0KXtjb25zdCBlPXRoaXMuX2NsaXAodCk7aWYoZSlmb3IoY29uc3QgbiBvZiB0aGlzLmRlbGF1bmF5Lm5laWdoYm9ycyh0KSl7Y29uc3Qgcz10aGlzLl9jbGlwKG4pO2lmKHMpe3Q6Zm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cis9Milmb3IobGV0IGE9MCxjPXMubGVuZ3RoO2E8YzthKz0yKWlmKGVbcl09PXNbYV0mJmVbcisxXT09c1thKzFdJiZlWyhyKzIpJW9dPT1zWyhhK2MtMiklY10mJmVbKHIrMyklb109PXNbKGErYy0xKSVjXSl7eWllbGQgbjticmVhayB0fX19fV9jZWxsKHQpe2NvbnN0e2NpcmN1bWNlbnRlcnM6ZSxkZWxhdW5heTp7aW5lZGdlczpuLGhhbGZlZGdlczpzLHRyaWFuZ2xlczpyfX09dGhpcyxvPW5bdF07aWYobz09PS0xKXJldHVybiBudWxsO2NvbnN0IGE9W107bGV0IGM9bztkb3tjb25zdCBsPU1hdGguZmxvb3IoYy8zKTtpZihhLnB1c2goZVtsKjJdLGVbbCoyKzFdKSxjPWMlMz09PTI/Yy0yOmMrMSxyW2NdIT09dClicmVhaztjPXNbY119d2hpbGUoYyE9PW8mJmMhPT0tMSk7cmV0dXJuIGF9X2NsaXAodCl7aWYodD09PTAmJnRoaXMuZGVsYXVuYXkuaHVsbC5sZW5ndGg9PT0xKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtjb25zdCBlPXRoaXMuX2NlbGwodCk7aWYoZT09PW51bGwpcmV0dXJuIG51bGw7Y29uc3R7dmVjdG9yczpufT10aGlzLHM9dCo0O3JldHVybiBuW3NdfHxuW3MrMV0/dGhpcy5fY2xpcEluZmluaXRlKHQsZSxuW3NdLG5bcysxXSxuW3MrMl0sbltzKzNdKTp0aGlzLl9jbGlwRmluaXRlKHQsZSl9X2NsaXBGaW5pdGUodCxlKXtjb25zdCBuPWUubGVuZ3RoO2xldCBzPW51bGwscixvLGE9ZVtuLTJdLGM9ZVtuLTFdLGwsaD10aGlzLl9yZWdpb25jb2RlKGEsYyksdSxmPTA7Zm9yKGxldCBkPTA7ZDxuO2QrPTIpaWYocj1hLG89YyxhPWVbZF0sYz1lW2QrMV0sbD1oLGg9dGhpcy5fcmVnaW9uY29kZShhLGMpLGw9PT0wJiZoPT09MCl1PWYsZj0wLHM/cy5wdXNoKGEsYyk6cz1bYSxjXTtlbHNle2xldCBwLHksbSxnLGI7aWYobD09PTApe2lmKChwPXRoaXMuX2NsaXBTZWdtZW50KHIsbyxhLGMsbCxoKSk9PT1udWxsKWNvbnRpbnVlO1t5LG0sZyxiXT1wfWVsc2V7aWYoKHA9dGhpcy5fY2xpcFNlZ21lbnQoYSxjLHIsbyxoLGwpKT09PW51bGwpY29udGludWU7W2csYix5LG1dPXAsdT1mLGY9dGhpcy5fZWRnZWNvZGUoeSxtKSx1JiZmJiZ0aGlzLl9lZGdlKHQsdSxmLHMscy5sZW5ndGgpLHM/cy5wdXNoKHksbSk6cz1beSxtXX11PWYsZj10aGlzLl9lZGdlY29kZShnLGIpLHUmJmYmJnRoaXMuX2VkZ2UodCx1LGYscyxzLmxlbmd0aCkscz9zLnB1c2goZyxiKTpzPVtnLGJdfWlmKHMpdT1mLGY9dGhpcy5fZWRnZWNvZGUoc1swXSxzWzFdKSx1JiZmJiZ0aGlzLl9lZGdlKHQsdSxmLHMscy5sZW5ndGgpO2Vsc2UgaWYodGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSlyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07cmV0dXJuIHN9X2NsaXBTZWdtZW50KHQsZSxuLHMscixvKXtmb3IoOzspe2lmKHI9PT0wJiZvPT09MClyZXR1cm5bdCxlLG4sc107aWYociZvKXJldHVybiBudWxsO2xldCBhLGMsbD1yfHxvO2wmOD8oYT10KyhuLXQpKih0aGlzLnltYXgtZSkvKHMtZSksYz10aGlzLnltYXgpOmwmND8oYT10KyhuLXQpKih0aGlzLnltaW4tZSkvKHMtZSksYz10aGlzLnltaW4pOmwmMj8oYz1lKyhzLWUpKih0aGlzLnhtYXgtdCkvKG4tdCksYT10aGlzLnhtYXgpOihjPWUrKHMtZSkqKHRoaXMueG1pbi10KS8obi10KSxhPXRoaXMueG1pbikscj8odD1hLGU9YyxyPXRoaXMuX3JlZ2lvbmNvZGUodCxlKSk6KG49YSxzPWMsbz10aGlzLl9yZWdpb25jb2RlKG4scykpfX1fY2xpcEluZmluaXRlKHQsZSxuLHMscixvKXtsZXQgYT1BcnJheS5mcm9tKGUpLGM7aWYoKGM9dGhpcy5fcHJvamVjdChhWzBdLGFbMV0sbixzKSkmJmEudW5zaGlmdChjWzBdLGNbMV0pLChjPXRoaXMuX3Byb2plY3QoYVthLmxlbmd0aC0yXSxhW2EubGVuZ3RoLTFdLHIsbykpJiZhLnB1c2goY1swXSxjWzFdKSxhPXRoaXMuX2NsaXBGaW5pdGUodCxhKSlmb3IobGV0IGw9MCxoPWEubGVuZ3RoLHUsZj10aGlzLl9lZGdlY29kZShhW2gtMl0sYVtoLTFdKTtsPGg7bCs9Mil1PWYsZj10aGlzLl9lZGdlY29kZShhW2xdLGFbbCsxXSksdSYmZiYmKGw9dGhpcy5fZWRnZSh0LHUsZixhLGwpLGg9YS5sZW5ndGgpO2Vsc2UgdGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSYmKGE9W3RoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXhdKTtyZXR1cm4gYX1fZWRnZSh0LGUsbixzLHIpe2Zvcig7ZSE9PW47KXtsZXQgbyxhO3N3aXRjaChlKXtjYXNlIDU6ZT00O2NvbnRpbnVlO2Nhc2UgNDplPTYsbz10aGlzLnhtYXgsYT10aGlzLnltaW47YnJlYWs7Y2FzZSA2OmU9Mjtjb250aW51ZTtjYXNlIDI6ZT0xMCxvPXRoaXMueG1heCxhPXRoaXMueW1heDticmVhaztjYXNlIDEwOmU9ODtjb250aW51ZTtjYXNlIDg6ZT05LG89dGhpcy54bWluLGE9dGhpcy55bWF4O2JyZWFrO2Nhc2UgOTplPTE7Y29udGludWU7Y2FzZSAxOmU9NSxvPXRoaXMueG1pbixhPXRoaXMueW1pbjticmVha30oc1tyXSE9PW98fHNbcisxXSE9PWEpJiZ0aGlzLmNvbnRhaW5zKHQsbyxhKSYmKHMuc3BsaWNlKHIsMCxvLGEpLHIrPTIpfWlmKHMubGVuZ3RoPjQpZm9yKGxldCBvPTA7bzxzLmxlbmd0aDtvKz0yKXtjb25zdCBhPShvKzIpJXMubGVuZ3RoLGM9KG8rNCklcy5sZW5ndGg7KHNbb109PT1zW2FdJiZzW2FdPT09c1tjXXx8c1tvKzFdPT09c1thKzFdJiZzW2ErMV09PT1zW2MrMV0pJiYocy5zcGxpY2UoYSwyKSxvLT0yKX1yZXR1cm4gcn1fcHJvamVjdCh0LGUsbixzKXtsZXQgcj0xLzAsbyxhLGM7aWYoczwwKXtpZihlPD10aGlzLnltaW4pcmV0dXJuIG51bGw7KG89KHRoaXMueW1pbi1lKS9zKTxyJiYoYz10aGlzLnltaW4sYT10KyhyPW8pKm4pfWVsc2UgaWYocz4wKXtpZihlPj10aGlzLnltYXgpcmV0dXJuIG51bGw7KG89KHRoaXMueW1heC1lKS9zKTxyJiYoYz10aGlzLnltYXgsYT10KyhyPW8pKm4pfWlmKG4+MCl7aWYodD49dGhpcy54bWF4KXJldHVybiBudWxsOyhvPSh0aGlzLnhtYXgtdCkvbik8ciYmKGE9dGhpcy54bWF4LGM9ZSsocj1vKSpzKX1lbHNlIGlmKG48MCl7aWYodDw9dGhpcy54bWluKXJldHVybiBudWxsOyhvPSh0aGlzLnhtaW4tdCkvbik8ciYmKGE9dGhpcy54bWluLGM9ZSsocj1vKSpzKX1yZXR1cm5bYSxjXX1fZWRnZWNvZGUodCxlKXtyZXR1cm4odD09PXRoaXMueG1pbj8xOnQ9PT10aGlzLnhtYXg/MjowKXwoZT09PXRoaXMueW1pbj80OmU9PT10aGlzLnltYXg/ODowKX1fcmVnaW9uY29kZSh0LGUpe3JldHVybih0PHRoaXMueG1pbj8xOnQ+dGhpcy54bWF4PzI6MCl8KGU8dGhpcy55bWluPzQ6ZT50aGlzLnltYXg/ODowKX19Y29uc3QgWXk9MipNYXRoLlBJLHVpPU1hdGgucG93O2Z1bmN0aW9uIGp5KGkpe3JldHVybiBpWzBdfWZ1bmN0aW9uIFF5KGkpe3JldHVybiBpWzFdfWZ1bmN0aW9uIEt5KGkpe2NvbnN0e3RyaWFuZ2xlczp0LGNvb3JkczplfT1pO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bis9Myl7Y29uc3Qgcz0yKnRbbl0scj0yKnRbbisxXSxvPTIqdFtuKzJdO2lmKChlW29dLWVbc10pKihlW3IrMV0tZVtzKzFdKS0oZVtyXS1lW3NdKSooZVtvKzFdLWVbcysxXSk+MWUtMTApcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gdG0oaSx0LGUpe3JldHVybltpK01hdGguc2luKGkrdCkqZSx0K01hdGguY29zKGktdCkqZV19Y2xhc3MgZWN7c3RhdGljIGZyb20odCxlPWp5LG49UXkscyl7cmV0dXJuIG5ldyBlYygibGVuZ3RoImluIHQ/ZW0odCxlLG4scyk6RmxvYXQ2NEFycmF5LmZyb20obm0odCxlLG4scykpKX1jb25zdHJ1Y3Rvcih0KXt0aGlzLl9kZWxhdW5hdG9yPW5ldyB0cyh0KSx0aGlzLmluZWRnZXM9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5faHVsbEluZGV4PW5ldyBJbnQzMkFycmF5KHQubGVuZ3RoLzIpLHRoaXMucG9pbnRzPXRoaXMuX2RlbGF1bmF0b3IuY29vcmRzLHRoaXMuX2luaXQoKX11cGRhdGUoKXtyZXR1cm4gdGhpcy5fZGVsYXVuYXRvci51cGRhdGUoKSx0aGlzLl9pbml0KCksdGhpc31faW5pdCgpe2NvbnN0IHQ9dGhpcy5fZGVsYXVuYXRvcixlPXRoaXMucG9pbnRzO2lmKHQuaHVsbCYmdC5odWxsLmxlbmd0aD4yJiZLeSh0KSl7dGhpcy5jb2xsaW5lYXI9SW50MzJBcnJheS5mcm9tKHtsZW5ndGg6ZS5sZW5ndGgvMn0sKGYsZCk9PmQpLnNvcnQoKGYsZCk9PmVbMipmXS1lWzIqZF18fGVbMipmKzFdLWVbMipkKzFdKTtjb25zdCBjPXRoaXMuY29sbGluZWFyWzBdLGw9dGhpcy5jb2xsaW5lYXJbdGhpcy5jb2xsaW5lYXIubGVuZ3RoLTFdLGg9W2VbMipjXSxlWzIqYysxXSxlWzIqbF0sZVsyKmwrMV1dLHU9MWUtOCpNYXRoLmh5cG90KGhbM10taFsxXSxoWzJdLWhbMF0pO2ZvcihsZXQgZj0wLGQ9ZS5sZW5ndGgvMjtmPGQ7KytmKXtjb25zdCBwPXRtKGVbMipmXSxlWzIqZisxXSx1KTtlWzIqZl09cFswXSxlWzIqZisxXT1wWzFdfXRoaXMuX2RlbGF1bmF0b3I9bmV3IHRzKGUpfWVsc2UgZGVsZXRlIHRoaXMuY29sbGluZWFyO2NvbnN0IG49dGhpcy5oYWxmZWRnZXM9dGhpcy5fZGVsYXVuYXRvci5oYWxmZWRnZXMscz10aGlzLmh1bGw9dGhpcy5fZGVsYXVuYXRvci5odWxsLHI9dGhpcy50cmlhbmdsZXM9dGhpcy5fZGVsYXVuYXRvci50cmlhbmdsZXMsbz10aGlzLmluZWRnZXMuZmlsbCgtMSksYT10aGlzLl9odWxsSW5kZXguZmlsbCgtMSk7Zm9yKGxldCBjPTAsbD1uLmxlbmd0aDtjPGw7KytjKXtjb25zdCBoPXJbYyUzPT09Mj9jLTI6YysxXTsobltjXT09PS0xfHxvW2hdPT09LTEpJiYob1toXT1jKX1mb3IobGV0IGM9MCxsPXMubGVuZ3RoO2M8bDsrK2MpYVtzW2NdXT1jO3MubGVuZ3RoPD0yJiZzLmxlbmd0aD4wJiYodGhpcy50cmlhbmdsZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy5oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy50cmlhbmdsZXNbMF09c1swXSxvW3NbMF1dPTEscy5sZW5ndGg9PT0yJiYob1tzWzFdXT0wLHRoaXMudHJpYW5nbGVzWzFdPXNbMV0sdGhpcy50cmlhbmdsZXNbMl09c1sxXSkpfXZvcm9ub2kodCl7cmV0dXJuIG5ldyBKeSh0aGlzLHQpfSpuZWlnaGJvcnModCl7Y29uc3R7aW5lZGdlczplLGh1bGw6bixfaHVsbEluZGV4OnMsaGFsZmVkZ2VzOnIsdHJpYW5nbGVzOm8sY29sbGluZWFyOmF9PXRoaXM7aWYoYSl7Y29uc3QgdT1hLmluZGV4T2YodCk7dT4wJiYoeWllbGQgYVt1LTFdKSx1PGEubGVuZ3RoLTEmJih5aWVsZCBhW3UrMV0pO3JldHVybn1jb25zdCBjPWVbdF07aWYoYz09PS0xKXJldHVybjtsZXQgbD1jLGg9LTE7ZG97aWYoeWllbGQgaD1vW2xdLGw9bCUzPT09Mj9sLTI6bCsxLG9bbF0hPT10KXJldHVybjtpZihsPXJbbF0sbD09PS0xKXtjb25zdCB1PW5bKHNbdF0rMSklbi5sZW5ndGhdO3UhPT1oJiYoeWllbGQgdSk7cmV0dXJufX13aGlsZShsIT09Yyl9ZmluZCh0LGUsbj0wKXtpZih0PSt0LHQhPT10fHwoZT0rZSxlIT09ZSkpcmV0dXJuLTE7Y29uc3Qgcz1uO2xldCByO2Zvcig7KHI9dGhpcy5fc3RlcChuLHQsZSkpPj0wJiZyIT09biYmciE9PXM7KW49cjtyZXR1cm4gcn1fc3RlcCh0LGUsbil7Y29uc3R7aW5lZGdlczpzLGh1bGw6cixfaHVsbEluZGV4Om8saGFsZmVkZ2VzOmEsdHJpYW5nbGVzOmMscG9pbnRzOmx9PXRoaXM7aWYoc1t0XT09PS0xfHwhbC5sZW5ndGgpcmV0dXJuKHQrMSklKGwubGVuZ3RoPj4xKTtsZXQgaD10LHU9dWkoZS1sW3QqMl0sMikrdWkobi1sW3QqMisxXSwyKTtjb25zdCBmPXNbdF07bGV0IGQ9Zjtkb3tsZXQgcD1jW2RdO2NvbnN0IHk9dWkoZS1sW3AqMl0sMikrdWkobi1sW3AqMisxXSwyKTtpZih5PHUmJih1PXksaD1wKSxkPWQlMz09PTI/ZC0yOmQrMSxjW2RdIT09dClicmVhaztpZihkPWFbZF0sZD09PS0xKXtpZihkPXJbKG9bdF0rMSklci5sZW5ndGhdLGQhPT1wJiZ1aShlLWxbZCoyXSwyKSt1aShuLWxbZCoyKzFdLDIpPHUpcmV0dXJuIGQ7YnJlYWt9fXdoaWxlKGQhPT1mKTtyZXR1cm4gaH1yZW5kZXIodCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IHpuOnZvaWQgMCx7cG9pbnRzOm4saGFsZmVkZ2VzOnMsdHJpYW5nbGVzOnJ9PXRoaXM7Zm9yKGxldCBvPTAsYT1zLmxlbmd0aDtvPGE7KytvKXtjb25zdCBjPXNbb107aWYoYzxvKWNvbnRpbnVlO2NvbnN0IGw9cltvXSoyLGg9cltjXSoyO3QubW92ZVRvKG5bbF0sbltsKzFdKSx0LmxpbmVUbyhuW2hdLG5baCsxXSl9cmV0dXJuIHRoaXMucmVuZGVySHVsbCh0KSxlJiZlLnZhbHVlKCl9cmVuZGVyUG9pbnRzKHQsZSl7ZT09PXZvaWQgMCYmKCF0fHx0eXBlb2YgdC5tb3ZlVG8hPSJmdW5jdGlvbiIpJiYoZT10LHQ9bnVsbCksZT1lPT1udWxsPzI6K2U7Y29uc3Qgbj10PT1udWxsP3Q9bmV3IHpuOnZvaWQgMCx7cG9pbnRzOnN9PXRoaXM7Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cis9Mil7Y29uc3QgYT1zW3JdLGM9c1tyKzFdO3QubW92ZVRvKGErZSxjKSx0LmFyYyhhLGMsZSwwLFl5KX1yZXR1cm4gbiYmbi52YWx1ZSgpfXJlbmRlckh1bGwodCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IHpuOnZvaWQgMCx7aHVsbDpuLHBvaW50czpzfT10aGlzLHI9blswXSoyLG89bi5sZW5ndGg7dC5tb3ZlVG8oc1tyXSxzW3IrMV0pO2ZvcihsZXQgYT0xO2E8bzsrK2Epe2NvbnN0IGM9MipuW2FdO3QubGluZVRvKHNbY10sc1tjKzFdKX1yZXR1cm4gdC5jbG9zZVBhdGgoKSxlJiZlLnZhbHVlKCl9aHVsbFBvbHlnb24oKXtjb25zdCB0PW5ldyB0YztyZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLHQudmFsdWUoKX1yZW5kZXJUcmlhbmdsZSh0LGUpe2NvbnN0IG49ZT09bnVsbD9lPW5ldyB6bjp2b2lkIDAse3BvaW50czpzLHRyaWFuZ2xlczpyfT10aGlzLG89clt0Kj0zXSoyLGE9clt0KzFdKjIsYz1yW3QrMl0qMjtyZXR1cm4gZS5tb3ZlVG8oc1tvXSxzW28rMV0pLGUubGluZVRvKHNbYV0sc1thKzFdKSxlLmxpbmVUbyhzW2NdLHNbYysxXSksZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KnRyaWFuZ2xlUG9seWdvbnMoKXtjb25zdHt0cmlhbmdsZXM6dH09dGhpcztmb3IobGV0IGU9MCxuPXQubGVuZ3RoLzM7ZTxuOysrZSl5aWVsZCB0aGlzLnRyaWFuZ2xlUG9seWdvbihlKX10cmlhbmdsZVBvbHlnb24odCl7Y29uc3QgZT1uZXcgdGM7cmV0dXJuIHRoaXMucmVuZGVyVHJpYW5nbGUodCxlKSxlLnZhbHVlKCl9fWZ1bmN0aW9uIGVtKGksdCxlLG4pe2NvbnN0IHM9aS5sZW5ndGgscj1uZXcgRmxvYXQ2NEFycmF5KHMqMik7Zm9yKGxldCBvPTA7bzxzOysrbyl7Y29uc3QgYT1pW29dO3JbbyoyXT10LmNhbGwobixhLG8saSkscltvKjIrMV09ZS5jYWxsKG4sYSxvLGkpfXJldHVybiByfWZ1bmN0aW9uKm5tKGksdCxlLG4pe2xldCBzPTA7Zm9yKGNvbnN0IHIgb2YgaSl5aWVsZCB0LmNhbGwobixyLHMsaSkseWllbGQgZS5jYWxsKG4scixzLGkpLCsrc31jb25zdCBuYz1NYXRoLlBJLGV1PW5jLzIsbnU9MTgwL25jLGl1PW5jLzE4MCxpbT1NYXRoLmF0YW4yLHN1PU1hdGguY29zLHNtPU1hdGgubWF4LHJtPU1hdGgubWluLHJ1PU1hdGguc2luLG9tPU1hdGguc2lnbnx8ZnVuY3Rpb24oaSl7cmV0dXJuIGk+MD8xOmk8MD8tMTowfSxvdT1NYXRoLnNxcnQ7ZnVuY3Rpb24gYW0oaSl7cmV0dXJuIGk+MT9ldTppPC0xPy1ldTpNYXRoLmFzaW4oaSl9ZnVuY3Rpb24gYXUoaSx0KXtyZXR1cm4gaVswXSp0WzBdK2lbMV0qdFsxXStpWzJdKnRbMl19ZnVuY3Rpb24gV3QoaSx0KXtyZXR1cm5baVsxXSp0WzJdLWlbMl0qdFsxXSxpWzJdKnRbMF0taVswXSp0WzJdLGlbMF0qdFsxXS1pWzFdKnRbMF1dfWZ1bmN0aW9uIERyKGksdCl7cmV0dXJuW2lbMF0rdFswXSxpWzFdK3RbMV0saVsyXSt0WzJdXX1mdW5jdGlvbiAkcihpKXt2YXIgdD1vdShpWzBdKmlbMF0raVsxXSppWzFdK2lbMl0qaVsyXSk7cmV0dXJuW2lbMF0vdCxpWzFdL3QsaVsyXS90XX1mdW5jdGlvbiBpYyhpKXtyZXR1cm5baW0oaVsxXSxpWzBdKSpudSxhbShzbSgtMSxybSgxLGlbMl0pKSkqbnVdfWZ1bmN0aW9uIE1lKGkpe2NvbnN0IHQ9aVswXSppdSxlPWlbMV0qaXUsbj1zdShlKTtyZXR1cm5bbipzdSh0KSxuKnJ1KHQpLHJ1KGUpXX1mdW5jdGlvbiBzYyhpKXtyZXR1cm4gaT1pLm1hcCh0PT5NZSh0KSksYXUoaVswXSxXdChpWzJdLGlbMV0pKX1mdW5jdGlvbiBjbShpKXtjb25zdCB0PWhtKGkpLGU9Zm0odCksbj11bShlLGkpLHM9cG0oZSxpLmxlbmd0aCkscj1sbShzLGkpLG89ZG0oZSxpKSx7cG9seWdvbnM6YSxjZW50ZXJzOmN9PXltKG8sZSxpKSxsPW1tKGEpLGg9eG0oZSxpKSx1PWdtKG4sZSk7cmV0dXJue2RlbGF1bmF5OnQsZWRnZXM6bix0cmlhbmdsZXM6ZSxjZW50ZXJzOmMsbmVpZ2hib3JzOnMscG9seWdvbnM6YSxtZXNoOmwsaHVsbDpoLHVycXVoYXJ0OnUsZmluZDpyfX1mdW5jdGlvbiBsbShpLHQpe2Z1bmN0aW9uIGUobixzKXtsZXQgcj1uWzBdLXNbMF0sbz1uWzFdLXNbMV0sYT1uWzJdLXNbMl07cmV0dXJuIHIqcitvKm8rYSphfXJldHVybiBmdW5jdGlvbihzLHIsbyl7bz09PXZvaWQgMCYmKG89MCk7bGV0IGEsYyxsPW87Y29uc3QgaD1NZShbcyxyXSk7ZG8gYT1vLG89bnVsbCxjPWUoaCxNZSh0W2FdKSksaVthXS5mb3JFYWNoKHU9PntsZXQgZj1lKGgsTWUodFt1XSkpO2lmKGY8Yyl7Yz1mLG89dSxsPXU7cmV0dXJufX0pO3doaWxlKG8hPT1udWxsKTtyZXR1cm4gbH19ZnVuY3Rpb24gaG0oaSl7aWYoaS5sZW5ndGg8MilyZXR1cm57fTtsZXQgdD0wO2Zvcig7aXNOYU4oaVt0XVswXStpW3RdWzFdKSYmdCsrPGkubGVuZ3RoOyk7Y29uc3QgZT1iaChpW3RdKSxuPXR5KCkudHJhbnNsYXRlKFswLDBdKS5zY2FsZSgxKS5yb3RhdGUoZS5pbnZlcnQoWzE4MCwwXSkpO2k9aS5tYXAobik7Y29uc3Qgcz1bXTtsZXQgcj0xO2ZvcihsZXQgdT0wLGY9aS5sZW5ndGg7dTxmO3UrKyl7bGV0IGQ9eWkoaVt1XVswXSwyKSt5aShpW3VdWzFdLDIpOyFpc0Zpbml0ZShkKXx8ZD4xZTMyP3MucHVzaCh1KTpkPnImJihyPWQpfWNvbnN0IG89MWU2Km91KHIpO3MuZm9yRWFjaCh1PT5pW3VdPVtvLDBdKSxpLnB1c2goWzAsb10pLGkucHVzaChbLW8sMF0pLGkucHVzaChbMCwtb10pO2NvbnN0IGE9ZWMuZnJvbShpKTthLnByb2plY3Rpb249bjtjb25zdHt0cmlhbmdsZXM6YyxoYWxmZWRnZXM6bCxpbmVkZ2VzOmh9PWE7Zm9yKGxldCB1PTAsZj1sLmxlbmd0aDt1PGY7dSsrKWlmKGxbdV08MCl7Y29uc3QgZD11JTM9PTI/dS0yOnUrMSxwPXUlMz09MD91KzI6dS0xLHk9bFtkXSxtPWxbcF07bFt5XT1tLGxbbV09eSxsW2RdPWxbcF09LTEsY1t1XT1jW2RdPWNbcF09dCxoW2NbeV1dPXklMz09MD95KzI6eS0xLGhbY1ttXV09bSUzPT0wP20rMjptLTEsdSs9Mi11JTN9ZWxzZSBjW3VdPmkubGVuZ3RoLTMtMSYmKGNbdV09dCk7cmV0dXJuIGF9ZnVuY3Rpb24gdW0oaSx0KXtjb25zdCBlPW5ldyBTZXQ7cmV0dXJuIHQubGVuZ3RoPT09Mj9bWzAsMV1dOihpLmZvckVhY2gobj0+e2lmKG5bMF0hPT1uWzFdJiYhKHNjKG4ubWFwKHM9PnRbc10pKTwwKSlmb3IobGV0IHM9MCxyO3M8MztzKyspcj0ocysxKSUzLGUuYWRkKHNyKFtuW3NdLG5bcl1dKS5qb2luKCItIikpfSksQXJyYXkuZnJvbShlLG49Pm4uc3BsaXQoIi0iKS5tYXAoTnVtYmVyKSkpfWZ1bmN0aW9uIGZtKGkpe2NvbnN0e3RyaWFuZ2xlczp0fT1pO2lmKCF0KXJldHVybltdO2NvbnN0IGU9W107Zm9yKGxldCBuPTAscz10Lmxlbmd0aC8zO248cztuKyspe2NvbnN0IHI9dFszKm5dLG89dFszKm4rMV0sYT10WzMqbisyXTtyIT09byYmbyE9PWEmJmUucHVzaChbcixhLG9dKX1yZXR1cm4gZX1mdW5jdGlvbiBkbShpLHQpe3JldHVybiBpLm1hcChlPT57Y29uc3Qgbj1lLm1hcChyPT50W3JdKS5tYXAoTWUpLHM9RHIoRHIoV3QoblsxXSxuWzBdKSxXdChuWzJdLG5bMV0pKSxXdChuWzBdLG5bMl0pKTtyZXR1cm4gaWMoJHIocykpfSl9ZnVuY3Rpb24gcG0oaSx0KXtjb25zdCBlPVtdO3JldHVybiBpLmZvckVhY2gobj0+e2ZvcihsZXQgcz0wO3M8MztzKyspe2NvbnN0IHI9bltzXSxvPW5bKHMrMSklM107ZVtyXT1lW3JdfHxbXSxlW3JdLnB1c2gobyl9fSksaS5sZW5ndGg9PT0wJiYodD09PTI/KGVbMF09WzFdLGVbMV09WzBdKTp0PT09MSYmKGVbMF09W10pKSxlfWZ1bmN0aW9uIHltKGksdCxlKXtjb25zdCBuPVtdLHM9aS5zbGljZSgpO2lmKHQubGVuZ3RoPT09MCl7aWYoZS5sZW5ndGg8MilyZXR1cm57cG9seWdvbnM6bixjZW50ZXJzOnN9O2lmKGUubGVuZ3RoPT09Mil7Y29uc3QgYT1NZShlWzBdKSxjPU1lKGVbMV0pLGw9JHIoRHIoYSxjKSksaD0kcihXdChhLGMpKSx1PVd0KGwsaCksZj1bbCxXdChsLHUpLFd0KFd0KGwsdSksdSksV3QoV3QoV3QobCx1KSx1KSx1KV0ubWFwKGljKS5tYXAobyk7cmV0dXJuIG4ucHVzaChmKSxuLnB1c2goZi5zbGljZSgpLnJldmVyc2UoKSkse3BvbHlnb25zOm4sY2VudGVyczpzfX19dC5mb3JFYWNoKChhLGMpPT57Zm9yKGxldCBsPTA7bDwzO2wrKyl7Y29uc3QgaD1hW2xdLHU9YVsobCsxKSUzXSxmPWFbKGwrMiklM107bltoXT1uW2hdfHxbXSxuW2hdLnB1c2goW3UsZixjLFtoLHUsZl1dKX19KTtjb25zdCByPW4ubWFwKGE9Pntjb25zdCBjPVthWzBdWzJdXTtsZXQgbD1hWzBdWzFdO2ZvcihsZXQgaD0xO2g8YS5sZW5ndGg7aCsrKWZvcihsZXQgdT0wO3U8YS5sZW5ndGg7dSsrKWlmKGFbdV1bMF09PWwpe2w9YVt1XVsxXSxjLnB1c2goYVt1XVsyXSk7YnJlYWt9aWYoYy5sZW5ndGg+MilyZXR1cm4gYztpZihjLmxlbmd0aD09Mil7Y29uc3QgaD1jdShlW2FbMF1bM11bMF1dLGVbYVswXVszXVsxXV0sc1tjWzBdXSksdT1jdShlW2FbMF1bM11bMl1dLGVbYVswXVszXVswXV0sc1tjWzBdXSksZj1vKGgpLGQ9byh1KTtyZXR1cm5bY1swXSxkLGNbMV0sZl19fSk7ZnVuY3Rpb24gbyhhKXtsZXQgYz0tMTtyZXR1cm4gcy5zbGljZSh0Lmxlbmd0aCwxLzApLmZvckVhY2goKGwsaCk9PntsWzBdPT09YVswXSYmbFsxXT09PWFbMV0mJihjPWgrdC5sZW5ndGgpfSksYzwwJiYoYz1zLmxlbmd0aCxzLnB1c2goYSkpLGN9cmV0dXJue3BvbHlnb25zOnIsY2VudGVyczpzfX1mdW5jdGlvbiBjdShpLHQsZSl7aT1NZShpKSx0PU1lKHQpLGU9TWUoZSk7Y29uc3Qgbj1vbShhdShXdCh0LGkpLGUpKTtyZXR1cm4gaWMoJHIoRHIoaSx0KSkubWFwKHM9Pm4qcykpfWZ1bmN0aW9uIG1tKGkpe2NvbnN0IHQ9W107cmV0dXJuIGkuZm9yRWFjaChlPT57aWYoIWUpcmV0dXJuO2xldCBuPWVbZS5sZW5ndGgtMV07Zm9yKGxldCBzIG9mIGUpcz5uJiZ0LnB1c2goW24sc10pLG49c30pLHR9ZnVuY3Rpb24gZ20oaSx0KXtyZXR1cm4gZnVuY3Rpb24oZSl7Y29uc3Qgbj1uZXcgTWFwLHM9bmV3IE1hcDtyZXR1cm4gaS5mb3JFYWNoKChyLG8pPT57Y29uc3QgYT1yLmpvaW4oIi0iKTtuLnNldChhLGVbb10pLHMuc2V0KGEsITApfSksdC5mb3JFYWNoKHI9PntsZXQgbz0wLGE9LTE7Zm9yKGxldCBjPTA7YzwzO2MrKyl7bGV0IGw9c3IoW3JbY10sclsoYysxKSUzXV0pLmpvaW4oIi0iKTtuLmdldChsKT5vJiYobz1uLmdldChsKSxhPWwpfXMuc2V0KGEsITEpfSksaS5tYXAocj0+cy5nZXQoci5qb2luKCItIikpKX19ZnVuY3Rpb24geG0oaSx0KXtjb25zdCBlPW5ldyBTZXQsbj1bXTtpLm1hcChhPT57aWYoIShzYyhhLm1hcChjPT50W2M+dC5sZW5ndGg/MDpjXSkpPjFlLTEyKSlmb3IobGV0IGM9MDtjPDM7YysrKXtsZXQgbD1bYVtjXSxhWyhjKzEpJTNdXSxoPWAke2xbMF19LSR7bFsxXX1gO2UuaGFzKGgpP2UuZGVsZXRlKGgpOmUuYWRkKGAke2xbMV19LSR7bFswXX1gKX19KTtjb25zdCBzPW5ldyBNYXA7bGV0IHI7aWYoZS5mb3JFYWNoKGE9PnthPWEuc3BsaXQoIi0iKS5tYXAoTnVtYmVyKSxzLnNldChhWzBdLGFbMV0pLHI9YVswXX0pLHI9PT12b2lkIDApcmV0dXJuIG47bGV0IG89cjtkb3tuLnB1c2gobyk7bGV0IGE9cy5nZXQobyk7cy5zZXQobywtMSksbz1hfXdoaWxlKG8+LTEmJm8hPT1yKTtyZXR1cm4gbn1mdW5jdGlvbiB3bShpKXtjb25zdCB0PWZ1bmN0aW9uKGUpe2lmKHQuZGVsYXVuYXk9bnVsbCx0Ll9kYXRhPWUsdHlwZW9mIHQuX2RhdGE9PSJvYmplY3QiJiZ0Ll9kYXRhLnR5cGU9PT0iRmVhdHVyZUNvbGxlY3Rpb24iJiYodC5fZGF0YT10Ll9kYXRhLmZlYXR1cmVzKSx0eXBlb2YgdC5fZGF0YT09Im9iamVjdCIpe2NvbnN0IG49dC5fZGF0YS5tYXAocz0+W3QuX3Z4KHMpLHQuX3Z5KHMpLHNdKS5maWx0ZXIocz0+aXNGaW5pdGUoc1swXStzWzFdKSk7dC5wb2ludHM9bi5tYXAocz0+W3NbMF0sc1sxXV0pLHQudmFsaWQ9bi5tYXAocz0+c1syXSksdC5kZWxhdW5heT1jbSh0LnBvaW50cyl9cmV0dXJuIHR9O3JldHVybiB0Ll92eD1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09Im9iamVjdCImJiJ0eXBlImluIGUpcmV0dXJuIHloKGUpWzBdO2lmKDAgaW4gZSlyZXR1cm4gZVswXX0sdC5fdnk9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGU9PSJvYmplY3QiJiYidHlwZSJpbiBlKXJldHVybiB5aChlKVsxXTtpZigxIGluIGUpcmV0dXJuIGVbMV19LHQueD1mdW5jdGlvbihlKXtyZXR1cm4gZT8odC5fdng9ZSx0KTp0Ll92eH0sdC55PWZ1bmN0aW9uKGUpe3JldHVybiBlPyh0Ll92eT1lLHQpOnQuX3Z5fSx0LnBvbHlnb25zPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3Qgbj17dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOltdfTtyZXR1cm4gdC52YWxpZC5sZW5ndGg9PT0wfHwodC5kZWxhdW5heS5wb2x5Z29ucy5mb3JFYWNoKChzLHIpPT5uLmZlYXR1cmVzLnB1c2goe3R5cGU6IkZlYXR1cmUiLGdlb21ldHJ5OnM/e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltbLi4ucyxzWzBdXS5tYXAobz0+dC5kZWxhdW5heS5jZW50ZXJzW29dKV19Om51bGwscHJvcGVydGllczp7c2l0ZTp0LnZhbGlkW3JdLHNpdGVjb29yZGluYXRlczp0LnBvaW50c1tyXSxuZWlnaGJvdXJzOnQuZGVsYXVuYXkubmVpZ2hib3JzW3JdfX0pKSx0LnZhbGlkLmxlbmd0aD09PTEmJm4uZmVhdHVyZXMucHVzaCh7dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6e3R5cGU6IlNwaGVyZSJ9LHByb3BlcnRpZXM6e3NpdGU6dC52YWxpZFswXSxzaXRlY29vcmRpbmF0ZXM6dC5wb2ludHNbMF0sbmVpZ2hib3VyczpbXX19KSksbn0sdC50cmlhbmdsZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT12b2lkIDAmJnQoZSksdC5kZWxhdW5heT97dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOnQuZGVsYXVuYXkudHJpYW5nbGVzLm1hcCgobixzKT0+KG49bi5tYXAocj0+dC5wb2ludHNbcl0pLG4uY2VudGVyPXQuZGVsYXVuYXkuY2VudGVyc1tzXSxuKSkuZmlsdGVyKG49PnNjKG4pPjApLm1hcChuPT4oe3R5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6e2NpcmN1bWNlbnRlcjpuLmNlbnRlcn0sZ2VvbWV0cnk6e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltbLi4ubixuWzBdXV19fSkpfTohMX0sdC5saW5rcz1mdW5jdGlvbihlKXtpZihlIT09dm9pZCAwJiZ0KGUpLCF0LmRlbGF1bmF5KXJldHVybiExO2NvbnN0IG49dC5kZWxhdW5heS5lZGdlcy5tYXAocj0+cmkodC5wb2ludHNbclswXV0sdC5wb2ludHNbclsxXV0pKSxzPXQuZGVsYXVuYXkudXJxdWhhcnQobik7cmV0dXJue3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczp0LmRlbGF1bmF5LmVkZ2VzLm1hcCgocixvKT0+KHt0eXBlOiJGZWF0dXJlIixwcm9wZXJ0aWVzOntzb3VyY2U6dC52YWxpZFtyWzBdXSx0YXJnZXQ6dC52YWxpZFtyWzFdXSxsZW5ndGg6bltvXSx1cnF1aGFydDohIXNbb119LGdlb21ldHJ5Ont0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpbdC5wb2ludHNbclswXV0sdC5wb2ludHNbclsxXV1dfX0pKX19LHQubWVzaD1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXZvaWQgMCYmdChlKSx0LmRlbGF1bmF5P3t0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQuZGVsYXVuYXkuZWRnZXMubWFwKG49Plt0LnBvaW50c1tuWzBdXSx0LnBvaW50c1tuWzFdXV0pfTohMX0sdC5jZWxsTWVzaD1mdW5jdGlvbihlKXtpZihlIT09dm9pZCAwJiZ0KGUpLCF0LmRlbGF1bmF5KXJldHVybiExO2NvbnN0e2NlbnRlcnM6bixwb2x5Z29uczpzfT10LmRlbGF1bmF5LHI9W107Zm9yKGNvbnN0IG8gb2YgcylpZihvKWZvcihsZXQgYT1vLmxlbmd0aCxjPW9bYS0xXSxsPW9bMF0saD0wO2g8YTtjPWwsbD1vWysraF0pbD5jJiZyLnB1c2goW25bY10sbltsXV0pO3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnJ9fSx0Ll9mb3VuZD12b2lkIDAsdC5maW5kPWZ1bmN0aW9uKGUsbixzKXtpZih0Ll9mb3VuZD10LmRlbGF1bmF5LmZpbmQoZSxuLHQuX2ZvdW5kKSwhc3x8cmkoW2Usbl0sdC5wb2ludHNbdC5fZm91bmRdKTxzKXJldHVybiB0Ll9mb3VuZH0sdC5odWxsPWZ1bmN0aW9uKGUpe2UhPT12b2lkIDAmJnQoZSk7Y29uc3Qgbj10LmRlbGF1bmF5Lmh1bGwscz10LnBvaW50cztyZXR1cm4gbi5sZW5ndGg9PT0wP251bGw6e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltbLi4ubi5tYXAocj0+c1tyXSksc1tuWzBdXV1dfX0saT90KGkpOnR9ZnVuY3Rpb24gYm0oaSx0KXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOmJyZWFrO2Nhc2UgMTp0aGlzLnJhbmdlKGkpO2JyZWFrO2RlZmF1bHQ6dGhpcy5yYW5nZSh0KS5kb21haW4oaSk7YnJlYWt9cmV0dXJuIHRoaXN9ZnVuY3Rpb24gcmMoaSx0LGUpe2kucHJvdG90eXBlPXQucHJvdG90eXBlPWUsZS5jb25zdHJ1Y3Rvcj1pfWZ1bmN0aW9uIGx1KGksdCl7dmFyIGU9T2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSk7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIG5zKCl7fXZhciBpcz0uNyxVcj0xL2lzLGZpPSJcXHMqKFsrLV0/XFxkKylcXHMqIixzcz0iXFxzKihbKy1dPyg/OlxcZCpcXC4pP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pXFxzKiIsQWU9IlxccyooWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixNbT0vXiMoWzAtOWEtZl17Myw4fSkkLyxBbT1uZXcgUmVnRXhwKGBecmdiXFwoJHtmaX0sJHtmaX0sJHtmaX1cXCkkYCksX209bmV3IFJlZ0V4cChgXnJnYlxcKCR7QWV9LCR7QWV9LCR7QWV9XFwpJGApLHZtPW5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtmaX0sJHtmaX0sJHtmaX0sJHtzc31cXCkkYCksU209bmV3IFJlZ0V4cChgXnJnYmFcXCgke0FlfSwke0FlfSwke0FlfSwke3NzfVxcKSRgKSx6bT1uZXcgUmVnRXhwKGBeaHNsXFwoJHtzc30sJHtBZX0sJHtBZX1cXCkkYCksVG09bmV3IFJlZ0V4cChgXmhzbGFcXCgke3NzfSwke0FlfSwke0FlfSwke3NzfVxcKSRgKSxodT17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtyYyhucyxycyx7Y29weShpKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLGkpfSxkaXNwbGF5YWJsZSgpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDp1dSxmb3JtYXRIZXg6dXUsZm9ybWF0SGV4ODpQbSxmb3JtYXRIc2w6RW0sZm9ybWF0UmdiOmZ1LHRvU3RyaW5nOmZ1fSk7ZnVuY3Rpb24gdXUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKX1mdW5jdGlvbiBQbSgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleDgoKX1mdW5jdGlvbiBFbSgpe3JldHVybiBndSh0aGlzKS5mb3JtYXRIc2woKX1mdW5jdGlvbiBmdSgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpfWZ1bmN0aW9uIHJzKGkpe3ZhciB0LGU7cmV0dXJuIGk9KGkrIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCh0PU1tLmV4ZWMoaSkpPyhlPXRbMV0ubGVuZ3RoLHQ9cGFyc2VJbnQodFsxXSwxNiksZT09PTY/ZHUodCk6ZT09PTM/bmV3IE90KHQ+PjgmMTV8dD4+NCYyNDAsdD4+NCYxNXx0JjI0MCwodCYxNSk8PDR8dCYxNSwxKTplPT09OD9Wcih0Pj4yNCYyNTUsdD4+MTYmMjU1LHQ+PjgmMjU1LCh0JjI1NSkvMjU1KTplPT09ND9Wcih0Pj4xMiYxNXx0Pj44JjI0MCx0Pj44JjE1fHQ+PjQmMjQwLHQ+PjQmMTV8dCYyNDAsKCh0JjE1KTw8NHx0JjE1KS8yNTUpOm51bGwpOih0PUFtLmV4ZWMoaSkpP25ldyBPdCh0WzFdLHRbMl0sdFszXSwxKToodD1fbS5leGVjKGkpKT9uZXcgT3QodFsxXSoyNTUvMTAwLHRbMl0qMjU1LzEwMCx0WzNdKjI1NS8xMDAsMSk6KHQ9dm0uZXhlYyhpKSk/VnIodFsxXSx0WzJdLHRbM10sdFs0XSk6KHQ9U20uZXhlYyhpKSk/VnIodFsxXSoyNTUvMTAwLHRbMl0qMjU1LzEwMCx0WzNdKjI1NS8xMDAsdFs0XSk6KHQ9em0uZXhlYyhpKSk/bXUodFsxXSx0WzJdLzEwMCx0WzNdLzEwMCwxKToodD1UbS5leGVjKGkpKT9tdSh0WzFdLHRbMl0vMTAwLHRbM10vMTAwLHRbNF0pOmh1Lmhhc093blByb3BlcnR5KGkpP2R1KGh1W2ldKTppPT09InRyYW5zcGFyZW50Ij9uZXcgT3QoTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBkdShpKXtyZXR1cm4gbmV3IE90KGk+PjE2JjI1NSxpPj44JjI1NSxpJjI1NSwxKX1mdW5jdGlvbiBWcihpLHQsZSxuKXtyZXR1cm4gbjw9MCYmKGk9dD1lPU5hTiksbmV3IE90KGksdCxlLG4pfWZ1bmN0aW9uIENtKGkpe3JldHVybiBpIGluc3RhbmNlb2YgbnN8fChpPXJzKGkpKSxpPyhpPWkucmdiKCksbmV3IE90KGkucixpLmcsaS5iLGkub3BhY2l0eSkpOm5ldyBPdH1mdW5jdGlvbiBvYyhpLHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/Q20oaSk6bmV3IE90KGksdCxlLG49PW51bGw/MTpuKX1mdW5jdGlvbiBPdChpLHQsZSxuKXt0aGlzLnI9K2ksdGhpcy5nPSt0LHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K259cmMoT3Qsb2MsbHUobnMse2JyaWdodGVyKGkpe3JldHVybiBpPWk9PW51bGw/VXI6TWF0aC5wb3coVXIsaSksbmV3IE90KHRoaXMucippLHRoaXMuZyppLHRoaXMuYippLHRoaXMub3BhY2l0eSl9LGRhcmtlcihpKXtyZXR1cm4gaT1pPT1udWxsP2lzOk1hdGgucG93KGlzLGkpLG5ldyBPdCh0aGlzLnIqaSx0aGlzLmcqaSx0aGlzLmIqaSx0aGlzLm9wYWNpdHkpfSxyZ2IoKXtyZXR1cm4gdGhpc30sY2xhbXAoKXtyZXR1cm4gbmV3IE90KFRuKHRoaXMuciksVG4odGhpcy5nKSxUbih0aGlzLmIpLHFyKHRoaXMub3BhY2l0eSkpfSxkaXNwbGF5YWJsZSgpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6cHUsZm9ybWF0SGV4OnB1LGZvcm1hdEhleDg6Qm0sZm9ybWF0UmdiOnl1LHRvU3RyaW5nOnl1fSkpO2Z1bmN0aW9uIHB1KCl7cmV0dXJuYCMke1BuKHRoaXMucil9JHtQbih0aGlzLmcpfSR7UG4odGhpcy5iKX1gfWZ1bmN0aW9uIEJtKCl7cmV0dXJuYCMke1BuKHRoaXMucil9JHtQbih0aGlzLmcpfSR7UG4odGhpcy5iKX0ke1BuKChpc05hTih0aGlzLm9wYWNpdHkpPzE6dGhpcy5vcGFjaXR5KSoyNTUpfWB9ZnVuY3Rpb24geXUoKXtjb25zdCBpPXFyKHRoaXMub3BhY2l0eSk7cmV0dXJuYCR7aT09PTE/InJnYigiOiJyZ2JhKCJ9JHtUbih0aGlzLnIpfSwgJHtUbih0aGlzLmcpfSwgJHtUbih0aGlzLmIpfSR7aT09PTE/IikiOmAsICR7aX0pYH1gfWZ1bmN0aW9uIHFyKGkpe3JldHVybiBpc05hTihpKT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSxpKSl9ZnVuY3Rpb24gVG4oaSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoaSl8fDApKX1mdW5jdGlvbiBQbihpKXtyZXR1cm4gaT1UbihpKSwoaTwxNj8iMCI6IiIpK2kudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIG11KGksdCxlLG4pe3JldHVybiBuPD0wP2k9dD1lPU5hTjplPD0wfHxlPj0xP2k9dD1OYU46dDw9MCYmKGk9TmFOKSxuZXcgeWUoaSx0LGUsbil9ZnVuY3Rpb24gZ3UoaSl7aWYoaSBpbnN0YW5jZW9mIHllKXJldHVybiBuZXcgeWUoaS5oLGkucyxpLmwsaS5vcGFjaXR5KTtpZihpIGluc3RhbmNlb2YgbnN8fChpPXJzKGkpKSwhaSlyZXR1cm4gbmV3IHllO2lmKGkgaW5zdGFuY2VvZiB5ZSlyZXR1cm4gaTtpPWkucmdiKCk7dmFyIHQ9aS5yLzI1NSxlPWkuZy8yNTUsbj1pLmIvMjU1LHM9TWF0aC5taW4odCxlLG4pLHI9TWF0aC5tYXgodCxlLG4pLG89TmFOLGE9ci1zLGM9KHIrcykvMjtyZXR1cm4gYT8odD09PXI/bz0oZS1uKS9hKyhlPG4pKjY6ZT09PXI/bz0obi10KS9hKzI6bz0odC1lKS9hKzQsYS89YzwuNT9yK3M6Mi1yLXMsbyo9NjApOmE9Yz4wJiZjPDE/MDpvLG5ldyB5ZShvLGEsYyxpLm9wYWNpdHkpfWZ1bmN0aW9uIEZtKGksdCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT9ndShpKTpuZXcgeWUoaSx0LGUsbj09bnVsbD8xOm4pfWZ1bmN0aW9uIHllKGksdCxlLG4pe3RoaXMuaD0raSx0aGlzLnM9K3QsdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rbn1yYyh5ZSxGbSxsdShucyx7YnJpZ2h0ZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9VcjpNYXRoLnBvdyhVcixpKSxuZXcgeWUodGhpcy5oLHRoaXMucyx0aGlzLmwqaSx0aGlzLm9wYWNpdHkpfSxkYXJrZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9pczpNYXRoLnBvdyhpcyxpKSxuZXcgeWUodGhpcy5oLHRoaXMucyx0aGlzLmwqaSx0aGlzLm9wYWNpdHkpfSxyZ2IoKXt2YXIgaT10aGlzLmglMzYwKyh0aGlzLmg8MCkqMzYwLHQ9aXNOYU4oaSl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsZT10aGlzLmwsbj1lKyhlPC41P2U6MS1lKSp0LHM9MiplLW47cmV0dXJuIG5ldyBPdChhYyhpPj0yNDA/aS0yNDA6aSsxMjAscyxuKSxhYyhpLHMsbiksYWMoaTwxMjA/aSsyNDA6aS0xMjAscyxuKSx0aGlzLm9wYWNpdHkpfSxjbGFtcCgpe3JldHVybiBuZXcgeWUoeHUodGhpcy5oKSxIcih0aGlzLnMpLEhyKHRoaXMubCkscXIodGhpcy5vcGFjaXR5KSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxmb3JtYXRIc2woKXtjb25zdCBpPXFyKHRoaXMub3BhY2l0eSk7cmV0dXJuYCR7aT09PTE/ImhzbCgiOiJoc2xhKCJ9JHt4dSh0aGlzLmgpfSwgJHtIcih0aGlzLnMpKjEwMH0lLCAke0hyKHRoaXMubCkqMTAwfSUke2k9PT0xPyIpIjpgLCAke2l9KWB9YH19KSk7ZnVuY3Rpb24geHUoaSl7cmV0dXJuIGk9KGl8fDApJTM2MCxpPDA/aSszNjA6aX1mdW5jdGlvbiBIcihpKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigxLGl8fDApKX1mdW5jdGlvbiBhYyhpLHQsZSl7cmV0dXJuKGk8NjA/dCsoZS10KSppLzYwOmk8MTgwP2U6aTwyNDA/dCsoZS10KSooMjQwLWkpLzYwOnQpKjI1NX12YXIgY2M9aT0+KCk9Pmk7ZnVuY3Rpb24gSW0oaSx0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGkrZSp0fX1mdW5jdGlvbiBrbShpLHQsZSl7cmV0dXJuIGk9TWF0aC5wb3coaSxlKSx0PU1hdGgucG93KHQsZSktaSxlPTEvZSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3coaStuKnQsZSl9fWZ1bmN0aW9uIE5tKGkpe3JldHVybihpPStpKT09MT93dTpmdW5jdGlvbih0LGUpe3JldHVybiBlLXQ/a20odCxlLGkpOmNjKGlzTmFOKHQpP2U6dCl9fWZ1bmN0aW9uIHd1KGksdCl7dmFyIGU9dC1pO3JldHVybiBlP0ltKGksZSk6Y2MoaXNOYU4oaSk/dDppKX12YXIgYnU9ZnVuY3Rpb24gaSh0KXt2YXIgZT1ObSh0KTtmdW5jdGlvbiBuKHMscil7dmFyIG89ZSgocz1vYyhzKSkuciwocj1vYyhyKSkuciksYT1lKHMuZyxyLmcpLGM9ZShzLmIsci5iKSxsPXd1KHMub3BhY2l0eSxyLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihoKXtyZXR1cm4gcy5yPW8oaCkscy5nPWEoaCkscy5iPWMoaCkscy5vcGFjaXR5PWwoaCkscysiIn19cmV0dXJuIG4uZ2FtbWE9aSxufSgxKTtmdW5jdGlvbiBSbShpLHQpe3R8fCh0PVtdKTt2YXIgZT1pP01hdGgubWluKHQubGVuZ3RoLGkubGVuZ3RoKTowLG49dC5zbGljZSgpLHM7cmV0dXJuIGZ1bmN0aW9uKHIpe2ZvcihzPTA7czxlOysrcyluW3NdPWlbc10qKDEtcikrdFtzXSpyO3JldHVybiBufX1mdW5jdGlvbiBMbShpKXtyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGkpJiYhKGkgaW5zdGFuY2VvZiBEYXRhVmlldyl9ZnVuY3Rpb24gT20oaSx0KXt2YXIgZT10P3QubGVuZ3RoOjAsbj1pP01hdGgubWluKGUsaS5sZW5ndGgpOjAscz1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkoZSksbztmb3Iobz0wO288bjsrK28pc1tvXT11YyhpW29dLHRbb10pO2Zvcig7bzxlOysrbylyW29dPXRbb107cmV0dXJuIGZ1bmN0aW9uKGEpe2ZvcihvPTA7bzxuOysrbylyW29dPXNbb10oYSk7cmV0dXJuIHJ9fWZ1bmN0aW9uIERtKGksdCl7dmFyIGU9bmV3IERhdGU7cmV0dXJuIGk9K2ksdD0rdCxmdW5jdGlvbihuKXtyZXR1cm4gZS5zZXRUaW1lKGkqKDEtbikrdCpuKSxlfX1mdW5jdGlvbiBXcihpLHQpe3JldHVybiBpPStpLHQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIGkqKDEtZSkrdCplfX1mdW5jdGlvbiAkbShpLHQpe3ZhciBlPXt9LG49e30sczsoaT09PW51bGx8fHR5cGVvZiBpIT0ib2JqZWN0IikmJihpPXt9KSwodD09PW51bGx8fHR5cGVvZiB0IT0ib2JqZWN0IikmJih0PXt9KTtmb3IocyBpbiB0KXMgaW4gaT9lW3NdPXVjKGlbc10sdFtzXSk6bltzXT10W3NdO3JldHVybiBmdW5jdGlvbihyKXtmb3IocyBpbiBlKW5bc109ZVtzXShyKTtyZXR1cm4gbn19dmFyIGxjPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxoYz1uZXcgUmVnRXhwKGxjLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIFVtKGkpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBpfX1mdW5jdGlvbiBWbShpKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkodCkrIiJ9fWZ1bmN0aW9uIHFtKGksdCl7dmFyIGU9bGMubGFzdEluZGV4PWhjLmxhc3RJbmRleD0wLG4scyxyLG89LTEsYT1bXSxjPVtdO2ZvcihpPWkrIiIsdD10KyIiOyhuPWxjLmV4ZWMoaSkpJiYocz1oYy5leGVjKHQpKTspKHI9cy5pbmRleCk+ZSYmKHI9dC5zbGljZShlLHIpLGFbb10/YVtvXSs9cjphWysrb109ciksKG49blswXSk9PT0ocz1zWzBdKT9hW29dP2Fbb10rPXM6YVsrK29dPXM6KGFbKytvXT1udWxsLGMucHVzaCh7aTpvLHg6V3IobixzKX0pKSxlPWhjLmxhc3RJbmRleDtyZXR1cm4gZTx0Lmxlbmd0aCYmKHI9dC5zbGljZShlKSxhW29dP2Fbb10rPXI6YVsrK29dPXIpLGEubGVuZ3RoPDI/Y1swXT9WbShjWzBdLngpOlVtKHQpOih0PWMubGVuZ3RoLGZ1bmN0aW9uKGwpe2Zvcih2YXIgaD0wLHU7aDx0OysraClhWyh1PWNbaF0pLmldPXUueChsKTtyZXR1cm4gYS5qb2luKCIiKX0pfWZ1bmN0aW9uIHVjKGksdCl7dmFyIGU9dHlwZW9mIHQsbjtyZXR1cm4gdD09bnVsbHx8ZT09PSJib29sZWFuIj9jYyh0KTooZT09PSJudW1iZXIiP1dyOmU9PT0ic3RyaW5nIj8obj1ycyh0KSk/KHQ9bixidSk6cW06dCBpbnN0YW5jZW9mIHJzP2J1OnQgaW5zdGFuY2VvZiBEYXRlP0RtOkxtKHQpP1JtOkFycmF5LmlzQXJyYXkodCk/T206dHlwZW9mIHQudmFsdWVPZiE9ImZ1bmN0aW9uIiYmdHlwZW9mIHQudG9TdHJpbmchPSJmdW5jdGlvbiJ8fGlzTmFOKHQpPyRtOldyKShpLHQpfWZ1bmN0aW9uIEhtKGksdCl7cmV0dXJuIGk9K2ksdD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5yb3VuZChpKigxLWUpK3QqZSl9fWZ1bmN0aW9uIFdtKGkpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBpfX1mdW5jdGlvbiBHbShpKXtyZXR1cm4raX12YXIgTXU9WzAsMV07ZnVuY3Rpb24gZGkoaSl7cmV0dXJuIGl9ZnVuY3Rpb24gZmMoaSx0KXtyZXR1cm4odC09aT0raSk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtaSkvdH06V20oaXNOYU4odCk/TmFOOi41KX1mdW5jdGlvbiBabShpLHQpe3ZhciBlO3JldHVybiBpPnQmJihlPWksaT10LHQ9ZSksZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubWF4KGksTWF0aC5taW4odCxuKSl9fWZ1bmN0aW9uIFhtKGksdCxlKXt2YXIgbj1pWzBdLHM9aVsxXSxyPXRbMF0sbz10WzFdO3JldHVybiBzPG4/KG49ZmMocyxuKSxyPWUobyxyKSk6KG49ZmMobixzKSxyPWUocixvKSksZnVuY3Rpb24oYSl7cmV0dXJuIHIobihhKSl9fWZ1bmN0aW9uIEptKGksdCxlKXt2YXIgbj1NYXRoLm1pbihpLmxlbmd0aCx0Lmxlbmd0aCktMSxzPW5ldyBBcnJheShuKSxyPW5ldyBBcnJheShuKSxvPS0xO2ZvcihpW25dPGlbMF0mJihpPWkuc2xpY2UoKS5yZXZlcnNlKCksdD10LnNsaWNlKCkucmV2ZXJzZSgpKTsrK288bjspc1tvXT1mYyhpW29dLGlbbysxXSkscltvXT1lKHRbb10sdFtvKzFdKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9ajAoaSxhLDEsbiktMTtyZXR1cm4gcltjXShzW2NdKGEpKX19ZnVuY3Rpb24gWW0oaSx0KXtyZXR1cm4gdC5kb21haW4oaS5kb21haW4oKSkucmFuZ2UoaS5yYW5nZSgpKS5pbnRlcnBvbGF0ZShpLmludGVycG9sYXRlKCkpLmNsYW1wKGkuY2xhbXAoKSkudW5rbm93bihpLnVua25vd24oKSl9ZnVuY3Rpb24gam0oKXt2YXIgaT1NdSx0PU11LGU9dWMsbixzLHIsbz1kaSxhLGMsbDtmdW5jdGlvbiBoKCl7dmFyIGY9TWF0aC5taW4oaS5sZW5ndGgsdC5sZW5ndGgpO3JldHVybiBvIT09ZGkmJihvPVptKGlbMF0saVtmLTFdKSksYT1mPjI/Sm06WG0sYz1sPW51bGwsdX1mdW5jdGlvbiB1KGYpe3JldHVybiBmPT1udWxsfHxpc05hTihmPStmKT9yOihjfHwoYz1hKGkubWFwKG4pLHQsZSkpKShuKG8oZikpKX1yZXR1cm4gdS5pbnZlcnQ9ZnVuY3Rpb24oZil7cmV0dXJuIG8ocygobHx8KGw9YSh0LGkubWFwKG4pLFdyKSkpKGYpKSl9LHUuZG9tYWluPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUFycmF5LmZyb20oZixHbSksaCgpKTppLnNsaWNlKCl9LHUucmFuZ2U9ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9QXJyYXkuZnJvbShmKSxoKCkpOnQuc2xpY2UoKX0sdS5yYW5nZVJvdW5kPWZ1bmN0aW9uKGYpe3JldHVybiB0PUFycmF5LmZyb20oZiksZT1IbSxoKCl9LHUuY2xhbXA9ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89Zj8hMDpkaSxoKCkpOm8hPT1kaX0sdS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1mLGgoKSk6ZX0sdS51bmtub3duPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWYsdSk6cn0sZnVuY3Rpb24oZixkKXtyZXR1cm4gbj1mLHM9ZCxoKCl9fWZ1bmN0aW9uIFFtKCl7cmV0dXJuIGptKCkoZGksZGkpfWZ1bmN0aW9uIEttKGkpe3JldHVybiBNYXRoLmFicyhpPU1hdGgucm91bmQoaSkpPj0xZTIxP2kudG9Mb2NhbGVTdHJpbmcoImVuIikucmVwbGFjZSgvLC9nLCIiKTppLnRvU3RyaW5nKDEwKX1mdW5jdGlvbiBHcihpLHQpe2lmKChlPShpPXQ/aS50b0V4cG9uZW50aWFsKHQtMSk6aS50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgZSxuPWkuc2xpY2UoMCxlKTtyZXR1cm5bbi5sZW5ndGg+MT9uWzBdK24uc2xpY2UoMik6biwraS5zbGljZShlKzEpXX1mdW5jdGlvbiBwaShpKXtyZXR1cm4gaT1HcihNYXRoLmFicyhpKSksaT9pWzFdOk5hTn1mdW5jdGlvbiB0ZyhpLHQpe3JldHVybiBmdW5jdGlvbihlLG4pe2Zvcih2YXIgcz1lLmxlbmd0aCxyPVtdLG89MCxhPWlbMF0sYz0wO3M+MCYmYT4wJiYoYythKzE+biYmKGE9TWF0aC5tYXgoMSxuLWMpKSxyLnB1c2goZS5zdWJzdHJpbmcocy09YSxzK2EpKSwhKChjKz1hKzEpPm4pKTspYT1pW289KG8rMSklaS5sZW5ndGhdO3JldHVybiByLnJldmVyc2UoKS5qb2luKHQpfX1mdW5jdGlvbiBlZyhpKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvWzAtOV0vZyxmdW5jdGlvbihlKXtyZXR1cm4gaVsrZV19KX19dmFyIG5nPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIFpyKGkpe2lmKCEodD1uZy5leGVjKGkpKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiK2kpO3ZhciB0O3JldHVybiBuZXcgZGMoe2ZpbGw6dFsxXSxhbGlnbjp0WzJdLHNpZ246dFszXSxzeW1ib2w6dFs0XSx6ZXJvOnRbNV0sd2lkdGg6dFs2XSxjb21tYTp0WzddLHByZWNpc2lvbjp0WzhdJiZ0WzhdLnNsaWNlKDEpLHRyaW06dFs5XSx0eXBlOnRbMTBdfSl9WnIucHJvdG90eXBlPWRjLnByb3RvdHlwZTtmdW5jdGlvbiBkYyhpKXt0aGlzLmZpbGw9aS5maWxsPT09dm9pZCAwPyIgIjppLmZpbGwrIiIsdGhpcy5hbGlnbj1pLmFsaWduPT09dm9pZCAwPyI+IjppLmFsaWduKyIiLHRoaXMuc2lnbj1pLnNpZ249PT12b2lkIDA/Ii0iOmkuc2lnbisiIix0aGlzLnN5bWJvbD1pLnN5bWJvbD09PXZvaWQgMD8iIjppLnN5bWJvbCsiIix0aGlzLnplcm89ISFpLnplcm8sdGhpcy53aWR0aD1pLndpZHRoPT09dm9pZCAwP3ZvaWQgMDoraS53aWR0aCx0aGlzLmNvbW1hPSEhaS5jb21tYSx0aGlzLnByZWNpc2lvbj1pLnByZWNpc2lvbj09PXZvaWQgMD92b2lkIDA6K2kucHJlY2lzaW9uLHRoaXMudHJpbT0hIWkudHJpbSx0aGlzLnR5cGU9aS50eXBlPT09dm9pZCAwPyIiOmkudHlwZSsiIn1kYy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsodGhpcy53aWR0aD09PXZvaWQgMD8iIjpNYXRoLm1heCgxLHRoaXMud2lkdGh8MCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKHRoaXMucHJlY2lzaW9uPT09dm9pZCAwPyIiOiIuIitNYXRoLm1heCgwLHRoaXMucHJlY2lzaW9ufDApKSsodGhpcy50cmltPyJ+IjoiIikrdGhpcy50eXBlfTtmdW5jdGlvbiBpZyhpKXt0OmZvcih2YXIgdD1pLmxlbmd0aCxlPTEsbj0tMSxzO2U8dDsrK2Upc3dpdGNoKGlbZV0pe2Nhc2UiLiI6bj1zPWU7YnJlYWs7Y2FzZSIwIjpuPT09MCYmKG49ZSkscz1lO2JyZWFrO2RlZmF1bHQ6aWYoIStpW2VdKWJyZWFrIHQ7bj4wJiYobj0wKTticmVha31yZXR1cm4gbj4wP2kuc2xpY2UoMCxuKStpLnNsaWNlKHMrMSk6aX12YXIgQXU7ZnVuY3Rpb24gc2coaSx0KXt2YXIgZT1HcihpLHQpO2lmKCFlKXJldHVybiBpKyIiO3ZhciBuPWVbMF0scz1lWzFdLHI9cy0oQXU9TWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHMvMykpKSozKSsxLG89bi5sZW5ndGg7cmV0dXJuIHI9PT1vP246cj5vP24rbmV3IEFycmF5KHItbysxKS5qb2luKCIwIik6cj4wP24uc2xpY2UoMCxyKSsiLiIrbi5zbGljZShyKToiMC4iK25ldyBBcnJheSgxLXIpLmpvaW4oIjAiKStHcihpLE1hdGgubWF4KDAsdCtyLTEpKVswXX1mdW5jdGlvbiBfdShpLHQpe3ZhciBlPUdyKGksdCk7aWYoIWUpcmV0dXJuIGkrIiI7dmFyIG49ZVswXSxzPWVbMV07cmV0dXJuIHM8MD8iMC4iK25ldyBBcnJheSgtcykuam9pbigiMCIpK246bi5sZW5ndGg+cysxP24uc2xpY2UoMCxzKzEpKyIuIituLnNsaWNlKHMrMSk6bituZXcgQXJyYXkocy1uLmxlbmd0aCsyKS5qb2luKCIwIil9dmFyIHZ1PXsiJSI6KGksdCk9PihpKjEwMCkudG9GaXhlZCh0KSxiOmk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoMiksYzppPT5pKyIiLGQ6S20sZTooaSx0KT0+aS50b0V4cG9uZW50aWFsKHQpLGY6KGksdCk9PmkudG9GaXhlZCh0KSxnOihpLHQpPT5pLnRvUHJlY2lzaW9uKHQpLG86aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZyg4KSxwOihpLHQpPT5fdShpKjEwMCx0KSxyOl91LHM6c2csWDppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLHg6aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZygxNil9O2Z1bmN0aW9uIFN1KGkpe3JldHVybiBpfXZhciB6dT1BcnJheS5wcm90b3R5cGUubWFwLFR1PVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiByZyhpKXt2YXIgdD1pLmdyb3VwaW5nPT09dm9pZCAwfHxpLnRob3VzYW5kcz09PXZvaWQgMD9TdTp0Zyh6dS5jYWxsKGkuZ3JvdXBpbmcsTnVtYmVyKSxpLnRob3VzYW5kcysiIiksZT1pLmN1cnJlbmN5PT09dm9pZCAwPyIiOmkuY3VycmVuY3lbMF0rIiIsbj1pLmN1cnJlbmN5PT09dm9pZCAwPyIiOmkuY3VycmVuY3lbMV0rIiIscz1pLmRlY2ltYWw9PT12b2lkIDA/Ii4iOmkuZGVjaW1hbCsiIixyPWkubnVtZXJhbHM9PT12b2lkIDA/U3U6ZWcoenUuY2FsbChpLm51bWVyYWxzLFN0cmluZykpLG89aS5wZXJjZW50PT09dm9pZCAwPyIlIjppLnBlcmNlbnQrIiIsYT1pLm1pbnVzPT09dm9pZCAwPyLiiJIiOmkubWludXMrIiIsYz1pLm5hbj09PXZvaWQgMD8iTmFOIjppLm5hbisiIjtmdW5jdGlvbiBsKHUpe3U9WnIodSk7dmFyIGY9dS5maWxsLGQ9dS5hbGlnbixwPXUuc2lnbix5PXUuc3ltYm9sLG09dS56ZXJvLGc9dS53aWR0aCxiPXUuY29tbWEsdz11LnByZWNpc2lvbix4PXUudHJpbSxNPXUudHlwZTtNPT09Im4iPyhiPSEwLE09ImciKTp2dVtNXXx8KHc9PT12b2lkIDAmJih3PTEyKSx4PSEwLE09ImciKSwobXx8Zj09PSIwIiYmZD09PSI9IikmJihtPSEwLGY9IjAiLGQ9Ij0iKTt2YXIgQT15PT09IiQiP2U6eT09PSIjIiYmL1tib3hYXS8udGVzdChNKT8iMCIrTS50b0xvd2VyQ2FzZSgpOiIiLF89eT09PSIkIj9uOi9bJXBdLy50ZXN0KE0pP286IiIsdj12dVtNXSxQPS9bZGVmZ3BycyVdLy50ZXN0KE0pO3c9dz09PXZvaWQgMD82Oi9bZ3Byc10vLnRlc3QoTSk/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSx3KSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCx3KSk7ZnVuY3Rpb24geihTKXt2YXIgQz1BLEU9XyxGLEIsSTtpZihNPT09ImMiKUU9dihTKStFLFM9IiI7ZWxzZXtTPStTO3ZhciBrPVM8MHx8MS9TPDA7aWYoUz1pc05hTihTKT9jOnYoTWF0aC5hYnMoUyksdykseCYmKFM9aWcoUykpLGsmJitTPT0wJiZwIT09IisiJiYoaz0hMSksQz0oaz9wPT09IigiP3A6YTpwPT09Ii0ifHxwPT09IigiPyIiOnApK0MsRT0oTT09PSJzIj9UdVs4K0F1LzNdOiIiKStFKyhrJiZwPT09IigiPyIpIjoiIiksUCl7Zm9yKEY9LTEsQj1TLmxlbmd0aDsrK0Y8QjspaWYoST1TLmNoYXJDb2RlQXQoRiksNDg+SXx8ST41Nyl7RT0oST09PTQ2P3MrUy5zbGljZShGKzEpOlMuc2xpY2UoRikpK0UsUz1TLnNsaWNlKDAsRik7YnJlYWt9fX1iJiYhbSYmKFM9dChTLDEvMCkpO3ZhciBEPUMubGVuZ3RoK1MubGVuZ3RoK0UubGVuZ3RoLFY9RDxnP25ldyBBcnJheShnLUQrMSkuam9pbihmKToiIjtzd2l0Y2goYiYmbSYmKFM9dChWK1MsVi5sZW5ndGg/Zy1FLmxlbmd0aDoxLzApLFY9IiIpLGQpe2Nhc2UiPCI6Uz1DK1MrRStWO2JyZWFrO2Nhc2UiPSI6Uz1DK1YrUytFO2JyZWFrO2Nhc2UiXiI6Uz1WLnNsaWNlKDAsRD1WLmxlbmd0aD4+MSkrQytTK0UrVi5zbGljZShEKTticmVhaztkZWZhdWx0OlM9VitDK1MrRTticmVha31yZXR1cm4gcihTKX1yZXR1cm4gei50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB1KyIifSx6fWZ1bmN0aW9uIGgodSxmKXt2YXIgZD1sKCh1PVpyKHUpLHUudHlwZT0iZiIsdSkpLHA9TWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHBpKGYpLzMpKSkqMyx5PU1hdGgucG93KDEwLC1wKSxtPVR1WzgrcC8zXTtyZXR1cm4gZnVuY3Rpb24oZyl7cmV0dXJuIGQoeSpnKSttfX1yZXR1cm57Zm9ybWF0OmwsZm9ybWF0UHJlZml4Omh9fXZhciBYcixQdSxFdTtvZyh7dGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KTtmdW5jdGlvbiBvZyhpKXtyZXR1cm4gWHI9cmcoaSksUHU9WHIuZm9ybWF0LEV1PVhyLmZvcm1hdFByZWZpeCxYcn1mdW5jdGlvbiBhZyhpKXtyZXR1cm4gTWF0aC5tYXgoMCwtcGkoTWF0aC5hYnMoaSkpKX1mdW5jdGlvbiBjZyhpLHQpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihwaSh0KS8zKSkpKjMtcGkoTWF0aC5hYnMoaSkpKX1mdW5jdGlvbiBsZyhpLHQpe3JldHVybiBpPU1hdGguYWJzKGkpLHQ9TWF0aC5hYnModCktaSxNYXRoLm1heCgwLHBpKHQpLXBpKGkpKSsxfWZ1bmN0aW9uIGhnKGksdCxlLG4pe3ZhciBzPW5wKGksdCxlKSxyO3N3aXRjaChuPVpyKG49PW51bGw/IixmIjpuKSxuLnR5cGUpe2Nhc2UicyI6e3ZhciBvPU1hdGgubWF4KE1hdGguYWJzKGkpLE1hdGguYWJzKHQpKTtyZXR1cm4gbi5wcmVjaXNpb249PW51bGwmJiFpc05hTihyPWNnKHMsbykpJiYobi5wcmVjaXNpb249ciksRXUobixvKX1jYXNlIiI6Y2FzZSJlIjpjYXNlImciOmNhc2UicCI6Y2FzZSJyIjp7bi5wcmVjaXNpb249PW51bGwmJiFpc05hTihyPWxnKHMsTWF0aC5tYXgoTWF0aC5hYnMoaSksTWF0aC5hYnModCkpKSkmJihuLnByZWNpc2lvbj1yLShuLnR5cGU9PT0iZSIpKTticmVha31jYXNlImYiOmNhc2UiJSI6e24ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocj1hZyhzKSkmJihuLnByZWNpc2lvbj1yLShuLnR5cGU9PT0iJSIpKjIpO2JyZWFrfX1yZXR1cm4gUHUobil9ZnVuY3Rpb24gdWcoaSl7dmFyIHQ9aS5kb21haW47cmV0dXJuIGkudGlja3M9ZnVuY3Rpb24oZSl7dmFyIG49dCgpO3JldHVybiBlcChuWzBdLG5bbi5sZW5ndGgtMV0sZT09bnVsbD8xMDplKX0saS50aWNrRm9ybWF0PWZ1bmN0aW9uKGUsbil7dmFyIHM9dCgpO3JldHVybiBoZyhzWzBdLHNbcy5sZW5ndGgtMV0sZT09bnVsbD8xMDplLG4pfSxpLm5pY2U9ZnVuY3Rpb24oZSl7ZT09bnVsbCYmKGU9MTApO3ZhciBuPXQoKSxzPTAscj1uLmxlbmd0aC0xLG89bltzXSxhPW5bcl0sYyxsLGg9MTA7Zm9yKGE8byYmKGw9byxvPWEsYT1sLGw9cyxzPXIscj1sKTtoLS0gPjA7KXtpZihsPU1hKG8sYSxlKSxsPT09YylyZXR1cm4gbltzXT1vLG5bcl09YSx0KG4pO2lmKGw+MClvPU1hdGguZmxvb3Ioby9sKSpsLGE9TWF0aC5jZWlsKGEvbCkqbDtlbHNlIGlmKGw8MClvPU1hdGguY2VpbChvKmwpL2wsYT1NYXRoLmZsb29yKGEqbCkvbDtlbHNlIGJyZWFrO2M9bH1yZXR1cm4gaX0saX1mdW5jdGlvbiBwYygpe3ZhciBpPVFtKCk7cmV0dXJuIGkuY29weT1mdW5jdGlvbigpe3JldHVybiBZbShpLHBjKCkpfSxibS5hcHBseShpLGFyZ3VtZW50cyksdWcoaSl9ZnVuY3Rpb24gZmcoaSx0KXtyZXR1cm4gaS5tYXAoZT0+e2NvbnN0IG49W107bGV0IHM7cmV0dXJuIGUuZm9yRWFjaChyPT57aWYocyl7Y29uc3Qgbz1yaShyLHMpKjE4MC9NYXRoLlBJO2lmKG8+dCl7Y29uc3QgYT1PcChzLHIpLGM9MS9NYXRoLmNlaWwoby90KTtsZXQgbD1jO2Zvcig7bDwxOyluLnB1c2goYShsKSksbCs9Y319bi5wdXNoKHM9cil9KSxufSl9ZnVuY3Rpb24gZGcoaSx7bWluTG5nOnQsbWF4TG5nOmUsbWluTGF0Om4sbWF4TGF0OnN9PXt9KXtjb25zdCByPU1hdGgucm91bmQoeWkoMzYwL2ksMikvTWF0aC5QSSksbz0oMStNYXRoLnNxcnQoNSkpLzIsYT1kPT5kL28qMzYwJTM2MC0xODAsYz1kPT5NYXRoLmFjb3MoMipkL3ItMSkvTWF0aC5QSSoxODAtOTAsbD1kPT5yKihNYXRoLmNvcygoZCs5MCkqTWF0aC5QSS8xODApKzEpLzIsaD1bcyE9PXZvaWQgMD9NYXRoLmNlaWwobChzKSk6MCxuIT09dm9pZCAwP01hdGguZmxvb3IobChuKSk6ci0xXSx1PXQ9PT12b2lkIDAmJmU9PT12b2lkIDA/KCk9PiEwOnQ9PT12b2lkIDA/ZD0+ZDw9ZTplPT09dm9pZCAwP2Q9PmQ+PXQ6ZT49dD9kPT5kPj10JiZkPD1lOmQ9PmQ+PXR8fGQ8PWUsZj1bXTtmb3IobGV0IGQ9aFswXTtkPD1oWzFdO2QrKyl7Y29uc3QgcD1hKGQpO3UocCkmJmYucHVzaChbcCxjKGQpXSl9cmV0dXJuIGZ9ZnVuY3Rpb24geWMoaSx0LGU9ITEpe3JldHVybiBlP0xwKHQsaSk6WHkoaSx0KX1mdW5jdGlvbiBwZyhpLHQpe2NvbnN0IGU9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOml9LFtbbixzXSxbcixvXV09bGgoZSk7aWYoTWF0aC5taW4oTWF0aC5hYnMoci1uKSxNYXRoLmFicyhvLXMpKTx0KXJldHVybltdO2NvbnN0IGE9bj5yfHxvPj04OXx8czw9LTg5O3JldHVybiBkZyh0LHttaW5Mbmc6bixtYXhMbmc6cixtaW5MYXQ6cyxtYXhMYXQ6b30pLmZpbHRlcihjPT55YyhjLGUsYSkpfWZ1bmN0aW9uIHlnKGkse3Jlc29sdXRpb246dD0xLzAsYmJveDplLHByb2plY3Rpb246bn09e30pe2NvbnN0IHM9ZmcoaSx0KSxyPVVpKHMpLG89cGcoaSx0KSxhPVsuLi5yLC4uLm9dLGM9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOml9LFtbbCxoXSxbdSxmXV09bGgoYyksZD1sPnV8fGY+PTg5fHxoPD0tODk7bGV0IHA9W107aWYoZCl7Y29uc3QgTT13bShhKS50cmlhbmdsZXMoKSxBPW5ldyBNYXAoYS5tYXAoKFtfLHZdLFApPT5bYCR7X30tJHt2fWAsUF0pKTtNLmZlYXR1cmVzLmZvckVhY2goXz0+e2NvbnN0IHY9Xy5nZW9tZXRyeS5jb29yZGluYXRlc1swXS5zbGljZSgwLDMpLnJldmVyc2UoKSxQPVtdO2lmKHYuZm9yRWFjaCgoW3osU10pPT57Y29uc3QgQz1gJHt6fS0ke1N9YDtBLmhhcyhDKSYmUC5wdXNoKEEuZ2V0KEMpKX0pLFAubGVuZ3RoPT09Myl7aWYoUC5zb21lKHo9Pno8ci5sZW5ndGgpKXtjb25zdCB6PV8ucHJvcGVydGllcy5jaXJjdW1jZW50ZXI7aWYoIXljKHosYyxkKSlyZXR1cm59cC5wdXNoKC4uLlApfX0pfWVsc2UgaWYoby5sZW5ndGgpe2NvbnN0IE09dHMuZnJvbShhKTtmb3IobGV0IEE9MCxfPU0udHJpYW5nbGVzLmxlbmd0aDtBPF87QSs9Myl7Y29uc3Qgdj1bMiwxLDBdLm1hcCh6PT5NLnRyaWFuZ2xlc1tBK3pdKSxQPXYubWFwKHo9PmFbel0pO2lmKHYuc29tZSh6PT56PHIubGVuZ3RoKSl7Y29uc3Qgej1bMCwxXS5tYXAoUz0+aXAoUCxDPT5DW1NdKSk7aWYoIXljKHosYyxkKSljb250aW51ZX1wLnB1c2goLi4udil9fWVsc2V7Y29uc3R7dmVydGljZXM6TSxob2xlczpBPVtdfT1KaChzKTtwPXV5KE0sQSwyKX1sZXQgeT1lP1tlWzBdLGVbMl1dOnNyKGEsTT0+TVswXSksbT1lP1tlWzFdLGVbM11dOnNyKGEsTT0+TVsxXSk7aWYobil7Y29uc3RbTSxBXT1uKFt5WzBdLG1bMF1dKSxbXyx2XT1uKFt5WzFdLG1bMV1dKTt5PVtNLF9dLG09Wy1BLC12XX1jb25zdCBnPXBjKHksWzAsMV0pLGI9cGMobSxbMCwxXSksdz1hLm1hcCgoW00sQV0pPT57aWYobil7Y29uc3RbXyx2XT1uKFtNLEFdKTtyZXR1cm5bZyhfKSxiKC12KV19ZWxzZSByZXR1cm5bZyhNKSxiKEEpXX0pO3JldHVybntjb250b3VyOnMsdHJpYW5nbGVzOntwb2ludHM6YSxpbmRpY2VzOnAsdXZzOnd9fX1jb25zdCBDdT1uZXcgdWUoKS5zZXRBdHRyaWJ1dGU/InNldEF0dHJpYnV0ZSI6ImFkZEF0dHJpYnV0ZSI7ZnVuY3Rpb24gSnIoaSx0LGUsbil7Y29uc3Qgcz1pLm1hcChyPT5yLm1hcCgoW28sYV0pPT57aWYobil7Y29uc3RbYyxsXT1uKFtvLGFdKTtyZXR1cm5bYywtbCx0XX1yZXR1cm4gZT9aMChvLGEsdCk6W28sYSx0XX0pKTtyZXR1cm4gSmgocyl9ZnVuY3Rpb24gbWcoaSx0LGUsbixzKXtjb25zdHt2ZXJ0aWNlczpyLGhvbGVzOm99PUpyKGksdCxuLHMpLHt2ZXJ0aWNlczphfT1KcihpLGUsbixzKSxjPVVpKFthLHJdKSxsPU1hdGgucm91bmQoYS5sZW5ndGgvMyksaD1uZXcgU2V0KG8pO2xldCB1PTA7Y29uc3QgZj1bXTtmb3IobGV0IHA9MDtwPGw7cCsrKXtsZXQgeT1wKzE7aWYoeT09PWwpeT11O2Vsc2UgaWYoaC5oYXMoeSkpe2NvbnN0IG09eTt5PXUsdT1tfWYucHVzaChwLHArbCx5K2wpLGYucHVzaCh5K2wseSxwKX1jb25zdCBkPVtdO2ZvcihsZXQgcD0xO3A+PTA7cC0tKWZvcihsZXQgeT0wO3k8bDt5Kz0xKWQucHVzaCh5LyhsLTEpLHApO3JldHVybntpbmRpY2VzOmYsdmVydGljZXM6Yyx1dnM6ZCx0b3BWZXJ0czphfX1mdW5jdGlvbiBCdShpLHQsZSxuLHMscil7cmV0dXJue2luZGljZXM6bj9pLmluZGljZXM6aS5pbmRpY2VzLnNsaWNlKCkucmV2ZXJzZSgpLHZlcnRpY2VzOkpyKFtpLnBvaW50c10sdCxzLHIpLnZlcnRpY2VzLHV2czplfX1jb25zdCBGdT0oe3BvbHlnb25HZW9Kc29uOmksc3RhcnRIZWlnaHQ6dCxlbmRIZWlnaHQ6ZSxjdXJ2YXR1cmVSZXNvbHV0aW9uOm49MSxjYXJ0ZXNpYW46cz0hMCxoYXNTaWRlOnI9ITAsaGFzQm90dG9tOm89ITEsaGFzVG9wOmE9ITEscHJvamVjdGlvbjpjLGJib3g6bH0pPT57aS5mb3JFYWNoKGc9PntGeShnKXx8Zy5yZXZlcnNlKCl9KTtjb25zdHtjb250b3VyOmgsdHJpYW5nbGVzOnV9PXlnKGkse3Jlc29sdXRpb246bixiYm94OmwscHJvamVjdGlvbjpjfSk7bGV0IGY9e30sZDtyJiYoZj1tZyhoLHQhPW51bGw/dDplLGUhPW51bGw/ZTp0LHMsYyksZD1mLnRvcFZlcnRzKTtsZXQgcD1bXTsob3x8YSkmJihwPVVpKHUudXZzKSk7bGV0IHk9e307byYmKHk9QnUodSx0LHAsITEscyxjKSk7bGV0IG09e307cmV0dXJuIGEmJihtPUJ1KHUsZSxwLCEwLHMsYykpLHtjb250b3VyOmgsdHJpYW5nbGVzOnUsc2lkZVRvcnNvOmYsYm90dG9tQ2FwOnksdG9wQ2FwOm0sdG9wVmVydHM6ZH19O2NsYXNzIGdnIGV4dGVuZHMgdWV7Y29uc3RydWN0b3IodCxlPXt9KXtzdXBlcigpLHRoaXMudHlwZT0iUG9seWdvbkJ1ZmZlckdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9RnQoe3BvbHlnb25HZW9Kc29uOnQsc3RhcnRIZWlnaHQ6MCxlbmRIZWlnaHQ6MSxoYXNUb3A6ITAsdG9wRmlyc3Q6ITEsaGFzQm90dG9tOiEwLGhhc1NpZGU6ITAsY3VydmF0dXJlUmVzb2x1dGlvbjoxLGNhcnRlc2lhbjohMCx1c2VyRGF0YVJzb09mZnNldDowfSxlKTtjb25zdHtlbmRIZWlnaHQ6bixoYXNUb3A6cyx0b3BGaXJzdDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSxjYXJ0ZXNpYW46Yyx1c2VyRGF0YVJzb09mZnNldDpsLHByb2plY3Rpb246aH09dGhpcy5wYXJhbWV0ZXJzLHtjb250b3VyOnUsc2lkZVRvcnNvOmYsdG9wVmVydHM6ZCxib3R0b21DYXA6cCx0b3BDYXA6eX09RnUoRnQoe30sdGhpcy5wYXJhbWV0ZXJzKSk7bGV0IG09W10sZz1bXSxiPVtdLHc9MDtjb25zdCB4PU09Pntjb25zdCBBPU1hdGgucm91bmQobS5sZW5ndGgvMyksXz1iLmxlbmd0aDttPW0uY29uY2F0KE0udmVydGljZXMpLGc9Zy5jb25jYXQoTS51dnMpLGI9Yi5jb25jYXQoQT9NLmluZGljZXMubWFwKHY9PnYrQSk6TS5pbmRpY2VzKSx0aGlzLmFkZEdyb3VwKF8sYi5sZW5ndGgtXyx3KyspfTtzJiZyJiZ4KHkpLGEmJih4KGYpLHRoaXMudXNlckRhdGEudG9wVmVydHM9bD9Kcih1LG4rbCxjLGgpLnZlcnRpY2VzOmQpLG8mJngocCkscyYmIXImJngoeSksdGhpcy5zZXRJbmRleChiKSx0aGlzW0N1XSgicG9zaXRpb24iLG5ldyBCZShtLDMpKSx0aGlzW0N1XSgidXYiLG5ldyBCZShnLDIpKSx0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl9fXZhciB4Zz1pPT57Y29uc3QgYT1pLHtjb29yZGluYXRlOnQsc3RhcnRIZWlnaHQ6ZSxoZWlnaHQ6bn09YSxzPUd1KGEsWyJjb29yZGluYXRlIiwic3RhcnRIZWlnaHQiLCJoZWlnaHQiXSk7bGV0IHI9ZXx8MDtyZXR1cm4gdHlwZW9mIGUhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbiE9InVuZGVmaW5lZCImJihyPWUrbiksbmV3IGdnKFt0XSxaZShGdCh7fSxzKSx7c3RhcnRIZWlnaHQ6ZSxlbmRIZWlnaHQ6cn0pKX07Y29uc3Qgd2c9KHtjb29yZGluYXRlc0FycjppLHN0YXJ0OnQsZGVwdGg6ZSx1c2VHcm91cHM6bixoYXNUb3A6cyx0b3BGaXJzdDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSxjYXJ0ZXNpYW46Yyxwcm9qZWN0aW9uOmwsY3VydmF0dXJlUmVzb2x1dGlvbjpoLGJib3g6dX0pPT57Y29uc3QgZj1sJiZYaShsKTtmJiYoYz0hMSksdHx8KHQ9WzBdKTtjb25zdCBkPWkubWFwKChwLHkpPT57dmFyIG0sZztyZXR1cm4geGcoe2Nvb3JkaW5hdGU6cCxwcm9qZWN0aW9uOmYsc3RhcnRIZWlnaHQ6KG09dFt5XSkhPW51bGw/bTp0WzBdLGhlaWdodDooZz1lW3ldKSE9bnVsbD9nOmVbMF0saGFzVG9wOnMhPW51bGw/czohMCx0b3BGaXJzdDpyIT1udWxsP3I6ITEsaGFzQm90dG9tOm8hPW51bGw/bzohMCxoYXNTaWRlOmEhPW51bGw/YTohMCxjYXJ0ZXNpYW46YyE9bnVsbD9jOiEwLGN1cnZhdHVyZVJlc29sdXRpb246aCE9bnVsbD9oOjEsYmJveDp1fSl9KTtyZXR1cm4gSmkoZCxuKX0sYmc9KHtjb29yZGluYXRlc0FycjppLGxpbmVXaWR0aDp0LHN0YXJ0OmUsdXNlR3JvdXBzOm59KT0+e2NvbnN0IHI9aS5tYXAoKG8sYSk9Pnt2YXIgYztyZXR1cm4gRnUoe3BvbHlnb25HZW9Kc29uOltvXSxzdGFydEhlaWdodDooYz1lW2FdKSE9bnVsbD9jOmVbMF19KS50b3BWZXJ0c30pLm1hcCgobyxhKT0+e3ZhciBsO2NvbnN0IGM9KGw9dFthXSkhPW51bGw/bDp0WzBdO3JldHVybiBIaCh7bm9kZXM6byxzZXRQb2ludFdpZHRoOigpPT5jfSl9KTtyZXR1cm4gSmkocixuKX07dmFyIE1nPShpLHQsZSk9Pm5ldyBQcm9taXNlKChuLHMpPT57dmFyIHI9Yz0+e3RyeXthKGUubmV4dChjKSl9Y2F0Y2gobCl7cyhsKX19LG89Yz0+e3RyeXthKGUudGhyb3coYykpfWNhdGNoKGwpe3MobCl9fSxhPWM9PmMuZG9uZT9uKGMudmFsdWUpOlByb21pc2UucmVzb2x2ZShjLnZhbHVlKS50aGVuKHIsbyk7YSgoZT1lLmFwcGx5KGksdCkpLm5leHQoKSl9KTtmdW5jdGlvbiBBZyhpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaSkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOmlbZV0sZW51bWVyYWJsZTohMH0pfSx7fSl9KGk9Pntjb25zdCB0PXtydW4oZSxuKXtjb25zdCBzPW5ldyBGdW5jdGlvbigicmV0dXJuICgiK2UrIikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsiKTtyZXR1cm4gcy5hcHBseShzLG4pfSxtZXRob2RzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpfX07YWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZT0+TWcodm9pZCAwLFtlXSxmdW5jdGlvbiooe2RhdGE6bn0pe3RyeXtjb25zdCBzPXRbbi5tZXRob2RdO2lmKHMpe2NvbnN0IHI9eWllbGQgcy5hcHBseShzLG4ucGFyYW1zKTtyLnRyYW5zZmVyJiZyLm1lc3NhZ2U/cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0OnIubWVzc2FnZSxlcnJvcjpudWxsfSxyLnRyYW5zZmVyKTpwb3N0TWVzc2FnZSh7aWQ6bi5pZCxyZXN1bHQ6cixlcnJvcjpudWxsfSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbWV0aG9kICInK24ubWV0aG9kKyciJyl9Y2F0Y2gocyl7cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0Om51bGwsZXJyb3I6QWcocyl9KX19KSksT2JqZWN0LmtleXMoaSkuZm9yRWFjaChlPT57dFtlXT1pW2VdfSkscG9zdE1lc3NhZ2UoInJlYWR5Iil9KSh7ZXh0cnVkZVBvbHlnb246cnksbGluZTpjeSxsaW5lMjpoeSxjb25pY1BvbHlnb246d2csY29uaWNMaW5lOmJnfSl9KSgpOwo=",N=m=>Uint8Array.from(atob(m),t=>t.charCodeAt(0)),R=typeof window!="undefined"&&window.Blob&&new Blob([N(o)],{type:"text/javascript;charset=utf-8"});function T(m){let t;try{if(t=R&&(window.URL||window.webkitURL).createObjectURL(R),!t)throw"";const r=new Worker(t,{name:m==null?void 0:m.name});return r.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(t)}),r}catch(r){return new Worker("data:text/javascript;base64,"+o,{name:m==null?void 0:m.name})}finally{t&&(window.URL||window.webkitURL).revokeObjectURL(t)}}const z=m=>{const t=new BufferGeometry;return Object.keys(m).forEach(r=>{r==="groups"?m[r].forEach(d=>{t.addGroup(d.start,d.count,d.materialIndex)}):r==="index"?t.setIndex(new BufferAttribute(m[r].array,m[r].itemSize)):t.setAttribute(r,new BufferAttribute(m[r].array,m[r].itemSize))}),t};class Q{constructor(t){this.pluginName="worker",this.bufferGeometryLoader=new BufferGeometryLoader,this.cacheObj={},this._dispose=!1,this.options=W({dbName:"base",cacheVersion:"1"},t),this.store=createStore(this.options.dbName,"attributes")}install(t){this.pencil=t;const r=new esusLite.WorkerPool(T,{maxWorkers:this.options.maxWorkers});this.pool=r}geoGeometry(t,r){return s(this,null,function*(){const{mesaage:d,cacheKey:g,userData:v,cacheVersion:C,cb:w}=W(W({},this.options),r),I=this.pool,{err:O,res:ye}=yield I.exec(t,[W({},d)],void 0,!0);if(O)throw O;const Se=z(ye);if(Object.assign(Se.userData,W({},v)),w&&(yield w(Se)),g){const{cacheObj:Pe}=this;Pe[g]||(Pe[g]={[C]:[]}),Pe[g][C].push(W({attributes:ye},v))}return Se})}getCachedGeometry(t){return s(this,null,function*(){const{cacheKey:r,cacheVersion:d}=t;if(r){const g=yield get(r,this.store),v=d||this.options.cacheVersion;return g!=null&&g[v]?g[v].map(C=>{const w=C,{attributes:I}=w,O=x(w,["attributes"]),ye=z(I);return Object.assign(ye.userData,W({},O)),ye}):[]}else return[]})}saveCache(){setMany(Object.entries(this.cacheObj),this.store)}dispose(){this.cacheObj={},this.pool.dispose(),this._dispose=!0}}class RoomEnvironment extends Scene{constructor(){super();const t=new BoxGeometry;t.deleteAttribute("uv");const r=new MeshStandardMaterial({side:BackSide}),d=new MeshStandardMaterial,g=new PointLight(16777215,900,28,2);g.position.set(.418,16.199,.3),this.add(g);const v=new Mesh(t,r);v.position.set(-.757,13.219,.717),v.scale.set(31.713,28.305,28.591),this.add(v);const C=new InstancedMesh(t,d,6),w=new Object3D;w.position.set(-10.906,2.009,1.846),w.rotation.set(0,-.195,0),w.scale.set(2.328,7.905,4.651),w.updateMatrix(),C.setMatrixAt(0,w.matrix),w.position.set(-5.607,-.754,-.758),w.rotation.set(0,.994,0),w.scale.set(1.97,1.534,3.955),w.updateMatrix(),C.setMatrixAt(1,w.matrix),w.position.set(6.167,.857,7.803),w.rotation.set(0,.561,0),w.scale.set(3.927,6.285,3.687),w.updateMatrix(),C.setMatrixAt(2,w.matrix),w.position.set(-2.017,.018,6.124),w.rotation.set(0,.333,0),w.scale.set(2.002,4.566,2.064),w.updateMatrix(),C.setMatrixAt(3,w.matrix),w.position.set(2.291,-.756,-2.621),w.rotation.set(0,-.286,0),w.scale.set(1.546,1.552,1.496),w.updateMatrix(),C.setMatrixAt(4,w.matrix),w.position.set(-2.193,-.369,-5.547),w.rotation.set(0,.516,0),w.scale.set(3.875,3.487,2.986),w.updateMatrix(),C.setMatrixAt(5,w.matrix),this.add(C);const I=new Mesh(t,createAreaLightMaterial(50));I.position.set(-16.116,14.37,8.208),I.scale.set(.1,2.428,2.739),this.add(I);const O=new Mesh(t,createAreaLightMaterial(50));O.position.set(-16.109,18.021,-8.207),O.scale.set(.1,2.425,2.751),this.add(O);const ye=new Mesh(t,createAreaLightMaterial(17));ye.position.set(14.904,12.198,-1.832),ye.scale.set(.15,4.265,6.331),this.add(ye);const Se=new Mesh(t,createAreaLightMaterial(43));Se.position.set(-.462,8.89,14.52),Se.scale.set(4.38,5.441,.088),this.add(Se);const Pe=new Mesh(t,createAreaLightMaterial(20));Pe.position.set(3.235,11.486,-12.541),Pe.scale.set(2.5,2,.1),this.add(Pe);const Ne=new Mesh(t,createAreaLightMaterial(100));Ne.position.set(0,20,0),Ne.scale.set(1,.1,1),this.add(Ne)}dispose(){const t=new Set;this.traverse(r=>{r.isMesh&&(t.add(r.geometry),t.add(r.material))});for(const r of t)r.dispose()}}function createAreaLightMaterial(m){const t=new MeshBasicMaterial;return t.color.setScalar(m),t}class Event{constructor(){T0(this,"event",new events.EventEmitter);T0(this,"eventHandlers",{});T0(this,"on",this.event.on.bind(this.event));T0(this,"emit",this.event.emit.bind(this.event))}addListener(t,r,d,g=!1){r in this.eventHandlers||(this.eventHandlers[r]=[]),this.eventHandlers[r].push({node:t,handler:d,capture:g}),t.addEventListener(r,d,g)}removeListener(t,r){this.eventHandlers[r].filter(({node:d})=>t?d===t:!0).forEach(({node:d,handler:g,capture:v})=>d.removeEventListener(r,g,v)),this.eventHandlers[r]=this.eventHandlers[r].filter(({node:d})=>t?d!==t:!1)}removeAllListeners(){Object.keys(this.eventHandlers).forEach(t=>{this.removeListener("",t)}),this.eventHandlers={}}dispose(){this.removeAllListeners(),this.event.removeAllListeners()}}class Camera extends Event{constructor(){super(...arguments);T0(this,"container");T0(this,"pencil");T0(this,"cameraState",{})}setSaveCamera(r){const d=this.pencil,g=d.cameraPositon,v=d.cameraTarget;this.cameraState[r]=[g.x,g.y,g.z,v.x,v.y,v.z]}useSaveCamera(r,d=!1){return U0(this,null,function*(){const g=this.cameraState[r];return g?(yield this.lookAt(g[0],g[1],g[2],g[3],g[4],g[5],d),!0):!1})}lookAt(r,d,g,v,C,w,I=!1,O=250){return U0(this,null,function*(){this.pencil.controls.smoothTime=O/1e3,yield this.pencil.controls.setLookAt(r,d,g,v,C,w,I),this.pencil.controls.smoothTime=250/1e3})}truck(r,d,g=!1,v=250){return U0(this,null,function*(){this.pencil.controls.smoothTime=v/1e3,this.pencil.controls.restThreshold=0,yield this.pencil.controls.truck(r,d,g),this.pencil.controls.restThreshold=.0025,this.pencil.controls.smoothTime=250/1e3})}dollyTo(r,d=!1,g=250){return U0(this,null,function*(){let v=r;if(typeof v=="string"){const[C,w]=v.split("=");C==="+"?v=this.pencil.controls.distance+ +w:C==="-"?v=this.pencil.controls.distance-+w:C==="*"?v=this.pencil.controls.distance*+w:C==="/"?v=this.pencil.controls.distance/+w:console.error("dollyTo distance error")}this.pencil.controls.smoothTime=g/1e3,yield this.pencil.controls.dollyTo(v,d),this.pencil.controls.smoothTime=250/1e3})}absoluteAngle(r,d){const g=Math.PI*2,v=r-d;return MathUtils.euclideanModulo(v+Math.PI,g)-Math.PI}lookAtTarget(r,d=!1,g=250){return U0(this,null,function*(){this.pencil.controls.smoothTime=g/1e3;const v=this.pencil.controls.azimuthAngle,C=this.pencil.controls.polarAngle,w=this.pencil.controls.distance,I=this.pencil.cameraTarget.clone(),O=r.azimuthAngle||v,ye=r.polarAngle||C,Se=r.distance||w,Pe=r.target||I;yield Promise.all([this.pencil.controls.moveTo(Pe.x,Pe.y,Pe.z,d),this.pencil.controls.dollyTo(Se,d),this.pencil.controls.rotateTo(v+this.absoluteAngle(O,v),C+this.absoluteAngle(ye,C),d)]),this.pencil.controls.smoothTime=250/1e3})}paddingInCssPixel(r,d,g,v,C,w){const{camera:I,controls:O}=this.pencil,ye=I.fov*MathUtils.DEG2RAD,Se=this.pencil.getSize().height,{size:Pe}=r.getSize(),Ne=Pe.x,ke=Pe.y,ht=Pe.z;let He=O.getDistanceToFitBox(Ne,ke,ht),Fe=0,at=0,ct=0,xt=0;for(let Gt=0;Gt<10;Gt++){const Lt=He-ht*.5,Wt=2*Math.tan(ye*.5)*Math.abs(Lt)/Se;Fe=d*Wt,at=v*Wt,ct=C*Wt,xt=g*Wt,He=O.getDistanceToFitBox(Ne+ct+xt,ke+Fe+at,ht)}return O.fitToBox(r.object3d,w,{paddingLeft:ct,paddingRight:xt,paddingBottom:at,paddingTop:Fe})}resetCamera(r=!1,d=250){return U0(this,null,function*(){this.pencil.controls.smoothTime=d/1e3,yield this.pencil.controls.reset(r),this.pencil.controls.smoothTime=250/1e3})}unproject(r,d=0){const g=new Vector3,v=new Vector3,{left:C,top:w,width:I,height:O}=this.container.getBoundingClientRect(),ye=(r.clientX-C)/I*2-1,Se=-((r.clientY-w)/O)*2+1,Pe=this.pencil.cameraPositon.clone();g.set(ye,Se,.5),g.unproject(this.pencil.camera),g.sub(Pe).normalize();const Ne=(d-Pe.z)/g.z;return v.copy(Pe).add(g.multiplyScalar(Ne)),v}dispose(){super.dispose(),this.cameraState={}}}class Command{constructor(t){T0(this,"id");T0(this,"updatable");T0(this,"type");T0(this,"name");T0(this,"editor");T0(this,"json",{});this.id=-1,this.updatable=!1,this.type="",this.name="",this.editor=t}toJSON(){const t={};return t.type=this.type,t.id=this.id,t.name=this.name,t.updatable=this.updatable,t}fromJSON(t){if(this.type=t.type,this.id=t.id,this.name=t.name,this.updatable=t.updatable,!this.editor.config.meta.jsonVersion&&t.objectUuid){const r=this.editor.objectByUuid(t.objectUuid);r&&(t.objectUuid=this.editor.uuidByObject(r));const d=this.editor.baseObjectByUuid(t.objectUuid);d&&(t.objectUuid=this.editor.uuidByBaseObject(d))}}fixJSON(){}}class SetColor extends Command{constructor(t,r,d,g){super(t),this.type="SetColor",this.name=`Set ${d}`,this.updatable=!0,this.object=r,this.attributeName=d,this.oldValue=r!==void 0?this.object[this.attributeName].getHex():void 0,this.newValue=g}execute(){this.object&&(this.object[this.attributeName].setHex(this.newValue),this.editor.emit("objectChanged",this.object))}undo(){this.object[this.attributeName].setHex(this.oldValue),this.editor.emit("objectChanged",this.object)}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.attributeName=this.attributeName,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),this.attributeName=t.attributeName,this.oldValue=t.oldValue,this.newValue=t.newValue}}class SetMaterialColor extends Command{constructor(t,r,d,g,v){super(t),this.type="SetMaterialColor",this.name=`Set Material.${d}`,this.updatable=!0,this.object=r,this.materialSlot=v,this.material=this.editor.getObjectMaterial(r,v),this.oldValue=this.material!==void 0?this.material[d].getHex():void 0,this.newValue=g,this.attributeName=d}execute(){this.material[this.attributeName].setHex(this.newValue),this.editor.emit("materialChanged",this.material)}undo(){this.material[this.attributeName].setHex(this.oldValue),this.editor.emit("materialChanged",this.material)}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByMaterialObject(this.object),t.materialSlot=this.materialSlot,t.attributeName=this.attributeName,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.materialObjectByUuid(t.objectUuid),this.materialSlot=t.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot),this.attributeName=t.attributeName,this.oldValue=t.oldValue,this.newValue=t.newValue}}class SetMaterial extends Command{constructor(t,r,d,g){var v;super(t),this.type="SetMaterial",this.name="New Material",this.object=r,this.materialSlot=g,this.oldMaterial=this.editor.getObjectMaterial(r,g),this.newMaterial=d,(v=this.oldMaterial)!=null&&v.name&&(this.newMaterial.name=this.oldMaterial.name)}execute(){this.editor.setObjectMaterial(this.object,this.materialSlot,this.newMaterial),this.editor.emit("materialChanged",this.newMaterial)}undo(){this.editor.setObjectMaterial(this.object,this.materialSlot,this.oldMaterial),this.editor.emit("materialChanged",this.oldMaterial)}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByMaterialObject(this.object),t.materialSlot=this.materialSlot,t.newMaterial=this.newMaterial.toJSON(),t}fromJSON(t){var r;super.fromJSON(t),this.object=this.editor.materialObjectByUuid(t.objectUuid),this.materialSlot=t.materialSlot,this.materialSlot=t.materialSlot,this.oldMaterial=this.editor.getObjectMaterial(this.object,this.materialSlot),this.newMaterial=parseMaterial(t.newMaterial),((r=this.newMaterial.envMap)==null?void 0:r.name)==="PMREM.cubeUv"&&(this.newMaterial.envMap=this.editor.viewport.vis.getRoomEnvMap())}fixJSON(){const t=this.json;t&&t.oldMaterial&&delete t.oldMaterial}}function parseMaterial(m){if(!m)return null;const t=new ObjectLoader,r=t.parseImages(m.images),d=t.parseTextures(m.textures,r);return t.parseMaterials([m],d)[m.uuid]}const TEXTURE_MAPPING={UVMapping,CubeReflectionMapping,CubeRefractionMapping,EquirectangularReflectionMapping,EquirectangularRefractionMapping,CubeUVReflectionMapping},TEXTURE_WRAPPING={RepeatWrapping,ClampToEdgeWrapping,MirroredRepeatWrapping},TEXTURE_FILTER={NearestFilter,NearestMipmapNearestFilter,NearestMipmapLinearFilter,LinearFilter,LinearMipmapNearestFilter,LinearMipmapLinearFilter};class SetMaterialMap extends Command{constructor(t,r,d,g,v){super(t),this.type="SetMaterialMap",this.name=`Set Material.${d}`,this.object=r,this.materialSlot=v,this.material=this.editor.getObjectMaterial(r,v),this.oldMap=r!==void 0?this.material[d]:void 0,this.newMap=g,this.oldMap&&this.newMap&&(this.newMap.wrapS=this.oldMap.wrapS,this.newMap.wrapT=this.oldMap.wrapT),this.mapName=d}execute(){if(this.material.hasOwnProperty(this.mapName)){if(this.oldMap){const t=new ie$1;t.track(this.oldMap),t.dispose()}this.newMap&&(this.newMap.anisotropy=this.editor.viewport.vis.tier0?1:this.editor.pencil.maxAnisotropy),this.material[this.mapName]=this.newMap,this.playVideo(this.newMap),this.material instanceof Ie$2&&(this.material.useMap=!!this.newMap,this.newMap&&this.newMap.wrapS!==RepeatWrapping&&(this.newMap.wrapS=RepeatWrapping,this.newMap.wrapT=RepeatWrapping,this.newMap.needsUpdate=!0)),(!this.oldMap&&this.newMap||this.oldMap&&!this.newMap)&&(this.material.needsUpdate=!0),this.editor.emit("materialChanged",this.material)}}undo(){this.material[this.mapName]=this.oldMap,this.playVideo(this.oldMap),this.material instanceof Ie$2&&(this.material.useMap=!!this.newMap),(!this.oldMap&&this.newMap||this.oldMap&&!this.newMap)&&(this.material.needsUpdate=!0),this.editor.emit("materialChanged",this.material)}playVideo(t){if(t&&t instanceof VideoTexture){const r=t.source.data;r&&r.play()}}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByMaterialObject(this.object),t.materialSlot=this.materialSlot,t.mapName=this.mapName,t.newMap=serializeMap(this.newMap),t}fromJSON(t){super.fromJSON(t),this.object=this.editor.materialObjectByUuid(t.objectUuid),this.materialSlot=t.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot),this.mapName=t.mapName,this.oldMap=this.object&&this.material?this.material[this.mapName]:void 0,this.newMap=parseTexture(t.newMap)}fixJSON(){const t=this.json;t&&t.oldMap&&delete t.oldMap}}function parseTexture(m){let t=null;if(m){const r=new ObjectLoader;if(m.isVideoTexture){const d=document.createElement("video");d.src=m.images[0].url,d.muted=!0,d.loop=!0,d.preload="auto";const g={[m.images[0].uuid]:new VideoTexture(d)};t=parseVideoTextures([m],g)[m.uuid]}else{const d=r.parseImages(m.images);t=r.parseTextures([m],d)[m.uuid]}t.sourceFile=m.sourceFile}return t}const parseVideoTextures=(m,t)=>{function r(g,v){return typeof g=="number"?g:(console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",g),v[g])}const d={};if(m!==void 0)for(let g=0,v=m.length;g<v;g++){const C=m[g];let w=t[C.image];w.needsUpdate=!0,w.uuid=C.uuid,C.name!==void 0&&(w.name=C.name),C.mapping!==void 0&&(w.mapping=r(C.mapping,TEXTURE_MAPPING)),C.channel!==void 0&&(w.channel=C.channel),C.offset!==void 0&&w.offset.fromArray(C.offset),C.repeat!==void 0&&w.repeat.fromArray(C.repeat),C.center!==void 0&&w.center.fromArray(C.center),C.rotation!==void 0&&(w.rotation=C.rotation),C.wrap!==void 0&&(w.wrapS=r(C.wrap[0],TEXTURE_WRAPPING),w.wrapT=r(C.wrap[1],TEXTURE_WRAPPING)),C.format!==void 0&&(w.format=C.format),C.internalFormat!==void 0&&(w.internalFormat=C.internalFormat),C.type!==void 0&&(w.type=C.type),C.colorSpace!==void 0&&(w.colorSpace=C.colorSpace),C.encoding!==void 0&&(w.encoding=C.encoding),C.minFilter!==void 0&&(w.minFilter=r(C.minFilter,TEXTURE_FILTER)),C.magFilter!==void 0&&(w.magFilter=r(C.magFilter,TEXTURE_FILTER)),C.anisotropy!==void 0&&(w.anisotropy=C.anisotropy),C.flipY!==void 0&&(w.flipY=C.flipY),C.generateMipmaps!==void 0&&(w.generateMipmaps=C.generateMipmaps),C.premultiplyAlpha!==void 0&&(w.premultiplyAlpha=C.premultiplyAlpha),C.unpackAlignment!==void 0&&(w.unpackAlignment=C.unpackAlignment),C.compareFunction!==void 0&&(w.compareFunction=C.compareFunction),C.userData!==void 0&&(w.userData=C.userData),d[C.uuid]=w}return d};function serializeMap(m){if(m==null)return null;const t={geometries:{},materials:{},textures:{},images:{}},r=m.toJSON(t),d=extractFromCache(t.images);return m instanceof VideoTexture&&(d[0].url=m.source.data.src,r.isVideoTexture=!0),d.length>0&&(r.images=d),r.sourceFile=m.sourceFile,r}function extractFromCache(m){const t=[];for(const r in m){const d=m[r];delete d.metadata,t.push(d)}return t}const needsUpdateAttributeName=["transparent","alphaTest","fog","vertexColors","vertexShader","fragmentShader","sizeAttenuation"];class SetMaterialValue extends Command{constructor(t,r,d,g,v){super(t),this.type="SetMaterialValue",this.name=`Set Material.${d}`,this.updatable=!0,this.object=r,this.materialSlot=v,this.material=this.editor.getObjectMaterial(r,v),this.oldValue=this.material!==void 0?this.material[d]:void 0,this.newValue=g,this.attributeName=d}execute(){this.material!==void 0&&(this.material[this.attributeName]=this.newValue,needsUpdateAttributeName.includes(this.attributeName)&&(this.material.needsUpdate=!0),this.editor.emit("objectChanged",this.object),this.editor.emit("materialChanged",this.material),setTimeout(()=>{this.attributeName==="name"&&this.editor.emit("baseObjectListChange")}))}undo(){this.material[this.attributeName]=this.oldValue,needsUpdateAttributeName.includes(this.attributeName)&&(this.material.needsUpdate=!0),this.editor.emit("objectChanged",this.object),this.editor.emit("materialChanged",this.material),setTimeout(()=>{this.attributeName==="name"&&this.editor.emit("baseObjectListChange")})}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByMaterialObject(this.object),t.materialSlot=this.materialSlot,t.attributeName=this.attributeName,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.attributeName=t.attributeName,this.oldValue=t.oldValue,this.newValue=t.newValue,this.object=this.editor.materialObjectByUuid(t.objectUuid),this.materialSlot=t.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot)}}class SetMaterialVector extends Command{constructor(t,r,d,g,v){super(t),this.type="SetMaterialVector",this.name=`Set Material.${d}`,this.updatable=!0,this.object=r,this.materialSlot=v,this.material=this.editor.getObjectMaterial(r,v),this.oldValue=this.material!==void 0?this.material[d].toArray():void 0,this.newValue=g,this.attributeName=d}execute(){this.material[this.attributeName].fromArray(this.newValue),this.editor.emit("materialChanged",this.material)}undo(){this.material[this.attributeName].fromArray(this.oldValue),this.editor.emit("materialChanged",this.material)}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByMaterialObject(this.object),t.materialSlot=this.materialSlot,t.attributeName=this.attributeName,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.materialObjectByUuid(t.objectUuid),this.materialSlot=t.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot),this.attributeName=t.attributeName,this.oldValue=t.oldValue,this.newValue=t.newValue}}class SetMaterialMapVector extends Command{constructor(t,r,d,g,v,C="repeat"){var w,I,O,ye;super(t),this.type="SetMaterialMapVector",this.attributeName2=C,this.name=`Set Material.${d}.${C}`,this.updatable=!0,this.object=r,this.materialSlot=v,this.material=this.editor.getObjectMaterial(r,v),this.material instanceof Ie$2&&d==="map"&&C==="repeat"?this.oldValue=this.material.repeat.toArray():((I=(w=this.material)==null?void 0:w[d])==null?void 0:I[C])instanceof Vector2?this.oldValue=this.material[d][C].toArray():typeof((ye=(O=this.material)==null?void 0:O[d])==null?void 0:ye[C])!="undefined"&&(this.oldValue=this.material[d][C]),this.newValue=g,this.attributeName=d}execute(){var t,r,d,g,v;if((t=this.material)!=null&&t[this.attributeName]){const C=this.attributeName;this.material[C].wrapS!==RepeatWrapping&&(this.material[C].wrapS=RepeatWrapping,this.material[C].wrapT=RepeatWrapping,this.material[C].needsUpdate=!0)}this.material instanceof Ie$2&&this.attributeName==="map"&&this.attributeName2==="repeat"?this.material[this.attributeName2].fromArray(this.newValue):((d=(r=this.material)==null?void 0:r[this.attributeName])==null?void 0:d[this.attributeName2])instanceof Vector2?this.material[this.attributeName][this.attributeName2].fromArray(this.newValue):typeof((v=(g=this.material)==null?void 0:g[this.attributeName])==null?void 0:v[this.attributeName2])!="undefined"&&(this.material[this.attributeName][this.attributeName2]=this.newValue),this.editor.emit("materialChanged",this.material)}undo(){var t,r,d,g;this.material instanceof Ie$2&&this.attributeName==="map"&&this.attributeName2==="repeat"?this.material[this.attributeName2].fromArray(this.oldValue):((r=(t=this.material)==null?void 0:t[this.attributeName])==null?void 0:r[this.attributeName2])instanceof Vector2?this.material[this.attributeName][this.attributeName2].fromArray(this.oldValue):typeof((g=(d=this.material)==null?void 0:d[this.attributeName])==null?void 0:g[this.attributeName2])!="undefined"&&(this.material[this.attributeName][this.attributeName2]=this.oldValue),this.editor.emit("materialChanged",this.material)}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByMaterialObject(this.object),t.materialSlot=this.materialSlot,t.attributeName=this.attributeName,t.attributeName2=this.attributeName2,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.materialObjectByUuid(t.objectUuid),this.materialSlot=t.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot),this.attributeName=t.attributeName,t.attributeName2&&(this.attributeName2=t.attributeName2),this.oldValue=t.oldValue,this.newValue=t.newValue,this.attributeName==="repeat"&&(this.attributeName="map")}}class SetPosition extends Command{constructor(t,r,d,g,v){super(t),this.type="SetPosition",this.name="Set Position",this.updatable=!0,this.cameraControls=v,this.object=r,r!==void 0&&d!==void 0&&(this.oldPosition=r.position.clone(),this.newPosition=d.clone()),g!==void 0&&(this.oldPosition=g.clone())}execute(){this.cameraControls?this.cameraControls.setPosition(this.newPosition.x,this.newPosition.y,this.newPosition.z,!1):(this.object.position.copy(this.newPosition),this.object.updateMatrixWorld(!0)),this.editor.emit("objectChanged",this.object)}undo(){this.cameraControls?this.cameraControls.setPosition(this.oldPosition.x,this.oldPosition.y,this.oldPosition.z,!1):(this.object.position.copy(this.oldPosition),this.object.updateMatrixWorld(!0)),this.editor.emit("objectChanged",this.object)}update(t){this.newPosition.copy(t.newPosition)}toJSON(){var r;const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.oldPosition=(r=this.oldPosition)==null?void 0:r.toArray(),t.newPosition=this.newPosition.toArray(),t.cameraControls=!!this.cameraControls,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),t.oldPosition&&(this.oldPosition=new Vector3().fromArray(t.oldPosition)),this.newPosition=new Vector3().fromArray(t.newPosition),t.cameraControls&&(this.cameraControls=this.editor.pencil.controls)}}class SetRotation extends Command{constructor(t,r,d,g){super(t),this.type="SetRotation",this.name="Set Rotation",this.updatable=!0,this.object=r,r!==void 0&&d!==void 0&&(this.oldRotation=r.rotation.clone(),this.newRotation=d.clone()),g!==void 0&&(this.oldRotation=g.clone())}execute(){this.object.rotation.copy(this.newRotation),this.object.updateMatrixWorld(!0),this.editor.emit("objectChanged",this.object)}undo(){this.object.rotation.copy(this.oldRotation),this.object.updateMatrixWorld(!0),this.editor.emit("objectChanged",this.object)}update(t){this.newRotation.copy(t.newRotation)}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.oldRotation=this.oldRotation.toArray(),t.newRotation=this.newRotation.toArray(),t}fromJSON(t){super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),t.oldRotation&&(this.oldRotation=new Euler().fromArray(t.oldRotation)),this.newRotation=new Euler().fromArray(t.newRotation)}}class SetScale extends Command{constructor(t,r,d,g){super(t),this.type="SetScale",this.name="Set Scale",this.updatable=!0,this.object=r,r!==void 0&&d!==void 0&&(this.oldScale=r.scale.clone(),this.newScale=d.clone()),g!==void 0&&(this.oldScale=g.clone())}execute(){this.object.scale.copy(this.newScale),this.object.updateMatrixWorld(!0),this.editor.emit("objectChanged",this.object)}undo(){this.object.scale.copy(this.oldScale),this.object.updateMatrixWorld(!0),this.editor.emit("objectChanged",this.object)}update(t){this.newScale.copy(t.newScale)}toJSON(){var r;const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.oldScale=(r=this.oldScale)==null?void 0:r.toArray(),t.newScale=this.newScale.toArray(),t}fromJSON(t){super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),t.oldScale&&(this.oldScale=new Vector3().fromArray(t.oldScale)),this.newScale=new Vector3().fromArray(t.newScale)}}class SetValue extends Command{constructor(t,r,d,g,v){super(t),this.type="SetValue",this.name=`Set ${d}`,this.updatable=!0,this.object=r,this.properties=v,this.attributeName=d;const C=r===void 0?void 0:this.properties?this.object[this.properties]:this.object;this.oldValue=C!==void 0?C[d]:void 0,this.newValue=g}execute(){const t=this.properties?this.object[this.properties]:this.object;t&&((t instanceof RectAreaLight||t instanceof AmbientLight)&&this.attributeName==="castShadow"||(t[this.attributeName]=this.newValue,this.fixObj(),this.editor.emit("objectChanged",this.object)))}fixObj(){const t=this.properties?this.object[this.properties]:this.object;t.isCamera&&["fov","left","right","top","bottom","near","far"].includes(this.attributeName)&&t.updateProjectionMatrix(),setTimeout(()=>{(this.attributeName==="name"||this.attributeName==="prefab"||this.attributeName==="visible"||this.attributeName==="keepCamera")&&this.editor.emit("baseObjectListChange")})}undo(){const t=this.properties?this.object[this.properties]:this.object;t[this.attributeName]=this.oldValue,this.fixObj(),this.editor.emit("objectChanged",this.object)}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.properties=this.properties,t.attributeName=this.attributeName,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.attributeName=t.attributeName,this.oldValue=t.oldValue,this.newValue=t.newValue,this.object=this.editor.objectByUuid(t.objectUuid),this.properties=t.properties}}class SetVector extends Command{constructor(t,r,d,g,v){super(t),this.type="SetVector",this.name=`Set ${d}`,this.updatable=!0,this.object=r,this.properties=v,this.attributeName=d;const C=r===void 0?void 0:this.properties?this.object[this.properties]:this.object;this.oldValue=C!==void 0?C[d].toArray():void 0,this.newValue=g}execute(){const t=this.properties?this.object[this.properties]:this.object;t&&(t[this.attributeName].fromArray(this.newValue),this.fixObj(),this.editor.emit("objectChanged",this.object))}fixObj(){this.editor.playing||this.attributeName==="mapSize"&&this.object[this.properties].map&&(this.object[this.properties].map.dispose(),this.object[this.properties].map=null)}undo(){(this.properties?this.object[this.properties]:this.object)[this.attributeName].fromArray(this.oldValue),this.fixObj(),this.editor.emit("objectChanged",this.object)}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.properties=this.properties,t.attributeName=this.attributeName,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),this.attributeName=t.attributeName,this.oldValue=t.oldValue,this.newValue=t.newValue,this.properties=t.properties}}class AddVis extends Command{constructor(r,d,g){super(r);T0(this,"visType");T0(this,"visOptions");this.type="AddVis",this.visType=d,this.visOptions=g,d!==void 0&&(this.name=`Add Vis: ${d}`)}execute(){return U0(this,null,function*(){yield this.editor.viewport.setVis(this.visType,this.visOptions),this.editor.select(null)})}undo(){const r=window.confirm("将删除所有记录,是否继续?");return r&&this.editor.viewport.dispose(),r}toJSON(){const r=super.toJSON();return r.visType=this.visType,r.visOptions=this.visOptions,r}fromJSON(r){super.fromJSON(r),this.visType=r.visType,this.visOptions=r.visOptions}}class AddObject extends Command{constructor(r,d,g){super(r);T0(this,"objectType");T0(this,"objectOptions");T0(this,"obj");T0(this,"addObjectUuid");this.type="AddObject",this.objectType=d,this.objectOptions=g,d!==void 0&&(this.name=`Add Object: ${d}`)}execute(){return U0(this,null,function*(){var d;const r=this.editor.viewport.vis;this.obj=yield r.lead.draw(this.objectType,Ui(fi({},this.objectOptions),{key:`${this.id}`})),this.obj.userData.updateKey!==!1&&r.lead.updateBaseObjectKey(this.obj,`$t:_${this.id}`),this.addObjectUuid=this.obj.key,this.editor.select(this.obj.key),(d=this.editor.viewport.vis)==null||d.initBaseObjectUserData(this.obj)})}undo(){this.obj.erase(),this.editor.select(null)}toJSON(){const r=super.toJSON();return r.objectType=this.objectType,r.objectOptions=this.objectOptions,r.addObjectUuid=this.addObjectUuid,r}fromJSON(r){super.fromJSON(r),this.objectType=r.objectType,this.objectOptions=r.objectOptions,this.addObjectUuid=r.addObjectUuid}fixJSON(){const r=this.json;r&&!r.addObjectUuid&&(r.addObjectUuid=this.addObjectUuid)}}class RemoveObject extends Command{constructor(r,d){super(r);T0(this,"object");T0(this,"objectUuid");this.type="RemoveObject",this.name="Remove Object",this.object=d,this.objectUuid=this.editor.uuidByBaseObject(d)}execute(){this.editor.playing?this.object.erase():(this.object.hide(),this.object.userData.selectHide=!0,this.object.mList.rmBaseObjectMap(this.object)),this.editor.emit("baseObjectListChange"),this.editor.select(null)}undo(){return U0(this,null,function*(){this.object.show(),this.object.mList.addBaseObjectMap(this.object),delete this.object.userData.selectHide,this.editor.emit("baseObjectListChange")})}toJSON(){const r=super.toJSON();return r.objectUuid=this.objectUuid,r}fromJSON(r){super.fromJSON(r),this.object=this.editor.baseObjectByUuid(r.objectUuid)}}class CopyObject extends Command{constructor(r,d){super(r);T0(this,"object");T0(this,"copyObject",null);T0(this,"copyObjectUuid");this.type="CopyObject",this.name="Copy Object",this.object=d}execute(){return U0(this,null,function*(){var v;const r=this.editor.viewport.vis,d=this.object.key,g=yield this.object.instantiate(void 0,{key:`${this.id}`});this.copyObject=g,g.userData.updateKey!==!1&&r.lead.updateBaseObjectKey(g,`${d}_${this.id}`),this.copyObjectUuid=g.key,this.editor.select(this.copyObjectUuid),(v=this.editor.viewport.vis)==null||v.initBaseObjectUserData(g)})}undo(){return U0(this,null,function*(){var r;(r=this.copyObject)==null||r.erase(),this.editor.select(null)})}toJSON(){const r=super.toJSON();return r.objectUuid=this.editor.uuidByBaseObject(this.object),r.copyObjectUuid=this.copyObjectUuid,r}fromJSON(r){super.fromJSON(r),this.object=this.editor.baseObjectByUuid(r.objectUuid),this.copyObjectUuid=r.copyObjectUuid}fixJSON(){const r=this.json;r&&!r.copyObjectUuid&&(r.copyObjectUuid=this.copyObjectUuid)}}class CopyMaterial extends Command{constructor(r,d){super(r);T0(this,"originKey");T0(this,"copyKey");this.type="CopyMaterial",this.name="Copy Material",this.originKey=d}execute(){return U0(this,null,function*(){this.copyKey=`material_${this.id}`,this.editor.pencil.mList.copy(this.originKey,this.copyKey)})}undo(){return U0(this,null,function*(){this.editor.pencil.mList.remove(this.copyKey)})}toJSON(){const r=super.toJSON();return r.originKey=this.originKey,r.copyKey=this.copyKey,r}fromJSON(r){super.fromJSON(r),this.originKey=r.originKey,this.copyKey=r.copyKey}}class SetObjectMaterial extends Command{constructor(r,d,g,v){var w;super(r);T0(this,"object");T0(this,"oldValue");T0(this,"newValue");T0(this,"materialSlot");this.type="SetObjectMaterial",this.name="Set Object Material",this.object=d,this.materialSlot=g;const C=this.editor.getObjectMaterial(d,g);this.oldValue=(w=this.editor.pencil)==null?void 0:w.mList.getKey(C),this.newValue=v}execute(){return U0(this,null,function*(){const r=this.editor.pencil.mList;r.get(this.newValue)&&(this.editor.setObjectMaterial(this.object,this.materialSlot,r.get(this.newValue),!0),this.editor.emit("materialChanged",this.object))})}undo(){return U0(this,null,function*(){const r=this.editor.pencil.mList;this.editor.setObjectMaterial(this.object,this.materialSlot,r.get(this.oldValue),!0),this.editor.emit("materialChanged",this.object)})}toJSON(){const r=super.toJSON();return r.objectUuid=this.editor.uuidByObject(this.object),r.oldType=this.oldValue,r.newType=this.newValue,r.materialSlot=this.materialSlot,r}fromJSON(r){super.fromJSON(r),this.object=this.editor.objectByUuid(r.objectUuid),this.oldValue=r.oldValue,this.newValue=r.newValue,this.materialSlot=r.materialSlot}}class SetSetting extends Command{constructor(r,d,g){super(r);T0(this,"attributeName");T0(this,"newValue");T0(this,"oldValue");this.type="SetSetting",this.updatable=!0,this.name=`Set Setting.${d}`,this.attributeName=d,this.newValue=g,r.viewport.vis&&(this.oldValue=r.viewport.vis.settings[d])}execute(){return U0(this,null,function*(){const r=this.editor.viewport.vis;r.settings[this.attributeName]=this.newValue,yield r.settings[this.attributeName],this.editor.emit("settingsChanged")})}undo(){return U0(this,null,function*(){const r=this.editor.viewport.vis;r.settings[this.attributeName]=this.oldValue,yield r.settings[this.attributeName],this.editor.emit("settingsChanged")})}update(r){this.newValue=r.newValue}toJSON(){const r=super.toJSON();return r.name=this.name,r.attributeName=this.attributeName,r.newValue=this.newValue,r.oldValue=this.oldValue,r}fromJSON(r){super.fromJSON(r),this.name=r.name,this.attributeName=r.attributeName||r.name,this.newValue=r.newValue,this.oldValue=r.oldValue}}class SetTarget extends Command{constructor(t,r,d,g,v){super(t),this.type="SetTarget",this.name="Set Target",this.updatable=!0,this.cameraControls=v,this.object=r,r!==void 0&&d!==void 0&&(this.oldPosition=r.position.clone(),this.newPosition=d.clone()),g!==void 0&&(this.oldPosition=g.clone())}execute(){this.cameraControls?this.cameraControls.setTarget(this.newPosition.x,this.newPosition.y,this.newPosition.z,!1):(this.object.target.copy(this.newPosition),this.object.target.updateMatrixWorld(!0)),this.editor.emit("objectChanged",this.object)}undo(){this.cameraControls?this.cameraControls.setTarget(this.oldPosition.x,this.oldPosition.y,this.oldPosition.z,!1):(this.object.target.copy(this.oldPosition),this.object.target.updateMatrixWorld(!0)),this.editor.emit("objectChanged",this.object)}update(t){this.newPosition.copy(t.newPosition)}toJSON(){var r;const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.oldPosition=(r=this.oldPosition)==null?void 0:r.toArray(),t.newPosition=this.newPosition.toArray(),t.cameraControls=!!this.cameraControls,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),t.oldPosition&&(this.oldPosition=new Vector3().fromArray(t.oldPosition)),this.newPosition=new Vector3().fromArray(t.newPosition),t.cameraControls&&(this.cameraControls=this.editor.pencil.controls)}}class SetSceenMap extends SetMaterialMap{constructor(t,r,d,g,v){super(t),this.type="SetSceenMap",this.name="Set Sceen.background",this.object=r,this.materialSlot=v,this.material=r!==void 0?r[v]:void 0,this.oldMap=r!==void 0?this.material[d]:void 0,this.newMap=g,this.oldMap&&this.newMap&&(this.newMap.wrapS=this.oldMap.wrapS,this.newMap.wrapT=this.oldMap.wrapT),this.mapName=d}fromJSON(t){super.fromJSON(t),this.oldMap=this.object[this.materialSlot][this.mapName],this.material=this.object[this.materialSlot]}}class SetGeometry extends Command{constructor(t,r=null,d){super(t),this.type="SetGeometry",this.name="Set Geometry",this.updatable=!0,this.object=r,this.oldGeometry=r!==null?r.geometry:null,this.newGeometry=d||null}execute(){this.object.geometry.dispose(),this.object.geometry=this.newGeometry,this.object.geometry.computeBoundingSphere(),this.editor.emit("geometryChanged",this.object)}undo(){this.object.geometry.dispose(),this.object.geometry=this.oldGeometry,this.object.geometry.computeBoundingSphere(),this.editor.emit("geometryChanged",this.object)}update(t){this.newGeometry=t.newGeometry}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.newGeometry=this.geometryToJSON(this.newGeometry),t}geometryToJSON(t){return t?t.type==="MeshLine"?{type:"MeshLine",points:t.points,variableWidth:!!t.widthCallback}:t.toJSON():void 0}parseGeometry(t){if(!t)return;if(t.type==="MeshLine"){const g=new Ve;return g.setPoints(t.points,t.variableWidth?v=>v:void 0),g}return new ObjectLoader().parseGeometries([t])[t.uuid]}fromJSON(t){var r;super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),this.oldGeometry=((r=this.object)==null?void 0:r.geometry)||null,this.newGeometry=this.parseGeometry(t.newGeometry)}}const Commands=Object.freeze(Object.defineProperty({__proto__:null,AddObject,AddVis,CopyMaterial,CopyObject,RemoveObject,SetColor,SetGeometry,SetMaterial,SetMaterialColor,SetMaterialMap,SetMaterialMapVector,SetMaterialValue,SetMaterialVector,SetObjectMaterial,SetPosition,SetRotation,SetScale,SetSceenMap,SetSetting,SetTarget,SetValue,SetVector},Symbol.toStringTag,{value:"Module"}));class History{constructor(t){T0(this,"editor");T0(this,"undos");T0(this,"redos");T0(this,"lastCmdTime");T0(this,"idCounter");T0(this,"historyDisabled");this.editor=t,this.undos=[],this.redos=[],this.lastCmdTime=Date.now(),this.idCounter=0,this.historyDisabled=!1}execute(t,r){return U0(this,null,function*(){const d=this.undos[this.undos.length-1],g=Date.now()-this.lastCmdTime;d&&d.updatable&&t.updatable&&d.object===t.object&&d.type===t.type&&d.attributeName===t.attributeName&&d.attributeName2===t.attributeName2&&d.name===t.name&&d.objectUuid===t.objectUuid&&d.materialSlot===t.materialSlot&&g<500?(d.update(t),t=d):(this.undos.push(t),t.id=++this.idCounter),t.name=r!==void 0?r:t.name;try{yield t.execute()}catch(C){console.error(C,t)}t.json=t.toJSON(),this.lastCmdTime=Date.now(),this.redos=[],this.editor.emit("historyChanged",t)})}undo(){if(this.historyDisabled)return;let t;if(this.undos.length>0&&(t=this.undos.pop()),t!==void 0){if(!t.name){console.log("压缩配置,不支持 undo"),this.undos.push(t);return}t.undo(),this.redos.push(t),this.editor.emit("historyChanged",t)}return t}redo(){if(this.historyDisabled)return;let t;return this.redos.length>0&&(t=this.redos.pop()),t!==void 0&&(t.execute(),this.undos.push(t),this.editor.emit("historyChanged",t)),t}toJSON(){var r,d,g;const t={u:[],i:[]};for(let v=0;v<this.undos.length;v++)if(this.undos[v].hasOwnProperty("json")){const C=this.undos[v].json;if((r=C.newMap)!=null&&r.images||(d=C.newMaterial)!=null&&d.images){const w=(g=C.newMap)!=null&&g.images?"newMap":"newMaterial";t.u.push(Ui(fi({},C),{[w]:Ui(fi({},C[w]),{images:C[w].images.map(I=>{if(typeof I.url!="string")return fi({},I);const O=t.i.findIndex(Se=>Se===I.url);let ye=I.url;return O===-1?(t.i.push(I.url),ye=`$rp-${t.i.length-1}`):ye=`$rp-${O}`,Ui(fi({},I),{url:ye})})})}))}else t.u.push(fi({},C))}return t}fromJSON(t){var g,v,C;if(t===void 0)return;let r=-1;const d=t.i;for(let w=0;w<t.u.length;w++){const I=t.u[w];if(d!=null&&d.length&&((g=I.newMap)!=null&&g.images||(v=I.newMaterial)!=null&&v.images)){const ye=(C=I.newMap)!=null&&C.images?"newMap":"newMaterial";I[ye].images.forEach(Se=>{if(typeof Se.url=="string"&&Se.url.startsWith("$rp-")){const Pe=parseInt(Se.url.replace("$rp-",""));Se.url=d[Pe],this.editor.playing||console.log("$rp-",Pe,I)}})}if(I.id<=r){console.error("历史记录id错误");continue}if(I.type==="SetOption"||!I.type)continue;I.type.endsWith("Command")&&(I.type=I.type.replace("Command",""));const O=new Commands[I.type](this.editor);O.json=I,O.id=I.id,O.name=I.name,this.undos.push(O),this.idCounter=I.id>this.idCounter?I.id:this.idCounter,r=I.id}this.editor.emit("historyChanged",this.undos[this.undos.length-1])}processUndos(t=1e3/60){return new Promise((r,d)=>{const g=[...this.undos],v=g.length;let C=0;const w=()=>U0(this,null,function*(){const I=performance.now();for(;g.length>0&&performance.now()-I<t;){if(this.editor._dispose){d("dispose");return}const O=g.shift(),ye=this.editor.hooks.events.beforeExecuteUndo.length?this.editor.hooks.dispatch("beforeExecuteUndo",O):O;ye&&(yield this.executeUndo(ye)),this.editor.hooks.events.afterExecuteUndo.length&&this.editor.hooks.dispatch("afterExecuteUndo",O),C+=1}this.editor.emit("progress",{type:"还原场景",value:C/v*100|0}),g.length>0?requestAnimationFrame(w):r("")});requestAnimationFrame(w)})}executeUndo(t){return U0(this,null,function*(){t.fromJSON(t.json);try{t.json.type!=="AddObject"&&t.json.objectUuid&&!t.object||(yield t.execute(),t.fixJSON())}catch(r){console.error(r,t)}})}clear(){this.undos.length=0,this.redos.length=0,this.idCounter=0,this.editor.emit("historyChanged",this.undos[this.undos.length-1])}}class Viewport{constructor(t,r){T0(this,"editor");T0(this,"vis");T0(this,"extendsOptions",{});T0(this,"cameraState",{});T0(this,"delLoadObj");T0(this,"options");this.options=r,this.editor=t}setSaveCamera(t){var r,d;this.vis.setSaveCamera(t),(r=this.vis.pencil.controls)==null||r.saveState(),this.cameraState=fi({},(d=this.vis)==null?void 0:d.cameraState),this.editor.emit("cameraStateChanged")}addVis(d){return U0(this,arguments,function*(t,r={}){this.replaceVis()&&(yield this.editor.execute(new AddVis(this.editor,t,r)))})}replaceVis(){if(this.vis){const t=window.confirm("将删除所有记录,是否继续?");return t&&this.dispose(),t}return!0}setVis(d){return U0(this,arguments,function*(t,r={}){if(!this.options.visFactories&&(this.editor.setViewportVis(t),!this.options.visFactories)){console.error("visFactories is not defined");return}if(this.vis=this.options.visFactories,this.vis.visName!==t)throw new Error(`visName is not match, import {${t}}`);let g=fi(fi({},r),this.extendsOptions);g=this.editor.hooks.events.beforeSetVisOptions.length?this.editor.hooks.dispatch("beforeSetVisOptions",g):g,this.vis.setOptions(g),this.vis.cameraState=fi({},this.cameraState),this.delLoadObj&&(this.vis.delLoadArr=this.delLoadObj),this.vis.playing=this.editor.playing,this.vis._baseObjectByUuid=this.editor.baseObjectByUuid.bind(this.editor),this.vis._objectByUuid=this.editor.objectByUuid.bind(this.editor),this.vis.on("loaderProgress",(C,w)=>{this.editor.emit("progress",{type:"下载资源",value:C/w*100|0})}),this.vis.on("settingsChanged",()=>{this.editor.emit("settingsChanged")}),this.vis.on("show",()=>{this.editor.changeSelectOption(),this.editor.emit("visShow",!0)}),yield this.vis.init();const{pencil:v}=this.vis;v.userData.EditorEnv=!this.editor.playing,this.editor.pencil=v,this.editor.changeSelectOption(),this.editor.playing||(this.initEvent(),this.editor.emit("visChanged",this.vis)),this.editor.on("baseObjectListChange",()=>{this.editor.changeSelectOption()}),v.event.on("updateKey",()=>{this.editor.emit("baseObjectListChange")}),v.event.on("draw",()=>{this.editor.emit("baseObjectListChange")}),v.event.on("erase",()=>{this.editor.emit("baseObjectListChange")})})}setResetCameraUp(){var C,w,I;const r=((C=this.vis)==null?void 0:C.pencil.lead.group).getSize(),d=(r.max.x+r.min.x)/2,g=(r.max.y+r.min.y)/2,v=(w=this.vis)==null?void 0:w.pencil.cameraPositon.z;(I=this.vis)==null||I.pencil.controls.setLookAt(d,g,v,d,g,0,!0)}initEvent(){var r,d,g,v;const{pencil:t}=this.vis;t.controls.addEventListener("update",()=>{this.editor.emit("refreshSidebarObject3D",t.camera)}),(r=t.transformController)==null||r.event.on("change",C=>{this.editor.emit("refreshSidebarObject3D",C)}),(d=t.transformController)==null||d.event.on("translate",(C,w,I)=>{this.editor.execute(new SetPosition(this.editor,C,w,I))}),(g=t.transformController)==null||g.event.on("rotate",(C,w,I)=>{this.editor.execute(new SetRotation(this.editor,C,w,I))}),(v=t.transformController)==null||v.event.on("scale",(C,w,I)=>{this.editor.execute(new SetScale(this.editor,C,w,I))})}addObj(d){return U0(this,arguments,function*(t,r={}){const g=objs$3[t].getInitOptions;g&&Object.assign(r,g(this.vis.pencil,r)),yield this.editor.execute(new AddObject(this.editor,t,r))})}removeObj(t){return U0(this,null,function*(){const{vis:r}=this;if(!r)return;const d=this.editor.baseObjectByUuid(t);this.editor.execute(new RemoveObject(this.editor,d))})}copyObj(t){return U0(this,null,function*(){const{vis:r}=this;if(!r)return;const d=this.editor.baseObjectByUuid(t);this.editor.execute(new CopyObject(this.editor,d))})}setExtendsOptions(t,r){this.extendsOptions[t]=r,this.vis.extendsOptions[t]=r,this.editor.emit("optionsChanged"),setTimeout(()=>{const d=this.editor.toJSON();this.dispose(),this.editor.fromJSON(d)})}toJSON(){var r;const t=(r=this.vis)==null?void 0:r.loader.getUnusedAssets();return{eo:this.extendsOptions,cs:this.cameraState,delLoadObj:t}}fromJSON(t){this.extendsOptions=t.eo||{},this.cameraState=t.cs||{},t.delLoadObj&&t.delLoadObj.length&&(this.delLoadObj=[...t.delLoadObj])}getLoadObj(){return this.vis?[...this.vis.loader.assets.keys()].filter(r=>this.vis.loader.delLoadArr.indexOf(r)===-1):[]}setTransformControlsModal(t){var d;const{pencil:r}=this.vis;(d=r.transformController)==null||d.controls.setMode(t)}dispose(){var t;this.editor.emit("visShow",!1),(t=this.vis)==null||t.dispose(),this.options.visFactories=void 0,this.extendsOptions={},this.cameraState={},this.delLoadObj=void 0,this.vis=void 0,this.editor.history.clear()}}const compareVersion=(m,t)=>{if(!m&&!t)return 0;if(!m&&t)return-1;if(m&&!t)return 1;const r=m.split("."),d=t.split("."),g=Math.max(r.length,d.length);for(;r.length<g;)r.push("0");for(;d.length<g;)d.push("0");for(let v=0;v<g;v++){const C=parseInt(r[v]),w=parseInt(d[v]);if(C>w)return 1;if(C<w)return-1}return 0};function applyFixes(m,t){const r=[{version:"0.5.38",fix:()=>{var C;(C=t.v)!=null&&C.eo&&Object.keys(t.v.eo).forEach(w=>{["mouseLeft","mouseRight","mouseWheel","label","labelLite","shadowMap","autoRotate","equirectangular"].includes(w)&&(t.v.eo[w]=!!t.v.eo[w])}),t.h.u.forEach(w=>{w.type==="SetSetting"&&(w.attributeName==="阴影"&&(w.attributeName="shadowMap"),w.newValue=!!w.newValue,w.oldValue=!!w.oldValue)})}},{version:"0.7.14",fix:()=>{t.h.u.forEach(C=>{C.objectUuid&&(C.objectUuid=C.objectUuid.replace(C.objectUuid[0],C.objectUuid[0].toLowerCase()))})}},{version:"0.13.0",fix:()=>{if(t.h.u[0]&&t.h.u[0].visType==="city"&&(t.h.u[0].visOptions.jsonName||(t.h.u=[])),t.h.u[0]&&t.h.u[0].visType==="map"){if(t.h.u[0].visOptions.geojson){const{geojson:C,adcode:w,geojsonLite:I}=t.h.u[0].visOptions;t.h.u[0].visOptions=Ui(fi({},t.h.u[0].visOptions),{geojsonMap:{[w]:C},extrudeLineGeojsonMap:{[w]:I}}),delete t.h.u[0].visOptions.geojson,delete t.h.u[0].visOptions.geojsonLite}if(t.h.u[0].visOptions.bbox){const{bbox:C,bboxMap:w,adcode:I}=t.h.u[0].visOptions;t.h.u[0].visOptions=Ui(fi({},t.h.u[0].visOptions),{bboxMap:w||{[I]:C}}),delete t.h.u[0].visOptions.bbox}if(t.h.u[0].visOptions.worldBg){const{worldBg:C}=t.h.u[0].visOptions;t.h.u[0].visOptions=Ui(fi({},t.h.u[0].visOptions),{parentBg:C}),delete t.h.u[0].visOptions.worldBg}t.h.u[0].visOptions.adcode===0&&(t.h.u[0].visType="world")}t.h.u[0]&&t.h.u[0].visType==="world"&&(t.h.u[0].visType="map",t.h.u[0].visOptions={adcode:0,mapDepth:5,lineWidth:2,worldPacificCentre:!0,extrudeLine:!1})}},{version:"0.18.1",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="FJ"&&(t.h.u[0].visType="map2"),t.h.u[0]&&t.h.u[0].visType==="earth3"&&(t.h.u[0].visType="earth",t.h.u[0].visOptions.style="countryPlate")}},{version:"0.18.14",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map"&&t.h.u.forEach(C=>{if(C.type==="SetSetting"&&C.attributeName.startsWith("测试")&&typeof C.newValue=="string"&&C.newValue.includes(":::")){const w=C.newValue.split(":::")[1];C.attributeName+=":::"+w,C.newValue=C.newValue.split(":::")[0],C.oldValue&&typeof C.oldValue=="string"&&(C.oldValue=C.oldValue.split(":::")[0])}})}},{version:"0.18.16",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map"&&t.h.u.forEach(C=>{if(C.type==="SetSetting"&&C.attributeName.startsWith("测试")&&C.attributeName.includes(":::")&&!C.attributeName.includes("caId")){const w=C.attributeName.split(":::")[1];C.attributeName=C.attributeName.replace(w,`caId.${w}`)}})}},{version:"0.21.24",fix:()=>{var C,w;t.h.u[0]&&t.h.u[0].visType==="map"&&((w=(C=t.v)==null?void 0:C.eo)!=null&&w.parentBgCurvatureResolution)&&(delete t.v.eo.parentBgCurvatureResolution,t.v.eo.parentBgTopSegments=400)}},{version:"0.23.1",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map2"&&!t.h.u[0].visOptions.cityOnMap&&(t.v.eo||(t.v.eo={}),t.v.eo.clickHandleDrillDown=!0)}},{version:"0.24.1",fix:()=>{var C,w;t.h.u[0]&&t.h.u[0].visType==="map"&&((w=(C=t.v)==null?void 0:C.eo)!=null&&w.drillDownTopMatTwo)&&(delete t.v.eo.drillDownTopMatTwo,t.v.eo.drillDownSecondLevelMats=!0)}},{version:"0.24.2",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map2"&&t.h.u.forEach(C=>{C.objectUuid==="plane#topMatOne"?(C.objectUuid="area",C.materialSlot=0):C.objectUuid==="plane#sideMat"?(C.objectUuid="area",C.materialSlot=1):C.objectUuid==="plane#lineMat"?C.objectUuid="line":C.objectUuid==="plane#extrudeLineMat"?C.objectUuid="extrudeLine":C.objectUuid==="plane#bgTopMatOne"?C.objectUuid="bgPlane#topMat":C.objectUuid==="plane#bgSideMat"?C.objectUuid="bgPlane#sideMat":C.objectUuid==="plane#bgLineMat"?C.objectUuid="bgPlane#lineMat":C.objectUuid==="plane#bgExtrudeLineMat"?C.objectUuid="bgPlane#extrudeLineMat":C.objectUuid==="parentPlane#topMat"?(C.objectUuid="100000area",C.materialSlot=0):C.objectUuid==="parentPlane#sideMat"?(C.objectUuid="100000area",C.materialSlot=1):C.objectUuid==="parentPlane#lineMat"?C.objectUuid="100000line":C.objectUuid==="worldPlane#topMat"?(C.objectUuid="worldarea",C.materialSlot=0):C.objectUuid==="worldPlane#sideMat"?(C.objectUuid="worldarea",C.materialSlot=1):C.objectUuid==="worldPlane#lineMat"?C.objectUuid="worldline":C.objectUuid==="continents#topMat"?(C.objectUuid="continentsArea",C.materialSlot=0):C.objectUuid==="continents#sideMat"?(C.objectUuid="continentsArea",C.materialSlot=1):C.objectUuid==="continents#lineMat"?C.objectUuid="continentsLine":C.objectUuid==="area#river"?C.objectUuid="geography#river":C.objectUuid==="area#grassland"?C.objectUuid="geography#grassland":C.objectUuid==="area-grey#river"?C.objectUuid="geography-grey#river":C.objectUuid==="area-grey#grassland"&&(C.objectUuid="geography-grey#grassland")})}},{version:"0.26.0",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map2"&&(t.v.eo||(t.v.eo={}),t.h.u[0].visType="map",t.h.u[0].visOptions.cityOnMap?(t.h.u[0].visOptions.style="map2CityOnMap",delete t.h.u[0].visOptions.cityOnMap):(t.h.u[0].visOptions.style="map2Base",t.v.eo.bottomPlane=!0))}},{version:"0.26.6",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="earth2"&&(t.h.u[0].visType="earth",t.h.u[0].visOptions.style="base")}},{version:"0.26.13",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map"&&(t.h.u[0].visOptions.clickHandleDrillDown||t.v.eo.clickHandleDrillDown)&&t.v.eo.drillDownFirstLevelUseBgMats===void 0&&(t.v.eo.drillDownFirstLevelUseBgMats=!0)}},{version:"0.27.0",fix:()=>{if(t.h.u[0]&&t.h.u[0].visType==="map"){const C={};t.h.u.forEach((w,I)=>{var O,ye,Se;if(w.objectUuid==="area"&&w.materialSlot===0)w.objectUuid="plane#topMat",delete w.materialSlot;else if(w.objectUuid==="area"&&w.materialSlot===1)w.objectUuid="plane#sideMat",delete w.materialSlot;else if(w.objectUuid==="line")w.objectUuid="plane#lineMat";else if(w.objectUuid==="continentsArea"&&w.materialSlot===0)w.objectUuid="continents#topMat",delete w.materialSlot;else if(w.objectUuid==="continentsArea"&&w.materialSlot===1)w.objectUuid="continents#sideMat",delete w.materialSlot;else if(w.objectUuid==="continentsLine")w.objectUuid="continents#lineMat";else if(w.type==="SetSetting"&&((O=w.attributeName)!=null&&O.startsWith("测试"))&&w.attributeName.includes(":::caId.")){const Pe=w.attributeName.split(":::caId.")[1],Ne=t.h.u[0].visOptions.adcode;t.h.u[I]=[{id:w.id,type:"CopyObject",name:"Copy Object",updatable:!1,objectUuid:`extrudePolygon#${Ne}-${Pe}`,copyObjectUuid:`ExtrudePolygon#${Ne}-${Pe}_${w.id}`},{id:w.id+.1,type:"CopyObject",name:"Copy Object",updatable:!1,objectUuid:`line#${Ne}-${Pe}`,copyObjectUuid:`line#${Ne}-${Pe}_${w.id+.1}`}],C[Pe]=w.id}else if((ye=w.objectUuid)!=null&&ye.startsWith("planeCopyExtrudePolygon")){const Pe=w.objectUuid.split("CopyExtrudePolygon")[1],Ne=t.h.u[0].visOptions.adcode;Object.assign(w,{objectUuid:`extrudePolygon#${Ne}-${Pe}_${C[Pe]}`})}else if((Se=w.objectUuid)!=null&&Se.startsWith("planeCopyLine")){const Pe=w.objectUuid.split("CopyLine")[1],Ne=t.h.u[0].visOptions.adcode;Object.assign(w,{objectUuid:`line#${Ne}-${Pe}_${C[Pe]+.1}`})}}),t.h.u=t.h.u.flat()}}},{version:"0.27.8",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map"&&t.h.u[0].visOptions.style==="map2CityOnMap"&&(t.h.u[0].visOptions.mergeSide=!0,t.h.u.forEach(C=>{C.objectUuid==="extrudeLine"?C.objectUuid="plane#lineMat":C.objectUuid==="plane#lineMat"&&(C.objectUuid="extrudeLine")}))}},{version:"0.27.9",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map"&&t.h.u[0].visOptions.style==="map2CityOnMap"&&t.h.u.forEach(C=>{C.objectUuid==="plane#extrudeLineMat"&&(C.objectUuid="plane#lineMat")})}},{version:"0.27.14",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map"&&t.h.u[0].visOptions.style==="map2CityOnMap"&&t.h.u.forEach(C=>{C.objectUuid==="building"&&(C.objectUuid="building#group")})}},{version:"0.28.1",fix:()=>!1}];let d=0,g=r.length-1,v=r.length;for(;d<=g;){const C=Math.floor((d+g)/2);compareVersion(r[C].version,m)>0?(v=C,g=C-1):d=C+1}for(let C=v;C<r.length;C++)r[C].fix()!==!1&&(t.c.version=r[C].version)}const fixJSON=m=>{var t;return m.c||(m={h:{u:m.u},v:{eo:m.eo,bg:m.bg},c:{name:m.name,version:m.v}}),(t=m.c)!=null&&t.key&&delete m.c.key,applyFixes(m.c.version,m),m};class Hooks{constructor(t){T0(this,"editor");T0(this,"events",{beforeSetVisOptions:[],beforeExecuteUndo:[],afterExecuteUndo:[],beforeShow:[],afterShow:[],beforeFromJSON:[],afterFromJSON:[],errorFromJSON:[]});T0(this,"source","");this.editor=t,this.addEvents({beforeFromJSON:()=>{window.postMessage({type:"vis-core.fromJSON.start"}),console.time("vis-core:time.fromJSON")},afterFromJSON:()=>{window.postMessage({type:"vis-core.fromJSON.end"}),console.timeEnd("vis-core:time.fromJSON")},errorFromJSON:()=>{window.postMessage({type:"vis-core.fromJSON.error"}),console.timeEnd("vis-core:time.fromJSON")}})}addEvents(t){var r;for(const d in t){const g=d;this.events[g]&&this.events[g].push(t[g].bind(t)),g==="afterShow"&&((r=this.editor.viewport.vis)==null?void 0:r.showState)===!0&&t[g](this.editor.viewport.vis)}}addStaticEvents(t){this.addEvents(t());const r=t.toString().replace(/\/\/.*?(?:\r\n|\n|\r|$)/g,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/^\s+/gm,"").replace(/(\r\n|\n|\r)/gm,"").trim();this.source!==r&&(this.source=r,this.editor.emit("scriptsChanged"))}fromJSON(t){if(!t)this.source="";else try{const r=new Function(`return ${t}()`)();this.addEvents(r),this.source=t}catch(r){console.error(r)}this.editor.emit("scriptsChanged")}toJSON(){return this.source}clear(){Object.keys(this.events).forEach(t=>{this.events[t]=[]})}dispatch(t,...r){let d;for(const g of this.events[t])if(t==="beforeSetVisOptions"?d=g(d!=null?d:r[0]):d=g(this.editor.viewport.vis,...r),d===!1)break;return d}}class Config{constructor(t){T0(this,"editor");T0(this,"meta",{name:"",key:"",open:!1,jsonVersion:"0.0.0",sdkVersion:"0.0.0"});this.editor=t}setConfig(t,r){this.meta[t]=r,this.editor.emit("configChanged",fi({},this.meta))}fromJSON(t){Object.keys(t).forEach(r=>{const d=r==="version"?"jsonVersion":r;d in this.meta&&this.setConfig(d,t[r])})}compareVersion(){compareVersion(this.meta.jsonVersion,this.meta.sdkVersion)===1&&console.warn("vis-core 版本过低,可能会出现问题","json:"+this.meta.jsonVersion,"sdk:"+this.meta.sdkVersion)}toJSON(){return{version:this.meta.sdkVersion}}}const jsonFetch=(m,t,r=!1)=>{const d=esusLite.makePromiseCreator(!0),g=m.endsWith("gzip")||r;return window.fetch(m).then(v=>{let C=v;if(C.ok)return g?C.blob().then(w=>{const I=new DecompressionStream("gzip"),O=w.stream().pipeThrough(I);return new Response(O)}):C;throw new Error("Network response was not ok.")}).then(v=>v.json()).then(v=>{d.resolve(v)}).catch(v=>{d.reject(v)}),d.promise};class Editor{constructor(t){T0(this,"selected",null);T0(this,"playing",!0);T0(this,"currentMaterialSlot",0);T0(this,"events",new events.EventEmitter);T0(this,"history");T0(this,"viewport");T0(this,"hooks");T0(this,"config");T0(this,"pencil");T0(this,"on",this.events.on.bind(this.events));T0(this,"emit",this.events.emit.bind(this.events));T0(this,"options");T0(this,"selectOption",[]);T0(this,"_dispose",!1);this.options=fi({assetsPrefix:"",processUndosMaxFrameTime:Number.MAX_VALUE},t),this.events.setMaxListeners(9999999),this.viewport=new Viewport(this,{visFactories:t.visFactories}),this.history=new History(this),this.hooks=new Hooks(this),this.config=new Config(this),this.config.setConfig("sdkVersion",version)}getObjectMaterial(t,r){if(!t)return;let d=t.material;return Array.isArray(d)&&r!==void 0&&(d=d[r]),d}getMaterialObjectByObject(t,r){const d=this.getObjectMaterial(t,r);if(d){const g=this.pencil.mList.getKey(d);return g?this.pencil.mList.getFixBaseObject(g).object3d:t}else return null}materialObjectByUuid(t){const r=this.pencil.mList.getFixBaseObject(t);return r?r.object3d:this.objectByUuid(t)}uuidByMaterialObject(t){const r=this.pencil.mList.getKey(t.material);return r||this.uuidByObject(t)}setObjectMaterial(t,r,d,g=!1){let v=t.material;Array.isArray(t.material)&&r!==void 0?(v=t.material[r],g&&(t.material=[...t.material]),t.material[r]=d):t.material=d,v&&v.onBeforeCompile&&(d.onBeforeCompile=v.onBeforeCompile)}uuidByObject(t){var r;return(r=this.findSelectItem(this.selectOption,"object",t))==null?void 0:r.key}objectByUuid(t){var r;return(r=this.findSelectItem(this.selectOption,"key",t))==null?void 0:r.object}uuidByBaseObject(t){var r;return(r=this.findSelectItem(this.selectOption,"baseObject",t))==null?void 0:r.key}baseObjectByUuid(t){var r;return(r=this.findSelectItem(this.selectOption,"key",t))==null?void 0:r.baseObject}findSelectItem(t,r,d){for(let g=0;g<t.length;g++){const v=t[g];if(v[r]===d)return v;if(v.children){const C=this.findSelectItem(v.children,r,d);if(C)return C}}}changeSelectOption(){const t=this.viewport.vis,r=d=>d.filter(g=>g.userData.selectHide!==!0).map(g=>{var Ne;const v=[...g.children];if(g.key==="@Scene"&&!v.find(ke=>ke.key==="camera"))this.pencil.camera.name="透视相机",v.unshift({key:"camera",object3d:this.pencil.camera,userData:{},children:this.pencil.camera.children.map(ke=>this.pencil.lead.objMap.get(ke)).filter(ke=>ke)});else if(g.object3d.target){const ke=g.options.type;v.unshift({key:g.key.replace(ke,ke+"Target"),object3d:g.object3d.target,userData:{disabledCR:!0,disabledTC:!1},children:[]})}if(g.object3d.isDirectionalLight){const ke=g.options.type;v.unshift({key:g.key.replace(ke,ke+"Shadow"),object3d:g.object3d.shadow.camera,userData:{disabledCR:!0},children:[]})}const w=v.length>0?r(v):[],I=g.object3d.isGroup&&g.userData.disabledTC!==!1,O=I||["@Scene","camera"].includes(g.key)||g.userData.disabledCR;if(w.length===0&&I)return null;const ye=g.key.replace(g.key[0],g.key[0].toLowerCase()),Se=(Ne=g.userData.disabledTC)!=null?Ne:O,Pe=["Scene","camera"].includes(g.key);return{key:ye==="@Scene"?"scene":ye,name:g.object3d.name,object:g.object3d,visible:Pe?!0:g.object3d.visible,useMaterialType:g.useMaterialType,disabledCR:O,disabledTC:Se,disabledVisible:Pe,baseObject:g,children:w}}).filter(g=>g!==null);this.selectOption=r([t.lead.scene]),this.emit("sceneGraphChanged")}execute(t,r){return U0(this,null,function*(){yield this.history.execute(t,r)})}fromJSON(t,r){return U0(this,null,function*(){var d,g,v,C;try{r&&!f$1(r)?console.warn("fromJSON 第二个参数已修改,{beforeSetVisOptions:(r)=>r} 替代"):r&&this.hooks.addEvents(r);let w;if(typeof t=="string"){const I=this.options.assetsPrefix+t;console.time("vis-core:time.json-fetch");const{res:O,err:ye}=yield jsonFetch(I);if(console.timeEnd("vis-core:time.json-fetch"),ye)throw new Error("fromJSON error:"+ye);w=O}else w=t;if(this.hooks.dispatch("beforeFromJSON"),w=fixJSON(w),w.at&&(accessToken.token=w.at),!this.storage){if(!accessToken.token)throw new Error("设置 token 或平台重新下载 JSON 文件");const I=accessToken.getInfo();if(!I||!I.isValid)throw new Error("need accessToken")}if(this.config.fromJSON(w.c),this.history.fromJSON(w.h),this.viewport.fromJSON(w.v),this.hooks.fromJSON(w.s),this.config.compareVersion(),yield this.history.processUndos(this.options.processUndosMaxFrameTime),(d=w.v.bg)!=null&&d.texture&&this.viewport.vis){const I=parseTexture(w.v.bg.texture);I.colorSpace=SRGBColorSpace,this.viewport.vis.pencil.scene.background=I}return this.hooks.dispatch("beforeShow"),(g=this.viewport.vis)==null||g.show(),this.hooks.dispatch("afterShow"),(v=this.pencil.controls)==null||v.saveState(),this.select(null),(C=this.viewport.vis)!=null&&C.workerOnce&&this.playing&&window.requestIdleCallback(()=>{var I;(I=this.viewport.vis)==null||I.worker.dispose()}),this.hooks.dispatch("afterFromJSON"),w}catch(w){throw this.hooks.dispatch("errorFromJSON"),new Error("fromJSON error:"+w)}})}toJSON(){return{}}select(...t){}setViewportVis(...t){}getDataURL(){return this.pencil?(this.pencil.render(),this.pencil.renderer.domElement.toDataURL()):""}dispose(){this.events.removeAllListeners(),this.viewport.dispose(),this.history.clear(),this.hooks.clear(),this._dispose=!0}}const BLOCKLISTED_GPUS=["geforce 320m","geforce 8600","geforce 8600m gt","geforce 8800 gs","geforce 8800 gt","geforce 9400","geforce 9400m g","geforce 9400m","geforce 9600m gt","geforce 9600m","geforce fx go5200","geforce gt 120","geforce gt 130","geforce gt 330m","geforce gtx 285","google swiftshader","intel g41","intel g45","intel gma 4500mhd","intel gma x3100","intel hd 3000","intel q45","legacy","mali-2","mali-3","mali-4","quadro fx 1500","quadro fx 4","quadro fx 5","radeon hd 2400","radeon hd 2600","radeon hd 4670","radeon hd 4850","radeon hd 4870","radeon hd 5670","radeon hd 5750","radeon hd 6290","radeon hd 6300","radeon hd 6310","radeon hd 6320","radeon hd 6490m","radeon hd 6630m","radeon hd 6750m","radeon hd 6770m","radeon hd 6970m","sgx 543","sgx543"],apple=[],amd=["2","3","4","6","12","15","25","48","455","535","555","575","600","610","625","630","640","694","699","740","880","900","2000","2270","2600","3200","3800","3900","4000","4150","4170","4190","4250","4800","5170","5400","5450","5470","5650","5670","5730","5750","5950","6150","6230","6250","6290","6300","6310","6320","6350","6370","6380","6410","6450","6460","6470","6480","6490","6510","6520","6530","6540","6550","6570","6620","6630","6670","6730","6760","6790","6980","7290","7310","7340","7400","7420","7450","7480","7500","7520","7540","7550","7610","7620","7640","7650","7670","7730","7820","8180","8210","8240","8250","8330","8350","8400","8410","8450","8490","8500","8510","8530","8600","8610","8690","8730","8760","8850","9171","9173","9874","10000","v","9999999999"],radeon=["2","3","4","6","25","48","455","535","555","575","610","625","630","640","740","880","1305","1605","2600","3200","4150","4250","5000","5400","5450","5470","5650","5670","5730","5750","5770","6230","6250","6290","6300","6310","6320","6350","6370","6380","6410","6450","6460","6470","6480","6490","6510","6520","6530","6540","6550","6570","6620","6630","6670","6730","6760","6790","7000","7290","7310","7340","7400","7420","7450","7480","7500","7520","7540","7550","7610","7620","7640","7650","7670","7730","8180","8210","8240","8250","8330","8350","8400","8410","8450","8490","8500","8510","8530","8600","8610","8690","8730","8850","9171","9173"],nvidia=["1","6","15","51","120","130","140","160","180","210","220","260","295","310","315","320","410","415","420","425","430","440","445","510","525","530","540","545","555","590","605","610","615","625","630","635","705","710","720","730","735","755","765","800","810","820","840","845","860","910","945","1010","1100","1800","2800","5010","5400","8400","8600","9300","9400","9600","9800","gpu","prexpe"],geforce=["10","120","130","210","240","280","295","320","410","415","420","425","430","440","445","510","520","525","530","540","545","555","590","605","610","615","620","625","630","635","705","710","720","730","735","755","765","800","810","820","840","845","860","910","945","1010","2075","8400","8600","9300","9400","9600","9800","gpu","prexpe"],adreno=["5","7","540","618","630","675","680","685"],tier0GPU={apple,amd,radeon,nvidia,geforce,adreno},types=["intel","apple","amd","radeon","nvidia","geforce","adreno"];class Benchmarks{constructor(t){T0(this,"renderer");this.renderer=t}query(){const t=this.renderer,r=this.getGpuType();if(!r)return this.queryFallback();if(r==="intel")return{tier:0,gpu:t};const d=tier0GPU[r],g=this.getGPUVersion();return d.includes(g)?{tier:0,renderer:t}:this.queryFallback()}getGpuType(){const t=this.renderer;for(const r of types)if(t.includes(r))return r}getGPUVersion(){var g;const r=this.renderer.replace(/\([^)]+\)/,""),d=r.match(/\d+/)||r.match(/(\W|^)([A-Za-z]{1,3})(\W|$)/g);return(g=d==null?void 0:d.join("").replace(/\W|amd/g,""))!=null?g:""}queryFallback(){const t=this.renderer,r=BLOCKLISTED_GPUS.find(d=>t.includes(d));return r?{tier:0,gpu:r}:{tier:3,gpu:t}}}class WebGL{constructor(){T0(this,"rawRenderer");T0(this,"renderer");const t=this.getRawRenderer();this.rawRenderer=t;const r=this.getRenderer();this.renderer=r}getRawRenderer(){try{const r=document.createElement("canvas").getContext("webgl"),d=r==null?void 0:r.getExtension("WEBGL_debug_renderer_info");return r&&d?r.getParameter(d.UNMASKED_RENDERER_WEBGL):""}catch(t){return""}}getRenderer(){const t=this.rawRenderer;return t?t.toLowerCase().replace(/.*angle ?\((.+)\)(?: on vulkan [0-9.]+)?$/i,"$1").replace(/\s(\d{1,2}gb|direct3d.+$)|\(r\)| \([^)]+\)$/g,"").replace(/(?:vulkan|opengl) \d+\.\d+(?:\.\d+)?(?: \((.*)\))?/,"$1"):""}query(){return{WebP:this.isWebPAvailable(),WebGL:this.isWebGLAvailable(),WebGL2:this.isWebGL2Available(),WebGL2RC:this.isWebGL2RenderingContextAvailable(),isGPUAcceleratorEnabled:this.isGPUAcceleratorAvailable()}}isWebGLAvailable(){try{const t=document.createElement("canvas");return!!(window.WebGLRenderingContext&&(t.getContext("webgl")||t.getContext("experimental-webgl")))}catch(t){return!1}}isWebGL2Available(){try{const t=document.createElement("canvas");return!!(window.WebGL2RenderingContext&&t.getContext("webgl2"))}catch(t){return!1}}isWebGL2RenderingContextAvailable(){return typeof window.WebGL2RenderingContext!="undefined"}isGPUAcceleratorAvailable(){const t=this.rawRenderer;return!/SwiftShader/gi.test(t)}isColorSpaceAvailable(t){try{const r=document.createElement("canvas"),d=window.WebGL2RenderingContext&&r.getContext("webgl2");return d?(d.drawingBufferColorSpace=t,d.drawingBufferColorSpace===t):!1}catch(r){return!1}}isWebPAvailable(){try{return document.createElement("canvas").toDataURL("image/webp").indexOf("data:image/webp")===0}catch(t){return!1}}}const detect=()=>{try{const m=new WebGL,t=new Benchmarks(m.renderer);return fi(fi({},m.query()),t.query())}catch(m){return console.error("vis-core: feature detection failed",m),{tier:0}}},getScale=m=>{const r=window.getComputedStyle(m).transform;if(r&&r!=="none"){const d=new DOMMatrix(r);return Math.max(d.a,d.d)}};function observeScale(m,t){let r=m,d=1;for(;r;){const I=getScale(r);if(I!==void 0){d=I;break}if(r=r.parentElement,r===document.body){r=null;break}}if(!r)return null;const g=I=>{const O=getScale(r)||1;d!==O&&(d=O,t(O,I))},v=I=>{I.propertyName==="transform"&&g("transitionEnd")},C=new MutationObserver(I=>{for(const O of I)if(O.type==="attributes"&&O.attributeName==="style"){g("MutationObserver");return}});C.observe(r,{attributes:!0,attributeFilter:["style"]}),r.addEventListener("transitionend",v),t(d,"init");const w=C.disconnect;return C.disconnect=function(){w.call(C),r==null||r.removeEventListener("transitionend",v)},C}const IS_DEV=!1;class Base extends Camera{constructor(r){var d;super();T0(this,"playing",!0);T0(this,"leftTruck",!0);T0(this,"options");T0(this,"showState",!1);T0(this,"settings",{});T0(this,"delLoadArr");T0(this,"extendsOptions",{});T0(this,"leadObjs",objs$3);T0(this,"lead");T0(this,"mList");T0(this,"workerOnce",!0);T0(this,"tier0",!1);T0(this,"pmremGenerator",null);T0(this,"re",null);T0(this,"roomEnvMap");T0(this,"visName");T0(this,"editor");T0(this,"publicDir",{});T0(this,"_baseObjectByUuid");T0(this,"_objectByUuid");T0(this,"observeScale",null);T0(this,"sceneActive",-1);T0(this,"initSettingsObj");T0(this,"mouseButtonsActiveStore",null);if(this.container=r.container,this.options=fi({assetsPrefix:"",editor:!0,logarithmicDepthBuffer:!0,observeParentScale:!0},r),!this.options.assetsPrefix){let g="/";g==="/"&&(g=""),this.options.assetsPrefix=g}this.options.workerOnce!==void 0&&(this.workerOnce=this.options.workerOnce);try{const g=window.location.search.match(/v_ldb=(\d+)/);if(g){const v=!!+g[1];this.options.logarithmicDepthBuffer=v}}catch(g){console.error(g)}if(this.options.editor){const g=detect();let v=(d=this.options.tier)!=null?d:g.tier;try{const C=window.location.search.match(/v_tier=(\d+)/);C&&(v=+C[1])}catch(C){console.error(C)}this.tier0=v!==3,this.editor=new Editor({assetsPrefix:this.options.assetsPrefix,visFactories:this}),console.info("vis-core:detect",version,JSON.stringify(Ui(fi({},g),{ldb:this.options.logarithmicDepthBuffer,tier0:this.tier0}),null,2))}this.visName=this.constructor.VisName}get loader(){return this.pencil.loader}get worker(){return this.pencil.installPlugins.get("worker")}setOptions(r){this.options=fi(fi({},this.options),r)}get fromJSON(){return this.editor.fromJSON.bind(this.editor)}get baseObjectByUuid(){var r;return((r=this.editor)==null?void 0:r.baseObjectByUuid.bind(this.editor))||this._baseObjectByUuid}get objectByUuid(){var r;return((r=this.editor)==null?void 0:r.objectByUuid.bind(this.editor))||this._objectByUuid}get getDataURL(){return this.editor.getDataURL.bind(this.editor)}loaderAdd(...r){}initMaterial(...r){return U0(this,null,function*(){})}initVis(...r){return U0(this,null,function*(){})}init(...r){return U0(this,null,function*(){yield this.initPencil(),this.loaderAdd(),console.time(`vis-core:time.${this.visName}-loader`),yield this.loader.loadAll(),console.timeEnd(`vis-core:time.${this.visName}-loader`),yield this.initMaterial(),yield this.initVis(),yield Promise.all(this.lead.objectsPromise)})}initPencil(){return U0(this,null,function*(){var g,v,C,w,I,O,ye,Se;if(this.pencil)return;const r=fi({},this.options.pencilConfig);if(this.options.css2DContainer&&(r.css2DRendererParams={container:this.options.css2DContainer}),this.options.pencil)this.pencil=this.options.pencil,this.sceneActive=this.pencil.addPage({cameraOptions:{fov:(v=(g=r.camera)==null?void 0:g.fov)!=null?v:45,near:(w=(C=r.camera)==null?void 0:C.near)!=null?w:.1,far:(O=(I=r.camera)==null?void 0:I.far)!=null?O:1e3,up:(Se=(ye=r.camera)==null?void 0:ye.up)!=null?Se:new Vector3(0,1,0)},sceneOptions:{background:new Color$1(0)}}),this.setSceneActive();else if(this.options.pencil2){this.pencil=this.options.pencil2,this.lead=this.pencil.lead.init(this.leadObjs),this.mList=this.pencil.mList,this.sceneActive=this.pencil.pageActiveIndex;return}else{const Pe=new ot(fi(Ui(fi({container:this.container,stats:!this.playing&&IS_DEV,helper:!this.playing,viewHelper:!this.playing,transformControls:!this.playing,css2DRenderer:!0},this.tier0?{composer:{multisampling:0}}:{}),{renderer:{alpha:!0,logarithmicDepthBuffer:this.options.logarithmicDepthBuffer},camera:{near:.1,far:1e3,fov:45,up:new Vector3(0,1,0)},bloom:!0,ssao:!0,ssaoParams:{minDistance:.001},scene:{background:new Color$1(0)},loader:fi({prefix:this.options.assetsPrefix,simpleTexture4deleted:!0},this.tier0?{anisotropy:1}:{})}),r));if(this.options.observeParentScale&&this.playing){const ht=()=>{this.observeScale||(this.observeScale=observeScale(this.container,(He,Fe)=>{Pe.setDevicePixelRatio(window.devicePixelRatio*He)}))};ht(),Pe.event.on("resize",()=>{ht()})}this.pencil=Pe,this.sceneActive=1;const Ne=Pe.composerController.ssaoPass;Ne&&(Ne.enabled=!1);const ke=new Q({dbName:this.visName,cacheVersion:version});Pe.use(ke),this.playing||(window.vis=this,window.pencil=Pe)}const d=this.pencil;this.lead=d.lead.init(this.leadObjs),this.mList=d.mList,this.delLoadArr&&(d.loader.delLoadArr=this.delLoadArr),d.loader.on("progress",(...Pe)=>{this.showState!==!0&&this.emit("loaderProgress",...Pe)}),this.leftTruck&&(d.controls.mouseButtons.left=Gi.TRUCK,d.controls.mouseButtons.right=Gi.ROTATE),this.lead.group.hide(),this.lead.prefabGroup.hide(),this.initSceneUserData(),this.initCameraUserData(),this.initSettings()})}setSceneActive(){this.pencil.showPage(this.sceneActive)}initCameraUserData(){const r=this.pencil;r.camera.userData=new Proxy({up:r.camera.up.toArray().join(",")},{set:(d,g,v)=>{if(g==="up"){const C=v.split(",").map(w=>+w);r.camera.up.fromArray(C),r.controls.updateCameraUp()}return Reflect.set(d,g,v)}})}initSceneUserData(){var w,I,O,ye,Se,Pe;const r=this.pencil,d=r.scene.background,g=d instanceof Color$1?"Color":d instanceof Texture?"Texture":"None",v=g==="Texture"?d:null,C=g==="Color"?"#"+d.getHexString():"#000000";r.scene.userData=new Proxy({backgroundType:g,backgroundColor:C,backgroundTexture:v,shadowMapEnabled:this.pencil.renderer.shadowMap.enabled,shadowMapType:this.pencil.renderer.shadowMap.type,bloomThreshold:(I=(w=this.pencil.composerController)==null?void 0:w.bloomPass)==null?void 0:I.threshold,bloomRadius:(ye=(O=this.pencil.composerController)==null?void 0:O.bloomPass)==null?void 0:ye.radius,bloomStrength:(Pe=(Se=this.pencil.composerController)==null?void 0:Se.bloomPass)==null?void 0:Pe.strength},{set:(Ne,ke,ht)=>(ke==="shadowMapEnabled"||ke==="shadowMapType"?(ke==="shadowMapEnabled"?this.pencil.renderer.shadowMap.enabled=ht:ke==="shadowMapType"&&(this.pencil.renderer.shadowMap.type=ht),this.pencil.scene.traverse(He=>{const Fe=He;if(Fe.receiveShadow&&Fe.material){const at=Fe.material;Array.isArray(at)?at.forEach(ct=>{ct.needsUpdate=!0}):at.needsUpdate=!0}})):ke==="backgroundType"?ht==="None"?r.scene.background=null:r.scene.userData.backgroundColor?r.scene.background=new Color$1(r.scene.userData.backgroundColor):r.scene.userData.backgroundTexture&&(r.scene.background=r.scene.userData.backgroundTexture):ke==="backgroundColor"?r.scene.background=new Color$1(ht):ke==="backgroundTexture"?r.scene.background=ht:ke==="bloomThreshold"?r.composerController.bloomPass&&(r.composerController.bloomPass.threshold=ht):ke==="bloomRadius"?r.composerController.bloomPass&&(r.composerController.bloomPass.radius=ht):ke==="bloomStrength"&&r.composerController.bloomPass&&(r.composerController.bloomPass.strength=ht),Reflect.set(Ne,ke,ht))})}initBaseObjectUserData(r){const d=Ui(fi({},r.object3d.userData),{bloom:!1});if(r.objectType==="BaseObject#Light")return;const g=r.objectType==="BaseObject#Arc",v=r.objectType==="BaseObject#Line",C=r.object3d instanceof Group$1;g?d.animationDuration=2e3:v&&(d.animationDuration=0),prefabType.includes(r.objectType.split("#")[1])&&(d.prefab=r.prefab),r.object3d.userData=new Proxy(d,{set:(w,I,O)=>(I==="bloom"?O?r.enableBloom():r.disableBloom():I==="prefab"?(r.prefab=O,O?this.lead.prefabGroup.attach(r):this.lead.group.attach(r)):I==="animationDuration"&&g?r.animateIn({duration:O}):I==="animationDuration"&&(v||C)&&(v?[r]:r.children).forEach(Se=>{Se.material.userData.tween&&(Se.material.userData.tween.stop(),remove(Se.material.userData.tween),Se.material.userData.tween=null),O&&(Se.material.uniforms.offset.value.x=1,Se.material.uniforms.offsetLoop.value=1,Se.animate({duration:O,repeat:1/0,lineLoop:!0,startShow:!0}))}),Reflect.set(w,I,O))})}addCSS3DRenderer(){this.pencil&&this.pencil.cssRendererController.addRenderer("css3d",{container:this.pencil.cssRendererController.container,zIndex:"auto"})}initSettings(){const r={mouseLeft:this.pencil.controls.mouseButtons.left,mouseRight:this.pencil.controls.mouseButtons.right,mouseWheel:this.pencil.controls.mouseButtons.wheel};this.settings=new Proxy(Ui(fi(fi({},this.initSettingsObj),r),{mouseNone:!1,viewportPadding:[0,0,0,0]}),{set:(d,g,v)=>{if(!(g in d)&&!(g.replace(/(:::.+)\..*$/,"$1")in d))return Reflect.set({},g,v);g==="mouseWheel"?typeof v=="boolean"&&(v=v?r.mouseWheel:Gi.NONE):g==="mouseLeft"?typeof v=="boolean"&&(v=v?r.mouseLeft:Gi.NONE):g==="mouseRight"&&typeof v=="boolean"&&(v=v?r.mouseRight:Gi.NONE);const C=g.includes(":::");return Reflect.set(d,C?g.replace(/(:::.+)\..*$/,"$1"):g,this.handleSetting(g,v))},get:(d,g)=>{const C=g.includes(":::")?g.replace(/(:::.+)\..*$/,"$1"):g,w=Reflect.get(d,C);return w instanceof Promise?w.then(I=>(Reflect.set(d,C,I),I)):w}})}handleSetting(r,d){return U0(this,null,function*(){const{pencil:g}=this;if(r==="mouseWheel"||r==="mouseLeft"||r==="mouseRight"){const v=r.replace("mouse","").toLowerCase();(d||this.playing)&&(g.controls.mouseButtons[v]=d)}else if(r==="mouseNone")d?(this.mouseButtonsActiveStore={mouseLeft:g.controls.mouseButtons.left,mouseRight:g.controls.mouseButtons.right,mouseWheel:g.controls.mouseButtons.wheel},g.controls.mouseButtons.left=Gi.NONE,g.controls.mouseButtons.right=Gi.NONE,g.controls.mouseButtons.wheel=Gi.NONE):this.mouseButtonsActiveStore&&(g.controls.mouseButtons.left=this.mouseButtonsActiveStore.mouseLeft,g.controls.mouseButtons.right=this.mouseButtonsActiveStore.mouseRight,g.controls.mouseButtons.wheel=this.mouseButtonsActiveStore.mouseWheel);else if(r==="viewportPadding"){g.rendererController.setViewPadding(...d);const v=new Vector4;g.renderer.getViewport(v),g.cameraController.setAspect(v.z/v.w)}return d})}show(){this.showState||(this.useSaveCamera("visShow"),this.options.disableInitShow||this.showAction())}showAction(){this.lead.group.show(),this.playing||this.lead.prefabGroup.show(),this.pencil.start(),this.showState=!0,this.emit("show")}hide(){this.showState&&(this.lead.group.hide(),this.lead.prefabGroup.hide(),this.showState=!1,this.emit("hide"))}addCSS2D(g){return U0(this,arguments,function*(r,d={}){typeof d=="string"&&(d={display:d}),d.display&&(r.style.display=d.display);let v=0;typeof d.onTop!="undefined"&&(v=d.onTop);const C=yield this.lead.draw("Node",{onTop:v});return C.setChildren(r),C})}addCSS3D(g){return U0(this,arguments,function*(r,d={}){d.display&&(r.style.display=d.display);let v=0;typeof d.onTop!="undefined"&&(v=d.onTop);let C="3d";typeof d.type!="undefined"&&(C=d.type);const w=yield this.lead.draw("Node",{onTop:v,type:C});return w.setChildren(r),w})}getRoomEnvMap(){if(this.roomEnvMap)return this.roomEnvMap;const r=new PMREMGenerator(this.pencil.renderer);r.compileEquirectangularShader();const d=new RoomEnvironment,g=r.fromScene(d,.04).texture;return this.pmremGenerator=r,this.re=d,this.roomEnvMap=g,g}handlePick(r,d,g){console.warn("handlePick is deprecated, use BaseObject.onPointerEvent"),this.lead.handlePick(r,d,g)}getScreenPosition(r,d,g){const v=new Vector3(r,d,g);v.project(this.pencil.camera);const{width:C,height:w}=this.pencil.getSize(),I=(v.x*.5+.5)*C,O=(v.y*-.5+.5)*w;return{x:I,y:O}}dispose(){var r,d,g,v;super.dispose(),this.editor&&(this.editor.viewport.vis=void 0,this.editor.dispose()),this.publicDir={},this.options.pencil?this.pencil.removePage(this.sceneActive):this.options.pencil2||(r=this.pencil)==null||r.dispose(),(d=this.pmremGenerator)==null||d.dispose(),(g=this.re)==null||g.dispose(),(v=this.observeScale)==null||v.disconnect()}}T0(Base,"VisName","base");function clipGeojson(m,t){const r=turf.flatten(m).features,d=turf.flatten(t).features,g={type:"FeatureCollection",features:[]};for(let v=r.length-1;v>=0;v--){const C=r[v];for(let w=d.length-1;w>=0;w--){const I=d[w];if(contains(C,I))g.features.push(I);else if(contains(I,C))C.properties=I.properties,g.features.push(C);else{const O=turf.intersect(C,I);O&&(O.properties=I.properties,g.features.push(O))}}}return g}function contains(m,t){let r=!0;const d=turf.explode(t).features;for(let g=d.length-1;g>=0;g--)if(!turf.inside(d[g],m)){r=!1;break}return r}const getBoxMultiPoly=m=>{const t=m.features.map(r=>r.geometry.type==="Polygon"?[r.geometry.coordinates]:r.geometry.coordinates).flat();return Array.from({length:t.length},(r,d)=>turf.polygon(t[d]))};class Building extends ft$1{constructor(r){super();T0(this,"options");T0(this,"building",{});T0(this,"outJson",new Map);T0(this,"worldPositionZ",{value:0});this.options=fi({},r)}create(){return U0(this,null,function*(){const{json:r,projection:d,cacheKey:g,meters:v,grey:C,clip:w}=this.options,I=this.pencil.mList,O=this.pencil.getPlugin("worker"),ye=this.pencil.lead,Se=C?"-grey":"";this.createGroup();const Pe=I.getMultiple("building"+Se);let Ne=g?yield O.getCachedGeometry({cacheKey:g}):[];if(Ne.length)w&&this.outJson.set(1,!0);else{let ke;w&&(ke=getBoxMultiPoly(w));const ht={};(r.features||r).forEach(Fe=>{const at=typeof Fe.properties.h=="string"?Fe.properties.h.split(".")[1]:0,ct=Number(Fe.properties.h)|0;ht[at]||(ht[at]={}),ht[at][ct]||(ht[at][ct]=[]),ke?ke.some(Gt=>{Fe.geometry.coordinates[1]&&console.log(Fe.geometry.coordinates[1]);const Lt=turf.polygon(Fe.geometry.coordinates[0]);return turf.booleanContains(Gt,Lt)?(ht[at][ct].push(Fe),!0):!1})||this.outJson.set(Fe,!1):ht[at][ct].push(Fe)});const He=Object.keys(ht).map(Fe=>{const at=ht[Fe];return Object.keys(at).map(ct=>{const xt=at[ct];return{z:+Fe,h:+ct,coordinatesArr:xt.map(Gt=>Gt.geometry.type==="Polygon"?Gt.geometry.coordinates[0]:Gt.geometry.coordinates[0][0])}})}).flat().filter(Fe=>Fe.coordinatesArr.length);Ne=yield Promise.all(He.map(Fe=>{const{h:at,z:ct,coordinatesArr:xt}=Fe,Gt=+at<=20?+at/18:+at<=60?+at/27:+at/12;return O.geoGeometry("extrudePolygon",{cacheKey:g,userData:{z:ct,h:at},mesaage:{coordinatesArr:xt,projection:d,useGroups:2,depth:[Number(at)*(v||1)],hasBottom:!1,sideRepeat:Gt}})}))}yield Promise.all(Ne.map(ke=>U0(this,null,function*(){const{h:ht,z:He}=ke.userData,Fe=ht+He,at=Fe<=20?"20":Fe<=60?"60":"max";let ct=this.options.material;ct||(ct=[Pe[at+"Top"],Pe[at+"Side"]]);const xt=yield ye.draw("ExtrudePolygon",{key:`$p:-${ht}-${He}`,geometry:ke,material:ct},this);this.options.grey||(xt.object3d.castShadow=!0),this.building[ht]||(this.building[ht]=[]),this.building[ht].push(xt),xt.position.z=Number(He)*(v||1)}))),this.options.sideGradient&&this.sideGradient(),this.object3d.name="建筑",C||this.lead.updateBaseObjectKey(this,`building${Se?"-grey":""}#group`)})}sideGradient(r="#052438",d=.05/100){this.traverse(g=>{if(g instanceof is){const v=g.object3d.material;v[1].onBeforeCompile=C=>{C.uniforms.gradientColor={value:new Color$1(r)},C.uniforms.maxGradientHeight={value:d},C.uniforms.worldPositionZ=this.worldPositionZ,C.vertexShader=`
4856
+ `,defines:{}}),"baseTexture");return t.needsSwap=!0,t},Le=1,pe=!1,Gs=new MeshBasicMaterial({color:"black"}),Xs=new PointsMaterial({color:"black",sizeAttenuation:!1}),$s=new PointsMaterial({color:"black",sizeAttenuation:!0}),qs=new SpriteMaterial({color:"black",sizeAttenuation:!0}),Qs=new SpriteMaterial({color:"black",sizeAttenuation:!1}),Js=new Ie$2({color:"black",sizeAttenuation:0,lineWidth:0}),ei={kernelRadius:8,minDistance:.005,maxDistance:.1},ti={threshold:0,strength:.4,radius:.1,bloomAlphaType:0},si={multisampling:4,premultiplieAlpha:!1};class ii{constructor(t){this.bloomComposerActive=!1,this.active=!0,this.bloomSelection=new Set,this.bloomLayer=new Layers,this.bloomMaterials={},this.bloomVisible={},this.bloomComposerRenderIng=!1,this.pipViewportState=null,this.options=t;const{rendererController:r,sceneController:d,cameraController:g,composerParams:v}=t,{renderer:C}=r;this.renderer=C;const{multisampling:w}=v,{maxSamples:I}=C.capabilities,O=C.getDrawingBufferSize(new Vector2),ye=new WebGLRenderTarget(O.width,O.height,{samples:Math.min(w,I),type:HalfFloatType}),Se=new EffectComposer(C,ye),Pe=this.getSize();Se.setSize(Pe.width,Pe.height);const Ne=new RenderPass(d.scene,g.camera);Se.addPass(Ne),this.scene=d.scene,this.camera=g.camera,this.finalComposer=Se,this.renderPass=Ne,g.event.on("pageChange",ke=>{this.changeCamera(ke)}),d.event.on("pageChange",ke=>{this.changeScene(ke)})}changeCamera(t){this.renderPass.camera=t,this.camera=t}changeScene(t){this.renderPass.scene=t,this.ssaoPass&&(this.ssaoPass.scene=t),this.scene=t}addOutputPass(){const{premultiplieAlpha:t}=this.options.composerParams,r=new Ws;this.outputPass=r,this.setPremultiplieAlpha(t),this.finalComposer.addPass(r)}setPremultiplieAlpha(t){this.outputPass&&(this.outputPass.uniforms.premultiplieAlpha.value=t?1:0)}addSSAOPass(t){const{scene:r,camera:d,renderer:g}=this,v=g.getSize(new Vector2),C=v.width,w=v.height,I=new SSAOPass(r,d,C,w);I.kernelRadius=t.kernelRadius,I.minDistance=t.minDistance,I.maxDistance=t.maxDistance,this.ssaoPass=I,this.finalComposer.addPass(I)}addBloomPass(t){const{renderer:r}=this,{threshold:d,strength:g,radius:v,bloomAlphaType:C}=t,w=new UnrealBloomPass(new Vector2(window.innerWidth,window.innerHeight),g,v,d);this.bloomPass=w;const I=new EffectComposer(r);I.renderToScreen=!1,I.addPass(this.renderPass),I.addPass(w),this.bloomComposer=I;const O=Ks(I);O.uniforms.bloomAlphaType.value=C,this.bloomComposer=I,this.finalComposer.addPass(O),this.mixPass=O,this.bloomLayer.set(Le)}setBloomSelection(t,r){if(!this.bloomComposer){console.warn("err:pencil.options.bloom");return}t.traverse(d=>{const{object3d:g}=d;g&&(r?(this.bloomSelection.add(d),g.layers.enable(Le)):(this.bloomSelection.delete(d),g.layers.disable(Le)))}),this.bloomSelection.size===0?this.bloomComposerActive=!1:this.bloomComposerActive=!0}enable(){this.active||(this.active=!0)}disable(){this.active&&(this.active=!1)}setSize(t,r){var d;(d=this.bloomComposer)==null||d.setSize(t,r),this.finalComposer.setSize(t,r)}setPixelRatio(t){var r;(r=this.bloomComposer)==null||r.setPixelRatio(t),this.finalComposer.setPixelRatio(t)}darkenNonBloomed(){const t=[],r=[];this.scene.children.forEach(d=>{d.isTransformControls||d.isTransformControlsRoot||d.type==="RectAreaLightHelper"?t.push(d):r.push(d)}),r.forEach(d=>{d.traverse(g=>{var v;const C=g,w=g,I=g;(v=C.material)!=null&&v.isShadowMaterial?t.push(C):C.material&&this.bloomLayer.test(C.layers)===!1&&(this.bloomMaterials[C.uuid]=C.material,w.isSprite?w.material.sizeAttenuation?w.material=qs:w.material=Qs:C.material instanceof Ie$2?C.material=Js:I.isPoints?I.material.sizeAttenuation?I.material=$s:I.material=Xs:C.material=Gs)})}),t.forEach(d=>{this.bloomVisible[d.uuid]=d.visible,d.visible=!1})}restoreNonBloomed(){this.scene.traverse(t=>{const r=t;this.bloomMaterials[r.uuid]?(r.material=this.bloomMaterials[r.uuid],delete this.bloomMaterials[r.uuid]):this.bloomVisible[r.uuid]!==void 0&&(r.visible=this.bloomVisible[r.uuid],delete this.bloomVisible[r.uuid])})}finalComposerRender(){this.bloomComposerActive&&this.bloomComposer?(this.bloomComposerRenderIng=!0,this.mixPass.enabled=!0,this.darkenNonBloomed(),this.bloomComposer.render(),this.restoreNonBloomed(),this.bloomComposerRenderIng=!1):this.mixPass&&(this.mixPass.enabled=!1),this.finalComposer.render()}getSize(){return this.renderer.getSize(new Vector2)}render(){if(!this.active)return;const{cameraController:t,rendererController:r,sceneController:d}=this.options;if(this.finalComposerRender(),this.pipViewportState){t.setPageActive(31),t.setAspect(this.pipViewportState.width/this.pipViewportState.height),r.setViewport(te(U({},this.pipViewportState),{scissor:!0,scissorTest:!0})),this.finalComposerRender(),t.setPageActive(d.activeIndex);const g=this.getSize();r.setViewport({x:0,y:0,width:g.width,height:g.height,scissor:!0,scissorTest:!1})}}dispose(){var t;this.bloomMaterials={},this.bloomVisible={},this.bloomSelection.clear(),this.finalComposer.dispose(),(t=this.bloomComposer)==null||t.dispose()}}class it extends Loader{constructor(t){super(t),this.options={type:"image"}}setOptions(t){return this.options=t,this}load(t,r,d,g){let v,C;this.options.type==="image"?(C=document.createElement("img"),v=new Texture(C)):this.options.type==="video"?(C=document.createElement("video"),C.preload="auto",C.autoplay=!1,C.loop=!1,C.muted=!0,C.setAttribute("webkit-playsinline","webkit-playsinline"),C.setAttribute("playsinline",""),v=new VideoTexture(C)):v=new Texture;const w=new FileLoader(this.manager);return w.setResponseType("blob"),w.setRequestHeader(this.requestHeader),w.setPath(this.path),w.setWithCredentials(this.withCredentials),w.load(t,I=>{let O=I;const ye=t.split(".").pop(),Se=this.options.type==="image"?`image/${ye||"png"}`:`video/${ye||"mp4"}`;O=O.slice(0,I.size,Se);const Pe=()=>{C.removeEventListener("load",Ne,!1),C.removeEventListener("error",ke,!1)},Ne=()=>{Pe(),v.needsUpdate=!0,r&&r(v)},ke=He=>{Pe(),g&&g(He),this.manager.itemError(t),this.manager.itemEnd(t)};C.addEventListener("load",Ne,!1),C.addEventListener("error",ke,!1);const ht=window.URL.createObjectURL(O);C.src=ht},d,g),v}}class ri extends Loader{constructor(t){super(t)}load(t,r,d,g){const v=new FileLoader(this.manager);v.setResponseType("blob"),v.setRequestHeader(this.requestHeader),v.setPath(this.path),v.setWithCredentials(this.withCredentials),v.load(t,C=>{const w=C,I=new DecompressionStream("gzip"),O=w.stream().pipeThrough(I);new Response(O).json().then(ye=>{r==null||r(ye)}).catch(ye=>{g==null||g(ye)})},d,g)}}const oi={images:["png","jpg","jpeg","ico","webp","avif"],media:["mp4","webm","ogg"],gltf:["gltf","glb"],json:["json","geojson"],gzipJson:["json.gzip"],exr:["exr"],lottie:["lottie.json"]};class ni{constructor(t){this.loadObj=[],this.delLoadArr=[],this.assets=new Map,this.event=new ve.EventEmitter,this.options=U({simpleTexture4deleted:!1,prefix:""},t),this.loadingManager=new LoadingManager(()=>{},(r,d,g)=>{this.emit("progress",d,g)},r=>{console.warn(`Failed to load ${r}`)})}emit(t,...r){this.event.emit(t,...r)}on(t,r){this.event.on(t,r)}getAsset(t){const r=this.getAssetType(t);if(!r)return;const d=this.assets.get(t);if(!d){if((r==="images"||r==="media"||r==="exr")&&this.options.simpleTexture4deleted&&this.delLoadArr.includes(t))return new Texture;console.warn(`Asset ${t} not found`)}return d}getAssetType(t){var r;const d=(r=t.split(".").pop())==null?void 0:r.toLowerCase();if(d){if(t.endsWith("lottie.json"))return"lottie";if(t.endsWith("json.gzip"))return"gzipJson"}else return;for(const[g,v]of Object.entries(oi))if(v.includes(d))return g}getLoader(t,r){if(t==="images")return this.textureLoader||(this.textureLoader=new it(this.loadingManager),this.options.prefix&&this.textureLoader.setPath(this.options.prefix)),this.textureLoader;if(t==="media")return this.videoTextureLoader||(this.videoTextureLoader=new it(this.loadingManager),this.videoTextureLoader.setOptions({type:"video"}),this.options.prefix&&this.videoTextureLoader.setPath(this.options.prefix)),this.videoTextureLoader;if(t==="gltf"&&r!=null&&r.dracoPath)return this.dracoGltfLoader||(this.dracoGltfLoader=new GLTFLoader(this.loadingManager),this.dracoLoader=new DRACOLoader,this.dracoLoader.setDecoderPath(r==null?void 0:r.dracoPath),this.dracoGltfLoader.setDRACOLoader(this.dracoLoader),this.options.prefix&&this.dracoGltfLoader.setPath(this.options.prefix)),this.dracoGltfLoader;if(t==="gltf")return this.gltfLoader||(this.gltfLoader=new GLTFLoader(this.loadingManager),this.options.prefix&&this.gltfLoader.setPath(this.options.prefix)),this.gltfLoader;if(t==="lottie")return this.lottieLoader||(this.lottieLoader=new LottieLoader(this.loadingManager),this.options.prefix&&this.lottieLoader.setPath(this.options.prefix)),this.lottieLoader;if(t==="gzipJson")return this.gzipJsonLoader||(this.gzipJsonLoader=new ri(this.loadingManager),this.options.prefix&&this.gzipJsonLoader.setPath(this.options.prefix)),this.gzipJsonLoader;if(t==="json")return this.jsonLoader||(this.jsonLoader=new FileLoader(this.loadingManager),this.jsonLoader.setResponseType("json"),this.options.prefix&&this.jsonLoader.setPath(this.options.prefix)),this.jsonLoader;if(t==="exr")return this.exrLoader||(this.exrLoader=new EXRLoader(this.loadingManager),this.options.prefix&&this.exrLoader.setPath(this.options.prefix)),this.exrLoader}add(t,r){typeof t=="string"&&(t=[t]),t.forEach(d=>{const g=U({src:d},r);this.loadObj.push(g)})}getSrcByAsset(t,r=this.assets){let d;return r.forEach((g,v)=>{g===t&&(d=v)}),d}get textureAssets(){const t=new Map;return this.assets.forEach((r,d)=>{(r instanceof Texture||r instanceof DataTexture||r instanceof VideoTexture)&&t.set(d,r)}),t}loadAll(){return se(this,null,function*(){const t=this.loadObj.filter(r=>!this.delLoadArr.includes(r.src));return yield Promise.all(t.map(r=>this.load(r.src,r)))})}load(t,r){return se(this,null,function*(){var d,g;const v=(d=r==null?void 0:r.type)!=null?d:this.getAssetType(t);if(!v)return;const C=(r==null?void 0:r.cache)!==!1,w=esusLite.makePromiseCreator();if(C){if(this.assets.has(t))return this.assets.get(t);this.assets.set(t,w.promise)}const I=this.getLoader(v,r);try{const O=yield I.loadAsync(t);if(this.assets.set(t,O),w.resolve(O),v==="images"||v==="media"||v==="exr"||v==="lottie"){(r==null?void 0:r.colorCorrection)!==!1&&l$1({texture:O});const ye=(g=r==null?void 0:r.anisotropy)!=null?g:this.options.anisotropy;O.anisotropy=ye}return O}catch(O){w.reject(`Failed to load ${t}`);return}})}getUnusedAssets(){const{scene:t}=this.options;if(!t)return[...this.delLoadArr];const r=new Set,d=this.textureAssets;t.traverse(v=>{const C=v;C.material&&(Array.isArray(C.material)?C.material:[C.material]).forEach(w=>{[w.map,w.emissiveMap,w.normalMap,w.roughnessMap,w.metalnessMap,w.aoMap].forEach(I=>{if(I){const O=this.getSrcByAsset(I,d);O&&r.add(O)}})})});const g=new Set(this.textureAssets.keys());return r.forEach(v=>{g.delete(v)}),[...g,...this.delLoadArr]}dispose(){var t;this.assets.clear(),(t=this.dracoLoader)==null||t.dispose(),this.event.removeAllListeners(),this.delLoadArr.length=0,this.loadObj.length=0}}const ai={prefix:""};class li extends ee{get loader(){return this.controller}constructor(t){super(),this.options=t}addLoader(t,r){const{loaderParams:d}=this.options,g=new ni(te(U({},d),{scene:t}));return this.addController(g,r)}removePage(t){super.removePage(t,r=>{r.dispose()})}}function rt(m){let t=!1,r=[];return function(...d){r=d,t||(t=!0,requestAnimationFrame(()=>{t=!1,m(...r)}))}}class hi{constructor(t){var r;this.enabled=!0,this.pickFunctionsMap=new Map,this.pickNodeFunctionsMap=new Map,this.pickFunctionsMapIndex=-1,this.pickNodeFunctionsMapIndex=-1,this.activeObjects=new Set,this.prevActiveObjects=new Set,this.objCallbackMap=new Map,this.pickListener={move:!1,down:!1},this.pencil=t,this.domElement=((r=t.options.controls)==null?void 0:r.domElement)||t.options.container}addPickListener(t){const r=new Set(["move","enter","leave"]),d=new Set(["down","downOutside","click"]),g=v=>{var C;if(!this.enabled)return;v.preventDefault();const w=t==="move"?r:d,I=[];if(this.pickFunctionsMap.forEach(Ne=>{w.has(Ne.type)&&I.push(te(U({},Ne),{objArr:Ne.objArr instanceof Function?Ne.objArr():Ne.objArr}))}),I.length===0)return;this.activeObjects.clear(),this.objCallbackMap.clear();const O=this.objCallbackMap;for(const Ne of I)for(const ke of Ne.objArr){if(!ke.object3d||!ke.visibleWithAncestors)continue;O.has(ke)||O.set(ke,new Map);const ht=O.get(ke);ht.has(Ne.type)||ht.set(Ne.type,[]),ht.get(Ne.type).push(Ne.cb)}if(O.size===0)return;const ye=[...O.keys()].map(Ne=>Ne.object3d);console.time(`Pick:listener:${t}:pick`);const Se=(C=this.pencil.pick(v,ye,!0))==null?void 0:C.intersects;if(console.timeEnd(`Pick:listener:${t}:pick`),!Se||Se.length===0)t==="down"?this.handleDownOutside(v):t==="move"&&this.handleLeaveEvents(v);else{const Ne=Se[0];this.processIntersection(Ne,v,t)}const Pe=this.prevActiveObjects;this.prevActiveObjects=this.activeObjects,this.activeObjects=Pe,this.activeObjects.clear()};this.domElement.addEventListener(`pointer${t}`,rt(g),{passive:!1})}processIntersection(t,r,d){const g=this.objCallbackMap,v=t.index||-1;let C=t.object;for(;C;){const w=this.pencil.lead.objMap.get(C);w&&g.has(w)&&this.activeObjects.add(w),C=C.parent}d==="move"?this.handleLeaveEvents(r):d==="down"&&this.handleDownOutside(r),this.processObjectHierarchy(r,d,v)}processObjectHierarchy(t,r,d){const g=this.objCallbackMap;let v=!1;const C=()=>{v=!0};for(const w of this.activeObjects){if(v)break;const I=g.get(w);if(I)if(r==="move"){const O=I.get("enter");if(O&&!this.prevActiveObjects.has(w))for(const Se of O)Se({baseObject:w,mouseEvent:t,sp:C,intersectionIndex:d});const ye=I.get("move");if(ye)for(const Se of ye)Se({baseObject:w,mouseEvent:t,sp:C,intersectionIndex:d})}else{const O=I.get("down");if(O)for(const Se of O)Se({baseObject:w,mouseEvent:t,sp:C,intersectionIndex:d});const ye=I.get("click");if(ye){const Se=Pe=>{Pe.preventDefault();const Ne=5;if(!v&&Math.abs(Pe.clientX-t.clientX)<=Ne&&Math.abs(Pe.clientY-t.clientY)<=Ne)for(const ke of ye)ke({baseObject:w,mouseEvent:t,sp:C,intersectionIndex:d});this.domElement.removeEventListener("pointerup",Se)};this.domElement.addEventListener("pointerup",Se)}}}}handleLeaveEvents(t){this.objCallbackMap.forEach((r,d)=>{const g=r.get("leave");if(g&&this.prevActiveObjects.has(d)&&!this.activeObjects.has(d))for(const v of g)v({baseObject:d,mouseEvent:t})})}handleDownOutside(t){this.objCallbackMap.forEach((r,d)=>{const g=r.get("downOutside");if(g&&!this.activeObjects.has(d))for(const v of g)v({baseObject:d,mouseEvent:t})})}handlePick(t,r,d){let g=r;g==="mousemove"?g="move":g==="mouseenter"?g="enter":g==="mouseleave"&&(g="leave"),this.pickFunctionsMapIndex+=1;const v=this.pickFunctionsMapIndex;return this.pickFunctionsMap.set(v,{objArr:t,type:g,cb:d}),this.pickListener.move||Array.from(this.pickFunctionsMap.values()).some(C=>["move","enter","leave"].includes(C.type))&&(this.pickListener.move=!0,this.addPickListener("move")),this.pickListener.down||Array.from(this.pickFunctionsMap.values()).some(C=>["down","downOutside","click"].includes(C.type))&&(this.pickListener.down=!0,this.addPickListener("down")),v}removePick(t){this.pickFunctionsMap.delete(t)}handlePickNode(t,r,d){if(r==="downOutside")return console.warn("handlePickNode:err:不支持 downOutside"),-1;this.pickNodeFunctionsMapIndex+=1;const g=this.pickNodeFunctionsMapIndex,v=t instanceof Function?t():t,C=[];for(const w of v){const I=w;I.element.style.pointerEvents="auto";const O=Se=>{this.enabled&&(Se.preventDefault(),d({baseObject:I,mouseEvent:Se}))},ye=`pointer${r}`;I.element.addEventListener(ye,rt(O),!1),C.push({arr:I,type:ye,listener:O})}return this.pickNodeFunctionsMap.set(g,C),g}removePickNode(t){const r=this.pickNodeFunctionsMap.get(t);if(r){for(const d of r)d.arr.element.style.pointerEvents="none",d.arr.element.removeEventListener(d.type,d.listener,!1);this.pickNodeFunctionsMap.delete(t)}}dispose(){this.pickFunctionsMap.clear(),this.pickNodeFunctionsMap.clear(),this.activeObjects.clear(),this.prevActiveObjects.clear(),this.objCallbackMap.clear()}}class ci extends hi{constructor(t,r){super(t),this.objMap=new Map,this.objects=new Map,this.objectsPm=new Map,this.objectNamesToFactories=new Map,this.mList=r.mList,this.scene=this.createBaseObject(r.scene||new Scene,{key:"@Scene",name:"场景"}),this.group=this.createBaseObject(new Group$1,{key:"@Group",name:"物体组",target:this.scene}),this.prefabGroup=this.createBaseObject(new Group$1,{key:"@PrefabGroup",name:"预制组",target:this.scene})}get objectsPromise(){return this.objectsPm.values()}createBaseObject(t,r){const d=new ft$1;return d.object3d=t,d.pencil=this.pencil,d.lead=this,d.mList=this.mList,r!=null&&r.key&&(d.key=r.key),r!=null&&r.name&&(t.name=r.name),r!=null&&r.target&&(r==null||r.target.add(d.object3d)),this.objects.set(d.key,d),this.objMap.set(d.object3d,d),d}init(t){return Object.keys(t).forEach(r=>{const d=class{create(g={}){return new t[r](g)}};this.objectNamesToFactories.set(r,d)}),this}getObject(t,r){t.includes("#")&&console.warn("getObject:err:不支持 #",t);const{key:d}=r||{},g=`${t}${d?`#${d}`:""}`;return this.objects.get(g)}getAllObject(t,r){t.includes("#")&&console.warn("getAllObject:err:不支持 #",t);const{key:d}=r||{},g=`${t}${d?`#${d}`:""}`,v=[];return this.objects.forEach((C,w)=>{(w.startsWith(d?g:`${g}#`)||w===g)&&v.push(C)}),v}draw(t,r,d){return se(this,null,function*(){var g,v,C,w;const I=this.objectNamesToFactories.get(t);if(I){r||(r={}),r.target===void 0&&(r.target=d);const O=r.target,ye=(g=r.onTop)!=null?g:0,Se=(v=r.prefab)!=null?v:!1,Pe=(C=r.create)!=null?C:!0,Ne=new I().create(r);let ke;return O===null?ke=null:typeof O=="string"?ke=this.objects.get(O):(w=O==null?void 0:O.objectType)!=null&&w.startsWith("BaseObject")||O?ke=O:Se?ke=this.prefabGroup:ke=this.group,Pe===!1?Ne.create=()=>{}:Pe!==!0&&(Ne.create=()=>{Pe(Ne)}),Ne.pencil=this.pencil,Ne.lead=this,Ne.mList=this.mList,Ne.prefab=Se,Ne.objectType=`BaseObject#${t}`,Ne.objectOptions=r,this.setBaseObjectKey(Ne,r.key?`$t:#${r.key}`:"$t:",ke==null?void 0:ke.key),this.objectsPm.set(Ne,this.addBaseObject(Ne,ke,ye)),yield this.objectsPm.get(Ne),this.objectsPm.delete(Ne),Ne}throw new Error(`Unrecognized:${t}`)})}setBaseObjectKey(t,r,d){const g=t.objectType,[,v]=g.split("#");let C=r.replace("$t:",v);if(d){const[,w]=d.split("#");C=C.replace("$p:",w)}return this.objects.has(C)&&(C.includes("#")?C+=`-${esusLite.generateUUID()}`:C+=`#${esusLite.generateUUID()}`),t.key=C,this.objects.set(C,t),C}updateBaseObjectKey(t,r){var d;let g;for(const[w,I]of this.objects.entries())if(I===t){g=w;break}const v=(d=t.parent)==null?void 0:d.key,C=this.setBaseObjectKey(t,r,v);return g&&this.objects.delete(g),this.pencil.event.emit("updateKey",t,C,g),C}addBaseObject(t,r,d){return se(this,null,function*(){yield t.create(),t.object3d&&(this.pencil.options.mList&&(this.mList.proxyBaseObject(t),this.mList.addBaseObjectMap(t)),d&&t.setTop(d),r!==null&&(r.add(t.object3d),this.objMap.set(t.object3d,t))),t.render(),this.pencil.event.emit("draw",t)})}erase(...t){this.handleErase(!0,...t)}eraseWithoutMaterial(...t){this.handleErase(!1,...t)}handleErase(t,...r){[...r].forEach(d=>{const g=[];if(typeof d=="string"){const[v,C]=d.split("#");g.push(...this.getAllObject(v,{key:C}))}else g.push(d);g.forEach(v=>{v.disposeMaterialIfNotUsed=t,v.dispose()})}),this.pencil.event.emit("erase",...r)}update(t,r){this.objects.forEach(d=>{d.update(t,r)})}setSize(t,r){this.objects.forEach(d=>{d.resize(t,r)})}eraseAll(){this.group&&(this.objects.forEach(t=>{t.key.startsWith("Node")&&this.erase(t)}),this.erase(this.group))}dispose(){super.dispose(),this.scene.erase(),this.objects.forEach(t=>{t.erase()}),this.objects.clear(),this.objectsPm.clear(),this.objMap.clear(),this.objectNamesToFactories.clear()}}class di extends ee{get lead(){return this.controller}constructor(t){super(),this.options=t}addLead(t,r,d){const{pencil:g}=this.options,v=new ci(g,{scene:t,mList:r});return this.addController(v,d)}removePage(t){super.removePage(t,r=>{r.dispose()})}setPageActive(t){super.setPageActive(t,(r,d)=>{r.enabled=d})}setSize(t,r){this.controllerMap.forEach((d,g)=>{g.setSize(t,r)})}}class mi{constructor(t){this.materials=new Map,this.fixBaseObjects=new Map,this.materialBaseObjectMap=new Map,this.pencil=t}add(t,r){this.materials.set(t,r);const d={object3d:new Proxy({material:r},{set:(g,v,C)=>{var w;if(v==="material"&&!((w=this.pencil.composerController)!=null&&w.bloomComposerRenderIng)){const I=g.material;return g.material=C,this.materials.set(t,C),this.disposeMaterial(I),this.syncChangeMaterial(I,C),!0}return g[v]=C,!0}})};this.fixBaseObjects.set(t,d)}get(t){const r=this.materials.get(t);return r||console.warn(`Material with key "${t}" not found.`),r}getKey(t){for(const[r,d]of this.materials.entries())if(d===t)return r}getFixBaseObject(t){return this.fixBaseObjects.get(t)||null}addMultiple(t,r){for(const[d,g]of Object.entries(r)){const v=`${t}#${d}`;g&&this.add(v,g)}}getMultiple(t){const r={},d=`${t}#`;let g=!1;for(const[v,C]of this.materials.entries())if(v.startsWith(d)){const w=v.substring(d.length);r[w]=C,g=!0}return g?r:null}copy(t,r){const d=this.get(t);if(!d)return console.warn(`Material with key "${t}" not found.`),null;const g=d.clone();return this.add(r,g),g}copyMultiple(t,r){const d={},g=`${t}#`;for(const[v,C]of this.materials.entries())if(v.startsWith(g)){const w=v.substring(g.length),I=C.clone();d[w]=I;const O=`${r}#${w}`;this.add(O,I)}return d}disposeMaterial(t){if(!t)return;const r=new ie$1;r.track(Array.isArray(t)?t:[t]),r.dispose()}remove(t){const r=this.materials.get(t);r&&this.disposeMaterial(r),this.materials.delete(t),this.fixBaseObjects.delete(t)}removeByMaterial(t){[...this.materials.entries()].some(([r,d])=>d===t?(this.remove(r),!0):!1)}proxyBaseObject(t){const r=t.object3d;t.materialList&&(t.materialList=new Proxy(t.materialList,{set:(v,C,w)=>{if(typeof C=="string"){const I=v[C];return this.rmBaseObjectMap(t,I),v[C]=w,w&&this.addBaseObjectMap(t),!0}return v[C]=w,!0},deleteProperty:(v,C)=>{if(typeof C=="string"&&v[C]){const w=v[C];this.rmBaseObjectMap(t,w)}return delete v[C],!0}}));const d=r.material,g="_enhancedMaterial";r[g]=d,Object.defineProperty(r,"material",{get:()=>r[g],set:v=>{var C;if((C=this.pencil.composerController)!=null&&C.bloomComposerRenderIng)r[g]=v;else{if(t.materialList&&Object.values(t.materialList).includes(v)){r[g]=v;return}this.rmBaseObjectMap(t),r[g]=v,this.addBaseObjectMap(t)}},enumerable:!0,configurable:!0})}addBaseObjectMap(t){const r=t.object3d;[...Object.values(t.materialList),r.material].forEach(d=>{if(d){const g=this.materialBaseObjectMap.get(d);g?g.add(t):this.materialBaseObjectMap.set(d,new Set([t]))}})}rmBaseObjectMap(t,r,d=!0){this.materialBaseObjectMap.forEach((g,v)=>{r&&v!==r||g.has(t)&&(g.delete(t),g.size===0&&d&&(this.materialBaseObjectMap.delete(v),this.disposeMaterial(v)))})}syncChangeMaterial(t,r){this.materialBaseObjectMap.forEach((d,g)=>{g===t?d.forEach(v=>{const C=v.object3d;C.material===t&&(C.material=r),v.materialList&&Object.keys(v.materialList).forEach(w=>{v.materialList[w]===t&&(v.materialList[w]=r)})}):Array.isArray(g)&&g.includes(t)&&g.forEach((v,C)=>{v===t&&(g[C]=r)})})}dispose(){const t=new ie$1;t.track([...this.materials.values()]),t.dispose(),this.materials.clear(),this.fixBaseObjects.clear(),this.materialBaseObjectMap.clear()}}class pi extends ee{get mList(){return this.controller}constructor(t){super(),this.options=t}addMList(t,r){const{pencil:d}=this.options,g=new mi(d);return this.addController(g,r)}removePage(t){super.removePage(t,r=>{r.dispose()})}}const _e=class Pn{constructor(t){var r,d;this.raycaster=new Raycaster,this.maxBackufferArea=5760*5760,this.installPlugins=new Map,this._cameraPositon=new Vector3,this._cameraTarget=new Vector3,this.event=new ve.EventEmitter,this.timer=new Timer,this.userData={},this.pageActiveIndex=0,this.pageCountIndex=0,this.userSetDprCache=1,this.viewPadding=[0,0,0,0],this.event.setMaxListeners(1/0),(d=(r=this.timer).connect)==null||d.call(r,document),this.options=is$1(Pn.options,t,{isMergeableObject:f$1}),this.userSetDprCache=this.options.renderer.devicePixelRatio;const{container:g,stats:v,transformControls:C}=this.options;if(this.init(),this.options.WebGPUTHREE||this.initComposer(),this.initCSSRenderer(),C&&this.initTransformControls(),v){const w=new Stats({horizontal:!1});w.dom.style.position="absolute",w.init(this.renderer),g.appendChild(w.dom),this.stats=w}this.initResizeObserver(),this.tweenUpdateRaf()}getPlugin(t){return this.installPlugins.get(t)}get renderer(){return this.rendererController.renderer}get maxAnisotropy(){return this.options.WebGPUTHREE?0:this.renderer.capabilities.getMaxAnisotropy()}get controls(){return this.controlsController.cameraControls}get cameraPositon(){return this.controls.getPosition(this._cameraPositon,!1)}get cameraTarget(){return this.controls.getTarget(this._cameraTarget,!1)}get camera(){return this.cameraController.camera}get scene(){return this.sceneController.scene}get loader(){return this.loaderController.loader}get lead(){return this.leadController.lead}get mList(){return this.mListController.mList}tweenUpdateRaf(){update(),this.TweenRaf=requestAnimationFrame(this.tweenUpdateRaf.bind(this))}use(t,...r){this.installPlugins.has(t.pluginName)?console.log("plugin already installed"):typeof t.install=="function"&&(t.install(this,...r),this.installPlugins.set(t.pluginName,t))}addPage({sceneOptions:t,cameraOptions:r}={}){const d=this.pageCountIndex+1,g=this.cameraController.addPerspectiveCamera(r,d),v=this.sceneController.addScene(t,d);v.add(g),this.controlsController.addCameraControls(g,d),this.loaderController.addLoader(v,d);const C=this.mListController.addMList(null,d);return this.leadController.addLead(v,C,d),this.pageCountIndex=d,d}removePage(t){this.cameraController.removePage(t),this.sceneController.removePage(t),this.controlsController.removePage(t),this.loaderController.removePage(t),this.mListController.removePage(t),this.leadController.removePage(t),this.pageCountIndex===t&&(this.pageCountIndex-=1),this.pageActiveIndex===t&&(this.render(),this.showPage(0))}showPage(t){var r;if(t===this.pageActiveIndex)return;const d=this.scene;this.sceneController.setPageActive(t),d&&((r=this.cssRendererController)==null||r.render(d,this.camera)),this.cameraController.setPageActive(t),this.controlsController.setPageActive(t),this.loaderController.setPageActive(t),this.mListController.setPageActive(t),this.leadController.setPageActive(t),this.pageActiveIndex=t}init(){var t;const{container:r,WebGPUTHREE:d,helper:g,viewHelper:v,renderer:C,controls:w,loader:I}=this.options,{width:O,height:ye}=this.getSize(),Se=d?new Rs({width:O,height:ye,renderer:d.WebGPURenderer,rendererParams:Ms}):new As({width:O,height:ye,rendererParams:te(U({},C),{antialias:!1})}),Pe=new Us({width:O,height:ye}),Ne=new ks({}),ke=new Ns({controlsParams:{domElement:(t=w==null?void 0:w.domElement)!=null?t:Se.renderer.domElement}}),ht=new li({loaderParams:U({anisotropy:Se.renderer.capabilities.getMaxAnisotropy()},I)}),He=new pi({pencil:this}),Fe=new di({pencil:this});this.sceneController=Ne,this.cameraController=Pe,this.controlsController=ke,this.rendererController=Se,this.loaderController=ht,this.mListController=He,this.leadController=Fe;const at=this.addPage({sceneOptions:this.options.scene,cameraOptions:this.options.camera});if(this.showPage(at),g){const ct=new Fs({container:r,sceneController:Ne,cameraController:Pe});ct.add(Ne.scene),this.helperController=ct,v&&ct.addViewHelper()}r.appendChild(Se.renderer.domElement)}initComposer(){const{bloom:t,bloomParams:r,ssao:d,ssaoParams:g,composer:v}=this.options,C=new ii({rendererController:this.rendererController,sceneController:this.sceneController,cameraController:this.cameraController,composerParams:v});this.composerController=C,t&&C.addBloomPass(U({},r)),d&&C.addSSAOPass(U({},g)),C.addOutputPass()}initCSSRenderer(){const{container:t,css2DRenderer:r,css3DRenderer:d,css2DRendererParams:g,css3DRendererParams:v}=this.options;if(r||d){const C=new Ys(t);r&&C.addRenderer("css2d",g),d&&C.addRenderer("css3d",v),this.cssRendererController=C}}initTransformControls(){const t=new Hs({camera:this.camera,renderer:this.renderer,scene:this.scene});t.event.on("mouseDown",()=>{var r;(r=this.controlsController)==null||r.disable()}),t.event.on("mouseUp",()=>{var r;(r=this.controlsController)==null||r.enable()}),this.transformController=t}getSize(){const{container:t}=this.options;return{width:t.offsetWidth,height:t.offsetHeight}}initResizeObserver(){const{container:t}=this.options;if(this.resizeObserver)return;const r=new ResizeObserver(d=>{for(const g of d){const v=g.contentRect;this.handeleResize(v.width,v.height),this.setDevicePixelRatio(this.userSetDprCache)}});r.observe(t),this.resizeObserver=r}handeleResize(t,r,d=!0){const{rendererController:g,cameraController:v,composerController:C,cssRendererController:w,leadController:I}=this,O=this.renderer.getSize(new Vector2);O.x===t&&O.y===r||(v.setSize(t,r),g.setSize(t,r),C==null||C.setSize(t,r),w==null||w.setSize(t,r),I.setSize(t,r),this.installPlugins.forEach(ye=>{var Se;(Se=ye.setSize)==null||Se.call(ye,t,r)}),this.viewPadding.some(ye=>ye!==0)&&this.setViewPadding(...this.viewPadding),this.render(),d&&this.event.emit("resize",{width:t,height:r}))}setDevicePixelRatio(t){var r;this.userSetDprCache=t;const{width:d,height:g}=this.getSize();let v=Math.sqrt(this.maxBackufferArea/(d*g));v=(v*100|0)/100;const C=Math.min(t,v);C!==t&&console.warn("maxBackufferArea:",this.maxBackufferArea," the pixel ratio is set to",C);const w=this.renderer.getPixelRatio();C!==w&&(this.rendererController.setPixelRatio(C),(r=this.composerController)==null||r.setPixelRatio(C),this.viewPadding.some(I=>I!==0)&&this.setViewPadding(...this.viewPadding))}setViewPadding(t=0,r=0,d=0,g=0){const{width:v,height:C}=this.renderer.getSize(new Vector2),w={x:g,y:d,width:v-g-r,height:C-t-d};this.rendererController.setViewport(w),this.cameraController.setAspect(w.width/w.height),this.viewPadding=[t,r,d,g]}pick(t,r,d=!0){const{raycaster:g,options:v}=this,{container:C}=v,w=new Vector2,I=C.getBoundingClientRect();if(w.x=(t.clientX-I.left)/(I.right-I.left)*2-1,w.y=-((t.clientY-I.top)/(I.bottom-I.top))*2+1,this.camera&&this.scene){g.setFromCamera(w,this.camera);const O=g.intersectObjects(r||this.scene.children,d);if(O.length)return{object:O[0].object,index:O[0].index,intersects:O}}}render(){var t,r,d,g,v,C;if(!this.camera||!this.scene)return;this.timer.update(),update();const w=this.timer.getDelta(),I=this.timer.getElapsed();this.controlsController.update(w,I),this.leadController.update(w,I),this.installPlugins.forEach(O=>{var ye;(ye=O.update)==null||ye.call(O,w,I)}),(t=this.helperController)==null||t.update(w,this.controlsController,this.cameraTarget),(r=this.composerController)!=null&&r.active?this.composerController.render():(d=this.rendererController)==null||d.render(this.scene,this.camera),(g=this.helperController)==null||g.renderViewHelper(this.renderer),(v=this.cssRendererController)==null||v.render(this.scene,this.camera),(C=this.stats)==null||C.update(),this.event.emit("render",{delta:w,elapsed:I})}start(){window.cancelAnimationFrame(this.TweenRaf),this.renderer.setAnimationLoop(this.render.bind(this)),this.event.emit("start")}stop(){this.tweenUpdateRaf(),this.renderer.setAnimationLoop(null),this.event.emit("stop")}autoRotate(t){this.controlsController.autoRotateSpeed=t}showPipViewport(t){this.composerController.pipViewportState=t;let r=this.pipCameraControls;if(t){const{width:d,height:g}=this.getSize(),v=new DOMRect(t.x/d,(g-t.y-t.height)/g,t.width/d,t.height/g);if(r)r.enabled=!0,r.camera.position.copy(this.camera.position);else{const C=this.cameraController.cloneCamera(31);C.aspect=t.width/t.height,C.updateProjectionMatrix(),r=this.controlsController.addCameraControls(C,this.sceneController.activeIndex),r.addEventListener("update",()=>{this.controls.enabled=!1}),r.addEventListener("sleep",()=>{this.controls.enabled=!0}),this.pipCameraControls=r}r.interactiveArea=v}}dispose(){var t,r,d,g,v,C,w,I,O,ye,Se,Pe,Ne,ke;this.stop(),this.timer.dispose(),removeAll(),this.event.removeAllListeners(),(t=this.resizeObserver)==null||t.unobserve(this.options.container),this.installPlugins.forEach(ht=>{var He;(He=ht.dispose)==null||He.call(ht)}),(r=this.controlsController)==null||r.dispose(),(d=this.transformController)==null||d.dispose(),(g=this.cssRendererController)==null||g.dispose(),(v=this.sceneController)==null||v.dispose(),(C=this.cameraController)==null||C.dispose(),(w=this.helperController)==null||w.dispose(),(I=this.composerController)==null||I.dispose(),(O=this.rendererController)==null||O.dispose(),(ye=this.loaderController)==null||ye.dispose(),(Se=this.leadController)==null||Se.dispose(),(Pe=this.mListController)==null||Pe.dispose(),this.cssRendererController=void 0,this.installPlugins.clear(),(Ne=this.stats)==null||Ne.dom.remove(),(ke=this.renderer)==null||ke.domElement.remove()}};_e.options={stats:pe,helper:pe,viewHelper:pe,controls:!0,transformControls:pe,renderer:Ss,composer:si,scene:zs,camera:wt,bloom:!1,bloomParams:ti,ssao:!1,loader:ai,ssaoParams:ei,css2DRenderer:!1,css2DRendererParams:U({},st),css3DRenderer:!1,css3DRendererParams:U({},st),mList:!0};let ot=_e;const Gi=J.ACTION,b$1=new Map,R$2=(m={})=>({generateTopUV(t,r,d,g,v){const C=r[d*3],w=r[d*3+1],I=r[g*3],O=r[g*3+1],ye=r[v*3],Se=r[v*3+1];let Pe;if(b$1.has(t))Pe=b$1.get(t);else{let He=m.box3;if(!He){He=new Box3;const at=t.parameters.shapes.getPoints().map(ct=>[ct.x,ct.y,0]).flat();He.setFromArray(at)}const Fe=He.getSize(new Vector3);m.split&&(Fe.y/=m.split),Pe={box:He,size:Fe},b$1.set(t,Pe)}const{box:Ne,size:ke}=Pe,ht=m.split?1-m.split:0;return[new Vector2((C-Ne.min.x)/ke.x,(w-Ne.min.y)/ke.y+ht),new Vector2((I-Ne.min.x)/ke.x,(O-Ne.min.y)/ke.y+ht),new Vector2((ye-Ne.min.x)/ke.x,(Se-Ne.min.y)/ke.y+ht)]},generateSideWallUV(t,r,d,g,v,C){const w=r[d*3],I=r[d*3+1],O=r[d*3+2],ye=r[g*3],Se=r[g*3+1],Pe=r[g*3+2],Ne=r[v*3],ke=r[v*3+1],ht=r[v*3+2],He=r[C*3],Fe=r[C*3+1],at=r[C*3+2];let ct;if(b$1.has(r))ct=b$1.get(r);else{const Lt=new Box3;Lt.setFromArray(r);const Wt=Lt.getSize(new Vector3);m.split&&(Wt.z/=1-m.split),m.sideRepeat&&(Wt.z/=m.sideRepeat),ct={box:Lt,size:Wt},b$1.set(r,ct)}const{box:xt,size:Gt}=ct;return Math.abs(I-Se)<Math.abs(w-ye)?[new Vector2((w-xt.min.x)/Gt.x,(O-xt.min.z)/Gt.z),new Vector2((ye-xt.min.x)/Gt.x,(Pe-xt.min.z)/Gt.z),new Vector2((Ne-xt.min.x)/Gt.x,(ht-xt.min.z)/Gt.z),new Vector2((He-xt.min.x)/Gt.x,(at-xt.min.z)/Gt.z)]:[new Vector2((I-xt.min.y)/Gt.y,(O-xt.min.z)/Gt.z),new Vector2((Se-xt.min.y)/Gt.y,(Pe-xt.min.z)/Gt.z),new Vector2((ke-xt.min.y)/Gt.y,(ht-xt.min.z)/Gt.z),new Vector2((Fe-xt.min.y)/Gt.y,(at-xt.min.z)/Gt.z)]}}),P=()=>{b$1.clear()};var Jt=Object.defineProperty,Xt=Object.defineProperties,Qt=Object.getOwnPropertyDescriptors,lt=Object.getOwnPropertySymbols,Bt=Object.prototype.hasOwnProperty,Vt=Object.prototype.propertyIsEnumerable,It=(m,t,r)=>t in m?Jt(m,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):m[t]=r,G=(m,t)=>{for(var r in t||(t={}))Bt.call(t,r)&&It(m,r,t[r]);if(lt)for(var r of lt(t))Vt.call(t,r)&&It(m,r,t[r]);return m},ut=(m,t)=>Xt(m,Qt(t)),gt=(m,t)=>{var r={};for(var d in m)Bt.call(m,d)&&t.indexOf(d)<0&&(r[d]=m[d]);if(m!=null&&lt)for(var d of lt(m))t.indexOf(d)<0&&Vt.call(m,d)&&(r[d]=m[d]);return r},nt=(m,t,r)=>new Promise((d,g)=>{var v=I=>{try{w(r.next(I))}catch(O){g(O)}},C=I=>{try{w(r.throw(I))}catch(O){g(O)}},w=I=>I.done?d(I.value):Promise.resolve(I.value).then(v,C);w((r=r.apply(m,t)).next())});class Xe extends ft$1{constructor(t){super(),this.objectType="BaseObject#Node",this.onNodePointerIndex=[],this.options=G({type:"2d"},t)}create(){const{position:t,children:r}=this.options,d=document.createElement("div");this.element=d,r&&d.appendChild(r),this.options.type==="3d"?this.createCSS3DObject(d):this.options.type==="3dSprite"?this.createCSS3DSprite(d):this.createCSS2DObject(d),t&&this.object3d.position.copy(t)}setChildren(t){this.options.children=t,this.element.innerHTML="",this.element.appendChild(t)}showAndEnsureVisible(){const t=this.options.children;t&&(t.style.visibility="hidden",this.show(),setTimeout(()=>{t.style.visibility="",this.ensureVisible()}))}moveElementToViewport(){const t=this.options.children;if(!t)return;const r=t.getBoundingClientRect(),d=window.innerWidth,g=window.innerHeight;let v=0,C=0;r.left<0?v=-r.left:r.right>d&&(v=d-r.right),r.top<0?C=-r.top:r.bottom>g&&(C=g-r.bottom),r.left+v<0&&(v=-r.left),r.top+C<0&&(C=-r.top),(v!==0||C!==0)&&(t.style.transform=`translate(${v}px, ${C}px)`)}ensureVisible(){const t=this.options.children;if(!t)return;t.style.transform&&(t.style.transform="");const r=new IntersectionObserver(d=>{d.forEach(g=>{g.isIntersecting&&(this.moveElementToViewport(),r.disconnect())})});r.observe(t)}onPointerEvent(t,r){const d=this.lead.handlePickNode([this],t,r);this.onNodePointerIndex.push(d)}dispose(){this.onNodePointerIndex.forEach(t=>{this.lead.removePickNode(t)}),super.dispose()}}class Qe extends ft$1{create(){this.createGroup()}}const Ue={ArcCurve,CatmullRomCurve3,CubicBezierCurve,CubicBezierCurve3,EllipseCurve,LineCurve,LineCurve3,QuadraticBezierCurve,QuadraticBezierCurve3,SplineCurve};class Z extends BufferGeometry{constructor(t=new Shape([new Vector2(.5,.5),new Vector2(-.5,.5),new Vector2(-.5,-.5),new Vector2(.5,-.5)]),r={}){super(),this.type="ExtrudeGeometry",this.parameters={shapes:t,options:r},t=Array.isArray(t)?t:[t];const d=this,g=[],v=[];for(let w=0,I=t.length;w<I;w++){const O=t[w];C(O)}this.setAttribute("position",new Float32BufferAttribute(g,3)),this.setAttribute("uv",new Float32BufferAttribute(v,2)),this.computeVertexNormals();function C(w){var I,O,ye;const Se=[],Pe=r.curveSegments!==void 0?r.curveSegments:12,Ne=r.steps!==void 0?r.steps:1,ke=r.depth!==void 0?r.depth:1;let ht=r.bevelEnabled!==void 0?r.bevelEnabled:!0,He=r.bevelThickness!==void 0?r.bevelThickness:.2,Fe=r.bevelSize!==void 0?r.bevelSize:He-.1,at=r.bevelOffset!==void 0?r.bevelOffset:0,ct=r.bevelSegments!==void 0?r.bevelSegments:3;const xt=r.extrudePath,Gt=r.UVGenerator!==void 0?r.UVGenerator:Ce,Lt=(I=r.hasTop)!=null?I:!0,Wt=(O=r.hasBottom)!=null?O:!0,Pt=(ye=r.hasSide)!=null?ye:!0;let Ft,kt=!1,Kt,i0,r0,l0;xt&&(Ft=xt.getSpacedPoints(Ne),kt=!0,ht=!1,Kt=xt.computeFrenetFrames(Ne,!1),i0=new Vector3,r0=new Vector3,l0=new Vector3),ht||(ct=0,He=0,Fe=0,at=0);const n0=w.extractPoints(Pe);let Ut=n0.shape;const e0=n0.holes;if(!ShapeUtils.isClockWise(Ut)){Ut=Ut.reverse();for(let N0=0,_0=e0.length;N0<_0;N0++){const a0=e0[N0];ShapeUtils.isClockWise(a0)&&(e0[N0]=a0.reverse())}}function Yt(N0){const _0=10000000000000001e-36;let a0=N0[0];for(let s0=1;s0<=N0.length;s0++){const v0=s0%N0.length,C0=N0[v0],E0=C0.x-a0.x,w0=C0.y-a0.y,vi=E0*E0+w0*w0,ui=Math.max(Math.abs(C0.x),Math.abs(C0.y),Math.abs(a0.x),Math.abs(a0.y)),Ci=_0*ui*ui;if(vi<=Ci){N0.splice(v0,1),s0--;continue}a0=C0}}Yt(Ut),e0.forEach(Yt);const o0=e0.length,b0=Ut;for(let N0=0;N0<o0;N0++){const _0=e0[N0];Ut=Ut.concat(_0)}function f0(N0,_0,a0){return _0||console.error("THREE.ExtrudeGeometry: vec does not exist"),N0.clone().addScaledVector(_0,a0)}const P0=Ut.length;function q0(N0,_0,a0){let s0,v0,C0;const E0=N0.x-_0.x,w0=N0.y-_0.y,vi=a0.x-N0.x,ui=a0.y-N0.y,Ci=E0*E0+w0*w0,Ei=E0*ui-w0*vi;if(Math.abs(Ei)>Number.EPSILON){const j0=Math.sqrt(Ci),Xi=Math.sqrt(vi*vi+ui*ui),wi=_0.x-w0/j0,Ii=_0.y+E0/j0,Zi=a0.x-ui/Xi,Yi=a0.y+vi/Xi,zi=((Zi-wi)*ui-(Yi-Ii)*vi)/(E0*ui-w0*vi);s0=wi+E0*zi-N0.x,v0=Ii+w0*zi-N0.y;const Ki=s0*s0+v0*v0;if(Ki<=2)return new Vector2(s0,v0);C0=Math.sqrt(Ki/2)}else{let j0=!1;E0>Number.EPSILON?vi>Number.EPSILON&&(j0=!0):E0<-Number.EPSILON?vi<-Number.EPSILON&&(j0=!0):Math.sign(w0)===Math.sign(ui)&&(j0=!0),j0?(s0=-w0,v0=E0,C0=Math.sqrt(Ci)):(s0=E0,v0=w0,C0=Math.sqrt(Ci/2))}return new Vector2(s0/C0,v0/C0)}const G0=[];for(let N0=0,_0=b0.length,a0=_0-1,s0=N0+1;N0<_0;N0++,a0++,s0++)a0===_0&&(a0=0),s0===_0&&(s0=0),G0[N0]=q0(b0[N0],b0[a0],b0[s0]);const I0=[];let F0,D0=G0.concat();for(let N0=0,_0=o0;N0<_0;N0++){const a0=e0[N0];F0=[];for(let s0=0,v0=a0.length,C0=v0-1,E0=s0+1;s0<v0;s0++,C0++,E0++)C0===v0&&(C0=0),E0===v0&&(E0=0),F0[s0]=q0(a0[s0],a0[C0],a0[E0]);I0.push(F0),D0=D0.concat(F0)}let Si;if(ct===0)Si=ShapeUtils.triangulateShape(b0,e0);else{const N0=[],_0=[];for(let a0=0;a0<ct;a0++){const s0=a0/ct,v0=He*Math.cos(s0*Math.PI/2),C0=Fe*Math.sin(s0*Math.PI/2)+at;for(let E0=0,w0=b0.length;E0<w0;E0++){const vi=f0(b0[E0],G0[E0],C0);h0(vi.x,vi.y,-v0),s0===0&&N0.push(vi)}for(let E0=0,w0=o0;E0<w0;E0++){const vi=e0[E0];F0=I0[E0];const ui=[];for(let Ci=0,Ei=vi.length;Ci<Ei;Ci++){const j0=f0(vi[Ci],F0[Ci],C0);h0(j0.x,j0.y,-v0),s0===0&&ui.push(j0)}s0===0&&_0.push(ui)}}Si=ShapeUtils.triangulateShape(N0,_0)}const Ti=Si.length,Mi=Fe+at;for(let N0=0;N0<P0;N0++){const _0=ht?f0(Ut[N0],D0[N0],Mi):Ut[N0];kt?(r0.copy(Kt.normals[0]).multiplyScalar(_0.x),i0.copy(Kt.binormals[0]).multiplyScalar(_0.y),l0.copy(Ft[0]).add(r0).add(i0),h0(l0.x,l0.y,l0.z)):h0(_0.x,_0.y,0)}for(let N0=1;N0<=Ne;N0++)for(let _0=0;_0<P0;_0++){const a0=ht?f0(Ut[_0],D0[_0],Mi):Ut[_0];kt?(r0.copy(Kt.normals[N0]).multiplyScalar(a0.x),i0.copy(Kt.binormals[N0]).multiplyScalar(a0.y),l0.copy(Ft[N0]).add(r0).add(i0),h0(l0.x,l0.y,l0.z)):h0(a0.x,a0.y,ke/Ne*N0)}for(let N0=ct-1;N0>=0;N0--){const _0=N0/ct,a0=He*Math.cos(_0*Math.PI/2),s0=Fe*Math.sin(_0*Math.PI/2)+at;for(let v0=0,C0=b0.length;v0<C0;v0++){const E0=f0(b0[v0],G0[v0],s0);h0(E0.x,E0.y,ke+a0)}for(let v0=0,C0=e0.length;v0<C0;v0++){const E0=e0[v0];F0=I0[v0];for(let w0=0,vi=E0.length;w0<vi;w0++){const ui=f0(E0[w0],F0[w0],s0);kt?h0(ui.x,ui.y+Ft[Ne-1].y,Ft[Ne-1].x+a0):h0(ui.x,ui.y,ke+a0)}}}Fi(),Pt&&Ni();function Fi(){const N0=g.length/3;if(ht){let _0=0,a0=P0*_0;if(Wt)for(let s0=0;s0<Ti;s0++){const v0=Si[s0];xi(v0[2]+a0,v0[1]+a0,v0[0]+a0)}if(_0=Ne+ct*2,a0=P0*_0,Lt)for(let s0=0;s0<Ti;s0++){const v0=Si[s0];xi(v0[0]+a0,v0[1]+a0,v0[2]+a0)}}else{if(Wt)for(let _0=0;_0<Ti;_0++){const a0=Si[_0];xi(a0[2],a0[1],a0[0])}if(Lt)for(let _0=0;_0<Ti;_0++){const a0=Si[_0];xi(a0[0]+P0*Ne,a0[1]+P0*Ne,a0[2]+P0*Ne)}}d.addGroup(N0,g.length/3-N0,0)}function Ni(){const N0=g.length/3;let _0=0;B0(b0,_0),_0+=b0.length;for(let a0=0,s0=e0.length;a0<s0;a0++){const v0=e0[a0];B0(v0,_0),_0+=v0.length}d.addGroup(N0,g.length/3-N0,1)}function B0(N0,_0){let a0=N0.length;for(;--a0>=0;){const s0=a0;let v0=a0-1;v0<0&&(v0=N0.length-1);for(let C0=0,E0=Ne+ct*2;C0<E0;C0++){const w0=P0*C0,vi=P0*(C0+1),ui=_0+s0+w0,Ci=_0+v0+w0,Ei=_0+v0+vi,j0=_0+s0+vi;O0(ui,Ci,Ei,j0)}}}function h0(N0,_0,a0){Se.push(N0),Se.push(_0),Se.push(a0)}function xi(N0,_0,a0){J0(N0),J0(_0),J0(a0);const s0=g.length/3,v0=Gt.generateTopUV(d,g,s0-3,s0-2,s0-1);A0(v0[0]),A0(v0[1]),A0(v0[2])}function O0(N0,_0,a0,s0){J0(N0),J0(_0),J0(s0),J0(_0),J0(a0),J0(s0);const v0=g.length/3,C0=Gt.generateSideWallUV(d,g,v0-6,v0-3,v0-2,v0-1);A0(C0[0]),A0(C0[1]),A0(C0[3]),A0(C0[1]),A0(C0[2]),A0(C0[3])}function J0(N0){g.push(Se[N0*3+0]),g.push(Se[N0*3+1]),g.push(Se[N0*3+2])}function A0(N0){v.push(N0.x),v.push(N0.y)}}}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}toJSON(){const t=super.toJSON(),r=this.parameters.shapes,d=this.parameters.options;return Ie(r,d,t)}static fromJSON(t,r){const d=[];for(let v=0,C=t.shapes.length;v<C;v++){const w=r[t.shapes[v]];d.push(w)}const g=t.options.extrudePath;return g!==void 0&&(t.options.extrudePath=new Ue[`${g.type}`]().fromJSON(g)),new Z(d,t.options)}}const Ce={generateTopUV:function(m,t,r,d,g){const v=t[r*3],C=t[r*3+1],w=t[d*3],I=t[d*3+1],O=t[g*3],ye=t[g*3+1];return[new Vector2(v,C),new Vector2(w,I),new Vector2(O,ye)]},generateSideWallUV:function(m,t,r,d,g,v){const C=t[r*3],w=t[r*3+1],I=t[r*3+2],O=t[d*3],ye=t[d*3+1],Se=t[d*3+2],Pe=t[g*3],Ne=t[g*3+1],ke=t[g*3+2],ht=t[v*3],He=t[v*3+1],Fe=t[v*3+2];return Math.abs(w-ye)<Math.abs(C-O)?[new Vector2(C,1-I),new Vector2(O,1-Se),new Vector2(Pe,1-ke),new Vector2(ht,1-Fe)]:[new Vector2(w,1-I),new Vector2(ye,1-Se),new Vector2(Ne,1-ke),new Vector2(He,1-Fe)]}};function Ie(m,t,r){if(r.shapes=[],Array.isArray(m))for(let d=0,g=m.length;d<g;d++){const v=m[d];r.shapes.push(v.uuid)}else r.shapes.push(m.uuid);return r.options=Object.assign({},t),t.extrudePath!==void 0&&(r.options.extrudePath=t.extrudePath.toJSON()),r}class Ze extends ft$1{constructor(t){super(),this.rectAreaLightUniformsLibInit=!1,this.options=t}create(){var t,r,d,g,v,C,w,I,O,ye,Se,Pe,Ne,ke,ht,He,Fe;const at=this.options;if(at.type==="AmbientLight"){const ct=new AmbientLight(at.color);ct.name="环境光",this.object3d=ct}else if(at.type==="DirectionalLight"){const ct=new DirectionalLight(at.color,at.intensity);ct.name="平行光",ct.target.position.set(0,0,0),this.object3d=ct,ct.target.name="平行光目标",ct.shadow.camera.name="平行光阴影相机",ct.shadow.camera.userData.directionalLightShadow=!0,this.directionalLight=ct}else if(at.type==="PointLight"){const ct=new PointLight((t=at.color)!=null?t:16777215,(r=at.intensity)!=null?r:1,(d=at.distance)!=null?d:0,(g=at.decay)!=null?g:2);ct.name="点光源",this.object3d=ct,this.pointLight=ct}else if(at.type==="SpotLight"){const ct=new SpotLight((v=at.color)!=null?v:16777215,(C=at.intensity)!=null?C:1,(w=at.distance)!=null?w:0,(I=at.angle)!=null?I:Math.PI/3,(O=at.penumbra)!=null?O:1,(ye=at.decay)!=null?ye:2);ct.name="聚光灯",this.object3d=ct,this.spotLight=ct,ct.target.name="聚光灯目标"}else if(at.type==="HemisphereLight"){const ct=new HemisphereLight((Se=at.color)!=null?Se:16777215,(Pe=at.groundColor)!=null?Pe:16777215,(Ne=at.intensity)!=null?Ne:1);ct.name="半球光",this.object3d=ct,this.hemisphereLight=ct}else if(at.type==="RectAreaLight"){this.rectAreaLightUniformsLibInit||(RectAreaLightUniformsLib.init(),this.rectAreaLightUniformsLibInit=!0);const ct=new RectAreaLight((ke=at.color)!=null?ke:16777215,(ht=at.intensity)!=null?ht:1,(He=at.width)!=null?He:10,(Fe=at.height)!=null?Fe:10);ct.name="矩形区域光",this.object3d=ct,this.rectAreaLight=ct}}render(){const t=this.object3d;t.target&&this.pencil.scene.add(t.target);const r=this.pencil.cameraTarget;if(this.spotLight||this.directionalLight){const d=this.spotLight||this.directionalLight;d.position.copy(r),d.target.position.copy(r)}else this.pointLight&&this.pointLight.position.copy(r)}dispose(){const t=this.object3d;t.target&&this.pencil.scene.remove(t.target),super.dispose()}}function R$1(m,t=0){const r=m[0].index!==null,d=new Set(Object.keys(m[0].attributes)),g=new Set(Object.keys(m[0].morphAttributes)),v={},C={},w=m[0].morphTargetsRelative,I=new BufferGeometry;let O=0;for(let ye=0;ye<m.length;++ye){const Se=m[ye];let Pe=0;if(r!==(Se.index!==null))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+ye+". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them."),null;for(const Ne in Se.attributes){if(!d.has(Ne))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+ye+'. All geometries must have compatible attributes; make sure "'+Ne+'" attribute exists among all geometries, or in none of them.'),null;v[Ne]===void 0&&(v[Ne]=[]),v[Ne].push(Se.attributes[Ne]),Pe++}if(Pe!==d.size)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+ye+". Make sure all geometries have the same number of attributes."),null;if(w!==Se.morphTargetsRelative)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+ye+". .morphTargetsRelative must be consistent throughout all geometries."),null;for(const Ne in Se.morphAttributes){if(!g.has(Ne))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+ye+". .morphAttributes must be consistent throughout all geometries."),null;C[Ne]===void 0&&(C[Ne]=[]),C[Ne].push(Se.morphAttributes[Ne])}if(t){let Ne;if(r)Ne=Se.index.count;else if(Se.attributes.position!==void 0)Ne=Se.attributes.position.count;else return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+ye+". The geometry must have either an index or a position attribute"),null;if(t===1)I.addGroup(O,Ne,ye);else if(t===2&&Se.groups.length>0)for(let ke of Se.groups){let ht=ke.materialIndex;I.addGroup(O+ke.start,Math.min(ke.count,Ne),ht)}O+=Ne}}if(r){let ye=0;const Se=[];for(let Pe=0;Pe<m.length;++Pe){const Ne=m[Pe].index;for(let ke=0;ke<Ne.count;++ke)Se.push(Ne.getX(ke)+ye);ye+=m[Pe].attributes.position.count}I.setIndex(Se)}for(const ye in v){const Se=mergeAttributes(v[ye]);if(!Se)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the "+ye+" attribute."),null;I.setAttribute(ye,Se)}for(const ye in C){const Se=C[ye][0].length;if(Se===0)break;I.morphAttributes=I.morphAttributes||{},I.morphAttributes[ye]=[];for(let Pe=0;Pe<Se;++Pe){const Ne=[];for(let ht=0;ht<C[ye].length;++ht)Ne.push(C[ye][ht][Pe]);const ke=mergeAttributes(Ne);if(!ke)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the "+ye+" morphAttribute."),null;I.morphAttributes[ye].push(ke)}}return t===2?mergeGroups(I):I}const Dt=m=>{const{points:t}=m,r=t.reduce((d,g,v)=>(v<t.length-1&&d.push(g,t[v+1]),d),[]);return new BufferGeometry().setFromPoints(r)};let Ke=class extends ft$1{constructor(m={}){super(),this.options=G({},m)}get material(){var m;return(m=this.object3d)==null?void 0:m.material}create(){return nt(this,null,function*(){const{points:m,pointsArr:t,geometry:r,geometryArr:d,material:g,useGroups:v,setPointWidth:C,lineWidthArr:w,materialParameters:I,instanceCount:O}=this.options;let ye=g,Se=r;!ye&&I&&(ye=this.getMaterial(I)),!Se&&m?Se=Dt({points:m}):!Se&&t?Se=R$1(t.map(Ne=>Dt({points:Ne})),v!=null?v:0):!Se&&d&&d.length>1?Se=R$1(d,v!=null?v:0):!Se&&d&&d.length===1&&([Se]=d);const Pe=new LineSegmentsGeometry().fromLineSegments(new LineSegments(Se));if(this.pencil.options.WebGPUTHREE){O&&(Pe.instanceCount=O);const Ne=new ze$1(Pe,ye);Ne.computeLineDistances(),this.object3d=Ne}else{const Ne=new LineSegments2(Pe,ye);Ne.computeLineDistances(),this.object3d=Ne}})}getMaterial(m){return new LineMaterial(G({color:new Color$1("#ffffff")},m))}};function yt(m,t,r,d,g){let v;if(m=m.subarray||m.slice?m:m.buffer,r=r.subarray||r.slice?r:r.buffer,m=t?m.subarray?m.subarray(t,g&&t+g):m.slice(t,g&&t+g):m,r.set)r.set(m,d);else for(v=0;v<m.length;v++)r[v+d]=m[v];return r}function Be(m){return m instanceof Float32Array?m:m instanceof BufferGeometry?m.getAttribute("position").array:m.map(t=>{const r=Array.isArray(t);return t instanceof Vector3?[t.x,t.y,t.z]:t instanceof Vector2?[t.x,t.y,0]:r&&t.length===3?[t[0],t[1],t[2]]:r&&t.length===2?[t[0],t[1],0]:t}).flat()}class Ve extends BufferGeometry{constructor(){super(),this.type="MeshLine",this.isMeshLine=!0,this.positions=[],this.previous=[],this.next=[],this.side=[],this.width=[],this.indices_array=[],this.uvs=[],this.counters=[],this.widthCallback=null,this._points=[],this.matrixWorld=new Matrix4,Object.defineProperties(this,{points:{enumerable:!0,get(){return this._points},set(t){this.setPoints(t,this.widthCallback)}}})}setMatrixWorld(t){this.matrixWorld=t}setPoints(t,r){if(t=Be(t),this._points=t,this.widthCallback=r!=null?r:null,this.positions=[],this.counters=[],t.length&&t[0]instanceof Vector3)for(let d=0;d<t.length;d++){const g=t[d],v=d/(t.length-1);this.positions.push(g.x,g.y,g.z),this.positions.push(g.x,g.y,g.z),this.counters.push(v),this.counters.push(v)}else for(let d=0;d<t.length;d+=3){const g=d/(t.length-1);this.positions.push(t[d],t[d+1],t[d+2]),this.positions.push(t[d],t[d+1],t[d+2]),this.counters.push(g),this.counters.push(g)}this.process()}compareV3(t,r){const d=t*6,g=r*6;return this.positions[d]===this.positions[g]&&this.positions[d+1]===this.positions[g+1]&&this.positions[d+2]===this.positions[g+2]}copyV3(t){const r=t*6;return[this.positions[r],this.positions[r+1],this.positions[r+2]]}process(){const t=this.positions.length/6;this.previous=[],this.next=[],this.side=[],this.width=[],this.indices_array=[],this.uvs=[];let r,d;this.compareV3(0,t-1)?d=this.copyV3(t-2):d=this.copyV3(0),this.previous.push(d[0],d[1],d[2]),this.previous.push(d[0],d[1],d[2]);for(let g=0;g<t;g++){if(this.side.push(1),this.side.push(-1),this.widthCallback?r=this.widthCallback(g/(t-1)):r=1,this.width.push(r),this.width.push(r),this.uvs.push(g/(t-1),0),this.uvs.push(g/(t-1),1),g<t-1){d=this.copyV3(g),this.previous.push(d[0],d[1],d[2]),this.previous.push(d[0],d[1],d[2]);const v=g*2;this.indices_array.push(v,v+1,v+2),this.indices_array.push(v+2,v+1,v+3)}g>0&&(d=this.copyV3(g),this.next.push(d[0],d[1],d[2]),this.next.push(d[0],d[1],d[2]))}this.compareV3(t-1,0)?d=this.copyV3(1):d=this.copyV3(t-1),this.next.push(d[0],d[1],d[2]),this.next.push(d[0],d[1],d[2]),!this._attributes||this._attributes.position.count!==this.counters.length?this._attributes={position:new BufferAttribute(new Float32Array(this.positions),3),previous:new BufferAttribute(new Float32Array(this.previous),3),next:new BufferAttribute(new Float32Array(this.next),3),side:new BufferAttribute(new Float32Array(this.side),1),width:new BufferAttribute(new Float32Array(this.width),1),uv:new BufferAttribute(new Float32Array(this.uvs),2),index:new BufferAttribute(new Uint16Array(this.indices_array),1),counters:new BufferAttribute(new Float32Array(this.counters),1)}:(this._attributes.position.copyArray(new Float32Array(this.positions)),this._attributes.position.needsUpdate=!0,this._attributes.previous.copyArray(new Float32Array(this.previous)),this._attributes.previous.needsUpdate=!0,this._attributes.next.copyArray(new Float32Array(this.next)),this._attributes.next.needsUpdate=!0,this._attributes.side.copyArray(new Float32Array(this.side)),this._attributes.side.needsUpdate=!0,this._attributes.width.copyArray(new Float32Array(this.width)),this._attributes.width.needsUpdate=!0,this._attributes.uv.copyArray(new Float32Array(this.uvs)),this._attributes.uv.needsUpdate=!0,this._attributes.index.copyArray(new Uint16Array(this.indices_array)),this._attributes.index.needsUpdate=!0),this.setAttribute("position",this._attributes.position),this.setAttribute("previous",this._attributes.previous),this.setAttribute("next",this._attributes.next),this.setAttribute("side",this._attributes.side),this.setAttribute("width",this._attributes.width),this.setAttribute("uv",this._attributes.uv),this.setAttribute("counters",this._attributes.counters),this.setAttribute("position",this._attributes.position),this.setAttribute("previous",this._attributes.previous),this.setAttribute("next",this._attributes.next),this.setAttribute("side",this._attributes.side),this.setAttribute("width",this._attributes.width),this.setAttribute("uv",this._attributes.uv),this.setAttribute("counters",this._attributes.counters),this.setIndex(this._attributes.index),this.computeBoundingSphere(),this.computeBoundingBox()}advance({x:t,y:r,z:d}){const g=this._attributes.position.array,v=this._attributes.previous.array,C=this._attributes.next.array,w=g.length;yt(g,0,v,0,w),yt(g,6,g,0,w-6),g[w-6]=t,g[w-5]=r,g[w-4]=d,g[w-3]=t,g[w-2]=r,g[w-1]=d,yt(g,6,C,0,w-6),C[w-6]=t,C[w-5]=r,C[w-4]=d,C[w-3]=t,C[w-2]=r,C[w-1]=d,this._attributes.position.needsUpdate=!0,this._attributes.previous.needsUpdate=!0,this._attributes.next.needsUpdate=!0}}const bt=m=>{const{setPointWidth:t,nodes:r}=m,d=new Ve;return d.setPoints(r,t),d};class es extends ft$1{constructor(t={}){super(),this.options=G({},t)}get material(){var t;return(t=this.object3d)==null?void 0:t.material}create(){return nt(this,null,function*(){const{nodes:t,nodesArr:r,geometry:d,geometryArr:g,material:v,useGroups:C,setPointWidth:w,lineWidthArr:I,materialParameters:O}=this.options;let ye=v,Se=d;!ye&&O&&(ye=this.getMaterial(O)),!Se&&t?Se=bt({nodes:t,setPointWidth:w}):!Se&&r?Se=R$1(r.map((Pe,Ne)=>{let ke=w;return!ke&&I&&(ke=()=>{var ht;return(ht=I[Ne])!=null?ht:I[0]}),bt({nodes:Pe,setPointWidth:ke})}),C!=null?C:0):!Se&&g&&g.length>1?Se=R$1(g,C!=null?C:0):!Se&&g&&g.length===1&&([Se]=g),this.createMesh(Se,ye)})}setGeometry(t,r){const d=bt({nodes:t,setPointWidth:r}),g=this.object3d,v=g.geometry;g.geometry=d,v.dispose()}getMaterial(t){const{width:r,height:d}=this.pencil.getSize();return new Ie$2(G({color:new Color$1("#ffffff"),resolution:new Vector2(r,d)},t))}addGeometries(t){const r=this.object3d,d=R$1([r.geometry,...t]);r.geometry=d}resize(t,r){var d,g;(g=(d=this.material)==null?void 0:d.uniforms)==null||g.resolution.value.set(t,r)}useMaterial(t){super.useMaterial(t);const{width:r,height:d}=this.pencil.getSize();this.resize(r,d)}animate({duration:t=1e3,delay:r=0,repeat:d=0,lineLoop:g,onRepeat:v,onUpdate:C,onComplete:w,startShow:I}={}){const{offset:O,offsetLoop:ye}=this.material.uniforms;if(this.material.userData.tween)return;const Se=g!=null?g:!0;O.value.x=1,ye.value=Se&&I?1:0;let Pe=0;const Ne=new Tween(O.value).to({x:-1},t).delay(r).repeat(d).onUpdate(({x:ke})=>{Se&&ke<=0&&ye.value===0&&(ye.value=1),C&&C(ke)}).onRepeat(()=>{Pe+=1,v&&v(Pe)}).onComplete(()=>{w&&w()}).start();this.material.userData.tween=Ne}render(){const{width:t,height:r}=this.pencil.getSize();this.resize(t,r)}dispose(){this.material.userData.tween&&(this.material.userData.tween.stop(),remove(this.material.userData.tween)),super.dispose()}}const Ot=m=>{const t=m,{coordinate:r,startHeight:d,height:g}=t,v=gt(t,["coordinate","startHeight","height"]);let C=d||0;return typeof d!="undefined"&&typeof g!="undefined"&&(C=d+g),new De([r],ut(G({},v),{startHeight:d,endHeight:C}))};class ss extends ft$1{constructor(t){super(),this.options=G({},t)}create(){const t=this.options,{geometry:r,coordinateArr:d,coordinate:g,material:v,useGroups:C}=t,w=gt(t,["geometry","coordinateArr","coordinate","material","useGroups"]);let I=r;if(!I&&g)I=Ot(G({coordinate:g},w));else if(!I&&d){const O=d.map(ye=>Ot(G({coordinate:ye},w)));I=R$1(O,C!=null?C:0)}this.createMesh(I,v)}}class ze extends Z{constructor(t,r){super(t,r);const d=new Brush(new Z(t,ut(G({},r),{hasTop:!0,hasSide:!0,hasBottom:!1})));d.updateMatrixWorld();const g=new Box3().setFromObject(d),v=new Vector3;g.getSize(v);const C=new Vector3(g.min.x+v.x/2,g.min.y+v.y/2,0);let w=r.topSegments,I=r.box3;if(I){I=I.union(g);const He=new Vector3;I.getSize(He);const Fe=Math.max(v.x/He.x,v.y/He.y);w=Math.ceil(r.topSegments*Fe)}if(w<4)return this;const O=new PlaneGeometry(v.x,v.y,w,w),ye=new Brush(O);ye.position.set(C.x,C.y,C.z),ye.updateMatrixWorld();const Se=new Evaluator().evaluate(ye,d,INTERSECTION),Pe=Se.geometry.getAttribute("position"),Ne=new Float32BufferAttribute(Pe.count*2,2);for(let He=0;He<Pe.count;He++){const Fe=Pe.getZ(He);Pe.setZ(He,r.depth+Fe)}if(I){const He=I.min,Fe=I.max,at=new Vector3().subVectors(Fe,He);for(let ct=0;ct<Pe.count;ct++){const xt=Pe.getX(ct),Gt=Pe.getY(ct),Lt=(xt-He.x)/at.x,Wt=(Gt-He.y)/at.y;Ne.setXY(ct,Lt,Wt)}Se.geometry.setAttribute("uv",Ne)}Pe.needsUpdate=!0;const ke=new Z(t,ut(G({},r),{hasTop:!1})),ht=R$1([Se.geometry,ke],2);this.copy(ht.toNonIndexed())}}const Ht=m=>{const{split:t,depth:r,points:d,box3:g,hasTop:v,hasBottom:C,hasSide:w,sideRepeat:I,topSegments:O}=m,ye=O?ze:Z,Se=new ye(new Shape(d),{depth:r,bevelEnabled:!1,box3:g,UVGenerator:R$2({split:t,box3:g,sideRepeat:I}),hasTop:v,hasBottom:C,hasSide:w,topSegments:O});return P(),Se};class is extends ft$1{constructor(t){super(),this.options=G({depth:1},t)}create(){return nt(this,null,function*(){const{points:t,pointsArr:r,useGroups:d,depth:g,geometry:v,geometryArr:C,material:w,box3:I,split:O,hasTop:ye,hasBottom:Se,hasSide:Pe}=this.options,Ne=Array.isArray(g)?g:[g],ke=Array.isArray(I)?I:[I],ht=w;let He=v;ht||console.log("material is null"),!He&&t?He=Ht({points:t,depth:Ne[0],box3:ke[0],split:O,hasTop:ye,hasBottom:Se,hasSide:Pe}):!He&&r?He=R$1(r.map((Fe,at)=>{var ct,xt;return Ht({points:Fe,depth:(ct=Ne[at])!=null?ct:Ne[0],box3:(xt=ke[at])!=null?xt:ke[0],split:O,hasTop:ye,hasBottom:Se,hasSide:Pe})}),d!=null?d:0):!He&&C&&C.length>1?He=R$1(C,d!=null?d:0):!He&&C&&C.length===1&&([He]=C),this.createMesh(He,ht)})}addGeometries(t){const r=this.object3d,d=R$1([r.geometry,...t]);r.geometry=d}setTextureAnisotropic(t,r){t.anisotropy=r||this.pencil.renderer.capabilities.getMaxAnisotropy()}}class Light extends Ze{update(t,r){var g;super.update(t,r);const d=this.object3d;(g=d.shadow)!=null&&g.camera&&(d.shadow.camera.near!==this.pencil.camera.near&&(d.shadow.camera.near=this.pencil.camera.near),d.shadow.camera.far!=this.pencil.camera.far&&(d.shadow.camera.far=this.pencil.camera.far))}render(){super.render();const t=this.object3d;t.userData=new Proxy({},{set:(w,I,O)=>(I==="keepCamera"&&(O?(this.pencil.render(),t.userData.parent=t.parent,this.pencil.camera.attach(t),t.target&&this.pencil.camera.attach(t.target)):!O&&t.userData.parent&&(this.pencil.render(),t.userData.parent.attach(t),t.target&&t.userData.parent.attach(t.target))),Reflect.set(w,I,O))});const{type:r,key:d}=this.options;d?(this.lead.updateBaseObjectKey(this,`${r}_${d}`),this.userData.updateKey=!1):this.lead.updateBaseObjectKey(this,`${r}`),t.target&&(t.target.userData.light=t);const g=this.object3d;g.isDirectionalLight&&(g.shadow.mapSize.width=1024,g.shadow.mapSize.height=1024);const v=this.object3d;v.isSpotLight&&v.shadow.mapSize.set(1024,1024);const C=this.object3d;C.isPointLight&&(C.shadow.mapSize.width=1024,C.shadow.mapSize.height=1024)}}class Point extends ft$1{constructor(r){super();T0(this,"options");T0(this,"scaleValue",1);this.options=fi({sprite:!0},r)}get material(){var r;return(r=this.object3d)==null?void 0:r.material}getMaterial(){const{sprite:r}=this.options,d=document.createElement("canvas");d.width=100,d.height=100;const g=d.getContext("2d");g.beginPath(),g.arc(50,50,50,0,2*Math.PI),g.fillStyle="#ffffff",g.fill(),g.closePath();const v=new CanvasTexture(d);return r?new SpriteMaterial({transparent:!0,map:v}):new MeshBasicMaterial({color:16777215,transparent:!0,map:v})}create(){return U0(this,null,function*(){const{sprite:r}=this.options,d=this.getMaterial();r?this.createSprite(d):this.createMesh(new PlaneGeometry(1,1),d),this.setScale(1),this.object3d.scale.multiplyScalar(.1)})}setScale(r){this.scaleValue=r;const d=this.material.map;d!=null&&d.image?this.object3d.scale.set(d.image.width*r,d.image.height*r,1):this.object3d.scale.set(r,r,1)}}const p={mercator:i$2,equirectangular:s$1,winkel3:l},a$1={},f=m=>{var t,r,d;const g=JSON.stringify(m);if(a$1[g])return a$1[g];const v=p[(t=m.projectionType)!=null?t:"mercator"]().center(m.center).scale(m.scale).translate((r=m.translate)!=null?r:[0,0]).precision((d=m.precision)!=null?d:.1);return m.rotate&&v.rotate(m.rotate),a$1[g]=v,v},getLineTexture=(m,t="rgba(255,255,255,1)",r="rgba(0,0,0,0)")=>{const d=document.createElement("canvas");d.width=256,d.height=1;const g=d.getContext("2d"),v=g.createLinearGradient(0,0,256,1);v.addColorStop(0,t),v.addColorStop(m,t),v.addColorStop(m,r),v.addColorStop(1,r),g.fillStyle=v,g.fillRect(0,0,256,1);const C=new CanvasTexture(d);return C.wrapS=RepeatWrapping,C.wrapT=RepeatWrapping,C.needsUpdate=!0,C},createFlyPath=(m,t,r=40)=>{const d=m.angleTo(t);let g=m.clone().add(t);g=g.normalize().multiplyScalar(r);let v;d<=1?v=r/5*d:d>1&&d<2?v=r/5*un(d,2):v=r/5*un(d,1.5);const C=m.clone().add(g).normalize().multiplyScalar(r+v),w=t.clone().add(g).normalize().multiplyScalar(r+v);return new CubicBezierCurve3(m,C,w,t)},createFlyPath2=(m,t,r=40)=>{const d=new Vector3().lerpVectors(m,t,.25),g=new Vector3().lerpVectors(m,t,.75);return d.z+=r,g.z+=r,new CubicBezierCurve3(m,d,g,t)},pixel2unit=(m,t)=>{const d=m.camera.fov*Math.PI/180,g=m.controls.getPosition(new Vector3,!1),v=2*Math.tan(d/2)*g.z,C=m.getSize(),w=C.width/C.width,I=v*w;return t*m.renderer.getPixelRatio()/C.width/(1/I)};let map;class Arc extends ft$1{constructor(r){super();T0(this,"options");T0(this,"line");T0(this,"helperMesh");T0(this,"helperMeshPosition");T0(this,"pickTube",null);this.options=fi({color:"#ffffff",lineWidth:6,globe:!1,offsetLoop:!0},r),this.options.repeat&&this.options.repeat[0]===.5&&(this.options.offsetLoop=!1)}static getInitOptions(r,d){const g=pixel2unit(r,200),v=d.globe?new Vector3(0,0,0).add(new Vector3(-g/2,g/2,0)):new Vector3(0,0,0).sub(new Vector3(g/2,g/2,g/2)),C=d.globe?new Vector3(0,0,0).add(new Vector3(g/2,g/2,0)):new Vector3(0,0,0).add(new Vector3(g/2,g/2,g/2));return{from:v.toArray(),to:C.toArray()}}create(){return U0(this,null,function*(){map||(map=getLineTexture(.5));const{color:r,lineWidth:d,globe:g}=this.options;let{radius:v}=this.options;const C=h(this.options.from||[0,0,0]),w=h(this.options.to||[0,0,0]);v=v!=null?v:C.distanceTo(w);const I=g?createFlyPath(C,w,v):createFlyPath2(C,w,v),O=I.getPoints(1500),ye=this.pencil.lead,Se=yield ye.draw("Line",{nodes:O,setPointWidth:He=>He*1,materialParameters:{color:r,map,useMap:1,transparent:!0,sizeAttenuation:0,lineWidth:d}},null);this.line=Se,this.object3d=Se.object3d;const[Pe,Ne,ke,ht]=yield Promise.all([{key:"Arc_起点",position:I.v0},{key:"Arc_第一控制点",position:I.v1},{key:"Arc_第二控制点",position:I.v2},{key:"Arc_终点",position:I.v3}].map(at=>U0(this,[at],function*({key:He,position:Fe}){const ct=yield ye.draw("Group",{},this);return ct.position.copy(Fe),ct.userData.disabledCR=!0,ct.userData.disabledTC=!1,ye.updateBaseObjectKey(ct,`${He}_${this.options.key}`),ct})));this.helperMesh=[Pe,Ne,ke,ht],this.helperMeshPosition=[Pe.position.clone(),Ne.position.clone(),ke.position.clone(),ht.position.clone()]})}instantiate(){return U0(this,null,function*(){this.update();const r=yield this.line.instantiate(void 0,{recursive:!1}),d=yield fn(Arc.prototype,this,"instantiate").call(this,void 0,{create:g=>{g.line=r,g.object3d=r.object3d}});return d.position.set(0,0,0),d.rotation.set(0,0,0),d.scale.set(1,1,1),d})}setPath(r,d,g,v=C=>C*1){const{globe:C}=this.options;r=h(r),d=h(d);const I=(C?createFlyPath(r,d,g):createFlyPath2(r,d,g)).getPoints(1500);this.line.options.nodes=I,this.line.setGeometry(I,v),this.pickTube&&this.addPickTarget(this.pickTube.options.radius)}addPickTarget(r=1,d=!1){return U0(this,null,function*(){const g=this.pickTube,v=this.pencil.lead,C=this.line.options.nodes,w=new CurvePath;for(let ye=0;ye<C.length-1;ye++)w.add(new LineCurve3(C[ye],C[ye+1]));const I=yield v.draw("Tube",{path:w,radius:r,multiplyScalar:1},this),O=I.object3d;return O.material=new MeshBasicMaterial({color:16711680,transparent:!0,opacity:d?1:0}),g&&(g.userData._pe_&&I.onPointerEvent(...g.userData._pe_),g.erase()),this.pickTube=I,I})}onPointerEvent(...r){this.pickTube?(this.pickTube.onPointerEvent(...r),this.pickTube.userData._pe_=[...r]):this.pencil.userData.EditorEnv||console.warn("addPickTarget first")}setColor(r){this.line&&(this.line.material.uniforms.color.value=new Color$1(r))}animateIn({duration:r=2e3,delay:d=0,repeat:g=1/0,onComplete:v,onRepeat:C}={}){this.line.material.userData.tween&&(this.line.material.userData.tween.stop(),remove(this.line.material.userData.tween),this.line.material.userData.tween=null,this.line.material.uniforms.offset.value.x=0),r&&(this.line.material.uniforms.offset.value.x=1,this.line.material.uniforms.offsetLoop.value=0,this.line.animate({duration:r,repeat:g,delay:d,lineLoop:this.options.offsetLoop,onRepeat:C,onComplete:v}))}update(){var r;if((r=this.helperMesh)!=null&&r.length&&this.helperMesh.find((g,v)=>g.position.distanceTo(this.helperMeshPosition[v])>.01)){this.helperMesh.forEach((C,w)=>{this.helperMeshPosition[w].copy(C.position)});const v=new CubicBezierCurve3(this.helperMeshPosition[0],this.helperMeshPosition[1],this.helperMeshPosition[2],this.helperMeshPosition[3]).getPoints(1500);this.line.setGeometry(v,this.line.object3d.geometry.widthCallback)}}render(){this.mList.rmBaseObjectMap(this.line),setTimeout(()=>{!this.pencil.userData.EditorEnv&&this.prefab||this.line.material.userData.tween||this.animateIn()})}dispose(){this.line.dispose(),super.dispose()}}class CrossPlane extends ft$1{constructor(r){super();T0(this,"options");this.options=fi({},r)}create(){return U0(this,null,function*(){this.createGroup();const r=this.options.material||new MeshBasicMaterial({color:"#ffffff",side:DoubleSide,blending:AdditiveBlending});r.depthWrite=!1;const d=this.pencil.lead,[g,v]=yield Promise.all([d.draw("Plane",{key:"crossPlane_item1_"+this.options.key},this),d.draw("Plane",{key:"crossPlane_item2_"+this.options.key},this)]);g.object3d.material=r,v.object3d.material=r,g.rotation.x=-Math.PI*.5,v.rotation.x=-Math.PI*.5,v.rotation.y=-Math.PI*.5,this.userData.disabledTC=!1})}}class PlaneShadow extends ft$1{create(){return U0(this,null,function*(){const t=new PlaneGeometry(100,100,2,2),r=new ShadowMaterial;r.opacity=.5,r.depthWrite=!1,this.createMesh(t,r),this.object3d.receiveShadow=!0,this.position.z=.1,this.object3d.name="阴影接受"})}}class Model extends ft$1{constructor(r){super();T0(this,"options");this.options=fi({},r)}create(){return U0(this,null,function*(){const r=this.pencil.loader,d=this.options.src;if(!d)throw new Error("src is required");let g=r.getAsset(d);g||(g=yield r.load(d)),this.object3d=g.scene,this.scale.multiplyScalar(20)})}}class Box extends ft$1{create(){const t=new BoxGeometry(1,1,1,1,1,1);this.createMesh(t),this.scale.multiplyScalar(20)}}class Capsule extends ft$1{create(){const t=new CapsuleGeometry(1,1,4,8);this.createMesh(t),this.scale.multiplyScalar(20)}}class Circle extends ft$1{create(){const t=new CircleGeometry(1,32,0,Math.PI*2);this.createMesh(t),this.scale.multiplyScalar(20)}}class Cylinder extends ft$1{create(){const t=new CylinderGeometry(1,1,1,32,1,!1,0,Math.PI*2);this.createMesh(t),this.scale.multiplyScalar(20)}}class Dodecahedron extends ft$1{create(){const t=new DodecahedronGeometry(1,0);this.createMesh(t),this.scale.multiplyScalar(20)}}class Icosahedron extends ft$1{create(){const t=new IcosahedronGeometry(1,0);this.createMesh(t),this.scale.multiplyScalar(20)}}class Lathe extends ft$1{create(){const t=new LatheGeometry;this.createMesh(t,new MeshStandardMaterial({side:DoubleSide})),this.scale.multiplyScalar(20)}}class Octahedron extends ft$1{create(){const t=new OctahedronGeometry(1,0);this.createMesh(t),this.scale.multiplyScalar(20)}}class Plane extends ft$1{create(){const t=new PlaneGeometry(1,1,2,2);this.createMesh(t),this.scale.multiplyScalar(20)}}class Ring extends ft$1{create(){const t=new RingGeometry(.5,1,32,1,0,Math.PI*2);this.createMesh(t),this.scale.multiplyScalar(20)}}class Sphere extends ft$1{constructor(){super(...arguments);T0(this,"radius",100);T0(this,"material");T0(this,"options")}create(){var d;(d=this.options)!=null&&d.radius&&(this.radius=this.options.radius);const r=new SphereGeometry(this.radius,128,90);this.createMesh(r,this.material),this.object3d.rotation.y=Math.PI/180*90}}class Sprite extends ft$1{create(){this.createSprite(new SpriteMaterial),this.scale.multiplyScalar(20)}setDesiredPixelSize(t){var d;const r=this.object3d;if((d=r.material.map)!=null&&d.image){const g=this.pencil.camera,v=new Vector3;g.matrixWorld.decompose(v,new Quaternion,new Vector3);const C=MathUtils.degToRad(g.fov),I=this.pencil.getSize().height*(1/(2*Math.tan(C/2))),O=t/I,{width:ye,height:Se}=r.material.map.image;r.scale.set(ye/Se*O,O,1)}}}class Tetrahedron extends ft$1{create(){const t=new TetrahedronGeometry(1,0);this.createMesh(t),this.scale.multiplyScalar(20)}}class Torus extends ft$1{create(){const t=new TorusGeometry(1,.4,12,48,Math.PI*2);this.createMesh(t),this.scale.multiplyScalar(20)}}class TorusKnot extends ft$1{create(){const t=new TorusKnotGeometry(1,.4,64,8,2,3);this.createMesh(t),this.scale.multiplyScalar(20)}}class Tube extends ft$1{constructor(r){super();T0(this,"options");this.options=r}create(){var C,w;const r=this.options.path||new CatmullRomCurve3([new Vector3(2,2,-2),new Vector3(2,-2,-.6666666666666667),new Vector3(-2,-2,.6666666666666667),new Vector3(-2,2,2)]),d=(C=this.options.radius)!=null?C:1,g=(w=this.options.multiplyScalar)!=null?w:20,v=new TubeGeometry(r,64,d,8,!1);this.createMesh(v),this.scale.multiplyScalar(g)}}const baseObjs={Node:Xe,Line:es,Line2:Ke,ExtrudePolygon:is,ConicPolygon:ss,Group:Qe,Light,Point,Arc,Model},expObjs={Plane,CrossPlane,PlaneShadow,Ring,Sphere,Sprite,Tetrahedron,Torus,TorusKnot,Tube,Box,Capsule,Circle,Cylinder,Dodecahedron,Icosahedron,Lathe,Octahedron},prefabType=Object.keys(Ui(fi({},expObjs),{Arc,Model})).map(m=>m),objs$3=fi(fi({},baseObjs),expObjs);function promisifyRequest(m){return new Promise((t,r)=>{m.oncomplete=m.onsuccess=()=>t(m.result),m.onabort=m.onerror=()=>r(m.error)})}function createStore(m,t){const r=indexedDB.open(m);r.onupgradeneeded=()=>r.result.createObjectStore(t);const d=promisifyRequest(r);return(g,v)=>d.then(C=>v(C.transaction(t,g).objectStore(t)))}let defaultGetStoreFunc;function defaultGetStore(){return defaultGetStoreFunc||(defaultGetStoreFunc=createStore("keyval-store","keyval")),defaultGetStoreFunc}function get(m,t=defaultGetStore()){return t("readonly",r=>promisifyRequest(r.get(m)))}function setMany(m,t=defaultGetStore()){return t("readwrite",r=>(m.forEach(d=>r.put(d[1],d[0])),promisifyRequest(r.transaction)))}var H=Object.defineProperty,u=Object.getOwnPropertySymbols,Y=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable,V=(m,t,r)=>t in m?H(m,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):m[t]=r,W=(m,t)=>{for(var r in t||(t={}))Y.call(t,r)&&V(m,r,t[r]);if(u)for(var r of u(t))a.call(t,r)&&V(m,r,t[r]);return m},x=(m,t)=>{var r={};for(var d in m)Y.call(m,d)&&t.indexOf(d)<0&&(r[d]=m[d]);if(m!=null&&u)for(var d of u(m))t.indexOf(d)<0&&a.call(m,d)&&(r[d]=m[d]);return r},s=(m,t,r)=>new Promise((d,g)=>{var v=I=>{try{w(r.next(I))}catch(O){g(O)}},C=I=>{try{w(r.throw(I))}catch(O){g(O)}},w=I=>I.done?d(I.value):Promise.resolve(I.value).then(v,C);w((r=r.apply(m,t)).next())});const o="dmFyIFBnPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxFZz1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgQ2c9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIFFyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIEh1PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksV3U9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgbWM9KEosUSk9PihRPVN5bWJvbFtKXSk/UTpTeW1ib2wuZm9yKCJTeW1ib2wuIitKKSxCZz1KPT57dGhyb3cgVHlwZUVycm9yKEopfSx5aT1NYXRoLnBvdyxxdT0oSixRLG10KT0+USBpbiBKP1BnKEosUSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bXR9KTpKW1FdPW10LEZ0PShKLFEpPT57Zm9yKHZhciBtdCBpbiBRfHwoUT17fSkpSHUuY2FsbChRLG10KSYmcXUoSixtdCxRW210XSk7aWYoUXIpZm9yKHZhciBtdCBvZiBRcihRKSlXdS5jYWxsKFEsbXQpJiZxdShKLG10LFFbbXRdKTtyZXR1cm4gSn0sWmU9KEosUSk9PkVnKEosQ2coUSkpO3ZhciBHdT0oSixRKT0+e3ZhciBtdD17fTtmb3IodmFyIE10IGluIEopSHUuY2FsbChKLE10KSYmUS5pbmRleE9mKE10KTwwJiYobXRbTXRdPUpbTXRdKTtpZihKIT1udWxsJiZRcilmb3IodmFyIE10IG9mIFFyKEopKVEuaW5kZXhPZihNdCk8MCYmV3UuY2FsbChKLE10KSYmKG10W010XT1KW010XSk7cmV0dXJuIG10fTt2YXIgRmc9ZnVuY3Rpb24oSixRKXt0aGlzWzBdPUosdGhpc1sxXT1RfTt2YXIgWnU9Sj0+e3ZhciBRPUpbbWMoImFzeW5jSXRlcmF0b3IiKV0sbXQ9ITEsTXQsY249e307cmV0dXJuIFE9PW51bGw/KFE9SlttYygiaXRlcmF0b3IiKV0oKSxNdD1fZT0+Y25bX2VdPUJuPT5RW19lXShCbikpOihRPVEuY2FsbChKKSxNdD1fZT0+Y25bX2VdPUJuPT57aWYobXQpe2lmKG10PSExLF9lPT09InRocm93Iil0aHJvdyBCbjtyZXR1cm4gQm59cmV0dXJuIG10PSEwLHtkb25lOiExLHZhbHVlOm5ldyBGZyhuZXcgUHJvbWlzZShnYz0+e3ZhciBLcj1RW19lXShCbik7S3IgaW5zdGFuY2VvZiBPYmplY3R8fEJnKCJPYmplY3QgZXhwZWN0ZWQiKSxnYyhLcil9KSwxKX19KSxjblttYygiaXRlcmF0b3IiKV09KCk9PmNuLE10KCJuZXh0IiksInRocm93ImluIFE/TXQoInRocm93Iik6Y24udGhyb3c9X2U9Pnt0aHJvdyBfZX0sInJldHVybiJpbiBRJiZNdCgicmV0dXJuIiksY259OyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjsvKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IDIwMTAtMjAyNSBUaHJlZS5qcyBBdXRob3JzCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICovY29uc3QgSj0iMTc2Iix4Yz0iIixvZT0ic3JnYiIsd2M9InNyZ2ItbGluZWFyIixiYz0ibGluZWFyIix0bz0ic3JnYiI7Y2xhc3Mgb3N7YWRkRXZlbnRMaXN0ZW5lcih0LGUpe3RoaXMuX2xpc3RlbmVycz09PXZvaWQgMCYmKHRoaXMuX2xpc3RlbmVycz17fSk7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7blt0XT09PXZvaWQgMCYmKG5bdF09W10pLG5bdF0uaW5kZXhPZihlKT09PS0xJiZuW3RdLnB1c2goZSl9aGFzRXZlbnRMaXN0ZW5lcih0LGUpe2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiBuPT09dm9pZCAwPyExOm5bdF0hPT12b2lkIDAmJm5bdF0uaW5kZXhPZihlKSE9PS0xfXJlbW92ZUV2ZW50TGlzdGVuZXIodCxlKXtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztpZihuPT09dm9pZCAwKXJldHVybjtjb25zdCBzPW5bdF07aWYocyE9PXZvaWQgMCl7Y29uc3Qgcj1zLmluZGV4T2YoZSk7ciE9PS0xJiZzLnNwbGljZShyLDEpfX1kaXNwYXRjaEV2ZW50KHQpe2NvbnN0IGU9dGhpcy5fbGlzdGVuZXJzO2lmKGU9PT12b2lkIDApcmV0dXJuO2NvbnN0IG49ZVt0LnR5cGVdO2lmKG4hPT12b2lkIDApe3QudGFyZ2V0PXRoaXM7Y29uc3Qgcz1uLnNsaWNlKDApO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKylzW3JdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgQXQ9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2Z1bmN0aW9uIEZuKCl7Y29uc3QgaT1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCx0PU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLGU9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsbj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MDtyZXR1cm4oQXRbaSYyNTVdK0F0W2k+PjgmMjU1XStBdFtpPj4xNiYyNTVdK0F0W2k+PjI0JjI1NV0rIi0iK0F0W3QmMjU1XStBdFt0Pj44JjI1NV0rIi0iK0F0W3Q+PjE2JjE1fDY0XStBdFt0Pj4yNCYyNTVdKyItIitBdFtlJjYzfDEyOF0rQXRbZT4+OCYyNTVdKyItIitBdFtlPj4xNiYyNTVdK0F0W2U+PjI0JjI1NV0rQXRbbiYyNTVdK0F0W24+PjgmMjU1XStBdFtuPj4xNiYyNTVdK0F0W24+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gWihpLHQsZSl7cmV0dXJuIE1hdGgubWF4KHQsTWF0aC5taW4oZSxpKSl9ZnVuY3Rpb24gWHUoaSx0KXtyZXR1cm4oaSV0K3QpJXR9ZnVuY3Rpb24gZW8oaSx0LGUpe3JldHVybigxLWUpKmkrZSp0fWZ1bmN0aW9uIG1pKGksdCl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiBpO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIGkvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiBpLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gaS8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChpLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoaS8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KGkvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24gSXQoaSx0KXtzd2l0Y2godC5jb25zdHJ1Y3Rvcil7Y2FzZSBGbG9hdDMyQXJyYXk6cmV0dXJuIGk7Y2FzZSBVaW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjQyOTQ5NjcyOTUpO2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSo2NTUzNSk7Y2FzZSBVaW50OEFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqMjU1KTtjYXNlIEludDMyQXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoyMTQ3NDgzNjQ3KTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSozMjc2Nyk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoxMjcpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX1jbGFzcyBSe2NvbnN0cnVjdG9yKHQ9MCxlPTApe1IucHJvdG90eXBlLmlzVmVjdG9yMj0hMCx0aGlzLng9dCx0aGlzLnk9ZX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy54fXNldCB3aWR0aCh0KXt0aGlzLng9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMueX1zZXQgaGVpZ2h0KHQpe3RoaXMueT10fXNldCh0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHM9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PXNbMF0qZStzWzNdKm4rc1s2XSx0aGlzLnk9c1sxXSplK3NbNF0qbitzWzddLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PVoodGhpcy54LHQueCxlLngpLHRoaXMueT1aKHRoaXMueSx0LnksZS55KSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1aKHRoaXMueCx0LGUpLHRoaXMueT1aKHRoaXMueSx0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKFoobix0LGUpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX1jcm9zcyh0KXtyZXR1cm4gdGhpcy54KnQueS10aGlzLnkqdC54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZihlPT09MClyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKFoobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnk7cmV0dXJuIGUqZStuKm59bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXN9cm90YXRlQXJvdW5kKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxzPU1hdGguc2luKGUpLHI9dGhpcy54LXQueCxvPXRoaXMueS10Lnk7cmV0dXJuIHRoaXMueD1yKm4tbypzK3QueCx0aGlzLnk9cipzK28qbit0LnksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55fX1jbGFzcyBnZXtjb25zdHJ1Y3Rvcih0LGUsbixzLHIsbyxhLGMsbCl7Z2UucHJvdG90eXBlLmlzTWF0cml4Mz0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDEsMCwwLDAsMV0sdCE9PXZvaWQgMCYmdGhpcy5zZXQodCxlLG4scyxyLG8sYSxjLGwpfXNldCh0LGUsbixzLHIsbyxhLGMsbCl7Y29uc3QgaD10aGlzLmVsZW1lbnRzO3JldHVybiBoWzBdPXQsaFsxXT1zLGhbMl09YSxoWzNdPWUsaFs0XT1yLGhbNV09YyxoWzZdPW4saFs3XT1vLGhbOF09bCx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMSwwLDAsMCwxKSx0aGlzfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sdGhpc31leHRyYWN0QmFzaXModCxlLG4pe3JldHVybiB0LnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywyKSx0aGlzfXNldEZyb21NYXRyaXg0KHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzRdLGVbOF0sZVsxXSxlWzVdLGVbOV0sZVsyXSxlWzZdLGVbMTBdKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxzPWUuZWxlbWVudHMscj10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bM10sYz1uWzZdLGw9blsxXSxoPW5bNF0sdT1uWzddLGY9blsyXSxkPW5bNV0scD1uWzhdLHk9c1swXSxtPXNbM10sZz1zWzZdLGI9c1sxXSx3PXNbNF0seD1zWzddLE09c1syXSxBPXNbNV0sXz1zWzhdO3JldHVybiByWzBdPW8qeSthKmIrYypNLHJbM109byptK2EqdytjKkEscls2XT1vKmcrYSp4K2MqXyxyWzFdPWwqeStoKmIrdSpNLHJbNF09bCptK2gqdyt1KkEscls3XT1sKmcraCp4K3UqXyxyWzJdPWYqeStkKmIrcCpNLHJbNV09ZiptK2QqdytwKkEscls4XT1mKmcrZCp4K3AqXyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzNdKj10LGVbNl0qPXQsZVsxXSo9dCxlWzRdKj10LGVbN10qPXQsZVsyXSo9dCxlWzVdKj10LGVbOF0qPXQsdGhpc31kZXRlcm1pbmFudCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sbD10WzddLGg9dFs4XTtyZXR1cm4gZSpvKmgtZSphKmwtbipyKmgrbiphKmMrcypyKmwtcypvKmN9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0scz10WzJdLHI9dFszXSxvPXRbNF0sYT10WzVdLGM9dFs2XSxsPXRbN10saD10WzhdLHU9aCpvLWEqbCxmPWEqYy1oKnIsZD1sKnItbypjLHA9ZSp1K24qZitzKmQ7aWYocD09PTApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCB5PTEvcDtyZXR1cm4gdFswXT11KnksdFsxXT0ocypsLWgqbikqeSx0WzJdPShhKm4tcypvKSp5LHRbM109Zip5LHRbNF09KGgqZS1zKmMpKnksdFs1XT0ocypyLWEqZSkqeSx0WzZdPWQqeSx0WzddPShuKmMtbCplKSp5LHRbOF09KG8qZS1uKnIpKnksdGhpc310cmFuc3Bvc2UoKXtsZXQgdDtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQ9ZVsxXSxlWzFdPWVbM10sZVszXT10LHQ9ZVsyXSxlWzJdPWVbNl0sZVs2XT10LHQ9ZVs1XSxlWzVdPWVbN10sZVs3XT10LHRoaXN9Z2V0Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KHQpLmludmVydCgpLnRyYW5zcG9zZSgpfXRyYW5zcG9zZUludG9BcnJheSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbM10sdFsyXT1lWzZdLHRbM109ZVsxXSx0WzRdPWVbNF0sdFs1XT1lWzddLHRbNl09ZVsyXSx0WzddPWVbNV0sdFs4XT1lWzhdLHRoaXN9c2V0VXZUcmFuc2Zvcm0odCxlLG4scyxyLG8sYSl7Y29uc3QgYz1NYXRoLmNvcyhyKSxsPU1hdGguc2luKHIpO3JldHVybiB0aGlzLnNldChuKmMsbipsLC1uKihjKm8rbCphKStvK3QsLXMqbCxzKmMsLXMqKC1sKm8rYyphKSthK2UsMCwwLDEpLHRoaXN9c2NhbGUodCxlKXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShuby5tYWtlU2NhbGUodCxlKSksdGhpc31yb3RhdGUodCl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkobm8ubWFrZVJvdGF0aW9uKC10KSksdGhpc310cmFuc2xhdGUodCxlKXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShuby5tYWtlVHJhbnNsYXRpb24odCxlKSksdGhpc31tYWtlVHJhbnNsYXRpb24odCxlKXtyZXR1cm4gdC5pc1ZlY3RvcjI/dGhpcy5zZXQoMSwwLHQueCwwLDEsdC55LDAsMCwxKTp0aGlzLnNldCgxLDAsdCwwLDEsZSwwLDAsMSksdGhpc31tYWtlUm90YXRpb24odCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsbixlLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSl7cmV0dXJuIHRoaXMuc2V0KHQsMCwwLDAsZSwwLDAsMCwxKSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgcz0wO3M8OTtzKyspaWYoZVtzXSE9PW5bc10pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDk7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9fWNvbnN0IG5vPW5ldyBnZTtmdW5jdGlvbiBKdShpKXtmb3IobGV0IHQ9aS5sZW5ndGgtMTt0Pj0wOy0tdClpZihpW3RdPj02NTUzNSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBNYyhpKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixpKX1jb25zdCBBYz1uZXcgZ2UoKS5zZXQoLjQxMjM5MDgsLjM1NzU4NDMsLjE4MDQ4MDgsLjIxMjYzOSwuNzE1MTY4NywuMDcyMTkyMywuMDE5MzMwOCwuMTE5MTk0OCwuOTUwNTMyMiksX2M9bmV3IGdlKCkuc2V0KDMuMjQwOTY5OSwtMS41MzczODMyLC0uNDk4NjEwOCwtLjk2OTI0MzYsMS44NzU5Njc1LC4wNDE1NTUxLC4wNTU2MzAxLC0uMjAzOTc3LDEuMDU2OTcxNSk7ZnVuY3Rpb24gWXUoKXtjb25zdCBpPXtlbmFibGVkOiEwLHdvcmtpbmdDb2xvclNwYWNlOndjLHNwYWNlczp7fSxjb252ZXJ0OmZ1bmN0aW9uKHMscixvKXtyZXR1cm4gdGhpcy5lbmFibGVkPT09ITF8fHI9PT1vfHwhcnx8IW98fCh0aGlzLnNwYWNlc1tyXS50cmFuc2Zlcj09PXRvJiYocy5yPXZlKHMucikscy5nPXZlKHMuZykscy5iPXZlKHMuYikpLHRoaXMuc3BhY2VzW3JdLnByaW1hcmllcyE9PXRoaXMuc3BhY2VzW29dLnByaW1hcmllcyYmKHMuYXBwbHlNYXRyaXgzKHRoaXMuc3BhY2VzW3JdLnRvWFlaKSxzLmFwcGx5TWF0cml4Myh0aGlzLnNwYWNlc1tvXS5mcm9tWFlaKSksdGhpcy5zcGFjZXNbb10udHJhbnNmZXI9PT10byYmKHMucj1JbihzLnIpLHMuZz1JbihzLmcpLHMuYj1JbihzLmIpKSksc30sZnJvbVdvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHMscil7cmV0dXJuIHRoaXMuY29udmVydChzLHRoaXMud29ya2luZ0NvbG9yU3BhY2Uscil9LHRvV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24ocyxyKXtyZXR1cm4gdGhpcy5jb252ZXJ0KHMscix0aGlzLndvcmtpbmdDb2xvclNwYWNlKX0sZ2V0UHJpbWFyaWVzOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNwYWNlc1tzXS5wcmltYXJpZXN9LGdldFRyYW5zZmVyOmZ1bmN0aW9uKHMpe3JldHVybiBzPT09eGM/YmM6dGhpcy5zcGFjZXNbc10udHJhbnNmZXJ9LGdldEx1bWluYW5jZUNvZWZmaWNpZW50czpmdW5jdGlvbihzLHI9dGhpcy53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHMuZnJvbUFycmF5KHRoaXMuc3BhY2VzW3JdLmx1bWluYW5jZUNvZWZmaWNpZW50cyl9LGRlZmluZTpmdW5jdGlvbihzKXtPYmplY3QuYXNzaWduKHRoaXMuc3BhY2VzLHMpfSxfZ2V0TWF0cml4OmZ1bmN0aW9uKHMscixvKXtyZXR1cm4gcy5jb3B5KHRoaXMuc3BhY2VzW3JdLnRvWFlaKS5tdWx0aXBseSh0aGlzLnNwYWNlc1tvXS5mcm9tWFlaKX0sX2dldERyYXdpbmdCdWZmZXJDb2xvclNwYWNlOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNwYWNlc1tzXS5vdXRwdXRDb2xvclNwYWNlQ29uZmlnLmRyYXdpbmdCdWZmZXJDb2xvclNwYWNlfSxfZ2V0VW5wYWNrQ29sb3JTcGFjZTpmdW5jdGlvbihzPXRoaXMud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB0aGlzLnNwYWNlc1tzXS53b3JraW5nQ29sb3JTcGFjZUNvbmZpZy51bnBhY2tDb2xvclNwYWNlfX0sdD1bLjY0LC4zMywuMywuNiwuMTUsLjA2XSxlPVsuMjEyNiwuNzE1MiwuMDcyMl0sbj1bLjMxMjcsLjMyOV07cmV0dXJuIGkuZGVmaW5lKHtbd2NdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6YmMsdG9YWVo6QWMsZnJvbVhZWjpfYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSx3b3JraW5nQ29sb3JTcGFjZUNvbmZpZzp7dW5wYWNrQ29sb3JTcGFjZTpvZX0sb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzp7ZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6b2V9fSxbb2VdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6dG8sdG9YWVo6QWMsZnJvbVhZWjpfYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSxvdXRwdXRDb2xvclNwYWNlQ29uZmlnOntkcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTpvZX19fSksaX1jb25zdCBhZT1ZdSgpO2Z1bmN0aW9uIHZlKGkpe3JldHVybiBpPC4wNDA0NT9pKi4wNzczOTkzODA4Ok1hdGgucG93KGkqLjk0Nzg2NzI5ODYrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBJbihpKXtyZXR1cm4gaTwuMDAzMTMwOD9pKjEyLjkyOjEuMDU1Kk1hdGgucG93KGksLjQxNjY2KS0uMDU1fWxldCBrbjtjbGFzcyBqdXtzdGF0aWMgZ2V0RGF0YVVSTCh0LGU9ImltYWdlL3BuZyIpe2lmKC9eZGF0YTovaS50ZXN0KHQuc3JjKXx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PT0idW5kZWZpbmVkIilyZXR1cm4gdC5zcmM7bGV0IG47aWYodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KW49dDtlbHNle2tuPT09dm9pZCAwJiYoa249TWMoImNhbnZhcyIpKSxrbi53aWR0aD10LndpZHRoLGtuLmhlaWdodD10LmhlaWdodDtjb25zdCBzPWtuLmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9zLnB1dEltYWdlRGF0YSh0LDAsMCk6cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksbj1rbn1yZXR1cm4gbi50b0RhdGFVUkwoZSl9c3RhdGljIHNSR0JUb0xpbmVhcih0KXtpZih0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHR5cGVvZiBJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgZT1NYygiY2FudmFzIik7ZS53aWR0aD10LndpZHRoLGUuaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ZS5nZXRDb250ZXh0KCIyZCIpO24uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpO2NvbnN0IHM9bi5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLHI9cy5kYXRhO2ZvcihsZXQgbz0wO288ci5sZW5ndGg7bysrKXJbb109dmUocltvXS8yNTUpKjI1NTtyZXR1cm4gbi5wdXRJbWFnZURhdGEocywwLDApLGV9ZWxzZSBpZih0LmRhdGEpe2NvbnN0IGU9dC5kYXRhLnNsaWNlKDApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/ZVtuXT1NYXRoLmZsb29yKHZlKGVbbl0vMjU1KSoyNTUpOmVbbl09dmUoZVtuXSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19ZWxzZSByZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuIiksdH19bGV0IFF1PTA7Y2xhc3MgS3V7Y29uc3RydWN0b3IodD1udWxsKXt0aGlzLmlzU291cmNlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlF1Kyt9KSx0aGlzLnV1aWQ9Rm4oKSx0aGlzLmRhdGE9dCx0aGlzLmRhdGFSZWFkeT0hMCx0aGlzLnZlcnNpb249MH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQuaW1hZ2VzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIHQuaW1hZ2VzW3RoaXMudXVpZF07Y29uc3Qgbj17dXVpZDp0aGlzLnV1aWQsdXJsOiIifSxzPXRoaXMuZGF0YTtpZihzIT09bnVsbCl7bGV0IHI7aWYoQXJyYXkuaXNBcnJheShzKSl7cj1bXTtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YTtvKyspc1tvXS5pc0RhdGFUZXh0dXJlP3IucHVzaChpbyhzW29dLmltYWdlKSk6ci5wdXNoKGlvKHNbb10pKX1lbHNlIHI9aW8ocyk7bi51cmw9cn1yZXR1cm4gZXx8KHQuaW1hZ2VzW3RoaXMudXVpZF09biksbn19ZnVuY3Rpb24gaW8oaSl7cmV0dXJuIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCE9InVuZGVmaW5lZCImJmkgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEltYWdlQml0bWFwP2p1LmdldERhdGFVUkwoaSk6aS5kYXRhP3tkYXRhOkFycmF5LmZyb20oaS5kYXRhKSx3aWR0aDppLndpZHRoLGhlaWdodDppLmhlaWdodCx0eXBlOmkuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTooY29uc29sZS53YXJuKCJUSFJFRS5UZXh0dXJlOiBVbmFibGUgdG8gc2VyaWFsaXplIFRleHR1cmUuIikse30pfWxldCB0Zj0wO2NsYXNzIGxuIGV4dGVuZHMgb3N7Y29uc3RydWN0b3IodD1sbi5ERUZBVUxUX0lNQUdFLGU9bG4uREVGQVVMVF9NQVBQSU5HLG49MTAwMSxzPTEwMDEscj0xMDA2LG89MTAwOCxhPTEwMjMsYz0xMDA5LGw9bG4uREVGQVVMVF9BTklTT1RST1BZLGg9eGMpe3N1cGVyKCksdGhpcy5pc1RleHR1cmU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6dGYrK30pLHRoaXMudXVpZD1GbigpLHRoaXMubmFtZT0iIix0aGlzLnNvdXJjZT1uZXcgS3UodCksdGhpcy5taXBtYXBzPVtdLHRoaXMubWFwcGluZz1lLHRoaXMuY2hhbm5lbD0wLHRoaXMud3JhcFM9bix0aGlzLndyYXBUPXMsdGhpcy5tYWdGaWx0ZXI9cix0aGlzLm1pbkZpbHRlcj1vLHRoaXMuYW5pc290cm9weT1sLHRoaXMuZm9ybWF0PWEsdGhpcy5pbnRlcm5hbEZvcm1hdD1udWxsLHRoaXMudHlwZT1jLHRoaXMub2Zmc2V0PW5ldyBSKDAsMCksdGhpcy5yZXBlYXQ9bmV3IFIoMSwxKSx0aGlzLmNlbnRlcj1uZXcgUigwLDApLHRoaXMucm90YXRpb249MCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITAsdGhpcy5tYXRyaXg9bmV3IGdlLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5jb2xvclNwYWNlPWgsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLm9uVXBkYXRlPW51bGwsdGhpcy5yZW5kZXJUYXJnZXQ9bnVsbCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMSx0aGlzLmlzVGV4dHVyZUFycmF5PSExLHRoaXMucG1yZW1WZXJzaW9uPTB9Z2V0IGltYWdlKCl7cmV0dXJuIHRoaXMuc291cmNlLmRhdGF9c2V0IGltYWdlKHQ9bnVsbCl7dGhpcy5zb3VyY2UuZGF0YT10fXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueSx0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnksdGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnkpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuc291cmNlPXQuc291cmNlLHRoaXMubWlwbWFwcz10Lm1pcG1hcHMuc2xpY2UoMCksdGhpcy5tYXBwaW5nPXQubWFwcGluZyx0aGlzLmNoYW5uZWw9dC5jaGFubmVsLHRoaXMud3JhcFM9dC53cmFwUyx0aGlzLndyYXBUPXQud3JhcFQsdGhpcy5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXIsdGhpcy5taW5GaWx0ZXI9dC5taW5GaWx0ZXIsdGhpcy5hbmlzb3Ryb3B5PXQuYW5pc290cm9weSx0aGlzLmZvcm1hdD10LmZvcm1hdCx0aGlzLmludGVybmFsRm9ybWF0PXQuaW50ZXJuYWxGb3JtYXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLm9mZnNldC5jb3B5KHQub2Zmc2V0KSx0aGlzLnJlcGVhdC5jb3B5KHQucmVwZWF0KSx0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnByZW11bHRpcGx5QWxwaGE9dC5wcmVtdWx0aXBseUFscGhhLHRoaXMuZmxpcFk9dC5mbGlwWSx0aGlzLnVucGFja0FsaWdubWVudD10LnVucGFja0FsaWdubWVudCx0aGlzLmNvbG9yU3BhY2U9dC5jb2xvclNwYWNlLHRoaXMucmVuZGVyVGFyZ2V0PXQucmVuZGVyVGFyZ2V0LHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPXQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlLHRoaXMuaXNUZXh0dXJlQXJyYXk9dC5pc1RleHR1cmVBcnJheSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQudGV4dHVyZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcsY2hhbm5lbDp0aGlzLmNoYW5uZWwscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCxpbnRlcm5hbEZvcm1hdDp0aGlzLmludGVybmFsRm9ybWF0LHR5cGU6dGhpcy50eXBlLGNvbG9yU3BhY2U6dGhpcy5jb2xvclNwYWNlLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09biksbn1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKHRoaXMubWFwcGluZyE9PTMwMClyZXR1cm4gdDtpZih0LmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksdC54PDB8fHQueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFlMzp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVhaztjYXNlIDEwMDE6dC54PXQueDwwPzA6MTticmVhaztjYXNlIDEwMDI6TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpPT09MT90Lng9TWF0aC5jZWlsKHQueCktdC54OnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrfWlmKHQueTwwfHx0Lnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxZTM6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWs7Y2FzZSAxMDAxOnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSAxMDAyOk1hdGguYWJzKE1hdGguZmxvb3IodC55KSUyKT09PTE/dC55PU1hdGguY2VpbCh0LnkpLXQueTp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVha31yZXR1cm4gdGhpcy5mbGlwWSYmKHQueT0xLXQueSksdH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiYodGhpcy52ZXJzaW9uKyssdGhpcy5zb3VyY2UubmVlZHNVcGRhdGU9ITApfXNldCBuZWVkc1BNUkVNVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy5wbXJlbVZlcnNpb24rK319bG4uREVGQVVMVF9JTUFHRT1udWxsLGxuLkRFRkFVTFRfTUFQUElORz0zMDAsbG4uREVGQVVMVF9BTklTT1RST1BZPTE7Y2xhc3MgWXR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscz0xKXtZdC5wcm90b3R5cGUuaXNWZWN0b3I0PSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1zfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxuLHMpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9cyx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXQudyE9PXZvaWQgMD90Lnc6MSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcy53Kz10LncsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXMudy09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpcy53PXQudy1lLncsdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcy53Kj10LncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpcy53Kj10LHRoaXN9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHM9dGhpcy56LHI9dGhpcy53LG89dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW9bMF0qZStvWzRdKm4rb1s4XSpzK29bMTJdKnIsdGhpcy55PW9bMV0qZStvWzVdKm4rb1s5XSpzK29bMTNdKnIsdGhpcy56PW9bMl0qZStvWzZdKm4rb1sxMF0qcytvWzE0XSpyLHRoaXMudz1vWzNdKmUrb1s3XSpuK29bMTFdKnMrb1sxNV0qcix0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpcy53Lz10LncsdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1zZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbih0KXt0aGlzLnc9MipNYXRoLmFjb3ModC53KTtjb25zdCBlPU1hdGguc3FydCgxLXQudyp0LncpO3JldHVybiBlPDFlLTQ/KHRoaXMueD0xLHRoaXMueT0wLHRoaXMuej0wKToodGhpcy54PXQueC9lLHRoaXMueT10LnkvZSx0aGlzLno9dC56L2UpLHRoaXN9c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KHQpe2xldCBlLG4scyxyO2NvbnN0IGM9dC5lbGVtZW50cyxsPWNbMF0saD1jWzRdLHU9Y1s4XSxmPWNbMV0sZD1jWzVdLHA9Y1s5XSx5PWNbMl0sbT1jWzZdLGc9Y1sxMF07aWYoTWF0aC5hYnMoaC1mKTwuMDEmJk1hdGguYWJzKHUteSk8LjAxJiZNYXRoLmFicyhwLW0pPC4wMSl7aWYoTWF0aC5hYnMoaCtmKTwuMSYmTWF0aC5hYnModSt5KTwuMSYmTWF0aC5hYnMocCttKTwuMSYmTWF0aC5hYnMobCtkK2ctMyk8LjEpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7ZT1NYXRoLlBJO2NvbnN0IHc9KGwrMSkvMix4PShkKzEpLzIsTT0oZysxKS8yLEE9KGgrZikvNCxfPSh1K3kpLzQsdj0ocCttKS80O3JldHVybiB3PngmJnc+TT93PC4wMT8obj0wLHM9LjcwNzEwNjc4MSxyPS43MDcxMDY3ODEpOihuPU1hdGguc3FydCh3KSxzPUEvbixyPV8vbik6eD5NP3g8LjAxPyhuPS43MDcxMDY3ODEscz0wLHI9LjcwNzEwNjc4MSk6KHM9TWF0aC5zcXJ0KHgpLG49QS9zLHI9di9zKTpNPC4wMT8obj0uNzA3MTA2NzgxLHM9LjcwNzEwNjc4MSxyPTApOihyPU1hdGguc3FydChNKSxuPV8vcixzPXYvciksdGhpcy5zZXQobixzLHIsZSksdGhpc31sZXQgYj1NYXRoLnNxcnQoKG0tcCkqKG0tcCkrKHUteSkqKHUteSkrKGYtaCkqKGYtaCkpO3JldHVybiBNYXRoLmFicyhiKTwuMDAxJiYoYj0xKSx0aGlzLng9KG0tcCkvYix0aGlzLnk9KHUteSkvYix0aGlzLno9KGYtaCkvYix0aGlzLnc9TWF0aC5hY29zKChsK2QrZy0xKS8yKSx0aGlzfXNldEZyb21NYXRyaXhQb3NpdGlvbih0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1lWzEyXSx0aGlzLnk9ZVsxM10sdGhpcy56PWVbMTRdLHRoaXMudz1lWzE1XSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpcy53PU1hdGgubWluKHRoaXMudyx0LncpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5tYXgodGhpcy53LHQudyksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdC54LGUueCksdGhpcy55PVoodGhpcy55LHQueSxlLnkpLHRoaXMuej1aKHRoaXMueix0LnosZS56KSx0aGlzLnc9Wih0aGlzLncsdC53LGUudyksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdCxlKSx0aGlzLnk9Wih0aGlzLnksdCxlKSx0aGlzLno9Wih0aGlzLnosdCxlKSx0aGlzLnc9Wih0aGlzLncsdCxlKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihaKG4sdCxlKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpcy53PU1hdGguZmxvb3IodGhpcy53KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpcy53PU1hdGguY2VpbCh0aGlzLncpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpcy53PU1hdGgucm91bmQodGhpcy53KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXMudz1NYXRoLnRydW5jKHRoaXMudyksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpcy53PS10aGlzLncsdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56K3RoaXMudyp0Lnd9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLncpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzLncrPSh0LnctdGhpcy53KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzLnc9dC53KyhlLnctdC53KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56JiZ0Lnc9PT10aGlzLnd9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXMudz10W2UrM10sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHRbZSszXT10aGlzLncsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXMudz10LmdldFcoZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpcy53PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMueix5aWVsZCB0aGlzLnd9fWNsYXNzIGdpe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHM9MSl7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1zfXN0YXRpYyBzbGVycEZsYXQodCxlLG4scyxyLG8sYSl7bGV0IGM9bltzKzBdLGw9bltzKzFdLGg9bltzKzJdLHU9bltzKzNdO2NvbnN0IGY9cltvKzBdLGQ9cltvKzFdLHA9cltvKzJdLHk9cltvKzNdO2lmKGE9PT0wKXt0W2UrMF09Yyx0W2UrMV09bCx0W2UrMl09aCx0W2UrM109dTtyZXR1cm59aWYoYT09PTEpe3RbZSswXT1mLHRbZSsxXT1kLHRbZSsyXT1wLHRbZSszXT15O3JldHVybn1pZih1IT09eXx8YyE9PWZ8fGwhPT1kfHxoIT09cCl7bGV0IG09MS1hO2NvbnN0IGc9YypmK2wqZCtoKnArdSp5LGI9Zz49MD8xOi0xLHc9MS1nKmc7aWYodz5OdW1iZXIuRVBTSUxPTil7Y29uc3QgTT1NYXRoLnNxcnQodyksQT1NYXRoLmF0YW4yKE0sZypiKTttPU1hdGguc2luKG0qQSkvTSxhPU1hdGguc2luKGEqQSkvTX1jb25zdCB4PWEqYjtpZihjPWMqbStmKngsbD1sKm0rZCp4LGg9aCptK3AqeCx1PXUqbSt5KngsbT09PTEtYSl7Y29uc3QgTT0xL01hdGguc3FydChjKmMrbCpsK2gqaCt1KnUpO2MqPU0sbCo9TSxoKj1NLHUqPU19fXRbZV09Yyx0W2UrMV09bCx0W2UrMl09aCx0W2UrM109dX1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodCxlLG4scyxyLG8pe2NvbnN0IGE9bltzXSxjPW5bcysxXSxsPW5bcysyXSxoPW5bcyszXSx1PXJbb10sZj1yW28rMV0sZD1yW28rMl0scD1yW28rM107cmV0dXJuIHRbZV09YSpwK2gqdStjKmQtbCpmLHRbZSsxXT1jKnAraCpmK2wqdS1hKmQsdFtlKzJdPWwqcCtoKmQrYSpmLWMqdSx0W2UrM109aCpwLWEqdS1jKmYtbCpkLHR9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyh0KXt0aGlzLl93PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixzKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1zLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC54LHRoaXMuX3k9dC55LHRoaXMuX3o9dC56LHRoaXMuX3c9dC53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcih0LGU9ITApe2NvbnN0IG49dC5feCxzPXQuX3kscj10Ll96LG89dC5fb3JkZXIsYT1NYXRoLmNvcyxjPU1hdGguc2luLGw9YShuLzIpLGg9YShzLzIpLHU9YShyLzIpLGY9YyhuLzIpLGQ9YyhzLzIpLHA9YyhyLzIpO3N3aXRjaChvKXtjYXNlIlhZWiI6dGhpcy5feD1mKmgqdStsKmQqcCx0aGlzLl95PWwqZCp1LWYqaCpwLHRoaXMuX3o9bCpoKnArZipkKnUsdGhpcy5fdz1sKmgqdS1mKmQqcDticmVhaztjYXNlIllYWiI6dGhpcy5feD1mKmgqdStsKmQqcCx0aGlzLl95PWwqZCp1LWYqaCpwLHRoaXMuX3o9bCpoKnAtZipkKnUsdGhpcy5fdz1sKmgqdStmKmQqcDticmVhaztjYXNlIlpYWSI6dGhpcy5feD1mKmgqdS1sKmQqcCx0aGlzLl95PWwqZCp1K2YqaCpwLHRoaXMuX3o9bCpoKnArZipkKnUsdGhpcy5fdz1sKmgqdS1mKmQqcDticmVhaztjYXNlIlpZWCI6dGhpcy5feD1mKmgqdS1sKmQqcCx0aGlzLl95PWwqZCp1K2YqaCpwLHRoaXMuX3o9bCpoKnAtZipkKnUsdGhpcy5fdz1sKmgqdStmKmQqcDticmVhaztjYXNlIllaWCI6dGhpcy5feD1mKmgqdStsKmQqcCx0aGlzLl95PWwqZCp1K2YqaCpwLHRoaXMuX3o9bCpoKnAtZipkKnUsdGhpcy5fdz1sKmgqdS1mKmQqcDticmVhaztjYXNlIlhaWSI6dGhpcy5feD1mKmgqdS1sKmQqcCx0aGlzLl95PWwqZCp1LWYqaCpwLHRoaXMuX3o9bCpoKnArZipkKnUsdGhpcy5fdz1sKmgqdStmKmQqcDticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrbyl9cmV0dXJuIGU9PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUF4aXNBbmdsZSh0LGUpe2NvbnN0IG49ZS8yLHM9TWF0aC5zaW4obik7cmV0dXJuIHRoaXMuX3g9dC54KnMsdGhpcy5feT10Lnkqcyx0aGlzLl96PXQueipzLHRoaXMuX3c9TWF0aC5jb3MobiksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpe2NvbnN0IGU9dC5lbGVtZW50cyxuPWVbMF0scz1lWzRdLHI9ZVs4XSxvPWVbMV0sYT1lWzVdLGM9ZVs5XSxsPWVbMl0saD1lWzZdLHU9ZVsxMF0sZj1uK2ErdTtpZihmPjApe2NvbnN0IGQ9LjUvTWF0aC5zcXJ0KGYrMSk7dGhpcy5fdz0uMjUvZCx0aGlzLl94PShoLWMpKmQsdGhpcy5feT0oci1sKSpkLHRoaXMuX3o9KG8tcykqZH1lbHNlIGlmKG4+YSYmbj51KXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErbi1hLXUpO3RoaXMuX3c9KGgtYykvZCx0aGlzLl94PS4yNSpkLHRoaXMuX3k9KHMrbykvZCx0aGlzLl96PShyK2wpL2R9ZWxzZSBpZihhPnUpe2NvbnN0IGQ9MipNYXRoLnNxcnQoMSthLW4tdSk7dGhpcy5fdz0oci1sKS9kLHRoaXMuX3g9KHMrbykvZCx0aGlzLl95PS4yNSpkLHRoaXMuX3o9KGMraCkvZH1lbHNle2NvbnN0IGQ9MipNYXRoLnNxcnQoMSt1LW4tYSk7dGhpcy5fdz0oby1zKS9kLHRoaXMuX3g9KHIrbCkvZCx0aGlzLl95PShjK2gpL2QsdGhpcy5fej0uMjUqZH1yZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVVuaXRWZWN0b3JzKHQsZSl7bGV0IG49dC5kb3QoZSkrMTtyZXR1cm4gbjxOdW1iZXIuRVBTSUxPTj8obj0wLE1hdGguYWJzKHQueCk+TWF0aC5hYnModC56KT8odGhpcy5feD0tdC55LHRoaXMuX3k9dC54LHRoaXMuX3o9MCx0aGlzLl93PW4pOih0aGlzLl94PTAsdGhpcy5feT0tdC56LHRoaXMuX3o9dC55LHRoaXMuX3c9bikpOih0aGlzLl94PXQueSplLnotdC56KmUueSx0aGlzLl95PXQueiplLngtdC54KmUueix0aGlzLl96PXQueCplLnktdC55KmUueCx0aGlzLl93PW4pLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyh0KXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoWih0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZihuPT09MClyZXR1cm4gdGhpcztjb25zdCBzPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LHMpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdD09PTA/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gscz10Ll95LHI9dC5feixvPXQuX3csYT1lLl94LGM9ZS5feSxsPWUuX3osaD1lLl93O3JldHVybiB0aGlzLl94PW4qaCtvKmErcypsLXIqYyx0aGlzLl95PXMqaCtvKmMrciphLW4qbCx0aGlzLl96PXIqaCtvKmwrbipjLXMqYSx0aGlzLl93PW8qaC1uKmEtcypjLXIqbCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKGU9PT0wKXJldHVybiB0aGlzO2lmKGU9PT0xKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3Qgbj10aGlzLl94LHM9dGhpcy5feSxyPXRoaXMuX3osbz10aGlzLl93O2xldCBhPW8qdC5fdytuKnQuX3grcyp0Ll95K3IqdC5fejtpZihhPDA/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3osYT0tYSk6dGhpcy5jb3B5KHQpLGE+PTEpcmV0dXJuIHRoaXMuX3c9byx0aGlzLl94PW4sdGhpcy5feT1zLHRoaXMuX3o9cix0aGlzO2NvbnN0IGM9MS1hKmE7aWYoYzw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IGQ9MS1lO3JldHVybiB0aGlzLl93PWQqbytlKnRoaXMuX3csdGhpcy5feD1kKm4rZSp0aGlzLl94LHRoaXMuX3k9ZCpzK2UqdGhpcy5feSx0aGlzLl96PWQqcitlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzfWNvbnN0IGw9TWF0aC5zcXJ0KGMpLGg9TWF0aC5hdGFuMihsLGEpLHU9TWF0aC5zaW4oKDEtZSkqaCkvbCxmPU1hdGguc2luKGUqaCkvbDtyZXR1cm4gdGhpcy5fdz1vKnUrdGhpcy5fdypmLHRoaXMuX3g9bip1K3RoaXMuX3gqZix0aGlzLl95PXMqdSt0aGlzLl95KmYsdGhpcy5fej1yKnUrdGhpcy5feipmLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1yYW5kb20oKXtjb25zdCB0PTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLGU9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksbj1NYXRoLnJhbmRvbSgpLHM9TWF0aC5zcXJ0KDEtbikscj1NYXRoLnNxcnQobik7cmV0dXJuIHRoaXMuc2V0KHMqTWF0aC5zaW4odCkscypNYXRoLmNvcyh0KSxyKk1hdGguc2luKGUpLHIqTWF0aC5jb3MoZSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX3d9fWNsYXNzIFR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTApe1QucHJvdG90eXBlLmlzVmVjdG9yMz0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bn1zZXQodCxlLG4pe3JldHVybiBuPT09dm9pZCAwJiYobj10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24odmMuc2V0RnJvbUV1bGVyKHQpKX1hcHBseUF4aXNBbmdsZSh0LGUpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbih2Yy5zZXRGcm9tQXhpc0FuZ2xlKHQsZSkpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrclszXSpuK3JbNl0qcyx0aGlzLnk9clsxXSplK3JbNF0qbityWzddKnMsdGhpcy56PXJbMl0qZStyWzVdKm4rcls4XSpzLHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKHQpLm5vcm1hbGl6ZSgpfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHMsbz0xLyhyWzNdKmUrcls3XSpuK3JbMTFdKnMrclsxNV0pO3JldHVybiB0aGlzLng9KHJbMF0qZStyWzRdKm4rcls4XSpzK3JbMTJdKSpvLHRoaXMueT0oclsxXSplK3JbNV0qbityWzldKnMrclsxM10pKm8sdGhpcy56PShyWzJdKmUrcls2XSpuK3JbMTBdKnMrclsxNF0pKm8sdGhpc31hcHBseVF1YXRlcm5pb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10Lngsbz10LnksYT10LnosYz10LncsbD0yKihvKnMtYSpuKSxoPTIqKGEqZS1yKnMpLHU9MioocipuLW8qZSk7cmV0dXJuIHRoaXMueD1lK2MqbCtvKnUtYSpoLHRoaXMueT1uK2MqaCthKmwtcip1LHRoaXMuej1zK2MqdStyKmgtbypsLHRoaXN9cHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXRyYW5zZm9ybURpcmVjdGlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrcls0XSpuK3JbOF0qcyx0aGlzLnk9clsxXSplK3JbNV0qbityWzldKnMsdGhpcy56PXJbMl0qZStyWzZdKm4rclsxMF0qcyx0aGlzLm5vcm1hbGl6ZSgpfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1aKHRoaXMueCx0LngsZS54KSx0aGlzLnk9Wih0aGlzLnksdC55LGUueSksdGhpcy56PVoodGhpcy56LHQueixlLnopLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PVoodGhpcy54LHQsZSksdGhpcy55PVoodGhpcy55LHQsZSksdGhpcy56PVoodGhpcy56LHQsZSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoWihuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgbj10Lngscz10Lnkscj10Lnosbz1lLngsYT1lLnksYz1lLno7cmV0dXJuIHRoaXMueD1zKmMtciphLHRoaXMueT1yKm8tbipjLHRoaXMuej1uKmEtcypvLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKGU9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgbj10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIobil9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIHNvLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKHNvKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1Yihzby5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKGU9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoWihuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueSxzPXRoaXMuei10Lno7cmV0dXJuIGUqZStuKm4rcypzfW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpK01hdGguYWJzKHRoaXMuei10LnopfXNldEZyb21TcGhlcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnBoaSx0LnRoZXRhKX1zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQsZSxuKXtjb25zdCBzPU1hdGguc2luKGUpKnQ7cmV0dXJuIHRoaXMueD1zKk1hdGguc2luKG4pLHRoaXMueT1NYXRoLmNvcyhlKSp0LHRoaXMuej1zKk1hdGguY29zKG4pLHRoaXN9c2V0RnJvbUN5bGluZHJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnRoZXRhLHQueSl9c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQqTWF0aC5zaW4oZSksdGhpcy55PW4sdGhpcy56PXQqTWF0aC5jb3MoZSksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzfXNldEZyb21NYXRyaXhTY2FsZSh0KXtjb25zdCBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCkscz10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gdGhpcy54PWUsdGhpcy55PW4sdGhpcy56PXMsdGhpc31zZXRGcm9tTWF0cml4Q29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsZSo0KX1zZXRGcm9tTWF0cml4M0NvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLGUqMyl9c2V0RnJvbUV1bGVyKHQpe3JldHVybiB0aGlzLng9dC5feCx0aGlzLnk9dC5feSx0aGlzLno9dC5feix0aGlzfXNldEZyb21Db2xvcih0KXtyZXR1cm4gdGhpcy54PXQucix0aGlzLnk9dC5nLHRoaXMuej10LmIsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnp9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpc31yYW5kb21EaXJlY3Rpb24oKXtjb25zdCB0PU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLGU9TWF0aC5yYW5kb20oKSoyLTEsbj1NYXRoLnNxcnQoMS1lKmUpO3JldHVybiB0aGlzLng9bipNYXRoLmNvcyh0KSx0aGlzLnk9ZSx0aGlzLno9bipNYXRoLnNpbih0KSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56fX1jb25zdCBzbz1uZXcgVCx2Yz1uZXcgZ2k7Y2xhc3MgZ3R7Y29uc3RydWN0b3IodD1uZXcgVCgxLzAsMS8wLDEvMCksZT1uZXcgVCgtMS8wLC0xLzAsLTEvMCkpe3RoaXMuaXNCb3gzPSEwLHRoaXMubWluPXQsdGhpcy5tYXg9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXN9c2V0RnJvbUFycmF5KHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSs9Myl0aGlzLmV4cGFuZEJ5UG9pbnQoY2UuZnJvbUFycmF5KHQsZSkpO3JldHVybiB0aGlzfXNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQuY291bnQ7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoY2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tUG9pbnRzKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTtyZXR1cm4gdGhpc31zZXRGcm9tQ2VudGVyQW5kU2l6ZSh0LGUpe2NvbnN0IG49Y2UuY29weShlKS5tdWx0aXBseVNjYWxhciguNSk7cmV0dXJuIHRoaXMubWluLmNvcHkodCkuc3ViKG4pLHRoaXMubWF4LmNvcHkodCkuYWRkKG4pLHRoaXN9c2V0RnJvbU9iamVjdCh0LGU9ITEpe3JldHVybiB0aGlzLm1ha2VFbXB0eSgpLHRoaXMuZXhwYW5kQnlPYmplY3QodCxlKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PXRoaXMubWluLno9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS0xLzAsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fHx0aGlzLm1heC56PHRoaXMubWluLnp9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9ZXhwYW5kQnlQb2ludCh0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQpLHRoaXMubWF4Lm1heCh0KSx0aGlzfWV4cGFuZEJ5VmVjdG9yKHQpe3JldHVybiB0aGlzLm1pbi5zdWIodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXhwYW5kQnlTY2FsYXIodCl7cmV0dXJuIHRoaXMubWluLmFkZFNjYWxhcigtdCksdGhpcy5tYXguYWRkU2NhbGFyKHQpLHRoaXN9ZXhwYW5kQnlPYmplY3QodCxlPSExKXt0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTtjb25zdCBuPXQuZ2VvbWV0cnk7aWYobiE9PXZvaWQgMCl7Y29uc3Qgcj1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlPT09ITAmJnIhPT12b2lkIDAmJnQuaXNJbnN0YW5jZWRNZXNoIT09ITApZm9yKGxldCBvPTAsYT1yLmNvdW50O288YTtvKyspdC5pc01lc2g9PT0hMD90LmdldFZlcnRleFBvc2l0aW9uKG8sY2UpOmNlLmZyb21CdWZmZXJBdHRyaWJ1dGUocixvKSxjZS5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KGNlKTtlbHNlIHQuYm91bmRpbmdCb3ghPT12b2lkIDA/KHQuYm91bmRpbmdCb3g9PT1udWxsJiZ0LmNvbXB1dGVCb3VuZGluZ0JveCgpLGFzLmNvcHkodC5ib3VuZGluZ0JveCkpOihuLmJvdW5kaW5nQm94PT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdCb3goKSxhcy5jb3B5KG4uYm91bmRpbmdCb3gpKSxhcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy51bmlvbihhcyl9Y29uc3Qgcz10LmNoaWxkcmVuO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKyl0aGlzLmV4cGFuZEJ5T2JqZWN0KHNbcl0sZSk7cmV0dXJuIHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC54Pj10aGlzLm1pbi54JiZ0Lng8PXRoaXMubWF4LngmJnQueT49dGhpcy5taW4ueSYmdC55PD10aGlzLm1heC55JiZ0Lno+PXRoaXMubWluLnomJnQuejw9dGhpcy5tYXguen1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9dC5taW4ueiYmdC5tYXguejw9dGhpcy5tYXguen1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLCh0LnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQubWF4Lng+PXRoaXMubWluLngmJnQubWluLng8PXRoaXMubWF4LngmJnQubWF4Lnk+PXRoaXMubWluLnkmJnQubWluLnk8PXRoaXMubWF4LnkmJnQubWF4Lno+PXRoaXMubWluLnomJnQubWluLno8PXRoaXMubWF4Lnp9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQuY2VudGVyLGNlKSxjZS5kaXN0YW5jZVRvU3F1YXJlZCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWludGVyc2VjdHNQbGFuZSh0KXtsZXQgZSxuO3JldHVybiB0Lm5vcm1hbC54PjA/KGU9dC5ub3JtYWwueCp0aGlzLm1pbi54LG49dC5ub3JtYWwueCp0aGlzLm1heC54KTooZT10Lm5vcm1hbC54KnRoaXMubWF4Lngsbj10Lm5vcm1hbC54KnRoaXMubWluLngpLHQubm9ybWFsLnk+MD8oZSs9dC5ub3JtYWwueSp0aGlzLm1pbi55LG4rPXQubm9ybWFsLnkqdGhpcy5tYXgueSk6KGUrPXQubm9ybWFsLnkqdGhpcy5tYXgueSxuKz10Lm5vcm1hbC55KnRoaXMubWluLnkpLHQubm9ybWFsLno+MD8oZSs9dC5ub3JtYWwueip0aGlzLm1pbi56LG4rPXQubm9ybWFsLnoqdGhpcy5tYXgueik6KGUrPXQubm9ybWFsLnoqdGhpcy5tYXgueixuKz10Lm5vcm1hbC56KnRoaXMubWluLnopLGU8PS10LmNvbnN0YW50JiZuPj0tdC5jb25zdGFudH1pbnRlcnNlY3RzVHJpYW5nbGUodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIoeGkpLGNzLnN1YlZlY3RvcnModGhpcy5tYXgseGkpLE5uLnN1YlZlY3RvcnModC5hLHhpKSxSbi5zdWJWZWN0b3JzKHQuYix4aSksTG4uc3ViVmVjdG9ycyh0LmMseGkpLFhlLnN1YlZlY3RvcnMoUm4sTm4pLEplLnN1YlZlY3RvcnMoTG4sUm4pLGhuLnN1YlZlY3RvcnMoTm4sTG4pO2xldCBlPVswLC1YZS56LFhlLnksMCwtSmUueixKZS55LDAsLWhuLnosaG4ueSxYZS56LDAsLVhlLngsSmUueiwwLC1KZS54LGhuLnosMCwtaG4ueCwtWGUueSxYZS54LDAsLUplLnksSmUueCwwLC1obi55LGhuLngsMF07cmV0dXJuIXJvKGUsTm4sUm4sTG4sY3MpfHwoZT1bMSwwLDAsMCwxLDAsMCwwLDFdLCFybyhlLE5uLFJuLExuLGNzKSk/ITE6KGxzLmNyb3NzVmVjdG9ycyhYZSxKZSksZT1bbHMueCxscy55LGxzLnpdLHJvKGUsTm4sUm4sTG4sY3MpKX1jbGFtcFBvaW50KHQsZSl7cmV0dXJuIGUuY29weSh0KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodCxjZSkuZGlzdGFuY2VUbyh0KX1nZXRCb3VuZGluZ1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5tYWtlRW1wdHkoKToodGhpcy5nZXRDZW50ZXIodC5jZW50ZXIpLHQucmFkaXVzPXRoaXMuZ2V0U2l6ZShjZSkubGVuZ3RoKCkqLjUpLHR9aW50ZXJzZWN0KHQpe3JldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLHRoaXMubWF4Lm1pbih0Lm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbih0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQubWluKSx0aGlzLm1heC5tYXgodC5tYXgpLHRoaXN9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90aGlzOihTZVswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxTZVsxXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxTZVsyXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxTZVszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxTZVs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxTZVs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxTZVs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxTZVs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldEZyb21Qb2ludHMoU2UpLHRoaXMpfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5taW4uYWRkKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5taW4uZXF1YWxzKHRoaXMubWluKSYmdC5tYXguZXF1YWxzKHRoaXMubWF4KX19Y29uc3QgU2U9W25ldyBULG5ldyBULG5ldyBULG5ldyBULG5ldyBULG5ldyBULG5ldyBULG5ldyBUXSxjZT1uZXcgVCxhcz1uZXcgZ3QsTm49bmV3IFQsUm49bmV3IFQsTG49bmV3IFQsWGU9bmV3IFQsSmU9bmV3IFQsaG49bmV3IFQseGk9bmV3IFQsY3M9bmV3IFQsbHM9bmV3IFQsdW49bmV3IFQ7ZnVuY3Rpb24gcm8oaSx0LGUsbixzKXtmb3IobGV0IHI9MCxvPWkubGVuZ3RoLTM7cjw9bztyKz0zKXt1bi5mcm9tQXJyYXkoaSxyKTtjb25zdCBhPXMueCpNYXRoLmFicyh1bi54KStzLnkqTWF0aC5hYnModW4ueSkrcy56Kk1hdGguYWJzKHVuLnopLGM9dC5kb3QodW4pLGw9ZS5kb3QodW4pLGg9bi5kb3QodW4pO2lmKE1hdGgubWF4KC1NYXRoLm1heChjLGwsaCksTWF0aC5taW4oYyxsLGgpKT5hKXJldHVybiExfXJldHVybiEwfWNvbnN0IGVmPW5ldyBndCx3aT1uZXcgVCxvbz1uZXcgVDtjbGFzcyBhb3tjb25zdHJ1Y3Rvcih0PW5ldyBULGU9LTEpe3RoaXMuaXNTcGhlcmU9ITAsdGhpcy5jZW50ZXI9dCx0aGlzLnJhZGl1cz1lfXNldCh0LGUpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQpLHRoaXMucmFkaXVzPWUsdGhpc31zZXRGcm9tUG9pbnRzKHQsZSl7Y29uc3Qgbj10aGlzLmNlbnRlcjtlIT09dm9pZCAwP24uY29weShlKTplZi5zZXRGcm9tUG9pbnRzKHQpLmdldENlbnRlcihuKTtsZXQgcz0wO2ZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKylzPU1hdGgubWF4KHMsbi5kaXN0YW5jZVRvU3F1YXJlZCh0W3JdKSk7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChzKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucmFkaXVzPXQucmFkaXVzLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLnJhZGl1czwwfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLmNlbnRlci5zZXQoMCwwLDApLHRoaXMucmFkaXVzPS0xLHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PXRoaXMucmFkaXVzKnRoaXMucmFkaXVzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKS10aGlzLnJhZGl1c31pbnRlcnNlY3RzU3BoZXJlKHQpe2NvbnN0IGU9dGhpcy5yYWRpdXMrdC5yYWRpdXM7cmV0dXJuIHQuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9ZSplfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX1pbnRlcnNlY3RzUGxhbmUodCl7cmV0dXJuIE1hdGguYWJzKHQuZGlzdGFuY2VUb1BvaW50KHRoaXMuY2VudGVyKSk8PXRoaXMucmFkaXVzfWNsYW1wUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHQpO3JldHVybiBlLmNvcHkodCksbj50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyYmKGUuc3ViKHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKSxlLm11bHRpcGx5U2NhbGFyKHRoaXMucmFkaXVzKS5hZGQodGhpcy5jZW50ZXIpKSxlfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT8odC5tYWtlRW1wdHkoKSx0KToodC5zZXQodGhpcy5jZW50ZXIsdGhpcy5jZW50ZXIpLHQuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpLHQpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KHQpLHRoaXMucmFkaXVzPXRoaXMucmFkaXVzKnQuZ2V0TWF4U2NhbGVPbkF4aXMoKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYWRkKHQpLHRoaXN9ZXhwYW5kQnlQb2ludCh0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz0wLHRoaXM7d2kuc3ViVmVjdG9ycyh0LHRoaXMuY2VudGVyKTtjb25zdCBlPXdpLmxlbmd0aFNxKCk7aWYoZT50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyl7Y29uc3Qgbj1NYXRoLnNxcnQoZSkscz0obi10aGlzLnJhZGl1cykqLjU7dGhpcy5jZW50ZXIuYWRkU2NhbGVkVmVjdG9yKHdpLHMvbiksdGhpcy5yYWRpdXMrPXN9cmV0dXJuIHRoaXN9dW5pb24odCl7cmV0dXJuIHQuaXNFbXB0eSgpP3RoaXM6dGhpcy5pc0VtcHR5KCk/KHRoaXMuY29weSh0KSx0aGlzKToodGhpcy5jZW50ZXIuZXF1YWxzKHQuY2VudGVyKT09PSEwP3RoaXMucmFkaXVzPU1hdGgubWF4KHRoaXMucmFkaXVzLHQucmFkaXVzKToob28uc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLmNlbnRlcikuc2V0TGVuZ3RoKHQucmFkaXVzKSx0aGlzLmV4cGFuZEJ5UG9pbnQod2kuY29weSh0LmNlbnRlcikuYWRkKG9vKSksdGhpcy5leHBhbmRCeVBvaW50KHdpLmNvcHkodC5jZW50ZXIpLnN1YihvbykpKSx0aGlzKX1lcXVhbHModCl7cmV0dXJuIHQuY2VudGVyLmVxdWFscyh0aGlzLmNlbnRlcikmJnQucmFkaXVzPT09dGhpcy5yYWRpdXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jb25zdCB6ZT1uZXcgVCxjbz1uZXcgVCxocz1uZXcgVCxZZT1uZXcgVCxsbz1uZXcgVCx1cz1uZXcgVCxobz1uZXcgVDtjbGFzcyB1b3tjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQoMCwwLC0xKSl7dGhpcy5vcmlnaW49dCx0aGlzLmRpcmVjdGlvbj1lfXNldCh0LGUpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLHRoaXMuZGlyZWN0aW9uLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQub3JpZ2luKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSx0aGlzfWF0KHQsZSl7cmV0dXJuIGUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLHQpfWxvb2tBdCh0KXtyZXR1cm4gdGhpcy5kaXJlY3Rpb24uY29weSh0KS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpLHRoaXN9cmVjYXN0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHRoaXMuYXQodCx6ZSkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sbil9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSl9ZGlzdGFuY2VTcVRvUG9pbnQodCl7Y29uc3QgZT16ZS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIGU8MD90aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCh0KTooemUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGUpLHplLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVNxVG9TZWdtZW50KHQsZSxuLHMpe2NvLmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSxocy5jb3B5KGUpLnN1Yih0KS5ub3JtYWxpemUoKSxZZS5jb3B5KHRoaXMub3JpZ2luKS5zdWIoY28pO2NvbnN0IHI9dC5kaXN0YW5jZVRvKGUpKi41LG89LXRoaXMuZGlyZWN0aW9uLmRvdChocyksYT1ZZS5kb3QodGhpcy5kaXJlY3Rpb24pLGM9LVllLmRvdChocyksbD1ZZS5sZW5ndGhTcSgpLGg9TWF0aC5hYnMoMS1vKm8pO2xldCB1LGYsZCxwO2lmKGg+MClpZih1PW8qYy1hLGY9byphLWMscD1yKmgsdT49MClpZihmPj0tcClpZihmPD1wKXtjb25zdCB5PTEvaDt1Kj15LGYqPXksZD11Kih1K28qZisyKmEpK2YqKG8qdStmKzIqYykrbH1lbHNlIGY9cix1PU1hdGgubWF4KDAsLShvKmYrYSkpLGQ9LXUqdStmKihmKzIqYykrbDtlbHNlIGY9LXIsdT1NYXRoLm1heCgwLC0obypmK2EpKSxkPS11KnUrZiooZisyKmMpK2w7ZWxzZSBmPD0tcD8odT1NYXRoLm1heCgwLC0oLW8qcithKSksZj11PjA/LXI6TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9LXUqdStmKihmKzIqYykrbCk6Zjw9cD8odT0wLGY9TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9ZiooZisyKmMpK2wpOih1PU1hdGgubWF4KDAsLShvKnIrYSkpLGY9dT4wP3I6TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9LXUqdStmKihmKzIqYykrbCk7ZWxzZSBmPW8+MD8tcjpyLHU9TWF0aC5tYXgoMCwtKG8qZithKSksZD0tdSp1K2YqKGYrMipjKStsO3JldHVybiBuJiZuLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbix1KSxzJiZzLmNvcHkoY28pLmFkZFNjYWxlZFZlY3RvcihocyxmKSxkfWludGVyc2VjdFNwaGVyZSh0LGUpe3plLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5vcmlnaW4pO2NvbnN0IG49emUuZG90KHRoaXMuZGlyZWN0aW9uKSxzPXplLmRvdCh6ZSktbipuLHI9dC5yYWRpdXMqdC5yYWRpdXM7aWYocz5yKXJldHVybiBudWxsO2NvbnN0IG89TWF0aC5zcXJ0KHItcyksYT1uLW8sYz1uK287cmV0dXJuIGM8MD9udWxsOmE8MD90aGlzLmF0KGMsZSk6dGhpcy5hdChhLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31kaXN0YW5jZVRvUGxhbmUodCl7Y29uc3QgZT10Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKGU9PT0wKXJldHVybiB0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik9PT0wPzA6bnVsbDtjb25zdCBuPS0odGhpcy5vcmlnaW4uZG90KHQubm9ybWFsKSt0LmNvbnN0YW50KS9lO3JldHVybiBuPj0wP246bnVsbH1pbnRlcnNlY3RQbGFuZSh0LGUpe2NvbnN0IG49dGhpcy5kaXN0YW5jZVRvUGxhbmUodCk7cmV0dXJuIG49PT1udWxsP251bGw6dGhpcy5hdChuLGUpfWludGVyc2VjdHNQbGFuZSh0KXtjb25zdCBlPXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTtyZXR1cm4gZT09PTB8fHQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZTwwfWludGVyc2VjdEJveCh0LGUpe2xldCBuLHMscixvLGEsYztjb25zdCBsPTEvdGhpcy5kaXJlY3Rpb24ueCxoPTEvdGhpcy5kaXJlY3Rpb24ueSx1PTEvdGhpcy5kaXJlY3Rpb24ueixmPXRoaXMub3JpZ2luO3JldHVybiBsPj0wPyhuPSh0Lm1pbi54LWYueCkqbCxzPSh0Lm1heC54LWYueCkqbCk6KG49KHQubWF4LngtZi54KSpsLHM9KHQubWluLngtZi54KSpsKSxoPj0wPyhyPSh0Lm1pbi55LWYueSkqaCxvPSh0Lm1heC55LWYueSkqaCk6KHI9KHQubWF4LnktZi55KSpoLG89KHQubWluLnktZi55KSpoKSxuPm98fHI+c3x8KChyPm58fGlzTmFOKG4pKSYmKG49ciksKG88c3x8aXNOYU4ocykpJiYocz1vKSx1Pj0wPyhhPSh0Lm1pbi56LWYueikqdSxjPSh0Lm1heC56LWYueikqdSk6KGE9KHQubWF4LnotZi56KSp1LGM9KHQubWluLnotZi56KSp1KSxuPmN8fGE+cyl8fCgoYT5ufHxuIT09bikmJihuPWEpLChjPHN8fHMhPT1zKSYmKHM9YyksczwwKT9udWxsOnRoaXMuYXQobj49MD9uOnMsZSl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3godCx6ZSkhPT1udWxsfWludGVyc2VjdFRyaWFuZ2xlKHQsZSxuLHMscil7bG8uc3ViVmVjdG9ycyhlLHQpLHVzLnN1YlZlY3RvcnMobix0KSxoby5jcm9zc1ZlY3RvcnMobG8sdXMpO2xldCBvPXRoaXMuZGlyZWN0aW9uLmRvdChobyksYTtpZihvPjApe2lmKHMpcmV0dXJuIG51bGw7YT0xfWVsc2UgaWYobzwwKWE9LTEsbz0tbztlbHNlIHJldHVybiBudWxsO1llLnN1YlZlY3RvcnModGhpcy5vcmlnaW4sdCk7Y29uc3QgYz1hKnRoaXMuZGlyZWN0aW9uLmRvdCh1cy5jcm9zc1ZlY3RvcnMoWWUsdXMpKTtpZihjPDApcmV0dXJuIG51bGw7Y29uc3QgbD1hKnRoaXMuZGlyZWN0aW9uLmRvdChsby5jcm9zcyhZZSkpO2lmKGw8MHx8YytsPm8pcmV0dXJuIG51bGw7Y29uc3QgaD0tYSpZZS5kb3QoaG8pO3JldHVybiBoPDA/bnVsbDp0aGlzLmF0KGgvbyxyKX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCh0KSx0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24odCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQub3JpZ2luLmVxdWFscyh0aGlzLm9yaWdpbikmJnQuZGlyZWN0aW9uLmVxdWFscyh0aGlzLmRpcmVjdGlvbil9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jbGFzcyBzdHtjb25zdHJ1Y3Rvcih0LGUsbixzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxtKXtzdC5wcm90b3R5cGUuaXNNYXRyaXg0PSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdLHQhPT12b2lkIDAmJnRoaXMuc2V0KHQsZSxuLHMscixvLGEsYyxsLGgsdSxmLGQscCx5LG0pfXNldCh0LGUsbixzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxtKXtjb25zdCBnPXRoaXMuZWxlbWVudHM7cmV0dXJuIGdbMF09dCxnWzRdPWUsZ1s4XT1uLGdbMTJdPXMsZ1sxXT1yLGdbNV09byxnWzldPWEsZ1sxM109YyxnWzJdPWwsZ1s2XT1oLGdbMTBdPXUsZ1sxNF09ZixnWzNdPWQsZ1s3XT1wLGdbMTFdPXksZ1sxNV09bSx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHN0KCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sZVs5XT1uWzldLGVbMTBdPW5bMTBdLGVbMTFdPW5bMTFdLGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLGVbMTVdPW5bMTVdLHRoaXN9Y29weVBvc2l0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLHRoaXN9c2V0RnJvbU1hdHJpeDModCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbM10sZVs2XSwwLGVbMV0sZVs0XSxlWzddLDAsZVsyXSxlWzVdLGVbOF0sMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpLHRoaXN9bWFrZUJhc2lzKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodC54LGUueCxuLngsMCx0LnksZS55LG4ueSwwLHQueixlLnosbi56LDAsMCwwLDAsMSksdGhpc31leHRyYWN0Um90YXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cyxzPTEvT24uc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLHI9MS9Pbi5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCksbz0xL09uLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gZVswXT1uWzBdKnMsZVsxXT1uWzFdKnMsZVsyXT1uWzJdKnMsZVszXT0wLGVbNF09bls0XSpyLGVbNV09bls1XSpyLGVbNl09bls2XSpyLGVbN109MCxlWzhdPW5bOF0qbyxlWzldPW5bOV0qbyxlWzEwXT1uWzEwXSpvLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21FdWxlcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10Lngscz10Lnkscj10Lnosbz1NYXRoLmNvcyhuKSxhPU1hdGguc2luKG4pLGM9TWF0aC5jb3MocyksbD1NYXRoLnNpbihzKSxoPU1hdGguY29zKHIpLHU9TWF0aC5zaW4ocik7aWYodC5vcmRlcj09PSJYWVoiKXtjb25zdCBmPW8qaCxkPW8qdSxwPWEqaCx5PWEqdTtlWzBdPWMqaCxlWzRdPS1jKnUsZVs4XT1sLGVbMV09ZCtwKmwsZVs1XT1mLXkqbCxlWzldPS1hKmMsZVsyXT15LWYqbCxlWzZdPXArZCpsLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWVhaIil7Y29uc3QgZj1jKmgsZD1jKnUscD1sKmgseT1sKnU7ZVswXT1mK3kqYSxlWzRdPXAqYS1kLGVbOF09bypsLGVbMV09byp1LGVbNV09bypoLGVbOV09LWEsZVsyXT1kKmEtcCxlWzZdPXkrZiphLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWlhZIil7Y29uc3QgZj1jKmgsZD1jKnUscD1sKmgseT1sKnU7ZVswXT1mLXkqYSxlWzRdPS1vKnUsZVs4XT1wK2QqYSxlWzFdPWQrcCphLGVbNV09bypoLGVbOV09eS1mKmEsZVsyXT0tbypsLGVbNl09YSxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IlpZWCIpe2NvbnN0IGY9bypoLGQ9byp1LHA9YSpoLHk9YSp1O2VbMF09YypoLGVbNF09cCpsLWQsZVs4XT1mKmwreSxlWzFdPWMqdSxlWzVdPXkqbCtmLGVbOV09ZCpsLXAsZVsyXT0tbCxlWzZdPWEqYyxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IllaWCIpe2NvbnN0IGY9bypjLGQ9bypsLHA9YSpjLHk9YSpsO2VbMF09YypoLGVbNF09eS1mKnUsZVs4XT1wKnUrZCxlWzFdPXUsZVs1XT1vKmgsZVs5XT0tYSpoLGVbMl09LWwqaCxlWzZdPWQqdStwLGVbMTBdPWYteSp1fWVsc2UgaWYodC5vcmRlcj09PSJYWlkiKXtjb25zdCBmPW8qYyxkPW8qbCxwPWEqYyx5PWEqbDtlWzBdPWMqaCxlWzRdPS11LGVbOF09bCpoLGVbMV09Zip1K3ksZVs1XT1vKmgsZVs5XT1kKnUtcCxlWzJdPXAqdS1kLGVbNl09YSpoLGVbMTBdPXkqdStmfXJldHVybiBlWzNdPTAsZVs3XT0wLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLmNvbXBvc2UobmYsdCxzZil9bG9va0F0KHQsZSxuKXtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuICR0LnN1YlZlY3RvcnModCxlKSwkdC5sZW5ndGhTcSgpPT09MCYmKCR0Lno9MSksJHQubm9ybWFsaXplKCksamUuY3Jvc3NWZWN0b3JzKG4sJHQpLGplLmxlbmd0aFNxKCk9PT0wJiYoTWF0aC5hYnMobi56KT09PTE/JHQueCs9MWUtNDokdC56Kz0xZS00LCR0Lm5vcm1hbGl6ZSgpLGplLmNyb3NzVmVjdG9ycyhuLCR0KSksamUubm9ybWFsaXplKCksZnMuY3Jvc3NWZWN0b3JzKCR0LGplKSxzWzBdPWplLngsc1s0XT1mcy54LHNbOF09JHQueCxzWzFdPWplLnksc1s1XT1mcy55LHNbOV09JHQueSxzWzJdPWplLnosc1s2XT1mcy56LHNbMTBdPSR0LnosdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscz1lLmVsZW1lbnRzLHI9dGhpcy5lbGVtZW50cyxvPW5bMF0sYT1uWzRdLGM9bls4XSxsPW5bMTJdLGg9blsxXSx1PW5bNV0sZj1uWzldLGQ9blsxM10scD1uWzJdLHk9bls2XSxtPW5bMTBdLGc9blsxNF0sYj1uWzNdLHc9bls3XSx4PW5bMTFdLE09blsxNV0sQT1zWzBdLF89c1s0XSx2PXNbOF0sUD1zWzEyXSx6PXNbMV0sUz1zWzVdLEM9c1s5XSxFPXNbMTNdLEY9c1syXSxCPXNbNl0sST1zWzEwXSxrPXNbMTRdLEQ9c1szXSxWPXNbN10saj1zWzExXSxkdD1zWzE1XTtyZXR1cm4gclswXT1vKkErYSp6K2MqRitsKkQscls0XT1vKl8rYSpTK2MqQitsKlYscls4XT1vKnYrYSpDK2MqSStsKmosclsxMl09bypQK2EqRStjKmsrbCpkdCxyWzFdPWgqQSt1KnorZipGK2QqRCxyWzVdPWgqXyt1KlMrZipCK2QqVixyWzldPWgqdit1KkMrZipJK2QqaixyWzEzXT1oKlArdSpFK2YqaytkKmR0LHJbMl09cCpBK3kqeittKkYrZypELHJbNl09cCpfK3kqUyttKkIrZypWLHJbMTBdPXAqdit5KkMrbSpJK2cqaixyWzE0XT1wKlAreSpFK20qaytnKmR0LHJbM109YipBK3cqeit4KkYrTSpELHJbN109YipfK3cqUyt4KkIrTSpWLHJbMTFdPWIqdit3KkMreCpJK00qaixyWzE1XT1iKlArdypFK3gqaytNKmR0LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFs0XSxzPXRbOF0scj10WzEyXSxvPXRbMV0sYT10WzVdLGM9dFs5XSxsPXRbMTNdLGg9dFsyXSx1PXRbNl0sZj10WzEwXSxkPXRbMTRdLHA9dFszXSx5PXRbN10sbT10WzExXSxnPXRbMTVdO3JldHVybiBwKigrcipjKnUtcypsKnUtciphKmYrbipsKmYrcyphKmQtbipjKmQpK3kqKCtlKmMqZC1lKmwqZityKm8qZi1zKm8qZCtzKmwqaC1yKmMqaCkrbSooK2UqbCp1LWUqYSpkLXIqbyp1K24qbypkK3IqYSpoLW4qbCpoKStnKigtcyphKmgtZSpjKnUrZSphKmYrcypvKnUtbipvKmYrbipjKmgpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxuKXtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhzWzEyXT10Lngsc1sxM109dC55LHNbMTRdPXQueik6KHNbMTJdPXQsc1sxM109ZSxzWzE0XT1uKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sbD10WzddLGg9dFs4XSx1PXRbOV0sZj10WzEwXSxkPXRbMTFdLHA9dFsxMl0seT10WzEzXSxtPXRbMTRdLGc9dFsxNV0sYj11Km0qbC15KmYqbCt5KmMqZC1hKm0qZC11KmMqZythKmYqZyx3PXAqZipsLWgqbSpsLXAqYypkK28qbSpkK2gqYypnLW8qZipnLHg9aCp5KmwtcCp1KmwrcCphKmQtbyp5KmQtaCphKmcrbyp1KmcsTT1wKnUqYy1oKnkqYy1wKmEqZitvKnkqZitoKmEqbS1vKnUqbSxBPWUqYituKncrcyp4K3IqTTtpZihBPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgXz0xL0E7cmV0dXJuIHRbMF09YipfLHRbMV09KHkqZipyLXUqbSpyLXkqcypkK24qbSpkK3UqcypnLW4qZipnKSpfLHRbMl09KGEqbSpyLXkqYypyK3kqcypsLW4qbSpsLWEqcypnK24qYypnKSpfLHRbM109KHUqYypyLWEqZipyLXUqcypsK24qZipsK2EqcypkLW4qYypkKSpfLHRbNF09dypfLHRbNV09KGgqbSpyLXAqZipyK3AqcypkLWUqbSpkLWgqcypnK2UqZipnKSpfLHRbNl09KHAqYypyLW8qbSpyLXAqcypsK2UqbSpsK28qcypnLWUqYypnKSpfLHRbN109KG8qZipyLWgqYypyK2gqcypsLWUqZipsLW8qcypkK2UqYypkKSpfLHRbOF09eCpfLHRbOV09KHAqdSpyLWgqeSpyLXAqbipkK2UqeSpkK2gqbipnLWUqdSpnKSpfLHRbMTBdPShvKnkqci1wKmEqcitwKm4qbC1lKnkqbC1vKm4qZytlKmEqZykqXyx0WzExXT0oaCphKnItbyp1KnItaCpuKmwrZSp1KmwrbypuKmQtZSphKmQpKl8sdFsxMl09TSpfLHRbMTNdPShoKnkqcy1wKnUqcytwKm4qZi1lKnkqZi1oKm4qbStlKnUqbSkqXyx0WzE0XT0ocCphKnMtbyp5KnMtcCpuKmMrZSp5KmMrbypuKm0tZSphKm0pKl8sdFsxNV09KG8qdSpzLWgqYSpzK2gqbipjLWUqdSpjLW8qbipmK2UqYSpmKSpfLHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LHM9dC55LHI9dC56O3JldHVybiBlWzBdKj1uLGVbNF0qPXMsZVs4XSo9cixlWzFdKj1uLGVbNV0qPXMsZVs5XSo9cixlWzJdKj1uLGVbNl0qPXMsZVsxMF0qPXIsZVszXSo9bixlWzddKj1zLGVbMTFdKj1yLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSxuPXRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLHM9dFs4XSp0WzhdK3RbOV0qdFs5XSt0WzEwXSp0WzEwXTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGUsbixzKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxuKXtyZXR1cm4gdC5pc1ZlY3RvcjM/dGhpcy5zZXQoMSwwLDAsdC54LDAsMSwwLHQueSwwLDAsMSx0LnosMCwwLDAsMSk6dGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLG4sMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxuLDAsMCwxLDAsMCwtbiwwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsMCxuLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxzPU1hdGguc2luKGUpLHI9MS1uLG89dC54LGE9dC55LGM9dC56LGw9cipvLGg9ciphO3JldHVybiB0aGlzLnNldChsKm8rbixsKmEtcypjLGwqYytzKmEsMCxsKmErcypjLGgqYStuLGgqYy1zKm8sMCxsKmMtcyphLGgqYytzKm8scipjKmMrbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxuLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLG4scyxyLG8pe3JldHVybiB0aGlzLnNldCgxLG4sciwwLHQsMSxvLDAsZSxzLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLG4pe2NvbnN0IHM9dGhpcy5lbGVtZW50cyxyPWUuX3gsbz1lLl95LGE9ZS5feixjPWUuX3csbD1yK3IsaD1vK28sdT1hK2EsZj1yKmwsZD1yKmgscD1yKnUseT1vKmgsbT1vKnUsZz1hKnUsYj1jKmwsdz1jKmgseD1jKnUsTT1uLngsQT1uLnksXz1uLno7cmV0dXJuIHNbMF09KDEtKHkrZykpKk0sc1sxXT0oZCt4KSpNLHNbMl09KHAtdykqTSxzWzNdPTAsc1s0XT0oZC14KSpBLHNbNV09KDEtKGYrZykpKkEsc1s2XT0obStiKSpBLHNbN109MCxzWzhdPShwK3cpKl8sc1s5XT0obS1iKSpfLHNbMTBdPSgxLShmK3kpKSpfLHNbMTFdPTAsc1sxMl09dC54LHNbMTNdPXQueSxzWzE0XT10Lnosc1sxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUsbil7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO2xldCByPU9uLnNldChzWzBdLHNbMV0sc1syXSkubGVuZ3RoKCk7Y29uc3Qgbz1Pbi5zZXQoc1s0XSxzWzVdLHNbNl0pLmxlbmd0aCgpLGE9T24uc2V0KHNbOF0sc1s5XSxzWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihyPS1yKSx0Lng9c1sxMl0sdC55PXNbMTNdLHQuej1zWzE0XSxsZS5jb3B5KHRoaXMpO2NvbnN0IGw9MS9yLGg9MS9vLHU9MS9hO3JldHVybiBsZS5lbGVtZW50c1swXSo9bCxsZS5lbGVtZW50c1sxXSo9bCxsZS5lbGVtZW50c1syXSo9bCxsZS5lbGVtZW50c1s0XSo9aCxsZS5lbGVtZW50c1s1XSo9aCxsZS5lbGVtZW50c1s2XSo9aCxsZS5lbGVtZW50c1s4XSo9dSxsZS5lbGVtZW50c1s5XSo9dSxsZS5lbGVtZW50c1sxMF0qPXUsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgobGUpLG4ueD1yLG4ueT1vLG4uej1hLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxuLHMscixvLGE9MmUzKXtjb25zdCBjPXRoaXMuZWxlbWVudHMsbD0yKnIvKGUtdCksaD0yKnIvKG4tcyksdT0oZSt0KS8oZS10KSxmPShuK3MpLyhuLXMpO2xldCBkLHA7aWYoYT09PTJlMylkPS0obytyKS8oby1yKSxwPS0yKm8qci8oby1yKTtlbHNlIGlmKGE9PT0yMDAxKWQ9LW8vKG8tcikscD0tbypyLyhvLXIpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBjWzBdPWwsY1s0XT0wLGNbOF09dSxjWzEyXT0wLGNbMV09MCxjWzVdPWgsY1s5XT1mLGNbMTNdPTAsY1syXT0wLGNbNl09MCxjWzEwXT1kLGNbMTRdPXAsY1szXT0wLGNbN109MCxjWzExXT0tMSxjWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUsbixzLHIsbyxhPTJlMyl7Y29uc3QgYz10aGlzLmVsZW1lbnRzLGw9MS8oZS10KSxoPTEvKG4tcyksdT0xLyhvLXIpLGY9KGUrdCkqbCxkPShuK3MpKmg7bGV0IHAseTtpZihhPT09MmUzKXA9KG8rcikqdSx5PS0yKnU7ZWxzZSBpZihhPT09MjAwMSlwPXIqdSx5PS0xKnU7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZU9ydGhvZ3JhcGhpYygpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBjWzBdPTIqbCxjWzRdPTAsY1s4XT0wLGNbMTJdPS1mLGNbMV09MCxjWzVdPTIqaCxjWzldPTAsY1sxM109LWQsY1syXT0wLGNbNl09MCxjWzEwXT15LGNbMTRdPS1wLGNbM109MCxjWzddPTAsY1sxMV09MCxjWzE1XT0xLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCBzPTA7czwxNjtzKyspaWYoZVtzXSE9PW5bc10pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDE2O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0W2UrOV09bls5XSx0W2UrMTBdPW5bMTBdLHRbZSsxMV09blsxMV0sdFtlKzEyXT1uWzEyXSx0W2UrMTNdPW5bMTNdLHRbZSsxNF09blsxNF0sdFtlKzE1XT1uWzE1XSx0fX1jb25zdCBPbj1uZXcgVCxsZT1uZXcgc3QsbmY9bmV3IFQoMCwwLDApLHNmPW5ldyBUKDEsMSwxKSxqZT1uZXcgVCxmcz1uZXcgVCwkdD1uZXcgVCxTYz1uZXcgc3QsemM9bmV3IGdpO2NsYXNzIGJpe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHM9YmkuREVGQVVMVF9PUkRFUil7dGhpcy5pc0V1bGVyPSEwLHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPXN9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IG9yZGVyKCl7cmV0dXJuIHRoaXMuX29yZGVyfXNldCBvcmRlcih0KXt0aGlzLl9vcmRlcj10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4scz10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPXMsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fb3JkZXIpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC5feCx0aGlzLl95PXQuX3ksdGhpcy5fej10Ll96LHRoaXMuX29yZGVyPXQuX29yZGVyLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0LGU9dGhpcy5fb3JkZXIsbj0hMCl7Y29uc3Qgcz10LmVsZW1lbnRzLHI9c1swXSxvPXNbNF0sYT1zWzhdLGM9c1sxXSxsPXNbNV0saD1zWzldLHU9c1syXSxmPXNbNl0sZD1zWzEwXTtzd2l0Y2goZSl7Y2FzZSJYWVoiOnRoaXMuX3k9TWF0aC5hc2luKFooYSwtMSwxKSksTWF0aC5hYnMoYSk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxkKSx0aGlzLl96PU1hdGguYXRhbjIoLW8scikpOih0aGlzLl94PU1hdGguYXRhbjIoZixsKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PU1hdGguYXNpbigtWihoLC0xLDEpKSxNYXRoLmFicyhoKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKGEsZCksdGhpcy5fej1NYXRoLmF0YW4yKGMsbCkpOih0aGlzLl95PU1hdGguYXRhbjIoLXUsciksdGhpcy5fej0wKTticmVhaztjYXNlIlpYWSI6dGhpcy5feD1NYXRoLmFzaW4oWihmLC0xLDEpKSxNYXRoLmFicyhmKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKC11LGQpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxsKSk6KHRoaXMuX3k9MCx0aGlzLl96PU1hdGguYXRhbjIoYyxyKSk7YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3k9TWF0aC5hc2luKC1aKHUsLTEsMSkpLE1hdGguYWJzKHUpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZixkKSx0aGlzLl96PU1hdGguYXRhbjIoYyxyKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLW8sbCkpO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl96PU1hdGguYXNpbihaKGMsLTEsMSkpLE1hdGguYWJzKGMpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWgsbCksdGhpcy5feT1NYXRoLmF0YW4yKC11LHIpKToodGhpcy5feD0wLHRoaXMuX3k9TWF0aC5hdGFuMihhLGQpKTticmVhaztjYXNlIlhaWSI6dGhpcy5fej1NYXRoLmFzaW4oLVoobywtMSwxKSksTWF0aC5hYnMobyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihmLGwpLHRoaXMuX3k9TWF0aC5hdGFuMihhLHIpKToodGhpcy5feD1NYXRoLmF0YW4yKC1oLGQpLHRoaXMuX3k9MCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIitlKX1yZXR1cm4gdGhpcy5fb3JkZXI9ZSxuPT09ITAmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21RdWF0ZXJuaW9uKHQsZSxuKXtyZXR1cm4gU2MubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCksdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoU2MsZSxuKX1zZXRGcm9tVmVjdG9yMyh0LGU9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLnNldCh0LngsdC55LHQueixlKX1yZW9yZGVyKHQpe3JldHVybiB6Yy5zZXRGcm9tRXVsZXIodGhpcyksdGhpcy5zZXRGcm9tUXVhdGVybmlvbih6Yyx0KX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX29yZGVyPT09dGhpcy5fb3JkZXJ9ZnJvbUFycmF5KHQpe3JldHVybiB0aGlzLl94PXRbMF0sdGhpcy5feT10WzFdLHRoaXMuX3o9dFsyXSx0WzNdIT09dm9pZCAwJiYodGhpcy5fb3JkZXI9dFszXSksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5feCx0W2UrMV09dGhpcy5feSx0W2UrMl09dGhpcy5feix0W2UrM109dGhpcy5fb3JkZXIsdH1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX29yZGVyfX1iaS5ERUZBVUxUX09SREVSPSJYWVoiO2NsYXNzIHJme2NvbnN0cnVjdG9yKCl7dGhpcy5tYXNrPTF9c2V0KHQpe3RoaXMubWFzaz0oMTw8dHwwKT4+PjB9ZW5hYmxlKHQpe3RoaXMubWFza3w9MTw8dHwwfWVuYWJsZUFsbCgpe3RoaXMubWFzaz0tMX10b2dnbGUodCl7dGhpcy5tYXNrXj0xPDx0fDB9ZGlzYWJsZSh0KXt0aGlzLm1hc2smPX4oMTw8dHwwKX1kaXNhYmxlQWxsKCl7dGhpcy5tYXNrPTB9dGVzdCh0KXtyZXR1cm4odGhpcy5tYXNrJnQubWFzaykhPT0wfWlzRW5hYmxlZCh0KXtyZXR1cm4odGhpcy5tYXNrJigxPDx0fDApKSE9PTB9fWxldCBvZj0wO2NvbnN0IFRjPW5ldyBULERuPW5ldyBnaSxUZT1uZXcgc3QsZHM9bmV3IFQsTWk9bmV3IFQsYWY9bmV3IFQsY2Y9bmV3IGdpLFBjPW5ldyBUKDEsMCwwKSxFYz1uZXcgVCgwLDEsMCksQ2M9bmV3IFQoMCwwLDEpLEJjPXt0eXBlOiJhZGRlZCJ9LGxmPXt0eXBlOiJyZW1vdmVkIn0sJG49e3R5cGU6ImNoaWxkYWRkZWQiLGNoaWxkOm51bGx9LGZvPXt0eXBlOiJjaGlsZHJlbW92ZWQiLGNoaWxkOm51bGx9O2NsYXNzIFBlIGV4dGVuZHMgb3N7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNPYmplY3QzRD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpvZisrfSksdGhpcy51dWlkPUZuKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iT2JqZWN0M0QiLHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnVwPVBlLkRFRkFVTFRfVVAuY2xvbmUoKTtjb25zdCB0PW5ldyBULGU9bmV3IGJpLG49bmV3IGdpLHM9bmV3IFQoMSwxLDEpO2Z1bmN0aW9uIHIoKXtuLnNldEZyb21FdWxlcihlLCExKX1mdW5jdGlvbiBvKCl7ZS5zZXRGcm9tUXVhdGVybmlvbihuLHZvaWQgMCwhMSl9ZS5fb25DaGFuZ2Uociksbi5fb25DaGFuZ2UobyksT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9zaXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnR9LHJvdGF0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplfSxxdWF0ZXJuaW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpufSxzY2FsZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6c30sbW9kZWxWaWV3TWF0cml4Ont2YWx1ZTpuZXcgc3R9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3IGdlfX0pLHRoaXMubWF0cml4PW5ldyBzdCx0aGlzLm1hdHJpeFdvcmxkPW5ldyBzdCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9UGUuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9UGUuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHRoaXMubGF5ZXJzPW5ldyByZix0aGlzLnZpc2libGU9ITAsdGhpcy5jYXN0U2hhZG93PSExLHRoaXMucmVjZWl2ZVNoYWRvdz0hMSx0aGlzLmZydXN0dW1DdWxsZWQ9ITAsdGhpcy5yZW5kZXJPcmRlcj0wLHRoaXMuYW5pbWF0aW9ucz1bXSx0aGlzLmN1c3RvbURlcHRoTWF0ZXJpYWw9dm9pZCAwLHRoaXMuY3VzdG9tRGlzdGFuY2VNYXRlcmlhbD12b2lkIDAsdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVNoYWRvdygpe31vbkFmdGVyU2hhZG93KCl7fW9uQmVmb3JlUmVuZGVyKCl7fW9uQWZ0ZXJSZW5kZXIoKXt9YXBwbHlNYXRyaXg0KHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSh0KSx0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodCksdGhpc31zZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUodCxlKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0LGUpfXNldFJvdGF0aW9uRnJvbUV1bGVyKHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIodCwhMCl9c2V0Um90YXRpb25Gcm9tTWF0cml4KHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodCl9c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbih0KXt0aGlzLnF1YXRlcm5pb24uY29weSh0KX1yb3RhdGVPbkF4aXModCxlKXtyZXR1cm4gRG4uc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShEbiksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiBEbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KERuKSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKFBjLHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKEVjLHQpfXJvdGF0ZVoodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKENjLHQpfXRyYW5zbGF0ZU9uQXhpcyh0LGUpe3JldHVybiBUYy5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKFRjLm11bHRpcGx5U2NhbGFyKGUpKSx0aGlzfXRyYW5zbGF0ZVgodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKFBjLHQpfXRyYW5zbGF0ZVkodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKEVjLHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKENjLHQpfWxvY2FsVG9Xb3JsZCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9d29ybGRUb0xvY2FsKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NChUZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQodCxlLG4pe3QuaXNWZWN0b3IzP2RzLmNvcHkodCk6ZHMuc2V0KHQsZSxuKTtjb25zdCBzPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLE1pLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/VGUubG9va0F0KE1pLGRzLHRoaXMudXApOlRlLmxvb2tBdChkcyxNaSx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KFRlKSxzJiYoVGUuZXh0cmFjdFJvdGF0aW9uKHMubWF0cml4V29ybGQpLERuLnNldEZyb21Sb3RhdGlvbk1hdHJpeChUZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KERuLmludmVydCgpKSl9YWRkKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCBlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0aGlzLmFkZChhcmd1bWVudHNbZV0pO3JldHVybiB0aGlzfXJldHVybiB0PT09dGhpcz8oY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIix0KSx0aGlzKToodCYmdC5pc09iamVjdDNEPyh0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LmRpc3BhdGNoRXZlbnQoQmMpLCRuLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KCRuKSwkbi5jaGlsZD1udWxsKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIix0KSx0aGlzKX1yZW1vdmUodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1tuXSk7cmV0dXJuIHRoaXN9Y29uc3QgZT10aGlzLmNoaWxkcmVuLmluZGV4T2YodCk7cmV0dXJuIGUhPT0tMSYmKHQucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbi5zcGxpY2UoZSwxKSx0LmRpc3BhdGNoRXZlbnQobGYpLGZvLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KGZvKSxmby5jaGlsZD1udWxsKSx0aGlzfXJlbW92ZUZyb21QYXJlbnQoKXtjb25zdCB0PXRoaXMucGFyZW50O3JldHVybiB0IT09bnVsbCYmdC5yZW1vdmUodGhpcyksdGhpc31jbGVhcigpe3JldHVybiB0aGlzLnJlbW92ZSguLi50aGlzLmNoaWxkcmVuKX1hdHRhY2godCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFRlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksdC5wYXJlbnQhPT1udWxsJiYodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFRlLm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQoVGUpLHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQudXBkYXRlV29ybGRNYXRyaXgoITEsITApLHQuZGlzcGF0Y2hFdmVudChCYyksJG4uY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoJG4pLCRuLmNoaWxkPW51bGwsdGhpc31nZXRPYmplY3RCeUlkKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoImlkIix0KX1nZXRPYmplY3RCeU5hbWUodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsdCl9Z2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpe2lmKHRoaXNbdF09PT1lKXJldHVybiB0aGlzO2ZvcihsZXQgbj0wLHM9dGhpcy5jaGlsZHJlbi5sZW5ndGg7bjxzO24rKyl7Y29uc3Qgbz10aGlzLmNoaWxkcmVuW25dLmdldE9iamVjdEJ5UHJvcGVydHkodCxlKTtpZihvIT09dm9pZCAwKXJldHVybiBvfX1nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUsbj1bXSl7dGhpc1t0XT09PWUmJm4ucHVzaCh0aGlzKTtjb25zdCBzPXRoaXMuY2hpbGRyZW47Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cisrKXNbcl0uZ2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLG4pO3JldHVybiBufWdldFdvcmxkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfWdldFdvcmxkUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoTWksdCxhZiksdH1nZXRXb3JsZFNjYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShNaSxjZix0KSx0fWdldFdvcmxkRGlyZWN0aW9uKHQpe3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpO2NvbnN0IGU9dGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztyZXR1cm4gdC5zZXQoZVs4XSxlWzldLGVbMTBdKS5ub3JtYWxpemUoKX1yYXljYXN0KCl7fXRyYXZlcnNlKHQpe3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyllW25dLnRyYXZlcnNlKHQpfXRyYXZlcnNlVmlzaWJsZSh0KXtpZih0aGlzLnZpc2libGU9PT0hMSlyZXR1cm47dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscz1lLmxlbmd0aDtuPHM7bisrKWVbbl0udHJhdmVyc2VWaXNpYmxlKHQpfXRyYXZlcnNlQW5jZXN0b3JzKHQpe2NvbnN0IGU9dGhpcy5wYXJlbnQ7ZSE9PW51bGwmJih0KGUpLGUudHJhdmVyc2VBbmNlc3RvcnModCkpfXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSwodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHx0KSYmKHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITAmJih0aGlzLnBhcmVudD09PW51bGw/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyllW25dLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7Y29uc3Qgbj10aGlzLnBhcmVudDtpZih0PT09ITAmJm4hPT1udWxsJiZuLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmKHRoaXMucGFyZW50PT09bnVsbD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLGU9PT0hMCl7Y29uc3Qgcz10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKylzW3JdLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciLG49e307ZSYmKHQ9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e30sc2tlbGV0b25zOnt9LGFuaW1hdGlvbnM6e30sbm9kZXM6e319LG4ubWV0YWRhdGE9e3ZlcnNpb246NC42LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7Y29uc3Qgcz17fTtzLnV1aWQ9dGhpcy51dWlkLHMudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJihzLm5hbWU9dGhpcy5uYW1lKSx0aGlzLmNhc3RTaGFkb3c9PT0hMCYmKHMuY2FzdFNoYWRvdz0hMCksdGhpcy5yZWNlaXZlU2hhZG93PT09ITAmJihzLnJlY2VpdmVTaGFkb3c9ITApLHRoaXMudmlzaWJsZT09PSExJiYocy52aXNpYmxlPSExKSx0aGlzLmZydXN0dW1DdWxsZWQ9PT0hMSYmKHMuZnJ1c3R1bUN1bGxlZD0hMSksdGhpcy5yZW5kZXJPcmRlciE9PTAmJihzLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYocy51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxzLmxheWVycz10aGlzLmxheWVycy5tYXNrLHMubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSxzLnVwPXRoaXMudXAudG9BcnJheSgpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT09PSExJiYocy5tYXRyaXhBdXRvVXBkYXRlPSExKSx0aGlzLmlzSW5zdGFuY2VkTWVzaCYmKHMudHlwZT0iSW5zdGFuY2VkTWVzaCIscy5jb3VudD10aGlzLmNvdW50LHMuaW5zdGFuY2VNYXRyaXg9dGhpcy5pbnN0YW5jZU1hdHJpeC50b0pTT04oKSx0aGlzLmluc3RhbmNlQ29sb3IhPT1udWxsJiYocy5pbnN0YW5jZUNvbG9yPXRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKSkpLHRoaXMuaXNCYXRjaGVkTWVzaCYmKHMudHlwZT0iQmF0Y2hlZE1lc2giLHMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQscy5zb3J0T2JqZWN0cz10aGlzLnNvcnRPYmplY3RzLHMuZHJhd1Jhbmdlcz10aGlzLl9kcmF3UmFuZ2VzLHMucmVzZXJ2ZWRSYW5nZXM9dGhpcy5fcmVzZXJ2ZWRSYW5nZXMscy5nZW9tZXRyeUluZm89dGhpcy5fZ2VvbWV0cnlJbmZvLm1hcChhPT5aZShGdCh7fSxhKSx7Ym91bmRpbmdCb3g6YS5ib3VuZGluZ0JveD97bWluOmEuYm91bmRpbmdCb3gubWluLnRvQXJyYXkoKSxtYXg6YS5ib3VuZGluZ0JveC5tYXgudG9BcnJheSgpfTp2b2lkIDAsYm91bmRpbmdTcGhlcmU6YS5ib3VuZGluZ1NwaGVyZT97cmFkaXVzOmEuYm91bmRpbmdTcGhlcmUucmFkaXVzLGNlbnRlcjphLmJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCl9OnZvaWQgMH0pKSxzLmluc3RhbmNlSW5mbz10aGlzLl9pbnN0YW5jZUluZm8ubWFwKGE9PkZ0KHt9LGEpKSxzLmF2YWlsYWJsZUluc3RhbmNlSWRzPXRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLnNsaWNlKCkscy5hdmFpbGFibGVHZW9tZXRyeUlkcz10aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5zbGljZSgpLHMubmV4dEluZGV4U3RhcnQ9dGhpcy5fbmV4dEluZGV4U3RhcnQscy5uZXh0VmVydGV4U3RhcnQ9dGhpcy5fbmV4dFZlcnRleFN0YXJ0LHMuZ2VvbWV0cnlDb3VudD10aGlzLl9nZW9tZXRyeUNvdW50LHMubWF4SW5zdGFuY2VDb3VudD10aGlzLl9tYXhJbnN0YW5jZUNvdW50LHMubWF4VmVydGV4Q291bnQ9dGhpcy5fbWF4VmVydGV4Q291bnQscy5tYXhJbmRleENvdW50PXRoaXMuX21heEluZGV4Q291bnQscy5nZW9tZXRyeUluaXRpYWxpemVkPXRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQscy5tYXRyaWNlc1RleHR1cmU9dGhpcy5fbWF0cmljZXNUZXh0dXJlLnRvSlNPTih0KSxzLmluZGlyZWN0VGV4dHVyZT10aGlzLl9pbmRpcmVjdFRleHR1cmUudG9KU09OKHQpLHRoaXMuX2NvbG9yc1RleHR1cmUhPT1udWxsJiYocy5jb2xvcnNUZXh0dXJlPXRoaXMuX2NvbG9yc1RleHR1cmUudG9KU09OKHQpKSx0aGlzLmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmKHMuYm91bmRpbmdTcGhlcmU9e2NlbnRlcjp0aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCkscmFkaXVzOnRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzfSksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJihzLmJvdW5kaW5nQm94PXttaW46dGhpcy5ib3VuZGluZ0JveC5taW4udG9BcnJheSgpLG1heDp0aGlzLmJvdW5kaW5nQm94Lm1heC50b0FycmF5KCl9KSk7ZnVuY3Rpb24gcihhLGMpe3JldHVybiBhW2MudXVpZF09PT12b2lkIDAmJihhW2MudXVpZF09Yy50b0pTT04odCkpLGMudXVpZH1pZih0aGlzLmlzU2NlbmUpdGhpcy5iYWNrZ3JvdW5kJiYodGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3I/cy5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oKTp0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlJiYocy5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04odCkudXVpZCkpLHRoaXMuZW52aXJvbm1lbnQmJnRoaXMuZW52aXJvbm1lbnQuaXNUZXh0dXJlJiZ0aGlzLmVudmlyb25tZW50LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSE9PSEwJiYocy5lbnZpcm9ubWVudD10aGlzLmVudmlyb25tZW50LnRvSlNPTih0KS51dWlkKTtlbHNlIGlmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7cy5nZW9tZXRyeT1yKHQuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTtjb25zdCBhPXRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztpZihhIT09dm9pZCAwJiZhLnNoYXBlcyE9PXZvaWQgMCl7Y29uc3QgYz1hLnNoYXBlcztpZihBcnJheS5pc0FycmF5KGMpKWZvcihsZXQgbD0wLGg9Yy5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgdT1jW2xdO3IodC5zaGFwZXMsdSl9ZWxzZSByKHQuc2hhcGVzLGMpfX1pZih0aGlzLmlzU2tpbm5lZE1lc2gmJihzLmJpbmRNb2RlPXRoaXMuYmluZE1vZGUscy5iaW5kTWF0cml4PXRoaXMuYmluZE1hdHJpeC50b0FycmF5KCksdGhpcy5za2VsZXRvbiE9PXZvaWQgMCYmKHIodC5za2VsZXRvbnMsdGhpcy5za2VsZXRvbikscy5za2VsZXRvbj10aGlzLnNrZWxldG9uLnV1aWQpKSx0aGlzLm1hdGVyaWFsIT09dm9pZCAwKWlmKEFycmF5LmlzQXJyYXkodGhpcy5tYXRlcmlhbCkpe2NvbnN0IGE9W107Zm9yKGxldCBjPTAsbD10aGlzLm1hdGVyaWFsLmxlbmd0aDtjPGw7YysrKWEucHVzaChyKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbY10pKTtzLm1hdGVyaWFsPWF9ZWxzZSBzLm1hdGVyaWFsPXIodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYodGhpcy5jaGlsZHJlbi5sZW5ndGg+MCl7cy5jaGlsZHJlbj1bXTtmb3IobGV0IGE9MDthPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2ErKylzLmNoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlblthXS50b0pTT04odCkub2JqZWN0KX1pZih0aGlzLmFuaW1hdGlvbnMubGVuZ3RoPjApe3MuYW5pbWF0aW9ucz1bXTtmb3IobGV0IGE9MDthPHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7YSsrKXtjb25zdCBjPXRoaXMuYW5pbWF0aW9uc1thXTtzLmFuaW1hdGlvbnMucHVzaChyKHQuYW5pbWF0aW9ucyxjKSl9fWlmKGUpe2NvbnN0IGE9byh0Lmdlb21ldHJpZXMpLGM9byh0Lm1hdGVyaWFscyksbD1vKHQudGV4dHVyZXMpLGg9byh0LmltYWdlcyksdT1vKHQuc2hhcGVzKSxmPW8odC5za2VsZXRvbnMpLGQ9byh0LmFuaW1hdGlvbnMpLHA9byh0Lm5vZGVzKTthLmxlbmd0aD4wJiYobi5nZW9tZXRyaWVzPWEpLGMubGVuZ3RoPjAmJihuLm1hdGVyaWFscz1jKSxsLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1sKSxoLmxlbmd0aD4wJiYobi5pbWFnZXM9aCksdS5sZW5ndGg+MCYmKG4uc2hhcGVzPXUpLGYubGVuZ3RoPjAmJihuLnNrZWxldG9ucz1mKSxkLmxlbmd0aD4wJiYobi5hbmltYXRpb25zPWQpLHAubGVuZ3RoPjAmJihuLm5vZGVzPXApfXJldHVybiBuLm9iamVjdD1zLG47ZnVuY3Rpb24gbyhhKXtjb25zdCBjPVtdO2Zvcihjb25zdCBsIGluIGEpe2NvbnN0IGg9YVtsXTtkZWxldGUgaC5tZXRhZGF0YSxjLnB1c2goaCl9cmV0dXJuIGN9fWNsb25lKHQpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyx0KX1jb3B5KHQsZT0hMCl7aWYodGhpcy5uYW1lPXQubmFtZSx0aGlzLnVwLmNvcHkodC51cCksdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLHRoaXMucm90YXRpb24ub3JkZXI9dC5yb3RhdGlvbi5vcmRlcix0aGlzLnF1YXRlcm5pb24uY29weSh0LnF1YXRlcm5pb24pLHRoaXMuc2NhbGUuY29weSh0LnNjYWxlKSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT10Lm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlLHRoaXMubGF5ZXJzLm1hc2s9dC5sYXllcnMubWFzayx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMuY2FzdFNoYWRvdz10LmNhc3RTaGFkb3csdGhpcy5yZWNlaXZlU2hhZG93PXQucmVjZWl2ZVNoYWRvdyx0aGlzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkLHRoaXMucmVuZGVyT3JkZXI9dC5yZW5kZXJPcmRlcix0aGlzLmFuaW1hdGlvbnM9dC5hbmltYXRpb25zLnNsaWNlKCksdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSxlPT09ITApZm9yKGxldCBuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe2NvbnN0IHM9dC5jaGlsZHJlbltuXTt0aGlzLmFkZChzLmNsb25lKCkpfXJldHVybiB0aGlzfX1QZS5ERUZBVUxUX1VQPW5ldyBUKDAsMSwwKSxQZS5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURT0hMCxQZS5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURT0hMDtjb25zdCBoZT1uZXcgVCxFZT1uZXcgVCxwbz1uZXcgVCxDZT1uZXcgVCxVbj1uZXcgVCxWbj1uZXcgVCxGYz1uZXcgVCx5bz1uZXcgVCxtbz1uZXcgVCxnbz1uZXcgVCx4bz1uZXcgWXQsd289bmV3IFl0LGJvPW5ldyBZdDtjbGFzcyBldHtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQsbj1uZXcgVCl7dGhpcy5hPXQsdGhpcy5iPWUsdGhpcy5jPW59c3RhdGljIGdldE5vcm1hbCh0LGUsbixzKXtzLnN1YlZlY3RvcnMobixlKSxoZS5zdWJWZWN0b3JzKHQsZSkscy5jcm9zcyhoZSk7Y29uc3Qgcj1zLmxlbmd0aFNxKCk7cmV0dXJuIHI+MD9zLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHIpKTpzLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZCh0LGUsbixzLHIpe2hlLnN1YlZlY3RvcnMocyxlKSxFZS5zdWJWZWN0b3JzKG4sZSkscG8uc3ViVmVjdG9ycyh0LGUpO2NvbnN0IG89aGUuZG90KGhlKSxhPWhlLmRvdChFZSksYz1oZS5kb3QocG8pLGw9RWUuZG90KEVlKSxoPUVlLmRvdChwbyksdT1vKmwtYSphO2lmKHU9PT0wKXJldHVybiByLnNldCgwLDAsMCksbnVsbDtjb25zdCBmPTEvdSxkPShsKmMtYSpoKSpmLHA9KG8qaC1hKmMpKmY7cmV0dXJuIHIuc2V0KDEtZC1wLHAsZCl9c3RhdGljIGNvbnRhaW5zUG9pbnQodCxlLG4scyl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLHMsQ2UpPT09bnVsbD8hMTpDZS54Pj0wJiZDZS55Pj0wJiZDZS54K0NlLnk8PTF9c3RhdGljIGdldEludGVycG9sYXRpb24odCxlLG4scyxyLG8sYSxjKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLG4scyxDZSk9PT1udWxsPyhjLng9MCxjLnk9MCwieiJpbiBjJiYoYy56PTApLCJ3ImluIGMmJihjLnc9MCksbnVsbCk6KGMuc2V0U2NhbGFyKDApLGMuYWRkU2NhbGVkVmVjdG9yKHIsQ2UueCksYy5hZGRTY2FsZWRWZWN0b3IobyxDZS55KSxjLmFkZFNjYWxlZFZlY3RvcihhLENlLnopLGMpfXN0YXRpYyBnZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUodCxlLG4scyxyLG8pe3JldHVybiB4by5zZXRTY2FsYXIoMCksd28uc2V0U2NhbGFyKDApLGJvLnNldFNjYWxhcigwKSx4by5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksd28uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLGJvLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSxvLnNldFNjYWxhcigwKSxvLmFkZFNjYWxlZFZlY3Rvcih4byxyLngpLG8uYWRkU2NhbGVkVmVjdG9yKHdvLHIueSksby5hZGRTY2FsZWRWZWN0b3IoYm8sci56KSxvfXN0YXRpYyBpc0Zyb250RmFjaW5nKHQsZSxuLHMpe3JldHVybiBoZS5zdWJWZWN0b3JzKG4sZSksRWUuc3ViVmVjdG9ycyh0LGUpLGhlLmNyb3NzKEVlKS5kb3Qocyk8MH1zZXQodCxlLG4pe3JldHVybiB0aGlzLmEuY29weSh0KSx0aGlzLmIuY29weShlKSx0aGlzLmMuY29weShuKSx0aGlzfXNldEZyb21Qb2ludHNBbmRJbmRpY2VzKHQsZSxuLHMpe3JldHVybiB0aGlzLmEuY29weSh0W2VdKSx0aGlzLmIuY29weSh0W25dKSx0aGlzLmMuY29weSh0W3NdKSx0aGlzfXNldEZyb21BdHRyaWJ1dGVBbmRJbmRpY2VzKHQsZSxuLHMpe3JldHVybiB0aGlzLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLHRoaXMuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbiksdGhpcy5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmEuY29weSh0LmEpLHRoaXMuYi5jb3B5KHQuYiksdGhpcy5jLmNvcHkodC5jKSx0aGlzfWdldEFyZWEoKXtyZXR1cm4gaGUuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKSxFZS5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLGhlLmNyb3NzKEVlKS5sZW5ndGgoKSouNX1nZXRNaWRwb2ludCh0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9Z2V0Tm9ybWFsKHQpe3JldHVybiBldC5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9Z2V0UGxhbmUodCl7cmV0dXJuIHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1nZXRCYXJ5Y29vcmQodCxlKXtyZXR1cm4gZXQuZ2V0QmFyeWNvb3JkKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9Z2V0SW50ZXJwb2xhdGlvbih0LGUsbixzLHIpe3JldHVybiBldC5nZXRJbnRlcnBvbGF0aW9uKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxuLHMscil9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gZXQuY29udGFpbnNQb2ludCh0LHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1pc0Zyb250RmFjaW5nKHQpe3JldHVybiBldC5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHQpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1RyaWFuZ2xlKHRoaXMpfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuYSxzPXRoaXMuYixyPXRoaXMuYztsZXQgbyxhO1VuLnN1YlZlY3RvcnMocyxuKSxWbi5zdWJWZWN0b3JzKHIsbikseW8uc3ViVmVjdG9ycyh0LG4pO2NvbnN0IGM9VW4uZG90KHlvKSxsPVZuLmRvdCh5byk7aWYoYzw9MCYmbDw9MClyZXR1cm4gZS5jb3B5KG4pO21vLnN1YlZlY3RvcnModCxzKTtjb25zdCBoPVVuLmRvdChtbyksdT1Wbi5kb3QobW8pO2lmKGg+PTAmJnU8PWgpcmV0dXJuIGUuY29weShzKTtjb25zdCBmPWMqdS1oKmw7aWYoZjw9MCYmYz49MCYmaDw9MClyZXR1cm4gbz1jLyhjLWgpLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoVW4sbyk7Z28uc3ViVmVjdG9ycyh0LHIpO2NvbnN0IGQ9VW4uZG90KGdvKSxwPVZuLmRvdChnbyk7aWYocD49MCYmZDw9cClyZXR1cm4gZS5jb3B5KHIpO2NvbnN0IHk9ZCpsLWMqcDtpZih5PD0wJiZsPj0wJiZwPD0wKXJldHVybiBhPWwvKGwtcCksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihWbixhKTtjb25zdCBtPWgqcC1kKnU7aWYobTw9MCYmdS1oPj0wJiZkLXA+PTApcmV0dXJuIEZjLnN1YlZlY3RvcnMocixzKSxhPSh1LWgpLyh1LWgrKGQtcCkpLGUuY29weShzKS5hZGRTY2FsZWRWZWN0b3IoRmMsYSk7Y29uc3QgZz0xLyhtK3krZik7cmV0dXJuIG89eSpnLGE9ZipnLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoVW4sbykuYWRkU2NhbGVkVmVjdG9yKFZuLGEpfWVxdWFscyh0KXtyZXR1cm4gdC5hLmVxdWFscyh0aGlzLmEpJiZ0LmIuZXF1YWxzKHRoaXMuYikmJnQuYy5lcXVhbHModGhpcy5jKX19Y29uc3QgSWM9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0sUWU9e2g6MCxzOjAsbDowfSxwcz17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIE1vKGksdCxlKXtyZXR1cm4gZTwwJiYoZSs9MSksZT4xJiYoZS09MSksZTwxLzY/aSsodC1pKSo2KmU6ZTwxLzI/dDplPDIvMz9pKyh0LWkpKjYqKDIvMy1lKTppfWxldCB5cz1jbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbil7cmV0dXJuIHRoaXMuaXNDb2xvcj0hMCx0aGlzLnI9MSx0aGlzLmc9MSx0aGlzLmI9MSx0aGlzLnNldCh0LGUsbil9c2V0KHQsZSxuKXtpZihlPT09dm9pZCAwJiZuPT09dm9pZCAwKXtjb25zdCBzPXQ7cyYmcy5pc0NvbG9yP3RoaXMuY29weShzKTp0eXBlb2Ygcz09Im51bWJlciI/dGhpcy5zZXRIZXgocyk6dHlwZW9mIHM9PSJzdHJpbmciJiZ0aGlzLnNldFN0eWxlKHMpfWVsc2UgdGhpcy5zZXRSR0IodCxlLG4pO3JldHVybiB0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPXQsdGhpcy5iPXQsdGhpc31zZXRIZXgodCxlPW9lKXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLHRoaXMucj0odD4+MTYmMjU1KS8yNTUsdGhpcy5nPSh0Pj44JjI1NSkvMjU1LHRoaXMuYj0odCYyNTUpLzI1NSxhZS50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsZSksdGhpc31zZXRSR0IodCxlLG4scz1hZS53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz1lLHRoaXMuYj1uLGFlLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxzKSx0aGlzfXNldEhTTCh0LGUsbixzPWFlLndvcmtpbmdDb2xvclNwYWNlKXtpZih0PVh1KHQsMSksZT1aKGUsMCwxKSxuPVoobiwwLDEpLGU9PT0wKXRoaXMucj10aGlzLmc9dGhpcy5iPW47ZWxzZXtjb25zdCByPW48PS41P24qKDErZSk6bitlLW4qZSxvPTIqbi1yO3RoaXMucj1NbyhvLHIsdCsxLzMpLHRoaXMuZz1NbyhvLHIsdCksdGhpcy5iPU1vKG8scix0LTEvMyl9cmV0dXJuIGFlLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxzKSx0aGlzfXNldFN0eWxlKHQsZT1vZSl7ZnVuY3Rpb24gbihyKXtyIT09dm9pZCAwJiZwYXJzZUZsb2F0KHIpPDEmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK3QrIiB3aWxsIGJlIGlnbm9yZWQuIil9bGV0IHM7aWYocz0vXihcdyspXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgcjtjb25zdCBvPXNbMV0sYT1zWzJdO3N3aXRjaChvKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZihyPS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbMV0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbMl0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbM10sMTApKS8yNTUsZSk7aWYocj0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGEpKXJldHVybiBuKHJbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDEwMCxwYXJzZUludChyWzFdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChyWzJdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChyWzNdLDEwKSkvMTAwLGUpO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKHI9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQqXC4/XGQrKVwlXHMqLFxzKihcZCpcLj9cZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRIU0wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAsZSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yIG1vZGVsICIrdCl9fWVsc2UgaWYocz0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IHI9c1sxXSxvPXIubGVuZ3RoO2lmKG89PT0zKXJldHVybiB0aGlzLnNldFJHQihwYXJzZUludChyLmNoYXJBdCgwKSwxNikvMTUscGFyc2VJbnQoci5jaGFyQXQoMSksMTYpLzE1LHBhcnNlSW50KHIuY2hhckF0KDIpLDE2KS8xNSxlKTtpZihvPT09NilyZXR1cm4gdGhpcy5zZXRIZXgocGFyc2VJbnQociwxNiksZSk7Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogSW52YWxpZCBoZXggY29sb3IgIit0KX1lbHNlIGlmKHQmJnQubGVuZ3RoPjApcmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKHQsZSk7cmV0dXJuIHRoaXN9c2V0Q29sb3JOYW1lKHQsZT1vZSl7Y29uc3Qgbj1JY1t0LnRvTG93ZXJDYXNlKCldO3JldHVybiBuIT09dm9pZCAwP3RoaXMuc2V0SGV4KG4sZSk6Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK3QpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfWNvcHkodCl7cmV0dXJuIHRoaXMucj10LnIsdGhpcy5nPXQuZyx0aGlzLmI9dC5iLHRoaXN9Y29weVNSR0JUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5yPXZlKHQuciksdGhpcy5nPXZlKHQuZyksdGhpcy5iPXZlKHQuYiksdGhpc31jb3B5TGluZWFyVG9TUkdCKHQpe3JldHVybiB0aGlzLnI9SW4odC5yKSx0aGlzLmc9SW4odC5nKSx0aGlzLmI9SW4odC5iKSx0aGlzfWNvbnZlcnRTUkdCVG9MaW5lYXIoKXtyZXR1cm4gdGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpLHRoaXN9Y29udmVydExpbmVhclRvU1JHQigpe3JldHVybiB0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyksdGhpc31nZXRIZXgodD1vZSl7cmV0dXJuIGFlLmZyb21Xb3JraW5nQ29sb3JTcGFjZShfdC5jb3B5KHRoaXMpLHQpLE1hdGgucm91bmQoWihfdC5yKjI1NSwwLDI1NSkpKjY1NTM2K01hdGgucm91bmQoWihfdC5nKjI1NSwwLDI1NSkpKjI1NitNYXRoLnJvdW5kKFooX3QuYioyNTUsMCwyNTUpKX1nZXRIZXhTdHJpbmcodD1vZSl7cmV0dXJuKCIwMDAwMDAiK3RoaXMuZ2V0SGV4KHQpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWdldEhTTCh0LGU9YWUud29ya2luZ0NvbG9yU3BhY2Upe2FlLmZyb21Xb3JraW5nQ29sb3JTcGFjZShfdC5jb3B5KHRoaXMpLGUpO2NvbnN0IG49X3QucixzPV90Lmcscj1fdC5iLG89TWF0aC5tYXgobixzLHIpLGE9TWF0aC5taW4obixzLHIpO2xldCBjLGw7Y29uc3QgaD0oYStvKS8yO2lmKGE9PT1vKWM9MCxsPTA7ZWxzZXtjb25zdCB1PW8tYTtzd2l0Y2gobD1oPD0uNT91LyhvK2EpOnUvKDItby1hKSxvKXtjYXNlIG46Yz0ocy1yKS91KyhzPHI/NjowKTticmVhaztjYXNlIHM6Yz0oci1uKS91KzI7YnJlYWs7Y2FzZSByOmM9KG4tcykvdSs0O2JyZWFrfWMvPTZ9cmV0dXJuIHQuaD1jLHQucz1sLHQubD1oLHR9Z2V0UkdCKHQsZT1hZS53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIGFlLmZyb21Xb3JraW5nQ29sb3JTcGFjZShfdC5jb3B5KHRoaXMpLGUpLHQucj1fdC5yLHQuZz1fdC5nLHQuYj1fdC5iLHR9Z2V0U3R5bGUodD1vZSl7YWUuZnJvbVdvcmtpbmdDb2xvclNwYWNlKF90LmNvcHkodGhpcyksdCk7Y29uc3QgZT1fdC5yLG49X3QuZyxzPV90LmI7cmV0dXJuIHQhPT1vZT9gY29sb3IoJHt0fSAke2UudG9GaXhlZCgzKX0gJHtuLnRvRml4ZWQoMyl9ICR7cy50b0ZpeGVkKDMpfSlgOmByZ2IoJHtNYXRoLnJvdW5kKGUqMjU1KX0sJHtNYXRoLnJvdW5kKG4qMjU1KX0sJHtNYXRoLnJvdW5kKHMqMjU1KX0pYH1vZmZzZXRIU0wodCxlLG4pe3JldHVybiB0aGlzLmdldEhTTChRZSksdGhpcy5zZXRIU0woUWUuaCt0LFFlLnMrZSxRZS5sK24pfWFkZCh0KXtyZXR1cm4gdGhpcy5yKz10LnIsdGhpcy5nKz10LmcsdGhpcy5iKz10LmIsdGhpc31hZGRDb2xvcnModCxlKXtyZXR1cm4gdGhpcy5yPXQucitlLnIsdGhpcy5nPXQuZytlLmcsdGhpcy5iPXQuYitlLmIsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMucis9dCx0aGlzLmcrPXQsdGhpcy5iKz10LHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItdC5yKSx0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctdC5nKSx0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItdC5iKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLnIqPXQucix0aGlzLmcqPXQuZyx0aGlzLmIqPXQuYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLnIqPXQsdGhpcy5nKj10LHRoaXMuYio9dCx0aGlzfWxlcnAodCxlKXtyZXR1cm4gdGhpcy5yKz0odC5yLXRoaXMucikqZSx0aGlzLmcrPSh0LmctdGhpcy5nKSplLHRoaXMuYis9KHQuYi10aGlzLmIpKmUsdGhpc31sZXJwQ29sb3JzKHQsZSxuKXtyZXR1cm4gdGhpcy5yPXQucisoZS5yLXQucikqbix0aGlzLmc9dC5nKyhlLmctdC5nKSpuLHRoaXMuYj10LmIrKGUuYi10LmIpKm4sdGhpc31sZXJwSFNMKHQsZSl7dGhpcy5nZXRIU0woUWUpLHQuZ2V0SFNMKHBzKTtjb25zdCBuPWVvKFFlLmgscHMuaCxlKSxzPWVvKFFlLnMscHMucyxlKSxyPWVvKFFlLmwscHMubCxlKTtyZXR1cm4gdGhpcy5zZXRIU0wobixzLHIpLHRoaXN9c2V0RnJvbVZlY3RvcjModCl7cmV0dXJuIHRoaXMucj10LngsdGhpcy5nPXQueSx0aGlzLmI9dC56LHRoaXN9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy5yLG49dGhpcy5nLHM9dGhpcy5iLHI9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5yPXJbMF0qZStyWzNdKm4rcls2XSpzLHRoaXMuZz1yWzFdKmUrcls0XSpuK3JbN10qcyx0aGlzLmI9clsyXSplK3JbNV0qbityWzhdKnMsdGhpc31lcXVhbHModCl7cmV0dXJuIHQucj09PXRoaXMuciYmdC5nPT09dGhpcy5nJiZ0LmI9PT10aGlzLmJ9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5yLHRbZSsxXT10aGlzLmcsdFtlKzJdPXRoaXMuYix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5yPXQuZ2V0WChlKSx0aGlzLmc9dC5nZXRZKGUpLHRoaXMuYj10LmdldFooZSksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX0qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLnIseWllbGQgdGhpcy5nLHlpZWxkIHRoaXMuYn19O2NvbnN0IF90PW5ldyB5czt5cy5OQU1FUz1JYztsZXQgaGY9MDtjbGFzcyB1ZiBleHRlbmRzIG9ze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzTWF0ZXJpYWw9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6aGYrK30pLHRoaXMudXVpZD1GbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik1hdGVyaWFsIix0aGlzLmJsZW5kaW5nPTEsdGhpcy5zaWRlPTAsdGhpcy52ZXJ0ZXhDb2xvcnM9ITEsdGhpcy5vcGFjaXR5PTEsdGhpcy50cmFuc3BhcmVudD0hMSx0aGlzLmFscGhhSGFzaD0hMSx0aGlzLmJsZW5kU3JjPTIwNCx0aGlzLmJsZW5kRHN0PTIwNSx0aGlzLmJsZW5kRXF1YXRpb249MTAwLHRoaXMuYmxlbmRTcmNBbHBoYT1udWxsLHRoaXMuYmxlbmREc3RBbHBoYT1udWxsLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPW51bGwsdGhpcy5ibGVuZENvbG9yPW5ldyB5cygwLDAsMCksdGhpcy5ibGVuZEFscGhhPTAsdGhpcy5kZXB0aEZ1bmM9Myx0aGlzLmRlcHRoVGVzdD0hMCx0aGlzLmRlcHRoV3JpdGU9ITAsdGhpcy5zdGVuY2lsV3JpdGVNYXNrPTI1NSx0aGlzLnN0ZW5jaWxGdW5jPTUxOSx0aGlzLnN0ZW5jaWxSZWY9MCx0aGlzLnN0ZW5jaWxGdW5jTWFzaz0yNTUsdGhpcy5zdGVuY2lsRmFpbD03NjgwLHRoaXMuc3RlbmNpbFpGYWlsPTc2ODAsdGhpcy5zdGVuY2lsWlBhc3M9NzY4MCx0aGlzLnN0ZW5jaWxXcml0ZT0hMSx0aGlzLmNsaXBwaW5nUGxhbmVzPW51bGwsdGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExLHRoaXMuY2xpcFNoYWRvd3M9ITEsdGhpcy5zaGFkb3dTaWRlPW51bGwsdGhpcy5jb2xvcldyaXRlPSEwLHRoaXMucHJlY2lzaW9uPW51bGwsdGhpcy5wb2x5Z29uT2Zmc2V0PSExLHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPTAsdGhpcy5kaXRoZXJpbmc9ITEsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9ITEsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9ITEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9ITEsdGhpcy5hbGxvd092ZXJyaWRlPSEwLHRoaXMudmlzaWJsZT0hMCx0aGlzLnRvbmVNYXBwZWQ9ITAsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLl9hbHBoYVRlc3Q9MH1nZXQgYWxwaGFUZXN0KCl7cmV0dXJuIHRoaXMuX2FscGhhVGVzdH1zZXQgYWxwaGFUZXN0KHQpe3RoaXMuX2FscGhhVGVzdD4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX2FscGhhVGVzdD10fW9uQmVmb3JlUmVuZGVyKCl7fW9uQmVmb3JlQ29tcGlsZSgpe31jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKXtyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKX1zZXRWYWx1ZXModCl7aWYodCE9PXZvaWQgMClmb3IoY29uc3QgZSBpbiB0KXtjb25zdCBuPXRbZV07aWYobj09PXZvaWQgMCl7Y29uc29sZS53YXJuKGBUSFJFRS5NYXRlcmlhbDogcGFyYW1ldGVyICcke2V9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmApO2NvbnRpbnVlfWNvbnN0IHM9dGhpc1tlXTtpZihzPT09dm9pZCAwKXtjb25zb2xlLndhcm4oYFRIUkVFLk1hdGVyaWFsOiAnJHtlfScgaXMgbm90IGEgcHJvcGVydHkgb2YgVEhSRUUuJHt0aGlzLnR5cGV9LmApO2NvbnRpbnVlfXMmJnMuaXNDb2xvcj9zLnNldChuKTpzJiZzLmlzVmVjdG9yMyYmbiYmbi5pc1ZlY3RvcjM/cy5jb3B5KG4pOnRoaXNbZV09bn19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO2UmJih0PXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O24udXVpZD10aGlzLnV1aWQsbi50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKG4ubmFtZT10aGlzLm5hbWUpLHRoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKG4uY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSksdGhpcy5yb3VnaG5lc3MhPT12b2lkIDAmJihuLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyksdGhpcy5tZXRhbG5lc3MhPT12b2lkIDAmJihuLm1ldGFsbmVzcz10aGlzLm1ldGFsbmVzcyksdGhpcy5zaGVlbiE9PXZvaWQgMCYmKG4uc2hlZW49dGhpcy5zaGVlbiksdGhpcy5zaGVlbkNvbG9yJiZ0aGlzLnNoZWVuQ29sb3IuaXNDb2xvciYmKG4uc2hlZW5Db2xvcj10aGlzLnNoZWVuQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hlZW5Sb3VnaG5lc3MhPT12b2lkIDAmJihuLnNoZWVuUm91Z2huZXNzPXRoaXMuc2hlZW5Sb3VnaG5lc3MpLHRoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKG4uZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSksdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PXZvaWQgMCYmdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PTEmJihuLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKG4uc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSksdGhpcy5zcGVjdWxhckludGVuc2l0eSE9PXZvaWQgMCYmKG4uc3BlY3VsYXJJbnRlbnNpdHk9dGhpcy5zcGVjdWxhckludGVuc2l0eSksdGhpcy5zcGVjdWxhckNvbG9yJiZ0aGlzLnNwZWN1bGFyQ29sb3IuaXNDb2xvciYmKG4uc3BlY3VsYXJDb2xvcj10aGlzLnNwZWN1bGFyQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hpbmluZXNzIT09dm9pZCAwJiYobi5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpLHRoaXMuY2xlYXJjb2F0IT09dm9pZCAwJiYobi5jbGVhcmNvYXQ9dGhpcy5jbGVhcmNvYXQpLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzIT09dm9pZCAwJiYobi5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MpLHRoaXMuY2xlYXJjb2F0TWFwJiZ0aGlzLmNsZWFyY29hdE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE1hcD10aGlzLmNsZWFyY29hdE1hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJnRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCYmdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXROb3JtYWxNYXA9dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5jbGVhcmNvYXROb3JtYWxTY2FsZT10aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5kaXNwZXJzaW9uIT09dm9pZCAwJiYobi5kaXNwZXJzaW9uPXRoaXMuZGlzcGVyc2lvbiksdGhpcy5pcmlkZXNjZW5jZSE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2U9dGhpcy5pcmlkZXNjZW5jZSksdGhpcy5pcmlkZXNjZW5jZUlPUiE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2VJT1I9dGhpcy5pcmlkZXNjZW5jZUlPUiksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSksdGhpcy5pcmlkZXNjZW5jZU1hcCYmdGhpcy5pcmlkZXNjZW5jZU1hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlTWFwPXRoaXMuaXJpZGVzY2VuY2VNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAmJnRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD10aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmFuaXNvdHJvcHkhPT12b2lkIDAmJihuLmFuaXNvdHJvcHk9dGhpcy5hbmlzb3Ryb3B5KSx0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiE9PXZvaWQgMCYmKG4uYW5pc290cm9weVJvdGF0aW9uPXRoaXMuYW5pc290cm9weVJvdGF0aW9uKSx0aGlzLmFuaXNvdHJvcHlNYXAmJnRoaXMuYW5pc290cm9weU1hcC5pc1RleHR1cmUmJihuLmFuaXNvdHJvcHlNYXA9dGhpcy5hbmlzb3Ryb3B5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYobi5tYXA9dGhpcy5tYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihuLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04odCkudXVpZCksdGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihuLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYobi5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTih0KS51dWlkLG4ubGlnaHRNYXBJbnRlbnNpdHk9dGhpcy5saWdodE1hcEludGVuc2l0eSksdGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihuLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKHQpLnV1aWQsbi5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KSx0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihuLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTih0KS51dWlkLG4uYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKSx0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYobi5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxuLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYobi5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKHQpLnV1aWQsbi5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG4uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpLHRoaXMucm91Z2huZXNzTWFwJiZ0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLnJvdWdobmVzc01hcD10aGlzLnJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5tZXRhbG5lc3NNYXAmJnRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSYmKG4ubWV0YWxuZXNzTWFwPXRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVtaXNzaXZlTWFwJiZ0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSYmKG4uZW1pc3NpdmVNYXA9dGhpcy5lbWlzc2l2ZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhck1hcCYmdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyTWFwPXRoaXMuc3BlY3VsYXJNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJnRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhckludGVuc2l0eU1hcD10aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyQ29sb3JNYXAmJnRoaXMuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyQ29sb3JNYXA9dGhpcy5zcGVjdWxhckNvbG9yTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobi5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKHQpLnV1aWQsdGhpcy5jb21iaW5lIT09dm9pZCAwJiYobi5jb21iaW5lPXRoaXMuY29tYmluZSkpLHRoaXMuZW52TWFwUm90YXRpb24hPT12b2lkIDAmJihuLmVudk1hcFJvdGF0aW9uPXRoaXMuZW52TWFwUm90YXRpb24udG9BcnJheSgpKSx0aGlzLmVudk1hcEludGVuc2l0eSE9PXZvaWQgMCYmKG4uZW52TWFwSW50ZW5zaXR5PXRoaXMuZW52TWFwSW50ZW5zaXR5KSx0aGlzLnJlZmxlY3Rpdml0eSE9PXZvaWQgMCYmKG4ucmVmbGVjdGl2aXR5PXRoaXMucmVmbGVjdGl2aXR5KSx0aGlzLnJlZnJhY3Rpb25SYXRpbyE9PXZvaWQgMCYmKG4ucmVmcmFjdGlvblJhdGlvPXRoaXMucmVmcmFjdGlvblJhdGlvKSx0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKG4uZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04odCkudXVpZCksdGhpcy50cmFuc21pc3Npb24hPT12b2lkIDAmJihuLnRyYW5zbWlzc2lvbj10aGlzLnRyYW5zbWlzc2lvbiksdGhpcy50cmFuc21pc3Npb25NYXAmJnRoaXMudHJhbnNtaXNzaW9uTWFwLmlzVGV4dHVyZSYmKG4udHJhbnNtaXNzaW9uTWFwPXRoaXMudHJhbnNtaXNzaW9uTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnRoaWNrbmVzcyE9PXZvaWQgMCYmKG4udGhpY2tuZXNzPXRoaXMudGhpY2tuZXNzKSx0aGlzLnRoaWNrbmVzc01hcCYmdGhpcy50aGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi50aGlja25lc3NNYXA9dGhpcy50aGlja25lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSE9PXZvaWQgMCYmdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlIT09MS8wJiYobi5hdHRlbnVhdGlvbkRpc3RhbmNlPXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksdGhpcy5hdHRlbnVhdGlvbkNvbG9yIT09dm9pZCAwJiYobi5hdHRlbnVhdGlvbkNvbG9yPXRoaXMuYXR0ZW51YXRpb25Db2xvci5nZXRIZXgoKSksdGhpcy5zaXplIT09dm9pZCAwJiYobi5zaXplPXRoaXMuc2l6ZSksdGhpcy5zaGFkb3dTaWRlIT09bnVsbCYmKG4uc2hhZG93U2lkZT10aGlzLnNoYWRvd1NpZGUpLHRoaXMuc2l6ZUF0dGVudWF0aW9uIT09dm9pZCAwJiYobi5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pLHRoaXMuYmxlbmRpbmchPT0xJiYobi5ibGVuZGluZz10aGlzLmJsZW5kaW5nKSx0aGlzLnNpZGUhPT0wJiYobi5zaWRlPXRoaXMuc2lkZSksdGhpcy52ZXJ0ZXhDb2xvcnM9PT0hMCYmKG4udmVydGV4Q29sb3JzPSEwKSx0aGlzLm9wYWNpdHk8MSYmKG4ub3BhY2l0eT10aGlzLm9wYWNpdHkpLHRoaXMudHJhbnNwYXJlbnQ9PT0hMCYmKG4udHJhbnNwYXJlbnQ9ITApLHRoaXMuYmxlbmRTcmMhPT0yMDQmJihuLmJsZW5kU3JjPXRoaXMuYmxlbmRTcmMpLHRoaXMuYmxlbmREc3QhPT0yMDUmJihuLmJsZW5kRHN0PXRoaXMuYmxlbmREc3QpLHRoaXMuYmxlbmRFcXVhdGlvbiE9PTEwMCYmKG4uYmxlbmRFcXVhdGlvbj10aGlzLmJsZW5kRXF1YXRpb24pLHRoaXMuYmxlbmRTcmNBbHBoYSE9PW51bGwmJihuLmJsZW5kU3JjQWxwaGE9dGhpcy5ibGVuZFNyY0FscGhhKSx0aGlzLmJsZW5kRHN0QWxwaGEhPT1udWxsJiYobi5ibGVuZERzdEFscGhhPXRoaXMuYmxlbmREc3RBbHBoYSksdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEhPT1udWxsJiYobi5ibGVuZEVxdWF0aW9uQWxwaGE9dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEpLHRoaXMuYmxlbmRDb2xvciYmdGhpcy5ibGVuZENvbG9yLmlzQ29sb3ImJihuLmJsZW5kQ29sb3I9dGhpcy5ibGVuZENvbG9yLmdldEhleCgpKSx0aGlzLmJsZW5kQWxwaGEhPT0wJiYobi5ibGVuZEFscGhhPXRoaXMuYmxlbmRBbHBoYSksdGhpcy5kZXB0aEZ1bmMhPT0zJiYobi5kZXB0aEZ1bmM9dGhpcy5kZXB0aEZ1bmMpLHRoaXMuZGVwdGhUZXN0PT09ITEmJihuLmRlcHRoVGVzdD10aGlzLmRlcHRoVGVzdCksdGhpcy5kZXB0aFdyaXRlPT09ITEmJihuLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFdyaXRlKSx0aGlzLmNvbG9yV3JpdGU9PT0hMSYmKG4uY29sb3JXcml0ZT10aGlzLmNvbG9yV3JpdGUpLHRoaXMuc3RlbmNpbFdyaXRlTWFzayE9PTI1NSYmKG4uc3RlbmNpbFdyaXRlTWFzaz10aGlzLnN0ZW5jaWxXcml0ZU1hc2spLHRoaXMuc3RlbmNpbEZ1bmMhPT01MTkmJihuLnN0ZW5jaWxGdW5jPXRoaXMuc3RlbmNpbEZ1bmMpLHRoaXMuc3RlbmNpbFJlZiE9PTAmJihuLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmKSx0aGlzLnN0ZW5jaWxGdW5jTWFzayE9PTI1NSYmKG4uc3RlbmNpbEZ1bmNNYXNrPXRoaXMuc3RlbmNpbEZ1bmNNYXNrKSx0aGlzLnN0ZW5jaWxGYWlsIT09NzY4MCYmKG4uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbCksdGhpcy5zdGVuY2lsWkZhaWwhPT03NjgwJiYobi5zdGVuY2lsWkZhaWw9dGhpcy5zdGVuY2lsWkZhaWwpLHRoaXMuc3RlbmNpbFpQYXNzIT09NzY4MCYmKG4uc3RlbmNpbFpQYXNzPXRoaXMuc3RlbmNpbFpQYXNzKSx0aGlzLnN0ZW5jaWxXcml0ZT09PSEwJiYobi5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGUpLHRoaXMucm90YXRpb24hPT12b2lkIDAmJnRoaXMucm90YXRpb24hPT0wJiYobi5yb3RhdGlvbj10aGlzLnJvdGF0aW9uKSx0aGlzLnBvbHlnb25PZmZzZXQ9PT0hMCYmKG4ucG9seWdvbk9mZnNldD0hMCksdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yIT09MCYmKG4ucG9seWdvbk9mZnNldEZhY3Rvcj10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IpLHRoaXMucG9seWdvbk9mZnNldFVuaXRzIT09MCYmKG4ucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldFVuaXRzKSx0aGlzLmxpbmV3aWR0aCE9PXZvaWQgMCYmdGhpcy5saW5ld2lkdGghPT0xJiYobi5saW5ld2lkdGg9dGhpcy5saW5ld2lkdGgpLHRoaXMuZGFzaFNpemUhPT12b2lkIDAmJihuLmRhc2hTaXplPXRoaXMuZGFzaFNpemUpLHRoaXMuZ2FwU2l6ZSE9PXZvaWQgMCYmKG4uZ2FwU2l6ZT10aGlzLmdhcFNpemUpLHRoaXMuc2NhbGUhPT12b2lkIDAmJihuLnNjYWxlPXRoaXMuc2NhbGUpLHRoaXMuZGl0aGVyaW5nPT09ITAmJihuLmRpdGhlcmluZz0hMCksdGhpcy5hbHBoYVRlc3Q+MCYmKG4uYWxwaGFUZXN0PXRoaXMuYWxwaGFUZXN0KSx0aGlzLmFscGhhSGFzaD09PSEwJiYobi5hbHBoYUhhc2g9ITApLHRoaXMuYWxwaGFUb0NvdmVyYWdlPT09ITAmJihuLmFscGhhVG9Db3ZlcmFnZT0hMCksdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9PT0hMCYmKG4ucHJlbXVsdGlwbGllZEFscGhhPSEwKSx0aGlzLmZvcmNlU2luZ2xlUGFzcz09PSEwJiYobi5mb3JjZVNpbmdsZVBhc3M9ITApLHRoaXMud2lyZWZyYW1lPT09ITAmJihuLndpcmVmcmFtZT0hMCksdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg+MSYmKG4ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKSx0aGlzLndpcmVmcmFtZUxpbmVjYXAhPT0icm91bmQiJiYobi53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCksdGhpcy53aXJlZnJhbWVMaW5lam9pbiE9PSJyb3VuZCImJihuLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pLHRoaXMuZmxhdFNoYWRpbmc9PT0hMCYmKG4uZmxhdFNoYWRpbmc9ITApLHRoaXMudmlzaWJsZT09PSExJiYobi52aXNpYmxlPSExKSx0aGlzLnRvbmVNYXBwZWQ9PT0hMSYmKG4udG9uZU1hcHBlZD0hMSksdGhpcy5mb2c9PT0hMSYmKG4uZm9nPSExKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSk7ZnVuY3Rpb24gcyhyKXtjb25zdCBvPVtdO2Zvcihjb25zdCBhIGluIHIpe2NvbnN0IGM9clthXTtkZWxldGUgYy5tZXRhZGF0YSxvLnB1c2goYyl9cmV0dXJuIG99aWYoZSl7Y29uc3Qgcj1zKHQudGV4dHVyZXMpLG89cyh0LmltYWdlcyk7ci5sZW5ndGg+MCYmKG4udGV4dHVyZXM9ciksby5sZW5ndGg+MCYmKG4uaW1hZ2VzPW8pfXJldHVybiBufWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMubmFtZT10Lm5hbWUsdGhpcy5ibGVuZGluZz10LmJsZW5kaW5nLHRoaXMuc2lkZT10LnNpZGUsdGhpcy52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnMsdGhpcy5vcGFjaXR5PXQub3BhY2l0eSx0aGlzLnRyYW5zcGFyZW50PXQudHJhbnNwYXJlbnQsdGhpcy5ibGVuZFNyYz10LmJsZW5kU3JjLHRoaXMuYmxlbmREc3Q9dC5ibGVuZERzdCx0aGlzLmJsZW5kRXF1YXRpb249dC5ibGVuZEVxdWF0aW9uLHRoaXMuYmxlbmRTcmNBbHBoYT10LmJsZW5kU3JjQWxwaGEsdGhpcy5ibGVuZERzdEFscGhhPXQuYmxlbmREc3RBbHBoYSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT10LmJsZW5kRXF1YXRpb25BbHBoYSx0aGlzLmJsZW5kQ29sb3IuY29weSh0LmJsZW5kQ29sb3IpLHRoaXMuYmxlbmRBbHBoYT10LmJsZW5kQWxwaGEsdGhpcy5kZXB0aEZ1bmM9dC5kZXB0aEZ1bmMsdGhpcy5kZXB0aFRlc3Q9dC5kZXB0aFRlc3QsdGhpcy5kZXB0aFdyaXRlPXQuZGVwdGhXcml0ZSx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9dC5zdGVuY2lsV3JpdGVNYXNrLHRoaXMuc3RlbmNpbEZ1bmM9dC5zdGVuY2lsRnVuYyx0aGlzLnN0ZW5jaWxSZWY9dC5zdGVuY2lsUmVmLHRoaXMuc3RlbmNpbEZ1bmNNYXNrPXQuc3RlbmNpbEZ1bmNNYXNrLHRoaXMuc3RlbmNpbEZhaWw9dC5zdGVuY2lsRmFpbCx0aGlzLnN0ZW5jaWxaRmFpbD10LnN0ZW5jaWxaRmFpbCx0aGlzLnN0ZW5jaWxaUGFzcz10LnN0ZW5jaWxaUGFzcyx0aGlzLnN0ZW5jaWxXcml0ZT10LnN0ZW5jaWxXcml0ZTtjb25zdCBlPXQuY2xpcHBpbmdQbGFuZXM7bGV0IG49bnVsbDtpZihlIT09bnVsbCl7Y29uc3Qgcz1lLmxlbmd0aDtuPW5ldyBBcnJheShzKTtmb3IobGV0IHI9MDtyIT09czsrK3IpbltyXT1lW3JdLmNsb25lKCl9cmV0dXJuIHRoaXMuY2xpcHBpbmdQbGFuZXM9bix0aGlzLmNsaXBJbnRlcnNlY3Rpb249dC5jbGlwSW50ZXJzZWN0aW9uLHRoaXMuY2xpcFNoYWRvd3M9dC5jbGlwU2hhZG93cyx0aGlzLnNoYWRvd1NpZGU9dC5zaGFkb3dTaWRlLHRoaXMuY29sb3JXcml0ZT10LmNvbG9yV3JpdGUsdGhpcy5wcmVjaXNpb249dC5wcmVjaXNpb24sdGhpcy5wb2x5Z29uT2Zmc2V0PXQucG9seWdvbk9mZnNldCx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9dC5wb2x5Z29uT2Zmc2V0RmFjdG9yLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPXQucG9seWdvbk9mZnNldFVuaXRzLHRoaXMuZGl0aGVyaW5nPXQuZGl0aGVyaW5nLHRoaXMuYWxwaGFUZXN0PXQuYWxwaGFUZXN0LHRoaXMuYWxwaGFIYXNoPXQuYWxwaGFIYXNoLHRoaXMuYWxwaGFUb0NvdmVyYWdlPXQuYWxwaGFUb0NvdmVyYWdlLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPXQucHJlbXVsdGlwbGllZEFscGhhLHRoaXMuZm9yY2VTaW5nbGVQYXNzPXQuZm9yY2VTaW5nbGVQYXNzLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy50b25lTWFwcGVkPXQudG9uZU1hcHBlZCx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK319Y2xhc3MgZmYgZXh0ZW5kcyB1Zntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5cygxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuZW52TWFwUm90YXRpb249bmV3IGJpLHRoaXMuY29tYmluZT0wLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLnNwZWN1bGFyTWFwPXQuc3BlY3VsYXJNYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZW52TWFwPXQuZW52TWFwLHRoaXMuZW52TWFwUm90YXRpb24uY29weSh0LmVudk1hcFJvdGF0aW9uKSx0aGlzLmNvbWJpbmU9dC5jb21iaW5lLHRoaXMucmVmbGVjdGl2aXR5PXQucmVmbGVjdGl2aXR5LHRoaXMucmVmcmFjdGlvblJhdGlvPXQucmVmcmFjdGlvblJhdGlvLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNvbnN0IHB0PW5ldyBULG1zPW5ldyBSO2xldCBkZj0wO2NsYXNzIHh0e2NvbnN0cnVjdG9yKHQsZSxuPSExKXtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7dGhpcy5pc0J1ZmZlckF0dHJpYnV0ZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpkZisrfSksdGhpcy5uYW1lPSIiLHRoaXMuYXJyYXk9dCx0aGlzLml0ZW1TaXplPWUsdGhpcy5jb3VudD10IT09dm9pZCAwP3QubGVuZ3RoL2U6MCx0aGlzLm5vcm1hbGl6ZWQ9bix0aGlzLnVzYWdlPTM1MDQ0LHRoaXMudXBkYXRlUmFuZ2VzPVtdLHRoaXMuZ3B1VHlwZT0xMDE1LHRoaXMudmVyc2lvbj0wfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy52ZXJzaW9uKyt9c2V0VXNhZ2UodCl7cmV0dXJuIHRoaXMudXNhZ2U9dCx0aGlzfWFkZFVwZGF0ZVJhbmdlKHQsZSl7dGhpcy51cGRhdGVSYW5nZXMucHVzaCh7c3RhcnQ6dCxjb3VudDplfSl9Y2xlYXJVcGRhdGVSYW5nZXMoKXt0aGlzLnVwZGF0ZVJhbmdlcy5sZW5ndGg9MH1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuYXJyYXk9bmV3IHQuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheSksdGhpcy5pdGVtU2l6ZT10Lml0ZW1TaXplLHRoaXMuY291bnQ9dC5jb3VudCx0aGlzLm5vcm1hbGl6ZWQ9dC5ub3JtYWxpemVkLHRoaXMudXNhZ2U9dC51c2FnZSx0aGlzLmdwdVR5cGU9dC5ncHVUeXBlLHRoaXN9Y29weUF0KHQsZSxuKXt0Kj10aGlzLml0ZW1TaXplLG4qPWUuaXRlbVNpemU7Zm9yKGxldCBzPTAscj10aGlzLml0ZW1TaXplO3M8cjtzKyspdGhpcy5hcnJheVt0K3NdPWUuYXJyYXlbbitzXTtyZXR1cm4gdGhpc31jb3B5QXJyYXkodCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQpLHRoaXN9YXBwbHlNYXRyaXgzKHQpe2lmKHRoaXMuaXRlbVNpemU9PT0yKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKW1zLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxtcy5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWShlLG1zLngsbXMueSk7ZWxzZSBpZih0aGlzLml0ZW1TaXplPT09Mylmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylwdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSkscHQuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylwdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSkscHQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKXB0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxwdC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLHB0LngscHQueSxwdC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspcHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLHB0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLHB0LngscHQueSxwdC56KTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IG49dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49bWkobix0aGlzLmFycmF5KSksbn1zZXRDb21wb25lbnQodCxlLG4pe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihuPUl0KG4sdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplK2VdPW4sdGhpc31nZXRYKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1taShlLHRoaXMuYXJyYXkpKSxlfXNldFgodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1JdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV09ZSx0aGlzfWdldFkodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9bWkoZSx0aGlzLmFycmF5KSksZX1zZXRZKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV09ZSx0aGlzfWdldFoodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9bWkoZSx0aGlzLmFycmF5KSksZX1zZXRaKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl09ZSx0aGlzfWdldFcodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM107cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9bWkoZSx0aGlzLmFycmF5KSksZX1zZXRXKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM109ZSx0aGlzfXNldFhZKHQsZSxuKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPUl0KGUsdGhpcy5hcnJheSksbj1JdChuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzfXNldFhZWih0LGUsbixzKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPUl0KGUsdGhpcy5hcnJheSksbj1JdChuLHRoaXMuYXJyYXkpLHM9SXQocyx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpcy5hcnJheVt0KzJdPXMsdGhpc31zZXRYWVpXKHQsZSxuLHMscil7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT1JdChlLHRoaXMuYXJyYXkpLG49SXQobix0aGlzLmFycmF5KSxzPUl0KHMsdGhpcy5hcnJheSkscj1JdChyLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09cyx0aGlzLmFycmF5W3QrM109cix0aGlzfW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCB0PXtpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LmZyb20odGhpcy5hcnJheSksbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9O3JldHVybiB0aGlzLm5hbWUhPT0iIiYmKHQubmFtZT10aGlzLm5hbWUpLHRoaXMudXNhZ2UhPT0zNTA0NCYmKHQudXNhZ2U9dGhpcy51c2FnZSksdH19Y2xhc3MgcGYgZXh0ZW5kcyB4dHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbil9fWNsYXNzIHlmIGV4dGVuZHMgeHR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50MzJBcnJheSh0KSxlLG4pfX1jbGFzcyBCZSBleHRlbmRzIHh0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgRmxvYXQzMkFycmF5KHQpLGUsbil9fWxldCBtZj0wO2NvbnN0IGp0PW5ldyBzdCxBbz1uZXcgUGUscW49bmV3IFQsVXQ9bmV3IGd0LEFpPW5ldyBndCxidD1uZXcgVDtjbGFzcyB1ZSBleHRlbmRzIG9ze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzQnVmZmVyR2VvbWV0cnk9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6bWYrK30pLHRoaXMudXVpZD1GbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9IkJ1ZmZlckdlb21ldHJ5Iix0aGlzLmluZGV4PW51bGwsdGhpcy5pbmRpcmVjdD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dGhpcy5pbmRleD1uZXcoSnUodCk/eWY6cGYpKHQsMSk6dGhpcy5pbmRleD10LHRoaXN9c2V0SW5kaXJlY3QodCl7cmV0dXJuIHRoaXMuaW5kaXJlY3Q9dCx0aGlzfWdldEluZGlyZWN0KCl7cmV0dXJuIHRoaXMuaW5kaXJlY3R9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF19c2V0QXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XT1lLHRoaXN9ZGVsZXRlQXR0cmlidXRlKHQpe3JldHVybiBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW3RdLHRoaXN9aGFzQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF0hPT12b2lkIDB9YWRkR3JvdXAodCxlLG49MCl7dGhpcy5ncm91cHMucHVzaCh7c3RhcnQ6dCxjb3VudDplLG1hdGVyaWFsSW5kZXg6bn0pfWNsZWFyR3JvdXBzKCl7dGhpcy5ncm91cHM9W119c2V0RHJhd1JhbmdlKHQsZSl7dGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dCx0aGlzLmRyYXdSYW5nZS5jb3VudD1lfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtlIT09dm9pZCAwJiYoZS5hcHBseU1hdHJpeDQodCksZS5uZWVkc1VwZGF0ZT0hMCk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2lmKG4hPT12b2lkIDApe2NvbnN0IHI9bmV3IGdlKCkuZ2V0Tm9ybWFsTWF0cml4KHQpO24uYXBwbHlOb3JtYWxNYXRyaXgociksbi5uZWVkc1VwZGF0ZT0hMH1jb25zdCBzPXRoaXMuYXR0cmlidXRlcy50YW5nZW50O3JldHVybiBzIT09dm9pZCAwJiYocy50cmFuc2Zvcm1EaXJlY3Rpb24odCkscy5uZWVkc1VwZGF0ZT0hMCksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ1NwaGVyZSE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpc31hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIGp0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIGp0Lm1ha2VSb3RhdGlvblgodCksdGhpcy5hcHBseU1hdHJpeDQoanQpLHRoaXN9cm90YXRlWSh0KXtyZXR1cm4ganQubWFrZVJvdGF0aW9uWSh0KSx0aGlzLmFwcGx5TWF0cml4NChqdCksdGhpc31yb3RhdGVaKHQpe3JldHVybiBqdC5tYWtlUm90YXRpb25aKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfXRyYW5zbGF0ZSh0LGUsbil7cmV0dXJuIGp0Lm1ha2VUcmFuc2xhdGlvbih0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoanQpLHRoaXN9c2NhbGUodCxlLG4pe3JldHVybiBqdC5tYWtlU2NhbGUodCxlLG4pLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfWxvb2tBdCh0KXtyZXR1cm4gQW8ubG9va0F0KHQpLEFvLnVwZGF0ZU1hdHJpeCgpLHRoaXMuYXBwbHlNYXRyaXg0KEFvLm1hdHJpeCksdGhpc31jZW50ZXIoKXtyZXR1cm4gdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihxbikubmVnYXRlKCksdGhpcy50cmFuc2xhdGUocW4ueCxxbi55LHFuLnopLHRoaXN9c2V0RnJvbVBvaW50cyh0KXtjb25zdCBlPXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKGU9PT12b2lkIDApe2NvbnN0IG49W107Zm9yKGxldCBzPTAscj10Lmxlbmd0aDtzPHI7cysrKXtjb25zdCBvPXRbc107bi5wdXNoKG8ueCxvLnksby56fHwwKX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBCZShuLDMpKX1lbHNle2NvbnN0IG49TWF0aC5taW4odC5sZW5ndGgsZS5jb3VudCk7Zm9yKGxldCBzPTA7czxuO3MrKyl7Y29uc3Qgcj10W3NdO2Uuc2V0WFlaKHMsci54LHIueSxyLnp8fDApfXQubGVuZ3RoPmUuY291bnQmJmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IEJ1ZmZlciBzaXplIHRvbyBzbWFsbCBmb3IgcG9pbnRzIGRhdGEuIFVzZSAuZGlzcG9zZSgpIGFuZCBjcmVhdGUgYSBuZXcgZ2VvbWV0cnkuIiksZS5uZWVkc1VwZGF0ZT0hMH1yZXR1cm4gdGhpc31jb21wdXRlQm91bmRpbmdCb3goKXt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IGd0KTtjb25zdCB0PXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbixlPXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHQmJnQuaXNHTEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIGJveC4iLHRoaXMpLHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBUKC0xLzAsLTEvMCwtMS8wKSxuZXcgVCgxLzAsMS8wLDEvMCkpO3JldHVybn1pZih0IT09dm9pZCAwKXtpZih0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IG49MCxzPWUubGVuZ3RoO248cztuKyspe2NvbnN0IHI9ZVtuXTtVdC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHIpLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KGJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5taW4sVXQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoYnQpLGJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5tYXgsVXQubWF4KSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoYnQpKToodGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFV0Lm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFV0Lm1heCkpfX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7KGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLngpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi55KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueikpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7dGhpcy5ib3VuZGluZ1NwaGVyZT09PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPW5ldyBhbyk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBzcGhlcmUuIix0aGlzKSx0aGlzLmJvdW5kaW5nU3BoZXJlLnNldChuZXcgVCwxLzApO3JldHVybn1pZih0KXtjb25zdCBuPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO2lmKFV0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVtyXTtBaS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGEpLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KGJ0LmFkZFZlY3RvcnMoVXQubWluLEFpLm1pbiksVXQuZXhwYW5kQnlQb2ludChidCksYnQuYWRkVmVjdG9ycyhVdC5tYXgsQWkubWF4KSxVdC5leHBhbmRCeVBvaW50KGJ0KSk6KFV0LmV4cGFuZEJ5UG9pbnQoQWkubWluKSxVdC5leHBhbmRCeVBvaW50KEFpLm1heCkpfVV0LmdldENlbnRlcihuKTtsZXQgcz0wO2ZvcihsZXQgcj0wLG89dC5jb3VudDtyPG87cisrKWJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxyKSxzPU1hdGgubWF4KHMsbi5kaXN0YW5jZVRvU3F1YXJlZChidCkpO2lmKGUpZm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPWVbcl0sYz10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2ZvcihsZXQgbD0wLGg9YS5jb3VudDtsPGg7bCsrKWJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxsKSxjJiYocW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGwpLGJ0LmFkZChxbikpLHM9TWF0aC5tYXgocyxuLmRpc3RhbmNlVG9TcXVhcmVkKGJ0KSl9dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM9TWF0aC5zcXJ0KHMpLGlzTmFOKHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9fWNvbXB1dGVUYW5nZW50cygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuYXR0cmlidXRlcztpZih0PT09bnVsbHx8ZS5wb3NpdGlvbj09PXZvaWQgMHx8ZS5ub3JtYWw9PT12b2lkIDB8fGUudXY9PT12b2lkIDApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgZmFpbGVkLiBNaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZXMgKGluZGV4LCBwb3NpdGlvbiwgbm9ybWFsIG9yIHV2KSIpO3JldHVybn1jb25zdCBuPWUucG9zaXRpb24scz1lLm5vcm1hbCxyPWUudXY7dGhpcy5oYXNBdHRyaWJ1dGUoInRhbmdlbnQiKT09PSExJiZ0aGlzLnNldEF0dHJpYnV0ZSgidGFuZ2VudCIsbmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkoNCpuLmNvdW50KSw0KSk7Y29uc3Qgbz10aGlzLmdldEF0dHJpYnV0ZSgidGFuZ2VudCIpLGE9W10sYz1bXTtmb3IobGV0IHY9MDt2PG4uY291bnQ7disrKWFbdl09bmV3IFQsY1t2XT1uZXcgVDtjb25zdCBsPW5ldyBULGg9bmV3IFQsdT1uZXcgVCxmPW5ldyBSLGQ9bmV3IFIscD1uZXcgUix5PW5ldyBULG09bmV3IFQ7ZnVuY3Rpb24gZyh2LFAseil7bC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sdiksaC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sUCksdS5mcm9tQnVmZmVyQXR0cmlidXRlKG4seiksZi5mcm9tQnVmZmVyQXR0cmlidXRlKHIsdiksZC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsUCkscC5mcm9tQnVmZmVyQXR0cmlidXRlKHIseiksaC5zdWIobCksdS5zdWIobCksZC5zdWIoZikscC5zdWIoZik7Y29uc3QgUz0xLyhkLngqcC55LXAueCpkLnkpO2lzRmluaXRlKFMpJiYoeS5jb3B5KGgpLm11bHRpcGx5U2NhbGFyKHAueSkuYWRkU2NhbGVkVmVjdG9yKHUsLWQueSkubXVsdGlwbHlTY2FsYXIoUyksbS5jb3B5KHUpLm11bHRpcGx5U2NhbGFyKGQueCkuYWRkU2NhbGVkVmVjdG9yKGgsLXAueCkubXVsdGlwbHlTY2FsYXIoUyksYVt2XS5hZGQoeSksYVtQXS5hZGQoeSksYVt6XS5hZGQoeSksY1t2XS5hZGQobSksY1tQXS5hZGQobSksY1t6XS5hZGQobSkpfWxldCBiPXRoaXMuZ3JvdXBzO2IubGVuZ3RoPT09MCYmKGI9W3tzdGFydDowLGNvdW50OnQuY291bnR9XSk7Zm9yKGxldCB2PTAsUD1iLmxlbmd0aDt2PFA7Kyt2KXtjb25zdCB6PWJbdl0sUz16LnN0YXJ0LEM9ei5jb3VudDtmb3IobGV0IEU9UyxGPVMrQztFPEY7RSs9MylnKHQuZ2V0WChFKzApLHQuZ2V0WChFKzEpLHQuZ2V0WChFKzIpKX1jb25zdCB3PW5ldyBULHg9bmV3IFQsTT1uZXcgVCxBPW5ldyBUO2Z1bmN0aW9uIF8odil7TS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsdiksQS5jb3B5KE0pO2NvbnN0IFA9YVt2XTt3LmNvcHkoUCksdy5zdWIoTS5tdWx0aXBseVNjYWxhcihNLmRvdChQKSkpLm5vcm1hbGl6ZSgpLHguY3Jvc3NWZWN0b3JzKEEsUCk7Y29uc3QgUz14LmRvdChjW3ZdKTwwPy0xOjE7by5zZXRYWVpXKHYsdy54LHcueSx3LnosUyl9Zm9yKGxldCB2PTAsUD1iLmxlbmd0aDt2PFA7Kyt2KXtjb25zdCB6PWJbdl0sUz16LnN0YXJ0LEM9ei5jb3VudDtmb3IobGV0IEU9UyxGPVMrQztFPEY7RSs9MylfKHQuZ2V0WChFKzApKSxfKHQuZ2V0WChFKzEpKSxfKHQuZ2V0WChFKzIpKX19Y29tcHV0ZVZlcnRleE5vcm1hbHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlIT09dm9pZCAwKXtsZXQgbj10aGlzLmdldEF0dHJpYnV0ZSgibm9ybWFsIik7aWYobj09PXZvaWQgMCluPW5ldyB4dChuZXcgRmxvYXQzMkFycmF5KGUuY291bnQqMyksMyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbik7ZWxzZSBmb3IobGV0IGY9MCxkPW4uY291bnQ7ZjxkO2YrKyluLnNldFhZWihmLDAsMCwwKTtjb25zdCBzPW5ldyBULHI9bmV3IFQsbz1uZXcgVCxhPW5ldyBULGM9bmV3IFQsbD1uZXcgVCxoPW5ldyBULHU9bmV3IFQ7aWYodClmb3IobGV0IGY9MCxkPXQuY291bnQ7ZjxkO2YrPTMpe2NvbnN0IHA9dC5nZXRYKGYrMCkseT10LmdldFgoZisxKSxtPXQuZ2V0WChmKzIpO3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHApLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHkpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG0pLGguc3ViVmVjdG9ycyhvLHIpLHUuc3ViVmVjdG9ycyhzLHIpLGguY3Jvc3ModSksYS5mcm9tQnVmZmVyQXR0cmlidXRlKG4scCksYy5mcm9tQnVmZmVyQXR0cmlidXRlKG4seSksbC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sbSksYS5hZGQoaCksYy5hZGQoaCksbC5hZGQoaCksbi5zZXRYWVoocCxhLngsYS55LGEueiksbi5zZXRYWVooeSxjLngsYy55LGMueiksbi5zZXRYWVoobSxsLngsbC55LGwueil9ZWxzZSBmb3IobGV0IGY9MCxkPWUuY291bnQ7ZjxkO2YrPTMpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZiswKSxyLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxmKzEpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYrMiksaC5zdWJWZWN0b3JzKG8sciksdS5zdWJWZWN0b3JzKHMsciksaC5jcm9zcyh1KSxuLnNldFhZWihmKzAsaC54LGgueSxoLnopLG4uc2V0WFlaKGYrMSxoLngsaC55LGgueiksbi5zZXRYWVooZisyLGgueCxoLnksaC56KTt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKSxuLm5lZWRzVXBkYXRlPSEwfX1ub3JtYWxpemVOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2ZvcihsZXQgZT0wLG49dC5jb3VudDtlPG47ZSsrKWJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxidC5ub3JtYWxpemUoKSx0LnNldFhZWihlLGJ0LngsYnQueSxidC56KX10b05vbkluZGV4ZWQoKXtmdW5jdGlvbiB0KGEsYyl7Y29uc3QgbD1hLmFycmF5LGg9YS5pdGVtU2l6ZSx1PWEubm9ybWFsaXplZCxmPW5ldyBsLmNvbnN0cnVjdG9yKGMubGVuZ3RoKmgpO2xldCBkPTAscD0wO2ZvcihsZXQgeT0wLG09Yy5sZW5ndGg7eTxtO3krKyl7YS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2Q9Y1t5XSphLmRhdGEuc3RyaWRlK2Eub2Zmc2V0OmQ9Y1t5XSpoO2ZvcihsZXQgZz0wO2c8aDtnKyspZltwKytdPWxbZCsrXX1yZXR1cm4gbmV3IHh0KGYsaCx1KX1pZih0aGlzLmluZGV4PT09bnVsbClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogQnVmZmVyR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO2NvbnN0IGU9bmV3IHVlLG49dGhpcy5pbmRleC5hcnJheSxzPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgYSBpbiBzKXtjb25zdCBjPXNbYV0sbD10KGMsbik7ZS5zZXRBdHRyaWJ1dGUoYSxsKX1jb25zdCByPXRoaXMubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBhIGluIHIpe2NvbnN0IGM9W10sbD1yW2FdO2ZvcihsZXQgaD0wLHU9bC5sZW5ndGg7aDx1O2grKyl7Y29uc3QgZj1sW2hdLGQ9dChmLG4pO2MucHVzaChkKX1lLm1vcnBoQXR0cmlidXRlc1thXT1jfWUubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXRoaXMuZ3JvdXBzO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKyl7Y29uc3QgbD1vW2FdO2UuYWRkR3JvdXAobC5zdGFydCxsLmNvdW50LGwubWF0ZXJpYWxJbmRleCl9cmV0dXJuIGV9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC42LHR5cGU6IkJ1ZmZlckdlb21ldHJ5IixnZW5lcmF0b3I6IkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiJ9fTtpZih0LnV1aWQ9dGhpcy51dWlkLHQudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJih0Lm5hbWU9dGhpcy5uYW1lKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHQudXNlckRhdGE9dGhpcy51c2VyRGF0YSksdGhpcy5wYXJhbWV0ZXJzIT09dm9pZCAwKXtjb25zdCBjPXRoaXMucGFyYW1ldGVycztmb3IoY29uc3QgbCBpbiBjKWNbbF0hPT12b2lkIDAmJih0W2xdPWNbbF0pO3JldHVybiB0fXQuZGF0YT17YXR0cmlidXRlczp7fX07Y29uc3QgZT10aGlzLmluZGV4O2UhPT1udWxsJiYodC5kYXRhLmluZGV4PXt0eXBlOmUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmFycmF5KX0pO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBjIGluIG4pe2NvbnN0IGw9bltjXTt0LmRhdGEuYXR0cmlidXRlc1tjXT1sLnRvSlNPTih0LmRhdGEpfWNvbnN0IHM9e307bGV0IHI9ITE7Zm9yKGNvbnN0IGMgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IGw9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbY10saD1bXTtmb3IobGV0IHU9MCxmPWwubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9bFt1XTtoLnB1c2goZC50b0pTT04odC5kYXRhKSl9aC5sZW5ndGg+MCYmKHNbY109aCxyPSEwKX1yJiYodC5kYXRhLm1vcnBoQXR0cmlidXRlcz1zLHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBvPXRoaXMuZ3JvdXBzO28ubGVuZ3RoPjAmJih0LmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobykpKTtjb25zdCBhPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGEhPT1udWxsJiYodC5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6YS5jZW50ZXIudG9BcnJheSgpLHJhZGl1czphLnJhZGl1c30pLHR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsO2NvbnN0IGU9e307dGhpcy5uYW1lPXQubmFtZTtjb25zdCBuPXQuaW5kZXg7biE9PW51bGwmJnRoaXMuc2V0SW5kZXgobi5jbG9uZSgpKTtjb25zdCBzPXQuYXR0cmlidXRlcztmb3IoY29uc3QgbCBpbiBzKXtjb25zdCBoPXNbbF07dGhpcy5zZXRBdHRyaWJ1dGUobCxoLmNsb25lKGUpKX1jb25zdCByPXQubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBsIGluIHIpe2NvbnN0IGg9W10sdT1yW2xdO2ZvcihsZXQgZj0wLGQ9dS5sZW5ndGg7ZjxkO2YrKyloLnB1c2godVtmXS5jbG9uZShlKSk7dGhpcy5tb3JwaEF0dHJpYnV0ZXNbbF09aH10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXQubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10Lmdyb3Vwcztmb3IobGV0IGw9MCxoPW8ubGVuZ3RoO2w8aDtsKyspe2NvbnN0IHU9b1tsXTt0aGlzLmFkZEdyb3VwKHUuc3RhcnQsdS5jb3VudCx1Lm1hdGVyaWFsSW5kZXgpfWNvbnN0IGE9dC5ib3VuZGluZ0JveDthIT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9YS5jbG9uZSgpKTtjb25zdCBjPXQuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGMhPT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1jLmNsb25lKCkpLHRoaXMuZHJhd1JhbmdlLnN0YXJ0PXQuZHJhd1JhbmdlLnN0YXJ0LHRoaXMuZHJhd1JhbmdlLmNvdW50PXQuZHJhd1JhbmdlLmNvdW50LHRoaXMudXNlckRhdGE9dC51c2VyRGF0YSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNvbnN0IGtjPW5ldyBzdCxmbj1uZXcgdW8sZ3M9bmV3IGFvLE5jPW5ldyBULHhzPW5ldyBULHdzPW5ldyBULGJzPW5ldyBULF9vPW5ldyBULE1zPW5ldyBULFJjPW5ldyBULEFzPW5ldyBUO2NsYXNzIGdmIGV4dGVuZHMgUGV7Y29uc3RydWN0b3IodD1uZXcgdWUsZT1uZXcgZmYpe3N1cGVyKCksdGhpcy5pc01lc2g9ITAsdGhpcy50eXBlPSJNZXNoIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXZvaWQgMCx0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz12b2lkIDAsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyE9PXZvaWQgMCYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPXQubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpLHQubW9ycGhUYXJnZXREaWN0aW9uYXJ5IT09dm9pZCAwJiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpLHRoaXMubWF0ZXJpYWw9QXJyYXkuaXNBcnJheSh0Lm1hdGVyaWFsKT90Lm1hdGVyaWFsLnNsaWNlKCk6dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc311cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCBlPXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3Qgcz1lW25bMF1dO2lmKHMhPT12b2lkIDApe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1zW3JdLm5hbWV8fFN0cmluZyhyKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2FdPXJ9fX19Z2V0VmVydGV4UG9zaXRpb24odCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnkscz1uLmF0dHJpYnV0ZXMucG9zaXRpb24scj1uLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixvPW4ubW9ycGhUYXJnZXRzUmVsYXRpdmU7ZS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsdCk7Y29uc3QgYT10aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztpZihyJiZhKXtNcy5zZXQoMCwwLDApO2ZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1hW2NdLHU9cltjXTtoIT09MCYmKF9vLmZyb21CdWZmZXJBdHRyaWJ1dGUodSx0KSxvP01zLmFkZFNjYWxlZFZlY3RvcihfbyxoKTpNcy5hZGRTY2FsZWRWZWN0b3IoX28uc3ViKGUpLGgpKX1lLmFkZChNcyl9cmV0dXJuIGV9cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxzPXRoaXMubWF0ZXJpYWwscj10aGlzLm1hdHJpeFdvcmxkO3MhPT12b2lkIDAmJihuLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxncy5jb3B5KG4uYm91bmRpbmdTcGhlcmUpLGdzLmFwcGx5TWF0cml4NChyKSxmbi5jb3B5KHQucmF5KS5yZWNhc3QodC5uZWFyKSwhKGdzLmNvbnRhaW5zUG9pbnQoZm4ub3JpZ2luKT09PSExJiYoZm4uaW50ZXJzZWN0U3BoZXJlKGdzLE5jKT09PW51bGx8fGZuLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZChOYyk+eWkodC5mYXItdC5uZWFyLDIpKSkmJihrYy5jb3B5KHIpLmludmVydCgpLGZuLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChrYyksIShuLmJvdW5kaW5nQm94IT09bnVsbCYmZm4uaW50ZXJzZWN0c0JveChuLmJvdW5kaW5nQm94KT09PSExKSYmdGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnModCxlLGZuKSkpfV9jb21wdXRlSW50ZXJzZWN0aW9ucyh0LGUsbil7bGV0IHM7Y29uc3Qgcj10aGlzLmdlb21ldHJ5LG89dGhpcy5tYXRlcmlhbCxhPXIuaW5kZXgsYz1yLmF0dHJpYnV0ZXMucG9zaXRpb24sbD1yLmF0dHJpYnV0ZXMudXYsaD1yLmF0dHJpYnV0ZXMudXYxLHU9ci5hdHRyaWJ1dGVzLm5vcm1hbCxmPXIuZ3JvdXBzLGQ9ci5kcmF3UmFuZ2U7aWYoYSE9PW51bGwpaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IG09ZltwXSxnPW9bbS5tYXRlcmlhbEluZGV4XSxiPU1hdGgubWF4KG0uc3RhcnQsZC5zdGFydCksdz1NYXRoLm1pbihhLmNvdW50LE1hdGgubWluKG0uc3RhcnQrbS5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IHg9YixNPXc7eDxNO3grPTMpe2NvbnN0IEE9YS5nZXRYKHgpLF89YS5nZXRYKHgrMSksdj1hLmdldFgoeCsyKTtzPV9zKHRoaXMsZyx0LG4sbCxoLHUsQSxfLHYpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKHgvMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9bS5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4oYS5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgbT1wLGc9eTttPGc7bSs9Myl7Y29uc3QgYj1hLmdldFgobSksdz1hLmdldFgobSsxKSx4PWEuZ2V0WChtKzIpO3M9X3ModGhpcyxvLHQsbixsLGgsdSxiLHcseCkscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IobS8zKSxlLnB1c2gocykpfX1lbHNlIGlmKGMhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IG09ZltwXSxnPW9bbS5tYXRlcmlhbEluZGV4XSxiPU1hdGgubWF4KG0uc3RhcnQsZC5zdGFydCksdz1NYXRoLm1pbihjLmNvdW50LE1hdGgubWluKG0uc3RhcnQrbS5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IHg9YixNPXc7eDxNO3grPTMpe2NvbnN0IEE9eCxfPXgrMSx2PXgrMjtzPV9zKHRoaXMsZyx0LG4sbCxoLHUsQSxfLHYpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKHgvMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9bS5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4oYy5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgbT1wLGc9eTttPGc7bSs9Myl7Y29uc3QgYj1tLHc9bSsxLHg9bSsyO3M9X3ModGhpcyxvLHQsbixsLGgsdSxiLHcseCkscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IobS8zKSxlLnB1c2gocykpfX19fWZ1bmN0aW9uIHhmKGksdCxlLG4scyxyLG8sYSl7bGV0IGM7aWYodC5zaWRlPT09MT9jPW4uaW50ZXJzZWN0VHJpYW5nbGUobyxyLHMsITAsYSk6Yz1uLmludGVyc2VjdFRyaWFuZ2xlKHMscixvLHQuc2lkZT09PTAsYSksYz09PW51bGwpcmV0dXJuIG51bGw7QXMuY29weShhKSxBcy5hcHBseU1hdHJpeDQoaS5tYXRyaXhXb3JsZCk7Y29uc3QgbD1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhBcyk7cmV0dXJuIGw8ZS5uZWFyfHxsPmUuZmFyP251bGw6e2Rpc3RhbmNlOmwscG9pbnQ6QXMuY2xvbmUoKSxvYmplY3Q6aX19ZnVuY3Rpb24gX3MoaSx0LGUsbixzLHIsbyxhLGMsbCl7aS5nZXRWZXJ0ZXhQb3NpdGlvbihhLHhzKSxpLmdldFZlcnRleFBvc2l0aW9uKGMsd3MpLGkuZ2V0VmVydGV4UG9zaXRpb24obCxicyk7Y29uc3QgaD14ZihpLHQsZSxuLHhzLHdzLGJzLFJjKTtpZihoKXtjb25zdCB1PW5ldyBUO2V0LmdldEJhcnljb29yZChSYyx4cyx3cyxicyx1KSxzJiYoaC51dj1ldC5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUocyxhLGMsbCx1LG5ldyBSKSksciYmKGgudXYxPWV0LmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShyLGEsYyxsLHUsbmV3IFIpKSxvJiYoaC5ub3JtYWw9ZXQuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKG8sYSxjLGwsdSxuZXcgVCksaC5ub3JtYWwuZG90KG4uZGlyZWN0aW9uKT4wJiZoLm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSkpO2NvbnN0IGY9e2EsYjpjLGM6bCxub3JtYWw6bmV3IFQsbWF0ZXJpYWxJbmRleDowfTtldC5nZXROb3JtYWwoeHMsd3MsYnMsZi5ub3JtYWwpLGguZmFjZT1mLGguYmFyeWNvb3JkPXV9cmV0dXJuIGh9Y29uc3Qgdm89bmV3IFQsd2Y9bmV3IFQsYmY9bmV3IGdlO2NsYXNzIFNve2NvbnN0cnVjdG9yKHQ9bmV3IFQoMSwwLDApLGU9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPXQsdGhpcy5jb25zdGFudD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9ZSx0aGlzfXNldENvbXBvbmVudHModCxlLG4scyl7cmV0dXJuIHRoaXMubm9ybWFsLnNldCh0LGUsbiksdGhpcy5jb25zdGFudD1zLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PS1lLmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHModCxlLG4pe2NvbnN0IHM9dm8uc3ViVmVjdG9ycyhuLGUpLmNyb3NzKHdmLnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQocyx0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSl9aW50ZXJzZWN0TGluZSh0LGUpe2NvbnN0IG49dC5kZWx0YSh2bykscz10aGlzLm5vcm1hbC5kb3Qobik7aWYocz09PTApcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpPT09MD9lLmNvcHkodC5zdGFydCk6bnVsbDtjb25zdCByPS0odC5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL3M7cmV0dXJuIHI8MHx8cj4xP251bGw6ZS5jb3B5KHQuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihuLHIpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCksbj10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmbj4wfHxuPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBuPWV8fGJmLmdldE5vcm1hbE1hdHJpeCh0KSxzPXRoaXMuY29wbGFuYXJQb2ludCh2bykuYXBwbHlNYXRyaXg0KHQpLHI9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKG4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1zLmRvdChyKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWxldCB4ZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZT0iQ3VydmUiLHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPTIwMCx0aGlzLm5lZWRzVXBkYXRlPSExLHRoaXMuY2FjaGVBcmNMZW5ndGhzPW51bGx9Z2V0UG9pbnQoKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuIil9Z2V0UG9pbnRBdCh0LGUpe2NvbnN0IG49dGhpcy5nZXRVdG9UbWFwcGluZyh0KTtyZXR1cm4gdGhpcy5nZXRQb2ludChuLGUpfWdldFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnQobi90KSk7cmV0dXJuIGV9Z2V0U3BhY2VkUG9pbnRzKHQ9NSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPD10O24rKyllLnB1c2godGhpcy5nZXRQb2ludEF0KG4vdCkpO3JldHVybiBlfWdldExlbmd0aCgpe2NvbnN0IHQ9dGhpcy5nZXRMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19Z2V0TGVuZ3Rocyh0PXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zKXtpZih0aGlzLmNhY2hlQXJjTGVuZ3RocyYmdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoPT09dCsxJiYhdGhpcy5uZWVkc1VwZGF0ZSlyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7dGhpcy5uZWVkc1VwZGF0ZT0hMTtjb25zdCBlPVtdO2xldCBuLHM9dGhpcy5nZXRQb2ludCgwKSxyPTA7ZS5wdXNoKDApO2ZvcihsZXQgbz0xO288PXQ7bysrKW49dGhpcy5nZXRQb2ludChvL3QpLHIrPW4uZGlzdGFuY2VUbyhzKSxlLnB1c2gocikscz1uO3JldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Rocz1lLGV9dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5nZXRMZW5ndGhzKCl9Z2V0VXRvVG1hcHBpbmcodCxlPW51bGwpe2NvbnN0IG49dGhpcy5nZXRMZW5ndGhzKCk7bGV0IHM9MDtjb25zdCByPW4ubGVuZ3RoO2xldCBvO2U/bz1lOm89dCpuW3ItMV07bGV0IGE9MCxjPXItMSxsO2Zvcig7YTw9YzspaWYocz1NYXRoLmZsb29yKGErKGMtYSkvMiksbD1uW3NdLW8sbDwwKWE9cysxO2Vsc2UgaWYobD4wKWM9cy0xO2Vsc2V7Yz1zO2JyZWFrfWlmKHM9YyxuW3NdPT09bylyZXR1cm4gcy8oci0xKTtjb25zdCBoPW5bc10sZj1uW3MrMV0taCxkPShvLWgpL2Y7cmV0dXJuKHMrZCkvKHItMSl9Z2V0VGFuZ2VudCh0LGUpe2xldCBzPXQtMWUtNCxyPXQrMWUtNDtzPDAmJihzPTApLHI+MSYmKHI9MSk7Y29uc3Qgbz10aGlzLmdldFBvaW50KHMpLGE9dGhpcy5nZXRQb2ludChyKSxjPWV8fChvLmlzVmVjdG9yMj9uZXcgUjpuZXcgVCk7cmV0dXJuIGMuY29weShhKS5zdWIobykubm9ybWFsaXplKCksY31nZXRUYW5nZW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChuLGUpfWNvbXB1dGVGcmVuZXRGcmFtZXModCxlPSExKXtjb25zdCBuPW5ldyBULHM9W10scj1bXSxvPVtdLGE9bmV3IFQsYz1uZXcgc3Q7Zm9yKGxldCBkPTA7ZDw9dDtkKyspe2NvbnN0IHA9ZC90O3NbZF09dGhpcy5nZXRUYW5nZW50QXQocCxuZXcgVCl9clswXT1uZXcgVCxvWzBdPW5ldyBUO2xldCBsPU51bWJlci5NQVhfVkFMVUU7Y29uc3QgaD1NYXRoLmFicyhzWzBdLngpLHU9TWF0aC5hYnMoc1swXS55KSxmPU1hdGguYWJzKHNbMF0ueik7aDw9bCYmKGw9aCxuLnNldCgxLDAsMCkpLHU8PWwmJihsPXUsbi5zZXQoMCwxLDApKSxmPD1sJiZuLnNldCgwLDAsMSksYS5jcm9zc1ZlY3RvcnMoc1swXSxuKS5ub3JtYWxpemUoKSxyWzBdLmNyb3NzVmVjdG9ycyhzWzBdLGEpLG9bMF0uY3Jvc3NWZWN0b3JzKHNbMF0sclswXSk7Zm9yKGxldCBkPTE7ZDw9dDtkKyspe2lmKHJbZF09cltkLTFdLmNsb25lKCksb1tkXT1vW2QtMV0uY2xvbmUoKSxhLmNyb3NzVmVjdG9ycyhzW2QtMV0sc1tkXSksYS5sZW5ndGgoKT5OdW1iZXIuRVBTSUxPTil7YS5ub3JtYWxpemUoKTtjb25zdCBwPU1hdGguYWNvcyhaKHNbZC0xXS5kb3Qoc1tkXSksLTEsMSkpO3JbZF0uYXBwbHlNYXRyaXg0KGMubWFrZVJvdGF0aW9uQXhpcyhhLHApKX1vW2RdLmNyb3NzVmVjdG9ycyhzW2RdLHJbZF0pfWlmKGU9PT0hMCl7bGV0IGQ9TWF0aC5hY29zKFooclswXS5kb3Qoclt0XSksLTEsMSkpO2QvPXQsc1swXS5kb3QoYS5jcm9zc1ZlY3RvcnMoclswXSxyW3RdKSk+MCYmKGQ9LWQpO2ZvcihsZXQgcD0xO3A8PXQ7cCsrKXJbcF0uYXBwbHlNYXRyaXg0KGMubWFrZVJvdGF0aW9uQXhpcyhzW3BdLGQqcCkpLG9bcF0uY3Jvc3NWZWN0b3JzKHNbcF0scltwXSl9cmV0dXJue3RhbmdlbnRzOnMsbm9ybWFsczpyLGJpbm9ybWFsczpvfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9dC5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc310b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O3JldHVybiB0LmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyx0LnR5cGU9dGhpcy50eXBlLHR9ZnJvbUpTT04odCl7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPXQuYXJjTGVuZ3RoRGl2aXNpb25zLHRoaXN9fTtjbGFzcyB2cyBleHRlbmRzIHhle2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0xLHM9MSxyPTAsbz1NYXRoLlBJKjIsYT0hMSxjPTApe3N1cGVyKCksdGhpcy5pc0VsbGlwc2VDdXJ2ZT0hMCx0aGlzLnR5cGU9IkVsbGlwc2VDdXJ2ZSIsdGhpcy5hWD10LHRoaXMuYVk9ZSx0aGlzLnhSYWRpdXM9bix0aGlzLnlSYWRpdXM9cyx0aGlzLmFTdGFydEFuZ2xlPXIsdGhpcy5hRW5kQW5nbGU9byx0aGlzLmFDbG9ja3dpc2U9YSx0aGlzLmFSb3RhdGlvbj1jfWdldFBvaW50KHQsZT1uZXcgUil7Y29uc3Qgbj1lLHM9TWF0aC5QSSoyO2xldCByPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGU7Y29uc3Qgbz1NYXRoLmFicyhyKTxOdW1iZXIuRVBTSUxPTjtmb3IoO3I8MDspcis9cztmb3IoO3I+czspci09cztyPE51bWJlci5FUFNJTE9OJiYobz9yPTA6cj1zKSx0aGlzLmFDbG9ja3dpc2U9PT0hMCYmIW8mJihyPT09cz9yPS1zOnI9ci1zKTtjb25zdCBhPXRoaXMuYVN0YXJ0QW5nbGUrdCpyO2xldCBjPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGEpLGw9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4oYSk7aWYodGhpcy5hUm90YXRpb24hPT0wKXtjb25zdCBoPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSx1PU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxmPWMtdGhpcy5hWCxkPWwtdGhpcy5hWTtjPWYqaC1kKnUrdGhpcy5hWCxsPWYqdStkKmgrdGhpcy5hWX1yZXR1cm4gbi5zZXQoYyxsKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5hWD10aGlzLmFYLHQuYVk9dGhpcy5hWSx0LnhSYWRpdXM9dGhpcy54UmFkaXVzLHQueVJhZGl1cz10aGlzLnlSYWRpdXMsdC5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLHQuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLHQuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsdC5hUm90YXRpb249dGhpcy5hUm90YXRpb24sdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc319Y2xhc3MgTGMgZXh0ZW5kcyB2c3tjb25zdHJ1Y3Rvcih0LGUsbixzLHIsbyl7c3VwZXIodCxlLG4sbixzLHIsbyksdGhpcy5pc0FyY0N1cnZlPSEwLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiB6bygpe2xldCBpPTAsdD0wLGU9MCxuPTA7ZnVuY3Rpb24gcyhyLG8sYSxjKXtpPXIsdD1hLGU9LTMqciszKm8tMiphLWMsbj0yKnItMipvK2ErY31yZXR1cm57aW5pdENhdG11bGxSb206ZnVuY3Rpb24ocixvLGEsYyxsKXtzKG8sYSxsKihhLXIpLGwqKGMtbykpfSxpbml0Tm9udW5pZm9ybUNhdG11bGxSb206ZnVuY3Rpb24ocixvLGEsYyxsLGgsdSl7bGV0IGY9KG8tcikvbC0oYS1yKS8obCtoKSsoYS1vKS9oLGQ9KGEtbykvaC0oYy1vKS8oaCt1KSsoYy1hKS91O2YqPWgsZCo9aCxzKG8sYSxmLGQpfSxjYWxjOmZ1bmN0aW9uKHIpe2NvbnN0IG89cipyLGE9bypyO3JldHVybiBpK3QqcitlKm8rbiphfX19Y29uc3QgU3M9bmV3IFQsVG89bmV3IHpvLFBvPW5ldyB6byxFbz1uZXcgem87Y2xhc3MgT2MgZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PVtdLGU9ITEsbj0iY2VudHJpcGV0YWwiLHM9LjUpe3N1cGVyKCksdGhpcy5pc0NhdG11bGxSb21DdXJ2ZTM9ITAsdGhpcy50eXBlPSJDYXRtdWxsUm9tQ3VydmUzIix0aGlzLnBvaW50cz10LHRoaXMuY2xvc2VkPWUsdGhpcy5jdXJ2ZVR5cGU9bix0aGlzLnRlbnNpb249c31nZXRQb2ludCh0LGU9bmV3IFQpe2NvbnN0IG49ZSxzPXRoaXMucG9pbnRzLHI9cy5sZW5ndGgsbz0oci0odGhpcy5jbG9zZWQ/MDoxKSkqdDtsZXQgYT1NYXRoLmZsb29yKG8pLGM9by1hO3RoaXMuY2xvc2VkP2ErPWE+MD8wOihNYXRoLmZsb29yKE1hdGguYWJzKGEpL3IpKzEpKnI6Yz09PTAmJmE9PT1yLTEmJihhPXItMixjPTEpO2xldCBsLGg7dGhpcy5jbG9zZWR8fGE+MD9sPXNbKGEtMSklcl06KFNzLnN1YlZlY3RvcnMoc1swXSxzWzFdKS5hZGQoc1swXSksbD1Tcyk7Y29uc3QgdT1zW2Elcl0sZj1zWyhhKzEpJXJdO2lmKHRoaXMuY2xvc2VkfHxhKzI8cj9oPXNbKGErMiklcl06KFNzLnN1YlZlY3RvcnMoc1tyLTFdLHNbci0yXSkuYWRkKHNbci0xXSksaD1TcyksdGhpcy5jdXJ2ZVR5cGU9PT0iY2VudHJpcGV0YWwifHx0aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIil7Y29uc3QgZD10aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIj8uNTouMjU7bGV0IHA9TWF0aC5wb3cobC5kaXN0YW5jZVRvU3F1YXJlZCh1KSxkKSx5PU1hdGgucG93KHUuZGlzdGFuY2VUb1NxdWFyZWQoZiksZCksbT1NYXRoLnBvdyhmLmRpc3RhbmNlVG9TcXVhcmVkKGgpLGQpO3k8MWUtNCYmKHk9MSkscDwxZS00JiYocD15KSxtPDFlLTQmJihtPXkpLFRvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLngsdS54LGYueCxoLngscCx5LG0pLFBvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLnksdS55LGYueSxoLnkscCx5LG0pLEVvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLnosdS56LGYueixoLnoscCx5LG0pfWVsc2UgdGhpcy5jdXJ2ZVR5cGU9PT0iY2F0bXVsbHJvbSImJihUby5pbml0Q2F0bXVsbFJvbShsLngsdS54LGYueCxoLngsdGhpcy50ZW5zaW9uKSxQby5pbml0Q2F0bXVsbFJvbShsLnksdS55LGYueSxoLnksdGhpcy50ZW5zaW9uKSxFby5pbml0Q2F0bXVsbFJvbShsLnosdS56LGYueixoLnosdGhpcy50ZW5zaW9uKSk7cmV0dXJuIG4uc2V0KFRvLmNhbGMoYyksUG8uY2FsYyhjKSxFby5jYWxjKGMpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpcy5jbG9zZWQ9dC5jbG9zZWQsdGhpcy5jdXJ2ZVR5cGU9dC5jdXJ2ZVR5cGUsdGhpcy50ZW5zaW9uPXQudGVuc2lvbix0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHMudG9BcnJheSgpKX1yZXR1cm4gdC5jbG9zZWQ9dGhpcy5jbG9zZWQsdC5jdXJ2ZVR5cGU9dGhpcy5jdXJ2ZVR5cGUsdC50ZW5zaW9uPXRoaXMudGVuc2lvbix0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChuZXcgVCgpLmZyb21BcnJheShzKSl9cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc319ZnVuY3Rpb24gRGMoaSx0LGUsbixzKXtjb25zdCByPShuLXQpKi41LG89KHMtZSkqLjUsYT1pKmksYz1pKmE7cmV0dXJuKDIqZS0yKm4rcitvKSpjKygtMyplKzMqbi0yKnItbykqYStyKmkrZX1mdW5jdGlvbiBNZihpLHQpe2NvbnN0IGU9MS1pO3JldHVybiBlKmUqdH1mdW5jdGlvbiBBZihpLHQpe3JldHVybiAyKigxLWkpKmkqdH1mdW5jdGlvbiBfZihpLHQpe3JldHVybiBpKmkqdH1mdW5jdGlvbiBfaShpLHQsZSxuKXtyZXR1cm4gTWYoaSx0KStBZihpLGUpK19mKGksbil9ZnVuY3Rpb24gdmYoaSx0KXtjb25zdCBlPTEtaTtyZXR1cm4gZSplKmUqdH1mdW5jdGlvbiBTZihpLHQpe2NvbnN0IGU9MS1pO3JldHVybiAzKmUqZSppKnR9ZnVuY3Rpb24gemYoaSx0KXtyZXR1cm4gMyooMS1pKSppKmkqdH1mdW5jdGlvbiBUZihpLHQpe3JldHVybiBpKmkqaSp0fWZ1bmN0aW9uIHZpKGksdCxlLG4scyl7cmV0dXJuIHZmKGksdCkrU2YoaSxlKSt6ZihpLG4pK1RmKGkscyl9Y2xhc3MgQ28gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBSLGU9bmV3IFIsbj1uZXcgUixzPW5ldyBSKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlPSEwLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1zfWdldFBvaW50KHQsZT1uZXcgUil7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyLGE9dGhpcy52MztyZXR1cm4gbi5zZXQodmkodCxzLngsci54LG8ueCxhLngpLHZpKHQscy55LHIueSxvLnksYS55KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3MgJGMgZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQsbj1uZXcgVCxzPW5ldyBUKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlMz0hMCx0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bix0aGlzLnYzPXN9Z2V0UG9pbnQodCxlPW5ldyBUKXtjb25zdCBuPWUscz10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjIsYT10aGlzLnYzO3JldHVybiBuLnNldCh2aSh0LHMueCxyLngsby54LGEueCksdmkodCxzLnksci55LG8ueSxhLnkpLHZpKHQscy56LHIueixvLnosYS56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3MgQm8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBSLGU9bmV3IFIpe3N1cGVyKCksdGhpcy5pc0xpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZSIsdGhpcy52MT10LHRoaXMudjI9ZX1nZXRQb2ludCh0LGU9bmV3IFIpe2NvbnN0IG49ZTtyZXR1cm4gdD09PTE/bi5jb3B5KHRoaXMudjIpOihuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLG4ubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMudjEpKSxufWdldFBvaW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRQb2ludCh0LGUpfWdldFRhbmdlbnQodCxlPW5ldyBSKXtyZXR1cm4gZS5zdWJWZWN0b3JzKHRoaXMudjIsdGhpcy52MSkubm9ybWFsaXplKCl9Z2V0VGFuZ2VudEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCh0LGUpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBVYyBleHRlbmRzIHhle2NvbnN0cnVjdG9yKHQ9bmV3IFQsZT1uZXcgVCl7c3VwZXIoKSx0aGlzLmlzTGluZUN1cnZlMz0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiLHRoaXMudjE9dCx0aGlzLnYyPWV9Z2V0UG9pbnQodCxlPW5ldyBUKXtjb25zdCBuPWU7cmV0dXJuIHQ9PT0xP24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZT1uZXcgVCl7cmV0dXJuIGUuc3ViVmVjdG9ycyh0aGlzLnYyLHRoaXMudjEpLm5vcm1hbGl6ZSgpfWdldFRhbmdlbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFRhbmdlbnQodCxlKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgRm8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBSLGU9bmV3IFIsbj1uZXcgUil7c3VwZXIoKSx0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW59Z2V0UG9pbnQodCxlPW5ldyBSKXtjb25zdCBuPWUscz10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjI7cmV0dXJuIG4uc2V0KF9pKHQscy54LHIueCxvLngpLF9pKHQscy55LHIueSxvLnkpKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBWYyBleHRlbmRzIHhle2NvbnN0cnVjdG9yKHQ9bmV3IFQsZT1uZXcgVCxuPW5ldyBUKXtzdXBlcigpLHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgVCl7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyO3JldHVybiBuLnNldChfaSh0LHMueCxyLngsby54KSxfaSh0LHMueSxyLnksby55KSxfaSh0LHMueixyLnosby56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgSW8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMuaXNTcGxpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IlNwbGluZUN1cnZlIix0aGlzLnBvaW50cz10fWdldFBvaW50KHQsZT1uZXcgUil7Y29uc3Qgbj1lLHM9dGhpcy5wb2ludHMscj0ocy5sZW5ndGgtMSkqdCxvPU1hdGguZmxvb3IociksYT1yLW8sYz1zW289PT0wP286by0xXSxsPXNbb10saD1zW28+cy5sZW5ndGgtMj9zLmxlbmd0aC0xOm8rMV0sdT1zW28+cy5sZW5ndGgtMz9zLmxlbmd0aC0xOm8rMl07cmV0dXJuIG4uc2V0KERjKGEsYy54LGwueCxoLngsdS54KSxEYyhhLGMueSxsLnksaC55LHUueSkpLG59Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChzLmNsb25lKCkpfXJldHVybiB0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHMudG9BcnJheSgpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gobmV3IFIoKS5mcm9tQXJyYXkocykpfXJldHVybiB0aGlzfX12YXIgcWM9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6TGMsQ2F0bXVsbFJvbUN1cnZlMzpPYyxDdWJpY0JlemllckN1cnZlOkNvLEN1YmljQmV6aWVyQ3VydmUzOiRjLEVsbGlwc2VDdXJ2ZTp2cyxMaW5lQ3VydmU6Qm8sTGluZUN1cnZlMzpVYyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpGbyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6VmMsU3BsaW5lQ3VydmU6SW99KTtjbGFzcyBQZiBleHRlbmRzIHhle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkN1cnZlUGF0aCIsdGhpcy5jdXJ2ZXM9W10sdGhpcy5hdXRvQ2xvc2U9ITF9YWRkKHQpe3RoaXMuY3VydmVzLnB1c2godCl9Y2xvc2VQYXRoKCl7Y29uc3QgdD10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSxlPXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTtpZighdC5lcXVhbHMoZSkpe2NvbnN0IG49dC5pc1ZlY3RvcjI9PT0hMD8iTGluZUN1cnZlIjoiTGluZUN1cnZlMyI7dGhpcy5jdXJ2ZXMucHVzaChuZXcgcWNbbl0oZSx0KSl9cmV0dXJuIHRoaXN9Z2V0UG9pbnQodCxlKXtjb25zdCBuPXQqdGhpcy5nZXRMZW5ndGgoKSxzPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7bGV0IHI9MDtmb3IoO3I8cy5sZW5ndGg7KXtpZihzW3JdPj1uKXtjb25zdCBvPXNbcl0tbixhPXRoaXMuY3VydmVzW3JdLGM9YS5nZXRMZW5ndGgoKSxsPWM9PT0wPzA6MS1vL2M7cmV0dXJuIGEuZ2V0UG9pbnRBdChsLGUpfXIrK31yZXR1cm4gbnVsbH1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5jYWNoZUxlbmd0aHM9bnVsbCx0aGlzLmdldEN1cnZlTGVuZ3RocygpfWdldEN1cnZlTGVuZ3Rocygpe2lmKHRoaXMuY2FjaGVMZW5ndGhzJiZ0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGg9PT10aGlzLmN1cnZlcy5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO2NvbnN0IHQ9W107bGV0IGU9MDtmb3IobGV0IG49MCxzPXRoaXMuY3VydmVzLmxlbmd0aDtuPHM7bisrKWUrPXRoaXMuY3VydmVzW25dLmdldExlbmd0aCgpLHQucHVzaChlKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9dCx0fWdldFNwYWNlZFBvaW50cyh0PTQwKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5wdXNoKGVbMF0pLGV9Z2V0UG9pbnRzKHQ9MTIpe2NvbnN0IGU9W107bGV0IG47Zm9yKGxldCBzPTAscj10aGlzLmN1cnZlcztzPHIubGVuZ3RoO3MrKyl7Y29uc3Qgbz1yW3NdLGE9by5pc0VsbGlwc2VDdXJ2ZT90KjI6by5pc0xpbmVDdXJ2ZXx8by5pc0xpbmVDdXJ2ZTM/MTpvLmlzU3BsaW5lQ3VydmU/dCpvLnBvaW50cy5sZW5ndGg6dCxjPW8uZ2V0UG9pbnRzKGEpO2ZvcihsZXQgbD0wO2w8Yy5sZW5ndGg7bCsrKXtjb25zdCBoPWNbbF07biYmbi5lcXVhbHMoaCl8fChlLnB1c2goaCksbj1oKX19cmV0dXJuIHRoaXMuYXV0b0Nsb3NlJiZlLmxlbmd0aD4xJiYhZVtlLmxlbmd0aC0xXS5lcXVhbHMoZVswXSkmJmUucHVzaChlWzBdKSxlfWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlLHQuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dGhpcy5jdXJ2ZXNbZV07dC5jdXJ2ZXMucHVzaChzLnRvSlNPTigpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2gobmV3IHFjW3MudHlwZV0oKS5mcm9tSlNPTihzKSl9cmV0dXJuIHRoaXN9fWxldCBIYz1jbGFzcyBleHRlbmRzIFBme2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJQYXRoIix0aGlzLmN1cnJlbnRQb2ludD1uZXcgUix0JiZ0aGlzLnNldEZyb21Qb2ludHModCl9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1vdmVUbyh0WzBdLngsdFswXS55KTtmb3IobGV0IGU9MSxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5saW5lVG8odFtlXS54LHRbZV0ueSk7cmV0dXJuIHRoaXN9bW92ZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBvaW50LnNldCh0LGUpLHRoaXN9bGluZVRvKHQsZSl7Y29uc3Qgbj1uZXcgQm8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgUih0LGUpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQodCxlKSx0aGlzfXF1YWRyYXRpY0N1cnZlVG8odCxlLG4scyl7Y29uc3Qgcj1uZXcgRm8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgUih0LGUpLG5ldyBSKG4scykpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKHIpLHRoaXMuY3VycmVudFBvaW50LnNldChuLHMpLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsbixzLHIsbyl7Y29uc3QgYT1uZXcgQ28odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgUih0LGUpLG5ldyBSKG4scyksbmV3IFIocixvKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2goYSksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHIsbyksdGhpc31zcGxpbmVUaHJ1KHQpe2NvbnN0IGU9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdCh0KSxuPW5ldyBJbyhlKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHRbdC5sZW5ndGgtMV0pLHRoaXN9YXJjKHQsZSxuLHMscixvKXtjb25zdCBhPXRoaXMuY3VycmVudFBvaW50LngsYz10aGlzLmN1cnJlbnRQb2ludC55O3JldHVybiB0aGlzLmFic2FyYyh0K2EsZStjLG4scyxyLG8pLHRoaXN9YWJzYXJjKHQsZSxuLHMscixvKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQsZSxuLG4scyxyLG8pLHRoaXN9ZWxsaXBzZSh0LGUsbixzLHIsbyxhLGMpe2NvbnN0IGw9dGhpcy5jdXJyZW50UG9pbnQueCxoPXRoaXMuY3VycmVudFBvaW50Lnk7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0K2wsZStoLG4scyxyLG8sYSxjKSx0aGlzfWFic2VsbGlwc2UodCxlLG4scyxyLG8sYSxjKXtjb25zdCBsPW5ldyB2cyh0LGUsbixzLHIsbyxhLGMpO2lmKHRoaXMuY3VydmVzLmxlbmd0aD4wKXtjb25zdCB1PWwuZ2V0UG9pbnQoMCk7dS5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyh1LngsdS55KX10aGlzLmN1cnZlcy5wdXNoKGwpO2NvbnN0IGg9bC5nZXRQb2ludCgxKTtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuY29weShoKSx0aGlzfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jdXJyZW50UG9pbnQuY29weSh0LmN1cnJlbnRQb2ludCksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KHQuY3VycmVudFBvaW50KSx0aGlzfX07Y2xhc3MgV2MgZXh0ZW5kcyBIY3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnV1aWQ9Rm4oKSx0aGlzLnR5cGU9IlNoYXBlIix0aGlzLmhvbGVzPVtdfWdldFBvaW50c0hvbGVzKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTAscz10aGlzLmhvbGVzLmxlbmd0aDtuPHM7bisrKWVbbl09dGhpcy5ob2xlc1tuXS5nZXRQb2ludHModCk7cmV0dXJuIGV9ZXh0cmFjdFBvaW50cyh0KXtyZXR1cm57c2hhcGU6dGhpcy5nZXRQb2ludHModCksaG9sZXM6dGhpcy5nZXRQb2ludHNIb2xlcyh0KX19Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10LmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuaG9sZXNbZV07dGhpcy5ob2xlcy5wdXNoKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnV1aWQ9dGhpcy51dWlkLHQuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10aGlzLmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXRoaXMuaG9sZXNbZV07dC5ob2xlcy5wdXNoKHMudG9KU09OKCkpfXJldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMudXVpZD10LnV1aWQsdGhpcy5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXQuaG9sZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5ob2xlc1tlXTt0aGlzLmhvbGVzLnB1c2gobmV3IEhjKCkuZnJvbUpTT04ocykpfXJldHVybiB0aGlzfX1mdW5jdGlvbiBFZihpLHQsZT0yKXtjb25zdCBuPXQmJnQubGVuZ3RoLHM9bj90WzBdKmU6aS5sZW5ndGg7bGV0IHI9R2MoaSwwLHMsZSwhMCk7Y29uc3Qgbz1bXTtpZighcnx8ci5uZXh0PT09ci5wcmV2KXJldHVybiBvO2xldCBhLGMsbDtpZihuJiYocj1rZihpLHQscixlKSksaS5sZW5ndGg+ODAqZSl7YT0xLzAsYz0xLzA7bGV0IGg9LTEvMCx1PS0xLzA7Zm9yKGxldCBmPWU7ZjxzO2YrPWUpe2NvbnN0IGQ9aVtmXSxwPWlbZisxXTtkPGEmJihhPWQpLHA8YyYmKGM9cCksZD5oJiYoaD1kKSxwPnUmJih1PXApfWw9TWF0aC5tYXgoaC1hLHUtYyksbD1sIT09MD8zMjc2Ny9sOjB9cmV0dXJuIFNpKHIsbyxlLGEsYyxsLDApLG99ZnVuY3Rpb24gR2MoaSx0LGUsbixzKXtsZXQgcjtpZihzPT09V2YoaSx0LGUsbik+MClmb3IobGV0IG89dDtvPGU7bys9bilyPVljKG8vbnwwLGlbb10saVtvKzFdLHIpO2Vsc2UgZm9yKGxldCBvPWUtbjtvPj10O28tPW4pcj1ZYyhvL258MCxpW29dLGlbbysxXSxyKTtyZXR1cm4gciYmSG4ocixyLm5leHQpJiYoUGkocikscj1yLm5leHQpLHJ9ZnVuY3Rpb24gZG4oaSx0KXtpZighaSlyZXR1cm4gaTt0fHwodD1pKTtsZXQgZT1pLG47ZG8gaWYobj0hMSwhZS5zdGVpbmVyJiYoSG4oZSxlLm5leHQpfHxydChlLnByZXYsZSxlLm5leHQpPT09MCkpe2lmKFBpKGUpLGU9dD1lLnByZXYsZT09PWUubmV4dClicmVhaztuPSEwfWVsc2UgZT1lLm5leHQ7d2hpbGUobnx8ZSE9PXQpO3JldHVybiB0fWZ1bmN0aW9uIFNpKGksdCxlLG4scyxyLG8pe2lmKCFpKXJldHVybjshbyYmciYmRGYoaSxuLHMscik7bGV0IGE9aTtmb3IoO2kucHJldiE9PWkubmV4dDspe2NvbnN0IGM9aS5wcmV2LGw9aS5uZXh0O2lmKHI/QmYoaSxuLHMscik6Q2YoaSkpe3QucHVzaChjLmksaS5pLGwuaSksUGkoaSksaT1sLm5leHQsYT1sLm5leHQ7Y29udGludWV9aWYoaT1sLGk9PT1hKXtvP289PT0xPyhpPUZmKGRuKGkpLHQpLFNpKGksdCxlLG4scyxyLDIpKTpvPT09MiYmSWYoaSx0LGUsbixzLHIpOlNpKGRuKGkpLHQsZSxuLHMsciwxKTticmVha319fWZ1bmN0aW9uIENmKGkpe2NvbnN0IHQ9aS5wcmV2LGU9aSxuPWkubmV4dDtpZihydCh0LGUsbik+PTApcmV0dXJuITE7Y29uc3Qgcz10Lngscj1lLngsbz1uLngsYT10LnksYz1lLnksbD1uLnksaD1NYXRoLm1pbihzLHIsbyksdT1NYXRoLm1pbihhLGMsbCksZj1NYXRoLm1heChzLHIsbyksZD1NYXRoLm1heChhLGMsbCk7bGV0IHA9bi5uZXh0O2Zvcig7cCE9PXQ7KXtpZihwLng+PWgmJnAueDw9ZiYmcC55Pj11JiZwLnk8PWQmJnppKHMsYSxyLGMsbyxsLHAueCxwLnkpJiZydChwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIEJmKGksdCxlLG4pe2NvbnN0IHM9aS5wcmV2LHI9aSxvPWkubmV4dDtpZihydChzLHIsbyk+PTApcmV0dXJuITE7Y29uc3QgYT1zLngsYz1yLngsbD1vLngsaD1zLnksdT1yLnksZj1vLnksZD1NYXRoLm1pbihhLGMsbCkscD1NYXRoLm1pbihoLHUsZikseT1NYXRoLm1heChhLGMsbCksbT1NYXRoLm1heChoLHUsZiksZz1rbyhkLHAsdCxlLG4pLGI9a28oeSxtLHQsZSxuKTtsZXQgdz1pLnByZXZaLHg9aS5uZXh0Wjtmb3IoO3cmJncuej49ZyYmeCYmeC56PD1iOyl7aWYody54Pj1kJiZ3Lng8PXkmJncueT49cCYmdy55PD1tJiZ3IT09cyYmdyE9PW8mJnppKGEsaCxjLHUsbCxmLHcueCx3LnkpJiZydCh3LnByZXYsdyx3Lm5leHQpPj0wfHwodz13LnByZXZaLHgueD49ZCYmeC54PD15JiZ4Lnk+PXAmJngueTw9bSYmeCE9PXMmJnghPT1vJiZ6aShhLGgsYyx1LGwsZix4LngseC55KSYmcnQoeC5wcmV2LHgseC5uZXh0KT49MCkpcmV0dXJuITE7eD14Lm5leHRafWZvcig7dyYmdy56Pj1nOyl7aWYody54Pj1kJiZ3Lng8PXkmJncueT49cCYmdy55PD1tJiZ3IT09cyYmdyE9PW8mJnppKGEsaCxjLHUsbCxmLHcueCx3LnkpJiZydCh3LnByZXYsdyx3Lm5leHQpPj0wKXJldHVybiExO3c9dy5wcmV2Wn1mb3IoO3gmJnguejw9Yjspe2lmKHgueD49ZCYmeC54PD15JiZ4Lnk+PXAmJngueTw9bSYmeCE9PXMmJnghPT1vJiZ6aShhLGgsYyx1LGwsZix4LngseC55KSYmcnQoeC5wcmV2LHgseC5uZXh0KT49MClyZXR1cm4hMTt4PXgubmV4dFp9cmV0dXJuITB9ZnVuY3Rpb24gRmYoaSx0KXtsZXQgZT1pO2Rve2NvbnN0IG49ZS5wcmV2LHM9ZS5uZXh0Lm5leHQ7IUhuKG4scykmJlhjKG4sZSxlLm5leHQscykmJlRpKG4scykmJlRpKHMsbikmJih0LnB1c2gobi5pLGUuaSxzLmkpLFBpKGUpLFBpKGUubmV4dCksZT1pPXMpLGU9ZS5uZXh0fXdoaWxlKGUhPT1pKTtyZXR1cm4gZG4oZSl9ZnVuY3Rpb24gSWYoaSx0LGUsbixzLHIpe2xldCBvPWk7ZG97bGV0IGE9by5uZXh0Lm5leHQ7Zm9yKDthIT09by5wcmV2Oyl7aWYoby5pIT09YS5pJiZWZihvLGEpKXtsZXQgYz1KYyhvLGEpO289ZG4obyxvLm5leHQpLGM9ZG4oYyxjLm5leHQpLFNpKG8sdCxlLG4scyxyLDApLFNpKGMsdCxlLG4scyxyLDApO3JldHVybn1hPWEubmV4dH1vPW8ubmV4dH13aGlsZShvIT09aSl9ZnVuY3Rpb24ga2YoaSx0LGUsbil7Y29uc3Qgcz1bXTtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9dFtyXSpuLGM9cjxvLTE/dFtyKzFdKm46aS5sZW5ndGgsbD1HYyhpLGEsYyxuLCExKTtsPT09bC5uZXh0JiYobC5zdGVpbmVyPSEwKSxzLnB1c2goVWYobCkpfXMuc29ydChOZik7Zm9yKGxldCByPTA7cjxzLmxlbmd0aDtyKyspZT1SZihzW3JdLGUpO3JldHVybiBlfWZ1bmN0aW9uIE5mKGksdCl7bGV0IGU9aS54LXQueDtpZihlPT09MCYmKGU9aS55LXQueSxlPT09MCkpe2NvbnN0IG49KGkubmV4dC55LWkueSkvKGkubmV4dC54LWkueCkscz0odC5uZXh0LnktdC55KS8odC5uZXh0LngtdC54KTtlPW4tc31yZXR1cm4gZX1mdW5jdGlvbiBSZihpLHQpe2NvbnN0IGU9TGYoaSx0KTtpZighZSlyZXR1cm4gdDtjb25zdCBuPUpjKGUsaSk7cmV0dXJuIGRuKG4sbi5uZXh0KSxkbihlLGUubmV4dCl9ZnVuY3Rpb24gTGYoaSx0KXtsZXQgZT10O2NvbnN0IG49aS54LHM9aS55O2xldCByPS0xLzAsbztpZihIbihpLGUpKXJldHVybiBlO2Rve2lmKEhuKGksZS5uZXh0KSlyZXR1cm4gZS5uZXh0O2lmKHM8PWUueSYmcz49ZS5uZXh0LnkmJmUubmV4dC55IT09ZS55KXtjb25zdCB1PWUueCsocy1lLnkpKihlLm5leHQueC1lLngpLyhlLm5leHQueS1lLnkpO2lmKHU8PW4mJnU+ciYmKHI9dSxvPWUueDxlLm5leHQueD9lOmUubmV4dCx1PT09bikpcmV0dXJuIG99ZT1lLm5leHR9d2hpbGUoZSE9PXQpO2lmKCFvKXJldHVybiBudWxsO2NvbnN0IGE9byxjPW8ueCxsPW8ueTtsZXQgaD0xLzA7ZT1vO2Rve2lmKG4+PWUueCYmZS54Pj1jJiZuIT09ZS54JiZaYyhzPGw/bjpyLHMsYyxsLHM8bD9yOm4scyxlLngsZS55KSl7Y29uc3QgdT1NYXRoLmFicyhzLWUueSkvKG4tZS54KTtUaShlLGkpJiYodTxofHx1PT09aCYmKGUueD5vLnh8fGUueD09PW8ueCYmT2YobyxlKSkpJiYobz1lLGg9dSl9ZT1lLm5leHR9d2hpbGUoZSE9PWEpO3JldHVybiBvfWZ1bmN0aW9uIE9mKGksdCl7cmV0dXJuIHJ0KGkucHJldixpLHQucHJldik8MCYmcnQodC5uZXh0LGksaS5uZXh0KTwwfWZ1bmN0aW9uIERmKGksdCxlLG4pe2xldCBzPWk7ZG8gcy56PT09MCYmKHMuej1rbyhzLngscy55LHQsZSxuKSkscy5wcmV2Wj1zLnByZXYscy5uZXh0Wj1zLm5leHQscz1zLm5leHQ7d2hpbGUocyE9PWkpO3MucHJldloubmV4dFo9bnVsbCxzLnByZXZaPW51bGwsJGYocyl9ZnVuY3Rpb24gJGYoaSl7bGV0IHQsZT0xO2Rve2xldCBuPWkscztpPW51bGw7bGV0IHI9bnVsbDtmb3IodD0wO247KXt0Kys7bGV0IG89bixhPTA7Zm9yKGxldCBsPTA7bDxlJiYoYSsrLG89by5uZXh0WiwhIW8pO2wrKyk7bGV0IGM9ZTtmb3IoO2E+MHx8Yz4wJiZvOylhIT09MCYmKGM9PT0wfHwhb3x8bi56PD1vLnopPyhzPW4sbj1uLm5leHRaLGEtLSk6KHM9byxvPW8ubmV4dFosYy0tKSxyP3IubmV4dFo9czppPXMscy5wcmV2Wj1yLHI9cztuPW99ci5uZXh0Wj1udWxsLGUqPTJ9d2hpbGUodD4xKTtyZXR1cm4gaX1mdW5jdGlvbiBrbyhpLHQsZSxuLHMpe3JldHVybiBpPShpLWUpKnN8MCx0PSh0LW4pKnN8MCxpPShpfGk8PDgpJjE2NzExOTM1LGk9KGl8aTw8NCkmMjUyNjQ1MTM1LGk9KGl8aTw8MikmODU4OTkzNDU5LGk9KGl8aTw8MSkmMTQzMTY1NTc2NSx0PSh0fHQ8PDgpJjE2NzExOTM1LHQ9KHR8dDw8NCkmMjUyNjQ1MTM1LHQ9KHR8dDw8MikmODU4OTkzNDU5LHQ9KHR8dDw8MSkmMTQzMTY1NTc2NSxpfHQ8PDF9ZnVuY3Rpb24gVWYoaSl7bGV0IHQ9aSxlPWk7ZG8odC54PGUueHx8dC54PT09ZS54JiZ0Lnk8ZS55KSYmKGU9dCksdD10Lm5leHQ7d2hpbGUodCE9PWkpO3JldHVybiBlfWZ1bmN0aW9uIFpjKGksdCxlLG4scyxyLG8sYSl7cmV0dXJuKHMtbykqKHQtYSk+PShpLW8pKihyLWEpJiYoaS1vKSoobi1hKT49KGUtbykqKHQtYSkmJihlLW8pKihyLWEpPj0ocy1vKSoobi1hKX1mdW5jdGlvbiB6aShpLHQsZSxuLHMscixvLGEpe3JldHVybiEoaT09PW8mJnQ9PT1hKSYmWmMoaSx0LGUsbixzLHIsbyxhKX1mdW5jdGlvbiBWZihpLHQpe3JldHVybiBpLm5leHQuaSE9PXQuaSYmaS5wcmV2LmkhPT10LmkmJiFxZihpLHQpJiYoVGkoaSx0KSYmVGkodCxpKSYmSGYoaSx0KSYmKHJ0KGkucHJldixpLHQucHJldil8fHJ0KGksdC5wcmV2LHQpKXx8SG4oaSx0KSYmcnQoaS5wcmV2LGksaS5uZXh0KT4wJiZydCh0LnByZXYsdCx0Lm5leHQpPjApfWZ1bmN0aW9uIHJ0KGksdCxlKXtyZXR1cm4odC55LWkueSkqKGUueC10LngpLSh0LngtaS54KSooZS55LXQueSl9ZnVuY3Rpb24gSG4oaSx0KXtyZXR1cm4gaS54PT09dC54JiZpLnk9PT10Lnl9ZnVuY3Rpb24gWGMoaSx0LGUsbil7Y29uc3Qgcz1UcyhydChpLHQsZSkpLHI9VHMocnQoaSx0LG4pKSxvPVRzKHJ0KGUsbixpKSksYT1UcyhydChlLG4sdCkpO3JldHVybiEhKHMhPT1yJiZvIT09YXx8cz09PTAmJnpzKGksZSx0KXx8cj09PTAmJnpzKGksbix0KXx8bz09PTAmJnpzKGUsaSxuKXx8YT09PTAmJnpzKGUsdCxuKSl9ZnVuY3Rpb24genMoaSx0LGUpe3JldHVybiB0Lng8PU1hdGgubWF4KGkueCxlLngpJiZ0Lng+PU1hdGgubWluKGkueCxlLngpJiZ0Lnk8PU1hdGgubWF4KGkueSxlLnkpJiZ0Lnk+PU1hdGgubWluKGkueSxlLnkpfWZ1bmN0aW9uIFRzKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH1mdW5jdGlvbiBxZihpLHQpe2xldCBlPWk7ZG97aWYoZS5pIT09aS5pJiZlLm5leHQuaSE9PWkuaSYmZS5pIT09dC5pJiZlLm5leHQuaSE9PXQuaSYmWGMoZSxlLm5leHQsaSx0KSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuITF9ZnVuY3Rpb24gVGkoaSx0KXtyZXR1cm4gcnQoaS5wcmV2LGksaS5uZXh0KTwwP3J0KGksdCxpLm5leHQpPj0wJiZydChpLGkucHJldix0KT49MDpydChpLHQsaS5wcmV2KTwwfHxydChpLGkubmV4dCx0KTwwfWZ1bmN0aW9uIEhmKGksdCl7bGV0IGU9aSxuPSExO2NvbnN0IHM9KGkueCt0LngpLzIscj0oaS55K3QueSkvMjtkbyBlLnk+ciE9ZS5uZXh0Lnk+ciYmZS5uZXh0LnkhPT1lLnkmJnM8KGUubmV4dC54LWUueCkqKHItZS55KS8oZS5uZXh0LnktZS55KStlLngmJihuPSFuKSxlPWUubmV4dDt3aGlsZShlIT09aSk7cmV0dXJuIG59ZnVuY3Rpb24gSmMoaSx0KXtjb25zdCBlPU5vKGkuaSxpLngsaS55KSxuPU5vKHQuaSx0LngsdC55KSxzPWkubmV4dCxyPXQucHJldjtyZXR1cm4gaS5uZXh0PXQsdC5wcmV2PWksZS5uZXh0PXMscy5wcmV2PWUsbi5uZXh0PWUsZS5wcmV2PW4sci5uZXh0PW4sbi5wcmV2PXIsbn1mdW5jdGlvbiBZYyhpLHQsZSxuKXtjb25zdCBzPU5vKGksdCxlKTtyZXR1cm4gbj8ocy5uZXh0PW4ubmV4dCxzLnByZXY9bixuLm5leHQucHJldj1zLG4ubmV4dD1zKToocy5wcmV2PXMscy5uZXh0PXMpLHN9ZnVuY3Rpb24gUGkoaSl7aS5uZXh0LnByZXY9aS5wcmV2LGkucHJldi5uZXh0PWkubmV4dCxpLnByZXZaJiYoaS5wcmV2Wi5uZXh0Wj1pLm5leHRaKSxpLm5leHRaJiYoaS5uZXh0Wi5wcmV2Wj1pLnByZXZaKX1mdW5jdGlvbiBObyhpLHQsZSl7cmV0dXJue2kseDp0LHk6ZSxwcmV2Om51bGwsbmV4dDpudWxsLHo6MCxwcmV2WjpudWxsLG5leHRaOm51bGwsc3RlaW5lcjohMX19ZnVuY3Rpb24gV2YoaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPWUtbjtyPGU7cis9bilzKz0oaVtvXS1pW3JdKSooaVtyKzFdK2lbbysxXSksbz1yO3JldHVybiBzfWNsYXNzIEdme3N0YXRpYyB0cmlhbmd1bGF0ZSh0LGUsbj0yKXtyZXR1cm4gRWYodCxlLG4pfX1jbGFzcyBXbntzdGF0aWMgYXJlYSh0KXtjb25zdCBlPXQubGVuZ3RoO2xldCBuPTA7Zm9yKGxldCBzPWUtMSxyPTA7cjxlO3M9cisrKW4rPXRbc10ueCp0W3JdLnktdFtyXS54KnRbc10ueTtyZXR1cm4gbiouNX1zdGF0aWMgaXNDbG9ja1dpc2UodCl7cmV0dXJuIFduLmFyZWEodCk8MH1zdGF0aWMgdHJpYW5ndWxhdGVTaGFwZSh0LGUpe2NvbnN0IG49W10scz1bXSxyPVtdO2pjKHQpLFFjKG4sdCk7bGV0IG89dC5sZW5ndGg7ZS5mb3JFYWNoKGpjKTtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrKylzLnB1c2gobyksbys9ZVtjXS5sZW5ndGgsUWMobixlW2NdKTtjb25zdCBhPUdmLnRyaWFuZ3VsYXRlKG4scyk7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKz0zKXIucHVzaChhLnNsaWNlKGMsYyszKSk7cmV0dXJuIHJ9fWZ1bmN0aW9uIGpjKGkpe2NvbnN0IHQ9aS5sZW5ndGg7dD4yJiZpW3QtMV0uZXF1YWxzKGlbMF0pJiZpLnBvcCgpfWZ1bmN0aW9uIFFjKGksdCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaS5wdXNoKHRbZV0ueCksaS5wdXNoKHRbZV0ueSl9Y2xhc3MgUm8gZXh0ZW5kcyB1ZXtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxzPTEpe3N1cGVyKCksdGhpcy50eXBlPSJQbGFuZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsd2lkdGhTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOnN9O2NvbnN0IHI9dC8yLG89ZS8yLGE9TWF0aC5mbG9vcihuKSxjPU1hdGguZmxvb3IocyksbD1hKzEsaD1jKzEsdT10L2EsZj1lL2MsZD1bXSxwPVtdLHk9W10sbT1bXTtmb3IobGV0IGc9MDtnPGg7ZysrKXtjb25zdCBiPWcqZi1vO2ZvcihsZXQgdz0wO3c8bDt3Kyspe2NvbnN0IHg9dyp1LXI7cC5wdXNoKHgsLWIsMCkseS5wdXNoKDAsMCwxKSxtLnB1c2gody9hKSxtLnB1c2goMS1nL2MpfX1mb3IobGV0IGc9MDtnPGM7ZysrKWZvcihsZXQgYj0wO2I8YTtiKyspe2NvbnN0IHc9YitsKmcseD1iK2wqKGcrMSksTT1iKzErbCooZysxKSxBPWIrMStsKmc7ZC5wdXNoKHcseCxBKSxkLnB1c2goeCxNLEEpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQmUocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IEJlKHksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEJlKG0sMikpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IFJvKHQud2lkdGgsdC5oZWlnaHQsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMpfX1jb25zdCBLYz1uZXcgVCxQcz1uZXcgVDtjbGFzcyBRdHtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQpe3RoaXMuc3RhcnQ9dCx0aGlzLmVuZD1lfXNldCh0LGUpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkodCksdGhpcy5lbmQuY29weShlKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0LnN0YXJ0KSx0aGlzLmVuZC5jb3B5KHQuZW5kKSx0aGlzfWdldENlbnRlcih0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsdGhpcy5lbmQpLm11bHRpcGx5U2NhbGFyKC41KX1kZWx0YSh0KXtyZXR1cm4gdC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpfWRpc3RhbmNlU3EoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmVuZCl9ZGlzdGFuY2UoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX1hdCh0LGUpe3JldHVybiB0aGlzLmRlbHRhKGUpLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnN0YXJ0KX1jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKHQsZSl7S2Muc3ViVmVjdG9ycyh0LHRoaXMuc3RhcnQpLFBzLnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCk7Y29uc3Qgbj1Qcy5kb3QoUHMpO2xldCByPVBzLmRvdChLYykvbjtyZXR1cm4gZSYmKHI9WihyLDAsMSkpLHJ9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUsbil7Y29uc3Qgcz10aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKTtyZXR1cm4gdGhpcy5kZWx0YShuKS5tdWx0aXBseVNjYWxhcihzKS5hZGQodGhpcy5zdGFydCl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCh0KSx0aGlzLmVuZC5hcHBseU1hdHJpeDQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQuc3RhcnQuZXF1YWxzKHRoaXMuc3RhcnQpJiZ0LmVuZC5lcXVhbHModGhpcy5lbmQpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyE9InVuZGVmaW5lZCImJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicmVnaXN0ZXIiLHtkZXRhaWw6e3JldmlzaW9uOkp9fSkpLHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiYod2luZG93Ll9fVEhSRUVfXz9jb25zb2xlLndhcm4oIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4iKTp3aW5kb3cuX19USFJFRV9fPUopO2NvbnN0IHBuPW5ldyBNYXAsWmY9KGk9e30pPT4oe2dlbmVyYXRlVG9wVVYodCxlLG4scyxyKXtjb25zdCBvPWVbbiozXSxhPWVbbiozKzFdLGM9ZVtzKjNdLGw9ZVtzKjMrMV0saD1lW3IqM10sdT1lW3IqMysxXTtsZXQgZjtpZihwbi5oYXModCkpZj1wbi5nZXQodCk7ZWxzZXtsZXQgbT1pLmJveDM7aWYoIW0pe209bmV3IGd0O2NvbnN0IHc9dC5wYXJhbWV0ZXJzLnNoYXBlcy5nZXRQb2ludHMoKS5tYXAoeD0+W3gueCx4LnksMF0pLmZsYXQoKTttLnNldEZyb21BcnJheSh3KX1jb25zdCBnPW0uZ2V0U2l6ZShuZXcgVCk7aS5zcGxpdCYmKGcueS89aS5zcGxpdCksZj17Ym94Om0sc2l6ZTpnfSxwbi5zZXQodCxmKX1jb25zdHtib3g6ZCxzaXplOnB9PWYseT1pLnNwbGl0PzEtaS5zcGxpdDowO3JldHVybltuZXcgUigoby1kLm1pbi54KS9wLngsKGEtZC5taW4ueSkvcC55K3kpLG5ldyBSKChjLWQubWluLngpL3AueCwobC1kLm1pbi55KS9wLnkreSksbmV3IFIoKGgtZC5taW4ueCkvcC54LCh1LWQubWluLnkpL3AueSt5KV19LGdlbmVyYXRlU2lkZVdhbGxVVih0LGUsbixzLHIsbyl7Y29uc3QgYT1lW24qM10sYz1lW24qMysxXSxsPWVbbiozKzJdLGg9ZVtzKjNdLHU9ZVtzKjMrMV0sZj1lW3MqMysyXSxkPWVbciozXSxwPWVbciozKzFdLHk9ZVtyKjMrMl0sbT1lW28qM10sZz1lW28qMysxXSxiPWVbbyozKzJdO2xldCB3O2lmKHBuLmhhcyhlKSl3PXBuLmdldChlKTtlbHNle2NvbnN0IEE9bmV3IGd0O0Euc2V0RnJvbUFycmF5KGUpO2NvbnN0IF89QS5nZXRTaXplKG5ldyBUKTtpLnNwbGl0JiYoXy56Lz0xLWkuc3BsaXQpLGkuc2lkZVJlcGVhdCYmKF8uei89aS5zaWRlUmVwZWF0KSx3PXtib3g6QSxzaXplOl99LHBuLnNldChlLHcpfWNvbnN0e2JveDp4LHNpemU6TX09dztyZXR1cm4gTWF0aC5hYnMoYy11KTxNYXRoLmFicyhhLWgpP1tuZXcgUigoYS14Lm1pbi54KS9NLngsKGwteC5taW4ueikvTS56KSxuZXcgUigoaC14Lm1pbi54KS9NLngsKGYteC5taW4ueikvTS56KSxuZXcgUigoZC14Lm1pbi54KS9NLngsKHkteC5taW4ueikvTS56KSxuZXcgUigobS14Lm1pbi54KS9NLngsKGIteC5taW4ueikvTS56KV06W25ldyBSKChjLXgubWluLnkpL00ueSwobC14Lm1pbi56KS9NLnopLG5ldyBSKCh1LXgubWluLnkpL00ueSwoZi14Lm1pbi56KS9NLnopLG5ldyBSKChwLXgubWluLnkpL00ueSwoeS14Lm1pbi56KS9NLnopLG5ldyBSKChnLXgubWluLnkpL00ueSwoYi14Lm1pbi56KS9NLnopXX19KSxYZj0oKT0+e3BuLmNsZWFyKCl9LEpmPXtBcmNDdXJ2ZTpMYyxDYXRtdWxsUm9tQ3VydmUzOk9jLEN1YmljQmV6aWVyQ3VydmU6Q28sQ3ViaWNCZXppZXJDdXJ2ZTM6JGMsRWxsaXBzZUN1cnZlOnZzLExpbmVDdXJ2ZTpCbyxMaW5lQ3VydmUzOlVjLFF1YWRyYXRpY0JlemllckN1cnZlOkZvLFF1YWRyYXRpY0JlemllckN1cnZlMzpWYyxTcGxpbmVDdXJ2ZTpJb307Y2xhc3MgR24gZXh0ZW5kcyB1ZXtjb25zdHJ1Y3Rvcih0PW5ldyBXYyhbbmV3IFIoLjUsLjUpLG5ldyBSKC0uNSwuNSksbmV3IFIoLS41LC0uNSksbmV3IFIoLjUsLS41KV0pLGU9e30pe3N1cGVyKCksdGhpcy50eXBlPSJFeHRydWRlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17c2hhcGVzOnQsb3B0aW9uczplfSx0PUFycmF5LmlzQXJyYXkodCk/dDpbdF07Y29uc3Qgbj10aGlzLHM9W10scj1bXTtmb3IobGV0IGE9MCxjPXQubGVuZ3RoO2E8YzthKyspe2NvbnN0IGw9dFthXTtvKGwpfXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEJlKHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEJlKHIsMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtmdW5jdGlvbiBvKGEpe3ZhciBOdSxSdSxMdTtjb25zdCBjPVtdLGw9ZS5jdXJ2ZVNlZ21lbnRzIT09dm9pZCAwP2UuY3VydmVTZWdtZW50czoxMixoPWUuc3RlcHMhPT12b2lkIDA/ZS5zdGVwczoxLHU9ZS5kZXB0aCE9PXZvaWQgMD9lLmRlcHRoOjE7bGV0IGY9ZS5iZXZlbEVuYWJsZWQhPT12b2lkIDA/ZS5iZXZlbEVuYWJsZWQ6ITAsZD1lLmJldmVsVGhpY2tuZXNzIT09dm9pZCAwP2UuYmV2ZWxUaGlja25lc3M6LjIscD1lLmJldmVsU2l6ZSE9PXZvaWQgMD9lLmJldmVsU2l6ZTpkLS4xLHk9ZS5iZXZlbE9mZnNldCE9PXZvaWQgMD9lLmJldmVsT2Zmc2V0OjAsbT1lLmJldmVsU2VnbWVudHMhPT12b2lkIDA/ZS5iZXZlbFNlZ21lbnRzOjM7Y29uc3QgZz1lLmV4dHJ1ZGVQYXRoLGI9ZS5VVkdlbmVyYXRvciE9PXZvaWQgMD9lLlVWR2VuZXJhdG9yOllmLHc9KE51PWUuaGFzVG9wKSE9bnVsbD9OdTohMCx4PShSdT1lLmhhc0JvdHRvbSkhPW51bGw/UnU6ITAsTT0oTHU9ZS5oYXNTaWRlKSE9bnVsbD9MdTohMDtsZXQgQSxfPSExLHYsUCx6LFM7ZyYmKEE9Zy5nZXRTcGFjZWRQb2ludHMoaCksXz0hMCxmPSExLHY9Zy5jb21wdXRlRnJlbmV0RnJhbWVzKGgsITEpLFA9bmV3IFQsej1uZXcgVCxTPW5ldyBUKSxmfHwobT0wLGQ9MCxwPTAseT0wKTtjb25zdCBDPWEuZXh0cmFjdFBvaW50cyhsKTtsZXQgRT1DLnNoYXBlO2NvbnN0IEY9Qy5ob2xlcztpZighV24uaXNDbG9ja1dpc2UoRSkpe0U9RS5yZXZlcnNlKCk7Zm9yKGxldCBOPTAsTD1GLmxlbmd0aDtOPEw7TisrKXtjb25zdCBPPUZbTl07V24uaXNDbG9ja1dpc2UoTykmJihGW05dPU8ucmV2ZXJzZSgpKX19ZnVuY3Rpb24gSShOKXtjb25zdCBPPTEwMDAwMDAwMDAwMDAwMDAxZS0zNjtsZXQgVT1OWzBdO2ZvcihsZXQgJD0xOyQ8PU4ubGVuZ3RoOyQrKyl7Y29uc3QgWT0kJU4ubGVuZ3RoLEc9TltZXSxpdD1HLngtVS54LGN0PUcueS1VLnksd3Q9aXQqaXQrY3QqY3QsWHQ9TWF0aC5tYXgoTWF0aC5hYnMoRy54KSxNYXRoLmFicyhHLnkpLE1hdGguYWJzKFUueCksTWF0aC5hYnMoVS55KSksQ249TypYdCpYdDtpZih3dDw9Q24pe04uc3BsaWNlKFksMSksJC0tO2NvbnRpbnVlfVU9R319SShFKSxGLmZvckVhY2goSSk7Y29uc3Qgaz1GLmxlbmd0aCxEPUU7Zm9yKGxldCBOPTA7TjxrO04rKyl7Y29uc3QgTD1GW05dO0U9RS5jb25jYXQoTCl9ZnVuY3Rpb24gVihOLEwsTyl7cmV0dXJuIEx8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0IiksTi5jbG9uZSgpLmFkZFNjYWxlZFZlY3RvcihMLE8pfWNvbnN0IGo9RS5sZW5ndGg7ZnVuY3Rpb24gZHQoTixMLE8pe2xldCBVLCQsWTtjb25zdCBHPU4ueC1MLngsaXQ9Ti55LUwueSxjdD1PLngtTi54LHd0PU8ueS1OLnksWHQ9RypHK2l0Kml0LENuPUcqd3QtaXQqY3Q7aWYoTWF0aC5hYnMoQ24pPk51bWJlci5FUFNJTE9OKXtjb25zdCBKdD1NYXRoLnNxcnQoWHQpLE91PU1hdGguc3FydChjdCpjdCt3dCp3dCksRHU9TC54LWl0L0p0LCR1PUwueStHL0p0LHpnPU8ueC13dC9PdSxUZz1PLnkrY3QvT3UsVXU9KCh6Zy1EdSkqd3QtKFRnLSR1KSpjdCkvKEcqd3QtaXQqY3QpO1U9RHUrRypVdS1OLngsJD0kdStpdCpVdS1OLnk7Y29uc3QgVnU9VSpVKyQqJDtpZihWdTw9MilyZXR1cm4gbmV3IFIoVSwkKTtZPU1hdGguc3FydChWdS8yKX1lbHNle2xldCBKdD0hMTtHPk51bWJlci5FUFNJTE9OP2N0Pk51bWJlci5FUFNJTE9OJiYoSnQ9ITApOkc8LU51bWJlci5FUFNJTE9OP2N0PC1OdW1iZXIuRVBTSUxPTiYmKEp0PSEwKTpNYXRoLnNpZ24oaXQpPT09TWF0aC5zaWduKHd0KSYmKEp0PSEwKSxKdD8oVT0taXQsJD1HLFk9TWF0aC5zcXJ0KFh0KSk6KFU9RywkPWl0LFk9TWF0aC5zcXJ0KFh0LzIpKX1yZXR1cm4gbmV3IFIoVS9ZLCQvWSl9Y29uc3QgRHQ9W107Zm9yKGxldCBOPTAsTD1ELmxlbmd0aCxPPUwtMSxVPU4rMTtOPEw7TisrLE8rKyxVKyspTz09PUwmJihPPTApLFU9PT1MJiYoVT0wKSxEdFtOXT1kdChEW05dLERbT10sRFtVXSk7Y29uc3QgR3Q9W107bGV0IFp0LG1lPUR0LmNvbmNhdCgpO2ZvcihsZXQgTj0wLEw9aztOPEw7TisrKXtjb25zdCBPPUZbTl07WnQ9W107Zm9yKGxldCBVPTAsJD1PLmxlbmd0aCxZPSQtMSxHPVUrMTtVPCQ7VSsrLFkrKyxHKyspWT09PSQmJihZPTApLEc9PT0kJiYoRz0wKSxadFtVXT1kdChPW1VdLE9bWV0sT1tHXSk7R3QucHVzaChadCksbWU9bWUuY29uY2F0KFp0KX1sZXQgRW47aWYobT09PTApRW49V24udHJpYW5ndWxhdGVTaGFwZShELEYpO2Vsc2V7Y29uc3QgTj1bXSxMPVtdO2ZvcihsZXQgTz0wO088bTtPKyspe2NvbnN0IFU9Ty9tLCQ9ZCpNYXRoLmNvcyhVKk1hdGguUEkvMiksWT1wKk1hdGguc2luKFUqTWF0aC5QSS8yKSt5O2ZvcihsZXQgRz0wLGl0PUQubGVuZ3RoO0c8aXQ7RysrKXtjb25zdCBjdD1WKERbR10sRHRbR10sWSk7SGUoY3QueCxjdC55LC0kKSxVPT09MCYmTi5wdXNoKGN0KX1mb3IobGV0IEc9MCxpdD1rO0c8aXQ7RysrKXtjb25zdCBjdD1GW0ddO1p0PUd0W0ddO2NvbnN0IHd0PVtdO2ZvcihsZXQgWHQ9MCxDbj1jdC5sZW5ndGg7WHQ8Q247WHQrKyl7Y29uc3QgSnQ9VihjdFtYdF0sWnRbWHRdLFkpO0hlKEp0LngsSnQueSwtJCksVT09PTAmJnd0LnB1c2goSnQpfVU9PT0wJiZMLnB1c2god3QpfX1Fbj1Xbi50cmlhbmd1bGF0ZVNoYXBlKE4sTCl9Y29uc3QgWXI9RW4ubGVuZ3RoLEl1PXAreTtmb3IobGV0IE49MDtOPGo7TisrKXtjb25zdCBMPWY/VihFW05dLG1lW05dLEl1KTpFW05dO18/KHouY29weSh2Lm5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKEwueCksUC5jb3B5KHYuYmlub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihMLnkpLFMuY29weShBWzBdKS5hZGQoeikuYWRkKFApLEhlKFMueCxTLnksUy56KSk6SGUoTC54LEwueSwwKX1mb3IobGV0IE49MTtOPD1oO04rKylmb3IobGV0IEw9MDtMPGo7TCsrKXtjb25zdCBPPWY/VihFW0xdLG1lW0xdLEl1KTpFW0xdO18/KHouY29weSh2Lm5vcm1hbHNbTl0pLm11bHRpcGx5U2NhbGFyKE8ueCksUC5jb3B5KHYuYmlub3JtYWxzW05dKS5tdWx0aXBseVNjYWxhcihPLnkpLFMuY29weShBW05dKS5hZGQoeikuYWRkKFApLEhlKFMueCxTLnksUy56KSk6SGUoTy54LE8ueSx1L2gqTil9Zm9yKGxldCBOPW0tMTtOPj0wO04tLSl7Y29uc3QgTD1OL20sTz1kKk1hdGguY29zKEwqTWF0aC5QSS8yKSxVPXAqTWF0aC5zaW4oTCpNYXRoLlBJLzIpK3k7Zm9yKGxldCAkPTAsWT1ELmxlbmd0aDskPFk7JCsrKXtjb25zdCBHPVYoRFskXSxEdFskXSxVKTtIZShHLngsRy55LHUrTyl9Zm9yKGxldCAkPTAsWT1GLmxlbmd0aDskPFk7JCsrKXtjb25zdCBHPUZbJF07WnQ9R3RbJF07Zm9yKGxldCBpdD0wLGN0PUcubGVuZ3RoO2l0PGN0O2l0Kyspe2NvbnN0IHd0PVYoR1tpdF0sWnRbaXRdLFUpO18/SGUod3QueCx3dC55K0FbaC0xXS55LEFbaC0xXS54K08pOkhlKHd0Lngsd3QueSx1K08pfX19X2coKSxNJiZ2ZygpO2Z1bmN0aW9uIF9nKCl7Y29uc3QgTj1zLmxlbmd0aC8zO2lmKGYpe2xldCBMPTAsTz1qKkw7aWYoeClmb3IobGV0IFU9MDtVPFlyO1UrKyl7Y29uc3QgJD1FbltVXTtqcigkWzJdK08sJFsxXStPLCRbMF0rTyl9aWYoTD1oK20qMixPPWoqTCx3KWZvcihsZXQgVT0wO1U8WXI7VSsrKXtjb25zdCAkPUVuW1VdO2pyKCRbMF0rTywkWzFdK08sJFsyXStPKX19ZWxzZXtpZih4KWZvcihsZXQgTD0wO0w8WXI7TCsrKXtjb25zdCBPPUVuW0xdO2pyKE9bMl0sT1sxXSxPWzBdKX1pZih3KWZvcihsZXQgTD0wO0w8WXI7TCsrKXtjb25zdCBPPUVuW0xdO2pyKE9bMF0raipoLE9bMV0raipoLE9bMl0raipoKX19bi5hZGRHcm91cChOLHMubGVuZ3RoLzMtTiwwKX1mdW5jdGlvbiB2Zygpe2NvbnN0IE49cy5sZW5ndGgvMztsZXQgTD0wO2t1KEQsTCksTCs9RC5sZW5ndGg7Zm9yKGxldCBPPTAsVT1GLmxlbmd0aDtPPFU7TysrKXtjb25zdCAkPUZbT107a3UoJCxMKSxMKz0kLmxlbmd0aH1uLmFkZEdyb3VwKE4scy5sZW5ndGgvMy1OLDEpfWZ1bmN0aW9uIGt1KE4sTCl7bGV0IE89Ti5sZW5ndGg7Zm9yKDstLU8+PTA7KXtjb25zdCBVPU87bGV0ICQ9Ty0xOyQ8MCYmKCQ9Ti5sZW5ndGgtMSk7Zm9yKGxldCBZPTAsRz1oK20qMjtZPEc7WSsrKXtjb25zdCBpdD1qKlksY3Q9aiooWSsxKSx3dD1MK1UraXQsWHQ9TCskK2l0LENuPUwrJCtjdCxKdD1MK1UrY3Q7U2cod3QsWHQsQ24sSnQpfX19ZnVuY3Rpb24gSGUoTixMLE8pe2MucHVzaChOKSxjLnB1c2goTCksYy5wdXNoKE8pfWZ1bmN0aW9uIGpyKE4sTCxPKXtXZShOKSxXZShMKSxXZShPKTtjb25zdCBVPXMubGVuZ3RoLzMsJD1iLmdlbmVyYXRlVG9wVVYobixzLFUtMyxVLTIsVS0xKTtHZSgkWzBdKSxHZSgkWzFdKSxHZSgkWzJdKX1mdW5jdGlvbiBTZyhOLEwsTyxVKXtXZShOKSxXZShMKSxXZShVKSxXZShMKSxXZShPKSxXZShVKTtjb25zdCAkPXMubGVuZ3RoLzMsWT1iLmdlbmVyYXRlU2lkZVdhbGxVVihuLHMsJC02LCQtMywkLTIsJC0xKTtHZShZWzBdKSxHZShZWzFdKSxHZShZWzNdKSxHZShZWzFdKSxHZShZWzJdKSxHZShZWzNdKX1mdW5jdGlvbiBXZShOKXtzLnB1c2goY1tOKjMrMF0pLHMucHVzaChjW04qMysxXSkscy5wdXNoKGNbTiozKzJdKX1mdW5jdGlvbiBHZShOKXtyLnB1c2goTi54KSxyLnB1c2goTi55KX19fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCksZT10aGlzLnBhcmFtZXRlcnMuc2hhcGVzLG49dGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7cmV0dXJuIGpmKGUsbix0KX1zdGF0aWMgZnJvbUpTT04odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgcj0wLG89dC5zaGFwZXMubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVt0LnNoYXBlc1tyXV07bi5wdXNoKGEpfWNvbnN0IHM9dC5vcHRpb25zLmV4dHJ1ZGVQYXRoO3JldHVybiBzIT09dm9pZCAwJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPW5ldyBKZltgJHtzLnR5cGV9YF0oKS5mcm9tSlNPTihzKSksbmV3IEduKG4sdC5vcHRpb25zKX19Y29uc3QgWWY9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24oaSx0LGUsbixzKXtjb25zdCByPXRbZSozXSxvPXRbZSozKzFdLGE9dFtuKjNdLGM9dFtuKjMrMV0sbD10W3MqM10saD10W3MqMysxXTtyZXR1cm5bbmV3IFIocixvKSxuZXcgUihhLGMpLG5ldyBSKGwsaCldfSxnZW5lcmF0ZVNpZGVXYWxsVVY6ZnVuY3Rpb24oaSx0LGUsbixzLHIpe2NvbnN0IG89dFtlKjNdLGE9dFtlKjMrMV0sYz10W2UqMysyXSxsPXRbbiozXSxoPXRbbiozKzFdLHU9dFtuKjMrMl0sZj10W3MqM10sZD10W3MqMysxXSxwPXRbcyozKzJdLHk9dFtyKjNdLG09dFtyKjMrMV0sZz10W3IqMysyXTtyZXR1cm4gTWF0aC5hYnMoYS1oKTxNYXRoLmFicyhvLWwpP1tuZXcgUihvLDEtYyksbmV3IFIobCwxLXUpLG5ldyBSKGYsMS1wKSxuZXcgUih5LDEtZyldOltuZXcgUihhLDEtYyksbmV3IFIoaCwxLXUpLG5ldyBSKGQsMS1wKSxuZXcgUihtLDEtZyldfX07ZnVuY3Rpb24gamYoaSx0LGUpe2lmKGUuc2hhcGVzPVtdLEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBuPTAscz1pLmxlbmd0aDtuPHM7bisrKXtjb25zdCByPWlbbl07ZS5zaGFwZXMucHVzaChyLnV1aWQpfWVsc2UgZS5zaGFwZXMucHVzaChpLnV1aWQpO3JldHVybiBlLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSx0KSx0LmV4dHJ1ZGVQYXRoIT09dm9pZCAwJiYoZS5vcHRpb25zLmV4dHJ1ZGVQYXRoPXQuZXh0cnVkZVBhdGgudG9KU09OKCkpLGV9Y29uc3QgdGw9MCxRZj0xLEtmPTIsZWw9MixMbz0xLjI1LG5sPTEsRWk9Nio0KzQrNCxFcz02NTUzNSx0ZD1NYXRoLnBvdygyLC0yNCksT289U3ltYm9sKCJTS0lQX0dFTkVSQVRJT04iKTtmdW5jdGlvbiBlZChpKXtyZXR1cm4gaS5pbmRleD9pLmluZGV4LmNvdW50OmkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1mdW5jdGlvbiBabihpKXtyZXR1cm4gZWQoaSkvM31mdW5jdGlvbiBuZChpLHQ9QXJyYXlCdWZmZXIpe3JldHVybiBpPjY1NTM1P25ldyBVaW50MzJBcnJheShuZXcgdCg0KmkpKTpuZXcgVWludDE2QXJyYXkobmV3IHQoMippKSl9ZnVuY3Rpb24gaWQoaSx0KXtpZighaS5pbmRleCl7Y29uc3QgZT1pLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQsbj10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLHM9bmQoZSxuKTtpLnNldEluZGV4KG5ldyB4dChzLDEpKTtmb3IobGV0IHI9MDtyPGU7cisrKXNbcl09cn19ZnVuY3Rpb24gaWwoaSx0KXtjb25zdCBlPVpuKGkpLG49dHx8aS5kcmF3UmFuZ2Uscz1uLnN0YXJ0LzMscj0obi5zdGFydCtuLmNvdW50KS8zLG89TWF0aC5tYXgoMCxzKSxhPU1hdGgubWluKGUsciktbztyZXR1cm5be29mZnNldDpNYXRoLmZsb29yKG8pLGNvdW50Ok1hdGguZmxvb3IoYSl9XX1mdW5jdGlvbiBzbChpLHQpe2lmKCFpLmdyb3Vwc3x8IWkuZ3JvdXBzLmxlbmd0aClyZXR1cm4gaWwoaSx0KTtjb25zdCBlPVtdLG49bmV3IFNldCxzPXR8fGkuZHJhd1JhbmdlLHI9cy5zdGFydC8zLG89KHMuc3RhcnQrcy5jb3VudCkvMztmb3IoY29uc3QgYyBvZiBpLmdyb3Vwcyl7Y29uc3QgbD1jLnN0YXJ0LzMsaD0oYy5zdGFydCtjLmNvdW50KS8zO24uYWRkKE1hdGgubWF4KHIsbCkpLG4uYWRkKE1hdGgubWluKG8saCkpfWNvbnN0IGE9QXJyYXkuZnJvbShuLnZhbHVlcygpKS5zb3J0KChjLGwpPT5jLWwpO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGgtMTtjKyspe2NvbnN0IGw9YVtjXSxoPWFbYysxXTtlLnB1c2goe29mZnNldDpNYXRoLmZsb29yKGwpLGNvdW50Ok1hdGguZmxvb3IoaC1sKX0pfXJldHVybiBlfWZ1bmN0aW9uIHNkKGksdCl7Y29uc3QgZT1abihpKSxuPXNsKGksdCkuc29ydCgobyxhKT0+by5vZmZzZXQtYS5vZmZzZXQpLHM9bltuLmxlbmd0aC0xXTtzLmNvdW50PU1hdGgubWluKGUtcy5vZmZzZXQscy5jb3VudCk7bGV0IHI9MDtyZXR1cm4gbi5mb3JFYWNoKCh7Y291bnQ6b30pPT5yKz1vKSxlIT09cn1mdW5jdGlvbiBEbyhpLHQsZSxuLHMpe2xldCByPTEvMCxvPTEvMCxhPTEvMCxjPS0xLzAsbD0tMS8wLGg9LTEvMCx1PTEvMCxmPTEvMCxkPTEvMCxwPS0xLzAseT0tMS8wLG09LTEvMDtmb3IobGV0IGc9dCo2LGI9KHQrZSkqNjtnPGI7Zys9Nil7Y29uc3Qgdz1pW2crMF0seD1pW2crMV0sTT13LXgsQT13K3g7TTxyJiYocj1NKSxBPmMmJihjPUEpLHc8dSYmKHU9dyksdz5wJiYocD13KTtjb25zdCBfPWlbZysyXSx2PWlbZyszXSxQPV8tdix6PV8rdjtQPG8mJihvPVApLHo+bCYmKGw9eiksXzxmJiYoZj1fKSxfPnkmJih5PV8pO2NvbnN0IFM9aVtnKzRdLEM9aVtnKzVdLEU9Uy1DLEY9UytDO0U8YSYmKGE9RSksRj5oJiYoaD1GKSxTPGQmJihkPVMpLFM+bSYmKG09Uyl9blswXT1yLG5bMV09byxuWzJdPWEsblszXT1jLG5bNF09bCxuWzVdPWgsc1swXT11LHNbMV09ZixzWzJdPWQsc1szXT1wLHNbNF09eSxzWzVdPW19ZnVuY3Rpb24gcmQoaSx0PW51bGwsZT1udWxsLG49bnVsbCl7Y29uc3Qgcz1pLmF0dHJpYnV0ZXMucG9zaXRpb24scj1pLmluZGV4P2kuaW5kZXguYXJyYXk6bnVsbCxvPVpuKGkpLGE9cy5ub3JtYWxpemVkO2xldCBjO3Q9PT1udWxsPyhjPW5ldyBGbG9hdDMyQXJyYXkobyo2KSxlPTAsbj1vKTooYz10LGU9ZXx8MCxuPW58fG8pO2NvbnN0IGw9cy5hcnJheSxoPXMub2Zmc2V0fHwwO2xldCB1PTM7cy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYodT1zLmRhdGEuc3RyaWRlKTtjb25zdCBmPVsiZ2V0WCIsImdldFkiLCJnZXRaIl07Zm9yKGxldCBkPWU7ZDxlK247ZCsrKXtjb25zdCBwPWQqMyx5PWQqNjtsZXQgbT1wKzAsZz1wKzEsYj1wKzI7ciYmKG09clttXSxnPXJbZ10sYj1yW2JdKSxhfHwobT1tKnUraCxnPWcqdStoLGI9Yip1K2gpO2ZvcihsZXQgdz0wO3c8Mzt3Kyspe2xldCB4LE0sQTthPyh4PXNbZlt3XV0obSksTT1zW2Zbd11dKGcpLEE9c1tmW3ddXShiKSk6KHg9bFttK3ddLE09bFtnK3ddLEE9bFtiK3ddKTtsZXQgXz14O008XyYmKF89TSksQTxfJiYoXz1BKTtsZXQgdj14O00+diYmKHY9TSksQT52JiYodj1BKTtjb25zdCBQPSh2LV8pLzIsej13KjI7Y1t5K3orMF09XytQLGNbeSt6KzFdPVArKE1hdGguYWJzKF8pK1ApKnRkfX1yZXR1cm4gY31mdW5jdGlvbiBsdChpLHQsZSl7cmV0dXJuIGUubWluLng9dFtpXSxlLm1pbi55PXRbaSsxXSxlLm1pbi56PXRbaSsyXSxlLm1heC54PXRbaSszXSxlLm1heC55PXRbaSs0XSxlLm1heC56PXRbaSs1XSxlfWZ1bmN0aW9uIHJsKGkpe2xldCB0PS0xLGU9LTEvMDtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBzPWlbbiszXS1pW25dO3M+ZSYmKGU9cyx0PW4pfXJldHVybiB0fWZ1bmN0aW9uIG9sKGksdCl7dC5zZXQoaSl9ZnVuY3Rpb24gYWwoaSx0LGUpe2xldCBuLHM7Zm9yKGxldCByPTA7cjwzO3IrKyl7Y29uc3Qgbz1yKzM7bj1pW3JdLHM9dFtyXSxlW3JdPW48cz9uOnMsbj1pW29dLHM9dFtvXSxlW29dPW4+cz9uOnN9fWZ1bmN0aW9uIENzKGksdCxlKXtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBzPXRbaSsyKm5dLHI9dFtpKzIqbisxXSxvPXMtcixhPXMrcjtvPGVbbl0mJihlW25dPW8pLGE+ZVtuKzNdJiYoZVtuKzNdPWEpfX1mdW5jdGlvbiBDaShpKXtjb25zdCB0PWlbM10taVswXSxlPWlbNF0taVsxXSxuPWlbNV0taVsyXTtyZXR1cm4gMioodCplK2UqbituKnQpfWNvbnN0IEZlPTMyLG9kPShpLHQpPT5pLmNhbmRpZGF0ZS10LmNhbmRpZGF0ZSxLZT1uZXcgQXJyYXkoRmUpLmZpbGwoKS5tYXAoKCk9Pih7Y291bnQ6MCxib3VuZHM6bmV3IEZsb2F0MzJBcnJheSg2KSxyaWdodENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksbGVmdENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksY2FuZGlkYXRlOjB9KSksQnM9bmV3IEZsb2F0MzJBcnJheSg2KTtmdW5jdGlvbiBhZChpLHQsZSxuLHMscil7bGV0IG89LTEsYT0wO2lmKHI9PT10bClvPXJsKHQpLG8hPT0tMSYmKGE9KHRbb10rdFtvKzNdKS8yKTtlbHNlIGlmKHI9PT1RZilvPXJsKGkpLG8hPT0tMSYmKGE9Y2QoZSxuLHMsbykpO2Vsc2UgaWYocj09PUtmKXtjb25zdCBjPUNpKGkpO2xldCBsPUxvKnM7Y29uc3QgaD1uKjYsdT0obitzKSo2O2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9dFtmXSxtPSh0W2YrM10tZCkvRmU7aWYoczxGZS80KXtjb25zdCBnPVsuLi5LZV07Zy5sZW5ndGg9cztsZXQgYj0wO2ZvcihsZXQgeD1oO3g8dTt4Kz02LGIrKyl7Y29uc3QgTT1nW2JdO00uY2FuZGlkYXRlPWVbeCsyKmZdLE0uY291bnQ9MDtjb25zdHtib3VuZHM6QSxsZWZ0Q2FjaGVCb3VuZHM6XyxyaWdodENhY2hlQm91bmRzOnZ9PU07Zm9yKGxldCBQPTA7UDwzO1ArKyl2W1BdPTEvMCx2W1ArM109LTEvMCxfW1BdPTEvMCxfW1ArM109LTEvMCxBW1BdPTEvMCxBW1ArM109LTEvMDtDcyh4LGUsQSl9Zy5zb3J0KG9kKTtsZXQgdz1zO2ZvcihsZXQgeD0wO3g8dzt4Kyspe2NvbnN0IE09Z1t4XTtmb3IoO3grMTx3JiZnW3grMV0uY2FuZGlkYXRlPT09TS5jYW5kaWRhdGU7KWcuc3BsaWNlKHgrMSwxKSx3LS19Zm9yKGxldCB4PWg7eDx1O3grPTYpe2NvbnN0IE09ZVt4KzIqZl07Zm9yKGxldCBBPTA7QTx3O0ErKyl7Y29uc3QgXz1nW0FdO00+PV8uY2FuZGlkYXRlP0NzKHgsZSxfLnJpZ2h0Q2FjaGVCb3VuZHMpOihDcyh4LGUsXy5sZWZ0Q2FjaGVCb3VuZHMpLF8uY291bnQrKyl9fWZvcihsZXQgeD0wO3g8dzt4Kyspe2NvbnN0IE09Z1t4XSxBPU0uY291bnQsXz1zLU0uY291bnQsdj1NLmxlZnRDYWNoZUJvdW5kcyxQPU0ucmlnaHRDYWNoZUJvdW5kcztsZXQgej0wO0EhPT0wJiYoej1DaSh2KS9jKTtsZXQgUz0wO18hPT0wJiYoUz1DaShQKS9jKTtjb25zdCBDPW5sK0xvKih6KkErUypfKTtDPGwmJihvPWYsbD1DLGE9TS5jYW5kaWRhdGUpfX1lbHNle2ZvcihsZXQgdz0wO3c8RmU7dysrKXtjb25zdCB4PUtlW3ddO3guY291bnQ9MCx4LmNhbmRpZGF0ZT1kK20rdyptO2NvbnN0IE09eC5ib3VuZHM7Zm9yKGxldCBBPTA7QTwzO0ErKylNW0FdPTEvMCxNW0ErM109LTEvMH1mb3IobGV0IHc9aDt3PHU7dys9Nil7bGV0IEE9fn4oKGVbdysyKmZdLWQpL20pO0E+PUZlJiYoQT1GZS0xKTtjb25zdCBfPUtlW0FdO18uY291bnQrKyxDcyh3LGUsXy5ib3VuZHMpfWNvbnN0IGc9S2VbRmUtMV07b2woZy5ib3VuZHMsZy5yaWdodENhY2hlQm91bmRzKTtmb3IobGV0IHc9RmUtMjt3Pj0wO3ctLSl7Y29uc3QgeD1LZVt3XSxNPUtlW3crMV07YWwoeC5ib3VuZHMsTS5yaWdodENhY2hlQm91bmRzLHgucmlnaHRDYWNoZUJvdW5kcyl9bGV0IGI9MDtmb3IobGV0IHc9MDt3PEZlLTE7dysrKXtjb25zdCB4PUtlW3ddLE09eC5jb3VudCxBPXguYm91bmRzLHY9S2VbdysxXS5yaWdodENhY2hlQm91bmRzO00hPT0wJiYoYj09PTA/b2woQSxCcyk6YWwoQSxCcyxCcykpLGIrPU07bGV0IFA9MCx6PTA7YiE9PTAmJihQPUNpKEJzKS9jKTtjb25zdCBTPXMtYjtTIT09MCYmKHo9Q2kodikvYyk7Y29uc3QgQz1ubCtMbyooUCpiK3oqUyk7QzxsJiYobz1mLGw9QyxhPXguY2FuZGlkYXRlKX19fX1lbHNlIGNvbnNvbGUud2FybihgTWVzaEJWSDogSW52YWxpZCBidWlsZCBzdHJhdGVneSB2YWx1ZSAke3J9IHVzZWQuYCk7cmV0dXJue2F4aXM6byxwb3M6YX19ZnVuY3Rpb24gY2QoaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPXQrZTtyPG87cisrKXMrPWlbcio2K24qMl07cmV0dXJuIHMvZX1jbGFzcyAkb3tjb25zdHJ1Y3Rvcigpe3RoaXMuYm91bmRpbmdEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNil9fWZ1bmN0aW9uIGxkKGksdCxlLG4scyxyKXtsZXQgbz1uLGE9bitzLTE7Y29uc3QgYz1yLnBvcyxsPXIuYXhpcyoyO2Zvcig7Oyl7Zm9yKDtvPD1hJiZlW28qNitsXTxjOylvKys7Zm9yKDtvPD1hJiZlW2EqNitsXT49YzspYS0tO2lmKG88YSl7Zm9yKGxldCBoPTA7aDwzO2grKyl7bGV0IHU9dFtvKjMraF07dFtvKjMraF09dFthKjMraF0sdFthKjMraF09dX1mb3IobGV0IGg9MDtoPDY7aCsrKXtsZXQgdT1lW28qNitoXTtlW28qNitoXT1lW2EqNitoXSxlW2EqNitoXT11fW8rKyxhLS19ZWxzZSByZXR1cm4gb319ZnVuY3Rpb24gaGQoaSx0LGUsbixzLHIpe2xldCBvPW4sYT1uK3MtMTtjb25zdCBjPXIucG9zLGw9ci5heGlzKjI7Zm9yKDs7KXtmb3IoO288PWEmJmVbbyo2K2xdPGM7KW8rKztmb3IoO288PWEmJmVbYSo2K2xdPj1jOylhLS07aWYobzxhKXtsZXQgaD1pW29dO2lbb109aVthXSxpW2FdPWg7Zm9yKGxldCB1PTA7dTw2O3UrKyl7bGV0IGY9ZVtvKjYrdV07ZVtvKjYrdV09ZVthKjYrdV0sZVthKjYrdV09Zn1vKyssYS0tfWVsc2UgcmV0dXJuIG99fWZ1bmN0aW9uIGt0KGksdCl7cmV0dXJuIHRbaSsxNV09PT02NTUzNX1mdW5jdGlvbiBWdChpLHQpe3JldHVybiB0W2krNl19ZnVuY3Rpb24gS3QoaSx0KXtyZXR1cm4gdFtpKzE0XX1mdW5jdGlvbiB0ZShpKXtyZXR1cm4gaSs4fWZ1bmN0aW9uIGVlKGksdCl7cmV0dXJuIHRbaSs2XX1mdW5jdGlvbiBjbChpLHQpe3JldHVybiB0W2krN119ZnVuY3Rpb24gWGcoaSl7cmV0dXJuIGl9bGV0IGxsLEJpLEZzLGhsO2NvbnN0IHVkPU1hdGgucG93KDIsMzIpO2Z1bmN0aW9uIFVvKGkpe3JldHVybiJjb3VudCJpbiBpPzE6MStVbyhpLmxlZnQpK1VvKGkucmlnaHQpfWZ1bmN0aW9uIGZkKGksdCxlKXtyZXR1cm4gbGw9bmV3IEZsb2F0MzJBcnJheShlKSxCaT1uZXcgVWludDMyQXJyYXkoZSksRnM9bmV3IFVpbnQxNkFycmF5KGUpLGhsPW5ldyBVaW50OEFycmF5KGUpLFZvKGksdCl9ZnVuY3Rpb24gVm8oaSx0KXtjb25zdCBlPWkvNCxuPWkvMixzPSJjb3VudCJpbiB0LHI9dC5ib3VuZGluZ0RhdGE7Zm9yKGxldCBvPTA7bzw2O28rKylsbFtlK29dPXJbb107aWYocylpZih0LmJ1ZmZlcil7Y29uc3Qgbz10LmJ1ZmZlcjtobC5zZXQobmV3IFVpbnQ4QXJyYXkobyksaSk7Zm9yKGxldCBhPWksYz1pK28uYnl0ZUxlbmd0aDthPGM7YSs9RWkpe2NvbnN0IGw9YS8yO2t0KGwsRnMpfHwoQmlbYS80KzZdKz1lKX1yZXR1cm4gaStvLmJ5dGVMZW5ndGh9ZWxzZXtjb25zdCBvPXQub2Zmc2V0LGE9dC5jb3VudDtyZXR1cm4gQmlbZSs2XT1vLEZzW24rMTRdPWEsRnNbbisxNV09RXMsaStFaX1lbHNle2NvbnN0IG89dC5sZWZ0LGE9dC5yaWdodCxjPXQuc3BsaXRBeGlzO2xldCBsO2lmKGw9Vm8oaStFaSxvKSxsLzQ+dWQpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBDYW5ub3Qgc3RvcmUgY2hpbGQgcG9pbnRlciBncmVhdGVyIHRoYW4gMzIgYml0cy4iKTtyZXR1cm4gQmlbZSs2XT1sLzQsbD1WbyhsLGEpLEJpW2UrN109YyxsfX1mdW5jdGlvbiBkZChpLHQpe2NvbnN0IGU9KGkuaW5kZXg/aS5pbmRleC5jb3VudDppLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQpLzMsbj1lPnlpKDIsMTYpLHM9bj80OjIscj10P25ldyBTaGFyZWRBcnJheUJ1ZmZlcihlKnMpOm5ldyBBcnJheUJ1ZmZlcihlKnMpLG89bj9uZXcgVWludDMyQXJyYXkocik6bmV3IFVpbnQxNkFycmF5KHIpO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKylvW2FdPWE7cmV0dXJuIG99ZnVuY3Rpb24gcGQoaSx0LGUsbixzKXtjb25zdHttYXhEZXB0aDpyLHZlcmJvc2U6byxtYXhMZWFmVHJpczphLHN0cmF0ZWd5OmMsb25Qcm9ncmVzczpsLGluZGlyZWN0Omh9PXMsdT1pLl9pbmRpcmVjdEJ1ZmZlcixmPWkuZ2VvbWV0cnksZD1mLmluZGV4P2YuaW5kZXguYXJyYXk6bnVsbCxwPWg/aGQ6bGQseT1abihmKSxtPW5ldyBGbG9hdDMyQXJyYXkoNik7bGV0IGc9ITE7Y29uc3QgYj1uZXcgJG87cmV0dXJuIERvKHQsZSxuLGIuYm91bmRpbmdEYXRhLG0pLHgoYixlLG4sbSksYjtmdW5jdGlvbiB3KE0pe2wmJmwoTS95KX1mdW5jdGlvbiB4KE0sQSxfLHY9bnVsbCxQPTApe2lmKCFnJiZQPj1yJiYoZz0hMCxvJiYoY29uc29sZS53YXJuKGBNZXNoQlZIOiBNYXggZGVwdGggb2YgJHtyfSByZWFjaGVkIHdoZW4gZ2VuZXJhdGluZyBCVkguIENvbnNpZGVyIGluY3JlYXNpbmcgbWF4RGVwdGguYCksY29uc29sZS53YXJuKGYpKSksXzw9YXx8UD49cilyZXR1cm4gdyhBK18pLE0ub2Zmc2V0PUEsTS5jb3VudD1fLE07Y29uc3Qgej1hZChNLmJvdW5kaW5nRGF0YSx2LHQsQSxfLGMpO2lmKHouYXhpcz09PS0xKXJldHVybiB3KEErXyksTS5vZmZzZXQ9QSxNLmNvdW50PV8sTTtjb25zdCBTPXAodSxkLHQsQSxfLHopO2lmKFM9PT1BfHxTPT09QStfKXcoQStfKSxNLm9mZnNldD1BLE0uY291bnQ9XztlbHNle00uc3BsaXRBeGlzPXouYXhpcztjb25zdCBDPW5ldyAkbyxFPUEsRj1TLUE7TS5sZWZ0PUMsRG8odCxFLEYsQy5ib3VuZGluZ0RhdGEsbSkseChDLEUsRixtLFArMSk7Y29uc3QgQj1uZXcgJG8sST1TLGs9Xy1GO00ucmlnaHQ9QixEbyh0LEksayxCLmJvdW5kaW5nRGF0YSxtKSx4KEIsSSxrLG0sUCsxKX1yZXR1cm4gTX19ZnVuY3Rpb24geWQoaSx0KXtjb25zdCBlPWkuZ2VvbWV0cnk7dC5pbmRpcmVjdCYmKGkuX2luZGlyZWN0QnVmZmVyPWRkKGUsdC51c2VTaGFyZWRBcnJheUJ1ZmZlciksc2QoZSx0LnJhbmdlKSYmIXQudmVyYm9zZSYmY29uc29sZS53YXJuKCdNZXNoQlZIOiBQcm92aWRlZCBnZW9tZXRyeSBjb250YWlucyBncm91cHMgb3IgYSByYW5nZSB0aGF0IGRvIG5vdCBmdWxseSBzcGFuIHRoZSB2ZXJ0ZXggY29udGVudHMgd2hpbGUgdXNpbmcgdGhlICJpbmRpcmVjdCIgb3B0aW9uLiBCVkggbWF5IGluY29ycmVjdGx5IHJlcG9ydCBpbnRlcnNlY3Rpb25zIG9uIHVucmVuZGVyZWQgcG9ydGlvbnMgb2YgdGhlIGdlb21ldHJ5LicpKSxpLl9pbmRpcmVjdEJ1ZmZlcnx8aWQoZSx0KTtjb25zdCBuPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz1yZChlKSxyPXQuaW5kaXJlY3Q/aWwoZSx0LnJhbmdlKTpzbChlLHQucmFuZ2UpO2kuX3Jvb3RzPXIubWFwKG89Pntjb25zdCBhPXBkKGkscyxvLm9mZnNldCxvLmNvdW50LHQpLGM9VW8oYSksbD1uZXcgbihFaSpjKTtyZXR1cm4gZmQoMCxhLGwpLGx9KX1jbGFzcyBJZXtjb25zdHJ1Y3Rvcigpe3RoaXMubWluPTEvMCx0aGlzLm1heD0tMS8wfXNldEZyb21Qb2ludHNGaWVsZCh0LGUpe2xldCBuPTEvMCxzPS0xLzA7Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXtjb25zdCBjPXRbcl1bZV07bj1jPG4/YzpuLHM9Yz5zP2M6c310aGlzLm1pbj1uLHRoaXMubWF4PXN9c2V0RnJvbVBvaW50cyh0LGUpe2xldCBuPTEvMCxzPS0xLzA7Zm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPWVbcl0sYz10LmRvdChhKTtuPWM8bj9jOm4scz1jPnM/YzpzfXRoaXMubWluPW4sdGhpcy5tYXg9c31pc1NlcGFyYXRlZCh0KXtyZXR1cm4gdGhpcy5taW4+dC5tYXh8fHQubWluPnRoaXMubWF4fX1JZS5wcm90b3R5cGUuc2V0RnJvbUJveD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKGUsbil7Y29uc3Qgcz1uLm1pbixyPW4ubWF4O2xldCBvPTEvMCxhPS0xLzA7Zm9yKGxldCBjPTA7Yzw9MTtjKyspZm9yKGxldCBsPTA7bDw9MTtsKyspZm9yKGxldCBoPTA7aDw9MTtoKyspe2kueD1zLngqYytyLngqKDEtYyksaS55PXMueSpsK3IueSooMS1sKSxpLno9cy56Kmgrci56KigxLWgpO2NvbnN0IHU9ZS5kb3QoaSk7bz1NYXRoLm1pbih1LG8pLGE9TWF0aC5tYXgodSxhKX10aGlzLm1pbj1vLHRoaXMubWF4PWF9fSgpO2NvbnN0IG1kPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVCx0PW5ldyBULGU9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKHMscixvKXtjb25zdCBhPXMuc3RhcnQsYz1pLGw9ci5zdGFydCxoPXQ7ZS5zdWJWZWN0b3JzKGEsbCksaS5zdWJWZWN0b3JzKHMuZW5kLHMuc3RhcnQpLHQuc3ViVmVjdG9ycyhyLmVuZCxyLnN0YXJ0KTtjb25zdCB1PWUuZG90KGgpLGY9aC5kb3QoYyksZD1oLmRvdChoKSxwPWUuZG90KGMpLG09Yy5kb3QoYykqZC1mKmY7bGV0IGcsYjttIT09MD9nPSh1KmYtcCpkKS9tOmc9MCxiPSh1K2cqZikvZCxvLng9ZyxvLnk9Yn19KCkscW89ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBSLHQ9bmV3IFQsZT1uZXcgVDtyZXR1cm4gZnVuY3Rpb24ocyxyLG8sYSl7bWQocyxyLGkpO2xldCBjPWkueCxsPWkueTtpZihjPj0wJiZjPD0xJiZsPj0wJiZsPD0xKXtzLmF0KGMsbyksci5hdChsLGEpO3JldHVybn1lbHNlIGlmKGM+PTAmJmM8PTEpe2w8MD9yLmF0KDAsYSk6ci5hdCgxLGEpLHMuY2xvc2VzdFBvaW50VG9Qb2ludChhLCEwLG8pO3JldHVybn1lbHNlIGlmKGw+PTAmJmw8PTEpe2M8MD9zLmF0KDAsbyk6cy5hdCgxLG8pLHIuY2xvc2VzdFBvaW50VG9Qb2ludChvLCEwLGEpO3JldHVybn1lbHNle2xldCBoO2M8MD9oPXMuc3RhcnQ6aD1zLmVuZDtsZXQgdTtsPDA/dT1yLnN0YXJ0OnU9ci5lbmQ7Y29uc3QgZj10LGQ9ZTtpZihzLmNsb3Nlc3RQb2ludFRvUG9pbnQodSwhMCx0KSxyLmNsb3Nlc3RQb2ludFRvUG9pbnQoaCwhMCxlKSxmLmRpc3RhbmNlVG9TcXVhcmVkKHUpPD1kLmRpc3RhbmNlVG9TcXVhcmVkKGgpKXtvLmNvcHkoZiksYS5jb3B5KHUpO3JldHVybn1lbHNle28uY29weShoKSxhLmNvcHkoZCk7cmV0dXJufX19fSgpLGdkPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVCx0PW5ldyBULGU9bmV3IFNvLG49bmV3IFF0O3JldHVybiBmdW5jdGlvbihyLG8pe2NvbnN0e3JhZGl1czphLGNlbnRlcjpjfT1yLHthOmwsYjpoLGM6dX09bztpZihuLnN0YXJ0PWwsbi5lbmQ9aCxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYywhMCxpKS5kaXN0YW5jZVRvKGMpPD1hfHwobi5zdGFydD1sLG4uZW5kPXUsbi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAsaSkuZGlzdGFuY2VUbyhjKTw9YSl8fChuLnN0YXJ0PWgsbi5lbmQ9dSxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYywhMCxpKS5kaXN0YW5jZVRvKGMpPD1hKSlyZXR1cm4hMDtjb25zdCB5PW8uZ2V0UGxhbmUoZSk7aWYoTWF0aC5hYnMoeS5kaXN0YW5jZVRvUG9pbnQoYykpPD1hKXtjb25zdCBnPXkucHJvamVjdFBvaW50KGMsdCk7aWYoby5jb250YWluc1BvaW50KGcpKXJldHVybiEwfXJldHVybiExfX0oKSx4ZD0xZS0xNTtmdW5jdGlvbiBIbyhpKXtyZXR1cm4gTWF0aC5hYnMoaSk8eGR9Y2xhc3MgbmUgZXh0ZW5kcyBldHtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLmlzRXh0ZW5kZWRUcmlhbmdsZT0hMCx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCk9Pm5ldyBUKSx0aGlzLnNhdEJvdW5kcz1uZXcgQXJyYXkoNCkuZmlsbCgpLm1hcCgoKT0+bmV3IEllKSx0aGlzLnBvaW50cz1bdGhpcy5hLHRoaXMuYix0aGlzLmNdLHRoaXMuc3BoZXJlPW5ldyBhbyx0aGlzLnBsYW5lPW5ldyBTbyx0aGlzLm5lZWRzVXBkYXRlPSEwfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIGdkKHQsdGhpcyl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmEsZT10aGlzLmIsbj10aGlzLmMscz10aGlzLnBvaW50cyxyPXRoaXMuc2F0QXhlcyxvPXRoaXMuc2F0Qm91bmRzLGE9clswXSxjPW9bMF07dGhpcy5nZXROb3JtYWwoYSksYy5zZXRGcm9tUG9pbnRzKGEscyk7Y29uc3QgbD1yWzFdLGg9b1sxXTtsLnN1YlZlY3RvcnModCxlKSxoLnNldEZyb21Qb2ludHMobCxzKTtjb25zdCB1PXJbMl0sZj1vWzJdO3Uuc3ViVmVjdG9ycyhlLG4pLGYuc2V0RnJvbVBvaW50cyh1LHMpO2NvbnN0IGQ9clszXSxwPW9bM107ZC5zdWJWZWN0b3JzKG4sdCkscC5zZXRGcm9tUG9pbnRzKGQscyksdGhpcy5zcGhlcmUuc2V0RnJvbVBvaW50cyh0aGlzLnBvaW50cyksdGhpcy5wbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChhLHQpLHRoaXMubmVlZHNVcGRhdGU9ITF9fW5lLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1NlZ21lbnQ9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBULHQ9bmV3IFQsZT1uZXcgUXQ7cmV0dXJuIGZ1bmN0aW9uKHMscj1udWxsLG89bnVsbCl7Y29uc3R7c3RhcnQ6YSxlbmQ6Y309cyxsPXRoaXMucG9pbnRzO2xldCBoLHU9MS8wO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9KGYrMSklMztlLnN0YXJ0LmNvcHkobFtmXSksZS5lbmQuY29weShsW2RdKSxxbyhlLHMsaSx0KSxoPWkuZGlzdGFuY2VUb1NxdWFyZWQodCksaDx1JiYodT1oLHImJnIuY29weShpKSxvJiZvLmNvcHkodCkpfXJldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSxpKSxoPWEuZGlzdGFuY2VUb1NxdWFyZWQoaSksaDx1JiYodT1oLHImJnIuY29weShpKSxvJiZvLmNvcHkoYSkpLHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChjLGkpLGg9Yy5kaXN0YW5jZVRvU3F1YXJlZChpKSxoPHUmJih1PWgsciYmci5jb3B5KGkpLG8mJm8uY29weShjKSksTWF0aC5zcXJ0KHUpfX0oKSxuZS5wcm90b3R5cGUuaW50ZXJzZWN0c1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgbmUsdD1uZXcgQXJyYXkoMyksZT1uZXcgQXJyYXkoMyksbj1uZXcgSWUscz1uZXcgSWUscj1uZXcgVCxvPW5ldyBULGE9bmV3IFQsYz1uZXcgVCxsPW5ldyBULGg9bmV3IFF0LHU9bmV3IFF0LGY9bmV3IFF0LGQ9bmV3IFQ7ZnVuY3Rpb24gcCh5LG0sZyl7Y29uc3QgYj15LnBvaW50cztsZXQgdz0wLHg9LTE7Zm9yKGxldCBNPTA7TTwzO00rKyl7Y29uc3R7c3RhcnQ6QSxlbmQ6X309aDtBLmNvcHkoYltNXSksXy5jb3B5KGJbKE0rMSklM10pLGguZGVsdGEobyk7Y29uc3Qgdj1IbyhtLmRpc3RhbmNlVG9Qb2ludChBKSk7aWYoSG8obS5ub3JtYWwuZG90KG8pKSYmdil7Zy5jb3B5KGgpLHc9MjticmVha31jb25zdCBQPW0uaW50ZXJzZWN0TGluZShoLGQpO2lmKCFQJiZ2JiZkLmNvcHkoQSksKFB8fHYpJiYhSG8oZC5kaXN0YW5jZVRvKF8pKSl7aWYodzw9MSkodz09PTE/Zy5zdGFydDpnLmVuZCkuY29weShkKSx2JiYoeD13KTtlbHNlIGlmKHc+PTIpeyh4PT09MT9nLnN0YXJ0OmcuZW5kKS5jb3B5KGQpLHc9MjticmVha31pZih3Kyssdz09PTImJng9PT0tMSlicmVha319cmV0dXJuIHd9cmV0dXJuIGZ1bmN0aW9uKG0sZz1udWxsLGI9ITEpe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksbS5pc0V4dGVuZGVkVHJpYW5nbGU/bS5uZWVkc1VwZGF0ZSYmbS51cGRhdGUoKTooaS5jb3B5KG0pLGkudXBkYXRlKCksbT1pKTtjb25zdCB3PXRoaXMucGxhbmUseD1tLnBsYW5lO2lmKE1hdGguYWJzKHcubm9ybWFsLmRvdCh4Lm5vcm1hbCkpPjEtMWUtMTApe2NvbnN0IE09dGhpcy5zYXRCb3VuZHMsQT10aGlzLnNhdEF4ZXM7ZVswXT1tLmEsZVsxXT1tLmIsZVsyXT1tLmM7Zm9yKGxldCBQPTA7UDw0O1ArKyl7Y29uc3Qgej1NW1BdLFM9QVtQXTtpZihuLnNldEZyb21Qb2ludHMoUyxlKSx6LmlzU2VwYXJhdGVkKG4pKXJldHVybiExfWNvbnN0IF89bS5zYXRCb3VuZHMsdj1tLnNhdEF4ZXM7dFswXT10aGlzLmEsdFsxXT10aGlzLmIsdFsyXT10aGlzLmM7Zm9yKGxldCBQPTA7UDw0O1ArKyl7Y29uc3Qgej1fW1BdLFM9dltQXTtpZihuLnNldEZyb21Qb2ludHMoUyx0KSx6LmlzU2VwYXJhdGVkKG4pKXJldHVybiExfWZvcihsZXQgUD0wO1A8NDtQKyspe2NvbnN0IHo9QVtQXTtmb3IobGV0IFM9MDtTPDQ7UysrKXtjb25zdCBDPXZbU107aWYoci5jcm9zc1ZlY3RvcnMoeixDKSxuLnNldEZyb21Qb2ludHMocix0KSxzLnNldEZyb21Qb2ludHMocixlKSxuLmlzU2VwYXJhdGVkKHMpKXJldHVybiExfX1yZXR1cm4gZyYmKGJ8fGNvbnNvbGUud2FybigiRXh0ZW5kZWRUcmlhbmdsZS5pbnRlcnNlY3RzVHJpYW5nbGU6IFRyaWFuZ2xlcyBhcmUgY29wbGFuYXIgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBhbiBvdXRwdXQgZWRnZS4gU2V0dGluZyBlZGdlIHRvIDAsIDAsIDAuIiksZy5zdGFydC5zZXQoMCwwLDApLGcuZW5kLnNldCgwLDAsMCkpLCEwfWVsc2V7Y29uc3QgTT1wKHRoaXMseCx1KTtpZihNPT09MSYmbS5jb250YWluc1BvaW50KHUuZW5kKSlyZXR1cm4gZyYmKGcuc3RhcnQuY29weSh1LmVuZCksZy5lbmQuY29weSh1LmVuZCkpLCEwO2lmKE0hPT0yKXJldHVybiExO2NvbnN0IEE9cChtLHcsZik7aWYoQT09PTEmJnRoaXMuY29udGFpbnNQb2ludChmLmVuZCkpcmV0dXJuIGcmJihnLnN0YXJ0LmNvcHkoZi5lbmQpLGcuZW5kLmNvcHkoZi5lbmQpKSwhMDtpZihBIT09MilyZXR1cm4hMTtpZih1LmRlbHRhKGEpLGYuZGVsdGEoYyksYS5kb3QoYyk8MCl7bGV0IEU9Zi5zdGFydDtmLnN0YXJ0PWYuZW5kLGYuZW5kPUV9Y29uc3QgXz11LnN0YXJ0LmRvdChhKSx2PXUuZW5kLmRvdChhKSxQPWYuc3RhcnQuZG90KGEpLHo9Zi5lbmQuZG90KGEpLFM9djxQLEM9Xzx6O3JldHVybiBfIT09eiYmUCE9PXYmJlM9PT1DPyExOihnJiYobC5zdWJWZWN0b3JzKHUuc3RhcnQsZi5zdGFydCksbC5kb3QoYSk+MD9nLnN0YXJ0LmNvcHkodS5zdGFydCk6Zy5zdGFydC5jb3B5KGYuc3RhcnQpLGwuc3ViVmVjdG9ycyh1LmVuZCxmLmVuZCksbC5kb3QoYSk8MD9nLmVuZC5jb3B5KHUuZW5kKTpnLmVuZC5jb3B5KGYuZW5kKSksITApfX19KCksbmUucHJvdG90eXBlLmRpc3RhbmNlVG9Qb2ludD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoZSxpKSxlLmRpc3RhbmNlVG8oaSl9fSgpLG5lLnByb3RvdHlwZS5kaXN0YW5jZVRvVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBULHQ9bmV3IFQsZT1bImEiLCJiIiwiYyJdLG49bmV3IFF0LHM9bmV3IFF0O3JldHVybiBmdW5jdGlvbihvLGE9bnVsbCxjPW51bGwpe2NvbnN0IGw9YXx8Yz9uOm51bGw7aWYodGhpcy5pbnRlcnNlY3RzVHJpYW5nbGUobyxsKSlyZXR1cm4oYXx8YykmJihhJiZsLmdldENlbnRlcihhKSxjJiZsLmdldENlbnRlcihjKSksMDtsZXQgaD0xLzA7Zm9yKGxldCB1PTA7dTwzO3UrKyl7bGV0IGY7Y29uc3QgZD1lW3VdLHA9b1tkXTt0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocCxpKSxmPXAuZGlzdGFuY2VUb1NxdWFyZWQoaSksZjxoJiYoaD1mLGEmJmEuY29weShpKSxjJiZjLmNvcHkocCkpO2NvbnN0IHk9dGhpc1tkXTtvLmNsb3Nlc3RQb2ludFRvUG9pbnQoeSxpKSxmPXkuZGlzdGFuY2VUb1NxdWFyZWQoaSksZjxoJiYoaD1mLGEmJmEuY29weSh5KSxjJiZjLmNvcHkoaSkpfWZvcihsZXQgdT0wO3U8Mzt1Kyspe2NvbnN0IGY9ZVt1XSxkPWVbKHUrMSklM107bi5zZXQodGhpc1tmXSx0aGlzW2RdKTtmb3IobGV0IHA9MDtwPDM7cCsrKXtjb25zdCB5PWVbcF0sbT1lWyhwKzEpJTNdO3Muc2V0KG9beV0sb1ttXSkscW8obixzLGksdCk7Y29uc3QgZz1pLmRpc3RhbmNlVG9TcXVhcmVkKHQpO2c8aCYmKGg9ZyxhJiZhLmNvcHkoaSksYyYmYy5jb3B5KHQpKX19cmV0dXJuIE1hdGguc3FydChoKX19KCk7Y2xhc3MgenR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuaXNPcmllbnRlZEJveD0hMCx0aGlzLm1pbj1uZXcgVCx0aGlzLm1heD1uZXcgVCx0aGlzLm1hdHJpeD1uZXcgc3QsdGhpcy5pbnZNYXRyaXg9bmV3IHN0LHRoaXMucG9pbnRzPW5ldyBBcnJheSg4KS5maWxsKCkubWFwKCgpPT5uZXcgVCksdGhpcy5zYXRBeGVzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgVCksdGhpcy5zYXRCb3VuZHM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCk9Pm5ldyBJZSksdGhpcy5hbGlnbmVkU2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgSWUpLHRoaXMubmVlZHNVcGRhdGU9ITEsdCYmdGhpcy5taW4uY29weSh0KSxlJiZ0aGlzLm1heC5jb3B5KGUpLG4mJnRoaXMubWF0cml4LmNvcHkobil9c2V0KHQsZSxuKXt0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpcy5tYXRyaXguY29weShuKSx0aGlzLm5lZWRzVXBkYXRlPSEwfWNvcHkodCl7dGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5uZWVkc1VwZGF0ZT0hMH19enQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5tYXRyaXgsZT10aGlzLm1pbixuPXRoaXMubWF4LHM9dGhpcy5wb2ludHM7Zm9yKGxldCBsPTA7bDw9MTtsKyspZm9yKGxldCBoPTA7aDw9MTtoKyspZm9yKGxldCB1PTA7dTw9MTt1Kyspe2NvbnN0IGY9MSpsfDIqaHw0KnUsZD1zW2ZdO2QueD1sP24ueDplLngsZC55PWg/bi55OmUueSxkLno9dT9uLno6ZS56LGQuYXBwbHlNYXRyaXg0KHQpfWNvbnN0IHI9dGhpcy5zYXRCb3VuZHMsbz10aGlzLnNhdEF4ZXMsYT1zWzBdO2ZvcihsZXQgbD0wO2w8MztsKyspe2NvbnN0IGg9b1tsXSx1PXJbbF0sZj0xPDxsLGQ9c1tmXTtoLnN1YlZlY3RvcnMoYSxkKSx1LnNldEZyb21Qb2ludHMoaCxzKX1jb25zdCBjPXRoaXMuYWxpZ25lZFNhdEJvdW5kcztjWzBdLnNldEZyb21Qb2ludHNGaWVsZChzLCJ4IiksY1sxXS5zZXRGcm9tUG9pbnRzRmllbGQocywieSIpLGNbMl0uc2V0RnJvbVBvaW50c0ZpZWxkKHMsInoiKSx0aGlzLmludk1hdHJpeC5jb3B5KHRoaXMubWF0cml4KS5pbnZlcnQoKSx0aGlzLm5lZWRzVXBkYXRlPSExfX0oKSx6dC5wcm90b3R5cGUuaW50ZXJzZWN0c0JveD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IEllO3JldHVybiBmdW5jdGlvbihlKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpO2NvbnN0IG49ZS5taW4scz1lLm1heCxyPXRoaXMuc2F0Qm91bmRzLG89dGhpcy5zYXRBeGVzLGE9dGhpcy5hbGlnbmVkU2F0Qm91bmRzO2lmKGkubWluPW4ueCxpLm1heD1zLngsYVswXS5pc1NlcGFyYXRlZChpKXx8KGkubWluPW4ueSxpLm1heD1zLnksYVsxXS5pc1NlcGFyYXRlZChpKSl8fChpLm1pbj1uLnosaS5tYXg9cy56LGFbMl0uaXNTZXBhcmF0ZWQoaSkpKXJldHVybiExO2ZvcihsZXQgYz0wO2M8MztjKyspe2NvbnN0IGw9b1tjXSxoPXJbY107aWYoaS5zZXRGcm9tQm94KGwsZSksaC5pc1NlcGFyYXRlZChpKSlyZXR1cm4hMX1yZXR1cm4hMH19KCksenQucHJvdG90eXBlLmludGVyc2VjdHNUcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IG5lLHQ9bmV3IEFycmF5KDMpLGU9bmV3IEllLG49bmV3IEllLHM9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKG8pe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksby5pc0V4dGVuZGVkVHJpYW5nbGU/by5uZWVkc1VwZGF0ZSYmby51cGRhdGUoKTooaS5jb3B5KG8pLGkudXBkYXRlKCksbz1pKTtjb25zdCBhPXRoaXMuc2F0Qm91bmRzLGM9dGhpcy5zYXRBeGVzO3RbMF09by5hLHRbMV09by5iLHRbMl09by5jO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9YVtmXSxwPWNbZl07aWYoZS5zZXRGcm9tUG9pbnRzKHAsdCksZC5pc1NlcGFyYXRlZChlKSlyZXR1cm4hMX1jb25zdCBsPW8uc2F0Qm91bmRzLGg9by5zYXRBeGVzLHU9dGhpcy5wb2ludHM7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD1sW2ZdLHA9aFtmXTtpZihlLnNldEZyb21Qb2ludHMocCx1KSxkLmlzU2VwYXJhdGVkKGUpKXJldHVybiExfWZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9Y1tmXTtmb3IobGV0IHA9MDtwPDQ7cCsrKXtjb25zdCB5PWhbcF07aWYocy5jcm9zc1ZlY3RvcnMoZCx5KSxlLnNldEZyb21Qb2ludHMocyx0KSxuLnNldEZyb21Qb2ludHMocyx1KSxlLmlzU2VwYXJhdGVkKG4pKXJldHVybiExfX1yZXR1cm4hMH19KCksenQucHJvdG90eXBlLmNsb3Nlc3RQb2ludFRvUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSxlLmNvcHkodCkuYXBwbHlNYXRyaXg0KHRoaXMuaW52TWF0cml4KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4KSxlfX0oKSx6dC5wcm90b3R5cGUuZGlzdGFuY2VUb1BvaW50PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChlLGkpLGUuZGlzdGFuY2VUbyhpKX19KCksenQucHJvdG90eXBlLmRpc3RhbmNlVG9Cb3g9ZnVuY3Rpb24oKXtjb25zdCBpPVsieCIsInkiLCJ6Il0sdD1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyBRdCksZT1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyBRdCksbj1uZXcgVCxzPW5ldyBUO3JldHVybiBmdW5jdGlvbihvLGE9MCxjPW51bGwsbD1udWxsKXtpZih0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLHRoaXMuaW50ZXJzZWN0c0JveChvKSlyZXR1cm4oY3x8bCkmJihvLmdldENlbnRlcihzKSx0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocyxuKSxvLmNsb3Nlc3RQb2ludFRvUG9pbnQobixzKSxjJiZjLmNvcHkobiksbCYmbC5jb3B5KHMpKSwwO2NvbnN0IGg9YSphLHU9by5taW4sZj1vLm1heCxkPXRoaXMucG9pbnRzO2xldCBwPTEvMDtmb3IobGV0IG09MDttPDg7bSsrKXtjb25zdCBnPWRbbV07cy5jb3B5KGcpLmNsYW1wKHUsZik7Y29uc3QgYj1nLmRpc3RhbmNlVG9TcXVhcmVkKHMpO2lmKGI8cCYmKHA9YixjJiZjLmNvcHkoZyksbCYmbC5jb3B5KHMpLGI8aCkpcmV0dXJuIE1hdGguc3FydChiKX1sZXQgeT0wO2ZvcihsZXQgbT0wO208MzttKyspZm9yKGxldCBnPTA7Zzw9MTtnKyspZm9yKGxldCBiPTA7Yjw9MTtiKyspe2NvbnN0IHc9KG0rMSklMyx4PShtKzIpJTMsTT1nPDx3fGI8PHgsQT0xPDxtfGc8PHd8Yjw8eCxfPWRbTV0sdj1kW0FdO3RbeV0uc2V0KF8sdik7Y29uc3Qgej1pW21dLFM9aVt3XSxDPWlbeF0sRT1lW3ldLEY9RS5zdGFydCxCPUUuZW5kO0Zbel09dVt6XSxGW1NdPWc/dVtTXTpmW1NdLEZbQ109Yj91W0NdOmZbU10sQlt6XT1mW3pdLEJbU109Zz91W1NdOmZbU10sQltDXT1iP3VbQ106ZltTXSx5Kyt9Zm9yKGxldCBtPTA7bTw9MTttKyspZm9yKGxldCBnPTA7Zzw9MTtnKyspZm9yKGxldCBiPTA7Yjw9MTtiKyspe3MueD1tP2YueDp1Lngscy55PWc/Zi55OnUueSxzLno9Yj9mLno6dS56LHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChzLG4pO2NvbnN0IHc9cy5kaXN0YW5jZVRvU3F1YXJlZChuKTtpZih3PHAmJihwPXcsYyYmYy5jb3B5KG4pLGwmJmwuY29weShzKSx3PGgpKXJldHVybiBNYXRoLnNxcnQodyl9Zm9yKGxldCBtPTA7bTwxMjttKyspe2NvbnN0IGc9dFttXTtmb3IobGV0IGI9MDtiPDEyO2IrKyl7Y29uc3Qgdz1lW2JdO3FvKGcsdyxuLHMpO2NvbnN0IHg9bi5kaXN0YW5jZVRvU3F1YXJlZChzKTtpZih4PHAmJihwPXgsYyYmYy5jb3B5KG4pLGwmJmwuY29weShzKSx4PGgpKXJldHVybiBNYXRoLnNxcnQoeCl9fXJldHVybiBNYXRoLnNxcnQocCl9fSgpO2NsYXNzIFdve2NvbnN0cnVjdG9yKHQpe3RoaXMuX2dldE5ld1ByaW1pdGl2ZT10LHRoaXMuX3ByaW1pdGl2ZXM9W119Z2V0UHJpbWl0aXZlKCl7Y29uc3QgdD10aGlzLl9wcmltaXRpdmVzO3JldHVybiB0Lmxlbmd0aD09PTA/dGhpcy5fZ2V0TmV3UHJpbWl0aXZlKCk6dC5wb3AoKX1yZWxlYXNlUHJpbWl0aXZlKHQpe3RoaXMuX3ByaW1pdGl2ZXMucHVzaCh0KX19Y2xhc3Mgd2QgZXh0ZW5kcyBXb3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCgpPT5uZXcgbmUpfX1jb25zdCBpZT1uZXcgd2Q7Y2xhc3MgYmR7Y29uc3RydWN0b3IoKXt0aGlzLmZsb2F0MzJBcnJheT1udWxsLHRoaXMudWludDE2QXJyYXk9bnVsbCx0aGlzLnVpbnQzMkFycmF5PW51bGw7Y29uc3QgdD1bXTtsZXQgZT1udWxsO3RoaXMuc2V0QnVmZmVyPW49PntlJiZ0LnB1c2goZSksZT1uLHRoaXMuZmxvYXQzMkFycmF5PW5ldyBGbG9hdDMyQXJyYXkobiksdGhpcy51aW50MTZBcnJheT1uZXcgVWludDE2QXJyYXkobiksdGhpcy51aW50MzJBcnJheT1uZXcgVWludDMyQXJyYXkobil9LHRoaXMuY2xlYXJCdWZmZXI9KCk9PntlPW51bGwsdGhpcy5mbG9hdDMyQXJyYXk9bnVsbCx0aGlzLnVpbnQxNkFycmF5PW51bGwsdGhpcy51aW50MzJBcnJheT1udWxsLHQubGVuZ3RoIT09MCYmdGhpcy5zZXRCdWZmZXIodC5wb3AoKSl9fX1jb25zdCBudD1uZXcgYmQ7bGV0IHRuLFhuO2NvbnN0IEpuPVtdLElzPW5ldyBXbygoKT0+bmV3IGd0KTtmdW5jdGlvbiBNZChpLHQsZSxuLHMscil7dG49SXMuZ2V0UHJpbWl0aXZlKCksWG49SXMuZ2V0UHJpbWl0aXZlKCksSm4ucHVzaCh0bixYbiksbnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBvPUdvKDAsaS5nZW9tZXRyeSxlLG4scyxyKTtudC5jbGVhckJ1ZmZlcigpLElzLnJlbGVhc2VQcmltaXRpdmUodG4pLElzLnJlbGVhc2VQcmltaXRpdmUoWG4pLEpuLnBvcCgpLEpuLnBvcCgpO2NvbnN0IGE9Sm4ubGVuZ3RoO3JldHVybiBhPjAmJihYbj1KblthLTFdLHRuPUpuW2EtMl0pLG99ZnVuY3Rpb24gR28oaSx0LGUsbixzPW51bGwscj0wLG89MCl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT1udDtsZXQgaD1pKjI7aWYoa3QoaCxjKSl7Y29uc3QgZj1WdChpLGwpLGQ9S3QoaCxjKTtyZXR1cm4gbHQoaSxhLHRuKSxuKGYsZCwhMSxvLHIraSx0bil9ZWxzZXtsZXQgej1mdW5jdGlvbihDKXtjb25zdHt1aW50MTZBcnJheTpFLHVpbnQzMkFycmF5OkZ9PW50O2xldCBCPUMqMjtmb3IoOyFrdChCLEUpOylDPXRlKEMpLEI9QyoyO3JldHVybiBWdChDLEYpfSxTPWZ1bmN0aW9uKEMpe2NvbnN0e3VpbnQxNkFycmF5OkUsdWludDMyQXJyYXk6Rn09bnQ7bGV0IEI9QyoyO2Zvcig7IWt0KEIsRSk7KUM9ZWUoQyxGKSxCPUMqMjtyZXR1cm4gVnQoQyxGKStLdChCLEUpfTtjb25zdCBmPXRlKGkpLGQ9ZWUoaSxsKTtsZXQgcD1mLHk9ZCxtLGcsYix3O2lmKHMmJihiPXRuLHc9WG4sbHQocCxhLGIpLGx0KHksYSx3KSxtPXMoYiksZz1zKHcpLGc8bSkpe3A9ZCx5PWY7Y29uc3QgQz1tO209ZyxnPUMsYj13fWJ8fChiPXRuLGx0KHAsYSxiKSk7Y29uc3QgeD1rdChwKjIsYyksTT1lKGIseCxtLG8rMSxyK3ApO2xldCBBO2lmKE09PT1lbCl7Y29uc3QgQz16KHApLEY9UyhwKS1DO0E9bihDLEYsITAsbysxLHIrcCxiKX1lbHNlIEE9TSYmR28ocCx0LGUsbixzLHIsbysxKTtpZihBKXJldHVybiEwO3c9WG4sbHQoeSxhLHcpO2NvbnN0IF89a3QoeSoyLGMpLHY9ZSh3LF8sZyxvKzEscit5KTtsZXQgUDtpZih2PT09ZWwpe2NvbnN0IEM9eih5KSxGPVMoeSktQztQPW4oQyxGLCEwLG8rMSxyK3ksdyl9ZWxzZSBQPXYmJkdvKHksdCxlLG4scyxyLG8rMSk7cmV0dXJuISFQfX1jb25zdCBGaT1uZXcgVCxabz1uZXcgVDtmdW5jdGlvbiBBZChpLHQsZT17fSxuPTAscz0xLzApe2NvbnN0IHI9bipuLG89cypzO2xldCBhPTEvMCxjPW51bGw7aWYoaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6aD0+KEZpLmNvcHkodCkuY2xhbXAoaC5taW4saC5tYXgpLEZpLmRpc3RhbmNlVG9TcXVhcmVkKHQpKSxpbnRlcnNlY3RzQm91bmRzOihoLHUsZik9PmY8YSYmZjxvLGludGVyc2VjdHNUcmlhbmdsZTooaCx1KT0+e2guY2xvc2VzdFBvaW50VG9Qb2ludCh0LEZpKTtjb25zdCBmPXQuZGlzdGFuY2VUb1NxdWFyZWQoRmkpO3JldHVybiBmPGEmJihaby5jb3B5KEZpKSxhPWYsYz11KSxmPHJ9fSksYT09PTEvMClyZXR1cm4gbnVsbDtjb25zdCBsPU1hdGguc3FydChhKTtyZXR1cm4gZS5wb2ludD9lLnBvaW50LmNvcHkoWm8pOmUucG9pbnQ9Wm8uY2xvbmUoKSxlLmRpc3RhbmNlPWwsZS5mYWNlSW5kZXg9YyxlfWNvbnN0IF9kPXBhcnNlSW50KEopPj0xNjkseW49bmV3IFQsbW49bmV3IFQsZ249bmV3IFQsa3M9bmV3IFIsTnM9bmV3IFIsUnM9bmV3IFIsdWw9bmV3IFQsZmw9bmV3IFQsZGw9bmV3IFQsSWk9bmV3IFQ7ZnVuY3Rpb24gdmQoaSx0LGUsbixzLHIsbyxhKXtsZXQgYztpZihyPT09MT9jPWkuaW50ZXJzZWN0VHJpYW5nbGUobixlLHQsITAscyk6Yz1pLmludGVyc2VjdFRyaWFuZ2xlKHQsZSxuLHIhPT0yLHMpLGM9PT1udWxsKXJldHVybiBudWxsO2NvbnN0IGw9aS5vcmlnaW4uZGlzdGFuY2VUbyhzKTtyZXR1cm4gbDxvfHxsPmE/bnVsbDp7ZGlzdGFuY2U6bCxwb2ludDpzLmNsb25lKCl9fWZ1bmN0aW9uIFNkKGksdCxlLG4scyxyLG8sYSxjLGwsaCl7eW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHIpLG1uLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxvKSxnbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsYSk7Y29uc3QgdT12ZChpLHluLG1uLGduLElpLGMsbCxoKTtpZih1KXtjb25zdCBmPW5ldyBUO2V0LmdldEJhcnljb29yZChJaSx5bixtbixnbixmKSxuJiYoa3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHIpLE5zLmZyb21CdWZmZXJBdHRyaWJ1dGUobixvKSxScy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sYSksdS51dj1ldC5nZXRJbnRlcnBvbGF0aW9uKElpLHluLG1uLGduLGtzLE5zLFJzLG5ldyBSKSkscyYmKGtzLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxyKSxOcy5mcm9tQnVmZmVyQXR0cmlidXRlKHMsbyksUnMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGEpLHUudXYxPWV0LmdldEludGVycG9sYXRpb24oSWkseW4sbW4sZ24sa3MsTnMsUnMsbmV3IFIpKSxlJiYodWwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHIpLGZsLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxvKSxkbC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsYSksdS5ub3JtYWw9ZXQuZ2V0SW50ZXJwb2xhdGlvbihJaSx5bixtbixnbix1bCxmbCxkbCxuZXcgVCksdS5ub3JtYWwuZG90KGkuZGlyZWN0aW9uKT4wJiZ1Lm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSkpO2NvbnN0IGQ9e2E6cixiOm8sYzphLG5vcm1hbDpuZXcgVCxtYXRlcmlhbEluZGV4OjB9O2V0LmdldE5vcm1hbCh5bixtbixnbixkLm5vcm1hbCksdS5mYWNlPWQsdS5mYWNlSW5kZXg9cixfZCYmKHUuYmFyeWNvb3JkPWYpfXJldHVybiB1fWZ1bmN0aW9uIExzKGksdCxlLG4scyxyLG8pe2NvbnN0IGE9biozO2xldCBjPWErMCxsPWErMSxoPWErMjtjb25zdCB1PWkuaW5kZXg7aS5pbmRleCYmKGM9dS5nZXRYKGMpLGw9dS5nZXRYKGwpLGg9dS5nZXRYKGgpKTtjb25zdHtwb3NpdGlvbjpmLG5vcm1hbDpkLHV2OnAsdXYxOnl9PWkuYXR0cmlidXRlcyxtPVNkKGUsZixkLHAseSxjLGwsaCx0LHIsbyk7cmV0dXJuIG0/KG0uZmFjZUluZGV4PW4scyYmcy5wdXNoKG0pLG0pOm51bGx9ZnVuY3Rpb24geXQoaSx0LGUsbil7Y29uc3Qgcz1pLmEscj1pLmIsbz1pLmM7bGV0IGE9dCxjPXQrMSxsPXQrMjtlJiYoYT1lLmdldFgoYSksYz1lLmdldFgoYyksbD1lLmdldFgobCkpLHMueD1uLmdldFgoYSkscy55PW4uZ2V0WShhKSxzLno9bi5nZXRaKGEpLHIueD1uLmdldFgoYyksci55PW4uZ2V0WShjKSxyLno9bi5nZXRaKGMpLG8ueD1uLmdldFgobCksby55PW4uZ2V0WShsKSxvLno9bi5nZXRaKGwpfWZ1bmN0aW9uIHpkKGksdCxlLG4scyxyLG8sYSl7Y29uc3R7Z2VvbWV0cnk6YyxfaW5kaXJlY3RCdWZmZXI6bH09aTtmb3IobGV0IGg9bix1PW4rcztoPHU7aCsrKUxzKGMsdCxlLGgscixvLGEpfWZ1bmN0aW9uIFRkKGksdCxlLG4scyxyLG8pe2NvbnN0e2dlb21ldHJ5OmEsX2luZGlyZWN0QnVmZmVyOmN9PWk7bGV0IGw9MS8wLGg9bnVsbDtmb3IobGV0IHU9bixmPW4rczt1PGY7dSsrKXtsZXQgZDtkPUxzKGEsdCxlLHUsbnVsbCxyLG8pLGQmJmQuZGlzdGFuY2U8bCYmKGg9ZCxsPWQuZGlzdGFuY2UpfXJldHVybiBofWZ1bmN0aW9uIFBkKGksdCxlLG4scyxyLG8pe2NvbnN0e2dlb21ldHJ5OmF9PWUse2luZGV4OmN9PWEsbD1hLmF0dHJpYnV0ZXMucG9zaXRpb247Zm9yKGxldCBoPWksdT10K2k7aDx1O2grKyl7bGV0IGY7aWYoZj1oLHl0KG8sZiozLGMsbCksby5uZWVkc1VwZGF0ZT0hMCxuKG8sZixzLHIpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIEVkKGksdD1udWxsKXt0JiZBcnJheS5pc0FycmF5KHQpJiYodD1uZXcgU2V0KHQpKTtjb25zdCBlPWkuZ2VvbWV0cnksbj1lLmluZGV4P2UuaW5kZXguYXJyYXk6bnVsbCxzPWUuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgcixvLGEsYyxsPTA7Y29uc3QgaD1pLl9yb290cztmb3IobGV0IGY9MCxkPWgubGVuZ3RoO2Y8ZDtmKyspcj1oW2ZdLG89bmV3IFVpbnQzMkFycmF5KHIpLGE9bmV3IFVpbnQxNkFycmF5KHIpLGM9bmV3IEZsb2F0MzJBcnJheShyKSx1KDAsbCksbCs9ci5ieXRlTGVuZ3RoO2Z1bmN0aW9uIHUoZixkLHA9ITEpe2NvbnN0IHk9ZioyO2lmKGFbeSsxNV09PT1Fcyl7Y29uc3QgZz1vW2YrNl0sYj1hW3krMTRdO2xldCB3PTEvMCx4PTEvMCxNPTEvMCxBPS0xLzAsXz0tMS8wLHY9LTEvMDtmb3IobGV0IFA9MypnLHo9MyooZytiKTtQPHo7UCsrKXtsZXQgUz1uW1BdO2NvbnN0IEM9cy5nZXRYKFMpLEU9cy5nZXRZKFMpLEY9cy5nZXRaKFMpO0M8dyYmKHc9QyksQz5BJiYoQT1DKSxFPHgmJih4PUUpLEU+XyYmKF89RSksRjxNJiYoTT1GKSxGPnYmJih2PUYpfXJldHVybiBjW2YrMF0hPT13fHxjW2YrMV0hPT14fHxjW2YrMl0hPT1NfHxjW2YrM10hPT1BfHxjW2YrNF0hPT1ffHxjW2YrNV0hPT12PyhjW2YrMF09dyxjW2YrMV09eCxjW2YrMl09TSxjW2YrM109QSxjW2YrNF09XyxjW2YrNV09diwhMCk6ITF9ZWxzZXtjb25zdCBnPWYrOCxiPW9bZis2XSx3PWcrZCx4PWIrZDtsZXQgTT1wLEE9ITEsXz0hMTt0P018fChBPXQuaGFzKHcpLF89dC5oYXMoeCksTT0hQSYmIV8pOihBPSEwLF89ITApO2NvbnN0IHY9TXx8QSxQPU18fF87bGV0IHo9ITE7diYmKHo9dShnLGQsTSkpO2xldCBTPSExO1AmJihTPXUoYixkLE0pKTtjb25zdCBDPXp8fFM7aWYoQylmb3IobGV0IEU9MDtFPDM7RSsrKXtjb25zdCBGPWcrRSxCPWIrRSxJPWNbRl0saz1jW0YrM10sRD1jW0JdLFY9Y1tCKzNdO2NbZitFXT1JPEQ/STpELGNbZitFKzNdPWs+Vj9rOlZ9cmV0dXJuIEN9fX1mdW5jdGlvbiBlbihpLHQsZSxuLHMpe2xldCByLG8sYSxjLGwsaDtjb25zdCB1PTEvZS5kaXJlY3Rpb24ueCxmPTEvZS5kaXJlY3Rpb24ueSxkPTEvZS5kaXJlY3Rpb24ueixwPWUub3JpZ2luLngseT1lLm9yaWdpbi55LG09ZS5vcmlnaW4uejtsZXQgZz10W2ldLGI9dFtpKzNdLHc9dFtpKzFdLHg9dFtpKzMrMV0sTT10W2krMl0sQT10W2krMysyXTtyZXR1cm4gdT49MD8ocj0oZy1wKSp1LG89KGItcCkqdSk6KHI9KGItcCkqdSxvPShnLXApKnUpLGY+PTA/KGE9KHcteSkqZixjPSh4LXkpKmYpOihhPSh4LXkpKmYsYz0ody15KSpmKSxyPmN8fGE+b3x8KChhPnJ8fGlzTmFOKHIpKSYmKHI9YSksKGM8b3x8aXNOYU4obykpJiYobz1jKSxkPj0wPyhsPShNLW0pKmQsaD0oQS1tKSpkKToobD0oQS1tKSpkLGg9KE0tbSkqZCkscj5ofHxsPm8pPyExOigobD5yfHxyIT09cikmJihyPWwpLChoPG98fG8hPT1vKSYmKG89aCkscjw9cyYmbz49bil9ZnVuY3Rpb24gQ2QoaSx0LGUsbixzLHIsbyxhKXtjb25zdHtnZW9tZXRyeTpjLF9pbmRpcmVjdEJ1ZmZlcjpsfT1pO2ZvcihsZXQgaD1uLHU9bitzO2g8dTtoKyspe2xldCBmPWw/bFtoXTpoO0xzKGMsdCxlLGYscixvLGEpfX1mdW5jdGlvbiBCZChpLHQsZSxuLHMscixvKXtjb25zdHtnZW9tZXRyeTphLF9pbmRpcmVjdEJ1ZmZlcjpjfT1pO2xldCBsPTEvMCxoPW51bGw7Zm9yKGxldCB1PW4sZj1uK3M7dTxmO3UrKyl7bGV0IGQ7ZD1McyhhLHQsZSxjP2NbdV06dSxudWxsLHIsbyksZCYmZC5kaXN0YW5jZTxsJiYoaD1kLGw9ZC5kaXN0YW5jZSl9cmV0dXJuIGh9ZnVuY3Rpb24gRmQoaSx0LGUsbixzLHIsbyl7Y29uc3R7Z2VvbWV0cnk6YX09ZSx7aW5kZXg6Y309YSxsPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IGg9aSx1PXQraTtoPHU7aCsrKXtsZXQgZjtpZihmPWUucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoaCkseXQobyxmKjMsYyxsKSxvLm5lZWRzVXBkYXRlPSEwLG4obyxmLHMscikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gSWQoaSx0LGUsbixzLHIsbyl7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKSxYbygwLGksZSxuLHMscixvKSxudC5jbGVhckJ1ZmZlcigpfWZ1bmN0aW9uIFhvKGksdCxlLG4scyxyLG8pe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6bH09bnQsaD1pKjI7aWYoa3QoaCxjKSl7Y29uc3QgZj1WdChpLGwpLGQ9S3QoaCxjKTt6ZCh0LGUsbixmLGQscyxyLG8pfWVsc2V7Y29uc3QgZj10ZShpKTtlbihmLGEsbixyLG8pJiZYbyhmLHQsZSxuLHMscixvKTtjb25zdCBkPWVlKGksbCk7ZW4oZCxhLG4scixvKSYmWG8oZCx0LGUsbixzLHIsbyl9fWNvbnN0IGtkPVsieCIsInkiLCJ6Il07ZnVuY3Rpb24gTmQoaSx0LGUsbixzLHIpe250LnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgbz1KbygwLGksZSxuLHMscik7cmV0dXJuIG50LmNsZWFyQnVmZmVyKCksb31mdW5jdGlvbiBKbyhpLHQsZSxuLHMscil7Y29uc3R7ZmxvYXQzMkFycmF5Om8sdWludDE2QXJyYXk6YSx1aW50MzJBcnJheTpjfT1udDtsZXQgbD1pKjI7aWYoa3QobCxhKSl7Y29uc3QgdT1WdChpLGMpLGY9S3QobCxhKTtyZXR1cm4gVGQodCxlLG4sdSxmLHMscil9ZWxzZXtjb25zdCB1PWNsKGksYyksZj1rZFt1XSxwPW4uZGlyZWN0aW9uW2ZdPj0wO2xldCB5LG07cD8oeT10ZShpKSxtPWVlKGksYykpOih5PWVlKGksYyksbT10ZShpKSk7Y29uc3QgYj1lbih5LG8sbixzLHIpP0pvKHksdCxlLG4scyxyKTpudWxsO2lmKGIpe2NvbnN0IE09Yi5wb2ludFtmXTtpZihwP008PW9bbSt1XTpNPj1vW20rdSszXSlyZXR1cm4gYn1jb25zdCB4PWVuKG0sbyxuLHMscik/Sm8obSx0LGUsbixzLHIpOm51bGw7cmV0dXJuIGImJng/Yi5kaXN0YW5jZTw9eC5kaXN0YW5jZT9iOng6Ynx8eHx8bnVsbH19Y29uc3QgT3M9bmV3IGd0LFluPW5ldyBuZSxqbj1uZXcgbmUsa2k9bmV3IHN0LHBsPW5ldyB6dCxEcz1uZXcgenQ7ZnVuY3Rpb24gUmQoaSx0LGUsbil7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBzPVlvKDAsaSxlLG4pO3JldHVybiBudC5jbGVhckJ1ZmZlcigpLHN9ZnVuY3Rpb24gWW8oaSx0LGUsbixzPW51bGwpe2NvbnN0e2Zsb2F0MzJBcnJheTpyLHVpbnQxNkFycmF5Om8sdWludDMyQXJyYXk6YX09bnQ7bGV0IGM9aSoyO2lmKHM9PT1udWxsJiYoZS5ib3VuZGluZ0JveHx8ZS5jb21wdXRlQm91bmRpbmdCb3goKSxwbC5zZXQoZS5ib3VuZGluZ0JveC5taW4sZS5ib3VuZGluZ0JveC5tYXgsbikscz1wbCksa3QoYyxvKSl7Y29uc3QgaD10Lmdlb21ldHJ5LHU9aC5pbmRleCxmPWguYXR0cmlidXRlcy5wb3NpdGlvbixkPWUuaW5kZXgscD1lLmF0dHJpYnV0ZXMucG9zaXRpb24seT1WdChpLGEpLG09S3QoYyxvKTtpZihraS5jb3B5KG4pLmludmVydCgpLGUuYm91bmRzVHJlZSlyZXR1cm4gbHQoaSxyLERzKSxEcy5tYXRyaXguY29weShraSksRHMubmVlZHNVcGRhdGU9ITAsZS5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpiPT5Ecy5pbnRlcnNlY3RzQm94KGIpLGludGVyc2VjdHNUcmlhbmdsZTpiPT57Yi5hLmFwcGx5TWF0cml4NChuKSxiLmIuYXBwbHlNYXRyaXg0KG4pLGIuYy5hcHBseU1hdHJpeDQobiksYi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHc9eSozLHg9KG0reSkqMzt3PHg7dys9MylpZih5dChqbix3LHUsZiksam4ubmVlZHNVcGRhdGU9ITAsYi5pbnRlcnNlY3RzVHJpYW5nbGUoam4pKXJldHVybiEwO3JldHVybiExfX0pO2ZvcihsZXQgZz15KjMsYj0obSt5KSozO2c8YjtnKz0zKXt5dChZbixnLHUsZiksWW4uYS5hcHBseU1hdHJpeDQoa2kpLFluLmIuYXBwbHlNYXRyaXg0KGtpKSxZbi5jLmFwcGx5TWF0cml4NChraSksWW4ubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB3PTAseD1kLmNvdW50O3c8eDt3Kz0zKWlmKHl0KGpuLHcsZCxwKSxqbi5uZWVkc1VwZGF0ZT0hMCxZbi5pbnRlcnNlY3RzVHJpYW5nbGUoam4pKXJldHVybiEwfX1lbHNle2NvbnN0IGg9aSs4LHU9YVtpKzZdO3JldHVybiBsdChoLHIsT3MpLCEhKHMuaW50ZXJzZWN0c0JveChPcykmJllvKGgsdCxlLG4scyl8fChsdCh1LHIsT3MpLHMuaW50ZXJzZWN0c0JveChPcykmJllvKHUsdCxlLG4scykpKX19Y29uc3QgJHM9bmV3IHN0LGpvPW5ldyB6dCxOaT1uZXcgenQsTGQ9bmV3IFQsT2Q9bmV3IFQsRGQ9bmV3IFQsJGQ9bmV3IFQ7ZnVuY3Rpb24gVWQoaSx0LGUsbj17fSxzPXt9LHI9MCxvPTEvMCl7dC5ib3VuZGluZ0JveHx8dC5jb21wdXRlQm91bmRpbmdCb3goKSxqby5zZXQodC5ib3VuZGluZ0JveC5taW4sdC5ib3VuZGluZ0JveC5tYXgsZSksam8ubmVlZHNVcGRhdGU9ITA7Y29uc3QgYT1pLmdlb21ldHJ5LGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9YS5pbmRleCxoPXQuYXR0cmlidXRlcy5wb3NpdGlvbix1PXQuaW5kZXgsZj1pZS5nZXRQcmltaXRpdmUoKSxkPWllLmdldFByaW1pdGl2ZSgpO2xldCBwPUxkLHk9T2QsbT1udWxsLGc9bnVsbDtzJiYobT1EZCxnPSRkKTtsZXQgYj0xLzAsdz1udWxsLHg9bnVsbDtyZXR1cm4gJHMuY29weShlKS5pbnZlcnQoKSxOaS5tYXRyaXguY29weSgkcyksaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6TT0+am8uZGlzdGFuY2VUb0JveChNKSxpbnRlcnNlY3RzQm91bmRzOihNLEEsXyk9Pl88YiYmXzxvPyhBJiYoTmkubWluLmNvcHkoTS5taW4pLE5pLm1heC5jb3B5KE0ubWF4KSxOaS5uZWVkc1VwZGF0ZT0hMCksITApOiExLGludGVyc2VjdHNSYW5nZTooTSxBKT0+e2lmKHQuYm91bmRzVHJlZSlyZXR1cm4gdC5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjp2PT5OaS5kaXN0YW5jZVRvQm94KHYpLGludGVyc2VjdHNCb3VuZHM6KHYsUCx6KT0+ejxiJiZ6PG8saW50ZXJzZWN0c1JhbmdlOih2LFApPT57Zm9yKGxldCB6PXYsUz12K1A7ejxTO3orKyl7eXQoZCwzKnosdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgQz1NLEU9TStBO0M8RTtDKyspe3l0KGYsMypDLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBGPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihGPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9Rix3PUMseD16KSxGPHIpcmV0dXJuITB9fX19KTt7Y29uc3QgXz1abih0KTtmb3IobGV0IHY9MCxQPV87djxQO3YrKyl7eXQoZCwzKnYsdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgej1NLFM9TStBO3o8Uzt6Kyspe3l0KGYsMyp6LGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBDPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihDPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9Qyx3PXoseD12KSxDPHIpcmV0dXJuITB9fX19fSksaWUucmVsZWFzZVByaW1pdGl2ZShmKSxpZS5yZWxlYXNlUHJpbWl0aXZlKGQpLGI9PT0xLzA/bnVsbDoobi5wb2ludD9uLnBvaW50LmNvcHkoeSk6bi5wb2ludD15LmNsb25lKCksbi5kaXN0YW5jZT1iLG4uZmFjZUluZGV4PXcscyYmKHMucG9pbnQ/cy5wb2ludC5jb3B5KGcpOnMucG9pbnQ9Zy5jbG9uZSgpLHMucG9pbnQuYXBwbHlNYXRyaXg0KCRzKSx5LmFwcGx5TWF0cml4NCgkcykscy5kaXN0YW5jZT15LnN1YihzLnBvaW50KS5sZW5ndGgoKSxzLmZhY2VJbmRleD14KSxuKX1mdW5jdGlvbiBWZChpLHQ9bnVsbCl7dCYmQXJyYXkuaXNBcnJheSh0KSYmKHQ9bmV3IFNldCh0KSk7Y29uc3QgZT1pLmdlb21ldHJ5LG49ZS5pbmRleD9lLmluZGV4LmFycmF5Om51bGwscz1lLmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHIsbyxhLGMsbD0wO2NvbnN0IGg9aS5fcm9vdHM7Zm9yKGxldCBmPTAsZD1oLmxlbmd0aDtmPGQ7ZisrKXI9aFtmXSxvPW5ldyBVaW50MzJBcnJheShyKSxhPW5ldyBVaW50MTZBcnJheShyKSxjPW5ldyBGbG9hdDMyQXJyYXkociksdSgwLGwpLGwrPXIuYnl0ZUxlbmd0aDtmdW5jdGlvbiB1KGYsZCxwPSExKXtjb25zdCB5PWYqMjtpZihhW3krMTVdPT09RXMpe2NvbnN0IGc9b1tmKzZdLGI9YVt5KzE0XTtsZXQgdz0xLzAseD0xLzAsTT0xLzAsQT0tMS8wLF89LTEvMCx2PS0xLzA7Zm9yKGxldCBQPWcsej1nK2I7UDx6O1ArKyl7Y29uc3QgUz0zKmkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoUCk7Zm9yKGxldCBDPTA7QzwzO0MrKyl7bGV0IEU9UytDO0U9bj9uW0VdOkU7Y29uc3QgRj1zLmdldFgoRSksQj1zLmdldFkoRSksST1zLmdldFooRSk7Rjx3JiYodz1GKSxGPkEmJihBPUYpLEI8eCYmKHg9QiksQj5fJiYoXz1CKSxJPE0mJihNPUkpLEk+diYmKHY9SSl9fXJldHVybiBjW2YrMF0hPT13fHxjW2YrMV0hPT14fHxjW2YrMl0hPT1NfHxjW2YrM10hPT1BfHxjW2YrNF0hPT1ffHxjW2YrNV0hPT12PyhjW2YrMF09dyxjW2YrMV09eCxjW2YrMl09TSxjW2YrM109QSxjW2YrNF09XyxjW2YrNV09diwhMCk6ITF9ZWxzZXtjb25zdCBnPWYrOCxiPW9bZis2XSx3PWcrZCx4PWIrZDtsZXQgTT1wLEE9ITEsXz0hMTt0P018fChBPXQuaGFzKHcpLF89dC5oYXMoeCksTT0hQSYmIV8pOihBPSEwLF89ITApO2NvbnN0IHY9TXx8QSxQPU18fF87bGV0IHo9ITE7diYmKHo9dShnLGQsTSkpO2xldCBTPSExO1AmJihTPXUoYixkLE0pKTtjb25zdCBDPXp8fFM7aWYoQylmb3IobGV0IEU9MDtFPDM7RSsrKXtjb25zdCBGPWcrRSxCPWIrRSxJPWNbRl0saz1jW0YrM10sRD1jW0JdLFY9Y1tCKzNdO2NbZitFXT1JPEQ/STpELGNbZitFKzNdPWs+Vj9rOlZ9cmV0dXJuIEN9fX1mdW5jdGlvbiBxZChpLHQsZSxuLHMscixvKXtudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pLFFvKDAsaSxlLG4scyxyLG8pLG50LmNsZWFyQnVmZmVyKCl9ZnVuY3Rpb24gUW8oaSx0LGUsbixzLHIsbyl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT1udCxoPWkqMjtpZihrdChoLGMpKXtjb25zdCBmPVZ0KGksbCksZD1LdChoLGMpO0NkKHQsZSxuLGYsZCxzLHIsbyl9ZWxzZXtjb25zdCBmPXRlKGkpO2VuKGYsYSxuLHIsbykmJlFvKGYsdCxlLG4scyxyLG8pO2NvbnN0IGQ9ZWUoaSxsKTtlbihkLGEsbixyLG8pJiZRbyhkLHQsZSxuLHMscixvKX19Y29uc3QgSGQ9WyJ4IiwieSIsInoiXTtmdW5jdGlvbiBXZChpLHQsZSxuLHMscil7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBvPUtvKDAsaSxlLG4scyxyKTtyZXR1cm4gbnQuY2xlYXJCdWZmZXIoKSxvfWZ1bmN0aW9uIEtvKGksdCxlLG4scyxyKXtjb25zdHtmbG9hdDMyQXJyYXk6byx1aW50MTZBcnJheTphLHVpbnQzMkFycmF5OmN9PW50O2xldCBsPWkqMjtpZihrdChsLGEpKXtjb25zdCB1PVZ0KGksYyksZj1LdChsLGEpO3JldHVybiBCZCh0LGUsbix1LGYscyxyKX1lbHNle2NvbnN0IHU9Y2woaSxjKSxmPUhkW3VdLHA9bi5kaXJlY3Rpb25bZl0+PTA7bGV0IHksbTtwPyh5PXRlKGkpLG09ZWUoaSxjKSk6KHk9ZWUoaSxjKSxtPXRlKGkpKTtjb25zdCBiPWVuKHksbyxuLHMscik/S28oeSx0LGUsbixzLHIpOm51bGw7aWYoYil7Y29uc3QgTT1iLnBvaW50W2ZdO2lmKHA/TTw9b1ttK3VdOk0+PW9bbSt1KzNdKXJldHVybiBifWNvbnN0IHg9ZW4obSxvLG4scyxyKT9LbyhtLHQsZSxuLHMscik6bnVsbDtyZXR1cm4gYiYmeD9iLmRpc3RhbmNlPD14LmRpc3RhbmNlP2I6eDpifHx4fHxudWxsfX1jb25zdCBVcz1uZXcgZ3QsUW49bmV3IG5lLEtuPW5ldyBuZSxSaT1uZXcgc3QseWw9bmV3IHp0LFZzPW5ldyB6dDtmdW5jdGlvbiBHZChpLHQsZSxuKXtudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IHM9dGEoMCxpLGUsbik7cmV0dXJuIG50LmNsZWFyQnVmZmVyKCksc31mdW5jdGlvbiB0YShpLHQsZSxuLHM9bnVsbCl7Y29uc3R7ZmxvYXQzMkFycmF5OnIsdWludDE2QXJyYXk6byx1aW50MzJBcnJheTphfT1udDtsZXQgYz1pKjI7aWYocz09PW51bGwmJihlLmJvdW5kaW5nQm94fHxlLmNvbXB1dGVCb3VuZGluZ0JveCgpLHlsLnNldChlLmJvdW5kaW5nQm94Lm1pbixlLmJvdW5kaW5nQm94Lm1heCxuKSxzPXlsKSxrdChjLG8pKXtjb25zdCBoPXQuZ2VvbWV0cnksdT1oLmluZGV4LGY9aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGQ9ZS5pbmRleCxwPWUuYXR0cmlidXRlcy5wb3NpdGlvbix5PVZ0KGksYSksbT1LdChjLG8pO2lmKFJpLmNvcHkobikuaW52ZXJ0KCksZS5ib3VuZHNUcmVlKXJldHVybiBsdChpLHIsVnMpLFZzLm1hdHJpeC5jb3B5KFJpKSxWcy5uZWVkc1VwZGF0ZT0hMCxlLmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOmI9PlZzLmludGVyc2VjdHNCb3goYiksaW50ZXJzZWN0c1RyaWFuZ2xlOmI9PntiLmEuYXBwbHlNYXRyaXg0KG4pLGIuYi5hcHBseU1hdHJpeDQobiksYi5jLmFwcGx5TWF0cml4NChuKSxiLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgdz15LHg9bSt5O3c8eDt3KyspaWYoeXQoS24sMyp0LnJlc29sdmVUcmlhbmdsZUluZGV4KHcpLHUsZiksS24ubmVlZHNVcGRhdGU9ITAsYi5pbnRlcnNlY3RzVHJpYW5nbGUoS24pKXJldHVybiEwO3JldHVybiExfX0pO2ZvcihsZXQgZz15LGI9bSt5O2c8YjtnKyspe2NvbnN0IHc9dC5yZXNvbHZlVHJpYW5nbGVJbmRleChnKTt5dChRbiwzKncsdSxmKSxRbi5hLmFwcGx5TWF0cml4NChSaSksUW4uYi5hcHBseU1hdHJpeDQoUmkpLFFuLmMuYXBwbHlNYXRyaXg0KFJpKSxRbi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHg9MCxNPWQuY291bnQ7eDxNO3grPTMpaWYoeXQoS24seCxkLHApLEtuLm5lZWRzVXBkYXRlPSEwLFFuLmludGVyc2VjdHNUcmlhbmdsZShLbikpcmV0dXJuITB9fWVsc2V7Y29uc3QgaD1pKzgsdT1hW2krNl07cmV0dXJuIGx0KGgscixVcyksISEocy5pbnRlcnNlY3RzQm94KFVzKSYmdGEoaCx0LGUsbixzKXx8KGx0KHUscixVcykscy5pbnRlcnNlY3RzQm94KFVzKSYmdGEodSx0LGUsbixzKSkpfX1jb25zdCBxcz1uZXcgc3QsZWE9bmV3IHp0LExpPW5ldyB6dCxaZD1uZXcgVCxYZD1uZXcgVCxKZD1uZXcgVCxZZD1uZXcgVDtmdW5jdGlvbiBqZChpLHQsZSxuPXt9LHM9e30scj0wLG89MS8wKXt0LmJvdW5kaW5nQm94fHx0LmNvbXB1dGVCb3VuZGluZ0JveCgpLGVhLnNldCh0LmJvdW5kaW5nQm94Lm1pbix0LmJvdW5kaW5nQm94Lm1heCxlKSxlYS5uZWVkc1VwZGF0ZT0hMDtjb25zdCBhPWkuZ2VvbWV0cnksYz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sbD1hLmluZGV4LGg9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLHU9dC5pbmRleCxmPWllLmdldFByaW1pdGl2ZSgpLGQ9aWUuZ2V0UHJpbWl0aXZlKCk7bGV0IHA9WmQseT1YZCxtPW51bGwsZz1udWxsO3MmJihtPUpkLGc9WWQpO2xldCBiPTEvMCx3PW51bGwseD1udWxsO3JldHVybiBxcy5jb3B5KGUpLmludmVydCgpLExpLm1hdHJpeC5jb3B5KHFzKSxpLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpNPT5lYS5kaXN0YW5jZVRvQm94KE0pLGludGVyc2VjdHNCb3VuZHM6KE0sQSxfKT0+XzxiJiZfPG8/KEEmJihMaS5taW4uY29weShNLm1pbiksTGkubWF4LmNvcHkoTS5tYXgpLExpLm5lZWRzVXBkYXRlPSEwKSwhMCk6ITEsaW50ZXJzZWN0c1JhbmdlOihNLEEpPT57aWYodC5ib3VuZHNUcmVlKXtjb25zdCBfPXQuYm91bmRzVHJlZTtyZXR1cm4gXy5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6dj0+TGkuZGlzdGFuY2VUb0JveCh2KSxpbnRlcnNlY3RzQm91bmRzOih2LFAseik9Pno8YiYmejxvLGludGVyc2VjdHNSYW5nZToodixQKT0+e2ZvcihsZXQgej12LFM9ditQO3o8Uzt6Kyspe2NvbnN0IEM9Xy5yZXNvbHZlVHJpYW5nbGVJbmRleCh6KTt5dChkLDMqQyx1LGgpLGQuYS5hcHBseU1hdHJpeDQoZSksZC5iLmFwcGx5TWF0cml4NChlKSxkLmMuYXBwbHlNYXRyaXg0KGUpLGQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBFPU0sRj1NK0E7RTxGO0UrKyl7Y29uc3QgQj1pLnJlc29sdmVUcmlhbmdsZUluZGV4KEUpO3l0KGYsMypCLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBJPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihJPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9SSx3PUUseD16KSxJPHIpcmV0dXJuITB9fX19KX1lbHNle2NvbnN0IF89Wm4odCk7Zm9yKGxldCB2PTAsUD1fO3Y8UDt2Kyspe3l0KGQsMyp2LHUsaCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHo9TSxTPU0rQTt6PFM7eisrKXtjb25zdCBDPWkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoeik7eXQoZiwzKkMsbCxjKSxmLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEU9Zi5kaXN0YW5jZVRvVHJpYW5nbGUoZCxwLG0pO2lmKEU8YiYmKHkuY29weShwKSxnJiZnLmNvcHkobSksYj1FLHc9eix4PXYpLEU8cilyZXR1cm4hMH19fX19KSxpZS5yZWxlYXNlUHJpbWl0aXZlKGYpLGllLnJlbGVhc2VQcmltaXRpdmUoZCksYj09PTEvMD9udWxsOihuLnBvaW50P24ucG9pbnQuY29weSh5KTpuLnBvaW50PXkuY2xvbmUoKSxuLmRpc3RhbmNlPWIsbi5mYWNlSW5kZXg9dyxzJiYocy5wb2ludD9zLnBvaW50LmNvcHkoZyk6cy5wb2ludD1nLmNsb25lKCkscy5wb2ludC5hcHBseU1hdHJpeDQocXMpLHkuYXBwbHlNYXRyaXg0KHFzKSxzLmRpc3RhbmNlPXkuc3ViKHMucG9pbnQpLmxlbmd0aCgpLHMuZmFjZUluZGV4PXgpLG4pfWZ1bmN0aW9uIFFkKCl7cmV0dXJuIHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCJ9Y29uc3QgT2k9bmV3IG50LmNvbnN0cnVjdG9yLEhzPW5ldyBudC5jb25zdHJ1Y3Rvcixubj1uZXcgV28oKCk9Pm5ldyBndCksdGk9bmV3IGd0LGVpPW5ldyBndCxuYT1uZXcgZ3QsaWE9bmV3IGd0O2xldCBzYT0hMTtmdW5jdGlvbiBLZChpLHQsZSxuKXtpZihzYSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFJlY3Vyc2l2ZSBjYWxscyB0byBidmhjYXN0IG5vdCBzdXBwb3J0ZWQuIik7c2E9ITA7Y29uc3Qgcz1pLl9yb290cyxyPXQuX3Jvb3RzO2xldCBvLGE9MCxjPTA7Y29uc3QgbD1uZXcgc3QoKS5jb3B5KGUpLmludmVydCgpO2ZvcihsZXQgaD0wLHU9cy5sZW5ndGg7aDx1O2grKyl7T2kuc2V0QnVmZmVyKHNbaF0pLGM9MDtjb25zdCBmPW5uLmdldFByaW1pdGl2ZSgpO2x0KDAsT2kuZmxvYXQzMkFycmF5LGYpLGYuYXBwbHlNYXRyaXg0KGwpO2ZvcihsZXQgZD0wLHA9ci5sZW5ndGg7ZDxwJiYoSHMuc2V0QnVmZmVyKHJbZF0pLG89ZmUoMCwwLGUsbCxuLGEsYywwLDAsZiksSHMuY2xlYXJCdWZmZXIoKSxjKz1yW2RdLmxlbmd0aCwhbyk7ZCsrKTtpZihubi5yZWxlYXNlUHJpbWl0aXZlKGYpLE9pLmNsZWFyQnVmZmVyKCksYSs9c1toXS5sZW5ndGgsbylicmVha31yZXR1cm4gc2E9ITEsb31mdW5jdGlvbiBmZShpLHQsZSxuLHMscj0wLG89MCxhPTAsYz0wLGw9bnVsbCxoPSExKXtsZXQgdSxmO2g/KHU9SHMsZj1PaSk6KHU9T2ksZj1Icyk7Y29uc3QgZD11LmZsb2F0MzJBcnJheSxwPXUudWludDMyQXJyYXkseT11LnVpbnQxNkFycmF5LG09Zi5mbG9hdDMyQXJyYXksZz1mLnVpbnQzMkFycmF5LGI9Zi51aW50MTZBcnJheSx3PWkqMix4PXQqMixNPWt0KHcseSksQT1rdCh4LGIpO2xldCBfPSExO2lmKEEmJk0paD9fPXMoVnQodCxnKSxLdCh0KjIsYiksVnQoaSxwKSxLdChpKjIseSksYyxvK3QsYSxyK2kpOl89cyhWdChpLHApLEt0KGkqMix5KSxWdCh0LGcpLEt0KHQqMixiKSxhLHIraSxjLG8rdCk7ZWxzZSBpZihBKXtjb25zdCB2PW5uLmdldFByaW1pdGl2ZSgpO2x0KHQsbSx2KSx2LmFwcGx5TWF0cml4NChlKTtjb25zdCBQPXRlKGkpLHo9ZWUoaSxwKTtsdChQLGQsdGkpLGx0KHosZCxlaSk7Y29uc3QgUz12LmludGVyc2VjdHNCb3godGkpLEM9di5pbnRlcnNlY3RzQm94KGVpKTtfPVMmJmZlKHQsUCxuLGUscyxvLHIsYyxhKzEsdiwhaCl8fEMmJmZlKHQseixuLGUscyxvLHIsYyxhKzEsdiwhaCksbm4ucmVsZWFzZVByaW1pdGl2ZSh2KX1lbHNle2NvbnN0IHY9dGUodCksUD1lZSh0LGcpO2x0KHYsbSxuYSksbHQoUCxtLGlhKTtjb25zdCB6PWwuaW50ZXJzZWN0c0JveChuYSksUz1sLmludGVyc2VjdHNCb3goaWEpO2lmKHomJlMpXz1mZShpLHYsZSxuLHMscixvLGEsYysxLGwsaCl8fGZlKGksUCxlLG4scyxyLG8sYSxjKzEsbCxoKTtlbHNlIGlmKHopaWYoTSlfPWZlKGksdixlLG4scyxyLG8sYSxjKzEsbCxoKTtlbHNle2NvbnN0IEM9bm4uZ2V0UHJpbWl0aXZlKCk7Qy5jb3B5KG5hKS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgRT10ZShpKSxGPWVlKGkscCk7bHQoRSxkLHRpKSxsdChGLGQsZWkpO2NvbnN0IEI9Qy5pbnRlcnNlY3RzQm94KHRpKSxJPUMuaW50ZXJzZWN0c0JveChlaSk7Xz1CJiZmZSh2LEUsbixlLHMsbyxyLGMsYSsxLEMsIWgpfHxJJiZmZSh2LEYsbixlLHMsbyxyLGMsYSsxLEMsIWgpLG5uLnJlbGVhc2VQcmltaXRpdmUoQyl9ZWxzZSBpZihTKWlmKE0pXz1mZShpLFAsZSxuLHMscixvLGEsYysxLGwsaCk7ZWxzZXtjb25zdCBDPW5uLmdldFByaW1pdGl2ZSgpO0MuY29weShpYSkuYXBwbHlNYXRyaXg0KGUpO2NvbnN0IEU9dGUoaSksRj1lZShpLHApO2x0KEUsZCx0aSksbHQoRixkLGVpKTtjb25zdCBCPUMuaW50ZXJzZWN0c0JveCh0aSksST1DLmludGVyc2VjdHNCb3goZWkpO189QiYmZmUoUCxFLG4sZSxzLG8scixjLGErMSxDLCFoKXx8SSYmZmUoUCxGLG4sZSxzLG8scixjLGErMSxDLCFoKSxubi5yZWxlYXNlUHJpbWl0aXZlKEMpfX1yZXR1cm4gX31jb25zdCBXcz1uZXcgenQsbWw9bmV3IGd0LHQwPXtzdHJhdGVneTp0bCxtYXhEZXB0aDo0MCxtYXhMZWFmVHJpczoxMCx1c2VTaGFyZWRBcnJheUJ1ZmZlcjohMSxzZXRCb3VuZGluZ0JveDohMCxvblByb2dyZXNzOm51bGwsaW5kaXJlY3Q6ITEsdmVyYm9zZTohMCxyYW5nZTpudWxsfTtjbGFzcyByYXtzdGF0aWMgc2VyaWFsaXplKHQsZT17fSl7ZT1GdCh7Y2xvbmVCdWZmZXJzOiEwfSxlKTtjb25zdCBuPXQuZ2VvbWV0cnkscz10Ll9yb290cyxyPXQuX2luZGlyZWN0QnVmZmVyLG89bi5nZXRJbmRleCgpO2xldCBhO3JldHVybiBlLmNsb25lQnVmZmVycz9hPXtyb290czpzLm1hcChjPT5jLnNsaWNlKCkpLGluZGV4Om8/by5hcnJheS5zbGljZSgpOm51bGwsaW5kaXJlY3RCdWZmZXI6cj9yLnNsaWNlKCk6bnVsbH06YT17cm9vdHM6cyxpbmRleDpvP28uYXJyYXk6bnVsbCxpbmRpcmVjdEJ1ZmZlcjpyfSxhfXN0YXRpYyBkZXNlcmlhbGl6ZSh0LGUsbj17fSl7bj1GdCh7c2V0SW5kZXg6ITAsaW5kaXJlY3Q6ISF0LmluZGlyZWN0QnVmZmVyfSxuKTtjb25zdHtpbmRleDpzLHJvb3RzOnIsaW5kaXJlY3RCdWZmZXI6b309dCxhPW5ldyByYShlLFplKEZ0KHt9LG4pLHtbT29dOiEwfSkpO2lmKGEuX3Jvb3RzPXIsYS5faW5kaXJlY3RCdWZmZXI9b3x8bnVsbCxuLnNldEluZGV4KXtjb25zdCBjPWUuZ2V0SW5kZXgoKTtpZihjPT09bnVsbCl7Y29uc3QgbD1uZXcgeHQodC5pbmRleCwxLCExKTtlLnNldEluZGV4KGwpfWVsc2UgYy5hcnJheSE9PXMmJihjLmFycmF5LnNldChzKSxjLm5lZWRzVXBkYXRlPSEwKX1yZXR1cm4gYX1nZXQgaW5kaXJlY3QoKXtyZXR1cm4hIXRoaXMuX2luZGlyZWN0QnVmZmVyfWNvbnN0cnVjdG9yKHQsZT17fSl7aWYodC5pc0J1ZmZlckdlb21ldHJ5KXtpZih0LmluZGV4JiZ0LmluZGV4LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgaW5kZXggYXR0cmlidXRlLiIpfWVsc2UgdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBPbmx5IEJ1ZmZlckdlb21ldHJpZXMgYXJlIHN1cHBvcnRlZC4iKTtpZihlPU9iamVjdC5hc3NpZ24oWmUoRnQoe30sdDApLHtbT29dOiExfSksZSksZS51c2VTaGFyZWRBcnJheUJ1ZmZlciYmIVFkKCkpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYXZhaWxhYmxlLiIpO3RoaXMuZ2VvbWV0cnk9dCx0aGlzLl9yb290cz1udWxsLHRoaXMuX2luZGlyZWN0QnVmZmVyPW51bGwsZVtPb118fCh5ZCh0aGlzLGUpLCF0LmJvdW5kaW5nQm94JiZlLnNldEJvdW5kaW5nQm94JiYodC5ib3VuZGluZ0JveD10aGlzLmdldEJvdW5kaW5nQm94KG5ldyBndCkpKSx0aGlzLnJlc29sdmVUcmlhbmdsZUluZGV4PWUuaW5kaXJlY3Q/bj0+dGhpcy5faW5kaXJlY3RCdWZmZXJbbl06bj0+bn1yZWZpdCh0PW51bGwpe3JldHVybih0aGlzLmluZGlyZWN0P1ZkOkVkKSh0aGlzLHQpfXRyYXZlcnNlKHQsZT0wKXtjb25zdCBuPXRoaXMuX3Jvb3RzW2VdLHM9bmV3IFVpbnQzMkFycmF5KG4pLHI9bmV3IFVpbnQxNkFycmF5KG4pO28oMCk7ZnVuY3Rpb24gbyhhLGM9MCl7Y29uc3QgbD1hKjIsaD1yW2wrMTVdPT09RXM7aWYoaCl7Y29uc3QgdT1zW2ErNl0sZj1yW2wrMTRdO3QoYyxoLG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksdSxmKX1lbHNle2NvbnN0IHU9YStFaS80LGY9c1thKzZdLGQ9c1thKzddO3QoYyxoLG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksZCl8fChvKHUsYysxKSxvKGYsYysxKSl9fX1yYXljYXN0KHQsZT0wLG49MCxzPTEvMCl7Y29uc3Qgcj10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1bXSxjPWUuaXNNYXRlcmlhbCxsPUFycmF5LmlzQXJyYXkoZSksaD1vLmdyb3Vwcyx1PWM/ZS5zaWRlOmUsZj10aGlzLmluZGlyZWN0P3FkOklkO2ZvcihsZXQgZD0wLHA9ci5sZW5ndGg7ZDxwO2QrKyl7Y29uc3QgeT1sP2VbaFtkXS5tYXRlcmlhbEluZGV4XS5zaWRlOnUsbT1hLmxlbmd0aDtpZihmKHRoaXMsZCx5LHQsYSxuLHMpLGwpe2NvbnN0IGc9aFtkXS5tYXRlcmlhbEluZGV4O2ZvcihsZXQgYj1tLHc9YS5sZW5ndGg7Yjx3O2IrKylhW2JdLmZhY2UubWF0ZXJpYWxJbmRleD1nfX1yZXR1cm4gYX1yYXljYXN0Rmlyc3QodCxlPTAsbj0wLHM9MS8wKXtjb25zdCByPXRoaXMuX3Jvb3RzLG89dGhpcy5nZW9tZXRyeSxhPWUuaXNNYXRlcmlhbCxjPUFycmF5LmlzQXJyYXkoZSk7bGV0IGw9bnVsbDtjb25zdCBoPW8uZ3JvdXBzLHU9YT9lLnNpZGU6ZSxmPXRoaXMuaW5kaXJlY3Q/V2Q6TmQ7Zm9yKGxldCBkPTAscD1yLmxlbmd0aDtkPHA7ZCsrKXtjb25zdCB5PWM/ZVtoW2RdLm1hdGVyaWFsSW5kZXhdLnNpZGU6dSxtPWYodGhpcyxkLHksdCxuLHMpO20hPW51bGwmJihsPT1udWxsfHxtLmRpc3RhbmNlPGwuZGlzdGFuY2UpJiYobD1tLGMmJihtLmZhY2UubWF0ZXJpYWxJbmRleD1oW2RdLm1hdGVyaWFsSW5kZXgpKX1yZXR1cm4gbH1pbnRlcnNlY3RzR2VvbWV0cnkodCxlKXtsZXQgbj0hMTtjb25zdCBzPXRoaXMuX3Jvb3RzLHI9dGhpcy5pbmRpcmVjdD9HZDpSZDtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YSYmKG49cih0aGlzLG8sdCxlKSwhbik7bysrKTtyZXR1cm4gbn1zaGFwZWNhc3QodCl7Y29uc3QgZT1pZS5nZXRQcmltaXRpdmUoKSxuPXRoaXMuaW5kaXJlY3Q/RmQ6UGQ7bGV0e2JvdW5kc1RyYXZlcnNlT3JkZXI6cyxpbnRlcnNlY3RzQm91bmRzOnIsaW50ZXJzZWN0c1JhbmdlOm8saW50ZXJzZWN0c1RyaWFuZ2xlOmF9PXQ7aWYobyYmYSl7Y29uc3QgdT1vO289KGYsZCxwLHksbSk9PnUoZixkLHAseSxtKT8hMDpuKGYsZCx0aGlzLGEscCx5LGUpfWVsc2Ugb3x8KGE/bz0odSxmLGQscCk9Pm4odSxmLHRoaXMsYSxkLHAsZSk6bz0odSxmLGQpPT5kKTtsZXQgYz0hMSxsPTA7Y29uc3QgaD10aGlzLl9yb290cztmb3IobGV0IHU9MCxmPWgubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9aFt1XTtpZihjPU1kKHRoaXMsdSxyLG8scyxsKSxjKWJyZWFrO2wrPWQuYnl0ZUxlbmd0aH1yZXR1cm4gaWUucmVsZWFzZVByaW1pdGl2ZShlKSxjfWJ2aGNhc3QodCxlLG4pe2xldHtpbnRlcnNlY3RzUmFuZ2VzOnMsaW50ZXJzZWN0c1RyaWFuZ2xlczpyfT1uO2NvbnN0IG89aWUuZ2V0UHJpbWl0aXZlKCksYT10aGlzLmdlb21ldHJ5LmluZGV4LGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9dGhpcy5pbmRpcmVjdD9wPT57Y29uc3QgeT10aGlzLnJlc29sdmVUcmlhbmdsZUluZGV4KHApO3l0KG8seSozLGEsYyl9OnA9Pnt5dChvLHAqMyxhLGMpfSxoPWllLmdldFByaW1pdGl2ZSgpLHU9dC5nZW9tZXRyeS5pbmRleCxmPXQuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixkPXQuaW5kaXJlY3Q/cD0+e2NvbnN0IHk9dC5yZXNvbHZlVHJpYW5nbGVJbmRleChwKTt5dChoLHkqMyx1LGYpfTpwPT57eXQoaCxwKjMsdSxmKX07aWYocil7Y29uc3QgcD0oeSxtLGcsYix3LHgsTSxBKT0+e2ZvcihsZXQgXz1nLHY9ZytiO188djtfKyspe2QoXyksaC5hLmFwcGx5TWF0cml4NChlKSxoLmIuYXBwbHlNYXRyaXg0KGUpLGguYy5hcHBseU1hdHJpeDQoZSksaC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IFA9eSx6PXkrbTtQPHo7UCsrKWlmKGwoUCksby5uZWVkc1VwZGF0ZT0hMCxyKG8saCxQLF8sdyx4LE0sQSkpcmV0dXJuITB9cmV0dXJuITF9O2lmKHMpe2NvbnN0IHk9cztzPWZ1bmN0aW9uKG0sZyxiLHcseCxNLEEsXyl7cmV0dXJuIHkobSxnLGIsdyx4LE0sQSxfKT8hMDpwKG0sZyxiLHcseCxNLEEsXyl9fWVsc2Ugcz1wfXJldHVybiBLZCh0aGlzLHQsZSxzKX1pbnRlcnNlY3RzQm94KHQsZSl7cmV0dXJuIFdzLnNldCh0Lm1pbix0Lm1heCxlKSxXcy5uZWVkc1VwZGF0ZT0hMCx0aGlzLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpuPT5Xcy5pbnRlcnNlY3RzQm94KG4pLGludGVyc2VjdHNUcmlhbmdsZTpuPT5Xcy5pbnRlcnNlY3RzVHJpYW5nbGUobil9KX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczplPT50LmludGVyc2VjdHNCb3goZSksaW50ZXJzZWN0c1RyaWFuZ2xlOmU9PmUuaW50ZXJzZWN0c1NwaGVyZSh0KX0pfWNsb3Nlc3RQb2ludFRvR2VvbWV0cnkodCxlLG49e30scz17fSxyPTAsbz0xLzApe3JldHVybih0aGlzLmluZGlyZWN0P2pkOlVkKSh0aGlzLHQsZSxuLHMscixvKX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZT17fSxuPTAscz0xLzApe3JldHVybiBBZCh0aGlzLHQsZSxuLHMpfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0Lm1ha2VFbXB0eSgpLHRoaXMuX3Jvb3RzLmZvckVhY2gobj0+e2x0KDAsbmV3IEZsb2F0MzJBcnJheShuKSxtbCksdC51bmlvbihtbCl9KSx0fX1jb25zdCBnbD0xZS02LGUwPWdsKi41LHhsPU1hdGgucG93KDEwLC1NYXRoLmxvZzEwKGdsKSksbjA9ZTAqeGw7ZnVuY3Rpb24gd2UoaSl7cmV0dXJufn4oaSp4bCtuMCl9ZnVuY3Rpb24gaTAoaSl7cmV0dXJuYCR7d2UoaS54KX0sJHt3ZShpLnkpfWB9ZnVuY3Rpb24gd2woaSl7cmV0dXJuYCR7d2UoaS54KX0sJHt3ZShpLnkpfSwke3dlKGkueil9YH1mdW5jdGlvbiBzMChpKXtyZXR1cm5gJHt3ZShpLngpfSwke3dlKGkueSl9LCR7d2UoaS56KX0sJHt3ZShpLncpfWB9ZnVuY3Rpb24gcjAoaSx0LGUpe2UuZGlyZWN0aW9uLnN1YlZlY3RvcnModCxpKS5ub3JtYWxpemUoKTtjb25zdCBuPWkuZG90KGUuZGlyZWN0aW9uKTtyZXR1cm4gZS5vcmlnaW4uY29weShpKS5hZGRTY2FsZWRWZWN0b3IoZS5kaXJlY3Rpb24sLW4pLGV9ZnVuY3Rpb24gYmwoKXtyZXR1cm4gdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIn1mdW5jdGlvbiBvMChpKXtpZihpLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKXJldHVybiBpO2NvbnN0IHQ9aS5jb25zdHJ1Y3RvcixlPWkuYnVmZmVyLG49bmV3IFNoYXJlZEFycmF5QnVmZmVyKGUuYnl0ZUxlbmd0aCkscz1uZXcgVWludDhBcnJheShlKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobikuc2V0KHMsMCksbmV3IHQobil9ZnVuY3Rpb24gYTAoaSx0PUFycmF5QnVmZmVyKXtyZXR1cm4gaT42NTUzNT9uZXcgVWludDMyQXJyYXkobmV3IHQoNCppKSk6bmV3IFVpbnQxNkFycmF5KG5ldyB0KDIqaSkpfWZ1bmN0aW9uIGMwKGksdCl7aWYoIWkuaW5kZXgpe2NvbnN0IGU9aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50LG49dC51c2VTaGFyZWRBcnJheUJ1ZmZlcj9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcixzPWEwKGUsbik7aS5zZXRJbmRleChuZXcgeHQocywxKSk7Zm9yKGxldCByPTA7cjxlO3IrKylzW3JdPXJ9fWZ1bmN0aW9uIGwwKGkpe3JldHVybiBpLmluZGV4P2kuaW5kZXguY291bnQ6aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWZ1bmN0aW9uIG9hKGkpe3JldHVybiBsMChpKS8zfWNvbnN0IGgwPTFlLTgsdTA9bmV3IFQ7ZnVuY3Rpb24gZjAoaSl7cmV0dXJufn4oaS8zKX1mdW5jdGlvbiBkMChpKXtyZXR1cm4gaSUzfWZ1bmN0aW9uIE1sKGksdCl7cmV0dXJuIGkuc3RhcnQtdC5zdGFydH1mdW5jdGlvbiBBbChpLHQpe3JldHVybiB1MC5zdWJWZWN0b3JzKHQsaS5vcmlnaW4pLmRvdChpLmRpcmVjdGlvbil9ZnVuY3Rpb24gcDAoaSx0LGUsbj1oMCl7aS5zb3J0KE1sKSx0LnNvcnQoTWwpO2ZvcihsZXQgYT0wO2E8aS5sZW5ndGg7YSsrKXtjb25zdCBjPWlbYV07Zm9yKGxldCBsPTA7bDx0Lmxlbmd0aDtsKyspe2NvbnN0IGg9dFtsXTtpZighKGguc3RhcnQ+Yy5lbmQpKXtpZihjLmVuZDxoLnN0YXJ0fHxoLmVuZDxjLnN0YXJ0KWNvbnRpbnVlO2lmKGMuc3RhcnQ8PWguc3RhcnQmJmMuZW5kPj1oLmVuZClyKGguZW5kLGMuZW5kKXx8aS5zcGxpY2UoYSsxLDAse3N0YXJ0OmguZW5kLGVuZDpjLmVuZCxpbmRleDpjLmluZGV4fSksYy5lbmQ9aC5zdGFydCxoLnN0YXJ0PTAsaC5lbmQ9MDtlbHNlIGlmKGMuc3RhcnQ+PWguc3RhcnQmJmMuZW5kPD1oLmVuZClyKGMuZW5kLGguZW5kKXx8dC5zcGxpY2UobCsxLDAse3N0YXJ0OmMuZW5kLGVuZDpoLmVuZCxpbmRleDpoLmluZGV4fSksaC5lbmQ9Yy5zdGFydCxjLnN0YXJ0PTAsYy5lbmQ9MDtlbHNlIGlmKGMuc3RhcnQ8PWguc3RhcnQmJmMuZW5kPD1oLmVuZCl7Y29uc3QgdT1jLmVuZDtjLmVuZD1oLnN0YXJ0LGguc3RhcnQ9dX1lbHNlIGlmKGMuc3RhcnQ+PWguc3RhcnQmJmMuZW5kPj1oLmVuZCl7Y29uc3QgdT1oLmVuZDtoLmVuZD1jLnN0YXJ0LGMuc3RhcnQ9dX1lbHNlIHRocm93IG5ldyBFcnJvcn1pZihlLmhhcyhjLmluZGV4KXx8ZS5zZXQoYy5pbmRleCxbXSksZS5oYXMoaC5pbmRleCl8fGUuc2V0KGguaW5kZXgsW10pLGUuZ2V0KGMuaW5kZXgpLnB1c2goaC5pbmRleCksZS5nZXQoaC5pbmRleCkucHVzaChjLmluZGV4KSxvKGgpJiYodC5zcGxpY2UobCwxKSxsLS0pLG8oYykpe2kuc3BsaWNlKGEsMSksYS0tO2JyZWFrfX19cyhpKSxzKHQpO2Z1bmN0aW9uIHMoYSl7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspbyhhW2NdKSYmKGEuc3BsaWNlKGMsMSksYy0tKX1mdW5jdGlvbiByKGEsYyl7cmV0dXJuIE1hdGguYWJzKGMtYSk8bn1mdW5jdGlvbiBvKGEpe3JldHVybiBNYXRoLmFicyhhLmVuZC1hLnN0YXJ0KTxufX1jb25zdCBfbD0xZS01LHZsPTFlLTQ7Y2xhc3MgeTB7Y29uc3RydWN0b3IoKXt0aGlzLl9yYXlzPVtdfWFkZFJheSh0KXt0aGlzLl9yYXlzLnB1c2godCl9ZmluZENsb3Nlc3RSYXkodCl7Y29uc3QgZT10aGlzLl9yYXlzLG49dC5jbG9uZSgpO24uZGlyZWN0aW9uLm11bHRpcGx5U2NhbGFyKC0xKTtsZXQgcz0xLzAscj1udWxsO2ZvcihsZXQgYz0wLGw9ZS5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1lW2NdO2lmKG8oaCx0KSYmbyhoLG4pKWNvbnRpbnVlO2NvbnN0IHU9YShoLHQpLGY9YShoLG4pLGQ9TWF0aC5taW4odSxmKTtkPHMmJihzPWQscj1oKX1yZXR1cm4gcjtmdW5jdGlvbiBvKGMsbCl7Y29uc3QgaD1jLm9yaWdpbi5kaXN0YW5jZVRvKGwub3JpZ2luKT5fbDtyZXR1cm4gYy5kaXJlY3Rpb24uYW5nbGVUbyhsLmRpcmVjdGlvbik+dmx8fGh9ZnVuY3Rpb24gYShjLGwpe2NvbnN0IGg9Yy5vcmlnaW4uZGlzdGFuY2VUbyhsLm9yaWdpbiksdT1jLmRpcmVjdGlvbi5hbmdsZVRvKGwuZGlyZWN0aW9uKTtyZXR1cm4gaC9fbCt1L3ZsfX19Y29uc3QgYWE9bmV3IFQsY2E9bmV3IFQsR3M9bmV3IHVvO2Z1bmN0aW9uIG0wKGksdCxlKXtjb25zdCBuPWkuYXR0cmlidXRlcyxzPWkuaW5kZXgscj1uLnBvc2l0aW9uLG89bmV3IE1hcCxhPW5ldyBNYXAsYz1BcnJheS5mcm9tKHQpLGw9bmV3IHkwO2ZvcihsZXQgaD0wLHU9Yy5sZW5ndGg7aDx1O2grKyl7Y29uc3QgZj1jW2hdLGQ9ZjAoZikscD1kMChmKTtsZXQgeT0zKmQrcCxtPTMqZCsocCsxKSUzO3MmJih5PXMuZ2V0WCh5KSxtPXMuZ2V0WChtKSksYWEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLHkpLGNhLmZyb21CdWZmZXJBdHRyaWJ1dGUocixtKSxyMChhYSxjYSxHcyk7bGV0IGcsYj1sLmZpbmRDbG9zZXN0UmF5KEdzKTtiPT09bnVsbCYmKGI9R3MuY2xvbmUoKSxsLmFkZFJheShiKSksYS5oYXMoYil8fGEuc2V0KGIse2ZvcndhcmQ6W10scmV2ZXJzZTpbXSxyYXk6Yn0pLGc9YS5nZXQoYik7bGV0IHc9QWwoYixhYSkseD1BbChiLGNhKTt3PngmJihbdyx4XT1beCx3XSksR3MuZGlyZWN0aW9uLmRvdChiLmRpcmVjdGlvbik8MD9nLnJldmVyc2UucHVzaCh7c3RhcnQ6dyxlbmQ6eCxpbmRleDpmfSk6Zy5mb3J3YXJkLnB1c2goe3N0YXJ0OncsZW5kOngsaW5kZXg6Zn0pfXJldHVybiBhLmZvckVhY2goKHtmb3J3YXJkOmgscmV2ZXJzZTp1fSxmKT0+e3AwKGgsdSxvLGUpLGgubGVuZ3RoPT09MCYmdS5sZW5ndGg9PT0wJiZhLmRlbGV0ZShmKX0pLHtkaXNqb2ludENvbm5lY3Rpdml0eU1hcDpvLGZyYWdtZW50TWFwOmF9fWNvbnN0IGcwPW5ldyBSLGxhPW5ldyBULHgwPW5ldyBZdCxoYT1bIiIsIiIsIiJdO2NsYXNzIHcwe2NvbnN0cnVjdG9yKHQ9bnVsbCl7dGhpcy5kYXRhPW51bGwsdGhpcy5kaXNqb2ludENvbm5lY3Rpb25zPW51bGwsdGhpcy51bm1hdGNoZWREaXNqb2ludEVkZ2VzPW51bGwsdGhpcy51bm1hdGNoZWRFZGdlcz0tMSx0aGlzLm1hdGNoZWRFZGdlcz0tMSx0aGlzLnVzZURyYXdSYW5nZT0hMCx0aGlzLnVzZUFsbEF0dHJpYnV0ZXM9ITEsdGhpcy5tYXRjaERpc2pvaW50RWRnZXM9ITEsdGhpcy5kZWdlbmVyYXRlRXBzaWxvbj0xZS04LHQmJnRoaXMudXBkYXRlRnJvbSh0KX1nZXRTaWJsaW5nVHJpYW5nbGVJbmRleCh0LGUpe2NvbnN0IG49dGhpcy5kYXRhW3QqMytlXTtyZXR1cm4gbj09PS0xPy0xOn5+KG4vMyl9Z2V0U2libGluZ0VkZ2VJbmRleCh0LGUpe2NvbnN0IG49dGhpcy5kYXRhW3QqMytlXTtyZXR1cm4gbj09PS0xPy0xOm4lM31nZXREaXNqb2ludFNpYmxpbmdUcmlhbmdsZUluZGljZXModCxlKXtjb25zdCBuPXQqMytlLHM9dGhpcy5kaXNqb2ludENvbm5lY3Rpb25zLmdldChuKTtyZXR1cm4gcz9zLm1hcChyPT5+fihyLzMpKTpbXX1nZXREaXNqb2ludFNpYmxpbmdFZGdlSW5kaWNlcyh0LGUpe2NvbnN0IG49dCozK2Uscz10aGlzLmRpc2pvaW50Q29ubmVjdGlvbnMuZ2V0KG4pO3JldHVybiBzP3MubWFwKHI9PnIlMyk6W119aXNGdWxseUNvbm5lY3RlZCgpe3JldHVybiB0aGlzLnVubWF0Y2hlZEVkZ2VzPT09MH11cGRhdGVGcm9tKHQpe2NvbnN0e3VzZUFsbEF0dHJpYnV0ZXM6ZSx1c2VEcmF3UmFuZ2U6bixtYXRjaERpc2pvaW50RWRnZXM6cyxkZWdlbmVyYXRlRXBzaWxvbjpyfT10aGlzLG89ZT93OmIsYT1uZXcgTWFwLHthdHRyaWJ1dGVzOmN9PXQsbD1lP09iamVjdC5rZXlzKGMpOm51bGwsaD10LmluZGV4LHU9Yy5wb3NpdGlvbjtsZXQgZj1vYSh0KTtjb25zdCBkPWY7bGV0IHA9MDtuJiYocD10LmRyYXdSYW5nZS5zdGFydCx0LmRyYXdSYW5nZS5jb3VudCE9PTEvMCYmKGY9fn4odC5kcmF3UmFuZ2UuY291bnQvMykpKTtsZXQgeT10aGlzLmRhdGE7KCF5fHx5Lmxlbmd0aDwzKmQpJiYoeT1uZXcgSW50MzJBcnJheSgzKmQpKSx5LmZpbGwoLTEpO2xldCBtPTAsZz1uZXcgU2V0O2ZvcihsZXQgeD1wLE09ZiozK3A7eDxNO3grPTMpe2NvbnN0IEE9eDtmb3IobGV0IF89MDtfPDM7XysrKXtsZXQgdj1BK187aCYmKHY9aC5nZXRYKHYpKSxoYVtfXT1vKHYpfWZvcihsZXQgXz0wO188MztfKyspe2NvbnN0IHY9KF8rMSklMyxQPWhhW19dLHo9aGFbdl0sUz1gJHt6fV8ke1B9YDtpZihhLmhhcyhTKSl7Y29uc3QgQz1BK18sRT1hLmdldChTKTt5W0NdPUUseVtFXT1DLGEuZGVsZXRlKFMpLG0rPTIsZy5kZWxldGUoRSl9ZWxzZXtjb25zdCBDPWAke1B9XyR7en1gLEU9QStfO2Euc2V0KEMsRSksZy5hZGQoRSl9fX1pZihzKXtjb25zdHtmcmFnbWVudE1hcDp4LGRpc2pvaW50Q29ubmVjdGl2aXR5TWFwOk19PW0wKHQsZyxyKTtnLmNsZWFyKCkseC5mb3JFYWNoKCh7Zm9yd2FyZDpBLHJldmVyc2U6X30pPT57QS5mb3JFYWNoKCh7aW5kZXg6dn0pPT5nLmFkZCh2KSksXy5mb3JFYWNoKCh7aW5kZXg6dn0pPT5nLmFkZCh2KSl9KSx0aGlzLnVubWF0Y2hlZERpc2pvaW50RWRnZXM9eCx0aGlzLmRpc2pvaW50Q29ubmVjdGlvbnM9TSxtPWYqMy1nLnNpemV9dGhpcy5tYXRjaGVkRWRnZXM9bSx0aGlzLnVubWF0Y2hlZEVkZ2VzPWcuc2l6ZSx0aGlzLmRhdGE9eTtmdW5jdGlvbiBiKHgpe3JldHVybiBsYS5mcm9tQnVmZmVyQXR0cmlidXRlKHUseCksd2wobGEpfWZ1bmN0aW9uIHcoeCl7bGV0IE09IiI7Zm9yKGxldCBBPTAsXz1sLmxlbmd0aDtBPF87QSsrKXtjb25zdCB2PWNbbFtBXV07bGV0IFA7c3dpdGNoKHYuaXRlbVNpemUpe2Nhc2UgMTpQPXdlKHYuZ2V0WCh4KSk7YnJlYWs7Y2FzZSAyOlA9aTAoZzAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh2LHgpKTticmVhaztjYXNlIDM6UD13bChsYS5mcm9tQnVmZmVyQXR0cmlidXRlKHYseCkpO2JyZWFrO2Nhc2UgNDpQPXMwKHgwLmZyb21CdWZmZXJBdHRyaWJ1dGUodix4KSk7YnJlYWt9TSE9PSIiJiYoTSs9InwiKSxNKz1QfXJldHVybiBNfX19Y2xhc3MgWnMgZXh0ZW5kcyBnZntjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLmlzQnJ1c2g9ITAsdGhpcy5fcHJldmlvdXNNYXRyaXg9bmV3IHN0LHRoaXMuX3ByZXZpb3VzTWF0cml4LmVsZW1lbnRzLmZpbGwoMCl9bWFya1VwZGF0ZWQoKXt0aGlzLl9wcmV2aW91c01hdHJpeC5jb3B5KHRoaXMubWF0cml4KX1pc0RpcnR5KCl7Y29uc3R7bWF0cml4OnQsX3ByZXZpb3VzTWF0cml4OmV9PXRoaXMsbj10LmVsZW1lbnRzLHM9ZS5lbGVtZW50cztmb3IobGV0IHI9MDtyPDE2O3IrKylpZihuW3JdIT09c1tyXSlyZXR1cm4hMDtyZXR1cm4hMX1wcmVwYXJlR2VvbWV0cnkoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnksZT10LmF0dHJpYnV0ZXMsbj1ibCgpO2lmKG4pZm9yKGNvbnN0IHMgaW4gZSl7Y29uc3Qgcj1lW3NdO2lmKHIuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl0aHJvdyBuZXcgRXJyb3IoIkJydXNoOiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7ci5hcnJheT1vMChyLmFycmF5KX1pZih0LmJvdW5kc1RyZWV8fChjMCh0LHt1c2VTaGFyZWRBcnJheUJ1ZmZlcjpufSksdC5ib3VuZHNUcmVlPW5ldyByYSh0LHttYXhMZWFmVHJpczozLGluZGlyZWN0OiEwLHVzZVNoYXJlZEFycmF5QnVmZmVyOm59KSksdC5oYWxmRWRnZXN8fCh0LmhhbGZFZGdlcz1uZXcgdzAodCkpLCF0Lmdyb3VwSW5kaWNlcyl7Y29uc3Qgcz1vYSh0KSxyPW5ldyBVaW50MTZBcnJheShzKSxvPXQuZ3JvdXBzO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKyl7Y29uc3R7c3RhcnQ6bCxjb3VudDpofT1vW2FdO2ZvcihsZXQgdT1sLzMsZj0obCtoKS8zO3U8Zjt1Kyspclt1XT1hfXQuZ3JvdXBJbmRpY2VzPXJ9fWRpc3Bvc2VDYWNoZURhdGEoKXtjb25zdHtnZW9tZXRyeTp0fT10aGlzO3QuaGFsZkVkZ2VzPW51bGwsdC5ib3VuZHNUcmVlPW51bGwsdC5ncm91cEluZGljZXM9bnVsbH19Y29uc3QgYjA9MWUtMTQsdWE9bmV3IFQsU2w9bmV3IFQsemw9bmV3IFQ7ZnVuY3Rpb24gc24oaSx0PWIwKXt1YS5zdWJWZWN0b3JzKGkuYixpLmEpLFNsLnN1YlZlY3RvcnMoaS5jLGkuYSksemwuc3ViVmVjdG9ycyhpLmIsaS5jKTtjb25zdCBlPXVhLmFuZ2xlVG8oU2wpLG49dWEuYW5nbGVUbyh6bCkscz1NYXRoLlBJLWUtbjtyZXR1cm4gTWF0aC5hYnMoZSk8dHx8TWF0aC5hYnMobik8dHx8TWF0aC5hYnMocyk8dHx8aS5hLmRpc3RhbmNlVG9TcXVhcmVkKGkuYik8dHx8aS5hLmRpc3RhbmNlVG9TcXVhcmVkKGkuYyk8dHx8aS5iLmRpc3RhbmNlVG9TcXVhcmVkKGkuYyk8dH1jb25zdCBmYT0xZS0xMCxEaT0xZS0xMCxNMD0xZS0xMCxrZT1uZXcgUXQsZnQ9bmV3IFF0LE5lPW5ldyBULGRhPW5ldyBULFRsPW5ldyBULFhzPW5ldyBTbyxwYT1uZXcgbmU7Y2xhc3MgQTB7Y29uc3RydWN0b3IoKXt0aGlzLl9wb29sPVtdLHRoaXMuX2luZGV4PTB9Z2V0VHJpYW5nbGUoKXtyZXR1cm4gdGhpcy5faW5kZXg+PXRoaXMuX3Bvb2wubGVuZ3RoJiZ0aGlzLl9wb29sLnB1c2gobmV3IGV0KSx0aGlzLl9wb29sW3RoaXMuX2luZGV4KytdfWNsZWFyKCl7dGhpcy5faW5kZXg9MH1yZXNldCgpe3RoaXMuX3Bvb2wubGVuZ3RoPTAsdGhpcy5faW5kZXg9MH19Y2xhc3MgXzB7Y29uc3RydWN0b3IoKXt0aGlzLnRyaWFuZ2xlUG9vbD1uZXcgQTAsdGhpcy50cmlhbmdsZXM9W10sdGhpcy5ub3JtYWw9bmV3IFQsdGhpcy5jb3BsYW5hclRyaWFuZ2xlVXNlZD0hMX1pbml0aWFsaXplKHQpe3RoaXMucmVzZXQoKTtjb25zdHt0cmlhbmdsZXM6ZSx0cmlhbmdsZVBvb2w6bixub3JtYWw6c309dGhpcztpZihBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT10W3JdO2lmKHI9PT0wKWEuZ2V0Tm9ybWFsKHMpO2Vsc2UgaWYoTWF0aC5hYnMoMS1hLmdldE5vcm1hbChOZSkuZG90KHMpKT5mYSl0aHJvdyBuZXcgRXJyb3IoIlRyaWFuZ2xlIFNwbGl0dGVyOiBDYW5ub3QgaW5pdGlhbGl6ZSB3aXRoIHRyaWFuZ2xlcyB0aGF0IGhhdmUgZGlmZmVyZW50IG5vcm1hbHMuIik7Y29uc3QgYz1uLmdldFRyaWFuZ2xlKCk7Yy5jb3B5KGEpLGUucHVzaChjKX1lbHNle3QuZ2V0Tm9ybWFsKHMpO2NvbnN0IHI9bi5nZXRUcmlhbmdsZSgpO3IuY29weSh0KSxlLnB1c2gocil9fXNwbGl0QnlUcmlhbmdsZSh0KXtjb25zdHtub3JtYWw6ZSx0cmlhbmdsZXM6bn09dGhpcztpZih0LmdldE5vcm1hbChkYSkubm9ybWFsaXplKCksTWF0aC5hYnMoMS1NYXRoLmFicyhkYS5kb3QoZSkpKTxNMCl7dGhpcy5jb3BsYW5hclRyaWFuZ2xlVXNlZD0hMDtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9bltyXTthLmNvcGxhbmFyQ291bnQ9MH1jb25zdCBzPVt0LmEsdC5iLHQuY107Zm9yKGxldCByPTA7cjwzO3IrKyl7Y29uc3Qgbz0ocisxKSUzLGE9c1tyXSxjPXNbb107TmUuc3ViVmVjdG9ycyhjLGEpLm5vcm1hbGl6ZSgpLFRsLmNyb3NzVmVjdG9ycyhkYSxOZSksWHMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoVGwsYSksdGhpcy5zcGxpdEJ5UGxhbmUoWHMsdCl9fWVsc2UgdC5nZXRQbGFuZShYcyksdGhpcy5zcGxpdEJ5UGxhbmUoWHMsdCl9c3BsaXRCeVBsYW5lKHQsZSl7Y29uc3R7dHJpYW5nbGVzOm4sdHJpYW5nbGVQb29sOnN9PXRoaXM7cGEuY29weShlKSxwYS5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9bltyXTtpZighcGEuaW50ZXJzZWN0c1RyaWFuZ2xlKGEsa2UsITApKWNvbnRpbnVlO2NvbnN0e2E6YyxiOmwsYzpofT1hO2xldCB1PTAsZj0tMSxkPSExLHA9W10seT1bXTtjb25zdCBtPVtjLGwsaF07Zm9yKGxldCBnPTA7ZzwzO2crKyl7Y29uc3QgYj0oZysxKSUzO2tlLnN0YXJ0LmNvcHkobVtnXSksa2UuZW5kLmNvcHkobVtiXSk7Y29uc3Qgdz10LmRpc3RhbmNlVG9Qb2ludChrZS5zdGFydCkseD10LmRpc3RhbmNlVG9Qb2ludChrZS5lbmQpO2lmKE1hdGguYWJzKHcpPERpJiZNYXRoLmFicyh4KTxEaSl7ZD0hMDticmVha31pZih3PjA/cC5wdXNoKGcpOnkucHVzaChnKSxNYXRoLmFicyh3KTxEaSljb250aW51ZTtsZXQgTT0hIXQuaW50ZXJzZWN0TGluZShrZSxOZSk7IU0mJk1hdGguYWJzKHgpPERpJiYoTmUuY29weShrZS5lbmQpLE09ITApLE0mJiEoTmUuZGlzdGFuY2VUbyhrZS5zdGFydCk8ZmEpJiYoTmUuZGlzdGFuY2VUbyhrZS5lbmQpPGZhJiYoZj1nKSx1PT09MD9mdC5zdGFydC5jb3B5KE5lKTpmdC5lbmQuY29weShOZSksdSsrKX1pZighZCYmdT09PTImJmZ0LmRpc3RhbmNlKCk+RGkpaWYoZiE9PS0xKXtmPShmKzEpJTM7bGV0IGc9MDtnPT09ZiYmKGc9KGcrMSklMyk7bGV0IGI9ZysxO2I9PT1mJiYoYj0oYisxKSUzKTtjb25zdCB3PXMuZ2V0VHJpYW5nbGUoKTt3LmEuY29weShtW2JdKSx3LmIuY29weShmdC5lbmQpLHcuYy5jb3B5KGZ0LnN0YXJ0KSxzbih3KXx8bi5wdXNoKHcpLGEuYS5jb3B5KG1bZ10pLGEuYi5jb3B5KGZ0LnN0YXJ0KSxhLmMuY29weShmdC5lbmQpLHNuKGEpJiYobi5zcGxpY2UociwxKSxyLS0sby0tKX1lbHNle2NvbnN0IGc9cC5sZW5ndGg+PTI/eVswXTpwWzBdO2lmKGc9PT0wKXtsZXQgQT1mdC5zdGFydDtmdC5zdGFydD1mdC5lbmQsZnQuZW5kPUF9Y29uc3QgYj0oZysxKSUzLHc9KGcrMiklMyx4PXMuZ2V0VHJpYW5nbGUoKSxNPXMuZ2V0VHJpYW5nbGUoKTttW2JdLmRpc3RhbmNlVG9TcXVhcmVkKGZ0LnN0YXJ0KTxtW3ddLmRpc3RhbmNlVG9TcXVhcmVkKGZ0LmVuZCk/KHguYS5jb3B5KG1bYl0pLHguYi5jb3B5KGZ0LnN0YXJ0KSx4LmMuY29weShmdC5lbmQpLE0uYS5jb3B5KG1bYl0pLE0uYi5jb3B5KG1bd10pLE0uYy5jb3B5KGZ0LnN0YXJ0KSk6KHguYS5jb3B5KG1bd10pLHguYi5jb3B5KGZ0LnN0YXJ0KSx4LmMuY29weShmdC5lbmQpLE0uYS5jb3B5KG1bYl0pLE0uYi5jb3B5KG1bd10pLE0uYy5jb3B5KGZ0LmVuZCkpLGEuYS5jb3B5KG1bZ10pLGEuYi5jb3B5KGZ0LmVuZCksYS5jLmNvcHkoZnQuc3RhcnQpLHNuKHgpfHxuLnB1c2goeCksc24oTSl8fG4ucHVzaChNKSxzbihhKSYmKG4uc3BsaWNlKHIsMSksci0tLG8tLSl9ZWxzZSB1PT09MyYmY29uc29sZS53YXJuKCJUcmlhbmdsZUNsaXBwZXI6IENvcGxhbmFyIGNsaXAgbm90IGhhbmRsZWQiKX19cmVzZXQoKXt0aGlzLnRyaWFuZ2xlcy5sZW5ndGg9MCx0aGlzLnRyaWFuZ2xlUG9vbC5jbGVhcigpLHRoaXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ9ITF9fWZ1bmN0aW9uIHYwKGkpe3JldHVybiBpPX5+aSxpKzQtaSU0fWNsYXNzIFBse2NvbnN0cnVjdG9yKHQsZT01MDApe3RoaXMuZXhwYW5zaW9uRmFjdG9yPTEuNSx0aGlzLnR5cGU9dCx0aGlzLmxlbmd0aD0wLHRoaXMuYXJyYXk9bnVsbCx0aGlzLnNldFNpemUoZSl9c2V0VHlwZSh0KXtpZih0aGlzLmxlbmd0aCE9PTApdGhyb3cgbmV3IEVycm9yKCJUeXBlQmFja2VkQXJyYXk6IENhbm5vdCBjaGFuZ2UgdGhlIHR5cGUgd2hpbGUgdGhlcmUgaXMgdXNlZCBkYXRhIGluIHRoZSBidWZmZXIuIik7Y29uc3QgZT10aGlzLmFycmF5LmJ1ZmZlcjt0aGlzLmFycmF5PW5ldyB0KGUpLHRoaXMudHlwZT10fXNldFNpemUodCl7aWYodGhpcy5hcnJheSYmdD09PXRoaXMuYXJyYXkubGVuZ3RoKXJldHVybjtjb25zdCBlPXRoaXMudHlwZSxuPWJsKCk/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz1uZXcgZShuZXcgbih2MCh0KmUuQllURVNfUEVSX0VMRU1FTlQpKSk7dGhpcy5hcnJheSYmcy5zZXQodGhpcy5hcnJheSwwKSx0aGlzLmFycmF5PXN9ZXhwYW5kKCl7Y29uc3R7YXJyYXk6dCxleHBhbnNpb25GYWN0b3I6ZX09dGhpczt0aGlzLnNldFNpemUodC5sZW5ndGgqZSl9cHVzaCguLi50KXtsZXR7YXJyYXk6ZSxsZW5ndGg6bn09dGhpcztuK3QubGVuZ3RoPmUubGVuZ3RoJiYodGhpcy5leHBhbmQoKSxlPXRoaXMuYXJyYXkpO2ZvcihsZXQgcz0wLHI9dC5sZW5ndGg7czxyO3MrKyllW24rc109dFtzXTt0aGlzLmxlbmd0aCs9dC5sZW5ndGh9Y2xlYXIoKXt0aGlzLmxlbmd0aD0wfX1jbGFzcyBTMHtjb25zdHJ1Y3Rvcigpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzPVt7fV0sdGhpcy5ncm91cENvdW50PTB9Z2V0VHlwZSh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0udHlwZX1nZXRJdGVtU2l6ZSh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0uaXRlbVNpemV9Z2V0Tm9ybWFsaXplZCh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0ubm9ybWFsaXplZH1nZXRDb3VudCh0KXtpZih0aGlzLmdyb3VwQ291bnQ8PXQpcmV0dXJuIDA7Y29uc3QgZT10aGlzLmdldEdyb3VwQXR0ckFycmF5KCJwb3NpdGlvbiIsdCk7cmV0dXJuIGUubGVuZ3RoL2UuaXRlbVNpemV9Z2V0VG90YWxMZW5ndGgodCl7Y29uc3R7Z3JvdXBDb3VudDplLGdyb3VwQXR0cmlidXRlczpufT10aGlzO2xldCBzPTA7Zm9yKGxldCByPTA7cjxlO3IrKyl7Y29uc3Qgbz1uW3JdO3MrPW9bdF0ubGVuZ3RofXJldHVybiBzfWdldEdyb3VwQXR0clNldCh0PTApe2NvbnN0e2dyb3VwQXR0cmlidXRlczplfT10aGlzO2lmKGVbdF0pcmV0dXJuIHRoaXMuZ3JvdXBDb3VudD1NYXRoLm1heCh0aGlzLmdyb3VwQ291bnQsdCsxKSxlW3RdO2NvbnN0IG49ZVswXTtmb3IodGhpcy5ncm91cENvdW50PU1hdGgubWF4KHRoaXMuZ3JvdXBDb3VudCx0KzEpO3Q+PWUubGVuZ3RoOyl7Y29uc3Qgcz17fTtlLnB1c2gocyk7Zm9yKGNvbnN0IHIgaW4gbil7Y29uc3Qgbz1uW3JdLGE9bmV3IFBsKG8udHlwZSk7YS5pdGVtU2l6ZT1vLml0ZW1TaXplLGEubm9ybWFsaXplZD1vLm5vcm1hbGl6ZWQsc1tyXT1hfX1yZXR1cm4gZVt0XX1nZXRHcm91cEF0dHJBcnJheSh0LGU9MCl7Y29uc3R7Z3JvdXBBdHRyaWJ1dGVzOm59PXRoaXM7aWYoIW5bMF1bdF0pdGhyb3cgbmV3IEVycm9yKGBUeXBlZEF0dHJpYnV0ZURhdGE6IEF0dHJpYnV0ZSB3aXRoICIke3R9IiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRgKTtyZXR1cm4gdGhpcy5nZXRHcm91cEF0dHJTZXQoZSlbdF19aW5pdGlhbGl6ZUFycmF5KHQsZSxuLHMpe2NvbnN0e2dyb3VwQXR0cmlidXRlczpyfT10aGlzLGE9clswXVt0XTtpZihhKXtpZihhLnR5cGUhPT1lKWZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1yW2NdW3RdO2guc2V0VHlwZShlKSxoLml0ZW1TaXplPW4saC5ub3JtYWxpemVkPXN9fWVsc2UgZm9yKGxldCBjPTAsbD1yLmxlbmd0aDtjPGw7YysrKXtjb25zdCBoPW5ldyBQbChlKTtoLml0ZW1TaXplPW4saC5ub3JtYWxpemVkPXMscltjXVt0XT1ofX1jbGVhcigpe3RoaXMuZ3JvdXBDb3VudD0wO2NvbnN0e2dyb3VwQXR0cmlidXRlczp0fT10aGlzO3QuZm9yRWFjaChlPT57Zm9yKGNvbnN0IG4gaW4gZSllW25dLmNsZWFyKCl9KX1kZWxldGUodCl7dGhpcy5ncm91cEF0dHJpYnV0ZXMuZm9yRWFjaChlPT57ZGVsZXRlIGVbdF19KX1yZXNldCgpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzPVtdLHRoaXMuZ3JvdXBDb3VudD0wfX1jbGFzcyBFbHtjb25zdHJ1Y3Rvcigpe3RoaXMuaW50ZXJzZWN0aW9uU2V0PXt9LHRoaXMuaWRzPVtdfWFkZCh0LGUpe2NvbnN0e2ludGVyc2VjdGlvblNldDpuLGlkczpzfT10aGlzO25bdF18fChuW3RdPVtdLHMucHVzaCh0KSksblt0XS5wdXNoKGUpfX1jb25zdCB6MD0wLFQwPTEsUDA9MixDbD0zLEUwPTQsQmw9NSxGbD02LHNlPW5ldyB1byxJbD1uZXcgc3QsVHQ9bmV3IGV0LFJlPW5ldyBULGtsPW5ldyBZdCxObD1uZXcgWXQsUmw9bmV3IFl0LHlhPW5ldyBZdCxKcz1uZXcgWXQsWXM9bmV3IFl0LExsPW5ldyBRdCxtYT1uZXcgVCxnYT0xZS04LEMwPTFlLTE1LHhuPS0xLHduPTEsanM9LTIsUXM9MiwkaT0wLGJuPTEseGE9MixCMD0xZS0xNDtsZXQgS3M9bnVsbDtmdW5jdGlvbiBPbChpKXtLcz1pfWZ1bmN0aW9uIERsKGksdCl7aS5nZXRNaWRwb2ludChzZS5vcmlnaW4pLGkuZ2V0Tm9ybWFsKHNlLmRpcmVjdGlvbik7Y29uc3QgZT10LnJheWNhc3RGaXJzdChzZSwyKTtyZXR1cm4hIShlJiZzZS5kaXJlY3Rpb24uZG90KGUuZmFjZS5ub3JtYWwpPjApP3huOndufWZ1bmN0aW9uIEYwKGksdCl7ZnVuY3Rpb24gZSgpe3JldHVybiBNYXRoLnJhbmRvbSgpLS41fWkuZ2V0Tm9ybWFsKG1hKSxzZS5kaXJlY3Rpb24uY29weShtYSksaS5nZXRNaWRwb2ludChzZS5vcmlnaW4pO2NvbnN0IG49MztsZXQgcz0wLHI9MS8wO2ZvcihsZXQgbz0wO288bjtvKyspe3NlLmRpcmVjdGlvbi54Kz1lKCkqZ2Esc2UuZGlyZWN0aW9uLnkrPWUoKSpnYSxzZS5kaXJlY3Rpb24ueis9ZSgpKmdhLHNlLmRpcmVjdGlvbi5tdWx0aXBseVNjYWxhcigtMSk7Y29uc3QgYT10LnJheWNhc3RGaXJzdChzZSwyKTtpZighIShhJiZzZS5kaXJlY3Rpb24uZG90KGEuZmFjZS5ub3JtYWwpPjApJiZzKyssYSE9PW51bGwmJihyPU1hdGgubWluKHIsYS5kaXN0YW5jZSkpLHI8PUMwKXJldHVybiBhLmZhY2Uubm9ybWFsLmRvdChtYSk+MD9RczpqcztpZihzL24+LjV8fChvLXMrMSkvbj4uNSlicmVha31yZXR1cm4gcy9uPi41P3huOndufWZ1bmN0aW9uIEkwKGksdCl7Y29uc3QgZT1uZXcgRWwsbj1uZXcgRWw7cmV0dXJuIElsLmNvcHkoaS5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkodC5tYXRyaXhXb3JsZCksaS5nZW9tZXRyeS5ib3VuZHNUcmVlLmJ2aGNhc3QodC5nZW9tZXRyeS5ib3VuZHNUcmVlLElsLHtpbnRlcnNlY3RzVHJpYW5nbGVzKHMscixvLGEpe2lmKCFzbihzKSYmIXNuKHIpKXtsZXQgYz1zLmludGVyc2VjdHNUcmlhbmdsZShyLExsLCEwKTtpZighYyl7Y29uc3QgbD1zLnBsYW5lLGg9ci5wbGFuZSx1PWwubm9ybWFsLGY9aC5ub3JtYWw7dS5kb3QoZik9PT0xJiZNYXRoLmFicyhsLmNvbnN0YW50LWguY29uc3RhbnQpPEIwJiYoYz0hMCl9aWYoYyl7bGV0IGw9aS5nZW9tZXRyeS5ib3VuZHNUcmVlLnJlc29sdmVUcmlhbmdsZUluZGV4KG8pLGg9dC5nZW9tZXRyeS5ib3VuZHNUcmVlLnJlc29sdmVUcmlhbmdsZUluZGV4KGEpO2UuYWRkKGwsaCksbi5hZGQoaCxsKSxLcyYmKEtzLmFkZEVkZ2UoTGwpLEtzLmFkZEludGVyc2VjdGluZ1RyaWFuZ2xlcyhvLHMsYSxyKSl9fXJldHVybiExfX0pLHthSW50ZXJzZWN0aW9uczplLGJJbnRlcnNlY3Rpb25zOm59fWZ1bmN0aW9uIGswKGksdCxlLG4scyxyLG89ITEpe2NvbnN0IGE9ZS5hdHRyaWJ1dGVzLGM9ZS5pbmRleCxsPWkqMyxoPWMuZ2V0WChsKzApLHU9Yy5nZXRYKGwrMSksZj1jLmdldFgobCsyKTtmb3IoY29uc3QgZCBpbiByKXtjb25zdCBwPWFbZF0seT1yW2RdO2lmKCEoZCBpbiBhKSl0aHJvdyBuZXcgRXJyb3IoYENTRyBPcGVyYXRpb25zOiBBdHRyaWJ1dGUgJHtkfSBub3QgYXZhaWxhYmxlIG9uIGdlb21ldHJ5LmApO2NvbnN0IG09cC5pdGVtU2l6ZTtkPT09InBvc2l0aW9uIj8oVHQuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCkuYXBwbHlNYXRyaXg0KG4pLFR0LmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLHUpLmFwcGx5TWF0cml4NChuKSxUdC5jLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxmKS5hcHBseU1hdHJpeDQobiksd2EoVHQuYSxUdC5iLFR0LmMsdCwzLHksbykpOmQ9PT0ibm9ybWFsIj8oVHQuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCkuYXBwbHlOb3JtYWxNYXRyaXgocyksVHQuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSkuYXBwbHlOb3JtYWxNYXRyaXgocyksVHQuYy5mcm9tQnVmZmVyQXR0cmlidXRlKHAsZikuYXBwbHlOb3JtYWxNYXRyaXgocyksbyYmKFR0LmEubXVsdGlwbHlTY2FsYXIoLTEpLFR0LmIubXVsdGlwbHlTY2FsYXIoLTEpLFR0LmMubXVsdGlwbHlTY2FsYXIoLTEpKSx3YShUdC5hLFR0LmIsVHQuYyx0LDMseSxvLCEwKSk6KGtsLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxoKSxObC5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSksUmwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGYpLHdhKGtsLE5sLFJsLHQsbSx5LG8pKX19ZnVuY3Rpb24gTjAoaSx0LGUsbixzLHIsbyxhPSExKXtiYShpLG4scyxyLG8sYSksYmEoYT9lOnQsbixzLHIsbyxhKSxiYShhP3Q6ZSxuLHMscixvLGEpfWZ1bmN0aW9uICRsKGksdCxlPSExKXtzd2l0Y2goaSl7Y2FzZSB6MDppZih0PT09d258fHQ9PT1RcyYmIWUpcmV0dXJuIGJuO2JyZWFrO2Nhc2UgVDA6aWYoZSl7aWYodD09PXhuKXJldHVybiAkaX1lbHNlIGlmKHQ9PT13bnx8dD09PWpzKXJldHVybiBibjticmVhaztjYXNlIFAwOmlmKGUpe2lmKHQ9PT13bnx8dD09PWpzKXJldHVybiBibn1lbHNlIGlmKHQ9PT14bilyZXR1cm4gJGk7YnJlYWs7Y2FzZSBFMDppZih0PT09eG4pcmV0dXJuICRpO2lmKHQ9PT13bilyZXR1cm4gYm47YnJlYWs7Y2FzZSBDbDppZih0PT09eG58fHQ9PT1RcyYmIWUpcmV0dXJuIGJuO2JyZWFrO2Nhc2UgQmw6aWYoIWUmJih0PT09d258fHQ9PT1qcykpcmV0dXJuIGJuO2JyZWFrO2Nhc2UgRmw6aWYoIWUmJih0PT09eG58fHQ9PT1RcykpcmV0dXJuIGJuO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgQ1NHIG9wZXJhdGlvbiBlbnVtICIke2l9Ii5gKX1yZXR1cm4geGF9ZnVuY3Rpb24gd2EoaSx0LGUsbixzLHIsbz0hMSxhPSExKXtjb25zdCBjPWw9PntyLnB1c2gobC54KSxzPjEmJnIucHVzaChsLnkpLHM+MiYmci5wdXNoKGwueikscz4zJiZyLnB1c2gobC53KX07eWEuc2V0KDAsMCwwLDApLmFkZFNjYWxlZFZlY3RvcihpLG4uYS54KS5hZGRTY2FsZWRWZWN0b3IodCxuLmEueSkuYWRkU2NhbGVkVmVjdG9yKGUsbi5hLnopLEpzLnNldCgwLDAsMCwwKS5hZGRTY2FsZWRWZWN0b3IoaSxuLmIueCkuYWRkU2NhbGVkVmVjdG9yKHQsbi5iLnkpLmFkZFNjYWxlZFZlY3RvcihlLG4uYi56KSxZcy5zZXQoMCwwLDAsMCkuYWRkU2NhbGVkVmVjdG9yKGksbi5jLngpLmFkZFNjYWxlZFZlY3Rvcih0LG4uYy55KS5hZGRTY2FsZWRWZWN0b3IoZSxuLmMueiksYSYmKHlhLm5vcm1hbGl6ZSgpLEpzLm5vcm1hbGl6ZSgpLFlzLm5vcm1hbGl6ZSgpKSxjKHlhKSxvPyhjKFlzKSxjKEpzKSk6KGMoSnMpLGMoWXMpKX1mdW5jdGlvbiBiYShpLHQsZSxuLHMscj0hMSl7Zm9yKGNvbnN0IG8gaW4gcyl7Y29uc3QgYT10W29dLGM9c1tvXTtpZighKG8gaW4gdCkpdGhyb3cgbmV3IEVycm9yKGBDU0cgT3BlcmF0aW9uczogQXR0cmlidXRlICR7b30gbm8gYXZhaWxhYmxlIG9uIGdlb21ldHJ5LmApO2NvbnN0IGw9YS5pdGVtU2l6ZTtvPT09InBvc2l0aW9uIj8oUmUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGkpLmFwcGx5TWF0cml4NChlKSxjLnB1c2goUmUueCxSZS55LFJlLnopKTpvPT09Im5vcm1hbCI/KFJlLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxpKS5hcHBseU5vcm1hbE1hdHJpeChuKSxyJiZSZS5tdWx0aXBseVNjYWxhcigtMSksYy5wdXNoKFJlLngsUmUueSxSZS56KSk6KGMucHVzaChhLmdldFgoaSkpLGw+MSYmYy5wdXNoKGEuZ2V0WShpKSksbD4yJiZjLnB1c2goYS5nZXRaKGkpKSxsPjMmJmMucHVzaChhLmdldFcoaSkpKX19Y2xhc3MgUjB7Y29uc3RydWN0b3IodCl7dGhpcy50cmlhbmdsZT1uZXcgZXQoKS5jb3B5KHQpLHRoaXMuaW50ZXJzZWN0cz17fX1hZGRUcmlhbmdsZSh0LGUpe3RoaXMuaW50ZXJzZWN0c1t0XT1uZXcgZXQoKS5jb3B5KGUpfWdldEludGVyc2VjdEFycmF5KCl7Y29uc3QgdD1bXSx7aW50ZXJzZWN0czplfT10aGlzO2Zvcihjb25zdCBuIGluIGUpdC5wdXNoKGVbbl0pO3JldHVybiB0fX1jbGFzcyBVbHtjb25zdHJ1Y3Rvcigpe3RoaXMuZGF0YT17fX1hZGRUcmlhbmdsZUludGVyc2VjdGlvbih0LGUsbixzKXtjb25zdHtkYXRhOnJ9PXRoaXM7clt0XXx8KHJbdF09bmV3IFIwKGUpKSxyW3RdLmFkZFRyaWFuZ2xlKG4scyl9Z2V0VHJpYW5nbGVzQXNBcnJheSh0PW51bGwpe2NvbnN0e2RhdGE6ZX09dGhpcyxuPVtdO2lmKHQhPT1udWxsKXQgaW4gZSYmbi5wdXNoKGVbdF0udHJpYW5nbGUpO2Vsc2UgZm9yKGNvbnN0IHMgaW4gZSluLnB1c2goZVtzXS50cmlhbmdsZSk7cmV0dXJuIG59Z2V0VHJpYW5nbGVJbmRpY2VzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubWFwKHQ9PnBhcnNlSW50KHQpKX1nZXRJbnRlcnNlY3Rpb25JbmRpY2VzKHQpe2NvbnN0e2RhdGE6ZX09dGhpcztyZXR1cm4gZVt0XT9PYmplY3Qua2V5cyhlW3RdLmludGVyc2VjdHMpLm1hcChuPT5wYXJzZUludChuKSk6W119Z2V0SW50ZXJzZWN0aW9uc0FzQXJyYXkodD1udWxsLGU9bnVsbCl7Y29uc3R7ZGF0YTpufT10aGlzLHM9bmV3IFNldCxyPVtdLG89YT0+e2lmKG5bYV0paWYoZSE9PW51bGwpblthXS5pbnRlcnNlY3RzW2VdJiZyLnB1c2goblthXS5pbnRlcnNlY3RzW2VdKTtlbHNle2NvbnN0IGM9blthXS5pbnRlcnNlY3RzO2Zvcihjb25zdCBsIGluIGMpcy5oYXMobCl8fChzLmFkZChsKSxyLnB1c2goY1tsXSkpfX07aWYodCE9PW51bGwpbyh0KTtlbHNlIGZvcihjb25zdCBhIGluIG4pbyhhKTtyZXR1cm4gcn1yZXNldCgpe3RoaXMuZGF0YT17fX19Y2xhc3MgTDB7Y29uc3RydWN0b3IoKXt0aGlzLmVuYWJsZWQ9ITEsdGhpcy50cmlhbmdsZUludGVyc2VjdHNBPW5ldyBVbCx0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0I9bmV3IFVsLHRoaXMuaW50ZXJzZWN0aW9uRWRnZXM9W119YWRkSW50ZXJzZWN0aW5nVHJpYW5nbGVzKHQsZSxuLHMpe2NvbnN0e3RyaWFuZ2xlSW50ZXJzZWN0c0E6cix0cmlhbmdsZUludGVyc2VjdHNCOm99PXRoaXM7ci5hZGRUcmlhbmdsZUludGVyc2VjdGlvbih0LGUsbixzKSxvLmFkZFRyaWFuZ2xlSW50ZXJzZWN0aW9uKG4scyx0LGUpfWFkZEVkZ2UodCl7dGhpcy5pbnRlcnNlY3Rpb25FZGdlcy5wdXNoKHQuY2xvbmUoKSl9cmVzZXQoKXt0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0EucmVzZXQoKSx0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0IucmVzZXQoKSx0aGlzLmludGVyc2VjdGlvbkVkZ2VzPVtdfWluaXQoKXt0aGlzLmVuYWJsZWQmJih0aGlzLnJlc2V0KCksT2wodGhpcykpfWNvbXBsZXRlKCl7dGhpcy5lbmFibGVkJiZPbChudWxsKX19Y29uc3Qgcm49bmV3IHN0LHRyPW5ldyBnZSxNbj1uZXcgZXQsZXI9bmV3IGV0LG9uPW5ldyBldCxucj1uZXcgZXQsZGU9W10sQW49W107ZnVuY3Rpb24gTzAoaSl7Zm9yKGNvbnN0IHQgb2YgaSlyZXR1cm4gdH1mdW5jdGlvbiBEMChpLHQsZSxuLHMscj17fSl7Y29uc3R7dXNlR3JvdXBzOm89ITB9PXIse2FJbnRlcnNlY3Rpb25zOmEsYkludGVyc2VjdGlvbnM6Y309STAoaSx0KSxsPVtdO2xldCBoPW51bGwsdTtyZXR1cm4gdT1vPzA6LTEsVmwoaSx0LGEsZSwhMSxuLHMsdSkscWwoaSx0LGEsZSwhMSxzLHUpLGUuZmluZEluZGV4KGQ9PmQhPT1GbCYmZCE9PUJsKSE9PS0xJiYodT1vP2kuZ2VvbWV0cnkuZ3JvdXBzLmxlbmd0aHx8MTotMSxWbCh0LGksYyxlLCEwLG4scyx1KSxxbCh0LGksYyxlLCEwLHMsdSkpLGRlLmxlbmd0aD0wLEFuLmxlbmd0aD0wLHtncm91cHM6bCxtYXRlcmlhbHM6aH19ZnVuY3Rpb24gVmwoaSx0LGUsbixzLHIsbyxhPTApe2NvbnN0IGM9aS5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpPDA7cm4uY29weSh0Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKS5tdWx0aXBseShpLm1hdHJpeFdvcmxkKSx0ci5nZXROb3JtYWxNYXRyaXgoaS5tYXRyaXhXb3JsZCkubXVsdGlwbHlTY2FsYXIoYz8tMToxKTtjb25zdCBsPWkuZ2VvbWV0cnkuZ3JvdXBJbmRpY2VzLGg9aS5nZW9tZXRyeS5pbmRleCx1PWkuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixmPXQuZ2VvbWV0cnkuYm91bmRzVHJlZSxkPXQuZ2VvbWV0cnkuaW5kZXgscD10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24seT1lLmlkcyxtPWUuaW50ZXJzZWN0aW9uU2V0O2ZvcihsZXQgZz0wLGI9eS5sZW5ndGg7ZzxiO2crKyl7Y29uc3Qgdz15W2ddLHg9YT09PS0xPzA6bFt3XSthLE09Myp3LEE9aC5nZXRYKE0rMCksXz1oLmdldFgoTSsxKSx2PWguZ2V0WChNKzIpO01uLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LEEpLmFwcGx5TWF0cml4NChybiksTW4uYi5mcm9tQnVmZmVyQXR0cmlidXRlKHUsXykuYXBwbHlNYXRyaXg0KHJuKSxNbi5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodSx2KS5hcHBseU1hdHJpeDQocm4pLHIucmVzZXQoKSxyLmluaXRpYWxpemUoTW4pO2NvbnN0IFA9bVt3XTtmb3IobGV0IFM9MCxDPVAubGVuZ3RoO1M8QztTKyspe2NvbnN0IEU9MypQW1NdLEY9ZC5nZXRYKEUrMCksQj1kLmdldFgoRSsxKSxJPWQuZ2V0WChFKzIpO2VyLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEYpLGVyLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEIpLGVyLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEkpLHIuc3BsaXRCeVRyaWFuZ2xlKGVyKX1jb25zdCB6PXIudHJpYW5nbGVzO2ZvcihsZXQgUz0wLEM9ei5sZW5ndGg7UzxDO1MrKyl7Y29uc3QgRT16W1NdLEY9ci5jb3BsYW5hclRyaWFuZ2xlVXNlZD9GMChFLGYpOkRsKEUsZik7ZGUubGVuZ3RoPTAsQW4ubGVuZ3RoPTA7Zm9yKGxldCBCPTAsST1uLmxlbmd0aDtCPEk7QisrKXtjb25zdCBrPSRsKG5bQl0sRixzKTtrIT09eGEmJihBbi5wdXNoKGspLGRlLnB1c2gob1tCXS5nZXRHcm91cEF0dHJTZXQoeCkpKX1pZihkZS5sZW5ndGghPT0wKXtNbi5nZXRCYXJ5Y29vcmQoRS5hLG5yLmEpLE1uLmdldEJhcnljb29yZChFLmIsbnIuYiksTW4uZ2V0QmFyeWNvb3JkKEUuYyxuci5jKTtmb3IobGV0IEI9MCxJPWRlLmxlbmd0aDtCPEk7QisrKXtjb25zdCBrPWRlW0JdLFY9QW5bQl09PT0kaTtrMCh3LG5yLGkuZ2VvbWV0cnksaS5tYXRyaXhXb3JsZCx0cixrLGMhPT1WKX19fX1yZXR1cm4geS5sZW5ndGh9ZnVuY3Rpb24gcWwoaSx0LGUsbixzLHIsbz0wKXtjb25zdCBhPWkubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKTwwO3JuLmNvcHkodC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkoaS5tYXRyaXhXb3JsZCksdHIuZ2V0Tm9ybWFsTWF0cml4KGkubWF0cml4V29ybGQpLm11bHRpcGx5U2NhbGFyKGE/LTE6MSk7Y29uc3QgYz10Lmdlb21ldHJ5LmJvdW5kc1RyZWUsbD1pLmdlb21ldHJ5Lmdyb3VwSW5kaWNlcyxoPWkuZ2VvbWV0cnkuaW5kZXgsdT1pLmdlb21ldHJ5LmF0dHJpYnV0ZXMsZj11LnBvc2l0aW9uLGQ9W10scD1pLmdlb21ldHJ5LmhhbGZFZGdlcyx5PW5ldyBTZXQsbT1vYShpLmdlb21ldHJ5KTtmb3IobGV0IGc9MCxiPW07ZzxiO2crKylnIGluIGUuaW50ZXJzZWN0aW9uU2V0fHx5LmFkZChnKTtmb3IoO3kuc2l6ZT4wOyl7Y29uc3QgZz1PMCh5KTt5LmRlbGV0ZShnKSxkLnB1c2goZyk7Y29uc3QgYj0zKmcsdz1oLmdldFgoYiswKSx4PWguZ2V0WChiKzEpLE09aC5nZXRYKGIrMik7b24uYS5mcm9tQnVmZmVyQXR0cmlidXRlKGYsdykuYXBwbHlNYXRyaXg0KHJuKSxvbi5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoZix4KS5hcHBseU1hdHJpeDQocm4pLG9uLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLE0pLmFwcGx5TWF0cml4NChybik7Y29uc3QgQT1EbChvbixjKTtBbi5sZW5ndGg9MCxkZS5sZW5ndGg9MDtmb3IobGV0IF89MCx2PW4ubGVuZ3RoO188djtfKyspe2NvbnN0IFA9JGwobltfXSxBLHMpO1AhPT14YSYmKEFuLnB1c2goUCksZGUucHVzaChyW19dKSl9Zm9yKDtkLmxlbmd0aD4wOyl7Y29uc3QgXz1kLnBvcCgpO2ZvcihsZXQgdj0wO3Y8Mzt2Kyspe2NvbnN0IFA9cC5nZXRTaWJsaW5nVHJpYW5nbGVJbmRleChfLHYpO1AhPT0tMSYmeS5oYXMoUCkmJihkLnB1c2goUCkseS5kZWxldGUoUCkpfWlmKGRlLmxlbmd0aCE9PTApe2NvbnN0IHY9MypfLFA9aC5nZXRYKHYrMCksej1oLmdldFgodisxKSxTPWguZ2V0WCh2KzIpLEM9bz09PS0xPzA6bFtfXStvO2lmKG9uLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLFApLG9uLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLHopLG9uLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLFMpLCFzbihvbikpZm9yKGxldCBFPTAsRj1kZS5sZW5ndGg7RTxGO0UrKyl7Y29uc3QgQj1BbltFXSxJPWRlW0VdLmdldEdyb3VwQXR0clNldChDKSxrPUI9PT0kaTtOMChQLHosUyx1LGkubWF0cml4V29ybGQsdHIsSSxrIT09YSl9fX19fWZ1bmN0aW9uICQwKGkpe2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGgtMTt0Kyspe2NvbnN0IGU9aVt0XSxuPWlbdCsxXTtpZihlLm1hdGVyaWFsSW5kZXg9PT1uLm1hdGVyaWFsSW5kZXgpe2NvbnN0IHM9ZS5zdGFydCxyPW4uc3RhcnQrbi5jb3VudDtuLnN0YXJ0PXMsbi5jb3VudD1yLXMsaS5zcGxpY2UodCwxKSx0LS19fX1mdW5jdGlvbiBVMChpLHQsZSxuKXtlLmNsZWFyKCk7Y29uc3Qgcz1pLmF0dHJpYnV0ZXM7Zm9yKGxldCByPTAsbz1uLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPW5bcl0sYz1zW2FdO2UuaW5pdGlhbGl6ZUFycmF5KGEsYy5hcnJheS5jb25zdHJ1Y3RvcixjLml0ZW1TaXplLGMubm9ybWFsaXplZCl9Zm9yKGNvbnN0IHIgaW4gZS5hdHRyaWJ1dGVzKW4uaW5jbHVkZXMocil8fGUuZGVsZXRlKHIpO2Zvcihjb25zdCByIGluIHQuYXR0cmlidXRlcyluLmluY2x1ZGVzKHIpfHwodC5kZWxldGVBdHRyaWJ1dGUociksdC5kaXNwb3NlKCkpfWZ1bmN0aW9uIFYwKGksdCxlKXtsZXQgbj0hMSxzPS0xO2NvbnN0IHI9aS5hdHRyaWJ1dGVzLG89dC5ncm91cEF0dHJpYnV0ZXNbMF07Zm9yKGNvbnN0IGMgaW4gbyl7Y29uc3QgbD10LmdldFRvdGFsTGVuZ3RoKGMpLGg9dC5nZXRUeXBlKGMpLHU9dC5nZXRJdGVtU2l6ZShjKSxmPXQuZ2V0Tm9ybWFsaXplZChjKTtsZXQgZD1yW2NdOyghZHx8ZC5hcnJheS5sZW5ndGg8bCkmJihkPW5ldyB4dChuZXcgaChsKSx1LGYpLGkuc2V0QXR0cmlidXRlKGMsZCksbj0hMCk7bGV0IHA9MDtmb3IobGV0IHk9MCxtPU1hdGgubWluKGUubGVuZ3RoLHQuZ3JvdXBDb3VudCk7eTxtO3krKyl7Y29uc3QgZz1lW3ldLmluZGV4LHthcnJheTpiLHR5cGU6dyxsZW5ndGg6eH09dC5ncm91cEF0dHJpYnV0ZXNbZ11bY10sTT1uZXcgdyhiLmJ1ZmZlciwwLHgpO2QuYXJyYXkuc2V0KE0scCkscCs9TS5sZW5ndGh9ZC5uZWVkc1VwZGF0ZT0hMCxzPWwvZC5pdGVtU2l6ZX1pZihpLmluZGV4KXtjb25zdCBjPWkuaW5kZXguYXJyYXk7aWYoYy5sZW5ndGg8cylpLmluZGV4PW51bGwsbj0hMDtlbHNlIGZvcihsZXQgbD0wLGg9Yy5sZW5ndGg7bDxoO2wrKyljW2xdPWx9bGV0IGE9MDtpLmNsZWFyR3JvdXBzKCk7Zm9yKGxldCBjPTAsbD1NYXRoLm1pbihlLmxlbmd0aCx0Lmdyb3VwQ291bnQpO2M8bDtjKyspe2NvbnN0e2luZGV4OmgsbWF0ZXJpYWxJbmRleDp1fT1lW2NdLGY9dC5nZXRDb3VudChoKTtmIT09MCYmKGkuYWRkR3JvdXAoYSxmLHUpLGErPWYpfWkuc2V0RHJhd1JhbmdlKDAscyksaS5ib3VuZHNUcmVlPW51bGwsbiYmaS5kaXNwb3NlKCl9ZnVuY3Rpb24gSGwoaSx0KXtsZXQgZT10O3JldHVybiBBcnJheS5pc0FycmF5KHQpfHwoZT1bXSxpLmZvckVhY2gobj0+e2Vbbi5tYXRlcmlhbEluZGV4XT10fSkpLGV9Y2xhc3MgcTB7Y29uc3RydWN0b3IoKXt0aGlzLnRyaWFuZ2xlU3BsaXR0ZXI9bmV3IF8wLHRoaXMuYXR0cmlidXRlRGF0YT1bXSx0aGlzLmF0dHJpYnV0ZXM9WyJwb3NpdGlvbiIsInV2Iiwibm9ybWFsIl0sdGhpcy51c2VHcm91cHM9ITAsdGhpcy5jb25zb2xpZGF0ZUdyb3Vwcz0hMCx0aGlzLmRlYnVnPW5ldyBMMH1nZXRHcm91cFJhbmdlcyh0KXtyZXR1cm4hdGhpcy51c2VHcm91cHN8fHQuZ3JvdXBzLmxlbmd0aD09PTA/W3tzdGFydDowLGNvdW50OjEvMCxtYXRlcmlhbEluZGV4OjB9XTp0Lmdyb3Vwcy5tYXAoZT0+RnQoe30sZSkpfWV2YWx1YXRlKHQsZSxuLHM9bmV3IFpzKXtsZXQgcj0hMDtpZihBcnJheS5pc0FycmF5KG4pfHwobj1bbl0pLEFycmF5LmlzQXJyYXkocyl8fChzPVtzXSxyPSExKSxzLmxlbmd0aCE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRXZhbHVhdG9yOiBvcGVyYXRpb25zIGFuZCB0YXJnZXQgYXJyYXkgcGFzc2VkIGFzIGRpZmZlcmVudCBzaXplcy4iKTt0LnByZXBhcmVHZW9tZXRyeSgpLGUucHJlcGFyZUdlb21ldHJ5KCk7Y29uc3R7dHJpYW5nbGVTcGxpdHRlcjpvLGF0dHJpYnV0ZURhdGE6YSxhdHRyaWJ1dGVzOmMsdXNlR3JvdXBzOmwsY29uc29saWRhdGVHcm91cHM6aCxkZWJ1Zzp1fT10aGlzO2Zvcig7YS5sZW5ndGg8cy5sZW5ndGg7KWEucHVzaChuZXcgUzApO3MuZm9yRWFjaCgoZyxiKT0+e1UwKHQuZ2VvbWV0cnksZy5nZW9tZXRyeSxhW2JdLGMpfSksdS5pbml0KCksRDAodCxlLG4sbyxhLHt1c2VHcm91cHM6bH0pLHUuY29tcGxldGUoKTtjb25zdCBmPXRoaXMuZ2V0R3JvdXBSYW5nZXModC5nZW9tZXRyeSksZD1IbChmLHQubWF0ZXJpYWwpLHA9dGhpcy5nZXRHcm91cFJhbmdlcyhlLmdlb21ldHJ5KSx5PUhsKHAsZS5tYXRlcmlhbCk7cC5mb3JFYWNoKGc9PmcubWF0ZXJpYWxJbmRleCs9ZC5sZW5ndGgpO2xldCBtPVsuLi5mLC4uLnBdLm1hcCgoZyxiKT0+WmUoRnQoe30sZykse2luZGV4OmJ9KSk7aWYobCl7Y29uc3QgZz1bLi4uZCwuLi55XTtoJiYobT1tLm1hcCh3PT57Y29uc3QgeD1nW3cubWF0ZXJpYWxJbmRleF07cmV0dXJuIHcubWF0ZXJpYWxJbmRleD1nLmluZGV4T2YoeCksd30pLnNvcnQoKHcseCk9PncubWF0ZXJpYWxJbmRleC14Lm1hdGVyaWFsSW5kZXgpKTtjb25zdCBiPVtdO2ZvcihsZXQgdz0wLHg9Zy5sZW5ndGg7dzx4O3crKyl7bGV0IE09ITE7Zm9yKGxldCBBPTAsXz1tLmxlbmd0aDtBPF87QSsrKXtjb25zdCB2PW1bQV07di5tYXRlcmlhbEluZGV4PT09dyYmKE09ITAsdi5tYXRlcmlhbEluZGV4PWIubGVuZ3RoKX1NJiZiLnB1c2goZ1t3XSl9cy5mb3JFYWNoKHc9Pnt3Lm1hdGVyaWFsPWJ9KX1lbHNlIG09W3tzdGFydDowLGNvdW50OjEvMCxpbmRleDowLG1hdGVyaWFsSW5kZXg6MH1dLHMuZm9yRWFjaChnPT57Zy5tYXRlcmlhbD1kWzBdfSk7cmV0dXJuIHMuZm9yRWFjaCgoZyxiKT0+e2NvbnN0IHc9Zy5nZW9tZXRyeTtWMCh3LGFbYl0sbSksaCYmJDAody5ncm91cHMpfSkscj9zOnNbMF19ZXZhbHVhdGVIaWVyYXJjaHkodCxlPW5ldyBacyl7dC51cGRhdGVNYXRyaXhXb3JsZCghMCk7Y29uc3Qgbj0ocixvKT0+e2NvbnN0IGE9ci5jaGlsZHJlbjtmb3IobGV0IGM9MCxsPWEubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9YVtjXTtoLmlzT3BlcmF0aW9uR3JvdXA/bihoLG8pOm8oaCl9fSxzPXI9Pntjb25zdCBvPXIuY2hpbGRyZW47bGV0IGE9ITE7Zm9yKGxldCBsPTAsaD1vLmxlbmd0aDtsPGg7bCsrKXtjb25zdCB1PW9bbF07YT1zKHUpfHxhfWNvbnN0IGM9ci5pc0RpcnR5KCk7aWYoYyYmci5tYXJrVXBkYXRlZCgpLGEmJiFyLmlzT3BlcmF0aW9uR3JvdXApe2xldCBsO3JldHVybiBuKHIsaD0+e2w/bD10aGlzLmV2YWx1YXRlKGwsaCxoLm9wZXJhdGlvbik6bD10aGlzLmV2YWx1YXRlKHIsaCxoLm9wZXJhdGlvbil9KSxyLl9jYWNoZWRHZW9tZXRyeT1sLmdlb21ldHJ5LHIuX2NhY2hlZE1hdGVyaWFscz1sLm1hdGVyaWFsLCEwfWVsc2UgcmV0dXJuIGF8fGN9O3JldHVybiBzKHQpLGUuZ2VvbWV0cnk9dC5fY2FjaGVkR2VvbWV0cnksZS5tYXRlcmlhbD10Ll9jYWNoZWRNYXRlcmlhbHMsZX1yZXNldCgpe3RoaXMudHJpYW5nbGVTcGxpdHRlci5yZXNldCgpfX1mdW5jdGlvbiBXbChpKXtsZXQgdCxlLG4scz0tMSxyPTA7Zm9yKGxldCBsPTA7bDxpLmxlbmd0aDsrK2wpe2NvbnN0IGg9aVtsXTtpZih0PT09dm9pZCAwJiYodD1oLmFycmF5LmNvbnN0cnVjdG9yKSx0IT09aC5hcnJheS5jb25zdHJ1Y3RvcilyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmFycmF5IG11c3QgYmUgb2YgY29uc2lzdGVudCBhcnJheSB0eXBlcyBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKGU9PT12b2lkIDAmJihlPWguaXRlbVNpemUpLGUhPT1oLml0ZW1TaXplKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUuaXRlbVNpemUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYobj09PXZvaWQgMCYmKG49aC5ub3JtYWxpemVkKSxuIT09aC5ub3JtYWxpemVkKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUubm9ybWFsaXplZCBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihzPT09LTEmJihzPWguZ3B1VHlwZSkscyE9PWguZ3B1VHlwZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmdwdVR5cGUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7cis9aC5jb3VudCplfWNvbnN0IG89bmV3IHQociksYT1uZXcgeHQobyxlLG4pO2xldCBjPTA7Zm9yKGxldCBsPTA7bDxpLmxlbmd0aDsrK2wpe2NvbnN0IGg9aVtsXTtpZihoLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IHU9Yy9lO2ZvcihsZXQgZj0wLGQ9aC5jb3VudDtmPGQ7ZisrKWZvcihsZXQgcD0wO3A8ZTtwKyspe2NvbnN0IHk9aC5nZXRDb21wb25lbnQoZixwKTthLnNldENvbXBvbmVudChmK3UscCx5KX19ZWxzZSBvLnNldChoLmFycmF5LGMpO2MrPWguY291bnQqZX1yZXR1cm4gcyE9PXZvaWQgMCYmKGEuZ3B1VHlwZT1zKSxhfWZ1bmN0aW9uIEgwKGkpe2lmKGkuZ3JvdXBzLmxlbmd0aD09PTApcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUdyb3VwcygpOiBObyBncm91cHMgYXJlIGRlZmluZWQuIE5vdGhpbmcgdG8gbWVyZ2UuIiksaTtsZXQgdD1pLmdyb3VwcztpZih0PXQuc29ydCgobyxhKT0+by5tYXRlcmlhbEluZGV4IT09YS5tYXRlcmlhbEluZGV4P28ubWF0ZXJpYWxJbmRleC1hLm1hdGVyaWFsSW5kZXg6by5zdGFydC1hLnN0YXJ0KSxpLmdldEluZGV4KCk9PT1udWxsKXtjb25zdCBvPWkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLGE9W107Zm9yKGxldCBjPTA7YzxvLmNvdW50O2MrPTMpYS5wdXNoKGMsYysxLGMrMik7aS5zZXRJbmRleChhKX1jb25zdCBlPWkuZ2V0SW5kZXgoKSxuPVtdO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb10sYz1hLnN0YXJ0LGw9YythLmNvdW50O2ZvcihsZXQgaD1jO2g8bDtoKyspbi5wdXNoKGUuZ2V0WChoKSl9aS5kaXNwb3NlKCksaS5zZXRJbmRleChuKTtsZXQgcz0wO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb107YS5zdGFydD1zLHMrPWEuY291bnR9bGV0IHI9dFswXTtpLmdyb3Vwcz1bcl07Zm9yKGxldCBvPTE7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGE9dFtvXTtyLm1hdGVyaWFsSW5kZXg9PT1hLm1hdGVyaWFsSW5kZXg/ci5jb3VudCs9YS5jb3VudDoocj1hLGkuZ3JvdXBzLnB1c2gocikpfXJldHVybiBpfWZ1bmN0aW9uIEdsKGksdD0wKXtjb25zdCBlPWlbMF0uaW5kZXghPT1udWxsLG49bmV3IFNldChPYmplY3Qua2V5cyhpWzBdLmF0dHJpYnV0ZXMpKSxzPW5ldyBTZXQoT2JqZWN0LmtleXMoaVswXS5tb3JwaEF0dHJpYnV0ZXMpKSxyPXt9LG89e30sYT1pWzBdLm1vcnBoVGFyZ2V0c1JlbGF0aXZlLGM9bmV3IHVlO2xldCBsPTA7Zm9yKGxldCBoPTA7aDxpLmxlbmd0aDsrK2gpe2NvbnN0IHU9aVtoXTtsZXQgZj0wO2lmKGUhPT0odS5pbmRleCE9PW51bGwpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuIEFsbCBnZW9tZXRyaWVzIG11c3QgaGF2ZSBjb21wYXRpYmxlIGF0dHJpYnV0ZXM7IG1ha2Ugc3VyZSBpbmRleCBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1LmF0dHJpYnV0ZXMpe2lmKCFuLmhhcyhkKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsnLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzOyBtYWtlIHN1cmUgIicrZCsnIiBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uJyksbnVsbDtyW2RdPT09dm9pZCAwJiYocltkXT1bXSkscltkXS5wdXNoKHUuYXR0cmlidXRlc1tkXSksZisrfWlmKGYhPT1uLnNpemUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gTWFrZSBzdXJlIGFsbCBnZW9tZXRyaWVzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihhIT09dS5tb3JwaFRhcmdldHNSZWxhdGl2ZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiAubW9ycGhUYXJnZXRzUmVsYXRpdmUgbXVzdCBiZSBjb25zaXN0ZW50IHRocm91Z2hvdXQgYWxsIGdlb21ldHJpZXMuIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1Lm1vcnBoQXR0cmlidXRlcyl7aWYoIXMuaGFzKGQpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuICAubW9ycGhBdHRyaWJ1dGVzIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLG51bGw7b1tkXT09PXZvaWQgMCYmKG9bZF09W10pLG9bZF0ucHVzaCh1Lm1vcnBoQXR0cmlidXRlc1tkXSl9aWYodCl7bGV0IGQ7aWYoZSlkPXUuaW5kZXguY291bnQ7ZWxzZSBpZih1LmF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDApZD11LmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQ7ZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiBUaGUgZ2VvbWV0cnkgbXVzdCBoYXZlIGVpdGhlciBhbiBpbmRleCBvciBhIHBvc2l0aW9uIGF0dHJpYnV0ZSIpLG51bGw7aWYodD09PTEpYy5hZGRHcm91cChsLGQsaCk7ZWxzZSBpZih0PT09MiYmdS5ncm91cHMubGVuZ3RoPjApZm9yKGxldCBwIG9mIHUuZ3JvdXBzKXtsZXQgeT1wLm1hdGVyaWFsSW5kZXg7Yy5hZGRHcm91cChsK3Auc3RhcnQsTWF0aC5taW4ocC5jb3VudCxkKSx5KX1sKz1kfX1pZihlKXtsZXQgaD0wO2NvbnN0IHU9W107Zm9yKGxldCBmPTA7ZjxpLmxlbmd0aDsrK2Ype2NvbnN0IGQ9aVtmXS5pbmRleDtmb3IobGV0IHA9MDtwPGQuY291bnQ7KytwKXUucHVzaChkLmdldFgocCkraCk7aCs9aVtmXS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWMuc2V0SW5kZXgodSl9Zm9yKGNvbnN0IGggaW4gcil7Y29uc3QgdT1XbChyW2hdKTtpZighdSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIGF0dHJpYnV0ZS4iKSxudWxsO2Muc2V0QXR0cmlidXRlKGgsdSl9Zm9yKGNvbnN0IGggaW4gbyl7Y29uc3QgdT1vW2hdWzBdLmxlbmd0aDtpZih1PT09MClicmVhaztjLm1vcnBoQXR0cmlidXRlcz1jLm1vcnBoQXR0cmlidXRlc3x8e30sYy5tb3JwaEF0dHJpYnV0ZXNbaF09W107Zm9yKGxldCBmPTA7Zjx1OysrZil7Y29uc3QgZD1bXTtmb3IobGV0IHk9MDt5PG9baF0ubGVuZ3RoOysreSlkLnB1c2gob1toXVt5XVtmXSk7Y29uc3QgcD1XbChkKTtpZighcClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIG1vcnBoQXR0cmlidXRlLiIpLG51bGw7Yy5tb3JwaEF0dHJpYnV0ZXNbaF0ucHVzaChwKX19cmV0dXJuIHQ9PT0yP0gwKGMpOmN9Y2xhc3MgVzAgZXh0ZW5kcyBHbntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSk7Y29uc3Qgbj1uZXcgWnMobmV3IEduKHQsWmUoRnQoe30sZSkse2hhc1RvcDohMCxoYXNTaWRlOiEwLGhhc0JvdHRvbTohMX0pKSk7bi51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0IHM9bmV3IGd0KCkuc2V0RnJvbU9iamVjdChuKSxyPW5ldyBUO3MuZ2V0U2l6ZShyKTtjb25zdCBvPW5ldyBUKHMubWluLngrci54LzIscy5taW4ueStyLnkvMiwwKTtsZXQgYT1lLnRvcFNlZ21lbnRzLGM9ZS5ib3gzO2lmKGMpe2M9Yy51bmlvbihzKTtjb25zdCBnPW5ldyBUO2MuZ2V0U2l6ZShnKTtjb25zdCBiPU1hdGgubWF4KHIueC9nLngsci55L2cueSk7YT1NYXRoLmNlaWwoZS50b3BTZWdtZW50cypiKX1pZihhPDQpcmV0dXJuIHRoaXM7Y29uc3QgbD1uZXcgUm8oci54LHIueSxhLGEpLGg9bmV3IFpzKGwpO2gucG9zaXRpb24uc2V0KG8ueCxvLnksby56KSxoLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Y29uc3QgZj1uZXcgcTAoKS5ldmFsdWF0ZShoLG4sQ2wpLGQ9Zi5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikscD1uZXcgQmUoZC5jb3VudCoyLDIpO2ZvcihsZXQgZz0wO2c8ZC5jb3VudDtnKyspe2NvbnN0IGI9ZC5nZXRaKGcpO2Quc2V0WihnLGUuZGVwdGgrYil9aWYoYyl7Y29uc3QgZz1jLm1pbixiPWMubWF4LHc9bmV3IFQoKS5zdWJWZWN0b3JzKGIsZyk7Zm9yKGxldCB4PTA7eDxkLmNvdW50O3grKyl7Y29uc3QgTT1kLmdldFgoeCksQT1kLmdldFkoeCksXz0oTS1nLngpL3cueCx2PShBLWcueSkvdy55O3Auc2V0WFkoeCxfLHYpfWYuZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCJ1diIscCl9ZC5uZWVkc1VwZGF0ZT0hMDtjb25zdCB5PW5ldyBHbih0LFplKEZ0KHt9LGUpLHtoYXNUb3A6ITF9KSksbT1HbChbZi5nZW9tZXRyeSx5XSwyKTt0aGlzLmNvcHkobS50b05vbkluZGV4ZWQoKSl9fXZhciBHMD1pPT57Y29uc3R7c3BsaXQ6dCxkZXB0aDplLHBvaW50czpuLGJveDM6cyxoYXNUb3A6cixoYXNCb3R0b206byxoYXNTaWRlOmEsc2lkZVJlcGVhdDpjLHRvcFNlZ21lbnRzOmx9PWksaD1sP1cwOkduLHU9bmV3IGgobmV3IFdjKG4pLHtkZXB0aDplLGJldmVsRW5hYmxlZDohMSxib3gzOnMsVVZHZW5lcmF0b3I6WmYoe3NwbGl0OnQsYm94MzpzLHNpZGVSZXBlYXQ6Y30pLGhhc1RvcDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSx0b3BTZWdtZW50czpsfSk7cmV0dXJuIFhmKCksdX07ZnVuY3Rpb24gWjAoaSx0LGU9MCl7Y29uc3Qgbj0oOTAtdCkqTWF0aC5QSS8xODAscz0oOTAtaSkqTWF0aC5QSS8xODA7cmV0dXJuW2UqTWF0aC5zaW4obikqTWF0aC5jb3MocyksZSpNYXRoLmNvcyhuKSxlKk1hdGguc2luKG4pKk1hdGguc2luKHMpXX1mdW5jdGlvbiBpcihpLHQpe3JldHVybiBpPT1udWxsfHx0PT1udWxsP05hTjppPHQ/LTE6aT50PzE6aT49dD8wOk5hTn1mdW5jdGlvbiBYMChpLHQpe3JldHVybiBpPT1udWxsfHx0PT1udWxsP05hTjp0PGk/LTE6dD5pPzE6dD49aT8wOk5hTn1mdW5jdGlvbiBabChpKXtsZXQgdCxlLG47aS5sZW5ndGghPT0yPyh0PWlyLGU9KGEsYyk9PmlyKGkoYSksYyksbj0oYSxjKT0+aShhKS1jKToodD1pPT09aXJ8fGk9PT1YMD9pOkowLGU9aSxuPWkpO2Z1bmN0aW9uIHMoYSxjLGw9MCxoPWEubGVuZ3RoKXtpZihsPGgpe2lmKHQoYyxjKSE9PTApcmV0dXJuIGg7ZG97Y29uc3QgdT1sK2g+Pj4xO2UoYVt1XSxjKTwwP2w9dSsxOmg9dX13aGlsZShsPGgpfXJldHVybiBsfWZ1bmN0aW9uIHIoYSxjLGw9MCxoPWEubGVuZ3RoKXtpZihsPGgpe2lmKHQoYyxjKSE9PTApcmV0dXJuIGg7ZG97Y29uc3QgdT1sK2g+Pj4xO2UoYVt1XSxjKTw9MD9sPXUrMTpoPXV9d2hpbGUobDxoKX1yZXR1cm4gbH1mdW5jdGlvbiBvKGEsYyxsPTAsaD1hLmxlbmd0aCl7Y29uc3QgdT1zKGEsYyxsLGgtMSk7cmV0dXJuIHU+bCYmbihhW3UtMV0sYyk+LW4oYVt1XSxjKT91LTE6dX1yZXR1cm57bGVmdDpzLGNlbnRlcjpvLHJpZ2h0OnJ9fWZ1bmN0aW9uIEowKCl7cmV0dXJuIDB9ZnVuY3Rpb24gWTAoaSl7cmV0dXJuIGk9PT1udWxsP05hTjoraX1jb25zdCBqMD1abChpcikucmlnaHQ7WmwoWTApLmNlbnRlcjtmdW5jdGlvbiBzcihpLHQpe2xldCBlLG47aWYodD09PXZvaWQgMClmb3IoY29uc3QgcyBvZiBpKXMhPW51bGwmJihlPT09dm9pZCAwP3M+PXMmJihlPW49cyk6KGU+cyYmKGU9cyksbjxzJiYobj1zKSkpO2Vsc2V7bGV0IHM9LTE7Zm9yKGxldCByIG9mIGkpKHI9dChyLCsrcyxpKSkhPW51bGwmJihlPT09dm9pZCAwP3I+PXImJihlPW49cik6KGU+ciYmKGU9ciksbjxyJiYobj1yKSkpfXJldHVybltlLG5dfWNsYXNzIExle2NvbnN0cnVjdG9yKCl7dGhpcy5fcGFydGlhbHM9bmV3IEZsb2F0NjRBcnJheSgzMiksdGhpcy5fbj0wfWFkZCh0KXtjb25zdCBlPXRoaXMuX3BhcnRpYWxzO2xldCBuPTA7Zm9yKGxldCBzPTA7czx0aGlzLl9uJiZzPDMyO3MrKyl7Y29uc3Qgcj1lW3NdLG89dCtyLGE9TWF0aC5hYnModCk8TWF0aC5hYnMocik/dC0oby1yKTpyLShvLXQpO2EmJihlW24rK109YSksdD1vfXJldHVybiBlW25dPXQsdGhpcy5fbj1uKzEsdGhpc312YWx1ZU9mKCl7Y29uc3QgdD10aGlzLl9wYXJ0aWFscztsZXQgZT10aGlzLl9uLG4scyxyLG89MDtpZihlPjApe2ZvcihvPXRbLS1lXTtlPjAmJihuPW8scz10Wy0tZV0sbz1uK3Mscj1zLShvLW4pLCFyKTspO2U+MCYmKHI8MCYmdFtlLTFdPDB8fHI+MCYmdFtlLTFdPjApJiYocz1yKjIsbj1vK3Mscz09bi1vJiYobz1uKSl9cmV0dXJuIG99fWNvbnN0IFEwPU1hdGguc3FydCg1MCksSzA9TWF0aC5zcXJ0KDEwKSx0cD1NYXRoLnNxcnQoMik7ZnVuY3Rpb24gcnIoaSx0LGUpe2NvbnN0IG49KHQtaSkvTWF0aC5tYXgoMCxlKSxzPU1hdGguZmxvb3IoTWF0aC5sb2cxMChuKSkscj1uL01hdGgucG93KDEwLHMpLG89cj49UTA/MTA6cj49SzA/NTpyPj10cD8yOjE7bGV0IGEsYyxsO3JldHVybiBzPDA/KGw9TWF0aC5wb3coMTAsLXMpL28sYT1NYXRoLnJvdW5kKGkqbCksYz1NYXRoLnJvdW5kKHQqbCksYS9sPGkmJisrYSxjL2w+dCYmLS1jLGw9LWwpOihsPU1hdGgucG93KDEwLHMpKm8sYT1NYXRoLnJvdW5kKGkvbCksYz1NYXRoLnJvdW5kKHQvbCksYSpsPGkmJisrYSxjKmw+dCYmLS1jKSxjPGEmJi41PD1lJiZlPDI/cnIoaSx0LGUqMik6W2EsYyxsXX1mdW5jdGlvbiBlcChpLHQsZSl7aWYodD0rdCxpPStpLGU9K2UsIShlPjApKXJldHVybltdO2lmKGk9PT10KXJldHVybltpXTtjb25zdCBuPXQ8aSxbcyxyLG9dPW4/cnIodCxpLGUpOnJyKGksdCxlKTtpZighKHI+PXMpKXJldHVybltdO2NvbnN0IGE9ci1zKzEsYz1uZXcgQXJyYXkoYSk7aWYobilpZihvPDApZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShyLWwpLy1vO2Vsc2UgZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShyLWwpKm87ZWxzZSBpZihvPDApZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShzK2wpLy1vO2Vsc2UgZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShzK2wpKm87cmV0dXJuIGN9ZnVuY3Rpb24gTWEoaSx0LGUpe3JldHVybiB0PSt0LGk9K2ksZT0rZSxycihpLHQsZSlbMl19ZnVuY3Rpb24gbnAoaSx0LGUpe3Q9K3QsaT0raSxlPStlO2NvbnN0IG49dDxpLHM9bj9NYSh0LGksZSk6TWEoaSx0LGUpO3JldHVybihuPy0xOjEpKihzPDA/MS8tczpzKX1mdW5jdGlvbiBpcChpLHQpe2xldCBlPTAsbj0wO2lmKHQ9PT12b2lkIDApZm9yKGxldCBzIG9mIGkpcyE9bnVsbCYmKHM9K3MpPj1zJiYoKytlLG4rPXMpO2Vsc2V7bGV0IHM9LTE7Zm9yKGxldCByIG9mIGkpKHI9dChyLCsrcyxpKSkhPW51bGwmJihyPStyKT49ciYmKCsrZSxuKz1yKX1pZihlKXJldHVybiBuL2V9ZnVuY3Rpb24qc3AoaSl7Zm9yKGNvbnN0IHQgb2YgaSl5aWVsZCpadSh0KX1mdW5jdGlvbiBVaShpKXtyZXR1cm4gQXJyYXkuZnJvbShzcChpKSl9dmFyIEs9MWUtNixvcj0xZS0xMixYPU1hdGguUEksTnQ9WC8yLGFyPVgvNCxSdD1YKjIsaHQ9MTgwL1gsSD1YLzE4MCx0dD1NYXRoLmFicyxBYT1NYXRoLmF0YW4scmU9TWF0aC5hdGFuMixXPU1hdGguY29zLHJwPU1hdGguZXhwLF9hPU1hdGguaHlwb3Qsb3A9TWF0aC5sb2cscT1NYXRoLnNpbixhcD1NYXRoLnNpZ258fGZ1bmN0aW9uKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH0sT2U9TWF0aC5zcXJ0LGNwPU1hdGgudGFuO2Z1bmN0aW9uIGxwKGkpe3JldHVybiBpPjE/MDppPC0xP1g6TWF0aC5hY29zKGkpfWZ1bmN0aW9uIERlKGkpe3JldHVybiBpPjE/TnQ6aTwtMT8tTnQ6TWF0aC5hc2luKGkpfWZ1bmN0aW9uIFhsKGkpe3JldHVybihpPXEoaS8yKSkqaX1mdW5jdGlvbiB2dCgpe31mdW5jdGlvbiBjcihpLHQpe2kmJllsLmhhc093blByb3BlcnR5KGkudHlwZSkmJllsW2kudHlwZV0oaSx0KX12YXIgSmw9e0ZlYXR1cmU6ZnVuY3Rpb24oaSx0KXtjcihpLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmZlYXR1cmVzLG49LTEscz1lLmxlbmd0aDsrK248czspY3IoZVtuXS5nZW9tZXRyeSx0KX19LFlsPXtTcGhlcmU6ZnVuY3Rpb24oaSx0KXt0LnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbihpLHQpe2k9aS5jb29yZGluYXRlcyx0LnBvaW50KGlbMF0saVsxXSxpWzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaT1lW25dLHQucG9pbnQoaVswXSxpWzFdLGlbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7dmEoaS5jb29yZGluYXRlcyx0LDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KXZhKGVbbl0sdCwwKX0sUG9seWdvbjpmdW5jdGlvbihpLHQpe2psKGkuY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspamwoZVtuXSx0KX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZ2VvbWV0cmllcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWNyKGVbbl0sdCl9fTtmdW5jdGlvbiB2YShpLHQsZSl7dmFyIG49LTEscz1pLmxlbmd0aC1lLHI7Zm9yKHQubGluZVN0YXJ0KCk7KytuPHM7KXI9aVtuXSx0LnBvaW50KHJbMF0sclsxXSxyWzJdKTt0LmxpbmVFbmQoKX1mdW5jdGlvbiBqbChpLHQpe3ZhciBlPS0xLG49aS5sZW5ndGg7Zm9yKHQucG9seWdvblN0YXJ0KCk7KytlPG47KXZhKGlbZV0sdCwxKTt0LnBvbHlnb25FbmQoKX1mdW5jdGlvbiBscihpLHQpe2kmJkpsLmhhc093blByb3BlcnR5KGkudHlwZSk/SmxbaS50eXBlXShpLHQpOmNyKGksdCl9dmFyIGhyPW5ldyBMZSxRbD1uZXcgTGUsS2wsdGgsU2EsemEsVGEsJGU9e3BvaW50OnZ0LGxpbmVTdGFydDp2dCxsaW5lRW5kOnZ0LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2hyPW5ldyBMZSwkZS5saW5lU3RhcnQ9aHAsJGUubGluZUVuZD11cH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBpPStocjtRbC5hZGQoaTwwP1J0K2k6aSksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9dnR9LHNwaGVyZTpmdW5jdGlvbigpe1FsLmFkZChSdCl9fTtmdW5jdGlvbiBocCgpeyRlLnBvaW50PWZwfWZ1bmN0aW9uIHVwKCl7ZWgoS2wsdGgpfWZ1bmN0aW9uIGZwKGksdCl7JGUucG9pbnQ9ZWgsS2w9aSx0aD10LGkqPUgsdCo9SCxTYT1pLHphPVcodD10LzIrYXIpLFRhPXEodCl9ZnVuY3Rpb24gZWgoaSx0KXtpKj1ILHQqPUgsdD10LzIrYXI7dmFyIGU9aS1TYSxuPWU+PTA/MTotMSxzPW4qZSxyPVcodCksbz1xKHQpLGE9VGEqbyxjPXphKnIrYSpXKHMpLGw9YSpuKnEocyk7aHIuYWRkKHJlKGwsYykpLFNhPWksemE9cixUYT1vfWZ1bmN0aW9uIHVyKGkpe3JldHVybltyZShpWzFdLGlbMF0pLERlKGlbMl0pXX1mdW5jdGlvbiBfbihpKXt2YXIgdD1pWzBdLGU9aVsxXSxuPVcoZSk7cmV0dXJuW24qVyh0KSxuKnEodCkscShlKV19ZnVuY3Rpb24gZnIoaSx0KXtyZXR1cm4gaVswXSp0WzBdK2lbMV0qdFsxXStpWzJdKnRbMl19ZnVuY3Rpb24gbmkoaSx0KXtyZXR1cm5baVsxXSp0WzJdLWlbMl0qdFsxXSxpWzJdKnRbMF0taVswXSp0WzJdLGlbMF0qdFsxXS1pWzFdKnRbMF1dfWZ1bmN0aW9uIFBhKGksdCl7aVswXSs9dFswXSxpWzFdKz10WzFdLGlbMl0rPXRbMl19ZnVuY3Rpb24gZHIoaSx0KXtyZXR1cm5baVswXSp0LGlbMV0qdCxpWzJdKnRdfWZ1bmN0aW9uIHByKGkpe3ZhciB0PU9lKGlbMF0qaVswXStpWzFdKmlbMV0raVsyXSppWzJdKTtpWzBdLz10LGlbMV0vPXQsaVsyXS89dH12YXIgb3QsTHQsdXQscXQsdm4sbmgsaWgsaWksVmksYW4sVWUsVmU9e3BvaW50OkVhLGxpbmVTdGFydDpyaCxsaW5lRW5kOm9oLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1ZlLnBvaW50PWFoLFZlLmxpbmVTdGFydD1kcCxWZS5saW5lRW5kPXBwLFZpPW5ldyBMZSwkZS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpeyRlLnBvbHlnb25FbmQoKSxWZS5wb2ludD1FYSxWZS5saW5lU3RhcnQ9cmgsVmUubGluZUVuZD1vaCxocjwwPyhvdD0tKHV0PTE4MCksTHQ9LShxdD05MCkpOlZpPks/cXQ9OTA6Vmk8LUsmJihMdD0tOTApLFVlWzBdPW90LFVlWzFdPXV0fSxzcGhlcmU6ZnVuY3Rpb24oKXtvdD0tKHV0PTE4MCksTHQ9LShxdD05MCl9fTtmdW5jdGlvbiBFYShpLHQpe2FuLnB1c2goVWU9W290PWksdXQ9aV0pLHQ8THQmJihMdD10KSx0PnF0JiYocXQ9dCl9ZnVuY3Rpb24gc2goaSx0KXt2YXIgZT1fbihbaSpILHQqSF0pO2lmKGlpKXt2YXIgbj1uaShpaSxlKSxzPVtuWzFdLC1uWzBdLDBdLHI9bmkocyxuKTtwcihyKSxyPXVyKHIpO3ZhciBvPWktdm4sYT1vPjA/MTotMSxjPXJbMF0qaHQqYSxsLGg9dHQobyk+MTgwO2heKGEqdm48YyYmYzxhKmkpPyhsPXJbMV0qaHQsbD5xdCYmKHF0PWwpKTooYz0oYyszNjApJTM2MC0xODAsaF4oYSp2bjxjJiZjPGEqaSk/KGw9LXJbMV0qaHQsbDxMdCYmKEx0PWwpKToodDxMdCYmKEx0PXQpLHQ+cXQmJihxdD10KSkpLGg/aTx2bj9IdChvdCxpKT5IdChvdCx1dCkmJih1dD1pKTpIdChpLHV0KT5IdChvdCx1dCkmJihvdD1pKTp1dD49b3Q/KGk8b3QmJihvdD1pKSxpPnV0JiYodXQ9aSkpOmk+dm4/SHQob3QsaSk+SHQob3QsdXQpJiYodXQ9aSk6SHQoaSx1dCk+SHQob3QsdXQpJiYob3Q9aSl9ZWxzZSBhbi5wdXNoKFVlPVtvdD1pLHV0PWldKTt0PEx0JiYoTHQ9dCksdD5xdCYmKHF0PXQpLGlpPWUsdm49aX1mdW5jdGlvbiByaCgpe1ZlLnBvaW50PXNofWZ1bmN0aW9uIG9oKCl7VWVbMF09b3QsVWVbMV09dXQsVmUucG9pbnQ9RWEsaWk9bnVsbH1mdW5jdGlvbiBhaChpLHQpe2lmKGlpKXt2YXIgZT1pLXZuO1ZpLmFkZCh0dChlKT4xODA/ZSsoZT4wPzM2MDotMzYwKTplKX1lbHNlIG5oPWksaWg9dDskZS5wb2ludChpLHQpLHNoKGksdCl9ZnVuY3Rpb24gZHAoKXskZS5saW5lU3RhcnQoKX1mdW5jdGlvbiBwcCgpe2FoKG5oLGloKSwkZS5saW5lRW5kKCksdHQoVmkpPksmJihvdD0tKHV0PTE4MCkpLFVlWzBdPW90LFVlWzFdPXV0LGlpPW51bGx9ZnVuY3Rpb24gSHQoaSx0KXtyZXR1cm4odC09aSk8MD90KzM2MDp0fWZ1bmN0aW9uIHlwKGksdCl7cmV0dXJuIGlbMF0tdFswXX1mdW5jdGlvbiBjaChpLHQpe3JldHVybiBpWzBdPD1pWzFdP2lbMF08PXQmJnQ8PWlbMV06dDxpWzBdfHxpWzFdPHR9ZnVuY3Rpb24gbGgoaSl7dmFyIHQsZSxuLHMscixvLGE7aWYocXQ9dXQ9LShvdD1MdD0xLzApLGFuPVtdLGxyKGksVmUpLGU9YW4ubGVuZ3RoKXtmb3IoYW4uc29ydCh5cCksdD0xLG49YW5bMF0scj1bbl07dDxlOysrdClzPWFuW3RdLGNoKG4sc1swXSl8fGNoKG4sc1sxXSk/KEh0KG5bMF0sc1sxXSk+SHQoblswXSxuWzFdKSYmKG5bMV09c1sxXSksSHQoc1swXSxuWzFdKT5IdChuWzBdLG5bMV0pJiYoblswXT1zWzBdKSk6ci5wdXNoKG49cyk7Zm9yKG89LTEvMCxlPXIubGVuZ3RoLTEsdD0wLG49cltlXTt0PD1lO249cywrK3Qpcz1yW3RdLChhPUh0KG5bMV0sc1swXSkpPm8mJihvPWEsb3Q9c1swXSx1dD1uWzFdKX1yZXR1cm4gYW49VWU9bnVsbCxvdD09PTEvMHx8THQ9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbb3QsTHRdLFt1dCxxdF1dfXZhciBxaSx5cixtcixncix4cix3cixicixNcixDYSxCYSxGYSxoaCx1aCxQdCxFdCxDdCxwZT17c3BoZXJlOnZ0LHBvaW50OklhLGxpbmVTdGFydDpmaCxsaW5lRW5kOmRoLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3BlLmxpbmVTdGFydD14cCxwZS5saW5lRW5kPXdwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7cGUubGluZVN0YXJ0PWZoLHBlLmxpbmVFbmQ9ZGh9fTtmdW5jdGlvbiBJYShpLHQpe2kqPUgsdCo9SDt2YXIgZT1XKHQpO0hpKGUqVyhpKSxlKnEoaSkscSh0KSl9ZnVuY3Rpb24gSGkoaSx0LGUpeysrcWksbXIrPShpLW1yKS9xaSxncis9KHQtZ3IpL3FpLHhyKz0oZS14cikvcWl9ZnVuY3Rpb24gZmgoKXtwZS5wb2ludD1tcH1mdW5jdGlvbiBtcChpLHQpe2kqPUgsdCo9SDt2YXIgZT1XKHQpO1B0PWUqVyhpKSxFdD1lKnEoaSksQ3Q9cSh0KSxwZS5wb2ludD1ncCxIaShQdCxFdCxDdCl9ZnVuY3Rpb24gZ3AoaSx0KXtpKj1ILHQqPUg7dmFyIGU9Vyh0KSxuPWUqVyhpKSxzPWUqcShpKSxyPXEodCksbz1yZShPZSgobz1FdCpyLUN0KnMpKm8rKG89Q3Qqbi1QdCpyKSpvKyhvPVB0KnMtRXQqbikqbyksUHQqbitFdCpzK0N0KnIpO3lyKz1vLHdyKz1vKihQdCsoUHQ9bikpLGJyKz1vKihFdCsoRXQ9cykpLE1yKz1vKihDdCsoQ3Q9cikpLEhpKFB0LEV0LEN0KX1mdW5jdGlvbiBkaCgpe3BlLnBvaW50PUlhfWZ1bmN0aW9uIHhwKCl7cGUucG9pbnQ9YnB9ZnVuY3Rpb24gd3AoKXtwaChoaCx1aCkscGUucG9pbnQ9SWF9ZnVuY3Rpb24gYnAoaSx0KXtoaD1pLHVoPXQsaSo9SCx0Kj1ILHBlLnBvaW50PXBoO3ZhciBlPVcodCk7UHQ9ZSpXKGkpLEV0PWUqcShpKSxDdD1xKHQpLEhpKFB0LEV0LEN0KX1mdW5jdGlvbiBwaChpLHQpe2kqPUgsdCo9SDt2YXIgZT1XKHQpLG49ZSpXKGkpLHM9ZSpxKGkpLHI9cSh0KSxvPUV0KnItQ3QqcyxhPUN0Km4tUHQqcixjPVB0KnMtRXQqbixsPV9hKG8sYSxjKSxoPURlKGwpLHU9bCYmLWgvbDtDYS5hZGQodSpvKSxCYS5hZGQodSphKSxGYS5hZGQodSpjKSx5cis9aCx3cis9aCooUHQrKFB0PW4pKSxicis9aCooRXQrKEV0PXMpKSxNcis9aCooQ3QrKEN0PXIpKSxIaShQdCxFdCxDdCl9ZnVuY3Rpb24geWgoaSl7cWk9eXI9bXI9Z3I9eHI9d3I9YnI9TXI9MCxDYT1uZXcgTGUsQmE9bmV3IExlLEZhPW5ldyBMZSxscihpLHBlKTt2YXIgdD0rQ2EsZT0rQmEsbj0rRmEscz1fYSh0LGUsbik7cmV0dXJuIHM8b3ImJih0PXdyLGU9YnIsbj1Ncix5cjxLJiYodD1tcixlPWdyLG49eHIpLHM9X2EodCxlLG4pLHM8b3IpP1tOYU4sTmFOXTpbcmUoZSx0KSpodCxEZShuL3MpKmh0XX1mdW5jdGlvbiBrYShpLHQpe2Z1bmN0aW9uIGUobixzKXtyZXR1cm4gbj1pKG4scyksdChuWzBdLG5bMV0pfXJldHVybiBpLmludmVydCYmdC5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihuLHMpe3JldHVybiBuPXQuaW52ZXJ0KG4scyksbiYmaS5pbnZlcnQoblswXSxuWzFdKX0pLGV9ZnVuY3Rpb24gTmEoaSx0KXtyZXR1cm4gdHQoaSk+WCYmKGktPU1hdGgucm91bmQoaS9SdCkqUnQpLFtpLHRdfU5hLmludmVydD1OYTtmdW5jdGlvbiBtaChpLHQsZSl7cmV0dXJuKGklPVJ0KT90fHxlP2thKHhoKGkpLHdoKHQsZSkpOnhoKGkpOnR8fGU/d2godCxlKTpOYX1mdW5jdGlvbiBnaChpKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdCs9aSx0dCh0KT5YJiYodC09TWF0aC5yb3VuZCh0L1J0KSpSdCksW3QsZV19fWZ1bmN0aW9uIHhoKGkpe3ZhciB0PWdoKGkpO3JldHVybiB0LmludmVydD1naCgtaSksdH1mdW5jdGlvbiB3aChpLHQpe3ZhciBlPVcoaSksbj1xKGkpLHM9Vyh0KSxyPXEodCk7ZnVuY3Rpb24gbyhhLGMpe3ZhciBsPVcoYyksaD1XKGEpKmwsdT1xKGEpKmwsZj1xKGMpLGQ9ZiplK2gqbjtyZXR1cm5bcmUodSpzLWQqcixoKmUtZipuKSxEZShkKnMrdSpyKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKGEsYyl7dmFyIGw9VyhjKSxoPVcoYSkqbCx1PXEoYSkqbCxmPXEoYyksZD1mKnMtdSpyO3JldHVybltyZSh1KnMrZipyLGgqZStkKm4pLERlKGQqZS1oKm4pXX0sb31mdW5jdGlvbiBiaChpKXtpPW1oKGlbMF0qSCxpWzFdKkgsaS5sZW5ndGg+Mj9pWzJdKkg6MCk7ZnVuY3Rpb24gdChlKXtyZXR1cm4gZT1pKGVbMF0qSCxlWzFdKkgpLGVbMF0qPWh0LGVbMV0qPWh0LGV9cmV0dXJuIHQuaW52ZXJ0PWZ1bmN0aW9uKGUpe3JldHVybiBlPWkuaW52ZXJ0KGVbMF0qSCxlWzFdKkgpLGVbMF0qPWh0LGVbMV0qPWh0LGV9LHR9ZnVuY3Rpb24gTXAoaSx0LGUsbixzLHIpe2lmKGUpe3ZhciBvPVcodCksYT1xKHQpLGM9biplO3M9PW51bGw/KHM9dCtuKlJ0LHI9dC1jLzIpOihzPU1oKG8scykscj1NaChvLHIpLChuPjA/czxyOnM+cikmJihzKz1uKlJ0KSk7Zm9yKHZhciBsLGg9cztuPjA/aD5yOmg8cjtoLT1jKWw9dXIoW28sLWEqVyhoKSwtYSpxKGgpXSksaS5wb2ludChsWzBdLGxbMV0pfX1mdW5jdGlvbiBNaChpLHQpe3Q9X24odCksdFswXS09aSxwcih0KTt2YXIgZT1scCgtdFsxXSk7cmV0dXJuKCgtdFsyXTwwPy1lOmUpK1J0LUspJVJ0fWZ1bmN0aW9uIEFoKCl7dmFyIGk9W10sdDtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24oZSxuLHMpe3QucHVzaChbZSxuLHNdKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7aS5wdXNoKHQ9W10pfSxsaW5lRW5kOnZ0LHJlam9pbjpmdW5jdGlvbigpe2kubGVuZ3RoPjEmJmkucHVzaChpLnBvcCgpLmNvbmNhdChpLnNoaWZ0KCkpKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGU9aTtyZXR1cm4gaT1bXSx0PW51bGwsZX19fWZ1bmN0aW9uIEFyKGksdCl7cmV0dXJuIHR0KGlbMF0tdFswXSk8SyYmdHQoaVsxXS10WzFdKTxLfWZ1bmN0aW9uIF9yKGksdCxlLG4pe3RoaXMueD1pLHRoaXMuej10LHRoaXMubz1lLHRoaXMuZT1uLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gX2goaSx0LGUsbixzKXt2YXIgcj1bXSxvPVtdLGEsYztpZihpLmZvckVhY2goZnVuY3Rpb24ocCl7aWYoISgoeT1wLmxlbmd0aC0xKTw9MCkpe3ZhciB5LG09cFswXSxnPXBbeV0sYjtpZihBcihtLGcpKXtpZighbVsyXSYmIWdbMl0pe2ZvcihzLmxpbmVTdGFydCgpLGE9MDthPHk7KythKXMucG9pbnQoKG09cFthXSlbMF0sbVsxXSk7cy5saW5lRW5kKCk7cmV0dXJufWdbMF0rPTIqS31yLnB1c2goYj1uZXcgX3IobSxwLG51bGwsITApKSxvLnB1c2goYi5vPW5ldyBfcihtLG51bGwsYiwhMSkpLHIucHVzaChiPW5ldyBfcihnLHAsbnVsbCwhMSkpLG8ucHVzaChiLm89bmV3IF9yKGcsbnVsbCxiLCEwKSl9fSksISFyLmxlbmd0aCl7Zm9yKG8uc29ydCh0KSx2aChyKSx2aChvKSxhPTAsYz1vLmxlbmd0aDthPGM7KythKW9bYV0uZT1lPSFlO2Zvcih2YXIgbD1yWzBdLGgsdTs7KXtmb3IodmFyIGY9bCxkPSEwO2YudjspaWYoKGY9Zi5uKT09PWwpcmV0dXJuO2g9Zi56LHMubGluZVN0YXJ0KCk7ZG97aWYoZi52PWYuby52PSEwLGYuZSl7aWYoZClmb3IoYT0wLGM9aC5sZW5ndGg7YTxjOysrYSlzLnBvaW50KCh1PWhbYV0pWzBdLHVbMV0pO2Vsc2UgbihmLngsZi5uLngsMSxzKTtmPWYubn1lbHNle2lmKGQpZm9yKGg9Zi5wLnosYT1oLmxlbmd0aC0xO2E+PTA7LS1hKXMucG9pbnQoKHU9aFthXSlbMF0sdVsxXSk7ZWxzZSBuKGYueCxmLnAueCwtMSxzKTtmPWYucH1mPWYubyxoPWYueixkPSFkfXdoaWxlKCFmLnYpO3MubGluZUVuZCgpfX19ZnVuY3Rpb24gdmgoaSl7aWYodD1pLmxlbmd0aCl7Zm9yKHZhciB0LGU9MCxuPWlbMF0sczsrK2U8dDspbi5uPXM9aVtlXSxzLnA9bixuPXM7bi5uPXM9aVswXSxzLnA9bn19ZnVuY3Rpb24gUmEoaSl7cmV0dXJuIHR0KGlbMF0pPD1YP2lbMF06YXAoaVswXSkqKCh0dChpWzBdKStYKSVSdC1YKX1mdW5jdGlvbiBTaChpLHQpe3ZhciBlPVJhKHQpLG49dFsxXSxzPXEobikscj1bcShlKSwtVyhlKSwwXSxvPTAsYT0wLGM9bmV3IExlO3M9PT0xP249TnQrSzpzPT09LTEmJihuPS1OdC1LKTtmb3IodmFyIGw9MCxoPWkubGVuZ3RoO2w8aDsrK2wpaWYoZj0odT1pW2xdKS5sZW5ndGgpZm9yKHZhciB1LGYsZD11W2YtMV0scD1SYShkKSx5PWRbMV0vMithcixtPXEoeSksZz1XKHkpLGI9MDtiPGY7KytiLHA9eCxtPUEsZz1fLGQ9dyl7dmFyIHc9dVtiXSx4PVJhKHcpLE09d1sxXS8yK2FyLEE9cShNKSxfPVcoTSksdj14LXAsUD12Pj0wPzE6LTEsej1QKnYsUz16PlgsQz1tKkE7aWYoYy5hZGQocmUoQypQKnEoeiksZypfK0MqVyh6KSkpLG8rPVM/ditQKlJ0OnYsU15wPj1lXng+PWUpe3ZhciBFPW5pKF9uKGQpLF9uKHcpKTtwcihFKTt2YXIgRj1uaShyLEUpO3ByKEYpO3ZhciBCPShTXnY+PTA/LTE6MSkqRGUoRlsyXSk7KG4+Qnx8bj09PUImJihFWzBdfHxFWzFdKSkmJihhKz1TXnY+PTA/MTotMSl9fXJldHVybihvPC1LfHxvPEsmJmM8LW9yKV5hJjF9ZnVuY3Rpb24gemgoaSx0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHMpe3ZhciByPXQocyksbz1BaCgpLGE9dChvKSxjPSExLGwsaCx1LGY9e3BvaW50OmQsbGluZVN0YXJ0OnksbGluZUVuZDptLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2YucG9pbnQ9ZyxmLmxpbmVTdGFydD1iLGYubGluZUVuZD13LGg9W10sbD1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2YucG9pbnQ9ZCxmLmxpbmVTdGFydD15LGYubGluZUVuZD1tLGg9VWkoaCk7dmFyIHg9U2gobCxuKTtoLmxlbmd0aD8oY3x8KHMucG9seWdvblN0YXJ0KCksYz0hMCksX2goaCxfcCx4LGUscykpOngmJihjfHwocy5wb2x5Z29uU3RhcnQoKSxjPSEwKSxzLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEscykscy5saW5lRW5kKCkpLGMmJihzLnBvbHlnb25FbmQoKSxjPSExKSxoPWw9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7cy5wb2x5Z29uU3RhcnQoKSxzLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEscykscy5saW5lRW5kKCkscy5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKHgsTSl7aSh4LE0pJiZzLnBvaW50KHgsTSl9ZnVuY3Rpb24gcCh4LE0pe3IucG9pbnQoeCxNKX1mdW5jdGlvbiB5KCl7Zi5wb2ludD1wLHIubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbSgpe2YucG9pbnQ9ZCxyLmxpbmVFbmQoKX1mdW5jdGlvbiBnKHgsTSl7dS5wdXNoKFt4LE1dKSxhLnBvaW50KHgsTSl9ZnVuY3Rpb24gYigpe2EubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiB3KCl7Zyh1WzBdWzBdLHVbMF1bMV0pLGEubGluZUVuZCgpO3ZhciB4PWEuY2xlYW4oKSxNPW8ucmVzdWx0KCksQSxfPU0ubGVuZ3RoLHYsUCx6O2lmKHUucG9wKCksbC5wdXNoKHUpLHU9bnVsbCwhIV8pe2lmKHgmMSl7aWYoUD1NWzBdLCh2PVAubGVuZ3RoLTEpPjApe2ZvcihjfHwocy5wb2x5Z29uU3RhcnQoKSxjPSEwKSxzLmxpbmVTdGFydCgpLEE9MDtBPHY7KytBKXMucG9pbnQoKHo9UFtBXSlbMF0selsxXSk7cy5saW5lRW5kKCl9cmV0dXJufV8+MSYmeCYyJiZNLnB1c2goTS5wb3AoKS5jb25jYXQoTS5zaGlmdCgpKSksaC5wdXNoKE0uZmlsdGVyKEFwKSl9fXJldHVybiBmfX1mdW5jdGlvbiBBcChpKXtyZXR1cm4gaS5sZW5ndGg+MX1mdW5jdGlvbiBfcChpLHQpe3JldHVybigoaT1pLngpWzBdPDA/aVsxXS1OdC1LOk50LWlbMV0pLSgodD10LngpWzBdPDA/dFsxXS1OdC1LOk50LXRbMV0pfXZhciBUaD16aChmdW5jdGlvbigpe3JldHVybiEwfSx2cCx6cCxbLVgsLU50XSk7ZnVuY3Rpb24gdnAoaSl7dmFyIHQ9TmFOLGU9TmFOLG49TmFOLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2kubGluZVN0YXJ0KCkscz0xfSxwb2ludDpmdW5jdGlvbihyLG8pe3ZhciBhPXI+MD9YOi1YLGM9dHQoci10KTt0dChjLVgpPEs/KGkucG9pbnQodCxlPShlK28pLzI+MD9OdDotTnQpLGkucG9pbnQobixlKSxpLmxpbmVFbmQoKSxpLmxpbmVTdGFydCgpLGkucG9pbnQoYSxlKSxpLnBvaW50KHIsZSkscz0wKTpuIT09YSYmYz49WCYmKHR0KHQtbik8SyYmKHQtPW4qSyksdHQoci1hKTxLJiYoci09YSpLKSxlPVNwKHQsZSxyLG8pLGkucG9pbnQobixlKSxpLmxpbmVFbmQoKSxpLmxpbmVTdGFydCgpLGkucG9pbnQoYSxlKSxzPTApLGkucG9pbnQodD1yLGU9byksbj1hfSxsaW5lRW5kOmZ1bmN0aW9uKCl7aS5saW5lRW5kKCksdD1lPU5hTn0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi1zfX19ZnVuY3Rpb24gU3AoaSx0LGUsbil7dmFyIHMscixvPXEoaS1lKTtyZXR1cm4gdHQobyk+Sz9BYSgocSh0KSoocj1XKG4pKSpxKGUpLXEobikqKHM9Vyh0KSkqcShpKSkvKHMqcipvKSk6KHQrbikvMn1mdW5jdGlvbiB6cChpLHQsZSxuKXt2YXIgcztpZihpPT1udWxsKXM9ZSpOdCxuLnBvaW50KC1YLHMpLG4ucG9pbnQoMCxzKSxuLnBvaW50KFgscyksbi5wb2ludChYLDApLG4ucG9pbnQoWCwtcyksbi5wb2ludCgwLC1zKSxuLnBvaW50KC1YLC1zKSxuLnBvaW50KC1YLDApLG4ucG9pbnQoLVgscyk7ZWxzZSBpZih0dChpWzBdLXRbMF0pPkspe3ZhciByPWlbMF08dFswXT9YOi1YO3M9ZSpyLzIsbi5wb2ludCgtcixzKSxuLnBvaW50KDAscyksbi5wb2ludChyLHMpfWVsc2Ugbi5wb2ludCh0WzBdLHRbMV0pfWZ1bmN0aW9uIFRwKGkpe3ZhciB0PVcoaSksZT0yKkgsbj10PjAscz10dCh0KT5LO2Z1bmN0aW9uIHIoaCx1LGYsZCl7TXAoZCxpLGUsZixoLHUpfWZ1bmN0aW9uIG8oaCx1KXtyZXR1cm4gVyhoKSpXKHUpPnR9ZnVuY3Rpb24gYShoKXt2YXIgdSxmLGQscCx5O3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtwPWQ9ITEseT0xfSxwb2ludDpmdW5jdGlvbihtLGcpe3ZhciBiPVttLGddLHcseD1vKG0sZyksTT1uP3g/MDpsKG0sZyk6eD9sKG0rKG08MD9YOi1YKSxnKTowO2lmKCF1JiYocD1kPXgpJiZoLmxpbmVTdGFydCgpLHghPT1kJiYodz1jKHUsYiksKCF3fHxBcih1LHcpfHxBcihiLHcpKSYmKGJbMl09MSkpLHghPT1kKXk9MCx4PyhoLmxpbmVTdGFydCgpLHc9YyhiLHUpLGgucG9pbnQod1swXSx3WzFdKSk6KHc9Yyh1LGIpLGgucG9pbnQod1swXSx3WzFdLDIpLGgubGluZUVuZCgpKSx1PXc7ZWxzZSBpZihzJiZ1JiZuXngpe3ZhciBBOyEoTSZmKSYmKEE9YyhiLHUsITApKSYmKHk9MCxuPyhoLmxpbmVTdGFydCgpLGgucG9pbnQoQVswXVswXSxBWzBdWzFdKSxoLnBvaW50KEFbMV1bMF0sQVsxXVsxXSksaC5saW5lRW5kKCkpOihoLnBvaW50KEFbMV1bMF0sQVsxXVsxXSksaC5saW5lRW5kKCksaC5saW5lU3RhcnQoKSxoLnBvaW50KEFbMF1bMF0sQVswXVsxXSwzKSkpfXgmJighdXx8IUFyKHUsYikpJiZoLnBvaW50KGJbMF0sYlsxXSksdT1iLGQ9eCxmPU19LGxpbmVFbmQ6ZnVuY3Rpb24oKXtkJiZoLmxpbmVFbmQoKSx1PW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIHl8KHAmJmQpPDwxfX19ZnVuY3Rpb24gYyhoLHUsZil7dmFyIGQ9X24oaCkscD1fbih1KSx5PVsxLDAsMF0sbT1uaShkLHApLGc9ZnIobSxtKSxiPW1bMF0sdz1nLWIqYjtpZighdylyZXR1cm4hZiYmaDt2YXIgeD10KmcvdyxNPS10KmIvdyxBPW5pKHksbSksXz1kcih5LHgpLHY9ZHIobSxNKTtQYShfLHYpO3ZhciBQPUEsej1mcihfLFApLFM9ZnIoUCxQKSxDPXoqei1TKihmcihfLF8pLTEpO2lmKCEoQzwwKSl7dmFyIEU9T2UoQyksRj1kcihQLCgtei1FKS9TKTtpZihQYShGLF8pLEY9dXIoRiksIWYpcmV0dXJuIEY7dmFyIEI9aFswXSxJPXVbMF0saz1oWzFdLEQ9dVsxXSxWO0k8QiYmKFY9QixCPUksST1WKTt2YXIgaj1JLUIsZHQ9dHQoai1YKTxLLER0PWR0fHxqPEs7aWYoIWR0JiZEPGsmJihWPWssaz1ELEQ9ViksRHQ/ZHQ/aytEPjBeRlsxXTwodHQoRlswXS1CKTxLP2s6RCk6azw9RlsxXSYmRlsxXTw9RDpqPlheKEI8PUZbMF0mJkZbMF08PUkpKXt2YXIgR3Q9ZHIoUCwoLXorRSkvUyk7cmV0dXJuIFBhKEd0LF8pLFtGLHVyKEd0KV19fX1mdW5jdGlvbiBsKGgsdSl7dmFyIGY9bj9pOlgtaSxkPTA7cmV0dXJuIGg8LWY/ZHw9MTpoPmYmJihkfD0yKSx1PC1mP2R8PTQ6dT5mJiYoZHw9OCksZH1yZXR1cm4gemgobyxhLHIsbj9bMCwtaV06Wy1YLGktWF0pfWZ1bmN0aW9uIFBwKGksdCxlLG4scyxyKXt2YXIgbz1pWzBdLGE9aVsxXSxjPXRbMF0sbD10WzFdLGg9MCx1PTEsZj1jLW8sZD1sLWEscDtpZihwPWUtbywhKCFmJiZwPjApKXtpZihwLz1mLGY8MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWVsc2UgaWYoZj4wKXtpZihwPnUpcmV0dXJuO3A+aCYmKGg9cCl9aWYocD1zLW8sISghZiYmcDwwKSl7aWYocC89ZixmPDApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1lbHNlIGlmKGY+MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWlmKHA9bi1hLCEoIWQmJnA+MCkpe2lmKHAvPWQsZDwwKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9ZWxzZSBpZihkPjApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1pZihwPXItYSwhKCFkJiZwPDApKXtpZihwLz1kLGQ8MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWVsc2UgaWYoZD4wKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9cmV0dXJuIGg+MCYmKGlbMF09bytoKmYsaVsxXT1hK2gqZCksdTwxJiYodFswXT1vK3UqZix0WzFdPWErdSpkKSwhMH19fX19dmFyIFdpPTFlOSx2cj0tV2k7ZnVuY3Rpb24gRXAoaSx0LGUsbil7ZnVuY3Rpb24gcyhsLGgpe3JldHVybiBpPD1sJiZsPD1lJiZ0PD1oJiZoPD1ufWZ1bmN0aW9uIHIobCxoLHUsZil7dmFyIGQ9MCxwPTA7aWYobD09bnVsbHx8KGQ9byhsLHUpKSE9PShwPW8oaCx1KSl8fGMobCxoKTwwXnU+MClkbyBmLnBvaW50KGQ9PT0wfHxkPT09Mz9pOmUsZD4xP246dCk7d2hpbGUoKGQ9KGQrdSs0KSU0KSE9PXApO2Vsc2UgZi5wb2ludChoWzBdLGhbMV0pfWZ1bmN0aW9uIG8obCxoKXtyZXR1cm4gdHQobFswXS1pKTxLP2g+MD8wOjM6dHQobFswXS1lKTxLP2g+MD8yOjE6dHQobFsxXS10KTxLP2g+MD8xOjA6aD4wPzM6Mn1mdW5jdGlvbiBhKGwsaCl7cmV0dXJuIGMobC54LGgueCl9ZnVuY3Rpb24gYyhsLGgpe3ZhciB1PW8obCwxKSxmPW8oaCwxKTtyZXR1cm4gdSE9PWY/dS1mOnU9PT0wP2hbMV0tbFsxXTp1PT09MT9sWzBdLWhbMF06dT09PTI/bFsxXS1oWzFdOmhbMF0tbFswXX1yZXR1cm4gZnVuY3Rpb24obCl7dmFyIGg9bCx1PUFoKCksZixkLHAseSxtLGcsYix3LHgsTSxBLF89e3BvaW50OnYsbGluZVN0YXJ0OkMsbGluZUVuZDpFLHBvbHlnb25TdGFydDp6LHBvbHlnb25FbmQ6U307ZnVuY3Rpb24gdihCLEkpe3MoQixJKSYmaC5wb2ludChCLEkpfWZ1bmN0aW9uIFAoKXtmb3IodmFyIEI9MCxJPTAsaz1kLmxlbmd0aDtJPGs7KytJKWZvcih2YXIgRD1kW0ldLFY9MSxqPUQubGVuZ3RoLGR0PURbMF0sRHQsR3QsWnQ9ZHRbMF0sbWU9ZHRbMV07VjxqOysrVilEdD1adCxHdD1tZSxkdD1EW1ZdLFp0PWR0WzBdLG1lPWR0WzFdLEd0PD1uP21lPm4mJihadC1EdCkqKG4tR3QpPihtZS1HdCkqKGktRHQpJiYrK0I6bWU8PW4mJihadC1EdCkqKG4tR3QpPChtZS1HdCkqKGktRHQpJiYtLUI7cmV0dXJuIEJ9ZnVuY3Rpb24geigpe2g9dSxmPVtdLGQ9W10sQT0hMH1mdW5jdGlvbiBTKCl7dmFyIEI9UCgpLEk9QSYmQixrPShmPVVpKGYpKS5sZW5ndGg7KEl8fGspJiYobC5wb2x5Z29uU3RhcnQoKSxJJiYobC5saW5lU3RhcnQoKSxyKG51bGwsbnVsbCwxLGwpLGwubGluZUVuZCgpKSxrJiZfaChmLGEsQixyLGwpLGwucG9seWdvbkVuZCgpKSxoPWwsZj1kPXA9bnVsbH1mdW5jdGlvbiBDKCl7Xy5wb2ludD1GLGQmJmQucHVzaChwPVtdKSxNPSEwLHg9ITEsYj13PU5hTn1mdW5jdGlvbiBFKCl7ZiYmKEYoeSxtKSxnJiZ4JiZ1LnJlam9pbigpLGYucHVzaCh1LnJlc3VsdCgpKSksXy5wb2ludD12LHgmJmgubGluZUVuZCgpfWZ1bmN0aW9uIEYoQixJKXt2YXIgaz1zKEIsSSk7aWYoZCYmcC5wdXNoKFtCLEldKSxNKXk9QixtPUksZz1rLE09ITEsayYmKGgubGluZVN0YXJ0KCksaC5wb2ludChCLEkpKTtlbHNlIGlmKGsmJngpaC5wb2ludChCLEkpO2Vsc2V7dmFyIEQ9W2I9TWF0aC5tYXgodnIsTWF0aC5taW4oV2ksYikpLHc9TWF0aC5tYXgodnIsTWF0aC5taW4oV2ksdykpXSxWPVtCPU1hdGgubWF4KHZyLE1hdGgubWluKFdpLEIpKSxJPU1hdGgubWF4KHZyLE1hdGgubWluKFdpLEkpKV07UHAoRCxWLGksdCxlLG4pPyh4fHwoaC5saW5lU3RhcnQoKSxoLnBvaW50KERbMF0sRFsxXSkpLGgucG9pbnQoVlswXSxWWzFdKSxrfHxoLmxpbmVFbmQoKSxBPSExKTprJiYoaC5saW5lU3RhcnQoKSxoLnBvaW50KEIsSSksQT0hMSl9Yj1CLHc9SSx4PWt9cmV0dXJuIF99fXZhciBMYSxPYSxTcix6cixzaT17c3BoZXJlOnZ0LHBvaW50OnZ0LGxpbmVTdGFydDpDcCxsaW5lRW5kOnZ0LHBvbHlnb25TdGFydDp2dCxwb2x5Z29uRW5kOnZ0fTtmdW5jdGlvbiBDcCgpe3NpLnBvaW50PUZwLHNpLmxpbmVFbmQ9QnB9ZnVuY3Rpb24gQnAoKXtzaS5wb2ludD1zaS5saW5lRW5kPXZ0fWZ1bmN0aW9uIEZwKGksdCl7aSo9SCx0Kj1ILE9hPWksU3I9cSh0KSx6cj1XKHQpLHNpLnBvaW50PUlwfWZ1bmN0aW9uIElwKGksdCl7aSo9SCx0Kj1IO3ZhciBlPXEodCksbj1XKHQpLHM9dHQoaS1PYSkscj1XKHMpLG89cShzKSxhPW4qbyxjPXpyKmUtU3IqbipyLGw9U3IqZSt6cipuKnI7TGEuYWRkKHJlKE9lKGEqYStjKmMpLGwpKSxPYT1pLFNyPWUsenI9bn1mdW5jdGlvbiBrcChpKXtyZXR1cm4gTGE9bmV3IExlLGxyKGksc2kpLCtMYX12YXIgRGE9W251bGwsbnVsbF0sTnA9e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOkRhfTtmdW5jdGlvbiByaShpLHQpe3JldHVybiBEYVswXT1pLERhWzFdPXQsa3AoTnApfXZhciBQaD17RmVhdHVyZTpmdW5jdGlvbihpLHQpe3JldHVybiBUcihpLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmZlYXR1cmVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoVHIoZVtuXS5nZW9tZXRyeSx0KSlyZXR1cm4hMDtyZXR1cm4hMX19LEVoPXtTcGhlcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUG9pbnQ6ZnVuY3Rpb24oaSx0KXtyZXR1cm4gQ2goaS5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2ludDpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoQ2goZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe3JldHVybiBCaChpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWlmKEJoKGVbbl0sdCkpcmV0dXJuITA7cmV0dXJuITF9LFBvbHlnb246ZnVuY3Rpb24oaSx0KXtyZXR1cm4gRmgoaS5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZihGaChlW25dLHQpKXJldHVybiEwO3JldHVybiExfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5nZW9tZXRyaWVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoVHIoZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX19O2Z1bmN0aW9uIFRyKGksdCl7cmV0dXJuIGkmJkVoLmhhc093blByb3BlcnR5KGkudHlwZSk/RWhbaS50eXBlXShpLHQpOiExfWZ1bmN0aW9uIENoKGksdCl7cmV0dXJuIHJpKGksdCk9PT0wfWZ1bmN0aW9uIEJoKGksdCl7Zm9yKHZhciBlLG4scyxyPTAsbz1pLmxlbmd0aDtyPG87cisrKXtpZihuPXJpKGlbcl0sdCksbj09PTB8fHI+MCYmKHM9cmkoaVtyXSxpW3ItMV0pLHM+MCYmZTw9cyYmbjw9cyYmKGUrbi1zKSooMS1NYXRoLnBvdygoZS1uKS9zLDIpKTxvcipzKSlyZXR1cm4hMDtlPW59cmV0dXJuITF9ZnVuY3Rpb24gRmgoaSx0KXtyZXR1cm4hIVNoKGkubWFwKFJwKSxJaCh0KSl9ZnVuY3Rpb24gUnAoaSl7cmV0dXJuIGk9aS5tYXAoSWgpLGkucG9wKCksaX1mdW5jdGlvbiBJaChpKXtyZXR1cm5baVswXSpILGlbMV0qSF19ZnVuY3Rpb24gTHAoaSx0KXtyZXR1cm4oaSYmUGguaGFzT3duUHJvcGVydHkoaS50eXBlKT9QaFtpLnR5cGVdOlRyKShpLHQpfWZ1bmN0aW9uIE9wKGksdCl7dmFyIGU9aVswXSpILG49aVsxXSpILHM9dFswXSpILHI9dFsxXSpILG89VyhuKSxhPXEobiksYz1XKHIpLGw9cShyKSxoPW8qVyhlKSx1PW8qcShlKSxmPWMqVyhzKSxkPWMqcShzKSxwPTIqRGUoT2UoWGwoci1uKStvKmMqWGwocy1lKSkpLHk9cShwKSxtPXA/ZnVuY3Rpb24oZyl7dmFyIGI9cShnKj1wKS95LHc9cShwLWcpL3kseD13KmgrYipmLE09dyp1K2IqZCxBPXcqYStiKmw7cmV0dXJuW3JlKE0seCkqaHQscmUoQSxPZSh4KngrTSpNKSkqaHRdfTpmdW5jdGlvbigpe3JldHVybltlKmh0LG4qaHRdfTtyZXR1cm4gbS5kaXN0YW5jZT1wLG19dmFyIGtoPWk9Pmksb2k9MS8wLFByPW9pLEdpPS1vaSxFcj1HaSxOaD17cG9pbnQ6RHAsbGluZVN0YXJ0OnZ0LGxpbmVFbmQ6dnQscG9seWdvblN0YXJ0OnZ0LHBvbHlnb25FbmQ6dnQscmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGk9W1tvaSxQcl0sW0dpLEVyXV07cmV0dXJuIEdpPUVyPS0oUHI9b2k9MS8wKSxpfX07ZnVuY3Rpb24gRHAoaSx0KXtpPG9pJiYob2k9aSksaT5HaSYmKEdpPWkpLHQ8UHImJihQcj10KSx0PkVyJiYoRXI9dCl9ZnVuY3Rpb24gJGEoaSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBVYTtmb3IodmFyIG4gaW4gaSllW25dPWlbbl07cmV0dXJuIGUuc3RyZWFtPXQsZX19ZnVuY3Rpb24gVWEoKXt9VWEucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpVYSxwb2ludDpmdW5jdGlvbihpLHQpe3RoaXMuc3RyZWFtLnBvaW50KGksdCl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBWYShpLHQsZSl7dmFyIG49aS5jbGlwRXh0ZW50JiZpLmNsaXBFeHRlbnQoKTtyZXR1cm4gaS5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbiE9bnVsbCYmaS5jbGlwRXh0ZW50KG51bGwpLGxyKGUsaS5zdHJlYW0oTmgpKSx0KE5oLnJlc3VsdCgpKSxuIT1udWxsJiZpLmNsaXBFeHRlbnQobiksaX1mdW5jdGlvbiBSaChpLHQsZSl7cmV0dXJuIFZhKGksZnVuY3Rpb24obil7dmFyIHM9dFsxXVswXS10WzBdWzBdLHI9dFsxXVsxXS10WzBdWzFdLG89TWF0aC5taW4ocy8oblsxXVswXS1uWzBdWzBdKSxyLyhuWzFdWzFdLW5bMF1bMV0pKSxhPSt0WzBdWzBdKyhzLW8qKG5bMV1bMF0rblswXVswXSkpLzIsYz0rdFswXVsxXSsoci1vKihuWzFdWzFdK25bMF1bMV0pKS8yO2kuc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSxjXSl9LGUpfWZ1bmN0aW9uICRwKGksdCxlKXtyZXR1cm4gUmgoaSxbWzAsMF0sdF0sZSl9ZnVuY3Rpb24gVXAoaSx0LGUpe3JldHVybiBWYShpLGZ1bmN0aW9uKG4pe3ZhciBzPSt0LHI9cy8oblsxXVswXS1uWzBdWzBdKSxvPShzLXIqKG5bMV1bMF0rblswXVswXSkpLzIsYT0tcipuWzBdWzFdO2kuc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfWZ1bmN0aW9uIFZwKGksdCxlKXtyZXR1cm4gVmEoaSxmdW5jdGlvbihuKXt2YXIgcz0rdCxyPXMvKG5bMV1bMV0tblswXVsxXSksbz0tcipuWzBdWzBdLGE9KHMtciooblsxXVsxXStuWzBdWzFdKSkvMjtpLnNjYWxlKDE1MCpyKS50cmFuc2xhdGUoW28sYV0pfSxlKX12YXIgTGg9MTYscXA9VygzMCpIKTtmdW5jdGlvbiBPaChpLHQpe3JldHVybit0P1dwKGksdCk6SHAoaSl9ZnVuY3Rpb24gSHAoaSl7cmV0dXJuICRhKHtwb2ludDpmdW5jdGlvbih0LGUpe3Q9aSh0LGUpLHRoaXMuc3RyZWFtLnBvaW50KHRbMF0sdFsxXSl9fSl9ZnVuY3Rpb24gV3AoaSx0KXtmdW5jdGlvbiBlKG4scyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksbSl7dmFyIGc9bC1uLGI9aC1zLHc9ZypnK2IqYjtpZih3PjQqdCYmeS0tKXt2YXIgeD1vK2YsTT1hK2QsQT1jK3AsXz1PZSh4KngrTSpNK0EqQSksdj1EZShBLz1fKSxQPXR0KHR0KEEpLTEpPEt8fHR0KHItdSk8Sz8ocit1KS8yOnJlKE0seCksej1pKFAsdiksUz16WzBdLEM9elsxXSxFPVMtbixGPUMtcyxCPWIqRS1nKkY7KEIqQi93PnR8fHR0KChnKkUrYipGKS93LS41KT4uM3x8bypmK2EqZCtjKnA8cXApJiYoZShuLHMscixvLGEsYyxTLEMsUCx4Lz1fLE0vPV8sQSx5LG0pLG0ucG9pbnQoUyxDKSxlKFMsQyxQLHgsTSxBLGwsaCx1LGYsZCxwLHksbSkpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHMscixvLGEsYyxsLGgsdSxmLGQscCx5LG09e3BvaW50OmcsbGluZVN0YXJ0OmIsbGluZUVuZDp4LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksbS5saW5lU3RhcnQ9TX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLG0ubGluZVN0YXJ0PWJ9fTtmdW5jdGlvbiBnKHYsUCl7dj1pKHYsUCksbi5wb2ludCh2WzBdLHZbMV0pfWZ1bmN0aW9uIGIoKXt1PU5hTixtLnBvaW50PXcsbi5saW5lU3RhcnQoKX1mdW5jdGlvbiB3KHYsUCl7dmFyIHo9X24oW3YsUF0pLFM9aSh2LFApO2UodSxmLGgsZCxwLHksdT1TWzBdLGY9U1sxXSxoPXYsZD16WzBdLHA9elsxXSx5PXpbMl0sTGgsbiksbi5wb2ludCh1LGYpfWZ1bmN0aW9uIHgoKXttLnBvaW50PWcsbi5saW5lRW5kKCl9ZnVuY3Rpb24gTSgpe2IoKSxtLnBvaW50PUEsbS5saW5lRW5kPV99ZnVuY3Rpb24gQSh2LFApe3cocz12LFApLHI9dSxvPWYsYT1kLGM9cCxsPXksbS5wb2ludD13fWZ1bmN0aW9uIF8oKXtlKHUsZixoLGQscCx5LHIsbyxzLGEsYyxsLExoLG4pLG0ubGluZUVuZD14LHgoKX1yZXR1cm4gbX19dmFyIEdwPSRhKHtwb2ludDpmdW5jdGlvbihpLHQpe3RoaXMuc3RyZWFtLnBvaW50KGkqSCx0KkgpfX0pO2Z1bmN0aW9uIFpwKGkpe3JldHVybiAkYSh7cG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgbj1pKHQsZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9ZnVuY3Rpb24gWHAoaSx0LGUsbixzKXtmdW5jdGlvbiByKG8sYSl7cmV0dXJuIG8qPW4sYSo9cyxbdCtpKm8sZS1pKmFdfXJldHVybiByLmludmVydD1mdW5jdGlvbihvLGEpe3JldHVyblsoby10KS9pKm4sKGUtYSkvaSpzXX0scn1mdW5jdGlvbiBEaChpLHQsZSxuLHMscil7aWYoIXIpcmV0dXJuIFhwKGksdCxlLG4scyk7dmFyIG89VyhyKSxhPXEociksYz1vKmksbD1hKmksaD1vL2ksdT1hL2ksZj0oYSplLW8qdCkvaSxkPShhKnQrbyplKS9pO2Z1bmN0aW9uIHAoeSxtKXtyZXR1cm4geSo9bixtKj1zLFtjKnktbCptK3QsZS1sKnktYyptXX1yZXR1cm4gcC5pbnZlcnQ9ZnVuY3Rpb24oeSxtKXtyZXR1cm5bbiooaCp5LXUqbStmKSxzKihkLXUqeS1oKm0pXX0scH1mdW5jdGlvbiBDcihpKXtyZXR1cm4gSnAoZnVuY3Rpb24oKXtyZXR1cm4gaX0pKCl9ZnVuY3Rpb24gSnAoaSl7dmFyIHQsZT0xNTAsbj00ODAscz0yNTAscj0wLG89MCxhPTAsYz0wLGw9MCxoLHU9MCxmPTEsZD0xLHA9bnVsbCx5PVRoLG09bnVsbCxnLGIsdyx4PWtoLE09LjUsQSxfLHYsUCx6O2Z1bmN0aW9uIFMoQil7cmV0dXJuIHYoQlswXSpILEJbMV0qSCl9ZnVuY3Rpb24gQyhCKXtyZXR1cm4gQj12LmludmVydChCWzBdLEJbMV0pLEImJltCWzBdKmh0LEJbMV0qaHRdfVMuc3RyZWFtPWZ1bmN0aW9uKEIpe3JldHVybiBQJiZ6PT09Qj9QOlA9R3AoWnAoaCkoeShBKHgoej1CKSkpKSl9LFMucHJlY2xpcD1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1CLHA9dm9pZCAwLEYoKSk6eX0sUy5wb3N0Y2xpcD1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1CLG09Zz1iPXc9bnVsbCxGKCkpOnh9LFMuY2xpcEFuZ2xlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PStCP1RwKHA9QipIKToocD1udWxsLFRoKSxGKCkpOnAqaHR9LFMuY2xpcEV4dGVudD1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1CPT1udWxsPyhtPWc9Yj13PW51bGwsa2gpOkVwKG09K0JbMF1bMF0sZz0rQlswXVsxXSxiPStCWzFdWzBdLHc9K0JbMV1bMV0pLEYoKSk6bT09bnVsbD9udWxsOltbbSxnXSxbYix3XV19LFMuc2NhbGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K0IsRSgpKTplfSxTLnRyYW5zbGF0ZT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rQlswXSxzPStCWzFdLEUoKSk6W24sc119LFMuY2VudGVyPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUJbMF0lMzYwKkgsbz1CWzFdJTM2MCpILEUoKSk6W3IqaHQsbypodF19LFMucm90YXRlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUJbMF0lMzYwKkgsYz1CWzFdJTM2MCpILGw9Qi5sZW5ndGg+Mj9CWzJdJTM2MCpIOjAsRSgpKTpbYSpodCxjKmh0LGwqaHRdfSxTLmFuZ2xlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PUIlMzYwKkgsRSgpKTp1Kmh0fSxTLnJlZmxlY3RYPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPUI/LTE6MSxFKCkpOmY8MH0sUy5yZWZsZWN0WT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1CPy0xOjEsRSgpKTpkPDB9LFMucHJlY2lzaW9uPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPU9oKF8sTT1CKkIpLEYoKSk6T2UoTSl9LFMuZml0RXh0ZW50PWZ1bmN0aW9uKEIsSSl7cmV0dXJuIFJoKFMsQixJKX0sUy5maXRTaXplPWZ1bmN0aW9uKEIsSSl7cmV0dXJuICRwKFMsQixJKX0sUy5maXRXaWR0aD1mdW5jdGlvbihCLEkpe3JldHVybiBVcChTLEIsSSl9LFMuZml0SGVpZ2h0PWZ1bmN0aW9uKEIsSSl7cmV0dXJuIFZwKFMsQixJKX07ZnVuY3Rpb24gRSgpe3ZhciBCPURoKGUsMCwwLGYsZCx1KS5hcHBseShudWxsLHQocixvKSksST1EaChlLG4tQlswXSxzLUJbMV0sZixkLHUpO3JldHVybiBoPW1oKGEsYyxsKSxfPWthKHQsSSksdj1rYShoLF8pLEE9T2goXyxNKSxGKCl9ZnVuY3Rpb24gRigpe3JldHVybiBQPXo9bnVsbCxTfXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLFMuaW52ZXJ0PXQuaW52ZXJ0JiZDLEUoKX19ZnVuY3Rpb24gWXAoaSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49T2UodCp0K2UqZSkscz1pKG4pLHI9cShzKSxvPVcocyk7cmV0dXJuW3JlKHQqcixuKm8pLERlKG4mJmUqci9uKV19fWZ1bmN0aW9uIHFhKGksdCl7cmV0dXJuW2ksb3AoY3AoKE50K3QpLzIpKV19cWEuaW52ZXJ0PWZ1bmN0aW9uKGksdCl7cmV0dXJuW2ksMipBYShycCh0KSktTnRdfTtmdW5jdGlvbiBqcCgpe3JldHVybiBRcChxYSkuc2NhbGUoOTYxL1J0KX1mdW5jdGlvbiBRcChpKXt2YXIgdD1DcihpKSxlPXQuY2VudGVyLG49dC5zY2FsZSxzPXQudHJhbnNsYXRlLHI9dC5jbGlwRXh0ZW50LG89bnVsbCxhLGMsbDt0LnNjYWxlPWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuKHUpLGgoKSk6bigpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocyh1KSxoKCkpOnMoKX0sdC5jZW50ZXI9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGUodSksaCgpKTplKCl9LHQuY2xpcEV4dGVudD1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT09bnVsbD9vPWE9Yz1sPW51bGw6KG89K3VbMF1bMF0sYT0rdVswXVsxXSxjPSt1WzFdWzBdLGw9K3VbMV1bMV0pLGgoKSk6bz09bnVsbD9udWxsOltbbyxhXSxbYyxsXV19O2Z1bmN0aW9uIGgoKXt2YXIgdT1YKm4oKSxmPXQoYmgodC5yb3RhdGUoKSkuaW52ZXJ0KFswLDBdKSk7cmV0dXJuIHIobz09bnVsbD9bW2ZbMF0tdSxmWzFdLXVdLFtmWzBdK3UsZlsxXSt1XV06aT09PXFhP1tbTWF0aC5tYXgoZlswXS11LG8pLGFdLFtNYXRoLm1pbihmWzBdK3UsYyksbF1dOltbbyxNYXRoLm1heChmWzFdLXUsYSldLFtjLE1hdGgubWluKGZbMV0rdSxsKV1dKX1yZXR1cm4gaCgpfWZ1bmN0aW9uIEhhKGksdCl7cmV0dXJuW2ksdF19SGEuaW52ZXJ0PUhhO2Z1bmN0aW9uIEtwKCl7cmV0dXJuIENyKEhhKS5zY2FsZSgxNTIuNjMpfWZ1bmN0aW9uICRoKGksdCl7dmFyIGU9Vyh0KSxuPTErVyhpKSplO3JldHVybltlKnEoaSkvbixxKHQpL25dfSRoLmludmVydD1ZcChmdW5jdGlvbihpKXtyZXR1cm4gMipBYShpKX0pO2Z1bmN0aW9uIHR5KCl7cmV0dXJuIENyKCRoKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfXZhciBCcj1NYXRoLmFicyxhaT1NYXRoLmNvcyxiZT1NYXRoLnNpbixaaT0xZS02LEZyPU1hdGguUEksV2E9RnIvMjtmdW5jdGlvbiBleShpKXtyZXR1cm4gaT9pL01hdGguc2luKGkpOjF9ZnVuY3Rpb24gR2EoaSl7cmV0dXJuIGk+MT8wOmk8LTE/RnI6TWF0aC5hY29zKGkpfWZ1bmN0aW9uIFVoKGkpe3JldHVybiBpPjA/TWF0aC5zcXJ0KGkpOjB9ZnVuY3Rpb24gVmgoaSx0KXt2YXIgZT1haSh0KSxuPWV5KEdhKGUqYWkoaS89MikpKTtyZXR1cm5bMiplKmJlKGkpKm4sYmUodCkqbl19VmguaW52ZXJ0PWZ1bmN0aW9uKGksdCl7aWYoIShpKmkrNCp0KnQ+RnIqRnIrWmkpKXt2YXIgZT1pLG49dCxzPTI1O2Rve3ZhciByPWJlKGUpLG89YmUoZS8yKSxhPWFpKGUvMiksYz1iZShuKSxsPWFpKG4pLGg9YmUoMipuKSx1PWMqYyxmPWwqbCxkPW8qbyxwPTEtZiphKmEseT1wP0dhKGwqYSkqVWgobT0xL3ApOm09MCxtLGc9Mip5Kmwqby1pLGI9eSpjLXQsdz1tKihmKmQreSpsKmEqdSkseD1tKiguNSpyKmgteSoyKmMqbyksTT1tKi4yNSooaCpvLXkqYypmKnIpLEE9bSoodSphK3kqZCpsKSxfPXgqTS1BKnc7aWYoIV8pYnJlYWs7dmFyIHY9KGIqeC1nKkEpL18sUD0oZypNLWIqdykvXztlLT12LG4tPVB9d2hpbGUoKEJyKHYpPlppfHxCcihQKT5aaSkmJi0tcz4wKTtyZXR1cm5bZSxuXX19O2Z1bmN0aW9uIHFoKGksdCl7dmFyIGU9VmgoaSx0KTtyZXR1cm5bKGVbMF0raS9XYSkvMiwoZVsxXSt0KS8yXX1xaC5pbnZlcnQ9ZnVuY3Rpb24oaSx0KXt2YXIgZT1pLG49dCxzPTI1O2Rve3ZhciByPWFpKG4pLG89YmUobiksYT1iZSgyKm4pLGM9bypvLGw9cipyLGg9YmUoZSksdT1haShlLzIpLGY9YmUoZS8yKSxkPWYqZixwPTEtbCp1KnUseT1wP0dhKHIqdSkqVWgobT0xL3ApOm09MCxtLGc9LjUqKDIqeSpyKmYrZS9XYSktaSxiPS41Kih5Km8rbiktdCx3PS41Km0qKGwqZCt5KnIqdSpjKSsuNS9XYSx4PW0qKGgqYS80LXkqbypmKSxNPS4xMjUqbSooYSpmLXkqbypsKmgpLEE9LjUqbSooYyp1K3kqZCpyKSsuNSxfPXgqTS1BKncsdj0oYip4LWcqQSkvXyxQPShnKk0tYip3KS9fO2UtPXYsbi09UH13aGlsZSgoQnIodik+Wml8fEJyKFApPlppKSYmLS1zPjApO3JldHVybltlLG5dfTtmdW5jdGlvbiBueSgpe3JldHVybiBDcihxaCkuc2NhbGUoMTU4LjgzNyl9Y29uc3QgaXk9e21lcmNhdG9yOmpwLGVxdWlyZWN0YW5ndWxhcjpLcCx3aW5rZWwzOm55fSxaYT17fSxYaT1pPT57dmFyIG4scyxyO2NvbnN0IHQ9SlNPTi5zdHJpbmdpZnkoaSk7aWYoWmFbdF0pcmV0dXJuIFphW3RdO2NvbnN0IGU9aXlbKG49aS5wcm9qZWN0aW9uVHlwZSkhPW51bGw/bjoibWVyY2F0b3IiXSgpLmNlbnRlcihpLmNlbnRlcikuc2NhbGUoaS5zY2FsZSkudHJhbnNsYXRlKChzPWkudHJhbnNsYXRlKSE9bnVsbD9zOlswLDBdKS5wcmVjaXNpb24oKHI9aS5wcmVjaXNpb24pIT1udWxsP3I6LjEpO3JldHVybiBpLnJvdGF0ZSYmZS5yb3RhdGUoaS5yb3RhdGUpLFphW3RdPWUsZX0sSXI9KGksdCk9PmkubWFwKChbZSxuXSk9PntsZXQgcztpZih0KXtjb25zdFtyLG9dPXQoW2Usbl0pO3M9bmV3IFIociwtbyl9ZWxzZSBzPW5ldyBSKGUsbik7cmV0dXJuIHN9KTt2YXIgSmk9KGksdCk9Pntjb25zdCBlPUdsKGksdCE9bnVsbD90OjApLG49e30scz1bXSxyPU9iamVjdC5rZXlzKGUuYXR0cmlidXRlcyk7cmV0dXJuIGUuaW5kZXgmJnIucHVzaCgiaW5kZXgiKSxyLmZvckVhY2gobz0+e2NvbnN0IGE9bz09PSJpbmRleCI/ZS5pbmRleDplLmF0dHJpYnV0ZXNbb107bltvXT17YXJyYXk6YS5hcnJheSxpdGVtU2l6ZTphLml0ZW1TaXplfSxzLnB1c2goYS5hcnJheS5idWZmZXIpfSksdCYmKG4uZ3JvdXBzPWUuZ3JvdXBzKSxlLmRpc3Bvc2UoKSxpLmZvckVhY2gobz0+e28uZGlzcG9zZSgpfSkse21lc3NhZ2U6bix0cmFuc2ZlcjpzfX0sWGE9KGksdD0zMDApPT57Y29uc3QgZT1bXTtyZXR1cm4gaS5mb3JFYWNoKG49PntsZXQgcz0hMTtmb3IobGV0IHI9MTtyPG4ubGVuZ3RoO3IrKylpZihNYXRoLmFicyhuW3JdLngtbltyLTFdLngpPnQpe3M9ITA7YnJlYWt9aWYocyl7Y29uc3Qgcj1bXSxvPVtdO24uZm9yRWFjaChhPT57YS54PDA/ci5wdXNoKGEpOm8ucHVzaChhKX0pLGUucHVzaChyLG8pfWVsc2UgZS5wdXNoKG4pfSksZX07ZnVuY3Rpb24gc3koaSx0LGU9MCl7Y29uc3RbbixzLHIsb109aTtsZXQgYT0xLzAsYz0xLzAsbD0tMS8wLGg9LTEvMDtmb3IobGV0IHU9MDt1PD1lO3UrKyl7Y29uc3QgZj1lJiZ1L2U7SXIoW1tuK2YqKHItbiksc10sW24rZiooci1uKSxvXSxbbixzK2YqKG8tcyldLFtyLHMrZiooby1zKV1dLHQpLmZvckVhY2goZD0+e2E9TWF0aC5taW4oYSxkLngpLGM9TWF0aC5taW4oYyxkLnkpLGw9TWF0aC5tYXgobCxkLngpLGg9TWF0aC5tYXgoaCxkLnkpfSl9cmV0dXJuW1thLGNdLFtsLGhdXX1jb25zdCByeT0oe2Nvb3JkaW5hdGVzQXJyOmksc3BsaXQ6dCxzaWRlUmVwZWF0OmUsYmJveDpuLGRlcHRoOnMscHJvamVjdGlvbjpyLHVzZUdyb3VwczpvLGhhc1RvcDphLGhhc0JvdHRvbTpjLGhhc1NpZGU6bCxzcGxpdFBvbHlnb25zOmgsdG9wU2VnbWVudHM6dX0pPT57Y29uc3QgZj1yJiZYaShyKTtsZXQgZD1pLm1hcChtPT5JcihtLGYpKTtoJiYoZD1YYShkLGgpKTtsZXQgcDtpZihuKXtjb25zdFttLGddPXN5KG4sciE9bnVsbCYmci5yb3RhdGU/WGkoWmUoRnQoe30scikse3JvdGF0ZTp2b2lkIDB9KSk6Ziwocj09bnVsbD92b2lkIDA6ci5wcm9qZWN0aW9uVHlwZSk9PT0id2lua2VsMyI/MTA6MCk7cD1uZXcgZ3QobmV3IFQobVswXSxtWzFdLDApLG5ldyBUKGdbMF0sZ1sxXSwwKSl9Y29uc3QgeT1kLm1hcCgobSxnKT0+e3ZhciBiO3JldHVybiBHMCh7cG9pbnRzOm0sc3BsaXQ6dCxzaWRlUmVwZWF0OmUsZGVwdGg6KGI9c1tnXSkhPW51bGw/YjpzWzBdLGhhc1RvcDphLGhhc0JvdHRvbTpjLGhhc1NpZGU6bCxib3gzOnAsdG9wU2VnbWVudHM6dX0pfSk7cmV0dXJuIEppKHksbyl9O2Z1bmN0aW9uIEphKGksdCxlLG4scyl7bGV0IHI7aWYoaT1pLnN1YmFycmF5fHxpLnNsaWNlP2k6aS5idWZmZXIsZT1lLnN1YmFycmF5fHxlLnNsaWNlP2U6ZS5idWZmZXIsaT10P2kuc3ViYXJyYXk/aS5zdWJhcnJheSh0LHMmJnQrcyk6aS5zbGljZSh0LHMmJnQrcyk6aSxlLnNldCllLnNldChpLG4pO2Vsc2UgZm9yKHI9MDtyPGkubGVuZ3RoO3IrKyllW3Irbl09aVtyXTtyZXR1cm4gZX1mdW5jdGlvbiBveShpKXtyZXR1cm4gaSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheT9pOmkgaW5zdGFuY2VvZiB1ZT9pLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5hcnJheTppLm1hcCh0PT57Y29uc3QgZT1BcnJheS5pc0FycmF5KHQpO3JldHVybiB0IGluc3RhbmNlb2YgVD9bdC54LHQueSx0LnpdOnQgaW5zdGFuY2VvZiBSP1t0LngsdC55LDBdOmUmJnQubGVuZ3RoPT09Mz9bdFswXSx0WzFdLHRbMl1dOmUmJnQubGVuZ3RoPT09Mj9bdFswXSx0WzFdLDBdOnR9KS5mbGF0KCl9Y2xhc3MgYXkgZXh0ZW5kcyB1ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJNZXNoTGluZSIsdGhpcy5pc01lc2hMaW5lPSEwLHRoaXMucG9zaXRpb25zPVtdLHRoaXMucHJldmlvdXM9W10sdGhpcy5uZXh0PVtdLHRoaXMuc2lkZT1bXSx0aGlzLndpZHRoPVtdLHRoaXMuaW5kaWNlc19hcnJheT1bXSx0aGlzLnV2cz1bXSx0aGlzLmNvdW50ZXJzPVtdLHRoaXMud2lkdGhDYWxsYmFjaz1udWxsLHRoaXMuX3BvaW50cz1bXSx0aGlzLm1hdHJpeFdvcmxkPW5ldyBzdCxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb2ludHM6e2VudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIHRoaXMuX3BvaW50c30sc2V0KHQpe3RoaXMuc2V0UG9pbnRzKHQsdGhpcy53aWR0aENhbGxiYWNrKX19fSl9c2V0TWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhXb3JsZD10fXNldFBvaW50cyh0LGUpe2lmKHQ9b3kodCksdGhpcy5fcG9pbnRzPXQsdGhpcy53aWR0aENhbGxiYWNrPWUhPW51bGw/ZTpudWxsLHRoaXMucG9zaXRpb25zPVtdLHRoaXMuY291bnRlcnM9W10sdC5sZW5ndGgmJnRbMF1pbnN0YW5jZW9mIFQpZm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHM9dFtuXSxyPW4vKHQubGVuZ3RoLTEpO3RoaXMucG9zaXRpb25zLnB1c2gocy54LHMueSxzLnopLHRoaXMucG9zaXRpb25zLnB1c2gocy54LHMueSxzLnopLHRoaXMuY291bnRlcnMucHVzaChyKSx0aGlzLmNvdW50ZXJzLnB1c2gocil9ZWxzZSBmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rPTMpe2NvbnN0IHM9bi8odC5sZW5ndGgtMSk7dGhpcy5wb3NpdGlvbnMucHVzaCh0W25dLHRbbisxXSx0W24rMl0pLHRoaXMucG9zaXRpb25zLnB1c2godFtuXSx0W24rMV0sdFtuKzJdKSx0aGlzLmNvdW50ZXJzLnB1c2gocyksdGhpcy5jb3VudGVycy5wdXNoKHMpfXRoaXMucHJvY2VzcygpfWNvbXBhcmVWMyh0LGUpe2NvbnN0IG49dCo2LHM9ZSo2O3JldHVybiB0aGlzLnBvc2l0aW9uc1tuXT09PXRoaXMucG9zaXRpb25zW3NdJiZ0aGlzLnBvc2l0aW9uc1tuKzFdPT09dGhpcy5wb3NpdGlvbnNbcysxXSYmdGhpcy5wb3NpdGlvbnNbbisyXT09PXRoaXMucG9zaXRpb25zW3MrMl19Y29weVYzKHQpe2NvbnN0IGU9dCo2O3JldHVyblt0aGlzLnBvc2l0aW9uc1tlXSx0aGlzLnBvc2l0aW9uc1tlKzFdLHRoaXMucG9zaXRpb25zW2UrMl1dfXByb2Nlc3MoKXtjb25zdCB0PXRoaXMucG9zaXRpb25zLmxlbmd0aC82O3RoaXMucHJldmlvdXM9W10sdGhpcy5uZXh0PVtdLHRoaXMuc2lkZT1bXSx0aGlzLndpZHRoPVtdLHRoaXMuaW5kaWNlc19hcnJheT1bXSx0aGlzLnV2cz1bXTtsZXQgZSxuO3RoaXMuY29tcGFyZVYzKDAsdC0xKT9uPXRoaXMuY29weVYzKHQtMik6bj10aGlzLmNvcHlWMygwKSx0aGlzLnByZXZpb3VzLnB1c2goblswXSxuWzFdLG5bMl0pLHRoaXMucHJldmlvdXMucHVzaChuWzBdLG5bMV0sblsyXSk7Zm9yKGxldCBzPTA7czx0O3MrKyl7aWYodGhpcy5zaWRlLnB1c2goMSksdGhpcy5zaWRlLnB1c2goLTEpLHRoaXMud2lkdGhDYWxsYmFjaz9lPXRoaXMud2lkdGhDYWxsYmFjayhzLyh0LTEpKTplPTEsdGhpcy53aWR0aC5wdXNoKGUpLHRoaXMud2lkdGgucHVzaChlKSx0aGlzLnV2cy5wdXNoKHMvKHQtMSksMCksdGhpcy51dnMucHVzaChzLyh0LTEpLDEpLHM8dC0xKXtuPXRoaXMuY29weVYzKHMpLHRoaXMucHJldmlvdXMucHVzaChuWzBdLG5bMV0sblsyXSksdGhpcy5wcmV2aW91cy5wdXNoKG5bMF0sblsxXSxuWzJdKTtjb25zdCByPXMqMjt0aGlzLmluZGljZXNfYXJyYXkucHVzaChyLHIrMSxyKzIpLHRoaXMuaW5kaWNlc19hcnJheS5wdXNoKHIrMixyKzEsciszKX1zPjAmJihuPXRoaXMuY29weVYzKHMpLHRoaXMubmV4dC5wdXNoKG5bMF0sblsxXSxuWzJdKSx0aGlzLm5leHQucHVzaChuWzBdLG5bMV0sblsyXSkpfXRoaXMuY29tcGFyZVYzKHQtMSwwKT9uPXRoaXMuY29weVYzKDEpOm49dGhpcy5jb3B5VjModC0xKSx0aGlzLm5leHQucHVzaChuWzBdLG5bMV0sblsyXSksdGhpcy5uZXh0LnB1c2goblswXSxuWzFdLG5bMl0pLCF0aGlzLl9hdHRyaWJ1dGVzfHx0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50IT09dGhpcy5jb3VudGVycy5sZW5ndGg/dGhpcy5fYXR0cmlidXRlcz17cG9zaXRpb246bmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb3NpdGlvbnMpLDMpLHByZXZpb3VzOm5ldyB4dChuZXcgRmxvYXQzMkFycmF5KHRoaXMucHJldmlvdXMpLDMpLG5leHQ6bmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5uZXh0KSwzKSxzaWRlOm5ldyB4dChuZXcgRmxvYXQzMkFycmF5KHRoaXMuc2lkZSksMSksd2lkdGg6bmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy53aWR0aCksMSksdXY6bmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy51dnMpLDIpLGluZGV4Om5ldyB4dChuZXcgVWludDE2QXJyYXkodGhpcy5pbmRpY2VzX2FycmF5KSwxKSxjb3VudGVyczpuZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLmNvdW50ZXJzKSwxKX06KHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24uY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wb3NpdGlvbnMpKSx0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMuY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wcmV2aW91cykpLHRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5uZXh0LmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMubmV4dCkpLHRoaXMuX2F0dHJpYnV0ZXMubmV4dC5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLnNpZGUuY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5zaWRlKSksdGhpcy5fYXR0cmlidXRlcy5zaWRlLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMud2lkdGguY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy53aWR0aCkpLHRoaXMuX2F0dHJpYnV0ZXMud2lkdGgubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy51di5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLnV2cykpLHRoaXMuX2F0dHJpYnV0ZXMudXYubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5pbmRleC5jb3B5QXJyYXkobmV3IFVpbnQxNkFycmF5KHRoaXMuaW5kaWNlc19hcnJheSkpLHRoaXMuX2F0dHJpYnV0ZXMuaW5kZXgubmVlZHNVcGRhdGU9ITApLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsdGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbiksdGhpcy5zZXRBdHRyaWJ1dGUoInByZXZpb3VzIix0aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzKSx0aGlzLnNldEF0dHJpYnV0ZSgibmV4dCIsdGhpcy5fYXR0cmlidXRlcy5uZXh0KSx0aGlzLnNldEF0dHJpYnV0ZSgic2lkZSIsdGhpcy5fYXR0cmlidXRlcy5zaWRlKSx0aGlzLnNldEF0dHJpYnV0ZSgid2lkdGgiLHRoaXMuX2F0dHJpYnV0ZXMud2lkdGgpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsdGhpcy5fYXR0cmlidXRlcy51diksdGhpcy5zZXRBdHRyaWJ1dGUoImNvdW50ZXJzIix0aGlzLl9hdHRyaWJ1dGVzLmNvdW50ZXJzKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24pLHRoaXMuc2V0QXR0cmlidXRlKCJwcmV2aW91cyIsdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5leHQiLHRoaXMuX2F0dHJpYnV0ZXMubmV4dCksdGhpcy5zZXRBdHRyaWJ1dGUoInNpZGUiLHRoaXMuX2F0dHJpYnV0ZXMuc2lkZSksdGhpcy5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLl9hdHRyaWJ1dGVzLndpZHRoKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLHRoaXMuX2F0dHJpYnV0ZXMudXYpLHRoaXMuc2V0QXR0cmlidXRlKCJjb3VudGVycyIsdGhpcy5fYXR0cmlidXRlcy5jb3VudGVycyksdGhpcy5zZXRJbmRleCh0aGlzLl9hdHRyaWJ1dGVzLmluZGV4KSx0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCl9YWR2YW5jZSh7eDp0LHk6ZSx6Om59KXtjb25zdCBzPXRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXkscj10aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzLmFycmF5LG89dGhpcy5fYXR0cmlidXRlcy5uZXh0LmFycmF5LGE9cy5sZW5ndGg7SmEocywwLHIsMCxhKSxKYShzLDYscywwLGEtNiksc1thLTZdPXQsc1thLTVdPWUsc1thLTRdPW4sc1thLTNdPXQsc1thLTJdPWUsc1thLTFdPW4sSmEocyw2LG8sMCxhLTYpLG9bYS02XT10LG9bYS01XT1lLG9bYS00XT1uLG9bYS0zXT10LG9bYS0yXT1lLG9bYS0xXT1uLHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24ubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cy5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLm5leHQubmVlZHNVcGRhdGU9ITB9fXZhciBIaD1pPT57Y29uc3R7c2V0UG9pbnRXaWR0aDp0LG5vZGVzOmV9PWksbj1uZXcgYXk7cmV0dXJuIG4uc2V0UG9pbnRzKGUsdCksbn07Y29uc3QgY3k9KHtjb29yZGluYXRlc0FycjppLHByb2plY3Rpb246dCxsaW5lV2lkdGg6ZSx1c2VHcm91cHM6bixzcGxpdFBvbHlnb25zOnN9KT0+e2NvbnN0IHI9dCYmWGkodCk7bGV0IG89aS5tYXAoYz0+SXIoYyxyKSk7cyYmKG89WGEobyxzKSk7Y29uc3QgYT1vLm1hcCgoYyxsKT0+e3ZhciB1O2NvbnN0IGg9KHU9ZVtsXSkhPW51bGw/dTplWzBdO3JldHVybiBIaCh7bm9kZXM6YyxzZXRQb2ludFdpZHRoOigpPT5ofSl9KTtyZXR1cm4gSmkoYSxuKX07dmFyIGx5PWk9Pntjb25zdHtwb2ludHM6dH09aSxlPXQucmVkdWNlKChzLHIsbyk9PihvPHQubGVuZ3RoLTEmJnMucHVzaChyLHRbbysxXSkscyksW10pO3JldHVybiBuZXcgdWUoKS5zZXRGcm9tUG9pbnRzKGUpfTtjb25zdCBoeT0oe2Nvb3JkaW5hdGVzQXJyOmkscHJvamVjdGlvbjp0LGxpbmVXaWR0aDplLHVzZUdyb3VwczpuLHNwbGl0UG9seWdvbnM6c30pPT57Y29uc3Qgcj10JiZYaSh0KTtsZXQgbz1pLm1hcChjPT5JcihjLHIpKTtzJiYobz1YYShvLHMpKTtjb25zdCBhPW8ubWFwKChjLGwpPT5seSh7cG9pbnRzOmMubWFwKGg9Pm5ldyBUKGgueCxoLnksMCkpfSkpO3JldHVybiBKaShhLG4pfTtmdW5jdGlvbiB1eShpLHQsZT0yKXtjb25zdCBuPXQmJnQubGVuZ3RoLHM9bj90WzBdKmU6aS5sZW5ndGg7bGV0IHI9V2goaSwwLHMsZSwhMCk7Y29uc3Qgbz1bXTtpZighcnx8ci5uZXh0PT09ci5wcmV2KXJldHVybiBvO2xldCBhLGMsbDtpZihuJiYocj1teShpLHQscixlKSksaS5sZW5ndGg+ODAqZSl7YT0xLzAsYz0xLzA7bGV0IGg9LTEvMCx1PS0xLzA7Zm9yKGxldCBmPWU7ZjxzO2YrPWUpe2NvbnN0IGQ9aVtmXSxwPWlbZisxXTtkPGEmJihhPWQpLHA8YyYmKGM9cCksZD5oJiYoaD1kKSxwPnUmJih1PXApfWw9TWF0aC5tYXgoaC1hLHUtYyksbD1sIT09MD8zMjc2Ny9sOjB9cmV0dXJuIFlpKHIsbyxlLGEsYyxsLDApLG99ZnVuY3Rpb24gV2goaSx0LGUsbixzKXtsZXQgcjtpZihzPT09VHkoaSx0LGUsbik+MClmb3IobGV0IG89dDtvPGU7bys9bilyPVhoKG8vbnwwLGlbb10saVtvKzFdLHIpO2Vsc2UgZm9yKGxldCBvPWUtbjtvPj10O28tPW4pcj1YaChvL258MCxpW29dLGlbbysxXSxyKTtyZXR1cm4gciYma3IocixyLm5leHQpJiYoUWkocikscj1yLm5leHQpLHJ9ZnVuY3Rpb24gU24oaSx0KXtpZighaSlyZXR1cm4gaTt0fHwodD1pKTtsZXQgZT1pLG47ZG8gaWYobj0hMSwhZS5zdGVpbmVyJiYoa3IoZSxlLm5leHQpfHxhdChlLnByZXYsZSxlLm5leHQpPT09MCkpe2lmKFFpKGUpLGU9dD1lLnByZXYsZT09PWUubmV4dClicmVhaztuPSEwfWVsc2UgZT1lLm5leHQ7d2hpbGUobnx8ZSE9PXQpO3JldHVybiB0fWZ1bmN0aW9uIFlpKGksdCxlLG4scyxyLG8pe2lmKCFpKXJldHVybjshbyYmciYmTXkoaSxuLHMscik7bGV0IGE9aTtmb3IoO2kucHJldiE9PWkubmV4dDspe2NvbnN0IGM9aS5wcmV2LGw9aS5uZXh0O2lmKHI/ZHkoaSxuLHMscik6ZnkoaSkpe3QucHVzaChjLmksaS5pLGwuaSksUWkoaSksaT1sLm5leHQsYT1sLm5leHQ7Y29udGludWV9aWYoaT1sLGk9PT1hKXtvP289PT0xPyhpPXB5KFNuKGkpLHQpLFlpKGksdCxlLG4scyxyLDIpKTpvPT09MiYmeXkoaSx0LGUsbixzLHIpOllpKFNuKGkpLHQsZSxuLHMsciwxKTticmVha319fWZ1bmN0aW9uIGZ5KGkpe2NvbnN0IHQ9aS5wcmV2LGU9aSxuPWkubmV4dDtpZihhdCh0LGUsbik+PTApcmV0dXJuITE7Y29uc3Qgcz10Lngscj1lLngsbz1uLngsYT10LnksYz1lLnksbD1uLnksaD1zPHI/czxvP3M6bzpyPG8/cjpvLHU9YTxjP2E8bD9hOmw6YzxsP2M6bCxmPXM+cj9zPm8/czpvOnI+bz9yOm8sZD1hPmM/YT5sP2E6bDpjPmw/YzpsO2xldCBwPW4ubmV4dDtmb3IoO3AhPT10Oyl7aWYocC54Pj1oJiZwLng8PWYmJnAueT49dSYmcC55PD1kJiZjaShzLGEscixjLG8sbCxwLngscC55KSYmYXQocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBkeShpLHQsZSxuKXtjb25zdCBzPWkucHJldixyPWksbz1pLm5leHQ7aWYoYXQocyxyLG8pPj0wKXJldHVybiExO2NvbnN0IGE9cy54LGM9ci54LGw9by54LGg9cy55LHU9ci55LGY9by55LGQ9YTxjP2E8bD9hOmw6YzxsP2M6bCxwPWg8dT9oPGY/aDpmOnU8Zj91OmYseT1hPmM/YT5sP2E6bDpjPmw/YzpsLG09aD51P2g+Zj9oOmY6dT5mP3U6ZixnPVlhKGQscCx0LGUsbiksYj1ZYSh5LG0sdCxlLG4pO2xldCB3PWkucHJldloseD1pLm5leHRaO2Zvcig7dyYmdy56Pj1nJiZ4JiZ4Lno8PWI7KXtpZih3Lng+PWQmJncueDw9eSYmdy55Pj1wJiZ3Lnk8PW0mJnchPT1zJiZ3IT09byYmY2koYSxoLGMsdSxsLGYsdy54LHcueSkmJmF0KHcucHJldix3LHcubmV4dCk+PTB8fCh3PXcucHJldloseC54Pj1kJiZ4Lng8PXkmJngueT49cCYmeC55PD1tJiZ4IT09cyYmeCE9PW8mJmNpKGEsaCxjLHUsbCxmLHgueCx4LnkpJiZhdCh4LnByZXYseCx4Lm5leHQpPj0wKSlyZXR1cm4hMTt4PXgubmV4dFp9Zm9yKDt3JiZ3Lno+PWc7KXtpZih3Lng+PWQmJncueDw9eSYmdy55Pj1wJiZ3Lnk8PW0mJnchPT1zJiZ3IT09byYmY2koYSxoLGMsdSxsLGYsdy54LHcueSkmJmF0KHcucHJldix3LHcubmV4dCk+PTApcmV0dXJuITE7dz13LnByZXZafWZvcig7eCYmeC56PD1iOyl7aWYoeC54Pj1kJiZ4Lng8PXkmJngueT49cCYmeC55PD1tJiZ4IT09cyYmeCE9PW8mJmNpKGEsaCxjLHUsbCxmLHgueCx4LnkpJiZhdCh4LnByZXYseCx4Lm5leHQpPj0wKXJldHVybiExO3g9eC5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiBweShpLHQpe2xldCBlPWk7ZG97Y29uc3Qgbj1lLnByZXYscz1lLm5leHQubmV4dDsha3IobixzKSYmR2gobixlLGUubmV4dCxzKSYmamkobixzKSYmamkocyxuKSYmKHQucHVzaChuLmksZS5pLHMuaSksUWkoZSksUWkoZS5uZXh0KSxlPWk9cyksZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiBTbihlKX1mdW5jdGlvbiB5eShpLHQsZSxuLHMscil7bGV0IG89aTtkb3tsZXQgYT1vLm5leHQubmV4dDtmb3IoO2EhPT1vLnByZXY7KXtpZihvLmkhPT1hLmkmJnZ5KG8sYSkpe2xldCBjPVpoKG8sYSk7bz1TbihvLG8ubmV4dCksYz1TbihjLGMubmV4dCksWWkobyx0LGUsbixzLHIsMCksWWkoYyx0LGUsbixzLHIsMCk7cmV0dXJufWE9YS5uZXh0fW89by5uZXh0fXdoaWxlKG8hPT1pKX1mdW5jdGlvbiBteShpLHQsZSxuKXtjb25zdCBzPVtdO2ZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT10W3JdKm4sYz1yPG8tMT90W3IrMV0qbjppLmxlbmd0aCxsPVdoKGksYSxjLG4sITEpO2w9PT1sLm5leHQmJihsLnN0ZWluZXI9ITApLHMucHVzaChfeShsKSl9cy5zb3J0KGd5KTtmb3IobGV0IHI9MDtyPHMubGVuZ3RoO3IrKyllPXh5KHNbcl0sZSk7cmV0dXJuIGV9ZnVuY3Rpb24gZ3koaSx0KXtyZXR1cm4gaS54LXQueH1mdW5jdGlvbiB4eShpLHQpe2NvbnN0IGU9d3koaSx0KTtpZighZSlyZXR1cm4gdDtjb25zdCBuPVpoKGUsaSk7cmV0dXJuIFNuKG4sbi5uZXh0KSxTbihlLGUubmV4dCl9ZnVuY3Rpb24gd3koaSx0KXtsZXQgZT10O2NvbnN0IG49aS54LHM9aS55O2xldCByPS0xLzAsbztkb3tpZihzPD1lLnkmJnM+PWUubmV4dC55JiZlLm5leHQueSE9PWUueSl7Y29uc3QgdT1lLngrKHMtZS55KSooZS5uZXh0LngtZS54KS8oZS5uZXh0LnktZS55KTtpZih1PD1uJiZ1PnImJihyPXUsbz1lLng8ZS5uZXh0Lng/ZTplLm5leHQsdT09PW4pKXJldHVybiBvfWU9ZS5uZXh0fXdoaWxlKGUhPT10KTtpZighbylyZXR1cm4gbnVsbDtjb25zdCBhPW8sYz1vLngsbD1vLnk7bGV0IGg9MS8wO2U9bztkb3tpZihuPj1lLngmJmUueD49YyYmbiE9PWUueCYmY2koczxsP246cixzLGMsbCxzPGw/cjpuLHMsZS54LGUueSkpe2NvbnN0IHU9TWF0aC5hYnMocy1lLnkpLyhuLWUueCk7amkoZSxpKSYmKHU8aHx8dT09PWgmJihlLng+by54fHxlLng9PT1vLngmJmJ5KG8sZSkpKSYmKG89ZSxoPXUpfWU9ZS5uZXh0fXdoaWxlKGUhPT1hKTtyZXR1cm4gb31mdW5jdGlvbiBieShpLHQpe3JldHVybiBhdChpLnByZXYsaSx0LnByZXYpPDAmJmF0KHQubmV4dCxpLGkubmV4dCk8MH1mdW5jdGlvbiBNeShpLHQsZSxuKXtsZXQgcz1pO2RvIHMuej09PTAmJihzLno9WWEocy54LHMueSx0LGUsbikpLHMucHJldlo9cy5wcmV2LHMubmV4dFo9cy5uZXh0LHM9cy5uZXh0O3doaWxlKHMhPT1pKTtzLnByZXZaLm5leHRaPW51bGwscy5wcmV2Wj1udWxsLEF5KHMpfWZ1bmN0aW9uIEF5KGkpe2xldCB0LGU9MTtkb3tsZXQgbj1pLHM7aT1udWxsO2xldCByPW51bGw7Zm9yKHQ9MDtuOyl7dCsrO2xldCBvPW4sYT0wO2ZvcihsZXQgbD0wO2w8ZSYmKGErKyxvPW8ubmV4dFosISFvKTtsKyspO2xldCBjPWU7Zm9yKDthPjB8fGM+MCYmbzspYSE9PTAmJihjPT09MHx8IW98fG4uejw9by56KT8ocz1uLG49bi5uZXh0WixhLS0pOihzPW8sbz1vLm5leHRaLGMtLSkscj9yLm5leHRaPXM6aT1zLHMucHJldlo9cixyPXM7bj1vfXIubmV4dFo9bnVsbCxlKj0yfXdoaWxlKHQ+MSk7cmV0dXJuIGl9ZnVuY3Rpb24gWWEoaSx0LGUsbixzKXtyZXR1cm4gaT0oaS1lKSpzfDAsdD0odC1uKSpzfDAsaT0oaXxpPDw4KSYxNjcxMTkzNSxpPShpfGk8PDQpJjI1MjY0NTEzNSxpPShpfGk8PDIpJjg1ODk5MzQ1OSxpPShpfGk8PDEpJjE0MzE2NTU3NjUsdD0odHx0PDw4KSYxNjcxMTkzNSx0PSh0fHQ8PDQpJjI1MjY0NTEzNSx0PSh0fHQ8PDIpJjg1ODk5MzQ1OSx0PSh0fHQ8PDEpJjE0MzE2NTU3NjUsaXx0PDwxfWZ1bmN0aW9uIF95KGkpe2xldCB0PWksZT1pO2RvKHQueDxlLnh8fHQueD09PWUueCYmdC55PGUueSkmJihlPXQpLHQ9dC5uZXh0O3doaWxlKHQhPT1pKTtyZXR1cm4gZX1mdW5jdGlvbiBjaShpLHQsZSxuLHMscixvLGEpe3JldHVybihzLW8pKih0LWEpPj0oaS1vKSooci1hKSYmKGktbykqKG4tYSk+PShlLW8pKih0LWEpJiYoZS1vKSooci1hKT49KHMtbykqKG4tYSl9ZnVuY3Rpb24gdnkoaSx0KXtyZXR1cm4gaS5uZXh0LmkhPT10LmkmJmkucHJldi5pIT09dC5pJiYhU3koaSx0KSYmKGppKGksdCkmJmppKHQsaSkmJnp5KGksdCkmJihhdChpLnByZXYsaSx0LnByZXYpfHxhdChpLHQucHJldix0KSl8fGtyKGksdCkmJmF0KGkucHJldixpLGkubmV4dCk+MCYmYXQodC5wcmV2LHQsdC5uZXh0KT4wKX1mdW5jdGlvbiBhdChpLHQsZSl7cmV0dXJuKHQueS1pLnkpKihlLngtdC54KS0odC54LWkueCkqKGUueS10LnkpfWZ1bmN0aW9uIGtyKGksdCl7cmV0dXJuIGkueD09PXQueCYmaS55PT09dC55fWZ1bmN0aW9uIEdoKGksdCxlLG4pe2NvbnN0IHM9UnIoYXQoaSx0LGUpKSxyPVJyKGF0KGksdCxuKSksbz1ScihhdChlLG4saSkpLGE9UnIoYXQoZSxuLHQpKTtyZXR1cm4hIShzIT09ciYmbyE9PWF8fHM9PT0wJiZOcihpLGUsdCl8fHI9PT0wJiZOcihpLG4sdCl8fG89PT0wJiZOcihlLGksbil8fGE9PT0wJiZOcihlLHQsbikpfWZ1bmN0aW9uIE5yKGksdCxlKXtyZXR1cm4gdC54PD1NYXRoLm1heChpLngsZS54KSYmdC54Pj1NYXRoLm1pbihpLngsZS54KSYmdC55PD1NYXRoLm1heChpLnksZS55KSYmdC55Pj1NYXRoLm1pbihpLnksZS55KX1mdW5jdGlvbiBScihpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9ZnVuY3Rpb24gU3koaSx0KXtsZXQgZT1pO2Rve2lmKGUuaSE9PWkuaSYmZS5uZXh0LmkhPT1pLmkmJmUuaSE9PXQuaSYmZS5uZXh0LmkhPT10LmkmJkdoKGUsZS5uZXh0LGksdCkpcmV0dXJuITA7ZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiExfWZ1bmN0aW9uIGppKGksdCl7cmV0dXJuIGF0KGkucHJldixpLGkubmV4dCk8MD9hdChpLHQsaS5uZXh0KT49MCYmYXQoaSxpLnByZXYsdCk+PTA6YXQoaSx0LGkucHJldik8MHx8YXQoaSxpLm5leHQsdCk8MH1mdW5jdGlvbiB6eShpLHQpe2xldCBlPWksbj0hMTtjb25zdCBzPShpLngrdC54KS8yLHI9KGkueSt0LnkpLzI7ZG8gZS55PnIhPWUubmV4dC55PnImJmUubmV4dC55IT09ZS55JiZzPChlLm5leHQueC1lLngpKihyLWUueSkvKGUubmV4dC55LWUueSkrZS54JiYobj0hbiksZT1lLm5leHQ7d2hpbGUoZSE9PWkpO3JldHVybiBufWZ1bmN0aW9uIFpoKGksdCl7Y29uc3QgZT1qYShpLmksaS54LGkueSksbj1qYSh0LmksdC54LHQueSkscz1pLm5leHQscj10LnByZXY7cmV0dXJuIGkubmV4dD10LHQucHJldj1pLGUubmV4dD1zLHMucHJldj1lLG4ubmV4dD1lLGUucHJldj1uLHIubmV4dD1uLG4ucHJldj1yLG59ZnVuY3Rpb24gWGgoaSx0LGUsbil7Y29uc3Qgcz1qYShpLHQsZSk7cmV0dXJuIG4/KHMubmV4dD1uLm5leHQscy5wcmV2PW4sbi5uZXh0LnByZXY9cyxuLm5leHQ9cyk6KHMucHJldj1zLHMubmV4dD1zKSxzfWZ1bmN0aW9uIFFpKGkpe2kubmV4dC5wcmV2PWkucHJldixpLnByZXYubmV4dD1pLm5leHQsaS5wcmV2WiYmKGkucHJldloubmV4dFo9aS5uZXh0WiksaS5uZXh0WiYmKGkubmV4dFoucHJldlo9aS5wcmV2Wil9ZnVuY3Rpb24gamEoaSx0LGUpe3JldHVybntpLHg6dCx5OmUscHJldjpudWxsLG5leHQ6bnVsbCx6OjAscHJldlo6bnVsbCxuZXh0WjpudWxsLHN0ZWluZXI6ITF9fWZ1bmN0aW9uIFR5KGksdCxlLG4pe2xldCBzPTA7Zm9yKGxldCByPXQsbz1lLW47cjxlO3IrPW4pcys9KGlbb10taVtyXSkqKGlbcisxXStpW28rMV0pLG89cjtyZXR1cm4gc31mdW5jdGlvbiBKaChpKXtjb25zdCB0PVtdLGU9W10sbj1pWzBdWzBdLmxlbmd0aDtsZXQgcz0wLHI9MDtmb3IoY29uc3QgbyBvZiBpKXtmb3IoY29uc3QgYSBvZiBvKWZvcihsZXQgYz0wO2M8bjtjKyspdC5wdXNoKGFbY10pO3ImJihzKz1yLGUucHVzaChzKSkscj1vLmxlbmd0aH1yZXR1cm57dmVydGljZXM6dCxob2xlczplLGRpbWVuc2lvbnM6bn19ZnVuY3Rpb24gUHkoaSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJjb29yZCBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KGkpKXtpZihpLnR5cGU9PT0iRmVhdHVyZSImJmkuZ2VvbWV0cnkhPT1udWxsJiZpLmdlb21ldHJ5LnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5pLmdlb21ldHJ5LmNvb3JkaW5hdGVzXTtpZihpLnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5pLmNvb3JkaW5hdGVzXX1pZihBcnJheS5pc0FycmF5KGkpJiZpLmxlbmd0aD49MiYmIUFycmF5LmlzQXJyYXkoaVswXSkmJiFBcnJheS5pc0FycmF5KGlbMV0pKXJldHVyblsuLi5pXTt0aHJvdyBuZXcgRXJyb3IoImNvb3JkIG11c3QgYmUgR2VvSlNPTiBQb2ludCBvciBhbiBBcnJheSBvZiBudW1iZXJzIil9ZnVuY3Rpb24gRXkoaSl7aWYoQXJyYXkuaXNBcnJheShpKSlyZXR1cm4gaTtpZihpLnR5cGU9PT0iRmVhdHVyZSIpe2lmKGkuZ2VvbWV0cnkhPT1udWxsKXJldHVybiBpLmdlb21ldHJ5LmNvb3JkaW5hdGVzfWVsc2UgaWYoaS5jb29yZGluYXRlcylyZXR1cm4gaS5jb29yZGluYXRlczt0aHJvdyBuZXcgRXJyb3IoImNvb3JkcyBtdXN0IGJlIEdlb0pTT04gRmVhdHVyZSwgR2VvbWV0cnkgT2JqZWN0IG9yIGFuIEFycmF5Iil9ZnVuY3Rpb24gQ3koaSl7cmV0dXJuIGkudHlwZT09PSJGZWF0dXJlIj9pLmdlb21ldHJ5Oml9ZnVuY3Rpb24gQnkoaSl7Y29uc3QgdD1FeShpKTtsZXQgZT0wLG49MSxzLHI7Zm9yKDtuPHQubGVuZ3RoOylzPXJ8fHRbMF0scj10W25dLGUrPShyWzBdLXNbMF0pKihyWzFdK3NbMV0pLG4rKztyZXR1cm4gZT4wfXZhciBGeT1CeTtjb25zdCBxZT0xMTEwMjIzMDI0NjI1MTU2NWUtMzIsU3Q9MTM0MjE3NzI5LEl5PSgzKzgqcWUpKnFlO2Z1bmN0aW9uIFFhKGksdCxlLG4scyl7bGV0IHIsbyxhLGMsbD10WzBdLGg9blswXSx1PTAsZj0wO2g+bD09aD4tbD8ocj1sLGw9dFsrK3VdKToocj1oLGg9blsrK2ZdKTtsZXQgZD0wO2lmKHU8aSYmZjxlKWZvcihoPmw9PWg+LWw/KG89bCtyLGE9ci0oby1sKSxsPXRbKyt1XSk6KG89aCtyLGE9ci0oby1oKSxoPW5bKytmXSkscj1vLGEhPT0wJiYoc1tkKytdPWEpO3U8aSYmZjxlOyloPmw9PWg+LWw/KG89citsLGM9by1yLGE9ci0oby1jKSsobC1jKSxsPXRbKyt1XSk6KG89citoLGM9by1yLGE9ci0oby1jKSsoaC1jKSxoPW5bKytmXSkscj1vLGEhPT0wJiYoc1tkKytdPWEpO2Zvcig7dTxpOylvPXIrbCxjPW8tcixhPXItKG8tYykrKGwtYyksbD10WysrdV0scj1vLGEhPT0wJiYoc1tkKytdPWEpO2Zvcig7ZjxlOylvPXIraCxjPW8tcixhPXItKG8tYykrKGgtYyksaD1uWysrZl0scj1vLGEhPT0wJiYoc1tkKytdPWEpO3JldHVybihyIT09MHx8ZD09PTApJiYoc1tkKytdPXIpLGR9ZnVuY3Rpb24ga3koaSx0KXtsZXQgZT10WzBdO2ZvcihsZXQgbj0xO248aTtuKyspZSs9dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBLaShpKXtyZXR1cm4gbmV3IEZsb2F0NjRBcnJheShpKX1jb25zdCBOeT0oMysxNipxZSkqcWUsUnk9KDIrMTIqcWUpKnFlLEx5PSg5KzY0KnFlKSpxZSpxZSxsaT1LaSg0KSxZaD1LaSg4KSxqaD1LaSgxMiksUWg9S2koMTYpLEJ0PUtpKDQpO2Z1bmN0aW9uIE95KGksdCxlLG4scyxyLG8pe2xldCBhLGMsbCxoLHUsZixkLHAseSxtLGcsYix3LHgsTSxBLF8sdjtjb25zdCBQPWktcyx6PWUtcyxTPXQtcixDPW4tcjt4PVAqQyxmPVN0KlAsZD1mLShmLVApLHA9UC1kLGY9U3QqQyx5PWYtKGYtQyksbT1DLXksTT1wKm0tKHgtZCp5LXAqeS1kKm0pLEE9Uyp6LGY9U3QqUyxkPWYtKGYtUykscD1TLWQsZj1TdCp6LHk9Zi0oZi16KSxtPXoteSxfPXAqbS0oQS1kKnktcCp5LWQqbSksZz1NLV8sdT1NLWcsbGlbMF09TS0oZyt1KSsodS1fKSxiPXgrZyx1PWIteCx3PXgtKGItdSkrKGctdSksZz13LUEsdT13LWcsbGlbMV09dy0oZyt1KSsodS1BKSx2PWIrZyx1PXYtYixsaVsyXT1iLSh2LXUpKyhnLXUpLGxpWzNdPXY7bGV0IEU9a3koNCxsaSksRj1SeSpvO2lmKEU+PUZ8fC1FPj1GfHwodT1pLVAsYT1pLShQK3UpKyh1LXMpLHU9ZS16LGw9ZS0oeit1KSsodS1zKSx1PXQtUyxjPXQtKFMrdSkrKHUtciksdT1uLUMsaD1uLShDK3UpKyh1LXIpLGE9PT0wJiZjPT09MCYmbD09PTAmJmg9PT0wKXx8KEY9THkqbytJeSpNYXRoLmFicyhFKSxFKz1QKmgrQyphLShTKmwreipjKSxFPj1GfHwtRT49RikpcmV0dXJuIEU7eD1hKkMsZj1TdCphLGQ9Zi0oZi1hKSxwPWEtZCxmPVN0KkMseT1mLShmLUMpLG09Qy15LE09cCptLSh4LWQqeS1wKnktZCptKSxBPWMqeixmPVN0KmMsZD1mLShmLWMpLHA9Yy1kLGY9U3Qqeix5PWYtKGYteiksbT16LXksXz1wKm0tKEEtZCp5LXAqeS1kKm0pLGc9TS1fLHU9TS1nLEJ0WzBdPU0tKGcrdSkrKHUtXyksYj14K2csdT1iLXgsdz14LShiLXUpKyhnLXUpLGc9dy1BLHU9dy1nLEJ0WzFdPXctKGcrdSkrKHUtQSksdj1iK2csdT12LWIsQnRbMl09Yi0odi11KSsoZy11KSxCdFszXT12O2NvbnN0IEI9UWEoNCxsaSw0LEJ0LFloKTt4PVAqaCxmPVN0KlAsZD1mLShmLVApLHA9UC1kLGY9U3QqaCx5PWYtKGYtaCksbT1oLXksTT1wKm0tKHgtZCp5LXAqeS1kKm0pLEE9UypsLGY9U3QqUyxkPWYtKGYtUykscD1TLWQsZj1TdCpsLHk9Zi0oZi1sKSxtPWwteSxfPXAqbS0oQS1kKnktcCp5LWQqbSksZz1NLV8sdT1NLWcsQnRbMF09TS0oZyt1KSsodS1fKSxiPXgrZyx1PWIteCx3PXgtKGItdSkrKGctdSksZz13LUEsdT13LWcsQnRbMV09dy0oZyt1KSsodS1BKSx2PWIrZyx1PXYtYixCdFsyXT1iLSh2LXUpKyhnLXUpLEJ0WzNdPXY7Y29uc3QgST1RYShCLFloLDQsQnQsamgpO3g9YSpoLGY9U3QqYSxkPWYtKGYtYSkscD1hLWQsZj1TdCpoLHk9Zi0oZi1oKSxtPWgteSxNPXAqbS0oeC1kKnktcCp5LWQqbSksQT1jKmwsZj1TdCpjLGQ9Zi0oZi1jKSxwPWMtZCxmPVN0KmwseT1mLShmLWwpLG09bC15LF89cCptLShBLWQqeS1wKnktZCptKSxnPU0tXyx1PU0tZyxCdFswXT1NLShnK3UpKyh1LV8pLGI9eCtnLHU9Yi14LHc9eC0oYi11KSsoZy11KSxnPXctQSx1PXctZyxCdFsxXT13LShnK3UpKyh1LUEpLHY9YitnLHU9di1iLEJ0WzJdPWItKHYtdSkrKGctdSksQnRbM109djtjb25zdCBrPVFhKEksamgsNCxCdCxRaCk7cmV0dXJuIFFoW2stMV19ZnVuY3Rpb24gTHIoaSx0LGUsbixzLHIpe2NvbnN0IG89KHQtcikqKGUtcyksYT0oaS1zKSoobi1yKSxjPW8tYTtpZihvPT09MHx8YT09PTB8fG8+MCE9YT4wKXJldHVybiBjO2NvbnN0IGw9TWF0aC5hYnMobythKTtyZXR1cm4gTWF0aC5hYnMoYyk+PU55Kmw/YzotT3koaSx0LGUsbixzLHIsbCl9Y29uc3QgS2g9TWF0aC5wb3coMiwtNTIpLE9yPW5ldyBVaW50MzJBcnJheSg1MTIpO2NsYXNzIHRze3N0YXRpYyBmcm9tKHQsZT1xeSxuPUh5KXtjb25zdCBzPXQubGVuZ3RoLHI9bmV3IEZsb2F0NjRBcnJheShzKjIpO2ZvcihsZXQgbz0wO288cztvKyspe2NvbnN0IGE9dFtvXTtyWzIqb109ZShhKSxyWzIqbysxXT1uKGEpfXJldHVybiBuZXcgdHMocil9Y29uc3RydWN0b3IodCl7Y29uc3QgZT10Lmxlbmd0aD4+MTtpZihlPjAmJnR5cGVvZiB0WzBdIT0ibnVtYmVyIil0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGNvb3JkcyB0byBjb250YWluIG51bWJlcnMuIik7dGhpcy5jb29yZHM9dDtjb25zdCBuPU1hdGgubWF4KDIqZS01LDApO3RoaXMuX3RyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkobiozKSx0aGlzLl9oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkobiozKSx0aGlzLl9oYXNoU2l6ZT1NYXRoLmNlaWwoTWF0aC5zcXJ0KGUpKSx0aGlzLl9odWxsUHJldj1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbE5leHQ9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxUcmk9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxIYXNoPW5ldyBJbnQzMkFycmF5KHRoaXMuX2hhc2hTaXplKS5maWxsKC0xKSx0aGlzLl9pZHM9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2Rpc3RzPW5ldyBGbG9hdDY0QXJyYXkoZSksdGhpcy51cGRhdGUoKX11cGRhdGUoKXtjb25zdHtjb29yZHM6dCxfaHVsbFByZXY6ZSxfaHVsbE5leHQ6bixfaHVsbFRyaTpzLF9odWxsSGFzaDpyfT10aGlzLG89dC5sZW5ndGg+PjE7bGV0IGE9MS8wLGM9MS8wLGw9LTEvMCxoPS0xLzA7Zm9yKGxldCB6PTA7ejxvO3orKyl7Y29uc3QgUz10WzIqel0sQz10WzIqeisxXTtTPGEmJihhPVMpLEM8YyYmKGM9QyksUz5sJiYobD1TKSxDPmgmJihoPUMpLHRoaXMuX2lkc1t6XT16fWNvbnN0IHU9KGErbCkvMixmPShjK2gpLzI7bGV0IGQ9MS8wLHAseSxtO2ZvcihsZXQgej0wO3o8bzt6Kyspe2NvbnN0IFM9S2EodSxmLHRbMip6XSx0WzIqeisxXSk7UzxkJiYocD16LGQ9Uyl9Y29uc3QgZz10WzIqcF0sYj10WzIqcCsxXTtkPTEvMDtmb3IobGV0IHo9MDt6PG87eisrKXtpZih6PT09cCljb250aW51ZTtjb25zdCBTPUthKGcsYix0WzIqel0sdFsyKnorMV0pO1M8ZCYmUz4wJiYoeT16LGQ9Uyl9bGV0IHc9dFsyKnldLHg9dFsyKnkrMV0sTT0xLzA7Zm9yKGxldCB6PTA7ejxvO3orKyl7aWYoej09PXB8fHo9PT15KWNvbnRpbnVlO2NvbnN0IFM9VXkoZyxiLHcseCx0WzIqel0sdFsyKnorMV0pO1M8TSYmKG09eixNPVMpfWxldCBBPXRbMiptXSxfPXRbMiptKzFdO2lmKE09PT0xLzApe2ZvcihsZXQgQz0wO0M8bztDKyspdGhpcy5fZGlzdHNbQ109dFsyKkNdLXRbMF18fHRbMipDKzFdLXRbMV07aGkodGhpcy5faWRzLHRoaXMuX2Rpc3RzLDAsby0xKTtjb25zdCB6PW5ldyBVaW50MzJBcnJheShvKTtsZXQgUz0wO2ZvcihsZXQgQz0wLEU9LTEvMDtDPG87QysrKXtjb25zdCBGPXRoaXMuX2lkc1tDXTt0aGlzLl9kaXN0c1tGXT5FJiYoeltTKytdPUYsRT10aGlzLl9kaXN0c1tGXSl9dGhpcy5odWxsPXouc3ViYXJyYXkoMCxTKSx0aGlzLnRyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkoMCksdGhpcy5oYWxmZWRnZXM9bmV3IFVpbnQzMkFycmF5KDApO3JldHVybn1pZihMcihnLGIsdyx4LEEsXyk8MCl7Y29uc3Qgej15LFM9dyxDPXg7eT1tLHc9QSx4PV8sbT16LEE9UyxfPUN9Y29uc3Qgdj1WeShnLGIsdyx4LEEsXyk7dGhpcy5fY3g9di54LHRoaXMuX2N5PXYueTtmb3IobGV0IHo9MDt6PG87eisrKXRoaXMuX2Rpc3RzW3pdPUthKHRbMip6XSx0WzIqeisxXSx2Lngsdi55KTtoaSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpLHRoaXMuX2h1bGxTdGFydD1wO2xldCBQPTM7bltwXT1lW21dPXksblt5XT1lW3BdPW0sblttXT1lW3ldPXAsc1twXT0wLHNbeV09MSxzW21dPTIsci5maWxsKC0xKSxyW3RoaXMuX2hhc2hLZXkoZyxiKV09cCxyW3RoaXMuX2hhc2hLZXkodyx4KV09eSxyW3RoaXMuX2hhc2hLZXkoQSxfKV09bSx0aGlzLnRyaWFuZ2xlc0xlbj0wLHRoaXMuX2FkZFRyaWFuZ2xlKHAseSxtLC0xLC0xLC0xKTtmb3IobGV0IHo9MCxTLEM7ejx0aGlzLl9pZHMubGVuZ3RoO3orKyl7Y29uc3QgRT10aGlzLl9pZHNbel0sRj10WzIqRV0sQj10WzIqRSsxXTtpZih6PjAmJk1hdGguYWJzKEYtUyk8PUtoJiZNYXRoLmFicyhCLUMpPD1LaHx8KFM9RixDPUIsRT09PXB8fEU9PT15fHxFPT09bSkpY29udGludWU7bGV0IEk9MDtmb3IobGV0IGR0PTAsRHQ9dGhpcy5faGFzaEtleShGLEIpO2R0PHRoaXMuX2hhc2hTaXplJiYoST1yWyhEdCtkdCkldGhpcy5faGFzaFNpemVdLCEoSSE9PS0xJiZJIT09bltJXSkpO2R0KyspO0k9ZVtJXTtsZXQgaz1JLEQ7Zm9yKDtEPW5ba10sTHIoRixCLHRbMiprXSx0WzIqaysxXSx0WzIqRF0sdFsyKkQrMV0pPj0wOylpZihrPUQsaz09PUkpe2s9LTE7YnJlYWt9aWYoaz09PS0xKWNvbnRpbnVlO2xldCBWPXRoaXMuX2FkZFRyaWFuZ2xlKGssRSxuW2tdLC0xLC0xLHNba10pO3NbRV09dGhpcy5fbGVnYWxpemUoVisyKSxzW2tdPVYsUCsrO2xldCBqPW5ba107Zm9yKDtEPW5bal0sTHIoRixCLHRbMipqXSx0WzIqaisxXSx0WzIqRF0sdFsyKkQrMV0pPDA7KVY9dGhpcy5fYWRkVHJpYW5nbGUoaixFLEQsc1tFXSwtMSxzW2pdKSxzW0VdPXRoaXMuX2xlZ2FsaXplKFYrMiksbltqXT1qLFAtLSxqPUQ7aWYoaz09PUkpZm9yKDtEPWVba10sTHIoRixCLHRbMipEXSx0WzIqRCsxXSx0WzIqa10sdFsyKmsrMV0pPDA7KVY9dGhpcy5fYWRkVHJpYW5nbGUoRCxFLGssLTEsc1trXSxzW0RdKSx0aGlzLl9sZWdhbGl6ZShWKzIpLHNbRF09VixuW2tdPWssUC0tLGs9RDt0aGlzLl9odWxsU3RhcnQ9ZVtFXT1rLG5ba109ZVtqXT1FLG5bRV09aixyW3RoaXMuX2hhc2hLZXkoRixCKV09RSxyW3RoaXMuX2hhc2hLZXkodFsyKmtdLHRbMiprKzFdKV09a310aGlzLmh1bGw9bmV3IFVpbnQzMkFycmF5KFApO2ZvcihsZXQgej0wLFM9dGhpcy5faHVsbFN0YXJ0O3o8UDt6KyspdGhpcy5odWxsW3pdPVMsUz1uW1NdO3RoaXMudHJpYW5nbGVzPXRoaXMuX3RyaWFuZ2xlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKSx0aGlzLmhhbGZlZGdlcz10aGlzLl9oYWxmZWRnZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbil9X2hhc2hLZXkodCxlKXtyZXR1cm4gTWF0aC5mbG9vcihEeSh0LXRoaXMuX2N4LGUtdGhpcy5fY3kpKnRoaXMuX2hhc2hTaXplKSV0aGlzLl9oYXNoU2l6ZX1fbGVnYWxpemUodCl7Y29uc3R7X3RyaWFuZ2xlczplLF9oYWxmZWRnZXM6bixjb29yZHM6c309dGhpcztsZXQgcj0wLG89MDtmb3IoOzspe2NvbnN0IGE9blt0XSxjPXQtdCUzO2lmKG89YysodCsyKSUzLGE9PT0tMSl7aWYocj09PTApYnJlYWs7dD1PclstLXJdO2NvbnRpbnVlfWNvbnN0IGw9YS1hJTMsaD1jKyh0KzEpJTMsdT1sKyhhKzIpJTMsZj1lW29dLGQ9ZVt0XSxwPWVbaF0seT1lW3VdO2lmKCR5KHNbMipmXSxzWzIqZisxXSxzWzIqZF0sc1syKmQrMV0sc1syKnBdLHNbMipwKzFdLHNbMip5XSxzWzIqeSsxXSkpe2VbdF09eSxlW2FdPWY7Y29uc3QgZz1uW3VdO2lmKGc9PT0tMSl7bGV0IHc9dGhpcy5faHVsbFN0YXJ0O2Rve2lmKHRoaXMuX2h1bGxUcmlbd109PT11KXt0aGlzLl9odWxsVHJpW3ddPXQ7YnJlYWt9dz10aGlzLl9odWxsUHJldlt3XX13aGlsZSh3IT09dGhpcy5faHVsbFN0YXJ0KX10aGlzLl9saW5rKHQsZyksdGhpcy5fbGluayhhLG5bb10pLHRoaXMuX2xpbmsobyx1KTtjb25zdCBiPWwrKGErMSklMztyPE9yLmxlbmd0aCYmKE9yW3IrK109Yil9ZWxzZXtpZihyPT09MClicmVhazt0PU9yWy0tcl19fXJldHVybiBvfV9saW5rKHQsZSl7dGhpcy5faGFsZmVkZ2VzW3RdPWUsZSE9PS0xJiYodGhpcy5faGFsZmVkZ2VzW2VdPXQpfV9hZGRUcmlhbmdsZSh0LGUsbixzLHIsbyl7Y29uc3QgYT10aGlzLnRyaWFuZ2xlc0xlbjtyZXR1cm4gdGhpcy5fdHJpYW5nbGVzW2FdPXQsdGhpcy5fdHJpYW5nbGVzW2ErMV09ZSx0aGlzLl90cmlhbmdsZXNbYSsyXT1uLHRoaXMuX2xpbmsoYSxzKSx0aGlzLl9saW5rKGErMSxyKSx0aGlzLl9saW5rKGErMixvKSx0aGlzLnRyaWFuZ2xlc0xlbis9MyxhfX1mdW5jdGlvbiBEeShpLHQpe2NvbnN0IGU9aS8oTWF0aC5hYnMoaSkrTWF0aC5hYnModCkpO3JldHVybih0PjA/My1lOjErZSkvNH1mdW5jdGlvbiBLYShpLHQsZSxuKXtjb25zdCBzPWktZSxyPXQtbjtyZXR1cm4gcypzK3Iqcn1mdW5jdGlvbiAkeShpLHQsZSxuLHMscixvLGEpe2NvbnN0IGM9aS1vLGw9dC1hLGg9ZS1vLHU9bi1hLGY9cy1vLGQ9ci1hLHA9YypjK2wqbCx5PWgqaCt1KnUsbT1mKmYrZCpkO3JldHVybiBjKih1Km0teSpkKS1sKihoKm0teSpmKStwKihoKmQtdSpmKTwwfWZ1bmN0aW9uIFV5KGksdCxlLG4scyxyKXtjb25zdCBvPWUtaSxhPW4tdCxjPXMtaSxsPXItdCxoPW8qbythKmEsdT1jKmMrbCpsLGY9LjUvKG8qbC1hKmMpLGQ9KGwqaC1hKnUpKmYscD0obyp1LWMqaCkqZjtyZXR1cm4gZCpkK3AqcH1mdW5jdGlvbiBWeShpLHQsZSxuLHMscil7Y29uc3Qgbz1lLWksYT1uLXQsYz1zLWksbD1yLXQsaD1vKm8rYSphLHU9YypjK2wqbCxmPS41LyhvKmwtYSpjKSxkPWkrKGwqaC1hKnUpKmYscD10KyhvKnUtYypoKSpmO3JldHVybnt4OmQseTpwfX1mdW5jdGlvbiBoaShpLHQsZSxuKXtpZihuLWU8PTIwKWZvcihsZXQgcz1lKzE7czw9bjtzKyspe2NvbnN0IHI9aVtzXSxvPXRbcl07bGV0IGE9cy0xO2Zvcig7YT49ZSYmdFtpW2FdXT5vOylpW2ErMV09aVthLS1dO2lbYSsxXT1yfWVsc2V7Y29uc3Qgcz1lK24+PjE7bGV0IHI9ZSsxLG89bjtlcyhpLHMsciksdFtpW2VdXT50W2lbbl1dJiZlcyhpLGUsbiksdFtpW3JdXT50W2lbbl1dJiZlcyhpLHIsbiksdFtpW2VdXT50W2lbcl1dJiZlcyhpLGUscik7Y29uc3QgYT1pW3JdLGM9dFthXTtmb3IoOzspe2RvIHIrKzt3aGlsZSh0W2lbcl1dPGMpO2RvIG8tLTt3aGlsZSh0W2lbb11dPmMpO2lmKG88cilicmVhaztlcyhpLHIsbyl9aVtlKzFdPWlbb10saVtvXT1hLG4tcisxPj1vLWU/KGhpKGksdCxyLG4pLGhpKGksdCxlLG8tMSkpOihoaShpLHQsZSxvLTEpLGhpKGksdCxyLG4pKX19ZnVuY3Rpb24gZXMoaSx0LGUpe2NvbnN0IG49aVt0XTtpW3RdPWlbZV0saVtlXT1ufWZ1bmN0aW9uIHF5KGkpe3JldHVybiBpWzBdfWZ1bmN0aW9uIEh5KGkpe3JldHVybiBpWzFdfWZ1bmN0aW9uIFd5KGksdCl7dmFyIGU9MCxuPTAscz0wLHI9MCxvPTAsYT0wLGM9MCxsPTAsaD1udWxsLHU9bnVsbCxmPWlbMF0sZD1pWzFdLHA9dC5sZW5ndGg7Zm9yKGU7ZTxwO2UrKyl7bj0wO3ZhciB5PXRbZV0ubGVuZ3RoLTEsbT10W2VdO2lmKGg9bVswXSxoWzBdIT09bVt5XVswXSYmaFsxXSE9PW1beV1bMV0pdGhyb3cgbmV3IEVycm9yKCJGaXJzdCBhbmQgbGFzdCBjb29yZGluYXRlcyBpbiBhIHJpbmcgbXVzdCBiZSB0aGUgc2FtZSIpO2ZvcihvPWhbMF0tZixhPWhbMV0tZCxuO248eTtuKyspe2lmKHU9bVtuKzFdLGw9dVsxXS1kLGE8MCYmbDwwfHxhPjAmJmw+MCl7aD11LGE9bCxvPWhbMF0tZjtjb250aW51ZX1pZihjPXVbMF0taVswXSxsPjAmJmE8PTApe2lmKHI9bypsLWMqYSxyPjApcz1zKzE7ZWxzZSBpZihyPT09MClyZXR1cm4gMH1lbHNlIGlmKGE+MCYmbDw9MCl7aWYocj1vKmwtYyphLHI8MClzPXMrMTtlbHNlIGlmKHI9PT0wKXJldHVybiAwfWVsc2UgaWYobD09PTAmJmE8MCl7aWYocj1vKmwtYyphLHI9PT0wKXJldHVybiAwfWVsc2UgaWYoYT09PTAmJmw8MCl7aWYocj1vKmwtYyphLHI9PT0wKXJldHVybiAwfWVsc2UgaWYoYT09PTAmJmw9PT0wKXtpZihjPD0wJiZvPj0wKXJldHVybiAwO2lmKG88PTAmJmM+PTApcmV0dXJuIDB9aD11LGE9bCxvPWN9fXJldHVybiBzJTIhPT0wfWZ1bmN0aW9uIEd5KGksdCxlPXt9KXtpZighaSl0aHJvdyBuZXcgRXJyb3IoInBvaW50IGlzIHJlcXVpcmVkIik7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJwb2x5Z29uIGlzIHJlcXVpcmVkIik7Y29uc3Qgbj1QeShpKSxzPUN5KHQpLHI9cy50eXBlLG89dC5iYm94O2xldCBhPXMuY29vcmRpbmF0ZXM7aWYobyYmWnkobixvKT09PSExKXJldHVybiExO3I9PT0iUG9seWdvbiImJihhPVthXSk7bGV0IGM9ITE7Zm9yKHZhciBsPTA7bDxhLmxlbmd0aDsrK2wpe2NvbnN0IGg9V3kobixhW2xdKTtpZihoPT09MClyZXR1cm4hZS5pZ25vcmVCb3VuZGFyeTtoJiYoYz0hMCl9cmV0dXJuIGN9ZnVuY3Rpb24gWnkoaSx0KXtyZXR1cm4gdFswXTw9aVswXSYmdFsxXTw9aVsxXSYmdFsyXT49aVswXSYmdFszXT49aVsxXX12YXIgWHk9R3k7Y29uc3QgdHU9MWUtNjtjbGFzcyB6bntjb25zdHJ1Y3Rvcigpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifW1vdmVUbyh0LGUpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPSt0fSwke3RoaXMuX3kwPXRoaXMuX3kxPStlfWB9Y2xvc2VQYXRoKCl7dGhpcy5feDEhPT1udWxsJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfWxpbmVUbyh0LGUpe3RoaXMuXys9YEwke3RoaXMuX3gxPSt0fSwke3RoaXMuX3kxPStlfWB9YXJjKHQsZSxuKXt0PSt0LGU9K2Usbj0rbjtjb25zdCBzPXQrbixyPWU7aWYobjwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzIik7dGhpcy5feDE9PT1udWxsP3RoaXMuXys9YE0ke3N9LCR7cn1gOihNYXRoLmFicyh0aGlzLl94MS1zKT50dXx8TWF0aC5hYnModGhpcy5feTEtcik+dHUpJiYodGhpcy5fKz0iTCIrcysiLCIrciksbiYmKHRoaXMuXys9YEEke259LCR7bn0sMCwxLDEsJHt0LW59LCR7ZX1BJHtufSwke259LDAsMSwxLCR7dGhpcy5feDE9c30sJHt0aGlzLl95MT1yfWApfXJlY3QodCxlLG4scyl7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K2V9aCR7K259diR7K3N9aCR7LW59WmB9dmFsdWUoKXtyZXR1cm4gdGhpcy5ffHxudWxsfX1jbGFzcyB0Y3tjb25zdHJ1Y3Rvcigpe3RoaXMuXz1bXX1tb3ZlVG8odCxlKXt0aGlzLl8ucHVzaChbdCxlXSl9Y2xvc2VQYXRoKCl7dGhpcy5fLnB1c2godGhpcy5fWzBdLnNsaWNlKCkpfWxpbmVUbyh0LGUpe3RoaXMuXy5wdXNoKFt0LGVdKX12YWx1ZSgpe3JldHVybiB0aGlzLl8ubGVuZ3RoP3RoaXMuXzpudWxsfX1jbGFzcyBKeXtjb25zdHJ1Y3Rvcih0LFtlLG4scyxyXT1bMCwwLDk2MCw1MDBdKXtpZighKChzPStzKT49KGU9K2UpKXx8ISgocj0rcik+PShuPStuKSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJvdW5kcyIpO3RoaXMuZGVsYXVuYXk9dCx0aGlzLl9jaXJjdW1jZW50ZXJzPW5ldyBGbG9hdDY0QXJyYXkodC5wb2ludHMubGVuZ3RoKjIpLHRoaXMudmVjdG9ycz1uZXcgRmxvYXQ2NEFycmF5KHQucG9pbnRzLmxlbmd0aCoyKSx0aGlzLnhtYXg9cyx0aGlzLnhtaW49ZSx0aGlzLnltYXg9cix0aGlzLnltaW49bix0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuZGVsYXVuYXkudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnQsaHVsbDplLHRyaWFuZ2xlczpufSx2ZWN0b3JzOnN9PXRoaXMscj10aGlzLmNpcmN1bWNlbnRlcnM9dGhpcy5fY2lyY3VtY2VudGVycy5zdWJhcnJheSgwLG4ubGVuZ3RoLzMqMik7Zm9yKGxldCBkPTAscD0wLHk9bi5sZW5ndGgsbSxnO2Q8eTtkKz0zLHArPTIpe2NvbnN0IGI9bltkXSoyLHc9bltkKzFdKjIseD1uW2QrMl0qMixNPXRbYl0sQT10W2IrMV0sXz10W3ddLHY9dFt3KzFdLFA9dFt4XSx6PXRbeCsxXSxTPV8tTSxDPXYtQSxFPVAtTSxGPXotQSxCPShTKkYtQypFKSoyO2lmKE1hdGguYWJzKEIpPDFlLTkpe2xldCBJPTFlOTtjb25zdCBrPW5bMF0qMjtJKj1NYXRoLnNpZ24oKHRba10tTSkqRi0odFtrKzFdLUEpKkUpLG09KE0rUCkvMi1JKkYsZz0oQSt6KS8yK0kqRX1lbHNle2NvbnN0IEk9MS9CLGs9UypTK0MqQyxEPUUqRStGKkY7bT1NKyhGKmstQypEKSpJLGc9QSsoUypELUUqaykqSX1yW3BdPW0scltwKzFdPWd9bGV0IG89ZVtlLmxlbmd0aC0xXSxhLGM9byo0LGwsaD10WzIqb10sdSxmPXRbMipvKzFdO3MuZmlsbCgwKTtmb3IobGV0IGQ9MDtkPGUubGVuZ3RoOysrZClvPWVbZF0sYT1jLGw9aCx1PWYsYz1vKjQsaD10WzIqb10sZj10WzIqbysxXSxzW2ErMl09c1tjXT11LWYsc1thKzNdPXNbYysxXT1oLWx9cmVuZGVyKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyB6bjp2b2lkIDAse2RlbGF1bmF5OntoYWxmZWRnZXM6bixpbmVkZ2VzOnMsaHVsbDpyfSxjaXJjdW1jZW50ZXJzOm8sdmVjdG9yczphfT10aGlzO2lmKHIubGVuZ3RoPD0xKXJldHVybiBudWxsO2ZvcihsZXQgaD0wLHU9bi5sZW5ndGg7aDx1OysraCl7Y29uc3QgZj1uW2hdO2lmKGY8aCljb250aW51ZTtjb25zdCBkPU1hdGguZmxvb3IoaC8zKSoyLHA9TWF0aC5mbG9vcihmLzMpKjIseT1vW2RdLG09b1tkKzFdLGc9b1twXSxiPW9bcCsxXTt0aGlzLl9yZW5kZXJTZWdtZW50KHksbSxnLGIsdCl9bGV0IGMsbD1yW3IubGVuZ3RoLTFdO2ZvcihsZXQgaD0wO2g8ci5sZW5ndGg7KytoKXtjPWwsbD1yW2hdO2NvbnN0IHU9TWF0aC5mbG9vcihzW2xdLzMpKjIsZj1vW3VdLGQ9b1t1KzFdLHA9Yyo0LHk9dGhpcy5fcHJvamVjdChmLGQsYVtwKzJdLGFbcCszXSk7eSYmdGhpcy5fcmVuZGVyU2VnbWVudChmLGQseVswXSx5WzFdLHQpfXJldHVybiBlJiZlLnZhbHVlKCl9cmVuZGVyQm91bmRzKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyB6bjp2b2lkIDA7cmV0dXJuIHQucmVjdCh0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heC10aGlzLnhtaW4sdGhpcy55bWF4LXRoaXMueW1pbiksZSYmZS52YWx1ZSgpfXJlbmRlckNlbGwodCxlKXtjb25zdCBuPWU9PW51bGw/ZT1uZXcgem46dm9pZCAwLHM9dGhpcy5fY2xpcCh0KTtpZihzPT09bnVsbHx8IXMubGVuZ3RoKXJldHVybjtlLm1vdmVUbyhzWzBdLHNbMV0pO2xldCByPXMubGVuZ3RoO2Zvcig7c1swXT09PXNbci0yXSYmc1sxXT09PXNbci0xXSYmcj4xOylyLT0yO2ZvcihsZXQgbz0yO288cjtvKz0yKShzW29dIT09c1tvLTJdfHxzW28rMV0hPT1zW28tMV0pJiZlLmxpbmVUbyhzW29dLHNbbysxXSk7cmV0dXJuIGUuY2xvc2VQYXRoKCksbiYmbi52YWx1ZSgpfSpjZWxsUG9seWdvbnMoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnR9fT10aGlzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGgvMjtlPG47KytlKXtjb25zdCBzPXRoaXMuY2VsbFBvbHlnb24oZSk7cyYmKHMuaW5kZXg9ZSx5aWVsZCBzKX19Y2VsbFBvbHlnb24odCl7Y29uc3QgZT1uZXcgdGM7cmV0dXJuIHRoaXMucmVuZGVyQ2VsbCh0LGUpLGUudmFsdWUoKX1fcmVuZGVyU2VnbWVudCh0LGUsbixzLHIpe2xldCBvO2NvbnN0IGE9dGhpcy5fcmVnaW9uY29kZSh0LGUpLGM9dGhpcy5fcmVnaW9uY29kZShuLHMpO2E9PT0wJiZjPT09MD8oci5tb3ZlVG8odCxlKSxyLmxpbmVUbyhuLHMpKToobz10aGlzLl9jbGlwU2VnbWVudCh0LGUsbixzLGEsYykpJiYoci5tb3ZlVG8ob1swXSxvWzFdKSxyLmxpbmVUbyhvWzJdLG9bM10pKX1jb250YWlucyh0LGUsbil7cmV0dXJuIGU9K2UsZSE9PWV8fChuPStuLG4hPT1uKT8hMTp0aGlzLmRlbGF1bmF5Ll9zdGVwKHQsZSxuKT09PXR9Km5laWdoYm9ycyh0KXtjb25zdCBlPXRoaXMuX2NsaXAodCk7aWYoZSlmb3IoY29uc3QgbiBvZiB0aGlzLmRlbGF1bmF5Lm5laWdoYm9ycyh0KSl7Y29uc3Qgcz10aGlzLl9jbGlwKG4pO2lmKHMpe3Q6Zm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cis9Milmb3IobGV0IGE9MCxjPXMubGVuZ3RoO2E8YzthKz0yKWlmKGVbcl09PXNbYV0mJmVbcisxXT09c1thKzFdJiZlWyhyKzIpJW9dPT1zWyhhK2MtMiklY10mJmVbKHIrMyklb109PXNbKGErYy0xKSVjXSl7eWllbGQgbjticmVhayB0fX19fV9jZWxsKHQpe2NvbnN0e2NpcmN1bWNlbnRlcnM6ZSxkZWxhdW5heTp7aW5lZGdlczpuLGhhbGZlZGdlczpzLHRyaWFuZ2xlczpyfX09dGhpcyxvPW5bdF07aWYobz09PS0xKXJldHVybiBudWxsO2NvbnN0IGE9W107bGV0IGM9bztkb3tjb25zdCBsPU1hdGguZmxvb3IoYy8zKTtpZihhLnB1c2goZVtsKjJdLGVbbCoyKzFdKSxjPWMlMz09PTI/Yy0yOmMrMSxyW2NdIT09dClicmVhaztjPXNbY119d2hpbGUoYyE9PW8mJmMhPT0tMSk7cmV0dXJuIGF9X2NsaXAodCl7aWYodD09PTAmJnRoaXMuZGVsYXVuYXkuaHVsbC5sZW5ndGg9PT0xKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtjb25zdCBlPXRoaXMuX2NlbGwodCk7aWYoZT09PW51bGwpcmV0dXJuIG51bGw7Y29uc3R7dmVjdG9yczpufT10aGlzLHM9dCo0O3JldHVybiBuW3NdfHxuW3MrMV0/dGhpcy5fY2xpcEluZmluaXRlKHQsZSxuW3NdLG5bcysxXSxuW3MrMl0sbltzKzNdKTp0aGlzLl9jbGlwRmluaXRlKHQsZSl9X2NsaXBGaW5pdGUodCxlKXtjb25zdCBuPWUubGVuZ3RoO2xldCBzPW51bGwscixvLGE9ZVtuLTJdLGM9ZVtuLTFdLGwsaD10aGlzLl9yZWdpb25jb2RlKGEsYyksdSxmPTA7Zm9yKGxldCBkPTA7ZDxuO2QrPTIpaWYocj1hLG89YyxhPWVbZF0sYz1lW2QrMV0sbD1oLGg9dGhpcy5fcmVnaW9uY29kZShhLGMpLGw9PT0wJiZoPT09MCl1PWYsZj0wLHM/cy5wdXNoKGEsYyk6cz1bYSxjXTtlbHNle2xldCBwLHksbSxnLGI7aWYobD09PTApe2lmKChwPXRoaXMuX2NsaXBTZWdtZW50KHIsbyxhLGMsbCxoKSk9PT1udWxsKWNvbnRpbnVlO1t5LG0sZyxiXT1wfWVsc2V7aWYoKHA9dGhpcy5fY2xpcFNlZ21lbnQoYSxjLHIsbyxoLGwpKT09PW51bGwpY29udGludWU7W2csYix5LG1dPXAsdT1mLGY9dGhpcy5fZWRnZWNvZGUoeSxtKSx1JiZmJiZ0aGlzLl9lZGdlKHQsdSxmLHMscy5sZW5ndGgpLHM/cy5wdXNoKHksbSk6cz1beSxtXX11PWYsZj10aGlzLl9lZGdlY29kZShnLGIpLHUmJmYmJnRoaXMuX2VkZ2UodCx1LGYscyxzLmxlbmd0aCkscz9zLnB1c2goZyxiKTpzPVtnLGJdfWlmKHMpdT1mLGY9dGhpcy5fZWRnZWNvZGUoc1swXSxzWzFdKSx1JiZmJiZ0aGlzLl9lZGdlKHQsdSxmLHMscy5sZW5ndGgpO2Vsc2UgaWYodGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSlyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07cmV0dXJuIHN9X2NsaXBTZWdtZW50KHQsZSxuLHMscixvKXtmb3IoOzspe2lmKHI9PT0wJiZvPT09MClyZXR1cm5bdCxlLG4sc107aWYociZvKXJldHVybiBudWxsO2xldCBhLGMsbD1yfHxvO2wmOD8oYT10KyhuLXQpKih0aGlzLnltYXgtZSkvKHMtZSksYz10aGlzLnltYXgpOmwmND8oYT10KyhuLXQpKih0aGlzLnltaW4tZSkvKHMtZSksYz10aGlzLnltaW4pOmwmMj8oYz1lKyhzLWUpKih0aGlzLnhtYXgtdCkvKG4tdCksYT10aGlzLnhtYXgpOihjPWUrKHMtZSkqKHRoaXMueG1pbi10KS8obi10KSxhPXRoaXMueG1pbikscj8odD1hLGU9YyxyPXRoaXMuX3JlZ2lvbmNvZGUodCxlKSk6KG49YSxzPWMsbz10aGlzLl9yZWdpb25jb2RlKG4scykpfX1fY2xpcEluZmluaXRlKHQsZSxuLHMscixvKXtsZXQgYT1BcnJheS5mcm9tKGUpLGM7aWYoKGM9dGhpcy5fcHJvamVjdChhWzBdLGFbMV0sbixzKSkmJmEudW5zaGlmdChjWzBdLGNbMV0pLChjPXRoaXMuX3Byb2plY3QoYVthLmxlbmd0aC0yXSxhW2EubGVuZ3RoLTFdLHIsbykpJiZhLnB1c2goY1swXSxjWzFdKSxhPXRoaXMuX2NsaXBGaW5pdGUodCxhKSlmb3IobGV0IGw9MCxoPWEubGVuZ3RoLHUsZj10aGlzLl9lZGdlY29kZShhW2gtMl0sYVtoLTFdKTtsPGg7bCs9Mil1PWYsZj10aGlzLl9lZGdlY29kZShhW2xdLGFbbCsxXSksdSYmZiYmKGw9dGhpcy5fZWRnZSh0LHUsZixhLGwpLGg9YS5sZW5ndGgpO2Vsc2UgdGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSYmKGE9W3RoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXhdKTtyZXR1cm4gYX1fZWRnZSh0LGUsbixzLHIpe2Zvcig7ZSE9PW47KXtsZXQgbyxhO3N3aXRjaChlKXtjYXNlIDU6ZT00O2NvbnRpbnVlO2Nhc2UgNDplPTYsbz10aGlzLnhtYXgsYT10aGlzLnltaW47YnJlYWs7Y2FzZSA2OmU9Mjtjb250aW51ZTtjYXNlIDI6ZT0xMCxvPXRoaXMueG1heCxhPXRoaXMueW1heDticmVhaztjYXNlIDEwOmU9ODtjb250aW51ZTtjYXNlIDg6ZT05LG89dGhpcy54bWluLGE9dGhpcy55bWF4O2JyZWFrO2Nhc2UgOTplPTE7Y29udGludWU7Y2FzZSAxOmU9NSxvPXRoaXMueG1pbixhPXRoaXMueW1pbjticmVha30oc1tyXSE9PW98fHNbcisxXSE9PWEpJiZ0aGlzLmNvbnRhaW5zKHQsbyxhKSYmKHMuc3BsaWNlKHIsMCxvLGEpLHIrPTIpfWlmKHMubGVuZ3RoPjQpZm9yKGxldCBvPTA7bzxzLmxlbmd0aDtvKz0yKXtjb25zdCBhPShvKzIpJXMubGVuZ3RoLGM9KG8rNCklcy5sZW5ndGg7KHNbb109PT1zW2FdJiZzW2FdPT09c1tjXXx8c1tvKzFdPT09c1thKzFdJiZzW2ErMV09PT1zW2MrMV0pJiYocy5zcGxpY2UoYSwyKSxvLT0yKX1yZXR1cm4gcn1fcHJvamVjdCh0LGUsbixzKXtsZXQgcj0xLzAsbyxhLGM7aWYoczwwKXtpZihlPD10aGlzLnltaW4pcmV0dXJuIG51bGw7KG89KHRoaXMueW1pbi1lKS9zKTxyJiYoYz10aGlzLnltaW4sYT10KyhyPW8pKm4pfWVsc2UgaWYocz4wKXtpZihlPj10aGlzLnltYXgpcmV0dXJuIG51bGw7KG89KHRoaXMueW1heC1lKS9zKTxyJiYoYz10aGlzLnltYXgsYT10KyhyPW8pKm4pfWlmKG4+MCl7aWYodD49dGhpcy54bWF4KXJldHVybiBudWxsOyhvPSh0aGlzLnhtYXgtdCkvbik8ciYmKGE9dGhpcy54bWF4LGM9ZSsocj1vKSpzKX1lbHNlIGlmKG48MCl7aWYodDw9dGhpcy54bWluKXJldHVybiBudWxsOyhvPSh0aGlzLnhtaW4tdCkvbik8ciYmKGE9dGhpcy54bWluLGM9ZSsocj1vKSpzKX1yZXR1cm5bYSxjXX1fZWRnZWNvZGUodCxlKXtyZXR1cm4odD09PXRoaXMueG1pbj8xOnQ9PT10aGlzLnhtYXg/MjowKXwoZT09PXRoaXMueW1pbj80OmU9PT10aGlzLnltYXg/ODowKX1fcmVnaW9uY29kZSh0LGUpe3JldHVybih0PHRoaXMueG1pbj8xOnQ+dGhpcy54bWF4PzI6MCl8KGU8dGhpcy55bWluPzQ6ZT50aGlzLnltYXg/ODowKX19Y29uc3QgWXk9MipNYXRoLlBJLHVpPU1hdGgucG93O2Z1bmN0aW9uIGp5KGkpe3JldHVybiBpWzBdfWZ1bmN0aW9uIFF5KGkpe3JldHVybiBpWzFdfWZ1bmN0aW9uIEt5KGkpe2NvbnN0e3RyaWFuZ2xlczp0LGNvb3JkczplfT1pO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bis9Myl7Y29uc3Qgcz0yKnRbbl0scj0yKnRbbisxXSxvPTIqdFtuKzJdO2lmKChlW29dLWVbc10pKihlW3IrMV0tZVtzKzFdKS0oZVtyXS1lW3NdKSooZVtvKzFdLWVbcysxXSk+MWUtMTApcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gdG0oaSx0LGUpe3JldHVybltpK01hdGguc2luKGkrdCkqZSx0K01hdGguY29zKGktdCkqZV19Y2xhc3MgZWN7c3RhdGljIGZyb20odCxlPWp5LG49UXkscyl7cmV0dXJuIG5ldyBlYygibGVuZ3RoImluIHQ/ZW0odCxlLG4scyk6RmxvYXQ2NEFycmF5LmZyb20obm0odCxlLG4scykpKX1jb25zdHJ1Y3Rvcih0KXt0aGlzLl9kZWxhdW5hdG9yPW5ldyB0cyh0KSx0aGlzLmluZWRnZXM9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5faHVsbEluZGV4PW5ldyBJbnQzMkFycmF5KHQubGVuZ3RoLzIpLHRoaXMucG9pbnRzPXRoaXMuX2RlbGF1bmF0b3IuY29vcmRzLHRoaXMuX2luaXQoKX11cGRhdGUoKXtyZXR1cm4gdGhpcy5fZGVsYXVuYXRvci51cGRhdGUoKSx0aGlzLl9pbml0KCksdGhpc31faW5pdCgpe2NvbnN0IHQ9dGhpcy5fZGVsYXVuYXRvcixlPXRoaXMucG9pbnRzO2lmKHQuaHVsbCYmdC5odWxsLmxlbmd0aD4yJiZLeSh0KSl7dGhpcy5jb2xsaW5lYXI9SW50MzJBcnJheS5mcm9tKHtsZW5ndGg6ZS5sZW5ndGgvMn0sKGYsZCk9PmQpLnNvcnQoKGYsZCk9PmVbMipmXS1lWzIqZF18fGVbMipmKzFdLWVbMipkKzFdKTtjb25zdCBjPXRoaXMuY29sbGluZWFyWzBdLGw9dGhpcy5jb2xsaW5lYXJbdGhpcy5jb2xsaW5lYXIubGVuZ3RoLTFdLGg9W2VbMipjXSxlWzIqYysxXSxlWzIqbF0sZVsyKmwrMV1dLHU9MWUtOCpNYXRoLmh5cG90KGhbM10taFsxXSxoWzJdLWhbMF0pO2ZvcihsZXQgZj0wLGQ9ZS5sZW5ndGgvMjtmPGQ7KytmKXtjb25zdCBwPXRtKGVbMipmXSxlWzIqZisxXSx1KTtlWzIqZl09cFswXSxlWzIqZisxXT1wWzFdfXRoaXMuX2RlbGF1bmF0b3I9bmV3IHRzKGUpfWVsc2UgZGVsZXRlIHRoaXMuY29sbGluZWFyO2NvbnN0IG49dGhpcy5oYWxmZWRnZXM9dGhpcy5fZGVsYXVuYXRvci5oYWxmZWRnZXMscz10aGlzLmh1bGw9dGhpcy5fZGVsYXVuYXRvci5odWxsLHI9dGhpcy50cmlhbmdsZXM9dGhpcy5fZGVsYXVuYXRvci50cmlhbmdsZXMsbz10aGlzLmluZWRnZXMuZmlsbCgtMSksYT10aGlzLl9odWxsSW5kZXguZmlsbCgtMSk7Zm9yKGxldCBjPTAsbD1uLmxlbmd0aDtjPGw7KytjKXtjb25zdCBoPXJbYyUzPT09Mj9jLTI6YysxXTsobltjXT09PS0xfHxvW2hdPT09LTEpJiYob1toXT1jKX1mb3IobGV0IGM9MCxsPXMubGVuZ3RoO2M8bDsrK2MpYVtzW2NdXT1jO3MubGVuZ3RoPD0yJiZzLmxlbmd0aD4wJiYodGhpcy50cmlhbmdsZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy5oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy50cmlhbmdsZXNbMF09c1swXSxvW3NbMF1dPTEscy5sZW5ndGg9PT0yJiYob1tzWzFdXT0wLHRoaXMudHJpYW5nbGVzWzFdPXNbMV0sdGhpcy50cmlhbmdsZXNbMl09c1sxXSkpfXZvcm9ub2kodCl7cmV0dXJuIG5ldyBKeSh0aGlzLHQpfSpuZWlnaGJvcnModCl7Y29uc3R7aW5lZGdlczplLGh1bGw6bixfaHVsbEluZGV4OnMsaGFsZmVkZ2VzOnIsdHJpYW5nbGVzOm8sY29sbGluZWFyOmF9PXRoaXM7aWYoYSl7Y29uc3QgdT1hLmluZGV4T2YodCk7dT4wJiYoeWllbGQgYVt1LTFdKSx1PGEubGVuZ3RoLTEmJih5aWVsZCBhW3UrMV0pO3JldHVybn1jb25zdCBjPWVbdF07aWYoYz09PS0xKXJldHVybjtsZXQgbD1jLGg9LTE7ZG97aWYoeWllbGQgaD1vW2xdLGw9bCUzPT09Mj9sLTI6bCsxLG9bbF0hPT10KXJldHVybjtpZihsPXJbbF0sbD09PS0xKXtjb25zdCB1PW5bKHNbdF0rMSklbi5sZW5ndGhdO3UhPT1oJiYoeWllbGQgdSk7cmV0dXJufX13aGlsZShsIT09Yyl9ZmluZCh0LGUsbj0wKXtpZih0PSt0LHQhPT10fHwoZT0rZSxlIT09ZSkpcmV0dXJuLTE7Y29uc3Qgcz1uO2xldCByO2Zvcig7KHI9dGhpcy5fc3RlcChuLHQsZSkpPj0wJiZyIT09biYmciE9PXM7KW49cjtyZXR1cm4gcn1fc3RlcCh0LGUsbil7Y29uc3R7aW5lZGdlczpzLGh1bGw6cixfaHVsbEluZGV4Om8saGFsZmVkZ2VzOmEsdHJpYW5nbGVzOmMscG9pbnRzOmx9PXRoaXM7aWYoc1t0XT09PS0xfHwhbC5sZW5ndGgpcmV0dXJuKHQrMSklKGwubGVuZ3RoPj4xKTtsZXQgaD10LHU9dWkoZS1sW3QqMl0sMikrdWkobi1sW3QqMisxXSwyKTtjb25zdCBmPXNbdF07bGV0IGQ9Zjtkb3tsZXQgcD1jW2RdO2NvbnN0IHk9dWkoZS1sW3AqMl0sMikrdWkobi1sW3AqMisxXSwyKTtpZih5PHUmJih1PXksaD1wKSxkPWQlMz09PTI/ZC0yOmQrMSxjW2RdIT09dClicmVhaztpZihkPWFbZF0sZD09PS0xKXtpZihkPXJbKG9bdF0rMSklci5sZW5ndGhdLGQhPT1wJiZ1aShlLWxbZCoyXSwyKSt1aShuLWxbZCoyKzFdLDIpPHUpcmV0dXJuIGQ7YnJlYWt9fXdoaWxlKGQhPT1mKTtyZXR1cm4gaH1yZW5kZXIodCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IHpuOnZvaWQgMCx7cG9pbnRzOm4saGFsZmVkZ2VzOnMsdHJpYW5nbGVzOnJ9PXRoaXM7Zm9yKGxldCBvPTAsYT1zLmxlbmd0aDtvPGE7KytvKXtjb25zdCBjPXNbb107aWYoYzxvKWNvbnRpbnVlO2NvbnN0IGw9cltvXSoyLGg9cltjXSoyO3QubW92ZVRvKG5bbF0sbltsKzFdKSx0LmxpbmVUbyhuW2hdLG5baCsxXSl9cmV0dXJuIHRoaXMucmVuZGVySHVsbCh0KSxlJiZlLnZhbHVlKCl9cmVuZGVyUG9pbnRzKHQsZSl7ZT09PXZvaWQgMCYmKCF0fHx0eXBlb2YgdC5tb3ZlVG8hPSJmdW5jdGlvbiIpJiYoZT10LHQ9bnVsbCksZT1lPT1udWxsPzI6K2U7Y29uc3Qgbj10PT1udWxsP3Q9bmV3IHpuOnZvaWQgMCx7cG9pbnRzOnN9PXRoaXM7Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cis9Mil7Y29uc3QgYT1zW3JdLGM9c1tyKzFdO3QubW92ZVRvKGErZSxjKSx0LmFyYyhhLGMsZSwwLFl5KX1yZXR1cm4gbiYmbi52YWx1ZSgpfXJlbmRlckh1bGwodCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IHpuOnZvaWQgMCx7aHVsbDpuLHBvaW50czpzfT10aGlzLHI9blswXSoyLG89bi5sZW5ndGg7dC5tb3ZlVG8oc1tyXSxzW3IrMV0pO2ZvcihsZXQgYT0xO2E8bzsrK2Epe2NvbnN0IGM9MipuW2FdO3QubGluZVRvKHNbY10sc1tjKzFdKX1yZXR1cm4gdC5jbG9zZVBhdGgoKSxlJiZlLnZhbHVlKCl9aHVsbFBvbHlnb24oKXtjb25zdCB0PW5ldyB0YztyZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLHQudmFsdWUoKX1yZW5kZXJUcmlhbmdsZSh0LGUpe2NvbnN0IG49ZT09bnVsbD9lPW5ldyB6bjp2b2lkIDAse3BvaW50czpzLHRyaWFuZ2xlczpyfT10aGlzLG89clt0Kj0zXSoyLGE9clt0KzFdKjIsYz1yW3QrMl0qMjtyZXR1cm4gZS5tb3ZlVG8oc1tvXSxzW28rMV0pLGUubGluZVRvKHNbYV0sc1thKzFdKSxlLmxpbmVUbyhzW2NdLHNbYysxXSksZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KnRyaWFuZ2xlUG9seWdvbnMoKXtjb25zdHt0cmlhbmdsZXM6dH09dGhpcztmb3IobGV0IGU9MCxuPXQubGVuZ3RoLzM7ZTxuOysrZSl5aWVsZCB0aGlzLnRyaWFuZ2xlUG9seWdvbihlKX10cmlhbmdsZVBvbHlnb24odCl7Y29uc3QgZT1uZXcgdGM7cmV0dXJuIHRoaXMucmVuZGVyVHJpYW5nbGUodCxlKSxlLnZhbHVlKCl9fWZ1bmN0aW9uIGVtKGksdCxlLG4pe2NvbnN0IHM9aS5sZW5ndGgscj1uZXcgRmxvYXQ2NEFycmF5KHMqMik7Zm9yKGxldCBvPTA7bzxzOysrbyl7Y29uc3QgYT1pW29dO3JbbyoyXT10LmNhbGwobixhLG8saSkscltvKjIrMV09ZS5jYWxsKG4sYSxvLGkpfXJldHVybiByfWZ1bmN0aW9uKm5tKGksdCxlLG4pe2xldCBzPTA7Zm9yKGNvbnN0IHIgb2YgaSl5aWVsZCB0LmNhbGwobixyLHMsaSkseWllbGQgZS5jYWxsKG4scixzLGkpLCsrc31jb25zdCBuYz1NYXRoLlBJLGV1PW5jLzIsbnU9MTgwL25jLGl1PW5jLzE4MCxpbT1NYXRoLmF0YW4yLHN1PU1hdGguY29zLHNtPU1hdGgubWF4LHJtPU1hdGgubWluLHJ1PU1hdGguc2luLG9tPU1hdGguc2lnbnx8ZnVuY3Rpb24oaSl7cmV0dXJuIGk+MD8xOmk8MD8tMTowfSxvdT1NYXRoLnNxcnQ7ZnVuY3Rpb24gYW0oaSl7cmV0dXJuIGk+MT9ldTppPC0xPy1ldTpNYXRoLmFzaW4oaSl9ZnVuY3Rpb24gYXUoaSx0KXtyZXR1cm4gaVswXSp0WzBdK2lbMV0qdFsxXStpWzJdKnRbMl19ZnVuY3Rpb24gV3QoaSx0KXtyZXR1cm5baVsxXSp0WzJdLWlbMl0qdFsxXSxpWzJdKnRbMF0taVswXSp0WzJdLGlbMF0qdFsxXS1pWzFdKnRbMF1dfWZ1bmN0aW9uIERyKGksdCl7cmV0dXJuW2lbMF0rdFswXSxpWzFdK3RbMV0saVsyXSt0WzJdXX1mdW5jdGlvbiAkcihpKXt2YXIgdD1vdShpWzBdKmlbMF0raVsxXSppWzFdK2lbMl0qaVsyXSk7cmV0dXJuW2lbMF0vdCxpWzFdL3QsaVsyXS90XX1mdW5jdGlvbiBpYyhpKXtyZXR1cm5baW0oaVsxXSxpWzBdKSpudSxhbShzbSgtMSxybSgxLGlbMl0pKSkqbnVdfWZ1bmN0aW9uIE1lKGkpe2NvbnN0IHQ9aVswXSppdSxlPWlbMV0qaXUsbj1zdShlKTtyZXR1cm5bbipzdSh0KSxuKnJ1KHQpLHJ1KGUpXX1mdW5jdGlvbiBzYyhpKXtyZXR1cm4gaT1pLm1hcCh0PT5NZSh0KSksYXUoaVswXSxXdChpWzJdLGlbMV0pKX1mdW5jdGlvbiBjbShpKXtjb25zdCB0PWhtKGkpLGU9Zm0odCksbj11bShlLGkpLHM9cG0oZSxpLmxlbmd0aCkscj1sbShzLGkpLG89ZG0oZSxpKSx7cG9seWdvbnM6YSxjZW50ZXJzOmN9PXltKG8sZSxpKSxsPW1tKGEpLGg9eG0oZSxpKSx1PWdtKG4sZSk7cmV0dXJue2RlbGF1bmF5OnQsZWRnZXM6bix0cmlhbmdsZXM6ZSxjZW50ZXJzOmMsbmVpZ2hib3JzOnMscG9seWdvbnM6YSxtZXNoOmwsaHVsbDpoLHVycXVoYXJ0OnUsZmluZDpyfX1mdW5jdGlvbiBsbShpLHQpe2Z1bmN0aW9uIGUobixzKXtsZXQgcj1uWzBdLXNbMF0sbz1uWzFdLXNbMV0sYT1uWzJdLXNbMl07cmV0dXJuIHIqcitvKm8rYSphfXJldHVybiBmdW5jdGlvbihzLHIsbyl7bz09PXZvaWQgMCYmKG89MCk7bGV0IGEsYyxsPW87Y29uc3QgaD1NZShbcyxyXSk7ZG8gYT1vLG89bnVsbCxjPWUoaCxNZSh0W2FdKSksaVthXS5mb3JFYWNoKHU9PntsZXQgZj1lKGgsTWUodFt1XSkpO2lmKGY8Yyl7Yz1mLG89dSxsPXU7cmV0dXJufX0pO3doaWxlKG8hPT1udWxsKTtyZXR1cm4gbH19ZnVuY3Rpb24gaG0oaSl7aWYoaS5sZW5ndGg8MilyZXR1cm57fTtsZXQgdD0wO2Zvcig7aXNOYU4oaVt0XVswXStpW3RdWzFdKSYmdCsrPGkubGVuZ3RoOyk7Y29uc3QgZT1iaChpW3RdKSxuPXR5KCkudHJhbnNsYXRlKFswLDBdKS5zY2FsZSgxKS5yb3RhdGUoZS5pbnZlcnQoWzE4MCwwXSkpO2k9aS5tYXAobik7Y29uc3Qgcz1bXTtsZXQgcj0xO2ZvcihsZXQgdT0wLGY9aS5sZW5ndGg7dTxmO3UrKyl7bGV0IGQ9eWkoaVt1XVswXSwyKSt5aShpW3VdWzFdLDIpOyFpc0Zpbml0ZShkKXx8ZD4xZTMyP3MucHVzaCh1KTpkPnImJihyPWQpfWNvbnN0IG89MWU2Km91KHIpO3MuZm9yRWFjaCh1PT5pW3VdPVtvLDBdKSxpLnB1c2goWzAsb10pLGkucHVzaChbLW8sMF0pLGkucHVzaChbMCwtb10pO2NvbnN0IGE9ZWMuZnJvbShpKTthLnByb2plY3Rpb249bjtjb25zdHt0cmlhbmdsZXM6YyxoYWxmZWRnZXM6bCxpbmVkZ2VzOmh9PWE7Zm9yKGxldCB1PTAsZj1sLmxlbmd0aDt1PGY7dSsrKWlmKGxbdV08MCl7Y29uc3QgZD11JTM9PTI/dS0yOnUrMSxwPXUlMz09MD91KzI6dS0xLHk9bFtkXSxtPWxbcF07bFt5XT1tLGxbbV09eSxsW2RdPWxbcF09LTEsY1t1XT1jW2RdPWNbcF09dCxoW2NbeV1dPXklMz09MD95KzI6eS0xLGhbY1ttXV09bSUzPT0wP20rMjptLTEsdSs9Mi11JTN9ZWxzZSBjW3VdPmkubGVuZ3RoLTMtMSYmKGNbdV09dCk7cmV0dXJuIGF9ZnVuY3Rpb24gdW0oaSx0KXtjb25zdCBlPW5ldyBTZXQ7cmV0dXJuIHQubGVuZ3RoPT09Mj9bWzAsMV1dOihpLmZvckVhY2gobj0+e2lmKG5bMF0hPT1uWzFdJiYhKHNjKG4ubWFwKHM9PnRbc10pKTwwKSlmb3IobGV0IHM9MCxyO3M8MztzKyspcj0ocysxKSUzLGUuYWRkKHNyKFtuW3NdLG5bcl1dKS5qb2luKCItIikpfSksQXJyYXkuZnJvbShlLG49Pm4uc3BsaXQoIi0iKS5tYXAoTnVtYmVyKSkpfWZ1bmN0aW9uIGZtKGkpe2NvbnN0e3RyaWFuZ2xlczp0fT1pO2lmKCF0KXJldHVybltdO2NvbnN0IGU9W107Zm9yKGxldCBuPTAscz10Lmxlbmd0aC8zO248cztuKyspe2NvbnN0IHI9dFszKm5dLG89dFszKm4rMV0sYT10WzMqbisyXTtyIT09byYmbyE9PWEmJmUucHVzaChbcixhLG9dKX1yZXR1cm4gZX1mdW5jdGlvbiBkbShpLHQpe3JldHVybiBpLm1hcChlPT57Y29uc3Qgbj1lLm1hcChyPT50W3JdKS5tYXAoTWUpLHM9RHIoRHIoV3QoblsxXSxuWzBdKSxXdChuWzJdLG5bMV0pKSxXdChuWzBdLG5bMl0pKTtyZXR1cm4gaWMoJHIocykpfSl9ZnVuY3Rpb24gcG0oaSx0KXtjb25zdCBlPVtdO3JldHVybiBpLmZvckVhY2gobj0+e2ZvcihsZXQgcz0wO3M8MztzKyspe2NvbnN0IHI9bltzXSxvPW5bKHMrMSklM107ZVtyXT1lW3JdfHxbXSxlW3JdLnB1c2gobyl9fSksaS5sZW5ndGg9PT0wJiYodD09PTI/KGVbMF09WzFdLGVbMV09WzBdKTp0PT09MSYmKGVbMF09W10pKSxlfWZ1bmN0aW9uIHltKGksdCxlKXtjb25zdCBuPVtdLHM9aS5zbGljZSgpO2lmKHQubGVuZ3RoPT09MCl7aWYoZS5sZW5ndGg8MilyZXR1cm57cG9seWdvbnM6bixjZW50ZXJzOnN9O2lmKGUubGVuZ3RoPT09Mil7Y29uc3QgYT1NZShlWzBdKSxjPU1lKGVbMV0pLGw9JHIoRHIoYSxjKSksaD0kcihXdChhLGMpKSx1PVd0KGwsaCksZj1bbCxXdChsLHUpLFd0KFd0KGwsdSksdSksV3QoV3QoV3QobCx1KSx1KSx1KV0ubWFwKGljKS5tYXAobyk7cmV0dXJuIG4ucHVzaChmKSxuLnB1c2goZi5zbGljZSgpLnJldmVyc2UoKSkse3BvbHlnb25zOm4sY2VudGVyczpzfX19dC5mb3JFYWNoKChhLGMpPT57Zm9yKGxldCBsPTA7bDwzO2wrKyl7Y29uc3QgaD1hW2xdLHU9YVsobCsxKSUzXSxmPWFbKGwrMiklM107bltoXT1uW2hdfHxbXSxuW2hdLnB1c2goW3UsZixjLFtoLHUsZl1dKX19KTtjb25zdCByPW4ubWFwKGE9Pntjb25zdCBjPVthWzBdWzJdXTtsZXQgbD1hWzBdWzFdO2ZvcihsZXQgaD0xO2g8YS5sZW5ndGg7aCsrKWZvcihsZXQgdT0wO3U8YS5sZW5ndGg7dSsrKWlmKGFbdV1bMF09PWwpe2w9YVt1XVsxXSxjLnB1c2goYVt1XVsyXSk7YnJlYWt9aWYoYy5sZW5ndGg+MilyZXR1cm4gYztpZihjLmxlbmd0aD09Mil7Y29uc3QgaD1jdShlW2FbMF1bM11bMF1dLGVbYVswXVszXVsxXV0sc1tjWzBdXSksdT1jdShlW2FbMF1bM11bMl1dLGVbYVswXVszXVswXV0sc1tjWzBdXSksZj1vKGgpLGQ9byh1KTtyZXR1cm5bY1swXSxkLGNbMV0sZl19fSk7ZnVuY3Rpb24gbyhhKXtsZXQgYz0tMTtyZXR1cm4gcy5zbGljZSh0Lmxlbmd0aCwxLzApLmZvckVhY2goKGwsaCk9PntsWzBdPT09YVswXSYmbFsxXT09PWFbMV0mJihjPWgrdC5sZW5ndGgpfSksYzwwJiYoYz1zLmxlbmd0aCxzLnB1c2goYSkpLGN9cmV0dXJue3BvbHlnb25zOnIsY2VudGVyczpzfX1mdW5jdGlvbiBjdShpLHQsZSl7aT1NZShpKSx0PU1lKHQpLGU9TWUoZSk7Y29uc3Qgbj1vbShhdShXdCh0LGkpLGUpKTtyZXR1cm4gaWMoJHIoRHIoaSx0KSkubWFwKHM9Pm4qcykpfWZ1bmN0aW9uIG1tKGkpe2NvbnN0IHQ9W107cmV0dXJuIGkuZm9yRWFjaChlPT57aWYoIWUpcmV0dXJuO2xldCBuPWVbZS5sZW5ndGgtMV07Zm9yKGxldCBzIG9mIGUpcz5uJiZ0LnB1c2goW24sc10pLG49c30pLHR9ZnVuY3Rpb24gZ20oaSx0KXtyZXR1cm4gZnVuY3Rpb24oZSl7Y29uc3Qgbj1uZXcgTWFwLHM9bmV3IE1hcDtyZXR1cm4gaS5mb3JFYWNoKChyLG8pPT57Y29uc3QgYT1yLmpvaW4oIi0iKTtuLnNldChhLGVbb10pLHMuc2V0KGEsITApfSksdC5mb3JFYWNoKHI9PntsZXQgbz0wLGE9LTE7Zm9yKGxldCBjPTA7YzwzO2MrKyl7bGV0IGw9c3IoW3JbY10sclsoYysxKSUzXV0pLmpvaW4oIi0iKTtuLmdldChsKT5vJiYobz1uLmdldChsKSxhPWwpfXMuc2V0KGEsITEpfSksaS5tYXAocj0+cy5nZXQoci5qb2luKCItIikpKX19ZnVuY3Rpb24geG0oaSx0KXtjb25zdCBlPW5ldyBTZXQsbj1bXTtpLm1hcChhPT57aWYoIShzYyhhLm1hcChjPT50W2M+dC5sZW5ndGg/MDpjXSkpPjFlLTEyKSlmb3IobGV0IGM9MDtjPDM7YysrKXtsZXQgbD1bYVtjXSxhWyhjKzEpJTNdXSxoPWAke2xbMF19LSR7bFsxXX1gO2UuaGFzKGgpP2UuZGVsZXRlKGgpOmUuYWRkKGAke2xbMV19LSR7bFswXX1gKX19KTtjb25zdCBzPW5ldyBNYXA7bGV0IHI7aWYoZS5mb3JFYWNoKGE9PnthPWEuc3BsaXQoIi0iKS5tYXAoTnVtYmVyKSxzLnNldChhWzBdLGFbMV0pLHI9YVswXX0pLHI9PT12b2lkIDApcmV0dXJuIG47bGV0IG89cjtkb3tuLnB1c2gobyk7bGV0IGE9cy5nZXQobyk7cy5zZXQobywtMSksbz1hfXdoaWxlKG8+LTEmJm8hPT1yKTtyZXR1cm4gbn1mdW5jdGlvbiB3bShpKXtjb25zdCB0PWZ1bmN0aW9uKGUpe2lmKHQuZGVsYXVuYXk9bnVsbCx0Ll9kYXRhPWUsdHlwZW9mIHQuX2RhdGE9PSJvYmplY3QiJiZ0Ll9kYXRhLnR5cGU9PT0iRmVhdHVyZUNvbGxlY3Rpb24iJiYodC5fZGF0YT10Ll9kYXRhLmZlYXR1cmVzKSx0eXBlb2YgdC5fZGF0YT09Im9iamVjdCIpe2NvbnN0IG49dC5fZGF0YS5tYXAocz0+W3QuX3Z4KHMpLHQuX3Z5KHMpLHNdKS5maWx0ZXIocz0+aXNGaW5pdGUoc1swXStzWzFdKSk7dC5wb2ludHM9bi5tYXAocz0+W3NbMF0sc1sxXV0pLHQudmFsaWQ9bi5tYXAocz0+c1syXSksdC5kZWxhdW5heT1jbSh0LnBvaW50cyl9cmV0dXJuIHR9O3JldHVybiB0Ll92eD1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09Im9iamVjdCImJiJ0eXBlImluIGUpcmV0dXJuIHloKGUpWzBdO2lmKDAgaW4gZSlyZXR1cm4gZVswXX0sdC5fdnk9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGU9PSJvYmplY3QiJiYidHlwZSJpbiBlKXJldHVybiB5aChlKVsxXTtpZigxIGluIGUpcmV0dXJuIGVbMV19LHQueD1mdW5jdGlvbihlKXtyZXR1cm4gZT8odC5fdng9ZSx0KTp0Ll92eH0sdC55PWZ1bmN0aW9uKGUpe3JldHVybiBlPyh0Ll92eT1lLHQpOnQuX3Z5fSx0LnBvbHlnb25zPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3Qgbj17dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOltdfTtyZXR1cm4gdC52YWxpZC5sZW5ndGg9PT0wfHwodC5kZWxhdW5heS5wb2x5Z29ucy5mb3JFYWNoKChzLHIpPT5uLmZlYXR1cmVzLnB1c2goe3R5cGU6IkZlYXR1cmUiLGdlb21ldHJ5OnM/e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltbLi4ucyxzWzBdXS5tYXAobz0+dC5kZWxhdW5heS5jZW50ZXJzW29dKV19Om51bGwscHJvcGVydGllczp7c2l0ZTp0LnZhbGlkW3JdLHNpdGVjb29yZGluYXRlczp0LnBvaW50c1tyXSxuZWlnaGJvdXJzOnQuZGVsYXVuYXkubmVpZ2hib3JzW3JdfX0pKSx0LnZhbGlkLmxlbmd0aD09PTEmJm4uZmVhdHVyZXMucHVzaCh7dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6e3R5cGU6IlNwaGVyZSJ9LHByb3BlcnRpZXM6e3NpdGU6dC52YWxpZFswXSxzaXRlY29vcmRpbmF0ZXM6dC5wb2ludHNbMF0sbmVpZ2hib3VyczpbXX19KSksbn0sdC50cmlhbmdsZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT12b2lkIDAmJnQoZSksdC5kZWxhdW5heT97dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOnQuZGVsYXVuYXkudHJpYW5nbGVzLm1hcCgobixzKT0+KG49bi5tYXAocj0+dC5wb2ludHNbcl0pLG4uY2VudGVyPXQuZGVsYXVuYXkuY2VudGVyc1tzXSxuKSkuZmlsdGVyKG49PnNjKG4pPjApLm1hcChuPT4oe3R5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6e2NpcmN1bWNlbnRlcjpuLmNlbnRlcn0sZ2VvbWV0cnk6e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltbLi4ubixuWzBdXV19fSkpfTohMX0sdC5saW5rcz1mdW5jdGlvbihlKXtpZihlIT09dm9pZCAwJiZ0KGUpLCF0LmRlbGF1bmF5KXJldHVybiExO2NvbnN0IG49dC5kZWxhdW5heS5lZGdlcy5tYXAocj0+cmkodC5wb2ludHNbclswXV0sdC5wb2ludHNbclsxXV0pKSxzPXQuZGVsYXVuYXkudXJxdWhhcnQobik7cmV0dXJue3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczp0LmRlbGF1bmF5LmVkZ2VzLm1hcCgocixvKT0+KHt0eXBlOiJGZWF0dXJlIixwcm9wZXJ0aWVzOntzb3VyY2U6dC52YWxpZFtyWzBdXSx0YXJnZXQ6dC52YWxpZFtyWzFdXSxsZW5ndGg6bltvXSx1cnF1aGFydDohIXNbb119LGdlb21ldHJ5Ont0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpbdC5wb2ludHNbclswXV0sdC5wb2ludHNbclsxXV1dfX0pKX19LHQubWVzaD1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXZvaWQgMCYmdChlKSx0LmRlbGF1bmF5P3t0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQuZGVsYXVuYXkuZWRnZXMubWFwKG49Plt0LnBvaW50c1tuWzBdXSx0LnBvaW50c1tuWzFdXV0pfTohMX0sdC5jZWxsTWVzaD1mdW5jdGlvbihlKXtpZihlIT09dm9pZCAwJiZ0KGUpLCF0LmRlbGF1bmF5KXJldHVybiExO2NvbnN0e2NlbnRlcnM6bixwb2x5Z29uczpzfT10LmRlbGF1bmF5LHI9W107Zm9yKGNvbnN0IG8gb2YgcylpZihvKWZvcihsZXQgYT1vLmxlbmd0aCxjPW9bYS0xXSxsPW9bMF0saD0wO2g8YTtjPWwsbD1vWysraF0pbD5jJiZyLnB1c2goW25bY10sbltsXV0pO3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnJ9fSx0Ll9mb3VuZD12b2lkIDAsdC5maW5kPWZ1bmN0aW9uKGUsbixzKXtpZih0Ll9mb3VuZD10LmRlbGF1bmF5LmZpbmQoZSxuLHQuX2ZvdW5kKSwhc3x8cmkoW2Usbl0sdC5wb2ludHNbdC5fZm91bmRdKTxzKXJldHVybiB0Ll9mb3VuZH0sdC5odWxsPWZ1bmN0aW9uKGUpe2UhPT12b2lkIDAmJnQoZSk7Y29uc3Qgbj10LmRlbGF1bmF5Lmh1bGwscz10LnBvaW50cztyZXR1cm4gbi5sZW5ndGg9PT0wP251bGw6e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltbLi4ubi5tYXAocj0+c1tyXSksc1tuWzBdXV1dfX0saT90KGkpOnR9ZnVuY3Rpb24gYm0oaSx0KXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOmJyZWFrO2Nhc2UgMTp0aGlzLnJhbmdlKGkpO2JyZWFrO2RlZmF1bHQ6dGhpcy5yYW5nZSh0KS5kb21haW4oaSk7YnJlYWt9cmV0dXJuIHRoaXN9ZnVuY3Rpb24gcmMoaSx0LGUpe2kucHJvdG90eXBlPXQucHJvdG90eXBlPWUsZS5jb25zdHJ1Y3Rvcj1pfWZ1bmN0aW9uIGx1KGksdCl7dmFyIGU9T2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSk7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIG5zKCl7fXZhciBpcz0uNyxVcj0xL2lzLGZpPSJcXHMqKFsrLV0/XFxkKylcXHMqIixzcz0iXFxzKihbKy1dPyg/OlxcZCpcXC4pP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pXFxzKiIsQWU9IlxccyooWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixNbT0vXiMoWzAtOWEtZl17Myw4fSkkLyxBbT1uZXcgUmVnRXhwKGBecmdiXFwoJHtmaX0sJHtmaX0sJHtmaX1cXCkkYCksX209bmV3IFJlZ0V4cChgXnJnYlxcKCR7QWV9LCR7QWV9LCR7QWV9XFwpJGApLHZtPW5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtmaX0sJHtmaX0sJHtmaX0sJHtzc31cXCkkYCksU209bmV3IFJlZ0V4cChgXnJnYmFcXCgke0FlfSwke0FlfSwke0FlfSwke3NzfVxcKSRgKSx6bT1uZXcgUmVnRXhwKGBeaHNsXFwoJHtzc30sJHtBZX0sJHtBZX1cXCkkYCksVG09bmV3IFJlZ0V4cChgXmhzbGFcXCgke3NzfSwke0FlfSwke0FlfSwke3NzfVxcKSRgKSxodT17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtyYyhucyxycyx7Y29weShpKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLGkpfSxkaXNwbGF5YWJsZSgpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDp1dSxmb3JtYXRIZXg6dXUsZm9ybWF0SGV4ODpQbSxmb3JtYXRIc2w6RW0sZm9ybWF0UmdiOmZ1LHRvU3RyaW5nOmZ1fSk7ZnVuY3Rpb24gdXUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKX1mdW5jdGlvbiBQbSgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleDgoKX1mdW5jdGlvbiBFbSgpe3JldHVybiBndSh0aGlzKS5mb3JtYXRIc2woKX1mdW5jdGlvbiBmdSgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpfWZ1bmN0aW9uIHJzKGkpe3ZhciB0LGU7cmV0dXJuIGk9KGkrIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCh0PU1tLmV4ZWMoaSkpPyhlPXRbMV0ubGVuZ3RoLHQ9cGFyc2VJbnQodFsxXSwxNiksZT09PTY/ZHUodCk6ZT09PTM/bmV3IE90KHQ+PjgmMTV8dD4+NCYyNDAsdD4+NCYxNXx0JjI0MCwodCYxNSk8PDR8dCYxNSwxKTplPT09OD9Wcih0Pj4yNCYyNTUsdD4+MTYmMjU1LHQ+PjgmMjU1LCh0JjI1NSkvMjU1KTplPT09ND9Wcih0Pj4xMiYxNXx0Pj44JjI0MCx0Pj44JjE1fHQ+PjQmMjQwLHQ+PjQmMTV8dCYyNDAsKCh0JjE1KTw8NHx0JjE1KS8yNTUpOm51bGwpOih0PUFtLmV4ZWMoaSkpP25ldyBPdCh0WzFdLHRbMl0sdFszXSwxKToodD1fbS5leGVjKGkpKT9uZXcgT3QodFsxXSoyNTUvMTAwLHRbMl0qMjU1LzEwMCx0WzNdKjI1NS8xMDAsMSk6KHQ9dm0uZXhlYyhpKSk/VnIodFsxXSx0WzJdLHRbM10sdFs0XSk6KHQ9U20uZXhlYyhpKSk/VnIodFsxXSoyNTUvMTAwLHRbMl0qMjU1LzEwMCx0WzNdKjI1NS8xMDAsdFs0XSk6KHQ9em0uZXhlYyhpKSk/bXUodFsxXSx0WzJdLzEwMCx0WzNdLzEwMCwxKToodD1UbS5leGVjKGkpKT9tdSh0WzFdLHRbMl0vMTAwLHRbM10vMTAwLHRbNF0pOmh1Lmhhc093blByb3BlcnR5KGkpP2R1KGh1W2ldKTppPT09InRyYW5zcGFyZW50Ij9uZXcgT3QoTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBkdShpKXtyZXR1cm4gbmV3IE90KGk+PjE2JjI1NSxpPj44JjI1NSxpJjI1NSwxKX1mdW5jdGlvbiBWcihpLHQsZSxuKXtyZXR1cm4gbjw9MCYmKGk9dD1lPU5hTiksbmV3IE90KGksdCxlLG4pfWZ1bmN0aW9uIENtKGkpe3JldHVybiBpIGluc3RhbmNlb2YgbnN8fChpPXJzKGkpKSxpPyhpPWkucmdiKCksbmV3IE90KGkucixpLmcsaS5iLGkub3BhY2l0eSkpOm5ldyBPdH1mdW5jdGlvbiBvYyhpLHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/Q20oaSk6bmV3IE90KGksdCxlLG49PW51bGw/MTpuKX1mdW5jdGlvbiBPdChpLHQsZSxuKXt0aGlzLnI9K2ksdGhpcy5nPSt0LHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K259cmMoT3Qsb2MsbHUobnMse2JyaWdodGVyKGkpe3JldHVybiBpPWk9PW51bGw/VXI6TWF0aC5wb3coVXIsaSksbmV3IE90KHRoaXMucippLHRoaXMuZyppLHRoaXMuYippLHRoaXMub3BhY2l0eSl9LGRhcmtlcihpKXtyZXR1cm4gaT1pPT1udWxsP2lzOk1hdGgucG93KGlzLGkpLG5ldyBPdCh0aGlzLnIqaSx0aGlzLmcqaSx0aGlzLmIqaSx0aGlzLm9wYWNpdHkpfSxyZ2IoKXtyZXR1cm4gdGhpc30sY2xhbXAoKXtyZXR1cm4gbmV3IE90KFRuKHRoaXMuciksVG4odGhpcy5nKSxUbih0aGlzLmIpLHFyKHRoaXMub3BhY2l0eSkpfSxkaXNwbGF5YWJsZSgpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6cHUsZm9ybWF0SGV4OnB1LGZvcm1hdEhleDg6Qm0sZm9ybWF0UmdiOnl1LHRvU3RyaW5nOnl1fSkpO2Z1bmN0aW9uIHB1KCl7cmV0dXJuYCMke1BuKHRoaXMucil9JHtQbih0aGlzLmcpfSR7UG4odGhpcy5iKX1gfWZ1bmN0aW9uIEJtKCl7cmV0dXJuYCMke1BuKHRoaXMucil9JHtQbih0aGlzLmcpfSR7UG4odGhpcy5iKX0ke1BuKChpc05hTih0aGlzLm9wYWNpdHkpPzE6dGhpcy5vcGFjaXR5KSoyNTUpfWB9ZnVuY3Rpb24geXUoKXtjb25zdCBpPXFyKHRoaXMub3BhY2l0eSk7cmV0dXJuYCR7aT09PTE/InJnYigiOiJyZ2JhKCJ9JHtUbih0aGlzLnIpfSwgJHtUbih0aGlzLmcpfSwgJHtUbih0aGlzLmIpfSR7aT09PTE/IikiOmAsICR7aX0pYH1gfWZ1bmN0aW9uIHFyKGkpe3JldHVybiBpc05hTihpKT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSxpKSl9ZnVuY3Rpb24gVG4oaSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoaSl8fDApKX1mdW5jdGlvbiBQbihpKXtyZXR1cm4gaT1UbihpKSwoaTwxNj8iMCI6IiIpK2kudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIG11KGksdCxlLG4pe3JldHVybiBuPD0wP2k9dD1lPU5hTjplPD0wfHxlPj0xP2k9dD1OYU46dDw9MCYmKGk9TmFOKSxuZXcgeWUoaSx0LGUsbil9ZnVuY3Rpb24gZ3UoaSl7aWYoaSBpbnN0YW5jZW9mIHllKXJldHVybiBuZXcgeWUoaS5oLGkucyxpLmwsaS5vcGFjaXR5KTtpZihpIGluc3RhbmNlb2YgbnN8fChpPXJzKGkpKSwhaSlyZXR1cm4gbmV3IHllO2lmKGkgaW5zdGFuY2VvZiB5ZSlyZXR1cm4gaTtpPWkucmdiKCk7dmFyIHQ9aS5yLzI1NSxlPWkuZy8yNTUsbj1pLmIvMjU1LHM9TWF0aC5taW4odCxlLG4pLHI9TWF0aC5tYXgodCxlLG4pLG89TmFOLGE9ci1zLGM9KHIrcykvMjtyZXR1cm4gYT8odD09PXI/bz0oZS1uKS9hKyhlPG4pKjY6ZT09PXI/bz0obi10KS9hKzI6bz0odC1lKS9hKzQsYS89YzwuNT9yK3M6Mi1yLXMsbyo9NjApOmE9Yz4wJiZjPDE/MDpvLG5ldyB5ZShvLGEsYyxpLm9wYWNpdHkpfWZ1bmN0aW9uIEZtKGksdCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT9ndShpKTpuZXcgeWUoaSx0LGUsbj09bnVsbD8xOm4pfWZ1bmN0aW9uIHllKGksdCxlLG4pe3RoaXMuaD0raSx0aGlzLnM9K3QsdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rbn1yYyh5ZSxGbSxsdShucyx7YnJpZ2h0ZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9VcjpNYXRoLnBvdyhVcixpKSxuZXcgeWUodGhpcy5oLHRoaXMucyx0aGlzLmwqaSx0aGlzLm9wYWNpdHkpfSxkYXJrZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9pczpNYXRoLnBvdyhpcyxpKSxuZXcgeWUodGhpcy5oLHRoaXMucyx0aGlzLmwqaSx0aGlzLm9wYWNpdHkpfSxyZ2IoKXt2YXIgaT10aGlzLmglMzYwKyh0aGlzLmg8MCkqMzYwLHQ9aXNOYU4oaSl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsZT10aGlzLmwsbj1lKyhlPC41P2U6MS1lKSp0LHM9MiplLW47cmV0dXJuIG5ldyBPdChhYyhpPj0yNDA/aS0yNDA6aSsxMjAscyxuKSxhYyhpLHMsbiksYWMoaTwxMjA/aSsyNDA6aS0xMjAscyxuKSx0aGlzLm9wYWNpdHkpfSxjbGFtcCgpe3JldHVybiBuZXcgeWUoeHUodGhpcy5oKSxIcih0aGlzLnMpLEhyKHRoaXMubCkscXIodGhpcy5vcGFjaXR5KSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxmb3JtYXRIc2woKXtjb25zdCBpPXFyKHRoaXMub3BhY2l0eSk7cmV0dXJuYCR7aT09PTE/ImhzbCgiOiJoc2xhKCJ9JHt4dSh0aGlzLmgpfSwgJHtIcih0aGlzLnMpKjEwMH0lLCAke0hyKHRoaXMubCkqMTAwfSUke2k9PT0xPyIpIjpgLCAke2l9KWB9YH19KSk7ZnVuY3Rpb24geHUoaSl7cmV0dXJuIGk9KGl8fDApJTM2MCxpPDA/aSszNjA6aX1mdW5jdGlvbiBIcihpKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigxLGl8fDApKX1mdW5jdGlvbiBhYyhpLHQsZSl7cmV0dXJuKGk8NjA/dCsoZS10KSppLzYwOmk8MTgwP2U6aTwyNDA/dCsoZS10KSooMjQwLWkpLzYwOnQpKjI1NX12YXIgY2M9aT0+KCk9Pmk7ZnVuY3Rpb24gSW0oaSx0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGkrZSp0fX1mdW5jdGlvbiBrbShpLHQsZSl7cmV0dXJuIGk9TWF0aC5wb3coaSxlKSx0PU1hdGgucG93KHQsZSktaSxlPTEvZSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3coaStuKnQsZSl9fWZ1bmN0aW9uIE5tKGkpe3JldHVybihpPStpKT09MT93dTpmdW5jdGlvbih0LGUpe3JldHVybiBlLXQ/a20odCxlLGkpOmNjKGlzTmFOKHQpP2U6dCl9fWZ1bmN0aW9uIHd1KGksdCl7dmFyIGU9dC1pO3JldHVybiBlP0ltKGksZSk6Y2MoaXNOYU4oaSk/dDppKX12YXIgYnU9ZnVuY3Rpb24gaSh0KXt2YXIgZT1ObSh0KTtmdW5jdGlvbiBuKHMscil7dmFyIG89ZSgocz1vYyhzKSkuciwocj1vYyhyKSkuciksYT1lKHMuZyxyLmcpLGM9ZShzLmIsci5iKSxsPXd1KHMub3BhY2l0eSxyLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihoKXtyZXR1cm4gcy5yPW8oaCkscy5nPWEoaCkscy5iPWMoaCkscy5vcGFjaXR5PWwoaCkscysiIn19cmV0dXJuIG4uZ2FtbWE9aSxufSgxKTtmdW5jdGlvbiBSbShpLHQpe3R8fCh0PVtdKTt2YXIgZT1pP01hdGgubWluKHQubGVuZ3RoLGkubGVuZ3RoKTowLG49dC5zbGljZSgpLHM7cmV0dXJuIGZ1bmN0aW9uKHIpe2ZvcihzPTA7czxlOysrcyluW3NdPWlbc10qKDEtcikrdFtzXSpyO3JldHVybiBufX1mdW5jdGlvbiBMbShpKXtyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGkpJiYhKGkgaW5zdGFuY2VvZiBEYXRhVmlldyl9ZnVuY3Rpb24gT20oaSx0KXt2YXIgZT10P3QubGVuZ3RoOjAsbj1pP01hdGgubWluKGUsaS5sZW5ndGgpOjAscz1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkoZSksbztmb3Iobz0wO288bjsrK28pc1tvXT11YyhpW29dLHRbb10pO2Zvcig7bzxlOysrbylyW29dPXRbb107cmV0dXJuIGZ1bmN0aW9uKGEpe2ZvcihvPTA7bzxuOysrbylyW29dPXNbb10oYSk7cmV0dXJuIHJ9fWZ1bmN0aW9uIERtKGksdCl7dmFyIGU9bmV3IERhdGU7cmV0dXJuIGk9K2ksdD0rdCxmdW5jdGlvbihuKXtyZXR1cm4gZS5zZXRUaW1lKGkqKDEtbikrdCpuKSxlfX1mdW5jdGlvbiBXcihpLHQpe3JldHVybiBpPStpLHQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIGkqKDEtZSkrdCplfX1mdW5jdGlvbiAkbShpLHQpe3ZhciBlPXt9LG49e30sczsoaT09PW51bGx8fHR5cGVvZiBpIT0ib2JqZWN0IikmJihpPXt9KSwodD09PW51bGx8fHR5cGVvZiB0IT0ib2JqZWN0IikmJih0PXt9KTtmb3IocyBpbiB0KXMgaW4gaT9lW3NdPXVjKGlbc10sdFtzXSk6bltzXT10W3NdO3JldHVybiBmdW5jdGlvbihyKXtmb3IocyBpbiBlKW5bc109ZVtzXShyKTtyZXR1cm4gbn19dmFyIGxjPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxoYz1uZXcgUmVnRXhwKGxjLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIFVtKGkpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBpfX1mdW5jdGlvbiBWbShpKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkodCkrIiJ9fWZ1bmN0aW9uIHFtKGksdCl7dmFyIGU9bGMubGFzdEluZGV4PWhjLmxhc3RJbmRleD0wLG4scyxyLG89LTEsYT1bXSxjPVtdO2ZvcihpPWkrIiIsdD10KyIiOyhuPWxjLmV4ZWMoaSkpJiYocz1oYy5leGVjKHQpKTspKHI9cy5pbmRleCk+ZSYmKHI9dC5zbGljZShlLHIpLGFbb10/YVtvXSs9cjphWysrb109ciksKG49blswXSk9PT0ocz1zWzBdKT9hW29dP2Fbb10rPXM6YVsrK29dPXM6KGFbKytvXT1udWxsLGMucHVzaCh7aTpvLHg6V3IobixzKX0pKSxlPWhjLmxhc3RJbmRleDtyZXR1cm4gZTx0Lmxlbmd0aCYmKHI9dC5zbGljZShlKSxhW29dP2Fbb10rPXI6YVsrK29dPXIpLGEubGVuZ3RoPDI/Y1swXT9WbShjWzBdLngpOlVtKHQpOih0PWMubGVuZ3RoLGZ1bmN0aW9uKGwpe2Zvcih2YXIgaD0wLHU7aDx0OysraClhWyh1PWNbaF0pLmldPXUueChsKTtyZXR1cm4gYS5qb2luKCIiKX0pfWZ1bmN0aW9uIHVjKGksdCl7dmFyIGU9dHlwZW9mIHQsbjtyZXR1cm4gdD09bnVsbHx8ZT09PSJib29sZWFuIj9jYyh0KTooZT09PSJudW1iZXIiP1dyOmU9PT0ic3RyaW5nIj8obj1ycyh0KSk/KHQ9bixidSk6cW06dCBpbnN0YW5jZW9mIHJzP2J1OnQgaW5zdGFuY2VvZiBEYXRlP0RtOkxtKHQpP1JtOkFycmF5LmlzQXJyYXkodCk/T206dHlwZW9mIHQudmFsdWVPZiE9ImZ1bmN0aW9uIiYmdHlwZW9mIHQudG9TdHJpbmchPSJmdW5jdGlvbiJ8fGlzTmFOKHQpPyRtOldyKShpLHQpfWZ1bmN0aW9uIEhtKGksdCl7cmV0dXJuIGk9K2ksdD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5yb3VuZChpKigxLWUpK3QqZSl9fWZ1bmN0aW9uIFdtKGkpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBpfX1mdW5jdGlvbiBHbShpKXtyZXR1cm4raX12YXIgTXU9WzAsMV07ZnVuY3Rpb24gZGkoaSl7cmV0dXJuIGl9ZnVuY3Rpb24gZmMoaSx0KXtyZXR1cm4odC09aT0raSk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtaSkvdH06V20oaXNOYU4odCk/TmFOOi41KX1mdW5jdGlvbiBabShpLHQpe3ZhciBlO3JldHVybiBpPnQmJihlPWksaT10LHQ9ZSksZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubWF4KGksTWF0aC5taW4odCxuKSl9fWZ1bmN0aW9uIFhtKGksdCxlKXt2YXIgbj1pWzBdLHM9aVsxXSxyPXRbMF0sbz10WzFdO3JldHVybiBzPG4/KG49ZmMocyxuKSxyPWUobyxyKSk6KG49ZmMobixzKSxyPWUocixvKSksZnVuY3Rpb24oYSl7cmV0dXJuIHIobihhKSl9fWZ1bmN0aW9uIEptKGksdCxlKXt2YXIgbj1NYXRoLm1pbihpLmxlbmd0aCx0Lmxlbmd0aCktMSxzPW5ldyBBcnJheShuKSxyPW5ldyBBcnJheShuKSxvPS0xO2ZvcihpW25dPGlbMF0mJihpPWkuc2xpY2UoKS5yZXZlcnNlKCksdD10LnNsaWNlKCkucmV2ZXJzZSgpKTsrK288bjspc1tvXT1mYyhpW29dLGlbbysxXSkscltvXT1lKHRbb10sdFtvKzFdKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9ajAoaSxhLDEsbiktMTtyZXR1cm4gcltjXShzW2NdKGEpKX19ZnVuY3Rpb24gWW0oaSx0KXtyZXR1cm4gdC5kb21haW4oaS5kb21haW4oKSkucmFuZ2UoaS5yYW5nZSgpKS5pbnRlcnBvbGF0ZShpLmludGVycG9sYXRlKCkpLmNsYW1wKGkuY2xhbXAoKSkudW5rbm93bihpLnVua25vd24oKSl9ZnVuY3Rpb24gam0oKXt2YXIgaT1NdSx0PU11LGU9dWMsbixzLHIsbz1kaSxhLGMsbDtmdW5jdGlvbiBoKCl7dmFyIGY9TWF0aC5taW4oaS5sZW5ndGgsdC5sZW5ndGgpO3JldHVybiBvIT09ZGkmJihvPVptKGlbMF0saVtmLTFdKSksYT1mPjI/Sm06WG0sYz1sPW51bGwsdX1mdW5jdGlvbiB1KGYpe3JldHVybiBmPT1udWxsfHxpc05hTihmPStmKT9yOihjfHwoYz1hKGkubWFwKG4pLHQsZSkpKShuKG8oZikpKX1yZXR1cm4gdS5pbnZlcnQ9ZnVuY3Rpb24oZil7cmV0dXJuIG8ocygobHx8KGw9YSh0LGkubWFwKG4pLFdyKSkpKGYpKSl9LHUuZG9tYWluPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUFycmF5LmZyb20oZixHbSksaCgpKTppLnNsaWNlKCl9LHUucmFuZ2U9ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9QXJyYXkuZnJvbShmKSxoKCkpOnQuc2xpY2UoKX0sdS5yYW5nZVJvdW5kPWZ1bmN0aW9uKGYpe3JldHVybiB0PUFycmF5LmZyb20oZiksZT1IbSxoKCl9LHUuY2xhbXA9ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89Zj8hMDpkaSxoKCkpOm8hPT1kaX0sdS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1mLGgoKSk6ZX0sdS51bmtub3duPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWYsdSk6cn0sZnVuY3Rpb24oZixkKXtyZXR1cm4gbj1mLHM9ZCxoKCl9fWZ1bmN0aW9uIFFtKCl7cmV0dXJuIGptKCkoZGksZGkpfWZ1bmN0aW9uIEttKGkpe3JldHVybiBNYXRoLmFicyhpPU1hdGgucm91bmQoaSkpPj0xZTIxP2kudG9Mb2NhbGVTdHJpbmcoImVuIikucmVwbGFjZSgvLC9nLCIiKTppLnRvU3RyaW5nKDEwKX1mdW5jdGlvbiBHcihpLHQpe2lmKChlPShpPXQ/aS50b0V4cG9uZW50aWFsKHQtMSk6aS50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgZSxuPWkuc2xpY2UoMCxlKTtyZXR1cm5bbi5sZW5ndGg+MT9uWzBdK24uc2xpY2UoMik6biwraS5zbGljZShlKzEpXX1mdW5jdGlvbiBwaShpKXtyZXR1cm4gaT1HcihNYXRoLmFicyhpKSksaT9pWzFdOk5hTn1mdW5jdGlvbiB0ZyhpLHQpe3JldHVybiBmdW5jdGlvbihlLG4pe2Zvcih2YXIgcz1lLmxlbmd0aCxyPVtdLG89MCxhPWlbMF0sYz0wO3M+MCYmYT4wJiYoYythKzE+biYmKGE9TWF0aC5tYXgoMSxuLWMpKSxyLnB1c2goZS5zdWJzdHJpbmcocy09YSxzK2EpKSwhKChjKz1hKzEpPm4pKTspYT1pW289KG8rMSklaS5sZW5ndGhdO3JldHVybiByLnJldmVyc2UoKS5qb2luKHQpfX1mdW5jdGlvbiBlZyhpKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvWzAtOV0vZyxmdW5jdGlvbihlKXtyZXR1cm4gaVsrZV19KX19dmFyIG5nPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIFpyKGkpe2lmKCEodD1uZy5leGVjKGkpKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiK2kpO3ZhciB0O3JldHVybiBuZXcgZGMoe2ZpbGw6dFsxXSxhbGlnbjp0WzJdLHNpZ246dFszXSxzeW1ib2w6dFs0XSx6ZXJvOnRbNV0sd2lkdGg6dFs2XSxjb21tYTp0WzddLHByZWNpc2lvbjp0WzhdJiZ0WzhdLnNsaWNlKDEpLHRyaW06dFs5XSx0eXBlOnRbMTBdfSl9WnIucHJvdG90eXBlPWRjLnByb3RvdHlwZTtmdW5jdGlvbiBkYyhpKXt0aGlzLmZpbGw9aS5maWxsPT09dm9pZCAwPyIgIjppLmZpbGwrIiIsdGhpcy5hbGlnbj1pLmFsaWduPT09dm9pZCAwPyI+IjppLmFsaWduKyIiLHRoaXMuc2lnbj1pLnNpZ249PT12b2lkIDA/Ii0iOmkuc2lnbisiIix0aGlzLnN5bWJvbD1pLnN5bWJvbD09PXZvaWQgMD8iIjppLnN5bWJvbCsiIix0aGlzLnplcm89ISFpLnplcm8sdGhpcy53aWR0aD1pLndpZHRoPT09dm9pZCAwP3ZvaWQgMDoraS53aWR0aCx0aGlzLmNvbW1hPSEhaS5jb21tYSx0aGlzLnByZWNpc2lvbj1pLnByZWNpc2lvbj09PXZvaWQgMD92b2lkIDA6K2kucHJlY2lzaW9uLHRoaXMudHJpbT0hIWkudHJpbSx0aGlzLnR5cGU9aS50eXBlPT09dm9pZCAwPyIiOmkudHlwZSsiIn1kYy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsodGhpcy53aWR0aD09PXZvaWQgMD8iIjpNYXRoLm1heCgxLHRoaXMud2lkdGh8MCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKHRoaXMucHJlY2lzaW9uPT09dm9pZCAwPyIiOiIuIitNYXRoLm1heCgwLHRoaXMucHJlY2lzaW9ufDApKSsodGhpcy50cmltPyJ+IjoiIikrdGhpcy50eXBlfTtmdW5jdGlvbiBpZyhpKXt0OmZvcih2YXIgdD1pLmxlbmd0aCxlPTEsbj0tMSxzO2U8dDsrK2Upc3dpdGNoKGlbZV0pe2Nhc2UiLiI6bj1zPWU7YnJlYWs7Y2FzZSIwIjpuPT09MCYmKG49ZSkscz1lO2JyZWFrO2RlZmF1bHQ6aWYoIStpW2VdKWJyZWFrIHQ7bj4wJiYobj0wKTticmVha31yZXR1cm4gbj4wP2kuc2xpY2UoMCxuKStpLnNsaWNlKHMrMSk6aX12YXIgQXU7ZnVuY3Rpb24gc2coaSx0KXt2YXIgZT1HcihpLHQpO2lmKCFlKXJldHVybiBpKyIiO3ZhciBuPWVbMF0scz1lWzFdLHI9cy0oQXU9TWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHMvMykpKSozKSsxLG89bi5sZW5ndGg7cmV0dXJuIHI9PT1vP246cj5vP24rbmV3IEFycmF5KHItbysxKS5qb2luKCIwIik6cj4wP24uc2xpY2UoMCxyKSsiLiIrbi5zbGljZShyKToiMC4iK25ldyBBcnJheSgxLXIpLmpvaW4oIjAiKStHcihpLE1hdGgubWF4KDAsdCtyLTEpKVswXX1mdW5jdGlvbiBfdShpLHQpe3ZhciBlPUdyKGksdCk7aWYoIWUpcmV0dXJuIGkrIiI7dmFyIG49ZVswXSxzPWVbMV07cmV0dXJuIHM8MD8iMC4iK25ldyBBcnJheSgtcykuam9pbigiMCIpK246bi5sZW5ndGg+cysxP24uc2xpY2UoMCxzKzEpKyIuIituLnNsaWNlKHMrMSk6bituZXcgQXJyYXkocy1uLmxlbmd0aCsyKS5qb2luKCIwIil9dmFyIHZ1PXsiJSI6KGksdCk9PihpKjEwMCkudG9GaXhlZCh0KSxiOmk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoMiksYzppPT5pKyIiLGQ6S20sZTooaSx0KT0+aS50b0V4cG9uZW50aWFsKHQpLGY6KGksdCk9PmkudG9GaXhlZCh0KSxnOihpLHQpPT5pLnRvUHJlY2lzaW9uKHQpLG86aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZyg4KSxwOihpLHQpPT5fdShpKjEwMCx0KSxyOl91LHM6c2csWDppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLHg6aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZygxNil9O2Z1bmN0aW9uIFN1KGkpe3JldHVybiBpfXZhciB6dT1BcnJheS5wcm90b3R5cGUubWFwLFR1PVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiByZyhpKXt2YXIgdD1pLmdyb3VwaW5nPT09dm9pZCAwfHxpLnRob3VzYW5kcz09PXZvaWQgMD9TdTp0Zyh6dS5jYWxsKGkuZ3JvdXBpbmcsTnVtYmVyKSxpLnRob3VzYW5kcysiIiksZT1pLmN1cnJlbmN5PT09dm9pZCAwPyIiOmkuY3VycmVuY3lbMF0rIiIsbj1pLmN1cnJlbmN5PT09dm9pZCAwPyIiOmkuY3VycmVuY3lbMV0rIiIscz1pLmRlY2ltYWw9PT12b2lkIDA/Ii4iOmkuZGVjaW1hbCsiIixyPWkubnVtZXJhbHM9PT12b2lkIDA/U3U6ZWcoenUuY2FsbChpLm51bWVyYWxzLFN0cmluZykpLG89aS5wZXJjZW50PT09dm9pZCAwPyIlIjppLnBlcmNlbnQrIiIsYT1pLm1pbnVzPT09dm9pZCAwPyLiiJIiOmkubWludXMrIiIsYz1pLm5hbj09PXZvaWQgMD8iTmFOIjppLm5hbisiIjtmdW5jdGlvbiBsKHUpe3U9WnIodSk7dmFyIGY9dS5maWxsLGQ9dS5hbGlnbixwPXUuc2lnbix5PXUuc3ltYm9sLG09dS56ZXJvLGc9dS53aWR0aCxiPXUuY29tbWEsdz11LnByZWNpc2lvbix4PXUudHJpbSxNPXUudHlwZTtNPT09Im4iPyhiPSEwLE09ImciKTp2dVtNXXx8KHc9PT12b2lkIDAmJih3PTEyKSx4PSEwLE09ImciKSwobXx8Zj09PSIwIiYmZD09PSI9IikmJihtPSEwLGY9IjAiLGQ9Ij0iKTt2YXIgQT15PT09IiQiP2U6eT09PSIjIiYmL1tib3hYXS8udGVzdChNKT8iMCIrTS50b0xvd2VyQ2FzZSgpOiIiLF89eT09PSIkIj9uOi9bJXBdLy50ZXN0KE0pP286IiIsdj12dVtNXSxQPS9bZGVmZ3BycyVdLy50ZXN0KE0pO3c9dz09PXZvaWQgMD82Oi9bZ3Byc10vLnRlc3QoTSk/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSx3KSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCx3KSk7ZnVuY3Rpb24geihTKXt2YXIgQz1BLEU9XyxGLEIsSTtpZihNPT09ImMiKUU9dihTKStFLFM9IiI7ZWxzZXtTPStTO3ZhciBrPVM8MHx8MS9TPDA7aWYoUz1pc05hTihTKT9jOnYoTWF0aC5hYnMoUyksdykseCYmKFM9aWcoUykpLGsmJitTPT0wJiZwIT09IisiJiYoaz0hMSksQz0oaz9wPT09IigiP3A6YTpwPT09Ii0ifHxwPT09IigiPyIiOnApK0MsRT0oTT09PSJzIj9UdVs4K0F1LzNdOiIiKStFKyhrJiZwPT09IigiPyIpIjoiIiksUCl7Zm9yKEY9LTEsQj1TLmxlbmd0aDsrK0Y8QjspaWYoST1TLmNoYXJDb2RlQXQoRiksNDg+SXx8ST41Nyl7RT0oST09PTQ2P3MrUy5zbGljZShGKzEpOlMuc2xpY2UoRikpK0UsUz1TLnNsaWNlKDAsRik7YnJlYWt9fX1iJiYhbSYmKFM9dChTLDEvMCkpO3ZhciBEPUMubGVuZ3RoK1MubGVuZ3RoK0UubGVuZ3RoLFY9RDxnP25ldyBBcnJheShnLUQrMSkuam9pbihmKToiIjtzd2l0Y2goYiYmbSYmKFM9dChWK1MsVi5sZW5ndGg/Zy1FLmxlbmd0aDoxLzApLFY9IiIpLGQpe2Nhc2UiPCI6Uz1DK1MrRStWO2JyZWFrO2Nhc2UiPSI6Uz1DK1YrUytFO2JyZWFrO2Nhc2UiXiI6Uz1WLnNsaWNlKDAsRD1WLmxlbmd0aD4+MSkrQytTK0UrVi5zbGljZShEKTticmVhaztkZWZhdWx0OlM9VitDK1MrRTticmVha31yZXR1cm4gcihTKX1yZXR1cm4gei50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB1KyIifSx6fWZ1bmN0aW9uIGgodSxmKXt2YXIgZD1sKCh1PVpyKHUpLHUudHlwZT0iZiIsdSkpLHA9TWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHBpKGYpLzMpKSkqMyx5PU1hdGgucG93KDEwLC1wKSxtPVR1WzgrcC8zXTtyZXR1cm4gZnVuY3Rpb24oZyl7cmV0dXJuIGQoeSpnKSttfX1yZXR1cm57Zm9ybWF0OmwsZm9ybWF0UHJlZml4Omh9fXZhciBYcixQdSxFdTtvZyh7dGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KTtmdW5jdGlvbiBvZyhpKXtyZXR1cm4gWHI9cmcoaSksUHU9WHIuZm9ybWF0LEV1PVhyLmZvcm1hdFByZWZpeCxYcn1mdW5jdGlvbiBhZyhpKXtyZXR1cm4gTWF0aC5tYXgoMCwtcGkoTWF0aC5hYnMoaSkpKX1mdW5jdGlvbiBjZyhpLHQpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihwaSh0KS8zKSkpKjMtcGkoTWF0aC5hYnMoaSkpKX1mdW5jdGlvbiBsZyhpLHQpe3JldHVybiBpPU1hdGguYWJzKGkpLHQ9TWF0aC5hYnModCktaSxNYXRoLm1heCgwLHBpKHQpLXBpKGkpKSsxfWZ1bmN0aW9uIGhnKGksdCxlLG4pe3ZhciBzPW5wKGksdCxlKSxyO3N3aXRjaChuPVpyKG49PW51bGw/IixmIjpuKSxuLnR5cGUpe2Nhc2UicyI6e3ZhciBvPU1hdGgubWF4KE1hdGguYWJzKGkpLE1hdGguYWJzKHQpKTtyZXR1cm4gbi5wcmVjaXNpb249PW51bGwmJiFpc05hTihyPWNnKHMsbykpJiYobi5wcmVjaXNpb249ciksRXUobixvKX1jYXNlIiI6Y2FzZSJlIjpjYXNlImciOmNhc2UicCI6Y2FzZSJyIjp7bi5wcmVjaXNpb249PW51bGwmJiFpc05hTihyPWxnKHMsTWF0aC5tYXgoTWF0aC5hYnMoaSksTWF0aC5hYnModCkpKSkmJihuLnByZWNpc2lvbj1yLShuLnR5cGU9PT0iZSIpKTticmVha31jYXNlImYiOmNhc2UiJSI6e24ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocj1hZyhzKSkmJihuLnByZWNpc2lvbj1yLShuLnR5cGU9PT0iJSIpKjIpO2JyZWFrfX1yZXR1cm4gUHUobil9ZnVuY3Rpb24gdWcoaSl7dmFyIHQ9aS5kb21haW47cmV0dXJuIGkudGlja3M9ZnVuY3Rpb24oZSl7dmFyIG49dCgpO3JldHVybiBlcChuWzBdLG5bbi5sZW5ndGgtMV0sZT09bnVsbD8xMDplKX0saS50aWNrRm9ybWF0PWZ1bmN0aW9uKGUsbil7dmFyIHM9dCgpO3JldHVybiBoZyhzWzBdLHNbcy5sZW5ndGgtMV0sZT09bnVsbD8xMDplLG4pfSxpLm5pY2U9ZnVuY3Rpb24oZSl7ZT09bnVsbCYmKGU9MTApO3ZhciBuPXQoKSxzPTAscj1uLmxlbmd0aC0xLG89bltzXSxhPW5bcl0sYyxsLGg9MTA7Zm9yKGE8byYmKGw9byxvPWEsYT1sLGw9cyxzPXIscj1sKTtoLS0gPjA7KXtpZihsPU1hKG8sYSxlKSxsPT09YylyZXR1cm4gbltzXT1vLG5bcl09YSx0KG4pO2lmKGw+MClvPU1hdGguZmxvb3Ioby9sKSpsLGE9TWF0aC5jZWlsKGEvbCkqbDtlbHNlIGlmKGw8MClvPU1hdGguY2VpbChvKmwpL2wsYT1NYXRoLmZsb29yKGEqbCkvbDtlbHNlIGJyZWFrO2M9bH1yZXR1cm4gaX0saX1mdW5jdGlvbiBwYygpe3ZhciBpPVFtKCk7cmV0dXJuIGkuY29weT1mdW5jdGlvbigpe3JldHVybiBZbShpLHBjKCkpfSxibS5hcHBseShpLGFyZ3VtZW50cyksdWcoaSl9ZnVuY3Rpb24gZmcoaSx0KXtyZXR1cm4gaS5tYXAoZT0+e2NvbnN0IG49W107bGV0IHM7cmV0dXJuIGUuZm9yRWFjaChyPT57aWYocyl7Y29uc3Qgbz1yaShyLHMpKjE4MC9NYXRoLlBJO2lmKG8+dCl7Y29uc3QgYT1PcChzLHIpLGM9MS9NYXRoLmNlaWwoby90KTtsZXQgbD1jO2Zvcig7bDwxOyluLnB1c2goYShsKSksbCs9Y319bi5wdXNoKHM9cil9KSxufSl9ZnVuY3Rpb24gZGcoaSx7bWluTG5nOnQsbWF4TG5nOmUsbWluTGF0Om4sbWF4TGF0OnN9PXt9KXtjb25zdCByPU1hdGgucm91bmQoeWkoMzYwL2ksMikvTWF0aC5QSSksbz0oMStNYXRoLnNxcnQoNSkpLzIsYT1kPT5kL28qMzYwJTM2MC0xODAsYz1kPT5NYXRoLmFjb3MoMipkL3ItMSkvTWF0aC5QSSoxODAtOTAsbD1kPT5yKihNYXRoLmNvcygoZCs5MCkqTWF0aC5QSS8xODApKzEpLzIsaD1bcyE9PXZvaWQgMD9NYXRoLmNlaWwobChzKSk6MCxuIT09dm9pZCAwP01hdGguZmxvb3IobChuKSk6ci0xXSx1PXQ9PT12b2lkIDAmJmU9PT12b2lkIDA/KCk9PiEwOnQ9PT12b2lkIDA/ZD0+ZDw9ZTplPT09dm9pZCAwP2Q9PmQ+PXQ6ZT49dD9kPT5kPj10JiZkPD1lOmQ9PmQ+PXR8fGQ8PWUsZj1bXTtmb3IobGV0IGQ9aFswXTtkPD1oWzFdO2QrKyl7Y29uc3QgcD1hKGQpO3UocCkmJmYucHVzaChbcCxjKGQpXSl9cmV0dXJuIGZ9ZnVuY3Rpb24geWMoaSx0LGU9ITEpe3JldHVybiBlP0xwKHQsaSk6WHkoaSx0KX1mdW5jdGlvbiBwZyhpLHQpe2NvbnN0IGU9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOml9LFtbbixzXSxbcixvXV09bGgoZSk7aWYoTWF0aC5taW4oTWF0aC5hYnMoci1uKSxNYXRoLmFicyhvLXMpKTx0KXJldHVybltdO2NvbnN0IGE9bj5yfHxvPj04OXx8czw9LTg5O3JldHVybiBkZyh0LHttaW5Mbmc6bixtYXhMbmc6cixtaW5MYXQ6cyxtYXhMYXQ6b30pLmZpbHRlcihjPT55YyhjLGUsYSkpfWZ1bmN0aW9uIHlnKGkse3Jlc29sdXRpb246dD0xLzAsYmJveDplLHByb2plY3Rpb246bn09e30pe2NvbnN0IHM9ZmcoaSx0KSxyPVVpKHMpLG89cGcoaSx0KSxhPVsuLi5yLC4uLm9dLGM9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOml9LFtbbCxoXSxbdSxmXV09bGgoYyksZD1sPnV8fGY+PTg5fHxoPD0tODk7bGV0IHA9W107aWYoZCl7Y29uc3QgTT13bShhKS50cmlhbmdsZXMoKSxBPW5ldyBNYXAoYS5tYXAoKFtfLHZdLFApPT5bYCR7X30tJHt2fWAsUF0pKTtNLmZlYXR1cmVzLmZvckVhY2goXz0+e2NvbnN0IHY9Xy5nZW9tZXRyeS5jb29yZGluYXRlc1swXS5zbGljZSgwLDMpLnJldmVyc2UoKSxQPVtdO2lmKHYuZm9yRWFjaCgoW3osU10pPT57Y29uc3QgQz1gJHt6fS0ke1N9YDtBLmhhcyhDKSYmUC5wdXNoKEEuZ2V0KEMpKX0pLFAubGVuZ3RoPT09Myl7aWYoUC5zb21lKHo9Pno8ci5sZW5ndGgpKXtjb25zdCB6PV8ucHJvcGVydGllcy5jaXJjdW1jZW50ZXI7aWYoIXljKHosYyxkKSlyZXR1cm59cC5wdXNoKC4uLlApfX0pfWVsc2UgaWYoby5sZW5ndGgpe2NvbnN0IE09dHMuZnJvbShhKTtmb3IobGV0IEE9MCxfPU0udHJpYW5nbGVzLmxlbmd0aDtBPF87QSs9Myl7Y29uc3Qgdj1bMiwxLDBdLm1hcCh6PT5NLnRyaWFuZ2xlc1tBK3pdKSxQPXYubWFwKHo9PmFbel0pO2lmKHYuc29tZSh6PT56PHIubGVuZ3RoKSl7Y29uc3Qgej1bMCwxXS5tYXAoUz0+aXAoUCxDPT5DW1NdKSk7aWYoIXljKHosYyxkKSljb250aW51ZX1wLnB1c2goLi4udil9fWVsc2V7Y29uc3R7dmVydGljZXM6TSxob2xlczpBPVtdfT1KaChzKTtwPXV5KE0sQSwyKX1sZXQgeT1lP1tlWzBdLGVbMl1dOnNyKGEsTT0+TVswXSksbT1lP1tlWzFdLGVbM11dOnNyKGEsTT0+TVsxXSk7aWYobil7Y29uc3RbTSxBXT1uKFt5WzBdLG1bMF1dKSxbXyx2XT1uKFt5WzFdLG1bMV1dKTt5PVtNLF9dLG09Wy1BLC12XX1jb25zdCBnPXBjKHksWzAsMV0pLGI9cGMobSxbMCwxXSksdz1hLm1hcCgoW00sQV0pPT57aWYobil7Y29uc3RbXyx2XT1uKFtNLEFdKTtyZXR1cm5bZyhfKSxiKC12KV19ZWxzZSByZXR1cm5bZyhNKSxiKEEpXX0pO3JldHVybntjb250b3VyOnMsdHJpYW5nbGVzOntwb2ludHM6YSxpbmRpY2VzOnAsdXZzOnd9fX1jb25zdCBDdT1uZXcgdWUoKS5zZXRBdHRyaWJ1dGU/InNldEF0dHJpYnV0ZSI6ImFkZEF0dHJpYnV0ZSI7ZnVuY3Rpb24gSnIoaSx0LGUsbil7Y29uc3Qgcz1pLm1hcChyPT5yLm1hcCgoW28sYV0pPT57aWYobil7Y29uc3RbYyxsXT1uKFtvLGFdKTtyZXR1cm5bYywtbCx0XX1yZXR1cm4gZT9aMChvLGEsdCk6W28sYSx0XX0pKTtyZXR1cm4gSmgocyl9ZnVuY3Rpb24gbWcoaSx0LGUsbixzKXtjb25zdHt2ZXJ0aWNlczpyLGhvbGVzOm99PUpyKGksdCxuLHMpLHt2ZXJ0aWNlczphfT1KcihpLGUsbixzKSxjPVVpKFthLHJdKSxsPU1hdGgucm91bmQoYS5sZW5ndGgvMyksaD1uZXcgU2V0KG8pO2xldCB1PTA7Y29uc3QgZj1bXTtmb3IobGV0IHA9MDtwPGw7cCsrKXtsZXQgeT1wKzE7aWYoeT09PWwpeT11O2Vsc2UgaWYoaC5oYXMoeSkpe2NvbnN0IG09eTt5PXUsdT1tfWYucHVzaChwLHArbCx5K2wpLGYucHVzaCh5K2wseSxwKX1jb25zdCBkPVtdO2ZvcihsZXQgcD0xO3A+PTA7cC0tKWZvcihsZXQgeT0wO3k8bDt5Kz0xKWQucHVzaCh5LyhsLTEpLHApO3JldHVybntpbmRpY2VzOmYsdmVydGljZXM6Yyx1dnM6ZCx0b3BWZXJ0czphfX1mdW5jdGlvbiBCdShpLHQsZSxuLHMscil7cmV0dXJue2luZGljZXM6bj9pLmluZGljZXM6aS5pbmRpY2VzLnNsaWNlKCkucmV2ZXJzZSgpLHZlcnRpY2VzOkpyKFtpLnBvaW50c10sdCxzLHIpLnZlcnRpY2VzLHV2czplfX1jb25zdCBGdT0oe3BvbHlnb25HZW9Kc29uOmksc3RhcnRIZWlnaHQ6dCxlbmRIZWlnaHQ6ZSxjdXJ2YXR1cmVSZXNvbHV0aW9uOm49MSxjYXJ0ZXNpYW46cz0hMCxoYXNTaWRlOnI9ITAsaGFzQm90dG9tOm89ITEsaGFzVG9wOmE9ITEscHJvamVjdGlvbjpjLGJib3g6bH0pPT57aS5mb3JFYWNoKGc9PntGeShnKXx8Zy5yZXZlcnNlKCl9KTtjb25zdHtjb250b3VyOmgsdHJpYW5nbGVzOnV9PXlnKGkse3Jlc29sdXRpb246bixiYm94OmwscHJvamVjdGlvbjpjfSk7bGV0IGY9e30sZDtyJiYoZj1tZyhoLHQhPW51bGw/dDplLGUhPW51bGw/ZTp0LHMsYyksZD1mLnRvcFZlcnRzKTtsZXQgcD1bXTsob3x8YSkmJihwPVVpKHUudXZzKSk7bGV0IHk9e307byYmKHk9QnUodSx0LHAsITEscyxjKSk7bGV0IG09e307cmV0dXJuIGEmJihtPUJ1KHUsZSxwLCEwLHMsYykpLHtjb250b3VyOmgsdHJpYW5nbGVzOnUsc2lkZVRvcnNvOmYsYm90dG9tQ2FwOnksdG9wQ2FwOm0sdG9wVmVydHM6ZH19O2NsYXNzIGdnIGV4dGVuZHMgdWV7Y29uc3RydWN0b3IodCxlPXt9KXtzdXBlcigpLHRoaXMudHlwZT0iUG9seWdvbkJ1ZmZlckdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9RnQoe3BvbHlnb25HZW9Kc29uOnQsc3RhcnRIZWlnaHQ6MCxlbmRIZWlnaHQ6MSxoYXNUb3A6ITAsdG9wRmlyc3Q6ITEsaGFzQm90dG9tOiEwLGhhc1NpZGU6ITAsY3VydmF0dXJlUmVzb2x1dGlvbjoxLGNhcnRlc2lhbjohMCx1c2VyRGF0YVJzb09mZnNldDowfSxlKTtjb25zdHtlbmRIZWlnaHQ6bixoYXNUb3A6cyx0b3BGaXJzdDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSxjYXJ0ZXNpYW46Yyx1c2VyRGF0YVJzb09mZnNldDpsLHByb2plY3Rpb246aH09dGhpcy5wYXJhbWV0ZXJzLHtjb250b3VyOnUsc2lkZVRvcnNvOmYsdG9wVmVydHM6ZCxib3R0b21DYXA6cCx0b3BDYXA6eX09RnUoRnQoe30sdGhpcy5wYXJhbWV0ZXJzKSk7bGV0IG09W10sZz1bXSxiPVtdLHc9MDtjb25zdCB4PU09Pntjb25zdCBBPU1hdGgucm91bmQobS5sZW5ndGgvMyksXz1iLmxlbmd0aDttPW0uY29uY2F0KE0udmVydGljZXMpLGc9Zy5jb25jYXQoTS51dnMpLGI9Yi5jb25jYXQoQT9NLmluZGljZXMubWFwKHY9PnYrQSk6TS5pbmRpY2VzKSx0aGlzLmFkZEdyb3VwKF8sYi5sZW5ndGgtXyx3KyspfTtzJiZyJiZ4KHkpLGEmJih4KGYpLHRoaXMudXNlckRhdGEudG9wVmVydHM9bD9Kcih1LG4rbCxjLGgpLnZlcnRpY2VzOmQpLG8mJngocCkscyYmIXImJngoeSksdGhpcy5zZXRJbmRleChiKSx0aGlzW0N1XSgicG9zaXRpb24iLG5ldyBCZShtLDMpKSx0aGlzW0N1XSgidXYiLG5ldyBCZShnLDIpKSx0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl9fXZhciB4Zz1pPT57Y29uc3QgYT1pLHtjb29yZGluYXRlOnQsc3RhcnRIZWlnaHQ6ZSxoZWlnaHQ6bn09YSxzPUd1KGEsWyJjb29yZGluYXRlIiwic3RhcnRIZWlnaHQiLCJoZWlnaHQiXSk7bGV0IHI9ZXx8MDtyZXR1cm4gdHlwZW9mIGUhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbiE9InVuZGVmaW5lZCImJihyPWUrbiksbmV3IGdnKFt0XSxaZShGdCh7fSxzKSx7c3RhcnRIZWlnaHQ6ZSxlbmRIZWlnaHQ6cn0pKX07Y29uc3Qgd2c9KHtjb29yZGluYXRlc0FycjppLHN0YXJ0OnQsZGVwdGg6ZSx1c2VHcm91cHM6bixoYXNUb3A6cyx0b3BGaXJzdDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSxjYXJ0ZXNpYW46Yyxwcm9qZWN0aW9uOmwsY3VydmF0dXJlUmVzb2x1dGlvbjpoLGJib3g6dX0pPT57Y29uc3QgZj1sJiZYaShsKTtmJiYoYz0hMSksdHx8KHQ9WzBdKTtjb25zdCBkPWkubWFwKChwLHkpPT57dmFyIG0sZztyZXR1cm4geGcoe2Nvb3JkaW5hdGU6cCxwcm9qZWN0aW9uOmYsc3RhcnRIZWlnaHQ6KG09dFt5XSkhPW51bGw/bTp0WzBdLGhlaWdodDooZz1lW3ldKSE9bnVsbD9nOmVbMF0saGFzVG9wOnMhPW51bGw/czohMCx0b3BGaXJzdDpyIT1udWxsP3I6ITEsaGFzQm90dG9tOm8hPW51bGw/bzohMCxoYXNTaWRlOmEhPW51bGw/YTohMCxjYXJ0ZXNpYW46YyE9bnVsbD9jOiEwLGN1cnZhdHVyZVJlc29sdXRpb246aCE9bnVsbD9oOjEsYmJveDp1fSl9KTtyZXR1cm4gSmkoZCxuKX0sYmc9KHtjb29yZGluYXRlc0FycjppLGxpbmVXaWR0aDp0LHN0YXJ0OmUsdXNlR3JvdXBzOm59KT0+e2NvbnN0IHI9aS5tYXAoKG8sYSk9Pnt2YXIgYztyZXR1cm4gRnUoe3BvbHlnb25HZW9Kc29uOltvXSxzdGFydEhlaWdodDooYz1lW2FdKSE9bnVsbD9jOmVbMF19KS50b3BWZXJ0c30pLm1hcCgobyxhKT0+e3ZhciBsO2NvbnN0IGM9KGw9dFthXSkhPW51bGw/bDp0WzBdO3JldHVybiBIaCh7bm9kZXM6byxzZXRQb2ludFdpZHRoOigpPT5jfSl9KTtyZXR1cm4gSmkocixuKX07dmFyIE1nPShpLHQsZSk9Pm5ldyBQcm9taXNlKChuLHMpPT57dmFyIHI9Yz0+e3RyeXthKGUubmV4dChjKSl9Y2F0Y2gobCl7cyhsKX19LG89Yz0+e3RyeXthKGUudGhyb3coYykpfWNhdGNoKGwpe3MobCl9fSxhPWM9PmMuZG9uZT9uKGMudmFsdWUpOlByb21pc2UucmVzb2x2ZShjLnZhbHVlKS50aGVuKHIsbyk7YSgoZT1lLmFwcGx5KGksdCkpLm5leHQoKSl9KTtmdW5jdGlvbiBBZyhpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaSkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOmlbZV0sZW51bWVyYWJsZTohMH0pfSx7fSl9KGk9Pntjb25zdCB0PXtydW4oZSxuKXtjb25zdCBzPW5ldyBGdW5jdGlvbigicmV0dXJuICgiK2UrIikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsiKTtyZXR1cm4gcy5hcHBseShzLG4pfSxtZXRob2RzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpfX07YWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZT0+TWcodm9pZCAwLFtlXSxmdW5jdGlvbiooe2RhdGE6bn0pe3RyeXtjb25zdCBzPXRbbi5tZXRob2RdO2lmKHMpe2NvbnN0IHI9eWllbGQgcy5hcHBseShzLG4ucGFyYW1zKTtyLnRyYW5zZmVyJiZyLm1lc3NhZ2U/cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0OnIubWVzc2FnZSxlcnJvcjpudWxsfSxyLnRyYW5zZmVyKTpwb3N0TWVzc2FnZSh7aWQ6bi5pZCxyZXN1bHQ6cixlcnJvcjpudWxsfSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbWV0aG9kICInK24ubWV0aG9kKyciJyl9Y2F0Y2gocyl7cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0Om51bGwsZXJyb3I6QWcocyl9KX19KSksT2JqZWN0LmtleXMoaSkuZm9yRWFjaChlPT57dFtlXT1pW2VdfSkscG9zdE1lc3NhZ2UoInJlYWR5Iil9KSh7ZXh0cnVkZVBvbHlnb246cnksbGluZTpjeSxsaW5lMjpoeSxjb25pY1BvbHlnb246d2csY29uaWNMaW5lOmJnfSl9KSgpOwo=",N=m=>Uint8Array.from(atob(m),t=>t.charCodeAt(0)),R=typeof window!="undefined"&&window.Blob&&new Blob([N(o)],{type:"text/javascript;charset=utf-8"});function T(m){let t;try{if(t=R&&(window.URL||window.webkitURL).createObjectURL(R),!t)throw"";const r=new Worker(t,{name:m==null?void 0:m.name});return r.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(t)}),r}catch(r){return new Worker("data:text/javascript;base64,"+o,{name:m==null?void 0:m.name})}finally{t&&(window.URL||window.webkitURL).revokeObjectURL(t)}}const z=m=>{const t=new BufferGeometry;return Object.keys(m).forEach(r=>{r==="groups"?m[r].forEach(d=>{t.addGroup(d.start,d.count,d.materialIndex)}):r==="index"?t.setIndex(new BufferAttribute(m[r].array,m[r].itemSize)):t.setAttribute(r,new BufferAttribute(m[r].array,m[r].itemSize))}),t};class Q{constructor(t){this.pluginName="worker",this.bufferGeometryLoader=new BufferGeometryLoader,this.cacheObj={},this._dispose=!1,this.options=W({dbName:"base",cacheVersion:"1"},t),this.store=createStore(this.options.dbName,"attributes")}install(t){this.pencil=t;const r=new esusLite.WorkerPool(T,{maxWorkers:this.options.maxWorkers});this.pool=r}geoGeometry(t,r){return s(this,null,function*(){const{mesaage:d,cacheKey:g,userData:v,cacheVersion:C,cb:w}=W(W({},this.options),r),I=this.pool,{err:O,res:ye}=yield I.exec(t,[W({},d)],void 0,!0);if(O)throw O;const Se=z(ye);if(Object.assign(Se.userData,W({},v)),w&&(yield w(Se)),g){const{cacheObj:Pe}=this;Pe[g]||(Pe[g]={[C]:[]}),Pe[g][C].push(W({attributes:ye},v))}return Se})}getCachedGeometry(t){return s(this,null,function*(){const{cacheKey:r,cacheVersion:d}=t;if(r){const g=yield get(r,this.store),v=d||this.options.cacheVersion;return g!=null&&g[v]?g[v].map(C=>{const w=C,{attributes:I}=w,O=x(w,["attributes"]),ye=z(I);return Object.assign(ye.userData,W({},O)),ye}):[]}else return[]})}saveCache(){setMany(Object.entries(this.cacheObj),this.store)}dispose(){this.cacheObj={},this.pool.dispose(),this._dispose=!0}}class RoomEnvironment extends Scene{constructor(){super();const t=new BoxGeometry;t.deleteAttribute("uv");const r=new MeshStandardMaterial({side:BackSide}),d=new MeshStandardMaterial,g=new PointLight(16777215,900,28,2);g.position.set(.418,16.199,.3),this.add(g);const v=new Mesh(t,r);v.position.set(-.757,13.219,.717),v.scale.set(31.713,28.305,28.591),this.add(v);const C=new InstancedMesh(t,d,6),w=new Object3D;w.position.set(-10.906,2.009,1.846),w.rotation.set(0,-.195,0),w.scale.set(2.328,7.905,4.651),w.updateMatrix(),C.setMatrixAt(0,w.matrix),w.position.set(-5.607,-.754,-.758),w.rotation.set(0,.994,0),w.scale.set(1.97,1.534,3.955),w.updateMatrix(),C.setMatrixAt(1,w.matrix),w.position.set(6.167,.857,7.803),w.rotation.set(0,.561,0),w.scale.set(3.927,6.285,3.687),w.updateMatrix(),C.setMatrixAt(2,w.matrix),w.position.set(-2.017,.018,6.124),w.rotation.set(0,.333,0),w.scale.set(2.002,4.566,2.064),w.updateMatrix(),C.setMatrixAt(3,w.matrix),w.position.set(2.291,-.756,-2.621),w.rotation.set(0,-.286,0),w.scale.set(1.546,1.552,1.496),w.updateMatrix(),C.setMatrixAt(4,w.matrix),w.position.set(-2.193,-.369,-5.547),w.rotation.set(0,.516,0),w.scale.set(3.875,3.487,2.986),w.updateMatrix(),C.setMatrixAt(5,w.matrix),this.add(C);const I=new Mesh(t,createAreaLightMaterial(50));I.position.set(-16.116,14.37,8.208),I.scale.set(.1,2.428,2.739),this.add(I);const O=new Mesh(t,createAreaLightMaterial(50));O.position.set(-16.109,18.021,-8.207),O.scale.set(.1,2.425,2.751),this.add(O);const ye=new Mesh(t,createAreaLightMaterial(17));ye.position.set(14.904,12.198,-1.832),ye.scale.set(.15,4.265,6.331),this.add(ye);const Se=new Mesh(t,createAreaLightMaterial(43));Se.position.set(-.462,8.89,14.52),Se.scale.set(4.38,5.441,.088),this.add(Se);const Pe=new Mesh(t,createAreaLightMaterial(20));Pe.position.set(3.235,11.486,-12.541),Pe.scale.set(2.5,2,.1),this.add(Pe);const Ne=new Mesh(t,createAreaLightMaterial(100));Ne.position.set(0,20,0),Ne.scale.set(1,.1,1),this.add(Ne)}dispose(){const t=new Set;this.traverse(r=>{r.isMesh&&(t.add(r.geometry),t.add(r.material))});for(const r of t)r.dispose()}}function createAreaLightMaterial(m){const t=new MeshBasicMaterial;return t.color.setScalar(m),t}class Event{constructor(){T0(this,"event",new events.EventEmitter);T0(this,"eventHandlers",{});T0(this,"on",this.event.on.bind(this.event));T0(this,"emit",this.event.emit.bind(this.event))}addListener(t,r,d,g=!1){r in this.eventHandlers||(this.eventHandlers[r]=[]),this.eventHandlers[r].push({node:t,handler:d,capture:g}),t.addEventListener(r,d,g)}removeListener(t,r){this.eventHandlers[r].filter(({node:d})=>t?d===t:!0).forEach(({node:d,handler:g,capture:v})=>d.removeEventListener(r,g,v)),this.eventHandlers[r]=this.eventHandlers[r].filter(({node:d})=>t?d!==t:!1)}removeAllListeners(){Object.keys(this.eventHandlers).forEach(t=>{this.removeListener("",t)}),this.eventHandlers={}}dispose(){this.removeAllListeners(),this.event.removeAllListeners()}}class Camera extends Event{constructor(){super(...arguments);T0(this,"container");T0(this,"pencil");T0(this,"cameraState",{})}setSaveCamera(r){const d=this.pencil,g=d.cameraPositon,v=d.cameraTarget;this.cameraState[r]=[g.x,g.y,g.z,v.x,v.y,v.z]}useSaveCamera(r,d=!1){return U0(this,null,function*(){const g=this.cameraState[r];return g?(yield this.lookAt(g[0],g[1],g[2],g[3],g[4],g[5],d),!0):!1})}lookAt(r,d,g,v,C,w,I=!1,O=250){return U0(this,null,function*(){this.pencil.controls.smoothTime=O/1e3,yield this.pencil.controls.setLookAt(r,d,g,v,C,w,I),this.pencil.controls.smoothTime=250/1e3})}truck(r,d,g=!1,v=250){return U0(this,null,function*(){this.pencil.controls.smoothTime=v/1e3,this.pencil.controls.restThreshold=0,yield this.pencil.controls.truck(r,d,g),this.pencil.controls.restThreshold=.0025,this.pencil.controls.smoothTime=250/1e3})}dollyTo(r,d=!1,g=250){return U0(this,null,function*(){let v=r;if(typeof v=="string"){const[C,w]=v.split("=");C==="+"?v=this.pencil.controls.distance+ +w:C==="-"?v=this.pencil.controls.distance-+w:C==="*"?v=this.pencil.controls.distance*+w:C==="/"?v=this.pencil.controls.distance/+w:console.error("dollyTo distance error")}this.pencil.controls.smoothTime=g/1e3,yield this.pencil.controls.dollyTo(v,d),this.pencil.controls.smoothTime=250/1e3})}absoluteAngle(r,d){const g=Math.PI*2,v=r-d;return MathUtils.euclideanModulo(v+Math.PI,g)-Math.PI}lookAtTarget(r,d=!1,g=250){return U0(this,null,function*(){this.pencil.controls.smoothTime=g/1e3;const v=this.pencil.controls.azimuthAngle,C=this.pencil.controls.polarAngle,w=this.pencil.controls.distance,I=this.pencil.cameraTarget.clone(),O=r.azimuthAngle||v,ye=r.polarAngle||C,Se=r.distance||w,Pe=r.target||I;yield Promise.all([this.pencil.controls.moveTo(Pe.x,Pe.y,Pe.z,d),this.pencil.controls.dollyTo(Se,d),this.pencil.controls.rotateTo(v+this.absoluteAngle(O,v),C+this.absoluteAngle(ye,C),d)]),this.pencil.controls.smoothTime=250/1e3})}paddingInCssPixel(r,d,g,v,C,w){const{camera:I,controls:O}=this.pencil,ye=I.fov*MathUtils.DEG2RAD,Se=this.pencil.getSize().height,{size:Pe}=r.getSize(),Ne=Pe.x,ke=Pe.y,ht=Pe.z;let He=O.getDistanceToFitBox(Ne,ke,ht),Fe=0,at=0,ct=0,xt=0;for(let Gt=0;Gt<10;Gt++){const Lt=He-ht*.5,Wt=2*Math.tan(ye*.5)*Math.abs(Lt)/Se;Fe=d*Wt,at=v*Wt,ct=C*Wt,xt=g*Wt,He=O.getDistanceToFitBox(Ne+ct+xt,ke+Fe+at,ht)}return O.fitToBox(r.object3d,w,{paddingLeft:ct,paddingRight:xt,paddingBottom:at,paddingTop:Fe})}resetCamera(r=!1,d=250){return U0(this,null,function*(){this.pencil.controls.smoothTime=d/1e3,yield this.pencil.controls.reset(r),this.pencil.controls.smoothTime=250/1e3})}unproject(r,d=0){const g=new Vector3,v=new Vector3,{left:C,top:w,width:I,height:O}=this.container.getBoundingClientRect(),ye=(r.clientX-C)/I*2-1,Se=-((r.clientY-w)/O)*2+1,Pe=this.pencil.cameraPositon.clone();g.set(ye,Se,.5),g.unproject(this.pencil.camera),g.sub(Pe).normalize();const Ne=(d-Pe.z)/g.z;return v.copy(Pe).add(g.multiplyScalar(Ne)),v}dispose(){super.dispose(),this.cameraState={}}}class Command{constructor(t){T0(this,"id");T0(this,"updatable");T0(this,"type");T0(this,"name");T0(this,"editor");T0(this,"json",{});this.id=-1,this.updatable=!1,this.type="",this.name="",this.editor=t}toJSON(){const t={};return t.type=this.type,t.id=this.id,t.name=this.name,t.updatable=this.updatable,t}fromJSON(t){if(this.type=t.type,this.id=t.id,this.name=t.name,this.updatable=t.updatable,!this.editor.config.meta.jsonVersion&&t.objectUuid){const r=this.editor.objectByUuid(t.objectUuid);r&&(t.objectUuid=this.editor.uuidByObject(r));const d=this.editor.baseObjectByUuid(t.objectUuid);d&&(t.objectUuid=this.editor.uuidByBaseObject(d))}}fixJSON(){}}class SetColor extends Command{constructor(t,r,d,g){super(t),this.type="SetColor",this.name=`Set ${d}`,this.updatable=!0,this.object=r,this.attributeName=d,this.oldValue=r!==void 0?this.object[this.attributeName].getHex():void 0,this.newValue=g}execute(){this.object&&(this.object[this.attributeName].setHex(this.newValue),this.editor.emit("objectChanged",this.object))}undo(){this.object[this.attributeName].setHex(this.oldValue),this.editor.emit("objectChanged",this.object)}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.attributeName=this.attributeName,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),this.attributeName=t.attributeName,this.oldValue=t.oldValue,this.newValue=t.newValue}}class SetMaterialColor extends Command{constructor(t,r,d,g,v){super(t),this.type="SetMaterialColor",this.name=`Set Material.${d}`,this.updatable=!0,this.object=r,this.materialSlot=v,this.material=this.editor.getObjectMaterial(r,v),this.oldValue=this.material!==void 0?this.material[d].getHex():void 0,this.newValue=g,this.attributeName=d}execute(){this.material[this.attributeName].setHex(this.newValue),this.editor.emit("materialChanged",this.material)}undo(){this.material[this.attributeName].setHex(this.oldValue),this.editor.emit("materialChanged",this.material)}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByMaterialObject(this.object),t.materialSlot=this.materialSlot,t.attributeName=this.attributeName,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.materialObjectByUuid(t.objectUuid),this.materialSlot=t.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot),this.attributeName=t.attributeName,this.oldValue=t.oldValue,this.newValue=t.newValue}}class SetMaterial extends Command{constructor(t,r,d,g){var v;super(t),this.type="SetMaterial",this.name="New Material",this.object=r,this.materialSlot=g,this.oldMaterial=this.editor.getObjectMaterial(r,g),this.newMaterial=d,(v=this.oldMaterial)!=null&&v.name&&(this.newMaterial.name=this.oldMaterial.name)}execute(){this.editor.setObjectMaterial(this.object,this.materialSlot,this.newMaterial),this.editor.emit("materialChanged",this.newMaterial)}undo(){this.editor.setObjectMaterial(this.object,this.materialSlot,this.oldMaterial),this.editor.emit("materialChanged",this.oldMaterial)}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByMaterialObject(this.object),t.materialSlot=this.materialSlot,t.newMaterial=this.newMaterial.toJSON(),t}fromJSON(t){var r;super.fromJSON(t),this.object=this.editor.materialObjectByUuid(t.objectUuid),this.materialSlot=t.materialSlot,this.materialSlot=t.materialSlot,this.oldMaterial=this.editor.getObjectMaterial(this.object,this.materialSlot),this.newMaterial=parseMaterial(t.newMaterial),((r=this.newMaterial.envMap)==null?void 0:r.name)==="PMREM.cubeUv"&&(this.newMaterial.envMap=this.editor.viewport.vis.getRoomEnvMap())}fixJSON(){const t=this.json;t&&t.oldMaterial&&delete t.oldMaterial}}function parseMaterial(m){if(!m)return null;const t=new ObjectLoader,r=t.parseImages(m.images),d=t.parseTextures(m.textures,r);return t.parseMaterials([m],d)[m.uuid]}const TEXTURE_MAPPING={UVMapping,CubeReflectionMapping,CubeRefractionMapping,EquirectangularReflectionMapping,EquirectangularRefractionMapping,CubeUVReflectionMapping},TEXTURE_WRAPPING={RepeatWrapping,ClampToEdgeWrapping,MirroredRepeatWrapping},TEXTURE_FILTER={NearestFilter,NearestMipmapNearestFilter,NearestMipmapLinearFilter,LinearFilter,LinearMipmapNearestFilter,LinearMipmapLinearFilter};class SetMaterialMap extends Command{constructor(t,r,d,g,v){super(t),this.type="SetMaterialMap",this.name=`Set Material.${d}`,this.object=r,this.materialSlot=v,this.material=this.editor.getObjectMaterial(r,v),this.oldMap=r!==void 0?this.material[d]:void 0,this.newMap=g,this.oldMap&&this.newMap&&(this.newMap.wrapS=this.oldMap.wrapS,this.newMap.wrapT=this.oldMap.wrapT),this.mapName=d}execute(){if(this.material.hasOwnProperty(this.mapName)){if(this.oldMap){const t=new ie$1;t.track(this.oldMap),t.dispose()}this.newMap&&(this.newMap.anisotropy=this.editor.viewport.vis.tier0?1:this.editor.pencil.maxAnisotropy),this.material[this.mapName]=this.newMap,this.playVideo(this.newMap),this.material instanceof Ie$2&&(this.material.useMap=!!this.newMap,this.newMap&&this.newMap.wrapS!==RepeatWrapping&&(this.newMap.wrapS=RepeatWrapping,this.newMap.wrapT=RepeatWrapping,this.newMap.needsUpdate=!0)),(!this.oldMap&&this.newMap||this.oldMap&&!this.newMap)&&(this.material.needsUpdate=!0),this.editor.emit("materialChanged",this.material)}}undo(){this.material[this.mapName]=this.oldMap,this.playVideo(this.oldMap),this.material instanceof Ie$2&&(this.material.useMap=!!this.newMap),(!this.oldMap&&this.newMap||this.oldMap&&!this.newMap)&&(this.material.needsUpdate=!0),this.editor.emit("materialChanged",this.material)}playVideo(t){if(t&&t instanceof VideoTexture){const r=t.source.data;r&&r.play()}}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByMaterialObject(this.object),t.materialSlot=this.materialSlot,t.mapName=this.mapName,t.newMap=serializeMap(this.newMap),t}fromJSON(t){super.fromJSON(t),this.object=this.editor.materialObjectByUuid(t.objectUuid),this.materialSlot=t.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot),this.mapName=t.mapName,this.oldMap=this.object&&this.material?this.material[this.mapName]:void 0,this.newMap=parseTexture(t.newMap)}fixJSON(){const t=this.json;t&&t.oldMap&&delete t.oldMap}}function parseTexture(m){let t=null;if(m){const r=new ObjectLoader;if(m.isVideoTexture){const d=document.createElement("video");d.src=m.images[0].url,d.muted=!0,d.loop=!0,d.preload="auto";const g={[m.images[0].uuid]:new VideoTexture(d)};t=parseVideoTextures([m],g)[m.uuid]}else{const d=r.parseImages(m.images);t=r.parseTextures([m],d)[m.uuid]}t.sourceFile=m.sourceFile}return t}const parseVideoTextures=(m,t)=>{function r(g,v){return typeof g=="number"?g:(console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",g),v[g])}const d={};if(m!==void 0)for(let g=0,v=m.length;g<v;g++){const C=m[g];let w=t[C.image];w.needsUpdate=!0,w.uuid=C.uuid,C.name!==void 0&&(w.name=C.name),C.mapping!==void 0&&(w.mapping=r(C.mapping,TEXTURE_MAPPING)),C.channel!==void 0&&(w.channel=C.channel),C.offset!==void 0&&w.offset.fromArray(C.offset),C.repeat!==void 0&&w.repeat.fromArray(C.repeat),C.center!==void 0&&w.center.fromArray(C.center),C.rotation!==void 0&&(w.rotation=C.rotation),C.wrap!==void 0&&(w.wrapS=r(C.wrap[0],TEXTURE_WRAPPING),w.wrapT=r(C.wrap[1],TEXTURE_WRAPPING)),C.format!==void 0&&(w.format=C.format),C.internalFormat!==void 0&&(w.internalFormat=C.internalFormat),C.type!==void 0&&(w.type=C.type),C.colorSpace!==void 0&&(w.colorSpace=C.colorSpace),C.encoding!==void 0&&(w.encoding=C.encoding),C.minFilter!==void 0&&(w.minFilter=r(C.minFilter,TEXTURE_FILTER)),C.magFilter!==void 0&&(w.magFilter=r(C.magFilter,TEXTURE_FILTER)),C.anisotropy!==void 0&&(w.anisotropy=C.anisotropy),C.flipY!==void 0&&(w.flipY=C.flipY),C.generateMipmaps!==void 0&&(w.generateMipmaps=C.generateMipmaps),C.premultiplyAlpha!==void 0&&(w.premultiplyAlpha=C.premultiplyAlpha),C.unpackAlignment!==void 0&&(w.unpackAlignment=C.unpackAlignment),C.compareFunction!==void 0&&(w.compareFunction=C.compareFunction),C.userData!==void 0&&(w.userData=C.userData),d[C.uuid]=w}return d};function serializeMap(m){if(m==null)return null;const t={geometries:{},materials:{},textures:{},images:{}},r=m.toJSON(t),d=extractFromCache(t.images);return m instanceof VideoTexture&&(d[0].url=m.source.data.src,r.isVideoTexture=!0),d.length>0&&(r.images=d),r.sourceFile=m.sourceFile,r}function extractFromCache(m){const t=[];for(const r in m){const d=m[r];delete d.metadata,t.push(d)}return t}const needsUpdateAttributeName=["transparent","alphaTest","fog","vertexColors","vertexShader","fragmentShader","sizeAttenuation"];class SetMaterialValue extends Command{constructor(t,r,d,g,v){super(t),this.type="SetMaterialValue",this.name=`Set Material.${d}`,this.updatable=!0,this.object=r,this.materialSlot=v,this.material=this.editor.getObjectMaterial(r,v),this.oldValue=this.material!==void 0?this.material[d]:void 0,this.newValue=g,this.attributeName=d}execute(){this.material!==void 0&&(this.material[this.attributeName]=this.newValue,needsUpdateAttributeName.includes(this.attributeName)&&(this.material.needsUpdate=!0),this.editor.emit("objectChanged",this.object),this.editor.emit("materialChanged",this.material),setTimeout(()=>{this.attributeName==="name"&&this.editor.emit("baseObjectListChange")}))}undo(){this.material[this.attributeName]=this.oldValue,needsUpdateAttributeName.includes(this.attributeName)&&(this.material.needsUpdate=!0),this.editor.emit("objectChanged",this.object),this.editor.emit("materialChanged",this.material),setTimeout(()=>{this.attributeName==="name"&&this.editor.emit("baseObjectListChange")})}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByMaterialObject(this.object),t.materialSlot=this.materialSlot,t.attributeName=this.attributeName,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.attributeName=t.attributeName,this.oldValue=t.oldValue,this.newValue=t.newValue,this.object=this.editor.materialObjectByUuid(t.objectUuid),this.materialSlot=t.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot)}}class SetMaterialVector extends Command{constructor(t,r,d,g,v){super(t),this.type="SetMaterialVector",this.name=`Set Material.${d}`,this.updatable=!0,this.object=r,this.materialSlot=v,this.material=this.editor.getObjectMaterial(r,v),this.oldValue=this.material!==void 0?this.material[d].toArray():void 0,this.newValue=g,this.attributeName=d}execute(){this.material[this.attributeName].fromArray(this.newValue),this.editor.emit("materialChanged",this.material)}undo(){this.material[this.attributeName].fromArray(this.oldValue),this.editor.emit("materialChanged",this.material)}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByMaterialObject(this.object),t.materialSlot=this.materialSlot,t.attributeName=this.attributeName,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.materialObjectByUuid(t.objectUuid),this.materialSlot=t.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot),this.attributeName=t.attributeName,this.oldValue=t.oldValue,this.newValue=t.newValue}}class SetMaterialMapVector extends Command{constructor(t,r,d,g,v,C="repeat"){var w,I,O,ye;super(t),this.type="SetMaterialMapVector",this.attributeName2=C,this.name=`Set Material.${d}.${C}`,this.updatable=!0,this.object=r,this.materialSlot=v,this.material=this.editor.getObjectMaterial(r,v),this.material instanceof Ie$2&&d==="map"&&C==="repeat"?this.oldValue=this.material.repeat.toArray():((I=(w=this.material)==null?void 0:w[d])==null?void 0:I[C])instanceof Vector2?this.oldValue=this.material[d][C].toArray():typeof((ye=(O=this.material)==null?void 0:O[d])==null?void 0:ye[C])!="undefined"&&(this.oldValue=this.material[d][C]),this.newValue=g,this.attributeName=d}execute(){var t,r,d,g,v;if((t=this.material)!=null&&t[this.attributeName]){const C=this.attributeName;this.material[C].wrapS!==RepeatWrapping&&(this.material[C].wrapS=RepeatWrapping,this.material[C].wrapT=RepeatWrapping,this.material[C].needsUpdate=!0)}this.material instanceof Ie$2&&this.attributeName==="map"&&this.attributeName2==="repeat"?this.material[this.attributeName2].fromArray(this.newValue):((d=(r=this.material)==null?void 0:r[this.attributeName])==null?void 0:d[this.attributeName2])instanceof Vector2?this.material[this.attributeName][this.attributeName2].fromArray(this.newValue):typeof((v=(g=this.material)==null?void 0:g[this.attributeName])==null?void 0:v[this.attributeName2])!="undefined"&&(this.material[this.attributeName][this.attributeName2]=this.newValue),this.editor.emit("materialChanged",this.material)}undo(){var t,r,d,g;this.material instanceof Ie$2&&this.attributeName==="map"&&this.attributeName2==="repeat"?this.material[this.attributeName2].fromArray(this.oldValue):((r=(t=this.material)==null?void 0:t[this.attributeName])==null?void 0:r[this.attributeName2])instanceof Vector2?this.material[this.attributeName][this.attributeName2].fromArray(this.oldValue):typeof((g=(d=this.material)==null?void 0:d[this.attributeName])==null?void 0:g[this.attributeName2])!="undefined"&&(this.material[this.attributeName][this.attributeName2]=this.oldValue),this.editor.emit("materialChanged",this.material)}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByMaterialObject(this.object),t.materialSlot=this.materialSlot,t.attributeName=this.attributeName,t.attributeName2=this.attributeName2,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.materialObjectByUuid(t.objectUuid),this.materialSlot=t.materialSlot,this.material=this.editor.getObjectMaterial(this.object,this.materialSlot),this.attributeName=t.attributeName,t.attributeName2&&(this.attributeName2=t.attributeName2),this.oldValue=t.oldValue,this.newValue=t.newValue,this.attributeName==="repeat"&&(this.attributeName="map")}}class SetPosition extends Command{constructor(t,r,d,g,v){super(t),this.type="SetPosition",this.name="Set Position",this.updatable=!0,this.cameraControls=v,this.object=r,r!==void 0&&d!==void 0&&(this.oldPosition=r.position.clone(),this.newPosition=d.clone()),g!==void 0&&(this.oldPosition=g.clone())}execute(){this.cameraControls?this.cameraControls.setPosition(this.newPosition.x,this.newPosition.y,this.newPosition.z,!1):(this.object.position.copy(this.newPosition),this.object.updateMatrixWorld(!0)),this.editor.emit("objectChanged",this.object)}undo(){this.cameraControls?this.cameraControls.setPosition(this.oldPosition.x,this.oldPosition.y,this.oldPosition.z,!1):(this.object.position.copy(this.oldPosition),this.object.updateMatrixWorld(!0)),this.editor.emit("objectChanged",this.object)}update(t){this.newPosition.copy(t.newPosition)}toJSON(){var r;const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.oldPosition=(r=this.oldPosition)==null?void 0:r.toArray(),t.newPosition=this.newPosition.toArray(),t.cameraControls=!!this.cameraControls,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),t.oldPosition&&(this.oldPosition=new Vector3().fromArray(t.oldPosition)),this.newPosition=new Vector3().fromArray(t.newPosition),t.cameraControls&&(this.cameraControls=this.editor.pencil.controls)}}class SetRotation extends Command{constructor(t,r,d,g){super(t),this.type="SetRotation",this.name="Set Rotation",this.updatable=!0,this.object=r,r!==void 0&&d!==void 0&&(this.oldRotation=r.rotation.clone(),this.newRotation=d.clone()),g!==void 0&&(this.oldRotation=g.clone())}execute(){this.object.rotation.copy(this.newRotation),this.object.updateMatrixWorld(!0),this.editor.emit("objectChanged",this.object)}undo(){this.object.rotation.copy(this.oldRotation),this.object.updateMatrixWorld(!0),this.editor.emit("objectChanged",this.object)}update(t){this.newRotation.copy(t.newRotation)}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.oldRotation=this.oldRotation.toArray(),t.newRotation=this.newRotation.toArray(),t}fromJSON(t){super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),t.oldRotation&&(this.oldRotation=new Euler().fromArray(t.oldRotation)),this.newRotation=new Euler().fromArray(t.newRotation)}}class SetScale extends Command{constructor(t,r,d,g){super(t),this.type="SetScale",this.name="Set Scale",this.updatable=!0,this.object=r,r!==void 0&&d!==void 0&&(this.oldScale=r.scale.clone(),this.newScale=d.clone()),g!==void 0&&(this.oldScale=g.clone())}execute(){this.object.scale.copy(this.newScale),this.object.updateMatrixWorld(!0),this.editor.emit("objectChanged",this.object)}undo(){this.object.scale.copy(this.oldScale),this.object.updateMatrixWorld(!0),this.editor.emit("objectChanged",this.object)}update(t){this.newScale.copy(t.newScale)}toJSON(){var r;const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.oldScale=(r=this.oldScale)==null?void 0:r.toArray(),t.newScale=this.newScale.toArray(),t}fromJSON(t){super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),t.oldScale&&(this.oldScale=new Vector3().fromArray(t.oldScale)),this.newScale=new Vector3().fromArray(t.newScale)}}class SetValue extends Command{constructor(t,r,d,g,v){super(t),this.type="SetValue",this.name=`Set ${d}`,this.updatable=!0,this.object=r,this.properties=v,this.attributeName=d;const C=r===void 0?void 0:this.properties?this.object[this.properties]:this.object;this.oldValue=C!==void 0?C[d]:void 0,this.newValue=g}execute(){const t=this.properties?this.object[this.properties]:this.object;t&&((t instanceof RectAreaLight||t instanceof AmbientLight)&&this.attributeName==="castShadow"||(t[this.attributeName]=this.newValue,this.fixObj(),this.editor.emit("objectChanged",this.object)))}fixObj(){const t=this.properties?this.object[this.properties]:this.object;t.isCamera&&["fov","left","right","top","bottom","near","far"].includes(this.attributeName)&&t.updateProjectionMatrix(),setTimeout(()=>{(this.attributeName==="name"||this.attributeName==="prefab"||this.attributeName==="visible"||this.attributeName==="keepCamera")&&this.editor.emit("baseObjectListChange")})}undo(){const t=this.properties?this.object[this.properties]:this.object;t[this.attributeName]=this.oldValue,this.fixObj(),this.editor.emit("objectChanged",this.object)}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.properties=this.properties,t.attributeName=this.attributeName,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.attributeName=t.attributeName,this.oldValue=t.oldValue,this.newValue=t.newValue,this.object=this.editor.objectByUuid(t.objectUuid),this.properties=t.properties}}class SetVector extends Command{constructor(t,r,d,g,v){super(t),this.type="SetVector",this.name=`Set ${d}`,this.updatable=!0,this.object=r,this.properties=v,this.attributeName=d;const C=r===void 0?void 0:this.properties?this.object[this.properties]:this.object;this.oldValue=C!==void 0?C[d].toArray():void 0,this.newValue=g}execute(){const t=this.properties?this.object[this.properties]:this.object;t&&(t[this.attributeName].fromArray(this.newValue),this.fixObj(),this.editor.emit("objectChanged",this.object))}fixObj(){this.editor.playing||this.attributeName==="mapSize"&&this.object[this.properties].map&&(this.object[this.properties].map.dispose(),this.object[this.properties].map=null)}undo(){(this.properties?this.object[this.properties]:this.object)[this.attributeName].fromArray(this.oldValue),this.fixObj(),this.editor.emit("objectChanged",this.object)}update(t){this.newValue=t.newValue}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.properties=this.properties,t.attributeName=this.attributeName,t.oldValue=this.oldValue,t.newValue=this.newValue,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),this.attributeName=t.attributeName,this.oldValue=t.oldValue,this.newValue=t.newValue,this.properties=t.properties}}class AddVis extends Command{constructor(r,d,g){super(r);T0(this,"visType");T0(this,"visOptions");this.type="AddVis",this.visType=d,this.visOptions=g,d!==void 0&&(this.name=`Add Vis: ${d}`)}execute(){return U0(this,null,function*(){yield this.editor.viewport.setVis(this.visType,this.visOptions),this.editor.select(null)})}undo(){const r=window.confirm("将删除所有记录,是否继续?");return r&&this.editor.viewport.dispose(),r}toJSON(){const r=super.toJSON();return r.visType=this.visType,r.visOptions=this.visOptions,r}fromJSON(r){super.fromJSON(r),this.visType=r.visType,this.visOptions=r.visOptions}}class AddObject extends Command{constructor(r,d,g){super(r);T0(this,"objectType");T0(this,"objectOptions");T0(this,"obj");T0(this,"addObjectUuid");this.type="AddObject",this.objectType=d,this.objectOptions=g,d!==void 0&&(this.name=`Add Object: ${d}`)}execute(){return U0(this,null,function*(){var d;const r=this.editor.viewport.vis;this.obj=yield r.lead.draw(this.objectType,Ui(fi({},this.objectOptions),{key:`${this.id}`})),this.obj.userData.updateKey!==!1&&r.lead.updateBaseObjectKey(this.obj,`$t:_${this.id}`),this.addObjectUuid=this.obj.key,this.editor.select(this.obj.key),(d=this.editor.viewport.vis)==null||d.initBaseObjectUserData(this.obj)})}undo(){this.obj.erase(),this.editor.select(null)}toJSON(){const r=super.toJSON();return r.objectType=this.objectType,r.objectOptions=this.objectOptions,r.addObjectUuid=this.addObjectUuid,r}fromJSON(r){super.fromJSON(r),this.objectType=r.objectType,this.objectOptions=r.objectOptions,this.addObjectUuid=r.addObjectUuid}fixJSON(){const r=this.json;r&&!r.addObjectUuid&&(r.addObjectUuid=this.addObjectUuid)}}class RemoveObject extends Command{constructor(r,d){super(r);T0(this,"object");T0(this,"objectUuid");this.type="RemoveObject",this.name="Remove Object",this.object=d,this.objectUuid=this.editor.uuidByBaseObject(d)}execute(){this.editor.playing?this.object.erase():(this.object.hide(),this.object.userData.selectHide=!0,this.object.mList.rmBaseObjectMap(this.object)),this.editor.emit("baseObjectListChange"),this.editor.select(null)}undo(){return U0(this,null,function*(){this.object.show(),this.object.mList.addBaseObjectMap(this.object),delete this.object.userData.selectHide,this.editor.emit("baseObjectListChange")})}toJSON(){const r=super.toJSON();return r.objectUuid=this.objectUuid,r}fromJSON(r){super.fromJSON(r),this.object=this.editor.baseObjectByUuid(r.objectUuid)}}class CopyObject extends Command{constructor(r,d){super(r);T0(this,"object");T0(this,"copyObject",null);T0(this,"copyObjectUuid");this.type="CopyObject",this.name="Copy Object",this.object=d}execute(){return U0(this,null,function*(){var v;const r=this.editor.viewport.vis,d=this.object.key,g=yield this.object.instantiate(void 0,{key:`${this.id}`});this.copyObject=g,g.userData.updateKey!==!1&&r.lead.updateBaseObjectKey(g,`${d}_${this.id}`),this.copyObjectUuid=g.key,this.editor.select(this.copyObjectUuid),(v=this.editor.viewport.vis)==null||v.initBaseObjectUserData(g)})}undo(){return U0(this,null,function*(){var r;(r=this.copyObject)==null||r.erase(),this.editor.select(null)})}toJSON(){const r=super.toJSON();return r.objectUuid=this.editor.uuidByBaseObject(this.object),r.copyObjectUuid=this.copyObjectUuid,r}fromJSON(r){super.fromJSON(r),this.object=this.editor.baseObjectByUuid(r.objectUuid),this.copyObjectUuid=r.copyObjectUuid}fixJSON(){const r=this.json;r&&!r.copyObjectUuid&&(r.copyObjectUuid=this.copyObjectUuid)}}class CopyMaterial extends Command{constructor(r,d){super(r);T0(this,"originKey");T0(this,"copyKey");this.type="CopyMaterial",this.name="Copy Material",this.originKey=d}execute(){return U0(this,null,function*(){this.copyKey=`material_${this.id}`,this.editor.pencil.mList.copy(this.originKey,this.copyKey)})}undo(){return U0(this,null,function*(){this.editor.pencil.mList.remove(this.copyKey)})}toJSON(){const r=super.toJSON();return r.originKey=this.originKey,r.copyKey=this.copyKey,r}fromJSON(r){super.fromJSON(r),this.originKey=r.originKey,this.copyKey=r.copyKey}}class SetObjectMaterial extends Command{constructor(r,d,g,v){var w;super(r);T0(this,"object");T0(this,"oldValue");T0(this,"newValue");T0(this,"materialSlot");this.type="SetObjectMaterial",this.name="Set Object Material",this.object=d,this.materialSlot=g;const C=this.editor.getObjectMaterial(d,g);this.oldValue=(w=this.editor.pencil)==null?void 0:w.mList.getKey(C),this.newValue=v}execute(){return U0(this,null,function*(){const r=this.editor.pencil.mList;r.get(this.newValue)&&(this.editor.setObjectMaterial(this.object,this.materialSlot,r.get(this.newValue),!0),this.editor.emit("materialChanged",this.object))})}undo(){return U0(this,null,function*(){const r=this.editor.pencil.mList;this.editor.setObjectMaterial(this.object,this.materialSlot,r.get(this.oldValue),!0),this.editor.emit("materialChanged",this.object)})}toJSON(){const r=super.toJSON();return r.objectUuid=this.editor.uuidByObject(this.object),r.oldType=this.oldValue,r.newType=this.newValue,r.materialSlot=this.materialSlot,r}fromJSON(r){super.fromJSON(r),this.object=this.editor.objectByUuid(r.objectUuid),this.oldValue=r.oldValue,this.newValue=r.newValue,this.materialSlot=r.materialSlot}}class SetSetting extends Command{constructor(r,d,g){super(r);T0(this,"attributeName");T0(this,"newValue");T0(this,"oldValue");this.type="SetSetting",this.updatable=!0,this.name=`Set Setting.${d}`,this.attributeName=d,this.newValue=g,r.viewport.vis&&(this.oldValue=r.viewport.vis.settings[d])}execute(){return U0(this,null,function*(){const r=this.editor.viewport.vis;r.settings[this.attributeName]=this.newValue,yield r.settings[this.attributeName],this.editor.emit("settingsChanged")})}undo(){return U0(this,null,function*(){const r=this.editor.viewport.vis;r.settings[this.attributeName]=this.oldValue,yield r.settings[this.attributeName],this.editor.emit("settingsChanged")})}update(r){this.newValue=r.newValue}toJSON(){const r=super.toJSON();return r.name=this.name,r.attributeName=this.attributeName,r.newValue=this.newValue,r.oldValue=this.oldValue,r}fromJSON(r){super.fromJSON(r),this.name=r.name,this.attributeName=r.attributeName||r.name,this.newValue=r.newValue,this.oldValue=r.oldValue}}class SetTarget extends Command{constructor(t,r,d,g,v){super(t),this.type="SetTarget",this.name="Set Target",this.updatable=!0,this.cameraControls=v,this.object=r,r!==void 0&&d!==void 0&&(this.oldPosition=r.position.clone(),this.newPosition=d.clone()),g!==void 0&&(this.oldPosition=g.clone())}execute(){this.cameraControls?this.cameraControls.setTarget(this.newPosition.x,this.newPosition.y,this.newPosition.z,!1):(this.object.target.copy(this.newPosition),this.object.target.updateMatrixWorld(!0)),this.editor.emit("objectChanged",this.object)}undo(){this.cameraControls?this.cameraControls.setTarget(this.oldPosition.x,this.oldPosition.y,this.oldPosition.z,!1):(this.object.target.copy(this.oldPosition),this.object.target.updateMatrixWorld(!0)),this.editor.emit("objectChanged",this.object)}update(t){this.newPosition.copy(t.newPosition)}toJSON(){var r;const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.oldPosition=(r=this.oldPosition)==null?void 0:r.toArray(),t.newPosition=this.newPosition.toArray(),t.cameraControls=!!this.cameraControls,t}fromJSON(t){super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),t.oldPosition&&(this.oldPosition=new Vector3().fromArray(t.oldPosition)),this.newPosition=new Vector3().fromArray(t.newPosition),t.cameraControls&&(this.cameraControls=this.editor.pencil.controls)}}class SetSceenMap extends SetMaterialMap{constructor(t,r,d,g,v){super(t),this.type="SetSceenMap",this.name="Set Sceen.background",this.object=r,this.materialSlot=v,this.material=r!==void 0?r[v]:void 0,this.oldMap=r!==void 0?this.material[d]:void 0,this.newMap=g,this.oldMap&&this.newMap&&(this.newMap.wrapS=this.oldMap.wrapS,this.newMap.wrapT=this.oldMap.wrapT),this.mapName=d}fromJSON(t){super.fromJSON(t),this.oldMap=this.object[this.materialSlot][this.mapName],this.material=this.object[this.materialSlot]}}class SetGeometry extends Command{constructor(t,r=null,d){super(t),this.type="SetGeometry",this.name="Set Geometry",this.updatable=!0,this.object=r,this.oldGeometry=r!==null?r.geometry:null,this.newGeometry=d||null}execute(){this.object.geometry.dispose(),this.object.geometry=this.newGeometry,this.object.geometry.computeBoundingSphere(),this.editor.emit("geometryChanged",this.object)}undo(){this.object.geometry.dispose(),this.object.geometry=this.oldGeometry,this.object.geometry.computeBoundingSphere(),this.editor.emit("geometryChanged",this.object)}update(t){this.newGeometry=t.newGeometry}toJSON(){const t=super.toJSON(this);return t.objectUuid=this.editor.uuidByObject(this.object),t.newGeometry=this.geometryToJSON(this.newGeometry),t}geometryToJSON(t){return t?t.type==="MeshLine"?{type:"MeshLine",points:t.points,variableWidth:!!t.widthCallback}:t.toJSON():void 0}parseGeometry(t){if(!t)return;if(t.type==="MeshLine"){const g=new Ve;return g.setPoints(t.points,t.variableWidth?v=>v:void 0),g}return new ObjectLoader().parseGeometries([t])[t.uuid]}fromJSON(t){var r;super.fromJSON(t),this.object=this.editor.objectByUuid(t.objectUuid),this.oldGeometry=((r=this.object)==null?void 0:r.geometry)||null,this.newGeometry=this.parseGeometry(t.newGeometry)}}const Commands=Object.freeze(Object.defineProperty({__proto__:null,AddObject,AddVis,CopyMaterial,CopyObject,RemoveObject,SetColor,SetGeometry,SetMaterial,SetMaterialColor,SetMaterialMap,SetMaterialMapVector,SetMaterialValue,SetMaterialVector,SetObjectMaterial,SetPosition,SetRotation,SetScale,SetSceenMap,SetSetting,SetTarget,SetValue,SetVector},Symbol.toStringTag,{value:"Module"}));class History{constructor(t){T0(this,"editor");T0(this,"undos");T0(this,"redos");T0(this,"lastCmdTime");T0(this,"idCounter");T0(this,"historyDisabled");this.editor=t,this.undos=[],this.redos=[],this.lastCmdTime=Date.now(),this.idCounter=0,this.historyDisabled=!1}execute(t,r){return U0(this,null,function*(){const d=this.undos[this.undos.length-1],g=Date.now()-this.lastCmdTime;d&&d.updatable&&t.updatable&&d.object===t.object&&d.type===t.type&&d.attributeName===t.attributeName&&d.attributeName2===t.attributeName2&&d.name===t.name&&d.objectUuid===t.objectUuid&&d.materialSlot===t.materialSlot&&g<500?(d.update(t),t=d):(this.undos.push(t),t.id=++this.idCounter),t.name=r!==void 0?r:t.name;try{yield t.execute()}catch(C){console.error(C,t)}t.json=t.toJSON(),this.lastCmdTime=Date.now(),this.redos=[],this.editor.emit("historyChanged",t)})}undo(){if(this.historyDisabled)return;let t;if(this.undos.length>0&&(t=this.undos.pop()),t!==void 0){if(!t.name){console.log("压缩配置,不支持 undo"),this.undos.push(t);return}t.undo(),this.redos.push(t),this.editor.emit("historyChanged",t)}return t}redo(){if(this.historyDisabled)return;let t;return this.redos.length>0&&(t=this.redos.pop()),t!==void 0&&(t.execute(),this.undos.push(t),this.editor.emit("historyChanged",t)),t}toJSON(){var r,d,g;const t={u:[],i:[]};for(let v=0;v<this.undos.length;v++)if(this.undos[v].hasOwnProperty("json")){const C=this.undos[v].json;if((r=C.newMap)!=null&&r.images||(d=C.newMaterial)!=null&&d.images){const w=(g=C.newMap)!=null&&g.images?"newMap":"newMaterial";t.u.push(Ui(fi({},C),{[w]:Ui(fi({},C[w]),{images:C[w].images.map(I=>{if(typeof I.url!="string")return fi({},I);const O=t.i.findIndex(Se=>Se===I.url);let ye=I.url;return O===-1?(t.i.push(I.url),ye=`$rp-${t.i.length-1}`):ye=`$rp-${O}`,Ui(fi({},I),{url:ye})})})}))}else t.u.push(fi({},C))}return t}fromJSON(t){var g,v,C;if(t===void 0)return;let r=-1;const d=t.i;for(let w=0;w<t.u.length;w++){const I=t.u[w];if(d!=null&&d.length&&((g=I.newMap)!=null&&g.images||(v=I.newMaterial)!=null&&v.images)){const ye=(C=I.newMap)!=null&&C.images?"newMap":"newMaterial";I[ye].images.forEach(Se=>{if(typeof Se.url=="string"&&Se.url.startsWith("$rp-")){const Pe=parseInt(Se.url.replace("$rp-",""));Se.url=d[Pe],this.editor.playing||console.log("$rp-",Pe,I)}})}if(I.id<=r){console.error("历史记录id错误");continue}if(I.type==="SetOption"||!I.type)continue;I.type.endsWith("Command")&&(I.type=I.type.replace("Command",""));const O=new Commands[I.type](this.editor);O.json=I,O.id=I.id,O.name=I.name,this.undos.push(O),this.idCounter=I.id>this.idCounter?I.id:this.idCounter,r=I.id}this.editor.emit("historyChanged",this.undos[this.undos.length-1])}processUndos(t=1e3/60){return new Promise((r,d)=>{const g=[...this.undos],v=g.length;let C=0;const w=()=>U0(this,null,function*(){const I=performance.now();for(;g.length>0&&performance.now()-I<t;){if(this.editor._dispose){d("dispose");return}const O=g.shift(),ye=this.editor.hooks.events.beforeExecuteUndo.length?this.editor.hooks.dispatch("beforeExecuteUndo",O):O;ye&&(yield this.executeUndo(ye)),this.editor.hooks.events.afterExecuteUndo.length&&this.editor.hooks.dispatch("afterExecuteUndo",O),C+=1}this.editor.emit("progress",{type:"还原场景",value:C/v*100|0}),g.length>0?requestAnimationFrame(w):r("")});requestAnimationFrame(w)})}executeUndo(t){return U0(this,null,function*(){t.fromJSON(t.json);try{t.json.type!=="AddObject"&&t.json.objectUuid&&!t.object||(yield t.execute(),t.fixJSON())}catch(r){console.error(r,t)}})}clear(){this.undos.length=0,this.redos.length=0,this.idCounter=0,this.editor.emit("historyChanged",this.undos[this.undos.length-1])}}class Viewport{constructor(t,r){T0(this,"editor");T0(this,"vis");T0(this,"extendsOptions",{});T0(this,"cameraState",{});T0(this,"delLoadObj");T0(this,"options");this.options=r,this.editor=t}setSaveCamera(t){var r,d;this.vis.setSaveCamera(t),(r=this.vis.pencil.controls)==null||r.saveState(),this.cameraState=fi({},(d=this.vis)==null?void 0:d.cameraState),this.editor.emit("cameraStateChanged")}addVis(d){return U0(this,arguments,function*(t,r={}){this.replaceVis()&&(yield this.editor.execute(new AddVis(this.editor,t,r)))})}replaceVis(){if(this.vis){const t=window.confirm("将删除所有记录,是否继续?");return t&&this.dispose(),t}return!0}setVis(d){return U0(this,arguments,function*(t,r={}){if(!this.options.visFactories&&(this.editor.setViewportVis(t),!this.options.visFactories)){console.error("visFactories is not defined");return}if(this.vis=this.options.visFactories,this.vis.visName!==t)throw new Error(`visName is not match, import {${t}}`);let g=fi(fi({},r),this.extendsOptions);g=this.editor.hooks.events.beforeSetVisOptions.length?this.editor.hooks.dispatch("beforeSetVisOptions",g):g,this.vis.setOptions(g),this.vis.cameraState=fi({},this.cameraState),this.delLoadObj&&(this.vis.delLoadArr=this.delLoadObj),this.vis.playing=this.editor.playing,this.vis._baseObjectByUuid=this.editor.baseObjectByUuid.bind(this.editor),this.vis._objectByUuid=this.editor.objectByUuid.bind(this.editor),this.vis.on("loaderProgress",(C,w)=>{this.editor.emit("progress",{type:"下载资源",value:C/w*100|0})}),this.vis.on("settingsChanged",()=>{this.editor.emit("settingsChanged")}),this.vis.on("show",()=>{this.editor.changeSelectOption(),this.editor.emit("visShow",!0)}),yield this.vis.init();const{pencil:v}=this.vis;v.userData.EditorEnv=!this.editor.playing,this.editor.pencil=v,this.editor.changeSelectOption(),this.editor.playing||(this.initEvent(),this.editor.emit("visChanged",this.vis)),this.editor.on("baseObjectListChange",()=>{this.editor.changeSelectOption()}),v.event.on("updateKey",()=>{this.editor.emit("baseObjectListChange")}),v.event.on("draw",()=>{this.editor.emit("baseObjectListChange")}),v.event.on("erase",()=>{this.editor.emit("baseObjectListChange")})})}setResetCameraUp(){var C,w,I;const r=((C=this.vis)==null?void 0:C.pencil.lead.group).getSize(),d=(r.max.x+r.min.x)/2,g=(r.max.y+r.min.y)/2,v=(w=this.vis)==null?void 0:w.pencil.cameraPositon.z;(I=this.vis)==null||I.pencil.controls.setLookAt(d,g,v,d,g,0,!0)}initEvent(){var r,d,g,v;const{pencil:t}=this.vis;t.controls.addEventListener("update",()=>{this.editor.emit("refreshSidebarObject3D",t.camera)}),(r=t.transformController)==null||r.event.on("change",C=>{this.editor.emit("refreshSidebarObject3D",C)}),(d=t.transformController)==null||d.event.on("translate",(C,w,I)=>{this.editor.execute(new SetPosition(this.editor,C,w,I))}),(g=t.transformController)==null||g.event.on("rotate",(C,w,I)=>{this.editor.execute(new SetRotation(this.editor,C,w,I))}),(v=t.transformController)==null||v.event.on("scale",(C,w,I)=>{this.editor.execute(new SetScale(this.editor,C,w,I))})}addObj(d){return U0(this,arguments,function*(t,r={}){const g=objs$3[t].getInitOptions;g&&Object.assign(r,g(this.vis.pencil,r)),yield this.editor.execute(new AddObject(this.editor,t,r))})}removeObj(t){return U0(this,null,function*(){const{vis:r}=this;if(!r)return;const d=this.editor.baseObjectByUuid(t);this.editor.execute(new RemoveObject(this.editor,d))})}copyObj(t){return U0(this,null,function*(){const{vis:r}=this;if(!r)return;const d=this.editor.baseObjectByUuid(t);this.editor.execute(new CopyObject(this.editor,d))})}setExtendsOptions(t,r){this.extendsOptions[t]=r,this.vis.extendsOptions[t]=r,this.editor.emit("optionsChanged"),setTimeout(()=>{const d=this.editor.toJSON();this.dispose(),this.editor.fromJSON(d)})}toJSON(){var r;const t=(r=this.vis)==null?void 0:r.loader.getUnusedAssets();return{eo:this.extendsOptions,cs:this.cameraState,delLoadObj:t}}fromJSON(t){this.extendsOptions=t.eo||{},this.cameraState=t.cs||{},t.delLoadObj&&t.delLoadObj.length&&(this.delLoadObj=[...t.delLoadObj])}getLoadObj(){return this.vis?[...this.vis.loader.assets.keys()].filter(r=>this.vis.loader.delLoadArr.indexOf(r)===-1):[]}setTransformControlsModal(t){var d;const{pencil:r}=this.vis;(d=r.transformController)==null||d.controls.setMode(t)}dispose(){var t;this.editor.emit("visShow",!1),(t=this.vis)==null||t.dispose(),this.options.visFactories=void 0,this.extendsOptions={},this.cameraState={},this.delLoadObj=void 0,this.vis=void 0,this.editor.history.clear()}}const compareVersion=(m,t)=>{if(!m&&!t)return 0;if(!m&&t)return-1;if(m&&!t)return 1;const r=m.split("."),d=t.split("."),g=Math.max(r.length,d.length);for(;r.length<g;)r.push("0");for(;d.length<g;)d.push("0");for(let v=0;v<g;v++){const C=parseInt(r[v]),w=parseInt(d[v]);if(C>w)return 1;if(C<w)return-1}return 0};function applyFixes(m,t){const r=[{version:"0.5.38",fix:()=>{var C;(C=t.v)!=null&&C.eo&&Object.keys(t.v.eo).forEach(w=>{["mouseLeft","mouseRight","mouseWheel","label","labelLite","shadowMap","autoRotate","equirectangular"].includes(w)&&(t.v.eo[w]=!!t.v.eo[w])}),t.h.u.forEach(w=>{w.type==="SetSetting"&&(w.attributeName==="阴影"&&(w.attributeName="shadowMap"),w.newValue=!!w.newValue,w.oldValue=!!w.oldValue)})}},{version:"0.7.14",fix:()=>{t.h.u.forEach(C=>{C.objectUuid&&(C.objectUuid=C.objectUuid.replace(C.objectUuid[0],C.objectUuid[0].toLowerCase()))})}},{version:"0.13.0",fix:()=>{if(t.h.u[0]&&t.h.u[0].visType==="city"&&(t.h.u[0].visOptions.jsonName||(t.h.u=[])),t.h.u[0]&&t.h.u[0].visType==="map"){if(t.h.u[0].visOptions.geojson){const{geojson:C,adcode:w,geojsonLite:I}=t.h.u[0].visOptions;t.h.u[0].visOptions=Ui(fi({},t.h.u[0].visOptions),{geojsonMap:{[w]:C},extrudeLineGeojsonMap:{[w]:I}}),delete t.h.u[0].visOptions.geojson,delete t.h.u[0].visOptions.geojsonLite}if(t.h.u[0].visOptions.bbox){const{bbox:C,bboxMap:w,adcode:I}=t.h.u[0].visOptions;t.h.u[0].visOptions=Ui(fi({},t.h.u[0].visOptions),{bboxMap:w||{[I]:C}}),delete t.h.u[0].visOptions.bbox}if(t.h.u[0].visOptions.worldBg){const{worldBg:C}=t.h.u[0].visOptions;t.h.u[0].visOptions=Ui(fi({},t.h.u[0].visOptions),{parentBg:C}),delete t.h.u[0].visOptions.worldBg}t.h.u[0].visOptions.adcode===0&&(t.h.u[0].visType="world")}t.h.u[0]&&t.h.u[0].visType==="world"&&(t.h.u[0].visType="map",t.h.u[0].visOptions={adcode:0,mapDepth:5,lineWidth:2,worldPacificCentre:!0,extrudeLine:!1})}},{version:"0.18.1",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="FJ"&&(t.h.u[0].visType="map2"),t.h.u[0]&&t.h.u[0].visType==="earth3"&&(t.h.u[0].visType="earth",t.h.u[0].visOptions.style="countryPlate")}},{version:"0.18.14",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map"&&t.h.u.forEach(C=>{if(C.type==="SetSetting"&&C.attributeName.startsWith("测试")&&typeof C.newValue=="string"&&C.newValue.includes(":::")){const w=C.newValue.split(":::")[1];C.attributeName+=":::"+w,C.newValue=C.newValue.split(":::")[0],C.oldValue&&typeof C.oldValue=="string"&&(C.oldValue=C.oldValue.split(":::")[0])}})}},{version:"0.18.16",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map"&&t.h.u.forEach(C=>{if(C.type==="SetSetting"&&C.attributeName.startsWith("测试")&&C.attributeName.includes(":::")&&!C.attributeName.includes("caId")){const w=C.attributeName.split(":::")[1];C.attributeName=C.attributeName.replace(w,`caId.${w}`)}})}},{version:"0.21.24",fix:()=>{var C,w;t.h.u[0]&&t.h.u[0].visType==="map"&&((w=(C=t.v)==null?void 0:C.eo)!=null&&w.parentBgCurvatureResolution)&&(delete t.v.eo.parentBgCurvatureResolution,t.v.eo.parentBgTopSegments=400)}},{version:"0.23.1",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map2"&&!t.h.u[0].visOptions.cityOnMap&&(t.v.eo||(t.v.eo={}),t.v.eo.clickHandleDrillDown=!0)}},{version:"0.24.1",fix:()=>{var C,w;t.h.u[0]&&t.h.u[0].visType==="map"&&((w=(C=t.v)==null?void 0:C.eo)!=null&&w.drillDownTopMatTwo)&&(delete t.v.eo.drillDownTopMatTwo,t.v.eo.drillDownSecondLevelMats=!0)}},{version:"0.24.2",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map2"&&t.h.u.forEach(C=>{C.objectUuid==="plane#topMatOne"?(C.objectUuid="area",C.materialSlot=0):C.objectUuid==="plane#sideMat"?(C.objectUuid="area",C.materialSlot=1):C.objectUuid==="plane#lineMat"?C.objectUuid="line":C.objectUuid==="plane#extrudeLineMat"?C.objectUuid="extrudeLine":C.objectUuid==="plane#bgTopMatOne"?C.objectUuid="bgPlane#topMat":C.objectUuid==="plane#bgSideMat"?C.objectUuid="bgPlane#sideMat":C.objectUuid==="plane#bgLineMat"?C.objectUuid="bgPlane#lineMat":C.objectUuid==="plane#bgExtrudeLineMat"?C.objectUuid="bgPlane#extrudeLineMat":C.objectUuid==="parentPlane#topMat"?(C.objectUuid="100000area",C.materialSlot=0):C.objectUuid==="parentPlane#sideMat"?(C.objectUuid="100000area",C.materialSlot=1):C.objectUuid==="parentPlane#lineMat"?C.objectUuid="100000line":C.objectUuid==="worldPlane#topMat"?(C.objectUuid="worldarea",C.materialSlot=0):C.objectUuid==="worldPlane#sideMat"?(C.objectUuid="worldarea",C.materialSlot=1):C.objectUuid==="worldPlane#lineMat"?C.objectUuid="worldline":C.objectUuid==="continents#topMat"?(C.objectUuid="continentsArea",C.materialSlot=0):C.objectUuid==="continents#sideMat"?(C.objectUuid="continentsArea",C.materialSlot=1):C.objectUuid==="continents#lineMat"?C.objectUuid="continentsLine":C.objectUuid==="area#river"?C.objectUuid="geography#river":C.objectUuid==="area#grassland"?C.objectUuid="geography#grassland":C.objectUuid==="area-grey#river"?C.objectUuid="geography-grey#river":C.objectUuid==="area-grey#grassland"&&(C.objectUuid="geography-grey#grassland")})}},{version:"0.26.0",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map2"&&(t.v.eo||(t.v.eo={}),t.h.u[0].visType="map",t.h.u[0].visOptions.cityOnMap?(t.h.u[0].visOptions.style="map2CityOnMap",delete t.h.u[0].visOptions.cityOnMap):(t.h.u[0].visOptions.style="map2Base",t.v.eo.bottomPlane=!0))}},{version:"0.26.6",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="earth2"&&(t.h.u[0].visType="earth",t.h.u[0].visOptions.style="base")}},{version:"0.26.13",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map"&&(t.h.u[0].visOptions.clickHandleDrillDown||t.v.eo.clickHandleDrillDown)&&t.v.eo.drillDownFirstLevelUseBgMats===void 0&&(t.v.eo.drillDownFirstLevelUseBgMats=!0)}},{version:"0.27.0",fix:()=>{if(t.h.u[0]&&t.h.u[0].visType==="map"){const C={};t.h.u.forEach((w,I)=>{var O,ye,Se;if(w.objectUuid==="area"&&w.materialSlot===0)w.objectUuid="plane#topMat",delete w.materialSlot;else if(w.objectUuid==="area"&&w.materialSlot===1)w.objectUuid="plane#sideMat",delete w.materialSlot;else if(w.objectUuid==="line")w.objectUuid="plane#lineMat";else if(w.objectUuid==="continentsArea"&&w.materialSlot===0)w.objectUuid="continents#topMat",delete w.materialSlot;else if(w.objectUuid==="continentsArea"&&w.materialSlot===1)w.objectUuid="continents#sideMat",delete w.materialSlot;else if(w.objectUuid==="continentsLine")w.objectUuid="continents#lineMat";else if(w.type==="SetSetting"&&((O=w.attributeName)!=null&&O.startsWith("测试"))&&w.attributeName.includes(":::caId.")){const Pe=w.attributeName.split(":::caId.")[1],Ne=t.h.u[0].visOptions.adcode;t.h.u[I]=[{id:w.id,type:"CopyObject",name:"Copy Object",updatable:!1,objectUuid:`extrudePolygon#${Ne}-${Pe}`,copyObjectUuid:`ExtrudePolygon#${Ne}-${Pe}_${w.id}`},{id:w.id+.1,type:"CopyObject",name:"Copy Object",updatable:!1,objectUuid:`line#${Ne}-${Pe}`,copyObjectUuid:`line#${Ne}-${Pe}_${w.id+.1}`}],C[Pe]=w.id}else if((ye=w.objectUuid)!=null&&ye.startsWith("planeCopyExtrudePolygon")){const Pe=w.objectUuid.split("CopyExtrudePolygon")[1],Ne=t.h.u[0].visOptions.adcode;Object.assign(w,{objectUuid:`extrudePolygon#${Ne}-${Pe}_${C[Pe]}`})}else if((Se=w.objectUuid)!=null&&Se.startsWith("planeCopyLine")){const Pe=w.objectUuid.split("CopyLine")[1],Ne=t.h.u[0].visOptions.adcode;Object.assign(w,{objectUuid:`line#${Ne}-${Pe}_${C[Pe]+.1}`})}}),t.h.u=t.h.u.flat()}}},{version:"0.27.8",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map"&&t.h.u[0].visOptions.style==="map2CityOnMap"&&(t.h.u[0].visOptions.mergeSide=!0,t.h.u.forEach(C=>{C.objectUuid==="extrudeLine"?C.objectUuid="plane#lineMat":C.objectUuid==="plane#lineMat"&&(C.objectUuid="extrudeLine")}))}},{version:"0.27.9",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map"&&t.h.u[0].visOptions.style==="map2CityOnMap"&&t.h.u.forEach(C=>{C.objectUuid==="plane#extrudeLineMat"&&(C.objectUuid="plane#lineMat")})}},{version:"0.27.14",fix:()=>{t.h.u[0]&&t.h.u[0].visType==="map"&&t.h.u[0].visOptions.style==="map2CityOnMap"&&t.h.u.forEach(C=>{C.objectUuid==="building"&&(C.objectUuid="building#group")})}},{version:"0.28.1",fix:()=>!1}];let d=0,g=r.length-1,v=r.length;for(;d<=g;){const C=Math.floor((d+g)/2);compareVersion(r[C].version,m)>0?(v=C,g=C-1):d=C+1}for(let C=v;C<r.length;C++)r[C].fix()!==!1&&(t.c.version=r[C].version)}const fixJSON=m=>{var t;return m.c||(m={h:{u:m.u},v:{eo:m.eo,bg:m.bg},c:{name:m.name,version:m.v}}),(t=m.c)!=null&&t.key&&delete m.c.key,applyFixes(m.c.version,m),m};class Hooks{constructor(t){T0(this,"editor");T0(this,"events",{beforeSetVisOptions:[],beforeExecuteUndo:[],afterExecuteUndo:[],beforeShow:[],afterShow:[],beforeFromJSON:[],afterFromJSON:[],errorFromJSON:[]});T0(this,"source","");this.editor=t,this.addEvents({beforeFromJSON:()=>{window.postMessage({type:"vis-core.fromJSON.start"}),console.time("vis-core:time.fromJSON")},afterFromJSON:()=>{window.postMessage({type:"vis-core.fromJSON.end"}),console.timeEnd("vis-core:time.fromJSON")},errorFromJSON:()=>{window.postMessage({type:"vis-core.fromJSON.error"}),console.timeEnd("vis-core:time.fromJSON")}})}addEvents(t){var r;for(const d in t){const g=d;this.events[g]&&this.events[g].push(t[g].bind(t)),g==="afterShow"&&((r=this.editor.viewport.vis)==null?void 0:r.showState)===!0&&t[g](this.editor.viewport.vis)}}addStaticEvents(t){this.addEvents(t());const r=t.toString().replace(/\/\/.*?(?:\r\n|\n|\r|$)/g,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/^\s+/gm,"").replace(/(\r\n|\n|\r)/gm,"").trim();this.source!==r&&(this.source=r,this.editor.emit("scriptsChanged"))}fromJSON(t){if(!t)this.source="";else try{const r=new Function(`return ${t}()`)();this.addEvents(r),this.source=t}catch(r){console.error(r)}this.editor.emit("scriptsChanged")}toJSON(){return this.source}clear(){Object.keys(this.events).forEach(t=>{this.events[t]=[]})}dispatch(t,...r){let d;for(const g of this.events[t])if(t==="beforeSetVisOptions"?d=g(d!=null?d:r[0]):d=g(this.editor.viewport.vis,...r),d===!1)break;return d}}class Config{constructor(t){T0(this,"editor");T0(this,"meta",{name:"",key:"",open:!1,jsonVersion:"0.0.0",sdkVersion:"0.0.0"});this.editor=t}setConfig(t,r){this.meta[t]=r,this.editor.emit("configChanged",fi({},this.meta))}fromJSON(t){Object.keys(t).forEach(r=>{const d=r==="version"?"jsonVersion":r;d in this.meta&&this.setConfig(d,t[r])})}compareVersion(){compareVersion(this.meta.jsonVersion,this.meta.sdkVersion)===1&&console.warn("vis-core 版本过低,可能会出现问题","json:"+this.meta.jsonVersion,"sdk:"+this.meta.sdkVersion)}toJSON(){return{version:this.meta.sdkVersion}}}const jsonFetch=(m,t,r=!1)=>{const d=esusLite.makePromiseCreator(!0),g=m.endsWith("gzip")||r;return window.fetch(m).then(v=>{let C=v;if(C.ok)return g?C.blob().then(w=>{const I=new DecompressionStream("gzip"),O=w.stream().pipeThrough(I);return new Response(O)}):C;throw new Error("Network response was not ok.")}).then(v=>v.json()).then(v=>{d.resolve(v)}).catch(v=>{d.reject(v)}),d.promise};class Editor{constructor(t){T0(this,"selected",null);T0(this,"playing",!0);T0(this,"currentMaterialSlot",0);T0(this,"events",new events.EventEmitter);T0(this,"history");T0(this,"viewport");T0(this,"hooks");T0(this,"config");T0(this,"pencil");T0(this,"on",this.events.on.bind(this.events));T0(this,"emit",this.events.emit.bind(this.events));T0(this,"options");T0(this,"selectOption",[]);T0(this,"_dispose",!1);this.options=fi({assetsPrefix:"",processUndosMaxFrameTime:Number.MAX_VALUE},t),this.events.setMaxListeners(9999999),this.viewport=new Viewport(this,{visFactories:t.visFactories}),this.history=new History(this),this.hooks=new Hooks(this),this.config=new Config(this),this.config.setConfig("sdkVersion",version)}getObjectMaterial(t,r){if(!t)return;let d=t.material;return Array.isArray(d)&&r!==void 0&&(d=d[r]),d}getMaterialObjectByObject(t,r){const d=this.getObjectMaterial(t,r);if(d){const g=this.pencil.mList.getKey(d);return g?this.pencil.mList.getFixBaseObject(g).object3d:t}else return null}materialObjectByUuid(t){const r=this.pencil.mList.getFixBaseObject(t);return r?r.object3d:this.objectByUuid(t)}uuidByMaterialObject(t){const r=this.pencil.mList.getKey(t.material);return r||this.uuidByObject(t)}setObjectMaterial(t,r,d,g=!1){let v=t.material;Array.isArray(t.material)&&r!==void 0?(v=t.material[r],g&&(t.material=[...t.material]),t.material[r]=d):t.material=d,v&&v.onBeforeCompile&&(d.onBeforeCompile=v.onBeforeCompile)}uuidByObject(t){var r;return(r=this.findSelectItem(this.selectOption,"object",t))==null?void 0:r.key}objectByUuid(t){var r;return(r=this.findSelectItem(this.selectOption,"key",t))==null?void 0:r.object}uuidByBaseObject(t){var r;return(r=this.findSelectItem(this.selectOption,"baseObject",t))==null?void 0:r.key}baseObjectByUuid(t){var r;return(r=this.findSelectItem(this.selectOption,"key",t))==null?void 0:r.baseObject}findSelectItem(t,r,d){for(let g=0;g<t.length;g++){const v=t[g];if(v[r]===d)return v;if(v.children){const C=this.findSelectItem(v.children,r,d);if(C)return C}}}changeSelectOption(){const t=this.viewport.vis,r=d=>d.filter(g=>g.userData.selectHide!==!0).map(g=>{var Ne;const v=[...g.children];if(g.key==="@Scene"&&!v.find(ke=>ke.key==="camera"))this.pencil.camera.name="透视相机",v.unshift({key:"camera",object3d:this.pencil.camera,userData:{},children:this.pencil.camera.children.map(ke=>this.pencil.lead.objMap.get(ke)).filter(ke=>ke)});else if(g.object3d.target){const ke=g.options.type;v.unshift({key:g.key.replace(ke,ke+"Target"),object3d:g.object3d.target,userData:{disabledCR:!0,disabledTC:!1},children:[]})}if(g.object3d.isDirectionalLight){const ke=g.options.type;v.unshift({key:g.key.replace(ke,ke+"Shadow"),object3d:g.object3d.shadow.camera,userData:{disabledCR:!0},children:[]})}const w=v.length>0?r(v):[],I=g.object3d.isGroup&&g.userData.disabledTC!==!1,O=I||["@Scene","camera"].includes(g.key)||g.userData.disabledCR;if(w.length===0&&I)return null;const ye=g.key.replace(g.key[0],g.key[0].toLowerCase()),Se=(Ne=g.userData.disabledTC)!=null?Ne:O,Pe=["Scene","camera"].includes(g.key);return{key:ye==="@Scene"?"scene":ye,name:g.object3d.name,object:g.object3d,visible:Pe?!0:g.object3d.visible,useMaterialType:g.useMaterialType,disabledCR:O,disabledTC:Se,disabledVisible:Pe,baseObject:g,children:w}}).filter(g=>g!==null);this.selectOption=r([t.lead.scene]),this.emit("sceneGraphChanged")}execute(t,r){return U0(this,null,function*(){yield this.history.execute(t,r)})}fromJSON(t,r){return U0(this,null,function*(){var d,g,v,C;try{r&&!f$1(r)?console.warn("fromJSON 第二个参数已修改,{beforeSetVisOptions:(r)=>r} 替代"):r&&this.hooks.addEvents(r);let w;if(typeof t=="string"){const I=this.options.assetsPrefix+t;console.time("vis-core:time.json-fetch");const{res:O,err:ye}=yield jsonFetch(I);if(console.timeEnd("vis-core:time.json-fetch"),ye)throw new Error("fromJSON error:"+ye);w=O}else w=t;if(this.hooks.dispatch("beforeFromJSON"),w=fixJSON(w),w.at&&(accessToken.token=w.at),!this.storage){if(!accessToken.token)throw new Error("设置 token 或平台重新下载 JSON 文件");const I=accessToken.getInfo();if(!I||!I.isValid)throw new Error("need accessToken")}if(this.config.fromJSON(w.c),this.history.fromJSON(w.h),this.viewport.fromJSON(w.v),this.hooks.fromJSON(w.s),this.config.compareVersion(),yield this.history.processUndos(this.options.processUndosMaxFrameTime),(d=w.v.bg)!=null&&d.texture&&this.viewport.vis){const I=parseTexture(w.v.bg.texture);I.colorSpace=SRGBColorSpace,this.viewport.vis.pencil.scene.background=I}return this.hooks.dispatch("beforeShow"),(g=this.viewport.vis)==null||g.show(),this.hooks.dispatch("afterShow"),(v=this.pencil.controls)==null||v.saveState(),this.select(null),(C=this.viewport.vis)!=null&&C.workerOnce&&this.playing&&window.requestIdleCallback(()=>{var I;(I=this.viewport.vis)==null||I.worker.dispose()}),this.hooks.dispatch("afterFromJSON"),w}catch(w){throw this.hooks.dispatch("errorFromJSON"),new Error("fromJSON error:"+w)}})}toJSON(){return{}}select(...t){}setViewportVis(...t){}getDataURL(){return this.pencil?(this.pencil.render(),this.pencil.renderer.domElement.toDataURL()):""}dispose(){this.events.removeAllListeners(),this.viewport.dispose(),this.history.clear(),this.hooks.clear(),this._dispose=!0}}const BLOCKLISTED_GPUS=["geforce 320m","geforce 8600","geforce 8600m gt","geforce 8800 gs","geforce 8800 gt","geforce 9400","geforce 9400m g","geforce 9400m","geforce 9600m gt","geforce 9600m","geforce fx go5200","geforce gt 120","geforce gt 130","geforce gt 330m","geforce gtx 285","google swiftshader","intel g41","intel g45","intel gma 4500mhd","intel gma x3100","intel hd 3000","intel q45","legacy","mali-2","mali-3","mali-4","quadro fx 1500","quadro fx 4","quadro fx 5","radeon hd 2400","radeon hd 2600","radeon hd 4670","radeon hd 4850","radeon hd 4870","radeon hd 5670","radeon hd 5750","radeon hd 6290","radeon hd 6300","radeon hd 6310","radeon hd 6320","radeon hd 6490m","radeon hd 6630m","radeon hd 6750m","radeon hd 6770m","radeon hd 6970m","sgx 543","sgx543"],apple=[],amd=["2","3","4","6","12","15","25","48","455","535","555","575","600","610","625","630","640","694","699","740","880","900","2000","2270","2600","3200","3800","3900","4000","4150","4170","4190","4250","4800","5170","5400","5450","5470","5650","5670","5730","5750","5950","6150","6230","6250","6290","6300","6310","6320","6350","6370","6380","6410","6450","6460","6470","6480","6490","6510","6520","6530","6540","6550","6570","6620","6630","6670","6730","6760","6790","6980","7290","7310","7340","7400","7420","7450","7480","7500","7520","7540","7550","7610","7620","7640","7650","7670","7730","7820","8180","8210","8240","8250","8330","8350","8400","8410","8450","8490","8500","8510","8530","8600","8610","8690","8730","8760","8850","9171","9173","9874","10000","v","9999999999"],radeon=["2","3","4","6","25","48","455","535","555","575","610","625","630","640","740","880","1305","1605","2600","3200","4150","4250","5000","5400","5450","5470","5650","5670","5730","5750","5770","6230","6250","6290","6300","6310","6320","6350","6370","6380","6410","6450","6460","6470","6480","6490","6510","6520","6530","6540","6550","6570","6620","6630","6670","6730","6760","6790","7000","7290","7310","7340","7400","7420","7450","7480","7500","7520","7540","7550","7610","7620","7640","7650","7670","7730","8180","8210","8240","8250","8330","8350","8400","8410","8450","8490","8500","8510","8530","8600","8610","8690","8730","8850","9171","9173"],nvidia=["1","6","15","51","120","130","140","160","180","210","220","260","295","310","315","320","410","415","420","425","430","440","445","510","525","530","540","545","555","590","605","610","615","625","630","635","705","710","720","730","735","755","765","800","810","820","840","845","860","910","945","1010","1100","1800","2800","5010","5400","8400","8600","9300","9400","9600","9800","gpu","prexpe"],geforce=["10","120","130","210","240","280","295","320","410","415","420","425","430","440","445","510","520","525","530","540","545","555","590","605","610","615","620","625","630","635","705","710","720","730","735","755","765","800","810","820","840","845","860","910","945","1010","2075","8400","8600","9300","9400","9600","9800","gpu","prexpe"],adreno=["5","7","540","618","630","675","680","685"],tier0GPU={apple,amd,radeon,nvidia,geforce,adreno},types=["intel","apple","amd","radeon","nvidia","geforce","adreno"];class Benchmarks{constructor(t){T0(this,"renderer");this.renderer=t}query(){const t=this.renderer,r=this.getGpuType();if(!r)return this.queryFallback();if(r==="intel")return{tier:0,gpu:t};const d=tier0GPU[r],g=this.getGPUVersion();return d.includes(g)?{tier:0,renderer:t}:this.queryFallback()}getGpuType(){const t=this.renderer;for(const r of types)if(t.includes(r))return r}getGPUVersion(){var g;const r=this.renderer.replace(/\([^)]+\)/,""),d=r.match(/\d+/)||r.match(/(\W|^)([A-Za-z]{1,3})(\W|$)/g);return(g=d==null?void 0:d.join("").replace(/\W|amd/g,""))!=null?g:""}queryFallback(){const t=this.renderer,r=BLOCKLISTED_GPUS.find(d=>t.includes(d));return r?{tier:0,gpu:r}:{tier:3,gpu:t}}}class WebGL{constructor(){T0(this,"rawRenderer");T0(this,"renderer");const t=this.getRawRenderer();this.rawRenderer=t;const r=this.getRenderer();this.renderer=r}getRawRenderer(){try{const r=document.createElement("canvas").getContext("webgl"),d=r==null?void 0:r.getExtension("WEBGL_debug_renderer_info");return r&&d?r.getParameter(d.UNMASKED_RENDERER_WEBGL):""}catch(t){return""}}getRenderer(){const t=this.rawRenderer;return t?t.toLowerCase().replace(/.*angle ?\((.+)\)(?: on vulkan [0-9.]+)?$/i,"$1").replace(/\s(\d{1,2}gb|direct3d.+$)|\(r\)| \([^)]+\)$/g,"").replace(/(?:vulkan|opengl) \d+\.\d+(?:\.\d+)?(?: \((.*)\))?/,"$1"):""}query(){return{WebP:this.isWebPAvailable(),WebGL:this.isWebGLAvailable(),WebGL2:this.isWebGL2Available(),WebGL2RC:this.isWebGL2RenderingContextAvailable(),isGPUAcceleratorEnabled:this.isGPUAcceleratorAvailable()}}isWebGLAvailable(){try{const t=document.createElement("canvas");return!!(window.WebGLRenderingContext&&(t.getContext("webgl")||t.getContext("experimental-webgl")))}catch(t){return!1}}isWebGL2Available(){try{const t=document.createElement("canvas");return!!(window.WebGL2RenderingContext&&t.getContext("webgl2"))}catch(t){return!1}}isWebGL2RenderingContextAvailable(){return typeof window.WebGL2RenderingContext!="undefined"}isGPUAcceleratorAvailable(){const t=this.rawRenderer;return!/SwiftShader/gi.test(t)}isColorSpaceAvailable(t){try{const r=document.createElement("canvas"),d=window.WebGL2RenderingContext&&r.getContext("webgl2");return d?(d.drawingBufferColorSpace=t,d.drawingBufferColorSpace===t):!1}catch(r){return!1}}isWebPAvailable(){try{return document.createElement("canvas").toDataURL("image/webp").indexOf("data:image/webp")===0}catch(t){return!1}}}const detect=()=>{try{const m=new WebGL,t=new Benchmarks(m.renderer);return fi(fi({},m.query()),t.query())}catch(m){return console.error("vis-core: feature detection failed",m),{tier:0}}},getScale=m=>{const r=window.getComputedStyle(m).transform;if(r&&r!=="none"){const d=new DOMMatrix(r);return Math.max(d.a,d.d)}};function observeScale(m,t){let r=m,d=1;for(;r;){const I=getScale(r);if(I!==void 0){d=I;break}if(r=r.parentElement,r===document.body){r=null;break}}if(!r)return null;const g=I=>{const O=getScale(r)||1;d!==O&&(d=O,t(O,I))},v=I=>{I.propertyName==="transform"&&g("transitionEnd")},C=new MutationObserver(I=>{for(const O of I)if(O.type==="attributes"&&O.attributeName==="style"){g("MutationObserver");return}});C.observe(r,{attributes:!0,attributeFilter:["style"]}),r.addEventListener("transitionend",v),t(d,"init");const w=C.disconnect;return C.disconnect=function(){w.call(C),r==null||r.removeEventListener("transitionend",v)},C}const IS_DEV=!1;class Base extends Camera{constructor(r){var d;super();T0(this,"playing",!0);T0(this,"leftTruck",!0);T0(this,"options");T0(this,"showState",!1);T0(this,"settings",{});T0(this,"delLoadArr");T0(this,"extendsOptions",{});T0(this,"leadObjs",objs$3);T0(this,"lead");T0(this,"mList");T0(this,"workerOnce",!0);T0(this,"tier0",!1);T0(this,"pmremGenerator",null);T0(this,"re",null);T0(this,"roomEnvMap");T0(this,"visName");T0(this,"editor");T0(this,"publicDir",{});T0(this,"_baseObjectByUuid");T0(this,"_objectByUuid");T0(this,"observeScale",null);T0(this,"sceneActive",-1);T0(this,"initSettingsObj");T0(this,"mouseButtonsActiveStore",null);if(this.container=r.container,this.options=fi({assetsPrefix:"",editor:!0,logarithmicDepthBuffer:!0,observeParentScale:!0},r),!this.options.assetsPrefix){let g="/";g==="/"&&(g=""),this.options.assetsPrefix=g}this.options.workerOnce!==void 0&&(this.workerOnce=this.options.workerOnce);try{const g=window.location.search.match(/v_ldb=(\d+)/);if(g){const v=!!+g[1];this.options.logarithmicDepthBuffer=v}}catch(g){console.error(g)}if(this.options.editor){const g=detect();let v=(d=this.options.tier)!=null?d:g.tier;try{const C=window.location.search.match(/v_tier=(\d+)/);C&&(v=+C[1])}catch(C){console.error(C)}this.tier0=v!==3,this.editor=new Editor({assetsPrefix:this.options.assetsPrefix,visFactories:this}),console.info("vis-core:detect",version,JSON.stringify(Ui(fi({},g),{ldb:this.options.logarithmicDepthBuffer,tier0:this.tier0}),null,2))}this.visName=this.constructor.VisName}get loader(){return this.pencil.loader}get worker(){return this.pencil.installPlugins.get("worker")}setOptions(r){this.options=fi(fi({},this.options),r)}get fromJSON(){return this.editor.fromJSON.bind(this.editor)}get baseObjectByUuid(){var r;return((r=this.editor)==null?void 0:r.baseObjectByUuid.bind(this.editor))||this._baseObjectByUuid}get objectByUuid(){var r;return((r=this.editor)==null?void 0:r.objectByUuid.bind(this.editor))||this._objectByUuid}get getDataURL(){return this.editor.getDataURL.bind(this.editor)}loaderAdd(...r){}initMaterial(...r){return U0(this,null,function*(){})}initVis(...r){return U0(this,null,function*(){})}init(...r){return U0(this,null,function*(){yield this.initPencil(),this.loaderAdd(),console.time(`vis-core:time.${this.visName}-loader`),yield this.loader.loadAll(),console.timeEnd(`vis-core:time.${this.visName}-loader`),yield this.initMaterial(),yield this.initVis(),yield Promise.all(this.lead.objectsPromise)})}initPencil(){return U0(this,null,function*(){var g,v,C,w,I,O,ye,Se;if(this.pencil)return;const r=fi({},this.options.pencilConfig);if(this.options.css2DContainer&&(r.css2DRendererParams={container:this.options.css2DContainer}),this.options.pencil)this.pencil=this.options.pencil,this.sceneActive=this.pencil.addPage({cameraOptions:{fov:(v=(g=r.camera)==null?void 0:g.fov)!=null?v:45,near:(w=(C=r.camera)==null?void 0:C.near)!=null?w:.1,far:(O=(I=r.camera)==null?void 0:I.far)!=null?O:1e3,up:(Se=(ye=r.camera)==null?void 0:ye.up)!=null?Se:new Vector3(0,1,0)},sceneOptions:{background:new Color$1(0)}}),this.setSceneActive();else if(this.options.pencil2){this.pencil=this.options.pencil2,this.lead=this.pencil.lead.init(this.leadObjs),this.mList=this.pencil.mList,this.sceneActive=this.pencil.pageActiveIndex;return}else{const Pe=new ot(fi(Ui(fi({container:this.container,stats:!this.playing&&IS_DEV,helper:!this.playing,viewHelper:!this.playing,transformControls:!this.playing,css2DRenderer:!0},this.tier0?{composer:{multisampling:0}}:{}),{renderer:{alpha:!0,logarithmicDepthBuffer:this.options.logarithmicDepthBuffer},camera:{near:.1,far:1e3,fov:45,up:new Vector3(0,1,0)},bloom:!0,ssao:!0,ssaoParams:{minDistance:.001},scene:{background:new Color$1(0)},loader:fi({prefix:this.options.assetsPrefix,simpleTexture4deleted:!0},this.tier0?{anisotropy:1}:{})}),r));if(this.options.observeParentScale&&this.playing){const ht=()=>{this.observeScale||(this.observeScale=observeScale(this.container,(He,Fe)=>{Pe.setDevicePixelRatio(window.devicePixelRatio*He)}))};ht(),Pe.event.on("resize",()=>{ht()})}this.pencil=Pe,this.sceneActive=1;const Ne=Pe.composerController.ssaoPass;Ne&&(Ne.enabled=!1);const ke=new Q({dbName:this.visName,cacheVersion:version});Pe.use(ke),this.playing||(window.vis=this,window.pencil=Pe)}const d=this.pencil;this.lead=d.lead.init(this.leadObjs),this.mList=d.mList,this.delLoadArr&&(d.loader.delLoadArr=this.delLoadArr),d.loader.on("progress",(...Pe)=>{this.showState!==!0&&this.emit("loaderProgress",...Pe)}),this.leftTruck&&(d.controls.mouseButtons.left=Gi.TRUCK,d.controls.mouseButtons.right=Gi.ROTATE),this.lead.group.hide(),this.lead.prefabGroup.hide(),this.initSceneUserData(),this.initCameraUserData(),this.initSettings()})}setSceneActive(){this.pencil.showPage(this.sceneActive)}initCameraUserData(){const r=this.pencil;r.camera.userData=new Proxy({up:r.camera.up.toArray().join(",")},{set:(d,g,v)=>{if(g==="up"){const C=v.split(",").map(w=>+w);r.camera.up.fromArray(C),r.controls.updateCameraUp()}return Reflect.set(d,g,v)}})}initSceneUserData(){var w,I,O,ye,Se,Pe;const r=this.pencil,d=r.scene.background,g=d instanceof Color$1?"Color":d instanceof Texture?"Texture":"None",v=g==="Texture"?d:null,C=g==="Color"?"#"+d.getHexString():"#000000";r.scene.userData=new Proxy({backgroundType:g,backgroundColor:C,backgroundTexture:v,shadowMapEnabled:this.pencil.renderer.shadowMap.enabled,shadowMapType:this.pencil.renderer.shadowMap.type,bloomThreshold:(I=(w=this.pencil.composerController)==null?void 0:w.bloomPass)==null?void 0:I.threshold,bloomRadius:(ye=(O=this.pencil.composerController)==null?void 0:O.bloomPass)==null?void 0:ye.radius,bloomStrength:(Pe=(Se=this.pencil.composerController)==null?void 0:Se.bloomPass)==null?void 0:Pe.strength},{set:(Ne,ke,ht)=>(ke==="shadowMapEnabled"||ke==="shadowMapType"?(ke==="shadowMapEnabled"?this.pencil.renderer.shadowMap.enabled=ht:ke==="shadowMapType"&&(this.pencil.renderer.shadowMap.type=ht),this.pencil.scene.traverse(He=>{const Fe=He;if(Fe.receiveShadow&&Fe.material){const at=Fe.material;Array.isArray(at)?at.forEach(ct=>{ct.needsUpdate=!0}):at.needsUpdate=!0}})):ke==="backgroundType"?ht==="None"?r.scene.background=null:r.scene.userData.backgroundColor?r.scene.background=new Color$1(r.scene.userData.backgroundColor):r.scene.userData.backgroundTexture&&(r.scene.background=r.scene.userData.backgroundTexture):ke==="backgroundColor"?r.scene.background=new Color$1(ht):ke==="backgroundTexture"?r.scene.background=ht:ke==="bloomThreshold"?r.composerController.bloomPass&&(r.composerController.bloomPass.threshold=ht):ke==="bloomRadius"?r.composerController.bloomPass&&(r.composerController.bloomPass.radius=ht):ke==="bloomStrength"&&r.composerController.bloomPass&&(r.composerController.bloomPass.strength=ht),Reflect.set(Ne,ke,ht))})}initBaseObjectUserData(r){const d=Ui(fi({},r.object3d.userData),{bloom:!1});if(r.objectType==="BaseObject#Light")return;const g=r.objectType==="BaseObject#Arc",v=r.objectType==="BaseObject#Line",C=r.object3d instanceof Group$1;g?d.animationDuration=2e3:v&&(d.animationDuration=0),prefabType.includes(r.objectType.split("#")[1])&&(d.prefab=r.prefab),r.object3d.userData=new Proxy(d,{set:(w,I,O)=>(I==="bloom"?O?r.enableBloom():r.disableBloom():I==="prefab"?(r.prefab=O,O?this.lead.prefabGroup.attach(r):this.lead.group.attach(r)):I==="animationDuration"&&g?r.animateIn({duration:O}):I==="animationDuration"&&(v||C)&&(v?[r]:r.children).forEach(Se=>{Se.material.userData.tween&&(Se.material.userData.tween.stop(),remove(Se.material.userData.tween),Se.material.userData.tween=null),O&&(Se.material.uniforms.offset.value.x=1,Se.material.uniforms.offsetLoop.value=1,Se.animate({duration:O,repeat:1/0,lineLoop:!0,startShow:!0}))}),Reflect.set(w,I,O))})}addCSS3DRenderer(){this.pencil&&this.pencil.cssRendererController.addRenderer("css3d",{container:this.pencil.cssRendererController.container,zIndex:"auto"})}initSettings(){const r={mouseLeft:this.pencil.controls.mouseButtons.left,mouseRight:this.pencil.controls.mouseButtons.right,mouseWheel:this.pencil.controls.mouseButtons.wheel};this.settings=new Proxy(Ui(fi(fi({},this.initSettingsObj),r),{mouseNone:!1,viewportPadding:[0,0,0,0]}),{set:(d,g,v)=>{if(!(g in d)&&!(g.replace(/(:::.+)\..*$/,"$1")in d))return Reflect.set({},g,v);g==="mouseWheel"?typeof v=="boolean"&&(v=v?r.mouseWheel:Gi.NONE):g==="mouseLeft"?typeof v=="boolean"&&(v=v?r.mouseLeft:Gi.NONE):g==="mouseRight"&&typeof v=="boolean"&&(v=v?r.mouseRight:Gi.NONE);const C=g.includes(":::");return Reflect.set(d,C?g.replace(/(:::.+)\..*$/,"$1"):g,this.handleSetting(g,v))},get:(d,g)=>{const C=g.includes(":::")?g.replace(/(:::.+)\..*$/,"$1"):g,w=Reflect.get(d,C);return w instanceof Promise?w.then(I=>(Reflect.set(d,C,I),I)):w}})}handleSetting(r,d){return U0(this,null,function*(){const{pencil:g}=this;if(r==="mouseWheel"||r==="mouseLeft"||r==="mouseRight"){const v=r.replace("mouse","").toLowerCase();(d||this.playing)&&(g.controls.mouseButtons[v]=d)}else r==="mouseNone"?d?(this.mouseButtonsActiveStore={mouseLeft:g.controls.mouseButtons.left,mouseRight:g.controls.mouseButtons.right,mouseWheel:g.controls.mouseButtons.wheel},g.controls.mouseButtons.left=Gi.NONE,g.controls.mouseButtons.right=Gi.NONE,g.controls.mouseButtons.wheel=Gi.NONE):this.mouseButtonsActiveStore&&(g.controls.mouseButtons.left=this.mouseButtonsActiveStore.mouseLeft,g.controls.mouseButtons.right=this.mouseButtonsActiveStore.mouseRight,g.controls.mouseButtons.wheel=this.mouseButtonsActiveStore.mouseWheel):r==="viewportPadding"&&g.setViewPadding(...d);return d})}show(){this.showState||(this.useSaveCamera("visShow"),this.options.disableInitShow||this.showAction())}showAction(){this.lead.group.show(),this.playing||this.lead.prefabGroup.show(),this.pencil.start(),this.showState=!0,this.emit("show")}hide(){this.showState&&(this.lead.group.hide(),this.lead.prefabGroup.hide(),this.showState=!1,this.emit("hide"))}addCSS2D(g){return U0(this,arguments,function*(r,d={}){typeof d=="string"&&(d={display:d}),d.display&&(r.style.display=d.display);let v=0;typeof d.onTop!="undefined"&&(v=d.onTop);const C=yield this.lead.draw("Node",{onTop:v});return C.setChildren(r),C})}addCSS3D(g){return U0(this,arguments,function*(r,d={}){d.display&&(r.style.display=d.display);let v=0;typeof d.onTop!="undefined"&&(v=d.onTop);let C="3d";typeof d.type!="undefined"&&(C=d.type);const w=yield this.lead.draw("Node",{onTop:v,type:C});return w.setChildren(r),w})}getRoomEnvMap(){if(this.roomEnvMap)return this.roomEnvMap;const r=new PMREMGenerator(this.pencil.renderer);r.compileEquirectangularShader();const d=new RoomEnvironment,g=r.fromScene(d,.04).texture;return this.pmremGenerator=r,this.re=d,this.roomEnvMap=g,g}handlePick(r,d,g){console.warn("handlePick is deprecated, use BaseObject.onPointerEvent"),this.lead.handlePick(r,d,g)}getScreenPosition(r,d,g){const v=new Vector3(r,d,g);v.project(this.pencil.camera);const{width:C,height:w}=this.pencil.getSize(),I=(v.x*.5+.5)*C,O=(v.y*-.5+.5)*w;return{x:I,y:O}}dispose(){var r,d,g,v;super.dispose(),this.editor&&(this.editor.viewport.vis=void 0,this.editor.dispose()),this.publicDir={},this.options.pencil?this.pencil.removePage(this.sceneActive):this.options.pencil2||(r=this.pencil)==null||r.dispose(),(d=this.pmremGenerator)==null||d.dispose(),(g=this.re)==null||g.dispose(),(v=this.observeScale)==null||v.disconnect()}}T0(Base,"VisName","base");function clipGeojson(m,t){const r=turf.flatten(m).features,d=turf.flatten(t).features,g={type:"FeatureCollection",features:[]};for(let v=r.length-1;v>=0;v--){const C=r[v];for(let w=d.length-1;w>=0;w--){const I=d[w];if(contains(C,I))g.features.push(I);else if(contains(I,C))C.properties=I.properties,g.features.push(C);else{const O=turf.intersect(C,I);O&&(O.properties=I.properties,g.features.push(O))}}}return g}function contains(m,t){let r=!0;const d=turf.explode(t).features;for(let g=d.length-1;g>=0;g--)if(!turf.inside(d[g],m)){r=!1;break}return r}const getBoxMultiPoly=m=>{const t=m.features.map(r=>r.geometry.type==="Polygon"?[r.geometry.coordinates]:r.geometry.coordinates).flat();return Array.from({length:t.length},(r,d)=>turf.polygon(t[d]))};class Building extends ft$1{constructor(r){super();T0(this,"options");T0(this,"building",{});T0(this,"outJson",new Map);T0(this,"worldPositionZ",{value:0});this.options=fi({},r)}create(){return U0(this,null,function*(){const{json:r,projection:d,cacheKey:g,meters:v,grey:C,clip:w}=this.options,I=this.pencil.mList,O=this.pencil.getPlugin("worker"),ye=this.pencil.lead,Se=C?"-grey":"";this.createGroup();const Pe=I.getMultiple("building"+Se);let Ne=g?yield O.getCachedGeometry({cacheKey:g}):[];if(Ne.length)w&&this.outJson.set(1,!0);else{let ke;w&&(ke=getBoxMultiPoly(w));const ht={};(r.features||r).forEach(Fe=>{const at=typeof Fe.properties.h=="string"?Fe.properties.h.split(".")[1]:0,ct=Number(Fe.properties.h)|0;ht[at]||(ht[at]={}),ht[at][ct]||(ht[at][ct]=[]),ke?ke.some(Gt=>{Fe.geometry.coordinates[1]&&console.log(Fe.geometry.coordinates[1]);const Lt=turf.polygon(Fe.geometry.coordinates[0]);return turf.booleanContains(Gt,Lt)?(ht[at][ct].push(Fe),!0):!1})||this.outJson.set(Fe,!1):ht[at][ct].push(Fe)});const He=Object.keys(ht).map(Fe=>{const at=ht[Fe];return Object.keys(at).map(ct=>{const xt=at[ct];return{z:+Fe,h:+ct,coordinatesArr:xt.map(Gt=>Gt.geometry.type==="Polygon"?Gt.geometry.coordinates[0]:Gt.geometry.coordinates[0][0])}})}).flat().filter(Fe=>Fe.coordinatesArr.length);Ne=yield Promise.all(He.map(Fe=>{const{h:at,z:ct,coordinatesArr:xt}=Fe,Gt=+at<=20?+at/18:+at<=60?+at/27:+at/12;return O.geoGeometry("extrudePolygon",{cacheKey:g,userData:{z:ct,h:at},mesaage:{coordinatesArr:xt,projection:d,useGroups:2,depth:[Number(at)*(v||1)],hasBottom:!1,sideRepeat:Gt}})}))}yield Promise.all(Ne.map(ke=>U0(this,null,function*(){const{h:ht,z:He}=ke.userData,Fe=ht+He,at=Fe<=20?"20":Fe<=60?"60":"max";let ct=this.options.material;ct||(ct=[Pe[at+"Top"],Pe[at+"Side"]]);const xt=yield ye.draw("ExtrudePolygon",{key:`$p:-${ht}-${He}`,geometry:ke,material:ct},this);this.options.grey||(xt.object3d.castShadow=!0),this.building[ht]||(this.building[ht]=[]),this.building[ht].push(xt),xt.position.z=Number(He)*(v||1)}))),this.options.sideGradient&&this.sideGradient(),this.object3d.name="建筑",C||this.lead.updateBaseObjectKey(this,`building${Se?"-grey":""}#group`)})}sideGradient(r="#052438",d=.05/100){this.traverse(g=>{if(g instanceof is){const v=g.object3d.material;v[1].onBeforeCompile=C=>{C.uniforms.gradientColor={value:new Color$1(r)},C.uniforms.maxGradientHeight={value:d},C.uniforms.worldPositionZ=this.worldPositionZ,C.vertexShader=`
4857
4857
  varying vec3 vPosition;
4858
4858
  varying vec3 vWorldPosition;
4859
4859
  ${C.vertexShader}