function ECFieldElementFp(t,i){this.x=i,this.q=t}function feFpEquals(t){return t==this||this.q.equals(t.q)&&this.x.equals(t.x)}function feFpToBigInteger(){return this.x}function feFpNegate(){return new ECFieldElementFp(this.q,this.x.negate().mod(this.q))}function feFpAdd(t){return new ECFieldElementFp(this.q,this.x.add(t.toBigInteger()).mod(this.q))}function feFpSubtract(t){return new ECFieldElementFp(this.q,this.x.subtract(t.toBigInteger()).mod(this.q))}function feFpMultiply(t){return new ECFieldElementFp(this.q,this.x.multiply(t.toBigInteger()).mod(this.q))}function feFpSquare(){return new ECFieldElementFp(this.q,this.x.square().mod(this.q))}function feFpDivide(t){return new ECFieldElementFp(this.q,this.x.multiply(t.toBigInteger().modInverse(this.q)).mod(this.q))}function ECPointFp(t,i,e,r){this.curve=t,this.x=i,this.y=e,this.z=null==r?BigInteger.ONE:r,this.zinv=null}function pointFpGetX(){null==this.zinv&&(this.zinv=this.z.modInverse(this.curve.q));var t=this.x.toBigInteger().multiply(this.zinv);return this.curve.reduce(t),this.curve.fromBigInteger(t)}function pointFpGetY(){null==this.zinv&&(this.zinv=this.z.modInverse(this.curve.q));var t=this.y.toBigInteger().multiply(this.zinv);return this.curve.reduce(t),this.curve.fromBigInteger(t)}function pointFpEquals(t){if(t==this)return!0;if(this.isInfinity())return t.isInfinity();if(t.isInfinity())return this.isInfinity();return!!t.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(t.z)).mod(this.curve.q).equals(BigInteger.ZERO)&&t.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(t.z)).mod(this.curve.q).equals(BigInteger.ZERO)}function pointFpIsInfinity(){return null==this.x&&null==this.y||this.z.equals(BigInteger.ZERO)&&!this.y.toBigInteger().equals(BigInteger.ZERO)}function pointFpNegate(){return new ECPointFp(this.curve,this.x,this.y.negate(),this.z)}function pointFpAdd(t){if(this.isInfinity())return t;if(t.isInfinity())return this;var i=t.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(t.z)).mod(this.curve.q),e=t.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(t.z)).mod(this.curve.q);if(BigInteger.ZERO.equals(e))return BigInteger.ZERO.equals(i)?this.twice():this.curve.getInfinity();var r=new BigInteger("3"),n=this.x.toBigInteger(),o=this.y.toBigInteger(),s=(t.x.toBigInteger(),t.y.toBigInteger(),e.square()),F=s.multiply(e),h=n.multiply(s),u=i.square().multiply(this.z),p=u.subtract(h.shiftLeft(1)).multiply(t.z).subtract(F).multiply(e).mod(this.curve.q),f=h.multiply(r).multiply(i).subtract(o.multiply(F)).subtract(u.multiply(i)).multiply(t.z).add(i.multiply(F)).mod(this.curve.q),g=F.multiply(this.z).multiply(t.z).mod(this.curve.q);return new ECPointFp(this.curve,this.curve.fromBigInteger(p),this.curve.fromBigInteger(f),g)}function pointFpTwice(){if(this.isInfinity())return this;if(0==this.y.toBigInteger().signum())return this.curve.getInfinity();var t=new BigInteger("3"),i=this.x.toBigInteger(),e=this.y.toBigInteger(),r=e.multiply(this.z),n=r.multiply(e).mod(this.curve.q),o=this.curve.a.toBigInteger(),s=i.square().multiply(t);BigInteger.ZERO.equals(o)||(s=s.add(this.z.square().multiply(o)));var F=(s=s.mod(this.curve.q)).square().subtract(i.shiftLeft(3).multiply(n)).shiftLeft(1).multiply(r).mod(this.curve.q),h=s.multiply(t).multiply(i).subtract(n.shiftLeft(1)).shiftLeft(2).multiply(n).subtract(s.square().multiply(s)).mod(this.curve.q),u=r.square().multiply(r).shiftLeft(3).mod(this.curve.q);return new ECPointFp(this.curve,this.curve.fromBigInteger(F),this.curve.fromBigInteger(h),u)}function pointFpMultiply(t){if(this.isInfinity())return this;if(0==t.signum())return this.curve.getInfinity();var i,e=t,r=e.multiply(new BigInteger("3")),n=this.negate(),o=this;for(i=r.bitLength()-2;i>0;--i){o=o.twice();var s=r.testBit(i);s!=e.testBit(i)&&(o=o.add(s?this:n))}return o}function pointFpMultiplyTwo(t,i,e){var r;r=t.bitLength()>e.bitLength()?t.bitLength()-1:e.bitLength()-1;for(var n=this.curve.getInfinity(),o=this.add(i);r>=0;)n=n.twice(),t.testBit(r)?n=e.testBit(r)?n.add(o):n.add(this):e.testBit(r)&&(n=n.add(i)),--r;return n}function ECCurveFp(t,i,e){this.q=t,this.a=this.fromBigInteger(i),this.b=this.fromBigInteger(e),this.infinity=new ECPointFp(this,null,null),this.reducer=new Barrett(this.q)}function curveFpGetQ(){return this.q}function curveFpGetA(){return this.a}function curveFpGetB(){return this.b}function curveFpEquals(t){return t==this||this.q.equals(t.q)&&this.a.equals(t.a)&&this.b.equals(t.b)}function curveFpGetInfinity(){return this.infinity}function curveFpFromBigInteger(t){return new ECFieldElementFp(this.q,t)}function curveReduce(t){this.reducer.reduce(t)}function curveFpDecodePointHex(t){switch(parseInt(t.substr(0,2),16)){case 0:return this.infinity;case 2:case 3:return null;case 4:case 6:case 7:var i=(t.length-2)/2,e=t.substr(2,i),r=t.substr(i+2,i);return new ECPointFp(this,this.fromBigInteger(new BigInteger(e,16)),this.fromBigInteger(new BigInteger(r,16)));default:return null}}function curveFpEncodePointHex(t){if(t.isInfinity())return"00";var i=t.getX().toBigInteger().toString(16),e=t.getY().toBigInteger().toString(16),r=this.getQ().toString(16).length;for(r%2!=0&&r++;i.length=0;){var s=i*this[t++]+e[r]+n;n=Math.floor(s/67108864),e[r++]=67108863&s}return n}function am2(t,i,e,r,n,o){for(var s=32767&i,F=i>>15;--o>=0;){var h=32767&this[t],u=this[t++]>>15,p=F*h+u*s;n=((h=s*h+((32767&p)<<15)+e[r]+(1073741823&n))>>>30)+(p>>>15)+F*u+(n>>>30),e[r++]=1073741823&h}return n}function am3(t,i,e,r,n,o){for(var s=16383&i,F=i>>14;--o>=0;){var h=16383&this[t],u=this[t++]>>14,p=F*h+u*s;n=((h=s*h+((16383&p)<<14)+e[r]+n)>>28)+(p>>14)+F*u,e[r++]=268435455&h}return n}function int2char(t){return BI_RM.charAt(t)}function intAt(t,i){var e=BI_RC[t.charCodeAt(i)];return null==e?-1:e}function bnpCopyTo(t){for(var i=this.t-1;i>=0;--i)t[i]=this[i];t.t=this.t,t.s=this.s}function bnpFromInt(t){this.t=1,this.s=t<0?-1:0,t>0?this[0]=t:t<-1?this[0]=t+this.DV:this.t=0}function nbv(t){var i=nbi();return i.fromInt(t),i}function bnpFromString(t,i){var e;if(16==i)e=4;else if(8==i)e=3;else if(256==i)e=8;else if(2==i)e=1;else if(32==i)e=5;else{if(4!=i)return void this.fromRadix(t,i);e=2}this.t=0,this.s=0;for(var r=t.length,n=!1,o=0;--r>=0;){var s=8==e?255&t[r]:intAt(t,r);s<0?"-"==t.charAt(r)&&(n=!0):(n=!1,0==o?this[this.t++]=s:o+e>this.DB?(this[this.t-1]|=(s&(1<>this.DB-o):this[this.t-1]|=s<=this.DB&&(o-=this.DB))}8==e&&0!=(128&t[0])&&(this.s=-1,o>0&&(this[this.t-1]|=(1<0&&this[this.t-1]==t;)--this.t}function bnToString(t){if(this.s<0)return"-"+this.negate().toString(t);var i;if(16==t)i=4;else if(8==t)i=3;else if(2==t)i=1;else if(32==t)i=5;else{if(4!=t)return this.toRadix(t);i=2}var e,r=(1<0)for(F>F)>0&&(n=!0,o=int2char(e));s>=0;)F>(F+=this.DB-i)):(e=this[s]>>(F-=i)&r,F<=0&&(F+=this.DB,--s)),e>0&&(n=!0),n&&(o+=int2char(e));return n?o:"0"}function bnNegate(){var t=nbi();return BigInteger.ZERO.subTo(this,t),t}function bnAbs(){return this.s<0?this.negate():this}function bnCompareTo(t){var i=this.s-t.s;if(0!=i)return i;var e=this.t;if(0!=(i=e-t.t))return this.s<0?-i:i;for(;--e>=0;)if(0!=(i=this[e]-t[e]))return i;return 0}function nbits(t){var i,e=1;return 0!=(i=t>>>16)&&(t=i,e+=16),0!=(i=t>>8)&&(t=i,e+=8),0!=(i=t>>4)&&(t=i,e+=4),0!=(i=t>>2)&&(t=i,e+=2),0!=(i=t>>1)&&(t=i,e+=1),e}function bnBitLength(){return this.t<=0?0:this.DB*(this.t-1)+nbits(this[this.t-1]^this.s&this.DM)}function bnpDLShiftTo(t,i){var e;for(e=this.t-1;e>=0;--e)i[e+t]=this[e];for(e=t-1;e>=0;--e)i[e]=0;i.t=this.t+t,i.s=this.s}function bnpDRShiftTo(t,i){for(var e=t;e=0;--e)i[e+s+1]=this[e]>>n|F,F=(this[e]&o)<=0;--e)i[e]=0;i[s]=F,i.t=this.t+s+1,i.s=this.s,i.clamp()}function bnpRShiftTo(t,i){i.s=this.s;var e=Math.floor(t/this.DB);if(e>=this.t)i.t=0;else{var r=t%this.DB,n=this.DB-r,o=(1<>r;for(var s=e+1;s>r;r>0&&(i[this.t-e-1]|=(this.s&o)<>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;e>=this.DB;r-=t.s}i.s=r<0?-1:0,r<-1?i[e++]=this.DV+r:r>0&&(i[e++]=r),i.t=e,i.clamp()}function bnpMultiplyTo(t,i){var e=this.abs(),r=t.abs(),n=e.t;for(i.t=n+r.t;--n>=0;)i[n]=0;for(n=0;n=0;)t[e]=0;for(e=0;e=i.DV&&(t[e+i.t]-=i.DV,t[e+i.t+1]=1)}t.t>0&&(t[t.t-1]+=i.am(e,i[e],t,2*e,0,1)),t.s=0,t.clamp()}function bnpDivRemTo(t,i,e){var r=t.abs();if(!(r.t<=0)){var n=this.abs();if(n.t0?(r.lShiftTo(h,o),n.lShiftTo(h,e)):(r.copyTo(o),n.copyTo(e));var u=o.t,p=o[u-1];if(0!=p){var f=p*(1<1?o[u-2]>>this.F2:0),g=this.FV/f,a=(1<=0&&(e[e.t++]=1,e.subTo(B,e)),BigInteger.ONE.dlShiftTo(u,B),B.subTo(o,o);o.t=0;){var b=e[--c]==p?this.DM:Math.floor(e[c]*g+(e[c-1]+l)*a);if((e[c]+=o.am(0,b,e,m,0,u))0&&e.rShiftTo(h,e),s<0&&BigInteger.ZERO.subTo(e,e)}}}function bnMod(t){var i=nbi();return this.abs().divRemTo(t,null,i),this.s<0&&i.compareTo(BigInteger.ZERO)>0&&t.subTo(i,i),i}function Classic(t){this.m=t}function cConvert(t){return t.s<0||t.compareTo(this.m)>=0?t.mod(this.m):t}function cRevert(t){return t}function cReduce(t){t.divRemTo(this.m,null,t)}function cMulTo(t,i,e){t.multiplyTo(i,e),this.reduce(e)}function cSqrTo(t,i){t.squareTo(i),this.reduce(i)}function bnpInvDigit(){if(this.t<1)return 0;var t=this[0];if(0==(1&t))return 0;var i=3&t;return i=i*(2-(15&t)*i)&15,i=i*(2-(255&t)*i)&255,i=i*(2-((65535&t)*i&65535))&65535,i=i*(2-t*i%this.DV)%this.DV,i>0?this.DV-i:-i}function Montgomery(t){this.m=t,this.mp=t.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<0&&this.m.subTo(i,i),i}function montRevert(t){var i=nbi();return t.copyTo(i),this.reduce(i),i}function montReduce(t){for(;t.t<=this.mt2;)t[t.t++]=0;for(var i=0;i>15)*this.mpl&this.um)<<15)&t.DM;for(t[e=i+this.m.t]+=this.m.am(0,r,t,i,0,this.m.t);t[e]>=t.DV;)t[e]-=t.DV,t[++e]++}t.clamp(),t.drShiftTo(this.m.t,t),t.compareTo(this.m)>=0&&t.subTo(this.m,t)}function montSqrTo(t,i){t.squareTo(i),this.reduce(i)}function montMulTo(t,i,e){t.multiplyTo(i,e),this.reduce(e)}function bnpIsEven(){return 0==(this.t>0?1&this[0]:this.s)}function bnpExp(t,i){if(t>4294967295||t<1)return BigInteger.ONE;var e=nbi(),r=nbi(),n=i.convert(this),o=nbits(t)-1;for(n.copyTo(e);--o>=0;)if(i.sqrTo(e,r),(t&1<0)i.mulTo(r,n,e);else{var s=e;e=r,r=s}return i.revert(e)}function bnModPowInt(t,i){var e;return e=t<256||i.isEven()?new Classic(i):new Montgomery(i),this.exp(t,e)}function bnClone(){var t=nbi();return this.copyTo(t),t}function bnIntValue(){if(this.s<0){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<>24}function bnShortValue(){return 0==this.t?this.s:this[0]<<16>>16}function bnpChunkSize(t){return Math.floor(Math.LN2*this.DB/Math.log(t))}function bnSigNum(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1}function bnpToRadix(t){if(null==t&&(t=10),0==this.signum()||t<2||t>36)return"0";var i=this.chunkSize(t),e=Math.pow(t,i),r=nbv(e),n=nbi(),o=nbi(),s="";for(this.divRemTo(r,n,o);n.signum()>0;)s=(e+o.intValue()).toString(t).substr(1)+s,n.divRemTo(r,n,o);return o.intValue().toString(t)+s}function bnpFromRadix(t,i){this.fromInt(0),null==i&&(i=10);for(var e=this.chunkSize(i),r=Math.pow(i,e),n=!1,o=0,s=0,F=0;F=e&&(this.dMultiply(r),this.dAddOffset(s,0),o=0,s=0))}o>0&&(this.dMultiply(Math.pow(i,o)),this.dAddOffset(s,0)),n&&BigInteger.ZERO.subTo(this,this)}function bnpFromNumber(t,i,e){if("number"==typeof i)if(t<2)this.fromInt(1);else for(this.fromNumber(t,e),this.testBit(t-1)||this.bitwiseTo(BigInteger.ONE.shiftLeft(t-1),op_or,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(i);)this.dAddOffset(2,0),this.bitLength()>t&&this.subTo(BigInteger.ONE.shiftLeft(t-1),this);else{var r=new Array,n=7&t;r.length=1+(t>>3),i.nextBytes(r),n>0?r[0]&=(1<0)for(r>r)!=(this.s&this.DM)>>r&&(i[n++]=e|this.s<=0;)r<8?(e=(this[t]&(1<>(r+=this.DB-8)):(e=this[t]>>(r-=8)&255,r<=0&&(r+=this.DB,--t)),0!=(128&e)&&(e|=-256),0==n&&(128&this.s)!=(128&e)&&++n,(n>0||e!=this.s)&&(i[n++]=e);return i}function bnEquals(t){return 0==this.compareTo(t)}function bnMin(t){return this.compareTo(t)<0?this:t}function bnMax(t){return this.compareTo(t)>0?this:t}function bnpBitwiseTo(t,i,e){var r,n,o=Math.min(t.t,this.t);for(r=0;r>=16,i+=16),0==(255&t)&&(t>>=8,i+=8),0==(15&t)&&(t>>=4,i+=4),0==(3&t)&&(t>>=2,i+=2),0==(1&t)&&++i,i}function bnGetLowestSetBit(){for(var t=0;t=this.t?0!=this.s:0!=(this[i]&1<>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;e>=this.DB;r+=t.s}i.s=r<0?-1:0,r>0?i[e++]=r:r<-1&&(i[e++]=this.DV+r),i.t=e,i.clamp()}function bnAdd(t){var i=nbi();return this.addTo(t,i),i}function bnSubtract(t){var i=nbi();return this.subTo(t,i),i}function bnMultiply(t){var i=nbi();return this.multiplyTo(t,i),i}function bnSquare(){var t=nbi();return this.squareTo(t),t}function bnDivide(t){var i=nbi();return this.divRemTo(t,i,null),i}function bnRemainder(t){var i=nbi();return this.divRemTo(t,null,i),i}function bnDivideAndRemainder(t){var i=nbi(),e=nbi();return this.divRemTo(t,i,e),new Array(i,e)}function bnpDMultiply(t){this[this.t]=this.am(0,t-1,this,0,0,this.t),++this.t,this.clamp()}function bnpDAddOffset(t,i){if(0!=t){for(;this.t<=i;)this[this.t++]=0;for(this[i]+=t;this[i]>=this.DV;)this[i]-=this.DV,++i>=this.t&&(this[this.t++]=0),++this[i]}}function NullExp(){}function nNop(t){return t}function nMulTo(t,i,e){t.multiplyTo(i,e)}function nSqrTo(t,i){t.squareTo(i)}function bnPow(t){return this.exp(t,new NullExp)}function bnpMultiplyLowerTo(t,i,e){var r=Math.min(this.t+t.t,i);for(e.s=0,e.t=r;r>0;)e[--r]=0;var n;for(n=e.t-this.t;r=0;)e[r]=0;for(r=Math.max(i-this.t,0);r2*this.m.t)return t.mod(this.m);if(t.compareTo(this.m)<0)return t;var i=nbi();return t.copyTo(i),this.reduce(i),i}function barrettRevert(t){return t}function barrettReduce(t){for(t.drShiftTo(this.m.t-1,this.r2),t.t>this.m.t+1&&(t.t=this.m.t+1,t.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);t.compareTo(this.r2)<0;)t.dAddOffset(1,this.m.t+1);for(t.subTo(this.r2,t);t.compareTo(this.m)>=0;)t.subTo(this.m,t)}function barrettSqrTo(t,i){t.squareTo(i),this.reduce(i)}function barrettMulTo(t,i,e){t.multiplyTo(i,e),this.reduce(e)}function bnModPow(t,i){var e,r,n=t.bitLength(),o=nbv(1);if(n<=0)return o;e=n<18?1:n<48?3:n<144?4:n<768?5:6,r=n<8?new Classic(i):i.isEven()?new Barrett(i):new Montgomery(i);var s=new Array,F=3,h=e-1,u=(1<1){var p=nbi();for(r.sqrTo(s[1],p);F<=u;)s[F]=nbi(),r.mulTo(p,s[F-2],s[F]),F+=2}var f,g,a=t.t-1,l=!0,c=nbi();for(n=nbits(t[a])-1;a>=0;){for(n>=h?f=t[a]>>n-h&u:(f=(t[a]&(1<0&&(f|=t[a-1]>>this.DB+n-h)),F=e;0==(1&f);)f>>=1,--F;if((n-=F)<0&&(n+=this.DB,--a),l)s[f].copyTo(o),l=!1;else{for(;F>1;)r.sqrTo(o,c),r.sqrTo(c,o),F-=2;F>0?r.sqrTo(o,c):(g=o,o=c,c=g),r.mulTo(c,s[f],o)}for(;a>=0&&0==(t[a]&1<0&&(i.rShiftTo(o,i),e.rShiftTo(o,e));i.signum()>0;)(n=i.getLowestSetBit())>0&&i.rShiftTo(n,i),(n=e.getLowestSetBit())>0&&e.rShiftTo(n,e),i.compareTo(e)>=0?(i.subTo(e,i),i.rShiftTo(1,i)):(e.subTo(i,e),e.rShiftTo(1,e));return o>0&&e.lShiftTo(o,e),e}function bnpModInt(t){if(t<=0)return 0;var i=this.DV%t,e=this.s<0?t-1:0;if(this.t>0)if(0==i)e=this[0]%t;else for(var r=this.t-1;r>=0;--r)e=(i*e+this[r])%t;return e}function bnModInverse(t){var i=t.isEven();if(this.isEven()&&i||0==t.signum())return BigInteger.ZERO;for(var e=t.clone(),r=this.clone(),n=nbv(1),o=nbv(0),s=nbv(0),F=nbv(1);0!=e.signum();){for(;e.isEven();)e.rShiftTo(1,e),i?(n.isEven()&&o.isEven()||(n.addTo(this,n),o.subTo(t,o)),n.rShiftTo(1,n)):o.isEven()||o.subTo(t,o),o.rShiftTo(1,o);for(;r.isEven();)r.rShiftTo(1,r),i?(s.isEven()&&F.isEven()||(s.addTo(this,s),F.subTo(t,F)),s.rShiftTo(1,s)):F.isEven()||F.subTo(t,F),F.rShiftTo(1,F);e.compareTo(r)>=0?(e.subTo(r,e),i&&n.subTo(s,n),o.subTo(F,o)):(r.subTo(e,r),i&&s.subTo(n,s),F.subTo(o,F))}return 0!=r.compareTo(BigInteger.ONE)?BigInteger.ZERO:F.compareTo(t)>=0?F.subtract(t):F.signum()<0?(F.addTo(t,F),F.signum()<0?F.add(t):F):F}function bnIsProbablePrime(t){var i,e=this.abs();if(1==e.t&&e[0]<=lowprimes[lowprimes.length-1]){for(i=0;i>1)>lowprimes.length&&(t=lowprimes.length);for(var n=nbi(),o=0;o