/**
 * Skipped minification because the original files appears to be already minified.
 * Original file: /npm/sadi-sdk-ts@1.1.87/index.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
var t=1e-6,e="undefined"!=typeof Float32Array?Float32Array:Array;function create$6(){var t=new e(4);return e!=Float32Array&&(t[1]=0,t[2]=0),t[0]=1,t[3]=1,t}function fromValues$4(t,l,n,i){var a=new e(4);return a[0]=t,a[1]=l,a[2]=n,a[3]=i,a}function invert$2(t,e){var l=e[0],n=e[1],i=e[2],a=e[3],h=l*a-i*n;return h?(h=1/h,t[0]=a*h,t[1]=-n*h,t[2]=-i*h,t[3]=l*h,t):null}function create$5(){var t=new e(9);return e!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t}function fromValues$3(t,l,n,i,a,h,s,o,r){var c=new e(9);return c[0]=t,c[1]=l,c[2]=n,c[3]=i,c[4]=a,c[5]=h,c[6]=s,c[7]=o,c[8]=r,c}function invert$1(t,e){var l=e[0],n=e[1],i=e[2],a=e[3],h=e[4],s=e[5],o=e[6],r=e[7],c=e[8],u=c*h-s*r,g=-c*a+s*o,d=r*a-h*o,I=l*u+n*g+i*d;return I?(I=1/I,t[0]=u*I,t[1]=(-c*n+i*r)*I,t[2]=(s*n-i*h)*I,t[3]=g*I,t[4]=(c*l-i*o)*I,t[5]=(-s*l+i*a)*I,t[6]=d*I,t[7]=(-r*l+n*o)*I,t[8]=(h*l-n*a)*I,t):null}function create$4(){var t=new e(16);return e!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t}function clone$1(t){var l=new e(16);return l[0]=t[0],l[1]=t[1],l[2]=t[2],l[3]=t[3],l[4]=t[4],l[5]=t[5],l[6]=t[6],l[7]=t[7],l[8]=t[8],l[9]=t[9],l[10]=t[10],l[11]=t[11],l[12]=t[12],l[13]=t[13],l[14]=t[14],l[15]=t[15],l}function identity(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function invert(t,e){var l=e[0],n=e[1],i=e[2],a=e[3],h=e[4],s=e[5],o=e[6],r=e[7],c=e[8],u=e[9],g=e[10],d=e[11],I=e[12],p=e[13],Z=e[14],G=e[15],m=l*s-n*h,C=l*o-i*h,b=l*r-a*h,f=n*o-i*s,W=n*r-a*s,X=i*r-a*o,y=c*p-u*I,v=c*Z-g*I,V=c*G-d*I,B=u*Z-g*p,Y=u*G-d*p,S=g*G-d*Z,T=m*S-C*Y+b*B+f*V-W*v+X*y;return T?(T=1/T,t[0]=(s*S-o*Y+r*B)*T,t[1]=(i*Y-n*S-a*B)*T,t[2]=(p*X-Z*W+G*f)*T,t[3]=(g*W-u*X-d*f)*T,t[4]=(o*V-h*S-r*v)*T,t[5]=(l*S-i*V+a*v)*T,t[6]=(Z*b-I*X-G*C)*T,t[7]=(c*X-g*b+d*C)*T,t[8]=(h*Y-s*V+r*y)*T,t[9]=(n*V-l*Y-a*y)*T,t[10]=(I*W-p*b+G*m)*T,t[11]=(u*b-c*W-d*m)*T,t[12]=(s*v-h*B-o*y)*T,t[13]=(l*B-n*v+i*y)*T,t[14]=(p*C-I*f-Z*m)*T,t[15]=(c*f-u*C+g*m)*T,t):null}function multiply(t,e,l){var n=e[0],i=e[1],a=e[2],h=e[3],s=e[4],o=e[5],r=e[6],c=e[7],u=e[8],g=e[9],d=e[10],I=e[11],p=e[12],Z=e[13],G=e[14],m=e[15],C=l[0],b=l[1],f=l[2],W=l[3];return t[0]=C*n+b*s+f*u+W*p,t[1]=C*i+b*o+f*g+W*Z,t[2]=C*a+b*r+f*d+W*G,t[3]=C*h+b*c+f*I+W*m,C=l[4],b=l[5],f=l[6],W=l[7],t[4]=C*n+b*s+f*u+W*p,t[5]=C*i+b*o+f*g+W*Z,t[6]=C*a+b*r+f*d+W*G,t[7]=C*h+b*c+f*I+W*m,C=l[8],b=l[9],f=l[10],W=l[11],t[8]=C*n+b*s+f*u+W*p,t[9]=C*i+b*o+f*g+W*Z,t[10]=C*a+b*r+f*d+W*G,t[11]=C*h+b*c+f*I+W*m,C=l[12],b=l[13],f=l[14],W=l[15],t[12]=C*n+b*s+f*u+W*p,t[13]=C*i+b*o+f*g+W*Z,t[14]=C*a+b*r+f*d+W*G,t[15]=C*h+b*c+f*I+W*m,t}function translate(t,e,l){var n,i,a,h,s,o,r,c,u,g,d,I,p=l[0],Z=l[1],G=l[2];return e===t?(t[12]=e[0]*p+e[4]*Z+e[8]*G+e[12],t[13]=e[1]*p+e[5]*Z+e[9]*G+e[13],t[14]=e[2]*p+e[6]*Z+e[10]*G+e[14],t[15]=e[3]*p+e[7]*Z+e[11]*G+e[15]):(n=e[0],i=e[1],a=e[2],h=e[3],s=e[4],o=e[5],r=e[6],c=e[7],u=e[8],g=e[9],d=e[10],I=e[11],t[0]=n,t[1]=i,t[2]=a,t[3]=h,t[4]=s,t[5]=o,t[6]=r,t[7]=c,t[8]=u,t[9]=g,t[10]=d,t[11]=I,t[12]=n*p+s*Z+u*G+e[12],t[13]=i*p+o*Z+g*G+e[13],t[14]=a*p+r*Z+d*G+e[14],t[15]=h*p+c*Z+I*G+e[15]),t}function scale$1(t,e,l){var n=l[0],i=l[1],a=l[2];return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t[4]=e[4]*i,t[5]=e[5]*i,t[6]=e[6]*i,t[7]=e[7]*i,t[8]=e[8]*a,t[9]=e[9]*a,t[10]=e[10]*a,t[11]=e[11]*a,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}function rotate(e,l,n,i){var a,h,s,o,r,c,u,g,d,I,p,Z,G,m,C,b,f,W,X,y,v,V,B,Y,S=i[0],T=i[1],w=i[2],R=Math.hypot(S,T,w);return R<t?null:(S*=R=1/R,T*=R,w*=R,a=Math.sin(n),s=1-(h=Math.cos(n)),o=l[0],r=l[1],c=l[2],u=l[3],g=l[4],d=l[5],I=l[6],p=l[7],Z=l[8],G=l[9],m=l[10],C=l[11],b=S*S*s+h,f=T*S*s+w*a,W=w*S*s-T*a,X=S*T*s-w*a,y=T*T*s+h,v=w*T*s+S*a,V=S*w*s+T*a,B=T*w*s-S*a,Y=w*w*s+h,e[0]=o*b+g*f+Z*W,e[1]=r*b+d*f+G*W,e[2]=c*b+I*f+m*W,e[3]=u*b+p*f+C*W,e[4]=o*X+g*y+Z*v,e[5]=r*X+d*y+G*v,e[6]=c*X+I*y+m*v,e[7]=u*X+p*y+C*v,e[8]=o*V+g*B+Z*Y,e[9]=r*V+d*B+G*Y,e[10]=c*V+I*B+m*Y,e[11]=u*V+p*B+C*Y,l!==e&&(e[12]=l[12],e[13]=l[13],e[14]=l[14],e[15]=l[15]),e)}function fromTranslation(t,e){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=e[0],t[13]=e[1],t[14]=e[2],t[15]=1,t}function fromRotation(e,l,n){var i,a,h,s=n[0],o=n[1],r=n[2],c=Math.hypot(s,o,r);return c<t?null:(s*=c=1/c,o*=c,r*=c,i=Math.sin(l),h=1-(a=Math.cos(l)),e[0]=s*s*h+a,e[1]=o*s*h+r*i,e[2]=r*s*h-o*i,e[3]=0,e[4]=s*o*h-r*i,e[5]=o*o*h+a,e[6]=r*o*h+s*i,e[7]=0,e[8]=s*r*h+o*i,e[9]=o*r*h-s*i,e[10]=r*r*h+a,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e)}function getTranslation(t,e){return t[0]=e[12],t[1]=e[13],t[2]=e[14],t}function getScaling(t,e){var l=e[0],n=e[1],i=e[2],a=e[4],h=e[5],s=e[6],o=e[8],r=e[9],c=e[10];return t[0]=Math.hypot(l,n,i),t[1]=Math.hypot(a,h,s),t[2]=Math.hypot(o,r,c),t}function getRotation(t,l){var n=new e(3);getScaling(n,l);var i=1/n[0],a=1/n[1],h=1/n[2],s=l[0]*i,o=l[1]*a,r=l[2]*h,c=l[4]*i,u=l[5]*a,g=l[6]*h,d=l[8]*i,I=l[9]*a,p=l[10]*h,Z=s+u+p,G=0;return Z>0?(G=2*Math.sqrt(Z+1),t[3]=.25*G,t[0]=(g-I)/G,t[1]=(d-r)/G,t[2]=(o-c)/G):s>u&&s>p?(G=2*Math.sqrt(1+s-u-p),t[3]=(g-I)/G,t[0]=.25*G,t[1]=(o+c)/G,t[2]=(d+r)/G):u>p?(G=2*Math.sqrt(1+u-s-p),t[3]=(d-r)/G,t[0]=(o+c)/G,t[1]=.25*G,t[2]=(g+I)/G):(G=2*Math.sqrt(1+p-s-u),t[3]=(o-c)/G,t[0]=(d+r)/G,t[1]=(g+I)/G,t[2]=.25*G),t}function fromRotationTranslationScale(t,e,l,n){var i=e[0],a=e[1],h=e[2],s=e[3],o=i+i,r=a+a,c=h+h,u=i*o,g=i*r,d=i*c,I=a*r,p=a*c,Z=h*c,G=s*o,m=s*r,C=s*c,b=n[0],f=n[1],W=n[2];return t[0]=(1-(I+Z))*b,t[1]=(g+C)*b,t[2]=(d-m)*b,t[3]=0,t[4]=(g-C)*f,t[5]=(1-(u+Z))*f,t[6]=(p+G)*f,t[7]=0,t[8]=(d+m)*W,t[9]=(p-G)*W,t[10]=(1-(u+I))*W,t[11]=0,t[12]=l[0],t[13]=l[1],t[14]=l[2],t[15]=1,t}Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)});var perspective=function(t,e,l,n,i){var a,h=1/Math.tan(e/2);return t[0]=h/l,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=h,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=i&&i!==1/0?(a=1/(n-i),t[10]=(i+n)*a,t[14]=2*i*n*a):(t[10]=-1,t[14]=-2*n),t};var ortho=function(t,e,l,n,i,a,h){var s=1/(e-l),o=1/(n-i),r=1/(a-h);return t[0]=-2*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*o,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*r,t[11]=0,t[12]=(e+l)*s,t[13]=(i+n)*o,t[14]=(h+a)*r,t[15]=1,t};function lookAt(e,l,n,i){var a,h,s,o,r,c,u,g,d,I,p=l[0],Z=l[1],G=l[2],m=i[0],C=i[1],b=i[2],f=n[0],W=n[1],X=n[2];return Math.abs(p-f)<t&&Math.abs(Z-W)<t&&Math.abs(G-X)<t?identity(e):(u=p-f,g=Z-W,d=G-X,a=C*(d*=I=1/Math.hypot(u,g,d))-b*(g*=I),h=b*(u*=I)-m*d,s=m*g-C*u,(I=Math.hypot(a,h,s))?(a*=I=1/I,h*=I,s*=I):(a=0,h=0,s=0),o=g*s-d*h,r=d*a-u*s,c=u*h-g*a,(I=Math.hypot(o,r,c))?(o*=I=1/I,r*=I,c*=I):(o=0,r=0,c=0),e[0]=a,e[1]=o,e[2]=u,e[3]=0,e[4]=h,e[5]=r,e[6]=g,e[7]=0,e[8]=s,e[9]=c,e[10]=d,e[11]=0,e[12]=-(a*p+h*Z+s*G),e[13]=-(o*p+r*Z+c*G),e[14]=-(u*p+g*Z+d*G),e[15]=1,e)}function create$3(){var t=new e(3);return e!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t}function length(t){var e=t[0],l=t[1],n=t[2];return Math.hypot(e,l,n)}function fromValues$2(t,l,n){var i=new e(3);return i[0]=t,i[1]=l,i[2]=n,i}function add(t,e,l){return t[0]=e[0]+l[0],t[1]=e[1]+l[1],t[2]=e[2]+l[2],t}function subtract$1(t,e,l){return t[0]=e[0]-l[0],t[1]=e[1]-l[1],t[2]=e[2]-l[2],t}function scale(t,e,l){return t[0]=e[0]*l,t[1]=e[1]*l,t[2]=e[2]*l,t}function distance$1(t,e){var l=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2];return Math.hypot(l,n,i)}function normalize$2(t,e){var l=e[0],n=e[1],i=e[2],a=l*l+n*n+i*i;return a>0&&(a=1/Math.sqrt(a)),t[0]=e[0]*a,t[1]=e[1]*a,t[2]=e[2]*a,t}function dot$1(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function cross(t,e,l){var n=e[0],i=e[1],a=e[2],h=l[0],s=l[1],o=l[2];return t[0]=i*o-a*s,t[1]=a*h-n*o,t[2]=n*s-i*h,t}function transformMat4$1(t,e,l){var n=e[0],i=e[1],a=e[2],h=l[3]*n+l[7]*i+l[11]*a+l[15];return h=h||1,t[0]=(l[0]*n+l[4]*i+l[8]*a+l[12])/h,t[1]=(l[1]*n+l[5]*i+l[9]*a+l[13])/h,t[2]=(l[2]*n+l[6]*i+l[10]*a+l[14])/h,t}function transformMat3(t,e,l){var n=e[0],i=e[1],a=e[2];return t[0]=n*l[0]+i*l[3]+a*l[6],t[1]=n*l[1]+i*l[4]+a*l[7],t[2]=n*l[2]+i*l[5]+a*l[8],t}function transformQuat(t,e,l){var n=l[0],i=l[1],a=l[2],h=l[3],s=e[0],o=e[1],r=e[2],c=i*r-a*o,u=a*s-n*r,g=n*o-i*s,d=i*g-a*u,I=a*c-n*g,p=n*u-i*c,Z=2*h;return c*=Z,u*=Z,g*=Z,d*=2,I*=2,p*=2,t[0]=s+c+d,t[1]=o+u+I,t[2]=r+g+p,t}function rotateY(t,e,l,n){var i=[],a=[];return i[0]=e[0]-l[0],i[1]=e[1]-l[1],i[2]=e[2]-l[2],a[0]=i[2]*Math.sin(n)+i[0]*Math.cos(n),a[1]=i[1],a[2]=i[2]*Math.cos(n)-i[0]*Math.sin(n),t[0]=a[0]+l[0],t[1]=a[1]+l[1],t[2]=a[2]+l[2],t}function rotateZ(t,e,l,n){var i=[],a=[];return i[0]=e[0]-l[0],i[1]=e[1]-l[1],i[2]=e[2]-l[2],a[0]=i[0]*Math.cos(n)-i[1]*Math.sin(n),a[1]=i[0]*Math.sin(n)+i[1]*Math.cos(n),a[2]=i[2],t[0]=a[0]+l[0],t[1]=a[1]+l[1],t[2]=a[2]+l[2],t}function angle(t,e){var l=t[0],n=t[1],i=t[2],a=e[0],h=e[1],s=e[2],o=Math.sqrt(l*l+n*n+i*i)*Math.sqrt(a*a+h*h+s*s),r=o&&dot$1(t,e)/o;return Math.acos(Math.min(Math.max(r,-1),1))}var l=subtract$1,n=length;function create$2(){var t=new e(4);return e!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0),t}function create$1(){var t=new e(4);return e!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t[3]=1,t}function setAxisAngle(t,e,l){l*=.5;var n=Math.sin(l);return t[0]=n*e[0],t[1]=n*e[1],t[2]=n*e[2],t[3]=Math.cos(l),t}create$3(),function(){var t=create$2()}();var normalize=function(t,e){var l=e[0],n=e[1],i=e[2],a=e[3],h=l*l+n*n+i*i+a*a;return h>0&&(h=1/Math.sqrt(h)),t[0]=l*h,t[1]=n*h,t[2]=i*h,t[3]=a*h,t};function create(){var t=new e(2);return e!=Float32Array&&(t[0]=0,t[1]=0),t}function fromValues(t,l){var n=new e(2);return n[0]=t,n[1]=l,n}function transformMat2(t,e,l){var n=e[0],i=e[1];return t[0]=l[0]*n+l[2]*i,t[1]=l[1]*n+l[3]*i,t}create$3(),fromValues$2(1,0,0),fromValues$2(0,1,0),create$1(),create$1(),create$5();var sub=function(t,e,l){return t[0]=e[0]-l[0],t[1]=e[1]-l[1],t};!function(){var t=create()}();var i,a="data:image/png;base64,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",h={t:"#version 300 es\nprecision highp float;\nuniform highp sampler2D u_PointSampler;\nuniform lowp sampler2D u_NormalSampler;\n\nuniform highp sampler2D u_NoiseSampler;\nuniform highp vec2 u_PerSize;\nuniform highp mat3 u_ViewMatrix;\n\n\nuniform mediump float u_AoFactor;\nuniform mediump float u_AoRadius;\nout highp vec4 Color;\n\nvoid main(){\n    vec2 uv = gl_FragCoord.xy*u_PerSize;\n    float plen = length(u_PerSize)*2.;\n    vec4 point = texture(u_PointSampler,uv);\n    vec3 tn = (u_ViewMatrix*texture(u_NormalSampler,uv).xyz);\n    if(tn.z<0.0){\n        tn = -tn;\n    }\n    vec2 n =tn.xy;\n    \n    if(length(n)>0.001){\n        vec3 yAxis = normalize(vec3(n,0.0));\n        vec3 zAxis = vec3(0.0,0.0,1.0);\n        vec3 xAxis = normalize(cross(zAxis,yAxis));\n\n        float ao=0.0;\n        float random = fract(length(point.xyz));\n        random = fract(sin(random)*10000.);\n        random = fract(sin(random)*10000.);\n        float r = u_AoRadius*(random*0.5+0.5);\n        //r =u_AoRadius;\n        for(float i= -r;i<r;i++){\n            for(float j=1.;j<r;j++){\n                vec2 xy = (i*xAxis + j*yAxis).xy*u_PerSize;\n                xy = xy+uv;            \n                float dp  = texture(u_PointSampler,xy).w;\n                dp=dp<0.00001?1.0:dp;\n                float tao = dp<point.w?0.:1.;//0代表遮挡\n                \n                ao+=tao;\n            }\n        }\n        float result = ao/(2.*r*r);\n        result = result/u_AoFactor +1.0 - 1.0/u_AoFactor;\n        Color = vec4(result,0.0,0.,1.);\n    }\n    else{\n       Color= vec4(1.,0.,0.,1.);\n    }\n}",l:"#version 300 es\nprecision mediump float;\nin vec2 in_Point;\nvoid main(){\n    gl_Position =vec4(in_Point,0.0,1.0);\n}",i:"#version 300 es\nprecision highp float;\nin vec3 v_Color;\n\nout vec4 Color;\nvoid main(){\n    Color = vec4(v_Color,1.0);\n}",h:"#version 300 es\nprecision highp float;\nflat in uint v_Id;\n\nout uint Color;\nvoid main(){\n    Color = v_Id;\n}",o:"#version 300 es\nprecision highp float;\n\nlayout(location=0)in vec3 in_Point;\nlayout(location=1)in uint in_Id;\nuniform mat4 u_Mvp;\nuniform vec2 u_Offset;\n\nflat out uint v_Id;\nvoid main(){\n    v_Id = in_Id;\n    vec4 tp = u_Mvp * vec4(in_Point,1.0);\n    gl_Position = tp + vec4(u_Offset,0.,0.);\n}",u:"#version 300 es\nprecision highp float;\n\nlayout(location=0)in vec3 in_Point;\nlayout(location=1)in vec3 in_Color;\nuniform mat4 u_Mvp;\nuniform vec2 u_Offset;\n\nout vec3 v_Color;\nvoid main(){\n    v_Color = in_Color;\n    vec4 tp = u_Mvp * vec4(in_Point,1.0);\n    gl_Position = tp + vec4(u_Offset,0.,0.);\n}",I:"#version 300 es\nprecision highp float;\nuniform highp sampler2D u_BackgroundImage;\nuniform highp vec2 u_PerSize;\nout lowp vec4 Color; \nvoid main(){\n    gl_FragDepth =1.0;\n    vec2 uv = gl_FragCoord.xy * u_PerSize;\n    Color = texture(u_BackgroundImage,uv);\n    //Color = vec4(1.0,0.,0.,1.0);\n}",Z:"#version 300 es\nprecision highp float;\n\nin lowp vec4 v_Color;\nin highp vec3 v_Point;\nin highp vec3 v_Normal;\nin highp float v_Depth;\n\nuniform highp vec3 u_Eye;\nuniform highp vec3 u_LightColor;\nuniform highp vec3 u_LightDirection;\nuniform highp vec3 u_AmbientColor;\n\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\n\nout highp vec4 Color;\nbool isInBox(highp vec3 point,highp vec3 u_min,highp vec3 u_max){\n    if(u_min.x>point.x){\n        return false;\n    }\n    if(u_min.y>point.y){\n        return false;\n    }\n    if(u_min.z>point.z){\n        return false;\n    }\n    if(u_max.x<point.x){\n        return false;\n    }\n    if(u_max.y<point.y){\n        return false;\n    }\n    if(u_max.z<point.z){\n        return false;\n    }\n    return true;\n}\nvoid main(){\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point.xyz,u_Min,u_Max)){\n            discard;\n        }\n    }\n    gl_FragDepth = v_Depth;\n    vec3 rgb = v_Color.rgb;\n    vec3 ambient = rgb*u_AmbientColor;\n    vec3 diffuse = max(dot(v_Normal,u_LightDirection),0.0)*u_LightColor*rgb;\n    vec3 viewDirection = normalize(u_Eye- v_Point);\n    vec3 h = normalize(u_LightDirection+viewDirection);\n    float spec = pow(max(dot(h,v_Normal),0.0),64.);\n    vec3 specular =0.5 *rgb *u_LightColor*rgb*spec;\n    Color = vec4(ambient+diffuse+specular,v_Color.a);\n    //Color = vec4(ambient+diffuse+specular,1.0);\n    //Color = v_Color;\n    //Color =vec4(1.0);\n}",m:"#version 300 es\n\nlayout(location=0)in highp uint in_Point;\nuniform lowp sampler2D u_ColorSampler;\nuniform highp usampler2D u_TransformIndexSampler;\nuniform highp uint u_TriangleSize;\nlayout(location=1)in lowp uvec3 in_Normal;\n\nuniform highp sampler2D u_PointSampler;\nuniform highp uint u_PointSamplerSize;\n\nuniform highp sampler2D u_TransformSampler;\nuniform highp uint u_TransformSize;\n\nuniform mat4 u_Mvp;\nuniform highp mat4 u_ViewMatrix;\nuniform highp mat4 u_ModelMatrix;\nuniform highp float u_Near;\nuniform highp float u_Far;\n\nout highp vec3 v_Normal;\nout highp vec3 v_Point;\nout lowp vec4 v_Color;\nout highp float v_Depth;\n\nconst float PI = 3.1415926535897932384626433832795;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\n\nvec4 getPoint(){\n    vec2 uv = getUv((in_Point),(u_PointSamplerSize));\n    vec4 v = texture(u_PointSampler,uv);\n    v.w=1.0;\n    return v;\n}\n\n\nmat4 getMatrix(uint tf_index){    \n    if(tf_index ==0u){\n        return mat4(1.0);\n    }\n    uint index = (tf_index-1u) * 4u;\n    vec2 uv1 = getUv(index,u_TransformSize);\n    vec2 uv2 = getUv(index+1u,u_TransformSize);\n    vec2 uv3 = getUv(index+2u,u_TransformSize);\n    vec2 uv4 = getUv(index+3u,u_TransformSize);\n\n    vec4 v1 = texture(u_TransformSampler,uv1);\n    vec4 v2 = texture(u_TransformSampler,uv2);\n    vec4 v3 = texture(u_TransformSampler,uv3);\n    vec4 v4 = texture(u_TransformSampler,uv4);\n\n    return mat4(v1,v2,v3,v4);\n}\n\nvec3 get_normal(uvec3 n){\n    float x = float(n[0])/255.;\n    float z = float(n[1])/255.;\n    x = x * PI;\n    z = z * PI;\n    if(n[2]>0u){\n        x = x + PI;\n    }\n    vec3 r;\n    r[0] = sin(z)*cos(x);\n    r[1] = sin(z)*sin(x);\n    r[2] = cos(z);\n    return r;\n}\n\n\nvoid main(){\n    uint vertexId = uint((gl_VertexID)/3);\n    vec2 uv = getUv(vertexId,u_TriangleSize);\n    v_Color = texture(u_ColorSampler,uv);\n\n    uint tf_index = texture(u_TransformIndexSampler,uv).r;\n    mat4 tf = getMatrix(tf_index);\n    vec4 tp =tf * getPoint();\n    tp = u_ModelMatrix * tp;\n    vec4 pos = u_Mvp*tp;\n    v_Point = tp.xyz;\n\n    float view_depth = -(u_ViewMatrix * tp).z;\n    v_Depth = (view_depth - u_Near)/(u_Far - u_Near);\n    //v_Color = vec4(v_Depth,0,0,1.0);\n    //uvec4 d = texture(u_NormalSampler,uv);\n    v_Normal =normalize(mat3(tf)*get_normal(in_Normal));\n    gl_Position = pos;\n}",C:"#version 300 es\nprecision mediump float;\n\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\n\nin highp vec3 v_Point;\nin lowp vec4 v_Color;\nout lowp vec4 Color;\nbool isInBox(highp vec3 point,highp vec3 u_min,highp vec3 u_max){\n    if(u_min.x>point.x){\n        return false;\n    }\n    if(u_min.y>point.y){\n        return false;\n    }\n    if(u_min.z>point.z){\n        return false;\n    }\n    if(u_max.x<point.x){\n        return false;\n    }\n    if(u_max.y<point.y){\n        return false;\n    }\n    if(u_max.z<point.z){\n        return false;\n    }\n    return true;\n}\n\nvoid main(){\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point.xyz,u_Min,u_Max)){\n            discard;\n        }\n    }\n    Color = v_Color;\n}",W:"#version 300 es\nlayout(location=0)in highp uint in_Point;\n\nuniform highp sampler2D u_PointSampler;\nuniform highp uint u_PointSamplerSize;\n\nuniform highp sampler2D u_TransformSampler;\nuniform highp uint u_TransformSize;\n\nuniform lowp sampler2D u_ColorSampler;\nuniform highp usampler2D u_TransformIndexSampler;\nuniform uint u_TriangleSize;\nuniform mat4 u_Mvp;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvec4 getPoint(){\n\n    vec2 uv = getUv((in_Point),(u_PointSamplerSize));\n    vec4 v = texture(u_PointSampler,uv);\n    v.w=1.0;\n    return v;\n}\n\n\nmat4 getMatrix(uint tf_index){    \n    if(tf_index ==0u){\n        return mat4(1.0);\n    }\n    uint index = (tf_index-1u) * 4u;\n    vec2 uv1 = getUv(index,u_TransformSize);\n    vec2 uv2 = getUv(index+1u,u_TransformSize);\n    vec2 uv3 = getUv(index+2u,u_TransformSize);\n    vec2 uv4 = getUv(index+3u,u_TransformSize);\n\n    vec4 v1 = texture(u_TransformSampler,uv1);\n    vec4 v2 = texture(u_TransformSampler,uv2);\n    vec4 v3 = texture(u_TransformSampler,uv3);\n    vec4 v4 = texture(u_TransformSampler,uv4);\n\n    return mat4(v1,v2,v3,v4);\n}\n\n\nout highp vec3 v_Point;\nout lowp vec4 v_Color;\n\nvoid main(){\n    uint vertexId = uint(gl_VertexID/3);\n    vec2 uv = getUv(vertexId,u_TriangleSize);\n    uint tf_index = texture(u_TransformIndexSampler,uv).r;\n    mat4 tf = getMatrix(tf_index);\n    vec4 tp =tf * getPoint();\n    gl_Position = u_Mvp*tp;\n    v_Color = texture(u_ColorSampler,uv);\n    v_Point = tp.xyz;\n    \n}",X:"#version 300 es\nprecision highp float;\nprecision highp int;\nuniform highp sampler2D u_SrcSampler;\nuniform highp uint u_SrcSize;\nuniform highp uint u_SrcCount;\nuniform highp uint u_DstSize;\n\nuniform highp sampler2D u_AdditionSampler;\nuniform highp uint u_AdditionSize;\nuniform highp uint u_AdditionCount;\n\nout highp vec3 Color;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvoid main(){\n    vec2 xy =gl_FragCoord.xy;\n    uint x = uint(xy.x);\n    uint y = uint(xy.y);\n    uint pos = y*u_DstSize + x + 1u;//第几个\n    if(pos<=u_SrcCount){\n       vec2 uv = getUv(pos-1u,u_SrcSize);\n       Color = texture(u_SrcSampler,uv).rgb;\n    }\n    else{\n        if(pos<=(u_SrcCount+u_AdditionCount)){\n            uint index = pos - u_SrcCount-1u;\n            vec2 uv = getUv(index,u_AdditionSize);\n            Color = texture(u_AdditionSampler,uv).rgb;\n        }\n        else{\n           discard;\n        }\n    }    \n}",v:"#version 300 es\nprecision highp float;\nprecision highp int;\nuniform highp sampler2D u_SrcSampler;\nuniform highp uint u_SrcSize;\nuniform highp uint u_SrcCount;\nuniform highp uint u_DstSize;\n\nuniform highp sampler2D u_AdditionSampler;\nuniform highp uint u_AdditionSize;\nuniform highp uint u_AdditionCount;\n\nout highp vec4 Color;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvoid main(){\n    vec2 xy =gl_FragCoord.xy;\n    uint x = uint(xy.x);\n    uint y = uint(xy.y);\n    uint pos = y*u_DstSize + x + 1u;//第几个\n    if(pos<=u_SrcCount){\n       vec2 uv = getUv(pos-1u,u_SrcSize);\n       Color = texture(u_SrcSampler,uv);\n    }\n    else{\n        if(pos<=(u_SrcCount+u_AdditionCount)){\n            uint index = pos - u_SrcCount-1u;\n            vec2 uv = getUv(index,u_AdditionSize);\n            Color = texture(u_AdditionSampler,uv);\n        }\n        else{\n           discard;\n        }\n    }    \n}",V:"#version 300 es\nprecision highp float;\nprecision highp int;\nuniform highp usampler2D u_SrcSampler;\nuniform highp uint u_SrcSize;\nuniform highp uint u_SrcCount;\nuniform highp uint u_DstSize;\n\nuniform highp usampler2D u_AdditionSampler;\nuniform highp uint u_AdditionSize;\nuniform highp uint u_AdditionCount;\n\nout highp uint Color;\n\nhighp vec2 getUv(highp uint index,highp uint size){\n    highp uint y = index/size;\n    float fy = float(y);\n    highp uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvoid main(){\n    vec2 xy =gl_FragCoord.xy;\n    highp uint x = uint(xy.x);\n    highp uint y = uint(xy.y);\n    highp uint pos = y*u_DstSize + x + 1u;//第几个\n    if(pos<=u_SrcCount){\n       vec2 uv = getUv(pos-1u,u_SrcSize);\n       Color = texture(u_SrcSampler,uv).r;\n    }\n    else{\n        if(pos<=(u_SrcCount+u_AdditionCount)){\n            highp uint index = pos - u_SrcCount-1u;\n            vec2 uv = getUv(index,u_AdditionSize);\n            Color = texture(u_AdditionSampler,uv).r;\n        }\n        else{\n           discard;\n        }\n    }\n    //Color = 12u/5u;\n}",Y:"#version 300 es\nprecision highp float;\nprecision highp int;\nuniform highp usampler2D u_SrcSampler;\nuniform highp uint u_SrcSize;\nuniform highp uint u_SrcCount;\nuniform highp uint u_DstSize;\n\nuniform highp usampler2D u_AdditionSampler;\nuniform highp uint u_AdditionSize;\nuniform highp uint u_AdditionCount;\n\nout lowp uint Color;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvoid main(){\n    vec2 xy =gl_FragCoord.xy;\n    uint x = uint(xy.x);\n    uint y = uint(xy.y);\n    uint pos = y*u_DstSize + x + 1u;//第几个\n    if(pos<=u_SrcCount){\n       vec2 uv = getUv(pos-1u,u_SrcSize);\n       Color = texture(u_SrcSampler,uv).r;\n    }\n    else{\n        if(pos<=(u_SrcCount+u_AdditionCount)){\n            uint index = pos - u_SrcCount-1u;\n            vec2 uv = getUv(index,u_AdditionSize);\n            Color = texture(u_AdditionSampler,uv).r;\n        }\n        else{\n           discard;\n        }\n    }    \n}",S:"#version 300 es\nprecision highp float;\nprecision highp int;\nuniform highp usampler2D u_SrcSampler;\nuniform highp uint u_SrcSize;\nuniform highp uint u_SrcCount;\nuniform highp uint u_DstSize;\n\nuniform highp usampler2D u_AdditionSampler;\nuniform highp uint u_AdditionSize;\nuniform highp uint u_AdditionCount;\n\nout lowp uvec4 Color;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvoid main(){\n    vec2 xy =gl_FragCoord.xy;\n    uint x = uint(xy.x);\n    uint y = uint(xy.y);\n    uint pos = y*u_DstSize + x + 1u;//第几个\n    if(pos<=u_SrcCount){\n       vec2 uv = getUv(pos-1u,u_SrcSize);\n       Color = texture(u_SrcSampler,uv);\n    }\n    else{\n        if(pos<=(u_SrcCount+u_AdditionCount)){\n            uint index = pos - u_SrcCount-1u;\n            vec2 uv = getUv(index,u_AdditionSize);\n            Color = texture(u_AdditionSampler,uv);\n        }\n        else{\n           discard;\n        }\n    }    \n}",T:"#version 300 es\nprecision highp float;\nuniform highp sampler2D u_ColorSampler;\nuniform highp sampler2D u_NormalSampler;\nuniform highp sampler2D u_PointSampler;\n//uniform highp sampler2D u_EdgeSampler;\nuniform highp sampler2D u_ShadowSampler;\nuniform highp sampler2D u_AoSampler;\nuniform bool u_Shadow;\nuniform bool u_Ao;\nuniform highp vec2 u_PerSize;\nuniform highp vec3 u_LightColor;\nuniform highp vec3 u_LightDirection;\nuniform highp vec3 u_AmbientColor;\nuniform highp vec3 u_Eye;\nout highp vec4 Color;\n\nvec3 blinnPhone(vec3 color,vec3 normal,vec3 viewDirection,vec3 lightDirection,vec3 ambientColor,vec3 lightColor,float ao,float shadow){\n    vec3 ambient = color * ambientColor * ao;\n    vec3 diffuse = max(dot(normal,lightDirection),0.0)*lightColor*color *shadow;\n    vec3 h = normalize(lightDirection+ viewDirection);\n    float spec = pow(max(dot(h,normal),0.0),128.);\n    //vec3 R = reflect(-lightDirection,normal);\n    //float spec = pow(max(dot(viewDirection,R),0.0),32.);\n    vec3 specular =0.5* color * lightColor*spec;\n    //return specular;\n    return ambient+diffuse+specular;\n}\n\n\nfloat getAo(vec2 uv,vec2 offset){\n    float r =1.0;\n    float result =0.0;\n    for(float i=-r;i<r+0.5;i++){\n        for(float j=-r;j<r+0.5;j++){\n            float ao = texture(u_AoSampler,uv+vec2(i,j)*offset).r;\n            result+=ao;   \n        }\n    }\n    return result/9.;\n}\nfloat PCF(vec2 uv){\n    int r =1;\n    float total = pow(float(r)*2.+1.,2.);\n    float tmp =0.0;\n    for(int i=-r;i<r;i++){\n        for(int j=-r;j<r;j++){\n            tmp += texture(u_ShadowSampler,uv+vec2(i,j)*u_PerSize).r;\n        }\n    }\n    return 1.0 - tmp /total;\n}\nvoid main(){\n    vec2 uv = gl_FragCoord.xy * u_PerSize;\n    vec4 color = texture(u_ColorSampler,uv);\n    float ao =1.0;\n    if(u_Ao){\n        ao = getAo(uv,u_PerSize);//texture(u_AoSampler,uv).r;  \n    }    \n    float shadow =1.0;// 1.0 - texture(u_ShadowSampler,uv).r; \n    if(u_Shadow){\n        shadow =1.0- texture(u_ShadowSampler,uv).r; \n    }\n    //ao = ao * shadow;\n    //float shadow =  PCF(uv);\n    //ao = pow(ao,9.0); \n    //float ao =getAo(uv,u_PerSize);\n\n    vec3 normal = texture(u_NormalSampler,uv).rgb;\n    vec4 point = texture(u_PointSampler,uv);\n    vec3 viewDirection = normalize(u_Eye- point.xyz);\n\n    float ndotv = dot(viewDirection,normal);\n    normal = ndotv>=0.?normal:-normal;\n    vec3 blinn = blinnPhone(color.rgb,normal,viewDirection,u_LightDirection,u_AmbientColor,u_LightColor,ao,shadow);\n    gl_FragDepth = point.w;\n    //Color = vec4(viewDirection,1.0);\n    Color = vec4(blinn,color.a);\n    //vec4 edgeColor = texture(u_EdgeSampler,uv);\n    //Color = vec4(edgeColor.rgb*edgeColor.a + Color.rgb*(1.0- edgeColor.a),color.a);\n\n    //Color = vec4(faceId,0.0,0.0,1.0);\n}",N:"#version 300 es\nprecision mediump float;\nin vec2 in_Point;\nvoid main(){\n    gl_Position =vec4(in_Point,0.0,1.0);\n}",k:"#version 300 es\nprecision highp float;\nuniform highp vec2 u_PerSize;\nuniform highp sampler2D u_PointSampler;\nout highp vec4 Color;\nvoid main(){\n    vec2 uv = gl_FragCoord.xy*u_PerSize;\n    float depth = texture(u_PointSampler,uv).w;\n    gl_FragDepth = depth;\n    Color = vec4(depth,0,0,1);\n}",K:"#version 300 es\nprecision mediump float;\nuniform sampler2D u_HdrSampler;\nuniform vec2 u_Size;\nuniform float u_Loss;\nuniform float u_Gamma;\nuniform float u_Lapras;\nout vec4 Color;\n\nconst vec3 bg=vec3(0.0);\nfloat kernels[9] = float[](0.0,-1.0,0.0,-1.0,0.0,-1.0,0.0,-1.0,0.0);\n\nvec3 sharpenColor(vec2 uv){\n    \n    vec3 sum=vec3(0.0);\n    for(float i=-1.0;i<1.5;i++){\n        for(float j=-1.0;j<1.5;j++){\n            sum = sum + texture(u_HdrSampler,uv).rgb*kernels[int(i+j+2.0)];\n        }\n    }\n    return sum;\n}\nvoid main(){\n    kernels[4] = u_Lapras;\n    vec2 uv = gl_FragCoord.xy/u_Size;\n    Color = vec4(texture(u_HdrSampler,uv).rgb,1.0);\n    //vec3 color;\n    // if(int(u_Lapras+0.9)==0){\n    //     color = texture(u_HdrSampler,uv).rgb;\n    // }\n    // else{\n    //     color = sharpenColor(uv);\n    // }\n     \n    // if(color==bg){\n    //     discard;\n    //     //Color = vec4(1.0);\n    // }\n    // else{\n    //     vec3 rgb = color.rgb/(color.rgb+vec3(u_Loss));\n    //     float gamma = 2.2;\n    //     rgb = pow(rgb, vec3(1.0/u_Gamma));\n    //     Color = vec4(rgb,1.0);\n    //     //Color = vec4(color.rgb/(color.rgb+vec3(0.1)),1.0);\n    // }\n    \n}",M:"#version 300 es\nprecision mediump float;\nin vec2 in_Point;\nvoid main(){\n    gl_Position =vec4(in_Point,0.0,1.0);\n}",H:"#version 300 es\nprecision highp float;\nuniform highp sampler2D u_GeometrySampler;\n//uniform highp sampler2D u_EdgeColorSampler;\nuniform lowp vec4 u_EdgeColor;\nuniform highp sampler2D u_PointSampler;\nuniform highp vec2 u_PerSize;\nuniform mediump int u_EdgeWidth;\nout lowp vec4 Color;\nvoid main(){\n    vec2 uv = gl_FragCoord.xy * u_PerSize;\n    int l=u_EdgeWidth/2;//左侧采样距离\n    int r=u_EdgeWidth%2+l;//为右侧采样距离\n\n    vec4 geometry = texture(u_GeometrySampler,uv);\n    //vec4 color = texture(u_EdgeColorSampler,uv);\n    float depth = texture(u_PointSampler,uv).w;\n    float faceId=(geometry.x);\n    int instanceId = int(geometry.y);\n    vec4 discardColor = vec4(0.,0.,0.,1.);\n    if(faceId<0.0){\n        // Color = discardColor;\n        // return;\n        discard;\n    }\n    for(int i=-l;i<=r;i++){\n        for(int j=-l;j<=r;j++){\n            float tr = sqrt(float(i*i + j*j));\n            if(tr>float(u_EdgeWidth)){\n                continue;\n            }\n            if(i==0&&j==0){\n                continue;\n            }\n            else{\n                vec2 offset_uv = uv+ vec2(i,j)*u_PerSize;\n                vec4 geo=texture(u_GeometrySampler,offset_uv);\n                float fid = (geo.x);\n                int instId = int(geo.y);\n                if(fid<0.0){\n                    //Color = discardColor;\n                    discard;\n                }\n                if(abs(fid-faceId)>0.5){\n                    Color = u_EdgeColor;\n                    return;\n                    // if(instId!=instanceId){                         \n                    //      float dp = texture(u_PointSampler,offset_uv+normalize(vec2(i,j))*u_PerSize*2.).w;\n                    //      if(depth<dp){\n                    //         Color = color;\n                    //         return;\n                    //      }\n                    //      else{\n                    //         Color = discardColor;//texture(u_EdgeColorSampler,offset_uv);\n                    //         return;\n                    //      }\n                    // }\n                    // else{\n                    //     Color = color;\n                    //     return;\n                    // }                    \n                }\n            }\n        }\n    }\n\n}",F:"#version 300 es\nprecision mediump float;\nin vec2 in_Point;\nvoid main(){\n    gl_Position =vec4(in_Point,0.0,1.0);\n}",L:"#version 300 es\nprecision mediump float;\nout vec4 Color;\nvoid main(){\n    Color = vec4(96.0/255.0,150.0/255.0,165.0/255.0,1);\n}",J:"#version 300 es\nprecision highp float;\n\nuniform mat4 u_Mvp;\nuniform float u_Offset;\nlayout(location=0)in vec3 in_Point;\n\nvoid main(){\n    vec4 tp =vec4(in_Point,1.0);\n    tp.z +=u_Offset;\n    gl_Position =u_Mvp*tp ;\n}",U:"#version 300 es\nprecision highp float;\nflat in highp int v_FaceId;\nout highp vec4 FaceId;\nvoid main(){\n    FaceId = vec4(v_FaceId,0.,0.,1.);    \n}",P:"#version 300 es\nlayout(location=0)in highp vec3 in_Point;\nlayout(location=1)in highp float in_FaceId;\nuniform mat4 u_Mvp;\nflat out highp int v_FaceId;\nvoid main(){\n        v_FaceId=int(in_FaceId);\n        gl_Position=u_Mvp*vec4(in_Point,1.0);\n}",D:"#version 300 es\nprecision mediump float;\nuniform sampler2D u_Sampler;\nuniform vec2 u_Size;\nuniform vec2 u_Offset;//(1.0,0.0)||(0.0,1.0)\nuniform float u_Intensity;\nout vec4 Color;\n\nfloat weight[5] = float[] (0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216);\n\nvoid main(){\n\n    vec2 tex_offset = 1.0/u_Size;\n    vec2 uv = gl_FragCoord.xy/u_Size;\n    vec4 color =texture(u_Sampler,uv);\n    vec4 result = color * weight[0];\n    for(int i = 1; i < 5; ++i)\n    {\n        float fi = float(i);\n        result += texture(u_Sampler, uv + u_Offset* fi *tex_offset) * weight[i];\n        result += texture(u_Sampler, uv - u_Offset*fi *tex_offset) * weight[i];\n    }\n    Color =vec4(result.rgb*u_Intensity,result.a);//vec4(result*u_Intensity, color);    \n}",O:"#version 300 es\nprecision mediump float;\nlayout(location=0) in vec2 in_Point;\nvoid main(){\n    gl_Position =vec4(in_Point,0.0,1.0);\n}",_:"#version 300 es\nprecision mediump float;\n#define UseSectionBox ;\nin lowp vec4 v_Color;\nin highp vec3 v_Point;\nin lowp vec3 v_Normal;\nin highp float v_Depth;\n// in lowp vec4 v_EdgeColor;\n// flat in highp int v_InstanceId;\nflat in lowp uint v_FaceId;\nuniform lowp int u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;//\n\n\nlayout(location=0)out highp vec4 Color;\nlayout(location=1)out highp vec4 Normal;\nlayout(location=2)out highp vec4 Point;\n//layout(location=3)out highp vec4 EdgeColor;\nlayout(location=3)out highp vec4 Geometry;\n\n\n#ifdef UseSectionBox\nbool isInBox(highp vec3 point,highp vec3 u_min,highp vec3 u_max){\n    if(u_min.x>point.x){\n        return false;\n    }\n    if(u_min.y>point.y){\n        return false;\n    }\n    if(u_min.z>point.z){\n        return false;\n    }\n    if(u_max.x<point.x){\n        return false;\n    }\n    if(u_max.y<point.y){\n        return false;\n    }\n    if(u_max.z<point.z){\n        return false;\n    }\n    return true;\n}\nbool isInView(highp vec3 point,highp vec3 orign,highp vec3 normal){\n    vec3 dir = point - orign;\n    float d = dot(dir,normal);\n    return d<0.0;\n}\n#endif\nvoid main(){\n    #ifdef UseSectionBox\n    if(u_UseSectionBox==1){\n        if(!isInBox(v_Point.xyz,u_Min,u_Max)){\n            discard;\n        }\n    }\n    if(u_UseSectionBox==2){\n        if(!isInView(v_Point.xyz,u_Min,u_Max)){\n            discard;\n        }\n    }\n    if(v_Depth<0.0){\n        discard;\n    }\n    #endif\n    Color = v_Color;\n    //Color = vec4(v_Depth,0.,0.,1.0);\n    //EdgeColor =v_EdgeColor;\n    Normal = vec4(v_Normal,1.0);\n    Point =  vec4(v_Point,v_Depth);\n    Geometry = vec4(v_FaceId,0.0,0.0,1.0);\n    gl_FragDepth = v_Depth;\n}",j:"#version 300 es\nprecision highp float;\nprecision highp int;\nlayout(location=0)in highp uint in_Point;\n\n//uniform lowp usampler2D u_NormalSampler;\nuniform lowp sampler2D u_ColorSampler;\nuniform highp usampler2D u_TransformIndexSampler;\nuniform highp uint u_TriangleSize;\nuniform lowp usampler2D u_FaceIdSampler;\nlayout(location=1)in lowp uvec3 in_Normal;\n// layout(location=2)in lowp vec4 in_Color;\n// layout(location=3)in lowp uint in_FaceId;\n\nuniform highp sampler2D u_PointSampler;\nuniform highp uint u_PointSamplerSize;\n\n//layout(location=1) in highp uint in_TransformIndex;\nuniform highp sampler2D u_TransformSampler;\nuniform highp uint u_TransformSize;\n\nuniform mat4 u_Mvp;\nuniform highp mat4 u_ViewMatrix;\nuniform highp float u_Near;\nuniform highp float u_Far;\nout highp vec3 v_Normal;\nout highp vec3 v_Point;\nout lowp vec4 v_Color;\nout highp float v_Depth;\nflat out lowp uint v_FaceId;\n\nconst float PI = 3.1415926535897932384626433832795;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvec4 getPoint(){\n\n    vec2 uv = getUv((in_Point),(u_PointSamplerSize));\n    vec4 v = texture(u_PointSampler,uv);\n    v.w=1.0;\n    return v;\n}\n\n\nmat4 getMatrix(uint tf_index){    \n    if(tf_index ==0u){\n        return mat4(1.0);\n    }\n    uint index = (tf_index-1u) * 4u;\n    vec2 uv1 = getUv(index,u_TransformSize);\n    vec2 uv2 = getUv(index+1u,u_TransformSize);\n    vec2 uv3 = getUv(index+2u,u_TransformSize);\n    vec2 uv4 = getUv(index+3u,u_TransformSize);\n\n    vec4 v1 = texture(u_TransformSampler,uv1);\n    vec4 v2 = texture(u_TransformSampler,uv2);\n    vec4 v3 = texture(u_TransformSampler,uv3);\n    vec4 v4 = texture(u_TransformSampler,uv4);\n\n    return mat4(v1,v2,v3,v4);\n}\n\nvec3 get_normal(uvec3 n){\n    float x = float(n[0])/255.;\n    float z = float(n[1])/255.;\n    x = x * PI;\n    z = z * PI;\n    if(n[2]>0u){\n        x = x + PI;\n    }\n    vec3 r;\n    r[0] = sin(z)*cos(x);\n    r[1] = sin(z)*sin(x);\n    r[2] = cos(z);\n    return r;\n}\n\n\nvoid main(){\n    uint vertexId = uint((gl_VertexID)/3);\n    vec2 uv = getUv(vertexId,u_TriangleSize);\n    //v_Color=in_Color;\n    //v_Color = vec4(texture(u_ColorSampler,uv))/vec4(255.0);\n    v_Color = texture(u_ColorSampler,uv);\n    \n    //v_FaceId = texture(u_FaceIdSampler,uv).r;\n    uint tf_index = texture(u_TransformIndexSampler,uv).r;\n    //uint tf_index =0u;\n    //v_Color = vec4(1.0/float(tf_index+1u),0.0,0.0,1.0);\n    mat4 tf = getMatrix(tf_index);\n    vec4 tp =tf * getPoint();\n    vec4 pos = u_Mvp*tp;\n    v_Point = tp.xyz;\n\n    float view_depth = -(u_ViewMatrix * tp).z;\n    v_Depth = (view_depth - u_Near)/(u_Far - u_Near);\n    //v_Color = vec4(v_Depth,0,0,1.0);\n    //uvec4 d = texture(u_NormalSampler,uv);\n    v_Normal =normalize(mat3(tf)*get_normal(in_Normal));\n    //v_Normal =get_normal(d.rgb);\n    //v_Color = vec4(v_Normal/2.0+vec3(1.0),1.0);\n    v_FaceId = texture(u_FaceIdSampler,uv).r;\n    //v_Color = vec4(0.5/float(v_FaceId+1u)+0.5,0.0,0.0,1.0);\n    gl_Position=pos;\n}",q:"#version 300 es\nprecision mediump float;\n#define UseSectionBox ;\nin lowp vec4 v_Color;\nin highp vec3 v_Point;\nin lowp vec3 v_Normal;\nin lowp vec4 v_EdgeColor;\nflat in highp int v_InstanceId;\nflat in highp int v_FaceId;\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\n\nlayout(location=0)out highp vec4 Color;\nlayout(location=1)out highp vec4 Normal;\nlayout(location=2)out highp vec4 Point;\nlayout(location=3)out highp vec4 EdgeColor;\nlayout(location=4)out highp vec4 Geometry;\n\n\n#ifdef UseSectionBox\nbool isInBox(highp vec3 point,highp vec3 u_min,highp vec3 u_max){\n    if(u_min.x>point.x){\n        return false;\n    }\n    if(u_min.y>point.y){\n        return false;\n    }\n    if(u_min.z>point.z){\n        return false;\n    }\n    if(u_max.x<point.x){\n        return false;\n    }\n    if(u_max.y<point.y){\n        return false;\n    }\n    if(u_max.z<point.z){\n        return false;\n    }\n    return true;\n}\n#endif\nvoid main(){\n    #ifdef UseSectionBox\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point.xyz,u_Min,u_Max)){\n            discard;\n        }\n    }\n    #endif\n\n    Color = v_Color;\n    EdgeColor =v_EdgeColor;\n    Normal = vec4(v_Normal,1.0);\n    Point =  vec4(v_Point,gl_FragCoord.z);\n    Geometry = vec4(v_FaceId,v_InstanceId,0.0,1.0);\n}",$:"#version 300 es\nprecision mediump float;\n#define UseSectionBox ;\nin lowp vec4 v_Color;\nin highp vec3 v_Point;\nin lowp vec3 v_Normal;\nin highp float v_Depth;\nflat in lowp uint v_FaceId;\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\n\nlayout(location=0)out highp vec4 Color;\nlayout(location=1)out highp vec4 Normal;\nlayout(location=2)out highp vec4 Point;\nlayout(location=3)out highp vec4 Geometry;\n\n\n#ifdef UseSectionBox\nbool isInBox(highp vec3 point,highp vec3 u_min,highp vec3 u_max){\n    if(u_min.x>point.x){\n        return false;\n    }\n    if(u_min.y>point.y){\n        return false;\n    }\n    if(u_min.z>point.z){\n        return false;\n    }\n    if(u_max.x<point.x){\n        return false;\n    }\n    if(u_max.y<point.y){\n        return false;\n    }\n    if(u_max.z<point.z){\n        return false;\n    }\n    return true;\n}\n#endif\nvoid main(){\n    #ifdef UseSectionBox\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point.xyz,u_Min,u_Max)){\n            discard;\n        }\n    }\n    if(v_Depth<0.0){\n        discard;\n    }\n    #endif\n    Color = v_Color;\n    Normal = vec4(v_Normal,1.0);\n    Point =  vec4(v_Point,v_Depth);\n    Geometry = vec4(v_FaceId,0.0,0.0,1.0);\n    gl_FragDepth = v_Depth;\n}",tt:"#version 300 es\nprecision highp float;\nlayout(location=0)in highp uint in_Point;\nlayout(location=1)in lowp uvec3 in_Normal;\nlayout(location=2)in lowp vec4 in_Color;\nlayout(location=3)in lowp uint in_FaceId;\n\nuniform highp sampler2D u_PointSampler;\nuniform highp uint u_PointSamplerSize;\n\nlayout(location=4) in highp uint in_TransformIndex;\nuniform highp sampler2D u_TransformSampler;\nuniform highp uint u_TransformSize;\n\nuniform mat4 u_Mvp;\nuniform highp mat4 u_ViewMatrix;\nuniform highp float u_Near;\nuniform highp float u_Far;\nout highp vec3 v_Normal;\nout highp vec3 v_Point;\nout lowp vec4 v_Color;\nout highp float v_Depth;\nflat out lowp uint v_FaceId;\n\nconst float PI = 3.1415926535897932384626433832795;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvec4 getPoint(){\n\n    vec2 uv = getUv((in_Point),(u_PointSamplerSize));\n    vec4 v = texture(u_PointSampler,uv);\n    v.w=1.0;\n    return v;\n}\n\n\nmat4 getMatrix(){    \n    if(in_TransformIndex ==0u){\n        return mat4(1.0);\n    }\n    uint index = (in_TransformIndex-1u) * 4u;\n    vec2 uv1 = getUv(index,u_TransformSize);\n    vec2 uv2 = getUv(index+1u,u_TransformSize);\n    vec2 uv3 = getUv(index+2u,u_TransformSize);\n    vec2 uv4 = getUv(index+3u,u_TransformSize);\n\n    vec4 v1 = texture(u_TransformSampler,uv1);\n    vec4 v2 = texture(u_TransformSampler,uv2);\n    vec4 v3 = texture(u_TransformSampler,uv3);\n    vec4 v4 = texture(u_TransformSampler,uv4);\n\n    return mat4(v1,v2,v3,v4);\n}\n\nvec3 get_normal(uvec3 n){\n    float x = float(n[0])/255.;\n    float z = float(n[1])/255.;\n    x = x * PI;\n    z = z * PI;\n    if(n[2]>0u){\n        x = x + PI;\n    }\n    vec3 r;\n    r[0] = sin(z)*cos(x);\n    r[1] = sin(z)*sin(x);\n    r[2] = cos(z);\n    return r;\n}\nvoid main(){\n    v_Color=in_Color;\n    //v_InstanceId = int(in_InstanceId);\n    v_FaceId = (in_FaceId);\n    //v_EdgeColor = in_EdgeColor;\n   //vec4(in_Point,1.0);\n    mat4 tf = getMatrix();\n    vec4 tp =tf * getPoint();\n    vec4 pos = u_Mvp*tp;\n    v_Point = tp.xyz;\n\n    float view_depth = -(u_ViewMatrix * tp).z;\n    v_Depth = (view_depth - u_Near)/(u_Far - u_Near);\n    //v_Depth = clamp(v_Depth,0.,1.0);\n    // vec3 n = u_ViewMatrix * in_Normal;\n    // if(n.z<0.0){\n    //     v_Normal = -in_Normal;\n    // }\n    // else{\n    //     v_Normal = in_Normal;\n    // }\n    \n    v_Normal =mat3(tf)*get_normal(in_Normal);//in_Normal;\n    gl_Position=pos;\n}",et:"#version 300 es\n\nin highp vec3 v_Point;\nin lowp vec3 v_Direction;\nin highp vec3 v_RefPoint;\nin lowp vec3 v_Color;\n\nuniform highp float u_Phase;\nuniform highp float u_DistancePeriod;\nconst highp float PI = 3.1415926;\nout lowp vec4 Color;\nvoid main(){\n\n    highp vec3 v = (v_Point - v_RefPoint);\n    highp float dis = max(dot(v,v_Direction),0.0);\n    highp float rad = (dis / u_DistancePeriod) * PI;\n    highp float fac = max(sin(rad+u_Phase),0.0);\n    fac = float(fac>0.5)*1.0;\n    Color = vec4(v_Color*fac,fac);\n    //Color = vec4(1.0,0,0,1.);\n}",lt:"#version 300 es\n\nlayout(location=0)in highp vec3 in_Point;\nlayout(location=1)in lowp vec3 in_Color;\nlayout(location=2)in lowp vec3 in_Direction;\nlayout(location=3)in highp vec3 in_RefPoint;\nuniform highp mat4 u_Mvp;\n\nout highp vec3 v_Point;\nout lowp vec3 v_Direction;\nout highp vec3 v_RefPoint;\nout lowp vec3 v_Color;\nvoid main(){\n    v_Point = in_Point;\n    v_Direction = in_Direction;\n    v_RefPoint = in_RefPoint;\n    v_Color = in_Color;\n    gl_Position=u_Mvp * vec4(in_Point,1.0);\n}",nt:"#version 300 es\nprecision mediump float;\n\nuniform sampler2D  u_Sampler;\nuniform bool u_Select;\nuniform bool u_Highlight;\nin vec2 v_Uv;\nin vec4 v_Color;\nout vec4 Color;\nvoid main(){\n    if(u_Select){\n        Color =v_Color;\n    }\n    else{\n        if(u_Highlight){\n            Color = texture(u_Sampler,v_Uv) + vec4(0.2,0.2,0.2,0.0);\n        }\n        else{\n            Color = texture(u_Sampler,v_Uv);\n        }        \n    }    \n}",it:"#version 300 es\nprecision mediump float;\n\nin vec3 a_Point;\nin vec2 a_Uv;\nin float a_Id;\n\nuniform mat4 u_Mvp;\nuniform bool u_Select;\n\nout vec2 v_Uv;\nout vec4 v_Color;\nvec4 getIdColor() {\n    float id = a_Id;\n\tfloat B = floor(id / (256.0*256.0));\n\tfloat G = floor((id - B * 256.0*256.0) / 256.0);\n\tfloat R = mod(id, 256.0);\n\treturn vec4(R / 255.0, G / 255.0, B / 255.0, 1.0);\n    //return vec4(1.0,0.0,0.0,1.0);\n}\n\nvoid main(){\n    gl_Position =u_Mvp * vec4(a_Point,1.0);\n    v_Uv = a_Uv;\n    if(u_Select){\n        v_Color = getIdColor();\n    }\n}",ht:"#version 300 es\nprecision highp float;\nuniform highp sampler2D u_OutlineIdSampler;\nuniform mediump int u_OutlineWidth;\nuniform mediump vec4 u_OutlineColor;\nuniform highp vec2 u_PerSize;\nbool isOutline(vec2 uv,vec2 offset){\n    if(u_OutlineWidth==0){\n        return false;\n    }\n    int l=u_OutlineWidth/2;//左下侧采样距离\n    int r=u_OutlineWidth%2 +l;//为右上侧采样距离\n    float groupId=texture(u_OutlineIdSampler,uv).r;\n    for(int i=-l;i<=r;i++){\n        for(int j=-r;j<=r;j++){\n            if(i==0&&j==0){\n                continue;\n            }\n            else{\n                float id=texture(u_OutlineIdSampler,uv+vec2(i,j)*offset).r;\n                if(abs(id-groupId)>.5){\n                    return true;\n                }\n            }\n        }\n    }\n    return false;\n}\n\nout lowp vec4 Color;\nvoid main(){\n    vec2 uv = gl_FragCoord.xy*u_PerSize;\n    if(isOutline(uv,u_PerSize)){\n        Color = u_OutlineColor;\n    }\n    else{\n        Color = vec4(0);\n    }\n}",st:"#version 300 es\nin highp vec3 v_Point;\nflat in int v_OutlineId;\n\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\nout highp vec4 OutlineId;\n\nbool isInBox(highp vec3 point){\n    if(u_Min.x>point.x){\n        return false;\n    }\n    if(u_Min.y>point.y){\n        return false;\n    }\n    if(u_Min.z>point.z){\n        return false;\n    }\n    if(u_Max.x<point.x){\n        return false;\n    }\n    if(u_Max.y<point.y){\n        return false;\n    }\n    if(u_Max.z<point.z){\n        return false;\n    }\n    return true;\n}\nvoid main(){\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point)){\n            discard;\n        }\n    }\n    OutlineId = vec4(v_OutlineId,0.0,0.,1.);\n}",ot:"#version 300 es\nlayout(location=0)in highp uint in_Point;\n\nuniform highp sampler2D u_PointSampler;\nuniform highp uint u_PointSamplerSize;\n\n\nuniform highp sampler2D u_TransformSampler;\nuniform highp uint u_TransformSize;\n\nuniform highp usampler2D u_TransformIndexSampler;\nuniform lowp usampler2D u_OutlineIdSampler;\nuniform highp uint u_TriangleSize;\n\nuniform mat4 u_Mvp;\nflat out mediump int v_OutlineId;\nout highp vec3 v_Point;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvec4 getPoint(){\n\n    vec2 uv = getUv((in_Point),(u_PointSamplerSize));\n    vec4 v = texture(u_PointSampler,uv);\n    v.w=1.0;\n    return v;\n}\n\n\nmat4 getMatrix(uint tf_index){    \n    if(tf_index ==0u){\n        return mat4(1.0);\n    }\n    uint index = (tf_index-1u) * 4u;\n    vec2 uv1 = getUv(index,u_TransformSize);\n    vec2 uv2 = getUv(index+1u,u_TransformSize);\n    vec2 uv3 = getUv(index+2u,u_TransformSize);\n    vec2 uv4 = getUv(index+3u,u_TransformSize);\n\n    vec4 v1 = texture(u_TransformSampler,uv1);\n    vec4 v2 = texture(u_TransformSampler,uv2);\n    vec4 v3 = texture(u_TransformSampler,uv3);\n    vec4 v4 = texture(u_TransformSampler,uv4);\n\n    return mat4(v1,v2,v3,v4);\n}\n\nvoid main(){\n    uint vertexId = uint(gl_VertexID/3);\n    vec2 uv = getUv(vertexId,u_TriangleSize);\n    uint tf_index = texture(u_TransformIndexSampler,uv).r;\n    mat4 tf = getMatrix(tf_index);\n    vec4 tp =tf * getPoint();\n    gl_Position = u_Mvp*tp;\n    v_Point=tp.xyz;  \n    v_OutlineId = int(texture(u_OutlineIdSampler,uv).r);     \n    \n}",rt:"#version 300 es\nprecision highp float;\n\nuniform highp sampler2D u_OpacitySampler;\nuniform highp sampler2D u_OpacityEdgeSampler;\n\nuniform highp sampler2D u_TransparentSampler;\nuniform highp sampler2D u_TransparentEdgeSampler;\n\nuniform highp sampler2D u_OutlineSampler;\n\nuniform highp sampler2D u_MarqueeSampler;\nuniform lowp float u_Marquee;\n\nuniform highp sampler2D u_BloomSampler;\nuniform highp sampler2D u_PromptSampler;\nuniform lowp int u_Bloom;\nuniform lowp float u_Animation;\nuniform highp sampler2D u_AnimationSampler;\nuniform highp sampler2D u_PointSampler;\nuniform highp vec2 u_PerSize;\nuniform mediump float u_Exposure;\nout highp vec4 Color;\nvoid main(){\n\n    vec2 uv = gl_FragCoord.xy*u_PerSize;\n    gl_FragDepth = texture(u_PointSampler,uv).w;\n    vec4 opacityColor = texture(u_OpacitySampler,uv);\n    vec4 transparentColor = texture(u_TransparentSampler,uv);\n    vec4 animationColor =texture(u_AnimationSampler,uv)*u_Animation;\n\n    vec3 dst = opacityColor.rgb;\n\n \n\n    vec4 src = transparentColor;\n    vec3 color = dst*(1.0-src.a) + src.rgb*src.a;\n\n    // Color = vec4(color.rgb,1.0);\n    // return;\n    vec4 edgeColor = texture(u_OpacityEdgeSampler,uv);\n    color = edgeColor.rgb *edgeColor.a + color * (1.0-edgeColor.a);\n    \n\n\n    edgeColor = texture(u_TransparentEdgeSampler,uv);\n    color = edgeColor.rgb *edgeColor.a + color * (1.0-edgeColor.a);\n\n\n    vec4 outlineColor = texture(u_OutlineSampler,uv);\n    color = outlineColor.rgb *outlineColor.a + color * (1.0-outlineColor.a);\n\n    color = animationColor.rgb *animationColor.a+ color*(1.0 - animationColor.a);\n\n    Color = vec4(color,1.0);\n    vec4 bloom = texture(u_BloomSampler,uv);\n    // bloom = bloom *float(u_Bloom);\n    //color = bloom.rgb*u_Exposure * bloom.a + (1.0- bloom.a)*color;\n    // if(u_Bloom==1){\n    //     Color = vec4(bloom.a,0,0,1);\n    //     return;\n    // }\n    float f_bloom = float(u_Bloom);\n    color = bloom.rgb*u_Exposure*f_bloom+ color.rgb*(1.0-bloom.a*f_bloom);\n    \n    // if(u_Bloom==1){\n    //     Color = vec4(bloom.rgb,1.0);\n    //     return;\n    // }\n\n    vec4 marqueeColor = texture(u_MarqueeSampler,uv) * u_Marquee;\n    //color = marqueeColor.rgb * marqueeColor.a + color *(1.-marqueeColor.a);\n    color = marqueeColor.rgb*u_Exposure + color;\n    float m = max(color.x,color.y);\n    m = max(m,color.z);\n    m = max(m,1.0);\n    color = color/m ;\n    // if(u_Marquee>0.5){\n    //     Color =vec4(marqueeColor.rgb,1.0);\n    //     return;\n    // }\n\n    vec4 prompt = texture(u_PromptSampler,uv);//texelFetch(u_PromptSampler,ivec2(round(gl_FragCoord.xy)),0);\n    \n    color = color*(1.0 - prompt.a) + prompt.rgb *prompt.a;\n\n    Color = vec4(color.rgb,1.0);\n    //Color = animationColor;\n    //Color =vec4(prompt.a,0,0,1);\n    //Color =transparentColor;\n    // vec4 bloomColor = texture(u_BloomSampler,uv);\n    // vec4 motionColor = texture(u_MotionSampler,uv);\n    // vec3 color = opacityColor.rgb * (1.0-motionColor.a)+motionColor.rgb *motionColor.a;\n    // color = color*(1.0-transparentColor.a)+transparentColor.rgb * transparentColor.a;\n    // Color = vec4(bloomColor.rgb*u_Exposure+color,1.0);\n    // if(u_Animation>0.5){\n    //     Color = animationColor;\n    // }\n}",ct:"#version 300 es\nprecision highp float;\nuniform highp vec3 u_LightColor;\nuniform highp vec3 u_LightDirection;\nuniform highp vec3 u_AmbientColor;\nuniform highp vec3 u_Eye;\n\nin highp vec3 v_Normal;\nin lowp vec4 v_Color;\nin highp float v_Depth;\nin highp vec3 v_Point;\n\nout highp vec4 Color;\n\nvoid main(){\n\n    vec3 ambient = v_Color.rgb * u_AmbientColor;\n    vec3 diffuse = max(dot(v_Normal,u_LightDirection),0.0)*u_LightColor*v_Color.rgb;\n    vec3 viewDirection = normalize(u_Eye -v_Point);\n    vec3 h = normalize(u_LightDirection+ viewDirection);\n    float spec = pow(max(dot(h,v_Normal),0.0),128.);\n    vec3 specular =0.5* v_Color.rgb * u_LightColor*spec;\n    Color =vec4(ambient+diffuse+specular,v_Color.a);\n    //Color = vec4(1.0,0.,0.0,1.0);\n    gl_FragDepth = v_Depth;\n    \n}",ut:"#version 300 es\nprecision mediump float;\nlayout(location=0)in highp uint in_Point;\nlayout(location=1)in lowp uvec3 in_Normal;\n\nuniform highp sampler2D u_PointSampler;\nuniform highp uint u_PointSamplerSize;\n\nuniform highp sampler2D u_TransformSampler;\nuniform highp uint u_TransformSize;\n\nuniform highp usampler2D u_TransformIndicesSampler;\nuniform lowp sampler2D u_ColorSampler;\nuniform highp uint u_TriangleSize;\n\n\nuniform highp mat4 u_Mvp;\nuniform highp mat4 u_ViewMatrix;\nuniform highp mat4 u_ModelMatrix;\nuniform highp float u_Near;\nuniform highp float u_Far;\nconst float PI = 3.1415926535897932384626433832795;\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvec4 getPoint(){\n\n    vec2 uv = getUv((in_Point),(u_PointSamplerSize));\n    vec4 v = texture(u_PointSampler,uv);\n    v.w=1.0;\n    return v;\n}\n\n\nmat4 getMatrix(uint tf_index){    \n    if(tf_index ==0u){\n        return mat4(1.0);\n    }\n    uint index = (tf_index-1u) * 4u;\n    vec2 uv1 = getUv(index,u_TransformSize);\n    vec2 uv2 = getUv(index+1u,u_TransformSize);\n    vec2 uv3 = getUv(index+2u,u_TransformSize);\n    vec2 uv4 = getUv(index+3u,u_TransformSize);\n\n    vec4 v1 = texture(u_TransformSampler,uv1);\n    vec4 v2 = texture(u_TransformSampler,uv2);\n    vec4 v3 = texture(u_TransformSampler,uv3);\n    vec4 v4 = texture(u_TransformSampler,uv4);\n\n    return mat4(v1,v2,v3,v4);\n}\n\nvec3 get_normal(uvec3 n){\n    float x = float(n[0])/255.;\n    float z = float(n[1])/255.;\n    x = x * PI;\n    z = z * PI;\n    if(n[2]>0u){\n        x = x + PI;\n    }\n    vec3 r;\n    r[0] = sin(z)*cos(x);\n    r[1] = sin(z)*sin(x);\n    r[2] = cos(z);\n    return r;\n}\nout highp vec3 v_Normal;\nout lowp vec4 v_Color;\nout highp float v_Depth;\nout highp vec3 v_Point;\nvoid main(){\n    //vec3[3] tps = vec3[](vec3(-1.0,0.0,0.0),vec3(1.0,0.0,0.0),vec3(0.0,1.0,0.0));\n    uint vertexId = uint((gl_VertexID)/3);\n    //gl_Position = vec4(tps[gl_VertexID],1.0);\n\n    vec2 uv = getUv(vertexId,u_TriangleSize);\n\n    uint tf_index = texture(u_TransformIndicesSampler,uv).r;\n    mat4 tf = getMatrix(tf_index);\n    vec4 tp =tf * getPoint();\n    float view_depth = -(u_ViewMatrix * tp).z;\n    v_Depth = (view_depth - u_Near)/(u_Far - u_Near);\n\n    v_Color = texture(u_ColorSampler,uv);\n    v_Normal =normalize(mat3(tf)*get_normal(in_Normal));\n    v_Point = (u_ModelMatrix*tp).xyz;\n    gl_Position =u_Mvp*vec4(v_Point,1.0);\n    //gl_Position = vec4(tps[gl_VertexID],1.0);\n\n}",gt:"#version 300 es\nprecision mediump float;\nlayout(location=0)in vec2 in_Point;\nvoid main(){\n    gl_Position =vec4(in_Point,0.0,1.0);\n}",dt:"",It:"",Zt:"#version 300 es\nprecision mediump float;\nuniform sampler2D  u_Sampler;\n\nin highp float v_Depth;\nin highp vec2 v_uv;\n\nlayout(location=0)out lowp vec4 Color;\nvoid main(){\n    Color = texture(u_Sampler,v_uv);\n    //Color = vec4(Color.a,0.,0.,1.0);\n    gl_FragDepth = v_Depth;\n}",Gt:"#version 300 es\nprecision mediump float;\nlayout(location=0)in highp vec3 in_Point;\nlayout(location=1)in highp vec2 in_uv;\nuniform mat4 u_Mvp;\nuniform highp mat4 u_ViewMatrix;\nuniform highp float u_Near;\nuniform highp float u_Far;\n\nout highp float v_Depth;\nout highp vec2 v_uv;\nvoid main(){\n    vec4 tp =vec4(in_Point,1.0);\n    float view_depth = -(u_ViewMatrix * tp).z;\n    v_Depth = (view_depth - u_Near)/(u_Far - u_Near);\n    v_uv = in_uv;\n    gl_Position = u_Mvp * tp;\n}",Ct:"#version 300 es\nprecision highp float;\n\nin highp vec3 v_Point;\n\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\nuniform bool u_UseSectionBox;\n\nout highp vec4 Color;\n\n\nbool isInBox(highp vec3 point){\n    if(u_Min.x>point.x){\n        return false;\n    }\n    if(u_Min.y>point.y){\n        return false;\n    }\n    if(u_Min.z>point.z){\n        return false;\n    }\n    if(u_Max.x<point.x){\n        return false;\n    }\n    if(u_Max.y<point.y){\n        return false;\n    }\n    if(u_Max.z<point.z){\n        return false;\n    }\n    return true;\n}\n\nvoid main(){\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point)){\n            discard;\n        }\n    } \n    Color =vec4(v_Point,1.0);\n\n}",bt:"#version 300 es \n\nlayout(location =0) in highp vec3 in_Point;\nuniform mat4 u_Mvp;\nout highp vec3 v_Point;\n\nvoid main(){\n    v_Point =  in_Point;        \n    gl_Position = u_Mvp * vec4(in_Point,1.0);\n    \n}",ft:"#version 300 es\nprecision highp float;\n//in highp vec4 v_Color;\nin highp vec3 v_Point;\nflat in highp int v_vertexId;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\nuniform lowp int u_UseSectionBox;\n\n\nlayout(location=0)out highp int VertexId;\nlayout(location=1)out highp vec4 Point;\n\n\nbool isInBox(highp vec3 point){\n    if(u_Min.x>point.x){\n        return false;\n    }\n    if(u_Min.y>point.y){\n        return false;\n    }\n    if(u_Min.z>point.z){\n        return false;\n    }\n    if(u_Max.x<point.x){\n        return false;\n    }\n    if(u_Max.y<point.y){\n        return false;\n    }\n    if(u_Max.z<point.z){\n        return false;\n    }\n    return true;\n}\nbool isInView(highp vec3 point,highp vec3 orign,highp vec3 normal){\n    vec3 dir = point - orign;\n    float d = dot(dir,normal);\n    return d<0.0;\n}\nvoid main(){ \n\n    if(u_UseSectionBox==1){\n        if(!isInBox(v_Point)){\n            discard;\n        }\n    }\n    if(u_UseSectionBox==2){\n        if(!isInView(v_Point.xyz,u_Min,u_Max)){\n            discard;\n        }\n    }\n    //if(u_SelectPoint){\n        Point =vec4(v_Point,gl_FragCoord.z);\n        VertexId = v_vertexId;\n    //}\n    // else{\n    //     Color =v_Color;\n    // }\n}",Wt:"#version 300 es \nlayout(location=0) in highp uint in_Point;\nuniform highp sampler2D u_PointSampler;\nuniform highp uint u_PointSamplerSize;\n\nuniform highp sampler2D u_TransformSampler;\nuniform highp uint u_TransformSize;\n\nuniform highp usampler2D u_TransformIndexSampler;\nuniform highp uint u_TriangleSize;\n\nuniform mat4 u_Mvp;\n//out highp vec4 v_Color;\nout highp vec3 v_Point;\nflat out highp int v_vertexId;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\nvec4 getPoint(){\n\n    vec2 uv = getUv((in_Point),(u_PointSamplerSize));\n    vec4 v = texture(u_PointSampler,uv);\n    v.w=1.0;\n    return v;\n}\nmat4 getMatrix(uint tf_index){    \n    if(tf_index ==0u){\n        return mat4(1.0);\n    }\n    uint index = (tf_index-1u) * 4u;\n    vec2 uv1 = getUv(index,u_TransformSize);\n    vec2 uv2 = getUv(index+1u,u_TransformSize);\n    vec2 uv3 = getUv(index+2u,u_TransformSize);\n    vec2 uv4 = getUv(index+3u,u_TransformSize);\n\n    vec4 v1 = texture(u_TransformSampler,uv1);\n    vec4 v2 = texture(u_TransformSampler,uv2);\n    vec4 v3 = texture(u_TransformSampler,uv3);\n    vec4 v4 = texture(u_TransformSampler,uv4);\n\n    return mat4(v1,v2,v3,v4);\n}\n\n\nvoid main(){\n    uint vertexId = uint(gl_VertexID/3);\n    vec2 uv = getUv(vertexId,u_TriangleSize);\n    uint tf_index = texture(u_TransformIndexSampler,uv).r;\n    mat4 tf = getMatrix(tf_index);\n    vec4 tp = tf * getPoint();\n    v_Point = tp.xyz;         \n    v_vertexId = gl_VertexID + 1;   \n    gl_Position = u_Mvp * tp;    \n}",Xt:"#version 300 es\nprecision highp float;\n\nin highp vec3 v_Point;\nin highp float v_FaceId;\n\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\nuniform bool u_UseSectionBox;\n\nlayout(location=0) out highp vec4 Depth;\nlayout(location=1) out highp vec4 Color;\n\n\n\nbool isInBox(highp vec3 point){\n    if(u_Min.x>point.x){\n        return false;\n    }\n    if(u_Min.y>point.y){\n        return false;\n    }\n    if(u_Min.z>point.z){\n        return false;\n    }\n    if(u_Max.x<point.x){\n        return false;\n    }\n    if(u_Max.y<point.y){\n        return false;\n    }\n    if(u_Max.z<point.z){\n        return false;\n    }\n    return true;\n}\n\nvoid main(){   \n\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point)){\n            discard;\n        }\n    }\n    Depth =vec4(gl_FragCoord.z,0.0,0.0,1.0);\n    Color =vec4(v_FaceId,0.0,0.0,1.0);\n}",yt:"#version 300 es\nprecision highp float;\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\nin highp vec3 v_Point;\n\nin highp vec3 v_PointFromLight;\n\nlayout (location = 0) out highp vec2 uv;\nlayout (location = 1) out highp vec4 point;\n\nbool isInBox(highp vec3 point){\n    if(u_Min.x>point.x){\n        return false;\n    }\n    if(u_Min.y>point.y){\n        return false;\n    }\n    if(u_Min.z>point.z){\n        return false;\n    }\n    if(u_Max.x<point.x){\n        return false;\n    }\n    if(u_Max.y<point.y){\n        return false;\n    }\n    if(u_Max.z<point.z){\n        return false;\n    }\n    return true;\n}\nvoid main(){\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point)){\n            discard;\n        }\n    }\n    uv =v_PointFromLight.xy;\n    point = vec4(v_Point,1.0);\n}",vt:"#version 300 es \n\nlayout(location =0) in highp vec3 in_Point;\nuniform mat4 u_lightMvp;\nuniform mat4 u_eyeMvp;\n\nout highp vec3 v_Point;\nout highp vec3 v_PointFromLight;\n\n\n\nvoid main(){\n    v_Point =  in_Point;\n    vec4 tp = vec4(in_Point,1.0);   \n    v_PointFromLight = (u_lightMvp*tp).xyz;\n    gl_Position = u_eyeMvp * tp;    \n}",Vt:"#version 300 es \n\nlayout(location=0) in highp vec3 in_Point;\nlayout(location=1) in highp float in_FaceId;\nuniform mat4 u_Mvp;\nout highp vec3 v_Point;\nout highp float v_FaceId;\nvoid main(){     \n    v_Point = in_Point;         \n    v_FaceId = in_FaceId;\n    gl_Position = u_Mvp *vec4(in_Point,1.0);    \n}",Bt:"#version 300 es\nprecision mediump float;\n\nin vec4 v_Color;\nout vec4 Color;\nvoid main(){\n    Color = v_Color;\n}",Yt:"#version 300 es\nprecision mediump float;\n\nin float a_PointIndex;\n\nin float a_FaceIndex;\nin float a_FaceId;\n\nuniform mat4 u_Mvp;\n\nuniform highp float u_Front; //y+\nuniform highp float u_Right; //x+\nuniform highp float u_Up;    //z+\nuniform highp float u_Left;  //x-\nuniform highp float u_Down;  //z-\nuniform highp float u_Back;  //y-\n\nuniform bool u_DrawLine;\nuniform bool u_Select;\nout vec4 v_Color;\n\n\nvec4 getPoint(int id){\n    if(id==0){\n        return vec4(u_Right,u_Front,u_Up,1.0);\n    }\n    if(id ==1){\n        return vec4(u_Left,u_Front,u_Up,1.0);\n    }\n    if(id ==2){\n        return vec4(u_Left,u_Front,u_Down,1.0);\n    }\n    if(id ==3){\n        return vec4(u_Right,u_Front,u_Down,1.0);\n    }\n    if(id ==4){\n        return  vec4(u_Right,u_Back,u_Down,1.0);\n    }\n    if(id == 5){\n        return vec4(u_Right,u_Back,u_Up,1.0);\n    }\n    if(id == 6){\n        return vec4(u_Left,u_Back,u_Up,1.0);\n    }\n    if(id == 7){\n        return vec4(u_Left,u_Back,u_Down,1.0);\n    }\n    return vec4(0.0);\n}\n\nvec4 getIdColor() {\n    float id = a_FaceId;\n\tfloat B = floor(id / (256.0*256.0));\n\tfloat G = floor((id - B * 256.0*256.0) / 256.0);\n\tfloat R = mod(id, 256.0);\n\treturn vec4(R / 255.0, G / 255.0, B / 255.0, 1.0); \n    //return vec4(1.0,0.0, 0.0, 1.0);     \n}\n\nvoid main(){  \n     if(u_Select){\n        int id = int(a_FaceIndex);\n        gl_Position= u_Mvp * getPoint(id);\n        v_Color = getIdColor();\n     }\n     else{\n   \n        if(u_DrawLine){\n            int id = int(a_PointIndex);\n            gl_Position= u_Mvp * getPoint(id); \n            //v_Color = vec4(1.0,1.0,1.0,1.0);\n            v_Color = vec4(0.9,0.29,0.098,1.0);\n        }\n        else{\n            int id = int(a_FaceIndex);\n            gl_Position= u_Mvp * getPoint(id);\n            v_Color = vec4(1.0,1.0,1.0,0.2);\n        } \n     }\n\n\n}",St:"#version 300 es\nprecision mediump float;\n\nuniform vec4 u_Color;\n\nout vec4 Color;\nvoid main(){\n    Color = u_Color;    \n}",Tt:"#version 300 es\nprecision mediump float;\n\nlayout(location=0)in vec3 in_point;\nuniform highp mat4 u_Mvp;\n//uniform mediump vec3 u_Move;\n\nvoid main(){\n    gl_Position = u_Mvp * vec4(in_point,1.0);\n}",wt:"#version 300 es\nprecision highp float;\nuniform highp vec3 u_LightColor;\nuniform highp vec3 u_LightDirection;\nuniform highp vec3 u_AmbientColor;\nuniform highp vec3 u_Eye;\n\nin highp vec3 v_Normal;\nin lowp vec4 v_Color;\nin highp float v_Depth;\nin highp vec3 v_Point;\n\nout highp vec4 Color;\n\nvoid main(){\n\n    vec3 ambient = v_Color.rgb * u_AmbientColor;\n    vec3 diffuse = max(dot(v_Normal,u_LightDirection),0.0)*u_LightColor*v_Color.rgb;\n    vec3 viewDirection = normalize(u_Eye -v_Point);\n    vec3 h = normalize(u_LightDirection+ viewDirection);\n    float spec = pow(max(dot(h,v_Normal),0.0),128.);\n    vec3 specular =0.5* v_Color.rgb * u_LightColor*spec;\n    Color =vec4(ambient+diffuse+specular,v_Color.a*0.5); \n    //Color =vec4(ambient+diffuse+specular,0.1);    \n    //Color = vec4(1.0,0.0,0.0,1.0);\n    //gl_FragDepth = v_Depth;\n    \n}",Rt:"#version 300 es\nprecision mediump float;\nlayout(location=0)in highp uint in_Point;\nlayout(location=1)in lowp uvec3 in_Normal;\n\nuniform highp sampler2D u_PointSampler;\nuniform highp uint u_PointSamplerSize;\n\nuniform highp sampler2D u_TransformSampler;\nuniform highp uint u_TransformSize;\n\nuniform highp usampler2D u_TransformIndicesSampler;\nuniform lowp sampler2D u_ColorSampler;\nuniform highp uint u_TriangleSize;\nuniform lowp vec4 u_HighlightColor;\n\nuniform highp mat4 u_Mvp;\nuniform highp mat4 u_ViewMatrix;\nuniform highp float u_Near;\nuniform highp float u_Far;\nconst float PI = 3.1415926535897932384626433832795;\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvec4 getPoint(){\n\n    vec2 uv = getUv((in_Point),(u_PointSamplerSize));\n    vec4 v = texture(u_PointSampler,uv);\n    v.w=1.0;\n    return v;\n}\n\n\nmat4 getMatrix(uint tf_index){    \n    if(tf_index ==0u){\n        return mat4(1.0);\n    }\n    uint index = (tf_index-1u) * 4u;\n    vec2 uv1 = getUv(index,u_TransformSize);\n    vec2 uv2 = getUv(index+1u,u_TransformSize);\n    vec2 uv3 = getUv(index+2u,u_TransformSize);\n    vec2 uv4 = getUv(index+3u,u_TransformSize);\n\n    vec4 v1 = texture(u_TransformSampler,uv1);\n    vec4 v2 = texture(u_TransformSampler,uv2);\n    vec4 v3 = texture(u_TransformSampler,uv3);\n    vec4 v4 = texture(u_TransformSampler,uv4);\n\n    return mat4(v1,v2,v3,v4);\n}\n\nvec3 get_normal(uvec3 n){\n    float x = float(n[0])/255.;\n    float z = float(n[1])/255.;\n    x = x * PI;\n    z = z * PI;\n    if(n[2]>0u){\n        x = x + PI;\n    }\n    vec3 r;\n    r[0] = sin(z)*cos(x);\n    r[1] = sin(z)*sin(x);\n    r[2] = cos(z);\n    return r;\n}\nout highp vec3 v_Normal;\nout lowp vec4 v_Color;\nout highp float v_Depth;\nout highp vec3 v_Point;\nvoid main(){  \n    //vec3[3] tps = vec3[](vec3(-1.0,0.0,0.0),vec3(1.0,0.0,0.0),vec3(0.0,1.0,0.0));\n    uint vertexId = uint((gl_VertexID)/3);\n    vec2 uv = getUv(vertexId,u_TriangleSize);\n    uint tf_index = texture(u_TransformIndicesSampler,uv).r;\n    mat4 tf = getMatrix(tf_index);\n    vec4 tp =tf * getPoint();\n    float view_depth = -(u_ViewMatrix * tp).z;\n    v_Depth = (view_depth - u_Near)/(u_Far - u_Near);\n\n    v_Color = vec4(u_HighlightColor.rgb,u_HighlightColor.a*texture(u_ColorSampler,uv).a);\n    v_Normal =normalize(mat3(tf)*get_normal(in_Normal));\n    v_Point = tp.xyz;\n    gl_Position =u_Mvp*vec4(v_Point,1.0);\n    //gl_Position = vec4(tps[vertexId],1.0);\n\n}",At:"#version 300 es\nprecision highp float;\n///也可以用延时渲染实现？？\n// in highp vec3 v_Point;\n// flat in highp int v_FaceId;\n// in highp float v_Depth;\n \nuniform highp sampler2D u_ShadowSampler;\nuniform highp sampler2D u_PointSampler;\nuniform highp sampler2D u_GeometrySampler;\nuniform highp vec3 u_LightDirection;\nuniform highp vec2 u_PerSize;\nuniform highp float u_ShadowFactor;\nuniform bool u_UseSectionBox;\nuniform float u_Precision;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\nuniform highp mat4 u_LightMvp;\nuniform highp mat4 u_LightViewMatrix;\nuniform highp float u_Bias;\n#ifdef UseSectionBox\nbool isInBox(highp vec3 point,highp vec3 u_min,highp vec3 u_max){\n    if(u_min.x>point.x){\n        return false;\n    }\n    if(u_min.y>point.y){\n        return false;\n    }\n    if(u_min.z>point.z){\n        return false;\n    }\n    if(u_max.x<point.x){\n        return false;\n    }\n    if(u_max.y<point.y){\n        return false;\n    }\n    if(u_max.z<point.z){\n        return false;\n    }\n    return true;\n}\n#endif\n\n\nlayout(location=0)out highp vec4 Color;\nvoid main(){\n    #ifdef UseSectionBox\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point.xyz,u_Min,u_Max)){\n            discard;\n        }\n    }\n    #endif\n    vec2 uv = gl_FragCoord.xy*u_PerSize;\n    //vec4 tp = vec4(v_Point,1.0);\n    vec4 tp = vec4(texture(u_PointSampler,uv).xyz,1.0);\n    vec4 lp = u_LightMvp * tp;\n    vec3 sc = (lp.xyz/lp.w)/2.0 +0.5;\n    vec2 shadow_uv = sc.xy;\n    \n    //float depth = v_Depth+u_Bias;//视图矩阵深度    \n    float depth = (u_LightViewMatrix*tp).z+u_Bias;;\n    //int faceId = v_FaceId;\n    int faceId = int(texture(u_GeometrySampler,uv).x);\n    ///1 代表阴影 \n    vec2 texelSize=1./vec2(textureSize(u_ShadowSampler,0));\n    int r =1;\n    float shadow1 =0.0;\n    float shadow2 =0.0;\n    for(int i=-r;i<=r;i++){\n        for(int j=-r;j<=r;j++){\n            vec4 td =texture(u_ShadowSampler,shadow_uv+vec2(i,j)*texelSize);\n            float shadow_depth=td.x;\n            shadow1+=depth > shadow_depth?0.:1.0;\n            int shadow_faceId = int(td.y);\n            shadow2 +=(faceId!=shadow_faceId)?1.0:0.0;\n        }\n    }\n    shadow1 = shadow1/9.0;\n    shadow2 = shadow2/9.0 *u_Precision;\n    float shadow = max(shadow1,shadow2);\n    shadow =shadow/u_ShadowFactor;// +1.0 - 1./u_ShadowFactor;\n    Color = vec4(shadow,0.,0.,1.0);\n    //Color = vec4(shadow_faceId,0.,0.,1.0);\n    //Color = vec4(shadow_data.x,0.,0.,1.0);\n    // if(depth<shadow_depth){\n    //     Color = vec4(1.0,0.0,0.0,1.0);\n        \n    // }  \n    // else{\n    //     Color = vec4(0.0,0.0,0.0,1.0);\n    // }\n    // if(shadow_faceId!=faceId){\n    //     Color = vec4(1.0,0.0,0.0,1.0);        \n    // }\n    // else{\n    //     // if(depth<shadow_depth){\n    //     //     Color = vec4(1.0,0.0,0.0,1.0);\n    //     //     return;\n    //     // }\n    //     Color = vec4(0.0,0.0,0.0,1.0);\n    // }\n    //Color = vec4(0.0,0.0,0.0,1.0);\n\n    // if(depth>shadow_depth){\n    //     Color = vec4(0.0,0.0,0.0,1.0);        \n    // }\n    // else{\n    //     Color = vec4(1.0,0.0,0.0,1.0);\n    // }\n}",Nt:"#version 300 es\n\nlayout(location=0)in highp vec3 in_Point;\nlayout(location=1)in highp float in_FaceId;\n\nuniform highp mat4 u_Mvp;\nuniform highp mat4 u_LightViewMatrix;\nout highp vec3 v_Point;\nflat out int v_FaceId;\nout highp float v_Depth;\nvoid main(){\n    v_Point = in_Point;\n    v_FaceId = int(in_FaceId);\n    v_Depth = (u_LightViewMatrix*vec4(in_Point,1.0)).z;\n    gl_Position =u_Mvp * vec4(in_Point,1.0);\n}",kt:"#version 300 es\nprecision highp float;\nin highp vec3 v_Point;\nflat in highp int v_FaceId;\nin highp float v_Depth; \n#define UseSectionBox ;\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\n\n#ifdef UseSectionBox\nbool isInBox(highp vec3 point,highp vec3 u_min,highp vec3 u_max){\n    if(u_min.x>point.x){\n        return false;\n    }\n    if(u_min.y>point.y){\n        return false;\n    }\n    if(u_min.z>point.z){\n        return false;\n    }\n    if(u_max.x<point.x){\n        return false;\n    }\n    if(u_max.y<point.y){\n        return false;\n    }\n    if(u_max.z<point.z){\n        return false;\n    }\n    return true;\n}\n#endif\n\nlayout(location=0)out highp vec4 Color;\nvoid main(){\n    #ifdef UseSectionBox\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point.xyz,u_Min,u_Max)){\n            discard;\n        }\n    }\n    #endif\n    Color = vec4(v_Depth,v_FaceId,0.0,0.0);\n    //Color = vec4(gl_FragCoord.xy,0,1);\n}",Kt:"#version 300 es\n\nlayout(location=0)in highp uint  in_Point;\n// layout(location=1)in lowp uint in_FaceId;\n\n// layout(location=2) in highp uint in_TransformIndex;\n\nuniform highp usampler2D u_TransformIndexSampler;\nuniform lowp usampler2D u_FaceIdSampler;\nuniform highp uint u_TriangleSize;\n\nuniform highp sampler2D u_TransformSampler;\nuniform highp uint u_TransformSize;\n\nuniform highp sampler2D u_PointSampler;\nuniform highp uint u_PointSamplerSize;\n\nuniform highp mat4 u_Mvp;\nuniform highp mat4 u_ViewMatrix;\nout highp vec3 v_Point;\nout highp float v_Depth;\nflat out int v_FaceId;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvec4 getPoint(){\n\n    vec2 uv = getUv((in_Point),(u_PointSamplerSize));\n    vec4 v = texture(u_PointSampler,uv);\n    v.w=1.0;\n    return v;\n}\n\n\nmat4 getMatrix(uint tf_index){    \n    if(tf_index ==0u){\n        return mat4(1.0);\n    }\n    uint index = (tf_index-1u) * 4u;\n    vec2 uv1 = getUv(index,u_TransformSize);\n    vec2 uv2 = getUv(index+1u,u_TransformSize);\n    vec2 uv3 = getUv(index+2u,u_TransformSize);\n    vec2 uv4 = getUv(index+3u,u_TransformSize);\n\n    vec4 v1 = texture(u_TransformSampler,uv1);\n    vec4 v2 = texture(u_TransformSampler,uv2);\n    vec4 v3 = texture(u_TransformSampler,uv3);\n    vec4 v4 = texture(u_TransformSampler,uv4);\n\n    return mat4(v1,v2,v3,v4);\n}\n\nvoid main(){\n\n    uint vertexId = uint(gl_VertexID/3);\n    vec2 uv = getUv(vertexId,u_TriangleSize);\n    uint tf_index = texture(u_TransformIndexSampler,uv).r;\n    mat4 tf = getMatrix(tf_index);\n    vec4 tp =tf * getPoint();\n    v_Point = tp.xyz;\n    v_FaceId = int(texture(u_FaceIdSampler,uv).r);    \n    v_Depth = (u_ViewMatrix * tp).z;\n    gl_Position =u_Mvp * tp;\n}",Mt:"#version 300 es\nprecision mediump float;\nuniform highp sampler2D u_FrontDepthSampler;\nuniform highp sampler2D u_FrontColorSampler;\nuniform highp sampler2D u_FrontNormalSampler;\nuniform highp sampler2D u_FrontFaceIdSampler;\n\nuniform highp sampler2D u_BackDepthSampler;\nuniform highp sampler2D u_BackColorSampler;\nuniform highp sampler2D u_BackNormalSampler;\nuniform highp sampler2D u_BackFaceIdSampler;\n\nuniform highp sampler2D u_SolidSampler;\n\nuniform vec3 u_LightDirection;\nuniform vec3 u_AmbientLight;\nuniform vec3 u_LightColor;\nuniform vec3 u_EyeDir;\nuniform vec4 u_EdgeColor;\nuniform int u_EdgeWidth;\nuniform vec2 u_Size;\nuniform float u_Transparency;\nout lowp vec4 Color;\n\n\nbool isEdge(vec2 uv,vec2 offset,sampler2D mSampler){\n    if(u_EdgeWidth==0){\n        return false;\n    }\n    int l=u_EdgeWidth/2;//左侧采样距离\n    int r=u_EdgeWidth%2+l;//为右侧采样距离\n    float faceId=texture(mSampler,uv).r;\n    for(int i=-l;i<=r;i++){\n        for(int j=-l;j<=r;j++){\n            if(i==0&&j==0){\n                continue;\n            }\n            else{\n                vec2 offset_uv = vec2(i,j);\n                float id=texture(mSampler,uv+offset_uv*offset).r;\n                if(abs(id-faceId)>.5){ \n                    return true;\n                }\n            }\n        }\n    }\n    return false;\n}\n\nvoid main(){\n    vec2 uv=gl_FragCoord.xy/u_Size;\n    vec2 tex_offset=1./u_Size;\n    \n    float frontDepth=texture(u_FrontDepthSampler,uv).r;\n    vec4 frontColor=texture(u_FrontColorSampler,uv).rgba;\n    //Color = frontColor;\n    //return;\n    vec3 frontNormal=texture(u_FrontNormalSampler,uv).rgb;\n    float frontFaceId=texture(u_FrontFaceIdSampler,uv).r;\n\n    float backDepth=texture(u_BackDepthSampler,uv).r;\n    vec4 backColor=texture(u_BackColorSampler,uv).rgba;\n    vec3 backNormal=texture(u_BackNormalSampler,uv).rgb;\n    float backFaceId=texture(u_BackFaceIdSampler,uv).r;\n\n    vec4 lineColor=vec4(0.);    \n    bool frontEdge=false;\n    bool backEdge=false;\n    lineColor=u_EdgeColor;\n    if(isEdge(uv,tex_offset,u_FrontFaceIdSampler)){        \n        frontEdge=true;\n        Color = vec4(lineColor.rgb,1.0);\n        return;\n    }\n    //if(isEdge(uv,tex_offset,u_BackFaceIdSampler)){        \n    //    backEdge=true;\n    //}\n    vec4 solidColor = texture(u_SolidSampler,uv);\n    //Color = solidColor;\n    //return;\n    // if(solidColor.rgb==vec3(0.0)){\n    //     solidColor.a=0.0;\n    // }\n    if(frontNormal==vec3(0.)&&!frontEdge){\n        discard;\n    }\n    vec3 eyeDir =u_EyeDir;\n    float nd = dot(eyeDir,frontNormal);\n    frontNormal = nd>0.?frontNormal:-frontNormal;\n    nd = dot(eyeDir,backNormal);\n    backNormal = nd<0.?backNormal:-backNormal;\n    float nDotL1=0.0;\n    float nDotL2 =0.0;\n\n    nDotL1 =max(dot(u_LightDirection,frontNormal),0.);\n    nDotL2=max(dot(u_LightDirection,backNormal),0.);\n\n\n\n    vec3 ambient=frontColor.rgb*u_AmbientLight;\n    vec3 diffuse=frontColor.rgb*u_LightColor*abs(nDotL1);\n    vec4 color1=vec4(ambient+diffuse,frontColor.a*u_Transparency);\n\n    ambient=backColor.rgb*u_AmbientLight;\n    diffuse=backColor.rgb*u_LightColor*abs(nDotL2);\n    \n    \n    vec4 color2=vec4((ambient+diffuse),backColor.a*u_Transparency);\n    color2 = vec4(color2.rgb*color2.a,color2.a);\n    float a=abs(color1.a);\n    if(backEdge){\n        Color=vec4(lineColor.rgb*((1.-a))+color1.rgb*a,1.);\n    }\n    else{\n        if(solidColor.rgb ==vec3(0.0)){\n            vec3 tmc = color2.rgb*color2.a;\n            Color=vec4(tmc.rgb*(1.-a)+color1.rgb*a,1.);\n        }\n        else{\n            Color=vec4(solidColor.rgb*(1.-a)+color1.rgb*a,1.);\n        }\n        \n    }    \n    gl_FragDepth = texture(u_FrontDepthSampler,uv).r;\n}",Ht:"#version 300 es\nprecision mediump float;\nlayout(location=0) in vec2 in_Point;\nvoid main(){\n    gl_Position =vec4(in_Point,0.0,1.0);\n}",Ft:"#version 300 es\nprecision highp float;\nin lowp vec4 v_Color;\nin highp vec4 v_Point;\nin lowp vec3 v_Normal;\n\nflat in highp int v_FaceId;\n\nlayout(location=0)out highp vec4 Color;\nlayout(location=1)out highp vec4 Normal;\nlayout(location=2)out highp vec4 Depth;\nlayout(location=3)out highp vec4 FaceId;\n\nvoid main(){\n    Color = v_Color;\n    Normal = vec4(v_Normal,1.0);\n    Depth = vec4(gl_FragCoord.z,0.,0.,1.);\n    FaceId = vec4(v_FaceId,0.,0.,1.);    \n}",zt:"#version 300 es\n\nlayout(location=0)in highp vec3 in_Point;\nlayout(location=1)in highp vec3 in_Normal;\nlayout(location=2)in lowp vec4 in_Color;\nlayout(location=3)in highp float in_FaceId;\nuniform mat4 u_Mvp;\nout highp vec3 v_Normal;\nout lowp vec4 v_Color;\nflat out highp int v_FaceId;\nvoid main(){\n        v_Color=in_Color;\n        v_Normal=(in_Normal); \n        v_FaceId=int(in_FaceId);\n        gl_Position=u_Mvp*vec4(in_Point,1.0);\n}",xt:"uniform highp sampler2D  u_SkySampler;\nvarying highp vec2 v_Uv;\nvoid main(){\n    gl_FragColor = texture2D(u_SkySampler,v_Uv);\n    //gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n}",Et:"//    v6----- v5\n    //   /|      /|\n    //  v1------v0|\n    //  | |     | |\n    //  | |v7---|-|v4\n    //  |/      |/\n    //  v2------v3\nattribute highp float a_PointId;\nattribute highp float a_UvId;\nuniform highp mat4 u_Mvp;\nuniform highp float u_Radius;\n\nvarying highp vec2 v_Uv;\n\nvec4 getPoint(int id){\n    if(id==0){\n        return vec4(u_Radius,-u_Radius,u_Radius,1.0);\n    }\n    if(id==1){\n        return vec4(-u_Radius,-u_Radius,u_Radius,1.0);\n    }\n    if(id==2){\n        return vec4(-u_Radius,-u_Radius,-u_Radius,1.0);\n    }\n    if(id==3){\n        return vec4(u_Radius,-u_Radius,-u_Radius,1.0);\n    }\n    if(id==4){\n        return vec4(u_Radius,u_Radius,-u_Radius,1.0);\n    }\n    if(id==5){\n        return vec4(u_Radius,u_Radius,u_Radius,1.0);\n    }\n    if(id==6){\n        return vec4(-u_Radius,u_Radius,u_Radius,1.0);\n    }\n    if(id==7){\n        return vec4(-u_Radius,u_Radius,-u_Radius,1.0);\n    }\n    return vec4(0.0);\n    \n}\nhighp float p = 0.0;//1.0/512.0;\nvec2 getUV(int id){\n    if(id==1){\n        return vec2(0.25,0.0)+vec2(p,p);\n    }\n    if(id==2){\n        return vec2(0.5,0.0)+vec2(-p,p);\n    }\n    if(id==3){\n        return vec2(0.0,0.25)+vec2(p,p);\n    }\n    if(id==4){\n        return vec2(0.25,0.25)+vec2(p,p);\n    }\n    if(id ==5){\n        return vec2(0.5,0.25)+vec2(-p,p);\n    }\n    if(id==6){\n        return vec2(0.75,0.25)+vec2(0.0,p);\n    }\n    if(id==7){\n        return vec2(1.0,0.25)+vec2(-p,p);\n    }\n    if(id==8){\n        return vec2(0.0,0.5)+vec2(p,-p);\n    }\n    if(id==9){\n        return vec2(0.25,0.5)+vec2(p,-p);\n    }\n    if(id == 10){\n        return vec2(0.5,0.5)+vec2(-p,-p);\n    }\n    if(id ==11){\n        return vec2(0.75,0.5)+vec2(0.0,-p);\n    }\n    if(id ==12){\n        return vec2(1.0,0.5)+vec2(-p,-p);\n    }\n    if(id == 13){\n        return vec2(0.25,0.75)+vec2(p,-p);\n    }\n    if(id ==14){\n        return vec2(0.5,0.75)+vec2(-p,-p);\n    }\n    return vec2(0.5);\n}\n\nvoid main(){\n    int id = int(a_PointId);\n    gl_Position = u_Mvp * getPoint(id);\n    id = int(a_UvId);\n    v_Uv = getUV(id);\n}",Lt:"#version 300 es\nprecision highp float;\n\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\n\nin lowp vec4 v_Color;\nin highp vec3 v_Point;\n\nuniform lowp float u_DrawBack;\nout highp vec4 Color;\n\nbool isInBox(highp vec3 point){\n    if(u_Min.x>point.x){\n        return false;\n    }\n    if(u_Min.y>point.y){\n        return false;\n    }\n    if(u_Min.z>point.z){\n        return false;\n    }\n    if(u_Max.x<point.x){\n        return false;\n    }\n    if(u_Max.y<point.y){\n        return false;\n    }\n    if(u_Max.z<point.z){\n        return false;\n    }\n    return true;\n}\n\nvoid main(){\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point)){\n            discard;\n        }\n    }    \n    Color =vec4(v_Color.rgb*u_DrawBack,1.0);    \n}",Jt:"#version 300 es\n\nlayout(location=0)in highp vec3 in_Point;\nlayout(location=1)in lowp vec4 in_Color;\n\nuniform mat4 u_Mvp;\nout lowp vec4 v_Color;\nout highp vec3 v_Point;\n\nvoid main(){\n    v_Color = in_Color;\n    v_Point = in_Point;\n    gl_Position=u_Mvp*vec4(in_Point,1.0);\n}",Ut:"#version 300 es\nprecision highp float;\nin lowp vec4 v_Color;\nin highp vec3 v_Point;\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\n\nuniform sampler2D u_FaceIdSampler;\nuniform mediump int u_EdgeWidth;\nuniform lowp vec4 u_EdgeColor;\nuniform vec2 u_Size;\n\nlayout(location=0)out highp vec4 Color;\n\nbool isInBox(highp vec3 point){\n    if(u_Min.x>point.x){\n        return false;\n    }\n    if(u_Min.y>point.y){\n        return false;\n    }\n    if(u_Min.z>point.z){\n        return false;\n    }\n    if(u_Max.x<point.x){\n        return false;\n    }\n    if(u_Max.y<point.y){\n        return false;\n    }\n    if(u_Max.z<point.z){\n        return false;\n    }\n    return true;\n}\n\nbool isEdge(vec2 uv,vec2 offset){//},vec3 on,vec3 tn){\n    if(u_EdgeWidth==0){\n        return false;\n    }\n    int l=u_EdgeWidth/2;//左侧采样距离\n    int r=u_EdgeWidth%2+l;//为右侧采样距离\n    float faceId=texture(u_FaceIdSampler,uv).r;\n    if(faceId<-0.5){\n            return false;\n    }\n    for(int i=-l;i<=r;i++){\n        for(int j=-l;j<=r;j++){\n            float tr = sqrt(float(i*i + j*j));\n            if(tr>float(u_EdgeWidth)){\n                continue;\n            }\n            if(i==0&&j==0){\n                continue;\n            }\n            else{\n                vec2 offset_uv = vec2(i,j);\n                float id=texture(u_FaceIdSampler,uv+offset_uv*offset).r;\n                if(id<-0.5){\n                    return false;\n                }\n                if(abs(id-faceId)>.5){ \n                    return true;\n                }\n            }\n        }\n    }\n    return false;\n}\n\n\nvoid main(){\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point)){\n            discard;\n        }\n    }\n    vec2 uv=gl_FragCoord.xy/u_Size;\n    vec2 tex_offset=1./u_Size;\n    if(isEdge(uv,tex_offset)){\n        //Color=vec4(u_EdgeColor.rgb*u_EdgeColor.a,1.0); \n\n        Color =vec4(v_Color.rgb*(1.0-u_EdgeColor.a) + u_EdgeColor.rgb*u_EdgeColor.a,1.0);       \n    }\n    else{\n        Color =vec4(v_Color.rgb,1.0);\n    }\n    //Color = texture(u_FaceIdSampler,uv);\n    //Color = vec4(1.,0,0,1.);\n}",Pt:"#version 300 es\n\nlayout(location=0)in highp vec3 in_Point;\nlayout(location=1)in lowp vec3 in_Normal;\nlayout(location=2)in lowp vec4 in_Color;\n\nuniform lowp vec3 u_LightColor;\nuniform lowp vec3 u_LightDirection;\nuniform lowp vec3 u_AmbientLight;\n\nuniform mat4 u_Mvp;\nout lowp vec4 v_Color;\nout highp vec3 v_Point;\n\nvoid main(){\n    vec3 ambient = in_Color.rgb*u_AmbientLight;\n    float nDotL = max(dot(in_Normal,u_LightDirection),0.0);\n    vec3 diffuse = in_Color.rgb*u_LightColor*nDotL;\n    v_Color =vec4(ambient+diffuse, in_Color.a);  \n    // v_Color.r = (pow(v_Color.r,1.0) - 0.5)*1. +  0.5;\n    // v_Color.g = (pow(v_Color.g,1.0) - 0.5)*1. +  0.5;\n    // v_Color.b = (pow(v_Color.b,1.0) - 0.5)*1. +  0.5;\n    v_Point=in_Point;        \n    gl_Position=u_Mvp*vec4(in_Point,1.0);\n}",Dt:"#version 300 es\nprecision highp float;\nin lowp vec4 v_Color;\nin lowp vec3 v_Point;\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\n\n\nlayout(location=0)out highp vec4 Color;\n\nbool isInBox(highp vec3 point){\n    if(u_Min.x>point.x){\n        return false;\n    }\n    if(u_Min.y>point.y){\n        return false;\n    }\n    if(u_Min.z>point.z){\n        return false;\n    }\n    if(u_Max.x<point.x){\n        return false;\n    }\n    if(u_Max.y<point.y){\n        return false;\n    }\n    if(u_Max.z<point.z){\n        return false;\n    }\n    return true;\n}\n\nvoid main(){\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point)){\n            discard;\n        }\n    }\n    float fac = 1.0- gl_FragCoord.z;\n    float a = pow(v_Color.a,fac);\n    Color =vec4(v_Color.rgb,v_Color.a);\n}",Ot:"#version 300 es\n\nlayout(location=0)in highp vec3 in_Point;\nlayout(location=1)in lowp vec3 in_Normal;\nlayout(location=2)in lowp vec4 in_Color;\n\nuniform lowp vec3 u_LightColor;\nuniform lowp vec3 u_LightDirection;\nuniform lowp vec3 u_AmbientLight;\nuniform lowp vec4 u_XrayColor;\n\nuniform mediump vec3 u_GBC;\nuniform mat4 u_Mvp;\nout lowp vec4 v_Color;\nout highp vec3 v_Point;\n\nvoid main(){\n    vec3 ambient = u_XrayColor.rgb*0.4;\n    float nDotL = max(dot(in_Normal,u_LightDirection),0.0);\n    vec3 diffuse = u_XrayColor.rgb*nDotL;\n    v_Color =vec4(ambient+diffuse, u_XrayColor.a);  \n    // v_Color.r = (pow(v_Color.r,u_GBC[0]) - 0.5)*u_GBC[1] + u_GBC[2]+ 0.5;\n    // v_Color.g = (pow(v_Color.g,u_GBC[0]) - 0.5)*u_GBC[1] + u_GBC[2]+ 0.5;\n    // v_Color.b = (pow(v_Color.b,u_GBC[0]) - 0.5)*u_GBC[1] + u_GBC[2]+ 0.5;\n    v_Point=in_Point;        \n    gl_Position=u_Mvp*vec4(in_Point,1.0);\n}",Qt:"#version 300 es\nprecision highp float;\nin lowp vec4 v_Color;\nin highp vec4 v_Point;\nin lowp vec3 v_Normal;\n\nflat in highp int v_FaceId;\nflat in lowp int v_Discard;\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\n\nlayout(location=0)out highp vec4 Color;\nlayout(location=1)out highp vec4 Normal;\nlayout(location=2)out highp vec4 Depth;\nlayout(location=3)out highp vec4 FaceId;\nlayout(location=4) out highp vec4 Point;\n\nbool isInBox(highp vec3 point){\n    if(u_Min.x>point.x){\n        return false;\n    }\n    if(u_Min.y>point.y){\n        return false;\n    }\n    if(u_Min.z>point.z){\n        return false;\n    }\n    if(u_Max.x<point.x){\n        return false;\n    }\n    if(u_Max.y<point.y){\n        return false;\n    }\n    if(u_Max.z<point.z){\n        return false;\n    }\n    return true;\n}\n\nvoid main(){\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point.xyz)){\n            discard;\n        }\n    }\n    Color = v_Color;\n    Normal = vec4(v_Normal,1.0);\n    Depth = vec4(gl_FragCoord.z,0.,0.,1.);\n    Point = v_Point;\n    FaceId = vec4(v_FaceId,0.,0.,1.);    \n}",_t:"#version 300 es\n\nlayout(location=0)in highp vec3 in_Point;\nlayout(location=1)in highp vec3 in_Normal;\nlayout(location=2)in lowp vec4 in_Color;\n\nlayout(location=3)in highp float in_FaceId;\nflat out highp int v_FaceId;\nflat out lowp int v_Discard;\nuniform mat4 u_Mvp;\nuniform mat4 u_ViewMatrix;\n\nout highp vec3 v_Normal;\nout lowp vec4 v_Color;\nout highp vec4 v_Point;\n\n\nvoid main(){\n        v_Color=in_Color;\n        v_Normal=(in_Normal);\n        vec4 tp = vec4(in_Point,1.0);\n        vec4 vp = u_ViewMatrix*tp;\n        v_Point=vec4(in_Point,vp.z);\n        v_FaceId=int(in_FaceId);\n        vec3 tv = mat3(u_Mvp)*v_Normal;\n        v_Discard = tv.z>0.? 0:1;\n        gl_Position=u_Mvp*tp;\n}",jt:"#version 300 es\n//#define EDGE;\n//#define OUTLINE;\nprecision mediump float;\nuniform highp sampler2D u_DepthSampler;\nuniform sampler2D u_OpacityNormalSampler;\nuniform sampler2D u_TransparentNormalSampler;\nuniform highp sampler2D u_PointSampler;\n\nuniform sampler2D u_OpacityColorSampler;\nuniform sampler2D u_TransparentColorSampler;\n\nuniform highp sampler2D u_OpacityFaceIdSampler;\nuniform highp sampler2D u_TransparentFaceIdSampler;\nuniform highp sampler2D u_OutlineIdSampler;\nuniform vec2 u_Size;\nuniform lowp vec3 u_LightColor;\nuniform lowp vec3 u_LightDirection;\nuniform lowp vec3 u_AmbientLight;\n\nuniform mediump int u_Ao;\nuniform highp vec2[16] u_AoR;\nuniform mediump float u_AoFactor;\nuniform mediump float u_ShadowFactor;\nuniform highp mat4 u_ViewMatrix;\n\nuniform mediump int u_EdgeWidth;\nuniform lowp vec4 u_EdgeColor;\nuniform mediump int u_OutLineWidth;\nuniform lowp vec4 u_OutLineColor;\n\nuniform highp mat4 u_LightMvp;\nuniform highp mat4 u_Mvp;\nuniform highp vec3 u_Eye;\nuniform highp vec3 u_Front;\nuniform highp sampler2D u_lightFaceIdSampler;\nuniform highp sampler2D u_lightDepthSampler;\nuniform bool u_Shadow;\nuniform mediump float u_Bias;\n\nuniform vec3 u_BackgroundColor;\n\nuniform highp vec3 u_Center;\nuniform bool u_HasBloom;\nuniform mediump float u_Exposure;\nuniform highp sampler2D u_BloomSampler;\nuniform mediump float u_BoomRadius;\n\nuniform bool u_UseBackgroundImage;\nuniform highp sampler2D u_BackgroundImage;\n\nout lowp vec4 Color;\n\nvec3 gauss(vec2 uv,vec2 offset){\n    vec3 color = vec3(0.0);// texture(u_Sampler,uv).rgb;\n    float radius = u_BoomRadius;\n    float r = 1.5 *radius;\n    for(float i=-radius;i<=radius;i++){\n        for(float j=-radius;j<=radius;j++){\n            float wt =(1.0- sqrt(i*i +j*j)/r);\n            vec3 oc  =(texture(u_BloomSampler,uv + vec2(i,j)*offset).rgb);\n\n            color +=oc;//*wt;\n        }\n    }\n    color =color/(r*r);//color/((2.*r-1.)*(2.*r-1.));\n    return color;\n}\n\n//经典方法\nfloat PCF1(vec2 uv,float nDotL,vec3 normal){\n        float shadow =0.;//0表示阴影\n        float nl1 = max(dot(u_Front,normal),0.0);\n        float tb = u_Bias;//(nl1<0.00001?u_Bias*2.:u_Bias/nl1)*2.;       \n        float bias= nDotL<0.00001?tb*10.:tb/sqrt(1.0- nDotL*nDotL);\n        //float bias=max(u_Bias*10. * (1.0 - dot(normal, u_LightDirection)), u_Bias);//u_Bias;\n        highp int r=1;\n        vec2 texelSize=1./vec2(textureSize(u_lightDepthSampler,0));//(u_Size*10.0);\n        highp vec4 tp =vec4(texture(u_PointSampler,uv).xyz,1.0);\n        highp vec4 lp = u_LightMvp*(tp+vec4(u_LightDirection*bias,0.0));\n        highp vec3 sc = (lp.xyz/lp.w)/2.0 +0.5;\n        for(int x=-r;x<=r;++x)\n        {\n            for(int y=-r;y<=r;++y)\n            {\n                float pcfDepth=texture(u_lightDepthSampler,sc.xy+vec2(x,y)*texelSize).r;// - bias;\n                shadow+=sc.z > pcfDepth?0.:1.0;\n            }\n        }\n        float total=float(2*r+1);\n        shadow = shadow/(total*total);\n        return shadow/u_ShadowFactor +1.0 - 1./u_ShadowFactor;\n}\nbool isIn(float id,float id1,float id2){\n    if(abs(id-id1)<.01){\n        return true;\n    }\n    if(abs(id-id2)<.01){\n        return true;\n    }\n    return false;\n}\n\nbool isOutline(vec2 uv,vec2 offset){\n    if(u_OutLineWidth==0){\n        return false;\n    }\n    int l=u_OutLineWidth/2;//左下侧采样距离\n    int r=u_OutLineWidth%2 +l;//为右上侧采样距离\n    float groupId=texture(u_OutlineIdSampler,uv).r;\n    for(int i=-l;i<=r;i++){\n        for(int j=-r;j<=r;j++){\n            if(i==0&&j==0){\n                continue;\n            }\n            else{\n                float id=texture(u_OutlineIdSampler,uv+vec2(i,j)*offset).r;\n                if(abs(id-groupId)>.5){\n                    return true;\n                }\n            }\n        }\n    }\n    return false;\n}\n\nbool isEdge(vec2 uv,vec2 offset){//},vec3 on,vec3 tn){\n    if(u_EdgeWidth==0){\n        return false;\n    }\n    int l=u_EdgeWidth/2;//左侧采样距离\n    int r=u_EdgeWidth%2+l;//为右侧采样距离\n    float faceId=texture(u_OpacityFaceIdSampler,uv).r;\n    if(faceId<-0.5){\n            return false;\n    }\n    for(int i=-l;i<=r;i++){\n        for(int j=-l;j<=r;j++){\n            float tr = sqrt(float(i*i + j*j));\n            if(tr>float(u_EdgeWidth)){\n                continue;\n            }\n            if(i==0&&j==0){\n                continue;\n            }\n            else{\n                vec2 offset_uv = vec2(i,j);\n                float id=texture(u_OpacityFaceIdSampler,uv+offset_uv*offset).r;\n                if(id<-0.5){\n                    return false;\n                }\n                if(abs(id-faceId)>.5){ \n                    return true;\n                }\n            }\n        }\n    }\n    //return false;\n    faceId=texture(u_TransparentFaceIdSampler,uv).r;\n    if(faceId<-0.5){\n        return false;\n    }\n    for(int i=-l;i<=r;i++){\n        for(int j=-l;j<=r;j++){\n            if(i==0&&j==0){\n                continue;\n            }\n            else{\n                vec2 offset_uv = vec2(i,j);\n                float id=texture(u_TransparentFaceIdSampler,uv+vec2(i,j)*offset).r;\n                if(id<0.){\n                    return false;\n                }\n                if(abs(id-faceId)>.5){\n                    return true;\n                }\n            }\n        }\n    }\n    return false;\n}\n\nfloat getAo(vec2 uv,vec2 offset,sampler2D mSampler){\n    \n    float result =0.0;\n    int r =10;\n    float count =0.;\n    float depth = texture(mSampler,uv).r;    \n    for(int i= -r;i<=r;i++){\n        for(int j= -r;j<=r;j++){            \n            float td = texture(mSampler,uv+vec2(i,j)*offset).r;\n            if(td>0.00001){\n                if(abs(td - depth)>0.00005){\n                    result=result + (td>depth?1.0:0.0);\n                    count++;\n                }\n            }            \n        }\n    }\n    //float total=float(2*r+1);\n    result = result/count;\n    return result;//clamp(0.0,0.5,result +1.0);\n}\nfloat getAo1(vec2 uv,vec2 offset,vec3 normal){\n \n    //vec2 offset=1./vec2(textureSize(u_AoSampler,0));//(u_Size*10.0);\n    vec4 tp = texture(u_PointSampler,uv);\n    float dp = tp.w;\n    //vec3 eyeDir = normalize(u_Eye - tp.xyz);\n    //normal = -reflect(eyeDir,normal);\n    tp = vec4(tp.xyz,1.0);\n    vec4 p1 = u_ViewMatrix * tp;\n   \n    vec4 p2 = u_ViewMatrix *(tp + vec4(normal*5.,0.0));\n    \n    \n    vec2 p3 = (p2-p1).xy;\n    vec3 vn = normalize((p2 - p1).xyz);\n    //bvec2 br =lessThan(p3,offset);\n    // if(length(p3)<1.){\n    //     return 1.0;\n    // }\n    vec2 n2 = normalize(p3);\n    if(dot(vn,vec3(0.0,0.,1.))>0.999){\n        //n2 = normalize(uv+vec2(-0.5));\n        return 1.0;\n    }\n    \n    //float len = length((p2-p1).xyz);\n\n\n    //n2 = normalize(n2);\n    float result =0.0;\n\n    float r =float(u_Ao);\n    //float rr = r*10.0;\n    float count =0.;\n    vec2 ruv = uv;\n    float depth = dp;//texture(u_PointSampler,ruv).r;       \n    for(float i= -r;i<=r;i++){\n        for(float j=-r;j<=r;j++){\n            vec2 uv1 = vec2(i,j);\n            if(dot(uv1,n2)>0.0){\n                vec2 tuv =ruv+uv1*offset;\n                float td = texture(u_PointSampler,tuv).w;\n                if(td==0.0){\n                    result++;\n                    count++;\n                }\n                else{\n                    result=result + (td<(depth)?1.0:0.0);//*(rr - length(uv1))/rr;\n                    count++;\n                }\n\n            }\n        }\n    }\n    if(count<r){\n        return 1.0;\n    }\n    //float total=float(2*r+1);\n    result =result/(count);\n    //result =clamp(0.0,0.5,result);\n    return result/u_AoFactor +1.0 - 1.0/u_AoFactor;//clamp(0.0,1.0,result +1.0);\n}\nvoid main(){\n    vec2 uv=gl_FragCoord.xy/u_Size;\n    vec2 tex_offset=1./u_Size;\n    \n    vec3 transparentNormal=texture(u_TransparentNormalSampler,uv).rgb;\n    vec3 opacityNormal=texture(u_OpacityNormalSampler,uv).rgb;\n    vec4 transparentColor=texture(u_TransparentColorSampler,uv);\n    vec4 opacityColor=texture(u_OpacityColorSampler,uv);\n    vec4 lineColor=vec4(0.);    \n    bool edge=false;\n    bool outline=false;\n    if(isOutline(uv,tex_offset)){\n        lineColor = u_OutLineColor;\n        outline = true;\n    }\n    else{\n        if(isEdge(uv,tex_offset)){\n            lineColor=u_EdgeColor;\n            edge=true;\n        }\n    }    \n\n    \n    if(transparentNormal==vec3(0.)&&opacityNormal==vec3(0.)&&!edge&&!outline){\n        if(u_UseBackgroundImage){\n            Color = texture(u_BackgroundImage,uv);\n            return;\n        }\n        else{\n            discard;\n        }        \n    }\n    vec3 eyeDir =normalize(u_Eye - texture(u_PointSampler,uv).rgb);\n    float nd = dot(eyeDir,opacityNormal);\n    opacityNormal = nd>0.?opacityNormal:-opacityNormal;\n    nd = dot(eyeDir,transparentNormal);\n    transparentNormal = nd>0.?transparentNormal:-transparentNormal;\n    float nDotL1=0.0;\n    float nDotL2 =0.0;\n\n    nDotL1 =max(dot(u_LightDirection,transparentNormal),0.);\n    nDotL2=max(dot(u_LightDirection,opacityNormal),0.);\n\n    float shadow=1.0;\n    if(u_Shadow){\n        //vec3 n = nDotL1>0.0?transparentNormal:opacityNormal;\n        shadow =PCF1(uv,nDotL2,opacityNormal);\n                \n        //shadow =PCF(uv);\n        //shadow = shadow>0.5?1.0:shadow;\n    }\n\n    vec3 ambient=transparentColor.rgb*u_AmbientLight;\n    vec3 diffuse=transparentColor.rgb*u_LightColor*abs(nDotL1);\n    vec4 color1=vec4(ambient+diffuse,transparentColor.a);\n    \n    //float nDotL =abs(dot(normalize(texture(u_PointSampler,uv).xyz-u_Center),opacityNormal));\n    //float a2 = nDotL2*0.5+0.5;\n    //float ao = getAo(uv,tex_offset,u_DepthSampler);\n    float ao =u_Ao>0?getAo1(uv,tex_offset,opacityNormal):1.0;\n    ambient=opacityColor.rgb*u_AmbientLight*ao;\n    // if(ao>0.){\n    //      vec4 tp = texture(u_PointSampler,uv);\n    //      vec4 tp1 = texture(u_PointSampler,uv+vec2(1.0,0)*tex_offset);\n    //     //  vec4 p1 = u_Mvp * tp;\n    //     //  vec4 p2 = u_Mvp * tp1;\n    //      float dp = tp.w;\n    //      float dp1 = tp1.w;\n    // //     vec4 p1 = u_Mvp * tp;\n    // //     //vec3 tp1 = (p1.xyz/p1.w)/2.0+0.5;\n    // //     vec4 p2 = u_Mvp *(tp + vec4(opacityNormal*2.,0.0));\n    // // // vec3 tp2 = (p2.xyz/p2.w)/2.0+0.5;\n    // //     vec2 p3 = (p2-p1).xy;\n    // //     //bvec2 br =lessThan(p3,offset);\n    // //     float td = texture(u_DepthSampler,uv).r;\n    // //     vec2 n2 = normalize(p3);\n    // //     float x = n2.x>0.?1.0:0.0;\n    // //     float y = n2.y>0.?1.0:0.0;\n    // //     Color = vec4(x,y,0,1.0);\n    //     //float dp =texture(u_DepthSampler,uv).r;\n    //     //float dp1 =texture(u_DepthSampler,uv+vec2(1.0,0)*tex_offset).r;\n    //     if(dp>=dp1){\n    //         Color = vec4(1.0,1.0,1.0,1.0);\n    //     }\n    //     else{\n    //         Color =vec4(0.,0.,0.,1.);\n    //     }\n    //     return;\n    // }\n    //nDotL = max(dot(u_LightDirection,opacityNormal),0.0);\n\n    if(opacityNormal==vec3(0.)){\n        diffuse = u_BackgroundColor;\n    }\n    else{        \n        vec3 V = eyeDir; \n        vec3 R = reflect(-u_LightDirection,opacityNormal);\n        float spec = pow(max(dot(V,R),0.0),32.);\n        vec3 specular = 0.5 * spec * u_LightColor*opacityColor.rgb*shadow;\n        diffuse=opacityColor.rgb*u_LightColor*abs(nDotL2)*shadow +specular;\n        //diffuse =specular;\n    }\n    \n    vec4 color2=vec4((ambient+diffuse),1.);\n    float a=abs(color1.a);\n    vec4 color=vec4(color1.rgb*a+color2.rgb*(1.-a),1.);\n    a=lineColor.a;\n    Color=vec4(lineColor.rgb*a+color.rgb*(1.-a),1.);\n    if(u_HasBloom){\n        vec3 bloom = texture(u_BloomSampler,uv).rgb;\n        if(bloom!=vec3(0.0)){\n            vec3 hdrColor = color.rgb + bloom;\n            vec3 result = vec3(1.0)-exp(-hdrColor* u_Exposure);\n            result = pow(result,vec3(1.0/2.2));\n            Color = vec4(bloom*u_Exposure+Color.rgb,1.0);\n            //Color = vec4(result,1.0);\n        }                    \n    }\n    gl_FragDepth=texture(u_DepthSampler,uv).r;    \n}",qt:"#version 300 es\nprecision mediump float;\nlayout(location=0) in vec2 in_Point;\nvoid main(){\n    gl_Position =vec4(in_Point,0.0,1.0);\n}",$t:"#version 300 es\n#define EDGE;\n// #define OUTLINE;\nprecision highp float;\nin lowp vec4 v_Color;\nin highp vec3 v_Point;\nin lowp vec3 v_Normal;\n\nuniform highp sampler2D u_DepthSampler;\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\nuniform vec2 u_Size;\n\nlayout(location=0)out highp vec4 Color;\nlayout(location=1)out highp vec4 Normal;\n#ifdef EDGE\nflat in highp int v_FaceId;\nlayout(location=2)out highp vec4 FaceId;\n#endif\nbool isInBox(highp vec3 point){\n    if(u_Min.x>point.x){\n        return false;\n    }\n    if(u_Min.y>point.y){\n        return false;\n    }\n    if(u_Min.z>point.z){\n        return false;\n    }\n    if(u_Max.x<point.x){\n        return false;\n    }\n    if(u_Max.y<point.y){\n        return false;\n    }\n    if(u_Max.z<point.z){\n        return false;\n    }\n    return true;\n}\n\nvoid main(){\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point)){\n            discard;\n        }\n    }\n    vec2 uv = gl_FragCoord.xy/u_Size;\n    float depth = texture(u_DepthSampler,uv).r;\n    if(depth<0.0000001){\n        depth =1.0;\n    }\n    if(gl_FragCoord.z<depth){\n        Color = v_Color;\n        Normal = vec4(v_Normal,1.0); \n        #ifdef EDGE\n        FaceId = vec4(v_FaceId,0.,0.,1.);\n        #endif      \n    }\n    else{\n        discard;\n    }\n}",te:"#version 300 es\n#define EDGE;\nlayout(location=0)in highp vec3 in_Point;\nlayout(location=1)in lowp vec3 in_Normal;\nlayout(location=2)in lowp vec4 in_Color;\n#ifdef EDGE\nlayout(location=3)in highp float in_FaceId;\nflat out highp int v_FaceId;\n#endif\nuniform mat4 u_Mvp;\nout lowp vec3 v_Normal;\nout lowp vec4 v_Color;\nout highp vec3 v_Point;\n\nvoid main(){  \n        v_Color = in_Color;\n        v_Normal = (in_Normal);        \n        v_Point=in_Point;\n        #ifdef EDGE\n        v_FaceId = int(in_FaceId);\n        #endif\n        gl_Position=u_Mvp*vec4(in_Point,1.0);\n}",ee:"#version 300 es\nprecision highp float;\nuniform highp sampler2D u_TextureSampler;\nuniform highp vec2 u_PerSize;\nout lowp vec4 Color;\nvoid main(){\n    vec2 uv = gl_FragCoord.xy * u_PerSize;\n    Color = texture(u_TextureSampler,uv);\n}",le:"#version 300 es\nprecision mediump float;\n#define UseSectionBox ;\nin lowp vec4 v_Color;\nin highp vec3 v_Point;\nin lowp vec3 v_Normal;\nin lowp vec4 v_EdgeColor;\nflat in highp int v_InstanceId;\nflat in highp int v_FaceId;\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\n\nlayout(location=0)out highp vec4 Color;\nlayout(location=1)out highp vec4 Normal;\nlayout(location=2)out highp vec4 Point;\nlayout(location=3)out highp vec4 EdgeColor;\nlayout(location=4)out highp vec4 Geometry;\n\n\n#ifdef UseSectionBox\nbool isInBox(highp vec3 point,highp vec3 u_min,highp vec3 u_max){\n    if(u_min.x>point.x){\n        return false;\n    }\n    if(u_min.y>point.y){\n        return false;\n    }\n    if(u_min.z>point.z){\n        return false;\n    }\n    if(u_max.x<point.x){\n        return false;\n    }\n    if(u_max.y<point.y){\n        return false;\n    }\n    if(u_max.z<point.z){\n        return false;\n    }\n    return true;\n}\n#endif\nvoid main(){\n    #ifdef UseSectionBox\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point.xyz,u_Min,u_Max)){\n            discard;\n        }\n    }\n    #endif\n    Color = v_Color;\n    EdgeColor =v_EdgeColor;\n    Normal = vec4(v_Normal,1.0);\n    Point =  vec4(v_Point,gl_FragCoord.z);\n    Geometry = vec4(v_FaceId,v_InstanceId,0.0,1.0);\n}",ne:"#version 300 es\n\nlayout(location=0)in highp vec3 in_Point;\nlayout(location=1)in lowp vec3 in_Normal;\nlayout(location=2)in lowp vec4 in_Color;\nlayout(location=3)in highp float in_FaceId;\nlayout(location=4)in lowp vec4 in_EdgeColor;\nlayout(location=5)in highp float in_InstanceId;\n\nuniform mat4 u_Mvp;\nuniform highp mat3 u_ViewMatrix;\nout highp vec3 v_Normal;\nout highp vec3 v_Point;\nout lowp vec4 v_Color;\nout lowp vec4 v_EdgeColor;\nflat out highp int v_InstanceId;\nflat out highp int v_FaceId;\nvoid main(){\n    v_Color=in_Color;    \n    v_InstanceId = int(in_InstanceId);\n    v_FaceId = int(in_FaceId);\n    v_EdgeColor = in_EdgeColor;\n    vec4 tp = vec4(in_Point,1.0);\n    vec4 pos = u_Mvp*tp;\n    v_Point = in_Point;\n    vec3 n = u_ViewMatrix * in_Normal;\n    if(n.z<0.0){\n        v_Normal = -in_Normal;\n    }\n    else{\n        v_Normal = in_Normal;\n    }\n    \n    gl_Position=pos;\n}",ie:"#version 300 es\n//#define EDGE;\n//#define OUTLINE;\nprecision highp float;\n#define UseSectionBox ;\n\nin highp vec3 v_Point;\nin lowp vec3 v_Normal;\nin lowp vec4 v_Color;\n\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\nuniform highp vec3 u_Eye;\nuniform highp vec3 u_LightColor;\nuniform highp vec3 u_LightDirection;\nuniform highp vec3 u_AmbientColor;\n\n// uniform bool u_Shadow;\n// uniform highp mat4 u_LightMvp;\n// uniform highp mat4 u_LightViewMatrix;\n// uniform highp sampler2D u_ShadowSampler;\nout highp vec4 Color;\n#ifdef UseSectionBox\nbool isInBox(highp vec3 point,highp vec3 u_min,highp vec3 u_max){\n    if(u_min.x>point.x){\n        return false;\n    }\n    if(u_min.y>point.y){\n        return false;\n    }\n    if(u_min.z>point.z){\n        return false;\n    }\n    if(u_max.x<point.x){\n        return false;\n    }\n    if(u_max.y<point.y){\n        return false;\n    }\n    if(u_max.z<point.z){\n        return false;\n    }\n    return true;\n}\n#endif\nvec3 blinnPhone(vec3 color,vec3 normal,vec3 viewDirection,vec3 lightDirection,vec3 ambientColor,vec3 lightColor,float shadow){\n    vec3 ambient = color * ambientColor;\n    vec3 diffuse = max(dot(normal,lightDirection),0.0)*lightColor*color * shadow;\n    vec3 h = normalize(lightDirection+ viewDirection);\n    float spec = pow(max(dot(h,normal),0.0),64.);\n    //vec3 R = reflect(-lightDirection,normal);\n    //float spec = pow(max(dot(viewDirection,R),0.0),32.);\n    vec3 specular =0.5* color * lightColor*spec;\n    //return specular;\n    return ambient+diffuse+specular;\n}\nvoid main(){\n    #ifdef UseSectionBox\n    if(u_UseSectionBox){\n        if(!isInBox(v_Point.xyz,u_Min,u_Max)){\n            discard;\n        }\n    }\n    #endif\n    float shadow =1.0;\n    // if(u_Shadow){\n\n    // }\n    vec3 viewDirection = normalize(u_Eye - v_Point);\n    \n    vec3 color = blinnPhone(v_Color.rgb,v_Normal,viewDirection,u_LightDirection,u_AmbientColor,u_LightColor,shadow);\n    //Color = vec4(color,v_Color.a);\n    Color = v_Color;\n    //Color = vec4(1,0,0,1);\n    //Color = vec4(v_Color.rgb,0.5);\n}",ae:"#version 300 es\n\nlayout(location=0)in highp vec3 in_Point;\nlayout(location=1)in lowp vec3 in_Normal;\nlayout(location=2)in lowp vec4 in_Color;\n\nout highp vec3 v_Point;\nout lowp vec3 v_Normal;\nout lowp vec4 v_Color;\n\nuniform highp mat4 u_Mvp;\nvoid main(){\n    v_Point = in_Point;\n    v_Normal = in_Normal;\n    v_Color = in_Color;\n    gl_Position = u_Mvp * vec4(in_Point,1.0);\n}",he:"#version 300 es\nprecision highp float;\nin highp vec3 v_Point;\nflat in highp uint v_Id;\n\nlayout(location=0)out highp uint Color;\n\nuniform bool u_UseSectionBox;\nuniform highp vec3 u_Max;\nuniform highp vec3 u_Min;\nbool isInBox(highp vec3 point,highp vec3 u_min,highp vec3 u_max){\n    if(u_min.x>point.x){\n        return false;\n    }\n    if(u_min.y>point.y){\n        return false;\n    }\n    if(u_min.z>point.z){\n        return false;\n    }\n    if(u_max.x<point.x){\n        return false;\n    }\n    if(u_max.y<point.y){\n        return false;\n    }\n    if(u_max.z<point.z){\n        return false;\n    }\n    return true;\n}\nvoid main(){\n  if(u_UseSectionBox){\n    if(!isInBox(v_Point.xyz,u_Min,u_Max)){\n          discard;\n    }\n  }\n  Color = v_Id;\n}",se:"#version 300 es \n\nlayout(location=0) in highp uint in_Point;\nuniform highp sampler2D u_PointSampler;\nuniform highp uint u_PointSamplerSize;\n\nuniform highp sampler2D u_TransformSampler;\nuniform highp uint u_TransformSize;\n\nuniform highp usampler2D u_TransformIndexSampler;\nuniform highp usampler2D u_ElementIdSampler;\nuniform highp uint u_TriangleSize;\n\nuniform mat4 u_Mvp;\nflat out highp uint v_Id;\nout highp vec3 v_Point;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\nvec4 getPoint(){\n\n    vec2 uv = getUv((in_Point),(u_PointSamplerSize));\n    vec4 v = texture(u_PointSampler,uv);\n    v.w=1.0;\n    return v;\n}\nmat4 getMatrix(uint tf_index){    \n    if(tf_index ==0u){\n        return mat4(1.0);\n    }\n    uint index = (tf_index-1u) * 4u;\n    vec2 uv1 = getUv(index,u_TransformSize);\n    vec2 uv2 = getUv(index+1u,u_TransformSize);\n    vec2 uv3 = getUv(index+2u,u_TransformSize);\n    vec2 uv4 = getUv(index+3u,u_TransformSize);\n\n    vec4 v1 = texture(u_TransformSampler,uv1);\n    vec4 v2 = texture(u_TransformSampler,uv2);\n    vec4 v3 = texture(u_TransformSampler,uv3);\n    vec4 v4 = texture(u_TransformSampler,uv4);\n\n    return mat4(v1,v2,v3,v4);\n}\n\n\nvoid main(){\n    uint vertexId = uint(gl_VertexID/3);\n    vec2 uv = getUv(vertexId,u_TriangleSize);\n    uint tf_index = texture(u_TransformIndexSampler,uv).r;\n    v_Id = texture(u_ElementIdSampler,uv).r;\n    mat4 tf = getMatrix(tf_index);\n    vec4 tp = tf * getPoint();\n    v_Point = tp.xyz;\n    gl_Position = u_Mvp * tp;\n}",oe:"#version 300 es\nprecision mediump float;\nuniform highp sampler2D u_FaceIdSampler;\nuniform vec4 u_EdgeColor;\nuniform int u_EdgeWidth;\nuniform vec2 u_Size;\nuniform vec2 u_Location;\nuniform vec2 u_Eye;\nuniform vec2 u_Dir;\nuniform float u_EyeSize;\nout lowp vec4 Color;\n\nbool isEye(vec2 uv,vec2 offset){\n    \n    float dist = distance(uv,u_Eye);\n    if(dist<length(offset)*u_EyeSize){\n        return true;\n    }\n    return false;\n}\nfloat Front(vec2 uv,vec2 offset){\n    float len =length(offset);\n    vec2 center = u_Eye + (u_EyeSize +1.)*u_Dir*len;\n    float dist = distance(uv,center);\n    if(dist<len*u_EyeSize*5.0){\n        vec2 dir =normalize(uv-center);\n        float ndot = dot(dir,u_Dir);\n        if(ndot>0.7){\n            return dist;\n            //return -1.0;;\n        }\n    }\n    return -1.0;\n}\n\nbool isEdge(vec2 uv,vec2 offset,sampler2D mSampler){\n    if(u_EdgeWidth==0){\n        return false;\n    }\n    int l=u_EdgeWidth/2;//左侧采样距离\n    int r=u_EdgeWidth%2+l;//为右侧采样距离\n    float faceId=texture(mSampler,uv).r;\n    for(int i=-l;i<=r;i++){\n        for(int j=-l;j<=r;j++){\n            if(i==0&&j==0){\n                continue;\n            }\n            else{\n                vec2 offset_uv = vec2(i,j);\n                float id=texture(mSampler,uv+offset_uv*offset).r;\n                if(abs(id-faceId)>.5){ \n                    return true;\n                }\n            }\n        }\n    }\n    return false;\n}\n\nvoid main(){\n    vec2 uv=(gl_FragCoord.xy-u_Location)/u_Size;\n    vec2 tex_offset=1./u_Size;\n    //Color = texture(u_FaceIdSampler,uv);\n    //Color = vec4(1,0,0,1);\n    //return;\n    if(isEye(uv,tex_offset)){\n        Color = vec4(0,1,0,1);\n    }\n    else{\n        float front =Front(uv,tex_offset);\n        if(front>0.){\n            Color =vec4(vec3(0.0,1.0,0)*pow((1.0-front),10.0),1.0);\n        }\n        else{\n            if(isEdge(uv,tex_offset,u_FaceIdSampler)){\n                Color=u_EdgeColor;\n            }\n            else{\n                Color = vec4(0,0,0,0.8);\n            }\n        }\n    }\n}",re:"#version 300 es\nprecision mediump float;\nlayout(location=0) in vec2 in_Point;\nvoid main(){\n    gl_Position =vec4(in_Point,0.0,1.0);\n}",ce:"#version 300 es\nprecision highp float;\nflat in highp int v_FaceId;\nout highp vec4 FaceId;\nvoid main(){\n    FaceId = vec4(v_FaceId,0.,0.,1.);    \n}",ue:"#version 300 es\nlayout(location=0)in highp vec3 in_Point;\nlayout(location=1)in highp float in_FaceId;\nflat out highp int v_FaceId;\nuniform mat4 u_Mvp;\nvoid main(){\n    v_FaceId=int(in_FaceId);       \n    gl_Position=u_Mvp*vec4(in_Point,1.0);\n}",ge:"#version 300 es\nprecision highp float;\n\nuniform highp vec4 u_Rect;\nuniform highp sampler2D u_FaceIdSampler;\nuniform highp vec2 u_PerSize;\nuniform mediump int u_EdgeWidth;\nuniform lowp vec4 u_EdgeColor;\nuniform lowp vec4 u_BackColor;\nout lowp vec4 Color;\nvoid main(){\n    vec2 uv = (gl_FragCoord.xy - u_Rect.xy)/u_Rect.zw;\n    vec2 perSize = 1.0/u_Rect.zw;\n    int l=u_EdgeWidth/2;//左侧采样距离\n    int r=u_EdgeWidth%2+l;//为右侧采样距离\n\n    float faceId = texture(u_FaceIdSampler,uv).x;\n    vec4 color = u_EdgeColor;\n    for(int i=-l;i<=r;i++){\n        for(int j=-l;j<=r;j++){\n            float tr = sqrt(float(i*i + j*j));\n            if(tr>float(u_EdgeWidth)){\n                continue;\n            }\n            if(i==0&&j==0){\n                continue;\n            }\n            else{\n                vec2 offset_uv = uv+ vec2(i,j)*perSize;\n                float fid=texture(u_FaceIdSampler,offset_uv).x;\n\n                if(abs(fid-faceId)>0.5){\n                    Color = color;//vec4(1.,0,0,1.);\n                    return;                \n                }\n            }\n        }\n    }\n    Color = u_BackColor;\n    //Color = vec4(uv,0,1);\n}",de:"#version 300 es\nprecision mediump float;\nuniform vec2 u_PerSize;\nuniform vec2 u_Location;\nuniform vec2 u_Eye;\nuniform vec2 u_Dir;\nuniform float u_EyeSize;\nout lowp vec4 Color;\n\nfloat isEye(vec2 uv){\n    float dist = distance(uv,u_Eye);\n    return float(dist<u_EyeSize); \n}\nfloat Front(vec2 uv){\n    \n    float len =20.;\n    float dist = distance(uv,u_Eye);\n    if(dist<len){\n        vec2 dir =normalize(uv-u_Eye);\n        float ndot = dot(dir,u_Dir);\n        if(ndot>0.8){\n            return (1.0- dist/len);            \n        }\n    }\n    return 0.0;\n}\n\n\n\nvoid main(){\n    vec2 uv=(gl_FragCoord.xy);\n    \n    \n    float front =Front(uv);\n    vec3 color1 =front * vec3(0.0,1.0,0);//*pow((1.0-front),10.0);\n    float isEye =isEye(gl_FragCoord.xy);\n    vec3 color2 = vec3(0,1.*isEye,0);\n    float a = max(isEye,front);\n    Color = vec4(color1 + color2,1.*a);    \n}",Ie:"#version 300 es\nprecision mediump float;\nflat in highp int v_FaceId;\nlayout(location=0)out highp vec4 FaceId;\n\nvoid main(){\n    FaceId = vec4(v_FaceId,0.,0,1.);  \n}",pe:"#version 300 es\nuniform highp sampler2D u_PointSampler;\nuniform highp uint u_PointSamplerSize;\nlayout(location=0)in highp uint in_Point;\n// layout(location=1)in lowp uint in_FaceId;\n\n// layout(location=2) in highp uint in_TransformIndex;\nuniform highp sampler2D u_TransformSampler;\nuniform highp uint u_TransformSize;\n\nuniform lowp usampler2D u_FaceIdSampler;\nuniform highp usampler2D u_TransformIndexSampler;\nuniform highp uint u_TriangleSize;\n\nuniform highp mat4 u_Mvp;\nflat out highp int v_FaceId;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvec4 getPoint(){\n\n    vec2 uv = getUv((in_Point),(u_PointSamplerSize));\n    vec4 v = texture(u_PointSampler,uv);\n    v.w=1.0;\n    return v;\n}\n\n\nmat4 getMatrix(uint tf_index){    \n    if(tf_index ==0u){\n        return mat4(1.0);\n    }\n    uint index = (tf_index-1u) * 4u;\n    vec2 uv1 = getUv(index,u_TransformSize);\n    vec2 uv2 = getUv(index+1u,u_TransformSize);\n    vec2 uv3 = getUv(index+2u,u_TransformSize);\n    vec2 uv4 = getUv(index+3u,u_TransformSize);\n\n    vec4 v1 = texture(u_TransformSampler,uv1);\n    vec4 v2 = texture(u_TransformSampler,uv2);\n    vec4 v3 = texture(u_TransformSampler,uv3);\n    vec4 v4 = texture(u_TransformSampler,uv4);\n\n    return mat4(v1,v2,v3,v4);\n}\n\nvoid main(){\n    uint vertexId = uint(gl_VertexID/3);\n    vec2 uv = getUv(vertexId,u_TriangleSize);\n    uint tf_index = texture(u_TransformIndexSampler,uv).r;\n    v_FaceId = int(texture(u_FaceIdSampler,uv).r);\n\n    mat4 tf = getMatrix(tf_index);\n    vec4 tp = tf * getPoint();\n    gl_Position = u_Mvp*tp;\n}",Ze:"#version 300 es\nprecision mediump float;\n\nuniform highp vec3 u_Eye;\nuniform highp vec3 u_LightColor;\nuniform highp vec3 u_LightDirection;\nuniform highp vec3 u_AmbientColor;\n\nuniform lowp vec3 u_Color;\nuniform highp float u_Flow;\nuniform mediump uint u_FlowType;\n\nin highp vec3 v_Normal;\nin highp vec3 v_Point;\nin lowp vec4 v_Color;\nin highp float v_Depth;\nin highp float v_dis;\n\nconst float PI = 3.1415926535897932384626433832795;\n\nout lowp vec4 Color;\nvoid main(){\n    gl_FragDepth = v_Depth;\n\n    vec3 rgb = v_Color.rgb;\n    vec3 ambient = rgb*u_AmbientColor;\n    vec3 diffuse = max(dot(v_Normal,u_LightDirection),0.0)*u_LightColor*rgb;\n    vec3 viewDirection = normalize(u_Eye- v_Point);\n    vec3 h = normalize(u_LightDirection+viewDirection);\n    float spec = pow(max(dot(h,v_Normal),0.0),64.);\n    vec3 specular =0.5 *rgb *u_LightColor*rgb*spec;\n    vec3 c =ambient+diffuse+specular;\n    float f = max(sin(PI*(v_dis-u_Flow-0.2)/1000.0)-0.6,0.0);\n    //f = sin(PI*(v_dis)/1000.0);\n    switch(u_FlowType){\n        case 1u:{\n            Color = vec4(c*(1.0-f)+u_Color*f,1.0);\n            break;\n        }\n        case 2u:{\n            if(f>0.0){\n                f=1.0;\n            }\n            Color = vec4(c*(1.0-f)+u_Color*f,1.0);\n            break;\n        }\n        default:{\n            Color = vec4(c*(1.0-f)+u_Color*f,1.0);\n        }\n    }\n    \n    //Color = vec4(u_Color,1.0);\n}",Ge:"#version 300 es\nprecision highp float;\nprecision highp int;\nlayout(location=0)in highp uint in_Point;\n\n//uniform lowp usampler2D u_NormalSampler;\nuniform lowp sampler2D u_ColorSampler;\nuniform highp usampler2D u_TransformIndexSampler;\nuniform highp uint u_TriangleSize;\n// uniform lowp usampler2D u_FaceIdSampler;\nlayout(location=1)in lowp uvec3 in_Normal;\n// layout(location=2)in lowp vec4 in_Color;\n// layout(location=3)in lowp uint in_FaceId;\n\nuniform highp sampler2D u_PointSampler;\nuniform highp uint u_PointSamplerSize;\n\n//layout(location=1) in highp uint in_TransformIndex;\nuniform highp sampler2D u_TransformSampler;\nuniform highp uint u_TransformSize;\n\nuniform mat4 u_Mvp;\nuniform highp mat4 u_ViewMatrix;\nuniform highp float u_Near;\nuniform highp float u_Far;\n\nuniform highp vec3 u_BasePoint;\nuniform highp vec3 u_BaseDirection;\n\nout highp vec3 v_Normal;\nout highp vec3 v_Point;\nout lowp vec4 v_Color;\nout highp float v_Depth;\nout highp float v_dis;\n\nconst float PI = 3.1415926535897932384626433832795;\n\nhighp vec2 getUv(uint index,uint size){\n    uint y = index/size;\n    float fy = float(y);\n    uint x = index - y*size;\n    float fx = float(x);\n    highp float fs = float(size);\n    return vec2((fx+0.5)/fs,(fy+0.5)/fs);\n}\n\nvec4 getPoint(){\n\n    vec2 uv = getUv((in_Point),(u_PointSamplerSize));\n    vec4 v = texture(u_PointSampler,uv);\n    v.w=1.0;\n    return v;\n}\n\n\nmat4 getMatrix(uint tf_index){    \n    if(tf_index ==0u){\n        return mat4(1.0);\n    }\n    uint index = (tf_index-1u) * 4u;\n    vec2 uv1 = getUv(index,u_TransformSize);\n    vec2 uv2 = getUv(index+1u,u_TransformSize);\n    vec2 uv3 = getUv(index+2u,u_TransformSize);\n    vec2 uv4 = getUv(index+3u,u_TransformSize);\n\n    vec4 v1 = texture(u_TransformSampler,uv1);\n    vec4 v2 = texture(u_TransformSampler,uv2);\n    vec4 v3 = texture(u_TransformSampler,uv3);\n    vec4 v4 = texture(u_TransformSampler,uv4);\n\n    return mat4(v1,v2,v3,v4);\n}\n\nvec3 get_normal(uvec3 n){\n    float x = float(n[0])/255.;\n    float z = float(n[1])/255.;\n    x = x * PI;\n    z = z * PI;\n    if(n[2]>0u){\n        x = x + PI;\n    }\n    vec3 r;\n    r[0] = sin(z)*cos(x);\n    r[1] = sin(z)*sin(x);\n    r[2] = cos(z);\n    return r;\n}\n\n\nvoid main(){\n    uint vertexId = uint((gl_VertexID)/3);\n    vec2 uv = getUv(vertexId,u_TriangleSize);\n    //v_Color=in_Color;\n    //v_Color = vec4(texture(u_ColorSampler,uv))/vec4(255.0);\n    v_Color = texture(u_ColorSampler,uv);\n    \n    //v_FaceId = texture(u_FaceIdSampler,uv).r;\n    uint tf_index = texture(u_TransformIndexSampler,uv).r;\n    //uint tf_index =0u;\n    //v_Color = vec4(1.0/float(tf_index+1u),0.0,0.0,1.0);\n    mat4 tf = getMatrix(tf_index);\n    vec4 tp =tf * getPoint();\n    \n    v_dis = dot((tp.xyz - u_BasePoint),u_BaseDirection); \n\n    vec4 pos = u_Mvp*tp;\n    v_Point = tp.xyz;\n\n    float view_depth = -(u_ViewMatrix * tp).z;\n    v_Depth = (view_depth - u_Near)/(u_Far - u_Near);\n    //v_Color = vec4(v_Depth,0,0,1.0);\n    //uvec4 d = texture(u_NormalSampler,uv);\n    v_Normal =normalize(mat3(tf)*get_normal(in_Normal));\n    //v_Normal =get_normal(d.rgb);\n    //v_Color = vec4(v_Normal/2.0+vec3(1.0),1.0);\n    //v_FaceId = texture(u_FaceIdSampler,uv).r;\n    //v_Color = vec4(0.5/float(v_FaceId+1u)+0.5,0.0,0.0,1.0);\n    gl_Position=pos;\n}"};class Element{constructor(){}get id(){return r(this).id}get name(){return r(this).me}get originId(){return r(this).originId}get index(){return r(this).index}get typeId(){return r(this).typeId}get storey_index(){return r(this).storey_index}get category(){return r(this).category}get visible(){return r(this).Ce}get locked(){return r(this).be}get bloom(){return r(this).fe}get instances(){let t=r(this).We,e=t.length,l=new Array(e);for(let n=0;n<e;n++)l[n]=t[n].Xe;return l}get model_type(){return r(this).ye}get_box(){return r(this).get_box()}get location(){return r(this).ve()}}!function(t){t[t.MainModel=0]="MainModel",t[t.SceneModel=1]="SceneModel",t[t.NewModel=2]="NewModel",t[t.Template=3]="Template"}(i||(i={}));const s=new WeakMap;class o{get Xe(){let t=new Element;return s.set(t,this),t}Ve=new Int32Array(4);Be=new Int16Array(2);get id(){return this.Ve[0]}set id(t){this.Ve[0]=t}get originId(){return this.Ve[3]}set originId(t){this.Ve[3]=t}get index(){return this.Ve[1]}set index(t){this.Ve[1]=t}get typeId(){return this.Ve[2]}set typeId(t){this.Ve[2]=t}get storey_index(){return this.Be[0]}set storey_index(t){this.Be[0]=t}set category(t){this.Be[1]=t}get category(){return this.Be[1]}We=[];constructor(){this.Ce=!0}Ce=!0;Ye=!0;be=!1;Se=!1;ye=i.MainModel;fe=!1;Te=!1;me;we;get_box(){if(this.we)return this.we;let t=Number.MAX_VALUE,e=Number.MAX_VALUE,l=Number.MAX_VALUE,n=-Number.MAX_VALUE,i=-Number.MAX_VALUE,a=-Number.MAX_VALUE,h=this.We.length;for(let s=0;s<h;s++){let h=this.We[s];if(h.has_matrix){let s=h.geometry,o=s.points,r=h.Re,c=s.pointCount;for(let h=0;h<c;h++){let s=o[3*h],c=o[3*h+1],u=o[3*h+2],g=transformMat4$1(create$3(),fromValues$2(s,c,u),r);s=g[0],c=g[1],u=g[2],s<t&&(t=s),c<e&&(e=c),u<l&&(l=u),s>n&&(n=s),c>i&&(i=c),u>a&&(a=u)}}else{let s=h.geometry,o=s.points,r=s.pointCount;for(let h=0;h<r;h++){let s=o[3*h],r=o[3*h+1],c=o[3*h+2];s<t&&(t=s),r<e&&(e=r),c<l&&(l=c),s>n&&(n=s),r>i&&(i=r),c>a&&(a=c)}}}return this.we=new Float32Array([t,e,l,n,i,a]),this.we}get_face_center(t,e){let l=this.We[t],n=l.geometry.get_face_center(e);if(l.has_matrix){let t=l.Re;n=transformMat4$1(create$3(),n,t)}return n}get_face_normal(t,e){let l=this.We[t],n=l.geometry.get_face_normal(e);if(l.has_matrix){let t=getRotation(create$1(),l.Re);n=transformQuat(create$3(),n,t)}return n}ve(){let t=this.We[0];if(t.has_matrix){let e=clone$1(t.Re),l=getScaling(create$3(),e);return scale$1(e,e,[1/l[0],1/l[1],1/l[2]]),getTranslation(create$3(),e)}return fromValues$2(0,0,0)}Ae(){let t=this.We[0];if(t.has_matrix){let e=clone$1(t.Re),l=getScaling(create$3(),e);e=scale$1(e,e,[1/l[0],1/l[1],1/l[2]]);let n=getRotation(create$1(),e);return normalize(n,n)}return create$1()}}function r(t){return s.get(t)}class Instance{constructor(){}get matrix(){return g(this).Re}get color(){let t=g(this);return null!=t.Ne?t.Ne:t.material.color}get material_id(){return g(this).material_id}get id(){return g(this).id}}class InstanceFace{data=new Int32Array(3);get start(){return this.data[0]}set start(t){this.data[0]=t}get length(){return this.data[1]}set length(t){this.data[1]=t}static id=1;constructor(){this.data[2]=InstanceFace.id,InstanceFace.id++}}class Material{data=new Int32Array(2);get id(){return this.data[0]}set id(t){this.data[0]=t}get offset(){return this.data[1]}set offset(t){this.data[1]=t}color=new Uint8Array(4);get R(){return this.color[0]}set R(t){this.color[0]=t}get G(){return this.color[1]}set G(t){this.color[1]=t}get B(){return this.color[2]}set B(t){this.color[2]=t}get A(){return this.color[3]}set A(t){this.color[3]=t}mdata=new Uint8Array(4);get Roughness(){return this.mdata[0]}set Roughness(t){this.mdata[0]=t}get Metallic(){return this.mdata[1]}set Metallic(t){this.mdata[1]=t}get Specular(){return this.mdata[2]}set Specular(t){this.mdata[2]=t}get AmbientOcclusion(){return this.mdata[3]}set AmbientOcclusion(t){this.mdata[3]=t}get transparent(){return this.color[3]}constructor(){}}const c=new WeakMap;class u{get Xe(){let t=new Instance;return c.set(t,this),t}Ve=new Int32Array(8);get id(){return this.Ve[0]}set id(t){this.Ve[0]=t}get index(){return this.Ve[7]}set index(t){this.Ve[7]=t}get elementId(){return this.Ve[1]}set elementId(t){this.Ve[1]=t}element=null;get start(){return this.Ve[2]}set start(t){this.Ve[2]=t}get length(){return this.Ve[3]}set length(t){this.Ve[3]=t}get has_matrix(){return null!=this.Re&&16==this.Re.length}Re=null;get matrix_offset(){return this.Ve[4]}set matrix_offset(t){this.Ve[4]=t}Ne=null;get material_id(){return this.Ve[5]}set material_id(t){this.Ve[5]=t}material=new Material;get geometry_id(){return this.Ve[6]}set geometry_id(t){this.Ve[6]=t}geometry=null;faces=[];is_transparent(){return null!=this.Ne?this.Ne[3]<255:this.material.transparent<255}get_color(){return null!=this.Ne?this.Ne:this.material.color}constructor(){}}function g(t){return c.get(t)}function d(t){let e=t.geometry.faces.length,l=new Array(e);l.fill(new InstanceFace),t.faces=l}class Geometry{data=new Int32Array(4);get id(){return this.data[0]}set id(t){this.data[0]=t}get offset(){return this.data[1]}set offset(t){this.data[1]=t}get pointCount(){return this.data[2]}set pointCount(t){this.data[2]=t}points=new Float32Array(0);edges=null;faces=[];ke=!1;constructor(){}get_point(t){return this.points.slice(3*t,3*(t+1))}get_face_center(t){let e=this.faces[t].indices,l=e.length,n=[0,0,0];for(let t=0;t<l;t++){n=add(n,n,this.get_point(e[t]))}return scale(create$3(),n,1/l)}get_face_normal(t){let e=this.faces[t],n=e.indices[0],i=e.indices[1],a=e.indices[2],h=this.get_point(n),s=this.get_point(i),o=this.get_point(a),r=l(create$3(),s,h),c=l(create$3(),o,s),u=cross(create$3(),r,c);return normalize$2(u,u)}get_face_point_count(){if(0==this.data[3]){let t=0;this.faces.forEach((e=>{t+=e.indices.length})),this.data[3]=t}return this.data[3]}get_line(){let t=new Map,e=this.faces.length;for(let l=0;l<e;l++){this.faces[l].get_geometry_line().forEach((e=>{t.set(e.key,e)}))}return Array.from(t.values())}}class Color{Ke;constructor(t=null){if(null!=t){if(t instanceof Uint8Array){switch(t.length){case 4:this.Ke=t;break;case 3:this.Ke=new Uint8Array([...t,255]);break;default:throw new Error("color length error")}}else if(t instanceof Array){switch(t.length){case 4:this.Ke=new Uint8Array(t);break;case 3:this.Ke=new Uint8Array([...t,255]);break;default:throw new Error("color length error")}}else if(0==t.indexOf("#")){let e=parseInt("0x"+t.slice(1,3)),l=parseInt("0x"+t.slice(3,5)),n=parseInt("0x"+t.slice(5,7)),i=255;t.length>6&&(i=parseInt("0x"+t.slice(7,9))),this.Ke=new Uint8Array([e,l,n,i])}else if(0==t.indexOf("rgba")){let e=t.replace(/[^\d,]/g,"").split(","),l=parseInt(e[0]),n=parseInt(e[1]),i=parseInt(e[2]),a=parseInt(e[3]);this.Ke=new Uint8Array([l,n,i,a])}else if(0==t.indexOf("rgb")){let e=t.replace(/[^\d,]/g,"").split(","),l=parseInt(e[0]),n=parseInt(e[1]),i=parseInt(e[2]),a=255;this.Ke=new Uint8Array([l,n,i,a])}}else this.Ke=new Uint8Array([255,255,255,255])}get R(){return this.Ke[0]}set R(t){this.Ke[0]=t}get G(){return this.Ke[1]}set G(t){this.Ke[1]=t}get B(){return this.Ke[2]}set B(t){this.Ke[2]=t}get A(){return this.Ke[3]}set A(t){this.Ke[3]=t}get data(){return this.Ke}to_float3_color(){let t=this.Ke,e=t[0]/255,l=t[1]/255,n=t[2]/255;return new Float32Array([e,l,n])}to_float4_color(){let t=this.Ke,e=t[0]/255,l=t[1]/255,n=t[2]/255,i=t[3]/255;return new Float32Array([e,l,n,i])}}class Light{Me=60;get theta(){return this.Me}set theta(t){this.Me=t,this.setLightDirection(),this.He=!0}Fe=60;get phi(){return this.Fe}set phi(t){this.Fe=t,this.setLightDirection(),this.He=!0}He=!0;color=new Color([204,204,204]);ze;xAxis=[1,0,0];zAxis=[0,0,1];constructor(){this.setLightDirection()}setLightDirection(){let t=this.Me/180*Math.PI,e=this.Fe/180*Math.PI,l=fromValues$2(0,0,0),n=rotateY(create$3(),this.zAxis,l,t),i=rotateZ(create$3(),n,l,e);this.ze=normalize$2(create$3(),i)}}var I,p,Z;function get_categry_label(t){switch(t){case I.INVALID:return"未定义";case I.OST_Topography:return"地形";case I.OST_Rooms:return"房间";case I.OST_Walls_Architectural:return"建筑墙体";case I.OST_Windows:return"窗";case I.OST_Floors_Structural:return"结构楼板";case I.OST_CurtainWallPanels_Obsolete:return"幕墙嵌板";case I.OST_CurtainWallMullions_Obsolete:return"幕墙竖梃";case I.OST_Ceilings:return"天花板";case I.OST_Stairs:return"楼梯";case I.OST_Roofs:return"屋顶";case I.OST_StructuralColumns:return"结构柱";case I.OST_StructuralFraming:return"结构框架";case I.OST_StairsRailing:return"栏杆扶手";case I.OST_Doors:return"门";case I.OST_DuctCurves:return"风管";case I.OST_PipeCurves:return"管道";case I.OST_CableTray:return"电缆桥架";case I.OST_DuctFitting:return"风管管件";case I.OST_PipeFitting:return"管件";case I.OST_CableTrayFitting:return"电缆桥架配件";case I.OST_GenericModel:return"常规模型";case I.OST_Furniture:return"家具";case I.OST_PlumbingFixtures:return"卫浴装置";case I.OST_DuctTerminal:return"风道末端";case I.OST_LightingFixtures:return"照明设备";case I.OST_ElectricalEquipment:return"电气设备";case I.OST_Sprinklers:return"喷头";case I.OST_FireAlarmDevices:return"火警设备";case I.OST_PipeAccessory:return"管道附件";case I.OST_Conduit:return"线管";case I.OST_ConduitFitting:return"线管配件";case I.OST_SecurityDevices:return"安全设备";case I.OST_MechanicalEquipment:return"机械设备";case I.OST_Planting:return"植物";case I.OST_SpecialityEquipment:return"专用设备";case I.OST_Mass:return"体量";case I.OST_MassInteriorWall:return"体量内墙";case I.OST_MassZone:return"体量分区";case I.OST_MassExteriorWall:return"体量外墙";case I.OST_MassSkylights:return"体量天窗";case I.OST_MassRoof:return"体量屋顶";case I.OST_MassFloor:return"体量楼层";case I.OST_MassGlazing:return"体量玻璃";case I.OST_Parking:return"停车场";case I.OST_Site:return"场地";case I.OST_BuildingPad:return"建筑地坪";case I.OST_Ramps:return"坡道";case I.OST_CurtaSystem:return"幕墙系统";case I.OST_Cornices:return"墙饰条";case I.OST_FurnitureSystems:return"家具系统";case I.OST_Fascia:return"封檐板";case I.OST_RoofSoffit:return"屋檐底板";case I.OST_Gutter:return"檐沟";case I.OST_Columns:return"柱";case I.OST_RailingHandRail:return"扶手";case I.OST_RailingSupport:return"支座";case I.OST_RailingTermination:return"终端";case I.OST_RailingTopRail:return"顶部扶栏";case I.OST_Floors_Architectural:return"建筑楼板";case I.OST_EdgeSlab:return"楼板边缘";case I.OST_StairsLandings:return"平台";case I.OST_StairsStringerCarriage:return"支撑";case I.OST_StairsRuns:return"梯段";case I.OST_Casework:return"橱柜";case I.OST_Entourage:return"环境";case I.OST_Roads:return"道路";case I.OST_Walls_Structural:return"结构墙体";case I.OST_StructuralStiffener:return"结构加强板";case I.OST_StructuralFoundation:return"结构基础";case I.OST_StructuralTruss:return"结构桁架";case I.OST_Rebar:return"结构钢筋";case I.OST_Coupler:return"结构钢筋接头";case I.OST_StructConnectionShearStuds:return"剪力钉";case I.OST_StructConnectionPlates:return"平板";case I.OST_StructConnectionBolts:return"螺栓";case I.OST_StructConnectionAnchors:return"锚固件";case I.OST_PlaceHolderPipes:return"管道占位符";case I.OST_PipeInsulations:return"管道隔热层";case I.OST_FlexPipeCurves:return"软管";case I.OST_FlexDuctCurves:return"软风管";case I.OST_DuctLinings:return"风管内衬";case I.OST_PlaceHolderDucts:return"风管占位符";case I.OST_DuctAccessory:return"风管附件";case I.OST_DuctInsulations:return"风管隔热层";case I.OST_NurseCallDevices:return"护理呼叫设备";case I.OST_DataDevices:return"数据设备";case I.OST_LightingDevices:return"灯具";case I.OST_ElectricalFixtures:return"电气装置";case I.OST_TelephoneDevices:return"电话设备";case I.OST_CommunicationDevices:return"通讯设备";case I.OST_Areas:return"面积";case I.OST_MEPSpaces:return"空间";case I.OST_HVAC_Zones:return"HAVC区";case I.OST_FabricationContainment:return"MEP预制保护层";case I.OST_FabricationHangers:return"MEP预制支架";case I.OST_FabricationDuctwork:return"MEP预制管网";case I.OST_FabricationPipework:return"MEP预制管道";case I.OST_FabricationDuctworkLining:return"内衬";case I.OST_FabricationPipeworkInsulation:return"隔热层";default:return"未定义"}}function is_space(t){return t==I.OST_Rooms||t==I.OST_Areas||t==I.OST_MEPSpaces||t==I.OST_HVAC_Zones}!function(t){t[t.INVALID=0]="INVALID",t[t.OST_Topography=1]="OST_Topography",t[t.OST_Rooms=2]="OST_Rooms",t[t.OST_Walls_Architectural=3]="OST_Walls_Architectural",t[t.OST_Windows=4]="OST_Windows",t[t.OST_Floors_Structural=5]="OST_Floors_Structural",t[t.OST_CurtainWallPanels_Obsolete=6]="OST_CurtainWallPanels_Obsolete",t[t.OST_CurtainWallMullions_Obsolete=7]="OST_CurtainWallMullions_Obsolete",t[t.OST_Ceilings=8]="OST_Ceilings",t[t.OST_Stairs=9]="OST_Stairs",t[t.OST_Roofs=10]="OST_Roofs",t[t.OST_StructuralColumns=11]="OST_StructuralColumns",t[t.OST_StructuralFraming=12]="OST_StructuralFraming",t[t.OST_StairsRailing=13]="OST_StairsRailing",t[t.OST_Doors=14]="OST_Doors",t[t.OST_DuctCurves=15]="OST_DuctCurves",t[t.OST_PipeCurves=16]="OST_PipeCurves",t[t.OST_CableTray=17]="OST_CableTray",t[t.OST_DuctFitting=18]="OST_DuctFitting",t[t.OST_PipeFitting=19]="OST_PipeFitting",t[t.OST_CableTrayFitting=20]="OST_CableTrayFitting",t[t.OST_GenericModel=21]="OST_GenericModel",t[t.OST_Furniture=22]="OST_Furniture",t[t.OST_PlumbingFixtures=23]="OST_PlumbingFixtures",t[t.OST_DuctTerminal=24]="OST_DuctTerminal",t[t.OST_LightingFixtures=25]="OST_LightingFixtures",t[t.OST_ElectricalEquipment=26]="OST_ElectricalEquipment",t[t.OST_Sprinklers=27]="OST_Sprinklers",t[t.OST_FireAlarmDevices=28]="OST_FireAlarmDevices",t[t.OST_PipeAccessory=29]="OST_PipeAccessory",t[t.OST_Conduit=30]="OST_Conduit",t[t.OST_ConduitFitting=31]="OST_ConduitFitting",t[t.OST_SecurityDevices=32]="OST_SecurityDevices",t[t.OST_MechanicalEquipment=33]="OST_MechanicalEquipment",t[t.OST_Planting=34]="OST_Planting",t[t.OST_SpecialityEquipment=35]="OST_SpecialityEquipment",t[t.OST_Mass=36]="OST_Mass",t[t.OST_MassInteriorWall=37]="OST_MassInteriorWall",t[t.OST_MassZone=38]="OST_MassZone",t[t.OST_MassExteriorWall=39]="OST_MassExteriorWall",t[t.OST_MassSkylights=40]="OST_MassSkylights",t[t.OST_MassRoof=41]="OST_MassRoof",t[t.OST_MassFloor=42]="OST_MassFloor",t[t.OST_MassGlazing=43]="OST_MassGlazing",t[t.OST_Parking=44]="OST_Parking",t[t.OST_Site=45]="OST_Site",t[t.OST_BuildingPad=46]="OST_BuildingPad",t[t.OST_Ramps=47]="OST_Ramps",t[t.OST_CurtaSystem=48]="OST_CurtaSystem",t[t.OST_Cornices=49]="OST_Cornices",t[t.OST_FurnitureSystems=50]="OST_FurnitureSystems",t[t.OST_Fascia=51]="OST_Fascia",t[t.OST_RoofSoffit=52]="OST_RoofSoffit",t[t.OST_Gutter=53]="OST_Gutter",t[t.OST_Columns=54]="OST_Columns",t[t.OST_RailingHandRail=55]="OST_RailingHandRail",t[t.OST_RailingSupport=56]="OST_RailingSupport",t[t.OST_RailingTermination=57]="OST_RailingTermination",t[t.OST_RailingTopRail=58]="OST_RailingTopRail",t[t.OST_Floors_Architectural=59]="OST_Floors_Architectural",t[t.OST_EdgeSlab=60]="OST_EdgeSlab",t[t.OST_StairsLandings=61]="OST_StairsLandings",t[t.OST_StairsStringerCarriage=62]="OST_StairsStringerCarriage",t[t.OST_StairsRuns=63]="OST_StairsRuns",t[t.OST_Casework=64]="OST_Casework",t[t.OST_Entourage=65]="OST_Entourage",t[t.OST_Roads=66]="OST_Roads",t[t.OST_Walls_Structural=67]="OST_Walls_Structural",t[t.OST_StructuralStiffener=68]="OST_StructuralStiffener",t[t.OST_StructuralFoundation=69]="OST_StructuralFoundation",t[t.OST_StructuralTruss=70]="OST_StructuralTruss",t[t.OST_Rebar=71]="OST_Rebar",t[t.OST_Coupler=72]="OST_Coupler",t[t.OST_StructConnectionShearStuds=73]="OST_StructConnectionShearStuds",t[t.OST_StructConnectionPlates=74]="OST_StructConnectionPlates",t[t.OST_StructConnectionBolts=75]="OST_StructConnectionBolts",t[t.OST_StructConnectionAnchors=76]="OST_StructConnectionAnchors",t[t.OST_PlaceHolderPipes=77]="OST_PlaceHolderPipes",t[t.OST_PipeInsulations=78]="OST_PipeInsulations",t[t.OST_FlexPipeCurves=79]="OST_FlexPipeCurves",t[t.OST_FlexDuctCurves=80]="OST_FlexDuctCurves",t[t.OST_DuctLinings=81]="OST_DuctLinings",t[t.OST_PlaceHolderDucts=82]="OST_PlaceHolderDucts",t[t.OST_DuctAccessory=83]="OST_DuctAccessory",t[t.OST_DuctInsulations=84]="OST_DuctInsulations",t[t.OST_NurseCallDevices=85]="OST_NurseCallDevices",t[t.OST_DataDevices=86]="OST_DataDevices",t[t.OST_LightingDevices=87]="OST_LightingDevices",t[t.OST_ElectricalFixtures=88]="OST_ElectricalFixtures",t[t.OST_TelephoneDevices=89]="OST_TelephoneDevices",t[t.OST_CommunicationDevices=90]="OST_CommunicationDevices",t[t.OST_Areas=91]="OST_Areas",t[t.OST_MEPSpaces=92]="OST_MEPSpaces",t[t.OST_HVAC_Zones=93]="OST_HVAC_Zones",t[t.OST_FabricationContainment=94]="OST_FabricationContainment",t[t.OST_FabricationHangers=95]="OST_FabricationHangers",t[t.OST_FabricationDuctwork=96]="OST_FabricationDuctwork",t[t.OST_FabricationPipework=97]="OST_FabricationPipework",t[t.OST_FabricationDuctworkLining=98]="OST_FabricationDuctworkLining",t[t.OST_FabricationPipeworkInsulation=99]="OST_FabricationPipeworkInsulation"}(I||(I={})),function(t){t[t.none=0]="none",t[t.element=1]="element",t[t.instance=3]="instance",t[t.face=7]="face",t[t.point=15]="point",t[t.snap=31]="snap"}(p||(p={}));class SnapResult{type;point;constructor(t,e){this.type=t,this.point=e}}class Line{xe;Ee;Le;constructor(t,e){this.xe=t,this.Ee=e,this.Le=scale(create$3(),add(create$3(),t,e),.5)}get_snap_point(t,e){if(distance$1(t,this.xe)<e)return new SnapResult("endpoint",this.xe);if(distance$1(t,this.Ee)<e)return new SnapResult("endpoint",this.Ee);if(distance$1(t,this.Le)<e)return new SnapResult("middle",this.Le);let n=l(create$3(),this.Ee,this.xe);n=normalize$2(create$3(),n);let i=l(create$3(),t,this.xe),a=length(i),h=Math.abs(dot$1(i,n));if(Math.sqrt(a*a-h*h)<e){let t=scale(create$3(),n,h),e=create$3();return e=add(e,this.xe,t),new SnapResult("subpoint",e)}return null}}class GeometryLine{Je=new Uint32Array(2);constructor(t,e){this.Je[0]=t,this.Je[1]=e}get start_index(){return this.Je[0]}set start_index(t){this.Je[1]=t}get end_index(){return this.Je[1]}set end_index(t){this.Je[1]=t}get key(){let t=this.Je;return`${Math.min(t[0],t[1])}_${Math.max(t[0],t[1])}`}get_line(t){let e=t.get_point(this.start_index),l=t.get_point(this.end_index);return new Line(e,l)}}class Face{isPlanar;indices;normals;data=new Int32Array(2);get start(){return this.data[0]}set start(t){this.data[0]=t}get length(){return this.data[1]}set length(t){this.data[1]=t}constructor(){}get_geometry_line(){let t=this.indices.length,e=new Map;for(let l=0;l<t;l+=3){let t=new GeometryLine(this.indices[l],this.indices[l+1]),n=t.key;e.has(n)?e.get(n).push(t):e.set(n,[t]),t=new GeometryLine(this.indices[l+1],this.indices[l+2]),n=t.key,e.has(n)?e.get(n).push(t):e.set(n,[t]),t=new GeometryLine(this.indices[l+2],this.indices[l]),n=t.key,e.has(n)?e.get(n).push(t):e.set(n,[t])}let l=[];return e.forEach((t=>{1==t.length&&l.push(t[0])})),l}}class Type{id;name;constructor(t,e){this.id=t,this.name=e}}class StreamReader{Ue=0;get Position(){return this.Ue}Pe=0;De;decoder=new TextDecoder;constructor(t){this.De=new DataView(t),this.Pe=t.byteLength}hasEnd(){return this.Ue>=this.Pe}readInt32(){let t=this.De.getInt32(this.Ue,!0);return this.Ue+=4,t}readInt32Array(t){let e=new Int32Array(t);for(let l=0;l<t;l++)e[l]=this.readInt32();return e}readUint32(){let t=this.De.getUint32(this.Ue,!0);return this.Ue+=4,t}readSingle(){let t=this.De.getFloat32(this.Ue,!0);return this.Ue+=4,t}readBoolean(){let t=this.De.getUint8(this.Ue);return this.Ue+=1,1==t}readUint8(){let t=this.De.getUint8(this.Ue);return this.Ue+=1,t}readUint16(){let t=this.De.getUint16(this.Ue,!0);return this.Ue+=2,t}readUint16Array(t){let e=new Uint16Array(t);for(let l=0;l<t;l++)e[l]=this.readUint16();return e}readInt8(){let t=this.De.getInt8(this.Ue);return this.Ue+=1,t}readVec3(){let t=new Float32Array(3);return t[0]=this.readSingle(),t[1]=this.readSingle(),t[2]=this.readSingle(),t}readFloat32Array(t){let e=new Float32Array(t);for(let l=0;l<t;l++)e[l]=this.readSingle();return e}readUint32Array(t){let e=new Uint32Array(t);for(let l=0;l<t;l++)e[l]=this.readUint32();return e}readUint8Array(t){let e=new Uint8Array(t);for(let l=0;l<t;l++)e[l]=this.readUint8();return e}readNormal(){let t=new Float32Array(3),e=this.readUint8(),l=this.readUint8(),n=this.readBoolean(),i=e/255*Math.PI,a=l/255*Math.PI;return n&&(i+=Math.PI),t[0]=Math.sin(a)*Math.cos(i),t[1]=Math.sin(a)*Math.sin(i),t[2]=Math.cos(a),t}readOriginNormal(){let t=this.readUint8(),e=this.readUint8();return this.readBoolean()?new Uint8Array([t,e,1]):new Uint8Array([t,e,0])}readOriginNormals(t){let e=new Array(t);for(let l=0;l<t;l++)e[l]=this.readOriginNormal();return e}readNormals(t){let e=new Array(t);for(let l=0;l<t;l++)e[l]=this.readNormal();return e}readString(){let t=this.readInt32();if(0==t)return"";let e=this.readUint8Array(t);return this.decoder.decode(e)}}function G(t){let e=new Geometry;e.id=t.readInt32(),e.pointCount=t.readInt32(),e.points=t.readFloat32Array(3*e.pointCount);let l=t.readInt32(),n=new Array(l);for(let e=0;e<l;e++)n[e]=m(t);return e.faces=n,e}function m(t){let e=t.readBoolean(),l=new Face;if(l.isPlanar=e,e)l.normals=t.readUint8Array(3);else{let e=t.readInt32();l.normals=t.readUint8Array(3*e)}let n=t.readInt32();return l.indices=t.readInt32Array(n),l}function C(t){let e=new Material;return e.id=t.readInt32(),e.color=t.readUint8Array(4),e}function b(t){let e=new u;return e.id=t.readInt32(),e.elementId=t.readInt32(),e.material_id=t.readInt32(),e.geometry_id=t.readInt32(),t.readBoolean()&&(e.Re=t.readFloat32Array(16)),e}class SceneManager{constructor(){}get templates(){let t=V(this).Oe,e=t.length,l=new Array(e);for(let n=0;n<e;n++)l[n]=t[n].Xe;return l}get elements(){return V(this).Qe}add_template(t){let e=function(t){let e=new StreamReader(t),l=e.readInt32(),n=e.readString();console.log(`type id:${l},type name:${n}`);let a=new o;a.ye=i.SceneModel,a.id=e.readInt32(),a.me=e.readString(),a.we=e.readFloat32Array(6),a.category=e.readUint8();let h=e.readInt32(),s=new Array(h);for(let t=0;t<h;t++)s[t]=G(e);let r=e.readInt32(),c=new Array(r);for(let t=0;t<r;t++)c[t]=C(e);let u=e.readInt32(),g=new Array(u);for(let t=0;t<u;t++){let l=b(e);l.material=c.find((t=>t.id==l.material_id)),l.geometry=s.find((t=>t.id==l.geometry_id)),g[t]=l}return a.We=g,a}(t),l=V(this);l.Oe.find((t=>t.id==e.id))||l.Oe.push(e)}add_element(t,e,l){let n=r(t);n.id=e,V(this)._e(n,l)}prompt_template(t,e){V(this).je(t,e)}commit(){V(this).qe()}save(){return V(this).$e()}}class SceneItem{template_id;id;loc}class f{tl;el;constructor(t,e){this.tl=t,this.el=e}ll(){let t=new SceneItem;return t.template_id=this.tl.id,t.loc=this.el,t}}!function(t){t.in_side=function(t,e){for(let l=0;l<3;l++)if(e[l]<t[l]||e[l]>t[l+3])return!1;return!0},t.get_points=function(t){let e=t,l=e[0],n=e[1],i=e[2],a=e[3],h=e[4],s=e[5];return new Float32Array([l,n,i,l,n,s,l,h,i,l,h,s,a,n,i,a,n,s,a,h,i,a,h,s])},t.unin=function(t){let e=Number.MAX_VALUE,l=new Float32Array([e,e,e,-e,-e,-e]),n=t.length;for(let e=0;e<n;e++){let n=t[e];l[0]=Math.min(l[0],n[0]),l[1]=Math.min(l[1],n[1]),l[2]=Math.min(l[2],n[2]),l[3]=Math.max(l[3],n[3]),l[4]=Math.max(l[4],n[4]),l[5]=Math.max(l[5],n[5])}return l},t.get_center=function(t){return new Float32Array([(t[0]+t[3])/2,(t[1]+t[4])/2,(t[2]+t[5])/2])},t.get_diagonal=function(t){const e=t[3]-t[0],l=t[4]-t[1],n=t[5]-t[2];return Math.sqrt(e*e+l*l+n*n)}}(Z||(Z={}));const W=new Map;class X{nl;il;Oe=[];al=[];hl=[];get Qe(){let t=this.al.length,e=new Array;for(let l=0;l<t;l++){let t=this.al[l].tl;t.Te||e.push(t.Xe)}return e}constructor(t){this.nl=new SceneManager,this.il=t,W.set(this.nl,this),this.sl=this.ol.bind(this)}sl;rl;ol(t){this.il.cl.remove("pick_point",this.sl),this._e(this.rl,t),this.qe(),this.il.cl.publish("prompting",null),this.rl=null}_e(t,e){let l=function(t,e){let l=new o;l.ye=i.SceneModel,l.category=t.category,l.Ve=new Int32Array(t.Ve);let n=t.We,a=n.length,h=new Array(a);for(let t=0;t<a;t++){let i=n[t];h[t]=v(i,e),h[t].element=l}return l.We=h,l}(t,e);this.hl.push(l),this.al.push(new f(l,e))}je(t,e){this.il.ul=p.point;let l=r(t);this.rl=l,this.il.cl.publish("prompting",function(t,e){let l=new o;l.id=e,l.ye=i.SceneModel,l.category=t.category,l.Ve=new Int32Array(t.Ve);let n=t.We,a=n.length,h=new Array(a);for(let t=0;t<a;t++){let e=n[t];h[t]=y(e),h[t].element=l}return l.We=h,l}(l,e)),this.il.cl.subscribe("pick_point",this.sl)}qe(){!function(t,e){let l=t.Qe.length,n=t.dl.length,i=t.Il.length,a=[],h=[],s=e.length;for(let t=0;t<s;t++){let s=e[t];s.index=l+t;let o=s.We;a=a.concat(o);let r=o.length;for(let t=0;t<r;t++){let e=o[t];e.index=n,e.elementId=s.index,n++;let l=e.geometry;0==l.ke&&(l.ke=!0,l.id=i,i++,h.push(l),e.geometry_id=l.id)}}let o=[];e.forEach((t=>{t.Se=!0,o.push(t.get_box())})),console.log("add extra elements",e),o.push(t.pl),t.pl=Z.unin(o),t.Qe=t.Qe.concat(e),t.dl=t.dl.concat(a),t.Il=t.Il.concat(h);let r={elements:e,instances:a,geometries:h,fromloading:!1};t.cl.publish("update_gpu",r)}(this.il,this.hl),this.hl=[]}$e(){let t=this.al.length,e=new Array(t);for(let l=0;l<t;l++)e[l]=this.al[l].ll();return e}Zl(t){let e=t.length;for(let l=0;l<e;l++)this.Gl(t[l])}Gl(t){}}function y(t){let e=new u;return e.Ve=new Int32Array(t.Ve),e.geometry_id=t.geometry_id,e.geometry=function(t){let e=new Geometry;return e.data=new Int32Array(t.data),e.ke=t.ke,e.points=t.points,e.faces=t.faces,e}(t.geometry),e.material=t.material,e}function v(t,e){let l=new u;return l.Ve=new Int32Array(t.Ve),l.geometry_id=t.geometry_id,l.geometry=t.geometry,null!=t.Re?null!=e&&(3==e.length?l.Re=translate(new Float32Array(16),t.Re,e):16==e.length&&(l.Re=multiply(new Float32Array(16),t.Re,e))):null!=e&&(3==e.length?l.Re=fromTranslation(new Float32Array(16),e):16==e.length&&(l.Re=clone$1(e))),l.material=t.material,l}function V(t){return W.get(t)}class B{ml;Cl;constructor(t,e){this.ml=t,this.Cl=e}bl(t,e){let l=this.ml,n=t[0]-l[0],i=t[1]-l[1],a=t[2]-l[2],h=new Float32Array([-n,-i,-a]),s=this.Cl,o=dot$1(h,s),r=dot$1(s,e);if(Math.abs(r)<1e-5)return null;let c=o/r;if(c<0)return null;let u=new Float32Array(3);return u=add(u,scale(u,e,c),t),u}}var Y;!function(t){t[t.none=0]="none",t[t.box=1]="box",t[t.plane=2]="plane"}(Y||(Y={}));class S{ml;fl;constructor(t,e){this.ml=t,this.fl=e}}class AutoBufferWriter{Wl;De;Ue=0;encoder=new TextEncoder;Xl=1048576;yl;get capacity(){return this.yl}constructor(t=1048576){this.Xl=t,this.Wl=this.create_buffer(this.Xl),this.De=new DataView(this.Wl),this.yl=this.Xl}create_buffer(t){return new ArrayBuffer(t)}check_capacity(t){if(this.Ue+t>this.yl){this.yl+=this.Xl,performance.now();let t=new ArrayBuffer(this.yl);new Uint8Array(t).set(new Uint8Array(this.Wl),0),this.Wl=t,this.De=new DataView(t)}}writeBoolean(t,e=!0){e&&this.check_capacity(1),t?this.De.setUint8(this.Ue,1):this.De.setUint8(this.Ue,0),this.Ue+=1}writeString(t){let e=this.encoder.encode(t),l=e.length;this.check_capacity(l+4),this.writeInt32(l),l>0&&this.writeUint8Array(e,!1)}writeInt32(t,e=!0){e&&this.check_capacity(4),this.De.setInt32(this.Ue,t,!0),this.Ue+=4}writeUint32(t,e=!0){e&&this.check_capacity(4),this.De.setUint32(this.Ue,t,!0),this.Ue+=4}writeInt32Array(t){let e=t.length;this.check_capacity(4*e);for(let l=0;l<e;l++)this.writeInt32(t[l],!1)}writeUint16(t,e=!0){e&&this.check_capacity(2),this.De.setUint16(this.Ue,t,!0),this.Ue+=2}writeUint16Array(t,e=!0){e&&this.check_capacity(2);let l=t.length;for(let e=0;e<l;e++)this.writeUint16(t[e],!1)}writeUint8(t,e=!0){e&&this.check_capacity(1),this.De.setUint8(this.Ue,t),this.Ue+=1}writeUint8Array(t,e=!0){let l=t.length;e&&this.check_capacity(l);for(let e=0;e<l;e++)this.writeUint8(t[e],!1)}writeSingle(t,e=!0){e&&this.check_capacity(4),this.De.setFloat32(this.Ue,t,!0),this.Ue+=4}writeFloat32Aarry(t){let e=t.length;this.check_capacity(4*e);for(let l=0;l<e;l++)this.writeSingle(t[l],!1)}writeColor(t){let e=t.length;this.check_capacity(4*e),this.writeUint8(Math.floor(255*t[0]),!1),this.writeUint8(Math.floor(255*t[1]),!1),this.writeUint8(Math.floor(255*t[2]),!1),4==e?this.writeUint8(Math.floor(255*t[3]),!1):this.writeUint8(255,!1)}getBuffer(){return this.Wl.slice(0,this.Ue)}get_shared_buffer(){let t=this.getBuffer(),e=t.byteLength,l=new SharedArrayBuffer(e);return new Uint8Array(l).set(new Uint8Array(t),0),l}get_orign_buffer(){return this.Wl}}const T=new WeakMap;class w{vl=null;Vl=!1}function R(t){return T.get(t)}function A(t,e){if(null==e||null==e||0==e.length)return;e.forEach((t=>{t.fe=!0})),T.get(t).Vl=!0}var N;!function(t){t[t.__Unknown=0]="__Unknown",t[t.__Normal=1]="__Normal",t[t.__Wander=2]="__Wander",t[t.__Ratation=3]="__Ratation"}(N||(N={}));const k=new WeakMap;class K{Bl=[];Qe=[];Yl=[];Sl=[];dl=[];Il=[];Tl=[];wl=null;Rl;Al=new Light;Nl;kl;Kl;Ml;Hl;Fl;He=!1;zl=null;xl=N.El;Ll=null;ul=p.element;Jl=!1;Ul=!0;Pl=!0;Dl=!0;Ol=null;Ql=new Color(new Uint8Array([0,120,0]));get _l(){return null!=this.Ol}jl=!1;ql=null;$l=null;tn=-1;en=!0;ln=new Map;cl;nn;an=null;hn=null;sn=null;rn=null;cn=null;un=null;gn=null;dn=null;In=null;pn=null;Zn=1;Gn=new Color(new Uint8Array([153,153,153]));pl;mn=null;Cn;bn=Y.none;fn=new B(new Float32Array([0,0,0]),new Float32Array([0,0,1]));constructor(){this.pn=new X(this)}Wn(t,e,l){let n=this.ln;if(n.has(t)){let l=n.get(t);if(void 0===l)return;l.push(e)}else n.set(t,[e])}Xn(t,e,l){let n=this.ln;if(n.has(t)){let l=n.get(t);if(void 0===l)return;l=l.filter((t=>t!=e)),n.set(t,l)}}yn(t){let e=this.Fl,l=e.getBoundingClientRect(),n=this.zl,i=e.height,a=e.width,h=(t.clientX-l.left)/1/a*2-1,s=(l.height-(t.clientY-l.top)/1)/i*2-1,o=scale(create$3(),n.getEyeDir(),-1),r=new Float32Array([h,s,-1]),c=invert(create$4(),this.Nl),u=transformMat4$1(create$3(),r,c);return new S(u,o)}vn(t,e,l,n){let a=new o;a.id=t,a.index=this.Qe.length,a.ye=i.NewModel,a.category=l,is_space(l)&&this.Sl.push(a);let h=e.length,s=new Array(h),r=new Material;r.color=n.data;for(let t=0;t<h;t++){let l=e[t],n=new u;n.element=a,n.Re=create$4(),n.geometry=l,d(n),n.index=this.dl.length+t,n.material=r,l.id=this.Il.length+t,s[t]=n}a.We=s,this.pl=Z.unin([a.get_box(),this.pl]),this.Qe.push(a),this.dl=this.dl.concat(s),this.Il=this.Il.concat(e);let c={elements:[a],instances:s,geometries:e,fromloading:!1};return this.cl.publish("update_gpu",c),a}Vn(){let t=new AutoBufferWriter;t.writeInt32(1);let e=this.Qe.filter((t=>t.ye!=i.MainModel&&!t.Te)),l=new Map,n=e.length;t.writeInt32(n);for(let i=0;i<n;i++){let n=e[i];t.writeInt32(n.id),t.writeUint16(n.category),t.writeUint8(n.ye);let a=n.We.length;t.writeInt32(a);for(let e=0;e<a;e++){let i=n.We[e];t.writeUint8Array(i.material.color),t.writeFloat32Aarry(i.Re);let a=i.geometry;t.writeInt32(a.id),l.set(a.id,a)}}let a=l.size;return t.writeInt32(a),l.forEach((e=>{t.writeInt32(e.id),t.writeInt32(e.pointCount),t.writeInt32(e.points.length),t.writeFloat32Aarry(e.points);let l=e.faces,n=l.length;t.writeInt32(n);for(let e=0;e<n;e++){let n=l[e];t.writeBoolean(n.isPlanar),t.writeInt32(n.indices.length),t.writeInt32Array(n.indices),t.writeInt32(n.normals.length),t.writeUint8Array(n.normals)}})),t.getBuffer()}Bn(t){let e=this.Qe.length,l=this.dl.length,n=this.Il.length,i=new StreamReader(t);i.readInt32();let a=i.readInt32(),h=[],s=[],r=[];for(let t=0;t<a;t++){let t=new o;h.push(t),t.index=e,e++,t.id=i.readInt32(),t.category=i.readUint16(),is_space(t.category)&&(this.Sl.push(t),t.Ce=!1),t.ye=i.readUint8();let n=i.readInt32();for(let e=0;e<n;e++){let e=new u;e.element=t,s.push(e),e.index=l,l++,t.We.push(e);let n=new Material;n.color=i.readUint8Array(4),e.material=n,e.Re=i.readFloat32Array(16),e.geometry_id=i.readInt32()}}let c=i.readInt32(),g=new Map;for(let t=0;t<c;t++){let t=new Geometry;r.push(t),t.id=i.readInt32(),t.pointCount=i.readInt32();let e=i.readInt32();t.points=i.readFloat32Array(e);let l=i.readInt32();for(let e=0;e<l;e++){let e=new Face;e.isPlanar=i.readBoolean();let l=i.readInt32();e.indices=i.readInt32Array(l);let n=i.readInt32();e.normals=i.readUint8Array(n),t.faces.push(e)}g.set(t.id,t)}this.Qe=this.Qe.concat(h),this.dl=this.dl.concat(s),s.forEach((t=>{t.geometry=g.get(t.geometry_id),d(t)})),this.Il=this.Il.concat(r);for(let t=0;t<c;t++)r[t].id=n+t;let I=[];h.forEach((t=>{I.push(t.get_box())})),I.push(this.pl),this.pl=Z.unin(I);let p={elements:h,instances:s,geometries:r,fromloading:!1};this.cl.publish("update_gpu",p)}Yn(t,e){if(t.ye==i.MainModel)return;let l=t.We,n=l.length,a=t.get_box();new Float32Array([(a[3]+a[0])/2,(a[4]+a[1])/2,(a[5]+a[2])/2]);for(let i=0;i<n;i++){let n=l[i];if(n.has_matrix){let l=n.Re;scale$1(l,l,e),n.Re=l,t.we=null,t.we=null,this.ql.Sn(n)}}t.we=null,this.pl=Z.unin([this.pl,t.get_box()])}Tn(t,e,l){if(t.ye==i.MainModel)return;let n=t.We,a=n.length;setAxisAngle(create$1(),e,l);for(let t=0;t<a;t++){let i=n[t];if(i.has_matrix){let t=i.Re,n=getScaling(create$3(),t);scale$1(t,t,[1/n[0],1/n[1],1/n[2]]),rotate(t,t,l,e),scale$1(t,t,n),i.Re=t,this.ql.Sn(i)}}t.we=null,this.pl=Z.unin([this.pl,t.get_box()])}wn(t,e){if(t.ye==i.MainModel)return;let l=t.We,n=l.length;for(let t=0;t<n;t++){let n=l[t];if(n.has_matrix){let t=n.Re,l=getScaling(create$3(),t);scale$1(t,t,[1/l[0],1/l[1],1/l[2]]),translate(t,t,e),scale$1(t,t,l),this.ql.Sn(n)}}t.we=null,this.pl=Z.unin([this.pl,t.get_box()])}Rn(t,e){if(t.ye==i.MainModel)return;let a=t.We[0];if(!a)return;if(!a.has_matrix)return;let h=clone$1(a.Re),s=getScaling(create$3(),h);scale$1(h,h,[1/s[0],1/s[1],1/s[2]]);let o=getTranslation(create$3(),h),r=l(create$3(),e,o),c=t.We,u=c.length;if(!(n(r)<1)){for(let t=0;t<u;t++){let e=c[t];if(e.has_matrix){let t=clone$1(e.Re);getScaling(create$3(),t);let l=getRotation(create$1(),t),n=getTranslation(create$3(),t);n=add(n,n,r);let i=fromRotationTranslationScale(t,l,n,[1,1,1]);e.Re=i,this.ql.Sn(e)}}t.we=null,this.pl=Z.unin([this.pl,t.get_box()])}}An(t){if(t.ye==i.MainModel)return;let e=t.We,l=e.length;for(let t=0;t<l;t++){let l=e[t];if(l.has_matrix){let t=l.Re,e=getTranslation(create$3(),t);t=fromRotationTranslationScale(t,create$1(),e,[1,1,1]),l.Re=t,this.ql.Sn(l)}}t.we=null}Nn(t){t.ye==i.MainModel?t.Ce=!1:t.Te=!0,this.kn()}kn(){let t=this.Qe.filter((t=>t.Ce&&t.Se&&!t.fe&&!t.Te)),e=this.ql;e.Mn.Kn(t),t=this.Qe.filter((t=>t.Ce&&!t.be&&t.Se&&!t.Te)),e.Hn.Kn(t),t=this.Qe.filter((t=>t.Ce&&t.fe&&!t.Te)),t.length>0?(R(this.hn).Vl=!0,e.Fn.Kn(t)):R(this.hn).Vl=!1}}function M(t,e=500){let l=k.get(t),n=_(t.scene),i=l.cl;clearTimeout(l.tn),n.xn.zn(),l.en=!1,l.tn=setTimeout((()=>{n.xn.En(),i.publish("before_idling",t),l.en=!0,t.changed=!0}),e)}function H(t){let e=z(t);if(!e||null==e.zl)return;e.kl=e.zl.getViewMatrix();let l=e.zl.getProjectMatrix(e.kl,e.Fl.width,e.Fl.height);e.Kl=l,e.Ml=e.zl.near,e.Hl=e.zl.far;let n=identity(create$4()),i=multiply(create$4(),e.kl,n);e.Nl=multiply(create$4(),l,i)}function F(t,e,l){let n=k.get(t).ln.get(e);null!=n&&n.forEach((e=>{e(t,l)}))}function z(t){return k.get(t)}const x=new WeakMap;class E{Ln=[];Jn=[]}class Delegate{constructor(){x.set(this,new E)}add(t,e=!1){let l=x.get(this);e?l.Jn.push(t):l.Ln.push(t)}raise(t){let e=x.get(this),l=e.Ln,n=l.length;for(let e=0;e<n;e++){let n=l[e];n&&n(t)}l=e.Jn,n=l.length;for(let e=0;e<n;e++){let n=l[e];n&&n(t)}e.Jn=[]}remove(t){let e=x.get(this);e.Ln=e.Ln.filter((e=>e!=t))}}const L=new WeakMap;class EventBus{constructor(){L.set(this,new Map)}subscribe(t,e,l=!1){let n,i=L.get(this);i.has(t)?n=i.get(t):(n=new Delegate,i.set(t,n)),n.add(e,l)}publish(t,e){let l=L.get(this).get(t);l&&l.raise(e)}remove(t,e){let l=L.get(this);if(l.has(t)){let n=l.get(t);n&&n.remove(e)}}}class J{Un=0;Pn=20;Dn=0;On=0;Qn=!1;_n;constructor(){}jn(){this.Dn++}zn(){this.Qn||(this.Un=performance.now(),this.On=0,this.Dn=0,this.Qn=!0)}En(){this.Qn=!1;let t=performance.now()-this.Un,e=Math.round(this.Dn/t*1e3);return null!=this._n&&this._n(e),this.Dn=0,e}}let U=new WeakMap;class P{qn;$n;ti;ei;li;ni;Cn;ii;ai;hi;si;oi;ri;Fl;ci;ui=[];gi;di=null;Ii=null;xn=null;pi;Zi=0;Gi=!1;get mi(){return this.Zi?this.pi.getContext("2d"):null}Ci=[];fps=100;bi=!1;fi;Wi;Xi=-1;yi=0;pl;Vi;Bi=!0;Yi=new EventBus;Si;Ti=null;wi=-1;Ri=0;Se=!1;Ai=15;Ni=null;constructor(){this.xn=new J;let t=this;this.xn._n=e=>{let l=z(t.Ti);l.Zn<=6&&l.Zn>=0&&(e<this.Ai&&l.Zn<6&&l.Zn++,e>this.Ai&&l.Zn>1&&l.Zn--),null!=t.Ni&&t.Ni(e),console.log("__efficiency_level",l.Zn,e)}}}function D(t,e){let l=U.get(t);if(e){if(null==l.pi){l.pi=document.createElement("canvas"),document.body.appendChild(l.pi),l.pi.style.display="block";let t=l.Fl.getBoundingClientRect(),e=t.left,n=t.top;l.pi.width=t.width,l.pi.height=t.height,l.pi.style.position="absolute",l.pi.style.pointerEvents="none",l.pi.style.left=e+"px",l.pi.style.top=n+"px"}l.pi.style.display="block",l.Zi++}else l.Zi++,0==l.Zi&&(l.pi.style.display="none");l.Fl.focus()}function O(t,e){let l=U.get(t);t.scene_context.changed=!1,e.init(t),l.Ci.push(e),t.scene_context.changed=!0,e instanceof NavigationCube&&(l.ai=e,e.start())}function Q(t){let e=t,action=()=>{let t=_(e),l=z(e.scene_context);if(e.scene_context.changed||e.scene_context.animation_manager.ki||e.scene_context.marquee_manager.hasMarquee||t.ri?.is_running){let n=t.gi;if(null==n)return;let i=t.Fl.width,a=t.Fl.height;if(t.mi?.clearRect(0,0,i,a),t.Ci.forEach((t=>{t.onBeforeDraw()})),t.di?.Ki(i,a),null!=t.Vi&&l.en){let e=new Uint8Array(i*a*4);n.readBuffer(n.COLOR_ATTACHMENT0),n.readPixels(0,0,i,a,n.RGBA,n.UNSIGNED_BYTE,e);let l=new Uint8Array(i*a*4);for(let t=0;t<i;t++)for(let n=0;n<a;n++)l[4*(t+(a-n)*i)]=e[4*(t+n*i)],l[4*(t+(a-n)*i)+1]=e[4*(t+n*i)+1],l[4*(t+(a-n)*i)+2]=e[4*(t+n*i)+2],l[4*(t+(a-n)*i)+3]=e[4*(t+n*i)+3];let h=new ImageData(new Uint8ClampedArray(l),i,a);t.Vi(h),t.Vi=null}t.Ci.forEach((t=>{t.onAfterDraw()})),e.after_draw&&e.after_draw(),t.Se&&!l.en&&t.xn.jn(),t.Se&&l.Zn>0&&l.en&&e.scene_context.changed&&t.Yi.publish("before_idling",e.scene_context),e.scene_context.changed=!1,l.jl=!1}t.Bi&&requestAnimationFrame(action)};action()}function _(t){return U.get(t)}class NavigationCube{CubeSize=120;pos_action;gl=null;texture=null;vsShader=null;fsShader=null;program=null;pointBuffer=null;uvBuffer=null;idBuffer=null;indicesBuffer=null;a_Point=-1;a_Uv=-1;a_Id=-1;u_Mvp=null;u_Select=null;u_Sampler=null;u_Highlight=null;vs;fs;scene=null;isRunning=!1;faceId=0;mouseMoveAction;mouseClickAction;constructor(){this.vs=h.it,this.fs=h.nt,this.mouseMoveAction=(t,e)=>{this.onMouseMove(t,e)},this.mouseClickAction=(t,e)=>{this.onMouseClick(t,e)},this.pos_action=(t,e)=>{let l=t.getBoundingClientRect(),n=l.height-e;return{x:l.width-e,y:n}}}TOP=1;BOTTOM=2;LEFT=3;RIGHT=4;FRONT=5;BACK=6;TOP_LEFT_FRONT=7;TOP_RIGHT_FRONT=8;TOP_LEFT_BACK=9;TOP_RIGHT_BACK=10;BOTTOM_LEFT_FRONT=11;BOTTOM_RIGHT_FRONT=12;BOTTOM_LEFT_BACK=13;BOTTOM_RIGHT_BACK=14;TOP_LEFT=15;TOP_RIGHT=16;TOP_FRONT=17;TOP_BACK=18;BOTTOM_LEFT=19;BOTTOM_RIGHT=20;BOTTOM_FRONT=21;BOTTOM_BACK=22;FRONT_RIGHT=23;FRONT_LEFT=24;BACK_RIGHT=25;BACK_LEFT=26;vertices=new Float32Array([-.3,-.5,-.3,.3,-.5,-.3,.3,-.5,.3,-.3,-.5,.3,-.3,.5,-.3,-.3,.5,.3,.3,.5,.3,.3,.5,-.3,-.3,-.3,.5,.3,-.3,.5,.3,.3,.5,-.3,.3,.5,-.3,-.3,-.5,-.3,.3,-.5,.3,.3,-.5,.3,-.3,-.5,.5,-.3,-.3,.5,.3,-.3,.5,.3,.3,.5,-.3,.3,-.5,-.3,-.3,-.5,-.3,.3,-.5,.3,.3,-.5,.3,-.3,-.5,-.5,.5,-.3,-.5,.5,-.3,-.3,.5,-.5,-.3,.5,-.5,-.5,.3,-.5,-.5,.5,-.5,-.3,.5,-.5,-.3,.3,-.5,-.5,.3,-.3,-.5,.3,-.3,-.5,.5,-.5,-.5,.5,.3,-.5,.5,.5,-.5,.5,.5,-.3,.5,.3,-.3,.5,.5,-.5,.3,.5,-.3,.3,.5,-.3,.5,.5,-.5,.5,.3,-.5,.3,.5,-.5,.3,.5,-.5,.5,.3,-.5,.5,-.5,.3,.5,-.3,.3,.5,-.3,.5,.5,-.5,.5,.5,-.5,.3,.3,-.5,.3,.5,-.5,.5,.5,-.5,.5,.3,-.5,.5,.3,-.5,.5,.5,-.3,.5,.5,-.3,.5,.3,.3,.3,.5,.5,.3,.5,.5,.5,.5,.3,.5,.5,.5,.3,.3,.5,.5,.3,.5,.5,.5,.5,.3,.5,.3,.5,.3,.3,.5,.5,.5,.5,.5,.5,.5,.3,-.5,-.5,-.5,-.3,-.5,-.5,-.3,-.3,-.5,-.5,-.3,-.5,-.5,-.5,-.5,-.5,-.5,-.3,-.5,-.3,-.3,-.5,-.3,-.5,-.5,-.5,-.5,-.3,-.5,-.5,-.3,-.5,-.3,-.5,-.5,-.3,.3,-.5,-.5,.5,-.5,-.5,.5,-.3,-.5,.3,-.3,-.5,.5,-.5,-.5,.5,-.3,-.5,.5,-.3,-.3,.5,-.5,-.3,.3,-.5,-.5,.5,-.5,-.5,.5,-.5,-.3,.3,-.5,-.3,-.5,.3,-.5,-.3,.3,-.5,-.3,.5,-.5,-.5,.5,-.5,-.5,.3,-.5,-.5,.3,-.3,-.5,.5,-.3,-.5,.5,-.5,-.5,.5,-.5,-.5,.5,-.3,-.3,.5,-.3,-.3,.5,-.5,.3,.3,-.5,.5,.3,-.5,.5,.5,-.5,.3,.5,-.5,.5,.3,-.5,.5,.5,-.5,.5,.5,-.3,.5,.3,-.3,.3,.5,-.5,.3,.5,-.3,.5,.5,-.3,.5,.5,-.5,.3,-.3,.5,.5,-.3,.5,.5,.3,.5,.3,.3,.5,.5,-.3,.3,.5,.3,.3,.5,.3,.5,.5,-.3,.5,-.5,-.3,.5,-.3,-.3,.5,-.3,.3,.5,-.5,.3,.5,-.5,-.3,.3,-.5,-.3,.5,-.5,.3,.5,-.5,.3,.3,-.3,-.5,.5,.3,-.5,.5,.3,-.3,.5,-.3,-.3,.5,-.3,-.5,.3,.3,-.5,.3,.3,-.5,.5,-.3,-.5,.5,-.3,.3,.5,.3,.3,.5,.3,.5,.5,-.3,.5,.5,-.3,.5,.3,-.3,.5,.5,.3,.5,.5,.3,.5,.3,.3,-.3,-.5,.5,-.3,-.5,.5,.3,-.5,.3,.3,-.5,.5,-.3,-.5,.5,.3,-.5,.5,.3,-.3,.5,-.3,-.3,-.5,-.3,-.5,-.5,.3,-.5,-.3,.3,-.5,-.3,-.3,-.5,-.5,-.3,-.5,-.5,-.3,-.3,-.5,.3,-.3,-.5,.3,-.5,-.3,-.5,-.5,.3,-.5,-.5,.3,-.3,-.5,-.3,-.3,-.5,-.3,-.5,-.5,.3,-.5,-.5,.3,-.5,-.3,-.3,-.5,-.3,-.3,.3,-.5,.3,.3,-.5,.3,.5,-.5,-.3,.5,-.5,-.3,.5,-.5,-.3,.5,-.3,.3,.5,-.3,.3,.5,-.5,.3,-.5,-.3,.5,-.5,-.3,.5,-.5,.3,.3,-.5,.3,.5,-.5,-.3,.5,-.3,-.3,.5,-.3,.3,.5,-.5,.3,-.5,-.5,-.3,-.3,-.5,-.3,-.3,-.5,.3,-.5,-.5,.3,-.5,-.5,-.3,-.5,-.5,.3,-.5,-.3,.3,-.5,-.3,-.3,.3,.5,-.3,.3,.5,.3,.5,.5,.3,.5,.5,-.3,.5,.3,-.3,.5,.5,-.3,.5,.5,.3,.5,.3,.3,-.5,.5,-.3,-.5,.5,.3,-.3,.5,.3,-.3,.5,-.3,-.5,.3,-.3,-.5,.3,.3,-.5,.5,.3,-.5,.5,-.3]);indices=new Uint16Array([0,1,2,0,2,3,4,5,6,4,6,7,8,9,10,8,10,11,12,13,14,12,14,15,16,17,18,16,18,19,20,21,22,20,22,23,24,25,26,24,26,27,28,29,30,28,30,31,32,33,34,32,34,35,36,37,38,36,38,39,40,41,42,40,42,43,44,45,46,44,46,47,48,49,50,48,50,51,52,53,54,52,54,55,56,57,58,56,58,59,60,61,62,60,62,63,64,65,66,64,66,67,68,69,70,68,70,71,72,74,73,72,75,74,76,77,78,76,78,79,80,81,82,80,82,83,84,86,85,84,87,86,88,89,90,88,90,91,92,93,94,92,94,95,96,98,97,96,99,98,100,101,102,100,102,103,104,105,106,104,106,107,108,110,109,108,111,110,112,113,114,112,114,115,116,117,118,116,118,119,120,121,122,120,122,123,124,125,126,124,126,127,128,129,130,128,130,131,132,133,134,132,134,135,136,137,138,136,138,139,140,141,142,140,142,143,144,145,146,144,146,147,148,149,150,148,150,151,152,154,153,152,155,154,156,157,158,156,158,159,160,161,162,160,162,163,164,165,166,164,166,167,168,170,169,168,171,170,172,173,174,172,174,175,176,178,177,176,179,178,180,181,182,180,182,183,184,185,186,184,186,187,188,189,190,188,190,191,192,193,194,192,194,195,196,197,198,196,198,199,200,201,202,200,202,203,204,205,206,204,206,207,208,209,210,208,210,211,212,213,214,212,214,215]);txtCoords=new Float32Array([1/3+1/15,0+1/15,.6,0+1/15,.6,1/3-1/15,1/3+1/15,1/3-1/15,1-1/15,0+1/15,1-1/15,1/3-1/15,2/3+1/15,1/3-1/15,2/3+1/15,0+1/15,2/3+1/15,1/3+1/15,1-1/15,1/3+1/15,1-1/15,.6,2/3+1/15,.6,0+1/15,1/3-1/15,0+1/15,0+1/15,1/3-1/15,0+1/15,1/3-1/15,1/3-1/15,0+1/15,1/3+1/15,1/3-1/15,1/3+1/15,1/3-1/15,.6,0+1/15,.6,.6,1/3+1/15,.6,.6,1/3+1/15,.6,1/3+1/15,1/3+1/15,.7,1/3+1/30,.7,1/3+1/30,.7,1/3+1/30,.7,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,.7,1/3+1/30,.7,1/3+1/30,.7,1/3+1/30,.7,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,.7,1/3+1/30,.7,1/3+1/30,.7,1/3+1/30,.7,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,.7,1/30,.7,1/30,.7,1/30,.7,1/30,.7,1/3+1/30,.7,1/3+1/30,.7,1/3+1/30,.7,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,.7,1/30,.7,1/30,.7,1/30,.7,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,1/3+1/30,.7,1/30,.7,1/30,.7,1/30,.7,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,1/30,1/3+1/30,.7,1/30,.7,1/30,.7,1/30,.7,1/30,2/3+2/30,1/3+1/30,2/3+2/30,1/3+1/30,2/3+2/30,1/3+1/30,2/3+2/30,1/3+1/30,2/30,1/3+1/30,2/30,1/3+1/30,2/30,1/3+1/30,2/30,1/3+1/30,2/3+2/30,1/3+1/30,2/3+2/30,1/3+1/30,2/3+2/30,1/3+1/30,2/3+2/30,1/3+1/30,1/3+2/30,1/3+1/30,1/3+2/30,1/3+1/30,1/3+2/30,1/3+1/30,1/3+2/30,1/3+1/30,2/3+2/30,1/3+1/30,2/3+2/30,1/3+1/30,2/3+2/30,1/3+1/30,2/3+2/30,1/3+1/30,1/3+2/30,1/30,1/3+2/30,1/30,1/3+2/30,1/30,1/3+2/30,1/30,2/3+2/30,1/3+1/30,2/3+2/30,1/3+1/30,2/3+2/30,1/3+1/30,2/3+2/30,1/3+1/30,2/3+2/30,1/30,2/3+2/30,1/30,2/3+2/30,1/30,2/3+2/30,1/30,2/30,1/30,2/30,1/30,2/30,1/30,2/30,1/30,2/30,1/3+1/30,2/30,1/3+1/30,2/30,1/3+1/30,2/30,1/3+1/30,2/30,1/30,2/30,1/30,2/30,1/30,2/30,1/30,1/3+2/30,1/3+1/30,1/3+2/30,1/3+1/30,1/3+2/30,1/3+1/30,1/3+2/30,1/3+1/30,2/30,1/30,2/30,1/30,2/30,1/30,2/30,1/30,1/3+2/30,1/30,1/3+2/30,1/30,1/3+2/30,1/30,1/3+2/30,1/30,2/30,1/30,2/30,1/30,2/30,1/30,2/30,1/30,2/3+2/30,1/30,2/3+2/30,1/30,2/3+2/30,1/30,2/3+2/30,1/30,1/3+2/30,1/30,1/3+2/30,1/30,1/3+2/30,1/30,1/3+2/30,1/30,2/30,1/3+1/30,2/30,1/3+1/30,2/30,1/3+1/30,2/30,1/3+1/30,1/3+2/30,1/30,1/3+2/30,1/30,1/3+2/30,1/30,1/3+2/30,1/30,1/3+2/30,1/3+1/30,1/3+2/30,1/3+1/30,1/3+2/30,1/3+1/30,1/3+2/30,1/3+1/30,2/3+2/30,1/30,2/3+2/30,1/30,2/3+2/30,1/30,2/3+2/30,1/30,2/30,1/3+1/30,2/30,1/3+1/30,2/30,1/3+1/30,2/30,1/3+1/30,2/3+2/30,1/30,2/3+2/30,1/30,2/3+2/30,1/30,2/3+2/30,1/30,1/3+2/30,1/3+1/30,1/3+2/30,1/3+1/30,1/3+2/30,1/3+1/30,1/3+2/30,1/3+1/30]);ids=new Float32Array([this.FRONT,this.FRONT,this.FRONT,this.FRONT,this.BACK,this.BACK,this.BACK,this.BACK,this.TOP,this.TOP,this.TOP,this.TOP,this.BOTTOM,this.BOTTOM,this.BOTTOM,this.BOTTOM,this.RIGHT,this.RIGHT,this.RIGHT,this.RIGHT,this.LEFT,this.LEFT,this.LEFT,this.LEFT,this.TOP_LEFT_FRONT,this.TOP_LEFT_FRONT,this.TOP_LEFT_FRONT,this.TOP_LEFT_FRONT,this.TOP_LEFT_FRONT,this.TOP_LEFT_FRONT,this.TOP_LEFT_FRONT,this.TOP_LEFT_FRONT,this.TOP_LEFT_FRONT,this.TOP_LEFT_FRONT,this.TOP_LEFT_FRONT,this.TOP_LEFT_FRONT,this.TOP_RIGHT_FRONT,this.TOP_RIGHT_FRONT,this.TOP_RIGHT_FRONT,this.TOP_RIGHT_FRONT,this.TOP_RIGHT_FRONT,this.TOP_RIGHT_FRONT,this.TOP_RIGHT_FRONT,this.TOP_RIGHT_FRONT,this.TOP_RIGHT_FRONT,this.TOP_RIGHT_FRONT,this.TOP_RIGHT_FRONT,this.TOP_RIGHT_FRONT,this.TOP_LEFT_BACK,this.TOP_LEFT_BACK,this.TOP_LEFT_BACK,this.TOP_LEFT_BACK,this.TOP_LEFT_BACK,this.TOP_LEFT_BACK,this.TOP_LEFT_BACK,this.TOP_LEFT_BACK,this.TOP_LEFT_BACK,this.TOP_LEFT_BACK,this.TOP_LEFT_BACK,this.TOP_LEFT_BACK,this.TOP_RIGHT_BACK,this.TOP_RIGHT_BACK,this.TOP_RIGHT_BACK,this.TOP_RIGHT_BACK,this.TOP_RIGHT_BACK,this.TOP_RIGHT_BACK,this.TOP_RIGHT_BACK,this.TOP_RIGHT_BACK,this.TOP_RIGHT_BACK,this.TOP_RIGHT_BACK,this.TOP_RIGHT_BACK,this.TOP_RIGHT_BACK,this.BOTTOM_LEFT_FRONT,this.BOTTOM_LEFT_FRONT,this.BOTTOM_LEFT_FRONT,this.BOTTOM_LEFT_FRONT,this.BOTTOM_LEFT_FRONT,this.BOTTOM_LEFT_FRONT,this.BOTTOM_LEFT_FRONT,this.BOTTOM_LEFT_FRONT,this.BOTTOM_LEFT_FRONT,this.BOTTOM_LEFT_FRONT,this.BOTTOM_LEFT_FRONT,this.BOTTOM_LEFT_FRONT,this.BOTTOM_RIGHT_FRONT,this.BOTTOM_RIGHT_FRONT,this.BOTTOM_RIGHT_FRONT,this.BOTTOM_RIGHT_FRONT,this.BOTTOM_RIGHT_FRONT,this.BOTTOM_RIGHT_FRONT,this.BOTTOM_RIGHT_FRONT,this.BOTTOM_RIGHT_FRONT,this.BOTTOM_RIGHT_FRONT,this.BOTTOM_RIGHT_FRONT,this.BOTTOM_RIGHT_FRONT,this.BOTTOM_RIGHT_FRONT,this.BOTTOM_LEFT_BACK,this.BOTTOM_LEFT_BACK,this.BOTTOM_LEFT_BACK,this.BOTTOM_LEFT_BACK,this.BOTTOM_LEFT_BACK,this.BOTTOM_LEFT_BACK,this.BOTTOM_LEFT_BACK,this.BOTTOM_LEFT_BACK,this.BOTTOM_LEFT_BACK,this.BOTTOM_LEFT_BACK,this.BOTTOM_LEFT_BACK,this.BOTTOM_LEFT_BACK,this.BOTTOM_RIGHT_BACK,this.BOTTOM_RIGHT_BACK,this.BOTTOM_RIGHT_BACK,this.BOTTOM_RIGHT_BACK,this.BOTTOM_RIGHT_BACK,this.BOTTOM_RIGHT_BACK,this.BOTTOM_RIGHT_BACK,this.BOTTOM_RIGHT_BACK,this.BOTTOM_RIGHT_BACK,this.BOTTOM_RIGHT_BACK,this.BOTTOM_RIGHT_BACK,this.BOTTOM_RIGHT_BACK,this.TOP_RIGHT,this.TOP_RIGHT,this.TOP_RIGHT,this.TOP_RIGHT,this.TOP_RIGHT,this.TOP_RIGHT,this.TOP_RIGHT,this.TOP_RIGHT,this.TOP_LEFT,this.TOP_LEFT,this.TOP_LEFT,this.TOP_LEFT,this.TOP_LEFT,this.TOP_LEFT,this.TOP_LEFT,this.TOP_LEFT,this.TOP_FRONT,this.TOP_FRONT,this.TOP_FRONT,this.TOP_FRONT,this.TOP_FRONT,this.TOP_FRONT,this.TOP_FRONT,this.TOP_FRONT,this.TOP_BACK,this.TOP_BACK,this.TOP_BACK,this.TOP_BACK,this.TOP_BACK,this.TOP_BACK,this.TOP_BACK,this.TOP_BACK,this.BOTTOM_RIGHT,this.BOTTOM_RIGHT,this.BOTTOM_RIGHT,this.BOTTOM_RIGHT,this.BOTTOM_RIGHT,this.BOTTOM_RIGHT,this.BOTTOM_RIGHT,this.BOTTOM_RIGHT,this.BOTTOM_LEFT,this.BOTTOM_LEFT,this.BOTTOM_LEFT,this.BOTTOM_LEFT,this.BOTTOM_LEFT,this.BOTTOM_LEFT,this.BOTTOM_LEFT,this.BOTTOM_LEFT,this.BOTTOM_FRONT,this.BOTTOM_FRONT,this.BOTTOM_FRONT,this.BOTTOM_FRONT,this.BOTTOM_FRONT,this.BOTTOM_FRONT,this.BOTTOM_FRONT,this.BOTTOM_FRONT,this.BOTTOM_BACK,this.BOTTOM_BACK,this.BOTTOM_BACK,this.BOTTOM_BACK,this.BOTTOM_BACK,this.BOTTOM_BACK,this.BOTTOM_BACK,this.BOTTOM_BACK,this.FRONT_RIGHT,this.FRONT_RIGHT,this.FRONT_RIGHT,this.FRONT_RIGHT,this.FRONT_RIGHT,this.FRONT_RIGHT,this.FRONT_RIGHT,this.FRONT_RIGHT,this.FRONT_LEFT,this.FRONT_LEFT,this.FRONT_LEFT,this.FRONT_LEFT,this.FRONT_LEFT,this.FRONT_LEFT,this.FRONT_LEFT,this.FRONT_LEFT,this.BACK_RIGHT,this.BACK_RIGHT,this.BACK_RIGHT,this.BACK_RIGHT,this.BACK_RIGHT,this.BACK_RIGHT,this.BACK_RIGHT,this.BACK_RIGHT,this.BACK_LEFT,this.BACK_LEFT,this.BACK_LEFT,this.BACK_LEFT,this.BACK_LEFT,this.BACK_LEFT,this.BACK_LEFT,this.BACK_LEFT]);img=new Image;imgLoaded=!1;init(t){this.scene=t;let e=_(t);this.gl=e.gi,this.img.src=a,this.img.addEventListener("load",(()=>{let t=this.gl;t&&(this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!0),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,this.img),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!1),this.initShader(),this.imgLoaded=!0,this.scene&&(this.scene.scene_context.changed=!0))}))}initShader(){let t=this.gl;if(!t)return;let e=t.createShader(t.VERTEX_SHADER);if(!e)return;t.shaderSource(e,this.vs),t.compileShader(e),this.vsShader=e;let l=t.createShader(t.FRAGMENT_SHADER);if(!l)return;t.shaderSource(l,this.fs),t.compileShader(l),this.fsShader=l;let n=t.createProgram();if(n){if(t.attachShader(n,e),t.attachShader(n,l),t.linkProgram(n),!t.getProgramParameter(n,t.LINK_STATUS)){let i=t.getProgramInfoLog(n);return console.log("Failed to link program: "+i),t.deleteProgram(n),t.deleteShader(l),void t.deleteShader(e)}this.program=n,t.useProgram(this.program),this.pointBuffer=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,this.pointBuffer),t.bufferData(t.ARRAY_BUFFER,this.vertices,t.STATIC_DRAW),this.uvBuffer=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.txtCoords,t.STATIC_DRAW),this.idBuffer=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,this.idBuffer),t.bufferData(t.ARRAY_BUFFER,this.ids,t.STATIC_DRAW),this.indicesBuffer=t.createBuffer(),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indicesBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW),this.a_Point=t.getAttribLocation(n,"a_Point"),this.a_Uv=t.getAttribLocation(n,"a_Uv"),this.a_Id=t.getAttribLocation(n,"a_Id"),this.u_Mvp=t.getUniformLocation(n,"u_Mvp"),this.u_Select=t.getUniformLocation(n,"u_Select"),this.u_Sampler=t.getUniformLocation(n,"u_Sampler"),this.u_Highlight=t.getUniformLocation(n,"u_Highlight")}}active(){let t=this.gl;t&&(t.useProgram(this.program),t.bindBuffer(t.ARRAY_BUFFER,this.pointBuffer),t.vertexAttribPointer(this.a_Point,3,t.FLOAT,!1,0,0),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.vertexAttribPointer(this.a_Uv,2,t.FLOAT,!1,0,0),t.bindBuffer(t.ARRAY_BUFFER,this.idBuffer),t.vertexAttribPointer(this.a_Id,1,t.FLOAT,!1,0,0),t.activeTexture(t.TEXTURE4),t.bindTexture(t.TEXTURE_2D,this.texture),t.uniform1i(this.u_Sampler,4),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indicesBuffer),t.enableVertexAttribArray(this.a_Point),t.enableVertexAttribArray(this.a_Uv),t.enableVertexAttribArray(this.a_Id))}getMvp(){if(!this.scene)return null;let t=z(this.scene.scene_context).zl;if(!t)return null;let e=t.phi,l=t.theta,n=1.2,i=create$3(),a=create$3(),h=create$3(),s=fromValues$2(0,0,1),o=fromValues$2(0,0,0),r=rotateY(create$3(),s,o,l);r=rotateZ(create$3(),r,o,e),a=add(create$3(),i,scale(create$3(),r,n));let c=fromValues$2(-1,0,0);c=rotateY(create$3(),c,o,l),c=rotateZ(create$3(),c,o,e),h=c;let u=lookAt(create$4(),a,i,h),g=ortho(create$4(),-1.2,n,-1.2,n,0,2.4);return multiply(create$4(),g,u)}onBeforeDraw(){}onAfterDraw(){if(this.isRunning&&this.imgLoaded){if(!this.scene)return;let t=_(this.scene),e=this.CubeSize,{x:l,y:n}=this.pos_action(t.Fl,e),i=this.gl;if(!i)return;this.active();let a=this.getMvp();if(!a)return;i.uniformMatrix4fv(this.u_Mvp,!1,a),i.uniform1i(this.u_Select,0),i.enable(i.BLEND),i.disable(i.DEPTH_TEST),i.enable(i.CULL_FACE),i.cullFace(i.BACK),i.viewport(l,n,e,e),i.uniform1i(this.u_Highlight,0),i.drawElements(i.TRIANGLES,this.indices.length,i.UNSIGNED_SHORT,0),0!=this.faceId&&this.hilightFace(this.faceId),i.disable(i.CULL_FACE),i.enable(i.DEPTH_TEST),i.disable(i.BLEND),i.disableVertexAttribArray(this.a_Point),i.disableVertexAttribArray(this.a_Uv),i.disableVertexAttribArray(this.a_Id)}}start(){if(!this.isRunning){if(this.isRunning=!0,!this.scene)return;let t=this.scene.scene_context;t.changed=!0,t.add_event_listener("mousemove",this.mouseMoveAction),t.add_event_listener("mouseclick",this.mouseClickAction)}}stop(){if(this.isRunning){this.isRunning=!1;let t=this.scene.scene_context;t.remove_event_listener("mousemove",this.mouseMoveAction),t.remove_event_listener("mouseclick",this.mouseClickAction)}}onMouseMove(t,e){if(!this.scene)return;let l=_(this.scene),n=l.Fl.getBoundingClientRect(),i=e.detail.clientX-n.left,a=n.height-(e.detail.clientY-n.top),{x:h,y:s}=this.pos_action(l.Fl,this.CubeSize),o=this.CubeSize,r=i-h,c=a-s;r>0&&r<o&&c>0&&c<o?this.select(i,a):(0!=this.faceId&&(this.faceId=0,M(this.scene.scene_context),this.scene.scene_context.changed=!0),this.faceId=0)}select(t,e){if(!this.scene)return;let l=_(this.scene),n=this.gl;if(!n)return;this.active();let i=n.createFramebuffer(),a=n.createTexture();n.activeTexture(n.TEXTURE0);let h=l.Fl.width,s=l.Fl.height;n.bindTexture(n.TEXTURE_2D,a),n.texImage2D(n.TEXTURE_2D,0,n.RGB,h,s,0,n.RGB,n.UNSIGNED_BYTE,null),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.LINEAR);let o=n.createRenderbuffer();n.bindRenderbuffer(n.RENDERBUFFER,o),n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_COMPONENT16,h,s),n.bindFramebuffer(n.FRAMEBUFFER,i),n.framebufferTexture2D(n.FRAMEBUFFER,n.COLOR_ATTACHMENT0,n.TEXTURE_2D,a,0),n.framebufferRenderbuffer(n.FRAMEBUFFER,n.DEPTH_ATTACHMENT,n.RENDERBUFFER,o),n.uniform1i(this.u_Select,1);let r=this.getMvp();if(!r)return;n.uniformMatrix4fv(this.u_Mvp,!1,r);let c=this.CubeSize,u=this.pos_action(l.Fl,c),g=u.y,d=u.x;n.disable(n.BLEND),n.enable(n.DEPTH_TEST),n.enable(n.CULL_FACE),n.cullFace(n.BACK),n.viewport(d,g,c,c),n.clearColor(0,0,0,1),n.clear(n.COLOR_BUFFER_BIT|n.DEPTH_BUFFER_BIT),n.drawElements(n.TRIANGLES,this.indices.length,n.UNSIGNED_SHORT,0),n.disable(n.CULL_FACE);let I=new Uint8Array(4);n.readBuffer(n.COLOR_ATTACHMENT0),n.readPixels(t,e,1,1,n.RGBA,n.UNSIGNED_BYTE,I);let p=I[0],Z=I[1],G=I[2];I[3];let m=p+256*Z+256*G*256;n.bindTexture(n.TEXTURE_2D,null),n.bindFramebuffer(n.FRAMEBUFFER,null),n.deleteFramebuffer(i),n.deleteRenderbuffer(o),n.deleteTexture(a),m!=this.faceId&&(this.scene.scene_context.changed=!0,this.faceId=m)}hilightFace(t){let e=this.gl;if(!e)return;e.uniform1i(this.u_Highlight,1);let l=this.indices.BYTES_PER_ELEMENT;switch(t){case this.FRONT:e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0);break;case this.BACK:e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,6*l);break;case this.TOP:e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,12*l);break;case this.BOTTOM:e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,18*l);break;case this.RIGHT:e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,24*l);break;case this.LEFT:e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,30*l);break;case this.TOP_LEFT_FRONT:e.drawElements(e.TRIANGLES,18,e.UNSIGNED_SHORT,36*l);break;case this.TOP_RIGHT_FRONT:e.drawElements(e.TRIANGLES,18,e.UNSIGNED_SHORT,54*l);break;case this.TOP_LEFT_BACK:e.drawElements(e.TRIANGLES,18,e.UNSIGNED_SHORT,72*l);break;case this.TOP_RIGHT_BACK:e.drawElements(e.TRIANGLES,18,e.UNSIGNED_SHORT,90*l);break;case this.BOTTOM_LEFT_FRONT:e.drawElements(e.TRIANGLES,18,e.UNSIGNED_SHORT,108*l);break;case this.BOTTOM_RIGHT_FRONT:e.drawElements(e.TRIANGLES,18,e.UNSIGNED_SHORT,126*l);break;case this.BOTTOM_LEFT_BACK:e.drawElements(e.TRIANGLES,18,e.UNSIGNED_SHORT,144*l);break;case this.BOTTOM_RIGHT_BACK:e.drawElements(e.TRIANGLES,18,e.UNSIGNED_SHORT,162*l);break;case this.TOP_RIGHT:e.drawElements(e.TRIANGLES,12,e.UNSIGNED_SHORT,180*l);break;case this.TOP_LEFT:e.drawElements(e.TRIANGLES,12,e.UNSIGNED_SHORT,192*l);break;case this.TOP_FRONT:e.drawElements(e.TRIANGLES,12,e.UNSIGNED_SHORT,204*l);break;case this.TOP_BACK:e.drawElements(e.TRIANGLES,12,e.UNSIGNED_SHORT,216*l);break;case this.BOTTOM_RIGHT:e.drawElements(e.TRIANGLES,12,e.UNSIGNED_SHORT,228*l);break;case this.BOTTOM_LEFT:e.drawElements(e.TRIANGLES,12,e.UNSIGNED_SHORT,240*l);break;case this.BOTTOM_FRONT:e.drawElements(e.TRIANGLES,12,e.UNSIGNED_SHORT,252*l);break;case this.BOTTOM_BACK:e.drawElements(e.TRIANGLES,12,e.UNSIGNED_SHORT,264*l);break;case this.FRONT_RIGHT:e.drawElements(e.TRIANGLES,12,e.UNSIGNED_SHORT,276*l);break;case this.FRONT_LEFT:e.drawElements(e.TRIANGLES,12,e.UNSIGNED_SHORT,288*l);break;case this.BACK_RIGHT:e.drawElements(e.TRIANGLES,12,e.UNSIGNED_SHORT,300*l);break;case this.BACK_LEFT:e.drawElements(e.TRIANGLES,12,e.UNSIGNED_SHORT,312*l)}}onMouseClick(t,e){if(0!=this.faceId){let t=Math.PI;switch(this.faceId){case this.FRONT:this.setCamera(t/2,2*t-t/2);break;case this.BACK:this.setCamera(t/2,t/2);break;case this.TOP:this.setCamera(0,2*t-t/2);break;case this.BOTTOM:this.setCamera(t,2*t-t/2);break;case this.RIGHT:this.setCamera(t/2,0);break;case this.LEFT:this.setCamera(t/2,t);break;case this.TOP_LEFT_FRONT:this.setCamera(t/4,t/4+t);break;case this.TOP_RIGHT_FRONT:this.setCamera(t/4,2*t-t/4);break;case this.TOP_LEFT_BACK:this.setCamera(t/4,.75*t);break;case this.TOP_RIGHT_BACK:this.setCamera(t/4,t/4);break;case this.BOTTOM_LEFT_FRONT:this.setCamera(t-t/4,t/4+t);break;case this.BOTTOM_RIGHT_FRONT:this.setCamera(t-t/4,2*t-t/4);break;case this.BOTTOM_LEFT_BACK:this.setCamera(t-t/4,.75*t);break;case this.BOTTOM_RIGHT_BACK:this.setCamera(t-t/4,t/4);break;case this.TOP_RIGHT:this.setCamera(t/4,0);break;case this.TOP_LEFT:this.setCamera(t/4,t);break;case this.TOP_FRONT:this.setCamera(t/4,t/2+t);break;case this.TOP_BACK:this.setCamera(t/4,t/2);break;case this.BOTTOM_RIGHT:this.setCamera(t-t/4,0);break;case this.BOTTOM_LEFT:this.setCamera(t-t/4,t);break;case this.BOTTOM_FRONT:this.setCamera(t-t/4,t/2+t);break;case this.BOTTOM_BACK:this.setCamera(t-t/4,t/2);break;case this.FRONT_RIGHT:this.setCamera(t/2,2*t-t/4);break;case this.FRONT_LEFT:this.setCamera(t/2,t/4+t);break;case this.BACK_RIGHT:this.setCamera(t/2,t/4);break;case this.BACK_LEFT:this.setCamera(t/2,t/4+t/2)}}}setCamera(t,e){this.scene&&this.scene.scene_context.view_manager.zoom_view(t,e)}dispose(){let t=this.gl;t.deleteTexture(this.texture),t.deleteShader(this.vsShader),t.deleteShader(this.fsShader),t.deleteProgram(this.program),t.deleteBuffer(this.pointBuffer),t.deleteBuffer(this.uvBuffer),t.deleteBuffer(this.idBuffer),t.deleteBuffer(this.indicesBuffer)}}const j=new WeakMap;class q{vl;Mi;Hi;Fi;zi=[0,1,0];xi=[0,0,1];Ei=[1,0,0];Li=[0,0,0];Ji=[-1,0,0];Ui=[0,0,1];Pi=!1;Di;Fe=0;Me=.5*Math.PI;Oi;Qi}function $(t){let e=j.get(t),l=lookAt(create$4(),e.Mi,add(create$3(),e.Mi,e.Hi),e.xi),n=e.vl.box,i=[],a=n.slice(3,6),h=n.slice(.3),s=a;i.push(transformMat4$1(create$3(),s,l)[2]);let o=fromValues$2(h[0],a[1],a[2]);i.push(transformMat4$1(create$3(),o,l)[2]);let r=fromValues$2(a[0],h[1],a[2]);i.push(transformMat4$1(create$3(),r,l)[2]);let c=fromValues$2(h[0],h[1],a[2]);i.push(transformMat4$1(create$3(),c,l)[2]);let u=fromValues$2(a[0],a[1],h[2]);i.push(transformMat4$1(create$3(),u,l)[2]);let g=fromValues$2(h[0],a[1],h[2]);i.push(transformMat4$1(create$3(),g,l)[2]);let d=fromValues$2(a[0],h[1],h[2]);i.push(transformMat4$1(create$3(),d,l)[2]);let I=h;i.push(transformMat4$1(create$3(),I,l)[2]);let p=z(e.vl),Z=-Math.min(...i),G=p.Fl,m=G.width,C=G.height,b=perspective(create$4(),60*Math.PI/180,m/C,10,Z);p.kl=l,p.Hl=Z,p.Ml=10,p.Nl=multiply(create$4(),b,l)}const tt=Math.PI/2;function et(t,e){let l=it(t),n=scale(create$3(),l.Fi,e);l.Mi=add(create$3(),l.Mi,n),$(t),l.vl.changed=!0}function lt(t,e){let l=it(t),n=scale(create$3(),l.zi,e);l.Mi=add(create$3(),l.Mi,n),$(t),l.vl.changed=!0}function nt(t,e){let l=it(t);l.Mi[2]=l.Mi[2]+e,$(t),l.vl.changed=!0}function it(t){return j.get(t)}const at=new WeakMap,ht=[0,0,1],st=[0,0,0],ot=[-1,0,0],rt=[0,0,1],ct=[1,0,0];class ut{Ml;Hl;_i=new Float32Array([0,0,0]);ji=[1,0,0];qi=[0,0,1];$i=.5*Math.PI;ta=0;il;ea=16/9;la=60*Math.PI/180;na=!1;constructor(t){this.il=t}ia(){const t=z(this.il);t.xl=N.aa,this.na=!0,dt(this),t.He=!0}ha(){const t=z(this.il);t.xl=N.sa,this.na=!1,H(this.il),t.He=!0}oa(t){if(!this.na)return;this.ji=t,this.$i=angle(t,rt),t[2]=0,normalize$2(t,t),this.ta=angle(t,ct),t[1]<0&&(this.ta=2*Math.PI-this.ta);const e=rotateY(create$3(),ot,st,this.$i);this.qi=rotateZ(this.qi,e,st,this.ta),dt(this),this.il.changed=!0}}function gt(t){return at.get(t)}function dt(t){const e=z(t.il),l=lookAt(create$4(),t._i,add(create$3(),t._i,t.ji),t.qi),n=e.pl,i=[],a=n.slice(3,6),h=n.slice(0,3),s=a;i.push(transformMat4$1(create$3(),s,l)[2]);const o=fromValues$2(h[0],a[1],a[2]);i.push(transformMat4$1(create$3(),o,l)[2]);const r=fromValues$2(a[0],h[1],a[2]);i.push(transformMat4$1(create$3(),r,l)[2]);const c=fromValues$2(h[0],h[1],a[2]);i.push(transformMat4$1(create$3(),c,l)[2]);const u=fromValues$2(a[0],a[1],h[2]);i.push(transformMat4$1(create$3(),u,l)[2]);const g=fromValues$2(h[0],a[1],h[2]);i.push(transformMat4$1(create$3(),g,l)[2]);const d=fromValues$2(a[0],h[1],h[2]);i.push(transformMat4$1(create$3(),d,l)[2]);const I=h;i.push(transformMat4$1(create$3(),I,l)[2]);const p=-Math.min(...i),Z=e.Fl.width/e.Fl.height,G=perspective(create$4(),t.la,Z,10,p);t.ea=Z,e.kl=l,e.Hl=p,e.Ml=10,e.Kl=G,e.Nl=multiply(create$4(),G,l)}class EventManager{Fl;il;wl;ra=!1;ca=!1;ua=0;ga=!1;da=!1;Ia=null;pa=create();Za=180;Ga=0;ma=0;Ca=null;ba=null;constructor(t){this.il=t,this.wl=_(t.scene),this.Fl=z(t).Fl,this.fa=t=>(t.preventDefault(),!1),this.Wa=t=>this.Xa(t),this.ya=t=>this.va(t),this.Va=t=>this.Ba(t),this.Ya=t=>this.Sa(t),this.Ta=t=>this.wa(t),this.Ra=t=>this.Aa(t),this.Na=t=>this.ka(t),this.Ka=t=>{!function(t,e){let l=e.targetTouches.length;if(1==l){let l=e.targetTouches[0],n=t.Fl.getBoundingClientRect(),i=l.clientX-n.left,a=n.height-(l.clientY-n.top);t.Ca={x:i,y:a},t.Ga=1}if(2==l){let l=t.Fl.getBoundingClientRect(),n=e.targetTouches[0],i=e.targetTouches[1],a=n.clientX-l.left,h=l.height-(n.clientY-l.top),s=i.clientX-l.left,o=l.height-(i.clientY-l.top);t.Ca={x:a,y:h},t.ba={x:s,y:o};let r=a-s,c=h-o;t.ma=Math.sqrt(r*r+c*c),t.Ga=2}}(this,t)},this.Ma=t=>{!function(t,e){let l=e.targetTouches.length;if(l!=t.Ga)return void console.log("__touch_count error");if(z(t.il).xl!=N.sa)return;let n=t.Fl.getBoundingClientRect();if(1==l){let l=e.targetTouches[0],i=l.clientX-n.left,a=l.clientY-n.top,h=n.height-a;M(t.il);let s=t.Ca,o=i-s.x,r=h-s.y,c=o/n.width,u=r/n.height;if(Math.abs(o)+Math.abs(r)>1){let l=i-s.x,n=h-s.y;if(Math.abs(l)<1&&Math.abs(n)<1)return void e.preventDefault();let a=c*t.Za,o=u*t.Za;t.il.view_manager.rotate(-a,o),t.Ca={x:i,y:h}}}if(2==l){let l=e.targetTouches[0],h=e.targetTouches[1],s=l.clientX-n.left,o=n.height-(l.clientY-n.top),r=h.clientX-n.left,c=n.height-(h.clientY-n.top),u=t.Ca,g=t.ba,d=fromValues(s-u.x,o-u.y);if(a=fromValues(r-g.x,c-g.y),(i=d)[0]*a[0]+i[1]*a[1]>0){let l=(s+r)/2,i=(o+c)/2,a=t.Ca,h=t.ba,u=(a.x+h.x)/2,g=(a.y+h.y)/2,d=l-u,I=i-g;if(Math.abs(d)<1&&Math.abs(I)<1)return void e.preventDefault();let p=(l-u)/n.width,Z=(i-g)/n.height;M(t.il),t.il.view_manager.move(p,Z),t.Ca={x:s,y:o},t.ba={x:r,y:c}}else{let e=s-r,l=o-c,n=Math.sqrt(e*e+l*l),i=n/t.ma-1;M(t.il),i<-.1?(t.il.view_manager.scale(.1),t.ma=n):i>.1&&(t.il.view_manager.scale(-.1),t.ma=n),t.Ca={x:s,y:o},t.ba={x:r,y:c}}}var i,a;e.preventDefault()}(this,t)},this.Ha=t=>{console.log("_on_touchend",t)},this.Fa()}fa;Wa;ya;Va;Ya;Ta;Ra;Na;Ka;Ma;Ha;Fa(){let t=this.Fl;t.addEventListener("contextmenu",this.fa),t.addEventListener("mousedown",this.Wa),t.addEventListener("mousemove",this.ya),t.addEventListener("mouseup",this.Va),t.addEventListener("mouseout",this.Ya),t.addEventListener("wheel",this.Ta),window.addEventListener("keydown",this.Ra),window.addEventListener("keyup",this.Na),t.addEventListener("touchstart",this.Ka),t.addEventListener("touchmove",this.Ma),t.addEventListener("touchend",this.Ha)}Xa(t){if(0==t.button){this.ra=!0;let e=this.Fl.getBoundingClientRect(),l=t.clientX-e.left,n=e.height-(t.clientY-e.top);this.Ia={x:l,y:n},this.da=!0}if(1==t.button){this.ca=!0;let e=this.Fl.getBoundingClientRect(),l=t.clientX-e.left,n=e.height-(t.clientY-e.top);this.Ia={x:l,y:n}}F(this.il,"mousedown",new CustomEvent("mousedown",{detail:t})),t.preventDefault()}Ba(t){if(this.ra&&!this.ga){if(this.il.select_mode==p.none)return;let e=this.Fl.getBoundingClientRect(),l=t.clientX-e.left,n=e.height-(t.clientY-e.top);this.da&&(!function(t,e,l){let n=z(t);if(!(_(t.scene).ai.faceId>0)&&n.$l&&t.selection_manager&&t.select_mode!=p.snap){let i=n.$l.za(e,l,t.select_mode);F(t,"select",i?new CustomEvent("select",{detail:i}):new CustomEvent("select",{detail:null}))}}(this.il,l,n),F(this.il,"mouseclick",new CustomEvent("mouseclick",{detail:t})))}this.ra=!1,this.ga=!1,this.ca=!1,F(this.il,"mouseup",new CustomEvent("mouseup",{detail:t})),t.preventDefault()}Sa(t){this.ra=!1,this.ga=!1,this.ca=!1,F(this.il,"mouseout",new CustomEvent("mouseout",{detail:t})),t.preventDefault()}va(t){let e=this.Fl.getBoundingClientRect(),l=t.clientX-e.left,n=t.clientY-e.top,i=e.height-n;if(this.pa=fromValues(l,n),this.ra&&(this.da=!1),this.ra&&this.il.can_rotate){M(this.il);let t=this.Ia,n=l-t.x,a=i-t.y,h=n/e.width,s=a/e.height;if(Math.abs(n)+Math.abs(a)>1){let e=l-t.x,n=i-t.y;if(Math.abs(e)<1&&Math.abs(n)<1)return;this.ga=!0;let a=h*this.Za,o=s*this.Za;const r=z(this.il);switch(r.xl){case N.sa:this.il.view_manager.rotate(-a,o);break;case N.xa:!function(t,e,l){let n=it(t),i=e/180*Math.PI,a=l/180*Math.PI;n.Fe=n.Fe+i,n.Fe>2*Math.PI&&(n.Fe=n.Fe-2*Math.PI),n.Fe<0&&(n.Fe=n.Fe+2*Math.PI),n.Me=n.Me+a,n.Me>2*Math.PI&&(n.Me=n.Me-2*Math.PI),n.Me<0&&(n.Me=n.Me+2*Math.PI);let h=rotateY(create$3(),n.Ui,n.Li,n.Me),s=rotateY(create$3(),n.Ji,n.Li,n.Me);n.Hi=rotateZ(n.Hi,h,n.Li,n.Fe),n.xi=rotateZ(n.xi,s,n.Li,n.Fe),n.Fi=rotateZ(create$3(),[1,0,0],n.Li,n.Fe),n.zi=rotateZ(create$3(),[1,0,0],n.Li,n.Fe+tt),$(t),n.vl.changed=!0}(this.il.wander,-a,-o);break;case N.aa:!function(t,e,l){let n=e/180*Math.PI,i=l/180*Math.PI;t.ta+=n,t.ta>2*Math.PI&&(t.ta=t.ta-2*Math.PI),t.ta<0&&(t.ta=t.ta+2*Math.PI),t.$i+=i,t.$i>2*Math.PI&&(t.$i=t.$i-2*Math.PI),t.$i<0&&(t.$i=t.$i+2*Math.PI);let a=rotateY(create$3(),ht,st,t.$i),h=rotateY(create$3(),ot,st,t.$i);t.ji=rotateZ(t.ji,a,st,t.ta),t.qi=rotateZ(t.qi,h,st,t.ta),dt(t),t.il.changed=!0}(r.Ll,-a,-o)}this.Ia={x:l,y:i}}}if(this.ca&&this.il.can_move){let t=this.Ia,n=l-t.x,a=i-t.y;if(Math.abs(n)<1&&Math.abs(a)<1)return;let h=(l-t.x)/e.width,s=(i-t.y)/e.height;z(this.il).xl==N.sa&&(M(this.il),this.il.view_manager.move(h,s)),this.Ia={x:l,y:i}}F(this.il,"mousemove",new CustomEvent("mousemove",{detail:t})),t.preventDefault()}wa(t){let e=z(this.il);e.Pl&&e.xl==N.sa&&(M(this.il),t.deltaY>0?this.il.view_manager.scale(.1):this.il.view_manager.scale(-.1)),F(this.il,"wheel",new CustomEvent("wheel",{detail:t})),t.preventDefault()}dispose(){let t=this.Fl;t.removeEventListener("contextmenu",this.fa),t.removeEventListener("mousedown",this.Wa),t.removeEventListener("mousemove",this.ya),t.removeEventListener("mouseup",this.Va),t.removeEventListener("mouseout",this.Ya),t.removeEventListener("wheel",this.Ta),window.removeEventListener("keydown",this.Ra),window.removeEventListener("keyup",this.Na)}leftKey="A";Ea="a";upKey="W";La="w";rightKey="D";Ja="d";downKey="S";Ua="s";rise="Q";Pa="q";drop="E";Da="e";leftKeyTask=-1;upKeyTask=-1;rightKeyTask=-1;downKeyTask=-1;riseKeyTask=-1;dropKeyTask=-1;Aa(t){let e=this.il.wander;if(e.isRunning){let l=this,n=1e3/e.fps;switch(t.key){case this.Ea:case this.leftKey:-1==l.leftKeyTask&&(l.leftKeyTask=setInterval((()=>{M(l.il),lt(e,e.moveStep)}),n));break;case this.La:case this.upKey:-1==l.upKeyTask&&(M(l.il),l.upKeyTask=setInterval((()=>{M(l.il),et(e,e.moveStep)}),n));break;case this.Ja:case this.rightKey:-1==l.rightKeyTask&&(M(l.il),l.rightKeyTask=setInterval((()=>{M(l.il),lt(e,-e.moveStep)}),n));break;case this.Ua:case this.downKey:-1==l.downKeyTask&&(M(l.il),l.downKeyTask=setInterval((()=>{M(l.il),et(e,-e.moveStep)}),n));break;case this.Pa:case this.rise:-1==l.riseKeyTask&&(M(l.il),l.riseKeyTask=setInterval((()=>{M(l.il),nt(e,e.moveStep)}),n));break;case this.Da:case this.drop:-1==l.dropKeyTask&&(M(l.il),l.dropKeyTask=setInterval((()=>{M(l.il),nt(e,-e.moveStep)}),n))}}}ka(t){let e=this;if(z(this.il).Rl.isRunning)switch(t.key){case this.Ea:case this.leftKey:clearInterval(e.leftKeyTask),e.leftKeyTask=-1;break;case this.La:case this.upKey:clearInterval(e.upKeyTask),e.upKeyTask=-1;break;case this.Ja:case this.rightKey:clearInterval(e.rightKeyTask),e.rightKeyTask=-1;break;case this.Ua:case this.downKey:clearInterval(e.downKeyTask),e.downKeyTask=-1;break;case this.rise:case this.Pa:clearInterval(e.riseKeyTask),e.riseKeyTask=-1;break;case this.drop:case this.Da:clearInterval(e.dropKeyTask),e.dropKeyTask=-1}}}class Measure{scene;isRunnig=!1;lines=[];line=null;pickAction;updateAction;init(t){this.scene=t,this.pickAction=(t,e)=>this.onPick(e),this.updateAction=(t,e)=>{this.scene.scene_context.changed=!0}}onBeforeDraw(){if(this.isRunnig){let t=_(this.scene);this.scene.scene_context.selection_manager.clear_highlighted();let e=t.Fl.getBoundingClientRect(),l=t.Ii.pa,n=l[0],i=e.height-l[1];z(this.scene.scene_context).$l.za(n,i,p.face)}}onAfterDraw(){if(this.isRunnig){let t=_(this.scene),e=t.Fl.getBoundingClientRect();e.left,e.top;let l=t.mi;if(l.font=document.body.style.font,l.strokeStyle="rgb(0,255,0)",l.textAlign="center",l.textBaseline="middle",this.lines.forEach((t=>{let e=this.vec3toVec2(t.start),n=this.vec3toVec2(t.end);this.drawLine(l,e,n);let i=Math.round(distance$1(t.start,t.end))+"mm";this.drawText(l,e,n,i)})),null!=this.line.start&&null==this.line.end){this.line;let e=this.vec3toVec2(this.line.start),n=t.Ii.pa;this.drawLine(l,e,n)}}}start(){this.isRunnig||(this.scene.scene_context.select_mode,p.point,this.scene.scene_context.add_event_listener("select",this.pickAction),this.scene.scene_context.add_event_listener("mousemove",this.updateAction),this.line=new GLine,this.lines=[],this.isRunnig=!0)}stop(){if(this.isRunnig){let t=_(this.scene);this.scene.scene_context.remove_event_listener("select",this.pickAction),this.scene.scene_context.remove_event_listener("mousemove",this.updateAction),this.isRunnig=!1,this.lines=[];let e=t.mi,l=t.Fl;e.clearRect(0,0,l.width,l.height),this.scene.scene_context.selection_manager.clear_highlighted(),this.scene.scene_context.selection_manager.commit(),this.scene.scene_context.changed=!0}}onPick(t){console.log("onPick",{onPick:t.detail,start:this.line.start}),t.detail&&(this.line.start?t.detail&&(this.line.end=t.detail.point,this.lines.push(this.line),this.line=new GLine,this.scene.scene_context.changed=!0):this.line.start=t.detail.point)}vec3toVec2(t){return this.scene.scene_context.get_screen_point(t)}drawLine(t,e,l){t.beginPath(),t.moveTo(e[0],e[1]),t.lineTo(l[0],l[1]),t.stroke()}drawText(t,e,l,n){t.resetTransform();let i=(e[0]+l[0])/2,a=(e[1]+l[1])/2,h=t.fillStyle;t.fillStyle="#0000ffff",t.font="24px serif",t.fillText(n,i,a),t.fillStyle=h,t.resetTransform()}dispose(){}}class GLine{start=null;end=null}class Section{boxIndices=new Float32Array([.1,1.1,.1,3.1,1.1,2.1,2.1,3.1,.1,5.1,3.1,4.1,2.1,7.1,1.1,6.1,5.1,6.1,6.1,7.1,7.1,4.1,4.1,5.1,0,0,0,0,0,0,0,0,0,0,0,0]);a_PointIdBuffer=null;faceIndices=new Float32Array([.1,1.1,2.1,.1,2.1,3.1,.1,3.1,4.1,.1,5.1,4.1,.1,1.1,6.1,.1,5.1,6.1,1.1,2.1,7.1,1.1,6.1,7.1,2.1,3.1,4.1,2.1,7.1,4.1,4.1,5.1,6.1,4.1,7.1,6.1]);a_FaceIndicesBuffer=null;faceId=new Float32Array([1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,6,6]);a_FaceIdBuffer=null;front=0;right=0;up=0;left=0;down=0;back=0;vs;fs;gl=null;vsShader=null;fsShader=null;program=null;pbuffer=null;fbuffer=null;scene=null;isRunning=!1;selectedFaceId=0;isMouseDown=!1;lastX=0;lastY=0;max=create$3();min=create$3();mouseMoveAction;mouseDownAction;mouseUpAction;mouseOutAction;Oa;constructor(){this.vs=h.Yt,this.fs=h.Bt,this.mouseMoveAction=(t,e)=>{this.onMouseMove(t,e)},this.mouseDownAction=(t,e)=>{this.onMouseDown(t,e)},this.mouseUpAction=(t,e)=>{this.onMouseUp(t,e)},this.mouseOutAction=(t,e)=>{this.onMouseOut(t,e)},this.Oa=t=>{let e=t.mn;if(e){let t=e.slice(0,3),l=e.slice(3,6);this.front=l[1],this.right=l[0],this.up=l[2],this.left=t[0],this.down=t[2],this.back=t[1]}else this.stop()}}start(){if(this.isRunning)return;if(this.isRunning=!0,!this.scene)return;let t=this.scene.scene_context;t.add_event_listener("mousemove",this.mouseMoveAction),t.add_event_listener("mousedown",this.mouseDownAction),t.add_event_listener("mouseup",this.mouseUpAction),t.add_event_listener("mouseout",this.mouseOutAction),z(t).cl.subscribe("section_box_changed",this.Oa),null==t.section_box&&(t.section_box=new Float32Array([this.left,this.back,this.down,this.right,this.front,this.up])),t.changed=!0}stop(){if(!this.isRunning)return;if(this.isRunning=!1,!this.scene)return;let t=this.scene.scene_context;t.remove_event_listener("mousemove",this.mouseMoveAction),t.remove_event_listener("mousedown",this.mouseDownAction),t.remove_event_listener("mouseup",this.mouseUpAction),t.remove_event_listener("mouseout",this.mouseOutAction);let e=z(t);e.cl.remove("section_box_changed",this.Oa),e.Ul=!0,t.changed=!0}init(t){let e=_(t);this.gl=e.gi,this.scene=t,this.scene.scene_context.changed=!1,this.reSetBox(),this.initShader()}reSetBox(){let t=this.scene.scene_context,e=t.box.slice(0,3),l=t.box.slice(3,6),n=50;this.max=add(create$3(),l,fromValues$2(n,n,n)),this.min=add(create$3(),e,fromValues$2(-50,-50,-50)),this.front=l[1]+n,this.right=l[0]+n,this.up=l[2]+n,this.left=e[0]-n,this.down=e[2]-n,this.back=e[1]-n}initShader(){let t=this.gl;if(!t)return;let e=t.createShader(t.VERTEX_SHADER);if(!e)return;t.shaderSource(e,this.vs),t.compileShader(e),this.vsShader=e;let l=t.createShader(t.FRAGMENT_SHADER);if(!l)return;t.shaderSource(l,this.fs),t.compileShader(l),this.fsShader=l;let n=t.createProgram();if(!n)return;if(t.attachShader(n,e),t.attachShader(n,l),t.linkProgram(n),!t.getProgramParameter(n,t.LINK_STATUS)){let i=t.getProgramInfoLog(n);return console.log("Failed to link program: "+i),t.deleteProgram(n),t.deleteShader(l),void t.deleteShader(e)}this.program=n,t.useProgram(this.program);let i=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,i),t.bufferData(t.ARRAY_BUFFER,this.boxIndices,t.STATIC_DRAW),this.a_PointIdBuffer=i;let a=t.getAttribLocation(this.program,"a_PointIndex");t.vertexAttribPointer(a,1,t.FLOAT,!1,0,0),t.enableVertexAttribArray(a),this.a_FaceIndicesBuffer=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,this.a_FaceIndicesBuffer),t.bufferData(t.ARRAY_BUFFER,this.faceIndices,t.STATIC_DRAW);let h=t.getAttribLocation(this.program,"a_FaceIndex");t.vertexAttribPointer(h,1,t.FLOAT,!1,0,0),t.enableVertexAttribArray(h),this.a_FaceIdBuffer=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,this.a_FaceIdBuffer),t.bufferData(t.ARRAY_BUFFER,this.faceId,t.STATIC_DRAW);let s=t.getAttribLocation(this.program,"a_FaceId");t.vertexAttribPointer(s,1,t.FLOAT,!1,0,0),t.enableVertexAttribArray(s)}onBeforeDraw(){}onAfterDraw(){if(this.isRunning){let t=this.gl;if(!t||!this.program||!this.scene)return;this.active();let e=_(this.scene);t.viewport(0,0,e.Fl.width,e.Fl.height);let l=t.getUniformLocation(this.program,"u_Select");t.uniform1i(l,0);let n=t.getUniformLocation(this.program,"u_DrawLine");t.uniform1i(n,1);let i=t.getUniformLocation(this.program,"u_Mvp"),a=z(this.scene.scene_context).Nl;if(!a)return;if(t.uniformMatrix4fv(i,!1,a),t.enable(t.DEPTH_TEST),t.enable(t.BLEND),t.blendFunc(t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA),t.depthMask(!0),t.drawArrays(t.LINES,0,24),0!=this.selectedFaceId){let e=t.getUniformLocation(this.program,"u_DrawLine");t.uniform1i(e,0),t.depthMask(!1),t.drawArrays(t.TRIANGLES,6*(this.selectedFaceId-1),6),t.depthMask(!0)}t.disable(t.BLEND)}}active(){let t=this.gl;if(!t||!this.program)return;t.useProgram(this.program);let e=this.program,l=this.a_PointIdBuffer;t.bindBuffer(t.ARRAY_BUFFER,l);let n=t.getAttribLocation(this.program,"a_PointIndex");t.vertexAttribPointer(n,1,t.FLOAT,!1,0,0),t.enableVertexAttribArray(n),t.bindBuffer(t.ARRAY_BUFFER,this.a_FaceIndicesBuffer);let i=t.getAttribLocation(this.program,"a_FaceIndex");t.vertexAttribPointer(i,1,t.FLOAT,!1,0,0),t.enableVertexAttribArray(i),t.bindBuffer(t.ARRAY_BUFFER,this.a_FaceIdBuffer);let a=t.getAttribLocation(this.program,"a_FaceId");t.vertexAttribPointer(a,1,t.FLOAT,!1,0,0),t.enableVertexAttribArray(a);let h=t.getUniformLocation(e,"u_Front");t.uniform1f(h,this.front);let s=t.getUniformLocation(e,"u_Right");t.uniform1f(s,this.right);let o=t.getUniformLocation(e,"u_Up");t.uniform1f(o,this.up);let r=t.getUniformLocation(e,"u_Left");t.uniform1f(r,this.left);let c=t.getUniformLocation(e,"u_Down");t.uniform1f(c,this.down);let u=t.getUniformLocation(e,"u_Back");t.uniform1f(u,this.back)}select(t,e){let l=this.gl;if(!l||!this.scene||!this.program)return;let n=_(this.scene),i=n.Fl.width,a=n.Fl.height;this.active();let h=l.getUniformLocation(this.program,"u_Select");l.uniform1i(h,1);let s=l.createFramebuffer(),o=l.createTexture();l.activeTexture(l.TEXTURE0),l.bindTexture(l.TEXTURE_2D,o),l.texImage2D(l.TEXTURE_2D,0,l.RGB,i,a,0,l.RGB,l.UNSIGNED_BYTE,null),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.LINEAR);let r=l.createRenderbuffer();l.bindRenderbuffer(l.RENDERBUFFER,r),l.renderbufferStorage(l.RENDERBUFFER,l.DEPTH_COMPONENT16,i,a),l.bindFramebuffer(l.FRAMEBUFFER,s),l.framebufferTexture2D(l.FRAMEBUFFER,l.COLOR_ATTACHMENT0,l.TEXTURE_2D,o,0),l.framebufferRenderbuffer(l.FRAMEBUFFER,l.DEPTH_ATTACHMENT,l.RENDERBUFFER,r);let c=z(this.scene.scene_context).Nl;if(!c)return;let u=l.getUniformLocation(this.program,"u_Mvp");l.uniformMatrix4fv(u,!1,c),l.clearColor(0,0,0,1),l.enable(l.DEPTH_TEST),l.depthMask(!0),l.enable(l.SCISSOR_TEST),l.scissor(t,e,1,1),l.viewport(0,0,i,a),l.clear(l.COLOR_BUFFER_BIT|l.DEPTH_BUFFER_BIT),l.drawArrays(l.TRIANGLES,0,36);let g=new Uint8Array(4);l.readBuffer(l.COLOR_ATTACHMENT0),l.readPixels(t,e,1,1,l.RGBA,l.UNSIGNED_BYTE,g);let d=g[0],I=g[1],p=g[2];g[3];let Z=d+255*I+255*p*255;this.selectedFaceId=Z,l.disable(l.SCISSOR_TEST),l.bindTexture(l.TEXTURE_2D,null),l.bindFramebuffer(l.FRAMEBUFFER,null),l.deleteFramebuffer(s),l.deleteRenderbuffer(r),l.deleteTexture(o)}onMouseMove(t,e){if(this.isMouseDown){if(0!=this.selectedFaceId){if(!this.scene)return;let l=_(this.scene).Fl.getBoundingClientRect(),n=e.detail,i=n.clientX-l.left,a=n.clientY-l.top,h=l.height-a,s=(i-this.lastX)/(l.width/2),o=(h-this.lastY)/(l.height/2);this.lastX=i,this.lastY=h;let r=z(t).Nl;if(!r)return;let c=invert(create$4(),r),u=create$3();switch(this.selectedFaceId){case 1:u=fromValues$2(0,this.front,0);break;case 2:u=fromValues$2(this.right,0,0);break;case 3:u=fromValues$2(0,0,this.up);break;case 4:u=fromValues$2(this.left,0,0);break;case 5:u=fromValues$2(0,0,this.down);break;case 6:u=fromValues$2(0,this.back,0)}let g=transformMat4$1(create$3(),u,r);g=fromValues$2(g[0]+s,g[1]+o,g[2]),g=transformMat4$1(create$3(),g,c);let d=this.max,I=this.min,p=5;switch(this.selectedFaceId){case 1:u[1]<=d[1]+p&&g[1]>this.back+p&&(g[1]>d[1]?this.front=d[1]:this.front=g[1]);break;case 2:u[0]<=d[0]+p&&g[0]>this.left+p&&(g[0]>d[0]?this.right=d[0]:this.right=g[0]);break;case 3:u[2]<=d[2]+p&&g[2]>this.down+p&&(g[2]>d[2]?this.up=d[2]:this.up=g[2]);break;case 4:u[0]>I[0]-p&&g[0]<this.right-p&&(g[0]<I[0]?this.left=I[0]:this.left=g[0]);break;case 5:u[2]>I[2]-p&&g[2]<this.up-p&&(g[2]<I[2]?this.down=I[2]:this.down=g[2]);break;case 6:u[1]>I[1]-p&&g[1]<this.front-p&&(g[1]<I[1]?this.back=I[1]:this.back=g[1])}d=fromValues$2(this.right,this.front,this.up),I=fromValues$2(this.left,this.back,this.down),t.section_box=new Float32Array([this.left,this.back,this.down,this.right,this.front,this.up]),M(t)}}else{let t=e.detail;if(!this.scene)return;let l=_(this.scene).Fl.getBoundingClientRect(),n=t.clientX-l.left,i=l.height-(t.clientY-l.top);this.select(n,i)}t.changed=!0}onMouseDown(t,e){if(!t)return;if(0!=e.detail.button)return;0!=this.selectedFaceId&&(t.can_rotate=!1);let l=_(this.scene);this.isMouseDown=!0;let n=l.Fl.getBoundingClientRect(),i=e.detail,a=i.clientX-n.left,h=i.clientY-n.top,s=n.height-h;this.lastX=a,this.lastY=s}onMouseUp(t,e){this.scene&&(t.can_rotate=!0,this.isMouseDown=!1)}onMouseOut(t,e){t&&(this.isMouseDown=!1,t.can_rotate=!0)}dispose(){let t=this.gl;t.deleteBuffer(this.a_PointIdBuffer),t.deleteBuffer(this.a_FaceIndicesBuffer),t.deleteBuffer(this.a_FaceIdBuffer),t.deleteShader(this.vsShader),t.deleteShader(this.fsShader),t.deleteProgram(this.program),t.deleteBuffer(this.pbuffer),t.deleteBuffer(this.fbuffer)}}class Labelmanager{labels=[];scene;isRunning=!1;init(t){this.scene=t}onBeforeDraw(){}onAfterDraw(){if(this.isRunning){let t=_(this.scene).mi,e=this.labels.length;t.textAlign="center",t.textBaseline="middle";for(let l=0;l<e;l++)this.drawLabel(t,this.labels[l])}}start(){this.isRunning=!0}stop(){let t=_(this.scene).ci.getElementsByTagName("div");if(t){let e=t.length;for(let l=0;l<e;l++)t[0]?.remove()}this.isRunning=!1,this.scene.scene_context.changed=!0}dispose(){}setLabel(t){let e=_(this.scene).ci.getElementsByTagName("div");if(e){let t=e.length;for(let l=0;l<t;l++)e[0]?.remove()}if(t&&t.length>0){let e=t.length;for(let l=0;l<e;l++){let e=t[l];if("div"==e.type){let t=e.data;if(t){let l=this.scene.scene_context.get_screen_point(e.point),n=_(this.scene).ci;t.style.position="absolute",t.style.left=l[0]+"px",t.style.top=l[1]+"px",n.appendChild(t)}}}}this.labels=t}Qa(t){let e=this.labels.findIndex((e=>e.id==t.id));if(e>-.5){let l=this.labels[e];if(this.labels[e]=t,"div"==l.type){let e=l.data;if(e?.remove(),t.data){e=t.data;let n=this.scene.scene_context.get_screen_point(l.point),i=_(this.scene).ci;e.style.position="absolute",e.style.left=n[0]+"px",e.style.top=n[1]+"px",i.appendChild(e)}}else this.labels[e]=t}else this.labels.push(t)}drawLabel(t,e){if("string"==e.type){let l=e.data;t.font=e.font;let n=5,i=t.measureText(l),a=i.width+2*n,h=i.fontBoundingBoxAscent+i.fontBoundingBoxDescent+2*n,s=this.scene.scene_context.get_screen_point(e.point);t.resetTransform(),t.shadowColor=e.shadow_color,t.shadowBlur=5,t.fillStyle=e.font_back_color,this.drawLabelBack(t,s[0]-a/2,s[1]+h/2-n,a,h,n),t.shadowBlur=0,t.fillStyle=e.font_color,t.fillText(l,s[0],s[1]-n),t.resetTransform()}else if("img"==e.type){let l=e.data;if(l){let n=this.scene.scene_context.get_screen_point(e.point),i=l.width,a=l.height;t.drawImage(l,n[0]-i/2,n[1]-a/2)}}else if("div"==e.type){let t=e.data;if(t){let l=this.scene.scene_context.get_screen_point(e.point);t.style.position="absolute",t.style.left=l[0]+"px",t.style.top=l[1]+"px"}}}drawLabelBack(t,e,l,n,i,a){t.beginPath(),t.moveTo(e,l-a),t.lineTo(e,l-i+a),t.arcTo(e,l-i,e+a,l-i,a),t.lineTo(e+n-a,l-i),t.arcTo(e+n,l-i,e+n,l-i+a,a),t.lineTo(e+n,l-a),t.arcTo(e+n,l,e+n-a,l,a),t.lineTo(e+a,l),t.arcTo(e,l,e,l-a,a),t.fill()}}class Shader{gl;_a;ja;qa;$a;constructor(t,e,l){this.gl=t,this.ja=this.CreateShader(t,e,t.VERTEX_SHADER),this.qa=this.CreateShader(t,l,t.FRAGMENT_SHADER),this.$a=t.createProgram(),t.attachShader(this.$a,this.ja),t.attachShader(this.$a,this.qa),t.linkProgram(this.$a),t.useProgram(null)}CreateShader(t,e,l){let n=t.createShader(l);return null==n?null:(t.shaderSource(n,e),t.compileShader(n),n)}ia(){this.gl.useProgram(this.$a)}th(t){let e=this.gl,l=this.$a,n=new Map;e.useProgram(l),t.forEach((t=>{let i=e.getUniformLocation(l,t);n.set(t,i)})),this._a=n}eh(t){return this._a.get(t)}dispose(){let t=this.gl;t.deleteShader(this.ja),t.deleteShader(this.qa),t.deleteProgram(this.$a)}}function It(t,e,l,n){t.activeTexture(l),t.bindTexture(t.TEXTURE_2D,e),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.uniform1i(n,l-t.TEXTURE0)}function pt(t,e,l,n,i,a=4){switch(t.activeTexture(t.TEXTURE0),t.bindTexture(t.TEXTURE_2D,i),a){case 1:t.texImage2D(t.TEXTURE_2D,0,t.R32F,l,n,0,t.RED,t.FLOAT,null);break;case 2:t.texImage2D(t.TEXTURE_2D,0,t.RG32F,l,n,0,t.RG,t.FLOAT,null);break;case 3:t.texImage2D(t.TEXTURE_2D,0,t.RGB32F,l,n,0,t.RGB,t.FLOAT,null);break;case 4:t.texImage2D(t.TEXTURE_2D,0,t.RGBA32F,l,n,0,t.RGBA,t.FLOAT,null)}t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.framebufferTexture2D(t.FRAMEBUFFER,e,t.TEXTURE_2D,i,0),t.bindTexture(t.TEXTURE_2D,null)}function Zt(t,e,l){Reflect.ownKeys(l).forEach((n=>{let i=n;if(i&&i.startsWith("u_")){let n=t.getUniformLocation(e,i);Reflect.set(l,i,n)}}))}function Gt(t){t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE)}class mt{vl;gi=null;nh=null;ih=null;ah;get hh(){return this.ah}constructor(t){this.vl=t;let e=z(t).ql.gl;this.gi=e,this.nh=new Shader(e,h.m,h.Z),this.nh.th(["u_ColorSampler","u_TransformIndexSampler","u_TriangleSize","u_PointSampler","u_PointSamplerSize","u_TransformSampler","u_TransformSize","u_Mvp","u_ViewMatrix","u_ModelMatrix","u_Near","u_Far","u_Eye","u_LightColor","u_LightDirection","u_AmbientColor","u_UseSectionBox","u_Max","u_Min"]),this.ih=new Shader(e,h.gt,h.k),this.ih.th(["u_PerSize","u_PointSampler"]),this.ah=e.createTexture()}sh(t,e,l){let n=this.gi,i=z(this.vl).ql,a=this.ih;a.ia(),n.bindBuffer(n.ARRAY_BUFFER,i.quadBuffer),n.vertexAttribPointer(0,2,n.FLOAT,!1,0,0),n.enableVertexAttribArray(0),n.uniform2f(a.eh("u_PerSize"),1/t,1/e),It(n,l,n.TEXTURE0,a.eh("u_PointSampler")),n.drawArrays(n.TRIANGLE_STRIP,0,4)}Ki(t,e,l){this.oh(t,e);let n=this.vl,i=z(n),a=i.ql,h=this.gi;h.viewport(0,0,t,e),h.clearColor(0,0,0,0),h.clearDepth(1),h.clear(h.COLOR_BUFFER_BIT|h.DEPTH_BUFFER_BIT),h.enable(h.DEPTH_TEST),h.depthMask(!0),this.sh(t,e,l);let s=this.nh;if(s.ia(),h.bindBuffer(h.ARRAY_BUFFER,a.rh),h.vertexAttribIPointer(0,1,h.UNSIGNED_INT,0,0),h.enableVertexAttribArray(0),h.bindBuffer(h.ARRAY_BUFFER,a.uh),h.vertexAttribIPointer(1,3,h.UNSIGNED_BYTE,0,0),h.enableVertexAttribArray(1),It(h,a.gh,h.TEXTURE1,this.nh.eh("u_ColorSampler")),It(h,a.dh,h.TEXTURE2,this.nh.eh("u_TransformIndexSampler")),h.uniform1ui(this.nh.eh("u_TriangleSize"),a.Ih),It(h,a.ph,h.TEXTURE3,this.nh.eh("u_PointSampler")),h.uniform1ui(this.nh.eh("u_PointSamplerSize"),a.Zh),It(h,a.Gh,h.TEXTURE4,this.nh.eh("u_TransformSampler")),h.uniform1ui(this.nh.eh("u_TransformSize"),a.mh),h.uniformMatrix4fv(this.nh.eh("u_Mvp"),!1,i.Nl),h.uniformMatrix4fv(this.nh.eh("u_ViewMatrix"),!1,i.kl),h.uniform1f(this.nh.eh("u_Near"),i.Ml),h.uniform1f(this.nh.eh("u_Far"),i.Hl),h.uniform3fv(s.eh("u_Eye"),i.zl.getEye()),h.uniform3fv(s.eh("u_LightColor"),i.Al.color.to_float3_color()),h.uniform3fv(s.eh("u_LightDirection"),i.Al.ze),h.uniform3fv(s.eh("u_AmbientColor"),n.ambient.to_float3_color()),i.bn!=Y.none)switch(i.bn){case Y.box:h.uniform1i(s.eh("u_UseSectionBox"),1);let t=n.section_box;h.uniform3f(s.eh("u_Min"),t[0],t[1],t[2]),h.uniform3f(s.eh("u_Max"),t[3],t[4],t[5]);break;case Y.plane:h.uniform1i(s.eh("u_UseSectionBox"),2),h.uniform3fv(s.eh("u_Min"),i.Cn.orign),h.uniform3fv(s.eh("u_Max"),i.Cn.normal)}else h.uniform1i(s.eh("u_UseSectionBox"),0);h.clear(h.COLOR_BUFFER_BIT);let o=i.kl,r=i.Kl,c=i.ql.Ch;c.forEach((t=>{t.bh(o,r),h.uniformMatrix4fv(s.eh("u_ModelMatrix"),!1,t.mm),t.buffer.fh()})),h.enable(h.BLEND),h.depthMask(!1),c.forEach((t=>{h.uniformMatrix4fv(s.eh("u_ModelMatrix"),!1,t.mm),t.buffer.Wh()})),h.depthMask(!0),h.disable(h.BLEND),this.Xh()}oh(t,e){let l=z(this.vl).ql,n=l.gl,i=l.yh,a=l.Vh;n.bindFramebuffer(n.FRAMEBUFFER,i),pt(n,n.COLOR_ATTACHMENT0,t,e,this.ah,4),n.bindRenderbuffer(n.RENDERBUFFER,a),n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_COMPONENT32F,t,e),n.framebufferRenderbuffer(n.FRAMEBUFFER,n.DEPTH_ATTACHMENT,n.RENDERBUFFER,a),n.drawBuffers([n.COLOR_ATTACHMENT0])}Xh(){let t=z(this.vl).ql.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.bindFramebuffer(t.FRAMEBUFFER,null)}dispose(){this.gi.deleteTexture(this.ah)}}class Ct{vBuffer;gl;shader=null;Bh;Yh;Sh;constructor(t){let e=new Float32Array([-1,1,-1,-1,1,1,1,-1]);this.shader=new Shader(t,h.O,h.D),this.vBuffer=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,this.vBuffer),t.bufferData(t.ARRAY_BUFFER,e,t.STATIC_DRAW),this.Yh=t.createFramebuffer(),this.Sh=t.createRenderbuffer(),this.Bh=t.createTexture(),this.gl=t}dispose(){let t=this.gl;t.deleteBuffer(this.vBuffer),t.deleteFramebuffer(this.Yh),t.deleteRenderbuffer(this.Sh),t.deleteTexture(this.Bh),this.shader?.dispose()}u_Sampler;u_Size;u_Offset;u_Intensity;inited=!1;Ki(t,e,l,n,i){let a=this.shader.$a,h=this.gl;h.useProgram(a),h.bindBuffer(h.ARRAY_BUFFER,this.vBuffer),h.vertexAttribPointer(0,2,h.FLOAT,!1,0,0),h.enableVertexAttribArray(0),this.inited||(this.u_Size=h.getUniformLocation(a,"u_Size"),this.u_Offset=h.getUniformLocation(a,"u_Offset"),this.u_Sampler=h.getUniformLocation(a,"u_Sampler"),this.u_Intensity=h.getUniformLocation(a,"u_Intensity"),this.inited=!0),h.uniform2f(this.u_Size,e,l),h.uniform1f(this.u_Intensity,n);let s,o=this.Bh,r=t,c=this.Yh,u=this.Sh,g=0;for(h.bindRenderbuffer(h.RENDERBUFFER,u),h.renderbufferStorage(h.RENDERBUFFER,h.DEPTH_COMPONENT16,e,l),h.bindFramebuffer(h.FRAMEBUFFER,c);g<i;)h.activeTexture(h.TEXTURE13),h.bindTexture(h.TEXTURE_2D,r),h.pixelStorei(h.UNPACK_PREMULTIPLY_ALPHA_WEBGL,0),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,h.NEAREST),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.NEAREST),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_S,h.CLAMP_TO_EDGE),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_T,h.CLAMP_TO_EDGE),h.uniform1i(this.u_Sampler,13),h.activeTexture(h.TEXTURE14),h.bindTexture(h.TEXTURE_2D,o),h.texImage2D(h.TEXTURE_2D,0,h.RGBA,e,l,0,h.RGBA,h.UNSIGNED_BYTE,null),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.LINEAR),h.framebufferTexture2D(h.FRAMEBUFFER,h.COLOR_ATTACHMENT0,h.TEXTURE_2D,o,0),h.framebufferRenderbuffer(h.FRAMEBUFFER,h.DEPTH_ATTACHMENT,h.RENDERBUFFER,u),h.uniform2f(this.u_Offset,1,0),h.viewport(0,0,e,l),h.clearColor(0,0,0,0),h.clear(h.COLOR_BUFFER_BIT|h.DEPTH_BUFFER_BIT),h.drawArrays(h.TRIANGLE_STRIP,0,4),s=r,r=o,o=s,h.activeTexture(h.TEXTURE13),h.bindTexture(h.TEXTURE_2D,r),h.pixelStorei(h.UNPACK_PREMULTIPLY_ALPHA_WEBGL,0),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,h.NEAREST),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.NEAREST),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_S,h.CLAMP_TO_EDGE),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_T,h.CLAMP_TO_EDGE),h.uniform1i(this.u_Sampler,13),h.activeTexture(h.TEXTURE14),h.bindTexture(h.TEXTURE_2D,o),h.texImage2D(h.TEXTURE_2D,0,h.RGBA,e,l,0,h.RGBA,h.UNSIGNED_BYTE,null),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.LINEAR),h.framebufferTexture2D(h.FRAMEBUFFER,h.COLOR_ATTACHMENT0,h.TEXTURE_2D,o,0),h.framebufferRenderbuffer(h.FRAMEBUFFER,h.DEPTH_ATTACHMENT,h.RENDERBUFFER,u),h.uniform2f(this.u_Offset,0,1),h.viewport(0,0,e,l),h.clearColor(0,0,0,0),h.clear(h.COLOR_BUFFER_BIT|h.DEPTH_BUFFER_BIT),h.drawArrays(h.TRIANGLE_STRIP,0,4),g++,g<i&&(s=r,r=o,o=s);return h.bindFramebuffer(h.FRAMEBUFFER,null),o}}class bt{u_PerSize=null;u_PointSampler=null;ih=null;gi=null;ql=null;constructor(t){this.ql=t;let e=t.gl;this.gi=e,this.ih=new Shader(e,h.gt,h.k),this.ih.th(["u_PerSize","u_PointSampler"])}Ki(t,e,l){let n=this.gi,i=this.ih;i.ia(),n.bindBuffer(n.ARRAY_BUFFER,this.ql.quadBuffer),n.vertexAttribPointer(0,2,n.FLOAT,!1,0,0),n.enableVertexAttribArray(0),n.uniform2f(i.eh("u_PerSize"),1/t,1/e),It(n,l,n.TEXTURE1,i.eh("u_PointSampler")),n.drawArrays(n.TRIANGLE_STRIP,0,4)}Th(){this.ih.dispose()}}class ft{vl;wh;Rh=null;gi;Ah;Nh;Bh;get kh(){return this.Bh}constructor(t){this.vl=t;let e=z(t),l=e.ql.gl;this.gi=l,this.Nh=new Ct(l),this.Rh=new bt(e.ql),this.wh=new Shader(l,h.W,h.C),this.th(),this.Ah=l.createTexture()}u_PointSampler=null;u_PointSamplerSize=null;u_TransformSampler=null;u_TransformSize=null;u_ColorSampler=null;u_TransformIndexSampler=null;u_TriangleSize=null;u_Mvp=null;u_UseSectionBox=null;u_Max=null;u_Min=null;th(){let t=this.gi,e=this.wh.$a;this.u_PointSampler=t.getUniformLocation(e,"u_PointSampler"),this.u_PointSamplerSize=t.getUniformLocation(e,"u_PointSamplerSize"),this.u_TransformSampler=t.getUniformLocation(e,"u_TransformSampler"),this.u_TransformSize=t.getUniformLocation(e,"u_TransformSize"),this.u_ColorSampler=t.getUniformLocation(e,"u_ColorSampler"),this.u_TransformIndexSampler=t.getUniformLocation(e,"u_TransformIndexSampler"),this.u_TriangleSize=t.getUniformLocation(e,"u_TriangleSize"),this.u_Mvp=t.getUniformLocation(e,"u_Mvp"),this.u_UseSectionBox=t.getUniformLocation(e,"u_UseSectionBox"),this.u_Max=t.getUniformLocation(e,"u_Max"),this.u_Min=t.getUniformLocation(e,"u_Min")}dispose(){this.Nh?.dispose(),this.wh?.dispose(),this.gi.deleteTexture(this.Ah)}oh(t,e){let l=z(this.vl).ql,n=l.gl,i=l.yh,a=l.Vh;n.bindFramebuffer(n.FRAMEBUFFER,i),pt(n,n.COLOR_ATTACHMENT0,t,e,this.Ah,4),n.bindRenderbuffer(n.RENDERBUFFER,a),n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_COMPONENT32F,t,e),n.framebufferRenderbuffer(n.FRAMEBUFFER,n.DEPTH_ATTACHMENT,n.RENDERBUFFER,a),n.drawBuffers([n.COLOR_ATTACHMENT0])}Xh(){let t=z(this.vl).ql.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.bindFramebuffer(t.FRAMEBUFFER,null)}Kh(t,e,l){this.oh(t,e);let n=this.gi;n.enable(n.DEPTH_TEST),this.Rh.Ki(t,e,l),this.wh.ia();let i=this.vl,a=z(i),h=a.ql;switch(n.bindBuffer(n.ARRAY_BUFFER,h.rh),n.vertexAttribIPointer(0,1,n.UNSIGNED_INT,0,0),n.enableVertexAttribArray(0),n.uniformMatrix4fv(this.u_Mvp,!1,a.Nl),It(n,h.ph,n.TEXTURE1,this.u_PointSampler),n.uniform1ui(this.u_PointSamplerSize,h.Zh),It(n,h.Gh,n.TEXTURE2,this.u_TransformSampler),n.uniform1ui(this.u_TransformSize,h.mh),It(n,h.gh,n.TEXTURE3,this.u_ColorSampler),It(n,h.dh,n.TEXTURE4,this.u_TransformIndexSampler),n.uniform1ui(this.u_TriangleSize,h.Ih),a.bn){case Y.none:n.uniform1i(this.u_UseSectionBox,0);break;case Y.box:{let t=i.section_box;n.uniform1i(this.u_UseSectionBox,1),n.uniform3f(this.u_Min,t[0],t[1],t[2]),n.uniform3f(this.u_Max,t[3],t[4],t[5]);break}case Y.plane:n.uniform1i(this.u_UseSectionBox,2),n.uniform3fv(this.u_Min,a.Cn.orign),n.uniform3fv(this.u_Max,a.Cn.normal)}n.viewport(0,0,t,e),n.clearColor(0,0,0,0),n.clear(n.COLOR_BUFFER_BIT),h.Fn.Mh(),this.Xh()}Ki(t,e,l){this.Kh(t,e,l);let n=this.vl.bloom_manager;return this.Bh=this.Nh.Ki(this.Ah,t,e,n.bloomFactor,n.bloomRange),this.Bh}}class Wt{vl;nh;ih;ah;get texture(){return this.ah}gi;Nh;constructor(t){this.vl=t;let e=z(t).ql.gl;this.gi=e,this.Nh=new Ct(e),this.nh=new Shader(e,h.lt,h.et),this.nh.th(["u_Mvp","u_Phase","u_DistancePeriod"]),this.ih=new Shader(e,h.gt,h.k),this.ih.th(["u_PerSize","u_PointSampler"]),this.ah=e.createTexture()}dispose(){this.gi.deleteTexture(this.ah),this.nh?.dispose(),this.ih?.dispose()}oh(t,e){let l=z(this.vl).ql,n=l.gl,i=l.yh,a=l.Vh;n.bindFramebuffer(n.FRAMEBUFFER,i),pt(n,n.COLOR_ATTACHMENT0,t,e,this.ah,4),n.bindRenderbuffer(n.RENDERBUFFER,a),n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_COMPONENT32F,t,e),n.framebufferRenderbuffer(n.FRAMEBUFFER,n.DEPTH_ATTACHMENT,n.RENDERBUFFER,a),n.drawBuffers([n.COLOR_ATTACHMENT0])}Xh(){let t=z(this.vl).ql.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.bindFramebuffer(t.FRAMEBUFFER,null)}Ki(t,e,l){this.oh(t,e);let n=this.gi,i=this.vl,a=z(i).ql;n.viewport(0,0,t,e),n.clearColor(0,0,0,0),n.clearDepth(1),n.enable(n.DEPTH_TEST),n.clear(n.COLOR_BUFFER_BIT|n.DEPTH_BUFFER_BIT);let h=this.ih;h.ia(),n.bindBuffer(n.ARRAY_BUFFER,a.quadBuffer),n.vertexAttribPointer(0,2,n.FLOAT,!1,0,0),n.enableVertexAttribArray(0),n.uniform2f(h.eh("u_PerSize"),1/t,1/e),It(n,l,n.TEXTURE0,h.eh("u_PointSampler")),n.drawArrays(n.TRIANGLE_STRIP,0,4),h=this.nh,h.ia();let s=a.Hh;n.clear(n.COLOR_BUFFER_BIT),n.bindBuffer(n.ARRAY_BUFFER,s.Fh),n.vertexAttribPointer(0,3,n.FLOAT,!1,0,0),n.enableVertexAttribArray(0),n.bindBuffer(n.ARRAY_BUFFER,s.zh),n.vertexAttribPointer(1,3,n.UNSIGNED_BYTE,!0,0,0),n.enableVertexAttribArray(1),n.bindBuffer(n.ARRAY_BUFFER,s.xh),n.vertexAttribPointer(2,3,n.FLOAT,!1,0,0),n.enableVertexAttribArray(2),n.bindBuffer(n.ARRAY_BUFFER,s.ref_point_buffer),n.vertexAttribPointer(3,3,n.FLOAT,!1,0,0),n.enableVertexAttribArray(3);let o=z(i);n.uniformMatrix4fv(h.eh("u_Mvp"),!1,o.Nl),n.uniform1f(h.eh("u_Phase"),s.Eh),console.log(s.Eh),n.uniform1f(h.eh("u_DistancePeriod"),1e4),n.drawArrays(n.TRIANGLES,0,s.Lh),this.Xh();let r=i.bloom_manager;return this.Nh.Ki(this.ah,t,e,r.bloomFactor,r.bloomRange)}}class Xt{gi=null;nh=null;Wl=null;ah=null;u_NormalSampler=null;u_PointSampler=null;u_PerSize=null;u_ViewMatrix=null;u_Projection=null;u_uvs=null;u_AoFactor=null;u_AoRadius=null;u_NoiseSampler=null;u_NoiseScale=null;shaderInited=!1;get hh(){return this.ah}Jh=null;vl=null;constructor(t){this.vl=t;let e=z(t),l=e.ql.gl;this.gi=l,this.nh=new Shader(l,h.l,h.t),this.ah=l.createTexture(),this.Jh=l.createTexture(),this.Wl=e.ql.quadBuffer}dispose(){let t=this.gi;t.deleteBuffer(this.Wl),t.deleteTexture(this.ah),this.nh?.dispose()}Uh;Ph;setAos(){this.Uh=new Float32Array(128);for(let t=0;t<64;t++){let e=Math.random(),l=Math.sqrt(2);e=(e*e*2-1)/l;let n=Math.random();n=n*n/l,this.Uh[2*t]=e,this.Uh[2*t+1]=n}this.Ph=new Float32Array(48);for(let t=0;t<16;t++){let e=2*Math.random()-1,l=2*Math.random()-1;this.Ph[3*t]=e,this.Ph[3*t+1]=l,this.Ph[3*t+2]=0}}Dh(){this.nh.ia(),this.shaderInited||(Zt(this.gi,this.nh.$a,this),this.setAos(),this.shaderInited=!0)}oh(t,e){let l=z(this.vl).ql,n=l.gl,i=l.yh,a=l.Vh;n.bindFramebuffer(n.FRAMEBUFFER,i),pt(n,n.COLOR_ATTACHMENT0,t,e,this.ah,4),n.bindRenderbuffer(n.RENDERBUFFER,a),n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_COMPONENT32F,t,e),n.framebufferRenderbuffer(n.FRAMEBUFFER,n.DEPTH_ATTACHMENT,n.RENDERBUFFER,a),n.drawBuffers([n.COLOR_ATTACHMENT0])}Xh(){let t=z(this.vl).ql.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.bindFramebuffer(t.FRAMEBUFFER,null)}Ki(t,e,l,n){let i=this.gi;this.Dh(),this.oh(t,e),It(i,l,i.TEXTURE1,this.u_PointSampler),It(i,n,i.TEXTURE2,this.u_NormalSampler),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,this.Jh),i.texImage2D(i.TEXTURE_2D,0,i.RGB32F,4,4,0,i.RGB,i.FLOAT,this.Ph),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.REPEAT),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.REPEAT),i.bindTexture(i.TEXTURE_2D,null),It(i,this.Jh,i.TEXTURE3,this.u_NoiseSampler);let a=z(this.vl);var h,s;i.uniform2f(this.u_PerSize,1/t,1/e),i.uniformMatrix3fv(this.u_ViewMatrix,!1,(h=create$5(),s=a.kl,h[0]=s[0],h[1]=s[1],h[2]=s[2],h[3]=s[4],h[4]=s[5],h[5]=s[6],h[6]=s[8],h[7]=s[9],h[8]=s[10],h)),i.uniform2fv(this.u_NoiseScale,[t/4,e/4]),i.uniform2fv(this.u_uvs,this.Uh),i.uniform1f(this.u_AoFactor,this.vl.ao_factor),i.uniform1f(this.u_AoRadius,this.vl.ao_radius),i.bindBuffer(i.ARRAY_BUFFER,this.Wl),i.vertexAttribPointer(0,2,i.FLOAT,!1,0,0),i.enableVertexAttribArray(0),i.drawArrays(i.TRIANGLE_STRIP,0,4),this.Xh()}}class yt{vl;u_GeometrySampler=null;u_PointSampler=null;u_PerSize=null;u_EdgeWidth=null;u_EdgeColor=null;ah=null;get texture(){return this.ah}inited=!1;nh=null;gi=null;Wl=null;constructor(t){this.vl=t;let e=z(t),l=e.ql.gl;this.gi=l,this.ah=l.createTexture(),this.Wl=e.ql.quadBuffer,this.nh=new Shader(l,h.F,h.H)}dispose(){this.gi.deleteTexture(this.ah),this.nh?.ia()}Dh(){this.nh.ia(),this.inited||(Zt(this.gi,this.nh.$a,this),this.inited=!0)}oh(t,e){let l=z(this.vl).ql,n=l.gl,i=l.yh,a=l.Vh;n.bindFramebuffer(n.FRAMEBUFFER,i),pt(n,n.COLOR_ATTACHMENT0,t,e,this.ah,4),n.bindRenderbuffer(n.RENDERBUFFER,a),n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_COMPONENT32F,t,e),n.framebufferRenderbuffer(n.FRAMEBUFFER,n.DEPTH_ATTACHMENT,n.RENDERBUFFER,a),n.drawBuffers([n.COLOR_ATTACHMENT0])}Xh(){let t=z(this.vl).ql.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.bindFramebuffer(t.FRAMEBUFFER,null)}Ki(t,e,l,n){let i=this.gi,a=this.vl;this.Dh(),this.oh(t,e),i.viewport(0,0,t,e),i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT|i.DEPTH_BUFFER_BIT),i.disable(i.DEPTH_TEST),a.edge_width>0&&(It(i,l,i.TEXTURE1,this.u_GeometrySampler),It(i,n,i.TEXTURE2,this.u_PointSampler),i.uniform2f(this.u_PerSize,1/t,1/e),i.uniform1i(this.u_EdgeWidth,a.edge_width),i.uniform4fv(this.u_EdgeColor,a.edge_color.to_float4_color()),i.bindBuffer(i.ARRAY_BUFFER,this.Wl),i.vertexAttribPointer(0,2,i.FLOAT,!1,0,0),i.enableVertexAttribArray(0),i.drawArrays(i.TRIANGLE_STRIP,0,4),i.disableVertexAttribArray(0)),i.enable(i.DEPTH_TEST),this.Xh()}}class HighShadowRender{vl=null;gi=null;ah=null;get texture(){return this.ah}Oh=null;Qh=null;_h=null;jh=null;qh=null;$h=null;ts=null;es=null;ls=null;ns=null;hs=null;ss=null;rs=null;nh=null;constructor(t){this.vl=t;let e=z(t).ql.gl;this.gi=e,this.nh=new Shader(e,h.gt,h.At),this.th(),this.ah=e.createTexture()}th(){let t=this.nh.$a,e=this.gi;this.Oh=e.getUniformLocation(t,"u_Mvp"),this.Qh=e.getUniformLocation(t,"u_LightViewMatrix"),this._h=e.getUniformLocation(t,"u_ShadowSampler"),this.jh=e.getUniformLocation(t,"u_PointSampler"),this.qh=e.getUniformLocation(t,"u_GeometrySampler"),this.$h=e.getUniformLocation(t,"u_UseSectionBox"),this.ts=e.getUniformLocation(t,"u_Max"),this.es=e.getUniformLocation(t,"u_Min"),this.ls=e.getUniformLocation(t,"u_LightMvp"),this.ns=e.getUniformLocation(t,"u_Bias"),this.hs=e.getUniformLocation(t,"u_Precision"),this.ss=e.getUniformLocation(t,"u_ShadowFactor"),this.rs=e.getUniformLocation(t,"u_PerSize")}dispose(){this.gi.deleteTexture(this.ah),this.nh?.dispose()}oh(t,e){let l=z(this.vl).ql,n=l.gl,i=l.yh,a=l.Vh;n.bindFramebuffer(n.FRAMEBUFFER,i),pt(n,n.COLOR_ATTACHMENT0,t,e,this.ah,4),n.bindRenderbuffer(n.RENDERBUFFER,a),n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_COMPONENT32F,t,e),n.framebufferRenderbuffer(n.FRAMEBUFFER,n.DEPTH_ATTACHMENT,n.RENDERBUFFER,a),n.drawBuffers([n.COLOR_ATTACHMENT0])}Xh(){let t=z(this.vl).ql.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.bindFramebuffer(t.FRAMEBUFFER,null)}Dh(){this.nh.ia();let t=z(this.vl).ql,e=t.gl;e.bindBuffer(e.ARRAY_BUFFER,t.quadBuffer),e.vertexAttribPointer(0,2,e.FLOAT,!1,0,0),e.enableVertexAttribArray(0)}Ki(t,e,l,n,i,a,h){this.Dh();let s=this.vl,o=z(s),r=o.ql.gl;this.oh(t,e);let c=z(s);switch(r.uniformMatrix4fv(this.Oh,!1,c.Nl),r.uniform1f(this.ss,s.shadow_factor),o.en?r.uniform1f(this.hs,1):r.uniform1f(this.hs,0),r.uniform2f(this.rs,1/t,1/e),It(r,i,r.TEXTURE0,this._h),It(r,a,r.TEXTURE1,this.jh),It(r,h,r.TEXTURE2,this.qh),o.bn){case Y.none:r.uniform1i(this.$h,0);break;case Y.box:{let t=s.section_box;r.uniform1i(this.$h,1),r.uniform3f(this.es,t[0],t[1],t[2]),r.uniform3f(this.ts,t[3],t[4],t[5]);break}case Y.plane:r.uniform1i(this.$h,2),r.uniform3fv(this.es,o.Cn.orign),r.uniform3fv(this.ts,o.Cn.normal)}r.uniformMatrix4fv(this.ls,!1,l),r.uniformMatrix4fv(this.Qh,!1,n),r.uniform1f(this.ns,s.bias),r.clearColor(0,0,0,1),r.viewport(0,0,t,e),r.clear(r.COLOR_BUFFER_BIT|r.DEPTH_BUFFER_BIT),r.enable(r.DEPTH_TEST),r.drawArrays(r.TRIANGLE_STRIP,0,4),this.Xh()}}class vt{vl=null;cs=null;get us(){return this.cs}gs=null;get ds(){return this.gs}Ah=null;get Is(){return this.Ah}ps=null;get Zs(){return this.ps}nh;u_Mvp=null;u_ViewMatrix=null;u_UseSectionBox=null;u_Max=null;u_Min=null;u_PointSampler=null;u_PointSamplerSize=null;u_TransformSampler=null;u_TransformSize=null;u_Near=null;u_Far=null;u_FaceIdSampler=null;u_ColorSampler=null;u_TransformIndexSampler=null;u_TriangleSize=null;shaderInited=!1;Gs;get Cs(){return this.Gs}bs;get Ws(){return this.bs}constructor(t){this.vl=t;let e=z(t).ql.gl;this.nh=new Shader(e,h.j,h._),this.Ah=e.createTexture(),this.gs=e.createTexture(),this.ps=e.createTexture(),this.cs=e.createTexture()}dispose(){let t=z(this.vl).ql.gl;this.nh.dispose(),t.deleteTexture(this.Ah),t.deleteTexture(this.gs),t.deleteTexture(this.cs),t.deleteTexture(this.ps)}Dh(){this.nh.ia();let t=z(this.vl).ql,e=t.gl;if(!this.shaderInited){let t=this.nh.$a;this.u_Mvp=e.getUniformLocation(t,"u_Mvp"),this.u_ViewMatrix=e.getUniformLocation(t,"u_ViewMatrix"),this.u_UseSectionBox=e.getUniformLocation(t,"u_UseSectionBox"),this.u_Max=e.getUniformLocation(t,"u_Max"),this.u_Min=e.getUniformLocation(t,"u_Min"),this.u_PointSampler=e.getUniformLocation(t,"u_PointSampler"),this.u_PointSamplerSize=e.getUniformLocation(t,"u_PointSamplerSize"),this.u_TransformSampler=e.getUniformLocation(t,"u_TransformSampler"),this.u_TransformSize=e.getUniformLocation(t,"u_TransformSize"),this.u_Far=e.getUniformLocation(t,"u_Far"),this.u_Near=e.getUniformLocation(t,"u_Near"),this.u_FaceIdSampler=e.getUniformLocation(t,"u_FaceIdSampler"),this.u_ColorSampler=e.getUniformLocation(t,"u_ColorSampler"),this.u_TransformIndexSampler=e.getUniformLocation(t,"u_TransformIndexSampler"),this.u_TriangleSize=e.getUniformLocation(t,"u_TriangleSize"),this.shaderInited=!0}e.bindBuffer(e.ARRAY_BUFFER,t.rh),e.vertexAttribIPointer(0,1,e.UNSIGNED_INT,0,0),e.enableVertexAttribArray(0),e.bindBuffer(e.ARRAY_BUFFER,t.uh),e.vertexAttribIPointer(1,3,e.UNSIGNED_BYTE,0,0),e.enableVertexAttribArray(1),It(e,t.gh,e.TEXTURE2,this.u_ColorSampler),It(e,t.Xs,e.TEXTURE3,this.u_FaceIdSampler),It(e,t.dh,e.TEXTURE4,this.u_TransformIndexSampler)}ys(){let t=z(this.vl).ql.gl;t.disableVertexAttribArray(0),t.disableVertexAttribArray(1)}oh(t,e){let l=z(this.vl).ql,n=l.gl,i=l.yh,a=l.Vh;n.bindFramebuffer(n.FRAMEBUFFER,i),pt(n,n.COLOR_ATTACHMENT0,t,e,this.Ah,4),pt(n,n.COLOR_ATTACHMENT1,t,e,this.gs,4),pt(n,n.COLOR_ATTACHMENT2,t,e,this.cs,4),pt(n,n.COLOR_ATTACHMENT3,t,e,this.ps,4),n.bindRenderbuffer(n.RENDERBUFFER,a),n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_COMPONENT32F,t,e),n.framebufferRenderbuffer(n.FRAMEBUFFER,n.DEPTH_ATTACHMENT,n.RENDERBUFFER,a),n.drawBuffers([n.COLOR_ATTACHMENT0,n.COLOR_ATTACHMENT1,n.COLOR_ATTACHMENT2,n.COLOR_ATTACHMENT3])}Xh(){let t=z(this.vl).ql.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT1,t.TEXTURE_2D,null,0),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT2,t.TEXTURE_2D,null,0),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT3,t.TEXTURE_2D,null,0),t.bindFramebuffer(t.FRAMEBUFFER,null)}Ki(t,e){this.Dh();let l=this.vl,n=z(l),i=n.ql,a=i.gl;switch(this.oh(t,e),a.uniform1ui(this.u_TriangleSize,i.Ih),It(a,i.ph,a.TEXTURE5,this.u_PointSampler),a.uniform1ui(this.u_PointSamplerSize,i.Zh),It(a,i.Gh,a.TEXTURE6,this.u_TransformSampler),a.uniform1ui(this.u_TransformSize,i.mh),a.uniformMatrix4fv(this.u_Mvp,!1,n.Nl),a.uniformMatrix4fv(this.u_ViewMatrix,!1,n.kl),a.uniform1f(this.u_Near,n.Ml),a.uniform1f(this.u_Far,n.Hl),n.bn){case Y.none:a.uniform1i(this.u_UseSectionBox,0);break;case Y.box:{let t=l.section_box;a.uniform1i(this.u_UseSectionBox,1),a.uniform3f(this.u_Min,t[0],t[1],t[2]),a.uniform3f(this.u_Max,t[3],t[4],t[5]);break}case Y.plane:a.uniform1i(this.u_UseSectionBox,2),a.uniform3fv(this.u_Min,n.Cn.orign),a.uniform3fv(this.u_Max,n.Cn.normal)}a.viewport(0,0,t,e),a.clearColor(0,0,0,1),a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT),a.enable(a.DEPTH_TEST),a.disable(a.BLEND),n.Jl?(a.enable(a.CULL_FACE),a.cullFace(a.BACK)):a.disable(a.CULL_FACE),n.en?i.Mn.fh():n.Zn>0?i.Vs.fh():i.Mn.fh(),l.shadow&&n.en&&this.Bs(a,t,e),this.Xh(),this.ys()}Bs(t,e,l){let n,i,a,h=z(this.vl),s=h.Al.ze,o=-Number.MAX_VALUE,r=Number.MAX_VALUE,c=new Float32Array(e*l*4);t.readBuffer(t.COLOR_ATTACHMENT2),t.readPixels(0,0,e,l,t.RGBA,t.FLOAT,c);let u=-Number.MAX_VALUE,g=-Number.MAX_VALUE,d=-Number.MAX_VALUE,I=Number.MAX_VALUE,p=Number.MAX_VALUE,Z=Number.MAX_VALUE,G=e*l;for(let t=0;t<G;t++){let e=c[4*t],l=c[4*t+1],n=c[4*t+2];if(c[4*t+3]>.99999999)continue;e>u&&(u=e),e<I&&(I=e),l>g&&(g=l),l<p&&(p=l),n>d&&(d=n),n<Z&&(Z=n);let i=dot$1(s,[e,l,n]);i>o&&(o=i),i<r&&(r=i)}n=fromValues$2(I,p,Z),i=fromValues$2(u,g,d),a=fromValues$2((u+I)/2,(p+g)/2,(Z+d)/2);let m=2*h.zl.radius,C=add(create$3(),scale(create$3(),s,m),a),b=dot$1(C,s);o=b-o,r=b-r;let f=fromValues$2(-1,0,0),W=fromValues$2(0,0,0),X=h.Al,y=X.phi/180*Math.PI,v=X.theta/180*Math.PI;f=rotateY(create$3(),f,W,v),f=rotateZ(create$3(),f,W,y);let V=f,B=lookAt(create$4(),C,a,V),Y=[],S=[],T=i,w=transformMat4$1(create$3(),T,B);Y.push(w[0]),S.push(w[1]);let R=fromValues$2(n[0],i[1],i[2]);w=transformMat4$1(create$3(),R,B),Y.push(w[0]),S.push(w[1]);let A=fromValues$2(i[0],n[1],i[2]);w=transformMat4$1(create$3(),A,B),Y.push(w[0]),S.push(w[1]);let N=fromValues$2(n[0],n[1],i[2]);w=transformMat4$1(create$3(),N,B),Y.push(w[0]),S.push(w[1]);let k=fromValues$2(i[0],i[1],n[2]);w=transformMat4$1(create$3(),k,B),Y.push(w[0]),S.push(w[1]);let K=fromValues$2(n[0],i[1],n[2]);w=transformMat4$1(create$3(),K,B),Y.push(w[0]),S.push(w[1]);let M=fromValues$2(i[0],n[1],n[2]);w=transformMat4$1(create$3(),M,B),Y.push(w[0]),S.push(w[1]);let H=n;w=transformMat4$1(create$3(),H,B),Y.push(w[0]),S.push(w[1]),o=this.Ys(this.vl.box,B);let F=Math.min(...Y),x=Math.max(...Y),E=Math.max(...S),L=Math.min(...S);console.log(`w:${x-F},h:${E-L}`);let J=ortho(create$4(),F,x,L,E,o,r);this.bs=B,this.Gs=multiply(create$4(),J,B)}Ys(t,e){let l=t.slice(0,3),n=t.slice(3,6),i=[],a=n,h=transformMat4$1(create$3(),a,e);i.push(h[2]);let s=fromValues$2(l[0],n[1],n[2]);h=transformMat4$1(create$3(),s,e),i.push(h[2]);let o=fromValues$2(n[0],l[1],n[2]);h=transformMat4$1(create$3(),o,e),i.push(h[2]);let r=fromValues$2(l[0],l[1],n[2]);h=transformMat4$1(create$3(),r,e),i.push(h[2]);let c=fromValues$2(n[0],n[1],l[2]);h=transformMat4$1(create$3(),c,e),i.push(h[2]);let u=fromValues$2(l[0],n[1],l[2]);h=transformMat4$1(create$3(),u,e),i.push(h[2]);let g=fromValues$2(n[0],l[1],l[2]);h=transformMat4$1(create$3(),g,e),i.push(h[2]);let d=l;return h=transformMat4$1(create$3(),d,e),i.push(h[2]),-Math.max(...i)}test(t){t.readBuffer(t.COLOR_ATTACHMENT2);let e=new Float32Array(4);t.readPixels(0,0,1,1,t.RGBA,t.FLOAT,e),console.log(e),t.readPixels(10,10,1,1,t.RGBA,t.FLOAT,e),console.log(e)}}class Vt{vl;constructor(t){this.vl=t}box;Ss(t,e,l){this.box=t;let n=t?.slice(0,3),i=t?.slice(3,6),a=distance$1(n,i)/2,h=e/l,s=0,o=0;h>1?(o=a,s=o*h):(s=a,o=s/h);let r=add(create$3(),n,i),c=scale(create$3(),r,.5),u=z(this.vl).Al,g=u.phi/180*Math.PI,d=u.theta/180*Math.PI,I=fromValues$2(0,0,1),p=fromValues$2(0,0,0),Z=rotateY(create$3(),I,p,d);Z=rotateZ(create$3(),Z,p,g);let G=z(this.vl).zl,m=G.radius,C=add(create$3(),c,scale(create$3(),Z,m)),b=fromValues$2(-1,0,0);b=rotateY(create$3(),b,p,d),b=rotateZ(create$3(),b,p,g);let f=b,W=lookAt(create$4(),C,c,f),X=[];i=G.max,n=G.min;let y=i;X.push(transformMat4$1(create$3(),y,W)[2]);let v=fromValues$2(n[0],i[1],i[2]);X.push(transformMat4$1(create$3(),v,W)[2]);let V=fromValues$2(i[0],n[1],i[2]);X.push(transformMat4$1(create$3(),V,W)[2]);let B=fromValues$2(n[0],n[1],i[2]);X.push(transformMat4$1(create$3(),B,W)[2]);let Y=fromValues$2(i[0],i[1],n[2]);X.push(transformMat4$1(create$3(),Y,W)[2]);let S=fromValues$2(n[0],i[1],n[2]);X.push(transformMat4$1(create$3(),S,W)[2]);let T=fromValues$2(i[0],n[1],n[2]);X.push(transformMat4$1(create$3(),T,W)[2]);let w=n;X.push(transformMat4$1(create$3(),w,W)[2]);let R=-Math.max(...X),A=-Math.min(...X),N=ortho(create$4(),-s,s,-o,o,R,A);return multiply(create$4(),N,W)}Ts(t){this.box=t;let e=t?.slice(0,3),l=t?.slice(3,6),n=add(create$3(),e,l),i=scale(create$3(),n,.5),a=z(this.vl),h=a.Al,s=h.phi/180*Math.PI,o=h.theta/180*Math.PI,r=fromValues$2(0,0,1),c=fromValues$2(0,0,0),u=rotateY(create$3(),r,c,o);u=rotateZ(create$3(),u,c,s);let g=a.zl,d=g.radius,I=add(create$3(),i,scale(create$3(),u,d)),p=fromValues$2(-1,0,0);p=rotateY(create$3(),p,c,o),p=rotateZ(create$3(),p,c,s);let Z=p,G=lookAt(create$4(),I,i,Z),m=[],C=[],b=[];l=g.max,e=g.min;let f=l,W=transformMat4$1(create$3(),f,G);C.push(W[0]),b.push(W[1]),m.push(W[2]);let X=fromValues$2(e[0],l[1],l[2]);W=transformMat4$1(create$3(),X,G),C.push(W[0]),b.push(W[1]),m.push(W[2]);let y=fromValues$2(l[0],e[1],l[2]);W=transformMat4$1(create$3(),y,G),C.push(W[0]),b.push(W[1]),m.push(W[2]);let v=fromValues$2(e[0],e[1],l[2]);W=transformMat4$1(create$3(),v,G),C.push(W[0]),b.push(W[1]),m.push(W[2]);let V=fromValues$2(l[0],l[1],e[2]);W=transformMat4$1(create$3(),V,G),C.push(W[0]),b.push(W[1]),m.push(W[2]);let B=fromValues$2(e[0],l[1],e[2]);W=transformMat4$1(create$3(),B,G),C.push(W[0]),b.push(W[1]),m.push(W[2]);let Y=fromValues$2(l[0],e[1],e[2]);W=transformMat4$1(create$3(),Y,G),C.push(W[0]),b.push(W[1]),m.push(W[2]);let S=e;W=transformMat4$1(create$3(),S,G),C.push(W[0]),b.push(W[1]),m.push(W[2]);let T=-Math.max(...m),w=-Math.min(...m),R=Math.min(...C),A=Math.max(...C),N=Math.max(...b),k=Math.min(...b),K=ortho(create$4(),R,A,k,N,T,w);return{vm:G,mvp:multiply(create$4(),K,G)}}}class Bt{vl;gi=null;ws=null;get highTexture(){return this.ws}Rs=null;get lowTexture(){return this.Rs}nh=null;Oh=null;As=null;$h=null;es=null;ts=null;Ns=null;ks=null;jh=null;Ks=null;Ms=null;Hs=null;Fs=null;zs=!1;get ok(){return this.zs}constructor(t){this.vl=t;let e=z(t).ql.gl;this.gi=e,this.ws=e.createTexture(),this.Rs=e.createTexture(),this.nh=new Shader(e,h.Kt,h.kt),this.th()}th(){let t=this.gi,e=this.nh.$a;this.Oh=t.getUniformLocation(e,"u_Mvp"),this.As=t.getUniformLocation(e,"u_ViewMatrix"),this.$h=t.getUniformLocation(e,"u_UseSectionBox"),this.es=t.getUniformLocation(e,"u_Min"),this.ts=t.getUniformLocation(e,"u_Max"),this.Ns=t.getUniformLocation(e,"u_TransformSampler"),this.ks=t.getUniformLocation(e,"u_TransformSize"),this.jh=t.getUniformLocation(e,"u_PointSampler"),this.Ks=t.getUniformLocation(e,"u_PointSamplerSize"),this.Ms=t.getUniformLocation(e,"u_TransformIndexSampler"),this.Hs=t.getUniformLocation(e,"u_FaceIdSampler"),this.Fs=t.getUniformLocation(e,"u_TriangleSize")}dispose(){let t=this.gi;t.deleteTexture(this.ws),t.deleteTexture(this.Rs),this.nh?.dispose()}oh(t,e,l){let n=z(this.vl).ql,i=n.gl,a=n.yh,h=n.Vh;i.bindFramebuffer(i.FRAMEBUFFER,a),pt(i,i.COLOR_ATTACHMENT0,t,e,l?this.Rs:this.ws,4),i.bindRenderbuffer(i.RENDERBUFFER,h),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_COMPONENT32F,t,e),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,h),i.drawBuffers([i.COLOR_ATTACHMENT0])}Xh(){let t=z(this.vl).ql.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.bindFramebuffer(t.FRAMEBUFFER,null)}ia(){let t=this.gi;this.nh.ia();let e=z(this.vl).ql;t.bindBuffer(t.ARRAY_BUFFER,e.rh),t.vertexAttribIPointer(0,1,t.UNSIGNED_INT,0,0),t.enableVertexAttribArray(0)}Ki(t,e,l,n,i){this.ia(),this.oh(l,n,i);let a=this.gi,h=this.vl,s=z(h).ql;if(a.uniformMatrix4fv(this.Oh,!1,t),a.uniformMatrix4fv(this.As,!1,e),It(a,s.ph,a.TEXTURE1,this.jh),It(a,s.Gh,a.TEXTURE2,this.Ns),It(a,s.dh,a.TEXTURE3,this.Ms),It(a,s.Xs,a.TEXTURE4,this.Hs),a.uniform1ui(this.Fs,s.Ih),a.uniform1ui(this.ks,s.mh),a.uniform1ui(this.Ks,s.Zh),h.section_mode==Y.box){let t=h.section_box;a.uniform1i(this.$h,1),a.uniform3f(this.es,t[0],t[1],t[2]),a.uniform3f(this.ts,t[3],t[4],t[5])}else a.uniform1i(this.$h,0);a.viewport(0,0,l,n),a.clearColor(0,0,0,1),a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT),a.enable(a.DEPTH_TEST),a.disable(a.BLEND),s.Mn.fh(),this.Xh(),i&&(this.zs=!0)}}class Yt{vl=null;xs=null;Wl=null;gi=null;shaderInited=!1;u_ColorSampler=null;u_NormalSampler=null;u_PointSampler=null;u_AoSampler=null;u_PerSize=null;u_Mvp=null;u_Eye=null;u_LightColor=null;u_LightDirection=null;u_AmbientColor=null;u_EdgeSampler=null;u_ShadowSampler=null;u_Shadow=null;u_Ao=null;ah=null;get hh(){return this.ah}get us(){return this.Es.us}get Ls(){return this.Js.texture}Us=null;nh=null;Ps=null;Es=null;Js=null;Ds=null;Os=null;constructor(t){this.vl=t;let e=z(t),l=e.ql.gl;this.gi=l,this.Es=new vt(t),this.xs=new Xt(t),this.Js=new yt(t),this.Ds=new HighShadowRender(t),this.Os=new Bt(t),this.ah=l.createTexture(),this.nh=new Shader(l,h.N,h.T),this.Ps=new Shader(l,h.N,h.I),this.Wl=e.ql.quadBuffer}dispose(){this.Es?.dispose(),this.xs?.dispose(),this.Js?.dispose(),this.Ds?.dispose(),this.Os?.dispose(),this.gi.deleteTexture(this.ah),this.nh?.dispose(),this.Ps?.dispose()}Dh(){this.gi,this.nh.ia(),this.shaderInited||(Zt(this.gi,this.nh.$a,this),this.shaderInited=!0)}oh(t,e){let l=z(this.vl).ql,n=l.gl,i=l.yh,a=l.Vh;n.bindFramebuffer(n.FRAMEBUFFER,i),pt(n,n.COLOR_ATTACHMENT0,t,e,this.ah,4),n.bindRenderbuffer(n.RENDERBUFFER,a),n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_COMPONENT32F,t,e),n.framebufferRenderbuffer(n.FRAMEBUFFER,n.DEPTH_ATTACHMENT,n.RENDERBUFFER,a),n.drawBuffers([n.COLOR_ATTACHMENT0])}unbindTexture(){let t=z(this.vl).ql.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.bindFramebuffer(t.FRAMEBUFFER,null)}Ki(t,e){let l=this.gi,n=this.vl,i=z(n);if(this.Es.Ki(t,e),n.shadow)if(i.en){let{Cs:l,Ws:n,Zs:i,us:a}=this.Es;this.Os.Ki(l,n,4*t,4*e,!1),this.Ds.Ki(t,e,l,n,this.Os.highTexture,a,i)}else{let{Zs:l,us:a}=this.Es,h=new Vt(n),{vm:s,mvp:o}=h.Ts(n.box);this.Os.ok&&!i.Al.He||(this.Os.Ki(o,s,4*t,4*e,!0),i.Al.He=!1),this.Ds.Ki(t,e,o,s,this.Os.lowTexture,a,l)}if(i.en&&n.ao_radius>0&&this.xs.Ki(t,e,this.Es.us,this.Es.ds),this.Js.Ki(t,e,this.Es.Zs,this.Es.us),l.viewport(0,0,t,e),l.enable(l.DEPTH_TEST),this.oh(t,e),i._l)l.clearColor(0,0,0,1),l.clearDepth(1),l.depthFunc(l.LEQUAL),l.clear(l.COLOR_BUFFER_BIT|l.DEPTH_BUFFER_BIT),this.Qs(l,t,e),l.depthFunc(l.LESS);else{let t=n.background.to_float3_color();l.clearColor(t[0],t[1],t[2],1),l.clearDepth(1),l.depthFunc(l.LESS),l.clear(l.COLOR_BUFFER_BIT|l.DEPTH_BUFFER_BIT)}this.Dh(),i.en&&n.ao_radius>0?l.uniform1i(this.u_Ao,1):l.uniform1i(this.u_Ao,0),It(l,this.Es.Is,l.TEXTURE0,this.u_ColorSampler),It(l,this.Es.ds,l.TEXTURE1,this.u_NormalSampler),It(l,this.Es.us,l.TEXTURE2,this.u_PointSampler),It(l,this.xs.hh,l.TEXTURE3,this.u_AoSampler),n.shadow?(It(l,this.Ds.texture,l.TEXTURE5,this.u_ShadowSampler),l.uniform1i(this.u_Shadow,1)):l.uniform1i(this.u_Shadow,0),l.uniform2f(this.u_PerSize,1/t,1/e),l.uniformMatrix4fv(this.u_Mvp,!1,i.Nl),l.uniform3fv(this.u_Eye,i.zl.getEye()),l.uniform3fv(this.u_LightColor,i.Al.color.to_float3_color()),l.uniform3fv(this.u_LightDirection,i.Al.ze),l.uniform3fv(this.u_AmbientColor,n.ambient.to_float3_color()),l.disable(l.BLEND),l.bindBuffer(l.ARRAY_BUFFER,this.Wl),l.vertexAttribPointer(0,2,l.FLOAT,!1,0,0),l.enableVertexAttribArray(0),l.drawArrays(l.TRIANGLE_STRIP,0,4),l.disableVertexAttribArray(0),this.unbindTexture(),l.disableVertexAttribArray(0)}_s=null;js=null;qs=!1;Qs(t,e,l){if(this.Ps.ia(),!this.qs){let e=this.Ps.$a;this._s=t.getUniformLocation(e,"u_BackgroundImage"),this.js=t.getUniformLocation(e,"u_PerSize"),this.qs=!0}t.uniform2f(this.js,1/e,1/l);let n=z(this.vl);t.activeTexture(t.TEXTURE1),t.bindTexture(t.TEXTURE_2D,n.ql.Us),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.uniform1i(this._s,1),t.viewport(0,0,e,l),t.enable(t.DEPTH_TEST),t.disable(t.BLEND),t.bindBuffer(t.ARRAY_BUFFER,this.Wl),t.vertexAttribPointer(0,2,t.FLOAT,!1,0,0),t.enableVertexAttribArray(0),t.drawArrays(t.TRIANGLE_STRIP,0,4)}}class St{vl;gi;$s;eo;lo;ah;get hh(){return this.ah}constructor(t){this.vl=t;let e=z(t).ql.gl;this.gi=e,this.$s=new Shader(e,h.ot,h.st),this.$s.th(["u_Mvp","u_UseSectionBox","u_Max","u_Min","u_PointSampler","u_PointSamplerSize","u_TransformSampler","u_TransformSize","u_TransformIndexSampler","u_OutlineIdSampler","u_TriangleSize"]),this.eo=new Shader(e,h.gt,h.ht),this.eo.th(["u_OutlineIdSampler","u_OutlineWidth","u_OutlineColor","u_PerSize"]),this.lo=e.createTexture(),this.ah=e.createTexture()}dispose(){let t=this.gi;t.deleteTexture(this.lo),t.deleteTexture(this.ah),this.$s?.dispose(),this.eo?.dispose()}oh(t,e,l){let n=z(this.vl).ql,i=n.gl,a=n.yh,h=n.Vh;i.bindFramebuffer(i.FRAMEBUFFER,a),pt(i,i.COLOR_ATTACHMENT0,t,e,l,4),i.bindRenderbuffer(i.RENDERBUFFER,h),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_COMPONENT32F,t,e),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,h),i.drawBuffers([i.COLOR_ATTACHMENT0])}Xh(){let t=z(this.vl).ql.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.bindFramebuffer(t.FRAMEBUFFER,null)}no(t,e){this.oh(t,e,this.lo);let l=this.$s;l.ia();let n=this.vl,i=z(n).ql,a=this.gi;a.bindBuffer(a.ARRAY_BUFFER,i.rh),a.vertexAttribIPointer(0,1,a.UNSIGNED_INT,0,0),a.enableVertexAttribArray(0);let h=z(this.vl);a.uniformMatrix4fv(l.eh("u_Mvp"),!1,h.Nl);let s=l.eh("u_TransformSize"),o=l.eh("u_TransformSampler"),r=l.eh("u_PointSamplerSize"),c=l.eh("u_PointSampler");It(a,i.ph,a.TEXTURE1,c),a.uniform1ui(r,i.Zh),It(a,i.Gh,a.TEXTURE2,o),a.uniform1ui(s,i.mh);let u=l.eh("u_TransformIndexSampler"),g=l.eh("u_OutlineIdSampler"),d=l.eh("u_TriangleSize");switch(a.uniform1ui(d,i.Ih),It(a,i.dh,a.TEXTURE3,u),It(a,i.io,a.TEXTURE4,g),h.bn){case Y.none:a.uniform1i(l.eh("u_UseSectionBox"),0);break;case Y.box:{let t=n.section_box;a.uniform1i(l.eh("u_UseSectionBox"),1),a.uniform3f(l.eh("u_Min"),t[0],t[1],t[2]),a.uniform3f(l.eh("u_Max"),t[3],t[4],t[5]);break}case Y.plane:a.uniform1i(l.eh("u_UseSectionBox"),2),a.uniform3fv(l.eh("u_Min"),h.Cn.orign),a.uniform3fv(l.eh("u_Max"),h.Cn.normal)}a.viewport(0,0,t,e),a.clearColor(0,0,0,0),a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT),a.enable(a.DEPTH_TEST),a.disable(a.BLEND),a.disable(a.CULL_FACE),h.en?(i.Mn.fh(),i.Mn.Wh()):h.Zn>0?(i.Vs.fh(),i.Vs.Wh()):(i.Mn.fh(),i.Mn.Wh()),this.Xh()}ho(t,e){this.oh(t,e,this.ah);let l=this.eo;l.ia();let n=this.gi,i=this.vl,a=z(i).ql;n.bindBuffer(n.ARRAY_BUFFER,a.quadBuffer),n.vertexAttribPointer(0,2,n.FLOAT,!1,0,0),n.enableVertexAttribArray(0),It(n,this.lo,n.TEXTURE0,l.eh("u_OutlineIdSampler")),n.uniform1i(l.eh("u_OutlineWidth"),i.outline_width),n.uniform4fv(l.eh("u_OutlineColor"),i.outline_color.to_float4_color()),n.uniform2f(l.eh("u_PerSize"),1/t,1/e),n.viewport(0,0,t,e),n.clearColor(0,0,0,0),n.clear(n.COLOR_BUFFER_BIT|n.DEPTH_BUFFER_BIT),n.disable(n.DEPTH_TEST),n.drawArrays(n.TRIANGLE_STRIP,0,4),this.Xh()}Ki(t,e){this.no(t,e),this.ho(t,e)}}class Tt{vl;so;ih;gi;cs=null;get us(){return this.cs}gs=null;get ds(){return this.gs}Ah=null;get Is(){return this.Ah}ps=null;get Zs(){return this.ps}constructor(t){this.vl=t;let e=z(t).ql.gl;this.gi=e,this.ih=new Shader(e,h.gt,h.k),this.ih.th(["u_PerSize","u_PointSampler"]),this.so=new Shader(e,h.j,h._),this.so.th(["u_Mvp","u_ViewMatrix","u_UseSectionBox","u_Max","u_Min","u_PointSampler","u_PointSamplerSize","u_TransformSampler","u_TransformSize","u_Near","u_Far","u_FaceIdSampler","u_ColorSampler","u_TransformIndexSampler","u_TriangleSize"]),this.cs=e.createTexture(),this.gs=e.createTexture(),this.Ah=e.createTexture(),this.ps=e.createTexture()}dispose(){this.so?.dispose(),this.ih?.dispose();let t=this.gi;t.deleteTexture(this.cs),t.deleteTexture(this.gs),t.deleteTexture(this.Ah),t.deleteTexture(this.ps)}sh(t,e,l){let n=this.gi,i=z(this.vl).ql,a=i.yh,h=i.Vh;n.bindFramebuffer(n.FRAMEBUFFER,a),pt(n,n.COLOR_ATTACHMENT0,t,e,this.Ah,4),n.bindRenderbuffer(n.RENDERBUFFER,h),n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_COMPONENT32F,t,e),n.framebufferRenderbuffer(n.FRAMEBUFFER,n.DEPTH_ATTACHMENT,n.RENDERBUFFER,h),n.drawBuffers([n.COLOR_ATTACHMENT0]);let s=this.ih;s.ia(),n.bindBuffer(n.ARRAY_BUFFER,i.quadBuffer),n.vertexAttribPointer(0,2,n.FLOAT,!1,0,0),n.enableVertexAttribArray(0),n.uniform2f(s.eh("u_PerSize"),1/t,1/e),It(n,l,n.TEXTURE1,s.eh("u_PointSampler")),n.drawArrays(n.TRIANGLE_STRIP,0,4)}Ki(t,e,l){let n=this.gi;n.viewport(0,0,t,e),n.clearColor(0,0,0,1),n.clearDepth(1),n.clear(n.COLOR_BUFFER_BIT|n.DEPTH_BUFFER_BIT),n.enable(n.DEPTH_TEST),n.depthFunc(n.LESS),n.disable(n.BLEND),n.disable(n.CULL_FACE),this.sh(t,e,l),this.oh(t,e),n.clearColor(0,0,0,1),n.clear(n.COLOR_BUFFER_BIT);let i=this.so;i.ia();let a=this.vl,h=z(a),s=h.ql;switch(n.bindBuffer(n.ARRAY_BUFFER,s.rh),n.vertexAttribIPointer(0,1,n.UNSIGNED_INT,0,0),n.enableVertexAttribArray(0),n.bindBuffer(n.ARRAY_BUFFER,s.uh),n.vertexAttribIPointer(1,3,n.UNSIGNED_BYTE,0,0),n.enableVertexAttribArray(1),It(n,s.gh,n.TEXTURE2,i.eh("u_ColorSampler")),It(n,s.Xs,n.TEXTURE3,i.eh("u_FaceIdSampler")),It(n,s.dh,n.TEXTURE4,i.eh("u_TransformIndexSampler")),n.uniform1ui(i.eh("u_TriangleSize"),s.Ih),It(n,s.ph,n.TEXTURE5,i.eh("u_PointSampler")),n.uniform1ui(i.eh("u_PointSamplerSize"),s.Zh),It(n,s.Gh,n.TEXTURE6,i.eh("u_TransformSampler")),n.uniform1ui(i.eh("u_TransformSize"),s.mh),i=this.so,n.uniformMatrix4fv(i.eh("u_Mvp"),!1,h.Nl),n.uniformMatrix4fv(i.eh("u_ViewMatrix"),!1,h.kl),n.uniform1f(i.eh("u_Near"),h.Ml),n.uniform1f(i.eh("u_Far"),h.Hl),h.bn){case Y.none:n.uniform1i(i.eh("u_UseSectionBox"),0);break;case Y.box:{let t=a.section_box;n.uniform1i(i.eh("u_UseSectionBox"),1),n.uniform3f(i.eh("u_Min"),t[0],t[1],t[2]),n.uniform3f(i.eh("u_Max"),t[3],t[4],t[5]);break}case Y.plane:n.uniform1i(i.eh("u_UseSectionBox"),2),n.uniform3fv(i.eh("u_Min"),h.Cn.orign),n.uniform3fv(i.eh("u_Max"),h.Cn.normal)}h.Jl?(n.enable(n.CULL_FACE),n.cullFace(n.BACK)):n.disable(n.CULL_FACE),h.en?s.Mn.Wh():h.Zn>0?s.Vs.Wh():s.Mn.Wh(),this.Xh()}oh(t,e){let l=z(this.vl).ql,n=l.gl,i=l.yh;l.Vh,n.bindFramebuffer(n.FRAMEBUFFER,i),pt(n,n.COLOR_ATTACHMENT0,t,e,this.Ah,4),pt(n,n.COLOR_ATTACHMENT1,t,e,this.gs,4),pt(n,n.COLOR_ATTACHMENT2,t,e,this.cs,4),pt(n,n.COLOR_ATTACHMENT3,t,e,this.ps,4),n.drawBuffers([n.COLOR_ATTACHMENT0,n.COLOR_ATTACHMENT1,n.COLOR_ATTACHMENT2,n.COLOR_ATTACHMENT3])}Xh(){let t=z(this.vl).ql.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT1,t.TEXTURE_2D,null,0),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT2,t.TEXTURE_2D,null,0),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT3,t.TEXTURE_2D,null,0),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT4,t.TEXTURE_2D,null,0),t.bindFramebuffer(t.FRAMEBUFFER,null)}}class wt{vl;gi=null;ah=null;get hh(){return this.ah}get Ls(){return this.Js.texture}nh;Es;Js;xs=null;constructor(t){this.vl=t;let e=z(t).ql.gl;this.gi=e,this.Es=new Tt(t),this.Js=new yt(t),this.xs=new Xt(t),this.nh=new Shader(e,h.gt,h.T),this.nh.th(["u_ColorSampler","u_NormalSampler","u_PointSampler","u_EdgeSampler","u_ShadowSampler","u_AoSampler","u_Shadow","u_Ao","u_PerSize","u_LightColor","u_LightDirection","u_AmbientColor","u_Eye"]),this.ah=e.createTexture()}dispose(){this.Es?.dispose(),this.Js?.dispose(),this.xs?.dispose(),this.nh?.dispose(),this.gi.deleteTexture(this.ah)}oh(t,e){let l=z(this.vl).ql,n=l.gl,i=l.yh,a=l.Vh;n.bindFramebuffer(n.FRAMEBUFFER,i),pt(n,n.COLOR_ATTACHMENT0,t,e,this.ah,4),n.bindRenderbuffer(n.RENDERBUFFER,a),n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_COMPONENT32F,t,e),n.framebufferRenderbuffer(n.FRAMEBUFFER,n.DEPTH_ATTACHMENT,n.RENDERBUFFER,a),n.drawBuffers([n.COLOR_ATTACHMENT0])}Xh(){let t=z(this.vl).ql.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.bindFramebuffer(t.FRAMEBUFFER,null)}Ki(t,e,l){let n=this.gi;this.Es.Ki(t,e,l),this.Js.Ki(t,e,this.Es.Zs,this.Es.us),this.nh.ia(),this.oh(t,e),n.viewport(0,0,t,e),n.clearColor(0,0,0,0),n.clearDepth(1),n.enable(n.DEPTH_TEST),n.clear(n.COLOR_BUFFER_BIT|n.DEPTH_BUFFER_BIT),n.depthFunc(n.LESS);let i=this.nh,a=this.vl,h=z(a).ql;n.bindBuffer(n.ARRAY_BUFFER,h.quadBuffer),n.vertexAttribPointer(0,2,n.FLOAT,!1,0,0),n.enableVertexAttribArray(0),It(n,this.Es.Is,n.TEXTURE0,i.eh("u_ColorSampler")),It(n,this.Es.ds,n.TEXTURE1,i.eh("u_NormalSampler")),It(n,this.Es.us,n.TEXTURE2,i.eh("u_PointSampler")),It(n,this.xs.hh,n.TEXTURE3,i.eh("u_AoSampler")),n.uniform1i(i.eh("u_Shadow"),0),n.uniform1i(i.eh("u_Ao"),0),n.uniform2f(i.eh("u_PerSize"),1/t,1/e);let s=z(a);n.uniform3fv(i.eh("u_LightColor"),s.Al.color.to_float3_color()),n.uniform3fv(i.eh("u_LightDirection"),s.Al.ze),n.uniform3fv(i.eh("u_AmbientColor"),a.ambient.to_float3_color()),n.uniform3fv(i.eh("u_Eye"),s.zl.getEye()),n.drawArrays(n.TRIANGLE_STRIP,0,4),this.Xh()}}class Rt{vl;gi;oo;ro;co;uo;do;constructor(t){this.vl=t;let e=z(t).ql.gl;this.gi=e,this.oo=new Shader(e,h.pe,h.Ie),this.oo.th(["u_Mvp","u_PointSampler","u_PointSamplerSize","u_TransformSampler","u_TransformSize","u_FaceIdSampler","u_TransformIndexSampler","u_TriangleSize"]),this.co=new Shader(e,h.gt,h.ge),this.co.th(["u_Rect","u_FaceIdSampler","u_PerSize","u_EdgeWidth","u_EdgeColor","u_BackColor"]),this.uo=new Shader(e,h.gt,h.de),this.uo.th(["u_PerSize","u_Location","u_Eye","u_Dir","u_EyeSize"]),this.ro=e.createTexture()}dispose(){this.gi.deleteTexture(this.ro),this.oo?.dispose(),this.co?.dispose(),this.uo?.dispose()}Nl;Io(t,e){let l=this.vl.box,n=5e3,i=Math.abs(l[3]-l[0])+n,a=Math.abs(l[4]-l[1])+n,h=Math.abs(l[5]-l[2])+n,s=fromValues$2((l[0]+l[3])/2,(l[1]+l[4])/2,(l[2]+l[5])/2),o=fromValues$2(s[0],s[1],s[2]+h/2),r=lookAt(create$4(),o,s,[0,1,0]),c=i/2,u=a/2,g=t/e;g>1?c=u*g:u=c/g;let d=ortho(create$4(),-c,c,-u,u,10,h);this.Nl=multiply(create$4(),d,r)}oh(t,e){let l=z(this.vl).ql,n=l.gl,i=l.yh,a=l.Vh;n.bindFramebuffer(n.FRAMEBUFFER,i),pt(n,n.COLOR_ATTACHMENT0,t,e,this.ro,4),n.bindRenderbuffer(n.RENDERBUFFER,a),n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_COMPONENT32F,t,e),n.framebufferRenderbuffer(n.FRAMEBUFFER,n.DEPTH_ATTACHMENT,n.RENDERBUFFER,a),n.drawBuffers([n.COLOR_ATTACHMENT0])}Xh(){let t=z(this.vl).ql.gl;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0),t.bindFramebuffer(t.FRAMEBUFFER,null)}po(t,e){let l=this.gi,n=this.oo;n.ia();let i=z(this.vl).Rl.settings;if(i.fixed)t=i.width,e=i.height;else{let l=i.scale;t*=l,e*=l}this.oh(t,e),this.Io(t,e),l.uniformMatrix4fv(n.eh("u_Mvp"),!1,this.Nl),l.viewport(0,0,t,e),l.enable(l.DEPTH_TEST),l.disable(l.BLEND),l.clear(l.COLOR_BUFFER_BIT|l.DEPTH_BUFFER_BIT);let a=z(this.vl).ql;It(l,a.ph,l.TEXTURE1,n.eh("u_PointSampler")),l.uniform1ui(n.eh("u_PointSamplerSize"),a.Zh),It(l,a.Gh,l.TEXTURE2,n.eh("u_TransformSampler")),l.uniform1ui(n.eh("u_TransformSize"),a.mh),It(l,a.Xs,l.TEXTURE3,n.eh("u_FaceIdSampler")),It(l,a.dh,l.TEXTURE4,n.eh("u_TransformIndexSampler")),l.uniform1ui(n.eh("u_TriangleSize"),a.Ih),l.bindBuffer(l.ARRAY_BUFFER,a.rh),l.vertexAttribIPointer(0,1,l.UNSIGNED_INT,0,0),l.enableVertexAttribArray(0),a.Zo.Ki(),this.Xh()}Go(t,e){let l=this.gi,n=this.co;n.ia(),this.vl;let i=z(this.vl),a=i.ql;l.bindBuffer(l.ARRAY_BUFFER,a.quadBuffer),l.vertexAttribPointer(0,2,l.FLOAT,!1,0,0),l.enableVertexAttribArray(0),It(l,this.ro,l.TEXTURE0,n.eh("u_FaceIdSampler")),l.uniform2f(n.eh("u_PerSize"),1/t,1/e);let h=i.Rl.settings;l.uniform1i(n.eh("u_EdgeWidth"),h.edge_width),l.uniform4fv(n.eh("u_EdgeColor"),h.edge_color),l.uniform4fv(n.eh("u_BackColor"),h.background_color);let s=i.Rl.settings.x,o=i.Rl.settings.y;if(h.fixed){let t=h.width,e=h.height;l.uniform4f(n.eh("u_Rect"),s,o,t,e),l.viewport(s,o,t,e)}else{let a=i.Rl.settings.scale;l.uniform4f(n.eh("u_Rect"),s,o,a*t,a*e),l.viewport(s,o,a*t,a*e)}l.disable(l.DEPTH_TEST),l.enable(l.BLEND),l.blendFunc(l.SRC_ALPHA,l.ONE_MINUS_SRC_ALPHA),l.drawArrays(l.TRIANGLE_STRIP,0,4),l.disable(l.BLEND)}mo(t,l,n){let i=z(this.vl),a=i.Rl.eye,h=function(t,l,n,i){var a=new e(4);return a[0]=t,a[1]=l,a[2]=n,a[3]=i,a}(a[0],a[1],a[2],1);h=function(t,e,l){var n=e[0],i=e[1],a=e[2],h=e[3];return t[0]=l[0]*n+l[4]*i+l[8]*a+l[12]*h,t[1]=l[1]*n+l[5]*i+l[9]*a+l[13]*h,t[2]=l[2]*n+l[6]*i+l[10]*a+l[14]*h,t[3]=l[3]*n+l[7]*i+l[11]*a+l[15]*h,t}(create$2(),h,t);let s=fromValues$2(h[0],h[1],h[2]),o=h[3];s=scale(create$3(),s,1/o),s=scale(create$3(),s,.5),s=add(create$3(),s,[.5,.5,.5]),this.do=fromValues(s[0],s[1]);let r=i.Rl.settings,c=r.x,u=r.y,g=r.width,d=r.height,I=c+s[0]*g,p=u+s[1]*d;this.do=[I,p]}Co(t,e){let l=this.uo,n=this.gi;l.ia();let i=z(this.vl).Rl;n.uniform2f(l.eh("u_PerSize"),1/t,1/e),this.mo(this.Nl,t,e),n.uniform2fv(l.eh("u_Eye"),this.do),n.uniform2f(l.eh("u_Location"),i.settings.x,i.settings.y);let a=it(i).Fi;n.uniform2f(l.eh("u_Dir"),a[0],a[1]),n.uniform1f(l.eh("u_EyeSize"),3),n.enable(n.BLEND),n.disable(n.DEPTH_TEST),n.drawArrays(n.TRIANGLE_STRIP,0,4),n.disable(n.BLEND)}Ki(t,e){this.vl,this.po(t,e),this.Go(t,e),this.Co(t,e)}}class At{Fh;bo;fo;Wo;Xo;yo;vo;gh;Ih;Vo;constructor(t){this.Vo=t,this.Fh=t.createBuffer(),this.bo=t.createBuffer(),this.fo=t.createTexture(),this.Xo=t.createTexture(),this.vo=t.createTexture(),this.gh=t.createTexture()}Bo(t){let e=this.Vo,l=t.We,n=new Set,i=new Array,a=l.length,h=0,s=0;for(let t=0;t<a;t++){let e=l[t],a=e.geometry;h+=a.get_face_point_count(),n.has(a.id)||(n.add(a.id),i.push(a)),e.has_matrix&&s++}if(s>0){let t=Math.floor(Math.sqrt(4*s))+1,n=new Float32Array(t*t*4),i=1;for(let t=0;t<a;t++){let e=l[t];e.has_matrix?(n.set(e.Re,16*i),e.matrix_offset=i,i++):e.matrix_offset=0}e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,this.Xo),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,t,t,0,e.RGBA,e.FLOAT,n),this.yo=t}{let t=0;a=i.length;for(let e=0;e<a;e++){let l=i[e];l.offset=t,t+=l.pointCount}let l=Math.floor(Math.sqrt(t))+1,n=new Float32Array(l*l*3),h=0;for(let t=0;t<a;t++){let e=i[t];n.set(e.points,3*h),h+=e.pointCount}e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,this.fo),e.texImage2D(e.TEXTURE_2D,0,e.RGB32F,l,l,0,e.RGB,e.FLOAT,n),this.Wo=l}{let t=Math.floor(Math.sqrt(h/3))+1;this.Ih=t;let n=new Uint32Array(h),i=new Uint8Array(3*h),a=new Uint8Array(t*t*4),s=new Uint32Array(t*t),o=l.length,r=0,c=0;for(let t=0;t<o;t++){let e=l[t];e.start=r;let h=e.Ne??e.material.color,o=e.geometry,u=o.offset,g=o.faces,d=g.length;for(let t=0;t<d;t++){let l=g[t],o=l.indices,d=o.length;l.isPlanar||i.set(l.normals,3*r);for(let t=0;t<d;t+=3){if(n[r]=u+o[t],n[r+1]=u+o[t+1],n[r+2]=u+o[t+2],l.isPlanar){let t=l.normals;i.set(t,3*r),i.set(t,3*(r+1)),i.set(t,3*(r+2))}a.set(h,4*c),s[c]=e.matrix_offset,r+=3,c++}}e.length=r-e.start}e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,this.gh),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,t,t,0,e.RGBA,e.UNSIGNED_BYTE,a),e.bindTexture(e.TEXTURE_2D,this.vo),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,t,t,0,e.RED_INTEGER,e.UNSIGNED_INT,s),e.bindBuffer(e.ARRAY_BUFFER,this.Fh),e.bufferData(e.ARRAY_BUFFER,n,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,this.bo),e.bufferData(e.ARRAY_BUFFER,i,e.STATIC_DRAW)}}}class Nt{ql;Yo;So=new Int32Array(0);To=new Int32Array(0);wo=0;Ro=new Int32Array(0);Ao=new Int32Array(0);No=0;ko;constructor(t,e=null){this.ql=t;let l=t.gl;this.ko=e,this.Yo=l.getExtension("WEBGL_multi_draw")}dispose(){}fh(){if(0==this.wo)return;let t=this.ql.gl;this.Yo.multiDrawArraysWEBGL(t.TRIANGLES,this.So,0,this.To,0,this.wo)}Wh(){if(0==this.No)return;let t=this.ql.gl;this.Yo.multiDrawArraysWEBGL(t.TRIANGLES,this.Ro,0,this.Ao,0,this.No)}Kn(t){t&&0!=t.length||(this.So=new Int32Array(0),this.To=new Int32Array(0),this.Ro=new Int32Array(0),this.Ao=new Int32Array(0),this.wo=0,this.No=0);let e=0,l=0,n=t.length;for(let i=0;i<n;i++){let n=t[i].We,a=n.length;for(let t=0;t<a;t++){n[t].is_transparent()?l++:e++}}let i=new Int32Array(e),a=new Int32Array(e),h=0,s=new Int32Array(l),o=new Int32Array(l),r=0;for(let e=0;e<n;e++){let l=t[e].We,n=l.length;for(let t=0;t<n;t++){let e=l[t];e.is_transparent()?(s[r]=e.start,o[r]=e.length,r++):(i[h]=e.start,a[h]=e.length,h++)}}let c=kt(i,a);this.So=new Int32Array(c.r_list),this.To=new Int32Array(c.r_count),this.wo=c.r_list.length,c=kt(s,o),this.Ro=new Int32Array(c.r_list),this.Ao=new Int32Array(c.r_count),this.No=c.r_list.length}}function kt(t,e){let l=t.length,n=[],i=[];for(let a=0;a<l;a++){let h=t[a];n.push(h);let s=e[a];for(let n=a+1;n<l;n++){if(h+s!=t[n])break;s+=e[n],a++}if(i.push(s),a==l-1)break}return{r_list:n,r_count:i}}class Kt{Vo;Ko;jh;Ks;Ns;ks;Mo;Ho;Fs;Oh;As;Fo;zo;xo;Eo;Lo;Jo;Uo;il;Po;Mn;Do=!1;ql;Oo=create$4();yh;Vh;Qo;_o;jo;qo;constructor(t){this.Vo=t.ql.gl,this.il=t,this.Mn=new Nt(t.ql),this.ql=new At(this.Vo),this.Po=this.Vo.createTexture(),this.yh=this.Vo.createFramebuffer(),this.Vh=this.Vo.createRenderbuffer(),this._o=this.$o.bind(this),t.cl.subscribe("prompting",this._o),this.jo=this.tr.bind(this),this.qo=this.er.bind(this)}Un=0;tr(t,e){let l=performance.now();if(this.Un,this.Un=l,e&&e.detail){let t=this.il.yn(e.detail),l=t.ml,n=t.fl,i=this.il.fn.bl(l,n);if(i){let t=this.il.pl;Z.in_side(t,i)?(this.lr(i),this.Qo=i,this.Do=!0):(this.Qo=null,this.Do=!1)}else this.Qo=null,this.Do=!1}else this.Do=!1;this.il.He=!0}er(t,e){this.Qo&&this.il.cl.publish("pick_point",this.Qo)}nr(){this.Ko=new Shader(this.Vo,h.ut,h.ct),this.Ko.ia();let t=this.Ko.$a,e=this.Vo;this.jh=e.getUniformLocation(t,"u_PointSampler"),this.Ks=e.getUniformLocation(t,"u_PointSamplerSize"),this.Ns=e.getUniformLocation(t,"u_TransformSampler"),this.ks=e.getUniformLocation(t,"u_TransformSize"),this.Ho=e.getUniformLocation(t,"u_TransformIndicesSampler"),this.Mo=e.getUniformLocation(t,"u_ColorSampler"),this.Fs=e.getUniformLocation(t,"u_TriangleSize"),this.Oh=e.getUniformLocation(t,"u_Mvp"),this.As=e.getUniformLocation(t,"u_ViewMatrix"),this.Fo=e.getUniformLocation(t,"u_ModelMatrix"),this.zo=e.getUniformLocation(t,"u_Near"),this.xo=e.getUniformLocation(t,"u_Far"),this.Eo=e.getUniformLocation(t,"u_LightColor"),this.Lo=e.getUniformLocation(t,"u_LightDirection"),this.Jo=e.getUniformLocation(t,"u_AmbientColor"),this.Uo=e.getUniformLocation(t,"u_Eye")}ir=create$3();ar=create$3();hr=create$3();sr=create$4();yn(t){let e=t.target,l=e.getBoundingClientRect(),n=this.il,i=n.zl,a=e.height,h=e.width,s=(t.clientX-l.left)/1/h*2-1,o=(l.height-(t.clientY-l.top)/1)/a*2-1,r=scale(this.ir,i.getEyeDir(),-1);this.ar[0]=s,this.ar[1]=o,this.ar[2]=-1;let c=invert(this.sr,n.Nl);return{p:transformMat4$1(this.hr,this.ar,c),direction:r}}lr(t){this.Oo=fromTranslation(this.Oo,t)}$o(t){null!=t?(this.ql.Bo(t),this.Mn.Kn([t]),this.il.Wn("mousemove",this.jo),this.il.Wn("mouseup",this.qo)):(this.il.Xn("mousemove",this.jo),this.il.Xn("mouseup",this.qo),this.Do=!1)}Ki(t,e){this.Ko.ia();let l=this.Vo,n=this.il,i=this.ql,a=n.ql.yh,h=n.ql.Vh;l.bindFramebuffer(l.FRAMEBUFFER,a),pt(l,l.COLOR_ATTACHMENT0,t,e,this.Po,4),l.bindRenderbuffer(l.RENDERBUFFER,h),l.renderbufferStorage(l.RENDERBUFFER,l.DEPTH_COMPONENT32F,t,e),l.framebufferRenderbuffer(l.FRAMEBUFFER,l.DEPTH_ATTACHMENT,l.RENDERBUFFER,h),l.drawBuffers([l.COLOR_ATTACHMENT0]),It(l,i.fo,l.TEXTURE1,this.jh),l.uniform1ui(this.Ks,i.Wo),It(l,i.Xo,l.TEXTURE2,this.Ns),l.uniform1ui(this.ks,i.yo),It(l,i.gh,l.TEXTURE3,this.Mo),It(l,i.vo,l.TEXTURE4,this.Ho),l.uniform1ui(this.Fs,i.Ih),l.uniformMatrix4fv(this.Oh,!1,n.Nl),l.uniformMatrix4fv(this.As,!1,n.kl),l.uniformMatrix4fv(this.Fo,!1,this.Oo),l.uniform1f(this.zo,n.Ml),l.uniform1f(this.xo,n.Hl),l.uniform3fv(this.Eo,n.Al.color.to_float3_color()),l.uniform3fv(this.Lo,n.Al.ze),l.uniform3fv(this.Jo,n.Gn.to_float3_color()),l.uniform3fv(this.Uo,n.zl.eye),l.bindBuffer(l.ARRAY_BUFFER,i.Fh),l.vertexAttribIPointer(0,1,l.UNSIGNED_INT,0,0),l.enableVertexAttribArray(0),l.bindBuffer(l.ARRAY_BUFFER,i.bo),l.vertexAttribIPointer(1,3,l.UNSIGNED_BYTE,0,0),l.enableVertexAttribArray(1),l.viewport(0,0,t,e),l.clearColor(0,0,0,0),l.clear(l.COLOR_BUFFER_BIT|l.DEPTH_BUFFER_BIT),this.Do&&(l.enable(l.DEPTH_TEST),l.disable(l.BLEND),l.depthMask(!0),this.Mn.fh(),l.depthMask(!1),l.enable(l.BLEND),this.Mn.Wh(),l.depthMask(!0),l.disable(l.BLEND)),l.disableVertexAttribArray(0),l.disableVertexAttribArray(1),l.framebufferTexture2D(l.FRAMEBUFFER,l.COLOR_ATTACHMENT0,l.TEXTURE_2D,null,0),l.bindFramebuffer(l.FRAMEBUFFER,null)}}class Mt{gi=null;nh=null;vl;rr;jh;Ks;Ns;ks;cr;Ho;Mo;Fs;Oh;As;zo;xo;Eo;Lo;Jo;Uo;ur=new Int32Array(0);gr=new Int32Array(0);Yo;dr;constructor(t){this.vl=t,this.gi=t.ql.gl,this.Yo=this.gi.getExtension("WEBGL_multi_draw"),this.rr=this.gi.createTexture(),this.dr=this.Ir.bind(this),t.cl.subscribe("select_changed",this.dr)}nr(){let t=this.gi;this.nh=new Shader(t,h.Rt,h.wt),this.nh.ia();let e=this.nh.$a;this.jh=t.getUniformLocation(e,"u_PointSampler"),this.Ks=t.getUniformLocation(e,"u_PointSamplerSize"),this.Ns=t.getUniformLocation(e,"u_TransformSampler"),this.ks=t.getUniformLocation(e,"u_TransformSize"),this.Ho=t.getUniformLocation(e,"u_TransformIndicesSampler"),this.cr=t.getUniformLocation(e,"u_HighlightColor"),this.Fs=t.getUniformLocation(e,"u_TriangleSize"),this.Oh=t.getUniformLocation(e,"u_Mvp"),this.As=t.getUniformLocation(e,"u_ViewMatrix"),this.zo=t.getUniformLocation(e,"u_Near"),this.xo=t.getUniformLocation(e,"u_Far"),this.Eo=t.getUniformLocation(e,"u_LightColor"),this.Lo=t.getUniformLocation(e,"u_LightDirection"),this.Jo=t.getUniformLocation(e,"u_AmbientColor"),this.Uo=t.getUniformLocation(e,"u_Eye")}Ki(t,e){const l=this.ur.length;if(0==l)return;let n=this.gi,i=this.vl,a=i.ql;this.nh.ia(),It(n,a.ph,n.TEXTURE1,this.jh),n.uniform1ui(this.Ks,a.Zh),It(n,a.Gh,n.TEXTURE2,this.Ns),n.uniform1ui(this.ks,a.mh),It(n,a.gh,n.TEXTURE3,this.Mo),It(n,a.dh,n.TEXTURE4,this.Ho),n.uniform4fv(this.cr,i.Ql.to_float4_color()),n.uniform1ui(this.Fs,a.Ih),n.uniformMatrix4fv(this.Oh,!1,i.Nl),n.uniformMatrix4fv(this.As,!1,i.kl),n.uniform1f(this.zo,i.Ml),n.uniform1f(this.xo,i.Hl),n.uniform3fv(this.Eo,i.Al.color.to_float3_color()),n.uniform3fv(this.Lo,i.Al.ze),n.uniform3fv(this.Jo,i.Gn.to_float3_color()),n.uniform3fv(this.Uo,i.zl.eye),n.bindBuffer(n.ARRAY_BUFFER,a.rh),n.vertexAttribIPointer(0,1,n.UNSIGNED_INT,0,0),n.enableVertexAttribArray(0),n.bindBuffer(n.ARRAY_BUFFER,a.uh),n.vertexAttribIPointer(1,3,n.UNSIGNED_BYTE,0,0),n.enableVertexAttribArray(1),n.viewport(0,0,t,e),n.enable(n.DEPTH_TEST),n.depthMask(!1),n.enable(n.BLEND),n.depthFunc(n.ALWAYS),n.blendFunc(n.SRC_ALPHA,n.ONE_MINUS_SRC_ALPHA),this.Yo.multiDrawArraysWEBGL(n.TRIANGLES,this.ur,0,this.gr,0,l),n.disable(n.CULL_FACE),n.depthMask(!0),n.disable(n.BLEND),n.enable(n.DEPTH_TEST),n.depthFunc(n.LESS),n.disableVertexAttribArray(0),n.disableVertexAttribArray(1)}Ir(t){if(!t||0==t.length)return this.ur=new Int32Array(0),void(this.gr=new Int32Array(0));let e=0,l=t.length;for(let n=0;n<l;n++){const l=t[n];l.select_mode==p.element?e+=l.element.instances.length:(l.select_mode==p.instance||l.select_mode==p.face)&&(e+=1)}let n=new Int32Array(e),i=new Int32Array(e),a=0;for(let e=0;e<l;e++){let l=t[e];if(l.select_mode==p.element){let l=r(t[e].element).We,h=l.length;for(let t=0;t<h;t++){let e=l[t];n[a]=e.start,i[a]=e.length,a++}}else if(l.select_mode==p.instance){let t=g(l.instance);n[a]=t.start,i[a]=t.length,a++}else l.select_mode==p.face&&(n[a]=l.face.start,i[a]=l.face.length,a++)}let h=kt(n,i);this.ur=new Int32Array(h.r_list),this.gr=new Int32Array(h.r_count),this.vl.He=!0}}class Ht{vl;gi;pr=null;Zr=null;Gr=null;mr=null;Cr=null;br=null;Wr=null;Xr=null;yr=null;Wl=null;nh=null;u_OpacitySampler=null;u_OpacityEdgeSampler=null;u_TransparentSampler=null;u_TransparentEdgeSampler=null;u_OutlineSampler=null;u_BloomSampler=null;u_Bloom=null;u_AnimationSampler=null;u_Animation=null;u_PointSampler=null;u_PerSize=null;u_Exposure=null;u_MarqueeSampler=null;u_Marquee=null;u_PromptSampler=null;shaderInited=!1;constructor(t){this.vl=t;let e=z(t);this.gi=e.ql.gl,this.Wl=e.ql.quadBuffer,this.pr=new Yt(t),this.Zr=new wt(t),this.mr=new ft(t),this.Gr=new mt(t),this.Cr=new St(t),this.br=new Wt(t),this.Wr=new Rt(t),this.Xr=new Kt(e),this.Xr.nr(),this.yr=new Mt(e),this.yr.nr(),this.nh=new Shader(this.gi,h.gt,h.rt)}dispose(){this.pr?.dispose(),this.Zr?.dispose(),this.mr?.dispose(),this.Gr?.dispose(),this.Cr?.dispose(),this.nh?.dispose(),this.br?.dispose(),this.Wr?.dispose()}get Name(){return"post"}Dh(){this.nh.ia(),this.shaderInited||(Zt(this.gi,this.nh.$a,this),this.shaderInited=!0)}Ki(t,e){let l=this.gi,n=this.vl,i=R(n.bloom_manager).Vl;n.changed&&(this.pr.Ki(t,e),this.Zr.Ki(t,e,this.pr.us),this.Cr.Ki(t,e),i&&this.mr.Ki(t,e,this.pr.us));let a,h=this.pr.us;n.animation_manager.ki&&this.Gr.Ki(t,e,h),n.marquee_manager.hasMarquee&&(a=this.br.Ki(t,e,h)),this.Xr.Ki(t,e),this.Dh(),n.animation_manager.ki?(It(l,this.Gr.hh,l.TEXTURE7,this.u_AnimationSampler),l.uniform1f(this.u_Animation,1)):l.uniform1f(this.u_Animation,0),i&&n.changed?(It(l,this.mr.kh,l.TEXTURE8,this.u_BloomSampler),l.uniform1i(this.u_Bloom,1)):l.uniform1i(this.u_Bloom,0),n.marquee_manager.hasMarquee?(It(l,a,l.TEXTURE9,this.u_MarqueeSampler),l.uniform1f(this.u_Marquee,1)):l.uniform1f(this.u_Marquee,0),It(l,this.Xr.Po,l.TEXTURE10,this.u_PromptSampler),this.vr(l,t,e),this.yr.Ki(t,e),z(n).Rl.isRunning&&this.Wr.Ki(t,e)}vr(t,e,l){let n=this.vl;It(t,this.pr.hh,t.TEXTURE1,this.u_OpacitySampler),It(t,this.pr.us,t.TEXTURE2,this.u_PointSampler),It(t,this.Zr.hh,t.TEXTURE3,this.u_TransparentSampler),It(t,this.pr.Ls,t.TEXTURE4,this.u_OpacityEdgeSampler),It(t,this.Zr.Ls,t.TEXTURE5,this.u_TransparentEdgeSampler),It(t,this.Cr.hh,t.TEXTURE6,this.u_OutlineSampler),t.uniform2f(this.u_PerSize,1/e,1/l),t.uniform1f(this.u_Exposure,n.exposure),t.viewport(0,0,e,l),t.clearColor(0,0,0,1),t.clearDepth(1),t.enable(t.DEPTH_TEST),t.depthFunc(t.LEQUAL),t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT),t.bindBuffer(t.ARRAY_BUFFER,this.Wl),t.vertexAttribPointer(0,2,t.FLOAT,!1,0,0),t.enableVertexAttribArray(0),t.drawArrays(t.TRIANGLE_STRIP,0,4),t.depthFunc(t.LESS)}}var Ft="data:image/png;base64,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";class Skybox{scene;max;min;radius;gl;vsShader;fsShader;program;pointBuffer;vuBuffer;texture;vs;fs;a_PointId;a_UvId;u_Mvp;u_Radius;u_Sampler;img=new Image;imgLoaded=!1;isRunning=!1;constructor(){this.vs=h.Et,this.fs=h.xt}dispose(){this.gl}points=new Float32Array([2,0,1,2,3,0,7,4,5,7,5,6,7,2,1,7,1,6,0,3,4,0,4,5,0,6,1,0,5,6,4,3,2,4,2,7]);vus=new Float32Array([3,9,8,3,4,9,6,5,10,6,10,11,6,7,12,6,12,11,9,4,5,9,5,10,9,14,13,9,10,14,5,4,1,5,1,2]);initShader(){let t=this.gl,e=t.createShader(t.VERTEX_SHADER);t.shaderSource(e,this.vs),t.compileShader(e);let l=t.getShaderParameter(e,t.COMPILE_STATUS);if(!l){var n=t.getShaderInfoLog(e);return console.log("Failed to compile shader: "+n),void t.deleteShader(e)}this.vsShader=e;let i=t.createShader(t.FRAGMENT_SHADER);if(t.shaderSource(i,this.fs),t.compileShader(i),l=t.getShaderParameter(i,t.COMPILE_STATUS),!l){n=t.getShaderInfoLog(i);return console.log("Failed to compile shader: "+n),void t.deleteShader(e)}this.fsShader=i;let a=t.createProgram();if(t.attachShader(a,e),t.attachShader(a,i),t.linkProgram(a),!t.getProgramParameter(a,t.LINK_STATUS)){let l=t.getProgramInfoLog(a);return console.log("Failed to link program: "+l),t.deleteProgram(a),t.deleteShader(i),void t.deleteShader(e)}this.program=a,t.useProgram(this.program),this.pointBuffer=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,this.pointBuffer),t.bufferData(t.ARRAY_BUFFER,this.points,t.STATIC_DRAW),this.vuBuffer=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,this.vuBuffer),t.bufferData(t.ARRAY_BUFFER,this.vus,t.STATIC_DRAW),this.a_PointId=t.getAttribLocation(a,"a_PointId"),t.enableVertexAttribArray(this.a_PointId),this.a_UvId=t.getAttribLocation(a,"a_UvId"),t.enableVertexAttribArray(this.a_UvId),this.u_Mvp=t.getUniformLocation(a,"u_Mvp"),this.u_Radius=t.getUniformLocation(a,"u_Radius"),this.u_Sampler=t.getUniformLocation(a,"u_SkySampler")}active(){let t=this.gl;t.useProgram(this.program),t.bindBuffer(t.ARRAY_BUFFER,this.pointBuffer),t.vertexAttribPointer(this.a_PointId,1,t.FLOAT,!1,0,0),t.bindBuffer(t.ARRAY_BUFFER,this.vuBuffer),t.vertexAttribPointer(this.a_UvId,1,t.FLOAT,!1,0,0),t.activeTexture(t.TEXTURE5),t.bindTexture(t.TEXTURE_2D,this.texture),t.uniform1i(this.u_Sampler,5)}init(t){this.scene=t;let e=_(t),l=z(t.scene_context);this.radius=1.1*l.zl.radius,this.gl=e.gi,this.img.src=Ft,this.img.onload=()=>{let t=this.gl;this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!0),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,this.img),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR_MIPMAP_NEAREST),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!1),this.initShader(),this.imgLoaded=!0,this.scene.scene_context.changed=!0}}onBeforeDraw(){}onAfterDraw(){if(this.isRunning&&this.imgLoaded){this.active();let t=this.gl;t.enable(t.DEPTH_TEST),t.disable(t.BLEND),t.uniformMatrix4fv(this.u_Mvp,!1,this.getMvp()),t.uniform1f(this.u_Radius,this.radius);let e=_(this.scene).Fl;t.viewport(0,0,e.width,e.height),t.drawArrays(t.TRIANGLES,0,36)}}start(){this.isRunning=!0}stop(){this.isRunning=!1}getMvp(){let t=z(this.scene.scene_context).zl,e=t.theta,l=t.phi,n=fromValues$2(0,0,1),i=fromValues$2(0,0,0),a=rotateY(create$3(),n,i,e);a=rotateZ(create$3(),a,i,l);let h=scale(create$3(),a,this.radius/2),s=fromValues$2(-1,0,0);s=rotateY(create$3(),s,i,e),s=rotateZ(create$3(),s,i,l);let o=s,r=lookAt(create$4(),h,fromValues$2(0,0,0),o),c=this.radius/2,u=ortho(create$4(),-c,c,-c,c,c,10*c);return multiply(create$4(),u,r)}}const zt="#A42CAD";class xt{Vr;Br;wl;Yr=!1;na=!1;Sr;Tr;constructor(){this.Sr=(t,e)=>{this.tr(t,e)},this.Tr=(t,e)=>{this.er(t,e)}}nr(t){this.wl=t,t.scene_context}wr(){if(this.na&&this.Vr){let t=this.wl,e=this.Vr,l=t.scene_context.get_screen_point(e.point),n=l[0],i=l[1],a=_(t).mi;switch(e.type){case"center":!function(t,e,l){t.resetTransform(),t.beginPath(),t.arc(e,l,10,0,2*Math.PI),t.lineWidth=2,t.strokeStyle=zt,t.stroke()}(a,n,i);break;case"middle":!function(t,e,l){t.resetTransform(),t.beginPath();let n=20/3;t.moveTo(e-10,l+n),t.lineTo(e+10,l+n),t.lineTo(e,l-10),t.lineTo(e-10,l+n),t.lineWidth=2,t.strokeStyle=zt,t.stroke()}(a,n,i);break;case"endpoint":!function(t,e,l){t.resetTransform(),t.beginPath(),t.rect(e-10,l-10,20,20),t.lineWidth=2,t.strokeStyle=zt,t.stroke()}(a,n,i);break;case"subpoint":!function(t,e,l){t.resetTransform(),t.beginPath();let n=10;t.moveTo(e-n,l-n),t.lineTo(e+n,l+n),t.moveTo(e-n,l+n),t.lineTo(e+n,l-n),t.lineWidth=2,t.strokeStyle=zt,t.stroke()}(a,n,i)}this.Yr=!0}}zn(){if(!this.na){this.na=!0;let t=this.wl.scene_context;t.add_event_listener("mousemove",this.Sr),t.add_event_listener("mouseclick",this.Tr)}}En(){if(this.na){this.na=!1;let t=this.wl.scene_context;t.remove_event_listener("mousemove",this.Sr),t.remove_event_listener("mouseclick",this.Tr)}}Th(){}Rr;tr(t,e){window.clearTimeout(this.Rr),window.setTimeout((()=>{this.Ar(t)}),100)}Ar(t){let e=z(t).Fl.getBoundingClientRect(),l=_(t.scene),n=z(t),i=l.Ii.pa,a=i[0],h=e.height-i[1],s=n.$l.za(a,h,p.point);if(s&&s.point){this.Br=s;let e=function(t){if(!t.instance&&!t.face)return null;let e,l=t.face_index,n=g(t.instance),i=n.geometry,a=i.faces[l],h=t.point,s=n.Re;if(s){let t=invert(create$4(),s);e=transformMat4$1(create$3(),h,t)}else e=h;let o=i.get_face_center(l);if(distance$1(o,e)<20){let t;return t=s?transformMat4$1(create$3(),o,s):o,new SnapResult("center",t)}if(a){let t=a.get_geometry_line(),l=t.length;for(let n=0;n<l;n++){let l=t[n].get_line(i).get_snap_point(e,20);if(null!=l)return s&&(l.point=transformMat4$1(create$3(),l.point,s)),l}}return null}(s);this.Vr=e,e?t.changed=!0:this.Yr&&(t.changed=!0,this.Yr=!1)}else this.Br=null,this.Vr=null,this.Yr&&(t.changed=!0,this.Yr=!1)}er(t,e){if(this.Vr){let e=this.Br;e.point=this.Vr.point,F(t,"select",new CustomEvent("select",{detail:e}))}else{let e=this.Br;F(t,"select",new CustomEvent("select",{detail:e}))}}}const Et=new WeakMap;class SnapPoint{constructor(){Et.set(this,new xt)}init(t){Et.get(this).nr(t)}onBeforeDraw(){}onAfterDraw(){Et.get(this).wr()}start(){Et.get(this).zn()}stop(){Et.get(this).En()}dispose(){}}class IndexedDB{Nr;kr;Kr;Mr;constructor(t,e,l){this.kr=t,this.Kr=e,this.Mr=l}async open(){let t=this;return await new Promise((e=>{let l=indexedDB.open(this.kr);l.onerror=t=>{e(!1)},l.onupgradeneeded=t=>{t.target.result.createObjectStore(this.kr,{keyPath:this.Kr})},l.onsuccess=l=>{let n=l.target;t.Nr=n.result,e(!0)}}))}async add(t){return await new Promise((e=>{let l=this.Nr.transaction(this.kr,"readwrite"),n=l.objectStore(this.kr);if(l.oncomplete=()=>{e(!0)},l.onerror=t=>{e(!1)},this.Mr)if(Array.isArray(t)){let e=t.length;for(let l=0;l<e;l++){let e=t[l];n.add(this.Mr?.toDb(e))}}else n.add(this.Mr?.toDb(t));else if(Array.isArray(t)){let e=t.length;for(let l=0;l<e;l++){let e=t[l];n.add(e)}}else n.add(t);l.commit()}))}async set(t){return await new Promise((e=>{let l=this.Nr.transaction(this.kr,"readwrite"),n=l.objectStore(this.kr);if(l.oncomplete=()=>{e(!0)},l.onerror=t=>{e(!1)},this.Mr)if(Array.isArray(t)){let e=t.length;for(let l=0;l<e;l++){let e=t[l];n.put(this.Mr?.toDb(e))}}else n.put(this.Mr?.toDb(t));else if(Array.isArray(t)){let e=t.length;for(let l=0;l<e;l++){let e=t[l];n.put(e)}}else n.put(t);l.commit()}))}async get(t){return await new Promise((e=>{let l=this.Nr.transaction(this.kr,"readwrite").objectStore(this.kr).get(t);l.onsuccess=t=>{let l=t.target;e(l.result)},l.onerror=t=>{e(null)}}))}async getAll(){return await new Promise((t=>{let e=this.Nr.transaction(this.kr,"readwrite").objectStore(this.kr).getAll();e.onsuccess=l=>{let n=e.result,i=n.length,a=new Array(i);for(let t=0;t<i;t++)a[t]=n[t];t(a)},e.onerror=e=>{t([])}}))}async getRest(t){return await new Promise((e=>{let l=this.Nr.transaction(this.kr,"readwrite").objectStore(this.kr),n=IDBKeyRange.upperBound(t,!1),i=l.getAll(n);i.onsuccess=t=>{let l=i.result,n=l.length,a=new Array(n);for(let t=0;t<n;t++)a[t]=l[t];e(a)},i.onerror=t=>{e([])}}))}async delete(t){return await new Promise((e=>{let l=this.Nr.transaction(this.kr,"readwrite").objectStore(this.kr).delete(t);l.onsuccess=t=>{e(!0)},l.onerror=t=>{e(!1)}}))}async clear(){return await new Promise((t=>{let e=this.Nr.transaction(this.kr,"readwrite").objectStore(this.kr).clear();e.onsuccess=e=>{t(!0)},e.onerror=e=>{t(!1)}}))}close(){this.Nr.close()}}class Storey{id;index;name;elevation;constructor(t,e,l,n){this.id=t,this.index=e,this.name=l,this.elevation=n}}new TextEncoder;class Lt{gi;Hr=new Int32Array(0);Fr=new Int32Array(0);zr=0;Er=null;Yo=null;ko;constructor(t,e){this.gi=t.gl,this.Er=t,this.ko=e,this.Yo=this.gi.getExtension("WEBGL_multi_draw")}Mh(){let t=this.gi;0!=this.zr&&this.Yo.multiDrawArraysWEBGL(t.TRIANGLES,this.Hr,0,this.Fr,0,this.zr)}Kn(t){let e=0,l=t.length;for(let n=0;n<l;n++){e+=t[n].We.length}let n=new Int32Array(e),i=new Int32Array(e),a=0;for(let e=0;e<l;e++){let l=t[e].We,h=l.length;for(let t=0;t<h;t++){let e=l[t];n[a]=e.start,i[a]=e.length,a++}}let h=kt(n,i);this.Hr=new Int32Array(h.r_list),this.Fr=new Int32Array(h.r_count),this.zr=this.Hr.length}dispose(){}}class Jt{Lr=new Float32Array(0);Jr=new Uint8Array(0);Ur=new Float32Array(0);Pr=new Float32Array(0);gi;Dr;get Fh(){return this.Dr}Or;get zh(){return this.Or}Qr;get xh(){return this.Qr}_r;get ref_point_buffer(){return this._r}jr=-1;qr=100;$r=0;get Eh(){if(-1==this.jr)this.jr=performance.now();else{let t=performance.now();t-this.jr>25&&(this.$r+=(t-this.jr)/this.qr*Math.PI,this.jr=t)}return this.$r}get Lh(){return this.Lr.length/3}constructor(t){this.gi=t,this.Dr=t.createBuffer(),this.Or=t.createBuffer(),this.Qr=t.createBuffer(),this._r=t.createBuffer()}dispose(){let t=this.gi;t.deleteBuffer(this.Dr),t.deleteBuffer(this.Or),t.deleteBuffer(this.Qr),t.deleteBuffer(this._r)}add_segment(t,e,n,i,a){let h=l(create$3(),e,t);h=normalize$2(h,h);let s=cross(create$3(),n,h);s=normalize$2(s,s);let o=i/2,r=add(create$3(),t,scale(create$3(),s,o)),c=add(create$3(),e,scale(create$3(),s,o)),u=add(create$3(),t,scale(create$3(),s,-o)),g=add(create$3(),e,scale(create$3(),s,-o)),d=this.Lr.length,I=new Float32Array(d+18),p=new Uint8Array(d+18),Z=new Float32Array(d+18),G=new Float32Array(d+18);for(let t=0;t<d;t++)I[t]=this.Lr[t],p[t]=this.Jr[t],Z[t]=this.Ur[t],G[t]=this.Pr[t];let m=[...r,...u,...c,...c,...u,...g];I.set(m,d),m=[...a,...a,...a,...a,...a,...a],p.set(m,d),m=[...t,...t,...t,...t,...t,...t],G.set(m,d),m=[...h,...h,...h,...h,...h,...h],Z.set(m,d),this.Lr=I,this.Jr=p,this.Ur=Z,this.Pr=G}commit(){let t=this.gi;t.bindBuffer(t.ARRAY_BUFFER,this.Dr),t.bufferData(t.ARRAY_BUFFER,this.Lr,t.STATIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,this.Or),t.bufferData(t.ARRAY_BUFFER,this.Jr,t.STATIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,this.Qr),t.bufferData(t.ARRAY_BUFFER,this.Ur,t.STATIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,this._r),t.bufferData(t.ARRAY_BUFFER,this.Pr,t.STATIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,null)}clear(){this.Lr=new Float32Array(0),this.Jr=new Uint8Array(0),this.Ur=new Float32Array(0),this.Pr=new Float32Array(0),this.jr=-1}}class Ut{Yo;tc=new Int32Array(0);ec=new Int32Array(0);lc=0;Er;constructor(t){this.Er=t;let e=t.gl;this.Yo=e.getExtension("WEBGL_multi_draw")}Ki(){let t=this.Er.gl;0!=this.lc&&this.Yo.multiDrawArraysWEBGL(t.TRIANGLES,this.tc,0,this.ec,0,this.lc)}Kn(t){let e=t.length,l=0;for(let n=0;n<e;n++){l+=t[n].We.length}let n=new Int32Array(l),i=new Int32Array(l),a=0;for(let l=0;l<e;l++){let e=t[l].We,h=e.length;for(let t=0;t<h;t++){let l=e[t];n[a]=l.start,i[a]=l.length,a++}}let h=kt(n,i);this.tc=new Int32Array(h.r_list),this.ec=new Int32Array(h.r_count),this.lc=this.tc.length}dispose(){}}class Pt{gi=null;nc=new Int32Array(0);ac=new Int32Array(0);Pe=0;Yo;constructor(t){this.gi=t,this.Yo=t.getExtension("WEBGL_multi_draw")}Kn(t){if(!t||0==t.length)return this.Pe=0,this.nc=new Int32Array(0),void(this.ac=new Int32Array(0));let e=0,l=t.length;for(let n=0;n<l;n++)e+=t[n].We.length;let n=new Int32Array(e),i=new Int32Array(e),a=0;for(let e=0;e<l;e++){let l=t[e].We,h=l.length;for(let t=0;t<h;t++){let e=l[t];n[a]=e.start,i[a]=e.length,a++}}let h=kt(n,i);this.nc=new Int32Array(h.r_list),this.ac=new Int32Array(h.r_count),this.Pe=this.nc.length}Ki(){if(0==this.Pe)return;let t=this.gi;this.Yo.multiDrawArraysWEBGL(t.TRIANGLES,this.nc,0,this.ac,0,this.Pe)}}class Dt{hc=0;set yi(t){this.hc=t}get yi(){return this.hc}sc;oc;rc=0;cc=0;ph=null;Zh=0;Gh=null;mh=0;rh=null;uh=null;Ih=0;dh=null;gh=null;uc=null;io=null;Xs=null;Us=null;gl=null;gc=null;get quadBuffer(){if(null==this.gc){let t=this.gl;this.gc=t.createBuffer();let e=new Float32Array([-1,1,-1,-1,1,1,1,-1]);t.bindBuffer(t.ARRAY_BUFFER,this.gc),t.bufferData(t.ARRAY_BUFFER,e,t.STATIC_DRAW)}return this.gc}dc;get Zo(){return this.dc}Yh=null;get yh(){return null==this.Yh&&(this.Yh=this.gl.createFramebuffer()),this.Yh}Sh=null;get Vh(){return null==this.Sh&&(this.Sh=this.gl.createRenderbuffer()),this.Sh}Ic=null;get Zc(){if(null==this.Ic){let t=this.gl,e=t.createSampler();t.samplerParameteri(e,t.TEXTURE_MAG_FILTER,t.NEAREST),t.samplerParameteri(e,t.TEXTURE_MIN_FILTER,t.NEAREST),t.samplerParameteri(e,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.samplerParameteri(e,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.Ic=e}return this.Ic}Hn;Vs;Mn;Fn;Ch=[];Hh;constructor(t){this.gl=t,this.Mn=new Nt(this,"draw"),this.Fn=new Lt(this,"bloom"),this.Hh=new Jt(t),this.dc=new Pt(t),this.Hn=new Ut(this),this.Vs=new Nt(this,"busy"),this.cc=t.getParameter(t.MAX_TEXTURE_SIZE)}dispose(){let t=this.gl;t.deleteTexture(this.ph),t.deleteTexture(this.Gh),t.deleteTexture(this.gh),t.deleteBuffer(this.rh),t.deleteBuffer(this.uh),t.deleteTexture(this.dh),t.deleteTexture(this.gh),t.deleteTexture(this.uc),t.deleteTexture(this.io),t.deleteTexture(this.io),t.deleteTexture(this.Xs),t.deleteTexture(this.Us),t.deleteBuffer(this.gc),t.deleteSampler(this.Ic),t.deleteFramebuffer(this.Yh),t.deleteRenderbuffer(this.Sh),this.Mn?.dispose(),this.Fn?.dispose(),this.Ch?.forEach((t=>t?.dispose())),this.Hh?.dispose(),this.Hn?.dispose(),this.Vs?.dispose()}Sn(t){let e=this.gl,l=t.matrix_offset-1,n=this.mh;e.bindTexture(e.TEXTURE_2D,this.Gh),Gt(e);let i=4*l,a=Math.floor(i/n),h=i-a*n;e.texSubImage2D(e.TEXTURE_2D,0,h,a,1,1,e.RGBA,e.FLOAT,t.Re.slice(0,4)),i+=1,a=Math.floor(i/n),h=i-a*n,e.texSubImage2D(e.TEXTURE_2D,0,h,a,1,1,e.RGBA,e.FLOAT,t.Re.slice(4,8)),i+=1,a=Math.floor(i/n),h=i-a*n,e.texSubImage2D(e.TEXTURE_2D,0,h,a,1,1,e.RGBA,e.FLOAT,t.Re.slice(8,12)),i+=1,a=Math.floor(i/n),h=i-a*n,e.texSubImage2D(e.TEXTURE_2D,0,h,a,1,1,e.RGBA,e.FLOAT,t.Re.slice(12,16))}}class Camera{Gc=1e3;do=create$3();get eye(){return add(create$3(),this.do,this.movement)}mc=create$3();get center(){return add(create$3(),this.mc,this.movement)}xi=fromValues$2(-1,0,0);get up(){return this.xi}Cc=fromValues$2(0,-1,0);get right(){return this.Cc}clientHeight;clientWidth;get front(){return normalize$2(create$3(),l(create$3(),this.do,this.mc))}radius=0;theta=0;phi=0;movement=fromValues$2(0,0,0);factor=1;bc=50;get bias(){return this.bc}orthographic=!0;min;max;fc=0;get near(){return this.fc}Wc=0;get far(){return this.Wc}la=60;Xc;constructor(t){this.Xc=t;let e=t.pl;this.min=e?.slice(0,3),this.max=e?.slice(3,6);let l=add(create$3(),this.min,this.max);this.mc=scale(create$3(),l,.5);let n=distance$1(this.min,this.max);this.orthographic,this.radius=n/2}reset(){this.xi=fromValues$2(-1,0,0),this.theta=0,this.phi=0,this.movement=fromValues$2(0,0,0),this.factor=1}getViewMatrix(){let t=this.eye,e=this.center;if(this.orthographic)return lookAt(create$4(),t,e,this.xi);{let n=l(create$3(),e,t);n=normalize$2(n,n);const i=dot$1(this.mc,n)-dot$1(e,n),a=scale(create$3(),n,this.factor+i);return t=add(create$3(),t,a),e=add(create$3(),e,a),lookAt(create$4(),t,e,this.xi)}}getEye(){let t=this.eye,e=this.center,n=l(create$3(),this.eye,this.center);return t=add(create$3(),e,scale(create$3(),n,2*this.radius)),t}getProjectMatrix(t,e,n){let i=e/n,a=0,h=0;i>1?(h=2*this.radius,a=h*i):(a=2*this.radius,h=a/i),a=a*this.factor/2,h=h*this.factor/2,this.clientWidth=2*a,this.clientHeight=2*h;let s=0,o=0,r=.5*this.radius,c=add(create$3(),this.max,fromValues$2(r,r,r)),u=add(create$3(),this.min,fromValues$2(-r,-r,-r)),g=[],d=c;if(!this.orthographic){let e=l(create$3(),this.eye,this.center),n=add(create$3(),this.center,scale(create$3(),e,this.factor));t=lookAt(create$4(),n,this.center,this.xi)}g.push(transformMat4$1(create$3(),d,t)[2]);let I=fromValues$2(u[0],c[1],c[2]);g.push(transformMat4$1(create$3(),I,t)[2]);let p=fromValues$2(c[0],u[1],c[2]);g.push(transformMat4$1(create$3(),p,t)[2]);let Z=fromValues$2(u[0],u[1],c[2]);g.push(transformMat4$1(create$3(),Z,t)[2]);let G=fromValues$2(c[0],c[1],u[2]);g.push(transformMat4$1(create$3(),G,t)[2]);let m=fromValues$2(u[0],c[1],u[2]);g.push(transformMat4$1(create$3(),m,t)[2]);let C=fromValues$2(c[0],u[1],u[2]);g.push(transformMat4$1(create$3(),C,t)[2]);let b=u;if(g.push(transformMat4$1(create$3(),b,t)[2]),s=-8e6,o=8e6,this.orthographic){let t=2*a/e,l=2*h/n;return this.bc=1.5*Math.sqrt(t*t+l*l),this.fc=s,this.Wc=o,ortho(create$4(),-a,a,-h,h,s,o)}return s=10,this.fc=s,this.Wc=o,perspective(create$4(),this.la*Math.PI/180,e/n,s,this.Wc)}getEyeDir(){let t=this.eye,e=this.center,l=fromValues$2(t[0]-e[0],t[1]-e[1],t[2]-e[2]);return normalize$2(create$3(),l)}getEyeDirection(){return normalize$2(create$3(),l(create$3(),this.eye,this.center))}rotate(t,e){this.phi=this.phi+t,this.phi>2*Math.PI&&(this.phi=this.phi-2*Math.PI),this.phi<0&&(this.phi=this.phi+2*Math.PI),this.theta=this.theta+e,this.theta>2*Math.PI&&(this.theta=this.theta-2*Math.PI),this.theta<0&&(this.theta=this.theta+2*Math.PI);let l=fromValues$2(0,0,1),n=fromValues$2(0,0,0),i=rotateY(create$3(),l,n,this.theta);if(i=rotateZ(create$3(),i,n,this.phi),this.orthographic)this.do=add(create$3(),this.mc,scale(create$3(),i,this.radius));else{const t=this.radius/Math.sin(this.la*Math.PI/360);this.do=add(create$3(),this.mc,scale(create$3(),i,t))}let a=fromValues$2(-1,0,0);a=rotateY(create$3(),a,n,this.theta),a=rotateZ(create$3(),a,n,this.phi),this.xi=a;let h=this.xi,s=this.getEyeDirection(),o=cross(create$3(),h,s);this.Cc=o,this.yc()}move(t,e){if(this.orthographic){let l=this.xi,n=this.getEyeDirection(),i=cross(create$3(),l,n),a=scale(create$3(),i,-t*this.clientWidth),h=scale(create$3(),l,-e*this.clientHeight),s=add(create$3(),a,h);this.movement=add(create$3(),this.movement,s)}else{let n=this.eye,i=this.center,a=l(create$3(),i,n);a=normalize$2(a,a);const h=scale(create$3(),a,this.factor);i=add(create$3(),i,h);let s=z(this.Xc.Ti).Nl,o=transformMat4$1(create$3(),i,s),r=invert(create$4(),s),c=create$3();transformMat4$1(c,fromValues$2(0,0,o[2]),r);let u=create$3();transformMat4$1(u,fromValues$2(-t,-e,o[2]),r);let g=l(create$3(),u,c);this.movement=add(create$3(),this.movement,g)}}scale(t){if(this.orthographic)this.factor=this.factor*(1+t);else{const e=(t<0?1:-1)*this.Gc;this.factor=this.factor+e}}yc(){if(!this.Xc.Ti)return;const t=z(this.Xc.Ti),e=t.Nl,n=Array.from(t.an.highlighted),i=[];if(n.forEach((t=>{const e=t?.element?.get_box();i.push(e)})),0==i.length)return;const a=Z.unin(i),h=Z.get_center(a),s=transformMat4$1(create$3(),h,e);H(this.Xc.Ti);const o=t.Nl,r=transformMat4$1(create$3(),h,o),c=invert(create$4(),o),u=new Float32Array([s[0],s[1],r[2]]),g=transformMat4$1(create$3(),u,c);let d=l(create$3(),h,g);this.movement=add(create$3(),this.movement,d)}}class Plane{orign;normal;constructor(t,e){this.orign=t,this.normal=e}project(t){let e=dot$1(this.normal,this.orign)-dot$1(this.normal,t),l=scale(create$3(),this.normal,e);return add(create$3(),l,t)}}class SelectResult{select_mode=p.element;element_index=-1;element=null;instance_index=-1;instance=null;face_index=-1;face=null;point=null;constructor(){}get_plane(){if(this.select_mode!=p.face)return null;let t=g(this.instance),e=t.geometry.faces[this.face_index];if(!e.isPlanar)return null;let l=t.geometry.get_face_normal(this.face_index),n=t.geometry.get_point(e.indices[0]);return t.has_matrix&&(n=transformMat4$1(n,n,t.Re)),new Plane(n,l)}}class SelectionManager{vl;constructor(t){this.vl=t}vc=new Map;get highlighted(){return this.vc.values()}highlight(t){if(t.select_mode==p.none||t.select_mode>7)return;if(!t.element.visible)return;let e=this.Vc(t);this.vc.has(e)?this.vc.delete(e):this.vc.set(e,t)}highlight_without_check(t){let e=this.Vc(t);this.vc.set(e,t)}highlight_elements(t){let e=t.length;for(let l=0;l<e;l++){let e=t[l];if(!e.visible)continue;let n=new SelectResult;n.select_mode=p.element,n.element=e,n.element_index=e.index;let i=this.Vc(n);this.vc.has(i)?this.vc.delete(i):this.vc.set(i,n)}}clear_highlighted(){this.vc=new Map}highlight_all(){let t=z(this.vl).Qe,e=t.length;for(let l=0;l<e;l++){let e=new SelectResult,n=t[l];e.element=n.Xe,e.select_mode=p.element,e.element_index=n.index,this.vc.set(this.Vc(e),e)}}commit(){let t=z(this.vl);const e=Array.from(this.vc.values());t.cl.publish("select_changed",e)}Vc(t){return`${t.element_index}-${t.instance_index}-${t.face_index}`}Bc(t,e){if(z(this.vl).ql.gl)if(t.select_mode==p.element){t.element.instances.forEach((t=>this.Yc(t,e)))}else t.select_mode==p.instance?this.Yc(t.instance,e):t.select_mode==p.face&&this.Sc(t.face,e)}Yc(t,e){let l=this.vl.highlight_color.data,n=g(t),i=n.start/3,a=n.length/3;for(let t=0;t<a;t++)e[4*(i+t)]=l[0],e[4*(i+t)+1]=l[1],e[4*(i+t)+2]=l[2]}Sc(t,e){let l=this.vl.highlight_color.data,n=t.start/3,i=t.length/3;for(let t=0;t<i;t++)e[4*(n+t)]=l[0],e[4*(n+t)+1]=l[1],e[4*(n+t)+2]=l[2],e[4*(n+t)*4+3]=255}get_highlighted_elements(){let t=new Array;return this.vc.forEach((e=>{e.select_mode==p.element&&t.push(e.element)})),t}}class Ot{graphicsContext;gl;shader=null;sceneContext=null;Yh=null;Sh=null;Tc=null;wc=null;He=!0;constructor(t,e,l){this.gl=t,this.shader=new Shader(t,h.Wt,h.ft),this.Rc(),this.graphicsContext=e,this.sceneContext=l,this.Yh=t.createFramebuffer(),this.Sh=t.createRenderbuffer(),this.Tc=t.createTexture(),this.wc=t.createTexture()}Rc(){let t=this.gl,e=this.shader.$a;this.u_Mvp=t.getUniformLocation(e,"u_Mvp"),this.u_UseSectionBox=t.getUniformLocation(e,"u_UseSectionBox"),this.u_Max=t.getUniformLocation(e,"u_Max"),this.u_Min=t.getUniformLocation(e,"u_Min"),this.u_PointSampler=t.getUniformLocation(e,"u_PointSampler"),this.u_PointSamplerSize=t.getUniformLocation(e,"u_PointSamplerSize"),this.u_TransformSampler=t.getUniformLocation(e,"u_TransformSampler"),this.u_TransformSize=t.getUniformLocation(e,"u_TransformSize"),this.u_TransformIndexSampler=t.getUniformLocation(e,"u_TransformIndexSampler"),this.u_TriangleSize=t.getUniformLocation(e,"u_TriangleSize")}ia(){this.shader.ia();let t=this.gl,e=this.graphicsContext;t.bindBuffer(t.ARRAY_BUFFER,e.rh),t.vertexAttribIPointer(0,1,t.UNSIGNED_INT,0,0),t.enableVertexAttribArray(0)}u_Mvp;u_UseSectionBox;u_Max;u_Min;u_PointSampler;u_PointSamplerSize;u_TransformSampler;u_TransformSize;u_TransformIndexSampler;u_TriangleSize;za(t,e,l){let n=new SelectResult;if(n.select_mode=l,l==p.none)return null;let i=this.gl,a=this.sceneContext;if(this.He){let t=z(a),e=t.ql,l=t.Fl.width,n=t.Fl.height;this.ia();let h=this.Yh;i.bindFramebuffer(i.FRAMEBUFFER,h);let s=this.Sh;i.bindRenderbuffer(i.RENDERBUFFER,s),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_COMPONENT32F,l,n);let o=this.Tc,r=this.wc;i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,r),i.texImage2D(i.TEXTURE_2D,0,i.R32I,l,n,0,i.RED_INTEGER,i.INT,null),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,r,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,o),i.texImage2D(i.TEXTURE_2D,0,i.RGBA32F,l,n,0,i.RGBA,i.FLOAT,null),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT1,i.TEXTURE_2D,o,0),i.drawBuffers([i.COLOR_ATTACHMENT0,i.COLOR_ATTACHMENT1]),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,s),i.FRAMEBUFFER_COMPLETE!=i.checkFramebufferStatus(i.FRAMEBUFFER)&&console.log("");let c=this.shader.$a;switch(i.useProgram(c),It(i,e.ph,i.TEXTURE1,this.u_PointSampler),i.uniform1ui(this.u_PointSamplerSize,e.Zh),It(i,e.Gh,i.TEXTURE2,this.u_TransformSampler),i.uniform1ui(this.u_TransformSize,e.mh),It(i,e.dh,i.TEXTURE3,this.u_TransformIndexSampler),i.uniform1ui(this.u_TriangleSize,e.Ih),t.bn){case Y.none:i.uniform1i(this.u_UseSectionBox,0);break;case Y.box:{let t=a.section_box;i.uniform1i(this.u_UseSectionBox,1),i.uniform3f(this.u_Min,t[0],t[1],t[2]),i.uniform3f(this.u_Max,t[3],t[4],t[5]);break}case Y.plane:i.uniform1i(this.u_UseSectionBox,2),i.uniform3fv(this.u_Min,t.Cn.orign),i.uniform3fv(this.u_Max,t.Cn.normal)}i.uniformMatrix4fv(this.u_Mvp,!1,t.Nl),i.enable(i.DEPTH_TEST),i.disable(i.BLEND),i.depthMask(!0),i.viewport(0,0,l,n),i.clear(i.DEPTH_BUFFER_BIT),e.Hn.Ki(),this.He=!1}i.bindFramebuffer(i.FRAMEBUFFER,this.Yh);let h=new Int32Array(1);i.readBuffer(i.COLOR_ATTACHMENT0),i.readPixels(t,e,1,1,i.RED_INTEGER,i.INT,h);let s=h[0]-1;if(-1==s){if(l&&p.point==p.point){let l=this.Ac(t,e);return n.point=l,n}return null}let{element:o,element_index:r,instance:c,instance_index:u,face:g,face_index:d}=function(t,e){let l=k.get(t).Qe,n=l.length,i=null,a=-1,h=null,s=null,o=-1,r=null,c=-1;for(let t=0;t<n;t++){let n=l[t],r=n.We,c=r.length;for(let t=0;t<c;t++){let l=r[t];if(l.start<=e&&l.length+l.start>e){h=l.Xe,s=l,o=t;break}}if(null!=h){a=t,i=n.Xe;break}}let u=s.faces;n=u.length;for(let t=0;t<n;t++){let l=u[t];l.start<=e&&l.start+l.length>e&&(c=t,r=l)}return{element:i,element_index:a,instance:h,instance_index:o,face:r,face_index:c}}(a,s);if((l&p.element)==p.element&&(n.element_index=r,n.element=o),(l&p.instance)==p.instance&&(n.instance_index=u,n.instance=c),(l&p.face)==p.face&&(n.face=g,n.face_index=d),(l&p.point)==p.point){let l=new Float32Array(4);i.readBuffer(i.COLOR_ATTACHMENT1),i.readPixels(t,e,1,1,i.RGBA,i.FLOAT,l),n.point=fromValues$2(l[0],l[1],l[2])}return i.bindFramebuffer(i.FRAMEBUFFER,null),n}Ac(t,e){let l=z(this.sceneContext),n=l.Fl,i=l,a=i.zl,h=n.height,s=t/1/n.width*2-1,o=e/1/h*2-1,r=scale(create$3(),a.getEyeDir(),-1),c=new Float32Array([s,o,-1]),u=invert(create$4(),i.Nl),g=transformMat4$1(create$3(),c,u);return i.fn.bl(g,r)}}var Qt;!function(t){t[t.None=0]="None",t[t.Highlight=1]="Highlight",t[t.Hide=2]="Hide"}(Qt||(Qt={}));class VisibleManager{vl;constructor(t){this.vl=t}hide(t){null!=t&&t.length>0&&t.forEach((t=>{let e=r(t);is_space(e.category)||(e.Ce=!1)}))}show(t){null!=t&&t.length>0&&t.forEach((t=>{let e=r(t);is_space(e.category)||(e.Ce=!0)}))}hide_category(t){if(is_space(t))return;z(this.vl).Qe.forEach((e=>{e.category==t&&(e.Ce=!1)}))}show_category(t){if(is_space(t))return;z(this.vl).Qe.forEach((e=>{e.category==t&&(e.Ce=!0)}))}show_space(t){t&&t.length>0&&t.forEach((t=>{let e=r(t);is_space(e.category)&&(e.Ce=!0)}))}hide_space(t){t&&t.length>0&&t.forEach((t=>{let e=r(t);is_space(e.category)&&(e.Ce=!1)}))}commit(){let t=this.vl,e=z(t),l=e.ql,n=e.Qe.filter((t=>t.Ce&&t.Se&&!t.fe&&!t.Te));l.Mn.Kn(n),n=e.Qe.filter((t=>t.Ce&&!t.be&&t.Se&&!t.Te)),l.Hn.Kn(n),n=e.Qe.filter((t=>t.Ce&&t.fe&&!t.Te)),n.length>0?(R(t.bloom_manager).Vl=!0,l.Fn.Kn(n)):R(t.bloom_manager).Vl=!1}}class WanderSettings{x=50;y=50;scale=1/4;width=400;height=300;fixed=!0;show_map=!1;edge_width=1;edge_color=[0,0,0,1];background_color=[0,0,0,.5];fovy}class Wander{get storey(){return it(this).Di}get isRunning(){return it(this).Pi}constructor(t){(function(t){let e=new q;return j.set(t,e),e}(this)).vl=t}get eye(){return it(this).Mi}height=1500;moveStep=100;angleStep=2;fps=40;settings=new WanderSettings;start(t,l,n){let i=it(this),a=i.vl;var h,s;t[2]=n.elevation+this.height,i.Mi=t,i.Hi=rotateZ(create$3(),i.Ei,i.Li,l*Math.PI/180),i.Fi=(h=i.Hi,(s=new e(3))[0]=h[0],s[1]=h[1],s[2]=h[2],s),i.Di=n,i.Pi=!0;let o=z(a);o.xl=N.xa;let r=o.Qe.filter((t=>t.storey_index==n.index));o.ql.Zo.Kn(r),$(this),a.changed=!0}stop(){let t=it(this);t.Pi=!1,z(t.vl).xl=N.sa,H(t.vl),t.vl.changed=!0}}class BloomManager{get blooms(){let t=z(R(this).vl).Qe.filter((t=>t.fe)),e=t.length,l=new Array(e);for(let n=0;n<e;n++)l[n]=t[n].Xe;return l}bloomRange=10;bloomFactor=1;constructor(t){(function(t){let e=new w;return T.set(t,e),e}(this)).vl=t}set_bloom(t){null!=t&&null!=t&&0!=t.length&&(t.forEach((t=>{r(t).fe=!0})),R(this).Vl=!0)}clear(){let t=R(this);z(t.vl).Qe.forEach((t=>{t.fe&&(t.fe=!1)})),t.Vl=!1}commit(){let t=z(R(this).vl),e=t.ql,l=t.Qe.filter((t=>t.Ce&&!t.fe&&!t.Te));e.Mn.Kn(l);let n=t.Qe.filter((t=>t.Ce&&t.fe&&!t.Te));e.Fn.Kn(n)}}class ColorRecordItem{Je=new Uint32Array(1);Nc=new Uint8Array(4);get color(){return this.Nc}get instance_id(){return this.Je[0]}set instance_id(t){this.Je[0]=t}get r(){return this.Nc[0]}set r(t){this.Nc[0]=t}get g(){return this.Nc[1]}set g(t){this.Nc[1]=t}get b(){return this.Nc[2]}set b(t){this.Nc[2]=t}get a(){return this.Nc[3]}set a(t){this.Nc[3]=t}constructor(){}}const _t=new WeakMap;class jt{vl=null;constructor(){}}function qt(t){return _t.get(t)}class ExtraColorItem{kc=new Uint32Array(2);color;get element(){return this.kc[0]}set element(t){this.kc[0]=t}get instance(){return this.kc[1]}set instance(t){this.kc[1]=t}constructor(){}}class ColorManager{constructor(t){(function(t){let e=new jt;return _t.set(t,e),e}(this)).vl=t}set_instance_color(t,e){g(t).Ne=e.data}reset_instance_color(t){g(t).Ne=null}set_element_color(t,e){let l=t.instances,n=l.length;for(let t=0;t<n;t++){let n=l[t];this.set_instance_color(n,e)}}reset_element_color(t){let e=t.instances,l=e.length;for(let t=0;t<l;t++){let l=e[t];this.reset_instance_color(l)}}reset_color(){let t=z(qt(this).vl).dl,e=t.length;for(let l=0;l<e;l++){let e=t[l];null!=e.Ne&&(e.Ne=null)}}commit(){let t=qt(this).vl,e=z(t),l=e.ql,n=function(t){let e=z(t),l=e.ql.Ih,n=new Uint8Array(l*l*4),i=e.Qe,a=i.length;for(let t=0;t<a;t++){let e=i[t];if(!e.Se)continue;let l=e.We,a=l.length;for(let t=0;t<a;t++){let e=l[t],i=e.start/3,a=e.length/3,h=e.Ne??e.material.color;for(let t=0;t<a;t++)n[4*(i+t)]=h[0],n[4*(i+t)+1]=h[1],n[4*(i+t)+2]=h[2],n[4*(i+t)+3]=h[3]}}return n}(t);!function(t,e){let l=t.Ih,n=t.gl;n.activeTexture(n.TEXTURE0),n.bindTexture(n.TEXTURE_2D,t.gh),n.pixelStorei(n.UNPACK_COLORSPACE_CONVERSION_WEBGL,n.BROWSER_DEFAULT_WEBGL),n.texSubImage2D(n.TEXTURE_2D,0,0,0,l,l,n.RGBA,n.UNSIGNED_BYTE,e),Gt(n),n.bindTexture(n.TEXTURE_2D,null)}(l,n);let i=e.Qe.filter((t=>t.Ce&&!t.fe&&t.Se&&!t.Te));l.Mn.Kn(i)}save_to_record(t){t.items=[];let e=qt(this).vl,l=z(e);t.light_color=l.Al.color,t.light_phi=l.Al.phi,t.light_theta=l.Al.theta,t.shadow=e.shadow,t.shadow_factor=e.shadow_factor,t.bias=e.bias,t.ambient=e.ambient,t.background_color=e.background,t.ao=e.ao_radius,t.ao_factor=e.ao_factor,t.bloom_exposure=e.exposure,t.edge_color=e.edge_color,t.edge_width=e.edge_width,t.outline_color=e.outline_color,t.outline_width=e.outline_width,t.bloom_range=e.bloom_manager.bloomRange,t.bloom_factor=e.bloom_manager.bloomFactor;let n=e.instances,a=l.Qe,h=n.length,s=new Array;for(let t=0;t<h;t++){let e=n[t];if(e.element.ye==i.MainModel&&null!=e.Ne){let t=new ColorRecordItem;t.instance_id=e.index;let l=e.Ne;t.r=l[0],t.g=l[1],t.b=l[2],4==l.length&&(t.a=l[3]),s.push(t)}}t.items=s;let o=l.Qe.filter((t=>t.ye!=i.MainModel)),r=new Array;h=o.length;for(let t=0;t<h;t++){let e=o[t],l=e.We,n=l.length;for(let t=0;t<n;t++){let n=l[t];if(null!=n.Ne){let l=new ExtraColorItem;l.element=e.id,l.instance=t,l.color=n.Ne,r.push(l)}}}t.extra_items=r,h=a.length;let c=[],u=[];for(let t=0;t<h;t++){let e=a[t];e.fe&&(e.ye==i.MainModel?c.push(e.index):u.push(e.id))}t.blooms=new Int32Array(c),t.extra_blooms=new Int32Array(u)}load(t){let e={has_color:!1,has_bloom:!1},l=qt(this).vl,n=z(l);n.Al.color=t.light_color,n.Al.phi=t.light_phi,n.Al.theta=t.light_theta,t.version>=2&&(l.shadow=t.shadow,l.shadow_factor=t.shadow_factor,l.bias=t.bias),t.version>=3&&(l.ao_factor=t.ao_factor,l.ao_radius=t.ao,l.exposure=t.bloom_exposure),t.version>=4&&(l.edge_width=t.edge_width,l.outline_width=t.outline_width),l.ambient=t.ambient,l.background=t.background_color,l.edge_color=t.edge_color,l.outline_color=t.outline_color;let a=n.dl,h=t.items,s=h.length;s>0&&(e.has_color=!0);for(let t=0;t<s;t++){let e=h[t];a[e.instance_id].Ne=e.color}s=t.extra_items.length,s>0&&(e.has_color=!0);let o=n.Qe,r=new Map;o.forEach((t=>{t.ye!=i.MainModel&&r.set(t.id,t)}));for(let e=0;e<s;e++){let l=t.extra_items[e],n=r.get(l.element);if(n){let t=n.We[l.instance];t&&(t.Ne=l.color)}}let c=t.blooms;if(s=c.length,s>0){e.has_bloom=!0;let n=[];for(let t=0;t<s;t++){let e=o[c[t]];n.push(e)}let i=l.bloom_manager;i.bloomRange=t.bloom_range,i.bloomFactor=t.bloom_factor,A(i,n)}if(s=t.extra_blooms.length,s>0){e.has_bloom=!0,s=t.extra_blooms.length;let n=[];for(let e=0;e<s;e++){let l=t.extra_blooms[e],i=r.get(l);i&&n.push(i)}let i=l.bloom_manager;i.bloomRange=t.bloom_range,i.bloomFactor=t.bloom_factor,A(i,n)}return e}}class GroupManager{vl;constructor(t){this.vl=t}get_elements(t){if(null==t)return null;let e=t.indices,l=e.length,n=[],i=z(this.vl).Qe;for(let t=0;t<l;t++){let l=e[t];n.push(i[l].Xe)}return n}add_elements(t,e){let l=t;if(null!=l)return!1;if(null==e||0==e.length)return!0;{let n=this.get_indices(e),i=t.indices.length,a=new Int32Array(i+n.length);a.set(t.indices,0),a.set(n,i);let h=new Set(a);l.indices=new Int32Array(h)}return!0}set_elements(t,e){let l=t;return null==l&&(null==e||0==e.length?l.indices=new Int32Array(0):l.indices=this.get_indices(e),!0)}get_indices(t){let e=[];return t.forEach((t=>{e.push(t.index)})),new Int32Array(e)}export(t,e){let l=e.length,n=new Array(e.length);for(let t=0;t<l;t++){let l=e[t];n[l.index]=l}let i=[],a=t.indices;l=a.length;for(let t=0;t<l;t++){let e=n[a[t]].uniqueId;i.push(e)}let h=new AutoBufferWriter;l=i.length,h.writeInt32(l);for(let t=0;t<l;t++)h.writeString(i[t]);return h.getBuffer()}import(t,e,l){let n=new StreamReader(l),i=n.readInt32(),a=new Array(i);for(let t=0;t<i;t++)a[t]=n.readString();let h=[];for(let t=0;t<i;t++){let l=a[t],n=e.find((t=>t.uniqueId==l));null!=n&&h.push(n.index)}t.indices=new Int32Array(h)}}class SelectableManager{vl;constructor(t){this.vl=t}lock(t){t.forEach((t=>{r(t).be=!0}))}unlock(t){t.forEach((t=>{r(t).be=!1}))}unlock_all(){z(this.vl).Qe.forEach((t=>t.be=!1))}commit(){let t=z(this.vl),e=t.Qe.filter((t=>t.Ce&&!t.be&&t.Se));t.ql.Hn.Kn(e)}}class MarqueeManager{vl;Kc=!1;get hasMarquee(){return this.Kc}constructor(t){this.vl=t}add_marquee(t,e,l,n,i){let a=z(this.vl).ql;a.Hh.add_segment(t,e,l,n,i),a.Hh.commit(),this.Kc=!0}commit(){if(this.Kc){z(this.vl).ql.Hh.commit()}}clear_marquee(){z(this.vl).ql.Hh.clear(),this.Kc=!1}}class $t{name;Mc;get rotationCenter(){return this.Mc}Hc;get rotationAxis(){return this.Hc}Fc;get initialAngle(){return this.Fc}zc;get finalAngle(){return this.zc}xc;get initialMovement(){return this.xc}Ec;get finalMovement(){return this.Ec}jr;get time(){return this.jr}Lc;get elements(){return this.Lc}Wl;get buffer(){return this.Wl}Jc;Nl;get mvp(){return this.Nl}Uc;get mm(){return this.Uc}Pc=!1;Dc=!1;Oc=-1;Qc;_c;jc;qc;constructor(t,e,n){this.name=t.name,this.Lc=n,this.Mc=t.rotationCenter,this.Fc=t.initialAngle,this.zc=t.finalAngle,this.Hc=t.rotationAxis,this.xc=t.initialMovement,this.Ec=t.finalMovement,this.jr=t.time,this.Jc=t.callback,this.Wl=e,t.rotationAxis&&t.rotationCenter&&null!=t.finalAngle&&null!=t.initialAngle&&Math.abs(t.finalAngle-t.initialAngle)>1&&(this.Pc=!0,this.qc=(t.finalAngle-t.initialAngle)/t.time/180*Math.PI),t.initialMovement&&t.finalMovement&&distance$1(t.initialMovement,t.finalMovement)>1&&(this._c=distance$1(t.initialMovement,t.finalMovement),this.Qc=this._c/t.time,this.jc=normalize$2(create$3(),l(create$3(),t.finalMovement,t.initialMovement)),this.Dc=!0)}bh(t,e){if(-1==this.Oc)this.Dc&&this.Pc?this.Kn(this.xc,this.Fc,t,e):this.Dc?this.$c(this.xc,t,e):this.Pc&&this.tu(this.Fc,t,e),this.Oc=performance.now();else{let l=performance.now()-this.Oc;if(l>this.jr)this.Dc&&this.Pc?this.Kn(this.Ec,this.zc,t,e):this.Dc?this.$c(this.Ec,t,e):this.Pc&&this.tu(this.zc,t,e),null!=this.Jc&&this.Jc(this);else if(this.Dc&&this.Pc){let n=scale(create$3(),this.jc,l*this.Qc);n=add(n,this.xc,n);let i=this.qc*l+this.Fc;i>2*Math.PI&&(i-=2*Math.PI),this.Kn(n,i,t,e)}else if(this.Dc){let n=scale(create$3(),this.jc,l*this.Qc);n=add(n,this.xc,n),this.$c(n,t,e)}else if(this.Pc){let n=this.qc*l+this.Fc;n>2*Math.PI&&(n-=2*Math.PI),this.tu(n,t,e)}}}Kn(t,e,l,n){let i,a=fromTranslation(create$4(),scale(create$3(),this.Mc,-1)),h=fromRotation(create$4(),e,this.Hc),s=add(create$3(),t,this.Mc),o=fromTranslation(create$4(),s);i=multiply(create$4(),h,a),i=multiply(create$4(),o,i),this.Uc=i;let r=multiply(create$4(),l,i);this.Nl=multiply(create$4(),n,r)}$c(t,e,l){let n=fromTranslation(create$4(),t);this.Uc=n;let i=multiply(create$4(),e,n);this.Nl=multiply(create$4(),l,i)}tu(t,e,l){let n,i=this.Mc,a=fromTranslation(create$4(),scale(create$3(),i,-1)),h=fromRotation(create$4(),t,this.Hc),s=fromTranslation(create$4(),i);n=multiply(create$4(),h,a),n=multiply(create$4(),s,n),this.Uc=n;let o=multiply(create$4(),e,n);this.Nl=multiply(create$4(),l,o)}reset(){this.Oc=-1}dispose(){this.Wl.dispose()}}class AnimationManager{vl;eu=!1;get ki(){return this.eu}constructor(t){this.vl=t}add_animation(t,e){let l=z(this.vl).ql,n=new Nt(l,"Animation"),i=t.length,a=new Array(i);for(let e=0;e<i;e++)a[e]=r(t[e]);n.Kn(a);let h=new $t(e,n,a);l.Ch.push(h),a.forEach((t=>t.Ce=!1));let s=z(this.vl).Qe.filter((t=>t.Ce&&!t.fe&&!t.Te));l.Mn.Kn(s),this.eu=!0}clear_animation(){this.eu=!1;let t=z(this.vl).ql;t.Ch.forEach((t=>{t.elements.forEach((t=>t.Ce=!0)),t.dispose()})),t.Ch=[];let e=z(this.vl);t.Mn.Kn(e.Qe)}}class CameraInfo{theta;phi;factor;orthographic;movement;movement_step;fovy}function get_center(t){let e=(t[0]+t[3])/2,l=(t[1]+t[4])/2,n=(t[2]+t[5])/2;return new Float32Array([e,l,n])}class ViewManager{vl;constructor(t){this.vl=t}rotate(t,e){let l=t/180*Math.PI,n=e/180*Math.PI,i=z(this.vl);i.zl?.rotate(l,n),H(this.vl),this.vl.changed=!0}zoom_view(t,e){this.animation_by_time({theta:t,phi:e},[0,0,0],1)}move(t,e){let l=z(this.vl);l.zl?.move(t,e),H(this.vl),this.vl.changed=!0}set_move_3d(t){z(this.vl).zl.movement=t,H(this.vl),this.vl.changed=!0}scale(t){let e=z(this.vl);e.zl?.scale(t),H(this.vl),this.vl.changed=!0}zoom_to(t){t&&(Array.isArray(t)?this.lu(t):this.nu(t))}nu(t){if(!t)return;let e=r(t).get_box(),l=fromValues$2(e[0],e[1],e[2]),n=fromValues$2(e[3],e[4],e[5]),i=scale(create$3(),add(create$3(),l,n),.5),a=z(this.vl),h=subtract$1(create$3(),i,a.zl.center),s=this.vl.box,o=s[5]-i[2],c=s[3]-i[0],u=s[4]-i[1],g=i[2]-s[2],d=i[0]-s[0],I=i[1]-s[1],p=distance$1(n,l)/2/a.zl.radius,Z=Math.PI;o<=Math.min(c,u,g,d,I)?this.animation_by_time({theta:0,phi:2*Z-Z/2},h,p):c<=Math.min(o,u,g,d,I)?this.animation_by_time({theta:Z/2,phi:0},h,p):u<=Math.min(o,c,g,d,I)?this.animation_by_time({theta:Z/2,phi:Z/2},h,p):g<=Math.min(o,c,u,d,I)?this.animation_by_time({theta:Z,phi:2*Z-Z/2},h,p):d<=Math.min(o,c,u,g,I)?this.animation_by_time({theta:Z/2,phi:Z},h,p):I<=Math.min(o,c,u,g,d)&&this.animation_by_time({theta:Z/2,phi:2*Z-Z/2},h,p)}lu(t){let e=t.length,n=new Array(e);for(let l=0;l<e;l++)n[l]=r(t[l]);let i=z(this.vl),a=function(t){let e=t.length,l=Number.MAX_VALUE,n=Number.MAX_VALUE,i=Number.MAX_VALUE,a=-Number.MAX_VALUE,h=-Number.MAX_VALUE,s=-Number.MAX_VALUE;for(let o=0;o<e;o++){let e=t[o].get_box();l=Math.min(l,e[0]),n=Math.min(n,e[1]),i=Math.min(i,e[2]),a=Math.max(a,e[3]),h=Math.max(h,e[4]),s=Math.max(s,e[5])}return new Float32Array([l,n,i,a,h,s])}(n);get_center(this.vl.box);let h=get_center(a),s=i.Nl,o=invert(create$4(),s),c=transformMat4$1(create$3(),h,s);c[2]=0;let u=transformMat4$1(create$3(),c,o),g=transformMat4$1(create$3(),[0,0,0],o),d=l(create$3(),u,g);d=add(d,d,i.zl.movement),this.animation_by_time(null,d,1,500)}animation(t,e,l,n=10){let i=z(this.vl).zl;if(!i)return;let a=0,h=0;t&&(a=t.theta-i.theta,h=t.phi-i.phi,a>Math.PI&&(a-=2*Math.PI),a<-Math.PI&&(a+=2*Math.PI),h>Math.PI&&(h-=2*Math.PI),h<-Math.PI&&(h+=2*Math.PI));let s=n,o=a/s,r=h/s,c=fromValues$2(0,0,0);if(e){let t=subtract$1(create$3(),e,i.movement);c=scale(create$3(),t,1/s)}let u=0;if(l){let t=i.factor-l;u=t/s}let g,d=0,I=this.vl;g=setInterval((()=>{let t=z(I);if(d<s){if(!i)return;t.en=!1,i.rotate(r,o),i.movement=add(create$3(),i.movement,c),i.factor=i.factor-u,H(I),M(I),I.changed=!0,d++}else t.en=!0,clearInterval(g)}),20)}animation_by_time(t,e,l,n=500){let i=z(this.vl).zl;if(!i)return;let a=0,h=0;t&&(a=t.theta-i.theta,h=t.phi-i.phi,a>Math.PI&&(a-=2*Math.PI),a<-Math.PI&&(a+=2*Math.PI),h>Math.PI&&(h-=2*Math.PI),h<-Math.PI&&(h+=2*Math.PI));let s=n/20,o=a/s,r=h/s,c=fromValues$2(0,0,0);if(e){let t=subtract$1(create$3(),e,i.movement);c=scale(create$3(),t,1/s)}let u=0;if(l){let t=i.factor-l;u=t/s}let g,d=0,I=this.vl;g=setInterval((()=>{let t=z(I);if(d<s){if(!i)return;t.en=!1,i.rotate(r,o),i.movement=add(create$3(),i.movement,c),i.factor=i.factor-u,H(I),M(I),I.changed=!0,d++}else t.en=!0,clearInterval(g)}),20)}get_camera_info(){let t=z(this.vl).zl,e=new CameraInfo;return e.theta=t.theta,e.phi=t.phi,e.orthographic=t.orthographic,e.factor=t.factor,e.movement=t.movement,e.movement_step=t.Gc,e.fovy=t.la,e}set_camera_info(t){let e=z(this.vl).zl;e.theta=t.theta,e.phi=t.phi,e.orthographic=t.orthographic,e.factor=t.factor,e.movement=t.movement,e.Gc=t.movement_step,e.la=t.fovy,H(this.vl)}}class SceneContext{get scene(){return z(this).wl}get storeys(){return z(this).Bl}get elements(){let t=z(this).Qe,e=t.length,l=new Array;for(let n=0;n<e;n++){const e=t[n];e.Te||l.push(e.Xe)}return l}get types(){return z(this).Yl}get spaces(){let t=z(this).Sl,e=t.length,l=new Array(e);for(let n=0;n<e;n++)l[n]=t[n].Xe;return l}get instances(){let t=z(this).dl,e=t.length,l=new Array(e);for(let n=0;n<e;n++)l[n]=t[n].Xe;return t}get geometries(){return z(this).Il}get materials(){return z(this).Tl}get wander(){return z(this).Rl}get light(){return z(this).Al}ao_radius=20;ao_factor=2;shadow=!1;shadow_factor=1.2;bias=50;get ambient(){return z(this).Gn}set ambient(t){z(this).Gn=t}exposure=1;get highlight_color(){return z(this).Ql}set highlight_color(t){z(this).Ql=t}uniqueId;xrayColor=[80/255,80/255,80/255,150/255];background=new Color(new Uint8Array([0,0,0]));set background_image(t){let e=z(this),l=e.ql,n=l.gl;if(n.deleteTexture(l.Us),l.Us=null,null!=t){let i=screen.width,a=screen.height;t.width>i&&(t.width=i),t.height>a&&(t.height=a);let h=document.createElement("canvas");h.width=t.width,h.height=t.height,h.getContext("2d").drawImage(t,0,0,h.width,h.height),e.Ol=h,l.Us=n.createTexture(),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,!0),n.activeTexture(n.TEXTURE0),n.bindTexture(n.TEXTURE_2D,l.Us),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,e.Ol),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.LINEAR),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.LINEAR),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,!1)}else e.Ol=null}get box(){return z(this).pl}set box(t){z(this).pl=t}get section_box(){let t=z(this).mn;return t?new Float32Array(t):null}set section_box(t){let e=z(this);null!=t&&6==t.length?e.mn=new Float32Array(t):e.mn=null,e.cl.publish("section_box_changed",e)}get section_plane(){return z(this).Cn}set section_plane(t){z(this).Cn=t}get section_mode(){return z(this).bn}set section_mode(t){z(this).bn=t}get select_mode(){return z(this).ul}set select_mode(t){z(this).ul=t}get can_rotate(){return z(this).Ul}set can_rotate(t){z(this).Ul=t}get can_scale(){return z(this).Pl}set can_scale(t){z(this).Pl=t}get can_move(){return z(this).Dl}set can_move(t){z(this).Dl=t}get changed(){return z(this).He}set changed(t){let e=z(this);e.He=t,e.$l.He=!0}get selection_manager(){return z(this).an}get bloom_manager(){return z(this).hn}get color_manager(){return z(this).sn}get group_manager(){return z(this).rn}get selectable_manager(){return z(this).cn}get marquee_manager(){return z(this).un}get animation_manager(){return z(this).gn}get view_manager(){return z(this).dn}select_action=Qt.Highlight;edge_color=new Color(new Uint8Array([51,51,51,51]));edge_width=1;get visible_manager(){return z(this).In}get scene_manager(){return z(this).pn.nl}outline_color=new Color(new Uint8Array([26,26,26,26]));outline_width=2;constructor(t,e,l,n){let i=function(t){let e=new K;return k.set(t,e),e}(this);i.wl=t,i.ql=e,i.zl=l,i.xl=N.sa,i.Fl=n;let a=_(t);i.cl=a.Yi,i.an=new SelectionManager(this),i.$l=new Ot(e.gl,e,this),i.In=new VisibleManager(this),i.Rl=new Wander(this),i.hn=new BloomManager(this),i.sn=new ColorManager(this),i.rn=new GroupManager(this),i.cn=new SelectableManager(this),i.un=new MarqueeManager(this),i.gn=new AnimationManager(this),i.dn=new ViewManager(this)}set_sketch_plane(t,e){z(this).fn=new B(t,e)}add_event_listener(t,e,l){z(this).Wn(t,e,l)}remove_event_listener(t,e,l){let n=z(this).ln;if(n.has(t)){let l=n.get(t);if(null==l)return;let i=l.indexOf(e);-1!=i&&(1==l.length?n.delete(t):l.splice(i,1))}}select(t,e,l){let n=z(this);return n.$l&&this.selection_manager?n.$l.za(t,e,l):null}get_screen_point(t){let e=z(this),l=transformMat4$1(create$3(),t,e.Nl),n=_(this.scene),i=n.ci.clientWidth,a=n.ci.clientHeight,h=l[0]+1,s=1-l[1];return h=i*h/2,s=a*s/2,fromValues(h,s)}create_element(t,e,l,n){return z(this).vn(t,e,l,n).Xe}save_extra_elements(){return z(this).Vn()}load_extra_elements(t){return z(this).Bn(t)}scale_element(t,e){let l=r(t);z(this).Yn(l,e)}rotate_element(t,e,l){let n=r(t);z(this).Tn(n,e,l)}move_element(t,e){let l=r(t);z(this).wn(l,e)}reset_element_pose(t){let e=r(t);z(this).An(e)}delete_element(t){let e=r(t);z(this).Nn(e)}set_location(t,e){let l=r(t);z(this).Rn(l,e)}}const te=new WeakMap;class ee{wl;iu;au=-1;hl=[];hu=!1;su=!0;ou=!1;ru;cu;uu;gu=null;du;Iu=[];pu=[];Zu=[];Do=!1;Gu;mu=0;constructor(){}}let le=0;async function ne(t){if(0==t.hl.length)return!1;let e=performance.now(),l=t.hl.shift();console.log("__cache",t.hl);let n=(await t.cu.get(l)).data,i=[];n.type_buffer&&(i=function(t){let e=new StreamReader(t),l=e.readInt32(),n=new Array(l);for(let t=0;t<l;t++){let l=e.readInt32(),i=e.readString();n[t]=new Type(l,i)}return n}(n.type_buffer));let a=[];n.storey_buffer&&(a=function(t){let e=new StreamReader(t),l=e.readInt32(),n=new Array(l);for(let t=0;t<l;t++){let l=e.readInt32(),i=e.readInt32(),a=e.readSingle(),h=e.readString();n[t]=new Storey(l,i,h,a)}return n}(n.storey_buffer));let h=[];n.material_buffer&&(h=function(t){let e=new StreamReader(t),l=e.readInt32(),n=new Array(l);for(let t=0;t<l;t++){let l=new Material;l.id=e.readInt32(),l.color=e.readUint8Array(4),n[t]=l}return n}(n.material_buffer));let s=[];n.geometry_buffer&&(s=function(t){let e=new StreamReader(t),l=e.readInt32(),n=new Array(l);for(let t=0;t<l;t++){let l=new Geometry;l.id=e.readInt32(),l.pointCount=e.readInt32(),l.points=e.readFloat32Array(3*l.pointCount);let i=e.readInt32(),a=new Array(i);for(let t=0;t<i;t++){let l=e.readBoolean(),n=e.readInt32(),i=new Face;i.isPlanar=l,i.indices=e.readInt32Array(n),i.normals=l?e.readUint8Array(3):e.readUint8Array(3*n),a[t]=i}l.faces=a,n[t]=l}return n}(n.geometry_buffer));let r=[];n.element_buffer&&(r=function(t){let e=new StreamReader(t),l=e.readInt32(),n=new Array(l);for(let t=0;t<l;t++){let l=new o;l.id=e.readInt32(),l.originId=e.readInt32(),l.index=e.readInt32(),l.typeId=e.readInt32(),l.storey_index=e.readInt32(),l.category=e.readInt32(),n[t]=l}return n}(n.element_buffer));let c=[];n.instance_buffer&&(c=function(t){let e=new StreamReader(t),l=e.readInt32(),n=new Array(l);for(let t=0;t<l;t++){let l=new u;l.id=e.readInt32(),l.index=e.readInt32(),l.elementId=e.readInt32(),l.start=e.readInt32(),l.length=e.readInt32(),e.readBoolean()&&(l.Re=e.readFloat32Array(16)),l.material_id=e.readInt32(),l.geometry_id=e.readInt32();let i=e.readInt32(),a=new Array(i);for(let t=0;t<i;t++){let l=new InstanceFace;l.start=e.readInt32(),l.length=e.readInt32(),a[t]=l}l.faces=a,n[t]=l}return n}(n.instance_buffer)),function(t,e,l,n,i,a,h){let s=z(t),o=s.Bl.concat(h);s.Bl=o.sort(((t,e)=>t.elevation-e.elevation));let r=s.Qe.length,c=s.dl.length;s.Qe=s.Qe.concat(e),s.dl=s.dl.concat(n),s.Il=s.Il.concat(i),s.Tl=s.Tl.concat(a),s.Yl=s.Yl.concat(l);let u=e.length;for(let t=0;t<u;t++){let l=e[t];is_space(l.category)&&(l.Ce=!1,s.Sl.push(l))}u=n.length;for(let t=0;t<u;t++){let e=n[t],l=e.elementId,i=s.Qe[l];e.element=i,i.We.push(e);let a=e.geometry_id;e.geometry=s.Il[a];let h=e.material_id;e.material=s.Tl[h],e.index=c+t}u=e.length;for(let t=0;t<u;t++)e[t].index=t+r}(t.wl.scene_context,r,i,c,s,h,a),t.Iu=t.Iu.concat(r),t.pu=t.pu.concat(c),t.Zu=t.Zu.concat(s);let g=performance.now();return le+=g-e,t.Iu.length>5e3&&(ie(t),t.mu++),await t.cu.delete(l),!0}function ie(t){let e=t.wl.scene_context,l={elements:t.Iu,instances:t.pu,geometries:t.Zu,fromloading:!0};t.ru.publish("update_gpu",l),t.Iu=[],t.pu=[],t.Zu=[],t.Do||(t.ru.publish("start_draw",t.wl),t.Do=!0),e.changed=!0,console.log("_update_gpu")}function ae(t){let e=te.get(t),action=async()=>{if(await ne(e)&&e.ou&&1==e.su&&(t.progress_changed(e.wl,"begin"),e.su=!1),e.hu?0!=e.hl.length&&(e.au=setTimeout(action,0)):e.hl.length>0?e.au=setTimeout(action,0):e.au=setTimeout(action,10),e.hu&&0==e.hl.length){ie(e),t.progress_changed(e.wl,"end"),e.au=-1,e.uu.terminate();let l=e.wl.scene_context;console.log("materail count:",l.materials.length),console.log("elements count:",l.elements.length),console.log("instances count:",l.instances.length),console.log("geometries count:",l.geometries.length),console.log("load end"),console.log("scene time:",le)}};e.au=setTimeout(action,100),e.du=action}function he(t){let e=te.get(t),l=atob("Y2xhc3MgSW5kZXhlZERCe3Q7aTtsO287Y29uc3RydWN0b3IodCxlLHIpe3RoaXMuaT10LHRoaXMubD1lLHRoaXMubz1yfWFzeW5jIG9wZW4oKXtsZXQgdD10aGlzO3JldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgoZT0+e2xldCByPWluZGV4ZWREQi5vcGVuKHRoaXMuaSk7ci5vbmVycm9yPXQ9PntlKCExKX0sci5vbnVwZ3JhZGVuZWVkZWQ9dD0+e3QudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLmkse2tleVBhdGg6dGhpcy5sfSl9LHIub25zdWNjZXNzPXI9PntsZXQgbj1yLnRhcmdldDt0LnQ9bi5yZXN1bHQsZSghMCl9fSkpfWFzeW5jIGFkZCh0KXtyZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKGU9PntsZXQgcj10aGlzLnQudHJhbnNhY3Rpb24odGhpcy5pLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUodGhpcy5pKTtpZihyLm9uY29tcGxldGU9KCk9PntlKCEwKX0sci5vbmVycm9yPXQ9PntlKCExKX0sdGhpcy5vKWlmKEFycmF5LmlzQXJyYXkodCkpe2xldCBlPXQubGVuZ3RoO2ZvcihsZXQgcj0wO3I8ZTtyKyspe2xldCBlPXRbcl07bi5hZGQodGhpcy5vPy50b0RiKGUpKX19ZWxzZSBuLmFkZCh0aGlzLm8/LnRvRGIodCkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7bGV0IGU9dC5sZW5ndGg7Zm9yKGxldCByPTA7cjxlO3IrKyl7bGV0IGU9dFtyXTtuLmFkZChlKX19ZWxzZSBuLmFkZCh0KTtyLmNvbW1pdCgpfSkpfWFzeW5jIHNldCh0KXtyZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKGU9PntsZXQgcj10aGlzLnQudHJhbnNhY3Rpb24odGhpcy5pLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUodGhpcy5pKTtpZihyLm9uY29tcGxldGU9KCk9PntlKCEwKX0sci5vbmVycm9yPXQ9PntlKCExKX0sdGhpcy5vKWlmKEFycmF5LmlzQXJyYXkodCkpe2xldCBlPXQubGVuZ3RoO2ZvcihsZXQgcj0wO3I8ZTtyKyspe2xldCBlPXRbcl07bi5wdXQodGhpcy5vPy50b0RiKGUpKX19ZWxzZSBuLnB1dCh0aGlzLm8/LnRvRGIodCkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7bGV0IGU9dC5sZW5ndGg7Zm9yKGxldCByPTA7cjxlO3IrKyl7bGV0IGU9dFtyXTtuLnB1dChlKX19ZWxzZSBuLnB1dCh0KTtyLmNvbW1pdCgpfSkpfWFzeW5jIGdldCh0KXtyZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKGU9PntsZXQgcj10aGlzLnQudHJhbnNhY3Rpb24odGhpcy5pLCJyZWFkd3JpdGUiKS5vYmplY3RTdG9yZSh0aGlzLmkpLmdldCh0KTtyLm9uc3VjY2Vzcz10PT57bGV0IHI9dC50YXJnZXQ7ZShyLnJlc3VsdCl9LHIub25lcnJvcj10PT57ZShudWxsKX19KSl9YXN5bmMgZ2V0QWxsKCl7cmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKCh0PT57bGV0IGU9dGhpcy50LnRyYW5zYWN0aW9uKHRoaXMuaSwicmVhZHdyaXRlIikub2JqZWN0U3RvcmUodGhpcy5pKS5nZXRBbGwoKTtlLm9uc3VjY2Vzcz1yPT57bGV0IG49ZS5yZXN1bHQsaT1uLmxlbmd0aCxzPW5ldyBBcnJheShpKTtmb3IobGV0IHQ9MDt0PGk7dCsrKXNbdF09blt0XTt0KHMpfSxlLm9uZXJyb3I9ZT0+e3QoW10pfX0pKX1hc3luYyBnZXRSZXN0KHQpe3JldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgoZT0+e2xldCByPXRoaXMudC50cmFuc2FjdGlvbih0aGlzLmksInJlYWR3cml0ZSIpLm9iamVjdFN0b3JlKHRoaXMuaSksbj1JREJLZXlSYW5nZS51cHBlckJvdW5kKHQsITEpLGk9ci5nZXRBbGwobik7aS5vbnN1Y2Nlc3M9dD0+e2xldCByPWkucmVzdWx0LG49ci5sZW5ndGgscz1uZXcgQXJyYXkobik7Zm9yKGxldCB0PTA7dDxuO3QrKylzW3RdPXJbdF07ZShzKX0saS5vbmVycm9yPXQ9PntlKFtdKX19KSl9YXN5bmMgZGVsZXRlKHQpe3JldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgoZT0+e2xldCByPXRoaXMudC50cmFuc2FjdGlvbih0aGlzLmksInJlYWR3cml0ZSIpLm9iamVjdFN0b3JlKHRoaXMuaSkuZGVsZXRlKHQpO3Iub25zdWNjZXNzPXQ9PntlKCEwKX0sci5vbmVycm9yPXQ9PntlKCExKX19KSl9YXN5bmMgY2xlYXIoKXtyZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHQ9PntsZXQgZT10aGlzLnQudHJhbnNhY3Rpb24odGhpcy5pLCJyZWFkd3JpdGUiKS5vYmplY3RTdG9yZSh0aGlzLmkpLmNsZWFyKCk7ZS5vbnN1Y2Nlc3M9ZT0+e3QoITApfSxlLm9uZXJyb3I9ZT0+e3QoITEpfX0pKX1jbG9zZSgpe3RoaXMudC5jbG9zZSgpfX1jbGFzcyBGbG93UmVhZGVye2g7dTtfPTA7bT0wO2RlY29kZXI9bmV3IFRleHREZWNvZGVyO2dldCBwb3NpdGlvbigpe3JldHVybiB0aGlzLl99c2V0IHBvc2l0aW9uKHQpe3RoaXMuXz10fWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5tfWNvbnN0cnVjdG9yKHQpeyJudW1iZXIiPT10eXBlb2YgdD8odGhpcy5oPW5ldyBVaW50OEFycmF5KHQpLHRoaXMudT1uZXcgRGF0YVZpZXcodGhpcy5oLmJ1ZmZlcikpOih0aGlzLnU9bmV3IERhdGFWaWV3KHQpLHRoaXMuaD1uZXcgVWludDhBcnJheSh0KSx0aGlzLm09dC5ieXRlTGVuZ3RoKX1hcHBlbmRfYnVmZmVyKHQpe3RoaXMuaC5zZXQodCx0aGlzLm0pLHRoaXMubSs9dC5sZW5ndGh9Z2V0X2J1ZmZlcih0LGUpe3JldHVybiB0aGlzLmguc2xpY2UodCxlKX1zdWJtaXRfcmVhZCgpe31yZWFkSW50MzIoKXtsZXQgdD10aGlzLnUuZ2V0SW50MzIodGhpcy5fLCEwKTtyZXR1cm4gdGhpcy5fKz00LHR9cmVhZEludDMyQXJyYXkodCl7bGV0IGU9bmV3IEludDMyQXJyYXkodCk7Zm9yKGxldCByPTA7cjx0O3IrKyllW3JdPXRoaXMucmVhZEludDMyKCk7cmV0dXJuIGV9cmVhZFVpbnQzMigpe2xldCB0PXRoaXMudS5nZXRVaW50MzIodGhpcy5fLCEwKTtyZXR1cm4gdGhpcy5fKz00LHR9cmVhZFNpbmdsZSgpe2xldCB0PXRoaXMudS5nZXRGbG9hdDMyKHRoaXMuXywhMCk7cmV0dXJuIHRoaXMuXys9NCx0fXJlYWRCb29sZWFuKCl7bGV0IHQ9dGhpcy51LmdldFVpbnQ4KHRoaXMuXyk7cmV0dXJuIHRoaXMuXys9MSwxPT10fXJlYWRVaW50OCgpe2xldCB0PXRoaXMudS5nZXRVaW50OCh0aGlzLl8pO3JldHVybiB0aGlzLl8rPTEsdH1yZWFkVWludDE2KCl7bGV0IHQ9dGhpcy51LmdldFVpbnQxNih0aGlzLl8sITApO3JldHVybiB0aGlzLl8rPTIsdH1yZWFkVWludDE2QXJyYXkodCl7bGV0IGU9bmV3IFVpbnQxNkFycmF5KHQpO2ZvcihsZXQgcj0wO3I8dDtyKyspZVtyXT10aGlzLnJlYWRVaW50MTYoKTtyZXR1cm4gZX1yZWFkSW50OCgpe2xldCB0PXRoaXMudS5nZXRJbnQ4KHRoaXMuXyk7cmV0dXJuIHRoaXMuXys9MSx0fXJlYWRWZWMzKCl7bGV0IHQ9bmV3IEZsb2F0MzJBcnJheSgzKTtyZXR1cm4gdFswXT10aGlzLnJlYWRTaW5nbGUoKSx0WzFdPXRoaXMucmVhZFNpbmdsZSgpLHRbMl09dGhpcy5yZWFkU2luZ2xlKCksdH1yZWFkRmxvYXQzMkFycmF5KHQpe2xldCBlPW5ldyBGbG9hdDMyQXJyYXkodCk7Zm9yKGxldCByPTA7cjx0O3IrKyllW3JdPXRoaXMucmVhZFNpbmdsZSgpO3JldHVybiBlfXJlYWRVaW50MzJBcnJheSh0KXtsZXQgZT1uZXcgVWludDMyQXJyYXkodCk7Zm9yKGxldCByPTA7cjx0O3IrKyllW3JdPXRoaXMucmVhZFVpbnQzMigpO3JldHVybiBlfXJlYWRVaW50OEFycmF5KHQpe2xldCBlPW5ldyBVaW50OEFycmF5KHQpO2ZvcihsZXQgcj0wO3I8dDtyKyspZVtyXT10aGlzLnJlYWRVaW50OCgpO3JldHVybiBlfXJlYWROb3JtYWwoKXtsZXQgdD1uZXcgRmxvYXQzMkFycmF5KDMpLGU9dGhpcy5yZWFkVWludDgoKSxyPXRoaXMucmVhZFVpbnQ4KCksbj10aGlzLnJlYWRCb29sZWFuKCksaT1lLzI1NSpNYXRoLlBJLHM9ci8yNTUqTWF0aC5QSTtyZXR1cm4gbiYmKGkrPU1hdGguUEkpLHRbMF09TWF0aC5zaW4ocykqTWF0aC5jb3MoaSksdFsxXT1NYXRoLnNpbihzKSpNYXRoLnNpbihpKSx0WzJdPU1hdGguY29zKHMpLHR9cmVhZE5vcm1hbHModCl7bGV0IGU9bmV3IEFycmF5KHQpO2ZvcihsZXQgcj0wO3I8dDtyKyspZVtyXT10aGlzLnJlYWROb3JtYWwoKTtyZXR1cm4gZX1yZWFkU3RyaW5nKCl7bGV0IHQ9dGhpcy5yZWFkSW50MzIoKTtpZigwPT10KXJldHVybiIiO2xldCBlPXRoaXMucmVhZFVpbnQ4QXJyYXkodCk7cmV0dXJuIHRoaXMuZGVjb2Rlci5kZWNvZGUoZSl9fWNsYXNzIFR5cGV7aWQ7bmFtZTtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuaWQ9dCx0aGlzLm5hbWU9ZX19Y2xhc3MgU3RvcmV5e2lkO2luZGV4O25hbWU7ZWxldmF0aW9uO2NvbnN0cnVjdG9yKHQsZSxyLG4pe3RoaXMuaWQ9dCx0aGlzLmluZGV4PWUsdGhpcy5uYW1lPXIsdGhpcy5lbGV2YXRpb249bn19Y2xhc3MgTWF0ZXJpYWx7ZGF0YT1uZXcgSW50MzJBcnJheSgyKTtnZXQgaWQoKXtyZXR1cm4gdGhpcy5kYXRhWzBdfXNldCBpZCh0KXt0aGlzLmRhdGFbMF09dH1nZXQgb2Zmc2V0KCl7cmV0dXJuIHRoaXMuZGF0YVsxXX1zZXQgb2Zmc2V0KHQpe3RoaXMuZGF0YVsxXT10fWNvbG9yPW5ldyBVaW50OEFycmF5KDQpO2dldCBSKCl7cmV0dXJuIHRoaXMuY29sb3JbMF19c2V0IFIodCl7dGhpcy5jb2xvclswXT10fWdldCBHKCl7cmV0dXJuIHRoaXMuY29sb3JbMV19c2V0IEcodCl7dGhpcy5jb2xvclsxXT10fWdldCBCKCl7cmV0dXJuIHRoaXMuY29sb3JbMl19c2V0IEIodCl7dGhpcy5jb2xvclsyXT10fWdldCBBKCl7cmV0dXJuIHRoaXMuY29sb3JbM119c2V0IEEodCl7dGhpcy5jb2xvclszXT10fW1kYXRhPW5ldyBVaW50OEFycmF5KDQpO2dldCBSb3VnaG5lc3MoKXtyZXR1cm4gdGhpcy5tZGF0YVswXX1zZXQgUm91Z2huZXNzKHQpe3RoaXMubWRhdGFbMF09dH1nZXQgTWV0YWxsaWMoKXtyZXR1cm4gdGhpcy5tZGF0YVsxXX1zZXQgTWV0YWxsaWModCl7dGhpcy5tZGF0YVsxXT10fWdldCBTcGVjdWxhcigpe3JldHVybiB0aGlzLm1kYXRhWzJdfXNldCBTcGVjdWxhcih0KXt0aGlzLm1kYXRhWzJdPXR9Z2V0IEFtYmllbnRPY2NsdXNpb24oKXtyZXR1cm4gdGhpcy5tZGF0YVszXX1zZXQgQW1iaWVudE9jY2x1c2lvbih0KXt0aGlzLm1kYXRhWzNdPXR9Z2V0IHRyYW5zcGFyZW50KCl7cmV0dXJuIHRoaXMuY29sb3JbM119Y29uc3RydWN0b3IoKXt9fXZhciB0PSJ1bmRlZmluZWQiIT10eXBlb2YgRmxvYXQzMkFycmF5P0Zsb2F0MzJBcnJheTpBcnJheTtmdW5jdGlvbiBjbG9uZShlKXt2YXIgcj1uZXcgdCgxNik7cmV0dXJuIHJbMF09ZVswXSxyWzFdPWVbMV0sclsyXT1lWzJdLHJbM109ZVszXSxyWzRdPWVbNF0scls1XT1lWzVdLHJbNl09ZVs2XSxyWzddPWVbN10scls4XT1lWzhdLHJbOV09ZVs5XSxyWzEwXT1lWzEwXSxyWzExXT1lWzExXSxyWzEyXT1lWzEyXSxyWzEzXT1lWzEzXSxyWzE0XT1lWzE0XSxyWzE1XT1lWzE1XSxyfWZ1bmN0aW9uIHNjYWxlJDEodCxlLHIpe3ZhciBuPXJbMF0saT1yWzFdLHM9clsyXTtyZXR1cm4gdFswXT1lWzBdKm4sdFsxXT1lWzFdKm4sdFsyXT1lWzJdKm4sdFszXT1lWzNdKm4sdFs0XT1lWzRdKmksdFs1XT1lWzVdKmksdFs2XT1lWzZdKmksdFs3XT1lWzddKmksdFs4XT1lWzhdKnMsdFs5XT1lWzldKnMsdFsxMF09ZVsxMF0qcyx0WzExXT1lWzExXSpzLHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdLHR9ZnVuY3Rpb24gZ2V0U2NhbGluZyh0LGUpe3ZhciByPWVbMF0sbj1lWzFdLGk9ZVsyXSxzPWVbNF0sYT1lWzVdLGw9ZVs2XSxvPWVbOF0saD1lWzldLHU9ZVsxMF07cmV0dXJuIHRbMF09TWF0aC5oeXBvdChyLG4saSksdFsxXT1NYXRoLmh5cG90KHMsYSxsKSx0WzJdPU1hdGguaHlwb3QobyxoLHUpLHR9ZnVuY3Rpb24gZ2V0Um90YXRpb24oZSxyKXt2YXIgbj1uZXcgdCgzKTtnZXRTY2FsaW5nKG4scik7dmFyIGk9MS9uWzBdLHM9MS9uWzFdLGE9MS9uWzJdLGw9clswXSppLG89clsxXSpzLGg9clsyXSphLHU9cls0XSppLGM9cls1XSpzLGQ9cls2XSphLGY9cls4XSppLHc9cls5XSpzLF89clsxMF0qYSxnPWwrYytfLHk9MDtyZXR1cm4gZz4wPyh5PTIqTWF0aC5zcXJ0KGcrMSksZVszXT0uMjUqeSxlWzBdPShkLXcpL3ksZVsxXT0oZi1oKS95LGVbMl09KG8tdSkveSk6bD5jJiZsPl8/KHk9MipNYXRoLnNxcnQoMStsLWMtXyksZVszXT0oZC13KS95LGVbMF09LjI1KnksZVsxXT0obyt1KS95LGVbMl09KGYraCkveSk6Yz5fPyh5PTIqTWF0aC5zcXJ0KDErYy1sLV8pLGVbM109KGYtaCkveSxlWzBdPShvK3UpL3ksZVsxXT0uMjUqeSxlWzJdPShkK3cpL3kpOih5PTIqTWF0aC5zcXJ0KDErXy1sLWMpLGVbM109KG8tdSkveSxlWzBdPShmK2gpL3ksZVsxXT0oZCt3KS95LGVbMl09LjI1KnkpLGV9ZnVuY3Rpb24gY3JlYXRlJDIoKXt2YXIgZT1uZXcgdCgzKTtyZXR1cm4gdCE9RmxvYXQzMkFycmF5JiYoZVswXT0wLGVbMV09MCxlWzJdPTApLGV9ZnVuY3Rpb24gbGVuZ3RoKHQpe3ZhciBlPXRbMF0scj10WzFdLG49dFsyXTtyZXR1cm4gTWF0aC5oeXBvdChlLHIsbil9ZnVuY3Rpb24gZnJvbVZhbHVlcyhlLHIsbil7dmFyIGk9bmV3IHQoMyk7cmV0dXJuIGlbMF09ZSxpWzFdPXIsaVsyXT1uLGl9ZnVuY3Rpb24gYWRkKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdK3JbMF0sdFsxXT1lWzFdK3JbMV0sdFsyXT1lWzJdK3JbMl0sdH1mdW5jdGlvbiBzY2FsZSh0LGUscil7cmV0dXJuIHRbMF09ZVswXSpyLHRbMV09ZVsxXSpyLHRbMl09ZVsyXSpyLHR9ZnVuY3Rpb24gZGlzdGFuY2UodCxlKXt2YXIgcj1lWzBdLXRbMF0sbj1lWzFdLXRbMV0saT1lWzJdLXRbMl07cmV0dXJuIE1hdGguaHlwb3QocixuLGkpfWZ1bmN0aW9uIG5vcm1hbGl6ZSQyKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLHM9cipyK24qbitpKmk7cmV0dXJuIHM+MCYmKHM9MS9NYXRoLnNxcnQocykpLHRbMF09ZVswXSpzLHRbMV09ZVsxXSpzLHRbMl09ZVsyXSpzLHR9ZnVuY3Rpb24gZG90KHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV0rdFsyXSplWzJdfWZ1bmN0aW9uIGNyb3NzKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxzPWVbMl0sYT1yWzBdLGw9clsxXSxvPXJbMl07cmV0dXJuIHRbMF09aSpvLXMqbCx0WzFdPXMqYS1uKm8sdFsyXT1uKmwtaSphLHR9ZnVuY3Rpb24gdHJhbnNmb3JtTWF0NCh0LGUscil7dmFyIG49ZVswXSxpPWVbMV0scz1lWzJdLGE9clszXSpuK3JbN10qaStyWzExXSpzK3JbMTVdO3JldHVybiBhPWF8fDEsdFswXT0oclswXSpuK3JbNF0qaStyWzhdKnMrclsxMl0pL2EsdFsxXT0oclsxXSpuK3JbNV0qaStyWzldKnMrclsxM10pL2EsdFsyXT0oclsyXSpuK3JbNl0qaStyWzEwXSpzK3JbMTRdKS9hLHR9TWF0aC5oeXBvdHx8KE1hdGguaHlwb3Q9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPWFyZ3VtZW50cy5sZW5ndGg7ZS0tOyl0Kz1hcmd1bWVudHNbZV0qYXJndW1lbnRzW2VdO3JldHVybiBNYXRoLnNxcnQodCl9KTt2YXIgc3ViPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdLXJbMF0sdFsxXT1lWzFdLXJbMV0sdFsyXT1lWzJdLXJbMl0sdH07ZnVuY3Rpb24gY3JlYXRlKCl7dmFyIGU9bmV3IHQoNCk7cmV0dXJuIHQhPUZsb2F0MzJBcnJheSYmKGVbMF09MCxlWzFdPTAsZVsyXT0wKSxlWzNdPTEsZX1jcmVhdGUkMigpLGZ1bmN0aW9uKCl7dmFyIGUscj0oZT1uZXcgdCg0KSx0IT1GbG9hdDMyQXJyYXkmJihlWzBdPTAsZVsxXT0wLGVbMl09MCxlWzNdPTApLGUpfSgpO3ZhciBlLHIsbm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLHM9ZVszXSxhPXIqcituKm4raSppK3MqcztyZXR1cm4gYT4wJiYoYT0xL01hdGguc3FydChhKSksdFswXT1yKmEsdFsxXT1uKmEsdFsyXT1pKmEsdFszXT1zKmEsdH07Y3JlYXRlJDIoKSxmcm9tVmFsdWVzKDEsMCwwKSxmcm9tVmFsdWVzKDAsMSwwKSxjcmVhdGUoKSxjcmVhdGUoKSxlPW5ldyB0KDkpLHQhPUZsb2F0MzJBcnJheSYmKGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNV09MCxlWzZdPTAsZVs3XT0wKSxlWzBdPTEsZVs0XT0xLGVbOF09MTtjbGFzcyBHZW9tZXRyeXtkYXRhPW5ldyBJbnQzMkFycmF5KDQpO2dldCBpZCgpe3JldHVybiB0aGlzLmRhdGFbMF19c2V0IGlkKHQpe3RoaXMuZGF0YVswXT10fWdldCBvZmZzZXQoKXtyZXR1cm4gdGhpcy5kYXRhWzFdfXNldCBvZmZzZXQodCl7dGhpcy5kYXRhWzFdPXR9Z2V0IHBvaW50Q291bnQoKXtyZXR1cm4gdGhpcy5kYXRhWzJdfXNldCBwb2ludENvdW50KHQpe3RoaXMuZGF0YVsyXT10fXBvaW50cz1uZXcgRmxvYXQzMkFycmF5KDApO2VkZ2VzPW51bGw7ZmFjZXM9W107cD0hMTtjb25zdHJ1Y3Rvcigpe31nZXRfcG9pbnQodCl7cmV0dXJuIHRoaXMucG9pbnRzLnNsaWNlKDMqdCwzKih0KzEpKX1nZXRfZmFjZV9jZW50ZXIodCl7bGV0IGU9dGhpcy5mYWNlc1t0XS5pbmRpY2VzLHI9ZS5sZW5ndGgsbj1bMCwwLDBdO2ZvcihsZXQgdD0wO3Q8cjt0Kyspe249YWRkKG4sbix0aGlzLmdldF9wb2ludChlW3RdKSl9cmV0dXJuIHNjYWxlKGNyZWF0ZSQyKCksbiwxL3IpfWdldF9mYWNlX25vcm1hbCh0KXtsZXQgZT10aGlzLmZhY2VzW3RdLHI9ZS5pbmRpY2VzWzBdLG49ZS5pbmRpY2VzWzFdLGk9ZS5pbmRpY2VzWzJdLHM9dGhpcy5nZXRfcG9pbnQociksYT10aGlzLmdldF9wb2ludChuKSxsPXRoaXMuZ2V0X3BvaW50KGkpLG89c3ViKGNyZWF0ZSQyKCksYSxzKSxoPXN1YihjcmVhdGUkMigpLGwsYSksdT1jcm9zcyhjcmVhdGUkMigpLG8saCk7cmV0dXJuIG5vcm1hbGl6ZSQyKHUsdSl9Z2V0X2ZhY2VfcG9pbnRfY291bnQoKXtpZigwPT10aGlzLmRhdGFbM10pe2xldCB0PTA7dGhpcy5mYWNlcy5mb3JFYWNoKChlPT57dCs9ZS5pbmRpY2VzLmxlbmd0aH0pKSx0aGlzLmRhdGFbM109dH1yZXR1cm4gdGhpcy5kYXRhWzNdfWdldF9saW5lKCl7bGV0IHQ9bmV3IE1hcCxlPXRoaXMuZmFjZXMubGVuZ3RoO2ZvcihsZXQgcj0wO3I8ZTtyKyspe3RoaXMuZmFjZXNbcl0uZ2V0X2dlb21ldHJ5X2xpbmUoKS5mb3JFYWNoKChlPT57dC5zZXQoZS5rZXksZSl9KSl9cmV0dXJuIEFycmF5LmZyb20odC52YWx1ZXMoKSl9fWNsYXNzIFNuYXBSZXN1bHR7dHlwZTtwb2ludDtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudHlwZT10LHRoaXMucG9pbnQ9ZX19Y2xhc3MgTGluZXtNO0k7djtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuTT10LHRoaXMuST1lLHRoaXMudj1zY2FsZShjcmVhdGUkMigpLGFkZChjcmVhdGUkMigpLHQsZSksLjUpfWdldF9zbmFwX3BvaW50KHQsZSl7aWYoZGlzdGFuY2UodCx0aGlzLk0pPGUpcmV0dXJuIG5ldyBTbmFwUmVzdWx0KCJlbmRwb2ludCIsdGhpcy5NKTtpZihkaXN0YW5jZSh0LHRoaXMuSSk8ZSlyZXR1cm4gbmV3IFNuYXBSZXN1bHQoImVuZHBvaW50Iix0aGlzLkkpO2lmKGRpc3RhbmNlKHQsdGhpcy52KTxlKXJldHVybiBuZXcgU25hcFJlc3VsdCgibWlkZGxlIix0aGlzLnYpO2xldCByPXN1YihjcmVhdGUkMigpLHRoaXMuSSx0aGlzLk0pO3I9bm9ybWFsaXplJDIoY3JlYXRlJDIoKSxyKTtsZXQgbj1zdWIoY3JlYXRlJDIoKSx0LHRoaXMuTSksaT1sZW5ndGgobikscz1NYXRoLmFicyhkb3QobixyKSk7aWYoTWF0aC5zcXJ0KGkqaS1zKnMpPGUpe2xldCB0PXNjYWxlKGNyZWF0ZSQyKCkscixzKSxlPWNyZWF0ZSQyKCk7cmV0dXJuIGU9YWRkKGUsdGhpcy5NLHQpLG5ldyBTbmFwUmVzdWx0KCJzdWJwb2ludCIsZSl9cmV0dXJuIG51bGx9fWNsYXNzIEdlb21ldHJ5TGluZXtTPW5ldyBVaW50MzJBcnJheSgyKTtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuU1swXT10LHRoaXMuU1sxXT1lfWdldCBzdGFydF9pbmRleCgpe3JldHVybiB0aGlzLlNbMF19c2V0IHN0YXJ0X2luZGV4KHQpe3RoaXMuU1sxXT10fWdldCBlbmRfaW5kZXgoKXtyZXR1cm4gdGhpcy5TWzFdfXNldCBlbmRfaW5kZXgodCl7dGhpcy5TWzFdPXR9Z2V0IGtleSgpe2xldCB0PXRoaXMuUztyZXR1cm5gJHtNYXRoLm1pbih0WzBdLHRbMV0pfV8ke01hdGgubWF4KHRbMF0sdFsxXSl9YH1nZXRfbGluZSh0KXtsZXQgZT10LmdldF9wb2ludCh0aGlzLnN0YXJ0X2luZGV4KSxyPXQuZ2V0X3BvaW50KHRoaXMuZW5kX2luZGV4KTtyZXR1cm4gbmV3IExpbmUoZSxyKX19Y2xhc3MgRmFjZXtpc1BsYW5hcjtpbmRpY2VzO25vcm1hbHM7ZGF0YT1uZXcgSW50MzJBcnJheSgyKTtnZXQgc3RhcnQoKXtyZXR1cm4gdGhpcy5kYXRhWzBdfXNldCBzdGFydCh0KXt0aGlzLmRhdGFbMF09dH1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuZGF0YVsxXX1zZXQgbGVuZ3RoKHQpe3RoaXMuZGF0YVsxXT10fWNvbnN0cnVjdG9yKCl7fWdldF9nZW9tZXRyeV9saW5lKCl7bGV0IHQ9dGhpcy5pbmRpY2VzLmxlbmd0aCxlPW5ldyBNYXA7Zm9yKGxldCByPTA7cjx0O3IrPTMpe2xldCB0PW5ldyBHZW9tZXRyeUxpbmUodGhpcy5pbmRpY2VzW3JdLHRoaXMuaW5kaWNlc1tyKzFdKSxuPXQua2V5O2UuaGFzKG4pP2UuZ2V0KG4pLnB1c2godCk6ZS5zZXQobixbdF0pLHQ9bmV3IEdlb21ldHJ5TGluZSh0aGlzLmluZGljZXNbcisxXSx0aGlzLmluZGljZXNbcisyXSksbj10LmtleSxlLmhhcyhuKT9lLmdldChuKS5wdXNoKHQpOmUuc2V0KG4sW3RdKSx0PW5ldyBHZW9tZXRyeUxpbmUodGhpcy5pbmRpY2VzW3IrMl0sdGhpcy5pbmRpY2VzW3JdKSxuPXQua2V5LGUuaGFzKG4pP2UuZ2V0KG4pLnB1c2godCk6ZS5zZXQobixbdF0pfWxldCByPVtdO3JldHVybiBlLmZvckVhY2goKHQ9PnsxPT10Lmxlbmd0aCYmci5wdXNoKHRbMF0pfSkpLHJ9fWNsYXNzIEVsZW1lbnR7Y29uc3RydWN0b3IoKXt9Z2V0IGlkKCl7cmV0dXJuIHModGhpcykuaWR9Z2V0IG5hbWUoKXtyZXR1cm4gcyh0aGlzKS5EfWdldCBvcmlnaW5JZCgpe3JldHVybiBzKHRoaXMpLm9yaWdpbklkfWdldCBpbmRleCgpe3JldHVybiBzKHRoaXMpLmluZGV4fWdldCB0eXBlSWQoKXtyZXR1cm4gcyh0aGlzKS50eXBlSWR9Z2V0IHN0b3JleV9pbmRleCgpe3JldHVybiBzKHRoaXMpLnN0b3JleV9pbmRleH1nZXQgY2F0ZWdvcnkoKXtyZXR1cm4gcyh0aGlzKS5jYXRlZ29yeX1nZXQgdmlzaWJsZSgpe3JldHVybiBzKHRoaXMpLlV9Z2V0IGxvY2tlZCgpe3JldHVybiBzKHRoaXMpLkZ9Z2V0IGJsb29tKCl7cmV0dXJuIHModGhpcykuJH1nZXQgaW5zdGFuY2VzKCl7bGV0IHQ9cyh0aGlzKS5rLGU9dC5sZW5ndGgscj1uZXcgQXJyYXkoZSk7Zm9yKGxldCBuPTA7bjxlO24rKylyW25dPXRbbl0uVDtyZXR1cm4gcn1nZXQgbW9kZWxfdHlwZSgpe3JldHVybiBzKHRoaXMpLlB9Z2V0X2JveCgpe3JldHVybiBzKHRoaXMpLmdldF9ib3goKX1nZXQgbG9jYXRpb24oKXtyZXR1cm4gcyh0aGlzKS5OKCl9fSFmdW5jdGlvbih0KXt0W3QuTWFpbk1vZGVsPTBdPSJNYWluTW9kZWwiLHRbdC5TY2VuZU1vZGVsPTFdPSJTY2VuZU1vZGVsIix0W3QuTmV3TW9kZWw9Ml09Ik5ld01vZGVsIix0W3QuVGVtcGxhdGU9M109IlRlbXBsYXRlIn0ocnx8KHI9e30pKTtjb25zdCBuPW5ldyBXZWFrTWFwO2NsYXNzIGl7Z2V0IFQoKXtsZXQgdD1uZXcgRWxlbWVudDtyZXR1cm4gbi5zZXQodCx0aGlzKSx0fVY9bmV3IEludDMyQXJyYXkoNCk7TD1uZXcgSW50MTZBcnJheSgyKTtnZXQgaWQoKXtyZXR1cm4gdGhpcy5WWzBdfXNldCBpZCh0KXt0aGlzLlZbMF09dH1nZXQgb3JpZ2luSWQoKXtyZXR1cm4gdGhpcy5WWzNdfXNldCBvcmlnaW5JZCh0KXt0aGlzLlZbM109dH1nZXQgaW5kZXgoKXtyZXR1cm4gdGhpcy5WWzFdfXNldCBpbmRleCh0KXt0aGlzLlZbMV09dH1nZXQgdHlwZUlkKCl7cmV0dXJuIHRoaXMuVlsyXX1zZXQgdHlwZUlkKHQpe3RoaXMuVlsyXT10fWdldCBzdG9yZXlfaW5kZXgoKXtyZXR1cm4gdGhpcy5MWzBdfXNldCBzdG9yZXlfaW5kZXgodCl7dGhpcy5MWzBdPXR9c2V0IGNhdGVnb3J5KHQpe3RoaXMuTFsxXT10fWdldCBjYXRlZ29yeSgpe3JldHVybiB0aGlzLkxbMV19az1bXTtjb25zdHJ1Y3Rvcigpe3RoaXMuVT0hMH1VPSEwO1c9ITA7Rj0hMTtDPSExO1A9ci5NYWluTW9kZWw7JD0hMTtPPSExO0Q7cTtnZXRfYm94KCl7aWYodGhpcy5xKXJldHVybiB0aGlzLnE7bGV0IHQ9TnVtYmVyLk1BWF9WQUxVRSxlPU51bWJlci5NQVhfVkFMVUUscj1OdW1iZXIuTUFYX1ZBTFVFLG49LU51bWJlci5NQVhfVkFMVUUsaT0tTnVtYmVyLk1BWF9WQUxVRSxzPS1OdW1iZXIuTUFYX1ZBTFVFLGE9dGhpcy5rLmxlbmd0aDtmb3IobGV0IGw9MDtsPGE7bCsrKXtsZXQgYT10aGlzLmtbbF07aWYoYS5oYXNfbWF0cml4KXtsZXQgbD1hLmdlb21ldHJ5LG89bC5wb2ludHMsaD1hLkssdT1sLnBvaW50Q291bnQ7Zm9yKGxldCBhPTA7YTx1O2ErKyl7bGV0IGw9b1szKmFdLHU9b1szKmErMV0sYz1vWzMqYSsyXSxkPXRyYW5zZm9ybU1hdDQoY3JlYXRlJDIoKSxmcm9tVmFsdWVzKGwsdSxjKSxoKTtsPWRbMF0sdT1kWzFdLGM9ZFsyXSxsPHQmJih0PWwpLHU8ZSYmKGU9dSksYzxyJiYocj1jKSxsPm4mJihuPWwpLHU+aSYmKGk9dSksYz5zJiYocz1jKX19ZWxzZXtsZXQgbD1hLmdlb21ldHJ5LG89bC5wb2ludHMsaD1sLnBvaW50Q291bnQ7Zm9yKGxldCBhPTA7YTxoO2ErKyl7bGV0IGw9b1szKmFdLGg9b1szKmErMV0sdT1vWzMqYSsyXTtsPHQmJih0PWwpLGg8ZSYmKGU9aCksdTxyJiYocj11KSxsPm4mJihuPWwpLGg+aSYmKGk9aCksdT5zJiYocz11KX19fXJldHVybiB0aGlzLnE9bmV3IEZsb2F0MzJBcnJheShbdCxlLHIsbixpLHNdKSx0aGlzLnF9Z2V0X2ZhY2VfY2VudGVyKHQsZSl7bGV0IHI9dGhpcy5rW3RdLG49ci5nZW9tZXRyeS5nZXRfZmFjZV9jZW50ZXIoZSk7aWYoci5oYXNfbWF0cml4KXtsZXQgdD1yLks7bj10cmFuc2Zvcm1NYXQ0KGNyZWF0ZSQyKCksbix0KX1yZXR1cm4gbn1nZXRfZmFjZV9ub3JtYWwodCxlKXtsZXQgcj10aGlzLmtbdF0sbj1yLmdlb21ldHJ5LmdldF9mYWNlX25vcm1hbChlKTtpZihyLmhhc19tYXRyaXgpe2xldCB0PWdldFJvdGF0aW9uKGNyZWF0ZSgpLHIuSyk7bj1mdW5jdGlvbih0LGUscil7dmFyIG49clswXSxpPXJbMV0scz1yWzJdLGE9clszXSxsPWVbMF0sbz1lWzFdLGg9ZVsyXSx1PWkqaC1zKm8sYz1zKmwtbipoLGQ9bipvLWkqbCxmPWkqZC1zKmMsdz1zKnUtbipkLF89bipjLWkqdSxnPTIqYTtyZXR1cm4gdSo9ZyxjKj1nLGQqPWcsZio9Mix3Kj0yLF8qPTIsdFswXT1sK3UrZix0WzFdPW8rYyt3LHRbMl09aCtkK18sdH0oY3JlYXRlJDIoKSxuLHQpfXJldHVybiBufU4oKXtsZXQgdD10aGlzLmtbMF07aWYodC5oYXNfbWF0cml4KXtsZXQgZT1jbG9uZSh0LkspLHI9Z2V0U2NhbGluZyhjcmVhdGUkMigpLGUpO3JldHVybiBzY2FsZSQxKGUsZSxbMS9yWzBdLDEvclsxXSwxL3JbMl1dKSxmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMTJdLHRbMV09ZVsxM10sdFsyXT1lWzE0XSx0fShjcmVhdGUkMigpLGUpfXJldHVybiBmcm9tVmFsdWVzKDAsMCwwKX1qKCl7bGV0IHQ9dGhpcy5rWzBdO2lmKHQuaGFzX21hdHJpeCl7bGV0IGU9Y2xvbmUodC5LKSxyPWdldFNjYWxpbmcoY3JlYXRlJDIoKSxlKTtlPXNjYWxlJDEoZSxlLFsxL3JbMF0sMS9yWzFdLDEvclsyXV0pO2xldCBuPWdldFJvdGF0aW9uKGNyZWF0ZSgpLGUpO3JldHVybiBub3JtYWxpemUobixuKX1yZXR1cm4gY3JlYXRlKCl9fWZ1bmN0aW9uIHModCl7cmV0dXJuIG4uZ2V0KHQpfWNsYXNzIEluc3RhbmNle2NvbnN0cnVjdG9yKCl7fWdldCBtYXRyaXgoKXtyZXR1cm4gbyh0aGlzKS5LfWdldCBjb2xvcigpe2xldCB0PW8odGhpcyk7cmV0dXJuIG51bGwhPXQuSD90Lkg6dC5tYXRlcmlhbC5jb2xvcn1nZXQgbWF0ZXJpYWxfaWQoKXtyZXR1cm4gbyh0aGlzKS5tYXRlcmlhbF9pZH1nZXQgaWQoKXtyZXR1cm4gbyh0aGlzKS5pZH19Y2xhc3MgSW5zdGFuY2VGYWNle2RhdGE9bmV3IEludDMyQXJyYXkoMyk7Z2V0IHN0YXJ0KCl7cmV0dXJuIHRoaXMuZGF0YVswXX1zZXQgc3RhcnQodCl7dGhpcy5kYXRhWzBdPXR9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmRhdGFbMV19c2V0IGxlbmd0aCh0KXt0aGlzLmRhdGFbMV09dH1zdGF0aWMgaWQ9MTtjb25zdHJ1Y3Rvcigpe3RoaXMuZGF0YVsyXT1JbnN0YW5jZUZhY2UuaWQsSW5zdGFuY2VGYWNlLmlkKyt9fWNvbnN0IGE9bmV3IFdlYWtNYXA7Y2xhc3MgbHtnZXQgVCgpe2xldCB0PW5ldyBJbnN0YW5jZTtyZXR1cm4gYS5zZXQodCx0aGlzKSx0fVY9bmV3IEludDMyQXJyYXkoOCk7Z2V0IGlkKCl7cmV0dXJuIHRoaXMuVlswXX1zZXQgaWQodCl7dGhpcy5WWzBdPXR9Z2V0IGluZGV4KCl7cmV0dXJuIHRoaXMuVls3XX1zZXQgaW5kZXgodCl7dGhpcy5WWzddPXR9Z2V0IGVsZW1lbnRJZCgpe3JldHVybiB0aGlzLlZbMV19c2V0IGVsZW1lbnRJZCh0KXt0aGlzLlZbMV09dH1lbGVtZW50PW51bGw7Z2V0IHN0YXJ0KCl7cmV0dXJuIHRoaXMuVlsyXX1zZXQgc3RhcnQodCl7dGhpcy5WWzJdPXR9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLlZbM119c2V0IGxlbmd0aCh0KXt0aGlzLlZbM109dH1nZXQgaGFzX21hdHJpeCgpe3JldHVybiBudWxsIT10aGlzLksmJjE2PT10aGlzLksubGVuZ3RofUs9bnVsbDtnZXQgbWF0cml4X29mZnNldCgpe3JldHVybiB0aGlzLlZbNF19c2V0IG1hdHJpeF9vZmZzZXQodCl7dGhpcy5WWzRdPXR9SD1udWxsO2dldCBtYXRlcmlhbF9pZCgpe3JldHVybiB0aGlzLlZbNV19c2V0IG1hdGVyaWFsX2lkKHQpe3RoaXMuVls1XT10fW1hdGVyaWFsPW5ldyBNYXRlcmlhbDtnZXQgZ2VvbWV0cnlfaWQoKXtyZXR1cm4gdGhpcy5WWzZdfXNldCBnZW9tZXRyeV9pZCh0KXt0aGlzLlZbNl09dH1nZW9tZXRyeT1udWxsO2ZhY2VzPVtdO2lzX3RyYW5zcGFyZW50KCl7cmV0dXJuIG51bGwhPXRoaXMuSD90aGlzLkhbM108MjU1OnRoaXMubWF0ZXJpYWwudHJhbnNwYXJlbnQ8MjU1fWdldF9jb2xvcigpe3JldHVybiBudWxsIT10aGlzLkg/dGhpcy5IOnRoaXMubWF0ZXJpYWwuY29sb3J9Y29uc3RydWN0b3IoKXt9fWZ1bmN0aW9uIG8odCl7cmV0dXJuIGEuZ2V0KHQpfWNsYXNzIFN0cmVhbVJlYWRlcntfPTA7Z2V0IFBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX31tPTA7dTtkZWNvZGVyPW5ldyBUZXh0RGVjb2Rlcjtjb25zdHJ1Y3Rvcih0KXt0aGlzLnU9bmV3IERhdGFWaWV3KHQpLHRoaXMubT10LmJ5dGVMZW5ndGh9aGFzRW5kKCl7cmV0dXJuIHRoaXMuXz49dGhpcy5tfXJlYWRJbnQzMigpe2xldCB0PXRoaXMudS5nZXRJbnQzMih0aGlzLl8sITApO3JldHVybiB0aGlzLl8rPTQsdH1yZWFkSW50MzJBcnJheSh0KXtsZXQgZT1uZXcgSW50MzJBcnJheSh0KTtmb3IobGV0IHI9MDtyPHQ7cisrKWVbcl09dGhpcy5yZWFkSW50MzIoKTtyZXR1cm4gZX1yZWFkVWludDMyKCl7bGV0IHQ9dGhpcy51LmdldFVpbnQzMih0aGlzLl8sITApO3JldHVybiB0aGlzLl8rPTQsdH1yZWFkU2luZ2xlKCl7bGV0IHQ9dGhpcy51LmdldEZsb2F0MzIodGhpcy5fLCEwKTtyZXR1cm4gdGhpcy5fKz00LHR9cmVhZEJvb2xlYW4oKXtsZXQgdD10aGlzLnUuZ2V0VWludDgodGhpcy5fKTtyZXR1cm4gdGhpcy5fKz0xLDE9PXR9cmVhZFVpbnQ4KCl7bGV0IHQ9dGhpcy51LmdldFVpbnQ4KHRoaXMuXyk7cmV0dXJuIHRoaXMuXys9MSx0fXJlYWRVaW50MTYoKXtsZXQgdD10aGlzLnUuZ2V0VWludDE2KHRoaXMuXywhMCk7cmV0dXJuIHRoaXMuXys9Mix0fXJlYWRVaW50MTZBcnJheSh0KXtsZXQgZT1uZXcgVWludDE2QXJyYXkodCk7Zm9yKGxldCByPTA7cjx0O3IrKyllW3JdPXRoaXMucmVhZFVpbnQxNigpO3JldHVybiBlfXJlYWRJbnQ4KCl7bGV0IHQ9dGhpcy51LmdldEludDgodGhpcy5fKTtyZXR1cm4gdGhpcy5fKz0xLHR9cmVhZFZlYzMoKXtsZXQgdD1uZXcgRmxvYXQzMkFycmF5KDMpO3JldHVybiB0WzBdPXRoaXMucmVhZFNpbmdsZSgpLHRbMV09dGhpcy5yZWFkU2luZ2xlKCksdFsyXT10aGlzLnJlYWRTaW5nbGUoKSx0fXJlYWRGbG9hdDMyQXJyYXkodCl7bGV0IGU9bmV3IEZsb2F0MzJBcnJheSh0KTtmb3IobGV0IHI9MDtyPHQ7cisrKWVbcl09dGhpcy5yZWFkU2luZ2xlKCk7cmV0dXJuIGV9cmVhZFVpbnQzMkFycmF5KHQpe2xldCBlPW5ldyBVaW50MzJBcnJheSh0KTtmb3IobGV0IHI9MDtyPHQ7cisrKWVbcl09dGhpcy5yZWFkVWludDMyKCk7cmV0dXJuIGV9cmVhZFVpbnQ4QXJyYXkodCl7bGV0IGU9bmV3IFVpbnQ4QXJyYXkodCk7Zm9yKGxldCByPTA7cjx0O3IrKyllW3JdPXRoaXMucmVhZFVpbnQ4KCk7cmV0dXJuIGV9cmVhZE5vcm1hbCgpe2xldCB0PW5ldyBGbG9hdDMyQXJyYXkoMyksZT10aGlzLnJlYWRVaW50OCgpLHI9dGhpcy5yZWFkVWludDgoKSxuPXRoaXMucmVhZEJvb2xlYW4oKSxpPWUvMjU1Kk1hdGguUEkscz1yLzI1NSpNYXRoLlBJO3JldHVybiBuJiYoaSs9TWF0aC5QSSksdFswXT1NYXRoLnNpbihzKSpNYXRoLmNvcyhpKSx0WzFdPU1hdGguc2luKHMpKk1hdGguc2luKGkpLHRbMl09TWF0aC5jb3MocyksdH1yZWFkT3JpZ2luTm9ybWFsKCl7bGV0IHQ9dGhpcy5yZWFkVWludDgoKSxlPXRoaXMucmVhZFVpbnQ4KCk7cmV0dXJuIHRoaXMucmVhZEJvb2xlYW4oKT9uZXcgVWludDhBcnJheShbdCxlLDFdKTpuZXcgVWludDhBcnJheShbdCxlLDBdKX1yZWFkT3JpZ2luTm9ybWFscyh0KXtsZXQgZT1uZXcgQXJyYXkodCk7Zm9yKGxldCByPTA7cjx0O3IrKyllW3JdPXRoaXMucmVhZE9yaWdpbk5vcm1hbCgpO3JldHVybiBlfXJlYWROb3JtYWxzKHQpe2xldCBlPW5ldyBBcnJheSh0KTtmb3IobGV0IHI9MDtyPHQ7cisrKWVbcl09dGhpcy5yZWFkTm9ybWFsKCk7cmV0dXJuIGV9cmVhZFN0cmluZygpe2xldCB0PXRoaXMucmVhZEludDMyKCk7aWYoMD09dClyZXR1cm4iIjtsZXQgZT10aGlzLnJlYWRVaW50OEFycmF5KHQpO3JldHVybiB0aGlzLmRlY29kZXIuZGVjb2RlKGUpfX1jbGFzcyBTdHJlYW1Xcml0ZXJ7Xz0wO2dldCBwb3NpdGlvbigpe3JldHVybiB0aGlzLl99c2V0IHBvc2l0aW9uKHQpe3RoaXMuXz10fXU7ZW5jb2Rlcj1uZXcgVGV4dEVuY29kZXI7Y29uc3RydWN0b3IodCl7Im51bWJlciI9PXR5cGVvZiB0JiYodGhpcy51PW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIodCkpKSx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJih0aGlzLnU9bmV3IERhdGFWaWV3KHQpKX13cml0ZUJvb2xlYW4odCl7dD90aGlzLnUuc2V0VWludDgodGhpcy5fLDEpOnRoaXMudS5zZXRVaW50OCh0aGlzLl8sMCksdGhpcy5fKz0xfXdyaXRlU3RyaW5nKHQpe2xldCBlPXRoaXMuZW5jb2Rlci5lbmNvZGUodCkscj1lLmxlbmd0aDt0aGlzLndyaXRlSW50MzIocikscj4wJiZ0aGlzLndyaXRlVWludDhBcnJheShlKX13cml0ZUludDMyKHQpe3RoaXMudS5zZXRJbnQzMih0aGlzLl8sdCwhMCksdGhpcy5fKz00fXdyaXRlVWludDMyKHQpe3RoaXMudS5zZXRVaW50MzIodGhpcy5fLHQsITApLHRoaXMuXys9NH13cml0ZUludDMyQXJyYXkodCl7bGV0IGU9dC5sZW5ndGg7Zm9yKGxldCByPTA7cjxlO3IrKyl0aGlzLndyaXRlSW50MzIodFtyXSl9d3JpdGVVaW50MTYodCl7dGhpcy51LnNldFVpbnQxNih0aGlzLl8sdCwhMCksdGhpcy5fKz0yfXdyaXRlVWludDgodCl7dGhpcy51LnNldFVpbnQ4KHRoaXMuXyx0KSx0aGlzLl8rPTF9d3JpdGVVaW50OEFycmF5KHQpe2xldCBlPXQubGVuZ3RoO2ZvcihsZXQgcj0wO3I8ZTtyKyspdGhpcy53cml0ZVVpbnQ4KHRbcl0pfXdyaXRlU2luZ2xlKHQpe3RoaXMudS5zZXRGbG9hdDMyKHRoaXMuXyx0LCEwKSx0aGlzLl8rPTR9d3JpdGVGbG9hdDMyQWFycnkodCl7bGV0IGU9dC5sZW5ndGg7Zm9yKGxldCByPTA7cjxlO3IrKyl0aGlzLndyaXRlU2luZ2xlKHRbcl0pfXdyaXRlQ29sb3IodCl7bGV0IGU9dC5sZW5ndGg7dGhpcy53cml0ZVVpbnQ4KE1hdGguZmxvb3IoMjU1KnRbMF0pKSx0aGlzLndyaXRlVWludDgoTWF0aC5mbG9vcigyNTUqdFsxXSkpLHRoaXMud3JpdGVVaW50OChNYXRoLmZsb29yKDI1NSp0WzJdKSksND09ZT90aGlzLndyaXRlVWludDgoTWF0aC5mbG9vcigyNTUqdFszXSkpOnRoaXMud3JpdGVVaW50OCgyNTUpfWdldEFuZENsZWFyQnVmZmVyKCl7bGV0IHQ9dGhpcy51Py5idWZmZXI7cmV0dXJuIHRoaXMudT1udWxsLHR9fWxldCBoPW5ldyBUZXh0RW5jb2RlcjtmdW5jdGlvbiB3cml0ZV90eXBlKHQpe2lmKCF0JiZ0Lmxlbmd0aClyZXR1cm4gY29uc29sZS5sb2coIm5vIHR5cGVzIiksbnVsbDtsZXQgZT1mdW5jdGlvbih0KXtsZXQgZT10Lmxlbmd0aCxyPTQqZTtmb3IobGV0IG49MDtuPGU7bisrKXtsZXQgZT10W25dLm5hbWU7cis9aC5lbmNvZGUoZSkubGVuZ3RoKzR9cmV0dXJuIHJ9KHQpKzQscj1uZXcgU3RyZWFtV3JpdGVyKGUpLG49dC5sZW5ndGg7ci53cml0ZUludDMyKG4pO2ZvcihsZXQgZT0wO2U8bjtlKyspe2xldCBuPXRbZV07ci53cml0ZUludDMyKG4uaWQpLHIud3JpdGVTdHJpbmcobi5uYW1lKX1yZXR1cm4gci5nZXRBbmRDbGVhckJ1ZmZlcigpfWZ1bmN0aW9uIHdyaXRlX3N0b3JleSh0KXtpZighdCYmMD09dC5sZW5ndGgpcmV0dXJuIGNvbnNvbGUubG9nKCJubyBzdG9yZXlzIiksbnVsbDtsZXQgZT1mdW5jdGlvbih0KXtsZXQgZT10Lmxlbmd0aCxyPTEyKmU7Zm9yKGxldCBuPTA7bjxlO24rKyl7bGV0IGU9dFtuXS5uYW1lO3IrPWguZW5jb2RlKGUpLmxlbmd0aCs0fXJldHVybiByfSh0KSs0LHI9bmV3IFN0cmVhbVdyaXRlcihlKSxuPXQubGVuZ3RoO3Iud3JpdGVJbnQzMihuKTtmb3IobGV0IGU9MDtlPG47ZSsrKXtsZXQgbj10W2VdO3Iud3JpdGVJbnQzMihuLmlkKSxyLndyaXRlSW50MzIobi5pbmRleCksci53cml0ZVNpbmdsZShuLmVsZXZhdGlvbiksci53cml0ZVN0cmluZyhuLm5hbWUpfXJldHVybiByLmdldEFuZENsZWFyQnVmZmVyKCl9ZnVuY3Rpb24gd3JpdGVfZ2VvbWV0cnkodCl7bGV0IGU9ZnVuY3Rpb24odCl7bGV0IGU9dC5sZW5ndGgscj0xMiplO2ZvcihsZXQgbj0wO248ZTtuKyspe2xldCBlPXRbbl07cis9ZS5wb2ludHMuYnl0ZUxlbmd0aDtsZXQgaT1lLmZhY2VzLmxlbmd0aDtyKz01Kmk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7bGV0IG49ZS5mYWNlc1t0XTtyKz1uLmluZGljZXMuYnl0ZUxlbmd0aCxyKz1uLm5vcm1hbHMuYnl0ZUxlbmd0aH19cmV0dXJuIHJ9KHQpKzQscj1uZXcgU3RyZWFtV3JpdGVyKGUpLG49dC5sZW5ndGg7ci53cml0ZUludDMyKG4pO2ZvcihsZXQgZT0wO2U8bjtlKyspe2xldCBuPXRbZV07ci53cml0ZUludDMyKG4uaWQpLHIud3JpdGVJbnQzMihuLnBvaW50Q291bnQpLHIud3JpdGVGbG9hdDMyQWFycnkobi5wb2ludHMpO2xldCBpPW4uZmFjZXMscz1pLmxlbmd0aDtyLndyaXRlSW50MzIocyk7Zm9yKGxldCB0PTA7dDxzO3QrKyl7bGV0IGU9aVt0XTtyLndyaXRlQm9vbGVhbihlLmlzUGxhbmFyKTtsZXQgbj1lLmluZGljZXM7ci53cml0ZUludDMyKG4ubGVuZ3RoKSxyLndyaXRlSW50MzJBcnJheShuKSxyLndyaXRlVWludDhBcnJheShlLm5vcm1hbHMpfX1yZXR1cm4gci5nZXRBbmRDbGVhckJ1ZmZlcigpfWNsYXNzIFR5cGVUcmFuc2Zvcm1lcnt0b0RiKHQpe3JldHVybiB0fWZyb21EYih0KXtyZXR1cm4gdH19Y2xhc3MgU3RvcmV5VHJhbnNmb3JtZXJ7dG9EYih0KXtyZXR1cm4gdH1mcm9tRGIodCl7cmV0dXJuIHR9fWNsYXNzIE1hdGVyaWFsVHJhbnNmb3JtZXJ7dG9EYih0KXtyZXR1cm57aWQ6dC5pZCxjb2xvcjp0LmNvbG9yLG9mZnNldDp0Lm9mZnNldH19ZnJvbURiKHQpe2xldCBlPW5ldyBNYXRlcmlhbDtyZXR1cm4gZS5pZD10LmlkLGUuY29sb3I9dC5jb2xvcixlLm9mZnNldD10Lm9mZnNldCxlfX1jbGFzcyBHZW9tZXRyeVRyYW5zZm9ybWVye3RvRGIodCl7cmV0dXJue2lkOnQuaWQsZGF0YTp3cml0ZV9nZW9tZXRyeShbdF0pfX1mcm9tRGIodCl7cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPW5ldyBTdHJlYW1SZWFkZXIodCkscj1lLnJlYWRJbnQzMigpLG49bmV3IEFycmF5KHIpO2ZvcihsZXQgdD0wO3Q8cjt0Kyspe2xldCByPW5ldyBHZW9tZXRyeTtyLmlkPWUucmVhZEludDMyKCksci5wb2ludENvdW50PWUucmVhZEludDMyKCksci5wb2ludHM9ZS5yZWFkRmxvYXQzMkFycmF5KDMqci5wb2ludENvdW50KTtsZXQgaT1lLnJlYWRJbnQzMigpLHM9bmV3IEFycmF5KGkpO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2xldCByPWUucmVhZEJvb2xlYW4oKSxuPWUucmVhZEludDMyKCksaT1uZXcgRmFjZTtpLmlzUGxhbmFyPXIsaS5pbmRpY2VzPWUucmVhZEludDMyQXJyYXkobiksaS5ub3JtYWxzPXI/ZS5yZWFkVWludDhBcnJheSgzKTplLnJlYWRVaW50OEFycmF5KDMqbiksc1t0XT1pfXIuZmFjZXM9cyxuW3RdPXJ9cmV0dXJuIG59KHQuZGF0YSlbMF19fWNsYXNzIEVsZW1lbnRUcmFuc2Zvcm1lcnt0b0RiKHQpe3JldHVybntpZDp0LmlkLG9yaWdpbklkOnQub3JpZ2luSWQsaW5kZXg6dC5pbmRleCx0eXBlSWQ6dC50eXBlSWQsc3RvcmV5SW5kZXg6dC5zdG9yZXlfaW5kZXgsY2F0ZWdvcnk6dC5jYXRlZ29yeX19ZnJvbURiKHQpe2xldCBlPW5ldyBpO3JldHVybiBlLmlkPXQuaWQsZS5vcmlnaW5JZD10Lm9yaWdpbklkLGUuaW5kZXg9dC5pbmRleCxlLnR5cGVJZD10LnR5cGVJZCxlLnN0b3JleV9pbmRleD10LnN0b3JleUluZGV4LGUuY2F0ZWdvcnk9dC5jYXRlZ29yeSxlfX1jbGFzcyBJbnN0YW5jZVRyYW5zZm9ybWVye3RvRGIodCl7bGV0IGU9dC5mYWNlcyxyPWUubGVuZ3RoLG49bmV3IEFycmF5KHIpO2ZvcihsZXQgdD0wO3Q8cjt0Kyspblt0XT1lW3RdLmRhdGE7cmV0dXJue2lkOnQuaWQsaW5kZXg6dC5pbmRleCxlbGVtZW50SWQ6dC5lbGVtZW50SWQsc3RhcnQ6dC5zdGFydCxsZW5ndGg6dC5sZW5ndGgsbWF0cml4OnQuSyxtYXRyaXhPZmZzZXQ6dC5tYXRyaXhfb2Zmc2V0LG92ZXJyaWRlQ29sb3I6dC5ILG1hdGVyaWFsSWQ6dC5tYXRlcmlhbF9pZCxnZW9tZXRyeUlkOnQuZ2VvbWV0cnlfaWQsZmFjZXM6bn19ZnJvbURiKHQpe2xldCBlPW5ldyBsO2UuaWQ9dC5pZCxlLmluZGV4PXQuaW5kZXgsZS5lbGVtZW50SWQ9dC5lbGVtZW50SWQsZS5zdGFydD10LnN0YXJ0LGUubGVuZ3RoPXQubGVuZ3RoLGUuSz10Lm1hdHJpeCxlLm1hdHJpeF9vZmZzZXQ9dC5tYXRyaXhPZmZzZXQsZS5IPXQub3ZlcnJpZGVDb2xvcixlLm1hdGVyaWFsX2lkPXQubWF0ZXJpYWxJZCxlLmdlb21ldHJ5X2lkPXQuZ2VvbWV0cnlJZDtsZXQgcj10LmZhY2VzLG49ci5sZW5ndGgsaT1uZXcgQXJyYXkobik7Zm9yKGxldCB0PTA7dDxuO3QrKyl7bGV0IGU9bmV3IEluc3RhbmNlRmFjZTtlLmRhdGE9clt0XSxpW3RdPWV9cmV0dXJuIGUuZmFjZXM9aSxlfX1jbGFzcyBXb3JrZXJEYXRhRXhjaGFuZ2V7dHlwZV9idWZmZXI9bnVsbDtzdG9yZXlfYnVmZmVyPW51bGw7bWF0ZXJpYWxfYnVmZmVyPW51bGw7Z2VvbWV0cnlfYnVmZmVyPW51bGw7ZWxlbWVudF9idWZmZXI9bnVsbDtpbnN0YW5jZV9idWZmZXI9bnVsbDtnZW9fcG9pbnRfYnVmZmVyPW51bGw7aW5zdGFuY2VfdHJhbnNmb3JtX2J1ZmZlcj1udWxsO2luc3RhbmNlX3RyYW5zZm9ybV9vZmZzZXRfYnVmZmVyPW51bGw7cG9pbnRfYnVmZmVyPW51bGw7bm9ybWFsX2J1ZmZlcj1udWxsO2NvbG9yX2J1ZmZlcj1udWxsO2VsbWVudF9pZF9idWZmZXI9bnVsbDtpbnN0YW5jZV9pZF9idWZmZXI9bnVsbDtmYWNlX2lkX2J1ZmZlcj1udWxsO3BvaW50X29mZnNldDtib3g7dmVydGV4X2NvdW50fWNsYXNzIFNhZGlGbG93UmVhZGVye0o7dmVyc2lvbjt1bmlxdWVJZDtYPSExO2dldCBoZWFkX2xvYWRlZCgpe3JldHVybiB0aGlzLlh9WT0wO2dldCBzY2VuZV9wb2ludF9jb3VudCgpe3JldHVybiB0aGlzLll9Wj0wO3R0PTA7cTtnZXQgYm94KCl7cmV0dXJuIHRoaXMucX1ldD0wO3J0PVtdO2dldCB0eXBlcygpe3JldHVybiB0aGlzLnJ0fW50PTA7aXQ9W107Z2V0IHN0b3JleXMoKXtyZXR1cm4gdGhpcy5pdH1zdD0wO2x0PVtdO2dldCBtYXRlcmlhbHMoKXtyZXR1cm4gdGhpcy5sdH1vdD0wO2h0PVtdO2dldCBnZW9tZXRpZXMoKXtyZXR1cm4gdGhpcy5odH11dD0wO2N0PVtdO2dldCBlbGVtZW50cygpe3JldHVybiB0aGlzLmN0fWR0PTA7az1bXTtnZXQgaW5zdGFuY2VzKCl7cmV0dXJuIHRoaXMua31jb25zdHJ1Y3Rvcih0KXt0aGlzLko9dH1mdD0wO3JlYWQoKXtsZXQgdD0hMSxlPXRoaXMucmVhZF9wYXJ0KCk7cmV0dXJuIG51bGwhPWUmJmUubGVuZ3RoPjAmJih0PSEwLHRoaXMuZnQrKyksdH1yZWFkX2J1ZmZlcigpe2xldCB0PXRoaXMuSjtpZih0LnBvc2l0aW9uKzQ8dC5sZW5ndGgpe2xldCBlPXQucmVhZFVpbnQzMigpO2lmKHQucG9zaXRpb24rZS00PD10Lmxlbmd0aCl7bGV0IHI9dC5nZXRfYnVmZmVyKHQucG9zaXRpb24sZSk7cmV0dXJuIHQucG9zaXRpb24rPWUscn10LnBvc2l0aW9uPXQucG9zaXRpb24tNH1yZXR1cm4gbnVsbH1nZXQgY2FuX3JlYWQoKXtsZXQgdD10aGlzLko7aWYodC5wb3NpdGlvbis0PHQubGVuZ3RoKXtsZXQgZT10LnJlYWRVaW50MzIoKTtpZih0LnBvc2l0aW9uK2UtNDw9dC5sZW5ndGgpcmV0dXJuITA7dC5wb3NpdGlvbj10LnBvc2l0aW9uLTR9cmV0dXJuITF9cmVhZF9oZWFkZXIoKXtpZighdGhpcy5jYW5fcmVhZClyZXR1cm4hMTtsZXQgdD10aGlzLko7dC5yZWFkSW50MzIoKSx0aGlzLnZlcnNpb249dC5yZWFkSW50MzIoKTtsZXQgZT10LnJlYWRTdHJpbmcoKTtyZXR1cm4gY29uc29sZS5sb2coZSksdGhpcy5xPXQucmVhZEZsb2F0MzJBcnJheSg2KSx0aGlzLlk9dC5yZWFkVWludDMyKCksY29uc29sZS5sb2coIl9zY2VuZV9wb2ludF9jb3VudDoiK3RoaXMuWSksdC5yZWFkVWludDMyKCksdGhpcy5YPSEwLCEwfXJlYWRfdHlwZSgpe2xldCB0PXRoaXMuSixlPXQucmVhZEludDMyKCk7Zm9yKGxldCByPTA7cjxlO3IrKyl7bGV0IGU9dC5yZWFkSW50MzIoKSxyPXQucmVhZFN0cmluZygpO3RoaXMucnQucHVzaChuZXcgVHlwZShlLHIpKX19cmVhZF9zdG9yZXkoKXtsZXQgdD10aGlzLkosZT10LnJlYWRJbnQzMigpO2ZvcihsZXQgcj0wO3I8ZTtyKyspe2xldCBlPXQucmVhZEludDMyKCkscj10LnJlYWRJbnQzMigpLG49dC5yZWFkU2luZ2xlKCksaT10LnJlYWRTdHJpbmcoKTt0aGlzLml0LnB1c2gobmV3IFN0b3JleShlLHIsaSxuKSl9fXJlYWRfcGFydCgpe3JldHVybiB0aGlzLmNhbl9yZWFkPyh0aGlzLnJlYWRfdHlwZSgpLHRoaXMucmVhZF9zdG9yZXkoKSx0aGlzLnJlYWRfbWF0ZXJpYWwoKSx0aGlzLnJlYWRfZ2VvbWV0cnkoKSx0aGlzLnJlYWRfZWxlbWVudCgpLHRoaXMucmVhZF9pbnNhbmNlKCkpOm51bGx9cmVhZF9tYXRlcmlhbCgpe2xldCB0PXRoaXMuSixlPXQucmVhZEludDMyKCk7Zm9yKGxldCByPTA7cjxlO3IrKyl7bGV0IGU9bmV3IE1hdGVyaWFsO2UuaWQ9dC5yZWFkSW50MzIoKSxlLmNvbG9yPXQucmVhZFVpbnQ4QXJyYXkoNCksdGhpcy5sdC5wdXNoKGUpfX1yZWFkX2dlb21ldHJ5KCl7bGV0IHQ9dGhpcy5KLGU9dC5yZWFkSW50MzIoKSxyPW5ldyBBcnJheShlKTtmb3IobGV0IG49MDtuPGU7bisrKXtsZXQgZSxpPXQucmVhZEludDMyKCkscz10LnJlYWRJbnQzMigpLGE9dC5yZWFkRmxvYXQzMkFycmF5KDMqcyksbD10LnJlYWRJbnQzMigpLG89bmV3IEdlb21ldHJ5O28ucG9pbnRzPWEsby5wb2ludENvdW50PXMsby5pZD1pLG8uZmFjZXM9bmV3IEFycmF5KGwpLHJbbl09byx0aGlzLmh0LnB1c2gobyksZT1zPDI1NT90PT50LnJlYWRVaW50OCgpOnM8NjU1MzU/dD0+dC5yZWFkVWludDE2KCk6dD0+dC5yZWFkSW50MzIoKTtmb3IobGV0IHQ9MDt0PGw7dCsrKW8uZmFjZXNbdF09dGhpcy5yZWFkX2ZhY2UoZSl9fXJlYWRfZmFjZSh0KXtsZXQgZSxyPXRoaXMuSixuPXIucmVhZEJvb2xlYW4oKTtpZihuKWU9dGhpcy5yZWFkX25vcm1hbCgpO2Vsc2V7bGV0IHQ9ci5yZWFkSW50MzIoKTtlPW5ldyBVaW50OEFycmF5KDMqdCk7Zm9yKGxldCByPTA7cjx0O3IrKyl7bGV0IHQ9dGhpcy5yZWFkX25vcm1hbCgpO2Uuc2V0KHQsMypyKX19bGV0IGk9ci5yZWFkSW50MzIoKSxzPW5ldyBJbnQzMkFycmF5KGkpO2ZvcihsZXQgZT0wO2U8aTtlKyspc1tlXT10KHIpO2xldCBhPW5ldyBGYWNlO3JldHVybiBhLmlzUGxhbmFyPW4sYS5ub3JtYWxzPWUsYS5pbmRpY2VzPXMsYX1yZWFkX25vcm1hbCgpe2xldCB0PXRoaXMuSixlPXQucmVhZFVpbnQ4KCkscj10LnJlYWRVaW50OCgpO3JldHVybiB0LnJlYWRCb29sZWFuKCk/bmV3IFVpbnQ4QXJyYXkoW2UsciwxXSk6bmV3IFVpbnQ4QXJyYXkoW2UsciwwXSl9cmVhZF9lbGVtZW50KCl7bGV0IHQ9dGhpcy5KLGU9dC5yZWFkSW50MzIoKTtmb3IobGV0IHI9MDtyPGU7cisrKXtsZXQgZT1uZXcgaTtlLmlkPXQucmVhZEludDMyKCksZS5vcmlnaW5JZD10LnJlYWRJbnQzMigpLGUuY2F0ZWdvcnk9dC5yZWFkVWludDgoKSxlLnR5cGVJZD10LnJlYWRJbnQzMigpLGUuc3RvcmV5X2luZGV4PXQucmVhZEludDMyKCksdGhpcy5jdC5wdXNoKGUpfWU9dGhpcy5jdC5sZW5ndGg7Zm9yKGxldCB0PTA7dDxlO3QrKyl7dGhpcy5jdFt0XS5pbmRleD10fX1yZWFkX2luc2FuY2UoKXtsZXQgdD10aGlzLkosZT10LnJlYWRJbnQzMigpLHI9W107Zm9yKGxldCBuPTA7bjxlO24rKyl7bGV0IGU9bmV3IGw7ZS5pZD10LnJlYWRJbnQzMigpLGUuZWxlbWVudElkPXQucmVhZEludDMyKCksZS5tYXRlcmlhbF9pZD10LnJlYWRJbnQzMigpLGUuZ2VvbWV0cnlfaWQ9dC5yZWFkSW50MzIoKTtsZXQgbj10LnJlYWRCb29sZWFuKCk7ZS5LPW4/dC5yZWFkRmxvYXQzMkFycmF5KDE2KTpudWxsLHRoaXMuay5wdXNoKGUpLHIucHVzaChlKX1yZXR1cm4gcn1idWlsZCh0KXtsZXQgZT10Lmxlbmd0aDtmb3IobGV0IHI9MDtyPGU7cisrKXtsZXQgZT10W3JdLG49dGhpcy5odFtlLmdlb21ldHJ5X2lkXTtlLmdlb21ldHJ5PW4sZS5lbGVtZW50PXRoaXMuY3RbZS5lbGVtZW50SWRdLGUubWF0ZXJpYWw9dGhpcy5sdFtlLm1hdGVyaWFsX2lkXX19YXN5bmMgc2F2ZV9pbmRleGVkRGIoKXtsZXQgdD1bXSxlPW5ldyBJbmRleGVkREIoInR5cGVzIiwiaWQiLG5ldyBUeXBlVHJhbnNmb3JtZXIpO2F3YWl0IGUub3BlbigpLGF3YWl0IGUuY2xlYXIoKTtsZXQgcj1lLmFkZCh0aGlzLnJ0KTt0LnB1c2gocik7bGV0IG49bmV3IEluZGV4ZWREQigic3RvcmV5cyIsImlkIixuZXcgU3RvcmV5VHJhbnNmb3JtZXIpO2F3YWl0IG4ub3BlbigpLGF3YWl0IG4uY2xlYXIoKTtsZXQgaT1uLmFkZCh0aGlzLml0KTt0LnB1c2goaSk7bGV0IHM9bmV3IEluZGV4ZWREQigibWF0ZXJpYWxzIiwiaWQiLG5ldyBNYXRlcmlhbFRyYW5zZm9ybWVyKTthd2FpdCBzLm9wZW4oKSxhd2FpdCBzLmNsZWFyKCk7bGV0IGE9cy5hZGQodGhpcy5sdCk7dC5wdXNoKGEpO2xldCBsPW5ldyBJbmRleGVkREIoImdlb21ldHJpZXMiLCJpZCIsbmV3IEdlb21ldHJ5VHJhbnNmb3JtZXIpO2F3YWl0IGwub3BlbigpLGF3YWl0IGwuY2xlYXIoKTtsZXQgbz1sLmFkZCh0aGlzLmh0KTt0LnB1c2gobyk7bGV0IGg9bmV3IEluZGV4ZWREQigiZWxlbWVudHMiLCJpZCIsbmV3IEVsZW1lbnRUcmFuc2Zvcm1lcik7YXdhaXQgaC5vcGVuKCksYXdhaXQgaC5jbGVhcigpO2xldCB1PWguYWRkKHRoaXMuY3QpO3QucHVzaCh1KTtsZXQgYz1uZXcgSW5kZXhlZERCKCJpbnN0YW5jZXMiLCJpZCIsbmV3IEluc3RhbmNlVHJhbnNmb3JtZXIpO2F3YWl0IGMub3BlbigpLGF3YWl0IGMuY2xlYXIoKTtsZXQgZD1jLmFkZCh0aGlzLmspO3QucHVzaChkKSxhd2FpdCBQcm9taXNlLmFsbCh0KSxlLmNsb3NlKCksbi5jbG9zZSgpLHMuY2xvc2UoKSxsLmNsb3NlKCksaC5jbG9zZSgpLGMuY2xvc2UoKX1rZXk9MTtnZXRfbmV3X2RhdGEoKXtsZXQgdD1uZXcgV29ya2VyRGF0YUV4Y2hhbmdlO3RoaXMucnQubGVuZ3RoPjAmJih0LnR5cGVfYnVmZmVyPXdyaXRlX3R5cGUodGhpcy5ydCksdGhpcy5ydD1bXSksdGhpcy5pdC5sZW5ndGg+MCYmKHQuc3RvcmV5X2J1ZmZlcj13cml0ZV9zdG9yZXkodGhpcy5pdCksdGhpcy5pdD1bXSksdGhpcy5sdC5sZW5ndGg+MCYmKHQubWF0ZXJpYWxfYnVmZmVyPWZ1bmN0aW9uKHQpe2xldCBlPWZ1bmN0aW9uKHQpe3JldHVybiA4KnQubGVuZ3RofSh0KSs0LHI9bmV3IFN0cmVhbVdyaXRlcihlKSxuPXQubGVuZ3RoO3Iud3JpdGVJbnQzMihuKTtmb3IobGV0IGU9MDtlPG47ZSsrKXtsZXQgbj10W2VdO3Iud3JpdGVJbnQzMihuLmlkKSxyLndyaXRlVWludDhBcnJheShuLmNvbG9yKX1yZXR1cm4gci5nZXRBbmRDbGVhckJ1ZmZlcigpfSh0aGlzLmx0KSx0aGlzLmx0PVtdKSx0aGlzLmh0Lmxlbmd0aD4wJiYodC5nZW9tZXRyeV9idWZmZXI9d3JpdGVfZ2VvbWV0cnkodGhpcy5odCksdGhpcy5odD1bXSksdGhpcy5jdC5sZW5ndGg+MCYmKHQuZWxlbWVudF9idWZmZXI9ZnVuY3Rpb24odCl7bGV0IGU9ZnVuY3Rpb24odCl7cmV0dXJuIDYqdC5sZW5ndGgqNH0odCkrNCxyPW5ldyBTdHJlYW1Xcml0ZXIoZSksbj10Lmxlbmd0aDtyLndyaXRlSW50MzIobik7Zm9yKGxldCBlPTA7ZTxuO2UrKyl7bGV0IG49dFtlXTtyLndyaXRlSW50MzIobi5pZCksci53cml0ZUludDMyKG4ub3JpZ2luSWQpLHIud3JpdGVJbnQzMihuLmluZGV4KSxyLndyaXRlSW50MzIobi50eXBlSWQpLHIud3JpdGVJbnQzMihuLnN0b3JleV9pbmRleCksci53cml0ZUludDMyKG4uY2F0ZWdvcnkpfXJldHVybiByLmdldEFuZENsZWFyQnVmZmVyKCl9KHRoaXMuY3QpLHRoaXMuY3Q9W10pLHRoaXMuay5sZW5ndGg+MCYmKHQuaW5zdGFuY2VfYnVmZmVyPWZ1bmN0aW9uKHQpe2xldCBlPWZ1bmN0aW9uKHQpe2xldCBlPXQubGVuZ3RoLHI9MzMqZTtmb3IobGV0IG49MDtuPGU7bisrKXtsZXQgZT10W25dO3IrPTIqZS5mYWNlcy5sZW5ndGgqNCxlLmhhc19tYXRyaXgmJihyKz02NCl9cmV0dXJuIHJ9KHQpKzQscj1uZXcgU3RyZWFtV3JpdGVyKGUpLG49dC5sZW5ndGg7ci53cml0ZUludDMyKG4pO2ZvcihsZXQgZT0wO2U8bjtlKyspe2xldCBuPXRbZV07ci53cml0ZUludDMyKG4uaWQpLHIud3JpdGVJbnQzMihuLmluZGV4KSxyLndyaXRlSW50MzIobi5lbGVtZW50SWQpLHIud3JpdGVJbnQzMihuLnN0YXJ0KSxyLndyaXRlSW50MzIobi5sZW5ndGgpLHIud3JpdGVCb29sZWFuKG4uaGFzX21hdHJpeCksbi5oYXNfbWF0cml4JiZyLndyaXRlRmxvYXQzMkFhcnJ5KG4uSyksci53cml0ZUludDMyKG4ubWF0ZXJpYWxfaWQpLHIud3JpdGVJbnQzMihuLmdlb21ldHJ5X2lkKTtsZXQgaT1uLmZhY2VzLHM9aS5sZW5ndGg7ci53cml0ZUludDMyKHMpO2ZvcihsZXQgdD0wO3Q8czt0Kyspe2xldCBlPWlbdF07ci53cml0ZUludDMyKGUuc3RhcnQpLHIud3JpdGVJbnQzMihlLmxlbmd0aCl9fXJldHVybiByLmdldEFuZENsZWFyQnVmZmVyKCl9KHRoaXMuayksdGhpcy5rPVtdKTtsZXQgZT10aGlzLmtleTtyZXR1cm4gdGhpcy5rZXkrKyx7aWQ6ZSxkYXRhOnR9fX1sZXQgdT1uZXcgSW5kZXhlZERCKCJidWZmZXJzIiwiaWQiKSxjPW51bGwsZD1udWxsO2Z1bmN0aW9uIHBvc3RfaGVhZGVyKHQpe2xldCBlPXtib3g6dC5ib3gscG9pbnRfY291bnQ6dC5zY2VuZV9wb2ludF9jb3VudCx0Zl9jb3VudDp0LnR0LGdlb19wb2ludF9jb3VudDp0Llp9O3Bvc3RNZXNzYWdlKHtjbWQ6ImJ1ZmZlciIsdmFsdWU6ZX0pfWFzeW5jIGZ1bmN0aW9uIHVwZGF0ZV9sb2FkKHQpe2xldCBlPXQ7aWYoZC5hcHBlbmRfYnVmZmVyKGUpLCFjLmhlYWRfbG9hZGVkKXtpZighYy5yZWFkX2hlYWRlcigpKXJldHVybjtwb3N0X2hlYWRlcihjKX1mb3IoO2MucmVhZCgpOylhd2FpdCBwb3N0X2RhdGEoYyl9YXN5bmMgZnVuY3Rpb24gcG9zdF9kYXRhKHQpe2xldCBlPXQuZ2V0X25ld19kYXRhKCk7YXdhaXQgdS5hZGQoZSk7bGV0IHI9e2NtZDoidXBkYXRlX3NjZW5lIix2YWx1ZTplLmlkfTtwb3N0TWVzc2FnZShyKX1vbm1lc3NhZ2U9dD0+e2xldCBlPXQuZGF0YTtzd2l0Y2goZS5jbWQpe2Nhc2UidXJsIjohYXN5bmMgZnVuY3Rpb24odCl7YXdhaXQgdS5vcGVuKCk7bGV0IGU9dC51cmwscj10LnRva2VuLG49W107c3dpdGNoKHIudHlwZSl7Y2FzZSJiZWFyZXIiOm4ucHVzaChbIkF1dGhvcml6YXRpb24iLCJCZWFyZXIgIityLnZhbHVlXSk7YnJlYWs7Y2FzZSJzYWRpY29kZSI6bi5wdXNoKFsiU0FESUF1dGhvcml6YXRpb24iLHIudmFsdWVdKTticmVhaztjYXNlImN1c3RvbSI6bi5wdXNoKC4uLnIuaGVhZGVycyk7YnJlYWs7Y2FzZSJkaXJlY3RseUxvYWQiOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCLmnKrlrp7njrB0b2tlbiB0eXBlIil9bGV0IGk9YXdhaXQgZmV0Y2goZSx7aGVhZGVyczpufSk7aWYoIWkub2spcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigi5paH5Lu25LiL6L295aSx6LSlIik7bGV0IHM9cGVyZm9ybWFuY2Uubm93KCksYT1pLmJvZHkuZ2V0UmVhZGVyKCksbD1pLmhlYWRlcnMuZ2V0KCJTYWRpLVNpemUiKTtjb25zb2xlLmxvZygiY29udGVudF9MZW5ndGgiLGwpLGx8fChsPWkuaGVhZGVycy5nZXQoIkNvbnRlbnQtTGVuZ3RoIikpOyJkaXJlY3RseUxvYWQiPT09ci50eXBlJiYobD10LnRva2VuLnZhbHVlKTtsZXQgbz1wYXJzZUludChsKTtkPW5ldyBGbG93UmVhZGVyKG8pLGM9bmV3IFNhZGlGbG93UmVhZGVyKGQpLGNvbnNvbGUubG9nKCJjb250ZW50X0xlbmd0aCIsbCksYXdhaXQgdS5vcGVuKCk7Zm9yKDs7KXtsZXQgdD1hd2FpdCBhLnJlYWQoKTtpZih0LnZhbHVlJiZhd2FpdCB1cGRhdGVfbG9hZCh0LnZhbHVlKSx0LmRvbmUpe2NvbnNvbGUubG9nKCJlbmQgZG93bmxvYWQ6IisocGVyZm9ybWFuY2Uubm93KCktcykpLHBvc3RNZXNzYWdlKHtjbWQ6ImNsb3NlIix2YWx1ZToiIn0pO2JyZWFrfX1jb25zb2xlLmxvZyhjLmJveCksY29uc29sZS5sb2coImdlbyBwb2ludCBjb3VudDoiLGMuWiksY29uc29sZS5sb2coInRmIGNvdW50OiIsYy50dCksY29uc29sZS5sb2coImVuZCByZWFkOiIrKHBlcmZvcm1hbmNlLm5vdygpLXMpKSxjb25zb2xlLmxvZygiZW5kIHNhdmVQYXJ0RGF0YToiKyhwZXJmb3JtYW5jZS5ub3coKS1zKSksYz1udWxsfShlLnZhbHVlKTticmVhaztjYXNlInVubG9ja19idWZmZXIiOnBvc3RNZXNzYWdlKHtjbWQ6InVwZGF0ZV9idWZmZXIiLHZhbHVlOiIifSk7YnJlYWs7Y2FzZSJjbG9zZSI6YnJlYWs7Y2FzZSJjYWNoZSI6IWFzeW5jIGZ1bmN0aW9uKHQpe2lmKGQ9bmV3IEZsb3dSZWFkZXIodCksYz1uZXcgU2FkaUZsb3dSZWFkZXIoZCksYXdhaXQgdS5vcGVuKCksIWMuaGVhZF9sb2FkZWQpe2lmKCFjLnJlYWRfaGVhZGVyKCkpcmV0dXJuO3Bvc3RfaGVhZGVyKGMpfWZvcig7Yy5yZWFkKCk7KWF3YWl0IHBvc3RfZGF0YShjKSxjb25zb2xlLmxvZygicG9zdCBkYXRhIik7Yz1udWxsLHBvc3RNZXNzYWdlKHtjbWQ6ImNsb3NlIix2YWx1ZToiIn0pLGNvbnNvbGUubG9nKCJyZWFkX2NhY2hlIGVuZCIpfShlLnZhbHVlKTticmVha319Owo="),n=new Blob([l],{type:"text/javascripte"}),i=URL.createObjectURL(n);e.Gu=i;let a=new Worker(i,{type:"classic"});return e.gu=e=>{!function(t,e){let l=t.data,n=te.get(e);switch(l.cmd){case"update_scene":n.hl.push(l.value);break;case"buffer":{let t=l.value,e=_(n.wl);e.pl=t.box,e.yi=t.point_count;let i=new Dt(e.gi);i.yi=t.point_count,i.sc=t.geo_point_count,i.oc=t.tf_count;let a=new Camera(e);a.rotate(1.75*Math.PI,Math.PI/3);let h=new SceneContext(n.wl,i,a,e.Fl);h.box=e.pl;let s=h.box.slice(0,3);h.set_sketch_plane(s,new Float32Array([0,0,1])),e.Ti=h,n.ru.publish("init_gpu",i),n.ou=!0;break}case"close":{let t=te.get(e);t.hu=!0,t.ru.publish("before_idling",t.wl.scene_context);break}}}(e,t)},a.addEventListener("message",e.gu),e.uu=a,a}async function se(t){let e=te.get(t);e.cu=new IndexedDB("buffers","id");let l=e.cu;await l.open(),await l.clear()}class DefaltSceneLoader{constructor(t,e,l){let n=function(t){let e=new ee;return te.set(t,e),e}(this);n.wl=t,n.ru=e,n.iu=l,n.iu.zn()}async load_cache(t){await se(this);let e={cmd:"cache",value:t};he(this).postMessage(e),ae(this)}progress_changed;async load_url(t,e){await se(this);let l={cmd:"url",value:{url:t,token:e}};he(this).postMessage(l),ae(this)}}class oe{Vo=null;Ko=null;Cu=null;bu=null;fu=null;Wu=null;Xu=null;yu=null;vu=null;ql=null;constructor(t,e,l){this.Vo=t.gl,this.ql=t,this.Ko=new Shader(t.gl,e,l),function(t){let e=t.Ko.$a,l=t.Vo;t.Cu=l.getUniformLocation(e,"u_SrcSampler"),t.bu=l.getUniformLocation(e,"u_SrcSize"),t.fu=l.getUniformLocation(e,"u_SrcCount"),t.Wu=l.getUniformLocation(e,"u_AdditionSampler"),t.Xu=l.getUniformLocation(e,"u_AdditionSize"),t.yu=l.getUniformLocation(e,"u_AdditionCount"),t.vu=l.getUniformLocation(e,"u_DstSize")}(this)}Ki(t,e,l,n,i,a,h,s,o=null){let r=this.Vo,c=this.ql,u=c.Zc;r.activeTexture(r.TEXTURE1),r.bindTexture(r.TEXTURE_2D,t),Gt(r),r.bindSampler(1,u),r.activeTexture(r.TEXTURE2),r.bindTexture(r.TEXTURE_2D,n),Gt(r),r.bindSampler(2,u);let g=c.yh,d=c.Vh;r.bindFramebuffer(r.FRAMEBUFFER,g),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,h,0),r.bindRenderbuffer(r.RENDERBUFFER,d),r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_COMPONENT32F,s,s),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.RENDERBUFFER,d),r.drawBuffers([r.COLOR_ATTACHMENT0]),this.Ko.ia();let I=c.quadBuffer;r.bindBuffer(r.ARRAY_BUFFER,I),r.vertexAttribPointer(0,2,r.FLOAT,!1,0,0),r.enableVertexAttribArray(0),r.uniform1i(this.Cu,1),r.uniform1ui(this.bu,e),r.uniform1ui(this.fu,l),r.uniform1i(this.Wu,2),r.uniform1ui(this.Xu,i),r.uniform1ui(this.yu,a),r.uniform1ui(this.vu,s),r.viewport(0,0,s,s),r.disable(r.DEPTH_TEST),r.disable(r.BLEND),r.drawArrays(r.TRIANGLE_STRIP,0,4),null!=o&&o(g),r.enable(r.DEPTH_TEST),r.bindFramebuffer(r.READ_FRAMEBUFFER,null)}Th(){this.Ko?.dispose()}}const re=10;class ce{wl;Vu=0;Bu=0;rc=0;Yu=1;Su=null;Tu=null;wu=null;Ru=null;Au=null;Nu=!1;ku;Ku=!1;Vo;Mu;Hu=!1;constructor(t){this.wl=t,this.ku=t=>{!function(t,e){console.log("__before_idling");let l=_(e.scene);l.Fl.width,l.Fl.height,function(t){let e=z(t),l=e.Zn;l>=6&&(l=6);const n=[],i=e.Qe.length;for(let t=0;t<i;t++){let i=e.Qe[t],a=i.category;switch(l){case 1:a!=I.OST_Topography&&a!=I.OST_Walls_Architectural&&a!=I.OST_StructuralFraming&&a!=I.OST_StructuralColumns&&a!=I.OST_Floors_Structural&&a!=I.OST_Roofs&&a!=I.OST_DuctCurves&&a!=I.OST_PipeCurves&&a!=I.OST_CableTray||i.fe||!i.Ce||i.Te||n.push(i);break;case 2:a!=I.OST_Topography&&a!=I.OST_Walls_Architectural&&a!=I.OST_StructuralFraming&&a!=I.OST_StructuralColumns&&a!=I.OST_Floors_Structural&&a!=I.OST_Roofs&&a!=I.OST_DuctCurves&&a!=I.OST_CableTray||i.fe||!i.Ce||i.Te||n.push(i);break;case 3:a!=I.OST_Topography&&a!=I.OST_Walls_Architectural&&a!=I.OST_StructuralFraming&&a!=I.OST_StructuralColumns&&a!=I.OST_Floors_Structural&&a!=I.OST_Roofs&&a!=I.OST_DuctCurves||i.fe||!i.Ce||i.Te||n.push(i);break;case 4:a!=I.OST_Topography&&a!=I.OST_Walls_Architectural&&a!=I.OST_StructuralFraming&&a!=I.OST_StructuralColumns&&a!=I.OST_Floors_Structural&&a!=I.OST_Roofs||i.fe||!i.Ce||i.Te||n.push(i);break;case 5:a!=I.OST_Topography&&a!=I.OST_Walls_Architectural&&a!=I.OST_StructuralColumns&&a!=I.OST_Floors_Structural&&a!=I.OST_Roofs||i.fe||!i.Ce||i.Te||n.push(i);break;case 6:a!=I.OST_Topography&&a!=I.OST_Walls_Architectural&&a!=I.OST_Floors_Structural&&a!=I.OST_Roofs||i.fe||!i.Ce||i.Te||n.push(i);break;case 7:a!=I.OST_Topography&&a!=I.OST_Walls_Architectural&&a!=I.OST_Roofs||i.fe||!i.Ce||i.Te||n.push(i);break;case 8:a!=I.OST_Topography&&a!=I.OST_Walls_Architectural||i.fe||!i.Ce||i.Te||n.push(i);break;case 9:a==I.OST_Topography&&(i.fe||!i.Ce||i.Te||n.push(i))}}const a=function(t){console.time("__check_busy_lod");const e=new Array,l=z(t),n=l.Fl.clientWidth,i=l.Fl.clientHeight,a=l.Nl,h=l.Qe,s=h.length,o=re;for(let t=0;t<s;t++){const l=h[t];if(!l.Se||!l.Ce)continue;const s=l.get_box(),r=Z.get_points(s);let c=Number.MAX_VALUE,u=-Number.MAX_VALUE,g=Number.MAX_VALUE,d=-Number.MAX_VALUE;for(let t=0;t<8;t++){const e=r.slice(3*t,3*t+3),l=transformMat4$1(create$3(),e,a);c=Math.min(c,l[0]),u=Math.max(u,l[0]),g=Math.min(g,l[1]),d=Math.max(u,l[1])}c>1||u<-1||d<-1||g>1||((u-c)*n>o||(d-g)*i>o)&&e.push(l)}return console.timeEnd("__check_busy_lod"),e}(t),h=new Set(n.concat(a));e.ql.Vs.Kn(Array.from(h))}(e),setTimeout((()=>{const l=function(t){console.time("__check_lod");const e=z(t),l=e.Fl.clientWidth,n=e.Fl.clientHeight,i=e.Nl,a=e.Qe,h=a.length,s={elements:[],instances:[],geometries:[],fromloading:!0};for(let t=0;t<h;t++){const e=a[t];if(e.Se)continue;const h=e.get_box(),o=Z.get_points(h);let r=Number.MAX_VALUE,c=-Number.MAX_VALUE,u=Number.MAX_VALUE,g=-Number.MAX_VALUE;for(let t=0;t<8;t++){const e=o.slice(3*t,3*t+3),l=transformMat4$1(create$3(),e,i);r=Math.min(r,l[0]),c=Math.max(c,l[0]),u=Math.min(u,l[1]),g=Math.max(c,l[1])}r>1||c<-1||g<-1||u>1||(c-r)*l>re&&(g-u)*n>re&&(s.elements.push(e),e.Se=!0,e.We.forEach((t=>{s.instances.push(t),t.geometry.ke||(s.geometries.push(t.geometry),t.geometry.ke=!0)})))}return console.timeEnd("__check_lod"),s}(e);ue(t,l),console.log(`cache:${l.elements.length}`),l.elements.length>0&&(console.log(`load element count:${l.elements.length}`),e.changed=!0)}),100)}(this,t)}}zn(){let t=this,e=_(this.wl).Yi;e.subscribe("init_gpu",(e=>{!function(t,e){let l=z(t.wl.scene_context).ql,n=l.gl;if(null==n)return;null==l.dh&&(l.dh=n.createTexture());null==l.rh&&(l.rh=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,l.rh),n.bufferData(n.ARRAY_BUFFER,4*e,n.STATIC_DRAW),n.bindBuffer(n.ARRAY_BUFFER,null));null==l.uh&&(l.uh=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,l.uh),n.bufferData(n.ARRAY_BUFFER,3*e,n.STATIC_DRAW),n.bindBuffer(n.ARRAY_BUFFER,null));null==l.gh&&(l.gh=n.createTexture());null==l.io&&(l.io=n.createTexture());null==l.uc&&(l.uc=n.createTexture());null==l.Xs&&(l.Xs=n.createTexture());l.Gh||(l.Gh=n.createTexture());l.ph||(l.ph=n.createTexture())}(t,e.yi)}),!0),e.subscribe("update_gpu",(e=>{let l=e;const n=e.elements[0];if(!n)return;const i=z(t.wl.scene_context);if(i&&i.Nl){const t=i.Nl,e=Z.get_points(n.get_box());let l=Number.MAX_VALUE,a=-Number.MAX_VALUE,h=Number.MAX_VALUE,s=-Number.MAX_VALUE;for(let n=0;n<8;n++){const i=e.slice(3*n,3*n+3),o=transformMat4$1(create$3(),i,t);l=Math.min(l,o[0]),a=Math.max(a,o[0]),h=Math.min(h,o[1]),s=Math.max(a,o[1])}const o=i.Fl.clientWidth,r=i.Fl.clientHeight;((a-l)*o<re||(s-h)*r<re)&&(this.Hu=!0)}this.Hu||ue(t,l),l.fromloading||ue(t,l)})),e.subscribe("before_idling",this.ku)}}function ue(t,e){if(t.Ku)return;!function(t){if(t.Nu)return;let e=z(t.wl.scene_context).ql;t.Su=new oe(e,h.gt,h.v),t.Tu=new oe(e,h.gt,h.v),t.wu=new oe(e,h.gt,h.v),t.Ru=new oe(e,h.gt,h.Y),t.Au=new oe(e,h.gt,h.V),t.Nu=!0,e.gl}(t);let l=z(t.wl.scene_context),n=e.elements,i=e.instances,a=e.geometries;if(0==n.length)return;let s=l.ql,o=s.gl,r=i.length,c=0;for(let t=0;t<r;t++)i[t].has_matrix&&c++;if(c>0){console.time("transforms");let e=t.Vu,l=Math.floor(Math.sqrt(4*(e+c)))+1;if(l>s.cc)return void(t.Ku=!0);let n=s.mh;s.mh=l,console.log("__transform_textrue_size",l);let a=Math.floor(Math.sqrt(4*c))+1,h=new Float32Array(a*a*4),u=0;for(let t=0;t<r;t++){let l=i[t];l.has_matrix?(h.set(l.Re,16*u),l.matrix_offset=e+u+1,u++):l.matrix_offset=0}let g=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,g),o.texImage2D(o.TEXTURE_2D,0,o.RGBA32F,a,a,0,o.RGBA,o.FLOAT,h);let d=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,d),Gt(o),o.texImage2D(o.TEXTURE_2D,0,o.RGBA32F,l,l,0,o.RGBA,o.FLOAT,null),t.Su.Ki(s.Gh,n,4*e,g,a,4*c,d,l,(t=>{})),o.deleteTexture(g),o.deleteTexture(s.Gh),s.Gh=d,o.bindTexture(o.TEXTURE_2D,null),h=null,console.timeEnd("transforms"),t.Vu+=c}{let e=0;if(r=a.length,r>0){console.time("geometies");let l=t.Bu;for(let t=0;t<r;t++){let n=a[t];n.offset=e+l,e+=n.pointCount}let n=Math.floor(Math.sqrt(e+l))+1;if(n>s.cc)return void(t.Ku=!0);let i=s.Zh;console.log("__pointSize",n);let h=Math.floor(Math.sqrt(e))+1,c=new Float32Array(h*h*3),u=0;for(let t=0;t<r;t++){let e=a[t];c.set(e.points,3*u),u+=e.pointCount}let g=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,g),Gt(o),o.texImage2D(o.TEXTURE_2D,0,o.RGB32F,h,h,0,o.RGB,o.FLOAT,c);let d=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,d),Gt(o),o.texImage2D(o.TEXTURE_2D,0,o.RGBA32F,n,n,0,o.RGBA,o.FLOAT,null),t.Tu.Ki(s.ph,i,l,g,h,e,d,n),o.deleteTexture(g),o.deleteTexture(s.ph),s.ph=d,s.Zh=n,t.Bu+=e,o.bindTexture(o.TEXTURE_2D,null),console.timeEnd("geometies"),c=null}}{console.time("point_buffer"),r=n.length;let e=0;for(let t=0;t<r;t++){let l=n[t].We,i=l.length;for(let t=0;t<i;t++)e+=l[t].geometry.get_face_point_count()}let l=t.rc,i=l/3,a=s.Ih,h=0,c=new Uint32Array(e),u=new Uint8Array(3*e),g=e/3,d=Math.floor(Math.sqrt(g))+1,I=Math.floor(Math.sqrt((t.rc+e)/3))+1;if(I>s.cc)return void(t.Ku=!0);s.Ih=I,console.log("dst_size",I);let p=new Uint32Array(d*d),Z=new Uint8Array(d*d*4),G=new Uint8Array(d*d),m=new Uint8Array(d*d),C=new Uint32Array(d*d),b=0;for(let e=0;e<r;e++){let i=n[e],a=i.We,s=a.length;for(let e=0;e<s;e++){let n=a[e];n.start=b+l;let s=n.Ne??n.material.color,o=n.geometry,r=o.offset,g=o.faces,d=g.length,I=new Array(d);for(let e=0;e<d;e++){let a=g[e],o=a.indices,d=o.length,f=new InstanceFace;f.start=b+l;for(let e=0;e<d;e+=3){if(c[b]=r+o[e],c[b+1]=r+o[e+1],c[b+2]=r+o[e+2],p[h]=n.matrix_offset,a.isPlanar){let t=a.normals;u.set(t,3*b),u.set(t,3*(b+1)),u.set(t,3*(b+2))}else{let t=a.normals.slice(3*e,3*e+9);u.set(t,3*b)}Z.set(s,4*h),G[h]=t.Yu,m[h]=3,C[h]=i.index+1,b+=3,h++}t.Yu++,t.Yu>=256&&(t.Yu=1),f.length=b+l-f.start,I[e]=f}n.faces=I,n.length=b+l-n.start}}let f=l,W=e;t.rc+=e,function(t,e){let l=t.gl;if(e>t.yi){let n=l.createBuffer();l.bindBuffer(l.ARRAY_BUFFER,n),l.bufferData(l.ARRAY_BUFFER,4*e,l.STATIC_DRAW),l.bindBuffer(l.COPY_READ_BUFFER,t.rh),l.copyBufferSubData(l.COPY_READ_BUFFER,l.ARRAY_BUFFER,0,0,4*t.yi),l.deleteBuffer(t.rh),t.rh=n,n=l.createBuffer(),l.bindBuffer(l.ARRAY_BUFFER,n),l.bufferData(l.ARRAY_BUFFER,3*e,l.STATIC_DRAW),l.bindBuffer(l.COPY_READ_BUFFER,t.uh),l.copyBufferSubData(l.COPY_READ_BUFFER,l.ARRAY_BUFFER,0,0,3*t.yi),l.deleteBuffer(t.uh),t.uh=n,t.yi=e}}(s,t.rc),function(t,e,l,n){let i=t.gl;if(null==i)return;i.bindBuffer(i.ARRAY_BUFFER,t.rh);let a=n.BYTES_PER_ELEMENT;i.bufferSubData(i.ARRAY_BUFFER,e*a,n,0,l-e),i.bindBuffer(i.ARRAY_BUFFER,null),ge+=n.length,console.log("data_count",ge)}(s,f,f+W,c),function(t,e,l,n){let i=t.gl;if(null==i)return;i.bindBuffer(i.ARRAY_BUFFER,t.uh);let a=n.BYTES_PER_ELEMENT;i.bufferSubData(i.ARRAY_BUFFER,e*a*3,n,0,3*(l-e)),i.bindBuffer(i.ARRAY_BUFFER,null)}(s,f,f+W,u);{let e=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,e),o.pixelStorei(o.UNPACK_COLORSPACE_CONVERSION_WEBGL,o.NONE),o.texImage2D(o.TEXTURE_2D,0,o.R32UI,d,d,0,o.RED_INTEGER,o.UNSIGNED_INT,p),o.pixelStorei(o.UNPACK_COLORSPACE_CONVERSION_WEBGL,o.BROWSER_DEFAULT_WEBGL),Gt(o);let l=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,l),Gt(o),o.texImage2D(o.TEXTURE_2D,0,o.R32UI,I,I,0,o.RED_INTEGER,o.UNSIGNED_INT,null),t.Au.Ki(s.dh,a,i,e,d,g,l,I),o.deleteTexture(e),o.deleteTexture(s.dh),s.dh=l,o.bindTexture(o.TEXTURE_2D,null)}{let e=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,e),Gt(o),o.texImage2D(o.TEXTURE_2D,0,o.RGBA,d,d,0,o.RGBA,o.UNSIGNED_BYTE,Z);let l=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,l),o.texImage2D(o.TEXTURE_2D,0,o.RGBA,I,I,0,o.RGBA,o.UNSIGNED_BYTE,null),Gt(o),t.wu.Ki(s.gh,a,i,e,d,g,l,I),o.deleteTexture(e),o.deleteTexture(s.gh),s.gh=l,o.bindTexture(o.TEXTURE_2D,null)}{let e=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,e),o.pixelStorei(o.UNPACK_ALIGNMENT,1),o.pixelStorei(o.UNPACK_COLORSPACE_CONVERSION_WEBGL,o.NONE),o.texImage2D(o.TEXTURE_2D,0,o.R8UI,d,d,0,o.RED_INTEGER,o.UNSIGNED_BYTE,G),o.pixelStorei(o.UNPACK_COLORSPACE_CONVERSION_WEBGL,o.BROWSER_DEFAULT_WEBGL),o.pixelStorei(o.UNPACK_ALIGNMENT,4);let l=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,l),Gt(o),o.texImage2D(o.TEXTURE_2D,0,o.R8UI,I,I,0,o.RED_INTEGER,o.UNSIGNED_BYTE,null),t.Ru.Ki(s.Xs,a,i,e,d,g,l,I),o.deleteTexture(e),o.deleteTexture(s.Xs),s.Xs=l}{let e=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,e),o.pixelStorei(o.UNPACK_ALIGNMENT,1),o.pixelStorei(o.UNPACK_COLORSPACE_CONVERSION_WEBGL,o.NONE),o.texImage2D(o.TEXTURE_2D,0,o.R8UI,d,d,0,o.RED_INTEGER,o.UNSIGNED_BYTE,m),o.pixelStorei(o.UNPACK_COLORSPACE_CONVERSION_WEBGL,o.BROWSER_DEFAULT_WEBGL),o.pixelStorei(o.UNPACK_ALIGNMENT,4);let l=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,l),Gt(o),o.texImage2D(o.TEXTURE_2D,0,o.R8UI,I,I,0,o.RED_INTEGER,o.UNSIGNED_BYTE,null),t.Ru.Ki(s.io,a,i,e,d,g,l,I),o.deleteTexture(e),o.deleteTexture(s.io),s.io=l}{let e=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,e),o.pixelStorei(o.UNPACK_ALIGNMENT,1),o.pixelStorei(o.UNPACK_COLORSPACE_CONVERSION_WEBGL,o.NONE),o.texImage2D(o.TEXTURE_2D,0,o.R32UI,d,d,0,o.RED_INTEGER,o.UNSIGNED_INT,C),o.pixelStorei(o.UNPACK_COLORSPACE_CONVERSION_WEBGL,o.BROWSER_DEFAULT_WEBGL),o.pixelStorei(o.UNPACK_ALIGNMENT,4);let l=o.createTexture();o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,l),Gt(o),o.texImage2D(o.TEXTURE_2D,0,o.R32UI,I,I,0,o.RED_INTEGER,o.UNSIGNED_INT,null),t.Au.Ki(s.uc,a,i,e,d,g,l,I),o.deleteTexture(e),o.deleteTexture(s.uc),s.uc=l}console.timeEnd("point_buffer"),p=null,c=null,u=null,Z=null}n.forEach((t=>{t.Se=!0})),console.time("drawbuffer");let u=l.Qe.filter((t=>t.Ce&&t.Se&&!t.fe&&!t.Te));s.Mn.Kn(u),u=l.Qe.filter((t=>t.Ce&&!t.be&&t.Se&&!t.Te)),s.Hn.Kn(u),console.timeEnd("drawbuffer")}let ge=0;class PlaneSection{Xc;vl;gi;nh;Fu=!1;zu;xu;Dr;Lr;Eu=!1;Lu=new Float32Array([.5,.5,.5,.2]);Ju=new Float32Array([.5,.8,.5,.2]);Uu=new Float32Array([.5,1,.5,1]);Pu=!1;Du=!1;Ou;Qu=0;_u=0;ju=0;qu;$u;tg;eg;init(t){this.Xc=t,this.vl=z(t.scene_context),this.gi=this.vl.ql.gl,this.nh=new Shader(this.gi,h.Tt,h.St),this.qu=(t,e)=>{this.lg(e)},this.$u=(t,e)=>{this.ng(e)},this.tg=(t,e)=>{this.ig(e)},this.eg=(t,e)=>{this.ag(e)}}onBeforeDraw(){}onAfterDraw(){if(!this.Fu)return;let t=this.vl,e=this.gi;this.nh.ia();let l=e.canvas.width,n=e.canvas.height;e.uniformMatrix4fv(this.zu,!1,t.Nl),this.Pu?e.uniform4fv(this.xu,this.Ju):e.uniform4fv(this.xu,this.Lu),e.bindBuffer(e.ARRAY_BUFFER,this.Dr),e.vertexAttribPointer(0,3,e.FLOAT,!1,0,0),e.enableVertexAttribArray(0),e.viewport(0,0,l,n),e.enable(e.BLEND),e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA),e.depthMask(!0),e.enable(e.DEPTH_TEST),e.drawArrays(e.TRIANGLE_FAN,0,4),e.uniform4fv(this.xu,this.Uu),e.drawArrays(e.LINE_LOOP,0,4),e.disable(e.BLEND)}start(){if(this.Fu)return;let t=this.vl;if(!t.Cn)return;this.hg(),this.ju=0;let e=this.gi,l=this.sg();e.bindBuffer(e.ARRAY_BUFFER,this.Dr),e.bufferData(e.ARRAY_BUFFER,l,e.STATIC_DRAW),this.Lr=l,t.Wn("mousemove",this.qu),t.Wn("mousedown",this.$u),t.Wn("mouseup",this.tg),t.Wn("mouseout",this.eg),this.Fu=!0,this.vl.He=!0}hg(){let t=this.gi;if(!this.Eu){this.nh.ia();let e=this.nh.$a;this.zu=t.getUniformLocation(e,"u_Mvp"),this.xu=t.getUniformLocation(e,"u_Color"),this.Dr=t.createBuffer(),this.Eu=!0}}stop(){let t=this.vl;t.Xn("mousemove",this.qu),t.Xn("mousedown",this.$u),t.Xn("mouseup",this.tg),t.Xn("mouseout",this.eg),this.Fu=!1,t.Ul=!0}dispose(){this.gi.deleteBuffer(this.Dr),this.nh.dispose()}lg(t){if(t&&t.detail)if(this.Du&&this.Pu){let e=this.vl.Fl.getBoundingClientRect(),l=t.detail.clientX-e.left,n=e.height-(t.detail.clientY-e.top),i=l-this.Ou.x,a=n-this.Ou.y;if(Math.abs(i-a)<5)return;this.Ou={x:l,y:n};let h=i/e.width,s=a/e.height,o=h*this.vl.zl.clientWidth,r=s*this.vl.zl.clientHeight,c=this.vl.zl.up,u=this.vl.zl.right,g=scale(create$3(),c,r),d=scale(create$3(),u,o),I=add(create$3(),g,d),p=this.vl.Cn,Z=dot$1(I,p.normal),G=this.ju+Z;G>=this._u?(Z=this._u-this.ju,this.ju=this._u):G<=this.Qu?(Z=this.Qu-this.ju,this.ju=this.Qu):this.ju+=Z,I=scale(I,p.normal,Z);for(let t=0;t<4;t++)this.Lr[3*t]+=I[0],this.Lr[3*t+1]+=I[1],this.Lr[3*t+2]+=I[2];let m=this.vl.ql.gl;m.bindBuffer(m.ARRAY_BUFFER,this.Dr),m.bufferData(m.ARRAY_BUFFER,this.Lr,m.STATIC_DRAW),this.vl.Cn.orign=add(this.vl.Cn.orign,this.vl.Cn.orign,I),this.vl.He=!0}else if(!this.Du){let e=this.vl.yn(t.detail),l=this.vl.pl,n=new Float32Array([(l[0]+l[3])/2,(l[1]+l[4])/2,l[5]]),i=new Float32Array([0,0,-1]);this.og(n,i),this.og(e.ml,e.fl)?(this.Pu=!0,this.vl.Ul=!1):(this.Pu=!1,this.vl.Ul=!0),this.vl.He=!0}}ng(t){if(0==t.detail.button){let e=this.vl.Fl.getBoundingClientRect(),l=t.detail.clientX-e.left,n=e.height-(t.detail.clientY-e.top);this.Ou={x:l,y:n},this.Du=!0}}ig(t){this.Du=!1}ag(t){this.Du=!1}og(t,e){let l=this.Lr,n=l.slice(0,3),i=l.slice(3,6),a=l.slice(6,9),h=l.slice(9,12);return!!Ie(t,e,n,i,a)||!!Ie(t,e,n,a,h)}sg(){let t=this.vl.pl,e=this.vl.Cn,l=e.normal,n=new Float32Array([(t[0]+t[3])/2,(t[1]+t[4])/2,(t[2]+t[5])/2]),i=e.project(n),a=normalize$2(create$3(),new Float32Array([l[0],l[1],0])),h=angle(a,new Float32Array([1,0,0]));dot$1(a,[0,1,0])<0&&(h=-h);let s=angle(l,new Float32Array([0,0,1])),o=function(t,e){var l=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=0,t[2]=-l,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=l,t[9]=0,t[10]=n,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}(create$4(),s),r=function(t,e){var l=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=l,t[2]=0,t[3]=0,t[4]=-l,t[5]=n,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}(create$4(),h),c=multiply(create$4(),r,o),u=transformMat4$1(create$3(),new Float32Array([-1,0,0]),c),g=transformMat4$1(create$3(),new Float32Array([0,-1,0]),c),d=scale(create$3(),l,-1),I=lookAt(create$4(),i,add(create$3(),i,d),u),p=Z.get_points(t),G=[],m=[],C=[];for(let t=0;t<8;t++){let e=3*t,l=new Float32Array([p[e],p[e+1],p[e+2]]),n=transformMat4$1(create$3(),l,I);G.push(n[0]),m.push(n[1]),C.push(n[2])}this.Qu=Math.min(...C),this._u=Math.max(...C);let b=.1*Math.abs(this._u-this.Qu);this.Qu=this.Qu-b,this._u=this._u+b;let f=Math.min(...G),W=Math.max(...G),X=Math.min(...m),y=Math.max(...m),v=scale(create$3(),g,W),V=scale(create$3(),g,f),B=scale(create$3(),u,y),Y=scale(create$3(),u,X),S=de([i,V,Y]),T=de([i,v,Y]),w=de([i,v,B]),R=de([i,V,B]);return new Float32Array([...S,...T,...w,...R])}}function de(t){let e=create$3(),l=t.length;for(let n=0;n<l;n++)e[0]+=t[n][0],e[1]+=t[n][1],e[2]+=t[n][2];return e}function Ie(t,e,n,i,a){let h=l(create$3(),i,n),s=l(create$3(),a,n),o=l(create$3(),t,n),r=fromValues$3(-e[0],-e[1],-e[2],h[0],h[1],h[2],s[0],s[1],s[2]);if(r=invert$1(create$5(),r),null==r)return!1;let c=transformMat3(create$3(),o,r);return!(c[0]<0)&&(c[1]>=0&&c[2]>=0&&c[1]+c[2]<=1)}class pe{Xc;Dr;rg;ah;zu;cg;ug;gg;dg;gi;nh;Ig=!1;Fu=!1;constructor(){}set_texture(t,e){this.Ig=!1,t.complete?this.pg(t):t.addEventListener("load",(()=>{this.pg(t)}));let l=this.gi;l.bindBuffer(l.ARRAY_BUFFER,this.Dr),l.bufferData(l.ARRAY_BUFFER,e,l.STATIC_DRAW),l.bindBuffer(l.ARRAY_BUFFER,this.rg),l.bufferData(l.ARRAY_BUFFER,new Float32Array([0,0,1,0,1,1,0,1]),l.STATIC_DRAW)}pg(t){let e=this.gi;e&&(e.bindTexture(e.TEXTURE_2D,this.ah),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,t.width,t.height,0,e.RGBA,e.UNSIGNED_BYTE,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.generateMipmap(e.TEXTURE_2D),this.Ig=!0)}init(t){this.Xc=t;let e=_(t);this.gi=e.gi,this.nh=new Shader(this.gi,h.Gt,h.Zt),this.nh.ia();let l=this.gi;this.Dr=l.createBuffer(),this.rg=l.createBuffer(),this.ah=l.createTexture();let n=this.nh.$a;this.zu=l.getUniformLocation(n,"u_Mvp"),this.cg=l.getUniformLocation(n,"u_ViewMatrix"),this.ug=l.getUniformLocation(n,"u_Near"),this.gg=l.getUniformLocation(n,"u_Far"),this.dg=l.getUniformLocation(n,"u_Sampler")}onBeforeDraw(){}onAfterDraw(){if(!this.Ig||!this.Fu)return;let t=this.gi,e=z(this.Xc.scene_context);this.nh.ia(),t.viewport(0,0,t.canvas.width,t.canvas.height),t.bindBuffer(t.ARRAY_BUFFER,this.Dr),t.vertexAttribPointer(0,3,t.FLOAT,!1,0,0),t.enableVertexAttribArray(0),t.bindBuffer(t.ARRAY_BUFFER,this.rg),t.vertexAttribPointer(1,2,t.FLOAT,!1,0,0),t.enableVertexAttribArray(1),It(t,this.ah,t.TEXTURE1,this.dg),t.uniformMatrix4fv(this.zu,!1,e.Nl),t.uniformMatrix4fv(this.cg,!1,e.kl),t.uniform1f(this.ug,e.Ml),t.uniform1f(this.gg,e.Hl),t.enable(t.DEPTH_TEST),t.enable(t.BLEND),t.blendFunc(t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA),t.depthMask(!1),t.drawArrays(t.TRIANGLE_FAN,0,4),t.disable(t.BLEND),t.depthMask(!0)}start(){this.Fu||(this.Fu=!0)}stop(){this.Fu=!1}dispose(){let t=this.gi;t.deleteBuffer(this.Dr),t.deleteBuffer(this.rg),t.deleteTexture(this.ah)}}class Ze{Xc;Zg=!1;Lr=[];get Gg(){return this.Lr}mg=!1;get Cg(){return this.mg}bg;fg=!1;pickAction;updateAction;constructor(){this.pickAction=(t,e)=>this.onPick(e),this.updateAction=(t,e)=>{this.Xc.scene_context.changed=!0}}init(t){this.Xc=t}onBeforeDraw(){}onAfterDraw(){if(this.Zg){let i=_(this.Xc),a=i.Ti,h=i.mi;h.strokeStyle="rgb(96,255,0)";let s=this.Lr.length;if(s>0){let o=a.get_screen_point(this.Lr[0]);h.beginPath(),h.moveTo(o[0],o[1]);for(let t=1;t<s;t++){let e=a.get_screen_point(this.Lr[t]);h.lineTo(e[0],e[1])}let r=i.Ii.pa;t=o,l=(e=r)[0]-t[0],n=e[1]-t[1],Math.hypot(l,n)<10?(h.lineTo(o[0],o[1]),this.fg=!0):(h.lineTo(r[0],r[1]),this.fg=!1),h.stroke()}}var t,e,l,n}start(){this.Zg||(this.Lr=[],this.Xc.scene_context.select_mode=p.snap,this.Xc.scene_context.add_event_listener("select",this.pickAction),this.Xc.scene_context.add_event_listener("mousemove",this.updateAction),this.Zg=!0)}stop(){this.Xc.scene_context.select_mode=p.element,this.Xc.scene_context.remove_event_listener("select",this.pickAction),this.Xc.scene_context.remove_event_listener("mousemove",this.updateAction),this.Zg=!1,this.mg=!1,this.fg=!1}dispose(){}onPick(t){t.detail&&(this.fg?(this.Lr.push(this.Lr[0]),this.mg=!0):(this.Lr.push(t.detail.point),this.mg=!1),this.bg&&this.bg(),this.Xc.scene_context.changed=!0)}}class Ge{gi;Xc;nh;Dr;hc=0;zu;Wg;Fu=!1;init(t){this.Xc=_(t);let e=this.Xc.gi;this.gi=e,this.nh=new Shader(e,h.J,h.L),this.Dr=e.createBuffer(),this.nh.ia();let l=this.nh.$a;this.zu=e.getUniformLocation(l,"u_Mvp"),this.Wg=e.getUniformLocation(l,"u_Offset")}onBeforeDraw(){}onAfterDraw(){if(!this.Fu)return;let t=z(this.Xc.Ti),e=this.gi;this.nh.ia(),e.disable(e.DEPTH_TEST),e.uniformMatrix4fv(this.zu,!1,t.Nl),e.uniform1f(this.Wg,0),e.bindBuffer(e.ARRAY_BUFFER,this.Dr),e.vertexAttribPointer(0,3,e.FLOAT,!1,0,0),e.enableVertexAttribArray(0),e.viewport(0,0,e.canvas.width,e.canvas.height),e.drawArrays(e.LINES,0,this.hc),e.enable(e.DEPTH_TEST)}start(){this.Fu||(this.Fu=!0)}stop(){this.Fu&&(this.Fu=!1)}dispose(){this.nh?.dispose(),this.gi?.deleteBuffer(this.Dr)}Xg;set_wire(t){this.Xg=t;let e=t.points,l=this.gi;l.bindBuffer(l.ARRAY_BUFFER,this.Dr),l.bufferData(l.ARRAY_BUFFER,e,l.STATIC_DRAW),this.hc=e.length/3,t.point_changed=()=>{let e=t.points,l=this.gi;l.bindBuffer(l.ARRAY_BUFFER,this.Dr),l.bufferData(l.ARRAY_BUFFER,e,l.STATIC_DRAW),this.hc=e.length/3}}}class me{Xc;gi;nh;Dr;hc=0;zu;Wg;Fu=!1;yg=400;vg=4e3;xe;Ee;Vg;Bg;Yg;constructor(){this.Bg=this.lg.bind(this),this.Yg=this.Sg.bind(this)}init(t){this.Xc=_(t);let e=this.Xc.gi;this.gi=e,this.nh=new Shader(e,h.J,h.L),this.Dr=e.createBuffer(),this.nh.ia();let l=this.nh.$a;this.zu=e.getUniformLocation(l,"u_Mvp"),this.Wg=e.getUniformLocation(l,"u_Offset")}onBeforeDraw(){}onAfterDraw(){if(!this.Fu)return;if(!this.xe||!this.Ee)return;let t=z(this.Xc.Ti),e=this.gi;this.nh.ia(),e.disable(e.DEPTH_TEST),e.uniformMatrix4fv(this.zu,!1,t.Nl),e.uniform1f(this.Wg,0),e.bindBuffer(e.ARRAY_BUFFER,this.Dr),e.vertexAttribPointer(0,3,e.FLOAT,!1,0,0),e.enableVertexAttribArray(0),e.viewport(0,0,e.canvas.width,e.canvas.height),e.drawArrays(e.LINES,0,this.hc),e.enable(e.DEPTH_TEST)}start(){if(this.Fu)return;this.xe=null,this.Ee=null;let t=this.Xc.Ti;t.add_event_listener("mousemove",this.Bg),t.add_event_listener("select",this.Yg),this.Fu=!0}stop(){if(!this.Fu)return;let t=this.Xc.Ti;t.remove_event_listener("mousemove",this.Bg),t.remove_event_listener("select",this.Yg),this.Fu=!1}dispose(){this.nh?.dispose(),this.gi?.deleteBuffer(this.Dr)}Tg(){let t=this.xe,e=this.Ee,l=new Float32Array([e[0]-t[0],e[1]-t[1],e[2]-t[2]]),n=normalize$2(create$3(),l),i=new Float32Array([0,0,1]),a=cross(create$3(),n,i),h=-this.yg/2,s=scale(create$3(),a,h),o=add(create$3(),t,s),r=scale(create$3(),a,this.yg),c=new Float32Array([0,0,this.vg]),u=add(create$3(),o,r),g=[o,u,add(create$3(),u,l),add(create$3(),o,l),o];this.Vg=g;let d=new Float32Array(72);for(let t=0;t<4;t++){let e=18*t;d.set(g[t],e),d.set(g[t+1],e+3),d.set(add(create$3(),g[t],c),e+6),d.set(add(create$3(),g[t+1],c),e+9),d.set(g[t],e+12),d.set(add(create$3(),g[t],c),e+15)}let I=this.gi;I.bindBuffer(I.ARRAY_BUFFER,this.Dr),I.bufferData(I.ARRAY_BUFFER,d,I.STATIC_DRAW),this.hc=d.length/3}lg(t,e){if(!this.xe)return;if(!e||!e.detail)return;let l=this.Xc.Fl.getBoundingClientRect(),n=e.detail.clientX-l.left,i=l.height-(e.detail.clientY-l.top),a=z(t).$l.za(n,i,p.point);a&&(this.Ee=a.point,this.Tg(),t.changed=!0)}Sg(t,e){e&&e.detail&&(this.xe?(this.Ee=e.detail.point,this.stop(),this.wg&&this.wg()):this.xe=e.detail.point)}wg;Rg(){let t=this;return{get profile(){return t.Vg},get width(){return t.yg},set width(e){t.yg=e},get height(){return t.vg},set height(e){t.vg=e},set_callback(e){t.wg=e}}}}function Ce(t,e){let l=t.length/3,n=new Float32Array(t.length);for(let i=0;i<l;i++){let l=fromValues$2(t[3*i],t[3*i+1],t[3*i+2]);l=transformMat4$1(l,l,e),n.set(l,3*i)}return n}function be(t,e){let l=Ce(t.Gg,e);return{ko:0,Ag:t.Ag,Ng:t.Ng,kg:t.kg,Gg:l,Ke:t.Ke,Kg:0}}function fe(t,e){let l=Ce(t.Gg,e);return{ko:0,Ag:t.Ag,Ng:t.Ng,kg:t.kg,Ke:t.Ke,Gg:l,Kg:0}}function We(t,e){let l=Ce(t.Gg,e);return{ko:0,Mg:t.Mg,Hg:t.Hg,Ng:t.Ng,Gg:l,Ke:t.Ke,Kg:0}}function Xe(t,e){return{ko:0,Gg:Ce(t.Gg,e),Ke:t.Ke,Fg:t.Fg,zg:t.zg,xg:t.xg,Kg:0}}const ye=new Color([243,105,143]),ve=new Color([172,242,104]),Ve=new Color([66,166,239]),Be=1e3;class Ye{Eg=[];Dr;Or;Lg;gi;Xc;nh;zu;Wg;Fu=!1;Jg=0;Yh;Sh;Ug;Pg=!1;Dg;Og;Qg=!1;_g=0;jg;qg;$g;td;ed;constructor(){this.$g=this.ld.bind(this),this.td=this.nd.bind(this),this.ed=this.ad.bind(this)}init(t){this.Xc=_(t);let e=[],l=function(t,e,l,n){let get_pos=(t,e)=>fromValues$2(Math.cos(t)*e,Math.sin(t)*e,0),i=2/l,a=Math.floor(t/i);i=t/a;let h=[],s=[];for(let t=0;t<a;t++){let n=t*i;h.push(get_pos(n,e)),s.push(get_pos(n,l))}let o=new Float32Array(18*a);for(let t=0;t<a-1;t++){let e=h[t],l=h[t+1],n=s[t],i=s[t+1],a=18*t;o.set(e,a),a+=3,o.set(l,a),a+=3,o.set(n,a),a+=3,o.set(l,a),a+=3,o.set(i,a),a+=3,o.set(n,a)}return{ko:0,Gg:o,Ke:n,Fg:t,zg:e,xg:l,Kg:0}}(Math.PI/2,570,630,Ve);l=Xe(l,fromRotation(create$4(),-Math.PI/2,[0,0,1])),l.ko=1,e.push(l);let n=Xe(l,fromRotation(create$4(),-Math.PI/2,[0,1,0]));n.Ke=ye,n.ko=2,e.push(n);let i=Xe(l,fromRotation(create$4(),-Math.PI/2,[1,0,0]));i.Ke=ve,i.ko=3,e.push(i);let a=function(t,e,l,n){let i=[],a=[],h=[],s=2*Math.PI/l;for(let n=0;n<l;n++){let l=Math.cos(s*n)*t,o=Math.sin(s*n)*t,r=Math.cos(s*(n+1))*t,c=Math.sin(s*(n+1))*t;i.push(l,o,0),i.push(r,c,0),i.push(r,c,e),i.push(l,o,0),i.push(r,c,e),i.push(l,o,e),a.push(l,o,0),a.push(r,c,0),a.push(0,0,0),h.push(l,o,e),h.push(r,c,e),h.push(0,0,e)}let o=i.concat(h,a);return{ko:0,Ag:t,Ng:e,kg:l,Gg:new Float32Array(o),Ke:n,Kg:0}}(15,Be,16,new Color([255,0,0,255])),s=function(t,e,l,n){let i=2*Math.PI/l,a=[],h=[];for(let n=0;n<l;n++){let l=Math.cos(i*n)*t,s=Math.sin(i*n)*t,o=Math.cos(i*(n+1))*t,r=Math.sin(i*(n+1))*t;a.push(l,s,0),a.push(o,r,0),a.push(0,0,e),h.push(l,s,0),h.push(o,r,0),h.push(0,0,0)}let s=a.concat(h);return{ko:0,Ag:t,Ng:e,kg:l,Ke:n,Gg:new Float32Array(s),Kg:0}}(30,100,16,new Color([255,255,255])),o=fromTranslation(create$4(),[0,0,Be]);s=fe(s,o);let r=function(t,e,l,n){const i=-t/2,a=t/2,h=-e/2,s=e/2,o=-l/2,r=l/2;return{ko:0,Mg:t,Hg:e,Ng:l,Gg:new Float32Array([i,h,o,i,s,o,a,s,o,i,h,o,a,s,o,a,h,o,i,h,r,a,h,r,a,s,r,i,h,r,a,s,r,i,s,r,i,h,o,a,h,o,a,h,r,i,h,o,a,h,r,i,h,r,a,h,o,a,s,o,a,s,r,a,h,o,a,s,r,a,h,r,a,s,o,i,s,o,a,s,r,a,s,o,a,s,r,i,s,r,i,h,o,i,h,r,i,s,r,i,h,o,i,s,r,i,s,o]),Ke:n,Kg:0}}(60,60,60,Ve);o=fromTranslation(create$4(),[0,0,600]),r=We(r,o);let c=a;c.ko=4,c.Ke=Ve,s.Ke=Ve,s.ko=4,r.Ke=Ve,r.ko=5,e.push(c),e.push(s),e.push(r),o=fromRotation(create$4(),Math.PI/2,[0,1,0]);let u=be(a,o);u.ko=6,u.Ke=ye;let g=fe(s,o);g.Ke=ye,g.ko=6;let d=We(r,o);d.Ke=ye,d.ko=7,e.push(u),e.push(g),e.push(d),o=fromRotation(create$4(),Math.PI/2,[1,0,0]);let I=be(a,o);I.ko=8,I.Ke=ve;let p=fe(s,o);p.ko=8,p.Ke=ve;let Z=We(r,o);Z.Ke=ve,Z.ko=9,e.push(I),e.push(p),e.push(Z),this.Eg=e;let G=e.length,m=0;for(let t=0;t<G;t++)m+=e[t].Gg.length;let C=new Float32Array(m),b=new Float32Array(m),f=new Float32Array(m);this.Jg=m/3;let W=0;for(let t=0;t<G;t++){let l=e[t];Se(l.Gg,l.Ke,new Color([l.ko,0,0,1]),W,C,b,f),l.Kg=W,W+=l.Gg.length}let X=this.Xc.gi;this.gi=X,this.Dr=X.createBuffer(),X.bindBuffer(X.ARRAY_BUFFER,this.Dr),X.bufferData(X.ARRAY_BUFFER,C,X.STATIC_DRAW),this.Or=X.createBuffer(),X.bindBuffer(X.ARRAY_BUFFER,this.Or),X.bufferData(X.ARRAY_BUFFER,b,X.STATIC_DRAW),this.Lg=X.createBuffer(),X.bindBuffer(X.ARRAY_BUFFER,this.Lg),X.bufferData(X.ARRAY_BUFFER,f,X.STATIC_DRAW),this.nh=new Shader(X,h.u,h.i),this.nh.ia(),this.zu=X.getUniformLocation(this.nh.$a,"u_Mvp"),this.Wg=X.getUniformLocation(this.nh.$a,"u_Offset"),this.Yh||(this.Yh=X.createFramebuffer()),this.Sh||(this.Sh=X.createRenderbuffer()),this.Ug||(this.Ug=X.createTexture())}onBeforeDraw(){}onAfterDraw(){if(!this.Fu)return;if(!this.Dg)return;this.nh.ia();let t=this.gi,e=z(this.Xc.Ti),l=e.zl,n=r(this.Dg).Ae(),i=function(t,e){var l=e[0],n=e[1],i=e[2],a=e[3],h=l+l,s=n+n,o=i+i,r=l*h,c=n*h,u=n*s,g=i*h,d=i*s,I=i*o,p=a*h,Z=a*s,G=a*o;return t[0]=1-u-I,t[1]=c+G,t[2]=g-Z,t[3]=0,t[4]=c-G,t[5]=1-r-I,t[6]=d+p,t[7]=0,t[8]=g+Z,t[9]=d-p,t[10]=1-r-u,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}(create$4(),n),a=e.Fl.width,h=e.Fl.height,s=function(t,e,l,n){let i=t.up,a=1e3,h=t.getEyeDir(),s=scale(create$3(),h,a),o=lookAt(create$4(),s,[0,0,0],i),r=e/l,c=0,u=0;r>1?(u=6e3,c=u*r):(c=6e3,u=c/r);c/=2,u/=2;let g=ortho(create$4(),-c,c,-u,u,0,2*a),d=multiply(create$4(),o,n),I=multiply(create$4(),g,d);return I}(l,a,h,i);t.uniformMatrix4fv(this.zu,!1,s);let o=transformMat4$1(create$3(),this.Dg.location,e.Nl);t.uniform2fv(this.Wg,new Float32Array([o[0],o[1]])),t.bindBuffer(t.ARRAY_BUFFER,this.Dr),t.vertexAttribPointer(0,3,t.FLOAT,!1,0,0),t.enableVertexAttribArray(0),t.bindBuffer(t.ARRAY_BUFFER,this.Or),t.vertexAttribPointer(1,3,t.FLOAT,!1,0,0),t.enableVertexAttribArray(1),t.disable(t.DEPTH_TEST),t.viewport(0,0,t.canvas.width,t.canvas.height),t.drawArrays(t.TRIANGLES,0,this.Jg),t.bindFramebuffer(t.FRAMEBUFFER,this.Yh),pt(t,t.COLOR_ATTACHMENT0,a,h,this.Ug,4),t.bindRenderbuffer(t.RENDERBUFFER,this.Sh),t.drawBuffers([t.COLOR_ATTACHMENT0]),t.bindBuffer(t.ARRAY_BUFFER,this.Lg),t.vertexAttribPointer(1,3,t.FLOAT,!1,0,0),t.enableVertexAttribArray(1),t.clearColor(0,0,0,1),t.clear(t.COLOR_BUFFER_BIT),t.viewport(0,0,a,h),t.drawArrays(t.TRIANGLES,0,this.Jg),t.bindFramebuffer(t.FRAMEBUFFER,null),t.enable(t.DEPTH_TEST),this.Pg=!0}start(){if(this.Fu)return;let t=z(this.Xc.Ti);t.Wn("mousemove",this.$g),t.Wn("mousedown",this.td),t.Wn("mouseup",this.ed),this.Fu=!0,this.Pg=!1}stop(){if(!this.Fu)return;z(this.Xc.Ti).Xn("mousemove",this.$g),this.Fu=!1}dispose(){}ad(t,e){this.jg=!1,t.can_rotate=!0}nd(t,e){if(0==e.detail.button&&0!=this._g){this.jg=!0,t.can_rotate=!1;let l=z(t).Fl.getBoundingClientRect(),n=e.detail.clientX-l.left,i=l.height-(e.detail.clientY-l.top);this.qg=fromValues(n,i)}}ld(t,e){if(this.Pg&&(this.hd(t,e),this.jg&&0!=this._g))switch(this._g){case 0:default:break;case 4:this.sd(t,e,[0,0,1]);break;case 6:this.sd(t,e,[1,0,0]);break;case 8:this.sd(t,e,[0,1,0]);break;case 1:this.od(t,e,[0,0,1]);break;case 2:this.od(t,e,[1,0,0]);break;case 3:this.od(t,e,[0,1,0]);break;case 5:this.rd(t,e,[0,0,1]);break;case 7:this.rd(t,e,[1,0,0]);break;case 9:this.rd(t,e,[0,1,0])}}hd(t,e){let l=e.detail;if(0!=l.buttons||this.jg)return;let n=z(t).Fl.getBoundingClientRect(),i=l.clientX-n.left,a=l.clientY-n.top,h=n.height-a,s=this.gi;s.bindFramebuffer(s.FRAMEBUFFER,this.Yh);let o=new Float32Array(4);s.readBuffer(s.COLOR_ATTACHMENT0),s.readPixels(i,h,1,1,s.RGBA,s.FLOAT,o);let r=Math.round(255*o[0]);s.bindFramebuffer(s.FRAMEBUFFER,null),this._g!=r&&(0!=this._g&&(this.ud(this._g,!1),this._g=0),0!=r&&(this.Eg.forEach((t=>{t.ko})),this.ud(r,!0),this._g=r),t.changed=!0)}gd(t,e){let l=z(t),n=l.Fl.getBoundingClientRect(),i=e.detail.clientX-n.left,a=n.height-(e.detail.clientY-n.top),h=fromValues(i,a),s=invert(create$4(),l.Nl),o=this.Dg.location,r=transformMat4$1(create$3(),o,l.Nl);i=i/n.width*2-1,a=a/n.height*2-1;let c=fromValues$2(i,a,r[2]);c=transformMat4$1(c,c,s),i=this.qg[0],a=this.qg[1],this.qg=h,i=i/n.width*2-1,a=a/n.height*2-1;let u=fromValues$2(i,a,r[2]);return u=transformMat4$1(u,u,s),{sp:c,ep:u,loc:o}}sd(t,e,i){let{sp:a,ep:h}=this.gd(t,e),s=l(create$3(),a,h);if(n(s)<1e-7)return;let o=r(this.Dg).Ae(),c=dot$1(transformQuat(create$3(),i,o),s),u=scale(create$3(),i,c);t.move_element(this.Dg,[u[0],u[1],u[2]]),this.Og&&this.Og(this.Dg),M(t),t.changed=!0}od(t,e,i){let{sp:a,ep:h,loc:s}=this.gd(t,e),o=l(create$3(),a,h);if(n(o)<1e-7)return;let c=r(this.Dg).Ae(),u=transformQuat(create$3(),i,c),g=l(create$3(),a,s);g=normalize$2(g,g);let d=l(create$3(),h,s);d=normalize$2(d,d),dot$1(cross(create$3(),d,g),u)>0?t.rotate_element(this.Dg,[i[0],i[1],i[2]],Math.PI/72):t.rotate_element(this.Dg,[i[0],i[1],i[2]],-Math.PI/72),this.Og&&this.Og(this.Dg),M(t),t.changed=!0}rd(t,e,i){let{sp:a,ep:h}=this.gd(t,e),s=l(create$3(),a,h);if(n(s)<1e-7)return;let o=r(this.Dg).Ae(),c=transformQuat(create$3(),i,o);if(this.Qg){let t=Math.max(...i);i=fromValues$2(t,t,t)}let u=scale(create$3(),i,.01);dot$1(s,c)>0?t.scale_element(this.Dg,[u[0]+1,1-u[1],u[2]+1]):t.scale_element(this.Dg,[1-u[0],u[1]+1,1-u[2]]),this.Og&&this.Og(this.Dg),M(t),t.changed=!0}ud(t,e){let l=[];this.Eg.forEach((e=>{e.ko==t&&l.push(e)}));let n=this.gi;n.bindBuffer(n.ARRAY_BUFFER,this.Or);let i=l.length;for(let t=0;t<i;t++){let i=l[t],a=i.Ke.to_float3_color(),h=new Float32Array(i.Gg.length);e&&(a=new Float32Array([1-a[0],1-a[1],1-a[2]]));let s=h.length/3;for(let t=0;t<s;t++)h.set(a,3*t);n.bufferSubData(n.ARRAY_BUFFER,4*i.Kg,h)}}}function Se(t,e,l,n,i,a,h){let s=t.length/3,o=e.to_float3_color(),r=l.to_float3_color();for(let e=0;e<s;e++)i[n+3*e]=t[3*e],i[n+3*e+1]=t[3*e+1],i[n+3*e+2]=t[3*e+2],a.set(o,n+3*e),h.set(r,n+3*e)}var Te;!function(t){t[t.stripe=1]="stripe",t[t.grid=2]="grid"}(Te||(Te={}));class we{scene;is_running=!1;dd;Vo;#t;#e=-1;#l=[];#n=!1;#i=Te.stripe;Id;pd;Zd;Gd;md;Cd;bd;zu;cg;ug;gg;fd;Wd;Xd;yd;vd;Vd;xu;Bd;Yd;vl;constructor(){}init(t){this.scene=t;const e=_(t);this.vl=z(e.Ti);const l=e.gi;this.Vo=l,this.#t=new Shader(l,h.Ge,h.Ze),this.#t.ia();const n=this.#t.$a;this.Id=l.getUniformLocation(n,"u_ColorSampler"),this.pd=l.getUniformLocation(n,"u_TransformIndexSampler"),this.Zd=l.getUniformLocation(n,"u_TriangleSize"),this.Gd=l.getUniformLocation(n,"u_PointSampler"),this.md=l.getUniformLocation(n,"u_PointSamplerSize"),this.Cd=l.getUniformLocation(n,"u_TransformSampler"),this.bd=l.getUniformLocation(n,"u_TransformSize"),this.zu=l.getUniformLocation(n,"u_Mvp"),this.cg=l.getUniformLocation(n,"u_ViewMatrix"),this.ug=l.getUniformLocation(n,"u_Near"),this.gg=l.getUniformLocation(n,"u_Far"),this.fd=l.getUniformLocation(n,"u_BasePoint"),this.Wd=l.getUniformLocation(n,"u_BaseDirection"),this.Xd=l.getUniformLocation(n,"u_Eye"),this.yd=l.getUniformLocation(n,"u_LightColor"),this.vd=l.getUniformLocation(n,"u_LightDirection"),this.Vd=l.getUniformLocation(n,"u_AmbientColor"),this.xu=l.getUniformLocation(n,"u_Color"),this.Bd=l.getUniformLocation(n,"u_Flow"),this.Yd=l.getUniformLocation(n,"u_FlowType")}onBeforeDraw(){}onAfterDraw(){if(!this.is_running)return;if(-1==this.#e)return void(this.#e=performance.now());this.#t.ia();let t=(performance.now()-this.#e)/1e3;this.#n&&(t=0);const e=this.#l.length,l=this.vl,n=l.ql,i=this.Vo;i.bindBuffer(i.ARRAY_BUFFER,n.rh),i.vertexAttribIPointer(0,1,i.UNSIGNED_INT,0,0),i.enableVertexAttribArray(0),i.bindBuffer(i.ARRAY_BUFFER,n.uh),i.vertexAttribIPointer(1,3,i.UNSIGNED_BYTE,0,0),i.enableVertexAttribArray(1),It(i,n.gh,i.TEXTURE1,this.Id),It(i,n.dh,i.TEXTURE2,this.pd),i.uniform1ui(this.Zd,n.Ih),It(i,n.ph,i.TEXTURE3,this.Gd),i.uniform1ui(this.md,n.Zh),It(i,n.Gh,i.TEXTURE4,this.Cd),i.uniform1ui(this.bd,n.mh),i.uniformMatrix4fv(this.zu,!1,l.Nl),i.uniformMatrix4fv(this.cg,!1,l.kl),i.uniform1f(this.ug,l.Ml),i.uniform1f(this.gg,l.Hl),i.uniform3fv(this.Xd,l.zl.getEye()),i.uniform3fv(this.yd,l.Al.color.to_float3_color()),i.uniform3fv(this.vd,l.Al.ze),i.uniform3fv(this.Vd,l.Gn.to_float3_color()),i.viewport(0,0,i.canvas.width,i.canvas.height),i.uniform1ui(this.Yd,this.#i);for(let l=0;l<e;l++){const e=this.#l[l];i.uniform3fv(this.fd,e.Sd.start),i.uniform3fv(this.Wd,e.Sd.direction),i.uniform3fv(this.xu,e.Sd.color.to_float3_color()),i.uniform1f(this.Bd,e.Td(t)),e.Ki()}}start(){this.is_running||(this.is_running=!0)}stop(){this.is_running&&(this.is_running=!1)}dispose(){}wd(t){const e=this.vl.In;let l=[];this.#l&&this.#l.length>0&&this.#l.forEach((t=>{l.push(t.Sd.element)})),e.show(l),l=[];const n=t.length,i=[];for(let e=0;e<n;e++){const n=t[e];l.push(n.element),i.push(new Re(n,this.Vo))}e.hide(l),e.commit(),this.#l=i,this.#e=-1}Rd(){this.#n=!0}Ad(){this.#n=!1}Nd(t){this.#i=t}}class Re{Sd;Vo;Yo;constructor(t,e){this.Sd=t,this.Vo=e,this.Yo=e.getExtension("WEBGL_multi_draw");const l=r(t.element).We,n=l.length;this.nc=new Int32Array(n),this.ac=new Int32Array(n);for(let t=0;t<n;t++){const e=l[t];this.nc[t]=e.start,this.ac[t]=e.length}}nc;ac;Ki(){this.nc.length>0&&this.Yo.multiDrawArraysWEBGL(this.Vo.TRIANGLES,this.nc,0,this.ac,0,this.nc.length)}Td(t){return this.Sd.speed*t}}class Scene{efficiency_mode=!0;get scene_context(){return _(this).Ti}set fps_changed(t){_(this).Ni=t}after_draw;on_crash;constructor(t){let e=(l=this,U.set(l,new P),U.get(l));var l;let n=document.createElement("canvas");t.appendChild(n),e.Fl=n,e.ci=t;let i=n.getContext("webgl2",{powerPreference:"high-performance"});Object.freeze(i),e.gi=i;let a=i.getContextAttributes();console.log({attr:a}),i.getExtension("EXT_float_blend"),i.getExtension("EXT_color_buffer_float"),i.getExtension("EXT_float_blend"),i.getExtension("OES_texture_float"),i.getExtension("EXT_float_blend extension"),i.getExtension("EXT_frag_depth"),i.getExtension("OES_texture_float"),i.getExtension("EXT_float_blend extension");let h=i.getExtension("WEBGL_debug_renderer_info"),s=i.getParameter(h.UNMASKED_RENDERER_WEBGL);console.log("gpu:"+s);let o=i.getParameter(i.MAX_FRAGMENT_UNIFORM_COMPONENTS);console.log("MAX_FRAGMENT_UNIFORM_COMPONENTS:"+o);let r=i.getParameter(i.MAX_TEXTURE_SIZE);console.log("max_tex_size:"+r);let c=i.getParameter(i.MAX_RENDERBUFFER_SIZE);console.log("MAX_RENDERBUFFER_SIZE",c);let u=i.getParameter(i.MAX_UNIFORM_BLOCK_SIZE);console.log("MAX_UNIFORM_BLOCK_SIZE",u);let g=i.getSupportedExtensions();console.log(g);let d=t.getBoundingClientRect();n.width=d.width,n.height=d.height,n.style.display="absolute",n.style.verticalAlign="top";let I=this;n.addEventListener("webglcontextlost",(t=>{I.on_crash&&I.on_crash()})),e.Wi=()=>{let l=t;n.style.width=`${l.clientWidth}px`,n.style.height=`${l.clientHeight}px`;let i=l.getBoundingClientRect();if(e.pi&&e.Zi>0){let t=i.left,l=i.top;e.pi.width=i.width,e.pi.height=i.height,e.pi.style.left=t+"px",e.pi.style.top=l+"px"}window.clearTimeout(e.Xi),e.Xi=window.setTimeout((()=>{let e=t.getBoundingClientRect();if(n.width=e.width,n.height=e.height,I.scene_context){H(I.scene_context),z(I.scene_context).jl=!0,I.scene_context.changed=!0}}))},e.fi=new ResizeObserver(e.Wi),e.fi.observe(t)}update_size(){let t=_(this),e=t.ci,l=t.Fl,n=e.getBoundingClientRect();l.width=n.width,l.height=n.height,z(this.scene_context).jl=!0,this.scene_context.changed=!0}enable_measure(t){let e=_(this);t?(null==e.qn&&(e.qn=new Measure,O(this,e.qn)),e.qn.start(),this.scene_context.select_mode=p.point,D(this,!0)):e.qn&&(e.qn?.stop(),this.scene_context.select_mode=p.element,D(this,!1))}enable_navigation_cube(t){let e=_(this);t?(null==e.ai&&(e.ai=new NavigationCube,O(this,e.ai)),e.ai.start()):e.ai?.stop()}set_navigation_cube(t,e=null){let l=_(this).ai;l&&(l.CubeSize=t,e&&(l.pos_action=e))}enable_section(t){let e=_(this);if(t){switch(null==e.$n&&(e.$n=new Section,O(this,e.$n)),null==e.Cn&&(e.Cn=new PlaneSection,O(this,e.Cn)),z(e.Ti).bn){case Y.box:e.$n.start();break;case Y.plane:e.Cn.start()}}else e.$n?.stop(),e.Cn?.stop()}enable_skybox(t){let e=_(this);t?(e.ii||(e.ii=new Skybox,O(this,e.ii)),e.ii.start()):e.ii.stop()}enable_snappoint(t){let e=_(this);t?(e.si||(e.si=new SnapPoint,O(this,e.si)),this.scene_context.select_mode=p.snap,e.si.start(),D(this,!0)):e.si&&(e.si.stop(),D(this,!1),this.scene_context.select_mode=p.element)}reset_section(){let t=_(this);null!=t.$n&&t.$n.reSetBox(),this.scene_context.section_mode=Y.none}set_label(t){let e=_(this);t&&t.length>0?(null==e.hi&&(e.hi=new Labelmanager,O(this,e.hi)),e.bi||(D(this,!0),e.bi=!0),e.hi.setLabel(t),e.hi.start()):(e.hi?.stop(),e.hi?.setLabel(null),e.bi&&(D(this,!1),e.bi=!1))}update_label(t){let e=_(this);t&&(null==e.hi&&(e.hi=new Labelmanager,O(this,e.hi)),e.bi||(D(this,!0),e.bi=!0),e.hi.Qa(t),e.hi.start())}set_cad(t){if(t){let e=_(this);e.ni||(e.ni=new pe,O(this,e.ni)),e.ni.set_texture(t.cad,t.points),e.ni.start()}else{let t=_(this);t.ni?.stop()}}enable_sketch_plane(t){let e=_(this);if(t){e.ti||(e.ti=new Ze,O(this,e.ti)),e.ti.start(),this.enable_snappoint(!0);let t=this;return D(this,!0),{complete(){e.ti.stop(),t.enable_snappoint(!1)},get closed(){return e.ti.Cg},get points(){return e.ti.Gg},set_pick_callback(t){e.ti.bg=t}}}e.ti&&(e.ti.stop(),D(this,!1),this.enable_snappoint(!1))}enable_wire(t,e){let l=_(this);if(t){return l.ei||(l.ei=new Ge,O(this,l.ei)),l.ei.set_wire(e),l.ei.start(),{complete(){l.ei.stop()}}}l.ei&&l.ei.stop()}enable_wall_editer(t){let e=_(this);if(t)return e.li||(e.li=new me,O(this,e.li)),e.li.start(),e.li.Rg();e.li&&e.li.stop()}enable_axis(t=!0){let e=_(this);if(t){return e.oi||(e.oi=new Ye,O(this,e.oi)),e.oi.start(),{set_element(t){e.oi.Dg=t},set_callback(t){e.oi.Og=t},lock_ratio(){e.oi.Qg=!0},unlock_ratio(){e.oi.Qg=!1},close(){e.oi.stop()}}}e.oi&&e.oi.stop()}enable_waterflow(t=!0){const e=_(this);if(t){e.ri||(e.ri=new we,O(this,e.ri)),e.ri.start();return{set_flow(t){e.ri.wd(t)},pause(){e.ri.Rd()},restart(){e.ri.Ad()},set_type(t){e.ri.Nd(t)}}}e.ri&&e.ri.stop()}select_render(t){let e=_(this);e.di=e.ui.find((e=>e.Name==t)),this.scene_context.changed=!0}screenshot(t){_(this).Vi=t,this.scene_context.changed=!0}dispose(){let t=_(this);t.$n?.dispose(),t.qn?.dispose(),t.ai?.dispose(),z(this.scene_context).ql.dispose(),t.ui.forEach((t=>t.dispose())),t.pi&&t.pi?.remove(),t.ci.innerHTML="",window.removeEventListener("resize",t.Wi),t.Ii?.dispose(),t.Bi=!1}load_url(t,e,l){let n=_(this),i=n.Yi,a=this;console.time("load_url");i.subscribe("start_draw",(()=>{let t=a.scene_context;n.ui.push(new Ht(t)),a.select_render("post"),n.Ii=new EventManager(t),H(t),Q(a)}),!0);let h=new ce(this),s=new DefaltSceneLoader(this,n.Yi,h);s.progress_changed=(t,e)=>{"end"==e&&(n.Se=!0,console.timeEnd("load_url")),l(t,e)},s.load_url(t,e)}load_cache(t,e){let l=_(this),n=l.Yi,i=this;n.subscribe("start_draw",(()=>{let t=i.scene_context;l.ui.push(new Ht(t)),i.select_render("post"),l.Ii=new EventManager(t),H(t),Q(i)}),!0);let a=new ce(this),h=new DefaltSceneLoader(this,l.Yi,a);h.progress_changed=(t,n)=>{"end"==n&&(l.Se=!0),e(t,n)},h.load_cache(t)}}class Group{kd;get name(){return this.kd}set name(t){this.kd=t}indices=new Int32Array(0);constructor(){}}class Label{id;type;data;point;shadow_color;font;font_color;font_back_color;constructor(){}}class ElementUniqueId{index;unique_id}class ColorRecord{current_version=5;version;sadiId;name;items=[];extra_items=[];light_color;light_phi;light_theta;shadow=!1;shadow_factor=1;bias=50;ambient;background_color;ao;ao_factor;edge_width=1;outline_width=2;edge_color;outline_color;bloom_range;bloom_factor;bloom_exposure;blooms=new Int32Array(0);extra_blooms=new Int32Array(0);constructor(){}save_buffer(){let t=new AutoBufferWriter(1048576);t.writeInt32(this.current_version),t.writeUint8Array(this.light_color.data),t.writeUint8Array(this.ambient.data),t.writeUint8Array(this.background_color.data),t.writeSingle(this.light_phi),t.writeSingle(this.light_theta),t.writeBoolean(this.shadow),t.writeSingle(this.shadow_factor),t.writeSingle(this.bias),t.writeSingle(this.ao),t.writeSingle(this.ao_factor),t.writeUint8Array(this.edge_color.data),t.writeInt32(this.edge_width),t.writeUint8Array(this.outline_color.data),t.writeInt32(this.outline_width),t.writeSingle(this.bloom_range),t.writeSingle(this.bloom_factor),t.writeSingle(this.bloom_exposure);let e=this.items.length;t.writeInt32(e);for(let l=0;l<e;l++){let e=this.items[l];t.writeInt32(e.instance_id),t.writeUint8(e.r),t.writeUint8(e.g),t.writeUint8(e.b),t.writeUint8(e.a)}e=this.extra_items.length,t.writeInt32(e);for(let l=0;l<e;l++){let e=this.extra_items[l];t.writeInt32(e.element),t.writeInt32(e.instance),t.writeUint8Array(e.color)}return e=this.blooms.length,t.writeInt32(e),t.writeInt32Array(this.blooms),e=this.extra_blooms.length,t.writeInt32(e),t.writeInt32Array(this.extra_blooms),t.getBuffer()}load_buffer(t){let e=new StreamReader(t);this.items=[],this.version=e.readInt32(),this.light_color=new Color(e.readUint8Array(4)),this.ambient=new Color(e.readUint8Array(4)),this.background_color=new Color(e.readUint8Array(4)),this.light_phi=e.readSingle(),this.light_theta=e.readSingle(),this.version>=2&&(this.shadow=e.readBoolean(),this.shadow_factor=e.readSingle(),this.bias=e.readSingle()),this.version>=3&&(this.ao=e.readSingle(),this.ao_factor=e.readSingle()),this.edge_color=new Color(e.readUint8Array(4)),this.version>=4&&(this.edge_width=e.readInt32()),this.outline_color=new Color(e.readUint8Array(4)),this.version>=4&&(this.outline_width=e.readInt32()),this.bloom_range=e.readSingle(),this.bloom_factor=e.readSingle(),this.version>=3&&(this.bloom_exposure=e.readSingle());let l=e.readInt32();for(let t=0;t<l;t++){let t=new ColorRecordItem;t.instance_id=e.readInt32(),t.r=e.readUint8(),t.g=e.readUint8(),t.b=e.readUint8(),t.a=e.readUint8(),this.items.push(t)}if(this.version>=5){l=e.readInt32();for(let t=0;t<l;t++){let t=new ExtraColorItem;t.element=e.readInt32(),t.instance=e.readInt32(),t.color=e.readUint8Array(4),this.extra_items.push(t)}}l=e.readInt32(),this.blooms=e.readInt32Array(l),this.version>=5&&(l=e.readInt32(),this.extra_blooms=e.readInt32Array(l))}}class Token{type;value;headers}class RecordMedium{elementId;uniqueId;index}function get_uniqueIds(t,e,l){let n=t.length,i=new Array(n),a=new Map;for(let e=0;e<n;e++){let l=t[e];l.index?i[l.index]=l:a.set(l.elementId,l)}n=e.length;let h=new Array;for(let t=0;t<n;t++){let l=e[t];h.push(i[l].uniqueId)}return l.forEach((t=>{h.push(a.get(t).uniqueId)})),h}class ColorMediumManager{vl;Kd=4;constructor(t){this.vl=t}export(t,e){let l=z(this.vl).Qe,n=l.length,a=new Array(n),h=new Map;for(let e=0;e<n;e++){let l=t[e];null!=l.index?a[l.index]=l:h.set(l.elementId,l)}let s=new Array,o=new Array,r=new Map,c=e.items;n=c.length;for(let t=0;t<n;t++){let e=c[t];r.set(e.instance_id,e)}let u=new Map,g=e.extra_items;n=g.length;for(let t=0;t<n;t++){let e=g[t];if(u.has(e.element))u.get(e.element).push(e);else{let t=[];t.push(e),u.set(e.element,t)}}n=l.length;for(let t=0;t<n;t++){let e=l[t];if(e.ye==i.MainModel){let t=new Ne;t.uniqueId=a[e.index].uniqueId;let l=e.We,n=l.length;for(let e=0;e<n;e++){let n=l[e],i=r.get(n.index);if(null!=i){let l=new ke;l.index=e,l.color=i.color,t.instances.push(l)}}t.instances.length>0&&s.push(t)}else{let t=u.get(e.id);if(t){let l=new Ne;l.uniqueId=h.get(e.id).uniqueId;let n=t.length;for(let e=0;e<n;e++){let n=t[e],i=new ke;i.index=n.instance,i.color=n.color,l.instances.push(i)}l.instances.length>0&&o.push(l)}}}let d=new Ae;d.light_color=e.light_color,d.light_phi=e.light_phi,d.light_theta=e.light_theta,d.ambient=e.ambient,d.backgroundColor=e.background_color,d.edge_color=e.edge_color,d.outline_color=e.outline_color,d.shadow=e.shadow,d.shadow_factor=e.shadow_factor,d.edge_width=e.edge_width,d.outline_width=e.outline_width,d.bias=e.bias,d.ao=e.ao,d.ao_factor=e.ao_factor,d.bloom_range=e.bloom_range,d.bloom_factor=e.bloom_factor,d.bloom_exposure=e.bloom_exposure;let I=e.blooms,p=e.extra_blooms,Z=I.length,G=new Array(Z);for(let t=0;t<Z;t++)G[t]=a[I[t]].uniqueId;return p.forEach((t=>{let e=h.get(t);e&&G.push(e.uniqueId)})),d.blooms=G,d.items=s,this.Md(d)}Md(t){let e=new AutoBufferWriter;e.writeInt32(this.Kd),e.writeUint8Array(t.light_color.data),e.writeSingle(t.light_phi),e.writeSingle(t.light_theta),e.writeUint8Array(t.ambient.data),e.writeUint8Array(t.backgroundColor.data),e.writeUint8Array(t.edge_color.data),e.writeUint8Array(t.outline_color.data),e.writeBoolean(t.shadow),e.writeSingle(t.shadow_factor),e.writeSingle(t.edge_width),e.writeSingle(t.outline_width),e.writeSingle(t.bias),e.writeSingle(t.ao),e.writeSingle(t.ao_factor),e.writeSingle(t.bloom_range),e.writeSingle(t.bloom_factor),e.writeSingle(t.bloom_exposure);let l=t.blooms,n=l.length;e.writeInt32(n);for(let t=0;t<n;t++)e.writeString(l[t]);let i=t.items,a=i.length;e.writeInt32(a);for(let t=0;t<a;t++){let l=i[t];e.writeString(l.uniqueId);let n=l.instances,a=n.length;e.writeInt32(a);for(let t=0;t<a;t++){let l=n[t];e.writeInt32(l.index),e.writeUint8Array(l.color)}}return e.getBuffer()}import(t,e){let l={has_color:!1,has_bloom:!1},n=e.length,i=new Map;for(let t=0;t<n;t++){let l=e[t];i.set(l.uniqueId,l)}let a=this.Hd(t),h=this.vl,s=z(h),o=s.Qe;s.Al.color=a.light_color,s.Al.phi=a.light_phi,s.Al.theta=a.light_theta,h.ambient=a.ambient,h.background=a.backgroundColor,h.edge_color=a.edge_color,h.outline_color=a.outline_color,h.shadow=a.shadow,h.shadow_factor=a.shadow_factor,h.edge_width=a.edge_width,h.outline_width=a.outline_width,h.bias=a.bias,h.ao_radius=a.ao,h.ao_factor=a.ao_factor,h.bloom_manager.bloomRange=a.bloom_range,h.bloom_manager.bloomFactor=a.bloom_factor,h.exposure=a.bloom_exposure;let r=a.blooms,c=new Map;o.forEach((t=>{c.set(t.id,t)}));let u=r.length;for(let t=0;t<u;t++){let e=i.get(r[t]);e&&(l.has_bloom=!0,this.Kd>=4?null!=e.index?o[e.index].fe=!0:c.get(e.elementId).fe=!0:o[e.index].fe=!0)}l.has_bloom&&(R(h.bloom_manager).Vl=!0);let g=a.items;n=g.length;for(let t=0;t<n;t++){let e=g[t],n=i.get(e.uniqueId);if(n){let t;l.has_color=!0,t=this.Kd>=4?n.index?o[n.index]:c.get(n.elementId):o[n.index];let i=e.instances,a=i.length;for(let e=0;e<a;e++){let l=i[e],n=t.We[l.index];n&&(n.Ne=l.color)}}}return l}Hd(t){let e=new Ae,l=new Array,n=new StreamReader(t),i=n.readInt32();if(this.Kd=i,e.light_color=new Color(n.readUint8Array(4)),e.light_phi=n.readSingle(),e.light_theta=n.readSingle(),e.ambient=new Color(n.readUint8Array(4)),e.backgroundColor=new Color(n.readUint8Array(4)),e.edge_color=new Color(n.readUint8Array(4)),e.outline_color=new Color(n.readUint8Array(4)),i>=2&&(e.shadow=n.readBoolean(),e.shadow_factor=n.readSingle(),e.edge_width=n.readSingle(),e.outline_width=n.readSingle(),e.bias=n.readSingle(),e.ao=n.readSingle(),e.ao_factor=n.readSingle(),e.bloom_range=n.readSingle(),e.bloom_factor=n.readSingle(),e.bloom_exposure=n.readSingle()),i>=3){let t=n.readInt32(),l=new Array(t);for(let e=0;e<t;e++)l[e]=n.readString();e.blooms=l}let a=n.readInt32();for(let t=0;t<a;t++){let t=new Ne;t.uniqueId=n.readString();let e=n.readInt32();for(let l=0;l<e;l++){let e=new ke;e.index=n.readInt32(),e.color=n.readUint8Array(4),t.instances.push(e)}l.push(t)}return e.items=l,e}}class Ae{light_color;light_phi;light_theta;ambient;backgroundColor;edge_color;outline_color;items=[];shadow=!1;shadow_factor=1;edge_width=1;outline_width=2;bias=50;ao=20;ao_factor=2;bloom_range=10;bloom_factor=1;bloom_exposure=1;blooms=[]}class Ne{uniqueId;instances=[]}class ke{index;color}var Ke;!function(t){t[t.Show=0]="Show",t[t.Hide=1]="Hide"}(Ke||(Ke={}));class VisibleRecordManager{vl;constructor(t){this.vl=t}save_to_record(t){let e=[],l=[],n=[],a=[],h=[],s=[],o=z(this.vl).Qe,r=o.length;for(let t=0;t<r;t++){let r=o[t];r.ye==i.MainModel?(r.Ce?l.push(r.index):e.push(r.index),r.be&&n.push(r.index)):(r.Ce?h.push(r.id):a.push(r.id),r.be&&s.push(r.id))}if(l.length>e.length?(t.main_indices=new Int32Array(e),t.extra_indices=new Int32Array(a),t.visibility_type=Ke.Hide):(t.main_indices=new Int32Array(l),t.extra_indices=new Int32Array(h),t.visibility_type=Ke.Show),t.main_frozen=new Int32Array(n),t.extra_frozen=new Int32Array(s),t.section_mode=this.vl.section_mode,t.section_mode==Y.box&&(t.section_box=this.vl.section_box),t.section_mode==Y.plane){let e=this.vl.section_plane,l=new Float32Array(6);l.set(e.orign),l.set(e.normal,3),t.section_box=l}t.section_mode==Y.none&&(t.section_box=null)}export(t,e){let l=new Me;l.type=t.visibility_type,l.section_mode=t.section_mode,l.sectionBox=t.section_box,l.uniqueIds=get_uniqueIds(e,t.main_indices,t.extra_indices),l.frozen=get_uniqueIds(e,t.main_frozen,t.extra_frozen);let n=new AutoBufferWriter,i=l.uniqueIds,a=i.length;n.writeInt32(a);for(let t=0;t<a;t++)n.writeString(i[t]);let h=l.frozen;a=h.length,n.writeInt32(a);for(let t=0;t<a;t++)n.writeString(h[t]);return n.writeUint8(l.section_mode),l.section_mode!=Y.none&&n.writeFloat32Aarry(l.sectionBox),n.writeInt32(l.type),n.getBuffer()}import(t,e,l){let n=new StreamReader(l),i=n.readInt32(),a=new Array(i);for(let t=0;t<i;t++)a[t]=n.readString();i=n.readInt32();let h=new Array(i);for(let t=0;t<i;t++)h[t]=n.readString();let s=n.readUint8();t.section_mode=s,s!=Y.none&&(t.section_box=n.readFloat32Array(6)),t.visibility_type=n.readInt32();let o=new Map;i=e.length;for(let t=0;t<i;t++){let l=e[t];o.set(l.uniqueId,l)}let r=[],c=[];i=a.length;for(let t=0;t<i;t++){let e=a[t],l=o.get(e);null!=l&&(null!=l.index?r.push(l.index):c.push(l.elementId))}t.main_indices=new Int32Array(r),t.extra_indices=new Int32Array(c);let u=[];c=[],i=h.length;for(let t=0;t<i;t++){let l=h[t],n=e.find((t=>t.uniqueId==l));null!=n&&(null!=n.index?u.push(n.index):c.push(n.elementId))}t.main_frozen=new Int32Array(u),t.extra_frozen=new Int32Array(c)}}class Me{uniqueIds;frozen;type;section_mode;sectionBox}class VisibilityRecord{name;main_indices=new Int32Array(0);extra_indices=new Int32Array(0);section_mode;section_box;main_frozen=new Int32Array(0);extra_frozen=new Int32Array(0);visibility_type}class SceneTree{vl;constructor(t){this.vl=t}build(){let t=z(this.vl),e=t.Qe,l=t.Yl,n=new Map;l.forEach((t=>{n.set(t.id,t)}));let i=e.length,a=new Map;for(let t=0;t<i;t++){let l=e[t],n=l.typeId;a.has(n)?a.get(n).push(l.index):a.set(n,[l.index])}let h=[];a.forEach(((t,e)=>{let l=n.get(e);if(l){let n=new TypeNode;n.name=l.name,n.indices=new Int32Array(t),n.type_id=e,h.push(n)}}));let s=[];return h.forEach((t=>{let l=e[t.indices[0]],n=l.category,i=s.find((t=>t.category==n));if(null==i){let e=new CategoryNode;e.category=l.category,e.name=get_categry_label(l.category),e.types.push(t),s.push(e)}else i.types.push(t)})),s=s.filter((t=>!is_space(t.category))),s}}class CategoryNode{name;category;types=[]}class TypeNode{name;type_id;indices}class He{Fd;constructor(t){this.Fd=t}zd(t){return this.Fd?this.xd(t):!this.xd(t)}}class Fe extends He{Ed=[];constructor(t,e=!0){super(e),this.Ed=t}xd(t){let e=this.Ed,l=e.length;for(let n=0;n<l;n++){if(!e[n].zd(t))return!1}return!0}}class ze extends He{constructor(t){super(t)}xd(t){return t.fe}}class xe extends He{we;constructor(t,e=!0){super(e),this.we=t}xd(t){let e=t.get_box(),l=this.we;for(let t=0;t<3;t++){let n=e[t],i=e[t+3],a=l[t],h=l[t+3];if(!(n>a&&i<h))return!1}return!0}}class Ee extends He{we;constructor(t,e=!0){super(e),this.we=t}xd(t){let e=t.get_box(),l=this.we;for(let t=0;t<3;t++){let n=e[t],i=e[t+3],a=l[t];if(n>l[t+3]||i<a)return!1}return!0}}class Le extends He{Ld;constructor(t,e=!0){super(e),this.Ld=t}xd(t){return t.category==this.Ld}}const Je=new WeakMap;function Ue(t,e){Je.set(t,e)}function Pe(t){return Je.get(t)}const De=new WeakMap;class Oe extends He{xd(t){return t.be}constructor(t){super(t)}}class Qe{Jd;constructor(t){this.Jd=t}zd(t){return t.material_id==this.Jd}}class _e extends He{Ed=[];constructor(t,e=!0){super(e),this.Ed=t}xd(t){let e=this.Ed,l=e.length;for(let n=0;n<l;n++){if(e[n].zd(t))return!0}return!1}}class je extends He{Ud;constructor(t,e=!0){super(e),this.Ud=t}xd(t){return t.storey_index==this.Ud}}class qe extends He{Pd;constructor(t,e=!0){super(e),this.Pd=t}xd(t){return t.typeId==this.Pd}}class $e extends He{constructor(t){super(t)}xd(t){return t.Ce}}const tl=new WeakMap;class el{il;Qe=[];dl=[];constructor(t){this.il=t;let e=z(t);this.Qe=e.Qe,this.dl=e.dl}}function ll(t,e){let l=tl.get(t),n=l.dl,i=function(t){return De.get(t)}(e),a=[],h=n.length;for(let t=0;t<h;t++){let e=n[t];i.zd(e)&&a.push(e)}l.dl=a}function nl(t){return tl.get(t)}class OrFilter{type="element";constructor(t,e=!0){let l=t.length,n=new Array(l);for(let e=0;e<l;e++)n[e]=Pe(t[e]);Ue(this,new _e(n,e))}}class AndFilter{type="element";constructor(t,e=!0){let l=t.length,n=new Array(l);for(let e=0;e<l;e++)n[e]=Pe(t[e]);Ue(this,new Fe(n,e))}}class CategoryFilter{type="element";constructor(t,e=!0){Ue(this,new Le(t,e))}}class TypeFilter{type="element";constructor(t,e=!0){Ue(this,new qe(t,e))}}class VisibleFilter{type="element";constructor(t){Ue(this,new $e(t))}}class StoreyFilter{type="element";constructor(t,e=!0){Ue(this,new je(t,e))}}class BloomFilter{type="element";constructor(t){Ue(this,new ze(t))}}class LockedFilter{type="element";constructor(t){Ue(this,new Oe(t))}}class BoxInsideFilter{type="element";constructor(t,e=!0){Ue(this,new xe(t,e))}}class BoxIntersectsFilter{type="element";constructor(t,e=!0){Ue(this,new Ee(t,e))}}class MaterialFilter{type="instance";constructor(t){var e,l;e=this,l=new Qe(t),De.set(e,l)}}class SceneContextFilter{get elements(){let t=nl(this).Qe,e=t.length,l=new Array(e);for(let n=0;n<e;n++)l[n]=t[n].Xe;return l}get instances(){let t=nl(this).dl,e=t.length,l=new Array(e);for(let n=0;n<e;n++)l[n]=t[n].Xe;return l}constructor(t){!function(t,e){tl.set(t,new el(e))}(this,t)}where_pass(t){switch(t.type){case"element":!function(t,e){let l=tl.get(t),n=Pe(e),i=l.Qe,a=[],h=i.length;for(let t=0;t<h;t++){let e=i[t];n.zd(e)&&a.push(e)}l.Qe=a}(this,t);break;case"instance":ll(this,t)}return this}}const il=new WeakMap;class CoreEngine{get HEAP8(){return il.get(this).HEAP8}get HEAPU8(){return il.get(this).HEAPU8}HEAP16;HEAP32;HEAPF32;HEAPF64;HEAPU16;HEAPU32;calledRun;ready;constructor(t){il.set(this,t)}Dd(t){return il.get(this)._malloc(t)}Od(t){return il.get(this)._free(t)}Qd(t){return il.get(this)._get_geometry_point_count(t)}_d(t){return il.get(this)._get_geometry_point(t)}jd(t){return il.get(this)._get_geometry_face_count(t)}qd(t,e){return il.get(this)._get_geometry_face(t,e)}$d(t){return il.get(this)._get_face_point_count(t)}tI(t){return il.get(this)._get_face_indices(t)}eI(t){return il.get(this)._get_face_normals(t)}lI(t){return il.get(this)._is_planar(t)}nI(t,e,l,n,i){return il.get(this)._make_points_prism(t,e,l,n,i)}iI(t){return il.get(this)._set_log_func(t)}aI(t,e,l){return il.get(this)._make_pipe(t,e,l)}addFunction(t,e){return il.get(this).addFunction(t,e)}}let al=new WeakMap;class GeometryEngine{constructor(){}async init(){let t=atob("dmFyIF9zY3JpcHREaXIgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA6IHVuZGVmaW5lZDtyZXR1cm4gKGZ1bmN0aW9uKG1vZHVsZUFyZyA9IHt9KSB7dmFyIE1vZHVsZSA9IG1vZHVsZUFyZzt2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSwgcmVhZHlQcm9taXNlUmVqZWN0O01vZHVsZVsicmVhZHkiXSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtyZWFkeVByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTtyZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7fSk7WyAiX21hbGxvYyIsICJfZnJlZSIsICJfZ2V0X2dlb21ldHJ5X3BvaW50X2NvdW50IiwgIl9nZXRfZ2VvbWV0cnlfcG9pbnQiLCAiX2dldF9nZW9tZXRyeV9mYWNlX2NvdW50IiwgIl9nZXRfZ2VvbWV0cnlfZmFjZSIsICJfZ2V0X2ZhY2VfcG9pbnRfY291bnQiLCAiX2dldF9mYWNlX2luZGljZXMiLCAiX2lzX3BsYW5hciIsICJfZ2V0X2ZhY2Vfbm9ybWFscyIsICJfbWFrZV9wb2ludHNfcHJpc20iLCAiX3NldF9sb2dfZnVuYyIsICJfbWFrZV9waXBlIiwgIl9tZW1vcnkiLCAiX09TRF9NZW1JbmZvX2dldE1vZHVsZUhlYXBMZW5ndGgiLCAiX2ZmbHVzaCIsICJfX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZSIsICJfX19zdGFydF9lbV9qcyIsICJfX19zdG9wX2VtX2pzIiwgIm9uUnVudGltZUluaXRpYWxpemVkIiBdLmZvckVhY2gocHJvcCA9PiB7aWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1vZHVsZVsicmVhZHkiXSwgcHJvcCkpIHtPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9kdWxlWyJyZWFkeSJdLCBwcm9wLCB7Z2V0OiAoKSA9PiBhYm9ydCgiWW91IGFyZSBnZXR0aW5nICIgKyBwcm9wICsgIiBvbiB0aGUgUHJvbWlzZSBvYmplY3QsIGluc3RlYWQgb2YgdGhlIGluc3RhbmNlLiBVc2UgLnRoZW4oKSB0byBnZXQgY2FsbGVkIGJhY2sgd2l0aCB0aGUgaW5zdGFuY2UsIHNlZSB0aGUgTU9EVUxBUklaRSBkb2NzIGluIHNyYy9zZXR0aW5ncy5qcyIpLHNldDogKCkgPT4gYWJvcnQoIllvdSBhcmUgc2V0dGluZyAiICsgcHJvcCArICIgb24gdGhlIFByb21pc2Ugb2JqZWN0LCBpbnN0ZWFkIG9mIHRoZSBpbnN0YW5jZS4gVXNlIC50aGVuKCkgdG8gZ2V0IGNhbGxlZCBiYWNrIHdpdGggdGhlIGluc3RhbmNlLCBzZWUgdGhlIE1PRFVMQVJJWkUgZG9jcyBpbiBzcmMvc2V0dGluZ3MuanMiKX0pO319KTt2YXIgbW9kdWxlT3ZlcnJpZGVzID0gT2JqZWN0LmFzc2lnbih7fSwgTW9kdWxlKTt2YXIgYXJndW1lbnRzXyA9IFtdO3ZhciB0aGlzUHJvZ3JhbSA9ICIuL3RoaXMucHJvZ3JhbSI7dmFyIHF1aXRfID0gKHN0YXR1cywgdG9UaHJvdykgPT4ge3Rocm93IHRvVGhyb3c7fTt2YXIgRU5WSVJPTk1FTlRfSVNfV0VCID0gdHJ1ZTt2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSID0gZmFsc2U7dmFyIEVOVklST05NRU5UX0lTX05PREUgPSBmYWxzZTt2YXIgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSBmYWxzZTtpZiAoTW9kdWxlWyJFTlZJUk9OTUVOVCJdKSB7dGhyb3cgbmV3IEVycm9yKCJNb2R1bGUuRU5WSVJPTk1FTlQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVG8gZm9yY2UgdGhlIGVudmlyb25tZW50LCB1c2UgdGhlIEVOVklST05NRU5UIGNvbXBpbGUtdGltZSBvcHRpb24gKGZvciBleGFtcGxlLCAtc0VOVklST05NRU5UPXdlYiBvciAtc0VOVklST05NRU5UPW5vZGUpIik7fXZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjtmdW5jdGlvbiBsb2NhdGVGaWxlKHBhdGgpIHtpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHtyZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTt9cmV0dXJuIHNjcmlwdERpcmVjdG9yeSArIHBhdGg7fXZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5O2lmIChFTlZJUk9OTUVOVF9JU19TSEVMTCkge2lmICgodHlwZW9mIHByb2Nlc3MgPT0gIm9iamVjdCIgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICJmdW5jdGlvbiIpIHx8IHR5cGVvZiB3aW5kb3cgPT0gIm9iamVjdCIgfHwgdHlwZW9mIGltcG9ydFNjcmlwdHMgPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCJub3QgY29tcGlsZWQgZm9yIHRoaXMgZW52aXJvbm1lbnQgKGRpZCB5b3UgYnVpbGQgdG8gSFRNTCBhbmQgdHJ5IHRvIHJ1biBpdCBub3Qgb24gdGhlIHdlYiwgb3Igc2V0IEVOVklST05NRU5UIHRvIHNvbWV0aGluZyAtIGxpa2Ugbm9kZSAtIGFuZCBydW4gaXQgc29tZXBsYWNlIGVsc2UgLSBsaWtlIG9uIHRoZSB3ZWI/KSIpO2lmICh0eXBlb2YgcmVhZCAhPSAidW5kZWZpbmVkIikge3JlYWRfID0gcmVhZDt9cmVhZEJpbmFyeSA9IGYgPT4ge2lmICh0eXBlb2YgcmVhZGJ1ZmZlciA9PSAiZnVuY3Rpb24iKSB7cmV0dXJuIG5ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoZikpO31sZXQgZGF0YSA9IHJlYWQoZiwgImJpbmFyeSIpO2Fzc2VydCh0eXBlb2YgZGF0YSA9PSAib2JqZWN0Iik7cmV0dXJuIGRhdGE7fTtyZWFkQXN5bmMgPSAoZiwgb25sb2FkLCBvbmVycm9yKSA9PiB7c2V0VGltZW91dCgoKSA9PiBvbmxvYWQocmVhZEJpbmFyeShmKSkpO307aWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT0gInVuZGVmaW5lZCIpIHtnbG9iYWxUaGlzLmNsZWFyVGltZW91dCA9IGlkID0+IHt9O31pZiAodHlwZW9mIHNldFRpbWVvdXQgPT0gInVuZGVmaW5lZCIpIHtnbG9iYWxUaGlzLnNldFRpbWVvdXQgPSBmID0+ICh0eXBlb2YgZiA9PSAiZnVuY3Rpb24iKSA/IGYoKSA6IGFib3J0KCk7fWlmICh0eXBlb2Ygc2NyaXB0QXJncyAhPSAidW5kZWZpbmVkIikge2FyZ3VtZW50c18gPSBzY3JpcHRBcmdzO30gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50cyAhPSAidW5kZWZpbmVkIikge2FyZ3VtZW50c18gPSBhcmd1bWVudHM7fWlmICh0eXBlb2YgcXVpdCA9PSAiZnVuY3Rpb24iKSB7cXVpdF8gPSAoc3RhdHVzLCB0b1Rocm93KSA9PiB7c2V0VGltZW91dCgoKSA9PiB7aWYgKCEodG9UaHJvdyBpbnN0YW5jZW9mIEV4aXRTdGF0dXMpKSB7bGV0IHRvTG9nID0gdG9UaHJvdztpZiAodG9UaHJvdyAmJiB0eXBlb2YgdG9UaHJvdyA9PSAib2JqZWN0IiAmJiB0b1Rocm93LnN0YWNrKSB7dG9Mb2cgPSBbIHRvVGhyb3csIHRvVGhyb3cuc3RhY2sgXTt9ZXJyKGBleGl0aW5nIGR1ZSB0byBleGNlcHRpb246ICR7dG9Mb2d9YCk7fXF1aXQoc3RhdHVzKTt9KTt0aHJvdyB0b1Rocm93O307fWlmICh0eXBlb2YgcHJpbnQgIT0gInVuZGVmaW5lZCIpIHtpZiAodHlwZW9mIGNvbnNvbGUgPT0gInVuZGVmaW5lZCIpIGNvbnNvbGUgPSAvKiogQHR5cGV7IUNvbnNvbGV9ICovICh7fSk7Y29uc29sZS5sb2cgPSAvKiogQHR5cGV7IWZ1bmN0aW9uKHRoaXM6Q29uc29sZSwgLi4uKik6IHVuZGVmaW5lZH0gKi8gKHByaW50KTtjb25zb2xlLndhcm4gPSBjb25zb2xlLmVycm9yID0gLyoqIEB0eXBleyFmdW5jdGlvbih0aGlzOkNvbnNvbGUsIC4uLiopOiB1bmRlZmluZWR9ICovICh0eXBlb2YgcHJpbnRFcnIgIT0gInVuZGVmaW5lZCIgPyBwcmludEVyciA6IHByaW50KTt9fSBlbHNlICBpZiAoRU5WSVJPTk1FTlRfSVNfV0VCIHx8IEVOVklST05NRU5UX0lTX1dPUktFUikge2lmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHtzY3JpcHREaXJlY3RvcnkgPSBzZWxmLmxvY2F0aW9uLmhyZWY7fSBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCkge3NjcmlwdERpcmVjdG9yeSA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO31pZiAoX3NjcmlwdERpcikge3NjcmlwdERpcmVjdG9yeSA9IF9zY3JpcHREaXI7fWlmIChzY3JpcHREaXJlY3RvcnkuaW5kZXhPZigiYmxvYjoiKSAhPT0gMCkge3NjcmlwdERpcmVjdG9yeSA9IHNjcmlwdERpcmVjdG9yeS5zdWJzdHIoMCwgc2NyaXB0RGlyZWN0b3J5LnJlcGxhY2UoL1s/I10uKi8sICIiKS5sYXN0SW5kZXhPZigiLyIpICsgMSk7fSBlbHNlIHtzY3JpcHREaXJlY3RvcnkgPSAiIjt9aWYgKCEodHlwZW9mIHdpbmRvdyA9PSAib2JqZWN0IiB8fCB0eXBlb2YgaW1wb3J0U2NyaXB0cyA9PSAiZnVuY3Rpb24iKSkgdGhyb3cgbmV3IEVycm9yKCJub3QgY29tcGlsZWQgZm9yIHRoaXMgZW52aXJvbm1lbnQgKGRpZCB5b3UgYnVpbGQgdG8gSFRNTCBhbmQgdHJ5IHRvIHJ1biBpdCBub3Qgb24gdGhlIHdlYiwgb3Igc2V0IEVOVklST05NRU5UIHRvIHNvbWV0aGluZyAtIGxpa2Ugbm9kZSAtIGFuZCBydW4gaXQgc29tZXBsYWNlIGVsc2UgLSBsaWtlIG9uIHRoZSB3ZWI/KSIpO3tyZWFkXyA9IHVybCA9PiB7dmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7eGhyLnNlbmQobnVsbCk7cmV0dXJuIHhoci5yZXNwb25zZVRleHQ7fTtpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7cmVhZEJpbmFyeSA9IHVybCA9PiB7dmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7eGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7eGhyLnNlbmQobnVsbCk7cmV0dXJuIG5ldyBVaW50OEFycmF5KC8qKiBAdHlwZXshQXJyYXlCdWZmZXJ9ICovICh4aHIucmVzcG9uc2UpKTt9O31yZWFkQXN5bmMgPSAodXJsLCBvbmxvYWQsIG9uZXJyb3IpID0+IHt2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLCB1cmwsIHRydWUpO3hoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiO3hoci5vbmxvYWQgPSAoKSA9PiB7aWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8ICh4aHIuc3RhdHVzID09IDAgJiYgeGhyLnJlc3BvbnNlKSkge29ubG9hZCh4aHIucmVzcG9uc2UpO3JldHVybjt9b25lcnJvcigpO307eGhyLm9uZXJyb3IgPSBvbmVycm9yO3hoci5zZW5kKG51bGwpO307fX0gZWxzZSAge3Rocm93IG5ldyBFcnJvcigiZW52aXJvbm1lbnQgZGV0ZWN0aW9uIGVycm9yIik7fXZhciBvdXQgPSBNb2R1bGVbInByaW50Il0gfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTt2YXIgZXJyID0gTW9kdWxlWyJwcmludEVyciJdIHx8IGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKE1vZHVsZSwgbW9kdWxlT3ZlcnJpZGVzKTttb2R1bGVPdmVycmlkZXMgPSBudWxsO2NoZWNrSW5jb21pbmdNb2R1bGVBUEkoKTtpZiAoTW9kdWxlWyJhcmd1bWVudHMiXSkgYXJndW1lbnRzXyA9IE1vZHVsZVsiYXJndW1lbnRzIl07bGVnYWN5TW9kdWxlUHJvcCgiYXJndW1lbnRzIiwgImFyZ3VtZW50c18iKTtpZiAoTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdKSB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsidGhpc1Byb2dyYW0iXTtsZWdhY3lNb2R1bGVQcm9wKCJ0aGlzUHJvZ3JhbSIsICJ0aGlzUHJvZ3JhbSIpO2lmIChNb2R1bGVbInF1aXQiXSkgcXVpdF8gPSBNb2R1bGVbInF1aXQiXTtsZWdhY3lNb2R1bGVQcm9wKCJxdWl0IiwgInF1aXRfIik7YXNzZXJ0KHR5cGVvZiBNb2R1bGVbIm1lbW9yeUluaXRpYWxpemVyUHJlZml4VVJMIl0gPT0gInVuZGVmaW5lZCIsICJNb2R1bGUubWVtb3J5SW5pdGlhbGl6ZXJQcmVmaXhVUkwgb3B0aW9uIHdhcyByZW1vdmVkLCB1c2UgTW9kdWxlLmxvY2F0ZUZpbGUgaW5zdGVhZCIpO2Fzc2VydCh0eXBlb2YgTW9kdWxlWyJwdGhyZWFkTWFpblByZWZpeFVSTCJdID09ICJ1bmRlZmluZWQiLCAiTW9kdWxlLnB0aHJlYWRNYWluUHJlZml4VVJMIG9wdGlvbiB3YXMgcmVtb3ZlZCwgdXNlIE1vZHVsZS5sb2NhdGVGaWxlIGluc3RlYWQiKTthc3NlcnQodHlwZW9mIE1vZHVsZVsiY2RJbml0aWFsaXplclByZWZpeFVSTCJdID09ICJ1bmRlZmluZWQiLCAiTW9kdWxlLmNkSW5pdGlhbGl6ZXJQcmVmaXhVUkwgb3B0aW9uIHdhcyByZW1vdmVkLCB1c2UgTW9kdWxlLmxvY2F0ZUZpbGUgaW5zdGVhZCIpO2Fzc2VydCh0eXBlb2YgTW9kdWxlWyJmaWxlUGFja2FnZVByZWZpeFVSTCJdID09ICJ1bmRlZmluZWQiLCAiTW9kdWxlLmZpbGVQYWNrYWdlUHJlZml4VVJMIG9wdGlvbiB3YXMgcmVtb3ZlZCwgdXNlIE1vZHVsZS5sb2NhdGVGaWxlIGluc3RlYWQiKTthc3NlcnQodHlwZW9mIE1vZHVsZVsicmVhZCJdID09ICJ1bmRlZmluZWQiLCAiTW9kdWxlLnJlYWQgb3B0aW9uIHdhcyByZW1vdmVkIChtb2RpZnkgcmVhZF8gaW4gSlMpIik7YXNzZXJ0KHR5cGVvZiBNb2R1bGVbInJlYWRBc3luYyJdID09ICJ1bmRlZmluZWQiLCAiTW9kdWxlLnJlYWRBc3luYyBvcHRpb24gd2FzIHJlbW92ZWQgKG1vZGlmeSByZWFkQXN5bmMgaW4gSlMpIik7YXNzZXJ0KHR5cGVvZiBNb2R1bGVbInJlYWRCaW5hcnkiXSA9PSAidW5kZWZpbmVkIiwgIk1vZHVsZS5yZWFkQmluYXJ5IG9wdGlvbiB3YXMgcmVtb3ZlZCAobW9kaWZ5IHJlYWRCaW5hcnkgaW4gSlMpIik7YXNzZXJ0KHR5cGVvZiBNb2R1bGVbInNldFdpbmRvd1RpdGxlIl0gPT0gInVuZGVmaW5lZCIsICJNb2R1bGUuc2V0V2luZG93VGl0bGUgb3B0aW9uIHdhcyByZW1vdmVkIChtb2RpZnkgZW1zY3JpcHRlbl9zZXRfd2luZG93X3RpdGxlIGluIEpTKSIpO2Fzc2VydCh0eXBlb2YgTW9kdWxlWyJUT1RBTF9NRU1PUlkiXSA9PSAidW5kZWZpbmVkIiwgIk1vZHVsZS5UT1RBTF9NRU1PUlkgaGFzIGJlZW4gcmVuYW1lZCBNb2R1bGUuSU5JVElBTF9NRU1PUlkiKTtsZWdhY3lNb2R1bGVQcm9wKCJhc20iLCAid2FzbUV4cG9ydHMiKTtsZWdhY3lNb2R1bGVQcm9wKCJyZWFkIiwgInJlYWRfIik7bGVnYWN5TW9kdWxlUHJvcCgicmVhZEFzeW5jIiwgInJlYWRBc3luYyIpO2xlZ2FjeU1vZHVsZVByb3AoInJlYWRCaW5hcnkiLCAicmVhZEJpbmFyeSIpO2xlZ2FjeU1vZHVsZVByb3AoInNldFdpbmRvd1RpdGxlIiwgInNldFdpbmRvd1RpdGxlIik7dmFyIElEQkZTID0gIklEQkZTIGlzIG5vIGxvbmdlciBpbmNsdWRlZCBieSBkZWZhdWx0OyBidWlsZCB3aXRoIC1saWRiZnMuanMiO3ZhciBQUk9YWUZTID0gIlBST1hZRlMgaXMgbm8gbG9uZ2VyIGluY2x1ZGVkIGJ5IGRlZmF1bHQ7IGJ1aWxkIHdpdGggLWxwcm94eWZzLmpzIjt2YXIgV09SS0VSRlMgPSAiV09SS0VSRlMgaXMgbm8gbG9uZ2VyIGluY2x1ZGVkIGJ5IGRlZmF1bHQ7IGJ1aWxkIHdpdGggLWx3b3JrZXJmcy5qcyI7dmFyIEZFVENIRlMgPSAiRkVUQ0hGUyBpcyBubyBsb25nZXIgaW5jbHVkZWQgYnkgZGVmYXVsdDsgYnVpbGQgd2l0aCAtbGZldGNoZnMuanMiO3ZhciBJQ0FTRUZTID0gIklDQVNFRlMgaXMgbm8gbG9uZ2VyIGluY2x1ZGVkIGJ5IGRlZmF1bHQ7IGJ1aWxkIHdpdGggLWxpY2FzZWZzLmpzIjt2YXIgSlNGSUxFRlMgPSAiSlNGSUxFRlMgaXMgbm8gbG9uZ2VyIGluY2x1ZGVkIGJ5IGRlZmF1bHQ7IGJ1aWxkIHdpdGggLWxqc2ZpbGVmcy5qcyI7dmFyIE9QRlMgPSAiT1BGUyBpcyBubyBsb25nZXIgaW5jbHVkZWQgYnkgZGVmYXVsdDsgYnVpbGQgd2l0aCAtbG9wZnMuanMiO3ZhciBOT0RFRlMgPSAiTk9ERUZTIGlzIG5vIGxvbmdlciBpbmNsdWRlZCBieSBkZWZhdWx0OyBidWlsZCB3aXRoIC1sbm9kZWZzLmpzIjthc3NlcnQoIUVOVklST05NRU5UX0lTX1dPUktFUiwgIndvcmtlciBlbnZpcm9ubWVudCBkZXRlY3RlZCBidXQgbm90IGVuYWJsZWQgYXQgYnVpbGQgdGltZS4gIEFkZCAnd29ya2VyJyB0byBgLXNFTlZJUk9OTUVOVGAgdG8gZW5hYmxlLiIpO2Fzc2VydCghRU5WSVJPTk1FTlRfSVNfTk9ERSwgIm5vZGUgZW52aXJvbm1lbnQgZGV0ZWN0ZWQgYnV0IG5vdCBlbmFibGVkIGF0IGJ1aWxkIHRpbWUuICBBZGQgJ25vZGUnIHRvIGAtc0VOVklST05NRU5UYCB0byBlbmFibGUuIik7YXNzZXJ0KCFFTlZJUk9OTUVOVF9JU19TSEVMTCwgInNoZWxsIGVudmlyb25tZW50IGRldGVjdGVkIGJ1dCBub3QgZW5hYmxlZCBhdCBidWlsZCB0aW1lLiAgQWRkICdzaGVsbCcgdG8gYC1zRU5WSVJPTk1FTlRgIHRvIGVuYWJsZS4iKTt2YXIgd2FzbUJpbmFyeTtpZiAoTW9kdWxlWyJ3YXNtQmluYXJ5Il0pIHdhc21CaW5hcnkgPSBNb2R1bGVbIndhc21CaW5hcnkiXTtsZWdhY3lNb2R1bGVQcm9wKCJ3YXNtQmluYXJ5IiwgIndhc21CaW5hcnkiKTt2YXIgbm9FeGl0UnVudGltZSA9IE1vZHVsZVsibm9FeGl0UnVudGltZSJdIHx8IHRydWU7bGVnYWN5TW9kdWxlUHJvcCgibm9FeGl0UnVudGltZSIsICJub0V4aXRSdW50aW1lIik7aWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPSAib2JqZWN0Iikge2Fib3J0KCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7fXZhciB3YXNtTWVtb3J5O3ZhciBBQk9SVCA9IGZhbHNlO3ZhciBFWElUU1RBVFVTOy8qKiBAdHlwZSB7ZnVuY3Rpb24oKiwgc3RyaW5nPSl9ICovIGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIHRleHQpIHtpZiAoIWNvbmRpdGlvbikge2Fib3J0KCJBc3NlcnRpb24gZmFpbGVkIiArICh0ZXh0ID8gIjogIiArIHRleHQgOiAiIikpO319dmFyIEhFQVAsIC8qKiBAdHlwZSB7IUludDhBcnJheX0gKi8gSEVBUDgsIC8qKiBAdHlwZSB7IVVpbnQ4QXJyYXl9ICovIEhFQVBVOCwgLyoqIEB0eXBlIHshSW50MTZBcnJheX0gKi8gSEVBUDE2LCAvKiogQHR5cGUgeyFVaW50MTZBcnJheX0gKi8gSEVBUFUxNiwgLyoqIEB0eXBlIHshSW50MzJBcnJheX0gKi8gSEVBUDMyLCAvKiogQHR5cGUgeyFVaW50MzJBcnJheX0gKi8gSEVBUFUzMiwgLyoqIEB0eXBlIHshRmxvYXQzMkFycmF5fSAqLyBIRUFQRjMyLCAvKiogQHR5cGUgeyFGbG9hdDY0QXJyYXl9ICovIEhFQVBGNjQ7ZnVuY3Rpb24gdXBkYXRlTWVtb3J5Vmlld3MoKSB7dmFyIGIgPSB3YXNtTWVtb3J5LmJ1ZmZlcjtNb2R1bGVbIkhFQVA4Il0gPSBIRUFQOCA9IG5ldyBJbnQ4QXJyYXkoYik7TW9kdWxlWyJIRUFQMTYiXSA9IEhFQVAxNiA9IG5ldyBJbnQxNkFycmF5KGIpO01vZHVsZVsiSEVBUFU4Il0gPSBIRUFQVTggPSBuZXcgVWludDhBcnJheShiKTtNb2R1bGVbIkhFQVBVMTYiXSA9IEhFQVBVMTYgPSBuZXcgVWludDE2QXJyYXkoYik7TW9kdWxlWyJIRUFQMzIiXSA9IEhFQVAzMiA9IG5ldyBJbnQzMkFycmF5KGIpO01vZHVsZVsiSEVBUFUzMiJdID0gSEVBUFUzMiA9IG5ldyBVaW50MzJBcnJheShiKTtNb2R1bGVbIkhFQVBGMzIiXSA9IEhFQVBGMzIgPSBuZXcgRmxvYXQzMkFycmF5KGIpO01vZHVsZVsiSEVBUEY2NCJdID0gSEVBUEY2NCA9IG5ldyBGbG9hdDY0QXJyYXkoYik7fWFzc2VydCghTW9kdWxlWyJTVEFDS19TSVpFIl0sICJTVEFDS19TSVpFIGNhbiBubyBsb25nZXIgYmUgc2V0IGF0IHJ1bnRpbWUuICBVc2UgLXNTVEFDS19TSVpFIGF0IGxpbmsgdGltZSIpO2Fzc2VydCh0eXBlb2YgSW50MzJBcnJheSAhPSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgRmxvYXQ2NEFycmF5ICE9PSAidW5kZWZpbmVkIiAmJiBJbnQzMkFycmF5LnByb3RvdHlwZS5zdWJhcnJheSAhPSB1bmRlZmluZWQgJiYgSW50MzJBcnJheS5wcm90b3R5cGUuc2V0ICE9IHVuZGVmaW5lZCwgIkpTIGVuZ2luZSBkb2VzIG5vdCBwcm92aWRlIGZ1bGwgdHlwZWQgYXJyYXkgc3VwcG9ydCIpO2Fzc2VydCghTW9kdWxlWyJ3YXNtTWVtb3J5Il0sICJVc2Ugb2YgYHdhc21NZW1vcnlgIGRldGVjdGVkLiAgVXNlIC1zSU1QT1JURURfTUVNT1JZIHRvIGRlZmluZSB3YXNtTWVtb3J5IGV4dGVybmFsbHkiKTthc3NlcnQoIU1vZHVsZVsiSU5JVElBTF9NRU1PUlkiXSwgIkRldGVjdGVkIHJ1bnRpbWUgSU5JVElBTF9NRU1PUlkgc2V0dGluZy4gIFVzZSAtc0lNUE9SVEVEX01FTU9SWSB0byBkZWZpbmUgd2FzbU1lbW9yeSBkeW5hbWljYWxseSIpO2Z1bmN0aW9uIHdyaXRlU3RhY2tDb29raWUoKSB7dmFyIG1heCA9IF9lbXNjcmlwdGVuX3N0YWNrX2dldF9lbmQoKTthc3NlcnQoKG1heCAmIDMpID09IDApO2lmIChtYXggPT0gMCkge21heCArPSA0O31IRUFQVTMyWygobWF4KSA+Pj4gMikgPj4+IDBdID0gMzQ4MjEyMjM7SEVBUFUzMlsoKChtYXgpICsgKDQpKSA+Pj4gMikgPj4+IDBdID0gMjMxMDcyMTAyMjtIRUFQVTMyWygoMCkgPj4+IDIpID4+PiAwXSA9IDE2Njg1MDkwMjk7fWZ1bmN0aW9uIGNoZWNrU3RhY2tDb29raWUoKSB7aWYgKEFCT1JUKSByZXR1cm47dmFyIG1heCA9IF9lbXNjcmlwdGVuX3N0YWNrX2dldF9lbmQoKTtpZiAobWF4ID09IDApIHttYXggKz0gNDt9dmFyIGNvb2tpZTEgPSBIRUFQVTMyWygobWF4KSA+Pj4gMikgPj4+IDBdO3ZhciBjb29raWUyID0gSEVBUFUzMlsoKChtYXgpICsgKDQpKSA+Pj4gMikgPj4+IDBdO2lmIChjb29raWUxICE9IDM0ODIxMjIzIHx8IGNvb2tpZTIgIT0gMjMxMDcyMTAyMikge2Fib3J0KGBTdGFjayBvdmVyZmxvdyEgU3RhY2sgY29va2llIGhhcyBiZWVuIG92ZXJ3cml0dGVuIGF0ICR7cHRyVG9TdHJpbmcobWF4KX0sIGV4cGVjdGVkIGhleCBkd29yZHMgMHg4OUJBQ0RGRSBhbmQgMHgyMTM1NDY3LCBidXQgcmVjZWl2ZWQgJHtwdHJUb1N0cmluZyhjb29raWUyKX0gJHtwdHJUb1N0cmluZyhjb29raWUxKX1gKTt9aWYgKEhFQVBVMzJbKCgwKSA+Pj4gMikgPj4+IDBdICE9IDE2Njg1MDkwMjkpIC8qICdlbXNjJyAqLyB7YWJvcnQoIlJ1bnRpbWUgZXJyb3I6IFRoZSBhcHBsaWNhdGlvbiBoYXMgY29ycnVwdGVkIGl0cyBoZWFwIG1lbW9yeSBhcmVhIChhZGRyZXNzIHplcm8pISIpO319KGZ1bmN0aW9uKCkge3ZhciBoMTYgPSBuZXcgSW50MTZBcnJheSgxKTt2YXIgaDggPSBuZXcgSW50OEFycmF5KGgxNi5idWZmZXIpO2gxNlswXSA9IDI1NDU5O2lmIChoOFswXSAhPT0gMTE1IHx8IGg4WzFdICE9PSA5OSkgdGhyb3cgIlJ1bnRpbWUgZXJyb3I6IGV4cGVjdGVkIHRoZSBzeXN0ZW0gdG8gYmUgbGl0dGxlLWVuZGlhbiEgKFJ1biB3aXRoIC1zU1VQUE9SVF9CSUdfRU5ESUFOIHRvIGJ5cGFzcykiO30pKCk7dmFyIF9fQVRQUkVSVU5fXyA9IFtdO3ZhciBfX0FUSU5JVF9fID0gW107dmFyIF9fQVRFWElUX18gPSBbXTt2YXIgX19BVFBPU1RSVU5fXyA9IFtdO3ZhciBydW50aW1lSW5pdGlhbGl6ZWQgPSBmYWxzZTt2YXIgcnVudGltZUtlZXBhbGl2ZUNvdW50ZXIgPSAwO2Z1bmN0aW9uIGtlZXBSdW50aW1lQWxpdmUoKSB7cmV0dXJuIG5vRXhpdFJ1bnRpbWUgfHwgcnVudGltZUtlZXBhbGl2ZUNvdW50ZXIgPiAwO31mdW5jdGlvbiBwcmVSdW4oKSB7aWYgKE1vZHVsZVsicHJlUnVuIl0pIHtpZiAodHlwZW9mIE1vZHVsZVsicHJlUnVuIl0gPT0gImZ1bmN0aW9uIikgTW9kdWxlWyJwcmVSdW4iXSA9IFsgTW9kdWxlWyJwcmVSdW4iXSBdO3doaWxlIChNb2R1bGVbInByZVJ1biJdLmxlbmd0aCkge2FkZE9uUHJlUnVuKE1vZHVsZVsicHJlUnVuIl0uc2hpZnQoKSk7fX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pO31mdW5jdGlvbiBpbml0UnVudGltZSgpIHthc3NlcnQoIXJ1bnRpbWVJbml0aWFsaXplZCk7cnVudGltZUluaXRpYWxpemVkID0gdHJ1ZTtjaGVja1N0YWNrQ29va2llKCk7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyk7fWZ1bmN0aW9uIHBvc3RSdW4oKSB7Y2hlY2tTdGFja0Nvb2tpZSgpO2lmIChNb2R1bGVbInBvc3RSdW4iXSkge2lmICh0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl0gPT0gImZ1bmN0aW9uIikgTW9kdWxlWyJwb3N0UnVuIl0gPSBbIE1vZHVsZVsicG9zdFJ1biJdIF07d2hpbGUgKE1vZHVsZVsicG9zdFJ1biJdLmxlbmd0aCkge2FkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTt9fWNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pO31mdW5jdGlvbiBhZGRPblByZVJ1bihjYikge19fQVRQUkVSVU5fXy51bnNoaWZ0KGNiKTt9ZnVuY3Rpb24gYWRkT25Jbml0KGNiKSB7X19BVElOSVRfXy51bnNoaWZ0KGNiKTt9ZnVuY3Rpb24gYWRkT25FeGl0KGNiKSB7fWZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikge19fQVRQT1NUUlVOX18udW5zaGlmdChjYik7fWFzc2VydChNYXRoLmltdWwsICJUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBNYXRoLmltdWwoKSwgYnVpbGQgd2l0aCBMRUdBQ1lfVk1fU1VQUE9SVCBvciBQT0xZRklMTF9PTERfTUFUSF9GVU5DVElPTlMgdG8gYWRkIGluIGEgcG9seWZpbGwiKTthc3NlcnQoTWF0aC5mcm91bmQsICJUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBNYXRoLmZyb3VuZCgpLCBidWlsZCB3aXRoIExFR0FDWV9WTV9TVVBQT1JUIG9yIFBPTFlGSUxMX09MRF9NQVRIX0ZVTkNUSU9OUyB0byBhZGQgaW4gYSBwb2x5ZmlsbCIpO2Fzc2VydChNYXRoLmNsejMyLCAiVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgTWF0aC5jbHozMigpLCBidWlsZCB3aXRoIExFR0FDWV9WTV9TVVBQT1JUIG9yIFBPTFlGSUxMX09MRF9NQVRIX0ZVTkNUSU9OUyB0byBhZGQgaW4gYSBwb2x5ZmlsbCIpO2Fzc2VydChNYXRoLnRydW5jLCAiVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgTWF0aC50cnVuYygpLCBidWlsZCB3aXRoIExFR0FDWV9WTV9TVVBQT1JUIG9yIFBPTFlGSUxMX09MRF9NQVRIX0ZVTkNUSU9OUyB0byBhZGQgaW4gYSBwb2x5ZmlsbCIpO3ZhciBydW5EZXBlbmRlbmNpZXMgPSAwO3ZhciBydW5EZXBlbmRlbmN5V2F0Y2hlciA9IG51bGw7dmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7dmFyIHJ1bkRlcGVuZGVuY3lUcmFja2luZyA9IHt9O2Z1bmN0aW9uIGdldFVuaXF1ZVJ1bkRlcGVuZGVuY3koaWQpIHt2YXIgb3JpZyA9IGlkO3doaWxlICgxKSB7aWYgKCFydW5EZXBlbmRlbmN5VHJhY2tpbmdbaWRdKSByZXR1cm4gaWQ7aWQgPSBvcmlnICsgTWF0aC5yYW5kb20oKTt9fWZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHtydW5EZXBlbmRlbmNpZXMrKztpZiAoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pIHtNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpO31pZiAoaWQpIHthc3NlcnQoIXJ1bkRlcGVuZGVuY3lUcmFja2luZ1tpZF0pO3J1bkRlcGVuZGVuY3lUcmFja2luZ1tpZF0gPSAxO2lmIChydW5EZXBlbmRlbmN5V2F0Y2hlciA9PT0gbnVsbCAmJiB0eXBlb2Ygc2V0SW50ZXJ2YWwgIT0gInVuZGVmaW5lZCIpIHtydW5EZXBlbmRlbmN5V2F0Y2hlciA9IHNldEludGVydmFsKCgpID0+IHtpZiAoQUJPUlQpIHtjbGVhckludGVydmFsKHJ1bkRlcGVuZGVuY3lXYXRjaGVyKTtydW5EZXBlbmRlbmN5V2F0Y2hlciA9IG51bGw7cmV0dXJuO312YXIgc2hvd24gPSBmYWxzZTtmb3IgKHZhciBkZXAgaW4gcnVuRGVwZW5kZW5jeVRyYWNraW5nKSB7aWYgKCFzaG93bikge3Nob3duID0gdHJ1ZTtlcnIoInN0aWxsIHdhaXRpbmcgb24gcnVuIGRlcGVuZGVuY2llczoiKTt9ZXJyKGBkZXBlbmRlbmN5OiAke2RlcH1gKTt9aWYgKHNob3duKSB7ZXJyKCIoZW5kIG9mIGxpc3QpIik7fX0sIDFlNCk7fX0gZWxzZSB7ZXJyKCJ3YXJuaW5nOiBydW4gZGVwZW5kZW5jeSBhZGRlZCB3aXRob3V0IElEIik7fX1mdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7cnVuRGVwZW5kZW5jaWVzLS07aWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7TW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTt9aWYgKGlkKSB7YXNzZXJ0KHJ1bkRlcGVuZGVuY3lUcmFja2luZ1tpZF0pO2RlbGV0ZSBydW5EZXBlbmRlbmN5VHJhY2tpbmdbaWRdO30gZWxzZSB7ZXJyKCJ3YXJuaW5nOiBydW4gZGVwZW5kZW5jeSByZW1vdmVkIHdpdGhvdXQgSUQiKTt9aWYgKHJ1bkRlcGVuZGVuY2llcyA9PSAwKSB7aWYgKHJ1bkRlcGVuZGVuY3lXYXRjaGVyICE9PSBudWxsKSB7Y2xlYXJJbnRlcnZhbChydW5EZXBlbmRlbmN5V2F0Y2hlcik7cnVuRGVwZW5kZW5jeVdhdGNoZXIgPSBudWxsO31pZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7dmFyIGNhbGxiYWNrID0gZGVwZW5kZW5jaWVzRnVsZmlsbGVkO2RlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7Y2FsbGJhY2soKTt9fX0vKiogQHBhcmFtIHtzdHJpbmd8bnVtYmVyPX0gd2hhdCAqLyBmdW5jdGlvbiBhYm9ydCh3aGF0KSB7aWYgKE1vZHVsZVsib25BYm9ydCJdKSB7TW9kdWxlWyJvbkFib3J0Il0od2hhdCk7fXdoYXQgPSAiQWJvcnRlZCgiICsgd2hhdCArICIpIjtlcnIod2hhdCk7QUJPUlQgPSB0cnVlO0VYSVRTVEFUVVMgPSAxOy8qKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9ICovIHZhciBlID0gbmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcih3aGF0KTtyZWFkeVByb21pc2VSZWplY3QoZSk7dGhyb3cgZTt9dmFyIEZTID0ge2Vycm9yKCkge2Fib3J0KCJGaWxlc3lzdGVtIHN1cHBvcnQgKEZTKSB3YXMgbm90IGluY2x1ZGVkLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHlvdSBhcmUgdXNpbmcgZmlsZXMgZnJvbSBKUywgYnV0IGZpbGVzIHdlcmUgbm90IHVzZWQgZnJvbSBDL0MrKywgc28gZmlsZXN5c3RlbSBzdXBwb3J0IHdhcyBub3QgYXV0by1pbmNsdWRlZC4gWW91IGNhbiBmb3JjZS1pbmNsdWRlIGZpbGVzeXN0ZW0gc3VwcG9ydCB3aXRoIC1zRk9SQ0VfRklMRVNZU1RFTSIpO30saW5pdCgpIHtGUy5lcnJvcigpO30sY3JlYXRlRGF0YUZpbGUoKSB7RlMuZXJyb3IoKTt9LGNyZWF0ZVByZWxvYWRlZEZpbGUoKSB7RlMuZXJyb3IoKTt9LGNyZWF0ZUxhenlGaWxlKCkge0ZTLmVycm9yKCk7fSxvcGVuKCkge0ZTLmVycm9yKCk7fSxta2RldigpIHtGUy5lcnJvcigpO30scmVnaXN0ZXJEZXZpY2UoKSB7RlMuZXJyb3IoKTt9LGFuYWx5emVQYXRoKCkge0ZTLmVycm9yKCk7fSxFcnJub0Vycm9yKCkge0ZTLmVycm9yKCk7fX07TW9kdWxlWyJGU19jcmVhdGVEYXRhRmlsZSJdID0gRlMuY3JlYXRlRGF0YUZpbGU7TW9kdWxlWyJGU19jcmVhdGVQcmVsb2FkZWRGaWxlIl0gPSBGUy5jcmVhdGVQcmVsb2FkZWRGaWxlO3ZhciBkYXRhVVJJUHJlZml4ID0gImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiO2Z1bmN0aW9uIGlzRGF0YVVSSShmaWxlbmFtZSkge3JldHVybiBmaWxlbmFtZS5zdGFydHNXaXRoKGRhdGFVUklQcmVmaXgpO31mdW5jdGlvbiBpc0ZpbGVVUkkoZmlsZW5hbWUpIHtyZXR1cm4gZmlsZW5hbWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpO31mdW5jdGlvbiBjcmVhdGVFeHBvcnRXcmFwcGVyKG5hbWUpIHtyZXR1cm4gZnVuY3Rpb24oKSB7YXNzZXJ0KHJ1bnRpbWVJbml0aWFsaXplZCwgYG5hdGl2ZSBmdW5jdGlvbiBcYCR7bmFtZX1cYCBjYWxsZWQgYmVmb3JlIHJ1bnRpbWUgaW5pdGlhbGl6YXRpb25gKTt2YXIgZiA9IHdhc21FeHBvcnRzW25hbWVdO2Fzc2VydChmLCBgZXhwb3J0ZWQgbmF0aXZlIGZ1bmN0aW9uIFxgJHtuYW1lfVxgIG5vdCBmb3VuZGApO3JldHVybiBmLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7fTt9dmFyIHdhc21CaW5hcnlGaWxlO3dhc21CaW5hcnlGaWxlID0gImxpYi53YXNtIjtpZiAoIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkpIHt3YXNtQmluYXJ5RmlsZSA9IGxvY2F0ZUZpbGUod2FzbUJpbmFyeUZpbGUpO31mdW5jdGlvbiBnZXRCaW5hcnlTeW5jKGZpbGUpIHtpZiAoZmlsZSA9PSB3YXNtQmluYXJ5RmlsZSAmJiB3YXNtQmluYXJ5KSB7cmV0dXJuIG5ldyBVaW50OEFycmF5KHdhc21CaW5hcnkpO31pZiAocmVhZEJpbmFyeSkge3JldHVybiByZWFkQmluYXJ5KGZpbGUpO310aHJvdyAiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQiO31mdW5jdGlvbiBnZXRCaW5hcnlQcm9taXNlKGJpbmFyeUZpbGUpIHtpZiAoIXdhc21CaW5hcnkgJiYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpKSB7aWYgKHR5cGVvZiBmZXRjaCA9PSAiZnVuY3Rpb24iKSB7cmV0dXJuIGZldGNoKGJpbmFyeUZpbGUsIHtjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIn0pLnRoZW4ocmVzcG9uc2UgPT4ge2lmICghcmVzcG9uc2VbIm9rIl0pIHt0aHJvdyAiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIiArIGJpbmFyeUZpbGUgKyAiJyI7fXJldHVybiByZXNwb25zZVsiYXJyYXlCdWZmZXIiXSgpO30pLmNhdGNoKCgpID0+IGdldEJpbmFyeVN5bmMoYmluYXJ5RmlsZSkpO319cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gZ2V0QmluYXJ5U3luYyhiaW5hcnlGaWxlKSk7fWZ1bmN0aW9uIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIoYmluYXJ5RmlsZSwgaW1wb3J0cywgcmVjZWl2ZXIpIHtyZXR1cm4gZ2V0QmluYXJ5UHJvbWlzZShiaW5hcnlGaWxlKS50aGVuKGJpbmFyeSA9PiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShiaW5hcnksIGltcG9ydHMpKS50aGVuKGluc3RhbmNlID0+IGluc3RhbmNlKS50aGVuKHJlY2VpdmVyLCByZWFzb24gPT4ge2VycihgZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogJHtyZWFzb259YCk7aWYgKGlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkpIHtlcnIoYHdhcm5pbmc6IExvYWRpbmcgZnJvbSBhIGZpbGUgVVJJICgke3dhc21CaW5hcnlGaWxlfSkgaXMgbm90IHN1cHBvcnRlZCBpbiBtb3N0IGJyb3dzZXJzLiBTZWUgaHR0cHM6Ly9lbXNjcmlwdGVuLm9yZy9kb2NzL2dldHRpbmdfc3RhcnRlZC9GQVEuaHRtbCNob3ctZG8taS1ydW4tYS1sb2NhbC13ZWJzZXJ2ZXItZm9yLXRlc3Rpbmctd2h5LWRvZXMtbXktcHJvZ3JhbS1zdGFsbC1pbi1kb3dubG9hZGluZy1vci1wcmVwYXJpbmdgKTt9YWJvcnQocmVhc29uKTt9KTt9ZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYyhiaW5hcnksIGJpbmFyeUZpbGUsIGltcG9ydHMsIGNhbGxiYWNrKSB7aWYgKCFiaW5hcnkgJiYgdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09ICJmdW5jdGlvbiIgJiYgIWlzRGF0YVVSSShiaW5hcnlGaWxlKSAmJiB0eXBlb2YgZmV0Y2ggPT0gImZ1bmN0aW9uIikge3JldHVybiBmZXRjaChiaW5hcnlGaWxlLCB7Y3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiJ9KS50aGVuKHJlc3BvbnNlID0+IHsvKiogQHN1cHByZXNzIHtjaGVja1R5cGVzfSAqLyB2YXIgcmVzdWx0ID0gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocmVzcG9uc2UsIGltcG9ydHMpO3JldHVybiByZXN1bHQudGhlbihjYWxsYmFjaywgZnVuY3Rpb24ocmVhc29uKSB7ZXJyKGB3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogJHtyZWFzb259YCk7ZXJyKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpO3JldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKGJpbmFyeUZpbGUsIGltcG9ydHMsIGNhbGxiYWNrKTt9KTt9KTt9cmV0dXJuIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIoYmluYXJ5RmlsZSwgaW1wb3J0cywgY2FsbGJhY2spO31mdW5jdGlvbiBjcmVhdGVXYXNtKCkge3ZhciBpbmZvID0geyJlbnYiOiB3YXNtSW1wb3J0cywid2FzaV9zbmFwc2hvdF9wcmV2aWV3MSI6IHdhc21JbXBvcnRzfTsvKiogQHBhcmFtIHtXZWJBc3NlbWJseS5Nb2R1bGU9fSBtb2R1bGUqLyBmdW5jdGlvbiByZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UsIG1vZHVsZSkge3dhc21FeHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0czt3YXNtRXhwb3J0cyA9IGFwcGx5U2lnbmF0dXJlQ29udmVyc2lvbnMod2FzbUV4cG9ydHMpO3dhc21NZW1vcnkgPSB3YXNtRXhwb3J0c1sibWVtb3J5Il07YXNzZXJ0KHdhc21NZW1vcnksICJtZW1vcnkgbm90IGZvdW5kIGluIHdhc20gZXhwb3J0cyIpO3VwZGF0ZU1lbW9yeVZpZXdzKCk7d2FzbVRhYmxlID0gd2FzbUV4cG9ydHNbIl9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUiXTthc3NlcnQod2FzbVRhYmxlLCAidGFibGUgbm90IGZvdW5kIGluIHdhc20gZXhwb3J0cyIpO2FkZE9uSW5pdCh3YXNtRXhwb3J0c1siX193YXNtX2NhbGxfY3RvcnMiXSk7cmVtb3ZlUnVuRGVwZW5kZW5jeSgid2FzbS1pbnN0YW50aWF0ZSIpO3JldHVybiB3YXNtRXhwb3J0czt9YWRkUnVuRGVwZW5kZW5jeSgid2FzbS1pbnN0YW50aWF0ZSIpO3ZhciB0cnVlTW9kdWxlID0gTW9kdWxlO2Z1bmN0aW9uIHJlY2VpdmVJbnN0YW50aWF0aW9uUmVzdWx0KHJlc3VsdCkge2Fzc2VydChNb2R1bGUgPT09IHRydWVNb2R1bGUsICJ0aGUgTW9kdWxlIG9iamVjdCBzaG91bGQgbm90IGJlIHJlcGxhY2VkIGR1cmluZyBhc3luYyBjb21waWxhdGlvbiAtIHBlcmhhcHMgdGhlIG9yZGVyIG9mIEhUTUwgZWxlbWVudHMgaXMgd3Jvbmc/Iik7dHJ1ZU1vZHVsZSA9IG51bGw7cmVjZWl2ZUluc3RhbmNlKHJlc3VsdFsiaW5zdGFuY2UiXSk7fWlmIChNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKSB7dHJ5IHtyZXR1cm4gTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXShpbmZvLCByZWNlaXZlSW5zdGFuY2UpO30gY2F0Y2ggKGUpIHtlcnIoYE1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICR7ZX1gKTtyZWFkeVByb21pc2VSZWplY3QoZSk7fX1pbnN0YW50aWF0ZUFzeW5jKHdhc21CaW5hcnksIHdhc21CaW5hcnlGaWxlLCBpbmZvLCByZWNlaXZlSW5zdGFudGlhdGlvblJlc3VsdCkuY2F0Y2gocmVhZHlQcm9taXNlUmVqZWN0KTtyZXR1cm4ge307fXZhciB0ZW1wRG91YmxlO3ZhciB0ZW1wSTY0O2Z1bmN0aW9uIGxlZ2FjeU1vZHVsZVByb3AocHJvcCwgbmV3TmFtZSwgaW5jb21taW5nID0gdHJ1ZSkge2lmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihNb2R1bGUsIHByb3ApKSB7T2JqZWN0LmRlZmluZVByb3BlcnR5KE1vZHVsZSwgcHJvcCwge2NvbmZpZ3VyYWJsZTogdHJ1ZSxnZXQoKSB7bGV0IGV4dHJhID0gaW5jb21taW5nID8gIiAodGhlIGluaXRpYWwgdmFsdWUgY2FuIGJlIHByb3ZpZGVkIG9uIE1vZHVsZSwgYnV0IGFmdGVyIHN0YXJ0dXAgdGhlIHZhbHVlIGlzIG9ubHkgbG9va2VkIGZvciBvbiBhIGxvY2FsIHZhcmlhYmxlIG9mIHRoYXQgbmFtZSkiIDogIiI7YWJvcnQoYFxgTW9kdWxlLiR7cHJvcH1cYCBoYXMgYmVlbiByZXBsYWNlZCBieSBcYCR7bmV3TmFtZX1cYGAgKyBleHRyYSk7fX0pO319ZnVuY3Rpb24gaWdub3JlZE1vZHVsZVByb3AocHJvcCkge2lmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1vZHVsZSwgcHJvcCkpIHthYm9ydChgXGBNb2R1bGUuJHtwcm9wfVxgIHdhcyBzdXBwbGllZCBidXQgXGAke3Byb3B9XGAgbm90IGluY2x1ZGVkIGluIElOQ09NSU5HX01PRFVMRV9KU19BUElgKTt9fWZ1bmN0aW9uIGlzRXhwb3J0ZWRCeUZvcmNlRmlsZXN5c3RlbShuYW1lKSB7cmV0dXJuIG5hbWUgPT09ICJGU19jcmVhdGVQYXRoIiB8fCBuYW1lID09PSAiRlNfY3JlYXRlRGF0YUZpbGUiIHx8IG5hbWUgPT09ICJGU19jcmVhdGVQcmVsb2FkZWRGaWxlIiB8fCBuYW1lID09PSAiRlNfdW5saW5rIiB8fCBuYW1lID09PSAiYWRkUnVuRGVwZW5kZW5jeSIgfHwgIG5hbWUgPT09ICJGU19jcmVhdGVMYXp5RmlsZSIgfHwgbmFtZSA9PT0gIkZTX2NyZWF0ZURldmljZSIgfHwgbmFtZSA9PT0gInJlbW92ZVJ1bkRlcGVuZGVuY3kiO31mdW5jdGlvbiBtaXNzaW5nR2xvYmFsKHN5bSwgbXNnKSB7aWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAidW5kZWZpbmVkIikge09iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLCBzeW0sIHtjb25maWd1cmFibGU6IHRydWUsZ2V0KCkge3dhcm5PbmNlKCJgIiArIHN5bSArICJgIGlzIG5vdCBsb25nZXIgZGVmaW5lZCBieSBlbXNjcmlwdGVuLiAiICsgbXNnKTtyZXR1cm4gdW5kZWZpbmVkO319KTt9fW1pc3NpbmdHbG9iYWwoImJ1ZmZlciIsICJQbGVhc2UgdXNlIEhFQVA4LmJ1ZmZlciBvciB3YXNtTWVtb3J5LmJ1ZmZlciIpO21pc3NpbmdHbG9iYWwoImFzbSIsICJQbGVhc2UgdXNlIHdhc21FeHBvcnRzIGluc3RlYWQiKTtmdW5jdGlvbiBtaXNzaW5nTGlicmFyeVN5bWJvbChzeW0pIHtpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICJ1bmRlZmluZWQiICYmICFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbFRoaXMsIHN5bSkpIHtPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcywgc3ltLCB7Y29uZmlndXJhYmxlOiB0cnVlLGdldCgpIHt2YXIgbXNnID0gImAiICsgc3ltICsgImAgaXMgYSBsaWJyYXJ5IHN5bWJvbCBhbmQgbm90IGluY2x1ZGVkIGJ5IGRlZmF1bHQ7IGFkZCBpdCB0byB5b3VyIGxpYnJhcnkuanMgX19kZXBzIG9yIHRvIERFRkFVTFRfTElCUkFSWV9GVU5DU19UT19JTkNMVURFIG9uIHRoZSBjb21tYW5kIGxpbmUiO3ZhciBsaWJyYXJ5U3ltYm9sID0gc3ltO2lmICghbGlicmFyeVN5bWJvbC5zdGFydHNXaXRoKCJfIikpIHtsaWJyYXJ5U3ltYm9sID0gIiQiICsgc3ltO31tc2cgKz0gIiAoZS5nLiAtc0RFRkFVTFRfTElCUkFSWV9GVU5DU19UT19JTkNMVURFPSciICsgbGlicmFyeVN5bWJvbCArICInKSI7aWYgKGlzRXhwb3J0ZWRCeUZvcmNlRmlsZXN5c3RlbShzeW0pKSB7bXNnICs9ICIuIEFsdGVybmF0aXZlbHksIGZvcmNpbmcgZmlsZXN5c3RlbSBzdXBwb3J0ICgtc0ZPUkNFX0ZJTEVTWVNURU0pIGNhbiBleHBvcnQgdGhpcyBmb3IgeW91Ijt9d2Fybk9uY2UobXNnKTtyZXR1cm4gdW5kZWZpbmVkO319KTt9dW5leHBvcnRlZFJ1bnRpbWVTeW1ib2woc3ltKTt9ZnVuY3Rpb24gdW5leHBvcnRlZFJ1bnRpbWVTeW1ib2woc3ltKSB7aWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1vZHVsZSwgc3ltKSkge09iamVjdC5kZWZpbmVQcm9wZXJ0eShNb2R1bGUsIHN5bSwge2NvbmZpZ3VyYWJsZTogdHJ1ZSxnZXQoKSB7dmFyIG1zZyA9ICInIiArIHN5bSArICInIHdhcyBub3QgZXhwb3J0ZWQuIGFkZCBpdCB0byBFWFBPUlRFRF9SVU5USU1FX01FVEhPRFMgKHNlZSB0aGUgRW1zY3JpcHRlbiBGQVEpIjtpZiAoaXNFeHBvcnRlZEJ5Rm9yY2VGaWxlc3lzdGVtKHN5bSkpIHttc2cgKz0gIi4gQWx0ZXJuYXRpdmVseSwgZm9yY2luZyBmaWxlc3lzdGVtIHN1cHBvcnQgKC1zRk9SQ0VfRklMRVNZU1RFTSkgY2FuIGV4cG9ydCB0aGlzIGZvciB5b3UiO31hYm9ydChtc2cpO319KTt9fWZ1bmN0aW9uIGRiZyh0ZXh0KSB7Y29uc29sZS53YXJuLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cyk7fWZ1bmN0aW9uIE9TRF9NZW1JbmZvX2dldE1vZHVsZUhlYXBMZW5ndGgoKSB7cmV0dXJuIE1vZHVsZS5IRUFQOC5sZW5ndGg7fS8qKiBAY29uc3RydWN0b3IgKi8gZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpIHt0aGlzLm5hbWUgPSAiRXhpdFN0YXR1cyI7dGhpcy5tZXNzYWdlID0gYFByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoJHtzdGF0dXN9KWA7dGhpcy5zdGF0dXMgPSBzdGF0dXM7fXZhciBjYWxsUnVudGltZUNhbGxiYWNrcyA9IGNhbGxiYWNrcyA9PiB7d2hpbGUgKGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7Y2FsbGJhY2tzLnNoaWZ0KCkoTW9kdWxlKTt9fTsvKioqIEBwYXJhbSB7bnVtYmVyfSBwdHIqIEBwYXJhbSB7c3RyaW5nfSB0eXBlKi8gZnVuY3Rpb24gZ2V0VmFsdWUocHRyLCB0eXBlID0gImk4Iikge2lmICh0eXBlLmVuZHNXaXRoKCIqIikpIHR5cGUgPSAiKiI7c3dpdGNoICh0eXBlKSB7Y2FzZSAiaTEiOnJldHVybiBIRUFQOFsoKHB0cikgPj4+IDApID4+PiAwXTtjYXNlICJpOCI6cmV0dXJuIEhFQVA4WygocHRyKSA+Pj4gMCkgPj4+IDBdO2Nhc2UgImkxNiI6cmV0dXJuIEhFQVAxNlsoKHB0cikgPj4+IDEpID4+PiAwXTtjYXNlICJpMzIiOnJldHVybiBIRUFQMzJbKChwdHIpID4+PiAyKSA+Pj4gMF07Y2FzZSAiaTY0IjphYm9ydCgidG8gZG8gZ2V0VmFsdWUoaTY0KSB1c2UgV0FTTV9CSUdJTlQiKTtjYXNlICJmbG9hdCI6cmV0dXJuIEhFQVBGMzJbKChwdHIpID4+PiAyKSA+Pj4gMF07Y2FzZSAiZG91YmxlIjpyZXR1cm4gSEVBUEY2NFsoKHB0cikgPj4+IDMpID4+PiAwXTtjYXNlICIqIjpyZXR1cm4gSEVBUFUzMlsoKHB0cikgPj4+IDIpID4+PiAwXTtkZWZhdWx0OmFib3J0KGBpbnZhbGlkIHR5cGUgZm9yIGdldFZhbHVlOiAke3R5cGV9YCk7fX12YXIgcHRyVG9TdHJpbmcgPSBwdHIgPT4ge2Fzc2VydCh0eXBlb2YgcHRyID09PSAibnVtYmVyIik7cmV0dXJuICIweCIgKyBwdHIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsICIwIik7fTsvKioqIEBwYXJhbSB7bnVtYmVyfSBwdHIqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSogQHBhcmFtIHtzdHJpbmd9IHR5cGUqLyBmdW5jdGlvbiBzZXRWYWx1ZShwdHIsIHZhbHVlLCB0eXBlID0gImk4Iikge2lmICh0eXBlLmVuZHNXaXRoKCIqIikpIHR5cGUgPSAiKiI7c3dpdGNoICh0eXBlKSB7Y2FzZSAiaTEiOkhFQVA4WygocHRyKSA+Pj4gMCkgPj4+IDBdID0gdmFsdWU7YnJlYWs7Y2FzZSAiaTgiOkhFQVA4WygocHRyKSA+Pj4gMCkgPj4+IDBdID0gdmFsdWU7YnJlYWs7Y2FzZSAiaTE2IjpIRUFQMTZbKChwdHIpID4+PiAxKSA+Pj4gMF0gPSB2YWx1ZTticmVhaztjYXNlICJpMzIiOkhFQVAzMlsoKHB0cikgPj4+IDIpID4+PiAwXSA9IHZhbHVlO2JyZWFrO2Nhc2UgImk2NCI6YWJvcnQoInRvIGRvIHNldFZhbHVlKGk2NCkgdXNlIFdBU01fQklHSU5UIik7Y2FzZSAiZmxvYXQiOkhFQVBGMzJbKChwdHIpID4+PiAyKSA+Pj4gMF0gPSB2YWx1ZTticmVhaztjYXNlICJkb3VibGUiOkhFQVBGNjRbKChwdHIpID4+PiAzKSA+Pj4gMF0gPSB2YWx1ZTticmVhaztjYXNlICIqIjpIRUFQVTMyWygocHRyKSA+Pj4gMikgPj4+IDBdID0gdmFsdWU7YnJlYWs7ZGVmYXVsdDphYm9ydChgaW52YWxpZCB0eXBlIGZvciBzZXRWYWx1ZTogJHt0eXBlfWApO319dmFyIHdhcm5PbmNlID0gdGV4dCA9PiB7aWYgKCF3YXJuT25jZS5zaG93bikgd2Fybk9uY2Uuc2hvd24gPSB7fTtpZiAoIXdhcm5PbmNlLnNob3duW3RleHRdKSB7d2Fybk9uY2Uuc2hvd25bdGV4dF0gPSAxO2Vycih0ZXh0KTt9fTt2YXIgZXhjZXB0aW9uQ2F1Z2h0ID0gW107dmFyIHVuY2F1Z2h0RXhjZXB0aW9uQ291bnQgPSAwO3ZhciBjb252ZXJ0STMyUGFpclRvSTUzQ2hlY2tlZCA9IChsbywgaGkpID0+IHthc3NlcnQobG8gPT0gKGxvID4+PiAwKSB8fCBsbyA9PSAobG8gfCAwKSk7YXNzZXJ0KGhpID09PSAoaGkgfCAwKSk7cmV0dXJuICgoaGkgKyAyMDk3MTUyKSA+Pj4gMCA8IDQxOTQzMDUgLSAhIWxvKSA/IChsbyA+Pj4gMCkgKyBoaSAqIDQyOTQ5NjcyOTYgOiBOYU47fTtmdW5jdGlvbiBfX19jeGFfYmVnaW5fY2F0Y2gocHRyKSB7cHRyID4+Pj0gMDt2YXIgaW5mbyA9IG5ldyBFeGNlcHRpb25JbmZvKHB0cik7aWYgKCFpbmZvLmdldF9jYXVnaHQoKSkge2luZm8uc2V0X2NhdWdodCh0cnVlKTt1bmNhdWdodEV4Y2VwdGlvbkNvdW50LS07fWluZm8uc2V0X3JldGhyb3duKGZhbHNlKTtleGNlcHRpb25DYXVnaHQucHVzaChpbmZvKTtfX19jeGFfaW5jcmVtZW50X2V4Y2VwdGlvbl9yZWZjb3VudChpbmZvLmV4Y1B0cik7cmV0dXJuIGluZm8uZ2V0X2V4Y2VwdGlvbl9wdHIoKTt9dmFyIGV4Y2VwdGlvbkxhc3QgPSAwO3ZhciBfX19jeGFfZW5kX2NhdGNoID0gKCkgPT4ge19zZXRUaHJldygwLCAwKTthc3NlcnQoZXhjZXB0aW9uQ2F1Z2h0Lmxlbmd0aCA+IDApO3ZhciBpbmZvID0gZXhjZXB0aW9uQ2F1Z2h0LnBvcCgpO19fX2N4YV9kZWNyZW1lbnRfZXhjZXB0aW9uX3JlZmNvdW50KGluZm8uZXhjUHRyKTtleGNlcHRpb25MYXN0ID0gMDt9Oy8qKiBAY29uc3RydWN0b3IgKi8gZnVuY3Rpb24gRXhjZXB0aW9uSW5mbyhleGNQdHIpIHt0aGlzLmV4Y1B0ciA9IGV4Y1B0cjt0aGlzLnB0ciA9IGV4Y1B0ciAtIDI0O3RoaXMuc2V0X3R5cGUgPSBmdW5jdGlvbih0eXBlKSB7SEVBUFUzMlsoKCh0aGlzLnB0cikgKyAoNCkpID4+PiAyKSA+Pj4gMF0gPSB0eXBlO307dGhpcy5nZXRfdHlwZSA9IGZ1bmN0aW9uKCkge3JldHVybiBIRUFQVTMyWygoKHRoaXMucHRyKSArICg0KSkgPj4+IDIpID4+PiAwXTt9O3RoaXMuc2V0X2Rlc3RydWN0b3IgPSBmdW5jdGlvbihkZXN0cnVjdG9yKSB7SEVBUFUzMlsoKCh0aGlzLnB0cikgKyAoOCkpID4+PiAyKSA+Pj4gMF0gPSBkZXN0cnVjdG9yO307dGhpcy5nZXRfZGVzdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge3JldHVybiBIRUFQVTMyWygoKHRoaXMucHRyKSArICg4KSkgPj4+IDIpID4+PiAwXTt9O3RoaXMuc2V0X2NhdWdodCA9IGZ1bmN0aW9uKGNhdWdodCkge2NhdWdodCA9IGNhdWdodCA/IDEgOiAwO0hFQVA4WygoKHRoaXMucHRyKSArICgxMikpID4+PiAwKSA+Pj4gMF0gPSBjYXVnaHQ7fTt0aGlzLmdldF9jYXVnaHQgPSBmdW5jdGlvbigpIHtyZXR1cm4gSEVBUDhbKCgodGhpcy5wdHIpICsgKDEyKSkgPj4+IDApID4+PiAwXSAhPSAwO307dGhpcy5zZXRfcmV0aHJvd24gPSBmdW5jdGlvbihyZXRocm93bikge3JldGhyb3duID0gcmV0aHJvd24gPyAxIDogMDtIRUFQOFsoKCh0aGlzLnB0cikgKyAoMTMpKSA+Pj4gMCkgPj4+IDBdID0gcmV0aHJvd247fTt0aGlzLmdldF9yZXRocm93biA9IGZ1bmN0aW9uKCkge3JldHVybiBIRUFQOFsoKCh0aGlzLnB0cikgKyAoMTMpKSA+Pj4gMCkgPj4+IDBdICE9IDA7fTt0aGlzLmluaXQgPSBmdW5jdGlvbih0eXBlLCBkZXN0cnVjdG9yKSB7dGhpcy5zZXRfYWRqdXN0ZWRfcHRyKDApO3RoaXMuc2V0X3R5cGUodHlwZSk7dGhpcy5zZXRfZGVzdHJ1Y3RvcihkZXN0cnVjdG9yKTt9O3RoaXMuc2V0X2FkanVzdGVkX3B0ciA9IGZ1bmN0aW9uKGFkanVzdGVkUHRyKSB7SEVBUFUzMlsoKCh0aGlzLnB0cikgKyAoMTYpKSA+Pj4gMikgPj4+IDBdID0gYWRqdXN0ZWRQdHI7fTt0aGlzLmdldF9hZGp1c3RlZF9wdHIgPSBmdW5jdGlvbigpIHtyZXR1cm4gSEVBUFUzMlsoKCh0aGlzLnB0cikgKyAoMTYpKSA+Pj4gMikgPj4+IDBdO307dGhpcy5nZXRfZXhjZXB0aW9uX3B0ciA9IGZ1bmN0aW9uKCkge3ZhciBpc1BvaW50ZXIgPSBfX19jeGFfaXNfcG9pbnRlcl90eXBlKHRoaXMuZ2V0X3R5cGUoKSk7aWYgKGlzUG9pbnRlcikge3JldHVybiBIRUFQVTMyWygodGhpcy5leGNQdHIpID4+PiAyKSA+Pj4gMF07fXZhciBhZGp1c3RlZCA9IHRoaXMuZ2V0X2FkanVzdGVkX3B0cigpO2lmIChhZGp1c3RlZCAhPT0gMCkgcmV0dXJuIGFkanVzdGVkO3JldHVybiB0aGlzLmV4Y1B0cjt9O31mdW5jdGlvbiBfX19yZXN1bWVFeGNlcHRpb24ocHRyKSB7cHRyID4+Pj0gMDtpZiAoIWV4Y2VwdGlvbkxhc3QpIHtleGNlcHRpb25MYXN0ID0gcHRyO31hc3NlcnQoZmFsc2UsICJFeGNlcHRpb24gdGhyb3duLCBidXQgZXhjZXB0aW9uIGNhdGNoaW5nIGlzIG5vdCBlbmFibGVkLiBDb21waWxlIHdpdGggLXNOT19ESVNBQkxFX0VYQ0VQVElPTl9DQVRDSElORyBvciAtc0VYQ0VQVElPTl9DQVRDSElOR19BTExPV0VEPVsuLl0gdG8gY2F0Y2guIik7fXZhciBmaW5kTWF0Y2hpbmdDYXRjaCA9IGFyZ3MgPT4ge3ZhciB0aHJvd24gPSBleGNlcHRpb25MYXN0O2lmICghdGhyb3duKSB7c2V0VGVtcFJldDAoMCk7cmV0dXJuIDA7fXZhciBpbmZvID0gbmV3IEV4Y2VwdGlvbkluZm8odGhyb3duKTtpbmZvLnNldF9hZGp1c3RlZF9wdHIodGhyb3duKTt2YXIgdGhyb3duVHlwZSA9IGluZm8uZ2V0X3R5cGUoKTtpZiAoIXRocm93blR5cGUpIHtzZXRUZW1wUmV0MCgwKTtyZXR1cm4gdGhyb3duO31mb3IgKHZhciBhcmcgaW4gYXJncykge3ZhciBjYXVnaHRUeXBlID0gYXJnc1thcmddO2lmIChjYXVnaHRUeXBlID09PSAwIHx8IGNhdWdodFR5cGUgPT09IHRocm93blR5cGUpIHticmVhazt9dmFyIGFkanVzdGVkX3B0cl9hZGRyID0gaW5mby5wdHIgKyAxNjtpZiAoX19fY3hhX2Nhbl9jYXRjaChjYXVnaHRUeXBlLCB0aHJvd25UeXBlLCBhZGp1c3RlZF9wdHJfYWRkcikpIHtzZXRUZW1wUmV0MChjYXVnaHRUeXBlKTtyZXR1cm4gdGhyb3duO319c2V0VGVtcFJldDAodGhyb3duVHlwZSk7cmV0dXJuIHRocm93bjt9O2Z1bmN0aW9uIF9fX2N4YV9maW5kX21hdGNoaW5nX2NhdGNoXzIoKSB7cmV0dXJuIGZpbmRNYXRjaGluZ0NhdGNoKFtdKTt9ZnVuY3Rpb24gX19fY3hhX2ZpbmRfbWF0Y2hpbmdfY2F0Y2hfMyhhcmcwKSB7YXJnMCA+Pj49IDA7cmV0dXJuIGZpbmRNYXRjaGluZ0NhdGNoKFsgYXJnMCBdKTt9ZnVuY3Rpb24gX19fY3hhX2ZpbmRfbWF0Y2hpbmdfY2F0Y2hfNChhcmcwLCBhcmcxKSB7YXJnMCA+Pj49IDA7YXJnMSA+Pj49IDA7cmV0dXJuIGZpbmRNYXRjaGluZ0NhdGNoKFsgYXJnMCwgYXJnMSBdKTt9ZnVuY3Rpb24gX19fY3hhX2ZpbmRfbWF0Y2hpbmdfY2F0Y2hfNShhcmcwLCBhcmcxLCBhcmcyKSB7YXJnMCA+Pj49IDA7YXJnMSA+Pj49IDA7YXJnMiA+Pj49IDA7cmV0dXJuIGZpbmRNYXRjaGluZ0NhdGNoKFsgYXJnMCwgYXJnMSwgYXJnMiBdKTt9dmFyIF9fX2N4YV9yZXRocm93ID0gKCkgPT4ge3ZhciBpbmZvID0gZXhjZXB0aW9uQ2F1Z2h0LnBvcCgpO2lmICghaW5mbykge2Fib3J0KCJubyBleGNlcHRpb24gdG8gdGhyb3ciKTt9dmFyIHB0ciA9IGluZm8uZXhjUHRyO2lmICghaW5mby5nZXRfcmV0aHJvd24oKSkge2V4Y2VwdGlvbkNhdWdodC5wdXNoKGluZm8pO2luZm8uc2V0X3JldGhyb3duKHRydWUpO2luZm8uc2V0X2NhdWdodChmYWxzZSk7dW5jYXVnaHRFeGNlcHRpb25Db3VudCsrO31leGNlcHRpb25MYXN0ID0gcHRyO2Fzc2VydChmYWxzZSwgIkV4Y2VwdGlvbiB0aHJvd24sIGJ1dCBleGNlcHRpb24gY2F0Y2hpbmcgaXMgbm90IGVuYWJsZWQuIENvbXBpbGUgd2l0aCAtc05PX0RJU0FCTEVfRVhDRVBUSU9OX0NBVENISU5HIG9yIC1zRVhDRVBUSU9OX0NBVENISU5HX0FMTE9XRUQ9Wy4uXSB0byBjYXRjaC4iKTt9O2Z1bmN0aW9uIF9fX2N4YV90aHJvdyhwdHIsIHR5cGUsIGRlc3RydWN0b3IpIHtwdHIgPj4+PSAwO3R5cGUgPj4+PSAwO2Rlc3RydWN0b3IgPj4+PSAwO3ZhciBpbmZvID0gbmV3IEV4Y2VwdGlvbkluZm8ocHRyKTtpbmZvLmluaXQodHlwZSwgZGVzdHJ1Y3Rvcik7ZXhjZXB0aW9uTGFzdCA9IHB0cjt1bmNhdWdodEV4Y2VwdGlvbkNvdW50Kys7YXNzZXJ0KGZhbHNlLCAiRXhjZXB0aW9uIHRocm93biwgYnV0IGV4Y2VwdGlvbiBjYXRjaGluZyBpcyBub3QgZW5hYmxlZC4gQ29tcGlsZSB3aXRoIC1zTk9fRElTQUJMRV9FWENFUFRJT05fQ0FUQ0hJTkcgb3IgLXNFWENFUFRJT05fQ0FUQ0hJTkdfQUxMT1dFRD1bLi5dIHRvIGNhdGNoLiIpO312YXIgbm93SXNNb25vdG9uaWMgPSB0cnVlO3ZhciBfX2Vtc2NyaXB0ZW5fZ2V0X25vd19pc19tb25vdG9uaWMgPSAoKSA9PiBub3dJc01vbm90b25pYzt2YXIgX19lbXNjcmlwdGVuX3Rocm93X2xvbmdqbXAgPSAoKSA9PiB7dGhyb3cgSW5maW5pdHk7fTt2YXIgVVRGOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgIT0gInVuZGVmaW5lZCIgPyBuZXcgVGV4dERlY29kZXIoInV0ZjgiKSA6IHVuZGVmaW5lZDsvKioqIEdpdmVuIGEgcG9pbnRlciAnaWR4JyB0byBhIG51bGwtdGVybWluYXRlZCBVVEY4LWVuY29kZWQgc3RyaW5nIGluIHRoZSBnaXZlbiogYXJyYXkgdGhhdCBjb250YWlucyB1aW50OCB2YWx1ZXMsIHJldHVybnMgYSBjb3B5IG9mIHRoYXQgc3RyaW5nIGFzIGEqIEphdmFzY3JpcHQgU3RyaW5nIG9iamVjdC4qIGhlYXBPckFycmF5IGlzIGVpdGhlciBhIHJlZ3VsYXIgYXJyYXksIG9yIGEgSmF2YVNjcmlwdCB0eXBlZCBhcnJheSB2aWV3LiogQHBhcmFtIHtudW1iZXJ9IGlkeCogQHBhcmFtIHtudW1iZXI9fSBtYXhCeXRlc1RvUmVhZCogQHJldHVybiB7c3RyaW5nfSovIHZhciBVVEY4QXJyYXlUb1N0cmluZyA9IChoZWFwT3JBcnJheSwgaWR4LCBtYXhCeXRlc1RvUmVhZCkgPT4ge2lkeCA+Pj49IDA7dmFyIGVuZElkeCA9IGlkeCArIG1heEJ5dGVzVG9SZWFkO3ZhciBlbmRQdHIgPSBpZHg7d2hpbGUgKGhlYXBPckFycmF5W2VuZFB0cl0gJiYgIShlbmRQdHIgPj0gZW5kSWR4KSkgKytlbmRQdHI7aWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXBPckFycmF5LmJ1ZmZlciAmJiBVVEY4RGVjb2Rlcikge3JldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcE9yQXJyYXkuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTt9dmFyIHN0ciA9ICIiO3doaWxlIChpZHggPCBlbmRQdHIpIHt2YXIgdTAgPSBoZWFwT3JBcnJheVtpZHgrK107aWYgKCEodTAgJiAxMjgpKSB7c3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApO2NvbnRpbnVlO312YXIgdTEgPSBoZWFwT3JBcnJheVtpZHgrK10gJiA2MztpZiAoKHUwICYgMjI0KSA9PSAxOTIpIHtzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKHUwICYgMzEpIDw8IDYpIHwgdTEpO2NvbnRpbnVlO312YXIgdTIgPSBoZWFwT3JBcnJheVtpZHgrK10gJiA2MztpZiAoKHUwICYgMjQwKSA9PSAyMjQpIHt1MCA9ICgodTAgJiAxNSkgPDwgMTIpIHwgKHUxIDw8IDYpIHwgdTI7fSBlbHNlIHtpZiAoKHUwICYgMjQ4KSAhPSAyNDApIHdhcm5PbmNlKCJJbnZhbGlkIFVURi04IGxlYWRpbmcgYnl0ZSAiICsgcHRyVG9TdHJpbmcodTApICsgIiBlbmNvdW50ZXJlZCB3aGVuIGRlc2VyaWFsaXppbmcgYSBVVEYtOCBzdHJpbmcgaW4gd2FzbSBtZW1vcnkgdG8gYSBKUyBzdHJpbmchIik7dTAgPSAoKHUwICYgNykgPDwgMTgpIHwgKHUxIDw8IDEyKSB8ICh1MiA8PCA2KSB8IChoZWFwT3JBcnJheVtpZHgrK10gJiA2Myk7fWlmICh1MCA8IDY1NTM2KSB7c3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApO30gZWxzZSB7dmFyIGNoID0gdTAgLSA2NTUzNjtzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NiB8IChjaCA+PiAxMCksIDU2MzIwIHwgKGNoICYgMTAyMykpO319cmV0dXJuIHN0cjt9Oy8qKiogR2l2ZW4gYSBwb2ludGVyICdwdHInIHRvIGEgbnVsbC10ZXJtaW5hdGVkIFVURjgtZW5jb2RlZCBzdHJpbmcgaW4gdGhlKiBlbXNjcmlwdGVuIEhFQVAsIHJldHVybnMgYSBjb3B5IG9mIHRoYXQgc3RyaW5nIGFzIGEgSmF2YXNjcmlwdCBTdHJpbmcgb2JqZWN0LioqIEBwYXJhbSB7bnVtYmVyfSBwdHIqIEBwYXJhbSB7bnVtYmVyPX0gbWF4Qnl0ZXNUb1JlYWQgLSBBbiBvcHRpb25hbCBsZW5ndGggdGhhdCBzcGVjaWZpZXMgdGhlKiAgIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuIFlvdSBjYW4gb21pdCB0aGlzIHBhcmFtZXRlciB0byBzY2FuIHRoZSogICBzdHJpbmcgdW50aWwgdGhlIGZpcnN0IDAgYnl0ZS4gSWYgbWF4Qnl0ZXNUb1JlYWQgaXMgcGFzc2VkLCBhbmQgdGhlIHN0cmluZyogICBhdCBbcHRyLCBwdHIrbWF4Qnl0ZXNUb1JlYWRyWyBjb250YWlucyBhIG51bGwgYnl0ZSBpbiB0aGUgbWlkZGxlLCB0aGVuIHRoZSogICBzdHJpbmcgd2lsbCBjdXQgc2hvcnQgYXQgdGhhdCBieXRlIGluZGV4IChpLmUuIG1heEJ5dGVzVG9SZWFkIHdpbGwgbm90KiAgIHByb2R1Y2UgYSBzdHJpbmcgb2YgZXhhY3QgbGVuZ3RoIFtwdHIsIHB0cittYXhCeXRlc1RvUmVhZFspIE4uQi4gbWl4aW5nKiAgIGZyZXF1ZW50IHVzZXMgb2YgVVRGOFRvU3RyaW5nKCkgd2l0aCBhbmQgd2l0aG91dCBtYXhCeXRlc1RvUmVhZCBtYXkgdGhyb3cqICAgSlMgSklUIG9wdGltaXphdGlvbnMgb2ZmLCBzbyBpdCBpcyB3b3J0aCB0byBjb25zaWRlciBjb25zaXN0ZW50bHkgdXNpbmcgb25lKiBAcmV0dXJuIHtzdHJpbmd9Ki8gdmFyIFVURjhUb1N0cmluZyA9IChwdHIsIG1heEJ5dGVzVG9SZWFkKSA9PiB7YXNzZXJ0KHR5cGVvZiBwdHIgPT0gIm51bWJlciIpO3B0ciA+Pj49IDA7cmV0dXJuIHB0ciA/IFVURjhBcnJheVRvU3RyaW5nKEhFQVBVOCwgcHRyLCBtYXhCeXRlc1RvUmVhZCkgOiAiIjt9O3ZhciBTWVNDQUxMUyA9IHt2YXJhcmdzOiB1bmRlZmluZWQsZ2V0KCkge2Fzc2VydChTWVNDQUxMUy52YXJhcmdzICE9IHVuZGVmaW5lZCk7dmFyIHJldCA9IEhFQVAzMlsoKCtTWVNDQUxMUy52YXJhcmdzKSA+Pj4gMikgPj4+IDBdO1NZU0NBTExTLnZhcmFyZ3MgKz0gNDtyZXR1cm4gcmV0O30sZ2V0cCgpIHtyZXR1cm4gU1lTQ0FMTFMuZ2V0KCk7fSxnZXRTdHIocHRyKSB7dmFyIHJldCA9IFVURjhUb1N0cmluZyhwdHIpO3JldHVybiByZXQ7fX07ZnVuY3Rpb24gX19tbWFwX2pzKGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXRfbG93LCBvZmZzZXRfaGlnaCwgYWxsb2NhdGVkLCBhZGRyKSB7bGVuID4+Pj0gMDt2YXIgb2Zmc2V0ID0gY29udmVydEkzMlBhaXJUb0k1M0NoZWNrZWQob2Zmc2V0X2xvdywgb2Zmc2V0X2hpZ2gpO2FsbG9jYXRlZCA+Pj49IDA7YWRkciA+Pj49IDA7cmV0dXJuIC01Mjt9ZnVuY3Rpb24gX19tdW5tYXBfanMoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZnNldF9sb3csIG9mZnNldF9oaWdoKSB7YWRkciA+Pj49IDA7bGVuID4+Pj0gMDt2YXIgb2Zmc2V0ID0gY29udmVydEkzMlBhaXJUb0k1M0NoZWNrZWQob2Zmc2V0X2xvdywgb2Zmc2V0X2hpZ2gpO312YXIgX2Fib3J0ID0gKCkgPT4ge2Fib3J0KCJuYXRpdmUgY29kZSBjYWxsZWQgYWJvcnQoKSIpO307dmFyIF9lbXNjcmlwdGVuX2RhdGVfbm93ID0gKCkgPT4gRGF0ZS5ub3coKTtmdW5jdGlvbiBqc1N0YWNrVHJhY2UoKSB7dmFyIGVycm9yID0gbmV3IEVycm9yO2lmICghZXJyb3Iuc3RhY2spIHt0cnkge3Rocm93IG5ldyBFcnJvcjt9IGNhdGNoIChlKSB7ZXJyb3IgPSBlO31pZiAoIWVycm9yLnN0YWNrKSB7cmV0dXJuICIobm8gc3RhY2sgdHJhY2UgYXZhaWxhYmxlKSI7fX1yZXR1cm4gZXJyb3Iuc3RhY2sudG9TdHJpbmcoKTt9LyoqIEBwYXJhbSB7bnVtYmVyPX0gZmxhZ3MgKi8gZnVuY3Rpb24gZ2V0Q2FsbHN0YWNrKGZsYWdzKSB7dmFyIGNhbGxzdGFjayA9IGpzU3RhY2tUcmFjZSgpO3ZhciBpVGhpc0Z1bmMgPSBjYWxsc3RhY2subGFzdEluZGV4T2YoIl9lbXNjcmlwdGVuX2xvZyIpO3ZhciBpVGhpc0Z1bmMyID0gY2FsbHN0YWNrLmxhc3RJbmRleE9mKCJfZW1zY3JpcHRlbl9nZXRfY2FsbHN0YWNrIik7dmFyIGlOZXh0TGluZSA9IGNhbGxzdGFjay5pbmRleE9mKCJcbiIsIE1hdGgubWF4KGlUaGlzRnVuYywgaVRoaXNGdW5jMikpICsgMTtjYWxsc3RhY2sgPSBjYWxsc3RhY2suc2xpY2UoaU5leHRMaW5lKTtpZiAoZmxhZ3MgJiA4ICYmIHR5cGVvZiBlbXNjcmlwdGVuX3NvdXJjZV9tYXAgPT0gInVuZGVmaW5lZCIpIHt3YXJuT25jZSgnU291cmNlIG1hcCBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLCBlbXNjcmlwdGVuX2xvZyB3aXRoIEVNX0xPR19DX1NUQUNLIHdpbGwgYmUgaWdub3JlZC4gQnVpbGQgd2l0aCAiLS1wcmUtanMgJEVNU0NSSVBURU4vc3JjL2Vtc2NyaXB0ZW4tc291cmNlLW1hcC5taW4uanMiIGxpbmtlciBmbGFnIHRvIGFkZCBzb3VyY2UgbWFwIGxvYWRpbmcgdG8gY29kZS4nKTtmbGFncyBePSA4O2ZsYWdzIHw9IDE2O312YXIgbGluZXMgPSBjYWxsc3RhY2suc3BsaXQoIlxuIik7Y2FsbHN0YWNrID0gIiI7dmFyIG5ld0ZpcmVmb3hSZSA9IG5ldyBSZWdFeHAoIlxccyooLio/KUAoLio/KTooWzAtOV0rKTooWzAtOV0rKSIpO3ZhciBmaXJlZm94UmUgPSBuZXcgUmVnRXhwKCJcXHMqKC4qPylAKC4qKTooLiopKDooLiopKT8iKTt2YXIgY2hyb21lUmUgPSBuZXcgUmVnRXhwKCJcXHMqYXQgKC4qPykgXFwoKC4qKTooLiopOiguKilcXCkiKTtmb3IgKHZhciBsIGluIGxpbmVzKSB7dmFyIGxpbmUgPSBsaW5lc1tsXTt2YXIgc3ltYm9sTmFtZSA9ICIiO3ZhciBmaWxlID0gIiI7dmFyIGxpbmVubyA9IDA7dmFyIGNvbHVtbiA9IDA7dmFyIHBhcnRzID0gY2hyb21lUmUuZXhlYyhsaW5lKTtpZiAocGFydHMgJiYgcGFydHMubGVuZ3RoID09IDUpIHtzeW1ib2xOYW1lID0gcGFydHNbMV07ZmlsZSA9IHBhcnRzWzJdO2xpbmVubyA9IHBhcnRzWzNdO2NvbHVtbiA9IHBhcnRzWzRdO30gZWxzZSB7cGFydHMgPSBuZXdGaXJlZm94UmUuZXhlYyhsaW5lKTtpZiAoIXBhcnRzKSBwYXJ0cyA9IGZpcmVmb3hSZS5leGVjKGxpbmUpO2lmIChwYXJ0cyAmJiBwYXJ0cy5sZW5ndGggPj0gNCkge3N5bWJvbE5hbWUgPSBwYXJ0c1sxXTtmaWxlID0gcGFydHNbMl07bGluZW5vID0gcGFydHNbM107Y29sdW1uID0gcGFydHNbNF0gfCAwO30gZWxzZSB7Y2FsbHN0YWNrICs9IGxpbmUgKyAiXG4iO2NvbnRpbnVlO319dmFyIGhhdmVTb3VyY2VNYXAgPSBmYWxzZTtpZiAoZmxhZ3MgJiA4KSB7dmFyIG9yaWcgPSBlbXNjcmlwdGVuX3NvdXJjZV9tYXAub3JpZ2luYWxQb3NpdGlvbkZvcih7bGluZTogbGluZW5vLGNvbHVtbjogY29sdW1ufSk7aGF2ZVNvdXJjZU1hcCA9IChvcmlnICYmIG9yaWcuc291cmNlKTtpZiAoaGF2ZVNvdXJjZU1hcCkge2lmIChmbGFncyAmIDY0KSB7b3JpZy5zb3VyY2UgPSBvcmlnLnNvdXJjZS5zdWJzdHJpbmcob3JpZy5zb3VyY2UucmVwbGFjZSgvXFwvZywgIi8iKS5sYXN0SW5kZXhPZigiLyIpICsgMSk7fWNhbGxzdGFjayArPSBgICAgIGF0ICR7c3ltYm9sTmFtZX0gKCR7b3JpZy5zb3VyY2V9OiR7b3JpZy5saW5lfToke29yaWcuY29sdW1ufSlcbmA7fX1pZiAoKGZsYWdzICYgMTYpIHx8ICFoYXZlU291cmNlTWFwKSB7aWYgKGZsYWdzICYgNjQpIHtmaWxlID0gZmlsZS5zdWJzdHJpbmcoZmlsZS5yZXBsYWNlKC9cXC9nLCAiLyIpLmxhc3RJbmRleE9mKCIvIikgKyAxKTt9Y2FsbHN0YWNrICs9IChoYXZlU291cmNlTWFwID8gKGAgICAgID0gJHtzeW1ib2xOYW1lfWApIDogKGAgICAgYXQgJHtzeW1ib2xOYW1lfWApKSArIGAgKCR7ZmlsZX06JHtsaW5lbm99OiR7Y29sdW1ufSlcbmA7fX1jYWxsc3RhY2sgPSBjYWxsc3RhY2sucmVwbGFjZSgvXHMrJC8sICIiKTtyZXR1cm4gY2FsbHN0YWNrO312YXIgbGVuZ3RoQnl0ZXNVVEY4ID0gc3RyID0+IHt2YXIgbGVuID0gMDtmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge3ZhciBjID0gc3RyLmNoYXJDb2RlQXQoaSk7aWYgKGMgPD0gMTI3KSB7bGVuKys7fSBlbHNlIGlmIChjIDw9IDIwNDcpIHtsZW4gKz0gMjt9IGVsc2UgaWYgKGMgPj0gNTUyOTYgJiYgYyA8PSA1NzM0Mykge2xlbiArPSA0OysraTt9IGVsc2Uge2xlbiArPSAzO319cmV0dXJuIGxlbjt9O3ZhciBzdHJpbmdUb1VURjhBcnJheSA9IChzdHIsIGhlYXAsIG91dElkeCwgbWF4Qnl0ZXNUb1dyaXRlKSA9PiB7b3V0SWR4ID4+Pj0gMDthc3NlcnQodHlwZW9mIHN0ciA9PT0gInN0cmluZyIpO2lmICghKG1heEJ5dGVzVG9Xcml0ZSA+IDApKSByZXR1cm4gMDt2YXIgc3RhcnRJZHggPSBvdXRJZHg7dmFyIGVuZElkeCA9IG91dElkeCArIG1heEJ5dGVzVG9Xcml0ZSAtIDE7Zm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHt2YXIgdSA9IHN0ci5jaGFyQ29kZUF0KGkpO2lmICh1ID49IDU1Mjk2ICYmIHUgPD0gNTczNDMpIHt2YXIgdTEgPSBzdHIuY2hhckNvZGVBdCgrK2kpO3UgPSA2NTUzNiArICgodSAmIDEwMjMpIDw8IDEwKSB8ICh1MSAmIDEwMjMpO31pZiAodSA8PSAxMjcpIHtpZiAob3V0SWR4ID49IGVuZElkeCkgYnJlYWs7aGVhcFtvdXRJZHgrKyA+Pj4gMF0gPSB1O30gZWxzZSBpZiAodSA8PSAyMDQ3KSB7aWYgKG91dElkeCArIDEgPj0gZW5kSWR4KSBicmVhaztoZWFwW291dElkeCsrID4+PiAwXSA9IDE5MiB8ICh1ID4+IDYpO2hlYXBbb3V0SWR4KysgPj4+IDBdID0gMTI4IHwgKHUgJiA2Myk7fSBlbHNlIGlmICh1IDw9IDY1NTM1KSB7aWYgKG91dElkeCArIDIgPj0gZW5kSWR4KSBicmVhaztoZWFwW291dElkeCsrID4+PiAwXSA9IDIyNCB8ICh1ID4+IDEyKTtoZWFwW291dElkeCsrID4+PiAwXSA9IDEyOCB8ICgodSA+PiA2KSAmIDYzKTtoZWFwW291dElkeCsrID4+PiAwXSA9IDEyOCB8ICh1ICYgNjMpO30gZWxzZSB7aWYgKG91dElkeCArIDMgPj0gZW5kSWR4KSBicmVhaztpZiAodSA+IDExMTQxMTEpIHdhcm5PbmNlKCJJbnZhbGlkIFVuaWNvZGUgY29kZSBwb2ludCAiICsgcHRyVG9TdHJpbmcodSkgKyAiIGVuY291bnRlcmVkIHdoZW4gc2VyaWFsaXppbmcgYSBKUyBzdHJpbmcgdG8gYSBVVEYtOCBzdHJpbmcgaW4gd2FzbSBtZW1vcnkhIChWYWxpZCB1bmljb2RlIGNvZGUgcG9pbnRzIHNob3VsZCBiZSBpbiByYW5nZSAwLTB4MTBGRkZGKS4iKTtoZWFwW291dElkeCsrID4+PiAwXSA9IDI0MCB8ICh1ID4+IDE4KTtoZWFwW291dElkeCsrID4+PiAwXSA9IDEyOCB8ICgodSA+PiAxMikgJiA2Myk7aGVhcFtvdXRJZHgrKyA+Pj4gMF0gPSAxMjggfCAoKHUgPj4gNikgJiA2Myk7aGVhcFtvdXRJZHgrKyA+Pj4gMF0gPSAxMjggfCAodSAmIDYzKTt9fWhlYXBbb3V0SWR4ID4+PiAwXSA9IDA7cmV0dXJuIG91dElkeCAtIHN0YXJ0SWR4O307dmFyIHN0cmluZ1RvVVRGOCA9IChzdHIsIG91dFB0ciwgbWF4Qnl0ZXNUb1dyaXRlKSA9PiB7YXNzZXJ0KHR5cGVvZiBtYXhCeXRlc1RvV3JpdGUgPT0gIm51bWJlciIsICJzdHJpbmdUb1VURjgoc3RyLCBvdXRQdHIsIG1heEJ5dGVzVG9Xcml0ZSkgaXMgbWlzc2luZyB0aGUgdGhpcmQgcGFyYW1ldGVyIHRoYXQgc3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgdGhlIG91dHB1dCBidWZmZXIhIik7cmV0dXJuIHN0cmluZ1RvVVRGOEFycmF5KHN0ciwgSEVBUFU4LCBvdXRQdHIsIG1heEJ5dGVzVG9Xcml0ZSk7fTtmdW5jdGlvbiBfZW1zY3JpcHRlbl9nZXRfY2FsbHN0YWNrKGZsYWdzLCBzdHIsIG1heGJ5dGVzKSB7c3RyID4+Pj0gMDt2YXIgY2FsbHN0YWNrID0gZ2V0Q2FsbHN0YWNrKGZsYWdzKTtpZiAoIXN0ciB8fCBtYXhieXRlcyA8PSAwKSB7cmV0dXJuIGxlbmd0aEJ5dGVzVVRGOChjYWxsc3RhY2spICsgMTt9dmFyIGJ5dGVzV3JpdHRlbkV4Y2x1ZGluZ051bGwgPSBzdHJpbmdUb1VURjgoY2FsbHN0YWNrLCBzdHIsIG1heGJ5dGVzKTtyZXR1cm4gYnl0ZXNXcml0dGVuRXhjbHVkaW5nTnVsbCArIDE7fXZhciBnZXRIZWFwTWF4ID0gKCkgPT4gIDQyOTQ5MDE3NjA7ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfbWF4KCkge3JldHVybiBnZXRIZWFwTWF4KCk7fXZhciBfZW1zY3JpcHRlbl9nZXRfbm93O19lbXNjcmlwdGVuX2dldF9ub3cgPSAoKSA9PiBwZXJmb3JtYW5jZS5ub3coKTtmdW5jdGlvbiBfZW1zY3JpcHRlbl9tZW1jcHlfanMoZGVzdCwgc3JjLCBudW0pIHtkZXN0ID4+Pj0gMDtzcmMgPj4+PSAwO251bSA+Pj49IDA7cmV0dXJuIEhFQVBVOC5jb3B5V2l0aGluKGRlc3QgPj4+IDAsIHNyYyA+Pj4gMCwgc3JjICsgbnVtID4+PiAwKTt9dmFyIGdyb3dNZW1vcnkgPSBzaXplID0+IHt2YXIgYiA9IHdhc21NZW1vcnkuYnVmZmVyO3ZhciBwYWdlcyA9IChzaXplIC0gYi5ieXRlTGVuZ3RoICsgNjU1MzUpIC8gNjU1MzY7dHJ5IHt3YXNtTWVtb3J5Lmdyb3cocGFnZXMpO3VwZGF0ZU1lbW9yeVZpZXdzKCk7cmV0dXJuIDE7fSAvKnN1Y2Nlc3MqLyBjYXRjaCAoZSkge2VycihgZ3Jvd01lbW9yeTogQXR0ZW1wdGVkIHRvIGdyb3cgaGVhcCBmcm9tICR7Yi5ieXRlTGVuZ3RofSBieXRlcyB0byAke3NpemV9IGJ5dGVzLCBidXQgZ290IGVycm9yOiAke2V9YCk7fX07ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAocmVxdWVzdGVkU2l6ZSkge3JlcXVlc3RlZFNpemUgPj4+PSAwO3ZhciBvbGRTaXplID0gSEVBUFU4Lmxlbmd0aDthc3NlcnQocmVxdWVzdGVkU2l6ZSA+IG9sZFNpemUpO3ZhciBtYXhIZWFwU2l6ZSA9IGdldEhlYXBNYXgoKTtpZiAocmVxdWVzdGVkU2l6ZSA+IG1heEhlYXBTaXplKSB7ZXJyKGBDYW5ub3QgZW5sYXJnZSBtZW1vcnksIHJlcXVlc3RlZCAke3JlcXVlc3RlZFNpemV9IGJ5dGVzLCBidXQgdGhlIGxpbWl0IGlzICR7bWF4SGVhcFNpemV9IGJ5dGVzIWApO3JldHVybiBmYWxzZTt9dmFyIGFsaWduVXAgPSAoeCwgbXVsdGlwbGUpID0+IHggKyAobXVsdGlwbGUgLSB4ICUgbXVsdGlwbGUpICUgbXVsdGlwbGU7Zm9yICh2YXIgY3V0RG93biA9IDE7IGN1dERvd24gPD0gNDsgY3V0RG93biAqPSAyKSB7dmFyIG92ZXJHcm93bkhlYXBTaXplID0gb2xkU2l6ZSAqICgxICsgLjIgLyBjdXREb3duKTtvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2KTt2YXIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnblVwKE1hdGgubWF4KHJlcXVlc3RlZFNpemUsIG92ZXJHcm93bkhlYXBTaXplKSwgNjU1MzYpKTt2YXIgcmVwbGFjZW1lbnQgPSBncm93TWVtb3J5KG5ld1NpemUpO2lmIChyZXBsYWNlbWVudCkge3JldHVybiB0cnVlO319ZXJyKGBGYWlsZWQgdG8gZ3JvdyB0aGUgaGVhcCBmcm9tICR7b2xkU2l6ZX0gYnl0ZXMgdG8gJHtuZXdTaXplfSBieXRlcywgbm90IGVub3VnaCBtZW1vcnkhYCk7cmV0dXJuIGZhbHNlO312YXIgRU5WID0ge307dmFyIGdldEV4ZWN1dGFibGVOYW1lID0gKCkgPT4gdGhpc1Byb2dyYW0gfHwgIi4vdGhpcy5wcm9ncmFtIjt2YXIgZ2V0RW52U3RyaW5ncyA9ICgpID0+IHtpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykge3ZhciBsYW5nID0gKCh0eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiICYmIG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlc1swXSkgfHwgIkMiKS5yZXBsYWNlKCItIiwgIl8iKSArICIuVVRGLTgiO3ZhciBlbnYgPSB7IlVTRVIiOiAid2ViX3VzZXIiLCJMT0dOQU1FIjogIndlYl91c2VyIiwiUEFUSCI6ICIvIiwiUFdEIjogIi8iLCJIT01FIjogIi9ob21lL3dlYl91c2VyIiwiTEFORyI6IGxhbmcsIl8iOiBnZXRFeGVjdXRhYmxlTmFtZSgpfTtmb3IgKHZhciB4IGluIEVOVikge2lmIChFTlZbeF0gPT09IHVuZGVmaW5lZCkgZGVsZXRlIGVudlt4XTsgZWxzZSBlbnZbeF0gPSBFTlZbeF07fXZhciBzdHJpbmdzID0gW107Zm9yICh2YXIgeCBpbiBlbnYpIHtzdHJpbmdzLnB1c2goYCR7eH09JHtlbnZbeF19YCk7fWdldEVudlN0cmluZ3Muc3RyaW5ncyA9IHN0cmluZ3M7fXJldHVybiBnZXRFbnZTdHJpbmdzLnN0cmluZ3M7fTt2YXIgc3RyaW5nVG9Bc2NpaSA9IChzdHIsIGJ1ZmZlcikgPT4ge2ZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7YXNzZXJ0KHN0ci5jaGFyQ29kZUF0KGkpID09PSAoc3RyLmNoYXJDb2RlQXQoaSkgJiAyNTUpKTtIRUFQOFsoKGJ1ZmZlcisrKSA+Pj4gMCkgPj4+IDBdID0gc3RyLmNoYXJDb2RlQXQoaSk7fUhFQVA4WygoYnVmZmVyKSA+Pj4gMCkgPj4+IDBdID0gMDt9O3ZhciBfZW52aXJvbl9nZXQgPSBmdW5jdGlvbihfX2Vudmlyb24sIGVudmlyb25fYnVmKSB7X19lbnZpcm9uID4+Pj0gMDtlbnZpcm9uX2J1ZiA+Pj49IDA7dmFyIGJ1ZlNpemUgPSAwO2dldEVudlN0cmluZ3MoKS5mb3JFYWNoKChzdHJpbmcsIGkpID0+IHt2YXIgcHRyID0gZW52aXJvbl9idWYgKyBidWZTaXplO0hFQVBVMzJbKCgoX19lbnZpcm9uKSArIChpICogNCkpID4+PiAyKSA+Pj4gMF0gPSBwdHI7c3RyaW5nVG9Bc2NpaShzdHJpbmcsIHB0cik7YnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTt9KTtyZXR1cm4gMDt9O3ZhciBfZW52aXJvbl9zaXplc19nZXQgPSBmdW5jdGlvbihwZW52aXJvbl9jb3VudCwgcGVudmlyb25fYnVmX3NpemUpIHtwZW52aXJvbl9jb3VudCA+Pj49IDA7cGVudmlyb25fYnVmX3NpemUgPj4+PSAwO3ZhciBzdHJpbmdzID0gZ2V0RW52U3RyaW5ncygpO0hFQVBVMzJbKChwZW52aXJvbl9jb3VudCkgPj4+IDIpID4+PiAwXSA9IHN0cmluZ3MubGVuZ3RoO3ZhciBidWZTaXplID0gMDtzdHJpbmdzLmZvckVhY2goc3RyaW5nID0+IGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDEpO0hFQVBVMzJbKChwZW52aXJvbl9idWZfc2l6ZSkgPj4+IDIpID4+PiAwXSA9IGJ1ZlNpemU7cmV0dXJuIDA7fTt2YXIgX3Byb2NfZXhpdCA9IGNvZGUgPT4ge0VYSVRTVEFUVVMgPSBjb2RlO2lmICgha2VlcFJ1bnRpbWVBbGl2ZSgpKSB7aWYgKE1vZHVsZVsib25FeGl0Il0pIE1vZHVsZVsib25FeGl0Il0oY29kZSk7QUJPUlQgPSB0cnVlO31xdWl0Xyhjb2RlLCBuZXcgRXhpdFN0YXR1cyhjb2RlKSk7fTsvKiogQHBhcmFtIHtib29sZWFufG51bWJlcj19IGltcGxpY2l0ICovIHZhciBleGl0SlMgPSAoc3RhdHVzLCBpbXBsaWNpdCkgPT4ge0VYSVRTVEFUVVMgPSBzdGF0dXM7Y2hlY2tVbmZsdXNoZWRDb250ZW50KCk7aWYgKGtlZXBSdW50aW1lQWxpdmUoKSAmJiAhaW1wbGljaXQpIHt2YXIgbXNnID0gYHByb2dyYW0gZXhpdGVkICh3aXRoIHN0YXR1czogJHtzdGF0dXN9KSwgYnV0IGtlZXBSdW50aW1lQWxpdmUoKSBpcyBzZXQgKGNvdW50ZXI9JHtydW50aW1lS2VlcGFsaXZlQ291bnRlcn0pIGR1ZSB0byBhbiBhc3luYyBvcGVyYXRpb24sIHNvIGhhbHRpbmcgZXhlY3V0aW9uIGJ1dCBub3QgZXhpdGluZyB0aGUgcnVudGltZSBvciBwcmV2ZW50aW5nIGZ1cnRoZXIgYXN5bmMgZXhlY3V0aW9uICh5b3UgY2FuIHVzZSBlbXNjcmlwdGVuX2ZvcmNlX2V4aXQsIGlmIHlvdSB3YW50IHRvIGZvcmNlIGEgdHJ1ZSBzaHV0ZG93bilgO3JlYWR5UHJvbWlzZVJlamVjdChtc2cpO2Vycihtc2cpO31fcHJvY19leGl0KHN0YXR1cyk7fTt2YXIgX2V4aXQgPSBleGl0SlM7dmFyIF9mZF9jbG9zZSA9IGZkID0+IHthYm9ydCgiZmRfY2xvc2UgY2FsbGVkIHdpdGhvdXQgU1lTQ0FMTFNfUkVRVUlSRV9GSUxFU1lTVEVNIik7fTtmdW5jdGlvbiBfZmRfcmVhZChmZCwgaW92LCBpb3ZjbnQsIHBudW0pIHtpb3YgPj4+PSAwO2lvdmNudCA+Pj49IDA7cG51bSA+Pj49IDA7YWJvcnQoImZkX3JlYWQgY2FsbGVkIHdpdGhvdXQgU1lTQ0FMTFNfUkVRVUlSRV9GSUxFU1lTVEVNIik7fWZ1bmN0aW9uIF9mZF9zZWVrKGZkLCBvZmZzZXRfbG93LCBvZmZzZXRfaGlnaCwgd2hlbmNlLCBuZXdPZmZzZXQpIHt2YXIgb2Zmc2V0ID0gY29udmVydEkzMlBhaXJUb0k1M0NoZWNrZWQob2Zmc2V0X2xvdywgb2Zmc2V0X2hpZ2gpO25ld09mZnNldCA+Pj49IDA7cmV0dXJuIDcwO312YXIgcHJpbnRDaGFyQnVmZmVycyA9IFsgbnVsbCwgW10sIFtdIF07dmFyIHByaW50Q2hhciA9IChzdHJlYW0sIGN1cnIpID0+IHt2YXIgYnVmZmVyID0gcHJpbnRDaGFyQnVmZmVyc1tzdHJlYW1dO2Fzc2VydChidWZmZXIpO2lmIChjdXJyID09PSAwIHx8IGN1cnIgPT09IDEwKSB7KHN0cmVhbSA9PT0gMSA/IG91dCA6IGVycikoVVRGOEFycmF5VG9TdHJpbmcoYnVmZmVyLCAwKSk7YnVmZmVyLmxlbmd0aCA9IDA7fSBlbHNlIHtidWZmZXIucHVzaChjdXJyKTt9fTt2YXIgZmx1c2hfTk9fRklMRVNZU1RFTSA9ICgpID0+IHtfZmZsdXNoKDApO2lmIChwcmludENoYXJCdWZmZXJzWzFdLmxlbmd0aCkgcHJpbnRDaGFyKDEsIDEwKTtpZiAocHJpbnRDaGFyQnVmZmVyc1syXS5sZW5ndGgpIHByaW50Q2hhcigyLCAxMCk7fTtmdW5jdGlvbiBfZmRfd3JpdGUoZmQsIGlvdiwgaW92Y250LCBwbnVtKSB7aW92ID4+Pj0gMDtpb3ZjbnQgPj4+PSAwO3BudW0gPj4+PSAwO3ZhciBudW0gPSAwO2ZvciAodmFyIGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHt2YXIgcHRyID0gSEVBUFUzMlsoKGlvdikgPj4+IDIpID4+PiAwXTt2YXIgbGVuID0gSEVBUFUzMlsoKChpb3YpICsgKDQpKSA+Pj4gMikgPj4+IDBdO2lvdiArPSA4O2ZvciAodmFyIGogPSAwOyBqIDwgbGVuOyBqKyspIHtwcmludENoYXIoZmQsIEhFQVBVOFtwdHIgKyBqID4+PiAwXSk7fW51bSArPSBsZW47fUhFQVBVMzJbKChwbnVtKSA+Pj4gMikgPj4+IDBdID0gbnVtO3JldHVybiAwO31mdW5jdGlvbiBfbGx2bV9laF90eXBlaWRfZm9yKHR5cGUpIHt0eXBlID4+Pj0gMDtyZXR1cm4gdHlwZTt9dmFyIGlzTGVhcFllYXIgPSB5ZWFyID0+IHllYXIgJSA0ID09PSAwICYmICh5ZWFyICUgMTAwICE9PSAwIHx8IHllYXIgJSA0MDAgPT09IDApO3ZhciBhcnJheVN1bSA9IChhcnJheSwgaW5kZXgpID0+IHt2YXIgc3VtID0gMDtmb3IgKHZhciBpID0gMDsgaSA8PSBpbmRleDsgc3VtICs9IGFycmF5W2krK10pIHt9cmV0dXJuIHN1bTt9O3ZhciBNT05USF9EQVlTX0xFQVAgPSBbIDMxLCAyOSwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEgXTt2YXIgTU9OVEhfREFZU19SRUdVTEFSID0gWyAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxIF07dmFyIGFkZERheXMgPSAoZGF0ZSwgZGF5cykgPT4ge3ZhciBuZXdEYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO3doaWxlIChkYXlzID4gMCkge3ZhciBsZWFwID0gaXNMZWFwWWVhcihuZXdEYXRlLmdldEZ1bGxZZWFyKCkpO3ZhciBjdXJyZW50TW9udGggPSBuZXdEYXRlLmdldE1vbnRoKCk7dmFyIGRheXNJbkN1cnJlbnRNb250aCA9IChsZWFwID8gTU9OVEhfREFZU19MRUFQIDogTU9OVEhfREFZU19SRUdVTEFSKVtjdXJyZW50TW9udGhdO2lmIChkYXlzID4gZGF5c0luQ3VycmVudE1vbnRoIC0gbmV3RGF0ZS5nZXREYXRlKCkpIHtkYXlzIC09IChkYXlzSW5DdXJyZW50TW9udGggLSBuZXdEYXRlLmdldERhdGUoKSArIDEpO25ld0RhdGUuc2V0RGF0ZSgxKTtpZiAoY3VycmVudE1vbnRoIDwgMTEpIHtuZXdEYXRlLnNldE1vbnRoKGN1cnJlbnRNb250aCArIDEpO30gZWxzZSB7bmV3RGF0ZS5zZXRNb250aCgwKTtuZXdEYXRlLnNldEZ1bGxZZWFyKG5ld0RhdGUuZ2V0RnVsbFllYXIoKSArIDEpO319IGVsc2Uge25ld0RhdGUuc2V0RGF0ZShuZXdEYXRlLmdldERhdGUoKSArIGRheXMpO3JldHVybiBuZXdEYXRlO319cmV0dXJuIG5ld0RhdGU7fTsvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgYm9vbGVhbj0sIG51bWJlcj0pfSAqLyBmdW5jdGlvbiBpbnRBcnJheUZyb21TdHJpbmcoc3RyaW5neSwgZG9udEFkZE51bGwsIGxlbmd0aCkge3ZhciBsZW4gPSBsZW5ndGggPiAwID8gbGVuZ3RoIDogbGVuZ3RoQnl0ZXNVVEY4KHN0cmluZ3kpICsgMTt2YXIgdThhcnJheSA9IG5ldyBBcnJheShsZW4pO3ZhciBudW1CeXRlc1dyaXR0ZW4gPSBzdHJpbmdUb1VURjhBcnJheShzdHJpbmd5LCB1OGFycmF5LCAwLCB1OGFycmF5Lmxlbmd0aCk7aWYgKGRvbnRBZGROdWxsKSB1OGFycmF5Lmxlbmd0aCA9IG51bUJ5dGVzV3JpdHRlbjtyZXR1cm4gdThhcnJheTt9dmFyIHdyaXRlQXJyYXlUb01lbW9yeSA9IChhcnJheSwgYnVmZmVyKSA9PiB7YXNzZXJ0KGFycmF5Lmxlbmd0aCA+PSAwLCAid3JpdGVBcnJheVRvTWVtb3J5IGFycmF5IG11c3QgaGF2ZSBhIGxlbmd0aCAoc2hvdWxkIGJlIGFuIGFycmF5IG9yIHR5cGVkIGFycmF5KSIpO0hFQVA4LnNldChhcnJheSwgYnVmZmVyID4+PiAwKTt9O2Z1bmN0aW9uIF9zdHJmdGltZShzLCBtYXhzaXplLCBmb3JtYXQsIHRtKSB7cyA+Pj49IDA7bWF4c2l6ZSA+Pj49IDA7Zm9ybWF0ID4+Pj0gMDt0bSA+Pj49IDA7dmFyIHRtX3pvbmUgPSBIRUFQVTMyWygoKHRtKSArICg0MCkpID4+PiAyKSA+Pj4gMF07dmFyIGRhdGUgPSB7dG1fc2VjOiBIRUFQMzJbKCh0bSkgPj4+IDIpID4+PiAwXSx0bV9taW46IEhFQVAzMlsoKCh0bSkgKyAoNCkpID4+PiAyKSA+Pj4gMF0sdG1faG91cjogSEVBUDMyWygoKHRtKSArICg4KSkgPj4+IDIpID4+PiAwXSx0bV9tZGF5OiBIRUFQMzJbKCgodG0pICsgKDEyKSkgPj4+IDIpID4+PiAwXSx0bV9tb246IEhFQVAzMlsoKCh0bSkgKyAoMTYpKSA+Pj4gMikgPj4+IDBdLHRtX3llYXI6IEhFQVAzMlsoKCh0bSkgKyAoMjApKSA+Pj4gMikgPj4+IDBdLHRtX3dkYXk6IEhFQVAzMlsoKCh0bSkgKyAoMjQpKSA+Pj4gMikgPj4+IDBdLHRtX3lkYXk6IEhFQVAzMlsoKCh0bSkgKyAoMjgpKSA+Pj4gMikgPj4+IDBdLHRtX2lzZHN0OiBIRUFQMzJbKCgodG0pICsgKDMyKSkgPj4+IDIpID4+PiAwXSx0bV9nbXRvZmY6IEhFQVAzMlsoKCh0bSkgKyAoMzYpKSA+Pj4gMikgPj4+IDBdLHRtX3pvbmU6IHRtX3pvbmUgPyBVVEY4VG9TdHJpbmcodG1fem9uZSkgOiAiIn07dmFyIHBhdHRlcm4gPSBVVEY4VG9TdHJpbmcoZm9ybWF0KTt2YXIgRVhQQU5TSU9OX1JVTEVTXzEgPSB7IiVjIjogIiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiAiJW0vJWQvJXkiLCIlRiI6ICIlWS0lbS0lZCIsIiVoIjogIiViIiwiJXIiOiAiJUk6JU06JVMgJXAiLCIlUiI6ICIlSDolTSIsIiVUIjogIiVIOiVNOiVTIiwiJXgiOiAiJW0vJWQvJXkiLCIlWCI6ICIlSDolTTolUyIsIiVFYyI6ICIlYyIsIiVFQyI6ICIlQyIsIiVFeCI6ICIlbS8lZC8leSIsIiVFWCI6ICIlSDolTTolUyIsIiVFeSI6ICIleSIsIiVFWSI6ICIlWSIsIiVPZCI6ICIlZCIsIiVPZSI6ICIlZSIsIiVPSCI6ICIlSCIsIiVPSSI6ICIlSSIsIiVPbSI6ICIlbSIsIiVPTSI6ICIlTSIsIiVPUyI6ICIlUyIsIiVPdSI6ICIldSIsIiVPVSI6ICIlVSIsIiVPViI6ICIlViIsIiVPdyI6ICIldyIsIiVPVyI6ICIlVyIsIiVPeSI6ICIleSJ9O2ZvciAodmFyIHJ1bGUgaW4gRVhQQU5TSU9OX1JVTEVTXzEpIHtwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKG5ldyBSZWdFeHAocnVsZSwgImciKSwgRVhQQU5TSU9OX1JVTEVTXzFbcnVsZV0pO312YXIgV0VFS0RBWVMgPSBbICJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSIgXTt2YXIgTU9OVEhTID0gWyAiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciIgXTtmdW5jdGlvbiBsZWFkaW5nU29tZXRoaW5nKHZhbHVlLCBkaWdpdHMsIGNoYXJhY3Rlcikge3ZhciBzdHIgPSB0eXBlb2YgdmFsdWUgPT0gIm51bWJlciIgPyB2YWx1ZS50b1N0cmluZygpIDogKHZhbHVlIHx8ICIiKTt3aGlsZSAoc3RyLmxlbmd0aCA8IGRpZ2l0cykge3N0ciA9IGNoYXJhY3RlclswXSArIHN0cjt9cmV0dXJuIHN0cjt9ZnVuY3Rpb24gbGVhZGluZ051bGxzKHZhbHVlLCBkaWdpdHMpIHtyZXR1cm4gbGVhZGluZ1NvbWV0aGluZyh2YWx1ZSwgZGlnaXRzLCAiMCIpO31mdW5jdGlvbiBjb21wYXJlQnlEYXkoZGF0ZTEsIGRhdGUyKSB7ZnVuY3Rpb24gc2duKHZhbHVlKSB7cmV0dXJuIHZhbHVlIDwgMCA/IC0xIDogKHZhbHVlID4gMCA/IDEgOiAwKTt9dmFyIGNvbXBhcmU7aWYgKChjb21wYXJlID0gc2duKGRhdGUxLmdldEZ1bGxZZWFyKCkgLSBkYXRlMi5nZXRGdWxsWWVhcigpKSkgPT09IDApIHtpZiAoKGNvbXBhcmUgPSBzZ24oZGF0ZTEuZ2V0TW9udGgoKSAtIGRhdGUyLmdldE1vbnRoKCkpKSA9PT0gMCkge2NvbXBhcmUgPSBzZ24oZGF0ZTEuZ2V0RGF0ZSgpIC0gZGF0ZTIuZ2V0RGF0ZSgpKTt9fXJldHVybiBjb21wYXJlO31mdW5jdGlvbiBnZXRGaXJzdFdlZWtTdGFydERhdGUoamFuRm91cnRoKSB7c3dpdGNoIChqYW5Gb3VydGguZ2V0RGF5KCkpIHtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKGphbkZvdXJ0aC5nZXRGdWxsWWVhcigpIC0gMSwgMTEsIDI5KTtjYXNlIDE6cmV0dXJuIGphbkZvdXJ0aDtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKGphbkZvdXJ0aC5nZXRGdWxsWWVhcigpLCAwLCAzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKGphbkZvdXJ0aC5nZXRGdWxsWWVhcigpLCAwLCAyKTtjYXNlIDQ6cmV0dXJuIG5ldyBEYXRlKGphbkZvdXJ0aC5nZXRGdWxsWWVhcigpLCAwLCAxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKGphbkZvdXJ0aC5nZXRGdWxsWWVhcigpIC0gMSwgMTEsIDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGphbkZvdXJ0aC5nZXRGdWxsWWVhcigpIC0gMSwgMTEsIDMwKTt9fWZ1bmN0aW9uIGdldFdlZWtCYXNlZFllYXIoZGF0ZSkge3ZhciB0aGlzRGF0ZSA9IGFkZERheXMobmV3IERhdGUoZGF0ZS50bV95ZWFyICsgMTkwMCwgMCwgMSksIGRhdGUudG1feWRheSk7dmFyIGphbkZvdXJ0aFRoaXNZZWFyID0gbmV3IERhdGUodGhpc0RhdGUuZ2V0RnVsbFllYXIoKSwgMCwgNCk7dmFyIGphbkZvdXJ0aE5leHRZZWFyID0gbmV3IERhdGUodGhpc0RhdGUuZ2V0RnVsbFllYXIoKSArIDEsIDAsIDQpO3ZhciBmaXJzdFdlZWtTdGFydFRoaXNZZWFyID0gZ2V0Rmlyc3RXZWVrU3RhcnREYXRlKGphbkZvdXJ0aFRoaXNZZWFyKTt2YXIgZmlyc3RXZWVrU3RhcnROZXh0WWVhciA9IGdldEZpcnN0V2Vla1N0YXJ0RGF0ZShqYW5Gb3VydGhOZXh0WWVhcik7aWYgKGNvbXBhcmVCeURheShmaXJzdFdlZWtTdGFydFRoaXNZZWFyLCB0aGlzRGF0ZSkgPD0gMCkge2lmIChjb21wYXJlQnlEYXkoZmlyc3RXZWVrU3RhcnROZXh0WWVhciwgdGhpc0RhdGUpIDw9IDApIHtyZXR1cm4gdGhpc0RhdGUuZ2V0RnVsbFllYXIoKSArIDE7fXJldHVybiB0aGlzRGF0ZS5nZXRGdWxsWWVhcigpO31yZXR1cm4gdGhpc0RhdGUuZ2V0RnVsbFllYXIoKSAtIDE7fXZhciBFWFBBTlNJT05fUlVMRVNfMiA9IHsiJWEiOiBkYXRlID0+IFdFRUtEQVlTW2RhdGUudG1fd2RheV0uc3Vic3RyaW5nKDAsIDMpLCIlQSI6IGRhdGUgPT4gV0VFS0RBWVNbZGF0ZS50bV93ZGF5XSwiJWIiOiBkYXRlID0+IE1PTlRIU1tkYXRlLnRtX21vbl0uc3Vic3RyaW5nKDAsIDMpLCIlQiI6IGRhdGUgPT4gTU9OVEhTW2RhdGUudG1fbW9uXSwiJUMiOiBkYXRlID0+IHt2YXIgeWVhciA9IGRhdGUudG1feWVhciArIDE5MDA7cmV0dXJuIGxlYWRpbmdOdWxscygoeWVhciAvIDEwMCkgfCAwLCAyKTt9LCIlZCI6IGRhdGUgPT4gbGVhZGluZ051bGxzKGRhdGUudG1fbWRheSwgMiksIiVlIjogZGF0ZSA9PiBsZWFkaW5nU29tZXRoaW5nKGRhdGUudG1fbWRheSwgMiwgIiAiKSwiJWciOiBkYXRlID0+IGdldFdlZWtCYXNlZFllYXIoZGF0ZSkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVHIjogZGF0ZSA9PiBnZXRXZWVrQmFzZWRZZWFyKGRhdGUpLCIlSCI6IGRhdGUgPT4gbGVhZGluZ051bGxzKGRhdGUudG1faG91ciwgMiksIiVJIjogZGF0ZSA9PiB7dmFyIHR3ZWx2ZUhvdXIgPSBkYXRlLnRtX2hvdXI7aWYgKHR3ZWx2ZUhvdXIgPT0gMCkgdHdlbHZlSG91ciA9IDEyOyBlbHNlIGlmICh0d2VsdmVIb3VyID4gMTIpIHR3ZWx2ZUhvdXIgLT0gMTI7cmV0dXJuIGxlYWRpbmdOdWxscyh0d2VsdmVIb3VyLCAyKTt9LCIlaiI6IGRhdGUgPT4gbGVhZGluZ051bGxzKGRhdGUudG1fbWRheSArIGFycmF5U3VtKGlzTGVhcFllYXIoZGF0ZS50bV95ZWFyICsgMTkwMCkgPyBNT05USF9EQVlTX0xFQVAgOiBNT05USF9EQVlTX1JFR1VMQVIsIGRhdGUudG1fbW9uIC0gMSksIDMpLCIlbSI6IGRhdGUgPT4gbGVhZGluZ051bGxzKGRhdGUudG1fbW9uICsgMSwgMiksIiVNIjogZGF0ZSA9PiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9taW4sIDIpLCIlbiI6ICgpID0+ICJcbiIsIiVwIjogZGF0ZSA9PiB7aWYgKGRhdGUudG1faG91ciA+PSAwICYmIGRhdGUudG1faG91ciA8IDEyKSB7cmV0dXJuICJBTSI7fXJldHVybiAiUE0iO30sIiVTIjogZGF0ZSA9PiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9zZWMsIDIpLCIldCI6ICgpID0+ICJcdCIsIiV1IjogZGF0ZSA9PiBkYXRlLnRtX3dkYXkgfHwgNywiJVUiOiBkYXRlID0+IHt2YXIgZGF5cyA9IGRhdGUudG1feWRheSArIDcgLSBkYXRlLnRtX3dkYXk7cmV0dXJuIGxlYWRpbmdOdWxscyhNYXRoLmZsb29yKGRheXMgLyA3KSwgMik7fSwiJVYiOiBkYXRlID0+IHt2YXIgdmFsID0gTWF0aC5mbG9vcigoZGF0ZS50bV95ZGF5ICsgNyAtIChkYXRlLnRtX3dkYXkgKyA2KSAlIDcpIC8gNyk7aWYgKChkYXRlLnRtX3dkYXkgKyAzNzEgLSBkYXRlLnRtX3lkYXkgLSAyKSAlIDcgPD0gMikge3ZhbCsrO31pZiAoIXZhbCkge3ZhbCA9IDUyO3ZhciBkZWMzMSA9IChkYXRlLnRtX3dkYXkgKyA3IC0gZGF0ZS50bV95ZGF5IC0gMSkgJSA3O2lmIChkZWMzMSA9PSA0IHx8IChkZWMzMSA9PSA1ICYmIGlzTGVhcFllYXIoZGF0ZS50bV95ZWFyICUgNDAwIC0gMSkpKSB7dmFsKys7fX0gZWxzZSBpZiAodmFsID09IDUzKSB7dmFyIGphbjEgPSAoZGF0ZS50bV93ZGF5ICsgMzcxIC0gZGF0ZS50bV95ZGF5KSAlIDc7aWYgKGphbjEgIT0gNCAmJiAoamFuMSAhPSAzIHx8ICFpc0xlYXBZZWFyKGRhdGUudG1feWVhcikpKSB2YWwgPSAxO31yZXR1cm4gbGVhZGluZ051bGxzKHZhbCwgMik7fSwiJXciOiBkYXRlID0+IGRhdGUudG1fd2RheSwiJVciOiBkYXRlID0+IHt2YXIgZGF5cyA9IGRhdGUudG1feWRheSArIDcgLSAoKGRhdGUudG1fd2RheSArIDYpICUgNyk7cmV0dXJuIGxlYWRpbmdOdWxscyhNYXRoLmZsb29yKGRheXMgLyA3KSwgMik7fSwiJXkiOiBkYXRlID0+IChkYXRlLnRtX3llYXIgKyAxOTAwKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJVkiOiBkYXRlID0+IGRhdGUudG1feWVhciArIDE5MDAsIiV6IjogZGF0ZSA9PiB7dmFyIG9mZiA9IGRhdGUudG1fZ210b2ZmO3ZhciBhaGVhZCA9IG9mZiA+PSAwO29mZiA9IE1hdGguYWJzKG9mZikgLyA2MDtvZmYgPSAob2ZmIC8gNjApICogMTAwICsgKG9mZiAlIDYwKTtyZXR1cm4gKGFoZWFkID8gIisiIDogIi0iKSArIFN0cmluZygiMDAwMCIgKyBvZmYpLnNsaWNlKC00KTt9LCIlWiI6IGRhdGUgPT4gZGF0ZS50bV96b25lLCIlJSI6ICgpID0+ICIlIn07cGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSgvJSUvZywgIlwwXDAiKTtmb3IgKHZhciBydWxlIGluIEVYUEFOU0lPTl9SVUxFU18yKSB7aWYgKHBhdHRlcm4uaW5jbHVkZXMocnVsZSkpIHtwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKG5ldyBSZWdFeHAocnVsZSwgImciKSwgRVhQQU5TSU9OX1JVTEVTXzJbcnVsZV0oZGF0ZSkpO319cGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSgvXDBcMC9nLCAiJSIpO3ZhciBieXRlcyA9IGludEFycmF5RnJvbVN0cmluZyhwYXR0ZXJuLCBmYWxzZSk7aWYgKGJ5dGVzLmxlbmd0aCA+IG1heHNpemUpIHtyZXR1cm4gMDt9d3JpdGVBcnJheVRvTWVtb3J5KGJ5dGVzLCBzKTtyZXR1cm4gYnl0ZXMubGVuZ3RoIC0gMTt9ZnVuY3Rpb24gX3N0cmZ0aW1lX2wocywgbWF4c2l6ZSwgZm9ybWF0LCB0bSwgbG9jKSB7cyA+Pj49IDA7bWF4c2l6ZSA+Pj49IDA7Zm9ybWF0ID4+Pj0gMDt0bSA+Pj49IDA7bG9jID4+Pj0gMDtyZXR1cm4gX3N0cmZ0aW1lKHMsIG1heHNpemUsIGZvcm1hdCwgdG0pO312YXIgd2FzbVRhYmxlTWlycm9yID0gW107dmFyIHdhc21UYWJsZTt2YXIgZ2V0V2FzbVRhYmxlRW50cnkgPSBmdW5jUHRyID0+IHt2YXIgZnVuYyA9IHdhc21UYWJsZU1pcnJvcltmdW5jUHRyXTtpZiAoIWZ1bmMpIHtpZiAoZnVuY1B0ciA+PSB3YXNtVGFibGVNaXJyb3IubGVuZ3RoKSB3YXNtVGFibGVNaXJyb3IubGVuZ3RoID0gZnVuY1B0ciArIDE7d2FzbVRhYmxlTWlycm9yW2Z1bmNQdHJdID0gZnVuYyA9IHdhc21UYWJsZS5nZXQoZnVuY1B0cik7fWFzc2VydCh3YXNtVGFibGUuZ2V0KGZ1bmNQdHIpID09IGZ1bmMsICJKYXZhU2NyaXB0LXNpZGUgV2FzbSBmdW5jdGlvbiB0YWJsZSBtaXJyb3IgaXMgb3V0IG9mIGRhdGUhIik7cmV0dXJuIGZ1bmM7fTt2YXIgdWxlYjEyOEVuY29kZSA9IChuLCB0YXJnZXQpID0+IHthc3NlcnQobiA8IDE2Mzg0KTtpZiAobiA8IDEyOCkge3RhcmdldC5wdXNoKG4pO30gZWxzZSB7dGFyZ2V0LnB1c2goKG4gJSAxMjgpIHwgMTI4LCBuID4+IDcpO319O3ZhciBzaWdUb1dhc21UeXBlcyA9IHNpZyA9PiB7YXNzZXJ0KCFzaWcuaW5jbHVkZXMoImoiKSwgImk2NCBub3QgcGVybWl0dGVkIGluIGZ1bmN0aW9uIHNpZ25hdHVyZXMgd2hlbiBXQVNNX0JJR0lOVCBpcyBkaXNhYmxlZCIpO3ZhciB0eXBlTmFtZXMgPSB7ImkiOiAiaTMyIiwiaiI6ICJpNjQiLCJmIjogImYzMiIsImQiOiAiZjY0IiwicCI6ICJpMzIifTt2YXIgdHlwZSA9IHtwYXJhbWV0ZXJzOiBbXSxyZXN1bHRzOiBzaWdbMF0gPT0gInYiID8gW10gOiBbIHR5cGVOYW1lc1tzaWdbMF1dIF19O2ZvciAodmFyIGkgPSAxOyBpIDwgc2lnLmxlbmd0aDsgKytpKSB7YXNzZXJ0KHNpZ1tpXSBpbiB0eXBlTmFtZXMsICJpbnZhbGlkIHNpZ25hdHVyZSBjaGFyOiAiICsgc2lnW2ldKTt0eXBlLnBhcmFtZXRlcnMucHVzaCh0eXBlTmFtZXNbc2lnW2ldXSk7fXJldHVybiB0eXBlO307dmFyIGdlbmVyYXRlRnVuY1R5cGUgPSAoc2lnLCB0YXJnZXQpID0+IHt2YXIgc2lnUmV0ID0gc2lnLnNsaWNlKDAsIDEpO3ZhciBzaWdQYXJhbSA9IHNpZy5zbGljZSgxKTt2YXIgdHlwZUNvZGVzID0geyJpIjogMTI3LCJwIjogMTI3LCJqIjogMTI2LCJmIjogMTI1LCJkIjogMTI0fTt0YXJnZXQucHVzaCg5Nik7LyogZm9ybTogZnVuYyAqLyB1bGViMTI4RW5jb2RlKHNpZ1BhcmFtLmxlbmd0aCwgdGFyZ2V0KTtmb3IgKHZhciBpID0gMDsgaSA8IHNpZ1BhcmFtLmxlbmd0aDsgKytpKSB7YXNzZXJ0KHNpZ1BhcmFtW2ldIGluIHR5cGVDb2RlcywgImludmFsaWQgc2lnbmF0dXJlIGNoYXI6ICIgKyBzaWdQYXJhbVtpXSk7dGFyZ2V0LnB1c2godHlwZUNvZGVzW3NpZ1BhcmFtW2ldXSk7fWlmIChzaWdSZXQgPT0gInYiKSB7dGFyZ2V0LnB1c2goMCk7fSBlbHNlIHt0YXJnZXQucHVzaCgxLCB0eXBlQ29kZXNbc2lnUmV0XSk7fX07dmFyIGNvbnZlcnRKc0Z1bmN0aW9uVG9XYXNtID0gKGZ1bmMsIHNpZykgPT4ge2Fzc2VydCghc2lnLmluY2x1ZGVzKCJqIiksICJpNjQgbm90IHBlcm1pdHRlZCBpbiBmdW5jdGlvbiBzaWduYXR1cmVzIHdoZW4gV0FTTV9CSUdJTlQgaXMgZGlzYWJsZWQiKTtpZiAodHlwZW9mIFdlYkFzc2VtYmx5LkZ1bmN0aW9uID09ICJmdW5jdGlvbiIpIHtyZXR1cm4gbmV3IFdlYkFzc2VtYmx5LkZ1bmN0aW9uKHNpZ1RvV2FzbVR5cGVzKHNpZyksIGZ1bmMpO312YXIgdHlwZVNlY3Rpb25Cb2R5ID0gWyAxIF07Z2VuZXJhdGVGdW5jVHlwZShzaWcsIHR5cGVTZWN0aW9uQm9keSk7dmFyIGJ5dGVzID0gWyAwLCA5NywgMTE1LCAxMDksICAxLCAwLCAwLCAwLCAgMSBdO3VsZWIxMjhFbmNvZGUodHlwZVNlY3Rpb25Cb2R5Lmxlbmd0aCwgYnl0ZXMpO2J5dGVzLnB1c2guYXBwbHkoYnl0ZXMsIHR5cGVTZWN0aW9uQm9keSk7Ynl0ZXMucHVzaCgyLCA3LCAgMSwgMSwgMTAxLCAxLCAxMDIsIDAsIDAsIDcsIDUsICAxLCAxLCAxMDIsIDAsIDApO3ZhciBtb2R1bGUgPSBuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KGJ5dGVzKSk7dmFyIGluc3RhbmNlID0gbmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKG1vZHVsZSwgeyJlIjogeyJmIjogZnVuY319KTt2YXIgd3JhcHBlZEZ1bmMgPSBpbnN0YW5jZS5leHBvcnRzWyJmIl07cmV0dXJuIHdyYXBwZWRGdW5jO307dmFyIHVwZGF0ZVRhYmxlTWFwID0gKG9mZnNldCwgY291bnQpID0+IHtpZiAoZnVuY3Rpb25zSW5UYWJsZU1hcCkge2ZvciAodmFyIGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQgKyBjb3VudDsgaSsrKSB7dmFyIGl0ZW0gPSBnZXRXYXNtVGFibGVFbnRyeShpKTtpZiAoaXRlbSkge2Z1bmN0aW9uc0luVGFibGVNYXAuc2V0KGl0ZW0sIGkpO319fX07dmFyIGZ1bmN0aW9uc0luVGFibGVNYXA7dmFyIGdldEZ1bmN0aW9uQWRkcmVzcyA9IGZ1bmMgPT4ge2lmICghZnVuY3Rpb25zSW5UYWJsZU1hcCkge2Z1bmN0aW9uc0luVGFibGVNYXAgPSBuZXcgV2Vha01hcDt1cGRhdGVUYWJsZU1hcCgwLCB3YXNtVGFibGUubGVuZ3RoKTt9cmV0dXJuIGZ1bmN0aW9uc0luVGFibGVNYXAuZ2V0KGZ1bmMpIHx8IDA7fTt2YXIgZnJlZVRhYmxlSW5kZXhlcyA9IFtdO3ZhciBnZXRFbXB0eVRhYmxlU2xvdCA9ICgpID0+IHtpZiAoZnJlZVRhYmxlSW5kZXhlcy5sZW5ndGgpIHtyZXR1cm4gZnJlZVRhYmxlSW5kZXhlcy5wb3AoKTt9dHJ5IHt3YXNtVGFibGUuZ3JvdygxKTt9IGNhdGNoIChlcnIpIHtpZiAoIShlcnIgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSkge3Rocm93IGVycjt9dGhyb3cgIlVuYWJsZSB0byBncm93IHdhc20gdGFibGUuIFNldCBBTExPV19UQUJMRV9HUk9XVEguIjt9cmV0dXJuIHdhc21UYWJsZS5sZW5ndGggLSAxO307dmFyIHNldFdhc21UYWJsZUVudHJ5ID0gKGlkeCwgZnVuYykgPT4ge3dhc21UYWJsZS5zZXQoaWR4LCBmdW5jKTt3YXNtVGFibGVNaXJyb3JbaWR4XSA9IHdhc21UYWJsZS5nZXQoaWR4KTt9Oy8qKiBAcGFyYW0ge3N0cmluZz19IHNpZyAqLyB2YXIgYWRkRnVuY3Rpb24gPSAoZnVuYywgc2lnKSA9PiB7YXNzZXJ0KHR5cGVvZiBmdW5jICE9ICJ1bmRlZmluZWQiKTt2YXIgcnRuID0gZ2V0RnVuY3Rpb25BZGRyZXNzKGZ1bmMpO2lmIChydG4pIHtyZXR1cm4gcnRuO312YXIgcmV0ID0gZ2V0RW1wdHlUYWJsZVNsb3QoKTt0cnkge3NldFdhc21UYWJsZUVudHJ5KHJldCwgZnVuYyk7fSBjYXRjaCAoZXJyKSB7aWYgKCEoZXJyIGluc3RhbmNlb2YgVHlwZUVycm9yKSkge3Rocm93IGVycjt9YXNzZXJ0KHR5cGVvZiBzaWcgIT0gInVuZGVmaW5lZCIsICJNaXNzaW5nIHNpZ25hdHVyZSBhcmd1bWVudCB0byBhZGRGdW5jdGlvbjogIiArIGZ1bmMpO3ZhciB3cmFwcGVkID0gY29udmVydEpzRnVuY3Rpb25Ub1dhc20oZnVuYywgc2lnKTtzZXRXYXNtVGFibGVFbnRyeShyZXQsIHdyYXBwZWQpO31mdW5jdGlvbnNJblRhYmxlTWFwLnNldChmdW5jLCByZXQpO3JldHVybiByZXQ7fTtmdW5jdGlvbiBjaGVja0luY29taW5nTW9kdWxlQVBJKCkge2lnbm9yZWRNb2R1bGVQcm9wKCJmZXRjaFNldHRpbmdzIik7fXZhciB3YXNtSW1wb3J0cyA9IHsvKiogQGV4cG9ydCAqLyBPU0RfTWVtSW5mb19nZXRNb2R1bGVIZWFwTGVuZ3RoOiBPU0RfTWVtSW5mb19nZXRNb2R1bGVIZWFwTGVuZ3RoLC8qKiBAZXhwb3J0ICovIF9fY3hhX2JlZ2luX2NhdGNoOiBfX19jeGFfYmVnaW5fY2F0Y2gsLyoqIEBleHBvcnQgKi8gX19jeGFfZW5kX2NhdGNoOiBfX19jeGFfZW5kX2NhdGNoLC8qKiBAZXhwb3J0ICovIF9fY3hhX2ZpbmRfbWF0Y2hpbmdfY2F0Y2hfMjogX19fY3hhX2ZpbmRfbWF0Y2hpbmdfY2F0Y2hfMiwvKiogQGV4cG9ydCAqLyBfX2N4YV9maW5kX21hdGNoaW5nX2NhdGNoXzM6IF9fX2N4YV9maW5kX21hdGNoaW5nX2NhdGNoXzMsLyoqIEBleHBvcnQgKi8gX19jeGFfZmluZF9tYXRjaGluZ19jYXRjaF80OiBfX19jeGFfZmluZF9tYXRjaGluZ19jYXRjaF80LC8qKiBAZXhwb3J0ICovIF9fY3hhX2ZpbmRfbWF0Y2hpbmdfY2F0Y2hfNTogX19fY3hhX2ZpbmRfbWF0Y2hpbmdfY2F0Y2hfNSwvKiogQGV4cG9ydCAqLyBfX2N4YV9yZXRocm93OiBfX19jeGFfcmV0aHJvdywvKiogQGV4cG9ydCAqLyBfX2N4YV90aHJvdzogX19fY3hhX3Rocm93LC8qKiBAZXhwb3J0ICovIF9fcmVzdW1lRXhjZXB0aW9uOiBfX19yZXN1bWVFeGNlcHRpb24sLyoqIEBleHBvcnQgKi8gX2Vtc2NyaXB0ZW5fZ2V0X25vd19pc19tb25vdG9uaWM6IF9fZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYywvKiogQGV4cG9ydCAqLyBfZW1zY3JpcHRlbl90aHJvd19sb25nam1wOiBfX2Vtc2NyaXB0ZW5fdGhyb3dfbG9uZ2ptcCwvKiogQGV4cG9ydCAqLyBfbW1hcF9qczogX19tbWFwX2pzLC8qKiBAZXhwb3J0ICovIF9tdW5tYXBfanM6IF9fbXVubWFwX2pzLC8qKiBAZXhwb3J0ICovIGFib3J0OiBfYWJvcnQsLyoqIEBleHBvcnQgKi8gZW1zY3JpcHRlbl9kYXRlX25vdzogX2Vtc2NyaXB0ZW5fZGF0ZV9ub3csLyoqIEBleHBvcnQgKi8gZW1zY3JpcHRlbl9nZXRfY2FsbHN0YWNrOiBfZW1zY3JpcHRlbl9nZXRfY2FsbHN0YWNrLC8qKiBAZXhwb3J0ICovIGVtc2NyaXB0ZW5fZ2V0X2hlYXBfbWF4OiBfZW1zY3JpcHRlbl9nZXRfaGVhcF9tYXgsLyoqIEBleHBvcnQgKi8gZW1zY3JpcHRlbl9nZXRfbm93OiBfZW1zY3JpcHRlbl9nZXRfbm93LC8qKiBAZXhwb3J0ICovIGVtc2NyaXB0ZW5fbWVtY3B5X2pzOiBfZW1zY3JpcHRlbl9tZW1jcHlfanMsLyoqIEBleHBvcnQgKi8gZW1zY3JpcHRlbl9yZXNpemVfaGVhcDogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsLyoqIEBleHBvcnQgKi8gZW52aXJvbl9nZXQ6IF9lbnZpcm9uX2dldCwvKiogQGV4cG9ydCAqLyBlbnZpcm9uX3NpemVzX2dldDogX2Vudmlyb25fc2l6ZXNfZ2V0LC8qKiBAZXhwb3J0ICovIGV4aXQ6IF9leGl0LC8qKiBAZXhwb3J0ICovIGZkX2Nsb3NlOiBfZmRfY2xvc2UsLyoqIEBleHBvcnQgKi8gZmRfcmVhZDogX2ZkX3JlYWQsLyoqIEBleHBvcnQgKi8gZmRfc2VlazogX2ZkX3NlZWssLyoqIEBleHBvcnQgKi8gZmRfd3JpdGU6IF9mZF93cml0ZSwvKiogQGV4cG9ydCAqLyBpbnZva2VfZDogaW52b2tlX2QsLyoqIEBleHBvcnQgKi8gaW52b2tlX2RkOiBpbnZva2VfZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2RkZDogaW52b2tlX2RkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfZGRkZDogaW52b2tlX2RkZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2RpOiBpbnZva2VfZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX2RpZDogaW52b2tlX2RpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfZGlkZDogaW52b2tlX2RpZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2RpZGRkOiBpbnZva2VfZGlkZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2RpZGRkZGRpZGk6IGludm9rZV9kaWRkZGRkaWRpLC8qKiBAZXhwb3J0ICovIGludm9rZV9kaWRkZGlkaTogaW52b2tlX2RpZGRkaWRpLC8qKiBAZXhwb3J0ICovIGludm9rZV9kaWRkaTogaW52b2tlX2RpZGRpLC8qKiBAZXhwb3J0ICovIGludm9rZV9kaWRpOiBpbnZva2VfZGlkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfZGlkaWk6IGludm9rZV9kaWRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfZGlpOiBpbnZva2VfZGlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9kaWlkOiBpbnZva2VfZGlpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfZGlpZGQ6IGludm9rZV9kaWlkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfZGlpZGRkOiBpbnZva2VfZGlpZGRkLC8qKiBAZXhwb3J0ICovIGludm9rZV9kaWlkZGk6IGludm9rZV9kaWlkZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX2RpaWRpOiBpbnZva2VfZGlpZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX2RpaWRpaTogaW52b2tlX2RpaWRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfZGlpaTogaW52b2tlX2RpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2RpaWlkOiBpbnZva2VfZGlpaWQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2RpaWlpOiBpbnZva2VfZGlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2RpaWlpaTogaW52b2tlX2RpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfZGlpaWlpaTogaW52b2tlX2RpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2RpaWlpaWlpOiBpbnZva2VfZGlpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2k6IGludm9rZV9pLC8qKiBAZXhwb3J0ICovIGludm9rZV9pZGRkZGlpZDogaW52b2tlX2lkZGRkaWlkLC8qKiBAZXhwb3J0ICovIGludm9rZV9pZGRkaWk6IGludm9rZV9pZGRkaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lkZGlkOiBpbnZva2VfaWRkaWQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lkZGlkZGRkaTogaW52b2tlX2lkZGlkZGRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWRkaWRkaWlpaWk6IGludm9rZV9pZGRpZGRpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWRkaWlpOiBpbnZva2VfaWRkaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9pZGRpaWlpaWk6IGludm9rZV9pZGRpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lkZGlpaWlpaWk6IGludm9rZV9pZGRpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9pZGk6IGludm9rZV9pZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lkaWQ6IGludm9rZV9pZGlkLC8qKiBAZXhwb3J0ICovIGludm9rZV9pZGlpaWRpZGlpOiBpbnZva2VfaWRpaWlkaWRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWRpaWlpaTogaW52b2tlX2lkaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lkaWlpaWlpOiBpbnZva2VfaWRpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpOiBpbnZva2VfaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpZDogaW52b2tlX2lpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlkZDogaW52b2tlX2lpZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpZGRkOiBpbnZva2VfaWlkZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpZGRkZGQ6IGludm9rZV9paWRkZGRkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWRkZGRkZGRkaWlpOiBpbnZva2VfaWlkZGRkZGRkZGlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlkZGRkZGRpaWlpOiBpbnZva2VfaWlkZGRkZGRpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWRkZGRpOiBpbnZva2VfaWlkZGRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlkZGRkaWk6IGludm9rZV9paWRkZGRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlkZGRpOiBpbnZva2VfaWlkZGRpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWRkZGlkZDogaW52b2tlX2lpZGRkaWRkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWRkZGlpaWlpaTogaW52b2tlX2lpZGRkaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWRkZGlpaWlpaWlpaTogaW52b2tlX2lpZGRkaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWRkZGlpaWlpaWlpaWk6IGludm9rZV9paWRkZGlpaWlpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpZGRpOiBpbnZva2VfaWlkZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpZGRpZDogaW52b2tlX2lpZGRpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlkZGlkZGlkaWk6IGludm9rZV9paWRkaWRkaWRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlkZGlpOiBpbnZva2VfaWlkZGlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWRkaWlkOiBpbnZva2VfaWlkZGlpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlkZGlpaWQ6IGludm9rZV9paWRkaWlpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlkZGlpaWlpOiBpbnZva2VfaWlkZGlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWRpOiBpbnZva2VfaWlkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlkaWQ6IGludm9rZV9paWRpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlkaWk6IGludm9rZV9paWRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlkaWlkZGlpZDogaW52b2tlX2lpZGlpZGRpaWQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpZGlpaTogaW52b2tlX2lpZGlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlkaWlpZDogaW52b2tlX2lpZGlpaWQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpZGlpaWRkOiBpbnZva2VfaWlkaWlpZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpZGlpaWk6IGludm9rZV9paWRpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWRpaWlpaWk6IGludm9rZV9paWRpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaTogaW52b2tlX2lpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpZDogaW52b2tlX2lpaWQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWRkOiBpbnZva2VfaWlpZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWRkZGQ6IGludm9rZV9paWlkZGRkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlkZGRkZGQ6IGludm9rZV9paWlkZGRkZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWRkZGRkaWlpOiBpbnZva2VfaWlpZGRkZGRpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWRkZGRpOiBpbnZva2VfaWlpZGRkZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWRkZGRpZDogaW52b2tlX2lpaWRkZGRpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpZGRkZGlpOiBpbnZva2VfaWlpZGRkZGlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlkZGRpOiBpbnZva2VfaWlpZGRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpZGRkaWQ6IGludm9rZV9paWlkZGRpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpZGRkaWlkOiBpbnZva2VfaWlpZGRkaWlkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlkZGk6IGludm9rZV9paWlkZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWRkaWQ6IGludm9rZV9paWlkZGlkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlkZGlkZDogaW52b2tlX2lpaWRkaWRkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlkZGlkZGRkOiBpbnZva2VfaWlpZGRpZGRkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpZGRpaTogaW52b2tlX2lpaWRkaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWRkaWlpaTogaW52b2tlX2lpaWRkaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpZGk6IGludm9rZV9paWlkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpZGlkOiBpbnZva2VfaWlpZGlkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlkaWRpOiBpbnZva2VfaWlpZGlkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpZGlpOiBpbnZva2VfaWlpZGlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlkaWlkOiBpbnZva2VfaWlpZGlpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpZGlpaTogaW52b2tlX2lpaWRpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWRpaWlpaTogaW52b2tlX2lpaWRpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpZGlpaWlpaTogaW52b2tlX2lpaWRpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWk6IGludm9rZV9paWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpZDogaW52b2tlX2lpaWlkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpZGQ6IGludm9rZV9paWlpZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlkZGQ6IGludm9rZV9paWlpZGRkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpZGRkZDogaW52b2tlX2lpaWlkZGRkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpZGRkZGRkOiBpbnZva2VfaWlpaWRkZGRkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWRkZGRkZGRkZGQ6IGludm9rZV9paWlpZGRkZGRkZGRkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWRkZGRkZGk6IGludm9rZV9paWlpZGRkZGRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWRkZGRpZGQ6IGludm9rZV9paWlpZGRkZGlkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWRkZGk6IGludm9rZV9paWlpZGRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWRkaTogaW52b2tlX2lpaWlkZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlkZGlpOiBpbnZva2VfaWlpaWRkaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlkZGlpZGk6IGludm9rZV9paWlpZGRpaWRpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpZGRpaWk6IGludm9rZV9paWlpZGRpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlkZGlpaWk6IGludm9rZV9paWlpZGRpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpZGk6IGludm9rZV9paWlpZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlkaWQ6IGludm9rZV9paWlpZGlkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpZGlpOiBpbnZva2VfaWlpaWRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWRpaWk6IGludm9rZV9paWlpZGlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWRpaWlpaTogaW52b2tlX2lpaWlkaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpOiBpbnZva2VfaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpZDogaW52b2tlX2lpaWlpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWlkZDogaW52b2tlX2lpaWlpZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpZGRkOiBpbnZva2VfaWlpaWlkZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpZGRkZDogaW52b2tlX2lpaWlpZGRkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWlkZGk6IGludm9rZV9paWlpaWRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWlkaTogaW52b2tlX2lpaWlpZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpZGlpOiBpbnZva2VfaWlpaWlkaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpZGlpZGQ6IGludm9rZV9paWlpaWRpaWRkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWRpaWlpaWk6IGludm9rZV9paWlpaWRpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaTogaW52b2tlX2lpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWlpZDogaW52b2tlX2lpaWlpaWQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWRkOiBpbnZva2VfaWlpaWlpZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWRkaWRkaWlpOiBpbnZva2VfaWlpaWlpZGRpZGRpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWRkaWlpaWk6IGludm9rZV9paWlpaWlkZGlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlkaWlpZGQ6IGludm9rZV9paWlpaWlkaWlpZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWRpaWlpaTogaW52b2tlX2lpaWlpaWRpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWlpaTogaW52b2tlX2lpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWlkOiBpbnZva2VfaWlpaWlpaWQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWlkZGRpaWRkaTogaW52b2tlX2lpaWlpaWlkZGRpaWRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWlpaWRkaTogaW52b2tlX2lpaWlpaWlkZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWlpOiBpbnZva2VfaWlpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWlpZGQ6IGludm9rZV9paWlpaWlpaWRkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlpaWRkZGRkZGRkZGlpZGRpaTogaW52b2tlX2lpaWlpaWlpZGRkZGRkZGRkaWlkZGlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlpaWRkZGRkZGRpaWk6IGludm9rZV9paWlpaWlpaWRkZGRkZGRpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWlpZGRpOiBpbnZva2VfaWlpaWlpaWlkZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWlpZGRpaWlpOiBpbnZva2VfaWlpaWlpaWlkZGlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWlpZGRpaWlpaTogaW52b2tlX2lpaWlpaWlpZGRpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWlpaWlkaWk6IGludm9rZV9paWlpaWlpaWRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWlpaWlpOiBpbnZva2VfaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlpaWlkOiBpbnZva2VfaWlpaWlpaWlpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWlpaWlpZGRkZGlpOiBpbnZva2VfaWlpaWlpaWlpZGRkZGlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlpaWlkaTogaW52b2tlX2lpaWlpaWlpaWRpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlpaWlpOiBpbnZva2VfaWlpaWlpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWlpaWlpaWRkaWRkOiBpbnZva2VfaWlpaWlpaWlpaWRkaWRkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlpaWlpaTogaW52b2tlX2lpaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlpaWlpaWRkZGRpaWlpaWlpaWlpOiBpbnZva2VfaWlpaWlpaWlpaWlkZGRkaWlpaWlpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWlpaWlpaWlkaTogaW52b2tlX2lpaWlpaWlpaWlpZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWlpaWlpaTogaW52b2tlX2lpaWlpaWlpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWlpaWlpaWlpZDogaW52b2tlX2lpaWlpaWlpaWlpaWQsLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWlpaWlpaWk6IGludm9rZV9paWlpaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlpaWlpaWlpZDogaW52b2tlX2lpaWlpaWlpaWlpaWlkLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlpaWlpaWlpaTogaW52b2tlX2lpaWlpaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlpaWlpaWlpaWk6IGludm9rZV9paWlpaWlpaWlpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX2lpaWlpaWlpaWlpaWlpaWk6IGludm9rZV9paWlpaWlpaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlpaWlpaWlpaWlpaTogaW52b2tlX2lpaWlpaWlpaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlpaWlpaWlpaWlpaWlpaTogaW52b2tlX2lpaWlpaWlpaWlpaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV9paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpOiBpbnZva2VfaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpOiBpbnZva2VfaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92OiBpbnZva2VfdiwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmRkZGRpaWlpaWlpaWlpaWk6IGludm9rZV92ZGRkZGlpaWlpaWlpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmRkZGlpOiBpbnZva2VfdmRkZGlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92ZGRkaWlpOiBpbnZva2VfdmRkZGlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmRkZGlpaWk6IGludm9rZV92ZGRkaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmRkZGlpaWlpaWlpaTogaW52b2tlX3ZkZGRpaWlpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZkZGk6IGludm9rZV92ZGRpLC8qKiBAZXhwb3J0ICovIGludm9rZV92ZGRpaTogaW52b2tlX3ZkZGlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92ZGRpaWk6IGludm9rZV92ZGRpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZkZGlpaWk6IGludm9rZV92ZGRpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92ZGRpaWlpaWlpOiBpbnZva2VfdmRkaWlpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmRpOiBpbnZva2VfdmRpLC8qKiBAZXhwb3J0ICovIGludm9rZV92ZGlkZGRkaTogaW52b2tlX3ZkaWRkZGRpLC8qKiBAZXhwb3J0ICovIGludm9rZV92ZGlkZGlpOiBpbnZva2VfdmRpZGRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmRpZGRpaWlpOiBpbnZva2VfdmRpZGRpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92ZGlkZGlpaWlpaTogaW52b2tlX3ZkaWRkaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92ZGlkaWk6IGludm9rZV92ZGlkaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZkaWlpOiBpbnZva2VfdmRpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZkaWlpaTogaW52b2tlX3ZkaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmRpaWlpaTogaW52b2tlX3ZkaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZkaWlpaWlpaWk6IGludm9rZV92ZGlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92ZGlpaWlpaWlpaTogaW52b2tlX3ZkaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92ZGlpaWlpaWlpaWk6IGludm9rZV92ZGlpaWlpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZkaWlpaWlpaWlpaWk6IGludm9rZV92ZGlpaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aTogaW52b2tlX3ZpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWQ6IGludm9rZV92aWQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpZGQ6IGludm9rZV92aWRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRkZDogaW52b2tlX3ZpZGRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRkZGQ6IGludm9rZV92aWRkZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpZGRkZGRkOiBpbnZva2VfdmlkZGRkZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpZGRkZGRkZDogaW52b2tlX3ZpZGRkZGRkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlkZGRkZGRkZGRkZGQ6IGludm9rZV92aWRkZGRkZGRkZGRkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlkZGRkZGRkaWk6IGludm9rZV92aWRkZGRkZGRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlkZGRkZGRpaWk6IGludm9rZV92aWRkZGRkZGlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlkZGRkZGk6IGludm9rZV92aWRkZGRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlkZGRkaTogaW52b2tlX3ZpZGRkZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpZGRkZGlpOiBpbnZva2VfdmlkZGRkaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpZGRkZGlpaWk6IGludm9rZV92aWRkZGRpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRkZGk6IGludm9rZV92aWRkZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpZGRkaWRkZGRkZDogaW52b2tlX3ZpZGRkaWRkZGRkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlkZGRpaTogaW52b2tlX3ZpZGRkaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpZGRkaWlpZGk6IGludm9rZV92aWRkZGlpaWRpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRkaTogaW52b2tlX3ZpZGRpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRkaWQ6IGludm9rZV92aWRkaWQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpZGRpZGQ6IGludm9rZV92aWRkaWRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRkaWRkZGlpaWk6IGludm9rZV92aWRkaWRkZGlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpZGRpaTogaW52b2tlX3ZpZGRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlkZGlpaTogaW52b2tlX3ZpZGRpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpZGRpaWlpaWk6IGludm9rZV92aWRkaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRkaWlpaWlpaWlpaTogaW52b2tlX3ZpZGRpaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRpOiBpbnZva2VfdmlkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlkaWQ6IGludm9rZV92aWRpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlkaWRkOiBpbnZva2VfdmlkaWRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRpZGRpOiBpbnZva2VfdmlkaWRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlkaWRpOiBpbnZva2VfdmlkaWRpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRpaTogaW52b2tlX3ZpZGlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRpaWRkZGRpaTogaW52b2tlX3ZpZGlpZGRkZGlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRpaWRpaTogaW52b2tlX3ZpZGlpZGlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRpaWk6IGludm9rZV92aWRpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpZGlpaWRpOiBpbnZva2VfdmlkaWlpZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpZGlpaWk6IGludm9rZV92aWRpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRpaWlpaWRkOiBpbnZva2VfdmlkaWlpaWlkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlkaWlpaWlpOiBpbnZva2VfdmlkaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWRpaWlpaWlpaWlpaTogaW52b2tlX3ZpZGlpaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWk6IGludm9rZV92aWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWQ6IGludm9rZV92aWlkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlkZDogaW52b2tlX3ZpaWRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlkZGQ6IGludm9rZV92aWlkZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWRkZGQ6IGludm9rZV92aWlkZGRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlkZGRkZDogaW52b2tlX3ZpaWRkZGRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlkZGRkZGQ6IGludm9rZV92aWlkZGRkZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWRkZGRkZGRkOiBpbnZva2VfdmlpZGRkZGRkZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWRkZGRkZGRpaWlpOiBpbnZva2VfdmlpZGRkZGRkZGlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWRkZGRkaTogaW52b2tlX3ZpaWRkZGRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpZGRkZGk6IGludm9rZV92aWlkZGRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpZGRkZGlkZDogaW52b2tlX3ZpaWRkZGRpZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWRkZGRpaWk6IGludm9rZV92aWlkZGRkaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlkZGRpOiBpbnZva2VfdmlpZGRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpZGRkaWk6IGludm9rZV92aWlkZGRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpZGRpOiBpbnZva2VfdmlpZGRpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlkZGlkZDogaW52b2tlX3ZpaWRkaWRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlkZGlpOiBpbnZva2VfdmlpZGRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpZGRpaWk6IGludm9rZV92aWlkZGlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpZGRpaWlpOiBpbnZva2VfdmlpZGRpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlkZGlpaWlpaTogaW52b2tlX3ZpaWRkaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlkZGlpaWlpaWlpOiBpbnZva2VfdmlpZGRpaWlpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpZGk6IGludm9rZV92aWlkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpZGlkOiBpbnZva2VfdmlpZGlkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlkaWRkOiBpbnZva2VfdmlpZGlkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpZGlkZGk6IGludm9rZV92aWlkaWRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpZGlkaTogaW52b2tlX3ZpaWRpZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWRpaTogaW52b2tlX3ZpaWRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpZGlpaTogaW52b2tlX3ZpaWRpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWRpaWlkOiBpbnZva2VfdmlpZGlpaWQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWRpaWlpaTogaW52b2tlX3ZpaWRpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpZGlpaWlpaTogaW52b2tlX3ZpaWRpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWk6IGludm9rZV92aWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpZDogaW52b2tlX3ZpaWlkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpZGQ6IGludm9rZV92aWlpZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlkZGQ6IGludm9rZV92aWlpZGRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpZGRkZDogaW52b2tlX3ZpaWlkZGRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpZGRkZGk6IGludm9rZV92aWlpZGRkZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlkZGRpZGk6IGludm9rZV92aWlpZGRkaWRpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpZGRpOiBpbnZva2VfdmlpaWRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWRkaWlpaTogaW52b2tlX3ZpaWlkZGlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlkZGlpaWlpaWlpaWlpaWlpOiBpbnZva2VfdmlpaWRkaWlpaWlpaWlpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlkaTogaW52b2tlX3ZpaWlkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWRpZDogaW52b2tlX3ZpaWlkaWQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlkaWk6IGludm9rZV92aWlpZGlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpZGlpZDogaW52b2tlX3ZpaWlkaWlkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpZGlpaTogaW52b2tlX3ZpaWlkaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpZGlpaWk6IGludm9rZV92aWlpZGlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlkaWlpaWk6IGludm9rZV92aWlpZGlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaTogaW52b2tlX3ZpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWQ6IGludm9rZV92aWlpaWQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlpZGQ6IGludm9rZV92aWlpaWRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWRkZGQ6IGludm9rZV92aWlpaWRkZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlpZGRkZGQ6IGludm9rZV92aWlpaWRkZGRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWRkZGRkZDogaW52b2tlX3ZpaWlpZGRkZGRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWRkZGlpaWlpOiBpbnZva2VfdmlpaWlkZGRpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpOiBpbnZva2VfdmlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlkOiBpbnZva2VfdmlpaWlpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpZGQ6IGludm9rZV92aWlpaWlkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpZGRkOiBpbnZva2VfdmlpaWlpZGRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlkZGRkOiBpbnZva2VfdmlpaWlpZGRkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpZGRkZGk6IGludm9rZV92aWlpaWlkZGRkaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpZGRpOiBpbnZva2VfdmlpaWlpZGRpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlkZGlkZDogaW52b2tlX3ZpaWlpaWRkaWRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlkZGlpaTogaW52b2tlX3ZpaWlpaWRkaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlkZGlpaWk6IGludm9rZV92aWlpaWlkZGlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlpaWRpOiBpbnZva2VfdmlpaWlpZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlpaWk6IGludm9rZV92aWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlpZDogaW52b2tlX3ZpaWlpaWlkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlpZGQ6IGludm9rZV92aWlpaWlpZGQsLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlpaWlkZGRpOiBpbnZva2VfdmlpaWlpaWRkZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlpaWlkZGk6IGludm9rZV92aWlpaWlpZGRpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlpZGRpaWk6IGludm9rZV92aWlpaWlpZGRpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlpaWlkZGlpaWk6IGludm9rZV92aWlpaWlpZGRpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlpZGlpZGlkOiBpbnZva2VfdmlpaWlpaWRpaWRpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpaWk6IGludm9rZV92aWlpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpaWlkZGQ6IGludm9rZV92aWlpaWlpaWRkZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpaWlpOiBpbnZva2VfdmlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlpaWlkOiBpbnZva2VfdmlpaWlpaWlpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpaWlpZGRpOiBpbnZva2VfdmlpaWlpaWlpZGRpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlpaWlpOiBpbnZva2VfdmlpaWlpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpaWlpaWQ6IGludm9rZV92aWlpaWlpaWlpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpaWlpaWRkaTogaW52b2tlX3ZpaWlpaWlpaWlkZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlpaWlpaWlpOiBpbnZva2VfdmlpaWlpaWlpaWksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlpaWlpaWlpZDogaW52b2tlX3ZpaWlpaWlpaWlpZCwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpaWlpaWlpOiBpbnZva2VfdmlpaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlpaWlpaWlkZDogaW52b2tlX3ZpaWlpaWlpaWlpaWRkLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlpaWlpaWlkaTogaW52b2tlX3ZpaWlpaWlpaWlpaWRpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlpaWlpaWlpOiBpbnZva2VfdmlpaWlpaWlpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpaWlpaWlpaWRpOiBpbnZva2VfdmlpaWlpaWlpaWlpaWRpLC8qKiBAZXhwb3J0ICovIGludm9rZV92aWlpaWlpaWlpaWlpZGlpOiBpbnZva2VfdmlpaWlpaWlpaWlpaWRpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpaWlpaWlpaWk6IGludm9rZV92aWlpaWlpaWlpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpaWlpaWlpaWlkaTogaW52b2tlX3ZpaWlpaWlpaWlpaWlpZGksLyoqIEBleHBvcnQgKi8gaW52b2tlX3ZpaWlpaWlpaWlpaWlpaTogaW52b2tlX3ZpaWlpaWlpaWlpaWlpaSwvKiogQGV4cG9ydCAqLyBpbnZva2VfdmlpaWlpaWlpaWlpaWlpaWlpOiBpbnZva2VfdmlpaWlpaWlpaWlpaWlpaWlpLC8qKiBAZXhwb3J0ICovIGxsdm1fZWhfdHlwZWlkX2ZvcjogX2xsdm1fZWhfdHlwZWlkX2ZvciwvKiogQGV4cG9ydCAqLyBzdHJmdGltZV9sOiBfc3RyZnRpbWVfbH07dmFyIHdhc21FeHBvcnRzID0gY3JlYXRlV2FzbSgpO3ZhciBfX193YXNtX2NhbGxfY3RvcnMgPSBjcmVhdGVFeHBvcnRXcmFwcGVyKCJfX3dhc21fY2FsbF9jdG9ycyIpO3ZhciBfZ2V0X2dlb21ldHJ5X3BvaW50X2NvdW50ID0gTW9kdWxlWyJfZ2V0X2dlb21ldHJ5X3BvaW50X2NvdW50Il0gPSBjcmVhdGVFeHBvcnRXcmFwcGVyKCJnZXRfZ2VvbWV0cnlfcG9pbnRfY291bnQiKTt2YXIgX2dldF9nZW9tZXRyeV9wb2ludCA9IE1vZHVsZVsiX2dldF9nZW9tZXRyeV9wb2ludCJdID0gY3JlYXRlRXhwb3J0V3JhcHBlcigiZ2V0X2dlb21ldHJ5X3BvaW50Iik7dmFyIF9nZXRfZ2VvbWV0cnlfZmFjZV9jb3VudCA9IE1vZHVsZVsiX2dldF9nZW9tZXRyeV9mYWNlX2NvdW50Il0gPSBjcmVhdGVFeHBvcnRXcmFwcGVyKCJnZXRfZ2VvbWV0cnlfZmFjZV9jb3VudCIpO3ZhciBfZ2V0X2dlb21ldHJ5X2ZhY2UgPSBNb2R1bGVbIl9nZXRfZ2VvbWV0cnlfZmFjZSJdID0gY3JlYXRlRXhwb3J0V3JhcHBlcigiZ2V0X2dlb21ldHJ5X2ZhY2UiKTt2YXIgX2lzX3BsYW5hciA9IE1vZHVsZVsiX2lzX3BsYW5hciJdID0gY3JlYXRlRXhwb3J0V3JhcHBlcigiaXNfcGxhbmFyIik7dmFyIF9nZXRfZmFjZV9wb2ludF9jb3VudCA9IE1vZHVsZVsiX2dldF9mYWNlX3BvaW50X2NvdW50Il0gPSBjcmVhdGVFeHBvcnRXcmFwcGVyKCJnZXRfZmFjZV9wb2ludF9jb3VudCIpO3ZhciBfZ2V0X2ZhY2VfaW5kaWNlcyA9IE1vZHVsZVsiX2dldF9mYWNlX2luZGljZXMiXSA9IGNyZWF0ZUV4cG9ydFdyYXBwZXIoImdldF9mYWNlX2luZGljZXMiKTt2YXIgX2dldF9mYWNlX25vcm1hbHMgPSBNb2R1bGVbIl9nZXRfZmFjZV9ub3JtYWxzIl0gPSBjcmVhdGVFeHBvcnRXcmFwcGVyKCJnZXRfZmFjZV9ub3JtYWxzIik7dmFyIF9zZXRfbG9nX2Z1bmMgPSBNb2R1bGVbIl9zZXRfbG9nX2Z1bmMiXSA9IGNyZWF0ZUV4cG9ydFdyYXBwZXIoInNldF9sb2dfZnVuYyIpO3ZhciBfbWFrZV9waXBlID0gTW9kdWxlWyJfbWFrZV9waXBlIl0gPSBjcmVhdGVFeHBvcnRXcmFwcGVyKCJtYWtlX3BpcGUiKTt2YXIgX21ha2VfcG9pbnRzX3ByaXNtID0gTW9kdWxlWyJfbWFrZV9wb2ludHNfcHJpc20iXSA9IGNyZWF0ZUV4cG9ydFdyYXBwZXIoIm1ha2VfcG9pbnRzX3ByaXNtIik7dmFyIF9fX2Vycm5vX2xvY2F0aW9uID0gY3JlYXRlRXhwb3J0V3JhcHBlcigiX19lcnJub19sb2NhdGlvbiIpO3ZhciBfZmZsdXNoID0gTW9kdWxlWyJfZmZsdXNoIl0gPSBjcmVhdGVFeHBvcnRXcmFwcGVyKCJmZmx1c2giKTt2YXIgX21hbGxvYyA9IE1vZHVsZVsiX21hbGxvYyJdID0gY3JlYXRlRXhwb3J0V3JhcHBlcigibWFsbG9jIik7dmFyIF9mcmVlID0gTW9kdWxlWyJfZnJlZSJdID0gY3JlYXRlRXhwb3J0V3JhcHBlcigiZnJlZSIpO3ZhciBfc2V0VGhyZXcgPSBjcmVhdGVFeHBvcnRXcmFwcGVyKCJzZXRUaHJldyIpO3ZhciBzZXRUZW1wUmV0MCA9IGNyZWF0ZUV4cG9ydFdyYXBwZXIoInNldFRlbXBSZXQwIik7dmFyIF9lbXNjcmlwdGVuX3N0YWNrX2luaXQgPSAoKSA9PiAoX2Vtc2NyaXB0ZW5fc3RhY2tfaW5pdCA9IHdhc21FeHBvcnRzWyJlbXNjcmlwdGVuX3N0YWNrX2luaXQiXSkoKTt2YXIgX2Vtc2NyaXB0ZW5fc3RhY2tfZ2V0X2ZyZWUgPSAoKSA9PiAoX2Vtc2NyaXB0ZW5fc3RhY2tfZ2V0X2ZyZWUgPSB3YXNtRXhwb3J0c1siZW1zY3JpcHRlbl9zdGFja19nZXRfZnJlZSJdKSgpO3ZhciBfZW1zY3JpcHRlbl9zdGFja19nZXRfYmFzZSA9ICgpID0+IChfZW1zY3JpcHRlbl9zdGFja19nZXRfYmFzZSA9IHdhc21FeHBvcnRzWyJlbXNjcmlwdGVuX3N0YWNrX2dldF9iYXNlIl0pKCk7dmFyIF9lbXNjcmlwdGVuX3N0YWNrX2dldF9lbmQgPSAoKSA9PiAoX2Vtc2NyaXB0ZW5fc3RhY2tfZ2V0X2VuZCA9IHdhc21FeHBvcnRzWyJlbXNjcmlwdGVuX3N0YWNrX2dldF9lbmQiXSkoKTt2YXIgc3RhY2tTYXZlID0gY3JlYXRlRXhwb3J0V3JhcHBlcigic3RhY2tTYXZlIik7dmFyIHN0YWNrUmVzdG9yZSA9IGNyZWF0ZUV4cG9ydFdyYXBwZXIoInN0YWNrUmVzdG9yZSIpO3ZhciBzdGFja0FsbG9jID0gY3JlYXRlRXhwb3J0V3JhcHBlcigic3RhY2tBbGxvYyIpO3ZhciBfZW1zY3JpcHRlbl9zdGFja19nZXRfY3VycmVudCA9ICgpID0+IChfZW1zY3JpcHRlbl9zdGFja19nZXRfY3VycmVudCA9IHdhc21FeHBvcnRzWyJlbXNjcmlwdGVuX3N0YWNrX2dldF9jdXJyZW50Il0pKCk7dmFyIF9fX2N4YV9pbmNyZW1lbnRfZXhjZXB0aW9uX3JlZmNvdW50ID0gY3JlYXRlRXhwb3J0V3JhcHBlcigiX19jeGFfaW5jcmVtZW50X2V4Y2VwdGlvbl9yZWZjb3VudCIpO3ZhciBfX19jeGFfZGVjcmVtZW50X2V4Y2VwdGlvbl9yZWZjb3VudCA9IGNyZWF0ZUV4cG9ydFdyYXBwZXIoIl9fY3hhX2RlY3JlbWVudF9leGNlcHRpb25fcmVmY291bnQiKTt2YXIgX19fY3hhX2Nhbl9jYXRjaCA9IGNyZWF0ZUV4cG9ydFdyYXBwZXIoIl9fY3hhX2Nhbl9jYXRjaCIpO3ZhciBfX19jeGFfaXNfcG9pbnRlcl90eXBlID0gY3JlYXRlRXhwb3J0V3JhcHBlcigiX19jeGFfaXNfcG9pbnRlcl90eXBlIik7dmFyIGR5bkNhbGxfamlqaSA9IE1vZHVsZVsiZHluQ2FsbF9qaWppIl0gPSBjcmVhdGVFeHBvcnRXcmFwcGVyKCJkeW5DYWxsX2ppamkiKTt2YXIgZHluQ2FsbF9paWlpaWogPSBNb2R1bGVbImR5bkNhbGxfaWlpaWlqIl0gPSBjcmVhdGVFeHBvcnRXcmFwcGVyKCJkeW5DYWxsX2lpaWlpaiIpO3ZhciBkeW5DYWxsX2lpaWlpamogPSBNb2R1bGVbImR5bkNhbGxfaWlpaWlqaiJdID0gY3JlYXRlRXhwb3J0V3JhcHBlcigiZHluQ2FsbF9paWlpaWpqIik7dmFyIGR5bkNhbGxfaWlpaWlpamogPSBNb2R1bGVbImR5bkNhbGxfaWlpaWlpamoiXSA9IGNyZWF0ZUV4cG9ydFdyYXBwZXIoImR5bkNhbGxfaWlpaWlpamoiKTt2YXIgZHluQ2FsbF92aWlqaWkgPSBNb2R1bGVbImR5bkNhbGxfdmlpamlpIl0gPSBjcmVhdGVFeHBvcnRXcmFwcGVyKCJkeW5DYWxsX3ZpaWppaSIpO3ZhciBfX19zdGFydF9lbV9qcyA9IE1vZHVsZVsiX19fc3RhcnRfZW1fanMiXSA9IDE4MzIwNDkyO3ZhciBfX19zdG9wX2VtX2pzID0gTW9kdWxlWyJfX19zdG9wX2VtX2pzIl0gPSAxODMyMDUzMDtmdW5jdGlvbiBpbnZva2VfaWkoaW5kZXgsIGExKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpKGluZGV4LCBhMSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92KGluZGV4KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaShpbmRleCwgYTEsIGEyKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpKGluZGV4LCBhMSwgYTIpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaShpbmRleCwgYTEsIGEyLCBhMykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpKGluZGV4LCBhMSwgYTIsIGEzKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWQoaW5kZXgsIGExLCBhMikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaShpbmRleCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KSgpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfZGkoaW5kZXgsIGExKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWQoaW5kZXgsIGExLCBhMiwgYTMpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWRkZGRpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlkZGlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2RpaShpbmRleCwgYTEsIGEyKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlkKGluZGV4LCBhMSwgYTIsIGEzKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlkZGlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpZGlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaWlpaWRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfZGRkKGluZGV4LCBhMSwgYTIpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpaWlpaWRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGlpaWlpZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZChpbmRleCwgYTEsIGEyKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2RkKGluZGV4LCBhMSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmRkaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmRkaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWRpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZkaWlpaWlpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92ZGlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpZGlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92ZGRpKGluZGV4LCBhMSwgYTIsIGEzKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmRpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWRkaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlpaWlpZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaWlpaWlkaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWlpZGRpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlkaShpbmRleCwgYTEsIGEyLCBhMykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlpaWlpaWlpZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpZGlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWRpaShpbmRleCwgYTEsIGEyLCBhMywgYTQpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWRkZChpbmRleCwgYTEsIGEyLCBhMywgYTQpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZkZGlpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZkaWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmRpaWlpaWlpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfZGlkKGluZGV4LCBhMSwgYTIpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpaWlkZGRpaWRkaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpaWRpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmRpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpZGRpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlkZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpaWlpaWlpaWlkaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92ZGRkZGlpaWlpaWlpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaWlpaWlkaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpZGlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWRkaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlpaWlpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9pZGRpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlkZGlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWRkaWlpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpZGkoaW5kZXgsIGExLCBhMiwgYTMpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWRkZGRkZGRpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWRpZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpZGlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlkZGRpZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpZGRpZGRkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWRkZGRkZGRpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlkZGlpZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWRpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGRpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGRpaWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpZGRpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpZGRkZGRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpZGRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpZGRkZGRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlkZGlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlkZGlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2RpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWRkaShpbmRleCwgYTEsIGEyLCBhMywgYTQpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpaWRkaWlpaWlpaWlpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlkZGlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlkZGRkaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfZGlkaShpbmRleCwgYTEsIGEyLCBhMykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWRpaWlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZkaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWRkZGlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWRkaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpZGRpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlkaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfZGRkZChpbmRleCwgYTEsIGEyLCBhMykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGlpZGRkZGlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlkZChpbmRleCwgYTEsIGEyLCBhMykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlkaWQoaW5kZXgsIGExLCBhMiwgYTMsIGE0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWRkZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9kaWRkKGluZGV4LCBhMSwgYTIsIGEzKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfZGlkZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2RpZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWRkZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlkaShpbmRleCwgYTEsIGEyLCBhMywgYTQpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlkZGRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpZGRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWRkZGRkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGRkZGRkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpZGRkZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlkZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlkaWRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmRkZGlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWRkZGRkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2RpaWkoaW5kZXgsIGExLCBhMiwgYTMpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpZGRpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlkZGlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWRpZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlkZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWRkZGRpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlkZGRkaWRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlkZGlkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlkZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpaWRkaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpZGRpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlkZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpZGlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlkZGlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlkaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpZGRkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWRkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWRpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZkZGRpaWlpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZkaWRkZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWRkaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlkZGRpZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGlkaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlkZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlkaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlpaWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlpaWlpaWlpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTkpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpaWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaWlpaWlpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwLCBhMjEsIGEyMiwgYTIzLCBhMjQsIGEyNSwgYTI2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwLCBhMjEsIGEyMiwgYTIzLCBhMjQsIGEyNSwgYTI2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWRkZGRkaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpZGQoaW5kZXgsIGExLCBhMiwgYTMpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCwgYTIxLCBhMjIsIGEyMywgYTI0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwLCBhMjEsIGEyMiwgYTIzLCBhMjQpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlpaWlpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpZGRkZGlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlkZGRkaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlpaWlpaWRkZGRpaWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCwgYTIxLCBhMjIsIGEyMywgYTI0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwLCBhMjEsIGEyMiwgYTIzLCBhMjQpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpZGlpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGRkZGRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGlpaWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGRpZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGRpZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGRkZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlkZGlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2RpZGRkZGRpZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlkZGRkaWQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpZGRkaWlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpZGRkZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWRkZGlpaWRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWRpaWRkaWlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmRkZGlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmRkZGlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlkZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpZGlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9kaWRkZGlkaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlkZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlkZGRkZGRkZGRkZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlkaWRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfZGlpZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2RpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlkZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpZGRkZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWlpaWlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWlpaWlpaWQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpZGRpZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpaWRkaWRkaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpZGlpZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlpZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfZGlpZChpbmRleCwgYTEsIGEyLCBhMykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2RpaWRkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWRkaWRkZGlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpZGRpZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWlpaWlpaWlkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlkaWQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlkZGRkaWRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWRkZGRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlkZGRkZGRkZGRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZkaWRkaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfZGlpZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpZGRkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpZGRkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWRkZGlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWRkZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWlpaWlpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWRkZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWRpZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpZGRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlkZGRpZGRkZGRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpaWlpaWRkZGRpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfZChpbmRleCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KSgpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpZGlpaWQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWRpaWlkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9pZGkoaW5kZXgsIGExLCBhMikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWRkZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2RpaWRpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlkaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlkZGRkZGRpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9pZGRpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfZGlpaWQoaW5kZXgsIGExLCBhMiwgYTMsIGE0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lkZGlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWRkZGlpaWlpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2RpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9pZGlpaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlkaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpZGRkaWlpaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpZGRkaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpZGRkaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGRkZGRkaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpaWRpaWQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlkZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lkZGRkaWlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlkZGRkZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpZGRpaWRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpZGRkZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlkZGlkZGlkaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpZGlkaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWRpZChpbmRleCwgYTEsIGEyLCBhMykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lkZGRpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9kaWlkZChpbmRleCwgYTEsIGEyLCBhMywgYTQpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlkZGRkaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWRkaWRkaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfZGlkaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWRkaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpZGRpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpaWlpaWlpZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlkaWlpZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWRkZGRkZGRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWRkaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpZGRkaWRkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpZGlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpaWRkZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWRpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlkZGlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpZGlpZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGlpaWRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZkaWRpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZkaWRkaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlkaWlkaWQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlkaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWlpaWlpZChpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpZGlkZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpaWlpZGRkZGRkZGRkaWlkZGlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCwgYTIxLCBhMjIpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjAsIGEyMSwgYTIyKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaWRkaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9pZGlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlkaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlkZGRkZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlkaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWRkZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlkZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpaWlkZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWRpaWRpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWRpaWlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZkZGlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpaWlpZGRkZGRkZGlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlkZGRkaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaWlkZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlkZGRpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlpaWlpZGRpZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlkZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX3ZkaShpbmRleCwgYTEsIGEyKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyKTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpaWlpaWlpaWQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92ZGlkZGlpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpaWlpaWRkaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9kaWlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWRkaWlpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpZGRkZGRkZGRpaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge3JldHVybiBnZXRXYXNtVGFibGVFbnRyeShpbmRleCkoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMik7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9pZGRpZGRkZGkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlkaWkoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWRpaWlkaWRpaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTt9IGNhdGNoIChlKSB7c3RhY2tSZXN0b3JlKHNwKTtpZiAoZSAhPT0gZSArIDApIHRocm93IGU7X3NldFRocmV3KDEsIDApO319ZnVuY3Rpb24gaW52b2tlX2lpZGRpaWlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlkaWRkaShpbmRleCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHt2YXIgc3AgPSBzdGFja1NhdmUoKTt0cnkge2dldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV9paWlpZGlkKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7dmFyIHNwID0gc3RhY2tTYXZlKCk7dHJ5IHtyZXR1cm4gZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO30gY2F0Y2ggKGUpIHtzdGFja1Jlc3RvcmUoc3ApO2lmIChlICE9PSBlICsgMCkgdGhyb3cgZTtfc2V0VGhyZXcoMSwgMCk7fX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpZGlpaWlpKGluZGV4LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7cmV0dXJuIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGludm9rZV92aWlpaWlpZGQoaW5kZXgsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge3ZhciBzcCA9IHN0YWNrU2F2ZSgpO3RyeSB7Z2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7fSBjYXRjaCAoZSkge3N0YWNrUmVzdG9yZShzcCk7aWYgKGUgIT09IGUgKyAwKSB0aHJvdyBlO19zZXRUaHJldygxLCAwKTt9fWZ1bmN0aW9uIGFwcGx5U2lnbmF0dXJlQ29udmVyc2lvbnMod2FzbUV4cG9ydHMpIHt3YXNtRXhwb3J0cyA9IE9iamVjdC5hc3NpZ24oe30sIHdhc21FeHBvcnRzKTt2YXIgbWFrZVdyYXBwZXJfcCA9IGYgPT4gKCkgPT4gZigpID4+PiAwO3ZhciBtYWtlV3JhcHBlcl9wcCA9IGYgPT4gYTAgPT4gZihhMCkgPj4+IDA7d2FzbUV4cG9ydHNbIl9fZXJybm9fbG9jYXRpb24iXSA9IG1ha2VXcmFwcGVyX3Aod2FzbUV4cG9ydHNbIl9fZXJybm9fbG9jYXRpb24iXSk7d2FzbUV4cG9ydHNbIm1hbGxvYyJdID0gbWFrZVdyYXBwZXJfcHAod2FzbUV4cG9ydHNbIm1hbGxvYyJdKTt3YXNtRXhwb3J0c1siZW1zY3JpcHRlbl9zdGFja19nZXRfYmFzZSJdID0gbWFrZVdyYXBwZXJfcCh3YXNtRXhwb3J0c1siZW1zY3JpcHRlbl9zdGFja19nZXRfYmFzZSJdKTt3YXNtRXhwb3J0c1siZW1zY3JpcHRlbl9zdGFja19nZXRfZW5kIl0gPSBtYWtlV3JhcHBlcl9wKHdhc21FeHBvcnRzWyJlbXNjcmlwdGVuX3N0YWNrX2dldF9lbmQiXSk7d2FzbUV4cG9ydHNbInN0YWNrU2F2ZSJdID0gbWFrZVdyYXBwZXJfcCh3YXNtRXhwb3J0c1sic3RhY2tTYXZlIl0pO3dhc21FeHBvcnRzWyJzdGFja0FsbG9jIl0gPSBtYWtlV3JhcHBlcl9wcCh3YXNtRXhwb3J0c1sic3RhY2tBbGxvYyJdKTt3YXNtRXhwb3J0c1siZW1zY3JpcHRlbl9zdGFja19nZXRfY3VycmVudCJdID0gbWFrZVdyYXBwZXJfcCh3YXNtRXhwb3J0c1siZW1zY3JpcHRlbl9zdGFja19nZXRfY3VycmVudCJdKTtyZXR1cm4gd2FzbUV4cG9ydHM7fU1vZHVsZVsiYWRkRnVuY3Rpb24iXSA9IGFkZEZ1bmN0aW9uO3ZhciBtaXNzaW5nTGlicmFyeVN5bWJvbHMgPSBbICJ3cml0ZUk1M1RvSTY0IiwgIndyaXRlSTUzVG9JNjRDbGFtcGVkIiwgIndyaXRlSTUzVG9JNjRTaWduYWxpbmciLCAid3JpdGVJNTNUb1U2NENsYW1wZWQiLCAid3JpdGVJNTNUb1U2NFNpZ25hbGluZyIsICJyZWFkSTUzRnJvbUk2NCIsICJyZWFkSTUzRnJvbVU2NCIsICJjb252ZXJ0STMyUGFpclRvSTUzIiwgImNvbnZlcnRVMzJQYWlyVG9JNTMiLCAiemVyb01lbW9yeSIsICJ5ZGF5RnJvbURhdGUiLCAic2V0RXJyTm8iLCAiaW5ldFB0b240IiwgImluZXROdG9wNCIsICJpbmV0UHRvbjYiLCAiaW5ldE50b3A2IiwgInJlYWRTb2NrYWRkciIsICJ3cml0ZVNvY2thZGRyIiwgImdldEhvc3RCeU5hbWUiLCAiaW5pdFJhbmRvbUZpbGwiLCAicmFuZG9tRmlsbCIsICJlbXNjcmlwdGVuTG9nIiwgImNvbnZlcnRQQ3RvU291cmNlTG9jYXRpb24iLCAicmVhZEVtQXNtQXJncyIsICJqc3RvaV9xIiwgImpzdG9pX3MiLCAibGlzdGVuT25jZSIsICJhdXRvUmVzdW1lQXVkaW9Db250ZXh0IiwgImR5bkNhbGxMZWdhY3kiLCAiZ2V0RHluQ2FsbGVyIiwgImR5bkNhbGwiLCAiaGFuZGxlRXhjZXB0aW9uIiwgInJ1bnRpbWVLZWVwYWxpdmVQdXNoIiwgInJ1bnRpbWVLZWVwYWxpdmVQb3AiLCAiY2FsbFVzZXJDYWxsYmFjayIsICJtYXliZUV4aXQiLCAic2FmZVNldFRpbWVvdXQiLCAiYXNtanNNYW5nbGUiLCAiYXN5bmNMb2FkIiwgImFsaWduTWVtb3J5IiwgIm1tYXBBbGxvYyIsICJoYW5kbGVBbGxvY2F0b3JJbml0IiwgIkhhbmRsZUFsbG9jYXRvciIsICJnZXROYXRpdmVUeXBlU2l6ZSIsICJTVEFDS19TSVpFIiwgIlNUQUNLX0FMSUdOIiwgIlBPSU5URVJfU0laRSIsICJBU1NFUlRJT05TIiwgImdldENGdW5jIiwgImNjYWxsIiwgImN3cmFwIiwgInJlbW92ZUZ1bmN0aW9uIiwgInJlYWxseU5lZ2F0aXZlIiwgInVuU2lnbiIsICJzdHJMZW4iLCAicmVTaWduIiwgImZvcm1hdFN0cmluZyIsICJpbnRBcnJheVRvU3RyaW5nIiwgIkFzY2lpVG9TdHJpbmciLCAiVVRGMTZUb1N0cmluZyIsICJzdHJpbmdUb1VURjE2IiwgImxlbmd0aEJ5dGVzVVRGMTYiLCAiVVRGMzJUb1N0cmluZyIsICJzdHJpbmdUb1VURjMyIiwgImxlbmd0aEJ5dGVzVVRGMzIiLCAic3RyaW5nVG9OZXdVVEY4IiwgInN0cmluZ1RvVVRGOE9uU3RhY2siLCAicmVnaXN0ZXJLZXlFdmVudENhbGxiYWNrIiwgIm1heWJlQ1N0cmluZ1RvSnNTdHJpbmciLCAiZmluZEV2ZW50VGFyZ2V0IiwgImZpbmRDYW52YXNFdmVudFRhcmdldCIsICJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCAiZmlsbE1vdXNlRXZlbnREYXRhIiwgInJlZ2lzdGVyTW91c2VFdmVudENhbGxiYWNrIiwgInJlZ2lzdGVyV2hlZWxFdmVudENhbGxiYWNrIiwgInJlZ2lzdGVyVWlFdmVudENhbGxiYWNrIiwgInJlZ2lzdGVyRm9jdXNFdmVudENhbGxiYWNrIiwgImZpbGxEZXZpY2VPcmllbnRhdGlvbkV2ZW50RGF0YSIsICJyZWdpc3RlckRldmljZU9yaWVudGF0aW9uRXZlbnRDYWxsYmFjayIsICJmaWxsRGV2aWNlTW90aW9uRXZlbnREYXRhIiwgInJlZ2lzdGVyRGV2aWNlTW90aW9uRXZlbnRDYWxsYmFjayIsICJzY3JlZW5PcmllbnRhdGlvbiIsICJmaWxsT3JpZW50YXRpb25DaGFuZ2VFdmVudERhdGEiLCAicmVnaXN0ZXJPcmllbnRhdGlvbkNoYW5nZUV2ZW50Q2FsbGJhY2siLCAiZmlsbEZ1bGxzY3JlZW5DaGFuZ2VFdmVudERhdGEiLCAicmVnaXN0ZXJGdWxsc2NyZWVuQ2hhbmdlRXZlbnRDYWxsYmFjayIsICJKU0V2ZW50c19yZXF1ZXN0RnVsbHNjcmVlbiIsICJKU0V2ZW50c19yZXNpemVDYW52YXNGb3JGdWxsc2NyZWVuIiwgInJlZ2lzdGVyUmVzdG9yZU9sZFN0eWxlIiwgImhpZGVFdmVyeXRoaW5nRXhjZXB0R2l2ZW5FbGVtZW50IiwgInJlc3RvcmVIaWRkZW5FbGVtZW50cyIsICJzZXRMZXR0ZXJib3giLCAic29mdEZ1bGxzY3JlZW5SZXNpemVXZWJHTFJlbmRlclRhcmdldCIsICJkb1JlcXVlc3RGdWxsc2NyZWVuIiwgImZpbGxQb2ludGVybG9ja0NoYW5nZUV2ZW50RGF0YSIsICJyZWdpc3RlclBvaW50ZXJsb2NrQ2hhbmdlRXZlbnRDYWxsYmFjayIsICJyZWdpc3RlclBvaW50ZXJsb2NrRXJyb3JFdmVudENhbGxiYWNrIiwgInJlcXVlc3RQb2ludGVyTG9jayIsICJmaWxsVmlzaWJpbGl0eUNoYW5nZUV2ZW50RGF0YSIsICJyZWdpc3RlclZpc2liaWxpdHlDaGFuZ2VFdmVudENhbGxiYWNrIiwgInJlZ2lzdGVyVG91Y2hFdmVudENhbGxiYWNrIiwgImZpbGxHYW1lcGFkRXZlbnREYXRhIiwgInJlZ2lzdGVyR2FtZXBhZEV2ZW50Q2FsbGJhY2siLCAicmVnaXN0ZXJCZWZvcmVVbmxvYWRFdmVudENhbGxiYWNrIiwgImZpbGxCYXR0ZXJ5RXZlbnREYXRhIiwgImJhdHRlcnkiLCAicmVnaXN0ZXJCYXR0ZXJ5RXZlbnRDYWxsYmFjayIsICJzZXRDYW52YXNFbGVtZW50U2l6ZSIsICJnZXRDYW52YXNFbGVtZW50U2l6ZSIsICJkZW1hbmdsZSIsICJkZW1hbmdsZUFsbCIsICJzdGFja1RyYWNlIiwgImNoZWNrV2FzaUNsb2NrIiwgIndhc2lSaWdodHNUb011c2xPRmxhZ3MiLCAid2FzaU9GbGFnc1RvTXVzbE9GbGFncyIsICJjcmVhdGVEeW5jYWxsV3JhcHBlciIsICJzZXRJbW1lZGlhdGVXcmFwcGVkIiwgImNsZWFySW1tZWRpYXRlV3JhcHBlZCIsICJwb2x5ZmlsbFNldEltbWVkaWF0ZSIsICJnZXRQcm9taXNlIiwgIm1ha2VQcm9taXNlIiwgImlkc1RvUHJvbWlzZXMiLCAibWFrZVByb21pc2VDYWxsYmFjayIsICJzZXRNYWluTG9vcCIsICJnZXRTb2NrZXRGcm9tRkQiLCAiZ2V0U29ja2V0QWRkcmVzcyIsICJoZWFwT2JqZWN0Rm9yV2ViR0xUeXBlIiwgImhlYXBBY2Nlc3NTaGlmdEZvcldlYkdMSGVhcCIsICJ3ZWJnbF9lbmFibGVfQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIsICJ3ZWJnbF9lbmFibGVfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QiLCAid2ViZ2xfZW5hYmxlX1dFQkdMX2RyYXdfYnVmZmVycyIsICJ3ZWJnbF9lbmFibGVfV0VCR0xfbXVsdGlfZHJhdyIsICJlbXNjcmlwdGVuV2ViR0xHZXQiLCAiY29tcHV0ZVVucGFja0FsaWduZWRJbWFnZVNpemUiLCAiY29sb3JDaGFubmVsc0luR2xUZXh0dXJlRm9ybWF0IiwgImVtc2NyaXB0ZW5XZWJHTEdldFRleFBpeGVsRGF0YSIsICJfX2dsR2VuT2JqZWN0IiwgImVtc2NyaXB0ZW5XZWJHTEdldFVuaWZvcm0iLCAid2ViZ2xHZXRVbmlmb3JtTG9jYXRpb24iLCAid2ViZ2xQcmVwYXJlVW5pZm9ybUxvY2F0aW9uc0JlZm9yZUZpcnN0VXNlIiwgIndlYmdsR2V0TGVmdEJyYWNlUG9zIiwgImVtc2NyaXB0ZW5XZWJHTEdldFZlcnRleEF0dHJpYiIsICJfX2dsR2V0QWN0aXZlQXR0cmliT3JVbmlmb3JtIiwgIndyaXRlR0xBcnJheSIsICJyZWdpc3RlcldlYkdsRXZlbnRDYWxsYmFjayIsICJydW5BbmRBYm9ydElmRXJyb3IiLCAiU0RMX3VuaWNvZGUiLCAiU0RMX3R0ZkNvbnRleHQiLCAiU0RMX2F1ZGlvIiwgIkFMTE9DX05PUk1BTCIsICJBTExPQ19TVEFDSyIsICJhbGxvY2F0ZSIsICJ3cml0ZVN0cmluZ1RvTWVtb3J5IiwgIndyaXRlQXNjaWlUb01lbW9yeSIgXTttaXNzaW5nTGlicmFyeVN5bWJvbHMuZm9yRWFjaChtaXNzaW5nTGlicmFyeVN5bWJvbCk7dmFyIHVuZXhwb3J0ZWRTeW1ib2xzID0gWyAicnVuIiwgImFkZE9uUHJlUnVuIiwgImFkZE9uSW5pdCIsICJhZGRPblByZU1haW4iLCAiYWRkT25FeGl0IiwgImFkZE9uUG9zdFJ1biIsICJhZGRSdW5EZXBlbmRlbmN5IiwgInJlbW92ZVJ1bkRlcGVuZGVuY3kiLCAiRlNfY3JlYXRlRm9sZGVyIiwgIkZTX2NyZWF0ZVBhdGgiLCAiRlNfY3JlYXRlTGF6eUZpbGUiLCAiRlNfY3JlYXRlTGluayIsICJGU19jcmVhdGVEZXZpY2UiLCAiRlNfcmVhZEZpbGUiLCAib3V0IiwgImVyciIsICJjYWxsTWFpbiIsICJhYm9ydCIsICJrZWVwUnVudGltZUFsaXZlIiwgIndhc21NZW1vcnkiLCAid2FzbUV4cG9ydHMiLCAic3RhY2tBbGxvYyIsICJzdGFja1NhdmUiLCAic3RhY2tSZXN0b3JlIiwgImdldFRlbXBSZXQwIiwgInNldFRlbXBSZXQwIiwgIndyaXRlU3RhY2tDb29raWUiLCAiY2hlY2tTdGFja0Nvb2tpZSIsICJjb252ZXJ0STMyUGFpclRvSTUzQ2hlY2tlZCIsICJwdHJUb1N0cmluZyIsICJleGl0SlMiLCAiZ2V0SGVhcE1heCIsICJncm93TWVtb3J5IiwgIkVOViIsICJNT05USF9EQVlTX1JFR1VMQVIiLCAiTU9OVEhfREFZU19MRUFQIiwgIk1PTlRIX0RBWVNfUkVHVUxBUl9DVU1VTEFUSVZFIiwgIk1PTlRIX0RBWVNfTEVBUF9DVU1VTEFUSVZFIiwgImlzTGVhcFllYXIiLCAiYXJyYXlTdW0iLCAiYWRkRGF5cyIsICJFUlJOT19DT0RFUyIsICJFUlJOT19NRVNTQUdFUyIsICJETlMiLCAiUHJvdG9jb2xzIiwgIlNvY2tldHMiLCAidGltZXJzIiwgIndhcm5PbmNlIiwgImdldENhbGxzdGFjayIsICJVTldJTkRfQ0FDSEUiLCAicmVhZEVtQXNtQXJnc0FycmF5IiwgImdldEV4ZWN1dGFibGVOYW1lIiwgIndhc21UYWJsZSIsICJ1bGViMTI4RW5jb2RlIiwgInNpZ1RvV2FzbVR5cGVzIiwgImdlbmVyYXRlRnVuY1R5cGUiLCAiY29udmVydEpzRnVuY3Rpb25Ub1dhc20iLCAiZnJlZVRhYmxlSW5kZXhlcyIsICJmdW5jdGlvbnNJblRhYmxlTWFwIiwgImdldEVtcHR5VGFibGVTbG90IiwgInVwZGF0ZVRhYmxlTWFwIiwgImdldEZ1bmN0aW9uQWRkcmVzcyIsICJzZXRWYWx1ZSIsICJnZXRWYWx1ZSIsICJQQVRIIiwgIlBBVEhfRlMiLCAiVVRGOERlY29kZXIiLCAiVVRGOEFycmF5VG9TdHJpbmciLCAiVVRGOFRvU3RyaW5nIiwgInN0cmluZ1RvVVRGOEFycmF5IiwgInN0cmluZ1RvVVRGOCIsICJsZW5ndGhCeXRlc1VURjgiLCAiaW50QXJyYXlGcm9tU3RyaW5nIiwgInN0cmluZ1RvQXNjaWkiLCAiVVRGMTZEZWNvZGVyIiwgIndyaXRlQXJyYXlUb01lbW9yeSIsICJKU0V2ZW50cyIsICJzcGVjaWFsSFRNTFRhcmdldHMiLCAiY3VycmVudEZ1bGxzY3JlZW5TdHJhdGVneSIsICJyZXN0b3JlT2xkV2luZG93ZWRTdHlsZSIsICJqc1N0YWNrVHJhY2UiLCAiRXhpdFN0YXR1cyIsICJnZXRFbnZTdHJpbmdzIiwgImZsdXNoX05PX0ZJTEVTWVNURU0iLCAicHJvbWlzZU1hcCIsICJ1bmNhdWdodEV4Y2VwdGlvbkNvdW50IiwgImV4Y2VwdGlvbkxhc3QiLCAiZXhjZXB0aW9uQ2F1Z2h0IiwgIkV4Y2VwdGlvbkluZm8iLCAiZmluZE1hdGNoaW5nQ2F0Y2giLCAiQnJvd3NlciIsICJ3Z2V0IiwgIlNZU0NBTExTIiwgInRlbXBGaXhlZExlbmd0aEFycmF5IiwgIm1pbmlUZW1wV2ViR0xGbG9hdEJ1ZmZlcnMiLCAibWluaVRlbXBXZWJHTEludEJ1ZmZlcnMiLCAiR0wiLCAiZW1zY3JpcHRlbl93ZWJnbF9wb3dlcl9wcmVmZXJlbmNlcyIsICJBTCIsICJHTFVUIiwgIkVHTCIsICJHTEVXIiwgIklEQlN0b3JlIiwgIlNETCIsICJTRExfZ2Z4IiwgImFsbG9jYXRlVVRGOCIsICJhbGxvY2F0ZVVURjhPblN0YWNrIiBdO3VuZXhwb3J0ZWRTeW1ib2xzLmZvckVhY2godW5leHBvcnRlZFJ1bnRpbWVTeW1ib2wpO3ZhciBjYWxsZWRSdW47ZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gZnVuY3Rpb24gcnVuQ2FsbGVyKCkge2lmICghY2FsbGVkUnVuKSBydW4oKTtpZiAoIWNhbGxlZFJ1bikgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gcnVuQ2FsbGVyO307ZnVuY3Rpb24gc3RhY2tDaGVja0luaXQoKSB7X2Vtc2NyaXB0ZW5fc3RhY2tfaW5pdCgpO3dyaXRlU3RhY2tDb29raWUoKTt9ZnVuY3Rpb24gcnVuKCkge2lmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7cmV0dXJuO31zdGFja0NoZWNrSW5pdCgpO3ByZVJ1bigpO2lmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7cmV0dXJuO31mdW5jdGlvbiBkb1J1bigpIHtpZiAoY2FsbGVkUnVuKSByZXR1cm47Y2FsbGVkUnVuID0gdHJ1ZTtNb2R1bGVbImNhbGxlZFJ1biJdID0gdHJ1ZTtpZiAoQUJPUlQpIHJldHVybjtpbml0UnVudGltZSgpO3JlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTtpZiAoTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKSBNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0oKTthc3NlcnQoIU1vZHVsZVsiX21haW4iXSwgJ2NvbXBpbGVkIHdpdGhvdXQgYSBtYWluLCBidXQgb25lIGlzIHByZXNlbnQuIGlmIHlvdSBhZGRlZCBpdCBmcm9tIEpTLCB1c2UgTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdJyk7cG9zdFJ1bigpO31pZiAoTW9kdWxlWyJzZXRTdGF0dXMiXSkge01vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge3NldFRpbWVvdXQoZnVuY3Rpb24oKSB7TW9kdWxlWyJzZXRTdGF0dXMiXSgiIik7fSwgMSk7ZG9SdW4oKTt9LCAxKTt9IGVsc2Uge2RvUnVuKCk7fWNoZWNrU3RhY2tDb29raWUoKTt9ZnVuY3Rpb24gY2hlY2tVbmZsdXNoZWRDb250ZW50KCkge3ZhciBvbGRPdXQgPSBvdXQ7dmFyIG9sZEVyciA9IGVycjt2YXIgaGFzID0gZmFsc2U7b3V0ID0gZXJyID0geCA9PiB7aGFzID0gdHJ1ZTt9O3RyeSB7Zmx1c2hfTk9fRklMRVNZU1RFTSgpO30gY2F0Y2ggKGUpIHt9b3V0ID0gb2xkT3V0O2VyciA9IG9sZEVycjtpZiAoaGFzKSB7d2Fybk9uY2UoInN0ZGlvIHN0cmVhbXMgaGFkIGNvbnRlbnQgaW4gdGhlbSB0aGF0IHdhcyBub3QgZmx1c2hlZC4geW91IHNob3VsZCBzZXQgRVhJVF9SVU5USU1FIHRvIDEgKHNlZSB0aGUgRW1zY3JpcHRlbiBGQVEpLCBvciBtYWtlIHN1cmUgdG8gZW1pdCBhIG5ld2xpbmUgd2hlbiB5b3UgcHJpbnRmIGV0Yy4iKTt3YXJuT25jZSgiKHRoaXMgbWF5IGFsc28gYmUgZHVlIHRvIG5vdCBpbmNsdWRpbmcgZnVsbCBmaWxlc3lzdGVtIHN1cHBvcnQgLSB0cnkgYnVpbGRpbmcgd2l0aCAtc0ZPUkNFX0ZJTEVTWVNURU0pIik7fX1pZiAoTW9kdWxlWyJwcmVJbml0Il0pIHtpZiAodHlwZW9mIE1vZHVsZVsicHJlSW5pdCJdID09ICJmdW5jdGlvbiIpIE1vZHVsZVsicHJlSW5pdCJdID0gWyBNb2R1bGVbInByZUluaXQiXSBdO3doaWxlIChNb2R1bGVbInByZUluaXQiXS5sZW5ndGggPiAwKSB7TW9kdWxlWyJwcmVJbml0Il0ucG9wKCkoKTt9fXJ1bigpO3JldHVybiBtb2R1bGVBcmcucmVhZHl9KTs="),e=new Function(t),l=await e()();console.log(l);let n=new CoreEngine(l),i=n.addFunction(((t,e)=>{let l=n.HEAPU8.slice(t,t+e),i=(new TextDecoder).decode(l);console.log(i)}),"vii");n.iI(i),al.set(this,n)}make_points_prism(t,e){let l=t.length;if(l%3!=0)return null;let n=l/3;if(n<3)return null;if(distance$1(t.slice(0,3),t.slice(l-3,l))>.001)throw new Error("make_points_prism profile is not closed");let i=al.get(this);if(!i)throw new Error("call GeometryEngine.init before");let a=new Geometry,h=i.Dd(t.byteLength);i.HEAPU8.set(new Uint8Array(t.buffer),h);let s=i.nI(h,n,e[0],e[1],e[2]),o=i.Qd(s);console.log("prism_point_count",o);let r=i._d(s),c=i.HEAPU8.slice(r,r+3*o*Float32Array.BYTES_PER_ELEMENT),u=new Float32Array(c.buffer);a.pointCount=o,a.points=u;let g=i.jd(s),d=new Array(g);for(let t=0;t<g;t++){let e=new Face,l=i.qd(s,t);e.isPlanar=i.lI(l);let n=i.$d(l),a=i.tI(l),h=i.HEAPU8.slice(a,a+n*Uint32Array.BYTES_PER_ELEMENT);e.indices=new Int32Array(new Uint32Array(h.buffer));let o=i.eI(l);h=e.isPlanar?i.HEAPU8.slice(o,o+3):i.HEAPU8.slice(o,o+3*n),e.normals=h,d[t]=e}return a.faces=d,console.log("prism_points",u),i.Od(h),i.Od(s),a}make_pipe(t,e){let l=t.length;if(l%3!=0)return null;if(l<6)return null;let n=al.get(this),i=n.Dd(t.byteLength);n.HEAPU8.set(new Uint8Array(t.buffer),i);let a=n.aI(i,l/3,e),h=function(t,e){let l=new Geometry,n=t.Qd(e);console.log("prism_point_count",n);let i=t._d(e),a=t.HEAPU8.slice(i,i+3*n*Float32Array.BYTES_PER_ELEMENT),h=new Float32Array(a.buffer);l.pointCount=n,l.points=h;let s=t.jd(e),o=new Array(s);for(let l=0;l<s;l++){let n=new Face,i=t.qd(e,l);n.isPlanar=t.lI(i);let a=t.$d(i),h=t.tI(i),s=t.HEAPU8.slice(h,h+a*Uint32Array.BYTES_PER_ELEMENT);n.indices=new Int32Array(new Uint32Array(s.buffer));let r=t.eI(i);s=n.isPlanar?t.HEAPU8.slice(r,r+3):t.HEAPU8.slice(r,r+3*a),n.normals=s,o[l]=n}return l.faces=o,l}(n,a);return n.Od(i),n.Od(a),h}set_log_func(t){return al.get(this).iI(t)}addFunction(t,e){return al.get(this).addFunction(t,e)}}class SpaceWire{Vg;get profile(){return this.Vg}hI;get distance(){return this.hI}Hi;get direction(){return this.Hi}#a;#h=!1;constructor(t,e,n){this.Vg=function(t){let e=[];e.push(t[0]);let l=t.length;for(let n=1;n<l-1;n++){let l=t[n],i=e.length,a=!1;for(let t=0;t<i;t++){if(distance$1(e[t],l)<1e-5){a=!0;break}}a||e.push(l)}return e.push(t[l-1]),e}(t),this.Hi=e,this.hI=n,this.set_distance(n),this.#h=function(t){if(t.length<4)return!1;let e=t[1],n=t[0],i=t[2],a=l(create$3(),n,e),h=length(a),s=l(create$3(),i,e),o=length(s),r=cross(create$3(),a,s);r=normalize$2(r,r);let c=[],u=distance$1(e,n);c.push(fromValues(u,0)),c.push(fromValues(0,0)),u=distance$1(e,i),c.push(fromValues(0,u));let g=t.length;for(let l=3;l<g;l++){let a=hl(t[l],r,e,n,i);if(!a)return!1;c.push(fromValues(a[0]*h,a[1]*o))}return function(t){let e=t.length;for(let l=0;l<e-2;l++){let n=t[l],i=t[l+1];for(let a=l+1;a<e-2;a++){if(sl(n,i,t[a],t[a+1]))return!1}}return!0}(c)}(t)}get valid(){return this.#h&&this.hI>1}get ext_profile(){let t=this.Vg.length,e=new Float32Array(3*t);for(let l=0;l<t;l++)e.set(this.Vg[l],3*l);return e}point_changed;get points(){return this.#a}set_distance(t){this.hI=t;let e=this.Vg,l=this.Hi,n=e.length-1,i=3*n,a=scale(create$3(),l,t),h=new Float32Array(2*i*3);for(let t=0;t<n;t++){let l=18*t;h.set(e[t],l),h.set(e[t+1],l+3),h.set(add(create$3(),e[t],a),l+6),h.set(add(create$3(),e[t+1],a),l+9),h.set(e[t],l+12),h.set(add(create$3(),e[t],a),l+15)}this.#a=h,this.point_changed&&this.point_changed()}}class WallWire{sI;vg;yg;Vg;get length(){return distance$1(this.sI[0],this.sI[1])}get width(){return this.yg}get height(){return this.vg}constructor(t,e,l){this.sI=t,this.yg=e,this.vg=l;let n=this.sI[0],i=distance$1(this.sI[1],n);this.set_dimension(i,e,l)}get valid(){return!0}Lr;get points(){return this.Lr}point_changed;get ext_profile(){let t=this.Vg.length,e=new Float32Array(3*t);for(let l=0;l<t;l++)e.set(this.Vg[l],3*l);return e}set_dimension(t,e,l){let n=this.sI[0],i=this.sI[1],a=subtract$1(create$3(),i,n);a=normalize$2(a,a),i=add(i,n,scale(create$3(),a,t)),this.yg=e,this.vg=l;let h=n,s=i,o=new Float32Array([s[0]-h[0],s[1]-h[1],s[2]-h[2]]);a=normalize$2(create$3(),o);let r=new Float32Array([0,0,1]),c=cross(create$3(),a,r),u=-this.yg/2,g=scale(create$3(),c,u),d=add(create$3(),h,g),I=scale(create$3(),c,this.yg),p=new Float32Array([0,0,this.vg]),Z=add(create$3(),d,I),G=[d,Z,add(create$3(),Z,o),add(create$3(),d,o),d];this.Vg=G;let m=new Float32Array(72);for(let t=0;t<4;t++){let e=18*t;m.set(G[t],e),m.set(G[t+1],e+3),m.set(add(create$3(),G[t],p),e+6),m.set(add(create$3(),G[t+1],p),e+9),m.set(G[t],e+12),m.set(add(create$3(),G[t],p),e+15)}this.Lr=m,this.point_changed&&this.point_changed()}}function hl(t,e,n,i,a){let h=l(create$3(),i,n),s=l(create$3(),a,n),o=l(create$3(),t,n),r=fromValues$3(-e[0],-e[1],-e[2],h[0],h[1],h[2],s[0],s[1],s[2]);if(r=invert$1(create$5(),r),null==r)return null;let c=transformMat3(create$3(),o,r);return c[0]<0||c[0]>0?null:fromValues(c[1],c[2])}function sl(t,e,l,n){let i=sub(create(),e,t),a=sub(create(),n,l),h=fromValues$4(i[0],i[1],-a[0],-a[1]),s=invert$2(create$6(),h);if(!s)return!1;let o=sub(create(),l,t),r=transformMat2(create(),o,s);return r[0]>0&&r[0]<1&&r[1]>0&&r[2]<1}class PipeWire{oI=[];rI=[];cI=[];uI;gI;get radius(){return this.uI}set radius(t){this.uI=t,this.Tg()}get long_spine(){return this.dI()}get spine(){return this.oI}constructor(t,e,l=[0,0,1]){this.oI=t,this.uI=e,this.gI=l,this.Tg()}Lr;get points(){return this.Lr}point_changed;Tg(){let t=this.oI.length,e=2*(t-1)*3,n=new Float32Array(e),i=new Float32Array(e),a=new Float32Array(e),h=[],s=[];for(let e=0;e<t-1;e++){let t=this.oI[e],i=this.oI[e+1];n.set(t,6*e),n.set(i,6*e+3);let a=l(create$3(),i,t),o=cross(create$3(),this.gI,a);o=normalize$2(o,o);let r=scale(o,o,this.uI),c=add(create$3(),t,r);h.push(c);let u=add(create$3(),i,r);h.push(u),r=scale(r,r,-1);let g=add(create$3(),t,r);s.push(g);let d=add(create$3(),i,r);s.push(d)}let o=[],r=[];o.push(h[0]),r.push(s[0]);let c=h.length/2;for(let t=1;t<c;t++){{let e=h,l=e[2*(t-1)],n=e[2*(t-1)+1],i=e[2*t],a=e[2*t+1],s=this.II(l,n,i,a);o.push(s)}{let e=s,l=e[2*(t-1)],n=e[2*(t-1)+1],i=e[2*t],a=e[2*t+1],h=this.II(l,n,i,a);r.push(h)}}o.push(h[h.length-1]),r.push(s[s.length-1]),this.rI=o,this.cI=r;for(let e=0;e<t-1;e++){let t=o[e],l=o[e+1];i.set(t,6*e),i.set(l,6*e+3);let n=r[e],h=r[e+1];a.set(n,6*e),a.set(h,6*e+3)}let u=new Float32Array(3*e),g=0;u.set(n,0),g+=n.length,u.set(a,g),g+=a.length,u.set(i,g),this.Lr=u,this.point_changed&&this.point_changed()}II(t,e,l,n){let i=fromValues$2(e[0]-t[0],e[1]-t[1],e[2]-t[2]);i=normalize$2(i,i);let a=fromValues$2(n[0]-l[0],n[1]-l[1],n[2]-l[2]);a=normalize$2(a,a);let h=fromValues$4(i[0],i[1],-a[0],-a[1]),s=new Float32Array([l[0]-t[0],l[1]-t[1]]),o=invert$2(create$6(),h);if(o){let e=transformMat2(create(),s,o)[0],l=scale(create$3(),i,e);return add(create$3(),l,t)}{let t=add(create$3(),e,n);return scale(t,t,.5)}}dI(){let t=this.oI,e=t.length,l=new Array;l.push(t[0]);for(let n=1;n<e-1;n++){let e=t[n-1],i=t[n],a=t[n+1],h=this.rI[n],s=this.cI[n],o=this.pI(e,i,h),r=this.pI(e,i,s);o.distance>r.distance?l.push(o.point):l.push(r.point);let c=this.pI(i,a,h),u=this.pI(i,a,s);c.distance<u.distance?l.push(c.point):l.push(u.point)}return l.push(t[t.length-1]),l}pI(t,e,n){let i=l(create$3(),e,t),a=normalize$2(create$3(),i),h=dot$1(a,l(create$3(),n,t)),s=scale(create$3(),a,h),o=create$3();return o=add(o,t,s),{point:o,distance:h}}}class WaterFlowSegment{color;start;end;element;phase;get direction(){let t=l(create$3(),this.end,this.start);return normalize$2(t,t)}speed;constructor(t,e,l,n){if(t.category!=I.OST_PipeCurves)throw new Error("category error");this.element=t,this.speed=e,this.phase=l,this.color=n;const i=r(t).We[0].geometry,a=i.faces.length,h=[];for(let t=0;t<a;t++)i.faces[t].isPlanar&&h.push(t);if(2!=h.length)return;const s=i.get_face_center(h[0]),o=i.get_face_center(h[1]);this.start=s,this.end=o}reverse(){let t=this.start;this.start=this.end,this.end=t}}class RotateCamera{get location(){return gt(this)._i}set location(t){gt(this)._i=t}get direction(){return gt(this).ji}set direction(t){gt(this).oa(t)}get fovy(){return gt(this).la}set fovy(t){gt(this).la=t}get aspect(){return gt(this).ea}constructor(t){!function(t,e){const l=z(t);null==l.Ll&&(l.Ll=new ut(t)),at.set(e,l.Ll)}(t,this)}active(){gt(this).ia()}deactive(){gt(this).ha()}isActive(){return gt(this).na}}var ol;!function(t){t.get_visible_elements=function(t){const e=new SceneContextFilter(t);if(t.section_mode==Y.box){const l=new VisibleFilter(!0),n=new BoxIntersectsFilter(t.section_box,!0),i=new AndFilter([l,n]);return e.where_pass(i),e.elements}{const t=new VisibleFilter(!0);return e.where_pass(t),e.elements}}}(ol||(ol={}));export{AndFilter,AnimationManager,BloomFilter,BloomManager,Z as Box,BoxInsideFilter,BoxIntersectsFilter,CameraInfo,I as Category,CategoryFilter,CategoryNode,Color,ColorManager,ColorMediumManager,ColorRecord,ColorRecordItem,Element,ElementUniqueId,GeometryEngine,Group,GroupManager,Instance,Label,Light,LockedFilter,MarqueeManager,MaterialFilter,i as ModelType,OrFilter,PipeWire,Plane,RecordMedium,RotateCamera,Scene,SceneContext,SceneContextFilter,SceneManager,SceneTree,ol as SceneUtils,Y as SectionMode,p as SelectMode,SelectResult,SelectableManager,SelectionManager,SpaceWire,Storey,StoreyFilter,Token,Type,TypeFilter,TypeNode,ViewManager,VisibilityRecord,Ke as VisibilityType,VisibleFilter,VisibleManager,VisibleRecordManager,WallWire,WaterFlowSegment,Te as WaterFlowType,get_categry_label};
//# sourceMappingURL=index.js.map
