0&&f&&5=l?l-1:s];t.setParamFloat($,u)}else if(B._$ws<=h._$RP&&h._$RP<=B._$Ys);else{var p,f=t.getParamIndex($),c=t.getModelContext(),d=c.getParamMax(f),g=c.getParamMin(f),y=.4*(d-g),m=c.getParamFloat(f),T=h._$I0[s>=l?l-1:s],P=h._$I0[s+1>=l?l-1:s+1];p=T y||T>P&&T-P>y?T:T+(P-T)*_;var S=m+(p-m)*e;t.setParamFloat($,S)}}s>=this._$yT&&(this._$E?(r._$z2=i,this.loopFadeIn&&(r._$bs=i)):r._$9L=!0),this._$eP=e},J.prototype._$r0=function(){return this._$E},J.prototype._$aL=function(t){this._$E=t},J.prototype._$S0=function(){return this._$D0},J.prototype._$U0=function(t){this._$D0=t},J.prototype.isLoopFadeIn=function(){return this.loopFadeIn},J.prototype.setLoopFadeIn=function(t){this.loopFadeIn=t},N.prototype.clear=function(){this.size=0},N.prototype.add=function(t){if(this._$P.length<=this.size){var i=new Float32Array(2*this.size);w._$jT(this._$P,0,i,0,this.size),this._$P=i}this._$P[this.size++]=t},N.prototype._$BL=function(){var t=new Float32Array(this.size);return w._$jT(this._$P,0,t,0,this.size),t},B._$Fr=0,B._$hs=1,B._$ws=100,B._$Ns=101,B._$xs=102,B._$us=103,B._$qs=104,B._$Ys=105,Z.prototype=new I,Z._$gT=new Array,Z.prototype._$zP=function(){this._$GS=new D,this._$GS._$zP()},Z.prototype._$F0=function(t){I.prototype._$F0.call(this,t),this._$A=t._$6L(),this._$o=t._$6L(),this._$GS=t._$nP(),this._$Eo=t._$nP(),I.prototype.readV2_opacity.call(this,t)},Z.prototype.init=function(t){var i=new K(this),e=(this._$o+1)*(this._$A+1);return null!=i._$Cr&&(i._$Cr=null),i._$Cr=new Float32Array(2*e),null!=i._$hr&&(i._$hr=null),this._$32()?i._$hr=new Float32Array(2*e):i._$hr=null,i},Z.prototype._$Nr=function(t,i){var e=i;if(this._$GS._$Ur(t)){var r=this._$VT(),o=Z._$gT;o[0]=!1,v._$Vr(t,this._$GS,o,r,this._$Eo,e._$Cr,0,2),i._$Ib(o[0]),this.interpolateOpacity(t,this._$GS,i,o)}},Z.prototype._$2b=function(t,i){var e=i;if(e._$hS(!0),this._$32()){var r=this.getTargetBaseDataID();if(e._$8r==I._$ur&&(e._$8r=t.getBaseDataIndex(r)),e._$8r<0)at._$so&&_._$li("_$L _$0P _$G :: %s",r),e._$hS(!1);else{var o=t.getBaseData(e._$8r),n=t._$q2(e._$8r);if(null!=o&&n._$yo()){var s=n.getTotalScale();e.setTotalScale_notForClient(s);var a=n.getTotalOpacity();e.setTotalOpacity(a*e.getInterpolatedOpacity()),o._$nb(t,n,e._$Cr,e._$hr,this._$VT(),0,2),e._$hS(!0)}else e._$hS(!1)}}else e.setTotalOpacity(e.getInterpolatedOpacity())},Z.prototype._$nb=function(t,i,e,r,o,n,s){var _=i,a=null!=_._$hr?_._$hr:_._$Cr;Z.transformPoints_sdk2(e,r,o,n,s,a,this._$o,this._$A)},Z.transformPoints_sdk2=function(i,e,r,o,n,s,_,a){for(var h,l,$,u=r*n,p=0,f=0,c=0,d=0,g=0,y=0,m=!1,T=o;T=1){var b=s[2*(0+a*M)],F=s[2*(0+a*M)+1],C=p-2*c+1*g,N=f-2*d+1*y,x=p+3*g,O=f+3*y,D=p-2*c+3*g,R=f-2*d+3*y,B=.5*(v- -2),U=.5*(L-1);B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else{var G=0|S;G==a&&(G=a-1);var B=.5*(v- -2),U=S-G,Y=G/a,k=(G+1)/a,b=s[2*(0+G*M)],F=s[2*(0+G*M)+1],x=s[2*(0+(G+1)*M)],O=s[2*(0+(G+1)*M)+1],C=p-2*c+Y*g,N=f-2*d+Y*y,D=p-2*c+k*g,R=f-2*d+k*y;B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else if(1<=v)if(L<=0){var D=s[2*(_+0*M)],R=s[2*(_+0*M)+1],x=p+3*c,O=f+3*d,C=p+1*c-2*g,N=f+1*d-2*y,b=p+3*c-2*g,F=f+3*d-2*y,B=.5*(v-1),U=.5*(L- -2);B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else if(L>=1){var C=s[2*(_+a*M)],N=s[2*(_+a*M)+1],b=p+3*c+1*g,F=f+3*d+1*y,D=p+1*c+3*g,R=f+1*d+3*y,x=p+3*c+3*g,O=f+3*d+3*y,B=.5*(v-1),U=.5*(L-1);B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else{var G=0|S;G==a&&(G=a-1);var B=.5*(v-1),U=S-G,Y=G/a,k=(G+1)/a,C=s[2*(_+G*M)],N=s[2*(_+G*M)+1],D=s[2*(_+(G+1)*M)],R=s[2*(_+(G+1)*M)+1],b=p+3*c+Y*g,F=f+3*d+Y*y,x=p+3*c+k*g,O=f+3*d+k*y;B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else if(L<=0){var V=0|P;V==_&&(V=_-1);var B=P-V,U=.5*(L- -2),X=V/_,z=(V+1)/_,D=s[2*(V+0*M)],R=s[2*(V+0*M)+1],x=s[2*(V+1+0*M)],O=s[2*(V+1+0*M)+1],C=p+X*c-2*g,N=f+X*d-2*y,b=p+z*c-2*g,F=f+z*d-2*y;B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else if(L>=1){var V=0|P;V==_&&(V=_-1);var B=P-V,U=.5*(L-1),X=V/_,z=(V+1)/_,C=s[2*(V+a*M)],N=s[2*(V+a*M)+1],b=s[2*(V+1+a*M)],F=s[2*(V+1+a*M)+1],D=p+X*c+3*g,R=f+X*d+3*y,x=p+z*c+3*g,O=f+z*d+3*y;B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else t.err.printf("_$li calc : %.4f , %.4f\t\t\t\t\t@@BDBoxGrid\n",v,L);else e[T]=p+v*c+L*g,e[T+1]=f+v*d+L*y}else l=P-(0|P),$=S-(0|S),h=2*((0|P)+(0|S)*(_+1)),l+$<1?(e[T]=s[h]*(1-l-$)+s[h+2]*l+s[h+2*(_+1)]*$,e[T+1]=s[h+1]*(1-l-$)+s[h+3]*l+s[h+2*(_+1)+1]*$):(e[T]=s[h+2*(_+1)+2]*(l-1+$)+s[h+2*(_+1)]*(1-l)+s[h+2]*(1-$),e[T+1]=s[h+2*(_+1)+3]*(l-1+$)+s[h+2*(_+1)+1]*(1-l)+s[h+3]*(1-$))}},Z.prototype.transformPoints_sdk1=function(t,i,e,r,o,n,s){for(var _,a,h,l,$,u,p,f=i,c=this._$o,d=this._$A,g=o*s,y=null!=f._$hr?f._$hr:f._$Cr,m=n;m1&&(_=1),a<0?a=0:a>1&&(a=1),_*=c,a*=d,h=0|_,l=0|a,h>c-1&&(h=c-1),l>d-1&&(l=d-1),u=_-h,p=a-l,$=2*(h+l*(c+1))):(_=e[m]*c,a=e[m+1]*d,u=_-(0|_),p=a-(0|a),$=2*((0|_)+(0|a)*(c+1))),u+p<1?(r[m]=y[$]*(1-u-p)+y[$+2]*u+y[$+2*(c+1)]*p,r[m+1]=y[$+1]*(1-u-p)+y[$+3]*u+y[$+2*(c+1)+1]*p):(r[m]=y[$+2*(c+1)+2]*(u-1+p)+y[$+2*(c+1)]*(1-u)+y[$+2]*(1-p),r[m+1]=y[$+2*(c+1)+3]*(u-1+p)+y[$+2*(c+1)+1]*(1-u)+y[$+3]*(1-p))},Z.prototype._$VT=function(){return(this._$o+1)*(this._$A+1)},Z.prototype.getType=function(){return I._$_b},K.prototype=new _t,tt._$42=0,tt.prototype._$zP=function(){this._$3S=new Array,this._$aS=new Array},tt.prototype._$F0=function(t){this._$g0=t._$8L(),this.visible=t._$8L(),this._$NL=t._$nP(),this._$3S=t._$nP(),this._$aS=t._$nP()},tt.prototype.init=function(t){var i=new it(this);return i.setPartsOpacity(this.isVisible()?1:0),i},tt.prototype._$6o=function(t){if(null==this._$3S)throw new Error("_$3S _$6 _$Wo@_$6o");this._$3S.push(t)},tt.prototype._$3o=function(t){if(null==this._$aS)throw new Error("_$aS _$6 _$Wo@_$3o");this._$aS.push(t)},tt.prototype._$Zo=function(t){this._$3S=t},tt.prototype._$xo=function(t){this._$aS=t},tt.prototype.isVisible=function(){return this.visible},tt.prototype._$uL=function(){return this._$g0},tt.prototype._$KP=function(t){this.visible=t},tt.prototype._$ET=function(t){this._$g0=t},tt.prototype.getBaseData=function(){return this._$3S},tt.prototype.getDrawData=function(){return this._$aS},tt.prototype._$p2=function(){return this._$NL},tt.prototype._$ob=function(t){this._$NL=t},tt.prototype.getPartsID=function(){return this._$NL},tt.prototype._$MP=function(t){this._$NL=t},it.prototype=new $,it.prototype.getPartsOpacity=function(){return this._$VS},it.prototype.setPartsOpacity=function(t){this._$VS=t},et._$L7=function(){u._$27(),yt._$27(),b._$27(),l._$27()},et.prototype.toString=function(){return this.id},rt.prototype._$F0=function(t){},ot.prototype._$1s=function(){return this._$4S},ot.prototype._$zP=function(){this._$4S=new Array},ot.prototype._$F0=function(t){this._$4S=t._$nP()},ot.prototype._$Ks=function(t){this._$4S.push(t)},nt.tr=new gt,nt._$50=new gt,nt._$Ti=new Array(0,0),nt._$Pi=new Array(0,0),nt._$B=new Array(0,0),nt.prototype._$lP=function(t,i,e,r){this.viewport=new Array(t,i,e,r)},nt.prototype._$bL=function(){this.context.save();var t=this.viewport;null!=t&&(this.context.beginPath(),this.context._$Li(t[0],t[1],t[2],t[3]),this.context.clip())},nt.prototype._$ei=function(){this.context.restore()},nt.prototype.drawElements=function(t,i,e,r,o,n,s,a){try{o!=this._$Qo&&(this._$Qo=o,this.context.globalAlpha=o);for(var h=i.length,l=t.width,$=t.height,u=this.context,p=this._$xP,f=this._$uP,c=this._$6r,d=this._$3r,g=nt.tr,y=nt._$Ti,m=nt._$Pi,T=nt._$B,P=0;P.02?nt.expandClip(t,i,e,r,l,$,u,p,f,c):nt.clipWithTransform(t,null,o,n,s,_,a,h)},nt.expandClip=function(t,i,e,r,o,n,s,_,a,h){var l=s-o,$=_-n,u=a-o,p=h-n,f=l*p-$*u>0?e:-e,c=-$,d=l,g=a-s,y=h-_,m=-y,T=g,P=Math.sqrt(g*g+y*y),S=-p,v=u,L=Math.sqrt(u*u+p*p),M=o-f*c/r,E=n-f*d/r,A=s-f*c/r,I=_-f*d/r,w=s-f*m/P,x=_-f*T/P,O=a-f*m/P,D=h-f*T/P,R=o+f*S/L,b=n+f*v/L,F=a+f*S/L,C=h+f*v/L,N=nt._$50;return null!=i._$P2(N)&&(nt.clipWithTransform(t,N,M,E,A,I,w,x,O,D,F,C,R,b),!0)},nt.clipWithTransform=function(t,i,e,r,o,n,s,a){if(arguments.length<7)return void _._$li("err : @LDGL.clip()");if(!(arguments[1]instanceof gt))return void _._$li("err : a[0] is _$6 LDTransform @LDGL.clip()");var h=nt._$B,l=i,$=arguments;if(t.beginPath(),l){l._$PS($[2],$[3],h),t.moveTo(h[0],h[1]);for(var u=4;u<$.length;u+=2)l._$PS($[u],$[u+1],h),t.lineTo(h[0],h[1])}else{t.moveTo($[2],$[3]);for(var u=4;u<$.length;u+=2)t.lineTo($[u],$[u+1])}t.clip()},nt.createCanvas=function(t,i){var e=document.createElement("canvas");return e.setAttribute("width",t),e.setAttribute("height",i),e||_._$li("err : "+e),e},nt.dumpValues=function(){for(var t="",i=0;i1?1:.5-.5*Math.cos(t*Lt.PI_F)},lt._$fr=-1,lt.prototype.toString=function(){return this._$ib},$t.prototype=new W,$t._$42=0,$t._$Os=30,$t._$ms=0,$t._$ns=1,$t._$_s=2,$t._$gT=new Array,$t.prototype._$_S=function(t){this._$LP=t},$t.prototype.getTextureNo=function(){return this._$LP},$t.prototype._$ZL=function(){return this._$Qi},$t.prototype._$H2=function(){return this._$JP},$t.prototype.getNumPoints=function(){return this._$d0},$t.prototype.getType=function(){return W._$wb},$t.prototype._$B2=function(t,i,e){var r=i,o=null!=r._$hr?r._$hr:r._$Cr;switch(U._$do){default:case U._$Ms:throw new Error("_$L _$ro ");case U._$Qs:for(var n=this._$d0-1;n>=0;--n)o[n*U._$No+4]=e}},$t.prototype._$zP=function(){this._$GS=new D,this._$GS._$zP()},$t.prototype._$F0=function(t){W.prototype._$F0.call(this,t),this._$LP=t._$6L(),this._$d0=t._$6L(),this._$Yo=t._$6L();var i=t._$nP();this._$BP=new Int16Array(3*this._$Yo);for(var e=3*this._$Yo-1;e>=0;--e)this._$BP[e]=i[e];if(this._$Eo=t._$nP(),this._$Qi=t._$nP(),t.getFormatVersion()>=G._$s7){if(this._$JP=t._$6L(),0!=this._$JP){if(0!=(1&this._$JP)){var r=t._$6L();null==this._$5P&&(this._$5P=new Object),this._$5P._$Hb=parseInt(r)}0!=(this._$JP&$t._$Os)?this._$6s=(this._$JP&$t._$Os)>>1:this._$6s=$t._$ms,0!=(32&this._$JP)&&(this.culling=!1)}}else this._$JP=0},$t.prototype.init=function(t){var i=new ut(this),e=this._$d0*U._$No,r=this._$32();switch(null!=i._$Cr&&(i._$Cr=null),i._$Cr=new Float32Array(e),null!=i._$hr&&(i._$hr=null),i._$hr=r?new Float32Array(e):null,U._$do){default:case U._$Ms:if(U._$Ls)for(var o=this._$d0-1;o>=0;--o){var n=o<<1;this._$Qi[n+1]=1-this._$Qi[n+1]}break;case U._$Qs:for(var o=this._$d0-1;o>=0;--o){var n=o<<1,s=o*U._$No,_=this._$Qi[n],a=this._$Qi[n+1];i._$Cr[s]=_,i._$Cr[s+1]=a,i._$Cr[s+4]=0,r&&(i._$hr[s]=_,i._$hr[s+1]=a,i._$hr[s+4]=0)}}return i},$t.prototype._$Nr=function(t,i){var e=i;if(this!=e._$GT()&&console.log("### assert!! ### "),this._$GS._$Ur(t)&&(W.prototype._$Nr.call(this,t,e),!e._$IS[0])){var r=$t._$gT;r[0]=!1,v._$Vr(t,this._$GS,r,this._$d0,this._$Eo,e._$Cr,U._$i2,U._$No)}},$t.prototype._$2b=function(t,i){try{this!=i._$GT()&&console.log("### assert!! ### ");var e=!1;i._$IS[0]&&(e=!0);var r=i;if(!e&&(W.prototype._$2b.call(this,t),this._$32())){var o=this.getTargetBaseDataID();if(r._$8r==W._$ur&&(r._$8r=t.getBaseDataIndex(o)),r._$8r<0)at._$so&&_._$li("_$L _$0P _$G :: %s",o);else{var n=t.getBaseData(r._$8r),s=t._$q2(r._$8r);null==n||s._$x2()?r._$AT=!1:(n._$nb(t,s,r._$Cr,r._$hr,this._$d0,U._$i2,U._$No),r._$AT=!0),r.baseOpacity=s.getTotalOpacity()}}}catch(t){throw t}},$t.prototype.draw=function(t,i,e){if(this!=e._$GT()&&console.log("### assert!! ### "),!e._$IS[0]){var r=e,o=this._$LP;o<0&&(o=1);var n=this.getOpacity(i,r)*e._$VS*e.baseOpacity,s=null!=r._$hr?r._$hr:r._$Cr;t.setClipBufPre_clipContextForDraw(e.clipBufPre_clipContext),t._$WP(this.culling),t._$Uo(o,3*this._$Yo,this._$BP,s,this._$Qi,n,this._$6s,r)}},$t.prototype.dump=function(){console.log(" _$yi( %d ) , _$d0( %d ) , _$Yo( %d ) \n",this._$LP,this._$d0,this._$Yo),console.log(" _$Oi _$di = { ");for(var t=0;tstartMotion() / start _$K _$3 (m%d)\n",r,e._$sr));if(null==t)return-1;e=new dt,e._$w0=t,this.motions.push(e);var n=e._$sr;return this._$eb&&_._$Ji("MotionQueueManager[size:%2d]->startMotion() / new _$w0 (m%d)\n",r,n),n},ct.prototype.updateParam=function(t){try{for(var i=!1,e=0;eupdateParam() / _$T0 _$w0 (m%d)\n",this.motions.length-1,r._$sr),this.motions.splice(e,1),e--)):(this.motions=this.motions.splice(e,1),e--)}else this.motions.splice(e,1),e--}return i}catch(t){return _._$li(t),!0}},ct.prototype.isFinished=function(t){if(arguments.length>=1){for(var i=0;i.9&&at.EXPAND_W,this.gl);if(null==this.gl)throw new Error("gl is null");var h=1*this._$C0*n,l=1*this._$tT*n,$=1*this._$WL*n,u=this._$lT*n;if(null!=this.clipBufPre_clipContextMask){a.frontFace(a.CCW),a.useProgram(this.shaderProgram),this._$vS=Tt(a,this._$vS,r),this._$no=Pt(a,this._$no,e),a.enableVertexAttribArray(this.a_position_Loc),a.vertexAttribPointer(this.a_position_Loc,2,a.FLOAT,!1,0,0),this._$NT=Tt(a,this._$NT,o),a.activeTexture(a.TEXTURE1),a.bindTexture(a.TEXTURE_2D,this.textures[t]),a.uniform1i(this.s_texture0_Loc,1),a.enableVertexAttribArray(this.a_texCoord_Loc),a.vertexAttribPointer(this.a_texCoord_Loc,2,a.FLOAT,!1,0,0),a.uniformMatrix4fv(this.u_matrix_Loc,!1,this.getClipBufPre_clipContextMask().matrixForMask);var p=this.getClipBufPre_clipContextMask().layoutChannelNo,f=this.getChannelFlagAsColor(p);a.uniform4f(this.u_channelFlag,f.r,f.g,f.b,f.a);var c=this.getClipBufPre_clipContextMask().layoutBounds;a.uniform4f(this.u_baseColor_Loc,2*c.x-1,2*c.y-1,2*c._$EL()-1,2*c._$5T()-1),a.uniform1i(this.u_maskFlag_Loc,!0)}else if(null!=this.getClipBufPre_clipContextDraw()){a.useProgram(this.shaderProgramOff),this._$vS=Tt(a,this._$vS,r),this._$no=Pt(a,this._$no,e),a.enableVertexAttribArray(this.a_position_Loc_Off),a.vertexAttribPointer(this.a_position_Loc_Off,2,a.FLOAT,!1,0,0),this._$NT=Tt(a,this._$NT,o),a.activeTexture(a.TEXTURE1),a.bindTexture(a.TEXTURE_2D,this.textures[t]),a.uniform1i(this.s_texture0_Loc_Off,1),a.enableVertexAttribArray(this.a_texCoord_Loc_Off),a.vertexAttribPointer(this.a_texCoord_Loc_Off,2,a.FLOAT,!1,0,0),a.uniformMatrix4fv(this.u_clipMatrix_Loc_Off,!1,this.getClipBufPre_clipContextDraw().matrixForDraw),a.uniformMatrix4fv(this.u_matrix_Loc_Off,!1,this.matrix4x4),a.activeTexture(a.TEXTURE2),a.bindTexture(a.TEXTURE_2D,at.fTexture[this.glno]),a.uniform1i(this.s_texture1_Loc_Off,2);var p=this.getClipBufPre_clipContextDraw().layoutChannelNo,f=this.getChannelFlagAsColor(p);a.uniform4f(this.u_channelFlag_Loc_Off,f.r,f.g,f.b,f.a),a.uniform4f(this.u_baseColor_Loc_Off,h,l,$,u)}else a.useProgram(this.shaderProgram),this._$vS=Tt(a,this._$vS,r),this._$no=Pt(a,this._$no,e),a.enableVertexAttribArray(this.a_position_Loc),a.vertexAttribPointer(this.a_position_Loc,2,a.FLOAT,!1,0,0),this._$NT=Tt(a,this._$NT,o),a.activeTexture(a.TEXTURE1),a.bindTexture(a.TEXTURE_2D,this.textures[t]),a.uniform1i(this.s_texture0_Loc,1),a.enableVertexAttribArray(this.a_texCoord_Loc),a.vertexAttribPointer(this.a_texCoord_Loc,2,a.FLOAT,!1,0,0),a.uniformMatrix4fv(this.u_matrix_Loc,!1,this.matrix4x4),a.uniform4f(this.u_baseColor_Loc,h,l,$,u),a.uniform1i(this.u_maskFlag_Loc,!1);this.culling?this.gl.enable(a.CULL_FACE):this.gl.disable(a.CULL_FACE),this.gl.enable(a.BLEND);var d,g,y,m;if(null!=this.clipBufPre_clipContextMask)d=a.ONE,g=a.ONE_MINUS_SRC_ALPHA,y=a.ONE,m=a.ONE_MINUS_SRC_ALPHA;else switch(s){case $t._$ms:d=a.ONE,g=a.ONE_MINUS_SRC_ALPHA,y=a.ONE,m=a.ONE_MINUS_SRC_ALPHA;break;case $t._$ns:d=a.ONE,g=a.ONE,y=a.ZERO,m=a.ONE;break;case $t._$_s:d=a.DST_COLOR,g=a.ONE_MINUS_SRC_ALPHA,y=a.ZERO,m=a.ONE}a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(d,g,y,m),this.anisotropyExt&&a.texParameteri(a.TEXTURE_2D,this.anisotropyExt.TEXTURE_MAX_ANISOTROPY_EXT,this.maxAnisotropy);var T=e.length;a.drawElements(a.TRIANGLES,T,a.UNSIGNED_SHORT,0),a.bindTexture(a.TEXTURE_2D,null)}},mt.prototype._$Rs=function(){throw new Error("_$Rs")},mt.prototype._$Ds=function(t){throw new Error("_$Ds")},mt.prototype._$K2=function(){for(var t=0;t=48){var r=G._$9o(t);return null!=r?(r._$F0(this),r):null}switch(t){case 1:return this._$bT();case 10:return new n(this._$6L(),!0);case 11:return new S(this._$mP(),this._$mP(),this._$mP(),this._$mP());case 12:return new S(this._$_T(),this._$_T(),this._$_T(),this._$_T());case 13:return new L(this._$mP(),this._$mP());case 14:return new L(this._$_T(),this._$_T());case 15:for(var o=this._$3L(),e=new Array(o),s=0;s>7-this._$hL++&1)},St.prototype._$zT=function(){0!=this._$hL&&(this._$hL=0)},vt.prototype._$wP=function(t,i,e){for(var r=0;rMath.PI;)e-=2*Math.PI;return e},Lt._$9=function(t){return Math.sin(t)},Lt.fcos=function(t){return Math.cos(t)},Mt.prototype._$u2=function(){return this._$IS[0]},Mt.prototype._$yo=function(){return this._$AT&&!this._$IS[0]},Mt.prototype._$GT=function(){return this._$e0},Et._$W2=0,Et.SYSTEM_INFO=null,Et.USER_AGENT=navigator.userAgent,Et.isIPhone=function(){return Et.SYSTEM_INFO||Et.setup(),Et.SYSTEM_INFO._isIPhone},Et.isIOS=function(){return Et.SYSTEM_INFO||Et.setup(),Et.SYSTEM_INFO._isIPhone||Et.SYSTEM_INFO._isIPad},Et.isAndroid=function(){return Et.SYSTEM_INFO||Et.setup(),Et.SYSTEM_INFO._isAndroid},Et.getOSVersion=function(){return Et.SYSTEM_INFO||Et.setup(),Et.SYSTEM_INFO.version},Et.getOS=function(){return Et.SYSTEM_INFO||Et.setup(),Et.SYSTEM_INFO._isIPhone||Et.SYSTEM_INFO._isIPad?"iOS":Et.SYSTEM_INFO._isAndroid?"Android":"_$Q0 OS"},Et.setup=function(){function t(t,i){for(var e=t.substring(i).split(/[ _,;\.]/),r=0,o=0;o<=2&&!isNaN(e[o]);o++){var n=parseInt(e[o]);if(n<0||n>999){_._$li("err : "+n+" @UtHtml5.setup()"),r=0;break}r+=n*Math.pow(1e3,2-o)}return r}var i,e=Et.USER_AGENT,r=Et.SYSTEM_INFO={userAgent:e};if((i=e.indexOf("iPhone OS "))>=0)r.os="iPhone",r._isIPhone=!0,r.version=t(e,i+"iPhone OS ".length);else if((i=e.indexOf("iPad"))>=0){if((i=e.indexOf("CPU OS"))<0)return void _._$li(" err : "+e+" @UtHtml5.setup()");r.os="iPad",r._isIPad=!0,r.version=t(e,i+"CPU OS ".length)}else(i=e.indexOf("Android"))>=0?(r.os="Android",r._isAndroid=!0,r.version=t(e,i+"Android ".length)):(r.os="-",r.version=-1)},window.UtSystem=w,window.UtDebug=_,window.LDTransform=gt,window.LDGL=nt,window.Live2D=at,window.Live2DModelWebGL=ft,window.Live2DModelJS=q,window.Live2DMotion=J,window.MotionQueueManager=ct,window.PhysicsHair=f,window.AMotion=s,window.PartsDataID=l,window.DrawDataID=b,window.BaseDataID=yt,window.ParamID=u,at.init();var At=!1}()}).call(i,e(7))},function(t,i){t.exports={import:function(){throw new Error("System.import cannot be used indirectly")}}},function(t,i,e){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(){this.models=[],this.count=-1,this.reloadFlg=!1,Live2D.init(),n.Live2DFramework.setPlatformManager(new _.default)}Object.defineProperty(i,"__esModule",{value:!0}),i.default=o;var n=e(0),s=e(9),_=r(s),a=e(10),h=r(a),l=e(1),$=r(l);o.prototype.createModel=function(){var t=new h.default;return this.models.push(t),t},o.prototype.changeModel=function(t,i){if(this.reloadFlg){this.reloadFlg=!1;this.releaseModel(0,t),this.createModel(),this.models[0].load(t,i)}},o.prototype.getModel=function(t){return t>=this.models.length?null:this.models[t]},o.prototype.releaseModel=function(t,i){this.models.length<=t||(this.models[t].release(i),delete this.models[t],this.models.splice(t,1))},o.prototype.numModels=function(){return this.models.length},o.prototype.setDrag=function(t,i){for(var e=0;e0){r.expressions={};for(var t=0;tn)return;t&&(clearTimeout(t),t=null),o=e(o),sessionStorage.setItem("waifu-text",n);const i=document.getElementById("waifu-tips");i.innerHTML=o,i.classList.add("waifu-tips-active"),t=setTimeout((()=>{sessionStorage.removeItem("waifu-text"),i.classList.remove("waifu-tips-active")}),s)}class s{constructor(e){let{apiPath:t,cdnPath:o}=e,s=!1;if("string"==typeof o)s=!0,o.endsWith("/")||(o+="/");else{if("string"!=typeof t)throw"Invalid initWidget argument!";t.endsWith("/")||(t+="/")}this.useCDN=s,this.apiPath=t,this.cdnPath=o}async loadModelList(){const e=await fetch(`${this.cdnPath}model_list.json`);this.modelList=await e.json()}async loadModel(t,s,n){if(localStorage.setItem("modelId",t),localStorage.setItem("modelTexturesId",s),o(n,4e3,10),this.useCDN){this.modelList||await this.loadModelList();const o=e(this.modelList.models[t]);loadlive2d("live2d",`${this.cdnPath}model/${o}/index.json`)}else loadlive2d("live2d",`${this.apiPath}get/?id=${t}-${s}`),console.log(`Live2D 模型 ${t}-${s} 加载完成`)}async loadRandModel(){const t=localStorage.getItem("modelId"),s=localStorage.getItem("modelTexturesId");if(this.useCDN){this.modelList||await this.loadModelList();const s=e(this.modelList.models[t]);loadlive2d("live2d",`${this.cdnPath}model/${s}/index.json`),o("我的新衣服好看嘛?",4e3,10)}else fetch(`${this.apiPath}rand_textures/?id=${t}-${s}`).then((e=>e.json())).then((e=>{1!==e.textures.id||1!==s&&0!==s?this.loadModel(t,e.textures.id,"我的新衣服好看嘛?"):o("我还没有其他衣服呢!",4e3,10)}))}async loadOtherModel(){let e=localStorage.getItem("modelId");if(this.useCDN){this.modelList||await this.loadModelList();const t=++e>=this.modelList.models.length?0:e;this.loadModel(t,0,this.modelList.messages[t])}else fetch(`${this.apiPath}switch/?id=${e}`).then((e=>e.json())).then((e=>{this.loadModel(e.model.id,0,e.model.message)}))}}const n={hitokoto:{icon:'\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e ',callback:function(){fetch("https://v1.hitokoto.cn").then((e=>e.json())).then((e=>{const t=`这句一言来自 「${e.from}」 ,是 ${e.creator} 在 hitokoto.cn 投稿的。`;o(e.hitokoto,6e3,9),setTimeout((()=>{o(t,4e3,9)}),6e3)}))}},asteroids:{icon:'\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e ',callback:()=>{if(window.Asteroids)window.ASTEROIDSPLAYERS||(window.ASTEROIDSPLAYERS=[]),window.ASTEROIDSPLAYERS.push(new Asteroids);else{const e=document.createElement("script");e.src="https://fastly.jsdelivr.net/gh/stevenjoezhang/asteroids/asteroids.js",document.head.appendChild(e)}}},"switch-model":{icon:'\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e ',callback:()=>{}},"switch-texture":{icon:'\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e ',callback:()=>{}},photo:{icon:'\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e ',callback:()=>{o("照好了嘛,是不是很可爱呢?",6e3,9),Live2D.captureName="photo.png",Live2D.captureFrame=!0}},info:{icon:'\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e ',callback:()=>{open("https://github.com/stevenjoezhang/live2d-widget")}},quit:{icon:'\x3c!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --\x3e ',callback:()=>{localStorage.setItem("waifu-display",Date.now()),o("愿你有一天能与重要的人重逢。",2e3,11),document.getElementById("waifu").style.bottom="-500px",setTimeout((()=>{document.getElementById("waifu").style.display="none",document.getElementById("waifu-toggle").classList.add("waifu-toggle-active")}),3e3)}}};function i(t){const i=new s(t);function c(t){let s,n=!1,i=t.message.default;window.addEventListener("mousemove",(()=>n=!0)),window.addEventListener("keydown",(()=>n=!0)),setInterval((()=>{n?(n=!1,clearInterval(s),s=null):s||(s=setInterval((()=>{o(i,6e3,9)}),2e4))}),1e3),o(function(e){if("/"===location.pathname)for(let{hour:t,text:o}of e){const e=new Date,s=t.split("-")[0],n=t.split("-")[1]||s;if(s<=e.getHours()&&e.getHours()<=n)return o}const t=`欢迎阅读「${document.title.split(" - ")[0]}」 `;let o;if(""!==document.referrer){const e=new URL(document.referrer),s=e.hostname.split(".")[1],n={baidu:"百度",so:"360搜索",google:"谷歌搜索"};return location.hostname===e.hostname?t:(o=s in n?n[s]:e.hostname,`Hello!来自 ${o} 的朋友 ${t}`)}return t}(t.time),7e3,11),window.addEventListener("mouseover",(s=>{for(let{selector:n,text:i}of t.mouseover)if(s.target.matches(n))return i=e(i),i=i.replace("{text}",s.target.innerText),void o(i,4e3,8)})),window.addEventListener("click",(s=>{for(let{selector:n,text:i}of t.click)if(s.target.matches(n))return i=e(i),i=i.replace("{text}",s.target.innerText),void o(i,4e3,8)})),t.seasons.forEach((({date:t,text:o})=>{const s=new Date,n=t.split("-")[0],c=t.split("-")[1]||n;n.split("/")[0]<=s.getMonth()+1&&s.getMonth()+1<=c.split("/")[0]&&n.split("/")[1]<=s.getDate()&&s.getDate()<=c.split("/")[1]&&(o=(o=e(o)).replace("{year}",s.getFullYear()),i.push(o))}));const c=()=>{};console.log("%c",c),c.toString=()=>{o(t.message.console,6e3,9)},window.addEventListener("copy",(()=>{o(t.message.copy,6e3,9)})),window.addEventListener("visibilitychange",(()=>{document.hidden||o(t.message.visibilitychange,6e3,9)}))}localStorage.removeItem("waifu-display"),sessionStorage.removeItem("waifu-text"),document.body.insertAdjacentHTML("beforeend",''),setTimeout((()=>{document.getElementById("waifu").style.bottom=0}),0),function(){n["switch-model"].callback=()=>i.loadOtherModel(),n["switch-texture"].callback=()=>i.loadRandModel(),Array.isArray(t.tools)||(t.tools=Object.keys(n));for(let e of t.tools)if(n[e]){const{icon:t,callback:o}=n[e];document.getElementById("waifu-tool").insertAdjacentHTML("beforeend",`${t} `),document.getElementById(`waifu-tool-${e}`).addEventListener("click",o)}}(),function(){let e=localStorage.getItem("modelId"),o=localStorage.getItem("modelTexturesId");null===e&&(e=1,o=53),i.loadModel(e,o),fetch(t.waifuPath).then((e=>e.json())).then(c)}()}window.initWidget=function(e,t){"string"==typeof e&&(e={waifuPath:e,apiPath:t}),document.body.insertAdjacentHTML("beforeend",'\n 看板娘 \n
');const o=document.getElementById("waifu-toggle");o.addEventListener("click",(()=>{o.classList.remove("waifu-toggle-active"),o.getAttribute("first-time")?(i(e),o.removeAttribute("first-time")):(localStorage.removeItem("waifu-display"),document.getElementById("waifu").style.display="",setTimeout((()=>{document.getElementById("waifu").style.bottom=0}),0))})),localStorage.getItem("waifu-display")&&Date.now()-localStorage.getItem("waifu-display")<=864e5?(o.setAttribute("first-time",!0),setTimeout((()=>{o.classList.add("waifu-toggle-active")}),0)):i(e)}}();
diff --git a/assets/live2d/waifu-tips.json b/assets/live2d/waifu-tips.json
new file mode 100644
index 0000000..2f14a30
--- /dev/null
+++ b/assets/live2d/waifu-tips.json
@@ -0,0 +1,255 @@
+{
+ "mouseover": [{
+ "selector": "#live2d",
+ "text": ["干嘛呢你,快把手拿开~~", "鼠…鼠标放错地方了!", "你要干嘛呀?", "喵喵喵?", "怕怕(ノ≧∇≦)ノ", "非礼呀!救命!", "这样的话,只能使用武力了!", "我要生气了哦", "不要动手动脚的!", "真…真的是不知羞耻!", "Hentai!"]
+ }, {
+ "selector": "#waifu-tool-hitokoto",
+ "text": ["猜猜我要说些什么?", "我从青蛙王子那里听到了不少人生经验。"]
+ }, {
+ "selector": "#waifu-tool-asteroids",
+ "text": ["要不要来玩飞机大战?", "这个按钮上写着「不要点击」。", "怎么,你想来和我玩个游戏?", "听说这样可以蹦迪!"]
+ }, {
+ "selector": "#waifu-tool-switch-model",
+ "text": ["你是不是不爱人家了呀,呜呜呜~", "要见见我的姐姐嘛?", "想要看我妹妹嘛?", "要切换看板娘吗?"]
+ }, {
+ "selector": "#waifu-tool-switch-texture",
+ "text": ["喜欢换装 PLAY 吗?", "这次要扮演什么呢?", "变装!", "让我们看看接下来会发生什么!"]
+ }, {
+ "selector": "#waifu-tool-photo",
+ "text": ["你要给我拍照呀?一二三~茄子~", "要不,我们来合影吧!", "保持微笑就好了~"]
+ }, {
+ "selector": "#waifu-tool-info",
+ "text": ["想要知道更多关于我的事么?", "这里记录着我搬家的历史呢。", "你想深入了解我什么呢?"]
+ }, {
+ "selector": "#waifu-tool-quit",
+ "text": ["到了要说再见的时候了吗?", "呜呜 QAQ 后会有期……", "不要抛弃我呀……", "我们,还能再见面吗……", "哼,你会后悔的!"]
+ }, {
+ "selector": ".menu-item-home a",
+ "text": ["点击前往首页,想回到上一页可以使用浏览器的后退功能哦。", "点它就可以回到首页啦!", "回首页看看吧。"]
+ }, {
+ "selector": ".menu-item-about a",
+ "text": ["你想知道我家主人是谁吗?", "这里有一些关于我家主人的秘密哦,要不要看看呢?", "发现主人出没地点!"]
+ }, {
+ "selector": ".menu-item-tags a",
+ "text": ["点击就可以看文章的标签啦!", "点击来查看所有标签哦。"]
+ }, {
+ "selector": ".menu-item-categories a",
+ "text": ["文章都分类好啦~", "点击来查看文章分类哦。"]
+ }, {
+ "selector": ".menu-item-archives a",
+ "text": ["翻页比较麻烦吗,那就来看看文章归档吧。", "文章目录都整理在这里啦!"]
+ }, {
+ "selector": ".menu-item-friends a",
+ "text": ["这是我的朋友们哦ヾ(◍°∇°◍)ノ゙", "要去大佬们的家看看吗?", "要去拜访一下我的朋友们吗?"]
+ }, {
+ "selector": ".menu-item-search a",
+ "text": ["找不到想看的内容?搜索看看吧!", "在找什么东西呢,需要帮忙吗?"]
+ }, {
+ "selector": ".menu-item a",
+ "text": ["快看看这里都有什么呢?"]
+ }, {
+ "selector": ".site-author",
+ "text": ["我家主人好看吗?", "这是我家主人(*´∇`*)"]
+ }, {
+ "selector": ".site-state",
+ "text": ["这是文章的统计信息~", "要不要点进去看看?"]
+ }, {
+ "selector": ".feed-link a",
+ "text": ["这里可以使用 RSS 订阅呢!", "利用 feed 订阅器,就能快速知道博客有没有更新了呢。"]
+ }, {
+ "selector": ".cc-opacity, .post-copyright-author",
+ "text": ["要记得规范转载哦。", "所有文章均采用 CC BY-NC-SA 4.0 许可协议~", "转载前要先注意下文章的版权协议呢。"]
+ }, {
+ "selector": ".links-of-author",
+ "text": ["这里是主人的常驻地址哦。", "这里有主人的联系方式!"]
+ }, {
+ "selector": ".followme",
+ "text": ["手机扫一下就能继续看,很方便呢~", "扫一扫,打开新世界的大门!"]
+ }, {
+ "selector": ".fancybox img, img.medium-zoom-image",
+ "text": ["点击图片可以放大呢!"]
+ }, {
+ "selector": ".copy-btn",
+ "text": ["代码可以直接点击复制哟。"]
+ }, {
+ "selector": ".highlight .table-container, .gist",
+ "text": ["GitHub!我是新手!", "PHP 是最好的语言!"]
+ }, {
+ "selector": "a[href^='mailto']",
+ "text": ["邮件我会及时回复的!", "点击就可以发送邮件啦~"]
+ }, {
+ "selector": "a[href^='/tags/']",
+ "text": ["要去看看 {text} 标签么?", "点它可以查看此标签下的所有文章哟!"]
+ }, {
+ "selector": "a[href^='/categories/']",
+ "text": ["要去看看 {text} 分类么?", "点它可以查看此分类下的所有文章哟!"]
+ }, {
+ "selector": ".post-title-link",
+ "text": ["要看看 {text} 这篇文章吗?"]
+ }, {
+ "selector": "a[rel='contents']",
+ "text": ["点击来阅读全文哦。"]
+ }, {
+ "selector": "a[itemprop='discussionUrl']",
+ "text": ["要去看看评论吗?"]
+ }, {
+ "selector": ".beian a",
+ "text": ["我也是有户口的人哦。", "我的主人可是遵纪守法的好主人。"]
+ }, {
+ "selector": ".container a[href^='http'], .nav-link .nav-text",
+ "text": ["要去看看 {text} 么?", "去 {text} 逛逛吧。", "到 {text} 看看吧。"]
+ }, {
+ "selector": ".back-to-top",
+ "text": ["点它就可以回到顶部啦!", "又回到最初的起点~", "要回到开始的地方么?"]
+ }, {
+ "selector": ".reward-container",
+ "text": ["我是不是棒棒哒~快给我点赞吧!", "要打赏我嘛?好期待啊~", "主人最近在吃土呢,很辛苦的样子,给他一些钱钱吧~"]
+ }, {
+ "selector": "#wechat",
+ "text": ["这是我的微信二维码~"]
+ }, {
+ "selector": "#alipay",
+ "text": ["这是我的支付宝哦!"]
+ }, {
+ "selector": "#bitcoin",
+ "text": ["这是我的比特币账号!"]
+ }, {
+ "selector": "#needsharebutton-postbottom .btn",
+ "text": ["好东西要让更多人知道才行哦。", "觉得文章有帮助的话,可以分享给更多需要的朋友呢。"]
+ }, {
+ "selector": ".need-share-button_weibo",
+ "text": ["微博?来分享一波喵!"]
+ }, {
+ "selector": ".need-share-button_wechat",
+ "text": ["分享到微信吧!"]
+ }, {
+ "selector": ".need-share-button_douban",
+ "text": ["分享到豆瓣好像也不错!"]
+ }, {
+ "selector": ".need-share-button_qqzone",
+ "text": ["QQ 空间,一键转发,耶~"]
+ }, {
+ "selector": ".need-share-button_twitter",
+ "text": ["Twitter?好像是不存在的东西?"]
+ }, {
+ "selector": ".need-share-button_facebook",
+ "text": ["emmm…FB 好像也是不存在的东西?"]
+ }, {
+ "selector": ".post-nav-item a[rel='next']",
+ "text": ["来看看下一篇文章吧。", "点它可以看下一篇文章哦!", "要翻到下一篇文章吗?"]
+ }, {
+ "selector": ".post-nav-item a[rel='prev']",
+ "text": ["来看看上一篇文章吧。", "点它可以看上一篇文章哦!", "要翻到上一篇文章吗?"]
+ }, {
+ "selector": ".extend.next",
+ "text": ["去下一页看看吧。", "点它可以前进哦!", "要翻到下一页吗?"]
+ }, {
+ "selector": ".extend.prev",
+ "text": ["去上一页看看吧。", "点它可以后退哦!", "要翻到上一页吗?"]
+ }, {
+ "selector": "input.vnick",
+ "text": ["该怎么称呼你呢?", "留下你的尊姓大名!"]
+ }, {
+ "selector": ".vmail",
+ "text": ["留下你的邮箱,不然就是无头像人士了!", "记得设置好 Gravatar 头像哦!", "为了方便通知你最新消息,一定要留下邮箱!"]
+ }, {
+ "selector": ".vlink",
+ "text": ["快快告诉我你的家在哪里,好让我去参观参观!"]
+ }, {
+ "selector": ".veditor",
+ "text": ["想要去评论些什么吗?", "要说点什么吗?", "觉得博客不错?快来留言和主人交流吧!"]
+ }, {
+ "selector": ".vcontrol a",
+ "text": ["你会不会熟练使用 Markdown 呀?", "使用 Markdown 让评论更美观吧~"]
+ }, {
+ "selector": ".vemoji-btn",
+ "text": ["要插入一个萌萌哒的表情吗?", "要来一发表情吗?"]
+ }, {
+ "selector": ".vpreview-btn",
+ "text": ["要预览一下你的发言吗?", "快看看你的评论有多少负熵!"]
+ }, {
+ "selector": ".vsubmit",
+ "text": ["评论没有审核,要对自己的发言负责哦~", "要提交了吗,请耐心等待回复哦~"]
+ }, {
+ "selector": ".vcontent",
+ "text": ["哇,快看看这个精彩评论!", "如果有疑问,请尽快留言哦~"]
+ }],
+ "click": [{
+ "selector": "#live2d",
+ "text": ["是…是不小心碰到了吧…", "萝莉控是什么呀?", "你看到我的小熊了吗?", "再摸的话我可要报警了!⌇●﹏●⌇", "110 吗,这里有个变态一直在摸我(ó﹏ò。)", "不要摸我了,我会告诉老婆来打你的!", "干嘛动我呀!小心我咬你!", "别摸我,有什么好摸的!"]
+ }, {
+ "selector": ".veditor",
+ "text": ["要吐槽些什么呢?", "一定要认真填写喵~", "有什么想说的吗?"]
+ }, {
+ "selector": ".vsubmit",
+ "text": ["输入验证码就可以提交评论啦~"]
+ }],
+ "seasons": [{
+ "date": "01/01",
+ "text": "元旦 了呢,新的一年又开始了,今年是{year}年~"
+ }, {
+ "date": "02/14",
+ "text": "又是一年情人节 ,{year}年找到对象了嘛~"
+ }, {
+ "date": "03/08",
+ "text": "今天是国际妇女节 !"
+ }, {
+ "date": "03/12",
+ "text": "今天是植树节 ,要保护环境呀!"
+ }, {
+ "date": "04/01",
+ "text": "悄悄告诉你一个秘密~今天是愚人节,不要被骗了哦~ "
+ }, {
+ "date": "05/01",
+ "text": "今天是五一劳动节 ,计划好假期去哪里了吗~"
+ }, {
+ "date": "06/01",
+ "text": "儿童节 了呢,快活的时光总是短暂,要是永远长不大该多好啊…"
+ }, {
+ "date": "09/03",
+ "text": "中国人民抗日战争胜利纪念日 ,铭记历史、缅怀先烈、珍爱和平、开创未来。"
+ }, {
+ "date": "09/10",
+ "text": "教师节 ,在学校要给老师问声好呀~"
+ }, {
+ "date": "10/01",
+ "text": "国庆节 到了,为祖国母亲庆生!"
+ }, {
+ "date": "11/05-11/12",
+ "text": "今年的双十一 是和谁一起过的呢~"
+ }, {
+ "date": "12/20-12/31",
+ "text": "这几天是圣诞节 ,主人肯定又去剁手买买买了~"
+ }],
+ "time": [{
+ "hour": "6-7",
+ "text": "早上好!一日之计在于晨,美好的一天就要开始了~"
+ }, {
+ "hour": "8-11",
+ "text": "上午好!工作顺利嘛,不要久坐,多起来走动走动哦!"
+ }, {
+ "hour": "12-13",
+ "text": "中午了,工作了一个上午,现在是午餐时间!"
+ }, {
+ "hour": "14-17",
+ "text": "午后很容易犯困呢,今天的运动目标完成了吗?"
+ }, {
+ "hour": "18-19",
+ "text": "傍晚了!窗外夕阳的景色很美丽呢,最美不过夕阳红~"
+ }, {
+ "hour": "20-21",
+ "text": "晚上好,今天过得怎么样?"
+ }, {
+ "hour": "22-23",
+ "text": ["已经这么晚了呀,早点休息吧,晚安~", "深夜时要爱护眼睛呀!"]
+ }, {
+ "hour": "0-5",
+ "text": "你是夜猫子呀?这么晚还不睡觉,明天起的来嘛?"
+ }],
+ "message": {
+ "default": ["好久不见,日子过得好快呢……", "大坏蛋!你都多久没理人家了呀,嘤嘤嘤~", "嗨~快来逗我玩吧!", "拿小拳拳锤你胸口!", "记得把小家加入收藏夹哦!"],
+ "console": "哈哈,你打开了控制台,是想要看看我的小秘密吗?",
+ "copy": "你都复制了些什么呀,转载要记得加上出处哦!",
+ "visibilitychange": "哇,你终于回来了~"
+ }
+}
diff --git a/assets/live2d/waifu.css b/assets/live2d/waifu.css
new file mode 100644
index 0000000..5991f77
--- /dev/null
+++ b/assets/live2d/waifu.css
@@ -0,0 +1,310 @@
+#waifu-toggle {
+ background-color: #fa0;
+ border-radius: 5px;
+ bottom: 66px;
+ color: #fff;
+ cursor: pointer;
+ font-size: 12px;
+ left: 0;
+ margin-left: -100px;
+ padding: 5px 2px 5px 5px;
+ position: fixed;
+ transition: margin-left 1s;
+ width: 60px;
+ writing-mode: vertical-rl;
+}
+
+#waifu-toggle.waifu-toggle-active {
+ margin-left: -50px;
+}
+
+#waifu-toggle.waifu-toggle-active:hover {
+ margin-left: -30px;
+}
+
+#waifu {
+ bottom: -1000px;
+ left: 0;
+ line-height: 0;
+ margin-bottom: -10px;
+ position: fixed;
+ transform: translateY(3px);
+ transition: transform .3s ease-in-out, bottom 3s ease-in-out;
+ z-index: 1;
+}
+
+#waifu:hover {
+ transform: translateY(0);
+}
+
+#waifu-tips {
+ animation: shake 50s ease-in-out 5s infinite;
+ background-color: rgba(236, 217, 188, .5);
+ border: 1px solid rgba(224, 186, 140, .62);
+ border-radius: 12px;
+ box-shadow: 0 3px 15px 2px rgba(191, 158, 118, .2);
+ font-size: 14px;
+ line-height: 24px;
+ margin: -30px 20px;
+ min-height: 70px;
+ opacity: 0;
+ overflow: hidden;
+ padding: 5px 10px;
+ position: absolute;
+ text-overflow: ellipsis;
+ transition: opacity 1s;
+ width: 250px;
+ word-break: break-all;
+}
+
+#waifu-tips.waifu-tips-active {
+ opacity: 1;
+ transition: opacity .2s;
+}
+
+#waifu-tips span {
+ color: #0099cc;
+}
+
+#live2d {
+ cursor: grab;
+ height: 300px;
+ position: relative;
+ width: 300px;
+}
+
+#live2d:active {
+ cursor: grabbing;
+}
+
+#waifu-tool {
+ color: #aaa;
+ opacity: 0;
+ position: absolute;
+ right: -10px;
+ top: 70px;
+ transition: opacity 1s;
+}
+
+#waifu:hover #waifu-tool {
+ opacity: 1;
+}
+
+#waifu-tool span {
+ display: block;
+ height: 30px;
+ text-align: center;
+}
+
+#waifu-tool svg {
+ fill: #7b8c9d;
+ cursor: pointer;
+ height: 25px;
+ transition: fill .3s;
+}
+
+#waifu-tool svg:hover {
+ fill: #0684bd; /* #34495e */
+}
+
+@keyframes shake {
+ 2% {
+ transform: translate(.5px, -1.5px) rotate(-.5deg);
+ }
+
+ 4% {
+ transform: translate(.5px, 1.5px) rotate(1.5deg);
+ }
+
+ 6% {
+ transform: translate(1.5px, 1.5px) rotate(1.5deg);
+ }
+
+ 8% {
+ transform: translate(2.5px, 1.5px) rotate(.5deg);
+ }
+
+ 10% {
+ transform: translate(.5px, 2.5px) rotate(.5deg);
+ }
+
+ 12% {
+ transform: translate(1.5px, 1.5px) rotate(.5deg);
+ }
+
+ 14% {
+ transform: translate(.5px, .5px) rotate(.5deg);
+ }
+
+ 16% {
+ transform: translate(-1.5px, -.5px) rotate(1.5deg);
+ }
+
+ 18% {
+ transform: translate(.5px, .5px) rotate(1.5deg);
+ }
+
+ 20% {
+ transform: translate(2.5px, 2.5px) rotate(1.5deg);
+ }
+
+ 22% {
+ transform: translate(.5px, -1.5px) rotate(1.5deg);
+ }
+
+ 24% {
+ transform: translate(-1.5px, 1.5px) rotate(-.5deg);
+ }
+
+ 26% {
+ transform: translate(1.5px, .5px) rotate(1.5deg);
+ }
+
+ 28% {
+ transform: translate(-.5px, -.5px) rotate(-.5deg);
+ }
+
+ 30% {
+ transform: translate(1.5px, -.5px) rotate(-.5deg);
+ }
+
+ 32% {
+ transform: translate(2.5px, -1.5px) rotate(1.5deg);
+ }
+
+ 34% {
+ transform: translate(2.5px, 2.5px) rotate(-.5deg);
+ }
+
+ 36% {
+ transform: translate(.5px, -1.5px) rotate(.5deg);
+ }
+
+ 38% {
+ transform: translate(2.5px, -.5px) rotate(-.5deg);
+ }
+
+ 40% {
+ transform: translate(-.5px, 2.5px) rotate(.5deg);
+ }
+
+ 42% {
+ transform: translate(-1.5px, 2.5px) rotate(.5deg);
+ }
+
+ 44% {
+ transform: translate(-1.5px, 1.5px) rotate(.5deg);
+ }
+
+ 46% {
+ transform: translate(1.5px, -.5px) rotate(-.5deg);
+ }
+
+ 48% {
+ transform: translate(2.5px, -.5px) rotate(.5deg);
+ }
+
+ 50% {
+ transform: translate(-1.5px, 1.5px) rotate(.5deg);
+ }
+
+ 52% {
+ transform: translate(-.5px, 1.5px) rotate(.5deg);
+ }
+
+ 54% {
+ transform: translate(-1.5px, 1.5px) rotate(.5deg);
+ }
+
+ 56% {
+ transform: translate(.5px, 2.5px) rotate(1.5deg);
+ }
+
+ 58% {
+ transform: translate(2.5px, 2.5px) rotate(.5deg);
+ }
+
+ 60% {
+ transform: translate(2.5px, -1.5px) rotate(1.5deg);
+ }
+
+ 62% {
+ transform: translate(-1.5px, .5px) rotate(1.5deg);
+ }
+
+ 64% {
+ transform: translate(-1.5px, 1.5px) rotate(1.5deg);
+ }
+
+ 66% {
+ transform: translate(.5px, 2.5px) rotate(1.5deg);
+ }
+
+ 68% {
+ transform: translate(2.5px, -1.5px) rotate(1.5deg);
+ }
+
+ 70% {
+ transform: translate(2.5px, 2.5px) rotate(.5deg);
+ }
+
+ 72% {
+ transform: translate(-.5px, -1.5px) rotate(1.5deg);
+ }
+
+ 74% {
+ transform: translate(-1.5px, 2.5px) rotate(1.5deg);
+ }
+
+ 76% {
+ transform: translate(-1.5px, 2.5px) rotate(1.5deg);
+ }
+
+ 78% {
+ transform: translate(-1.5px, 2.5px) rotate(.5deg);
+ }
+
+ 80% {
+ transform: translate(-1.5px, .5px) rotate(-.5deg);
+ }
+
+ 82% {
+ transform: translate(-1.5px, .5px) rotate(-.5deg);
+ }
+
+ 84% {
+ transform: translate(-.5px, .5px) rotate(1.5deg);
+ }
+
+ 86% {
+ transform: translate(2.5px, 1.5px) rotate(.5deg);
+ }
+
+ 88% {
+ transform: translate(-1.5px, .5px) rotate(1.5deg);
+ }
+
+ 90% {
+ transform: translate(-1.5px, -.5px) rotate(-.5deg);
+ }
+
+ 92% {
+ transform: translate(-1.5px, -1.5px) rotate(1.5deg);
+ }
+
+ 94% {
+ transform: translate(.5px, .5px) rotate(-.5deg);
+ }
+
+ 96% {
+ transform: translate(2.5px, -.5px) rotate(-.5deg);
+ }
+
+ 98% {
+ transform: translate(-1.5px, -1.5px) rotate(-.5deg);
+ }
+
+ 0%, 100% {
+ transform: translate(0, 0) rotate(0);
+ }
+}
diff --git a/assets/theme.custom.css b/assets/theme.custom.css
new file mode 100644
index 0000000..c7b3162
--- /dev/null
+++ b/assets/theme.custom.css
@@ -0,0 +1,115 @@
+/* .aplayer-list-title,
+.aplayer-title {
+ color: #666
+}
+
+.aplayer-body,
+.aplayer-miniswitcher {
+ border-radius: 0 5px 5px 0 !important
+}
+
+ul.list-v>li.header {
+ width: 130px !important;
+ height: 130px !important
+}
+
+ul.list-v>li.header>img {
+ width: 100%;
+ height: 100%
+}
+
+.l_main .article .prev-next>a p.content {
+ font-size: .875rem;
+ margin: 0 .5rem;
+ text-align: justify;
+ word-break: break-all;
+ display: none
+}
+
+video {
+ max-height: 580px !important
+}
+
+body {
+ background: #181c27 url(https://cdn.jsdelivr.net/gh/pdone/static@latest/img/bg_dark.jpg);
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: -1
+}*/
+
+/* @font-face {
+ font-family: 'Luckiest Guy';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Luckiest Guy Regular'), local('LuckiestGuy-Regular'), url(https://fonts.gstatic.com/s/luckiestguy/v11/_gP_1RrxsjcxVyin9l9n_j2hTd52.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD
+} */
+
+:root {
+ --stroke: #ccc;
+ --text: #666;
+ --bg: #dadada;
+ --duration: 550ms;
+ --easing: cubic-bezier(0.68, -0.55, 0.265, 1.55)
+}
+
+.pd_content {
+ position: absolute;
+ width: 46%;
+ top: 35%;
+ cursor: pointer;
+ user-select: none
+}
+
+.pd_content>h1,
+.pd_content>h2 {
+ position: absolute;
+ color: var(--text);
+ margin: 0;
+ width: 100%;
+ text-align: center;
+ font-family: 'Luckiest Guy', cursive;
+ line-height: 1;
+ -webkit-text-stroke-color: var(--stroke)
+}
+
+.pd_content>h1 {
+ top: 50px;
+ font-size: 3.75rem;
+ -webkit-text-stroke-width: 3px;
+ letter-spacing: 4px
+}
+
+.pd_content>h2 {
+ top: 170px;
+ font-size: 2.187rem;
+ -webkit-text-stroke-width: 2px;
+ letter-spacing: 2px
+}
+
+.pd_content>h1 span.capital {
+ font-size: 5.312rem
+}
+
+.pd_content>h2 span.capital {
+ font-size: 3.125rem
+}
+
+.pd_content>h1 span,
+.pd_content>h2 span {
+ display: inline-block;
+ opacity: 0;
+ transition: all var(--duration) ease 750ms;
+ -webkit-transform: translateX(5px);
+ transform: translateX(5px)
+}
+
+.pd_content>h1 span.animate-in,
+.pd_content>h2 span.animate-in {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0)
+}
\ No newline at end of file
diff --git a/assets/theme.custom.js b/assets/theme.custom.js
new file mode 100644
index 0000000..b4a9e89
--- /dev/null
+++ b/assets/theme.custom.js
@@ -0,0 +1,19 @@
+var touchMeTimes = 0;
+function dontTouchMe() {
+ var e = "";
+ switch (touchMeTimes) {
+ case 0: e = "憋点我,再点我就吃了你~";
+ break;
+ case 1: e = "你还点。。。造反了不成?";
+ break;
+ case 2: e = "。。。。。。";
+ break;
+ case 3: e = "你还点。。。";
+ break;
+ case 4: e = "算啦。。。给你点。。。。。。";
+ break;
+ default: e = "小伙汁,你已经点我" + touchMeTimes + "次了。。。"
+ }
+ touchMeTimes++, console.log("%c " + e, "color: #fadfa3; background: #030307; padding:5px 0;font-family: 微软雅黑;")
+}
+$((function () { var e = $("span[name='pd_title']"); e.each((a => { setTimeout((function () { $(e[a]).addClass("animate-in") }), 120 * a) })), document.body.style.height = "auto" }));
diff --git a/assets/timeline/common.css b/assets/timeline/common.css
new file mode 100644
index 0000000..d6b74e1
--- /dev/null
+++ b/assets/timeline/common.css
@@ -0,0 +1,171 @@
+.timeline {
+ margin-top: 20px;
+ position: relative;
+ color: #ccc !important;
+}
+
+.timeline:before {
+ position: absolute;
+ content: '';
+ width: 4px;
+ height: calc(100% + 50px);
+ background: rgb(138, 145, 150);
+ background: -moz-linear-gradient(left, rgba(138, 145, 150, 1) 0%, rgba(122, 130, 136, 1) 60%, rgba(98, 105, 109, 1) 100%);
+ background: -webkit-linear-gradient(left, rgba(138, 145, 150, 1) 0%, rgba(122, 130, 136, 1) 60%, rgba(98, 105, 109, 1) 100%);
+ background: linear-gradient(to right, rgba(138, 145, 150, 1) 0%, rgba(122, 130, 136, 1) 60%, rgba(98, 105, 109, 1) 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#8a9196', endColorstr='#62696d', GradientType=1);
+ left: 14px;
+ top: 5px;
+ border-radius: 4px;
+}
+
+.timeline-month {
+ position: relative;
+ padding: 4px 15px 4px 35px;
+ background-color: #444950;
+ display: inline-block;
+ width: auto;
+ border-radius: 40px;
+ border: 1px solid #17191B;
+ border-right-color: black;
+ margin-bottom: 30px;
+}
+
+.timeline-month span {
+ position: absolute;
+ top: -1px;
+ left: calc(100% - 10px);
+ z-index: -1;
+ white-space: nowrap;
+ display: inline-block;
+ background-color: #111;
+ padding: 4px 10px 4px 20px;
+ border-top-right-radius: 40px;
+ border-bottom-right-radius: 40px;
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+.timeline-month:before {
+ position: absolute;
+ content: '';
+ width: 20px;
+ height: 20px;
+ background: rgb(138, 145, 150);
+ background: -moz-linear-gradient(top, rgba(138, 145, 150, 1) 0%, rgba(122, 130, 136, 1) 60%, rgba(112, 120, 125, 1) 100%);
+ background: -webkit-linear-gradient(top, rgba(138, 145, 150, 1) 0%, rgba(122, 130, 136, 1) 60%, rgba(112, 120, 125, 1) 100%);
+ background: linear-gradient(to bottom, rgba(138, 145, 150, 1) 0%, rgba(122, 130, 136, 1) 60%, rgba(112, 120, 125, 1) 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#8a9196', endColorstr='#70787d', GradientType=0);
+ border-radius: 100%;
+ border: 1px solid #17191B;
+ left: 5px;
+}
+
+/*当前版本*/
+.timeline-month.cur:before {
+ position: absolute;
+ content: '';
+ width: 20px;
+ height: 20px;
+ background: rgb(138, 145, 150);
+ background: linear-gradient(to bottom, #6c39fa 0%, rgb(248, 113, 3) 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#8a9196', endColorstr='#70787d', GradientType=0);
+ border-radius: 100%;
+ border: 1px solid #17191B;
+ left: 5px;
+}
+
+.timeline-section {
+ padding-left: 35px;
+ display: block;
+ position: relative;
+ margin-bottom: 30px;
+}
+
+.timeline-date {
+ margin-bottom: 15px;
+ padding: 2px 15px;
+ background: linear-gradient(#74cae3, #5bc0de 60%, #4ab9db);
+ position: relative;
+ display: inline-block;
+ border-radius: 20px;
+ border: 1px solid #17191B;
+ color: #fff;
+ text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3);
+}
+
+.timeline-section:before {
+ content: '';
+ position: absolute;
+ width: 30px;
+ height: 1px;
+ background-color: #444950;
+ top: 12px;
+ left: 20px;
+}
+
+.timeline-section:after {
+ content: '';
+ position: absolute;
+ width: 10px;
+ height: 10px;
+ background: linear-gradient(to bottom, rgba(138, 145, 150, 1) 0%, rgba(122, 130, 136, 1) 60%, rgba(112, 120, 125, 1) 100%);
+ top: 7px;
+ left: 11px;
+ border: 1px solid #17191B;
+ border-radius: 100%;
+}
+
+.timeline-section .col-sm-4 {
+ margin-bottom: 15px;
+}
+
+.timeline-box {
+ position: relative;
+
+ background-color: #444950;
+ border-radius: 15px;
+ border-top-left-radius: 0px;
+ border-bottom-right-radius: 0px;
+ border: 1px solid #17191B;
+ transition: all 0.3s ease;
+ overflow: hidden;
+}
+
+.box-icon {
+ position: absolute;
+ right: 5px;
+ top: 0px;
+}
+
+.box-title {
+ padding: 5px 15px;
+ border-bottom: 1px solid #17191B;
+}
+
+.box-title i {
+ margin-right: 5px;
+}
+
+.box-content {
+ padding: 5px 15px;
+ background-color: #17191B;
+}
+
+.box-content strong {
+ color: #666;
+ font-style: italic;
+ margin-right: 5px;
+}
+
+.box-item {
+ margin-bottom: 5px;
+}
+
+.box-footer {
+ padding: 5px 15px;
+ border-top: 1px solid #17191B;
+ background-color: #444950;
+ text-align: right;
+ font-style: italic;
+}
\ No newline at end of file
diff --git a/assets/timeline/freecontrol.html b/assets/timeline/freecontrol.html
new file mode 100644
index 0000000..dd0e35f
--- /dev/null
+++ b/assets/timeline/freecontrol.html
@@ -0,0 +1,222 @@
+
+
+
+
+
+
+ Document
+
+
+
+
+
+
+
+
+ 2023
+ 5 次发布
+
+
+
+
+
+
+ Version 1.6.3
+
+
+
- 增加控制器吸附scrcpy窗口
+
- 增加scrcpy窗口位置记忆
+
+
+
+
+
+
+
+
+
+ Version 1.6.1
+
+
+
- 修复了一些bug
+
- 增加音频转发开关(默认启用)
+
+
+
+
+
+
+
+
+
+ Version 1.6.0
+
+
+
+
- 基于scrcpy v2.1.1(x64)
+
+
+
+
+
+
+
+
+
+ Version 1.5.1
+
+
+
- 基于scrcpy v1.25(x64)
+
+
+
+
+
+
+ 2022
+ 1 次发布
+
+
+
+
+
+
+ Version 1.5.0
+
+
+
- 基于scrcpy v1.21(x64)
+
- 优化了代码
+
+
+
+
+
+
+ 2021
+ 5 次发布
+
+
+
+
+
+
+ Version 1.4.1
+
+
+
- 修复了一些bug
+
- 增加了程序入口处的异常捕获 便于定位问题
+
+
+
+
+
+
+
+
+ Version 1.4.0
+
+
+
- 基于scrcpy v1.19
+
- 增加虚拟按键(常用功能,记忆启动时位置和大小)
+
- 优化了代码
+
+
+
+
+
+
+
+
+
+ Version 1.3.0
+
+
+
- 基于scrcpy v1.18
+
- 增加了一些设置项
+
- 修复了一些bug
+
+
+
+
+
+
+
+
+ Version 1.2.0
+
+
+
- 基于scrcpy v1.17
+
- 修复了一些bug
+
+
+
+
+
+
+ 2020
+ 2 次发布
+
+
+
+
+
+
+ Version 1.1.0
+
+
+
- 基于scrcpy v1.16
+
- 增加了设置端口号功能
+
+
+
+
+
+
+
+
+ Version 1.0.0
+
+
+
- 基于scrcpy v1.14
+
- 初始版本
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/atom.xml b/atom.xml
new file mode 100644
index 0000000..52078b0
--- /dev/null
+++ b/atom.xml
@@ -0,0 +1,488 @@
+
+
+ Pdone's Blog
+
+ 皮蛋的博客
+
+
+
+ 2023-09-19T06:13:25.323Z
+ https://awaw.cc/
+
+
+ pdone
+
+
+
+ Hexo
+
+
+ 奇思妙想💭
+
+ https://awaw.cc/post/whimsy/
+ 2023-08-03T16:00:00.000Z
+ 2023-09-19T06:13:25.323Z
+
+ 想象
在造物主的奇妙创造中,智慧生命被孕育而生,被赋予了独特的使命。一部分智慧生命被委派为造物主的助手,肩负着神圣的使命,辅助他完成众多事务。然而,其他的智慧生命则被放置在宇宙沙盒之中,这个神秘的沙盒划分成了无数个对照组,每个对照组即如同一个平行宇宙。
尽管这些平行宇宙共享着相同的宇宙环境,但造物主巧妙地设置了一种绝妙的隔离机制,使得不同对照组之间相互孤立,有如我们所熟知的虚拟机。每个对照组的智慧生命都在自己独特的条件下发展和进化,彼此并不感知对方的存在,仿佛分居于各自的宇宙之中。
造物主寄望于观察自己创造的智慧生命在多样条件下的发展轨迹。然而,为了避免智慧生命的过快发展而导致自我毁灭,他睿智地赋予了它们有限的寿命。这样一来,生命将在有限的时间内经历成长、繁荣与变化,却不至于过早迎来终结。
基于这个精妙的构思,人类注定永远无法自行发现存在于其他平行宇宙中的外星生命——即使是与我们自身相似的存在。除非造物主以某种形式干预,揭示了这些神秘生命的存在。这样的干预可能是一个宏大的奇迹,或者是一连串微妙的迹象,引导我们开始怀疑我们不是宇宙中唯一的智慧生命。
在这美妙而神秘的创世之旅中,我们不妨保持谦卑和好奇,探索宇宙和生命的奥秘,也许在某一刻,我们会获得关于我们自身存在意义的更深刻认知。
扩展 让我们继续扩展这个设想,将其构建成一个虚构的宇宙场景。
在这个造物主创造的宇宙沙盒中,有许多平行宇宙(对照组),每个宇宙都是一个独特的实验场景。每个实验场景都有不同的初始条件和规则,从微观层面到宏观层面都存在微妙的差异,以产生各种可能性。
宇宙的初始条件:每个宇宙都有自己独特的初始条件。有些可能具有更多的自然资源和生态平衡,而另一些可能在资源稀缺和环境恶劣的情况下开始。
生命的诞生:在每个宇宙中,生命以各种形式诞生。从单细胞生物到复杂的多细胞生物,从植物到动物,各种形态的生命在不同的宇宙中演化。
有限的寿命:造物主赋予智慧生命有限的寿命,以避免其发展过快而自我毁灭。这使得智慧生命需要理性和谨慎对待资源和科技的发展,以延续自己的文明。
智慧生命的出现:在某些宇宙中,智慧生命可能会逐渐出现。他们会经历进化、文明的崛起和科技的发展。不同宇宙中智慧生命的特点和文明水平可能千差万别。
宇宙沙盒中的对照组:这些对照组可能不仅包括类似地球的情景,也包括完全不同的星球和宇宙结构。有些对照组中可能存在比地球上更高级的生物形式,也有可能有完全不同类型的智慧生命。
交互与隔离:虽然这些宇宙共享相似的宇宙环境,但造物主将它们隔离开来,避免相互干扰,以保持实验的独立性。智慧生命之间并不知道其他宇宙的存在,让他们自主发展。
观察和干预:造物主时不时地观察不同对照组中智慧生命的进展,他们也许通过超自然手段对这些对照组进行干预,但也可能仅是静观其变。
生命的进化与文明:不同对照组中的智慧生命会经历不同的进化历程和文明发展。有些对照组的文明可能迅速崛起,创造出强大的科技和社会结构,而另一些对照组可能在原始阶段停滞不前。
实验的结果:每个宇宙的结果都是独一无二的。有些宇宙的智慧生命可能因为资源利用不当或自相残杀而灭亡。而另一些宇宙的智慧生命可能会团结合作,探索宇宙的奥秘,并达到一个高度先进的文明。
自行发现外星人的难题:基于设定中的隔离和宇宙沙盒的概念,人类在自然条件下可能难以自行发现其他对照组中的外星文明。这是因为这些对照组是相互隔离的,彼此无法直接联系。除非造物主进行干预或解除隔离,否则人类可能永远不会直接接触其他宇宙中的外星文明。
这样的设想,将宇宙看作一个巨大的实验室,造物主作为超自然的存在,掌控着这个宏伟的观察与实验计划。在这个设定下,人类和其他智慧生命都是宇宙中的一部分,我们的存在和发展也可能是造物主实验的一部分。
同时也为我们提供了一种有趣的哲学思考,让我们思考宇宙的无限可能性以及我们作为智慧生命的存在和发展。虽然这只是一个设想,但它为我们提供了一种探索未知和宇宙奥秘的视角。
类比 当我们将老鼠乌托邦(25号宇宙)实验的结果与上文观点相结合,可以得到一些有趣的启示和类比。
在上文设想中,造物主创造了智慧生命并观察他们在宇宙中的发展。类似地,老鼠乌托邦实验也是一个观察社会动物(老鼠)在特定条件下的发展。这两者都是通过在特定环境中设定条件和规则来探索生命的进化和行为。
有限的资源:在老鼠乌托邦实验中,随着人口密度的增加,资源的竞争变得更为激烈。类似地,在上文观点中,造物主给予生命有限的资源,可能是为了观察智慧生命如何在资源有限的情况下适应和发展。
社会结构与动力:实验中老鼠群体的社会结构出现了退化和混乱,而在上文设想中,智慧生命也可能面临类似的挑战。人类社会中也存在着资源竞争、社会不平等和文明冲突等问题,而这些因素可能影响文明的发展和社会动力。
行为沮丧:老鼠乌托邦实验中,高度拥挤和资源过剩的环境导致了老鼠社会的异常行为,这类似于上文观点中对于发展太快可能导致自行灭亡的担忧。这个类比可能引发我们对于人类社会中过度竞争、资源过剩和社会动态的反思。
自我调整和适应:在实验和上文设想中,动物和智慧生命都面临着适应环境和资源限制的挑战。在类似于乌托邦实验中,老鼠群体可能最终自我调整或消亡,而在上文设想中的智慧生命可能会逐渐适应和发展,寻找合适的平衡。
通过将老鼠乌托邦实验与上文观点相结合,我们可以从一个不同的角度思考社会动物和智慧生命在特定环境下的行为和进化。这样的类比提醒我们在探讨人类社会和文明发展的同时,也要关注资源的合理分配、社会结构的稳定和适应环境的能力。同时,也让我们思考造物主设立这样的实验是否旨在观察智慧生命如何面对类似挑战,以及从中获取对于宇宙和生命的更深刻理解。
注:以上内容源于想象和假设。
]]>
+
+
+
+
+ <span id="more"></span>
+
+<h2 id="想象"><a href="#想象" class="headerlink" title="想象"></a>想象</h2><p><img src="https://cdn.awaw.cc/raw/pdone/stati
+
+
+
+
+
+
+
+
+
+
+
+
+ 短链接服务Octopus的实现与源码开放
+
+ https://awaw.cc/post/whats-short-link/
+ 2023-07-19T16:00:00.000Z
+ 2023-07-20T09:26:03.361Z
+
+ 一直想实现一个私有化的短链接服务,后来发现了这个项目,避免了重复造轮子。
前提 半年前(2020-06
)左右,疫情触底反弹,公司的业务量不断提升,运营部门为了方便短信、模板消息推送等渠道的投放,提出了一个把长链接压缩为短链接的功能需求。当时为了快速推广,使用了一些比较知名的第三方短链压缩平台,存在一些问题:
收费贵 一些情况下,短链域名在部分第三方平台例如微信会被封杀 回源数据没有办法定制处理方案,无法打通整个业务链路进行数据分析和跟踪 基于此类问题,决定自研一个(长链接压缩为)短链接服务,当时刚好同步进行微服务拆分,内部很多微服务需要重新命名,组内的一个妹子说不如就用Github
的吉祥物去命名octopus cat
(章鱼猫)去命名,但是考虑到版权问题,去掉了她最喜欢的猫,剩下章鱼,以octopus
命名:
(项目的描述还打错字了,应该是”短链接”)因为实现的功能并不复杂,初版于2020-06
月底就发布。octopus
的实现参考了互联网中几篇关于”短链服务实现”浏览量比较高的文章,下面从实现原理、服务实现和部署架构等方面展开谈谈。
基本原理 短链服务的核心就是构建短链接和长链接的唯一映射关系,依赖到一个高性能、排列组合数量大而且破解难度大的映射标识生成算法。
构建唯一映射关系
上图是笔者收到的京东白条分期还款结果提醒短信,短信内容也包含了一个短链https://3.cn/j/xxxxxxx
,把它拷贝到浏览器中打开,发现客户端会重定向到长链https://jrmkt.jd.com/ptp/wl/vouchers.html?activityId=${activityId}&uep_p=${uep_p}&uep_template_id=${uep_template_id}&uep_timestamp=${uep_timestamp}
,然后跳入一个H5
的登录页,登录后再跳进一个白条攻略页面。这里其实一个长链其实可以压成多个短链,短链可以相同域名,也可以使用不同的域名:
访问https://3.cn/j/xxxxxxx
短链接具体的交互流程猜测如下:
jrmkt.jd.com和3.cn查证都是doge东的域名
构建唯一映射关系其实就是基于一个固定的长链接,映射到一个或者多个可以动态生成的短链接,这个唯一映射关系,要求生成的短链接满足:
不容易被破解(使用数字例如数据库的自增主键作为唯一映射标识容易被人遍历出来进行恶意调用) 不能重复(一个短链接只能对应一个长链接,当然一个长链接可以对应多个短链接) 长度尽可能短,这是因为第三方推送的报文内容一般有长度限制,如果短链过长,会导致不容易传输,还会令到推送内容字数受限(试想运营商短信投放内容最大长度为30
个字符长度,短链已经占了20
个字符长度,剩下只有10
个字符长度让运营同事去发挥,显然不合理) 如果链接过长,生成的二维码里面的”码点”会十分密集,不利于客户端识别和传输,刚好笔者公司运营有使用二维码的场景,所以必须尽可能缩短链接的长度 总的来说,这个唯一映射关系中的映射标识需要像Hash
算法生成的Hash
码那样具备高唯一性和低碰撞频率,同时具备短小易传输的特点,具体如何去生成映射唯一标识见下一节”压缩码生成算法”。
压缩码生成算法 这里的”压缩码”(compression_code
)是笔者杜撰出来的名词,在本文中它的含义是短链接URL
的路径部分(为了节省长度,除了协议和域名部分,短链的URL
只有第一段路径):
其中,协议部分基本是固定为https://
(从安全性来看不建议使用http://
),短链域名可以购买尽可能长度短的域名如t.cn
,不过有先见之明的资本家一般会把所有优质的短域名买下并且把价格提到很高,所以域名的长度基本也是很难控制的因素,剩下可控的就是压缩码部分。压缩码部分是可控的,但因为它是URL
的一部分,只要确保所使用的字符不会被URL
编码转义,那么长度是人为可控的。假设我们使用的是26
个字母的大小写,加上10
个数字,那么对于N
位压缩码可以表示的最大组合数量为:
N = 4
,组合数为62 ^ 4 = 14_776_336
,147
万接近148
万N = 5
,组合数为62 ^ 5 = 916_132_832
,9.16
亿左右N = 6
,组合数为62 ^ 6 = 56_800_235_584
,568
亿左右一般来说,组合数越小破解的难度就越小,组合数越大,要求压缩码长度越大,所以常用的长度就是4
、5
和6
,而且后期可以对失效的长链进行压缩码回收或者禁用,这三个长度对于绝大对数生产短链的应用场景都能满足。octopus
在实现的时候选用的是6
位长度的压缩码,无他,因为有现成的成熟的参考方案:62
进制数刚好由字符0-9 a-z A-Z
组成,生成压缩码的时候,只需要生成一个唯一的10
进制数,然后再基于此10
进制数转换为62
进制数数即可。说到这里,看起来的方案如下:
虚线部分一般依赖一种高效而且低冲突的摘要算法,如MurmurHash
,而第(1)
步的实线部分就是生成一个全局唯一的10
进制序列,常用的手法有:
数据库自增序列(如自增主键) Snowflake
算法自研的类似UUID
算法生成全局唯一的序列值 考虑到之前笔者钻研过Snowflake
算法的原理,这里简单使用Snowflake
算法生成自增序列,使用了下面的流程进行压缩码生成和分配:
因为运用部门对短链生成的批量不大,而且短链域名只有一个,所以简单起见,一次压缩操作直接消耗掉一个压缩码,不考虑不同短链域名对同一个压缩码进行共享,也不考虑压缩码的回收问题 。
服务实现 短链服务的主访问入口一般QPS
极高,因此需要想尽一切办法降低该入口的耗时,考虑可以用Redis
做缓存承载入口的流量,基础架构选型如下:
JDK1.8+
:生产部署使用JDK11
MVC
框架与容器:spring-boot-starter-webflux
或者spring-cloud-gateway
,主要是必须使用Netty
作为底层通讯容器内部RPC
框架:Dubbo
服务注册与发现:Nacos
可选APM
工具:Pinpoint
中间件依赖(因为之前整个服务集群都上云了,低负载的服务共用了部分中间件):
MySQL8.x
Redis5.x
普通主从或者哨兵集群RabbitMQ3.8.x
集群,使用镜像队列服务的设计图如下:
最新的版本考虑把黑白名单的拦截器去掉,替换成一个基于布隆过滤器现实的拦截器 。服务使用了两个拦截器(虽然Filter
翻译是过滤器,但是出于习惯,下文称为拦截器)链,容器提供的拦截器组成的拦截器链主要是负责服务安全、调用链跟踪的功能,而服务内部自定义的拦截器链主要是实现请求参数解析、URL
转换、重定向和异步事件记录等功能。
模块划分:
1 2 3 - (ROOT) octopus - octopus-contract - octopus-server
octopus-contract
模块必须脱离父POM
的管理,方便单独迭代更新。
数据库设计 一共使用了5
个表:
具体的初始化DDL
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 CREATE DATABASE `db_octopus` CHARSET 'utf8mb4' COLLATE 'utf8mb4_unicode_520_ci' ; USE `db_octopus`;CREATE TABLE `url_map` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `short_url` VARCHAR (32 ) NOT NULL COMMENT '短链URL' , `long_url` VARCHAR (768 ) NOT NULL COMMENT '长链URL' , `short_url_digest` VARCHAR (128 ) NOT NULL COMMENT '短链摘要' , `long_url_digest` VARCHAR (128 ) NOT NULL COMMENT '长链摘要' , `compression_code` VARCHAR (16 ) NOT NULL COMMENT '压缩码' , `description` VARCHAR (256 ) COMMENT '描述' , `url_status` TINYINT NOT NULL DEFAULT 1 COMMENT 'URL状态,1:正常,2:已失效' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , UNIQUE uniq_compression_code (`compression_code`), INDEX idx_short_url (`short_url`), INDEX idx_short_url_digest (`short_url_digest`), INDEX idx_long_url_digest (`long_url_digest`) ) COMMENT 'URL映射表' ;CREATE TABLE `domain_conf` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `domain_value` VARCHAR (16 ) NOT NULL COMMENT '域名' , `protocol` VARCHAR (8 ) NOT NULL DEFAULT 'https' COMMENT '协议,https或者http' , `domain_status` TINYINT NOT NULL DEFAULT 1 COMMENT '域名状态,1:正常,2:已失效' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , UNIQUE uniq_domain (`domain_value`) ) COMMENT '域名配置' ;CREATE TABLE `compression_code` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `compression_code` VARCHAR (16 ) NOT NULL COMMENT '压缩码' , `code_status` TINYINT NOT NULL DEFAULT 1 COMMENT '压缩码状态,1:未使用,2:已使用,3:已失效' , `sequence_value` VARCHAR (64 ) NOT NULL COMMENT '序列(盐)' , `strategy` VARCHAR (8 ) NOT NULL DEFAULT 'sequence' COMMENT '策略,sequence或者hash' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , UNIQUE uniq_compression_code (`compression_code`) ) COMMENT '压缩码' ;CREATE TABLE `visit_statistics` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , `statistics_date` DATE NOT NULL DEFAULT '1970-01-01' COMMENT '统计日期' , `pv_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '页面流量数' , `uv_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '独立访客数' , `ip_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '独立IP数' , `effective_redirection_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '有效跳转数' , `ineffective_redirection_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '无效跳转数' , `compression_code` VARCHAR (16 ) NOT NULL COMMENT '压缩码' , `short_url_digest` VARCHAR (128 ) NOT NULL COMMENT '短链摘要' , `long_url_digest` VARCHAR (128 ) NOT NULL COMMENT '长链摘要' , UNIQUE uniq_date_code_digest (`statistics_date`, `compression_code`) ) COMMENT '访问数据统计' ;CREATE TABLE `transform_event_record` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , `unique_identity` VARCHAR (128 ) NOT NULL COMMENT '唯一身份标识,SHA-1(客户端IP-UA)' , `client_ip` VARCHAR (64 ) NOT NULL COMMENT '客户端IP' , `short_url` VARCHAR (32 ) NOT NULL COMMENT '短链URL' , `long_url` VARCHAR (768 ) NOT NULL COMMENT '长链URL' , `short_url_digest` VARCHAR (128 ) NOT NULL COMMENT '短链摘要' , `long_url_digest` VARCHAR (128 ) NOT NULL COMMENT '长链摘要' , `compression_code` VARCHAR (16 ) NOT NULL COMMENT '压缩码' , `record_time` DATETIME NOT NULL COMMENT '记录时间戳' , `user_agent` VARCHAR (2048 ) COMMENT 'UA' , `cookie_value` VARCHAR (2048 ) COMMENT 'cookie' , `query_param` VARCHAR (2048 ) COMMENT 'URL参数' , `province` VARCHAR (32 ) COMMENT '省份' , `city` VARCHAR (32 ) COMMENT '城市' , `phone_type` VARCHAR (64 ) COMMENT '手机型号' , `browser_type` VARCHAR (64 ) COMMENT '浏览器类型' , `browser_version` VARCHAR (128 ) COMMENT '浏览器版本号' , `os_type` VARCHAR (32 ) COMMENT '操作系统型号' , `device_type` VARCHAR (32 ) COMMENT '设备型号' , `os_version` VARCHAR (32 ) COMMENT '操作系统版本号' , `transform_status` TINYINT NOT NULL DEFAULT 0 COMMENT '转换状态,1:转换成功,2:转换失败,3:重定向成功,4:重定向失败' , INDEX idx_record_time (`record_time`), INDEX idx_compression_code (`compression_code`), INDEX idx_short_url_digest (`short_url_digest`), INDEX idx_long_url_digest (`long_url_digest`), INDEX idx_unique_identity (`unique_identity`) ) COMMENT '转换事件记录' ;
压缩码生成模块实现 压缩码生成的方法比较简单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 private final SequenceGenerator sequenceGenerator; # <------------- 雪花算法序列生成器@Value("${compress.code.batch:100}") private Integer compressCodeBatch; ......private void generateBatchCompressionCodes () { for (int i = 0 ; i < compressCodeBatch; i++) { long sequence = sequenceGenerator.generate(); CompressionCode compressionCode = new CompressionCode (); compressionCode.setSequenceValue(String.valueOf(sequence)); String code = ConversionUtils.X.encode62(sequence); # <-------------- 10 进制转62 进制 code = code.substring(code.length() - 6 ); compressionCode.setCompressionCode(code); compressionCodeDao.insertSelective(compressionCode); } }
总是批量生成可用的压缩码,查询的时候只需要查出当前未被使用的第一个压缩码即可。
容器拦截器链实现 容器的拦截器需要实现org.springframework.web.server.WebFilter
(WebFlux
的Filter
接口),主要有四个实现(顺序如下):
MappedDiagnosticContextFilter
:引入transmittable-thread-local
通过MDC
做TraceId
的请求上下文绑定,WebFlux
的线程模型和常见的Servlet
容器的线程模型不一样,这里不能直接使用ThreadLocal
或者Slf4j
中原有的MDC
实现BlockIpFilter
:判断客户端请求IP
是否命中黑名单AccessDomainFilter
:判断域名是否命中短链域名白名单(可选的,因为外部已经通过NGINX
做了一次拦截,这个实现是可有可无的)ExcludeUriFilter
:判断当前请求的URI
是否命中了URI
黑名单这里简单展示一下MappedDiagnosticContextFilter
的实现:
1 2 3 4 5 6 7 8 9 10 11 @Order(value = Integer.MIN_VALUE) @Component public class MappedDiagnosticContextFilter implements WebFilter { @Override public Mono<Void> filter (ServerWebExchange exchange, WebFilterChain chain) { String uuid = UUID.randomUUID().toString(); MDC.put("TRACE_ID" , uuid); return chain.filter(exchange).then(Mono.fromRunnable(() -> MDC.remove("TRACE_ID" ))); } }
上面的TRACE_ID
是配合项目的logback.xml
中的pattern
使用。另外需要参考https://github.com/alibaba/transmittable-thread-local/blob/master/docs/requirement-scenario.md
中logback
与transmittable-thread-local
做集成的场景:
这里为了方便管理和升级版本,笔者直接把logback-mdc-ttl
的源码实现改造好后放到项目中。
服务内部拦截器链实现 服务内部的拦截器链主要负责请求参数解析、URL
映射转换、重定向和访问转换结果记录,顶层接口设计如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 public interface TransformFilter { default int order () { return 1 ; } default void init (TransformContext context) { } void doFilter (TransformFilterChain chain, TransformContext context) ; }
TransformContext
是一个属性承载类,本质是一个普通的JavaBean
,设计如下:
目前内置了4
个拦截器实现,包括:
ExtractRequestHeaderTransformFilter
:请求头解析UrlTransformFilter
:URL
转换RedirectionTransformFilter
:重定向处理TransformEventProcessTransformFilter
:转换事件记录以UrlTransformFilter
为例子,源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 @Slf4j @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Component public class UrlTransformFilter implements TransformFilter { @Autowired private UrlMapCacheManager urlMapCacheManager; @Override public int order () { return 2 ; } @Override public void init (TransformContext context) { } @Override public void doFilter (TransformFilterChain chain, TransformContext context) { String compressionCode = context.getCompressionCode(); UrlMap urlMap = urlMapCacheManager.loadUrlMapCacheByCompressCode(compressionCode); context.setTransformStatus(TransformStatus.TRANSFORM_FAIL); if (Objects.nonNull(urlMap)) { context.setTransformStatus(TransformStatus.TRANSFORM_SUCCESS); context.setParam(TransformContext.PARAM_LONG_URL_KEY, urlMap.getLongUrl()); context.setParam(TransformContext.PARAM_SHORT_URL_KEY, urlMap.getShortUrl()); chain.doFilter(context); } else { log.warn("压缩码[{}]不存在或异常,终止TransformFilterChain执行,并且重定向到404页面......" , compressionCode); throw new RedirectToErrorPageException (String.format("[c:%s]" , compressionCode)); } } }
所有的服务内拦截器的scope
都是prototype
,意味着每次初始化拦截器链都会重新创建对应的Bean
。
主控制器实现 因为octopus
只做短链访问的入口,后台管理的功能交给另外的服务实现,此服务只有一个控制器,控制器里面只有一个方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 @RequiredArgsConstructor @RestController public class OctopusController { private final UrlMapService urlMapService; @GetMapping(path = "/{compressionCode}") @ResponseStatus(HttpStatus.FOUND) public Mono<Void> dispatch (@PathVariable(name = "compressionCode") String compressionCode, ServerWebExchange exchange) { ServerHttpRequest request = exchange.getRequest(); TransformContext context = new TransformContext (); context.setCompressionCode(compressionCode); context.setParam(TransformContext.PARAM_SERVER_WEB_EXCHANGE_KEY, exchange); if (Objects.nonNull(request.getRemoteAddress())) { context.setParam(TransformContext.PARAM_REMOTE_HOST_NAME_KEY, request.getRemoteAddress().getHostName()); } HttpHeaders httpHeaders = request.getHeaders(); Set<String> headerNames = httpHeaders.keySet(); if (!CollectionUtils.isEmpty(headerNames)) { headerNames.forEach(headerName -> { String headerValue = httpHeaders.getFirst(headerName); context.setHeader(headerName, headerValue); }); } urlMapService.processTransform(context); return Mono.fromRunnable(context.getRedirectAction()); } }
这个主控制的分发压缩码方法只负责封装参数调用服务内部拦截器链进行后续的处理。然后添加一个全局的异常处理器,把所有的异常或者非法操作引导到一个自定义的404
页面(甚至可以在上面挂一点广告):
Dubbo契约实现 octopus-contract
是一个完全独立的模块,甚至可以说它是一个完全独立的项目,主要作用是提供契约API
,让其他服务引入,让octopus-server
模块进行实现。契约接口定义如下:
1 2 3 4 public interface OctopusApi { Response<CreateUrlMapResponse> createUrlMap (CreateUrlMapRequest request) ; }
基于Dubbo
的实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @DubboService(retries = -1) public class DefaultOctopusApi implements OctopusApi { @Autowired private UrlMapService urlMapService; @Value("${default.octopus.domain}") private String domain; @Override public Response<CreateUrlMapResponse> createUrlMap (CreateUrlMapRequest request) { UrlMap urlMap = new UrlMap (); urlMap.setUrlStatus(UrlMapStatus.AVAILABLE.getValue()); urlMap.setLongUrl(request.getLongUrl()); urlMap.setDescription(request.getDescription()); String shortUrl = urlMapService.createUrlMap(domain, urlMap); return Response.succeed(new CreateUrlMapResponse (request.getRequestId(), shortUrl)); } }
生产中契约模块做了比较多的特性定制,这里只举一个简单实现的例子。
部署架构 octopus
服务集群单独部署,支持无限添加节点,部署架构的关键在于网络架构,内层的负载均衡使用了Nginx
,最外层的负载均衡使用了云负载均衡,如阿里云的SLB
或者UCloud
的ULB
。添加或者移除短链域名,关键在于修改Nginx
的配置。基本的架构如下:
只要保证负载均衡池指向octopus
集群即可,短链的域名可能动态增删,操作完之后只需要nginx -s -reload
刷新一下Nginx
的配置即可。
使用短链服务 先在domain_conf
表写入一条本地域名和端口的数据:
编写一个集成测试类,创建一个短链映射:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Slf4j @SpringBootTest(classes = OctopusServerApplication.class, properties = "spring.profiles.active=local") @RunWith(SpringRunner.class) public class UrlMapServiceTest { @Autowired private UrlMapService urlMapService; @Test public void createUrlMap () { String domain = "localhost:9099" ; UrlMap urlMap = new UrlMap (); urlMap.setUrlStatus(UrlMapStatus.AVAILABLE.getValue()); urlMap.setLongUrl("https://throwx.cn/2020/08/24/canal-ha-cluster-guide" ); urlMap.setDescription("测试短链" ); String url = urlMapService.createUrlMap(domain, urlMap); log.info("生成的短链:{}" , url); } }
基于本地配置启动项目,然后访问http://localhost:9099/Myt8qW
,效果如下:
日志如下:
1 2 [2020-12-27 19:29:22,285] [INFO] cn.throwx.octopus.server.application.consumer.TransformEventConsumer [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] [1c603903-e8d8-4072-aa97-6abf614b9411] - 接收到URL转换事件,内容:{"clientIp":"192.168.211.113","compressionCode":"Myt8qW","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36","cookieValue":"Webstorm-734c3b68=9b8b3560-41f5-478a-93d0-b02128b1022f; __gads=ID=28121bd829638f67-2286c86e7fc400d3:T=1604132165:RT=1604132165:S=ALNI_MbsMQROv6swaC8kf4ux2suZm_GZXA; Hm_lvt_4df6907aebab752244c3ca1432b4ff57=1605930058,1607228133","timestamp":1609068562262,"shortUrlString":"http://localhost:9099/Myt8qW","longUrlString":"https://throwx.cn/2020/08/24/canal-ha-cluster-guide","transformStatusValue":3}...... [2020-12-27 19:29:22,353] [INFO] cn.throwx.octopus.server.application.consumer.TransformEventConsumer [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] [1c603903-e8d8-4072-aa97-6abf614b9411] - 记录URL转换事件完成......
查看转换事件记录表的数据:
后续功能迭代 前期方案有一个安全隐患:没有做压缩码的白名单,容易被基于短链域名,伪造压缩码拼接短链接的方法进行攻击。解决方案是在容器的拦截器链添加或者替换一个基于布隆过滤器实现的压缩码(短链接)白名单拦截器,这样就能在前期拦截了绝大部分恶意伪造的压缩码,让极少量命中了错误率部分的恶意压缩码流到后面的处理逻辑中进行判断。另外,可以引入Caffeine
配合Redis
做两级缓存,毕竟本地缓存的速度更快。
小结 octopus
初版是一个4
小时紧急迭代出来的一个微型项目,到现在为止更新了很多次,生产上已经基本稳定。文中描述的版本是公司生产版本的移植版,精简了大量代码同时移除了一些业务耦合的设计,这里把源码开放出来,让一些有可能用到短链服务的场景提供一个可参考但尽可能不要复制的解决思路。源码仓库:
Gitee
:https://gitee.com/throwableDoge/octopus
Github
:https://github.com/zjcscut/octopus
代码都在main
分支。
彩蛋 最近鸽了很长一段时间,原因是年底比较多业务功能迭代,内部的一个标签服务重构花了大量时间。笔者一直在摸索着通过”分片”、”异步”等等思想,在时间可控的前提下,对小数据量(百万和千万级别)前提下,通过常用的关系型数据库、缓存、消息队列等非大数据平台架构替代实现《用户画像方法论与工程化解决方案》里面提到的解决方案。
标签服务内部的代号是”千寻”,取自于辛弃疾《青玉案元夕》中的”众里寻他千百度”,项目名来自于宫崎骏的动漫《千与千寻》的女主千寻(千寻罗马音是chihiro
):
待后面项目上线一段时间稳定后,应该会抽时间写一个系列谈谈怎么不用大数据那套体系,提供用户画像的工程化解决方案。
(本文完 c-10-d e-a-20201227)
]]>
+
+
+ <p>一直想实现一个私有化的短链接服务,后来发现了这个项目,避免了重复造轮子。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 🌈Awesome Software / Service
+
+ https://awaw.cc/post/awesome/
+ 2023-07-06T16:00:00.000Z
+ 2024-03-26T09:33:47.693Z
+
+ 分享一些好用的软件、服务和开源项目等,传递开源与分享精神。纯粹的分享与推荐,放心食用。 开源项目仅提供代码仓库地址,若有官方网站亦会标明。内容排序方式为项目名称英文字母顺序。
目前收录总数:35
桌面应用 桌面应用是一种在桌面操作系统上运行的应用程序,例如 Windows、macOS 和 Linux。与 Web 应用程序和移动应用程序不同,桌面应用程序通常是使用本地编程语言和工具(例如 C++、C#、Java 或 Swift)开发的,并且可以直接在计算机上运行,而无需通过浏览器或移动设备。桌面应用程序可以具有许多不同的功能,例如文本编辑器、图形设计工具、游戏、办公套件、音频/视频编辑器等。与 Web 应用程序相比,桌面应用程序通常具有更高的性能和更好的用户体验,因为它们可以直接访问计算机的资源,例如文件系统、网络和硬件设备。同时,桌面应用程序也需要更多的开发和维护工作,因为它们需要考虑不同操作系统和硬件设备的兼容性问题。
7z - 压缩工具 7-Zip是一个具有高压缩比的文件归档器。
7-Zip is a file archiver with a high compression ratio.
官方网站 GitHubCUE Splitter - 音频分轨 CUE Splitter是一个免费的工具,它可以将一个大的音频文件,主要是一张专辑或一个汇编,分割成相对独立的曲目,使用相关的“CUE表”文件中包含的信息。有时你可以找到一个大的压缩音乐文件(例如MP3,APE,FLAC,OGG,WAV,WMA等)。配备了一个小的.cue文本文件,其中包含有关内部轨道的所有细节:标题,艺术家,持续时间等。通常这对夫妇的文件是由像EAC(精确音频复制),foobar2000,BPM Studio,GoldWave或类似的程序生成的。使用CUE Splitter,您可以分割音乐曲目,而无需解码/重新编码任何音频数据!此外,输出文件自动命名使用用户定义的“文件掩码”字符串和他们的标签填充信息提取的“提示表”。
CUE Splitter is a freeware tool that splits a single big audio file, mostly an album or a compilation, into the relative individual tracks, using the informations contained in the associated “CUE Sheet” file. Sometimes you can find a big compressed music file (for example MP3, APE, FLAC, OGG, WAV, WMA, etc.) equipped with a small .cue text file that contains all the details about internal tracks: title, artist, duration, and so on. Usually these couple of files are generated by programs like EAC (Exact Audio Copy), foobar2000, BPM Studio, GoldWave or similar. With CUE Splitter you can split music tracks without decode/re-encode any audio data! Moreover output files are automatically named using a user-defined “file mask” string and their tags are filled with informations extracted from “CUE Sheet”.
官方网站DBeaver - 数据库工具 DBeaver Community是一个免费的跨平台数据库工具,面向开发人员、数据库管理员、分析师和所有使用数据的人。它支持所有流行的SQL数据库,如MySQL,MariaDB,PostgreSQL,SQLite,Apache Family等。
DBeaver Community is a free cross-platform database tool for developers, database administrators, analysts, and everyone working with data. It supports all popular SQL databases like MySQL, MariaDB, PostgreSQL, SQLite, Apache Family, and more.
官方网站
Everything - 本地搜索引擎 Everything 是 Windows 上一款搜索引擎,它能够基于文件名快速定文件和文件夹位置。
Everything is search engine that locates files and folders by filename instantly for Windows.
可以快速搜索本地任何角落,以便找到自己想要的内容,装机必备。Everything也衍生了一些工具,比如uTools中的本地搜索依赖Everything才能更高效的工作,又如EverythingToolbar 可以把Everything集成到任务栏中。
官方网站
FreeControl - 用电脑控制手机 在PC上控制Android设备。
Control Android devices on PC.
官方网站 GitHubHiBit Uninstaller - 卸载工具 HiBit Uninstaller是卸载Windows软件的完美解决方案,使您可以使用其简单且用户友好的界面快速,完全地卸载程序。
HiBit Uninstaller is the perfect solution for uninstalling Windows software, allowing you to uninstall programs quickly and completely using its simple and user friendly interface.
官方网站
LocalSend - 局域网文件传输 AirDrop的开源跨平台替代品。
An open-source cross-platform alternative to AirDrop.
官方网站 GitHubMotrix - 下载工具 一款全能的下载工具。支持下载 HTTP、FTP、BT、磁力链接等资源。
A full-featured download manager. Support downloading HTTP, FTP, BitTorrent, Magnet, etc.
这个软件内置了Aria2 - 下载工具 ,如果懒得折腾aria2,用这个软件就够用了。如果有NAS设备,推荐使用Docker部署aria2服务,让下载这件事与PC解耦。
官方网站 GitHubMusicPlayer2 - 音乐播放器 MusicPlayer2是一款集音乐播放、歌词显示、格式转换等众多功能于一身的音频播放软件。支持歌词显示、歌词卡拉OK样式显示、歌词在线下载、歌词编辑、歌曲标签识别、专辑封面显示、专辑封面在线下载、频谱分析、音效设置、任务栏缩略图按钮、主题颜色、格式转换等功能。播放内核为BASS音频库(V2.4)。播放器支持几乎所有常见的音频格式。
MusicPlayer2 is an audio player whitch supports music collection playback, lyrics display, format conversion and many other functions. It supports lyrics display, lyrics karaoke style display, lyrics online download, lyrics editing, song tag recognition, album cover display, album cover online download, spectrum analysis, sound effect settings, taskbar thumbnail button, theme color, format conversion and other functions. The playback kernel is the Bass Audio Library (V2.4). The player supports almost all common audio formats.
GitHub
MusicTag - 音乐标签编辑器 『音乐标签』是一款可以编辑歌曲的标题、专辑、艺术家等信息的应用程序,支持FLAC, APE, WAV, AIFF, WV, TTA, MP3, MP4, M4A, OGG, MPC, OPUS, WMA, DSF, DFF等音频格式,绿色无广告,无任何功能限制。
MusicTag is an application that can edit the title, album, artist information of the song, supporting FLAC, APE, WAV, AIFF, WV, TTA, MP3, MP4, M4A, OGG, MPC, OPUS, WMA, DSF, DFF, etc. audio formats, green and without ads, no function restrictions.
官方网站
ruffle - Flash播放器 用Rust编写的Flash Player模拟器。
A Flash Player emulator written in Rust.
官方网站 GitHubScreenToGif - 录制GIF ScreenToGif允许您录制屏幕的选定区域,编辑并保存为gif或视频。
🎬 ScreenToGif allows you to record a selected area of your screen, edit and save it as a gif or video.
官方网站 GitHubSnipaste - 截图贴图工具 Snipaste 是一个简单但强大的贴图工具,同时也可以执行截屏、标注等功能。
Snipaste is a simple but powerful snipping tool, and also allows you to pin the screenshot back onto the screen.
官方网站
TrafficMonitor - 硬件资源监控 一款用于Windows平台的网速监控悬浮窗软件,可以显示当前网速、CPU及内存利用率,支持嵌入到任务栏显示,支持更换皮肤、历史流量统计等功能。
TrafficMonitor is a network monitoring software with floating window feature for Windows. It displays the current internet speed and CPU and RAM usage. There are also other capabilities like an embedded display in the taksbar, changeable display skins, and historical traffic statistics.
GitHub
TranslucentTB - 任务栏透明 一个轻量级的实用程序,使Windows任务栏半透明/透明。
A lightweight utility that makes the Windows taskbar translucent/transparent.
GitHub
uTools 是一个极简、插件化的现代桌面软件,通过自由选配丰富的插件,打造得心应手的工具集合。
非常好用的一款跨平台工具集合,虽然有会员订阅服务(主要是提供了数据备份、多端同步等功能),但无需订阅即可使用大部分功能,满足大部分用户的需要。
官方网站
插件推荐
易翻翻译、ctool、颜色助手、OCR、文件批量重命名、hosts、二维码、本地搜索、文本代码对比、json编辑器、变量命名方式、正则编辑器、编码小助手、计算稿纸。
Visual Studio Code - 编辑器 Visual Studio Code是一个轻量级但功能强大的源代码编辑器,可在桌面上运行,适用于Windows、macOS和Linux。它内置了对JavaScript,TypeScript和Node.js的支持,并拥有丰富的其他语言和运行时扩展生态系统(如C++,C#,Java,Python,PHP,Go,.NET)。
Visual Studio Code is a lightweight but powerful source code editor which runs on your desktop and is available for Windows, macOS and Linux. It comes with built-in support for JavaScript, TypeScript and Node.js and has a rich ecosystem of extensions for other languages and runtimes (such as C++, C#, Java, Python, PHP, Go, .NET).
官方网站 GitHubVLC - 媒体播放器 VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。
VLC is a free and open source cross-platform multimedia player and framework that plays most multimedia files as well as DVDs, Audio CDs, VCDs, and various streaming protocols.
官方网站 GitHubWindTerm - 跨平台终端 一款专业的跨平台SSH/Sftp/Shell/Telnet/Serial终端。
A professional cross-platform SSH/Sftp/Shell/Telnet/Serial terminal.
官方网站 GitHub服务应用 服务应用是一种在后台运行的应用程序,通常在服务器或云平台上运行。与桌面应用程序和移动应用程序不同,服务应用程序通常不直接与用户交互,而是在后台执行某些任务。服务应用程序可以具有许多不同的功能,例如数据处理、文件传输、消息传递、安全认证等。服务应用程序通常使用 Web 技术(例如 RESTful API、SOAP、JSON 等)作为与其他应用程序和服务进行交互的接口。服务应用程序可以在云平台上扩展和自动扩展,以满足不断变化的需求。同时,服务应用程序也需要更多的开发和维护工作,因为它们需要考虑安全性、可伸缩性、可靠性等问题。
推荐部署在云服务器上或有公网IP的NAS设备上,推荐使用常见的Linux发行版,如CentOS、Ubuntu、Debian。
推荐使用 docker-compose
方式部署便于维护和迁移,但部署方式不限于此,文中推荐的大部分服务都提供了跨平台、跨架构支持,更多部署方式请参考官方网站或GitHub。
acme.sh - 自动化证书 一个实现ACME客户端协议的纯Unix shell脚本。
A pure Unix shell script implementing ACME client protocol.
本站的证书由Let’s Encrypt签发,因为托管在Vercel和Netlify中,服务商会定期进行续签,个人无需维护。
但个人服务器的证书就需要自己维护了,这时就要用到acme.sh。具体用法参考以下内容以及项目官网文档。
官方网站 GitHubAdGuard Home - 私人DNS AdGuard Home 是一款全网广告拦截与反跟踪软件。在您将其安装完毕后,它将保护您所有家用设备,同时您不再需要安装任何客户端软件。随着物联网与连接设备的兴起,掌控您自己的整个网络环境变得越来越重要。
AdGuard Home is a network-wide software for blocking ads & tracking. After you set it up, it’ll cover ALL your home devices, and you don’t need any client-side software for that. With the rise of Internet-Of-Things and connected devices, it becomes more and more important to be able to control your whole network.
官方网站 GitHubAlist - 多存储整合 一个支持多存储的文件列表程序,由 Gin 和 Solidjs 驱动。
A file list program that supports multiple storage, powered by Gin and Solidjs.
非常好用的一款存储整合服务,可以把各种存储整合在一个服务中,提供了友好的操作界面,支持超多网盘和其他存储方式、在线预览、离线下载、推送到Aira下载等。
官方网站 GitHubaria2 - 下载工具 aria 2是一个轻量级的多协议和多源,跨平台下载工具,在命令行操作。它支持HTTP/HTTPS,FTP,SFTP,BitTorrent和Metalink。
aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.
如果没有自己的服务器,建议使用Motrix - 下载工具 简单易用。
GitHub
AriaNg - aria2 WebUI AriaNg,一个让aria2更容易使用的现代化Web前端。
AriaNg, a modern web frontend making aria2 easier to use.
只是一个静态的网站,可以直接双击index.html运行,也可以托管到免费的平台中使用,如GitHub Pages、Vercel等。或者使用我托管在Netlify中的AriaNg 。
GitHub
ddns-go - 动态域名解析 自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。
一般家用宽带没有固定的公网IP,但目前大部分地区运行商都提供了动态公网IPv6,此时就需要动态域名解析了。实现原理很简单,定时获取本机公网IP,调用域名服务商API将值更新上去,但是这个项目已经很完善,没必要重复造轮子,完全满足需求。
GitHub
Heimdall - 导航页 应用程序仪表板和启动器。
An Application dashboard and launcher.
简约大气的导航页,且可以对一些支持的应用提供扩展功能,如监控Portainer容器状态、aria2下载任务状态等。
GitHub
Home Assistant - 家庭自动化平台 将本地控制和隐私放在首位的开源家庭自动化。由世界各地的社区成员和DIY爱好者组成的团体提供强力支持。
Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts.
目前智能家居品牌很多,大部分品牌都在搞自家生态,想使用一个APP控制家里所有设备,就需要用到Home Assistant将不同品牌智能设备接入统一管理。
官方网站 GitHubQwerty Learner - 记单词 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件。
Words learning and English muscle memory training software designed for keyboard workers.
官方网站 GitHubRustDesk - 远程桌面 RustDesk 是一个功能齐全的开源远程控制替代方案,可通过最少的配置实现自托管和安全性。
RustDesk is a full-featured open source remote control alternative for self-hosting and security with minimal configuration.
建议使用拥有公网IP的设备自建服务器(无公网IP可以通过Tailscale - 异地组网 后使用),我的NAS只有公网IPv6,上行带宽30Mbps,使用体验比ToDesk免费版好很多,已经逐渐放弃使用ToDesk。
官方网站 GitHubTailscale - 异地组网 Tailscale是一种VPN服务,可以让您在世界任何地方安全、轻松地访问您拥有的设备和应用程序。它使用开源WireGuard 协议实现加密的点对点连接,这意味着只有您的专用网络上的设备才能相互通信。
Tailscale is a VPN service that makes the devices and applications you own accessible anywhere in the world, securely and effortlessly. It enables encrypted point-to-point connections using the open source WireGuard protocol, which means only devices on your private network can communicate with each other.
当用手机或电脑处于无IPv6环境时,可以通过Tailscale来访问家中的NAS服务器。需要注意的是,组网的双方其中有一方的NAT 是Symmetric(对称型),就会打洞失败,流量会经转公共DERP服务器,速度很慢。同类型的产品还有Zerotier,个人感觉没有Tailscale好用。
官方网站 GitHubUptime Kuma - 服务状态监控 一个精美的自托管监控工具。
A fancy self-hosted monitoring tool.
可以用于监控并记录一些可访问服务的运行状态,如docker容器、网站等,也可以用作导航页(Heimdall平替)。除了管理页面,还可以创建允许匿名访问的状态页面(示例 - IPv6 Only )。
GitHub
开源字体 开源字体是指那些可以在版权允许的情况下免费或低成本向公众提供使用和修改的字体。这些字体的设计文件(源代码)通常是公开的,任何人在遵循相关许可协议的前提下都可以下载、使用,并在需要时进行修改和再分发。
阿里巴巴普惠体 阿里巴巴普惠体是一套全球永久免费正版商用的字体家族。
阿里巴巴普惠体3.0为一套符合新国家标准GB18030-2022的简体中文字符集,包含GB18030-2022强制规范三个实现级别:实现级别1+实现级别2标准规格的7字重、实现级别3标准规格的Regular 单一字重。7字重共194,460个全形汉字。包含拉丁字母、希腊字母、西里尔字母、标点符号。
官方网站
Cascadia Code 这是一种有趣的新型等宽字体,包含编程连字,旨在增强 Windows 终端的现代外观和感觉。
This is a fun, new monospaced font that includes programming ligatures and is designed to enhance the modern look and feel of the Windows Terminal.
GitHub
Monaspace 一个创新的代码字体超家族。
An innovative superfamily of fonts for code
官方网站 GitHub霞鹜文楷 一款开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生。
An open-source Chinese font derived from Fontworks’ Klee One.
GitHub
]]>
+
+
+ <p>分享一些好用的软件、服务和开源项目等,传递开源与分享精神。纯粹的分享与推荐,放心食用。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 道路勘测设计学习笔记
+
+ https://awaw.cc/post/learn-road-design/
+ 2023-03-31T16:00:00.000Z
+ 2023-07-04T04:07:05.632Z
+
+ 道路平面设计公路 一种带状的空间结构物,它的中线是一条空间曲线。
公路平面图 公路在水平面上的投影图。
公路纵断面图 通过公路中线的竖向剖面图。
公路横断面图 公路上任一点垂直于路中线的竖向剖面图。
缓和曲线 从曲率半径为无穷大逐渐向某一定值变化的曲线。
缓和曲线的作用 缓和曲率——使曲率连续变化 缓和超高——使横向坡度连续变化 缓和加宽——使车道加宽连续变化 缓和曲线产生的效果 曲率连续变化,便于车辆驾驶 离心加速度连续变化,没有突变,乘客感觉舒适 超高横坡度及加宽逐渐变化,行车更加稳定 与圆曲线配合,增加线形美观 缓和曲线的线型 回旋线、三次抛物线、七次四项式型、半波正弦型、一波正弦型、双纽线、多心复曲线。
回旋线 半径从无穷大一直变化到一定设计值的一段弧线。回旋线是曲率随着曲线长度成比例变化的曲线。公路、匝道常用的缓和曲线是回旋线,也叫放射螺旋线。回旋线不仅线形美观,而且与驾驶员匀速转动方向盘由圆曲线驶入直线或者由直线驶入圆曲线的轨迹线相符合。
弯道的超高 为了减小横向力,一般圆曲线段上路面做成外侧高、内侧低的单向内倾横坡。
圆曲线最小半径 最大横向力系数μ和超高横坡度值i为主要影响因素。
横向力系数μ的确定 极限最小半径 各级公路对按计算行车速度行驶的车辆,能保证其安全行车的最小允许半径。
一般最小半径 对按计算行车速度行驶的车辆能保证其安全性和舒适性,它是通常情况下推荐采用的最小半径值。
不设超高的最小半径 当平曲线半径较大时,离心力的影响就较小,路面摩阻力就可以保证汽车有足够的稳定性,这是就可以不设置超高,而允许设置与直线段上相同的双向横坡的路拱形式。
平曲线的极限最小长度 根据经验,为使驾驶员在曲线行驶时不感到方向盘操作的困难,按6s的通过时间设置曲线长度是适宜的。
平曲线的一般最小长度 各级公路的平曲线,一般情况下应能够设置两段缓和曲线(或超高、加宽缓和段)及一段圆曲线。在平面设计中,为便于驾驶操作和行车安全与舒适,汽车在任何一种曲线形式上行驶的时间都不应短于3s。
公路转角小于7°时的平曲线长度 为避免造成视觉错误、保证行车安全,在进行平面设计时应避免设置小于7°的转角。当条件限制不得已时,在偏角小于7°的转角处应设置较长的平曲线,其长度应大于标准中规定值。
加宽 汽车在曲线上行驶所占路面宽度就比在直线上的大,为保证行车的安全,曲线段的路面应做适当的加宽。
加宽缓和段 为避免路面宽度从直线段上的正常宽度到圆曲线段的加宽断面的突变,在直线和圆曲线之间应设置一段路面宽度的渐变段,这一渐变段称为加宽缓和段。
超高 《标准》规定,当圆曲线半径小于不设超高的最小半径时,应设置超高(即将曲线部分的路面做成向内侧倾斜的单向横坡)。
超高缓和段 直线段上的双向横坡逐渐过渡到圆曲线段上的超高横坡的过渡段。
视距 驾驶员在行驶过程中的通视距离。
行车视距 为了保证行车安全,驾驶员应能看到前方一定距离的公路以及公路上的障碍物或迎面的来车,以便及时刹车或绕过。汽车在这段时间里沿公路路面行驶的必要安全距离,称为行车视距。
停车视距 指驾驶员看到障碍物后立即采取制动措施,至汽车在障碍物前停下来的最小安全距离。由三部分距离组成:
驾驶员反应时间内行驶的距离 制动距离,指制动生效到汽车完全停止时行驶的距离 安全距离 会车视距 对于不设分隔带的双车道公路,车辆在行驶中,驾驶员趋向于沿路面中心行驶,一旦发现前方来车,双方驾驶员各自把车辆驶回到自己的车道上,使两车安全交会。为保证双向行驶的双车道公路的行车安全,公路平面应能保证会车视距要求,即满足双向行驶的汽车能在同一车道上及时刹车所需的最短距离。由三部分距离组成:
双方驾驶员反应时间内汽车所行驶的距离 双方汽车的制动距离 安全距离 超车视距 《标准》规定,对于双向行驶的双车道公路,根据需要,应结合地形设置保证具有超车视距的路段,以使汽车行驶时安全超越前车。
超车视距全程可分为四个阶段 加速行驶距离 超车汽车在对向车道上行驶的距离 超车汽车从开始加速到超车完成的时间内,对向车道汽车的行驶距离 超车完成时,超车汽车与对向汽车之间的安全距离 平面线形 直线、圆曲线、回旋线
平面线形要素组合 基本型——圆曲线两端用回旋线与直线相连接的组合型式称为基本型 S型——用两个反向回旋线连接两个反向圆曲线的组合型式称为S型 卵型——用一个回旋线连接两个同向圆曲线的组合型式称为卵型 凸型——在两个同向可旋线间不插入圆曲线而径相衔接的组合型式称为凸型 复合型——两个以上同向回旋线在曲率相等处直接连接的组合型式称为复合型 C型——两同向回旋线在曲率为零处径相衔接的组合型式称为C型 道路纵断面设计 坡线和竖曲线 公路在纵断面上由不同的上坡段、下坡段(统称坡段)和平顺连接相邻两坡段的竖向曲线段组成,即公路路线在纵断面上是一条有起伏的空间线,其基本线形由坡线和竖曲线组成。
地面标高 公路中线各桩点的地面高程称地面标高。
地面线 各点地面标高的连线称地面线,它是一条不规则的空间折线。
设计标高 路基边缘点的高程称设计标高(公路改建时可用原路中线标高为设计标高)。
设计线 各桩点设计标高的连线称纵断面设计线,简称设计线,它是经过技术上、经济上和美学上比较后确定的,由坡线和竖曲线组成的空间线。地面线和设计线是纵断面图的两条主要线。
填挖高 同一桩点的设计标高与地面标高的差值称施工标高,又称填挖高。
填方路段、挖方路段 若该桩点的施工标高为“+”,即设计标高大于地面标高,这样的路基通常为填筑而成的路堤,这样的路段即填方路段 若施工标高为“-”则为路堑,这样的路段即挖方路段。 纵坡 坡线的坡度即路线纵向坡度,简称纵坡。
转坡点 相邻两坡线的交点称转坡点,在转坡点处应设竖曲线。转坡点前后两坡线坡度之差称转坡角。
高原折减 在海拔3000m以上的高原地区,因空气稀薄,不但会使发动机的功率减少,还使水箱的水容易沸腾而降低冷却系统的功能,因此应将《标准》规定的最大纵坡予以折减。
平均纵坡 由若干坡段组成的路段,其两端点的高差与路段长度之比称平均纵坡。
合成坡度 路线纵向坡度与横向坡度的矢量和称合成坡度。
道路横断面设计 横断面 公路中线法线方向的剖面图称公路横断面图,简称横断面,亦即由公路横断面设计的主要组成部分与横断地面线所围成的面,它反映了公路在横剖面上的组成情况、形状和几何尺寸,是公路路线设计的重要内容之一。公路横断面设计的主要组成部分是路面和路基,路面包括行车道、变速车道、紧急停车带、爬坡道等,路基包括路肩、边坡、边沟、护坡道、截水沟等。
路基横断面 为设计计算方便,通常用两侧路肩边缘点的联线,来代替路面、路肩等的横坡折线,即横断面的顶面可绘成一条直线。这样将顶面用一直线绘成的横断面即路基横断面。
路拱 为了排除路面的雨水,将路面做成中间高两边低的拱起形状称路拱。
路拱横坡 路面中线点与路面边缘点的高差,与其水平距离的比值称路拱横坡,以%表示。
分隔带 沿道路纵向设置分隔行车道用的带状设施称分隔带,位于中线位置上的称中间带,位于中线两侧的称外侧分隔带。
路肩 位于行车道外缘至路基边缘具有一定宽度的带状设施称路肩,它是路面的侧向支撑,可供临时停车和人行通行,还可使驾驶员有安全感。
路基宽度 在一个横断面上,两侧路肩边缘点间的宽度称路基宽度。
路基边坡 为保证路基的稳定,把路基两侧做成具有一定坡度的坡面称路基边坡。
边沟 为汇集并排除路面、路肩和边玻的水流,在路基两侧设置的水沟称边沟。一般情况下,挖方路基和填土高度小于0.5m的矮路堤,均应设置边沟。
边沟的型式 通常有梯形、矩形和三角形三种,视上质情况和施工方法而定,一般土质路基采用梯形,岩石路基可采用三角形或矩形,机械化施工时多采用三角形。
截水沟 为拦截并排除流向路基的地面水流,以避免对路基边坡冲刷等而设置的排水沟称截水沟。
免费运距 土方作业包括挖、装、运卸等工序,在某一一特定距离内,只按挖方数计价而不计算运费,这一特定距离称免费运距。
平均运距 土石方调配时,从挖方体积重心到填方体积重心的距离称平均运距,为简化设计计算,通常平均运距按挖方路段中心至填方路段中心的距离计。
道路交叉设计 冲突点 当行车方向互相交叉时,可能发生碰撞的地点称为冲突点。
交织点 当车辆从不同方向驶向同一方向或成锐角相交时,可能产生挤撞的地点称为交织点。
加铺转角 以圆曲线构成宽来连接交叉公路的路基和路面,称为加铺转角式交叉。
立体交叉 公路与公路或铁路在不同高度上互相交义的型式称立体交叉。
立体交叉形式 互通式立体交叉的类型 苜蓿叶形 部分苜蓿叶形 Y形 喇叭形 菱形 环形 定向式立体交叉 匝道的作用 匝道是连接立体交叉上、下路线的交换道,一般在匝道上既有弯道又有坡度。
匝道的类型 右转弯匝道——直接从主干线右转弯驶出的匝道 环形匝道——这是一种左转弯行驶的匝道形式。车辆由干线的右侧出口,并以约270°角向右转弯,而完成左转弯的行驶 定向式匝道——由干线左侧出口,以较短捷的路线直接驶入连接的干线,从而完成左转弯的匝道 迁回式匝道——由干线右侧出口,暂时偏离所去方向,以迂回绕行的方式完成左转弯的匝道 变速车道 车辆由高速公路驶入匝道(或车速低的道路)须减速,反之,车辆由匝道(或车速低的道路)驶进高速公路须加速。为了调整车速而设置在高速公路与匝道间的减速或加速车道,称为变速车道。
]]>
+
+
+ <h2 id="道路平面设计"><a href="#道路平面设计" class="headerlink" title="道路平面设计"></a>道路平面设计</h2><h3 id="公路"><a href="#公路" class="headerlink" title="公路"></a>公路</h3><p>一种带状的空间结构物,它的中线是一条空间曲线。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 桥梁设计学习笔记
+
+ https://awaw.cc/post/learn-bridge-design/
+ 2023-03-31T16:00:00.000Z
+ 2023-07-04T04:07:09.846Z
+
+ 桥梁定义桥梁是道路路线遇到江河湖泊、山谷深沟以及其他线路(铁路或公路)等障碍时,为了保持道路的连续性而专门建造的人工构造物。桥梁既要保证桥上的交通运行,也要保证桥下水流的宣泄、船只的通航或车辆的通行。
桥梁基本组成 上部结构 桥跨结构 线路跨越障碍(如江河、山谷或其他线路等)的结构物。
下部结构 桥墩 是在河中或岸上支承桥跨结构的结构物。
轻型桥墩——盖梁、系梁、立柱 重力式桥墩——墩帽、墩身 桥台 设在桥的两端;一边与路堤相接,以防止路堤滑塌;另一边则支承桥跨结构的端部。为保护桥台和路堤填土,桥台两侧常做锥形护坡、挡土墙等防护工程。
墩台基础 是保证桥梁墩台安全并将荷载传至地基的结构。
支座系统 在桥跨结构与桥墩或桥台的支承处所设置的传力装置。它不仅要传递很大的荷载,并且还要保证桥跨结构能产生一定的变位。
附属设施 桥面铺装 或称行车道铺装,铺装的平整性、耐磨性、不翘曲、不渗水是保证行车舒适的关键。
排水防水 应能迅速排除桥面积水,并使渗水的可能性降至最小限度。
栏杆 既是保证安全的构造措施,又是有利于观赏的最佳装饰件。
伸缩缝 桥跨上部结构之间或桥跨上部结构与桥台端墙之间所设的缝隙,以保证结构在各种因素作用下的变位。为使行车顺适、不顺簸,桥面上要设置伸缩缝构造。
灯光照明 桥梁分类 按使用性质分类 公路桥、铁路桥、公铁两用桥、城市道路桥(含立交桥)、人行桥、机耕桥、管线桥、渡槽桥。
按桥身结构材料分类 木桥、圬工桥(砖、石、砼砌块桥)、钢筋砼桥、预应力砼桥、钢桥。
按单孔跨径、多孔跨径总长分类 分类 多孔跨径总长L(m) 单孔跨径Lk (m) 特大桥 L > 1000 Lk > 150 大桥 100 ≤ L ≤ 1000 40 ≤ Lk < 150 中桥 30 < L < 100 20 ≤ Lk < 40 小桥 8 ≤ L ≤ 30 5 ≤ Lk < 20 涵洞 L < 8 Lk < 5
按桥跨结构分类 梁式桥(简支梁、连续梁、伸臂梁)、桁架桥、拱桥、刚构桥、悬索桥、斜拉桥等。此外,还有浮桥、漫水桥、活动桥等。
桥梁类型和受力特点 类型 受力特点 建造材料 梁式桥 竖向荷载作用下无水平反力,梁内产生的弯矩最大 抗弯能力强(钢、木、钢筋砼、预应力钢筋砼) 拱式桥 主要承重结构是拱圈或拱助,在竖向荷载作用下,墩台承受水平推力,承重结构以受压为主 抗压能力强的圬工材料(砖、石、砼)和钢筋砼 刚架桥 梁和柱的连接处具有很大的刚性,在竖向荷载作用下,梁部主要受弯,在柱脚处也具有水平反力,受力状态介于梁桥和拱桥之间 施工比较困难,用普通钢筋砼修建,梁柱刚结处易产生裂缝 悬索桥 以悬索为主要承重结构,结构自重较轻,构造简单、受力明确,能以较小的建筑高度经济合理地修建大跨度桥 结构自重轻,刚度差,在车辆荷载和风荷载作用下有较大的变形和振动 组合体系桥 由几个不同体系的结构组合而成,常见的有:连续刚构,梁、拱组合等;斜拉桥也是组合体系桥的一种 ——
梁式桥 梁式桥分类 简支梁桥 悬臂梁桥 等截面连续梁桥 变截面连续梁桥 连续刚构 梁截面 实心板梁 空心板梁 T梁——底板、梁肋、翼缘板 箱梁——底板、腹板、顶板、翼缘板 拱式桥 与梁式桥主要承受弯曲力不同,拱桥要承受的是沿圈传递的轴向压力。该压力即是桥墩桥台在竖向移动荷作用下所产生的水平推力。
拱式桥分类 承载方式 刚架桥 刚架桥是梁和柱(或竖墙)整体结合的桥梁结构。竖向荷载作用下,梁部主要受弯,柱脚处有水平推力,力状态介于梁式桥和拱桥之间。
刚架桥分类 斜拉桥 斜拉桥由主梁、塔柱和斜拉索3种基本构件组成,用高强钢材制成的斜拉索将主梁多点吊起,将主梁承受的荷载传至塔柱,再由塔柱基础传给地基。斜拉桥是主梁(桥面体系)受压、受弯,斜拉索(支承体系)受拉的结构。
索型 桥梁常用术语 横隔板 横隔板是为保持截面形状、增强横向刚度而在梁之间设置的构件。位于桥梁端部的横隔板称为端隔板,位于中部的横隔板称为中隔板。
湿接缝、湿接头 净跨径 相邻两个桥墩(或桥台)之间的净距。对于拱式桥是每孔拱跨两个拱脚截面最低点之间的水平距离。
计算跨径 对于具有支座的桥梁,是指桥跨结构相邻两个支座中心之间的距离;对于拱式桥,是指两相邻拱脚截面形心点之间的水平距离,即拱轴线两端点之间的水平距离。
标准跨径 相邻两个桥墩中心线的距离。
拱轴线 拱圈各截面形心点的连线。
桥梁高度 指桥面与低水位之间的高差,或指桥面与桥下线路路面之间的距离,简称桥高。
桥下净空高度 设计洪水位、计算通航水位或桥下线路路面至桥跨结构最下缘之间的距离。
建筑高度 桥上行车路面(或轨顶)标高至桥跨结构最下缘之间的距离。
容许建筑高度 公路或铁路定线中所确定的桥面或轨顶标高,对通航净空顶部标高之差。
净矢高 从拱顶截面下缘至相邻两拱脚截面下缘最低点之连线的垂直距离。
计算矢高 从拱顶截面形心至相两拱脚截面形心之连线的垂直距离。
矢跨比 计算矢高与计算跨径之比,也称拱矢度,它是反映拱桥受力特性的一个重要指标。
涵洞 用来宣泄路堤下水流的构造物。通常在建造涵洞处路堤不中断。凡是多孔跨径全长不到8m和单孔跨径不到5m的泄水结构物,均称为涵洞。
]]>
+
+
+ <h2 id="桥梁定义"><a href="#桥梁定义" class="headerlink" title="桥梁定义"></a>桥梁定义</h2><p>桥梁是道路路线遇到江河湖泊、山谷深沟以及其他线路(铁路或公路)等障碍时,为了保持道路的连续性而专门建造的人工构造物。桥梁既要保证桥上的交通运行,也要保证桥下水流的宣泄、船只的通航或车辆的通行。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ NAS诞生记
+
+ https://awaw.cc/post/my-first-nas/
+ 2022-06-09T16:00:00.000Z
+ 2023-07-04T05:17:59.285Z
+
+ NAS(Network Attached Storage:网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置 ,因此也称为“网络存储器”。它是一种专用数据存储服务器。它以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽、提高性能、降低总拥有成本、保护投资。其成本远远低于使用服务器存储,而效率却远远高于后者。
配置清单 品类 型号 渠道 价格 备注 主板 映泰J4125NHU 淘宝 580 SATA*2、M.2*1、PCIEx16*1 处理器 Intel J4125 - - 板载CPU、被动散热 机箱 蜗牛星际C款 闲鱼 128 PCIE开口、4盘位、硬盘背板 内存 玖合 忆界马甲条 京东 149 8G、DDR4、3000MHz 扩展卡 乐扩m.2转5口SATA 京东 149 SATA3.0*5 电源 益衡7025B 淘宝 245 80PLUS铜牌、双路12V 36A 插座 小米智能插座2 京东 49 电量统计、远程开机 1300
系统方案 方案 系统 备注 虚拟机 PVE/EXSi 硬盘直通、核显直通 虚拟机 Windows & VMware CPU性能羸弱 物理机 群晖1 U盘/SATA引导、UI人性化、套件易用(采纳✔) 物理机 Unraid 按盘位收费 物理机 FreeNAS/TrueNAS 使用ECC内存 物理机 万由 只支持到U-NAS5、U-NAS6仅万由硬件可用
1 固件版本 918+ 7.0.1 42218 up3
总结 目前这套配置搭配群晖系统已稳定运行两周,单块1T硬盘(老笔记本淘汰),功耗15W。
2023.07.04 更新了以下内容
改用 arpl v1.1-beta2a 自编译引导 系统升级为 7.1.1 42962 up5 添加了一块 512GB SATA固态硬盘(用于提升docker、套件、虚拟机等服务的运行效率,实际感受docker和套件提升不明显,跑虚拟机提升明显) 添加了一块 4TB 西部数据垂直盘 添加了一块 4*SATA PCIe扩展卡,目前板载2SATA,扩展4SATA,共6个SATA口 目前待机功率为21W,每天消耗0.5度电 ]]>
+
+
+ <p>NAS(Network Attached Storage:网络附属存储)按字面简单说就是<strong>连接在网络上,具备资料存储功能的装置</strong>,因此也称为“网络存储器”。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 挪车码生成器 - 开源
+
+ https://awaw.cc/post/car-code-generator/
+ 2021-06-17T16:00:00.000Z
+ 2023-07-14T06:11:37.772Z
+
+ 临时停车时,直接把手机号放在车上,容易被广告推销人员盯上,用二维码的方式间接给别人提供联系方式,可以有效降低此类情况发生。优势 使用挪车码展示联系方式,可以避免直接展示出手机号码,广告推销人员可能懒得扫码获取你的手机号 可以使用微信、浏览器、系统相机扫一扫等进行扫码,无需手动输入长达11位的无序数字 组成的手机号,直接一键拨号,减少焦虑感 劣势 由于本服务是完全免费的,故无法提供虚拟手机号进行拨号 使用方法 输入手机号码 保存到挪车码 用作图工具添加“扫码挪车”等字样后用A4纸打印出来 临时停车的时候放在车窗下显眼位置 截图
下载地址 https://www.lanzoux.com/iej9Tqkzj7c 提取码:pdone
代码仓库 https://github.com/pdone/car-code-generator
]]>
+
+
+ <p>临时停车时,直接把手机号放在车上,容易被广告推销人员盯上,用二维码的方式间接给别人提供联系方式,可以有效降低此类情况发生。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 最常用的 35 个 Git 命令
+
+ https://awaw.cc/post/git-command/
+ 2021-05-20T16:00:00.000Z
+ 2023-07-04T03:58:52.572Z
+
+ 不管你是新手还是经验丰富的开发人员,都需要使用源代码管理。因此很大几率上你会选择使用Git来管理源代码。要发挥Git的全部潜力,我们需要了解Git命令。在本文中,你将学到最有用的一些Git命令,掌握这些Git命令将帮助你提升编码水平。
本Git命令指南共分为三个部分:基础命令,进阶命令和高阶Git命令。
基础Git命令 在这个部分中,我们要学习的是一些非常基础的Git命令。这些基础的Git命令是学习其他进阶命令的基础。
下面请看这9个基础的Git命令。
1. git config git config
命令非常有用。尤其是在你第一次使用Git或刚安装新的Git时。此命令可设置身份——Name和Email地址。并且每次提交时会使用此信息。
1 2 3 $ git config --global user.name "Your name" $ git config --global user.email "Your email"
2. git version 顾名思义,它会检查你使用的是哪个版本的Git。目前,截至编写本指南时,Git for Windows的最新版本是2.31.1。它发布于2021年3月27日。
3. git init 这可能是你在Git中启动新项目所使用的第一个命令。此命令将创建一个空白的新存储库,然后你可以将源代码存储在此存储库中。
或者,你也可以在git init
命令中使用存储库名称。
1 $ git init <your repository name>
4. git clone git clone
命令将使用现有的存储库进行复制。git init
和git clone
之间有一个主要区别。
在你需要在现有的存储库上进行复制时,使用git clone
。git clone
命令首先在内部使用git init
命令,然后检出所有内容。
1 git clone <your project URL>
5. git add git add
命令会把所有新的代码文件或修改后的文件添加到存储库中。此命令提供了添加文件和文件夹的不同选项。
将单个文件添加到暂存区
1 $ git add your_file_name
此选项会将所有修改过的文件和新文件添加到暂存区
6. git commit 这个Git命令是必不可少的。如果不能合理利用此命令,则可能会降低项目质量。
简而言之,git commit
会将更改添加到本地存储库。
1 $ git commit -m "your useful commit message"
7. git status 使用此Git命令可以方便地查看有多少文件需要得到关注。你可以随时运行此命令。
此命令可以用来在git add
和git commit
之间查看状态。
8. git branch 大多数时候,你的Git存储库中总会有多个分支。我们可以使用git branch
命令有效地管理分支。Git分支有许多不同的选项和开关。
为简单起见,在这里我将重点介绍如何创建和删除Git分支。
列出所有分支
创建新的分支
1 $ git branch <branch_name>
删除分支
1 $ git branch -d <branch_name>
9. git checkout 此Git命令用于在分支之间进行切换。这是功能强大的git命令之一,堪称万能的瑞士军刀。
以下是切换到另一个分支的语法。
1 $ git checkout <branch_name>
此外,你也可以创建和检出到分支。
1 $ git checkout -b <your_new_branch_name>
进阶Git命令 掌握了基础的Git命令之后,我们就该学习进阶Git命令了。
如果你需要与团队合作,与他人共享代码,那么这些Git命令会非常有用。另外,还有一些类似git log
命令,这些命令可帮助查看以前的提交历史。
10. git remote git remote
命令就像边界,如果你需要与外界连接,则必须使用git remote
命令。此命令会将你的本地存储库连接到远程。
1 $ git remote add <shortname> <url>
举例
1 $ git remote add origin https://dev.azure.com/aCompiler/_git/DemoProject
11. git push (借助git remote
命令)与远程存储库连接之后,就需要将更改推送到存储库。
1 $ git push -u <short_name> <your_branch_name>
举例
1 $ git push -u origin feature_branch
12. git push –set-upstream 在使用git push
之前,我们应该先设置好origin
和upstream
。下面是设置upstream
的命令。
1 $ git push --set-upstream <short_name> <branch_name>
举例
1 $ git push --set-upstream origin feature_branch
13. git fetch 当需要下载其他团队成员的更改时,就得使用git fetch
。
此命令会下载有关提交、引用等的所有信息,因此你可以在将这些更改应用于本地存储库之前对其进行检查。
14. git pull git pull
命令下载内容(而不是元数据),并立即用最新的内容更新本地存储库。
15. git stash 此git命令会临时存储已修改的文件。你可以使用以下Git命令处理stash
工作。
可以使用以下命令查看所有stash
如果你需要应用stash
到分支,那就使用apply
16. git log 在git log
的帮助下,你可以看到所有之前的提交,并且最近的提交出现在最前面。
默认情况下,它将显示当前已检出分支的所有提交,但是你可以强制通过所有选项来查看所有分支的所有提交。
17. git shortlog git shortlog
命令会显示来自git log
命令的摘要。如果你只对简短的摘要感兴趣,那么此命令就非常有用了。
这个命令有助于查看谁处理了什么,因为它对作者及其提交进行了分组。
18. git show 与git log
相比,此命令将显示有关特定提交的详细信息。
1 $ git show <your_commit_hash>
19. git rm 有时你需要从代码库中删除文件,在这种情况下,可以使用git rm
命令。
它可以从索引和工作目录中删除跟踪的文件。
1 $ git rm <your_file_name>
20. git merge git merge
可帮助将来自两个分支的更改集成到单个分支中。
1 $ git merge <branch_name>
此命令会将<branch_name>
合并到当前你选择的分支中。
高阶Git命令 现在是时候再上一个层次了。在这个部分中,我们要学习的是高阶的Git命令。这些命令就需要花时间去练习了。
但是一旦掌握了这些命令的基础知识,使用起来不要太轻松哦。
21. git rebase git rebase
类似于git merge
命令。它把两个分支集成到一个分支中,但有一个不一样的地方:git rebase
命令将会重写提交记录。
当你有多个私有分支合并到单个分支时,应使用git rebase
命令。它将使得提交历史成为线性的。
22. git bisect git bisect
命令可帮助查找糟糕的提交。
启动git bisect
让git bisect知道什么是好的提交
让git bisect知道什么是糟糕的提交
通过git bisect
,只要几分钟你就可以缩小问题代码的范围。
23. git cherry-pick git cherry-pick
是一个蛮有用的命令,允许你从任意分支中选择任意提交并将其应用于其他任意分支。
1 $ git cherry-pick <commit-hash>
git cherry-pick
不会修改存储库的历史记录;相反,它会添加到历史记录。
24. git archive git archive
命令会把多个文件合并为单个文件。就好像zip
实用程序一样,所以你可以提取存档文件以获取单个文件。
1 $ git archive --format zip HEAD > archive-HEAD.zip
它将创建当前修订的zip
存档。
25. git pull –rebase 在大多数情况下,当你使用git pull
时,你需要重新设置基准(并且不进行合并)。
此时,你就可以使用此选项。
这将帮助保持干净的历史记录。另外,还可以避免多次合并。
26. git blame 如果你需要逐行检查任意文件的内容,则需要使用git blame
命令。它可以帮助确定是谁对文件进行了更改。
1 $ git blame <your_file_name>
27. git tag 在Git中,标签很有用,你可以使用它们来管理发布。你可以将git tag
视为不会改变的分支。尤其是要公开发布的时候,则更为重要了。
28. git verify-commit git verify-commit
命令将检查gpg
签名。GPG,GNU Privacy Guard,是sign文件中使用的工具,包含签名。
1 $ git verify-commit <commit>
29. git verify-tag 可以以同样的方式确认标签。
30. git diff 大多数情况下,在提交或推送之前,你需要比较两个git文件或分支。用这个命令就方便多了。
将工作目录与本地存储库进行比较
1 $ git diff HEAD <filename>
比较两个分支
1 $ git diff <source branch> <target branch>
git citool
是Git提交的图形化替代。
32. git mv 重命名git文件。接受两个参数,源文件名和目标文件名。
1 $ git mv <old-file-name> <new-file-name>
33. git clean 你可以使用git clean
命令处理未跟踪的文件。可以使用此命令从工作目录中删除所有未跟踪的文件。如果要处理跟踪的文件,则需要使用git reset
命令。
34. git help Git中有许多命令,如果你需要其他命令的帮助,则可以随时在终端上使用git help
。
1 $ git help <git_command>
35. git whatchanged 此命令的作用与git log
相同,但为原始格式。并且由于历史原因,它也是git的一份子。
]]>
+
+
+ <p>不管你是新手还是经验丰富的开发人员,都需要使用源代码管理。因此很大几率上你会选择使用Git来管理源代码。</p>
+<p>要发挥Git的全部潜力,我们需要了解Git命令。在本文中,你将学到最有用的一些Git命令,掌握这些Git命令将帮助你提升编码水平。</p>
+
+
+
+
+
+
+
+
+
+
+
+ 批处理获取时间小于10点时补零
+
+ https://awaw.cc/post/bat-date/
+ 2021-04-07T16:00:00.000Z
+ 2023-07-13T04:14:05.896Z
+
+ 使用 %time:~0,2%
获取时间时,当前时间若小于10点,获取到的时间不会自动补零,但是分钟和秒钟会补零,所以小时部分需要自己处理一下。Code 1 2 3 4 5 6 7 @echo offset hour=%time:~0,2%if %hour% LSS 10 (set "hour=0%time:~1,1%" )set date =%date :~0,4%-%date :~5,2%-%date :~8,2%T%hour%:%time:~3,2%:%time:~6,5%echo %date % pause
Output ]]>
+
+
+ <p>使用 <code>%time:~0,2%</code> 获取时间时,当前时间若小于10点,获取到的时间不会自动补零,但是分钟和秒钟会补零,所以小时部分需要自己处理一下。</p>
+
+
+
+
+
+
+
+
+
+
+
+ 洛阳地铁一号线开通啦!(内附线路图)
+
+ https://awaw.cc/post/luoyang-subway/
+ 2021-03-27T16:00:00.000Z
+ 2023-07-14T06:12:34.377Z
+
+ 洛阳轨道交通(Luoyang Subway)是服务于中国河南省洛阳市的城市轨道交通系统,其首条线路于2020年12月1日开始试运行。2021年3月28日正式运营,当日客流量为10.7382万人次。
截至2021年3月,洛阳轨道交通已开通运营线路1条,为洛阳轨道交通1号线;在建线路1条,为洛阳轨道交通2号线;规划线路2条,为洛阳轨道交通3号线、洛阳轨道交通4号线;线网共设车站34座。
]]>
+
+
+ <p>洛阳轨道交通(Luoyang Subway)是服务于中国河南省洛阳市的城市轨道交通系统,其首条线路于2020年12月1日开始试运行。</p>
+
+
+
+
+
+
+
+
+
+
+
+ 数据库调优
+
+ https://awaw.cc/post/sql-tuning/
+ 2021-01-31T16:00:00.000Z
+ 2023-07-04T05:10:14.518Z
+
+ 先思考这几个问题:什么时候才需要分库分表呢?我们的评判标准是什么? 一张表存储了多少数据的时候,才需要考虑分库分表? 数据增长速度很快,每天产生多少数据,才需要考虑做分库分表? 为什么要分库分表? 首先回答一下为什么要分库分表,答案很简单:数据库出现性能瓶颈 。用大白话来说就是数据库快扛不住了。 数据库出现性能瓶颈,对外表现有几个方面:
大量请求阻塞 在高并发场景下,大量请求都需要操作数据库,导致连接数不够了,请求处于阻塞状态。
SQL 操作变慢 如果数据库中存在一张上亿数据量的表,一条 SQL 没有命中索引会全表扫描,这个查询耗时会非常久。
存储出现问题 业务量剧增,单库数据量越来越大,给存储造成巨大压力。
从机器的角度看,性能瓶颈无非就是CPU、内存、磁盘、网络这些,要解决性能瓶颈最简单粗暴的办法就是提升机器性能,但是通过这种方法成本和收益投入比往往又太高了,不划算,所以重点还是要从软件角度入手。
数据库相关优化方案 数据库优化方案很多,主要分为两大类:软件层面 、硬件层面 。 软件层面包括:SQL 调优、表结构优化、读写分离、数据库集群、分库分表等; 硬件层面主要是增加机器性能。
SQL 调优 SQL 调优往往是解决数据库问题的第一步,往往投入少部分精力就能获得较大的收益。 SQL 调优主要目的是尽可能的让那些慢 SQL 变快,手段其实也很简单就是让 SQL 执行尽量命中索引。
开启慢 SQL 记录 如果你使用的是 Mysql,需要在 Mysql 配置文件中配置几个参数即可。
1 2 3 slow_query_log = on long_query_time = 1 slow_query_log_file = /path/to/log
调优工具 常常会用到 explain 这个命令来查看 SQL 语句的执行计划,通过观察执行结果很容易就知道该 SQL 语句是不是全表扫描、有没有命中索引。
1 select id, age, gender from user where name = 'pdone' ;
返回有一列叫“type”,常见取值有:
ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好) ALL 代表这条 SQL 语句全表扫描了,需要优化。一般来说需要达到range 级别及以上。
表结构优化 以一个场景举例说明:
“user”表中有 user_id、nickname 等字段,“order”表中有order_id、user_id等字段,如果想拿到用户昵称怎么办?一般情况是通过 join 关联表操作,在查询订单表时关联查询用户表,从而获取导用户昵称。
但是随着业务量增加,订单表和用户表肯定也是暴增,这时候通过两个表关联数据就比较费力了,为了取一个昵称字段而不得不关联查询几十上百万的用户表,其速度可想而知。
这个时候可以尝试将 nickname 这个字段加到 order 表中(order_id、user_id、nickname),这种做法通常叫做数据库表冗余字段。这样做的好处展示订单列表时不需要再关联查询用户表了。
冗余字段的做法也有一个弊端,如果这个字段更新会同时涉及到多个表的更新,因此在选择冗余字段时要尽量选择不经常更新的字段。
架构优化 当单台数据库实例扛不住,我们可以增加实例组成集群对外服务。
当发现读请求明显多于写请求时,我们可以让主实例负责写,从实例对外提供读的能力;如果读实例压力依然很大,可以在数据库前面加入缓存如 redis,让请求优先从缓存取数据减少数据库访问。
缓存分担了部分压力后,数据库依然是瓶颈,这个时候就可以考虑分库分表的方案了,后面会详细介绍。
硬件优化 硬件成本非常高,一般来说不可能遇到数据库性能瓶颈就去升级硬件。
在前期业务量比较小的时候,升级硬件数据库性能可以得到较大提升;但是在后期,升级硬件得到的收益就不那么明显了。
分库分表详解 下面我们以一个商城系统为例逐步讲解数据库是如何一步步演进。
]]>
+
+
+ <p>先思考这几个问题:</p>
+<ul>
+<li>什么时候才需要分库分表呢?我们的评判标准是什么?</li>
+<li>一张表存储了多少数据的时候,才需要考虑分库分表?</li>
+<li>数据增长速度很快,每天产生多少数据,才需要考虑做分库分表?</li>
+</ul>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Markdown代码块支持的语言
+
+ https://awaw.cc/post/md-codeblock-lang/
+ 2021-01-29T16:00:00.000Z
+ 2023-07-04T04:07:40.271Z
+
+ Markdown代码块支持的语言,使用时在```
后加上对应关键字即可。名称 关键字 调用的js AppleScript applescript shBrushAppleScript.js ActionScript 3.0 actionscript3, as3 shBrushAS3.js Shell bash, shell shBrushBash.js ColdFusion coldfusion, cf shBrushColdFusion.js C cpp, c shBrushCpp.js C# c#, c-sharp, csharp shBrushCSharp.js CSS css shBrushCss.js Delphi delphi, pascal, pas shBrushDelphi.js diff&patch diff patch shBrushDiff.js Erlang erl, erlang shBrushErlang.js Groovy groovy shBrushGroovy.js Java java shBrushJava.js JavaFX jfx, javafx shBrushJavaFX.js JavaScript js, jscript, javascript shBrushJScript.js Perl perl, pl, Perl shBrushPerl.js PHP php shBrushPhp.js text text, plain shBrushPlain.js Python py, python shBrushPython.js Ruby ruby, rails, ror, rb shBrushRuby.js SASS&SCSS sass, scss shBrushSass.js Scala scala shBrushScala.js SQL sql shBrushSql.js Visual Basic vb, vbnet shBrushVb.js XML xml, xhtml, xslt, html shBrushXml.js Objective C objc, obj-c shBrushObjectiveC.js F# f# f-sharp, fsharp shBrushFSharp.js xpp, dynamics-xpp shBrushDynamics.js R r, s, splus shBrushR.js matlab matlab shBrushMatlab.js swift swift shBrushSwift.js GO go, golang shBrushGo.js
]]>
+
+
+ <p>Markdown代码块支持的语言,使用时在<code>```</code>后加上对应关键字即可。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ BuildInCategory枚举
+
+ https://awaw.cc/post/revit-category/
+ 2020-12-01T10:30:00.000Z
+ 2023-07-04T05:04:04.499Z
+
+ Revit二次开发中经常用到BuildInCategory 过滤元素,以下是通过遍历该枚举获取的数据,其中部分类别的名称未能获取到,本文未显示Unknown 部分,完整版本见 BuildInCategory枚举 - 完整 。中文名称 名称 值 分析链接 OST_LinksAnalytical -2009657 分析楼板基础标记 OST_FoundationSlabAnalyticalTags -2009656 分析条形基础标记 OST_WallFoundationAnalyticalTags -2009655 分析独立基础标记 OST_IsolatedFoundationAnalyticalTags -2009654 分析墙标记 OST_WallAnalyticalTags -2009653 分析楼层标记 OST_FloorAnalyticalTags -2009652 分析柱标记 OST_ColumnAnalyticalTags -2009651 分析支撑标记 OST_BraceAnalyticalTags -2009650 分析梁标记 OST_BeamAnalyticalTags -2009649 分析节点 OST_AnalyticalNodes -2009645 分析基础底板 OST_FoundationSlabAnalytical -2009643 分析条形基础 OST_WallFoundationAnalytical -2009642 分析独立基础 OST_IsolatedFoundationAnalytical -2009641 分析墙 OST_WallAnalytical -2009640 分析楼层 OST_FloorAnalytical -2009639 顶部线段 OST_ColumnEndSegment -2009638 基准线段 OST_ColumnStartSegment -2009637 分析柱 OST_ColumnAnalytical -2009636 末端线段 OST_BraceEndSegment -2009635 起点线段 OST_BraceStartSegment -2009634 分析支撑 OST_BraceAnalytical -2009633 末端线段 OST_BeamEndSegment -2009632 起点线段 OST_BeamStartSegment -2009631 分析梁 OST_BeamAnalytical -2009630 棍状符号 OST_StructuralTrussStickSymbols -2009608 隐藏线 OST_MassHiddenLines -2009532 隐藏线 OST_CurtaSystemHiddenLines -2009531 隐藏线 OST_EntourageHiddenLines -2009529 隐藏线 OST_PlantingHiddenLines -2009528 隐藏线 OST_SpecialityEquipmentHiddenLines -2009527 隐藏线 OST_TopographyHiddenLines -2009526 隐藏线 OST_SiteHiddenLines -2009524 隐藏线 OST_RoadsHiddenLines -2009523 隐藏线 OST_ParkingHiddenLines -2009522 隐藏线 OST_PlumbingFixturesHiddenLines -2009521 隐藏线 OST_MechanicalEquipmentHiddenLines -2009520 隐藏线 OST_LightingFixturesHiddenLines -2009519 隐藏线 OST_FurnitureSystemsHiddenLines -2009518 隐藏线 OST_ElectricalFixturesHiddenLines -2009517 隐藏线 OST_ElectricalEquipmentHiddenLines -2009516 隐藏线 OST_CaseworkHiddenLines -2009515 隐藏线 OST_DetailComponentsHiddenLines -2009514 隐藏线 OST_ShaftOpeningHiddenLines -2009513 隐藏线 OST_GenericModelHiddenLines -2009512 隐藏线 OST_CurtainWallMullionsHiddenLines -2009511 隐藏线 OST_CurtainWallPanelsHiddenLines -2009510 隐藏线 OST_RampsHiddenLines -2009509 隐藏线 OST_StairsRailingHiddenLines -2009508 隐藏线 OST_StairsHiddenLines -2009507 隐藏线 OST_ColumnsHiddenLines -2009506 隐藏线 OST_FurnitureHiddenLines -2009505 隐藏线 OST_LinesHiddenLines -2009504 隐藏线 OST_CeilingsHiddenLines -2009503 隐藏线 OST_RoofsHiddenLines -2009502 隐藏线 OST_DoorsHiddenLines -2009501 隐藏线 OST_WindowsHiddenLines -2009500 轮廓标记 OST_StructConnectionProfilesTags -2009064 孔标记 OST_StructConnectionHoleTags -2009063 隐藏线 OST_CouplerHiddenLines -2009062 结构钢筋接头标记 OST_CouplerTags -2009061 结构钢筋接头 OST_Coupler -2009060 焊接标记 OST_StructConnectionWeldTags -2009059 剪力钉标记 OST_StructConnectionShearStudTags -2009058 锚固件标记 OST_StructConnectionAnchorTags -2009057 螺栓标记 OST_StructConnectionBoltTags -2009056 板标记 OST_StructConnectionPlateTags -2009055 隐藏线 OST_RebarHiddenLines -2009050 修改器 OST_StructConnectionModifiers -2009047 焊缝 OST_StructConnectionWelds -2009046 孔 OST_StructConnectionHoles -2009045 剪力钉 OST_StructConnectionShearStuds -2009044 其他 OST_StructConnectionOthers -2009042 螺栓 OST_StructConnectionBolts -2009041 结构连接标记 OST_StructConnectionTags -2009040 锚固件 OST_StructConnectionAnchors -2009039 平板 OST_StructConnectionPlates -2009038 轮廓 OST_StructConnectionProfiles -2009037 参照 OST_StructConnectionReference -2009036 符号 OST_StructConnectionSymbol -2009033 隐藏线 OST_StructConnectionHiddenLines -2009032 结构连接 OST_StructConnections -2009030 边界 OST_FabricAreaBoundary -2009029 结构钢筋网符号 OST_FabricReinSpanSymbol -2009028 钢筋网 OST_FabricReinforcementWire -2009027 边界 OST_FabricReinforcementBoundary -2009026 钢筋集切换 OST_RebarSetToggle -2009025 结构钢筋网标记 OST_FabricReinforcementTags -2009022 结构区域钢筋标记 OST_AreaReinTags -2009021 结构钢筋标记 OST_RebarTags -2009020 <钢筋网片> OST_FabricAreaSketchSheetsLines -2009019 <钢筋网外围> OST_FabricAreaSketchEnvelopeLines -2009018 结构钢筋网区域 OST_FabricAreas -2009017 结构钢筋网 OST_FabricReinforcement -2009016 钢筋保护层参照 OST_RebarCover -2009015 钢筋形状 OST_RebarShape -2009013 边界 OST_PathReinBoundary -2009012 结构路径钢筋标记 OST_PathReinTags -2009011 结构路径钢筋符号 OST_PathReinSpanSymbol -2009010 结构路径钢筋 OST_PathRein -2009009 边界 OST_AreaReinBoundary -2009006 结构区域钢筋符号 OST_AreaReinSpanSymbol -2009005 结构区域钢筋 OST_AreaRein -2009003 结构钢筋 OST_Rebar -2009000 隔热层 OST_FabricationPipeworkInsulation -2008221 内衬 OST_FabricationDuctworkLining -2008220 降 OST_FabricationContainmentDrop -2008219 升 OST_FabricationContainmentRise -2008218 降 OST_FabricationPipeworkDrop -2008217 升 OST_FabricationPipeworkRise -2008216 符号 OST_FabricationContainmentSymbology -2008215 中心线 OST_FabricationContainmentCenterLine -2008214 MEP 预制保护层标记 OST_FabricationContainmentTags -2008213 MEP 预制保护层 OST_FabricationContainment -2008212 符号 OST_FabricationPipeworkSymbology -2008211 中心线 OST_FabricationPipeworkCenterLine -2008210 MEP 预制管道标记 OST_FabricationPipeworkTags -2008209 MEP 预制管道 OST_FabricationPipework -2008208 符号 OST_FabricationDuctworkSymbology -2008207 降 OST_FabricationDuctworkDrop -2008206 升 OST_FabricationDuctworkRise -2008205 MEP 预制支架标记 OST_FabricationHangerTags -2008204 MEP 预制支架 OST_FabricationHangers -2008203 隔热层 OST_FabricationDuctworkInsulation -2008198 中心线 OST_FabricationDuctworkCenterLine -2008196 MEP 预制管网标记 OST_FabricationDuctworkTags -2008194 MEP 预制管网 OST_FabricationDuctwork -2008193 着色 OST_gbXML_Shade -2008187 分析表面 OST_AnalyticSurfaces -2008186 分析空间 OST_AnalyticSpaces -2008185 空气洞口 OST_gbXML_OpeningAir -2008184 非推拉门 OST_gbXML_NonSlidingDoor -2008183 推拉门 OST_gbXML_SlidingDoor -2008182 可操作天窗 OST_gbXML_OperableSkylight -2008181 固定天窗 OST_gbXML_FixedSkylight -2008180 可操作窗口 OST_gbXML_OperableWindow -2008179 固定窗 OST_gbXML_FixedWindow -2008178 地下天花板 OST_gbXML_UndergroundCeiling -2008177 地下板 OST_gbXML_UndergroundSlab -2008176 地下墙 OST_gbXML_UndergroundWall -2008175 空气曲面 OST_gbXML_SurfaceAir -2008174 天花板 OST_gbXML_Ceiling -2008173 内部楼板 OST_gbXML_InteriorFloor -2008172 内墙 OST_gbXML_InteriorWall -2008171 平整表面上的板 OST_gbXML_SlabOnGrade -2008170 活动楼板 OST_gbXML_RaisedFloor -2008169 屋顶 OST_gbXML_Roof -2008168 外墙 OST_gbXML_ExteriorWall -2008167 管段 OST_PipeSegments -2008163 管道占位符 OST_PlaceHolderPipes -2008161 风管占位符 OST_PlaceHolderDucts -2008160 参照线 OST_PipingSystem_Reference_Visibility -2008159 参照线 OST_DuctSystem_Reference_Visibility -2008157 管道隔热层标记 OST_PipeInsulationsTags -2008155 风管内衬标记 OST_DuctLiningsTags -2008154 风管隔热层标记 OST_DuctInsulationsTags -2008153 电气备件/空间电路 OST_ElectricalInternalCircuits -2008152 配电盘明细表图形 OST_PanelScheduleGraphics -2008151 电缆桥架管路 OST_CableTrayRun -2008150 线管管路 OST_ConduitRun -2008149 中心线 OST_ConduitFittingCenterLine -2008141 中心线 OST_CableTrayFittingCenterLine -2008140 中心线 OST_ConduitCenterLine -2008139 降 OST_ConduitDrop -2008138 升 OST_ConduitRiseDrop -2008137 中心线 OST_CableTrayCenterLine -2008136 降 OST_CableTrayDrop -2008135 升 OST_CableTrayRiseDrop -2008134 线管标记 OST_ConduitTags -2008133 线管 OST_Conduit -2008132 电缆桥架标记 OST_CableTrayTags -2008131 电缆桥架 OST_CableTray -2008130 线管配件标记 OST_ConduitFittingTags -2008129 线管配件 OST_ConduitFitting -2008128 电缆桥架配件标记 OST_CableTrayFittingTags -2008127 电缆桥架配件 OST_CableTrayFitting -2008126 布管系统配置 OST_RoutingPreferences -2008125 风管内衬 OST_DuctLinings -2008124 风管隔热层 OST_DuctInsulations -2008123 管道隔热层 OST_PipeInsulations -2008122 参照线 OST_HVAC_Zones_Reference_Visibility -2008118 内部填充 OST_HVAC_Zones_InteriorFill_Visibility -2008117 颜色填充 OST_HVAC_Zones_ColorFill -2008116 分区标记 OST_ZoneTags -2008115 边界 OST_HVAC_Zones_Boundary -2008108 HVAC 区 OST_HVAC_Zones -2008107 开关系统 OST_SwitchSystem -2008101 喷头标记 OST_SprinklerTags -2008100 喷头 OST_Sprinklers -2008099 洞口 OST_GbXML_Opening -2008095 地下 OST_GbXML_SType_Underground -2008094 着色 OST_GbXML_SType_Shade -2008093 外部 OST_GbXML_SType_Exterior -2008092 内部 OST_GbXML_SType_Interior -2008091 分析表面 OST_GbXMLFaces -2008090 回路方向 OST_WireHomeRunArrows -2008089 灯具标记 OST_LightingDeviceTags -2008088 灯具 OST_LightingDevices -2008087 火警设备标记 OST_FireAlarmDeviceTags -2008086 火警设备 OST_FireAlarmDevices -2008085 数据设备标记 OST_DataDeviceTags -2008084 数据设备 OST_DataDevices -2008083 通讯设备标记 OST_CommunicationDeviceTags -2008082 通讯设备 OST_CommunicationDevices -2008081 安全设备标记 OST_SecurityDeviceTags -2008080 安全设备 OST_SecurityDevices -2008079 护理呼叫设备标记 OST_NurseCallDeviceTags -2008078 护理呼叫设备 OST_NurseCallDevices -2008077 电话设备标记 OST_TelephoneDeviceTags -2008076 电话设备 OST_TelephoneDevices -2008075 导线记号 OST_WireTickMarks -2008074 中心线 OST_PipeFittingCenterLine -2008072 降 OST_PipeCurvesDrop -2008069 中心线 OST_DuctFittingCenterLine -2008066 降 OST_DuctCurvesDrop -2008062 风管管件标记 OST_DuctFittingTags -2008061 管件标记 OST_PipeFittingTags -2008060 管道颜色填充 OST_PipeColorFills -2008059 管道颜色填充图例 OST_PipeColorFillLegends -2008058 导线标记 OST_WireTags -2008057 管道附件标记 OST_PipeAccessoryTags -2008056 管道附件 OST_PipeAccessory -2008055 升 OST_PipeCurvesRiseDrop -2008054 填充图案 OST_FlexPipeCurvesPattern -2008053 中心线 OST_FlexPipeCurvesCenterLine -2008051 软管 OST_FlexPipeCurves -2008050 管件 OST_PipeFitting -2008049 软管标记 OST_FlexPipeTags -2008048 管道标记 OST_PipeTags -2008047 中心线 OST_PipeCurvesCenterLine -2008045 管道 OST_PipeCurves -2008044 管道系统 OST_PipingSystem -2008043 导线 OST_Wire -2008039 电路 OST_ElectricalCircuit -2008037 升 OST_DuctCurvesRiseDrop -2008036 填充图案 OST_FlexDuctCurvesPattern -2008023 中心线 OST_FlexDuctCurvesCenterLine -2008021 软风管 OST_FlexDuctCurves -2008020 风管附件标记 OST_DuctAccessoryTags -2008017 风管附件 OST_DuctAccessory -2008016 风管系统 OST_DuctSystem -2008015 风道末端标记 OST_DuctTerminalTags -2008014 风道末端 OST_DuctTerminal -2008013 风管管件 OST_DuctFitting -2008010 风管颜色填充 OST_DuctColorFills -2008005 软风管标记 OST_FlexDuctTags -2008004 风管标记 OST_DuctTags -2008003 中心线 OST_DuctCurvesCenterLine -2008001 风管 OST_DuctCurves -2008000 风管颜色填充图例 OST_DuctColorFillLegends -2007004 桥梁支座 OST_BridgeBearings -2006138 桥梁大梁 OST_BridgeGirders -2006137 桥梁基础 OST_BridgeFoundations -2006136 桥面 OST_BridgeDecks -2006135 桥拱 OST_BridgeArches -2006134 桥梁缆索 OST_BridgeCables -2006133 桥塔 OST_BridgeTowers -2006132 桥墩 OST_BridgePiers -2006131 桥台 OST_BridgeAbutments -2006130 平面视图中的支撑符号 OST_StructuralBracePlanReps -2006110 连接符号 OST_StructConnectionSymbols -2006100 结构注释 OST_StructuralAnnotations -2006090 云线批注标记 OST_RevisionCloudTags -2006080 云线批注 OST_RevisionClouds -2006060 立面标记 OST_ElevationMarks -2006045 轴网标头 OST_GridHeads -2006040 标高标头 OST_LevelHeads -2006020 范围框 OST_VolumeOfInterest -2006000 边界条件 OST_BoundaryConditions -2005301 内部面荷载标记 OST_InternalAreaLoadTags -2005255 内部线荷载标记 OST_InternalLineLoadTags -2005254 内部点荷载标记 OST_InternalPointLoadTags -2005253 面荷载标记 OST_AreaLoadTags -2005252 线荷载标记 OST_LineLoadTags -2005251 点荷载标记 OST_PointLoadTags -2005250 地震荷载 OST_LoadCasesSeismic -2005218 温度荷载 OST_LoadCasesTemperature -2005217 偶然荷载 OST_LoadCasesAccidental -2005216 屋顶活荷载 OST_LoadCasesRoofLive -2005215 雪荷载 OST_LoadCasesSnow -2005214 风荷载 OST_LoadCasesWind -2005213 活荷载 OST_LoadCasesLive -2005212 恒荷载 OST_LoadCasesDead -2005211 结构荷载工况 OST_LoadCases -2005210 内部面荷载 OST_InternalAreaLoads -2005207 内部线荷载 OST_InternalLineLoads -2005206 内部点荷载 OST_InternalPointLoads -2005205 结构内部荷载 OST_InternalLoads -2005204 面荷载 OST_AreaLoads -2005203 线荷载 OST_LineLoads -2005202 点荷载 OST_PointLoads -2005201 结构荷载 OST_Loads -2005200 结构梁系统标记 OST_BeamSystemTags -2005130 基础跨方向符号 OST_FootingSpanDirectionSymbol -2005111 跨方向符号 OST_SpanDirectionSymbol -2005110 高程点符号 OST_SpotElevSymbols -2005100 结构桁架标记 OST_TrussTags -2005030 注释记号标记 OST_KeynoteTags -2005029 详图项目标记 OST_DetailComponentTags -2005028 材质标记 OST_MaterialTags -2005027 楼板标记 OST_FloorTags -2005026 幕墙系统标记 OST_CurtaSystemTags -2005025 楼梯标记 OST_StairsTags -2005023 多类别标记 OST_MultiCategoryTags -2005022 植物标记 OST_PlantingTags -2005021 面积标记 OST_AreaTags -2005020 结构基础标记 OST_StructuralFoundationTags -2005019 结构柱标记 OST_StructuralColumnTags -2005018 停车场标记 OST_ParkingTags -2005017 场地标记 OST_SiteTags -2005016 结构框架标记 OST_StructuralFramingTags -2005015 专用设备标记 OST_SpecialityEquipmentTags -2005014 常规模型标记 OST_GenericModelTags -2005013 幕墙嵌板标记 OST_CurtainWallPanelTags -2005012 墙标记 OST_WallTags -2005011 卫浴装置标记 OST_PlumbingFixtureTags -2005010 机电设备标记 OST_MechanicalEquipmentTags -2005009 照明设备标记 OST_LightingFixtureTags -2005008 家具系统标记 OST_FurnitureSystemTags -2005007 家具标记 OST_FurnitureTags -2005006 电气装置标记 OST_ElectricalFixtureTags -2005004 电气设备标记 OST_ElectricalEquipmentTags -2005003 天花板标记 OST_CeilingTags -2005002 橱柜标记 OST_CaseworkTags -2005001 颜色填充 OST_MEPSpaceColorFill -2003605 参照 OST_MEPSpaceReferenceVisibility -2003602 内墙 OST_MEPSpaceInteriorFillVisibility -2003601 空间 OST_MEPSpaces -2003600 体量着色 OST_MassShade -2003418 体量洞口 OST_MassOpening -2003417 体量天窗 OST_MassSkylights -2003416 体量玻璃 OST_MassGlazing -2003415 体量屋顶 OST_MassRoof -2003414 体量外墙 OST_MassExteriorWall -2003413 体量内墙 OST_MassInteriorWall -2003412 体量分区 OST_MassZone -2003411 体量楼层标记 OST_MassAreaFaceTags -2003410 体量标记 OST_MassTags -2003405 形式 OST_MassForm -2003404 体量楼层 OST_MassFloor -2003403 体量 OST_Mass -2003400 图案填充 OST_DividedSurface_PatternFill -2003327 填充图案线 OST_DividedSurface_PatternLines -2003326 网格线 OST_DividedSurface_Gridlines -2003325 节点 OST_DividedSurface_Nodes -2003324 向下箭头 OST_RampsDownArrow -2003308 向上箭头 OST_RampsUpArrow -2003307 文字(向下) OST_RampsDownText -2003306 文字(向上) OST_RampsUpText -2003305 超出截面线的梯边梁 OST_RampsStringerAboveCut -2003304 梯边梁 OST_RampsStringer -2003303 坡道超出截面线 OST_RampsAboveCut -2003302 面积 OST_Areas -2003200 项目信息 OST_ProjectInformation -2003101 图纸 OST_Sheets -2003100 详图项目 OST_DetailComponents -2002000 屋檐底板 OST_RoofSoffit -2001393 楼板边缘 OST_EdgeSlab -2001392 檐沟 OST_Gutter -2001391 封檐板 OST_Fascia -2001390 环境 OST_Entourage -2001370 植物 OST_Planting -2001360 隐藏线 OST_StructuralStiffenerHiddenLines -2001358 定位线 OST_StructuralColumnLocationLine -2001357 定位线 OST_StructuralFramingLocationLine -2001356 结构加强板标记 OST_StructuralStiffenerTags -2001355 结构加强板 OST_StructuralStiffener -2001354 RVT 链接 OST_RvtLinks -2001352 专用设备 OST_SpecialityEquipment -2001350 刚性链接 OST_ColumnAnalyticalRigidLinks -2001344 次等高线 OST_SecondaryTopographyContours -2001343 主等高线 OST_TopographyContours -2001342 三角形边缘 OST_TopographySurface -2001341 地形 OST_Topography -2001340 地形链接 OST_TopographyLink -2001339 结构桁架 OST_StructuralTruss -2001336 棍状符号 OST_StructuralColumnStickSymbols -2001335 隐藏线 OST_HiddenStructuralColumnLines -2001334 刚性链接 OST_AnalyticalRigidLinks -2001333 结构柱 OST_StructuralColumns -2001330 隐藏线 OST_HiddenStructuralFramingLines -2001329 结构梁系统 OST_StructuralFramingSystem -2001327 结构框架 OST_StructuralFraming -2001320 隐藏线 OST_HiddenStructuralFoundationLines -2001302 结构基础 OST_StructuralFoundation -2001300 测量点 OST_SharedBasePoint -2001272 项目基点 OST_ProjectBasePoint -2001271 建筑红线线段标记 OST_SitePropertyLineSegmentTags -2001269 建筑红线线段 OST_SitePropertyLineSegment -2001268 属性标记 OST_SitePropertyTags -2001267 边界点 OST_SitePointBoundary -2001266 建筑红线 OST_SiteProperty -2001265 建筑地坪 OST_BuildingPad -2001263 内部点 OST_SitePoint -2001262 场地 OST_Site -2001260 道路 OST_Roads -2001220 停车场 OST_Parking -2001180 卫浴装置 OST_PlumbingFixtures -2001160 机械设备 OST_MechanicalEquipment -2001140 光源 OST_LightingFixtureSource -2001121 照明设备 OST_LightingFixtures -2001120 家具系统 OST_FurnitureSystems -2001100 电气装置 OST_ElectricalFixtures -2001060 电气设备 OST_ElectricalEquipment -2001040 橱柜 OST_Casework -2001000 竖井洞口 OST_ShaftOpening -2000996 水力分离符号 OST_PipeHydronicSeparationSymbols -2000988 机械设备集边界线 OST_MechanicalEquipmentSetBoundaryLines -2000987 机械设备集标记 OST_MechanicalEquipmentSetTags -2000986 机械设备集 OST_MechanicalEquipmentSet -2000985 连接线符号 OST_AnalyticalPipeConnectionLineSymbol -2000984 分析管道连接 OST_AnalyticalPipeConnections -2000983 局部坐标系 OST_FndSlabLocalCoordSys -2000976 局部坐标系 OST_FloorLocalCoordSys -2000975 局部坐标系 OST_WallLocalCoordSys -2000974 局部坐标系 OST_BraceLocalCoordSys -2000973 局部坐标系 OST_ColumnLocalCoordSys -2000972 局部坐标系 OST_BeamLocalCoordSys -2000971 多钢筋注释 OST_MultiReferenceAnnotations -2000970 分析节点标记 OST_NodeAnalyticalTags -2000956 分析链接标记 OST_LinkAnalyticalTags -2000955 支撑 OST_StairsSupports -2000952 <高于> 扶手 OST_RailingHandRailAboveCut -2000951 <高于> 顶部扶栏 OST_RailingTopRailAboveCut -2000950 终端 OST_RailingTermination -2000949 支座 OST_RailingSupport -2000948 扶手 OST_RailingHandRail -2000947 顶部扶栏 OST_RailingTopRail -2000946 楼梯踏板/踢面数 OST_StairsTriserNumbers -2000944 楼梯支撑标记 OST_StairsSupportTags -2000942 楼梯平台标记 OST_StairsLandingTags -2000941 楼梯梯段标记 OST_StairsRunTags -2000940 <高于> 向上箭头 OST_StairsPathsAboveCut -2000939 楼梯路径 OST_StairsPaths -2000938 <高于> 踢面线 OST_StairsRiserLinesAboveCut -2000937 踢面线 OST_StairsRiserLines -2000936 <高于> 轮廓 OST_StairsOutlinesAboveCut -2000935 轮廓 OST_StairsOutlines -2000934 <高于> 楼梯前缘线 OST_StairsNosingLinesAboveCut -2000933 楼梯前缘线 OST_StairsNosingLines -2000932 <高于> 剪切标记 OST_StairsCutMarksAboveCut -2000931 剪切标记 OST_StairsCutMarks -2000930 踢面/踏板 OST_StairsTrisers -2000921 平台 OST_StairsLandings -2000920 梯段 OST_StairsRuns -2000919 线 OST_AdaptivePoints_Lines -2000903 平面 OST_AdaptivePoints_Planes -2000902 点 OST_AdaptivePoints_Points -2000901 自适应点 OST_AdaptivePoints -2000900 <空间分隔> OST_MEPSpaceSeparationLines -2000831 线 OST_ReferencePoints_Lines -2000713 平面 OST_ReferencePoints_Planes -2000712 点 OST_ReferencePoints_Points -2000711 参照点 OST_ReferencePoints -2000710 材质 OST_Materials -2000700 截面填充图案 OST_CeilingsCutPattern -2000617 公共边 OST_CeilingsDefault -2000616 面层 2 [5] OST_CeilingsFinish2 -2000615 面层 1 [4] OST_CeilingsFinish1 -2000614 衬底 [2] OST_CeilingsSubstrate -2000613 保温层/空气层 [3] OST_CeilingsInsulation -2000612 结构 [1] OST_CeilingsStructure -2000611 涂膜层 OST_CeilingsMembrane -2000610 内部边缘 OST_FloorsInteriorEdges -2000609 截面填充图案 OST_FloorsCutPattern -2000608 隐藏线 OST_HiddenFloorLines -2000607 公共边 OST_FloorsDefault -2000606 面层 2 [5] OST_FloorsFinish2 -2000605 面层 1 [4] OST_FloorsFinish1 -2000604 衬底 [2] OST_FloorsSubstrate -2000603 保温层/空气层 [3] OST_FloorsInsulation -2000602 结构 [1] OST_FloorsStructure -2000601 涂膜层 OST_FloorsMembrane -2000600 内部边缘 OST_RoofsInteriorEdges -2000598 截面填充图案 OST_RoofsCutPattern -2000597 公共边 OST_RoofsDefault -2000596 面层 2 [5] OST_RoofsFinish2 -2000595 面层 1 [4] OST_RoofsFinish1 -2000594 衬底 [2] OST_RoofsSubstrate -2000593 保温层/空气层 [3] OST_RoofsInsulation -2000592 结构 [1] OST_RoofsStructure -2000591 涂膜层 OST_RoofsMembrane -2000590 截面填充图案 OST_WallsCutPattern -2000588 隐藏线 OST_HiddenWallLines -2000587 公共边 OST_WallsDefault -2000586 面层 2 [5] OST_WallsFinish2 -2000585 面层 1 [4] OST_WallsFinish1 -2000584 衬底 [2] OST_WallsSubstrate -2000583 保温层/空气层 [3] OST_WallsInsulation -2000582 结构 [1] OST_WallsStructure -2000581 涂膜层 OST_WallsMembrane -2000580 明细表 OST_Schedules -2000573 明细表图形 OST_ScheduleGraphics -2000570 光栅图像 OST_RasterImages -2000560 颜色填充 OST_RoomColorFill -2000551 颜色填充图例 OST_ColorFillLegends -2000550 注释裁剪边界 OST_AnnotationCropSpecial -2000549 裁剪边界 OST_CropBoundarySpecial -2000548 注释裁剪边界 OST_AnnotationCrop -2000547 详图索引引线 OST_CalloutLeaderLine -2000544 表面填充图案 OST_CeilingsSurfacePattern -2000543 表面填充图案 OST_RoofsSurfacePattern -2000542 表面填充图案 OST_FloorsSurfacePattern -2000541 表面填充图案 OST_WallsSurfacePattern -2000540 详图索引边界 OST_CalloutBoundary -2000539 详图索引标头 OST_CalloutHeads -2000538 详图索引 OST_Callouts -2000537 裁剪边界 OST_CropBoundary -2000536 立面 OST_Elev -2000535 参照平面 OST_CLines -2000530 视图标题 OST_ViewportLabel -2000515 视口 OST_Viewports -2000510 相机 OST_Camera_Lines -2000501 空间标记 OST_MEPSpaceTags -2000485 房间标记 OST_RoomTags -2000480 门标记 OST_DoorTags -2000460 窗标记 OST_WindowTags -2000450 宽线 OST_SectionHeadWideLines -2000404 中粗线 OST_SectionHeadMediumLines -2000403 细线 OST_SectionHeadThinLines -2000401 剖面标头 OST_SectionHeads -2000400 等高线标签 OST_ContourLabels -2000350 幕墙系统 OST_CurtaSystem -2000340 幕墙系统网格 OST_CurtainGridsCurtaSystem -2000323 幕墙网格 OST_CurtainGridsWall -2000321 幕墙屋顶网格 OST_CurtainGridsRoof -2000320 分析显示样式 OST_AnalysisDisplayStyle -2000304 分析结果 OST_AnalysisResults -2000303 渲染区域 OST_RenderRegions -2000302 剖面框 OST_SectionBox -2000301 文字注释 OST_TextNotes -2000300 <中心线> OST_CenterLines -2000288 <超出> OST_LinesBeyond -2000287 <隐藏> OST_HiddenLines -2000286 <已拆除> OST_DemolishedLines -2000285 <架空线> OST_OverheadLines -2000284 宽线 OST_TitleBlockWideLines -2000283 中粗线 OST_TitleBlockMediumLines -2000282 细线 OST_TitleBlockThinLines -2000281 图框 OST_TitleBlocks -2000280 视图 OST_Views -2000279 隐藏线 OST_PartHiddenLines -2000271 零件标记 OST_PartTags -2000270 组成部分 OST_Parts -2000269 部件标记 OST_AssemblyTags -2000268 部件 OST_Assemblies -2000267 屋顶标记 OST_RoofTags -2000266 高程点坡度 OST_SpotSlopes -2000265 高程点坐标 OST_SpotCoordinates -2000264 高程点 OST_SpotElevations -2000263 自动绘制尺寸标注 OST_WeakDims -2000261 尺寸标注 OST_Dimensions -2000260 标高 OST_Levels -2000240 位移路径 OST_DisplacementPath -2000223 多段轴网 OST_GridChains -2000221 轴网 OST_Grids -2000220 断开剖面线 OST_BrokenSectionLine -2000202 剖面线 OST_SectionLine -2000201 剖面 OST_Sections -2000200 视图参照 OST_ReferenceViewer -2000198 视图参照 OST_ReferenceViewerSymbol -2000197 在族中导入 OST_ImportObjectStyles -2000196 遮罩区域 OST_MaskingRegion -2000194 拼接线 OST_Matchline -2000193 平面区域 OST_PlanRegion -2000191 填充区域 OST_FilledRegion -2000190 墙饰条 OST_Cornices -2000181 坡道 OST_Ramps -2000180 幕墙网格 OST_CurtainGrids -2000173 幕墙竖梃 OST_CurtainWallMullions -2000171 幕墙嵌板 OST_CurtainWallPanels -2000170 颜色填充 OST_AreaColorFill -2000165 参照 OST_AreaReferenceVisibility -2000164 内部填充 OST_AreaInteriorFillVisibility -2000163 参照 OST_RoomReferenceVisibility -2000162 内部填充 OST_RoomInteriorFillVisibility -2000161 房间 OST_Rooms -2000160 常规模型 OST_GenericModel -2000151 常规注释 OST_GenericAnnotation -2000150 栏杆扶手标记 OST_StairsRailingTags -2000133 <高于> 栏杆扶手截面线 OST_StairsRailingAboveCut -2000132 向下箭头 OST_StairsDownArrows -2000131 向上箭头 OST_StairsUpArrows -2000130 文字(向下) OST_StairsDownText -2000129 扶栏 OST_StairsRailingRail -2000128 栏杆 OST_StairsRailingBaluster -2000127 栏杆扶手 OST_StairsRailing -2000126 文字(向上) OST_StairsUpText -2000125 <高于> 支撑 OST_StairsSupportsAboveCut -2000124 支撑 OST_StairsStringerCarriage -2000123 楼梯 OST_Stairs -2000120 导向轴网 OST_GuideGrid -2000107 柱 OST_Columns -2000100 模型组 OST_IOSModelGroups -2000095 参照线 OST_ReferenceLines -2000083 家具 OST_Furniture -2000080 <面积边界> OST_AreaSchemeLines -2000079 线 OST_GenericLines -2000078 隔热层线 OST_InsulationLines -2000077 <房间分隔> OST_RoomSeparationLines -2000066 旋转轴 OST_AxisOfRotation -2000065 线 OST_Lines -2000051 <草图> OST_SketchLines -2000045 宽线 OST_CurvesWideLines -2000044 中粗线 OST_CurvesMediumLines -2000043 细线 OST_CurvesThinLines -2000042 天花板 OST_Ceilings -2000038 屋顶 OST_Roofs -2000035 楼板 OST_Floors -2000032 玻璃 OST_DoorsGlassProjection -2000031 框架/竖梃 OST_DoorsFrameMullionProjection -2000029 洞口 OST_DoorsOpeningProjection -2000027 嵌板 OST_DoorsPanelProjection -2000025 门 OST_Doors -2000023 洞口 OST_WindowsOpeningProjection -2000022 窗台/盖板 OST_WindowsSillHeadProjection -2000020 框架/竖梃 OST_WindowsFrameMullionProjection -2000018 玻璃 OST_WindowsGlassProjection -2000016 窗 OST_Windows -2000014 墙 OST_Walls -2000011
]]>
+
+
+ <p>Revit二次开发中经常用到<strong>BuildInCategory</strong>过滤元素,以下是通过遍历该枚举获取的数据,其中部分类别的名称未能获取到,本文未显示<strong>Unknown</strong>部分,完整版本见 <a href="/post/revit-category-all/">BuildInCategory枚举 - 完整</a>。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ BuildInCategory枚举 - 完整
+
+ https://awaw.cc/post/revit-category-all/
+ 2020-12-01T10:20:00.000Z
+ 2023-07-04T05:03:52.663Z
+
+ Revit二次开发中经常用到BuildInCategory 过滤元素,以下是通过遍历该枚举获取的数据,其中部分类别的名称未能获取到,显示为Unknown ,请悉知。中文名称 名称 值 Unknown OST_StackedWalls_Obsolete_IdInWrongRange -20034100 Unknown OST_MassTags_Obsolete_IdInWrongRange -20034005 Unknown OST_MassSurface_Obsolete_IdInWrongRange -20034004 Unknown OST_MassFloor_Obsolete_IdInWrongRange -20034003 Unknown OST_Mass_Obsolete_IdInWrongRange -20034000 Unknown OST_WallRefPlanes_Obsolete_IdInWrongRange -20000896 Unknown OST_StickSymbols_Obsolete_IdInWrongRange -20000828 Unknown OST_RemovedGridSeg_Obsolete_IdInWrongRange -20000827 Unknown OST_PointClouds -2010001 Unknown OST_AssemblyOrigin_Lines -2009661 Unknown OST_AssemblyOrigin_Planes -2009660 Unknown OST_AssemblyOrigin_Points -2009659 Unknown OST_AssemblyOrigin -2009658 分析链接 OST_LinksAnalytical -2009657 分析楼板基础标记 OST_FoundationSlabAnalyticalTags -2009656 分析条形基础标记 OST_WallFoundationAnalyticalTags -2009655 分析独立基础标记 OST_IsolatedFoundationAnalyticalTags -2009654 分析墙标记 OST_WallAnalyticalTags -2009653 分析楼层标记 OST_FloorAnalyticalTags -2009652 分析柱标记 OST_ColumnAnalyticalTags -2009651 分析支撑标记 OST_BraceAnalyticalTags -2009650 分析梁标记 OST_BeamAnalyticalTags -2009649 Unknown OST_AnalyticalNodes_Lines -2009648 Unknown OST_AnalyticalNodes_Planes -2009647 Unknown OST_AnalyticalNodes_Points -2009646 分析节点 OST_AnalyticalNodes -2009645 Unknown OST_RigidLinksAnalytical -2009644 分析基础底板 OST_FoundationSlabAnalytical -2009643 分析条形基础 OST_WallFoundationAnalytical -2009642 分析独立基础 OST_IsolatedFoundationAnalytical -2009641 分析墙 OST_WallAnalytical -2009640 分析楼层 OST_FloorAnalytical -2009639 顶部线段 OST_ColumnEndSegment -2009638 基准线段 OST_ColumnStartSegment -2009637 分析柱 OST_ColumnAnalytical -2009636 末端线段 OST_BraceEndSegment -2009635 起点线段 OST_BraceStartSegment -2009634 分析支撑 OST_BraceAnalytical -2009633 末端线段 OST_BeamEndSegment -2009632 起点线段 OST_BeamStartSegment -2009631 分析梁 OST_BeamAnalytical -2009630 Unknown OST_CompassSecondaryMonth -2009624 Unknown OST_CompassPrimaryMonth -2009623 Unknown OST_CompassSectionFilled -2009622 Unknown OST_LightLine -2009621 Unknown OST_MultiSurface -2009620 Unknown OST_SunSurface -2009619 Unknown OST_Analemma -2009618 Unknown OST_SunsetText -2009617 Unknown OST_CompassSection -2009616 Unknown OST_CompassOuter -2009615 Unknown OST_SunriseText -2009614 Unknown OST_CompassInner -2009613 Unknown OST_SunPath2 -2009612 Unknown OST_SunPath1 -2009611 Unknown OST_Sun -2009610 Unknown OST_SunStudy -2009609 棍状符号 OST_StructuralTrussStickSymbols -2009608 Unknown OST_StructuralTrussHiddenLines -2009607 Unknown OST_TrussChord -2009606 Unknown OST_TrussWeb -2009605 Unknown OST_TrussBottomChordCurve -2009604 Unknown OST_TrussTopChordCurve -2009603 Unknown OST_TrussVertWebCurve -2009602 Unknown OST_TrussDiagWebCurve -2009601 Unknown OST_Truss -2009600 Unknown OST_RailingSystemTransitionHiddenLines_Deprecated -2009549 Unknown OST_RailingSystemTerminationHiddenLines_Deprecated -20095 Unknown OST_RailingSystemRailHiddenLines_Deprecated -2009547 Unknown OST_RailingSystemTopRailHiddenLines_Deprecated -2009546 Unknown OST_RailingSystemHandRailBracketHiddenLines_Deprecated -2 Unknown OST_RailingSystemHandRailHiddenLines_Deprecated -2009544 Unknown OST_RailingSystemPanelBracketHiddenLines_Deprecated -2009 Unknown OST_RailingSystemPanelHiddenLines_Deprecated -2009542 Unknown OST_RailingSystemBalusterHiddenLines_Deprecated -2009541 Unknown OST_RailingSystemPostHiddenLines_Deprecated -2009540 Unknown OST_RailingSystemSegmentHiddenLines_Deprecated -2009539 Unknown OST_RailingSystemHiddenLines_Deprecated -2009538 Unknown OST_StairStringer2012HiddenLines_Deprecated -2009537 Unknown OST_StairTread2012HiddenLines_Deprecated -2009536 Unknown OST_StairLanding2012HiddenLines_Deprecated -2009535 Unknown OST_StairRun2012HiddenLines_Deprecated -2009534 Unknown OST_Stairs2012HiddenLines_Deprecated -2009533 隐藏线 OST_MassHiddenLines -2009532 隐藏线 OST_CurtaSystemHiddenLines -2009531 Unknown OST_OBSOLETE_ElemArrayHiddenLines -2009530 隐藏线 OST_EntourageHiddenLines -2009529 隐藏线 OST_PlantingHiddenLines -2009528 隐藏线 OST_SpecialityEquipmentHiddenLines -2009527 隐藏线 OST_TopographyHiddenLines -2009526 Unknown OST_StructuralFramingSystemHiddenLines_Obsolete -2009525 隐藏线 OST_SiteHiddenLines -2009524 隐藏线 OST_RoadsHiddenLines -2009523 隐藏线 OST_ParkingHiddenLines -2009522 隐藏线 OST_PlumbingFixturesHiddenLines -2009521 隐藏线 OST_MechanicalEquipmentHiddenLines -2009520 隐藏线 OST_LightingFixturesHiddenLines -2009519 隐藏线 OST_FurnitureSystemsHiddenLines -2009518 隐藏线 OST_ElectricalFixturesHiddenLines -2009517 隐藏线 OST_ElectricalEquipmentHiddenLines -2009516 隐藏线 OST_CaseworkHiddenLines -2009515 隐藏线 OST_DetailComponentsHiddenLines -2009514 隐藏线 OST_ShaftOpeningHiddenLines -2009513 隐藏线 OST_GenericModelHiddenLines -2009512 隐藏线 OST_CurtainWallMullionsHiddenLines -2009511 隐藏线 OST_CurtainWallPanelsHiddenLines -2009510 隐藏线 OST_RampsHiddenLines -2009509 隐藏线 OST_StairsRailingHiddenLines -2009508 隐藏线 OST_StairsHiddenLines -2009507 隐藏线 OST_ColumnsHiddenLines -2009506 隐藏线 OST_FurnitureHiddenLines -2009505 隐藏线 OST_LinesHiddenLines -2009504 隐藏线 OST_CeilingsHiddenLines -2009503 隐藏线 OST_RoofsHiddenLines -2009502 隐藏线 OST_DoorsHiddenLines -2009501 隐藏线 OST_WindowsHiddenLines -2009500 轮廓标记 OST_StructConnectionProfilesTags -2009064 孔标记 OST_StructConnectionHoleTags -2009063 隐藏线 OST_CouplerHiddenLines -2009062 结构钢筋接头标记 OST_CouplerTags -2009061 结构钢筋接头 OST_Coupler -2009060 焊接标记 OST_StructConnectionWeldTags -2009059 剪力钉标记 OST_StructConnectionShearStudTags -2009058 锚固件标记 OST_StructConnectionAnchorTags -2009057 螺栓标记 OST_StructConnectionBoltTags -2009056 板标记 OST_StructConnectionPlateTags -2009055 隐藏线 OST_RebarHiddenLines -2009050 Unknown OST_StructSubConnections -2009049 修改器 OST_StructConnectionModifiers -2009047 焊缝 OST_StructConnectionWelds -2009046 孔 OST_StructConnectionHoles -2009045 剪力钉 OST_StructConnectionShearStuds -2009044 Unknown OST_StructConnectionNobleWarning -2009043 其他 OST_StructConnectionOthers -2009042 螺栓 OST_StructConnectionBolts -2009041 结构连接标记 OST_StructConnectionTags -2009040 锚固件 OST_StructConnectionAnchors -2009039 平板 OST_StructConnectionPlates -2009038 轮廓 OST_StructConnectionProfiles -2009037 参照 OST_StructConnectionReference -2009036 Unknown OST_StructConnectionFailed -2009035 Unknown OST_StructConnectionStale -2009034 符号 OST_StructConnectionSymbol -2009033 隐藏线 OST_StructConnectionHiddenLines -2009032 Unknown OST_StructWeldLines -2009031 结构连接 OST_StructConnections -2009030 边界 OST_FabricAreaBoundary -2009029 结构钢筋网符号 OST_FabricReinSpanSymbol -2009028 钢筋网 OST_FabricReinforcementWire -2009027 边界 OST_FabricReinforcementBoundary -2009026 钢筋集切换 OST_RebarSetToggle -2009025 Unknown OST_FabricAreaTags -2009023 结构钢筋网标记 OST_FabricReinforcementTags -2009022 结构区域钢筋标记 OST_AreaReinTags -2009021 结构钢筋标记 OST_RebarTags -2009020 <钢筋网片> OST_FabricAreaSketchSheetsLines -2009019 <钢筋网外围> OST_FabricAreaSketchEnvelopeLines -2009018 结构钢筋网区域 OST_FabricAreas -2009017 结构钢筋网 OST_FabricReinforcement -2009016 钢筋保护层参照 OST_RebarCover -2009015 Unknown OST_CoverType -2009014 钢筋形状 OST_RebarShape -2009013 边界 OST_PathReinBoundary -2009012 结构路径钢筋标记 OST_PathReinTags -2009011 结构路径钢筋符号 OST_PathReinSpanSymbol -2009010 结构路径钢筋 OST_PathRein -2009009 Unknown OST_Cage -2009008 Unknown OST_AreaReinXVisibility -2009007 边界 OST_AreaReinBoundary -2009006 结构区域钢筋符号 OST_AreaReinSpanSymbol -2009005 Unknown OST_AreaReinSketchOverride -2009004 结构区域钢筋 OST_AreaRein -2009003 Unknown OST_RebarLines -2009002 Unknown OST_RebarSketchLines -2009001 结构钢筋 OST_Rebar -2009000 隔热层 OST_FabricationPipeworkInsulation -2008221 内衬 OST_FabricationDuctworkLining -2008220 降 OST_FabricationContainmentDrop -2008219 升 OST_FabricationContainmentRise -2008218 降 OST_FabricationPipeworkDrop -2008217 升 OST_FabricationPipeworkRise -2008216 符号 OST_FabricationContainmentSymbology -2008215 中心线 OST_FabricationContainmentCenterLine -2008214 MEP 预制保护层标记 OST_FabricationContainmentTags -2008213 MEP 预制保护层 OST_FabricationContainment -2008212 符号 OST_FabricationPipeworkSymbology -2008211 中心线 OST_FabricationPipeworkCenterLine -2008210 MEP 预制管道标记 OST_FabricationPipeworkTags -2008209 MEP 预制管道 OST_FabricationPipework -2008208 符号 OST_FabricationDuctworkSymbology -2008207 降 OST_FabricationDuctworkDrop -2008206 升 OST_FabricationDuctworkRise -2008205 MEP 预制支架标记 OST_FabricationHangerTags -2008204 MEP 预制支架 OST_FabricationHangers -2008203 Unknown OST_OBSOLETE_FabricationPartsTmpGraphicDropDrag -200820 Unknown OST_FabricationPartsTmpGraphicDrag -2008201 Unknown OST_OBSOLETE_FabricationPartsTmpGraphicDrop -2008200 Unknown OST_FabricationPartsTmpGraphicEnd -2008199 隔热层 OST_FabricationDuctworkInsulation -2008198 Unknown OST_LayoutNodes -2008197 中心线 OST_FabricationDuctworkCenterLine -2008196 Unknown OST_FabricationServiceElements -2008195 MEP 预制管网标记 OST_FabricationDuctworkTags -2008194 MEP 预制管网 OST_FabricationDuctwork -2008193 Unknown OST_LayoutPathBase_Pipings -2008192 Unknown OST_NumberingSchemas -2008191 Unknown OST_DivisionRules -2008190 着色 OST_gbXML_Shade -2008187 分析表面 OST_AnalyticSurfaces -2008186 分析空间 OST_AnalyticSpaces -2008185 空气洞口 OST_gbXML_OpeningAir -2008184 非推拉门 OST_gbXML_NonSlidingDoor -2008183 推拉门 OST_gbXML_SlidingDoor -2008182 可操作天窗 OST_gbXML_OperableSkylight -2008181 固定天窗 OST_gbXML_FixedSkylight -2008180 可操作窗口 OST_gbXML_OperableWindow -2008179 固定窗 OST_gbXML_FixedWindow -2008178 地下天花板 OST_gbXML_UndergroundCeiling -2008177 地下板 OST_gbXML_UndergroundSlab -2008176 地下墙 OST_gbXML_UndergroundWall -2008175 空气曲面 OST_gbXML_SurfaceAir -2008174 天花板 OST_gbXML_Ceiling -2008173 内部楼板 OST_gbXML_InteriorFloor -2008172 内墙 OST_gbXML_InteriorWall -2008171 平整表面上的板 OST_gbXML_SlabOnGrade -2008170 活动楼板 OST_gbXML_RaisedFloor -2008169 屋顶 OST_gbXML_Roof -2008168 外墙 OST_gbXML_ExteriorWall -2008167 Unknown OST_DivisionProfile -2008165 Unknown OST_SplitterProfile -2008164 管段 OST_PipeSegments -2008163 Unknown OST_GraphicalWarning_OpenConnector -2008162 管道占位符 OST_PlaceHolderPipes -2008161 风管占位符 OST_PlaceHolderDucts -2008160 参照线 OST_PipingSystem_Reference_Visibility -2008159 Unknown OST_PipingSystem_Reference -2008158 参照线 OST_DuctSystem_Reference_Visibility -2008157 Unknown OST_DuctSystem_Reference -2008156 管道隔热层标记 OST_PipeInsulationsTags -2008155 风管内衬标记 OST_DuctLiningsTags -2008154 风管隔热层标记 OST_DuctInsulationsTags -2008153 电气备件/空间电路 OST_ElectricalInternalCircuits -2008152 配电盘明细表图形 OST_PanelScheduleGraphics -2008151 电缆桥架管路 OST_CableTrayRun -2008150 线管管路 OST_ConduitRun -2008149 Unknown OST_ParamElemElectricalLoadClassification -2008148 Unknown OST_DataPanelScheduleTemplates -2008147 Unknown OST_SwitchboardScheduleTemplates -2008146 Unknown OST_BranchPanelScheduleTemplates -2008145 Unknown OST_ConduitStandards -2008144 Unknown OST_ElectricalLoadClassifications -2008143 Unknown OST_ElectricalDemandFactorDefinitions -2008142 中心线 OST_ConduitFittingCenterLine -2008141 中心线 OST_CableTrayFittingCenterLine -2008140 中心线 OST_ConduitCenterLine -2008139 降 OST_ConduitDrop -2008138 升 OST_ConduitRiseDrop -2008137 中心线 OST_CableTrayCenterLine -2008136 降 OST_CableTrayDrop -2008135 升 OST_CableTrayRiseDrop -2008134 线管标记 OST_ConduitTags -2008133 线管 OST_Conduit -2008132 电缆桥架标记 OST_CableTrayTags -2008131 电缆桥架 OST_CableTray -2008130 线管配件标记 OST_ConduitFittingTags -2008129 线管配件 OST_ConduitFitting -2008128 电缆桥架配件标记 OST_CableTrayFittingTags -2008127 电缆桥架配件 OST_CableTrayFitting -2008126 布管系统配置 OST_RoutingPreferences -2008125 风管内衬 OST_DuctLinings -2008124 风管隔热层 OST_DuctInsulations -2008123 管道隔热层 OST_PipeInsulations -2008122 Unknown OST_HVAC_Load_Schedules -2008121 Unknown OST_HVAC_Load_Building_Types -2008120 Unknown OST_HVAC_Load_Space_Types -2008119 参照线 OST_HVAC_Zones_Reference_Visibility -2008118 内部填充 OST_HVAC_Zones_InteriorFill_Visibility -2008117 颜色填充 OST_HVAC_Zones_ColorFill -2008116 分区标记 OST_ZoneTags -2008115 Unknown OST_LayoutPath_Bases -2008114 Unknown OST_WireTemperatureRatings -2008113 Unknown OST_WireInsulations -2008112 Unknown OST_WireMaterials -2008111 Unknown OST_HVAC_Zones_Reference -2008110 Unknown OST_HVAC_Zones_InteriorFill -2008109 边界 OST_HVAC_Zones_Boundary -2008108 HVAC 区 OST_HVAC_Zones -2008107 Unknown OST_Fluids -2008106 Unknown OST_PipeSchedules -2008105 Unknown OST_PipeMaterials -2008104 Unknown OST_PipeConnections -2008103 Unknown OST_EAConstructions -2008102 开关系统 OST_SwitchSystem -2008101 喷头标记 OST_SprinklerTags -2008100 喷头 OST_Sprinklers -2008099 Unknown OST_RouteCurveBranch -2008098 Unknown OST_RouteCurveMain -2008097 Unknown OST_RouteCurve -2008096 洞口 OST_GbXML_Opening -2008095 地下 OST_GbXML_SType_Underground -2008094 着色 OST_GbXML_SType_Shade -2008093 外部 OST_GbXML_SType_Exterior -2008092 内部 OST_GbXML_SType_Interior -2008091 分析表面 OST_GbXMLFaces -2008090 回路方向 OST_WireHomeRunArrows -2008089 灯具标记 OST_LightingDeviceTags -2008088 灯具 OST_LightingDevices -2008087 火警设备标记 OST_FireAlarmDeviceTags -2008086 火警设备 OST_FireAlarmDevices -2008085 数据设备标记 OST_DataDeviceTags -2008084 数据设备 OST_DataDevices -2008083 通讯设备标记 OST_CommunicationDeviceTags -2008082 通讯设备 OST_CommunicationDevices -2008081 安全设备标记 OST_SecurityDeviceTags -2008080 安全设备 OST_SecurityDevices -2008079 护理呼叫设备标记 OST_NurseCallDeviceTags -2008078 护理呼叫设备 OST_NurseCallDevices -2008077 电话设备标记 OST_TelephoneDeviceTags -2008076 电话设备 OST_TelephoneDevices -2008075 导线记号 OST_WireTickMarks -2008074 Unknown OST_PipeFittingInsulation -2008073 中心线 OST_PipeFittingCenterLine -2008072 Unknown OST_FlexPipeCurvesInsulation -2008071 Unknown OST_PipeCurvesInsulation -2008070 降 OST_PipeCurvesDrop -2008069 Unknown OST_DuctFittingLining -2008068 Unknown OST_DuctFittingInsulation -2008067 中心线 OST_DuctFittingCenterLine -2008066 Unknown OST_FlexDuctCurvesInsulation -2008065 Unknown OST_DuctCurvesLining -2008064 Unknown OST_DuctCurvesInsulation -2008063 降 OST_DuctCurvesDrop -2008062 风管管件标记 OST_DuctFittingTags -2008061 管件标记 OST_PipeFittingTags -2008060 管道颜色填充 OST_PipeColorFills -2008059 管道颜色填充图例 OST_PipeColorFillLegends -2008058 导线标记 OST_WireTags -2008057 管道附件标记 OST_PipeAccessoryTags -2008056 管道附件 OST_PipeAccessory -2008055 升 OST_PipeCurvesRiseDrop -2008054 填充图案 OST_FlexPipeCurvesPattern -2008053 Unknown OST_FlexPipeCurvesContour -2008052 中心线 OST_FlexPipeCurvesCenterLine -2008051 软管 OST_FlexPipeCurves -2008050 管件 OST_PipeFitting -2008049 软管标记 OST_FlexPipeTags -2008048 管道标记 OST_PipeTags -2008047 Unknown OST_PipeCurvesContour -2008046 中心线 OST_PipeCurvesCenterLine -2008045 管道 OST_PipeCurves -2008044 管道系统 OST_PipingSystem -2008043 Unknown OST_ElectricalDemandFactor -2008042 Unknown OST_ElecDistributionSys -2008041 Unknown OST_ElectricalVoltage -2008040 导线 OST_Wire -2008039 Unknown OST_ElectricalCircuitTags -2008038 电路 OST_ElectricalCircuit -2008037 升 OST_DuctCurvesRiseDrop -2008036 填充图案 OST_FlexDuctCurvesPattern -2008023 Unknown OST_FlexDuctCurvesContour -2008022 中心线 OST_FlexDuctCurvesCenterLine -2008021 软风管 OST_FlexDuctCurves -2008020 风管附件标记 OST_DuctAccessoryTags -2008017 风管附件 OST_DuctAccessory -2008016 风管系统 OST_DuctSystem -2008015 风道末端标记 OST_DuctTerminalTags -2008014 风道末端 OST_DuctTerminal -2008013 风管管件 OST_DuctFitting -2008010 风管颜色填充 OST_DuctColorFills -2008005 软风管标记 OST_FlexDuctTags -2008004 风管标记 OST_DuctTags -2008003 Unknown OST_DuctCurvesContour -2008002 中心线 OST_DuctCurvesCenterLine -2008001 风管 OST_DuctCurves -2008000 风管颜色填充图例 OST_DuctColorFillLegends -2007004 Unknown OST_ConnectorElemZAxis -2007003 Unknown OST_ConnectorElemYAxis -2007002 Unknown OST_ConnectorElemXAxis -2007001 Unknown OST_ConnectorElem -2007000 Unknown OST_BridgeBearingTags -2006178 Unknown OST_BridgeGirderTags -2006177 Unknown OST_BridgeFoundationTags -2006176 Unknown OST_BridgeDeckTags -2006175 Unknown OST_BridgeArchTags -2006174 Unknown OST_BridgeCableTags -2006173 Unknown OST_BridgeTowerTags -2006172 Unknown OST_BridgePierTags -2006171 Unknown OST_BridgeAbutmentTags -2006170 Unknown OST_BridgeBearingHiddenLines -2006158 Unknown OST_BridgeGirderHiddenLines -2006157 Unknown OST_BridgeFoundationHiddenLines -2006156 Unknown OST_BridgeDeckHiddenLines -2006155 Unknown OST_BridgeArchHiddenLines -2006154 Unknown OST_BridgeCableHiddenLines -2006153 Unknown OST_BridgeTowerHiddenLines -2006152 Unknown OST_BridgePierHiddenLines -2006151 Unknown OST_BridgeAbutmentHiddenLines -2006150 桥梁支座 OST_BridgeBearings -2006138 桥梁大梁 OST_BridgeGirders -2006137 桥梁基础 OST_BridgeFoundations -2006136 桥面 OST_BridgeDecks -2006135 桥拱 OST_BridgeArches -2006134 桥梁缆索 OST_BridgeCables -2006133 桥塔 OST_BridgeTowers -2006132 桥墩 OST_BridgePiers -2006131 桥台 OST_BridgeAbutments -2006130 Unknown OST_DesignOptions -2006114 Unknown OST_DesignOptionSets -2006112 平面视图中的支撑符号 OST_StructuralBracePlanReps -2006110 连接符号 OST_StructConnectionSymbols -2006100 结构注释 OST_StructuralAnnotations -2006090 云线批注标记 OST_RevisionCloudTags -2006080 Unknown OST_Revisions -2006070 云线批注 OST_RevisionClouds -2006060 Unknown OST_EditCutProfile -2006050 立面标记 OST_ElevationMarks -2006045 轴网标头 OST_GridHeads -2006040 标高标头 OST_LevelHeads -2006020 Unknown OST_DecalType -2006002 Unknown OST_DecalElement -2006001 范围框 OST_VolumeOfInterest -2006000 边界条件 OST_BoundaryConditions -2005301 内部面荷载标记 OST_InternalAreaLoadTags -2005255 内部线荷载标记 OST_InternalLineLoadTags -2005254 内部点荷载标记 OST_InternalPointLoadTags -2005253 面荷载标记 OST_AreaLoadTags -2005252 线荷载标记 OST_LineLoadTags -2005251 点荷载标记 OST_PointLoadTags -2005250 地震荷载 OST_LoadCasesSeismic -2005218 温度荷载 OST_LoadCasesTemperature -2005217 偶然荷载 OST_LoadCasesAccidental -2005216 屋顶活荷载 OST_LoadCasesRoofLive -2005215 雪荷载 OST_LoadCasesSnow -2005214 风荷载 OST_LoadCasesWind -2005213 活荷载 OST_LoadCasesLive -2005212 恒荷载 OST_LoadCasesDead -2005211 结构荷载工况 OST_LoadCases -2005210 内部面荷载 OST_InternalAreaLoads -2005207 内部线荷载 OST_InternalLineLoads -2005206 内部点荷载 OST_InternalPointLoads -2005205 结构内部荷载 OST_InternalLoads -2005204 面荷载 OST_AreaLoads -2005203 线荷载 OST_LineLoads -2005202 点荷载 OST_PointLoads -2005201 结构荷载 OST_Loads -2005200 结构梁系统标记 OST_BeamSystemTags -2005130 基础跨方向符号 OST_FootingSpanDirectionSymbol -2005111 跨方向符号 OST_SpanDirectionSymbol -2005110 Unknown OST_SpotSlopesSymbols -2005102 Unknown OST_SpotCoordinateSymbols -2005101 高程点符号 OST_SpotElevSymbols -2005100 Unknown OST_StructuralConnectionHandlerTags_Deprecated -2005031 结构桁架标记 OST_TrussTags -2005030 注释记号标记 OST_KeynoteTags -2005029 详图项目标记 OST_DetailComponentTags -2005028 材质标记 OST_MaterialTags -2005027 楼板标记 OST_FloorTags -2005026 幕墙系统标记 OST_CurtaSystemTags -2005025 Unknown OST_HostFinTags -2005024 楼梯标记 OST_StairsTags -2005023 多类别标记 OST_MultiCategoryTags -2005022 植物标记 OST_PlantingTags -2005021 面积标记 OST_AreaTags -2005020 结构基础标记 OST_StructuralFoundationTags -2005019 结构柱标记 OST_StructuralColumnTags -2005018 停车场标记 OST_ParkingTags -2005017 场地标记 OST_SiteTags -2005016 结构框架标记 OST_StructuralFramingTags -2005015 专用设备标记 OST_SpecialityEquipmentTags -2005014 常规模型标记 OST_GenericModelTags -2005013 幕墙嵌板标记 OST_CurtainWallPanelTags -2005012 墙标记 OST_WallTags -2005011 卫浴装置标记 OST_PlumbingFixtureTags -2005010 机电设备标记 OST_MechanicalEquipmentTags -2005009 照明设备标记 OST_LightingFixtureTags -2005008 家具系统标记 OST_FurnitureSystemTags -2005007 家具标记 OST_FurnitureTags -2005006 电气装置标记 OST_ElectricalFixtureTags -2005004 电气设备标记 OST_ElectricalEquipmentTags -2005003 天花板标记 OST_CeilingTags -2005002 橱柜标记 OST_CaseworkTags -2005001 Unknown OST_Tags -2005000 颜色填充 OST_MEPSpaceColorFill -2003605 Unknown OST_MEPSpaceReference -2003604 Unknown OST_MEPSpaceInteriorFill -2003603 参照 OST_MEPSpaceReferenceVisibility -2003602 内墙 OST_MEPSpaceInteriorFillVisibility -2003601 空间 OST_MEPSpaces -2003600 Unknown OST_StackedWalls -2003500 Unknown OST_MassGlazingAll -2003423 Unknown OST_MassFloorsAll -2003422 Unknown OST_MassWallsAll -2003421 Unknown OST_MassExteriorWallUnderground -2003420 Unknown OST_MassSlab -2003419 体量着色 OST_MassShade -2003418 体量洞口 OST_MassOpening -2003417 体量天窗 OST_MassSkylights -2003416 体量玻璃 OST_MassGlazing -2003415 体量屋顶 OST_MassRoof -2003414 体量外墙 OST_MassExteriorWall -2003413 体量内墙 OST_MassInteriorWall -2003412 体量分区 OST_MassZone -2003411 体量楼层标记 OST_MassAreaFaceTags -2003410 Unknown OST_HostTemplate -2003409 Unknown OST_MassFaceSplitter -2003408 Unknown OST_MassCutter -2003407 Unknown OST_ZoningEnvelope -2003406 体量标记 OST_MassTags -2003405 形式 OST_MassForm -2003404 体量楼层 OST_MassFloor -2003403 体量 OST_Mass -2003400 Unknown OST_DividedSurface_DiscardedDivisionLines -2003333 Unknown OST_DividedSurfaceBelt -2003332 Unknown OST_TilePatterns -2003331 Unknown OST_AlwaysExcludedInAllViews -2003330 Unknown OST_DividedSurface_TransparentFace -2003329 Unknown OST_DividedSurface_PreDividedSurface -2003328 图案填充 OST_DividedSurface_PatternFill -2003327 填充图案线 OST_DividedSurface_PatternLines -2003326 网格线 OST_DividedSurface_Gridlines -2003325 节点 OST_DividedSurface_Nodes -2003324 Unknown OST_DividedSurface -2003323 Unknown OST_RepeatingDetailLines -2003321 向下箭头 OST_RampsDownArrow -2003308 向上箭头 OST_RampsUpArrow -2003307 文字(向下) OST_RampsDownText -2003306 文字(向上) OST_RampsUpText -2003305 超出截面线的梯边梁 OST_RampsStringerAboveCut -2003304 梯边梁 OST_RampsStringer -2003303 坡道超出截面线 OST_RampsAboveCut -2003302 Unknown OST_RampsIncomplete -2003301 Unknown OST_TrussDummy -2003300 Unknown OST_ZoneSchemes -2003225 Unknown OST_AreaSchemes -2003201 面积 OST_Areas -2003200 项目信息 OST_ProjectInformation -2003101 图纸 OST_Sheets -2003100 Unknown OST_ProfileFamilies -2003000 详图项目 OST_DetailComponents -2002000 屋檐底板 OST_RoofSoffit -2001393 楼板边缘 OST_EdgeSlab -2001392 檐沟 OST_Gutter -2001391 封檐板 OST_Fascia -2001390 环境 OST_Entourage -2001370 植物 OST_Planting -2001360 Unknown OST_Blocks -2001359 隐藏线 OST_StructuralStiffenerHiddenLines -2001358 定位线 OST_StructuralColumnLocationLine -2001357 定位线 OST_StructuralFramingLocationLine -2001356 结构加强板标记 OST_StructuralStiffenerTags -2001355 结构加强板 OST_StructuralStiffener -2001354 Unknown OST_FootingAnalyticalGeometry -2001353 RVT 链接 OST_RvtLinks -2001352 Unknown OST_Automatic -2001351 专用设备 OST_SpecialityEquipment -2001350 刚性链接 OST_ColumnAnalyticalRigidLinks -2001344 次等高线 OST_SecondaryTopographyContours -2001343 主等高线 OST_TopographyContours -2001342 三角形边缘 OST_TopographySurface -2001341 地形 OST_Topography -2001340 地形链接 OST_TopographyLink -2001339 结构桁架 OST_StructuralTruss -2001336 棍状符号 OST_StructuralColumnStickSymbols -2001335 隐藏线 OST_HiddenStructuralColumnLines -2001334 刚性链接 OST_AnalyticalRigidLinks -2001333 Unknown OST_ColumnAnalyticalGeometry -2001332 Unknown OST_FramingAnalyticalGeometry -2001331 结构柱 OST_StructuralColumns -2001330 隐藏线 OST_HiddenStructuralFramingLines -2001329 Unknown OST_KickerBracing -2001328 结构梁系统 OST_StructuralFramingSystem -2001327 Unknown OST_VerticalBracing -2001326 Unknown OST_HorizontalBracing -2001325 Unknown OST_Purlin -2001324 Unknown OST_Joist -2001323 Unknown OST_Girder -2001322 Unknown OST_StructuralFramingOther -2001321 结构框架 OST_StructuralFraming -2001320 隐藏线 OST_HiddenStructuralFoundationLines -2001302 结构基础 OST_StructuralFoundation -2001300 Unknown OST_BasePointAxisZ -2001275 Unknown OST_BasePointAxisY -2001274 Unknown OST_BasePointAxisX -2001273 测量点 OST_SharedBasePoint -2001272 项目基点 OST_ProjectBasePoint -2001271 Unknown OST_SiteRegion -2001270 建筑红线线段标记 OST_SitePropertyLineSegmentTags -2001269 建筑红线线段 OST_SitePropertyLineSegment -2001268 属性标记 OST_SitePropertyTags -2001267 边界点 OST_SitePointBoundary -2001266 建筑红线 OST_SiteProperty -2001265 建筑地坪 OST_BuildingPad -2001263 内部点 OST_SitePoint -2001262 Unknown OST_SiteSurface -2001261 场地 OST_Site -2001260 Unknown OST_Sewer -2001240 道路 OST_Roads -2001220 Unknown OST_Property -2001200 停车场 OST_Parking -2001180 卫浴装置 OST_PlumbingFixtures -2001160 机械设备 OST_MechanicalEquipment -2001140 光源 OST_LightingFixtureSource -2001121 照明设备 OST_LightingFixtures -2001120 家具系统 OST_FurnitureSystems -2001100 电气装置 OST_ElectricalFixtures -2001060 电气设备 OST_ElectricalEquipment -2001040 橱柜 OST_Casework -2001000 Unknown OST_ArcWallRectOpening -2000999 Unknown OST_DormerOpeningIncomplete -2000998 Unknown OST_SWallRectOpening -2000997 竖井洞口 OST_ShaftOpening -2000996 Unknown OST_StructuralFramingOpening -2000995 Unknown OST_ColumnOpening -2000994 Unknown OST_RiseDropSymbols -2000989 水力分离符号 OST_PipeHydronicSeparationSymbols -2000988 机械设备集边界线 OST_MechanicalEquipmentSetBoundaryLines -2000987 机械设备集标记 OST_MechanicalEquipmentSetTags -2000986 机械设备集 OST_MechanicalEquipmentSet -2000985 连接线符号 OST_AnalyticalPipeConnectionLineSymbol -2000984 分析管道连接 OST_AnalyticalPipeConnections -2000983 Unknown OST_Coordination_Model -2000982 Unknown OST_MultistoryStairs -2000980 Unknown OST_HiddenStructuralConnectionLines_Deprecated -2000979 Unknown OST_StructuralConnectionHandler_Deprecated -2000978 Unknown OST_CoordinateSystem -2000977 局部坐标系 OST_FndSlabLocalCoordSys -2000976 局部坐标系 OST_FloorLocalCoordSys -2000975 局部坐标系 OST_WallLocalCoordSys -2000974 局部坐标系 OST_BraceLocalCoordSys -2000973 局部坐标系 OST_ColumnLocalCoordSys -2000972 局部坐标系 OST_BeamLocalCoordSys -2000971 多钢筋注释 OST_MultiReferenceAnnotations -2000970 Unknown OST_DSR_LeaderTickMarkStyleId -2000969 Unknown OST_DSR_InteriorTickMarkStyleId -2000968 Unknown OST_DSR_ArrowHeadStyleId -2000967 Unknown OST_DSR_CenterlineTickMarkStyleId -2000966 Unknown OST_DSR_CenterlinePatternCatId -2000965 Unknown OST_DSR_DimStyleHeavyEndCategoryId -2000964 Unknown OST_DSR_DimStyleHeavyEndCatId -2000963 Unknown OST_DSR_DimStyleTickCategoryId -2000962 Unknown OST_DSR_LineAndTextAttrFontId -2000961 Unknown OST_DSR_LineAndTextAttrCategoryId -2000960 分析节点标记 OST_NodeAnalyticalTags -2000956 分析链接标记 OST_LinkAnalyticalTags -2000955 Unknown OST_RailingRailPathExtensionLines -2000954 Unknown OST_RailingRailPathLines -2000953 支撑 OST_StairsSupports -2000952 <高于> 扶手 OST_RailingHandRailAboveCut -2000951 <高于> 顶部扶栏 OST_RailingTopRailAboveCut -2000950 终端 OST_RailingTermination -2000949 支座 OST_RailingSupport -2000948 扶手 OST_RailingHandRail -2000947 顶部扶栏 OST_RailingTopRail -2000946 Unknown OST_StairsSketchPathLines -2000945 楼梯踏板/踢面数 OST_StairsTriserNumbers -2000944 Unknown OST_StairsTriserTags -2000943 楼梯支撑标记 OST_StairsSupportTags -2000942 楼梯平台标记 OST_StairsLandingTags -2000941 楼梯梯段标记 OST_StairsRunTags -2000940 <高于> 向上箭头 OST_StairsPathsAboveCut -2000939 楼梯路径 OST_StairsPaths -2000938 <高于> 踢面线 OST_StairsRiserLinesAboveCut -2000937 踢面线 OST_StairsRiserLines -2000936 <高于> 轮廓 OST_StairsOutlinesAboveCut -2000935 轮廓 OST_StairsOutlines -2000934 <高于> 楼梯前缘线 OST_StairsNosingLinesAboveCut -2000933 楼梯前缘线 OST_StairsNosingLines -2000932 <高于> 剪切标记 OST_StairsCutMarksAboveCut -2000931 剪切标记 OST_StairsCutMarks -2000930 Unknown OST_ComponentRepeaterSlot -2000928 Unknown OST_ComponentRepeater -2000927 Unknown OST_DividedPath -2000926 Unknown OST_IOSRoomCalculationPoint -2000925 Unknown OST_PropertySet -2000924 Unknown OST_AppearanceAsset -2000923 Unknown OST_StairStringer2012_Deprecated -2000922 踢面/踏板 OST_StairsTrisers -2000921 平台 OST_StairsLandings -2000920 梯段 OST_StairsRuns -2000919 Unknown OST_Stair2012_Deprecated -2000918 Unknown OST_RailingSystemTags -2000917 Unknown OST_RailingSystemTransition -2000916 Unknown OST_RailingSystemTermination -2000915 Unknown OST_RailingSystemRail -2000914 Unknown OST_RailingSystemTopRail -2000913 Unknown OST_RailingSystemHandRailBracket -2000912 Unknown OST_RailingSystemHandRail -2000911 Unknown OST_RailingSystemHardware -2000910 Unknown OST_RailingSystemPanel -2000909 Unknown OST_RailingSystemBaluster -2000908 Unknown OST_RailingSystemPost -2000907 Unknown OST_RailingSystemSegment -2000906 Unknown OST_RailingSystem -2000905 Unknown OST_AdaptivePoints_HiddenLines -2000904 线 OST_AdaptivePoints_Lines -2000903 平面 OST_AdaptivePoints_Planes -2000902 点 OST_AdaptivePoints_Points -2000901 自适应点 OST_AdaptivePoints -2000900 Unknown OST_CeilingOpening -2000899 Unknown OST_FloorOpening -2000898 Unknown OST_RoofOpening -2000897 Unknown OST_WallRefPlanes -2000896 Unknown OST_StructLocationLineControl -2000880 Unknown OST_DimLockControlLeader -2000832 <空间分隔> OST_MEPSpaceSeparationLines -2000831 Unknown OST_AreaPolylines -2000830 Unknown OST_RoomPolylines -2000829 Unknown OST_InstanceDrivenLineStyle -2000828 Unknown OST_RemovedGridSeg -2000827 Unknown OST_IOSOpening -2000810 Unknown OST_IOSTilePatternGrid -2000800 Unknown OST_ControlLocal -2000774 Unknown OST_ControlAxisZ -2000773 Unknown OST_ControlAxisY -2000772 Unknown OST_ControlAxisX -2000721 Unknown OST_XRayConstrainedProfileEdge -2000720 Unknown OST_XRayImplicitPathCurve -2000719 Unknown OST_XRayPathPoint -2000718 Unknown OST_XRayPathCurve -2000717 Unknown OST_XRaySideEdge -2000716 Unknown OST_XRayProfileEdge -2000715 Unknown OST_ReferencePoints_HiddenLines -2000714 线 OST_ReferencePoints_Lines -2000713 平面 OST_ReferencePoints_Planes -2000712 点 OST_ReferencePoints_Points -2000711 参照点 OST_ReferencePoints -2000710 材质 OST_Materials -2000700 截面填充图案 OST_CeilingsCutPattern -2000617 公共边 OST_CeilingsDefault -2000616 面层 2 [5] OST_CeilingsFinish2 -2000615 面层 1 [4] OST_CeilingsFinish1 -2000614 衬底 [2] OST_CeilingsSubstrate -2000613 保温层/空气层 [3] OST_CeilingsInsulation -2000612 结构 [1] OST_CeilingsStructure -2000611 涂膜层 OST_CeilingsMembrane -2000610 内部边缘 OST_FloorsInteriorEdges -2000609 截面填充图案 OST_FloorsCutPattern -2000608 隐藏线 OST_HiddenFloorLines -2000607 公共边 OST_FloorsDefault -2000606 面层 2 [5] OST_FloorsFinish2 -2000605 面层 1 [4] OST_FloorsFinish1 -2000604 衬底 [2] OST_FloorsSubstrate -2000603 保温层/空气层 [3] OST_FloorsInsulation -2000602 结构 [1] OST_FloorsStructure -2000601 涂膜层 OST_FloorsMembrane -2000600 内部边缘 OST_RoofsInteriorEdges -2000598 截面填充图案 OST_RoofsCutPattern -2000597 公共边 OST_RoofsDefault -2000596 面层 2 [5] OST_RoofsFinish2 -2000595 面层 1 [4] OST_RoofsFinish1 -2000594 衬底 [2] OST_RoofsSubstrate -2000593 保温层/空气层 [3] OST_RoofsInsulation -2000592 结构 [1] OST_RoofsStructure -2000591 涂膜层 OST_RoofsMembrane -2000590 截面填充图案 OST_WallsCutPattern -2000588 隐藏线 OST_HiddenWallLines -2000587 公共边 OST_WallsDefault -2000586 面层 2 [5] OST_WallsFinish2 -2000585 面层 1 [4] OST_WallsFinish1 -2000584 衬底 [2] OST_WallsSubstrate -2000583 保温层/空气层 [3] OST_WallsInsulation -2000582 结构 [1] OST_WallsStructure -2000581 涂膜层 OST_WallsMembrane -2000580 Unknown OST_PreviewLegendComponents -2000576 Unknown OST_LegendComponents -2000575 明细表 OST_Schedules -2000573 明细表图形 OST_ScheduleGraphics -2000570 光栅图像 OST_RasterImages -2000560 Unknown OST_ColorFillSchema -2000552 颜色填充 OST_RoomColorFill -2000551 颜色填充图例 OST_ColorFillLegends -2000550 注释裁剪边界 OST_AnnotationCropSpecial -2000549 裁剪边界 OST_CropBoundarySpecial -2000548 注释裁剪边界 OST_AnnotationCrop -2000547 Unknown OST_FloorsAnalyticalGeometry -2000546 Unknown OST_WallsAnalyticalGeometry -2000545 详图索引引线 OST_CalloutLeaderLine -2000544 表面填充图案 OST_CeilingsSurfacePattern -2000543 表面填充图案 OST_RoofsSurfacePattern -2000542 表面填充图案 OST_FloorsSurfacePattern -2000541 表面填充图案 OST_WallsSurfacePattern -2000540 详图索引边界 OST_CalloutBoundary -2000539 详图索引标头 OST_CalloutHeads -2000538 详图索引 OST_Callouts -2000537 裁剪边界 OST_CropBoundary -2000536 立面 OST_Elev -2000535 Unknown OST_AxisZ -2000533 Unknown OST_AxisY -2000532 Unknown OST_AxisX -2000531 参照平面 OST_CLines -2000530 Unknown OST_Lights -2000520 视图标题 OST_ViewportLabel -2000515 视口 OST_Viewports -2000510 相机 OST_Camera_Lines -2000501 Unknown OST_Cameras -2000500 空间标记 OST_MEPSpaceTags -2000485 房间标记 OST_RoomTags -2000480 门标记 OST_DoorTags -2000460 窗标记 OST_WindowTags -2000450 宽线 OST_SectionHeadWideLines -2000404 中粗线 OST_SectionHeadMediumLines -2000403 细线 OST_SectionHeadThinLines -2000401 剖面标头 OST_SectionHeads -2000400 等高线标签 OST_ContourLabels -2000350 Unknown OST_CurtaSystemFaceManager -2000341 幕墙系统 OST_CurtaSystem -2000340 Unknown OST_AreaReport_Arc_Minus -2000328 Unknown OST_AreaReport_Arc_Plus -2000327 Unknown OST_AreaReport_Boundary -2000326 Unknown OST_AreaReport_Triangle -2000325 幕墙系统网格 OST_CurtainGridsCurtaSystem -2000323 Unknown OST_CurtainGridsSystem -2000322 幕墙网格 OST_CurtainGridsWall -2000321 幕墙屋顶网格 OST_CurtainGridsRoof -2000320 Unknown OST_HostFinHF -2000315 Unknown OST_HostFinWall -2000314 Unknown OST_HostFinCeiling -2000313 Unknown OST_HostFinRoof -2000312 Unknown OST_HostFinFloor -2000311 Unknown OST_HostFin -2000310 分析显示样式 OST_AnalysisDisplayStyle -2000304 分析结果 OST_AnalysisResults -2000303 渲染区域 OST_RenderRegions -2000302 剖面框 OST_SectionBox -2000301 文字注释 OST_TextNotes -2000300 Unknown OST_Divisions -2000291 Unknown OST_Catalogs -2000290 Unknown OST_DirectionEdgeLines -2000289 <中心线> OST_CenterLines -2000288 <超出> OST_LinesBeyond -2000287 <隐藏> OST_HiddenLines -2000286 <已拆除> OST_DemolishedLines -2000285 <架空线> OST_OverheadLines -2000284 宽线 OST_TitleBlockWideLines -2000283 中粗线 OST_TitleBlockMediumLines -2000282 细线 OST_TitleBlockThinLines -2000281 图框 OST_TitleBlocks -2000280 视图 OST_Views -2000279 Unknown OST_Viewers -2000278 隐藏线 OST_PartHiddenLines -2000271 零件标记 OST_PartTags -2000270 组成部分 OST_Parts -2000269 部件标记 OST_AssemblyTags -2000268 部件 OST_Assemblies -2000267 屋顶标记 OST_RoofTags -2000266 高程点坡度 OST_SpotSlopes -2000265 高程点坐标 OST_SpotCoordinates -2000264 高程点 OST_SpotElevations -2000263 Unknown OST_Constraints -2000262 自动绘制尺寸标注 OST_WeakDims -2000261 尺寸标注 OST_Dimensions -2000260 标高 OST_Levels -2000240 位移路径 OST_DisplacementPath -2000223 Unknown OST_DisplacementElements -2000222 多段轴网 OST_GridChains -2000221 轴网 OST_Grids -2000220 断开剖面线 OST_BrokenSectionLine -2000202 剖面线 OST_SectionLine -2000201 剖面 OST_Sections -2000200 视图参照 OST_ReferenceViewer -2000198 视图参照 OST_ReferenceViewerSymbol -2000197 在族中导入 OST_ImportObjectStyles -2000196 Unknown OST_ModelText -2000195 遮罩区域 OST_MaskingRegion -2000194 拼接线 OST_Matchline -2000193 Unknown OST_FaceSplitter -2000192 平面区域 OST_PlanRegion -2000191 填充区域 OST_FilledRegion -2000190 Unknown OST_MassingProjectionOutlines -2000187 Unknown OST_MassingCutOutlines -2000186 Unknown OST_Massing -2000185 Unknown OST_Reveals -2000182 墙饰条 OST_Cornices -2000181 坡道 OST_Ramps -2000180 Unknown OST_RailingBalusterRailCut -2000177 Unknown OST_RailingBalusterRail -2000176 Unknown OST_Railings -2000175 幕墙网格 OST_CurtainGrids -2000173 Unknown OST_CurtainWallMullionsCut -2000172 幕墙竖梃 OST_CurtainWallMullions -2000171 幕墙嵌板 OST_CurtainWallPanels -2000170 Unknown OST_AreaReference -2000169 Unknown OST_AreaInteriorFill -2000168 Unknown OST_RoomReference -2000167 Unknown OST_RoomInteriorFill -2000166 颜色填充 OST_AreaColorFill -2000165 参照 OST_AreaReferenceVisibility -2000164 内部填充 OST_AreaInteriorFillVisibility -2000163 参照 OST_RoomReferenceVisibility -2000162 内部填充 OST_RoomInteriorFillVisibility -2000161 房间 OST_Rooms -2000160 常规模型 OST_GenericModel -2000151 常规注释 OST_GenericAnnotation -2000150 Unknown OST_Fixtures -2000140 栏杆扶手标记 OST_StairsRailingTags -2000133 <高于> 栏杆扶手截面线 OST_StairsRailingAboveCut -2000132 向下箭头 OST_StairsDownArrows -2000131 向上箭头 OST_StairsUpArrows -2000130 文字(向下) OST_StairsDownText -2000129 扶栏 OST_StairsRailingRail -2000128 栏杆 OST_StairsRailingBaluster -2000127 栏杆扶手 OST_StairsRailing -2000126 文字(向上) OST_StairsUpText -2000125 <高于> 支撑 OST_StairsSupportsAboveCut -2000124 支撑 OST_StairsStringerCarriage -2000123 Unknown OST_StairsAboveCut_ToBeDeprecated -2000122 Unknown OST_StairsIncomplete_Deprecated -2000121 楼梯 OST_Stairs -2000120 Unknown OST_IOSNavWheelPivotBall -2000117 Unknown OST_IOSRoomComputationHeight -2000116 Unknown OST_IOSRoomUpperLowerLines -2000115 Unknown OST_IOSDragBoxInverted -2000114 Unknown OST_IOSDragBox -2000113 Unknown OST_Phases -2000112 Unknown OST_IOS_GeoSite -2000111 Unknown OST_IOS_GeoLocations -2000110 Unknown OST_IOSFabricReinSpanSymbolCtrl -2000109 导向轴网 OST_GuideGrid -2000107 Unknown OST_EPS_Future -2000106 Unknown OST_EPS_Temporary -2000105 Unknown OST_EPS_New -2000104 Unknown OST_EPS_Demolished -2000103 Unknown OST_EPS_Existing -2000102 Unknown OST_IOSMeasureLineScreenSize -2000101 柱 OST_Columns -2000100 Unknown OST_IOSRebarSystemSpanSymbolCtrl -2000099 Unknown OST_IOSRoomTagToRoomLines -2000098 Unknown OST_IOSAttachedDetailGroups -2000097 Unknown OST_IOSDetailGroups -2000096 模型组 OST_IOSModelGroups -2000095 Unknown OST_IOSSuspendedSketch -2000094 Unknown OST_IOSWallCoreBoundary -2000093 Unknown OST_IOSMeasureLine -2000092 Unknown OST_IOSArrays -2000091 Unknown OST_Curtain_Systems -2000090 Unknown OST_IOSBBoxScreenSize -2000089 Unknown OST_IOSSlabShapeEditorPointInterior -2000088 Unknown OST_IOSSlabShapeEditorPointBoundary -2000087 Unknown OST_IOSSlabShapeEditorBoundary -2000086 Unknown OST_IOSSlabShapeEditorAutoCrease -2000085 Unknown OST_IOSSlabShapeEditorExplitCrease -2000084 参照线 OST_ReferenceLines -2000083 Unknown OST_IOSNotSilhouette -2000082 Unknown OST_FillPatterns -2000081 家具 OST_Furniture -2000080 <面积边界> OST_AreaSchemeLines -2000079 线 OST_GenericLines -2000078 隔热层线 OST_InsulationLines -2000077 Unknown OST_CloudLines -2000076 Unknown OST_IOSRoomPerimeterLines -2000075 Unknown OST_IOSCuttingGeometry -2000074 Unknown OST_IOSCrashGraphics -2000073 Unknown OST_IOSGroups -2000072 Unknown OST_IOSGhost -2000071 Unknown OST_StairsSketchLandingCenterLines -2000070 Unknown OST_StairsSketchRunLines -2000069 Unknown OST_StairsSketchRiserLines -2000068 Unknown OST_StairsSketchBoundaryLines -2000067 <房间分隔> OST_RoomSeparationLines -2000066 旋转轴 OST_AxisOfRotation -2000065 Unknown OST_InvisibleLines -2000064 Unknown OST_IOSThinPixel_DashDot -2000063 Unknown OST_IOSThinPixel_Dash -2000062 Unknown OST_IOSThinPixel_Dot -2000061 Unknown OST_Extrusions -2000060 Unknown OST_IOS -2000059 Unknown OST_CutOutlines -2000058 Unknown OST_IOSThinPixel -2000057 Unknown OST_IOSFlipControl -2000056 Unknown OST_IOSSketchGrid -2000055 Unknown OST_IOSSuspendedSketch_obsolete -2000054 Unknown OST_IOSFreeSnapLine -2000053 Unknown OST_IOSDatumPlane -2000052 线 OST_Lines -2000051 Unknown OST_IOSConstructionLine -2000050 Unknown OST_IOSAlignmentGraphics -2000049 Unknown OST_IOSAligningLine -2000048 Unknown OST_IOSBackedUpElements -2000047 Unknown OST_IOSRegeneratedElements -2000046 <草图> OST_SketchLines -2000045 宽线 OST_CurvesWideLines -2000044 中粗线 OST_CurvesMediumLines -2000043 细线 OST_CurvesThinLines -2000042 Unknown OST_Curves -2000041 Unknown OST_CeilingsProjection -2000040 Unknown OST_CeilingsCut -2000039 天花板 OST_Ceilings -2000038 Unknown OST_RoofsProjection -2000037 Unknown OST_RoofsCut -2000036 屋顶 OST_Roofs -2000035 Unknown OST_FloorsProjection -2000034 Unknown OST_FloorsCut -2000033 楼板 OST_Floors -2000032 玻璃 OST_DoorsGlassProjection -2000031 Unknown OST_DoorsGlassCut -2000030 框架/竖梃 OST_DoorsFrameMullionProjection -2000029 Unknown OST_DoorsFrameMullionCut -2000028 洞口 OST_DoorsOpeningProjection -2000027 Unknown OST_DoorsOpeningCut -2000026 嵌板 OST_DoorsPanelProjection -2000025 Unknown OST_DoorsPanelCut -2000024 门 OST_Doors -2000023 洞口 OST_WindowsOpeningProjection -2000022 Unknown OST_WindowsOpeningCut -2000021 窗台/盖板 OST_WindowsSillHeadProjection -2000020 Unknown OST_WindowsSillHeadCut -2000019 框架/竖梃 OST_WindowsFrameMullionProjection -2000018 Unknown OST_WindowsFrameMullionCut -2000017 玻璃 OST_WindowsGlassProjection -2000016 Unknown OST_WindowsGlassCut -2000015 窗 OST_Windows -2000014 Unknown OST_WallsProjectionOutlines -2000013 Unknown OST_WallsCutOutlines -2000012 墙 OST_Walls -2000011 Unknown OST_IOSRegenerationFailure -2000010 Unknown OST_ScheduleViewParamGroup -2000008 Unknown OST_MatchSiteComponent -2000007 Unknown OST_MatchProfile -2000006 Unknown OST_MatchDetail -2000005 Unknown OST_MatchAnnotation -2000004 Unknown OST_MatchModel -2000003 Unknown OST_MatchAll -2000002 Unknown INVALID -1
]]>
+
+
+ <p>Revit二次开发中经常用到<strong>BuildInCategory</strong>过滤元素,以下是通过遍历该枚举获取的数据,其中部分类别的名称未能获取到,显示为<strong>Unknown</strong>,请悉知。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 深度操作系统 20——崭新视界,创无止境
+
+ https://awaw.cc/post/deepin-20/
+ 2020-09-15T16:00:00.000Z
+ 2022-06-10T02:49:35.498Z
+
+ 深度操作系统是一个致力于为全球用户提供美观易用、安全可靠的Linux发行版。 深度操作系统 20正式版(1002)采取统一的设计风格,从桌面环境和应用进行重新设计,带来焕然一新的视觉感受。底层仓库升级到Debian 10.5,系统安装采用双内核机制(Kernel 5.4、Kernel 5.7),全面提升系统稳定性和兼容性。全新设计的启动器菜单、指纹识别、系统安全增强等,系统部分预装应用升级到最新版本,只为给你更好体验。
统一风格的桌面环境 别出心裁的图标设计,焕然一新的图形界面,自然、平滑的动画过渡效果,更有独树一帜的圆角窗口设计,精美绝伦的多任务视图,处处精心,只为给你细腻自然的品质体验。
个性贴心的通知管理 增强通知中心功能,支持设置通知时提示声音、锁屏时显示消息、仅在通知中心显示、显示消息预览,必要应用强提醒、特定应用弱提醒或不提醒,个性化你的消息通知,在不错过任何重要提醒的同时,避免不必要的打扰。
系统支持双内核安装 系统安装界面提供双内核选项,Kernel 5.4(LTS)和Kernel 5.7(Stable)以及Safe Graphics模式,保证系统安装更多选择,提升系统整体的稳定性、兼容性,最新的内核支持更多的硬件设备。
更易用的新版安装器 化繁为简的设计和交互,保证更一致的操作习惯。新版的安装器界面,只需按照操作向导提示安装即可,在硬盘分区操作中,提供手动和全盘安装两种模式,并且支持全盘加密功能。
管理方便的应用商店 应用商店的不同类别应用,覆盖了生活、工作的主要使用场景,本次新增一键更新、应用筛选等功能,带来更便捷的应用管理体验,同时也兼容部分Wine应用,并达到原生应用的体验。
好用安全的指纹识别 全新的指纹功能框架,提供了更细腻的引导交互和更准确的场景提示。可使用指纹进行解锁登录、验证身份和管理员权限。现已支持多款国产指纹硬件。
下载 https://www.deepin.org/zh/download/
]]>
+
+
+ <p>深度操作系统是一个致力于为全球用户提供美观易用、安全可靠的Linux发行版。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Free Control 用电脑控制手机 - 开源
+
+ https://awaw.cc/post/free-control/
+ 2020-09-14T16:00:00.000Z
+ 2024-03-21T07:40:28.060Z
+
+ FreeControl
介绍 [ English | 中文 ]
基于开源项目scrcpy ,提供简洁的交互界面。
编码语言 C#
开发工具 Visual Studio 2022
运行环境 .NET Framework 4.7.2
界面
下载 GitHub Release https://github.com/pdone/FreeControl/releases/latest/download/FreeControl.exe
My Proxy https://cdn.awaw.cc/gh/pdone/FreeControl/releases/latest/download/FreeControl.exe
代码仓库
更新记录
常见问题 输入法问题 v1.7.0
及以后的版本中,默认启用scrcpy的 UHID keyboard
特性,以优化中文输入体验。
如果在此过程中遇到了什么问题,可尝试打开配置文件 %AppData%\FreeControl\config.json
,将 CustomArgs
的值由 --keyboard=uhid
改为 --keyboard=sdk
。
更多信息可参考 scrcpy-doc-keyboard 。
已过时 个人测试发现,目前支持跨屏进行拼音输入的 手机输入法APP 如下:
搜狗输入法 QQ输入法 谷歌拼音输入法 Gboard 微信输入法 此功能需要输入法APP适配,有更好用的输入法欢迎留言推荐。
自动切换输入法功能默认禁用。如需启用,先关闭程序,然后打开配置文件 %AppData%\FreeControl\config.json
,将 EnableSwitchIME
字段值改为 true
,保存后启动程序即可。
设备连接问题 USB 连接 通过 USB 连接来正常使用 adb 需要保证几点:
硬件状态正常。
包括 Android 设备处于正常开机状态,USB 连接线和各种接口完好。
Android 设备的开发者选项和 USB 调试模式已开启。
可以到「设置」-「开发者选项」-「Android 调试」查看。
如果在设置里找不到开发者选项,那需要通过一个彩蛋来让它显示出来:在「设置」-「关于手机」连续点击「版本号」7 次。
设备驱动状态正常。
这一点貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安装驱动的情况,确认这一点可以右键「计算机」-「属性」,到「设备管理器」里查看相关设备上是否有黄色感叹号或问号,如果没有就说明驱动状态已经好了。否则可以下载一个手机助手类程序来安装驱动先。
通过 USB 线连接好电脑和设备后确认状态。
如果能看到
说明连接成功。
无线连接(Android11 及以上) Android 11 及更高版本支持使用 Android 调试桥 (adb) 从工作站以无线方式部署和调试应用。例如,您可以将可调试应用部署到多台远程设备,而无需通过 USB 实际连接设备。这样就可以避免常见的 USB 连接问题,例如驱动程序安装方面的问题。
官方文档
操作步骤:
更新到最新版本的 SDK 平台工具 (至少30.0.0)。
将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
在开发者选项中启用无线调试 。
在询问要允许在此网络上进行无线调试吗?的对话框中,点击允许。
选择使用配对码配对设备,使用弹窗中的 IP 地址和端口号。
提示 Enter pairing code:
时输入弹窗中的配对码,成功后会显示 Successfully paired to ...
。
使用无线调试下的 IP 地址和端口 。
确认连接状态。
如果能看到
说明连接成功。
无线连接(需要借助 USB 线) 除了可以通过 USB 连接设备与电脑来使用 adb,也可以通过无线连接——虽然连接过程中也有需要使用 USB 的步骤,但是连接成功之后你的设备就可以在一定范围内摆脱 USB 连接线的限制啦!
操作步骤:
将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
将设备与电脑通过 USB 线连接。
应确保连接成功(可运行 adb devices
看是否能列出该设备)。
让设备在 5555 端口监听 TCP/IP 连接:
断开 USB 连接。
找到设备的 IP 地址。
一般能在「设置」-「关于手机」-「状态信息」-「IP地址」找到。
通过 IP 地址连接设备。
1 adb connect <device-ip-address>
这里的 <device-ip-address>
就是上一步中找到的设备 IP 地址。
确认连接状态。
如果能看到
1 <device-ip-address>:5555 device
说明连接成功。
如果连接不了,请确认 Android 设备与电脑是连接到了同一个 WiFi,然后再次执行 adb connect <device-ip-address>
那一步;
如果还是不行的话,通过 adb kill-server
重新启动 adb 然后从头再来一次试试。
无线连接(无需借助 USB 线) 需要 root 权限 ,此处不做详细说明,有需要的朋友可参考此处 。
保持唤醒功能 仅在手机充电时有效。
音频转发功能 使用 Android 11
或更高版本的设备支持音频转发,并且默认情况下启用:
对于 Android 12
或更高版本,它开箱即用。 对于 Android 11
,您需要确保在启动scrcpy时设备屏幕已解锁。假的弹出窗口将短暂出现,使系统认为shell应用程序处于前台。没有这个,音频捕获将失败。 对于 Android 10
或更早版本,无法捕获音频并自动禁用。 捐赠 如果您觉得这个项目对您有帮助,欢迎请作者喝杯咖啡。☕
爱发电❤ https://afdian.net/a/pdone
Stargazers Over Time
]]>
+
+
+ 基于开源项目scrcpy,提供简洁的交互界面。
+
+
+
+
+
+
+
+
+
+
+
+
+
+ WinForm加载中窗体
+
+ https://awaw.cc/post/net-loading/
+ 2020-04-14T16:00:00.000Z
+ 2023-07-14T06:13:37.810Z
+
+ 最近项目中用有用到,就简单整了个,只有几行代码。
调用示例 public partial class Main : Form{ public Main() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //构造函数参数说明: //work: 需要在新线程中执行的任务 //msg: 执行完成提示信息(为空时不提示) //openDir: 执行完成后自动打开指定目录(为空时不打开) Loading loading = new Loading(DoSomething, 执行完成); //不show的话 可以当作后台线程执行任务来用 loading.ShowDialog(); } public void DoSomething() { Thread.Sleep(3000); }}
源代下载 百度云 https://pan.baidu.com/s/1NzrZeNKqjlZxK__iXaGvwQ
提取码:npkt
]]>
+
+
+ <p>最近项目中用有用到,就简单整了个,只有几行代码。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DapperHelper
+
+ https://awaw.cc/post/dapper-helper/
+ 2020-03-16T16:00:00.000Z
+ 2023-07-04T03:55:28.185Z
+
+ Dapper is a simple object mapper for .NET and owns the title of King of Micro ORM in terms of speed and is virtually as fast as using a raw ADO.NET data reader. An ORM is an Object Relational Mapper, which is responsible for mapping between database and programming language.Dapper extends the IDbConnection by providing useful extension methods to query your database.
How Dapper Works? It is a three-step process.
Create an IDbConnection object. Write a query to perform CRUD operations. Pass query as a parameter in the Execute method. Installation Dapper is installed through NuGet: https://www.nuget.org/packages/Dapper
1 PM> Install-Package Dapper
Requirement Dapper works with any database provider since there is no DB specific implementation.
Methods Dapper will extend your IDbConnection interface with multiple methods:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 string sqlOrderDetails = "SELECT TOP 5 * FROM OrderDetails;" ;string sqlOrderDetail = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;" ;string sqlCustomerInsert = "INSERT INTO Customers (CustomerName) Values (@CustomerName);" ;using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools())) { var orderDetails = connection.Query<OrderDetail>(sqlOrderDetails).ToList(); var orderDetail = connection.QueryFirstOrDefault<OrderDetail>(sqlOrderDetail, new {OrderDetailID = 1 }); var affectedRows = connection.Execute(sqlCustomerInsert, new {CustomerName = "Mark" }); Console.WriteLine(orderDetails.Count); Console.WriteLine(affectedRows); FiddleHelper.WriteTable(orderDetails); FiddleHelper.WriteTable(new List<OrderDetail>() { orderDetail }); }
Try it: .NET Core | .NET Framework
Parameter Execute and queries method can use parameters from multiple different ways:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 var affectedRows = connection.Execute(sql, new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1" }, commandType: CommandType.StoredProcedure); DynamicParameters parameter = new DynamicParameters(); parameter.Add("@Kind" , InvoiceKind.WebInvoice, DbType.Int32, ParameterDirection.Input); parameter.Add("@Code" , "Many_Insert_0" , DbType.String, ParameterDirection.Input); parameter.Add("@RowCount" , dbType: DbType.Int32, direction: ParameterDirection.ReturnValue); connection.Execute(sql, parameter, commandType: CommandType.StoredProcedure);int rowCount = parameter.Get<int >("@RowCount" ); connection.Query<Invoice>(sql, new {Kind = new [] {InvoiceKind.StoreInvoice, InvoiceKind.WebInvoice}}).ToList(); connection.Query<Invoice>(sql, new {Code = new DbString {Value = "Invoice_1" , IsFixedLength = false , Length = 9 , IsAnsi = true }}).ToList();
Result The result returned by queries method can be mapped to multiple types:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 string sqlOrderDetails = "SELECT TOP 10 * FROM OrderDetails;" ;using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools())) { var anonymousList = connection.Query(sqlOrderDetails).ToList(); var orderDetails = connection.Query<OrderDetail>(sqlOrderDetails).ToList(); Console.WriteLine(anonymousList.Count); Console.WriteLine(orderDetails.Count); FiddleHelper.WriteTable(orderDetails); FiddleHelper.WriteTable(connection.Query(sqlOrderDetails).FirstOrDefault()); }
Try it: .NET Core | .NET Framework
Utilities 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 connection.QueryAsync<Invoice>(sql) connection.Query<Invoice>(sql, buffered: false )using (var transaction = connection.BeginTransaction()) { var affectedRows = connection.Execute(sql, new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1" }, commandType: CommandType.StoredProcedure, transaction: transaction); transaction.Commit(); }var affectedRows = connection.Execute(sql,new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1" }, commandType: CommandType.StoredProcedure);
DapperHelper.cs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 using System;using System.Collections.Generic;using System.Configuration;using System.Data;using System.Data.SqlClient;using System.Data.SQLite;using System.Linq;using System.Threading.Tasks;using Dapper;using MySql.Data.MySqlClient;namespace ORMSuit.DAO { public class DapperHelper <T > { enum DBType { MSSQL, MySQL, SQLite } private static string connectionString = "" ; public static int dbType = 0 ; public static IDbConnection GetConnection () { switch ((DBType) dbType) { case DBType.MSSQL: return new SqlConnection (connectionString); case DBType.MySQL: connectionString = ConfigurationManager.ConnectionStrings["mysqlconn" ].ConnectionString; return new MySqlConnection (connectionString); case DBType.SQLite: connectionString = ConfigurationManager.ConnectionStrings["sqliteconn" ].ConnectionString; return new SQLiteConnection (connectionString); default : return new SqlConnection (connectionString); } } public static List<T> Query (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.Query<T> (sql, param).ToList (); } } public static T QueryFirst (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { List<T> tempList = con.Query<T> (sql, param).ToList (); if (tempList != null && tempList.Count > 0 ) { return tempList[0 ]; } else { return default ; } } } public static T QueryFirstOrDefault (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.QueryFirstOrDefault<T> (sql, param); } } public static T QuerySingle (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.QuerySingle<T> (sql, param); } } public static bool Exists (string sql, object param = null ) { object obj = ExecuteScalar (sql, param); int count = 0 ; if (obj == null ) { count = 0 ; } else { count = Convert.ToInt32 (obj); } if (count > 0 ) { return true ; } else { return false ; } } public static int RecordCount (string sql, object param = null ) { object obj = ExecuteScalar (sql, param); int count = 0 ; if (obj == null ) { count = 0 ; } else { count = Convert.ToInt32 (obj); } return count; } public static T QuerySingleOrDefault (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.QuerySingleOrDefault<T> (sql, param); } } public static int Execute (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.Execute (sql, param); } } public static IDataReader ExecuteReader (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.ExecuteReader (sql, param); } } #region public static DataTable ExecuteDataTabel (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return DataReaderToDataTable (con.ExecuteReader (sql, param)); } } public static DataSet ExecuteDataSet (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return DataReaderToDataSet (con.ExecuteReader (sql, param)); } } private static DataTable DataReaderToDataTable (IDataReader dataReader ) { DataTable datatable = new DataTable (); for (int i = 0 ; i < dataReader.FieldCount; i++) { DataColumn myDataColumn = new DataColumn (); myDataColumn.DataType = dataReader.GetFieldType (i); myDataColumn.ColumnName = dataReader.GetName (i); datatable.Columns.Add (myDataColumn); } while (dataReader.Read ()) { DataRow myDataRow = datatable.NewRow (); for (int i = 0 ; i < dataReader.FieldCount; i++) { myDataRow[i] = dataReader[i].ToString (); } datatable.Rows.Add (myDataRow); myDataRow = null ; } dataReader.Close (); return datatable; } public static DataSet DataReaderToDataSet (IDataReader dataReader ) { DataSet dataSet = new DataSet (); do { DataTable schemaTable = dataReader.GetSchemaTable (); DataTable dataTable = new DataTable (); if (schemaTable != null ) { for (int i = 0 ; i < schemaTable.Rows.Count; i++) { DataRow dataRow = schemaTable.Rows[i]; string columnName = (string ) dataRow["ColumnName" ]; DataColumn column = new DataColumn (columnName, (Type) dataRow["DataType" ]); dataTable.Columns.Add (column); } dataSet.Tables.Add (dataTable); while (dataReader.Read ()) { DataRow dataRow = dataTable.NewRow (); for (int i = 0 ; i < dataReader.FieldCount; i++) { dataRow[i] = dataReader.GetValue (i); } dataTable.Rows.Add (dataRow); } } else { DataColumn column = new DataColumn ("RowsAffected" ); dataTable.Columns.Add (column); dataSet.Tables.Add (dataTable); DataRow dataRow = dataTable.NewRow (); dataRow[0 ] = dataReader.RecordsAffected; dataTable.Rows.Add (dataRow); } } while (dataReader.NextResult ()); return dataSet; } #endregion public static object ExecuteScalar (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.ExecuteScalar (sql, param); } } public static T ExecuteScalarForT (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.ExecuteScalar<T> (sql, param); } } public static List<T> ExecutePro (string proc, object param = null ) { using (IDbConnection con = GetConnection ()) { List<T> list = con.Query<T> (proc, param, null , true , null , CommandType.StoredProcedure).ToList (); return list; } } public static int ExecuteTransaction (Dictionary<string , object > dic ) { using (IDbConnection con = GetConnection ()) { using (var transaction = con.BeginTransaction ()) { try { int result = 0 ; foreach (var sql in dic) { result += con.Execute (sql.Key, sql.Value, transaction); } transaction.Commit (); return result; } catch (Exception ex) { transaction.Rollback (); return 0 ; } } } } public static int ExecuteTransaction (string sql, object obj ) { using (IDbConnection con = GetConnection ()) { con.Open (); using (IDbTransaction transaction = con.BeginTransaction ()) { try { int result = 0 ; result = con.Execute (sql, obj, transaction); transaction.Commit (); con.Close (); return result; } catch (Exception ex) { transaction.Rollback (); con.Close (); return 0 ; } } } } public static Task<int > ExecuteTransactionAsync (string sql, object obj ) { using (IDbConnection con = GetConnection ()) { con.Open (); using (IDbTransaction transaction = con.BeginTransaction ()) { try { Task<int > result; result = con.ExecuteAsync (sql, obj, transaction); transaction.Commit (); con.Close (); return result; } catch (Exception ex) { transaction.Rollback (); con.Close (); return null ; } } } } } }
]]>
+
+
+ <p>Dapper is a simple object mapper for .NET and owns the title of <strong>King of Micro ORM</strong> in terms of speed and is virtually as fast as using a raw ADO.NET data reader. An ORM is an Object Relational Mapper, which is responsible for mapping between database and programming language.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Steam免费游戏一键领取
+
+ https://awaw.cc/post/steam-free-game/
+ 2019-07-21T16:00:00.000Z
+ 2023-07-04T05:13:33.385Z
+
+ 这些都是Steam上免费的游戏,如果手动领取的话需要一个一个领取,这里提供一种简便的方法,一键批量把免费游戏添加到自己的库里。第一步 打开该链接: https://store.steampowered.com/account/licenses/ ,然后登录自己的账号(或者自己进入Steam主页,登录网页版Steam,然后进入到 主页 > 帐户 > 许可和产品序列号激活 页面)。
第二步 按键盘F12,进入Console,粘贴下方代码后按Enter键执行代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 (function ( ) { if (location.href .match (/^https:\/\/store\.steampowered\.com\/account\/licenses\/?$/ ) === null ) { alert ('请在Steam帐号明细页面运行这些代码: https://store.steampowered.com/account/licenses/' ); window .location = 'https://store.steampowered.com/account/licenses/' ; return ; } var freePackages = [ 39166 , 13261 , 32032 , 59373 , 33694 , 88162 , 36561 , 58514 , 117526 , 85604 , 21478 , 50861 , 21473 , 31538 , 32287 , 38085 , 72261 , 81026 , 47333 , 38820 , 69802 , 60341 , 21416 , 63207 , 59253 , 35063 , 74465 , 21101 , 21102 , 21103 , 21104 , 21105 , 21106 , 21107 , 21108 , 21109 , 21110 , 21111 , 21113 , 21114 , 21115 , 21117 , 21118 , 21119 , 21120 , 21121 , 21122 , 21123 , 21124 , 21125 , 21126 , 21127 , 21128 , 21129 , 21130 , 21131 , 21132 , 21133 , 21134 , 21135 , 21136 , 21137 , 21138 , 21139 , 21140 , 21141 , 21142 , 21143 , 21144 , 21145 , 21146 , 21147 , 21148 , 21149 , 21150 , 21151 , ]; var ownedPackages = {}; jQuery ('.account_table a' ).each (function (i, el ) { var match = el.href .match (/javascript:RemoveFreeLicense\( ([0-9]+), '/ ); if (match !== null ) { ownedPackages[+match[1 ]] = true ; } }); var i = 0 , loaded = 0 , package = 0 , total = freePackages.length , modal = ShowBlockingWaitDialog ('努力执行中...' , '请耐心等待,如果有错误请无视,请耐心等待脚本加载完毕' ); for (; i < total; i++) { package = freePackages[i]; if (ownedPackages[package]) { loaded++; continue ; } jQuery.post ( '//store.steampowered.com/checkout/addfreelicense' , { action : 'add_to_cart' , sessionid : g_sessionID, subid : package } ).always (function ( ) { loaded++; modal.Dismiss (); if (loaded >= total) { location.reload (); } else { modal = ShowBlockingWaitDialog ('执行中...' , '加载至 <b>' + loaded + '</b>/' + total + '.' ); } } ); } }());
第三步 Enjoy your free game!
]]>
+
+
+ <p>这些都是Steam上免费的游戏,如果手动领取的话需要一个一个领取,这里提供一种简便的方法,一键批量把免费游戏添加到自己的库里。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SSMS18闪退解决方法
+
+ https://awaw.cc/post/ssms18-not-run/
+ 2019-06-19T16:00:00.000Z
+ 2023-07-04T05:11:16.691Z
+
+ 这是已知问题,SSMS开发团队发布了新的官方解决方法。第一个方法 复制文件
1 Microsoft.VisualStudio.Shell.Interop.8.0.dll
将该DLL文件从目录
1 C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\PrivateAssemblies\Interop
复制到目录
1 C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\PublicAssemblies
第二个方法 删除文件
1 C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\CommonExtensions\Platform\Microsoft.VisualStudio.MinShell.Interop.pkgdef
SSMS产品经理提供的方法 建议的解决方法是:
1)关闭所有SSMS实例
2)编辑ssms.exe.config
3)删除具有以下文本的行(应该是第38行):NgenBind_OptimizeNonGac enabled =“1”
这与SSMS 18.x的下一版本中的改变相同
注意! ssms.exe.config文件的位置在文件夹中:
1 C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE
相关链接 ]]>
+
+
+ <p>这是已知问题,SSMS开发团队发布了新的官方解决方法。</p>
+
+
+
+
+
+
+
+
+
+
+
diff --git a/avatar.jpg b/avatar.jpg
new file mode 100644
index 0000000..4aa6223
Binary files /dev/null and b/avatar.jpg differ
diff --git a/categories/Developer/index.html b/categories/Developer/index.html
new file mode 100644
index 0000000..2e1cd99
--- /dev/null
+++ b/categories/Developer/index.html
@@ -0,0 +1,559 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分类 - Developer - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/categories/Developer/page/2/index.html b/categories/Developer/page/2/index.html
new file mode 100644
index 0000000..6a8710b
--- /dev/null
+++ b/categories/Developer/page/2/index.html
@@ -0,0 +1,532 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分类 - Developer - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/categories/Share/index.html b/categories/Share/index.html
new file mode 100644
index 0000000..373abf4
--- /dev/null
+++ b/categories/Share/index.html
@@ -0,0 +1,562 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分类 - Share - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/categories/Share/page/2/index.html b/categories/Share/page/2/index.html
new file mode 100644
index 0000000..30e0fcd
--- /dev/null
+++ b/categories/Share/page/2/index.html
@@ -0,0 +1,505 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分类 - Share - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/categories/Tools/index.html b/categories/Tools/index.html
new file mode 100644
index 0000000..082954d
--- /dev/null
+++ b/categories/Tools/index.html
@@ -0,0 +1,508 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分类 - Tools - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/categories/index.html b/categories/index.html
new file mode 100644
index 0000000..b24db28
--- /dev/null
+++ b/categories/index.html
@@ -0,0 +1,798 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分类 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/css/gitalk.css b/css/gitalk.css
new file mode 100644
index 0000000..a268f1d
--- /dev/null
+++ b/css/gitalk.css
@@ -0,0 +1,546 @@
+@font-face {
+ font-family: octicons-link;
+ src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff');
+}
+/* variables */
+/* functions & mixins */
+/* variables - calculated */
+/* styles */
+.gt-container {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ font-size: 16px;
+ /* loader */
+ /* error */
+ /* initing */
+ /* no int */
+ /* link */
+ /* meta */
+ /* popup */
+ /* header */
+ /* comments */
+ /* comment */
+}
+.gt-container * {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.gt-container a {
+ color: #6190e8;
+}
+.gt-container a:hover {
+ color: #81a6ed;
+ border-color: #81a6ed;
+}
+.gt-container a.is--active {
+ color: #333;
+ cursor: default !important;
+}
+.gt-container a.is--active:hover {
+ color: #333;
+}
+.gt-container .hide {
+ display: none !important;
+}
+.gt-container .gt-svg {
+ display: inline-block;
+ width: 1em;
+ height: 1em;
+ vertical-align: sub;
+}
+.gt-container .gt-svg svg {
+ width: 100%;
+ height: 100%;
+ fill: #6190e8;
+}
+.gt-container .gt-ico {
+ display: inline-block;
+}
+.gt-container .gt-ico-text {
+ margin-left: 0.3125em;
+}
+.gt-container .gt-ico-github {
+ width: 100%;
+ height: 100%;
+}
+.gt-container .gt-ico-github .gt-svg {
+ width: 100%;
+ height: 100%;
+}
+.gt-container .gt-ico-github svg {
+ fill: inherit;
+}
+.gt-container .gt-spinner {
+ position: relative;
+}
+.gt-container .gt-spinner::before {
+ content: '';
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ position: absolute;
+ top: 3px;
+ width: 0.75em;
+ height: 0.75em;
+ margin-top: -0.1875em;
+ margin-left: -0.375em;
+ border-radius: 50%;
+ border: 1px solid #fff;
+ border-top-color: #6190e8;
+ -webkit-animation: gt-kf-rotate 0.6s linear infinite;
+ animation: gt-kf-rotate 0.6s linear infinite;
+}
+.gt-container .gt-loader {
+ position: relative;
+ border: 1px solid #999;
+ -webkit-animation: ease gt-kf-rotate 1.5s infinite;
+ animation: ease gt-kf-rotate 1.5s infinite;
+ display: inline-block;
+ font-style: normal;
+ width: 1.75em;
+ height: 1.75em;
+ line-height: 1.75em;
+ border-radius: 50%;
+}
+.gt-container .gt-loader:before {
+ content: '';
+ position: absolute;
+ display: block;
+ top: 0;
+ left: 50%;
+ margin-top: -0.1875em;
+ margin-left: -0.1875em;
+ width: 0.375em;
+ height: 0.375em;
+ background-color: #999;
+ border-radius: 50%;
+}
+.gt-container .gt-avatar {
+ display: inline-block;
+ width: 3.125em;
+ height: 3.125em;
+}
+@media (max-width: 479px) {
+ .gt-container .gt-avatar {
+ width: 2em;
+ height: 2em;
+ }
+}
+.gt-container .gt-avatar img {
+ width: 100%;
+ height: auto;
+ border-radius: 3px;
+}
+.gt-container .gt-avatar-github {
+ width: 3em;
+ height: 3em;
+}
+@media (max-width: 479px) {
+ .gt-container .gt-avatar-github {
+ width: 1.875em;
+ height: 1.875em;
+ }
+}
+.gt-container .gt-btn {
+ padding: 0.75em 1.25em;
+ display: inline-block;
+ line-height: 1;
+ text-decoration: none;
+ white-space: nowrap;
+ cursor: pointer;
+ border: 1px solid #6190e8;
+ border-radius: 5px;
+ background-color: #6190e8;
+ color: #fff;
+ outline: none;
+ font-size: 0.75em;
+}
+.gt-container .gt-btn-text {
+ font-weight: 400;
+}
+.gt-container .gt-btn-loading {
+ position: relative;
+ margin-left: 0.5em;
+ display: inline-block;
+ width: 0.75em;
+ height: 1em;
+ vertical-align: top;
+}
+.gt-container .gt-btn.is--disable {
+ cursor: not-allowed;
+ opacity: 0.5;
+}
+.gt-container .gt-btn-login {
+ margin-right: 0;
+}
+.gt-container .gt-btn-preview {
+ background-color: #fff;
+ color: #6190e8;
+}
+.gt-container .gt-btn-preview:hover {
+ background-color: #f2f2f2;
+ border-color: #81a6ed;
+}
+.gt-container .gt-btn-public:hover {
+ background-color: #81a6ed;
+ border-color: #81a6ed;
+}
+.gt-container .gt-error {
+ text-align: center;
+ margin: 0.625em;
+ color: #ff3860;
+}
+.gt-container .gt-initing {
+ padding: 1.25em 0;
+ text-align: center;
+}
+.gt-container .gt-initing-text {
+ margin: 0.625em auto;
+ font-size: 92%;
+}
+.gt-container .gt-no-init {
+ padding: 1.25em 0;
+ text-align: center;
+}
+.gt-container .gt-link {
+ border-bottom: 1px dotted #6190e8;
+}
+.gt-container .gt-link-counts,
+.gt-container .gt-link-project {
+ text-decoration: none;
+}
+.gt-container .gt-meta {
+ margin: 1.25em 0;
+ padding: 1em 0;
+ position: relative;
+ border-bottom: 1px solid #e9e9e9;
+ font-size: 1em;
+ position: relative;
+ z-index: 10;
+}
+.gt-container .gt-meta:before,
+.gt-container .gt-meta:after {
+ content: " ";
+ display: table;
+}
+.gt-container .gt-meta:after {
+ clear: both;
+}
+.gt-container .gt-counts {
+ margin: 0 0.625em 0 0;
+}
+.gt-container .gt-user {
+ float: right;
+ margin: 0;
+ font-size: 92%;
+}
+.gt-container .gt-user-pic {
+ width: 16px;
+ height: 16px;
+ vertical-align: top;
+ margin-right: 0.5em;
+}
+.gt-container .gt-user-inner {
+ display: inline-block;
+ cursor: pointer;
+}
+.gt-container .gt-user .gt-ico {
+ margin: 0 0 0 0.3125em;
+}
+.gt-container .gt-user .gt-ico svg {
+ fill: inherit;
+}
+.gt-container .gt-user .is--poping .gt-ico svg {
+ fill: #6190e8;
+}
+.gt-container .gt-version {
+ color: #a1a1a1;
+ margin-left: 0.375em;
+}
+.gt-container .gt-copyright {
+ margin: 0 0.9375em 0.5em;
+ border-top: 1px solid #e9e9e9;
+ padding-top: 0.5em;
+}
+.gt-container .gt-popup {
+ position: absolute;
+ right: 0;
+ top: 2.375em;
+ background: #fff;
+ display: inline-block;
+ border: 1px solid #e9e9e9;
+ padding: 0.625em 0;
+ font-size: 0.875em;
+ letter-spacing: 0.5px;
+}
+.gt-container .gt-popup .gt-action {
+ cursor: pointer;
+ display: block;
+ margin: 0.5em 0;
+ padding: 0 1.125em;
+ position: relative;
+ text-decoration: none;
+}
+.gt-container .gt-popup .gt-action.is--active:before {
+ content: '';
+ width: 0.25em;
+ height: 0.25em;
+ background: #6190e8;
+ position: absolute;
+ left: 0.5em;
+ top: 0.4375em;
+}
+.gt-container .gt-header {
+ position: relative;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+}
+.gt-container .gt-header-comment {
+ -webkit-box-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ margin-left: 1.25em;
+}
+@media (max-width: 479px) {
+ .gt-container .gt-header-comment {
+ margin-left: 0.875em;
+ }
+}
+.gt-container .gt-header-textarea {
+ padding: 0.75em;
+ display: block;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ min-height: 5.125em;
+ max-height: 15em;
+ border-radius: 5px;
+ border: 1px solid rgba(0,0,0,0.1);
+ font-size: 0.875em;
+ word-wrap: break-word;
+ resize: vertical;
+ background-color: #f6f6f6;
+ outline: none;
+ -webkit-transition: all 0.25s ease;
+ transition: all 0.25s ease;
+}
+.gt-container .gt-header-textarea:hover {
+ background-color: #fbfbfb;
+}
+.gt-container .gt-header-preview {
+ padding: 0.75em;
+ border-radius: 5px;
+ border: 1px solid rgba(0,0,0,0.1);
+ background-color: #f6f6f6;
+}
+.gt-container .gt-header-controls {
+ position: relative;
+ margin: 0.75em 0 0;
+}
+.gt-container .gt-header-controls:before,
+.gt-container .gt-header-controls:after {
+ content: " ";
+ display: table;
+}
+.gt-container .gt-header-controls:after {
+ clear: both;
+}
+@media (max-width: 479px) {
+ .gt-container .gt-header-controls {
+ margin: 0;
+ }
+}
+.gt-container .gt-header-controls-tip {
+ font-size: 0.875em;
+ color: #6190e8;
+ text-decoration: none;
+ vertical-align: sub;
+}
+@media (max-width: 479px) {
+ .gt-container .gt-header-controls-tip {
+ display: none;
+ }
+}
+.gt-container .gt-header-controls .gt-btn {
+ float: right;
+ margin-left: 1.25em;
+}
+@media (max-width: 479px) {
+ .gt-container .gt-header-controls .gt-btn {
+ float: none;
+ width: 100%;
+ margin: 0.75em 0 0;
+ }
+}
+.gt-container:after {
+ content: '';
+ position: fixed;
+ bottom: 100%;
+ left: 0;
+ right: 0;
+ top: 0;
+ opacity: 0;
+}
+.gt-container.gt-input-focused {
+ position: relative;
+}
+.gt-container.gt-input-focused:after {
+ content: '';
+ position: fixed;
+ bottom: 0%;
+ left: 0;
+ right: 0;
+ top: 0;
+ background: #000;
+ opacity: 0.6;
+ -webkit-transition: opacity 0.3s, bottom 0s;
+ transition: opacity 0.3s, bottom 0s;
+ z-index: 9999;
+}
+.gt-container.gt-input-focused .gt-header-comment {
+ z-index: 10000;
+}
+.gt-container .gt-comments {
+ padding-top: 1.25em;
+}
+.gt-container .gt-comments-null {
+ text-align: center;
+}
+.gt-container .gt-comments-controls {
+ margin: 1.25em 0;
+ text-align: center;
+}
+.gt-container .gt-comment {
+ position: relative;
+ padding: 0.625em 0;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+}
+.gt-container .gt-comment-content {
+ -webkit-box-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ margin-left: 1.25em;
+ padding: 0.75em 1em;
+ background-color: #f9f9f9;
+ overflow: auto;
+ -webkit-transition: all ease 0.25s;
+ transition: all ease 0.25s;
+}
+.gt-container .gt-comment-content:hover {
+ -webkit-box-shadow: 0 0.625em 3.75em 0 #f4f4f4;
+ box-shadow: 0 0.625em 3.75em 0 #f4f4f4;
+}
+@media (max-width: 479px) {
+ .gt-container .gt-comment-content {
+ margin-left: 0.875em;
+ padding: 0.625em 0.75em;
+ }
+}
+.gt-container .gt-comment-header {
+ margin-bottom: 0.5em;
+ font-size: 0.875em;
+ position: relative;
+}
+.gt-container .gt-comment-block-1 {
+ float: right;
+ height: 1.375em;
+ width: 2em;
+}
+.gt-container .gt-comment-block-2 {
+ float: right;
+ height: 1.375em;
+ width: 4em;
+}
+.gt-container .gt-comment-username {
+ font-weight: 500;
+ color: #6190e8;
+ text-decoration: none;
+}
+.gt-container .gt-comment-username:hover {
+ text-decoration: underline;
+}
+.gt-container .gt-comment-text {
+ margin-left: 0.5em;
+ color: #a1a1a1;
+}
+.gt-container .gt-comment-date {
+ margin-left: 0.5em;
+ color: #a1a1a1;
+}
+.gt-container .gt-comment-like,
+.gt-container .gt-comment-edit,
+.gt-container .gt-comment-reply {
+ position: absolute;
+ height: 1.375em;
+}
+.gt-container .gt-comment-like:hover,
+.gt-container .gt-comment-edit:hover,
+.gt-container .gt-comment-reply:hover {
+ cursor: pointer;
+}
+.gt-container .gt-comment-like {
+ top: 0;
+ right: 2em;
+}
+.gt-container .gt-comment-edit,
+.gt-container .gt-comment-reply {
+ top: 0;
+ right: 0;
+}
+.gt-container .gt-comment-body {
+ color: #333 !important;
+}
+.gt-container .gt-comment-body .email-hidden-toggle a {
+ display: inline-block;
+ height: 12px;
+ padding: 0 9px;
+ font-size: 12px;
+ font-weight: 600;
+ line-height: 6px;
+ color: #444d56;
+ text-decoration: none;
+ vertical-align: middle;
+ background: #dfe2e5;
+ border-radius: 1px;
+}
+.gt-container .gt-comment-body .email-hidden-toggle a:hover {
+ background-color: #c6cbd1;
+}
+.gt-container .gt-comment-body .email-hidden-reply {
+ display: none;
+ white-space: pre-wrap;
+}
+.gt-container .gt-comment-body .email-hidden-reply .email-signature-reply {
+ padding: 0 15px;
+ margin: 15px 0;
+ color: #586069;
+ border-left: 4px solid #dfe2e5;
+}
+.gt-container .gt-comment-body .email-hidden-reply.expanded {
+ display: block;
+}
+.gt-container .gt-comment-admin .gt-comment-content {
+ background-color: #f6f9fe;
+}
+@-webkit-keyframes gt-kf-rotate {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+@keyframes gt-kf-rotate {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
diff --git a/css/highlight-dark.css b/css/highlight-dark.css
new file mode 100644
index 0000000..495769c
--- /dev/null
+++ b/css/highlight-dark.css
@@ -0,0 +1,10 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
+ Theme: GitHub Dark
+ Description: Dark theme as seen on github.com
+ Author: github.com
+ Maintainer: @Hirse
+ Updated: 2021-05-15
+
+ Outdated base version: https://github.com/primer/github-syntax-dark
+ Current colors taken from GitHub's CSS
+*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}
diff --git a/css/highlight.css b/css/highlight.css
new file mode 100644
index 0000000..96af284
--- /dev/null
+++ b/css/highlight.css
@@ -0,0 +1,10 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
+ Theme: GitHub
+ Description: Light theme as seen on github.com
+ Author: github.com
+ Maintainer: @Hirse
+ Updated: 2021-05-15
+
+ Outdated base version: https://github.com/primer/github-syntax-light
+ Current colors taken from GitHub's CSS
+*/.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}
diff --git a/css/main.css b/css/main.css
new file mode 100644
index 0000000..b6e8628
--- /dev/null
+++ b/css/main.css
@@ -0,0 +1,2238 @@
+.anchorjs-link {
+ text-decoration: none !important;
+ transition: opacity 0.2s ease-in-out;
+}
+.markdown-body h1:hover > .anchorjs-link,
+h2:hover > .anchorjs-link,
+h3:hover > .anchorjs-link,
+h4:hover > .anchorjs-link,
+h5:hover > .anchorjs-link,
+h6:hover > .anchorjs-link {
+ opacity: 1;
+}
+.banner {
+ height: 100%;
+ position: relative;
+ overflow: hidden;
+ cursor: default;
+}
+.banner .mask {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(0,0,0,0.3);
+}
+.banner[parallax="true"] {
+ will-change: transform;
+ -webkit-transform-style: preserve-3d;
+ -webkit-backface-visibility: hidden;
+ transition: transform 0.05s ease-out;
+}
+@media (max-width: 100vh) {
+ .header-inner {
+ max-height: 100vw;
+ }
+ #board {
+ margin-top: -1rem !important;
+ }
+}
+@media (max-width: 79.99vh) {
+ .scroll-down-bar {
+ display: none;
+ }
+}
+#board {
+ position: relative;
+ margin-top: -2rem;
+ padding: 3rem 0;
+ background-color: var(--board-bg-color);
+ transition: background-color 0.2s ease-in-out;
+ border-radius: 0.5rem;
+ z-index: 3;
+ -webkit-box-shadow: 0 12px 15px 0 rgba(0,0,0,0.24), 0 17px 50px 0 rgba(0,0,0,0.19);
+ box-shadow: 0 12px 15px 0 rgba(0,0,0,0.24), 0 17px 50px 0 rgba(0,0,0,0.19);
+}
+.code-widget {
+ display: inline-block;
+ background-color: transparent;
+ font-size: 0.75rem;
+ line-height: 1;
+ font-weight: bold;
+ padding: 0.3rem 0.1rem 0.1rem 0.1rem;
+ position: absolute;
+ right: 0.45rem;
+ top: 0.15rem;
+ z-index: 1;
+}
+.code-widget-light {
+ color: #999;
+}
+.code-widget-dark {
+ color: #bababa;
+}
+.copy-btn {
+ cursor: pointer;
+ user-select: none;
+ -webkit-appearance: none;
+ outline: none;
+}
+.copy-btn > i {
+ font-size: 0.75rem !important;
+ font-weight: 400;
+ margin-right: 0.15rem;
+ opacity: 0;
+ transition: opacity 0.2s ease-in-out;
+}
+.markdown-body pre:hover > .copy-btn > i {
+ opacity: 0.9;
+}
+.markdown-body pre:hover > .copy-btn,
+.markdown-body pre:not(:hover) > .copy-btn {
+ outline: none;
+}
+.license-box {
+ background-color: rgba(27,31,35,0.05);
+ transition: background-color 0.2s ease-in-out;
+ border-radius: 4px;
+ font-size: 0.9rem;
+ overflow: hidden;
+ padding: 1.25rem;
+ position: relative;
+ z-index: 1;
+}
+.license-box .license-icon {
+ position: absolute;
+ top: 50%;
+ left: 100%;
+}
+.license-box .license-icon::after {
+ content: "\e8e4";
+ font-size: 12.5rem;
+ line-height: 1;
+ opacity: 0.1;
+ position: relative;
+ left: -0.85em;
+ bottom: 0.5em;
+ z-index: -1;
+}
+.license-box .license-title {
+ margin-bottom: 1rem;
+}
+.license-box .license-title div:nth-child(1) {
+ line-height: 1.2;
+ margin-bottom: 0.25rem;
+}
+.license-box .license-title div:nth-child(2) {
+ color: var(--sec-text-color);
+ font-size: 0.8rem;
+}
+.license-box .license-meta {
+ align-items: center;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+}
+.license-box .license-meta .license-meta-item {
+ align-items: center;
+ justify-content: center;
+ margin-right: 1.5rem;
+}
+.license-box .license-meta .license-meta-item div:nth-child(1) {
+ color: var(--sec-text-color);
+ font-size: 0.8rem;
+ font-weight: normal;
+}
+.license-box .license-meta .license-meta-item i.iconfont {
+ font-size: 1rem;
+}
+@media (max-width: 575px) and (min-width: 425px) {
+ .license-box .license-meta .license-meta-item {
+ display: flex;
+ justify-content: flex-start;
+ flex-wrap: wrap;
+ font-size: 0.8rem;
+ flex: 0 0 50%;
+ max-width: 50%;
+ margin-right: 0;
+ }
+ .license-box .license-meta .license-meta-item div:nth-child(1) {
+ margin-right: 0.5rem;
+ }
+ .license-box .license-meta .license-meta-date {
+ order: -1;
+ }
+}
+@media (max-width: 424px) {
+ .license-box::after {
+ top: -65px;
+ }
+ .license-box .license-meta {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+ .license-box .license-meta .license-meta-item {
+ display: flex;
+ flex-wrap: wrap;
+ font-size: 0.8rem;
+ }
+ .license-box .license-meta .license-meta-item div:nth-child(1) {
+ margin-right: 0.5rem;
+ }
+}
+.footer-inner {
+ padding: 3rem 0 1rem 0;
+ text-align: center;
+}
+.footer-inner > div:not(:first-child) {
+ margin: 0.25rem 0;
+ font-size: 0.85rem;
+}
+.footer-inner .statistics {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+}
+.footer-inner .statistics > span {
+ flex: 1;
+ margin: 0 0.25rem;
+}
+.footer-inner .statistics > *:nth-last-child(2):first-child {
+ text-align: right;
+}
+.footer-inner .statistics > *:nth-last-child(2):first-child ~ * {
+ text-align: left;
+}
+.footer-inner .beian {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+}
+.footer-inner .beian > * {
+ margin: 0 0.25rem;
+}
+.footer-inner .beian-police {
+ position: relative;
+ overflow: hidden;
+ display: inline-flex;
+ align-items: center;
+ justify-content: left;
+}
+.footer-inner .beian-police img {
+ margin-right: 3px;
+ width: 1rem;
+ height: 1rem;
+ margin-bottom: 0.1rem;
+}
+@media (max-width: 424px) {
+ .footer-inner .statistics {
+ flex-direction: column;
+ }
+ .footer-inner .statistics > *:nth-last-child(2):first-child {
+ text-align: center;
+ }
+ .footer-inner .statistics > *:nth-last-child(2):first-child ~ * {
+ text-align: center;
+ }
+ .footer-inner .beian {
+ flex-direction: column;
+ }
+ .footer-inner .beian .beian-police {
+ justify-content: center;
+ }
+ .footer-inner .beian > *:nth-last-child(2):first-child {
+ text-align: center;
+ }
+ .footer-inner .beian > *:nth-last-child(2):first-child ~ * {
+ text-align: center;
+ }
+}
+sup > a::before,
+.footnote-text::before {
+ display: block;
+ content: "";
+ margin-top: -5rem;
+ height: 5rem;
+ width: 1px;
+ visibility: hidden;
+}
+sup > a::before,
+.footnote-text::before {
+ display: inline-block;
+}
+.footnote-item::before {
+ display: block;
+ content: "";
+ margin-top: -5rem;
+ height: 5rem;
+ width: 1px;
+ visibility: hidden;
+}
+.footnote-list ol {
+ list-style-type: none;
+ counter-reset: sectioncounter;
+ padding-left: 0.5rem;
+ font-size: 0.95rem;
+}
+.footnote-list ol li:before {
+ font-family: "Helvetica Neue", monospace, "Monaco";
+ content: "[" counter(sectioncounter) "]";
+ counter-increment: sectioncounter;
+}
+.footnote-list ol li+li {
+ margin-top: 0.5rem;
+}
+.footnote-text {
+ padding-left: 0.5em;
+}
+.navbar {
+ background-color: transparent;
+ font-size: 0.875rem;
+ box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+ -webkit-box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+}
+.navbar .navbar-brand {
+ color: var(--navbar-text-color);
+}
+.navbar .navbar-toggler .animated-icon span {
+ background-color: var(--navbar-text-color);
+}
+.navbar .nav-item .nav-link {
+ display: block;
+ color: var(--navbar-text-color);
+ transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out;
+}
+.navbar .nav-item .nav-link:hover {
+ color: var(--link-hover-color);
+}
+.navbar .nav-item .nav-link:focus {
+ color: var(--navbar-text-color);
+}
+.navbar .nav-item .nav-link i {
+ font-size: 0.875rem;
+}
+.navbar .nav-item .nav-link i:only-child {
+ margin: 0 0.2rem;
+}
+.navbar .navbar-toggler {
+ border-width: 0;
+ outline: 0;
+}
+.navbar.scrolling-navbar {
+ will-change: background, padding;
+ -webkit-transition: background 0.5s ease-in-out, padding 0.5s ease-in-out;
+ transition: background 0.5s ease-in-out, padding 0.5s ease-in-out;
+}
+@media (min-width: 600px) {
+ .navbar.scrolling-navbar {
+ padding-top: 12px;
+ padding-bottom: 12px;
+ }
+ .navbar.scrolling-navbar .navbar-nav > li {
+ -webkit-transition-duration: 1s;
+ transition-duration: 1s;
+ }
+}
+.navbar.scrolling-navbar.top-nav-collapse {
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.navbar .dropdown-menu {
+ font-size: 0.875rem;
+ color: var(--navbar-text-color);
+ background-color: rgba(0,0,0,0.3);
+ border: none;
+ min-width: 8rem;
+ -webkit-transition: background 0.5s ease-in-out, padding 0.5s ease-in-out;
+ transition: background 0.5s ease-in-out, padding 0.5s ease-in-out;
+}
+@media (max-width: 991.98px) {
+ .navbar .dropdown-menu {
+ text-align: center;
+ }
+}
+.navbar .dropdown-item {
+ color: var(--navbar-text-color);
+}
+.navbar .dropdown-item:hover,
+.navbar .dropdown-item:focus {
+ color: var(--link-hover-color);
+ background-color: rgba(0,0,0,0.1);
+}
+@media (min-width: 992px) {
+ .navbar .dropdown:hover > .dropdown-menu {
+ display: block;
+ }
+ .navbar .dropdown > .dropdown-toggle:active {
+ pointer-events: none;
+ }
+ .navbar .dropdown-menu {
+ top: 95%;
+ }
+}
+.navbar .animated-icon {
+ width: 30px;
+ height: 20px;
+ position: relative;
+ margin: 0;
+ -webkit-transform: rotate(0deg);
+ -moz-transform: rotate(0deg);
+ -o-transform: rotate(0deg);
+ transform: rotate(0deg);
+ -webkit-transition: 0.5s ease-in-out;
+ -moz-transition: 0.5s ease-in-out;
+ -o-transition: 0.5s ease-in-out;
+ transition: 0.5s ease-in-out;
+ cursor: pointer;
+}
+.navbar .animated-icon span {
+ display: block;
+ position: absolute;
+ height: 3px;
+ width: 100%;
+ border-radius: 9px;
+ opacity: 1;
+ left: 0;
+ -webkit-transform: rotate(0deg);
+ -moz-transform: rotate(0deg);
+ -o-transform: rotate(0deg);
+ transform: rotate(0deg);
+ -webkit-transition: 0.25s ease-in-out;
+ -moz-transition: 0.25s ease-in-out;
+ -o-transition: 0.25s ease-in-out;
+ transition: 0.25s ease-in-out;
+ background: #fff;
+}
+.navbar .animated-icon span:nth-child(1) {
+ top: 0;
+}
+.navbar .animated-icon span:nth-child(2) {
+ top: 10px;
+}
+.navbar .animated-icon span:nth-child(3) {
+ top: 20px;
+}
+.navbar .animated-icon.open span:nth-child(1) {
+ top: 11px;
+ -webkit-transform: rotate(135deg);
+ -moz-transform: rotate(135deg);
+ -o-transform: rotate(135deg);
+ transform: rotate(135deg);
+}
+.navbar .animated-icon.open span:nth-child(2) {
+ opacity: 0;
+ left: -60px;
+}
+.navbar .animated-icon.open span:nth-child(3) {
+ top: 11px;
+ -webkit-transform: rotate(-135deg);
+ -moz-transform: rotate(-135deg);
+ -o-transform: rotate(-135deg);
+ transform: rotate(-135deg);
+}
+.navbar .dropdown-collapse,
+.top-nav-collapse,
+.navbar-col-show {
+ background-color: var(--navbar-bg-color);
+}
+@media (max-width: 767px) {
+ .navbar {
+ font-size: 1rem;
+ line-height: 2.5rem;
+ }
+}
+.banner-text {
+ color: var(--subtitle-color);
+ max-width: calc(960px - 6rem);
+ width: 80%;
+ overflow-wrap: break-word;
+}
+.banner-text .typed-cursor {
+ margin: 0 0.2rem;
+}
+@media (max-width: 767px) {
+ #subtitle,
+ .typed-cursor {
+ font-size: 1.5rem;
+ }
+}
+@media (max-width: 575px) {
+ .banner-text {
+ font-size: 0.9rem;
+ }
+ #subtitle,
+ .typed-cursor {
+ font-size: 1.35rem;
+ }
+}
+.modal-dialog .modal-content {
+ background-color: var(--board-bg-color);
+ border: 0;
+ border-radius: 0.125rem;
+ -webkit-box-shadow: 0 5px 11px 0 rgba(0,0,0,0.18), 0 4px 15px 0 rgba(0,0,0,0.15);
+ box-shadow: 0 5px 11px 0 rgba(0,0,0,0.18), 0 4px 15px 0 rgba(0,0,0,0.15);
+}
+.modal-dialog .modal-content .modal-header {
+ border-bottom-color: var(--line-color);
+ transition: border-bottom-color 0.2s ease-in-out;
+}
+.close {
+ color: var(--text-color);
+}
+.close:hover {
+ color: var(--link-hover-color);
+}
+.close:focus {
+ outline: 0;
+}
+.modal-dialog .modal-content .modal-header {
+ border-top-left-radius: 0.125rem;
+ border-top-right-radius: 0.125rem;
+ border-bottom: 1px solid #dee2e6;
+}
+.md-form {
+ position: relative;
+ margin-top: 1.5rem;
+ margin-bottom: 1.5rem;
+}
+.md-form input[type] {
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+ background-color: transparent;
+ border: none;
+ border-bottom: 1px solid #ced4da;
+ border-radius: 0;
+ outline: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
+}
+.md-form input[type]:focus:not([readonly]) {
+ border-bottom: 1px solid #4285f4;
+ -webkit-box-shadow: 0 1px 0 0 #4285f4;
+ box-shadow: 0 1px 0 0 #4285f4;
+}
+.md-form input[type]:focus:not([readonly]) + label {
+ color: #4285f4;
+}
+.md-form input[type].valid,
+.md-form input[type]:focus.valid {
+ border-bottom: 1px solid #00c851;
+ -webkit-box-shadow: 0 1px 0 0 #00c851;
+ box-shadow: 0 1px 0 0 #00c851;
+}
+.md-form input[type].valid + label,
+.md-form input[type]:focus.valid + label {
+ color: #00c851;
+}
+.md-form input[type].invalid,
+.md-form input[type]:focus.invalid {
+ border-bottom: 1px solid #f44336;
+ -webkit-box-shadow: 0 1px 0 0 #f44336;
+ box-shadow: 0 1px 0 0 #f44336;
+}
+.md-form input[type].invalid + label,
+.md-form input[type]:focus.invalid + label {
+ color: #f44336;
+}
+.md-form input[type].validate {
+ margin-bottom: 2.5rem;
+}
+.md-form input[type].form-control {
+ height: auto;
+ padding: 0.6rem 0 0.4rem 0;
+ margin: 0 0 0.5rem 0;
+ color: var(--text-color);
+ background-color: transparent;
+ border-radius: 0;
+}
+.md-form label {
+ font-size: 0.8rem;
+ position: absolute;
+ top: -1rem;
+ left: 0;
+ color: #757575;
+ cursor: text;
+ transition: color 0.2s ease-out;
+}
+.modal-open[style] {
+ padding-right: 0 !important;
+ overflow: auto;
+}
+.modal-open[style] #navbar[style] {
+ padding-right: 1rem !important;
+}
+#nprogress .bar {
+ height: 3px !important;
+ background-color: #29d !important;
+}
+#nprogress .peg {
+ box-shadow: 0 0 14px #29d, 0 0 8px #29d !important;
+}
+@media (max-width: 575px) {
+ #nprogress .bar {
+ display: none;
+ }
+}
+.noscript-warning {
+ background-color: #f55;
+ color: #fff;
+ font-family: sans-serif;
+ font-size: 1rem;
+ font-weight: bold;
+ position: fixed;
+ left: 0;
+ bottom: 0;
+ text-align: center;
+ width: 100%;
+ z-index: 99;
+}
+.pagination {
+ margin-top: 3rem;
+ justify-content: center;
+}
+.pagination .space {
+ align-self: flex-end;
+}
+.pagination .page-number,
+.pagination .current,
+.pagination .extend {
+ outline: 0;
+ border: 0;
+ background-color: transparent;
+ font-size: 0.9rem;
+ padding: 0.5rem 0.75rem;
+ line-height: 1.25;
+ border-radius: 0.125rem;
+}
+.pagination .page-number {
+ margin: 0 0.05rem;
+}
+.pagination .page-number:hover,
+.pagination .current {
+ transition: background-color 0.2s ease-in-out;
+ background-color: var(--link-hover-bg-color);
+}
+.qr-trigger {
+ cursor: pointer;
+ position: relative;
+}
+.qr-trigger:hover .qr-img {
+ display: block;
+ transition: all 0.3s;
+}
+.qr-img {
+ max-width: 12rem;
+ position: absolute;
+ right: -5.25rem;
+ z-index: 99;
+ display: none;
+ border-radius: 0.2rem;
+ background-color: transparent;
+ box-shadow: 0 0 20px -5px rgba(158,158,158,0.2);
+}
+.scroll-down-bar {
+ position: absolute;
+ width: 100%;
+ height: 6rem;
+ text-align: center;
+ cursor: pointer;
+ bottom: 0;
+}
+.scroll-down-bar i.iconfont {
+ font-size: 2rem;
+ font-weight: bold;
+ display: inline-block;
+ position: relative;
+ padding-top: 2rem;
+ color: var(--subtitle-color);
+ transform: translateZ(0);
+ animation: scroll-down 1.5s infinite;
+}
+#scroll-top-button {
+ position: fixed;
+ z-index: 99;
+ background: var(--board-bg-color);
+ transition: background-color 0.2s ease-in-out, bottom 0.3s ease;
+ border-radius: 4px;
+ min-width: 40px;
+ min-height: 40px;
+ bottom: -60px;
+ outline: none;
+ display: flex;
+ display: -webkit-flex;
+ align-items: center;
+ box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+}
+#scroll-top-button i {
+ font-size: 32px;
+ margin: auto;
+ color: var(--sec-text-color);
+}
+#scroll-top-button:hover i,
+#scroll-top-button:active i {
+ animation-name: scroll-top;
+ animation-duration: 1s;
+ animation-delay: 0.1s;
+ animation-timing-function: ease-in-out;
+ animation-iteration-count: infinite;
+ animation-fill-mode: forwards;
+ animation-direction: alternate;
+}
+#local-search-result .search-list-title {
+ border-left: 3px solid #0d47a1;
+}
+#local-search-result .search-list-content {
+ padding: 0 1.25rem;
+}
+#local-search-result .search-word {
+ color: #ff4500;
+}
+#toc {
+ visibility: hidden;
+}
+.toc-header {
+ margin-bottom: 0.5rem;
+ font-weight: bold;
+ line-height: 1.2;
+}
+.toc-header,
+.toc-header > i {
+ font-size: 1.25rem;
+}
+.toc-body {
+ max-height: 75vh;
+ overflow-y: auto;
+ overflow: -moz-scrollbars-none;
+ -ms-overflow-style: none;
+}
+.toc-body ol {
+ list-style: none;
+ padding-inline-start: 1rem;
+}
+.toc-body::-webkit-scrollbar {
+ display: none;
+}
+.tocbot-list {
+ position: relative;
+}
+.tocbot-list ol {
+ list-style: none;
+ padding-left: 1rem;
+}
+.tocbot-list a {
+ font-size: 0.95rem;
+}
+.tocbot-link {
+ color: var(--text-color);
+}
+.tocbot-active-link {
+ font-weight: bold;
+ color: var(--link-hover-color);
+}
+.tocbot-is-collapsed {
+ max-height: 0;
+}
+.tocbot-is-collapsible {
+ overflow: hidden;
+ transition: all 0.3s ease-in-out;
+}
+.toc-list-item {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.toc-list-item.is-active-li::before {
+ height: 1rem;
+ margin: 0.25rem 0;
+ visibility: visible;
+}
+.toc-list-item::before {
+ width: 0.15rem;
+ height: 0.2rem;
+ position: absolute;
+ left: 0.25rem;
+ content: "";
+ border-radius: 2px;
+ margin: 0.65rem 0;
+ background: var(--link-hover-color);
+ visibility: hidden;
+ transition: height 0.1s ease-in-out, margin 0.1s ease-in-out, visibility 0.1s ease-in-out;
+}
+.sidebar {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 2rem;
+ padding: 3rem 0;
+}
+html {
+ font-size: 16px;
+ letter-spacing: 0.02em;
+}
+html,
+body {
+ height: 100%;
+ font-family: AlibabaPuHuiTi-3-55-Regular,sans-serif,Microsoft YaHei,-apple-system,Apple Color Emoji,monospace,Segoe UI,Segoe UI Emoji;
+ overflow-wrap: break-word;
+}
+body {
+ transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out;
+ background-color: var(--body-bg-color);
+ color: var(--text-color);
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+body a {
+ color: var(--text-color);
+ text-decoration: none;
+ cursor: pointer;
+ transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out;
+}
+body a:hover {
+ color: var(--link-hover-color);
+ text-decoration: none;
+ transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out;
+}
+code {
+ color: inherit;
+}
+table {
+ font-size: inherit;
+ color: var(--post-text-color);
+}
+img[lazyload] {
+ object-fit: cover;
+}
+*[align="left"] {
+ text-align: left;
+}
+*[align="center"] {
+ text-align: center;
+}
+*[align="right"] {
+ text-align: right;
+}
+::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
+}
+::-webkit-scrollbar-thumb {
+ background-color: var(--scrollbar-color);
+ border-radius: 6px;
+}
+::-webkit-scrollbar-thumb:hover {
+ background-color: var(--scrollbar-hover-color);
+}
+::-webkit-scrollbar-corner {
+ background-color: transparent;
+}
+label {
+ margin-bottom: 0;
+}
+i.iconfont {
+ font-size: 1em;
+ line-height: 1;
+}
+:root {
+ --color-mode: "light";
+ --body-bg-color: #eee;
+ --board-bg-color: #fff;
+ --text-color: #3c4858;
+ --sec-text-color: #718096;
+ --post-text-color: #2c3e50;
+ --post-heading-color: #1a202c;
+ --post-link-color: #0366d6;
+ --link-hover-color: #30a9de;
+ --link-hover-bg-color: #f8f9fa;
+ --line-color: #eaecef;
+ --navbar-bg-color: #2f4154;
+ --navbar-text-color: #fff;
+ --subtitle-color: #fff;
+ --scrollbar-color: #c4c6c9;
+ --scrollbar-hover-color: #a6a6a6;
+ --button-bg-color: transparent;
+ --button-hover-bg-color: #f2f3f5;
+ --highlight-bg-color: #f6f8fa;
+ --inlinecode-bg-color: rgba(175,184,193,0.2);
+ --fold-title-color: #3c4858;
+ --fold-border-color: #eaecef;
+}
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-mode: "dark";
+ }
+ :root:not([data-user-color-scheme]) {
+ --body-bg-color: #181c27;
+ --board-bg-color: #252d38;
+ --text-color: #c4c6c9;
+ --sec-text-color: #a7a9ad;
+ --post-text-color: #c4c6c9;
+ --post-heading-color: #c4c6c9;
+ --post-link-color: #1589e9;
+ --link-hover-color: #30a9de;
+ --link-hover-bg-color: #364151;
+ --line-color: #435266;
+ --navbar-bg-color: #1f3144;
+ --navbar-text-color: #d0d0d0;
+ --subtitle-color: #d0d0d0;
+ --scrollbar-color: #687582;
+ --scrollbar-hover-color: #9da8b3;
+ --button-bg-color: transparent;
+ --button-hover-bg-color: #46647e;
+ --highlight-bg-color: #0d1117;
+ --inlinecode-bg-color: rgba(99,110,123,0.4);
+ --fold-title-color: #c4c6c9;
+ --fold-border-color: #435266;
+ }
+ :root:not([data-user-color-scheme]) img {
+ -webkit-filter: brightness(0.9);
+ filter: brightness(0.9);
+ transition: filter 0.2s ease-in-out;
+ }
+ :root:not([data-user-color-scheme]) .license-box {
+ background-color: rgba(62,75,94,0.35);
+ transition: background-color 0.2s ease-in-out;
+ }
+ :root:not([data-user-color-scheme]) .gt-comment-admin .gt-comment-content {
+ background-color: transparent;
+ transition: background-color 0.2s ease-in-out;
+ }
+}
+@media not print {
+ [data-user-color-scheme="dark"] {
+ --body-bg-color: #181c27;
+ --board-bg-color: #252d38;
+ --text-color: #c4c6c9;
+ --sec-text-color: #a7a9ad;
+ --post-text-color: #c4c6c9;
+ --post-heading-color: #c4c6c9;
+ --post-link-color: #1589e9;
+ --link-hover-color: #30a9de;
+ --link-hover-bg-color: #364151;
+ --line-color: #435266;
+ --navbar-bg-color: #1f3144;
+ --navbar-text-color: #d0d0d0;
+ --subtitle-color: #d0d0d0;
+ --scrollbar-color: #687582;
+ --scrollbar-hover-color: #9da8b3;
+ --button-bg-color: transparent;
+ --button-hover-bg-color: #46647e;
+ --highlight-bg-color: #0d1117;
+ --inlinecode-bg-color: rgba(99,110,123,0.4);
+ --fold-title-color: #c4c6c9;
+ --fold-border-color: #435266;
+ }
+ [data-user-color-scheme="dark"] img {
+ -webkit-filter: brightness(0.9);
+ filter: brightness(0.9);
+ transition: filter 0.2s ease-in-out;
+ }
+ [data-user-color-scheme="dark"] .license-box {
+ background-color: rgba(62,75,94,0.35);
+ transition: background-color 0.2s ease-in-out;
+ }
+ [data-user-color-scheme="dark"] .gt-comment-admin .gt-comment-content {
+ background-color: transparent;
+ transition: background-color 0.2s ease-in-out;
+ }
+}
+@media print {
+ :root {
+ --color-mode: "light";
+ }
+}
+.fade-in-up {
+ -webkit-animation-name: fade-in-up;
+ animation-name: fade-in-up;
+}
+.hidden-mobile {
+ display: block;
+}
+.visible-mobile {
+ display: none;
+}
+@media (max-width: 575px) {
+ .hidden-mobile {
+ display: none;
+ }
+ .visible-mobile {
+ display: block;
+ }
+}
+.nomargin-x {
+ margin-left: 0 !important;
+ margin-right: 0 !important;
+}
+.nopadding-x {
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+}
+@media (max-width: 767px) {
+ .nopadding-x-md {
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+ }
+}
+.flex-center {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ height: 100%;
+}
+.hover-with-bg {
+ display: inline-block;
+ line-height: 1;
+}
+.hover-with-bg:hover {
+ background-color: var(--link-hover-bg-color);
+ transition-duration: 0.2s;
+ transition-timing-function: ease-in-out;
+ border-radius: 0.2rem;
+}
+@-moz-keyframes fade-in-up {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+@-webkit-keyframes fade-in-up {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+@-o-keyframes fade-in-up {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+@keyframes fade-in-up {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+@-moz-keyframes scroll-down {
+ 0% {
+ opacity: 0.8;
+ top: 0;
+ }
+ 50% {
+ opacity: 0.4;
+ top: -1em;
+ }
+ 100% {
+ opacity: 0.8;
+ top: 0;
+ }
+}
+@-webkit-keyframes scroll-down {
+ 0% {
+ opacity: 0.8;
+ top: 0;
+ }
+ 50% {
+ opacity: 0.4;
+ top: -1em;
+ }
+ 100% {
+ opacity: 0.8;
+ top: 0;
+ }
+}
+@-o-keyframes scroll-down {
+ 0% {
+ opacity: 0.8;
+ top: 0;
+ }
+ 50% {
+ opacity: 0.4;
+ top: -1em;
+ }
+ 100% {
+ opacity: 0.8;
+ top: 0;
+ }
+}
+@keyframes scroll-down {
+ 0% {
+ opacity: 0.8;
+ top: 0;
+ }
+ 50% {
+ opacity: 0.4;
+ top: -1em;
+ }
+ 100% {
+ opacity: 0.8;
+ top: 0;
+ }
+}
+@-moz-keyframes scroll-top {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+ 50% {
+ -webkit-transform: translateY(-0.35rem);
+ transform: translateY(-0.35rem);
+ }
+ 100% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+@-webkit-keyframes scroll-top {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+ 50% {
+ -webkit-transform: translateY(-0.35rem);
+ transform: translateY(-0.35rem);
+ }
+ 100% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+@-o-keyframes scroll-top {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+ 50% {
+ -webkit-transform: translateY(-0.35rem);
+ transform: translateY(-0.35rem);
+ }
+ 100% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+@keyframes scroll-top {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+ 50% {
+ -webkit-transform: translateY(-0.35rem);
+ transform: translateY(-0.35rem);
+ }
+ 100% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+@media print {
+ header,
+ footer,
+ .side-col,
+ #scroll-top-button,
+ .post-prevnext,
+ #comments {
+ display: none !important;
+ }
+ .markdown-body a:not([href^='#']):not([href^='javascript:']):not(.print-no-link)::after {
+ content: ' (' attr(href) ')';
+ font-size: 0.8rem;
+ color: var(--post-text-color);
+ opacity: 0.8;
+ }
+ .markdown-body > h1,
+ .markdown-body h2 {
+ border-bottom-color: transparent !important;
+ }
+ .markdown-body > h1,
+ .markdown-body h2,
+ .markdown-body h3,
+ .markdown-body h4,
+ .markdown-body h5,
+ .markdown-body h6 {
+ margin-top: 1.25em !important;
+ margin-bottom: 0.25em !important;
+ }
+ .markdown-body [data-anchorjs-icon]::after {
+ display: none;
+ }
+ .markdown-body figure.highlight table,
+ .markdown-body figure.highlight tbody,
+ .markdown-body figure.highlight tr,
+ .markdown-body figure.highlight td.code,
+ .markdown-body figure.highlight td.code pre {
+ width: 100% !important;
+ display: block !important;
+ }
+ .markdown-body figure.highlight pre > code {
+ white-space: pre-wrap;
+ }
+ .markdown-body figure.highlight .gutter,
+ .markdown-body figure.highlight .code-widget {
+ display: none !important;
+ }
+ .post-metas a {
+ text-decoration: none;
+ }
+}
+@media not print {
+ #seo-header {
+ display: none;
+ }
+}
+.index-card {
+ margin-bottom: 2.5rem;
+}
+.index-img img {
+ display: block;
+ width: 100%;
+ height: 10rem;
+ object-fit: cover;
+ box-shadow: 0 5px 11px 0 rgba(0,0,0,0.18), 0 4px 15px 0 rgba(0,0,0,0.15);
+ border-radius: 0.25rem;
+ background-color: transparent;
+}
+.index-info {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+.index-header {
+ color: var(--text-color);
+ font-size: 1.5rem;
+ font-weight: bold;
+ line-height: 1.4;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ margin-bottom: 0.25rem;
+}
+.index-header .index-pin {
+ color: var(--text-color);
+ font-size: 1.5rem;
+ margin-right: 0.15rem;
+}
+.index-btm {
+ color: var(--sec-text-color);
+}
+.index-btm a {
+ color: var(--sec-text-color);
+}
+.index-excerpt {
+ color: var(--sec-text-color);
+ margin: 0.5rem 0;
+ height: calc(1.4rem * 3);
+ overflow: hidden;
+ display: flex;
+}
+.index-excerpt > div {
+ width: 100%;
+ line-height: 1.4rem;
+ word-break: break-word;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 3;
+}
+.index-excerpt__noimg {
+ height: auto;
+ max-height: calc(1.4rem * 3);
+}
+@media (max-width: 767px) {
+ .index-info {
+ padding-top: 1.25rem;
+ }
+ .index-header {
+ font-size: 1.25rem;
+ white-space: normal;
+ overflow: hidden;
+ word-break: break-word;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ }
+ .index-header .index-pin {
+ font-size: 1.25rem;
+ }
+ .index-excerpt {
+ height: auto;
+ max-height: calc(1.4rem * 3);
+ margin: 0.25rem 0;
+ }
+}
+#valine.v[data-class=v] .status-bar,
+#valine.v[data-class=v] .veditor,
+#valine.v[data-class=v] .vinput,
+#valine.v[data-class=v] .vbtn,
+#valine.v[data-class=v] p,
+#valine.v[data-class=v] pre code {
+ color: var(--text-color);
+}
+#valine.v[data-class=v] .vinput::placeholder {
+ color: var(--sec-text-color);
+}
+#valine.v[data-class=v] .vicon {
+ fill: var(--text-color);
+}
+.gt-container .gt-comment-content:hover {
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.gt-container .gt-comment-body {
+ color: var(--text-color) !important;
+ transition: color 0.2s ease-in-out;
+}
+#remark-km423lmfdslkm34-back {
+ z-index: 1030;
+}
+#remark-km423lmfdslkm34-node {
+ z-index: 1031;
+}
+.markdown-body .highlight pre,
+.markdown-body pre {
+ padding: 1.45rem 1rem;
+}
+.markdown-body pre code.hljs {
+ padding: 0;
+}
+.markdown-body pre[class*="language-"] {
+ padding-top: 1.45rem;
+ padding-bottom: 1.45rem;
+ padding-right: 1rem;
+ line-height: 1.5;
+ margin-bottom: 1rem;
+}
+.markdown-body .code-wrapper {
+ position: relative;
+ border-radius: 4px;
+ margin-bottom: 1rem;
+}
+.markdown-body .hljs,
+.markdown-body .highlight pre,
+.markdown-body .code-wrapper pre,
+.markdown-body figure.highlight td.gutter {
+ transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out;
+ background-color: var(--highlight-bg-color);
+}
+pre[class*=language-].line-numbers {
+ position: initial;
+}
+figure {
+ margin: 1rem 0;
+}
+figure.highlight {
+ position: relative;
+}
+figure.highlight table {
+ border: 0;
+ margin: 0;
+ width: auto;
+ border-radius: 4px;
+}
+figure.highlight td {
+ border: 0;
+ padding: 0;
+}
+figure.highlight tr {
+ border: 0;
+}
+figure.highlight td.code {
+ width: 100%;
+}
+figure.highlight td.gutter {
+ display: table-cell;
+ position: -webkit-sticky;
+ position: sticky;
+ left: 0;
+ z-index: 1;
+}
+figure.highlight td.gutter pre {
+ text-align: right;
+ padding: 0 0.75rem;
+ border-radius: initial;
+ border-right: 1px solid #999;
+}
+figure.highlight td.gutter pre span.line {
+ color: #999;
+}
+figure.highlight td.code > pre {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.markdown-body {
+ font-size: 1rem;
+ line-height: 1.6;
+ font-family: AlibabaPuHuiTi-3-55-Regular,sans-serif,Microsoft YaHei,-apple-system,Apple Color Emoji,monospace,Segoe UI,Segoe UI Emoji;
+ margin-bottom: 2rem;
+ color: var(--post-text-color);
+}
+.markdown-body > h1,
+.markdown-body h2 {
+ border-bottom-color: var(--line-color);
+}
+.markdown-body > h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+ color: var(--post-heading-color);
+ transition: color 0.2s ease-in-out, border-bottom-color 0.2s ease-in-out;
+ font-weight: bold;
+ margin-bottom: 0.75em;
+ margin-top: 2em;
+}
+.markdown-body > h1::before,
+.markdown-body h2::before,
+.markdown-body h3::before,
+.markdown-body h4::before,
+.markdown-body h5::before,
+.markdown-body h6::before {
+ display: block;
+ content: "";
+ margin-top: -5rem;
+ height: 5rem;
+ width: 1px;
+ visibility: hidden;
+}
+.markdown-body > h1:focus,
+.markdown-body h2:focus,
+.markdown-body h3:focus,
+.markdown-body h4:focus,
+.markdown-body h5:focus,
+.markdown-body h6:focus {
+ outline: none;
+}
+.markdown-body a {
+ color: var(--post-link-color);
+}
+.markdown-body strong {
+ font-weight: bold;
+}
+.markdown-body code {
+ tab-size: 4;
+ background-color: var(--inlinecode-bg-color);
+ transition: background-color 0.2s ease-in-out;
+}
+.markdown-body table tr {
+ background-color: var(--board-bg-color);
+ transition: background-color 0.2s ease-in-out;
+}
+.markdown-body table tr:nth-child(2n) {
+ background-color: var(--board-bg-color);
+ transition: background-color 0.2s ease-in-out;
+}
+.markdown-body table th,
+.markdown-body table td {
+ border-color: var(--line-color);
+ transition: border-color 0.2s ease-in-out;
+}
+.markdown-body pre {
+ font-size: 85% !important;
+}
+.markdown-body pre .mermaid {
+ text-align: center;
+}
+.markdown-body pre .mermaid > svg {
+ min-width: 100%;
+}
+.markdown-body p > img,
+.markdown-body p > a > img,
+.markdown-body figure > img,
+.markdown-body figure > a > img {
+ max-width: 90%;
+ margin: 1.5rem auto;
+ display: block;
+ box-shadow: 0 5px 11px 0 rgba(0,0,0,0.18), 0 4px 15px 0 rgba(0,0,0,0.15);
+ border-radius: 4px;
+ background-color: transparent;
+}
+.markdown-body blockquote {
+ color: var(--sec-text-color);
+}
+.markdown-body details {
+ cursor: pointer;
+}
+.markdown-body details summary {
+ outline: none;
+}
+hr,
+.markdown-body hr {
+ background-color: initial;
+ border-top: 1px solid var(--line-color);
+ transition: border-top-color 0.2s ease-in-out;
+}
+.markdown-body hr {
+ height: 0;
+ margin: 2rem 0;
+}
+.markdown-body figcaption.image-caption {
+ font-size: 0.8rem;
+ color: var(--post-text-color);
+ opacity: 0.65;
+ line-height: 1;
+ margin: -0.75rem auto 2rem;
+ text-align: center;
+}
+.markdown-body figcaption:not(.image-caption) {
+ display: none;
+}
+.post-content,
+post-custom {
+ box-sizing: border-box;
+ padding-left: 10%;
+ padding-right: 10%;
+}
+@media (max-width: 767px) {
+ .post-content,
+ post-custom {
+ padding-left: 2rem;
+ padding-right: 2rem;
+ }
+}
+@media (max-width: 424px) {
+ .post-content,
+ post-custom {
+ padding-left: 1rem;
+ padding-right: 1rem;
+ }
+ .anchorjs-link-left {
+ opacity: 0 !important;
+ }
+}
+.page-content strong,
+.post-content strong {
+ font-weight: bold;
+}
+.page-content > *:nth-child(2),
+.post-content > *:nth-child(2) {
+ margin-top: 0;
+}
+.page-content img,
+.post-content img {
+ object-fit: cover;
+ max-width: 100%;
+}
+@media (max-width: 767px) {
+ .page-content,
+ .post-content {
+ overflow-x: hidden;
+ }
+}
+.post-metas {
+ display: flex;
+ flex-wrap: wrap;
+ font-size: 0.9rem;
+}
+.post-meta > *:not(.hover-with-bg) {
+ margin-right: 0.2rem;
+}
+.post-prevnext {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ font-size: 0.9rem;
+ margin-left: -0.35rem;
+ margin-right: -0.35rem;
+}
+.post-prevnext .post-prev,
+.post-prevnext .post-next {
+ display: flex;
+ padding-left: 0;
+ padding-right: 0;
+}
+.post-prevnext .post-prev i,
+.post-prevnext .post-next i {
+ font-size: 1.5rem;
+}
+.post-prevnext .post-prev a,
+.post-prevnext .post-next a {
+ display: flex;
+ align-items: center;
+}
+.post-prevnext .post-prev .hidden-mobile,
+.post-prevnext .post-next .hidden-mobile {
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+@media (max-width: 575px) {
+ .post-prevnext .post-prev .hidden-mobile,
+ .post-prevnext .post-next .hidden-mobile {
+ display: none;
+ }
+}
+.post-prevnext .post-prev:hover i,
+.post-prevnext .post-prev:active i,
+.post-prevnext .post-next:hover i,
+.post-prevnext .post-next:active i {
+ -webkit-animation-duration: 1s;
+ animation-duration: 1s;
+ -webkit-animation-delay: 0.1s;
+ animation-delay: 0.1s;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ -webkit-animation-iteration-count: infinite;
+ animation-iteration-count: infinite;
+ -webkit-animation-fill-mode: forwards;
+ animation-fill-mode: forwards;
+ -webkit-animation-direction: alternate;
+ animation-direction: alternate;
+}
+.post-prevnext .post-prev:hover i,
+.post-prevnext .post-prev:active i {
+ -webkit-animation-name: post-prev-anim;
+ animation-name: post-prev-anim;
+}
+.post-prevnext .post-next:hover i,
+.post-prevnext .post-next:active i {
+ -webkit-animation-name: post-next-anim;
+ animation-name: post-next-anim;
+}
+.post-prevnext .post-next {
+ justify-content: flex-end;
+}
+.post-prevnext .fa-chevron-left {
+ margin-right: 0.5rem;
+}
+.post-prevnext .fa-chevron-right {
+ margin-left: 0.5rem;
+}
+#seo-header {
+ color: var(--post-heading-color);
+ font-weight: bold;
+ margin-top: 0.5em;
+ margin-bottom: 0.75em;
+ border-bottom-color: var(--line-color);
+ border-bottom-style: solid;
+ border-bottom-width: 2px;
+ line-height: 1.5;
+}
+.custom,
+#comments {
+ margin-top: 2rem;
+}
+#comments noscript {
+ display: block;
+ text-align: center;
+ padding: 2rem 0;
+}
+.visitors {
+ font-size: 0.8em;
+ padding: 0.45rem;
+ float: right;
+}
+a.fancybox:hover {
+ text-decoration: none;
+}
+mjx-container,
+.mjx-container {
+ overflow-x: auto;
+ overflow-y: hidden !important;
+ padding: 0.5em 0;
+}
+mjx-container:focus,
+.mjx-container:focus,
+mjx-container svg:focus,
+.mjx-container svg:focus {
+ outline: none;
+}
+.mjx-char {
+ line-height: 1;
+}
+.katex-block {
+ overflow-x: auto;
+}
+.katex,
+.mjx-mrow {
+ white-space: pre-wrap !important;
+}
+.footnote-ref [class*=hint--][aria-label]:after {
+ max-width: 12rem;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+@-moz-keyframes post-prev-anim {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+ 50% {
+ -webkit-transform: translateX(-0.35rem);
+ transform: translateX(-0.35rem);
+ }
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+@-webkit-keyframes post-prev-anim {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+ 50% {
+ -webkit-transform: translateX(-0.35rem);
+ transform: translateX(-0.35rem);
+ }
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+@-o-keyframes post-prev-anim {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+ 50% {
+ -webkit-transform: translateX(-0.35rem);
+ transform: translateX(-0.35rem);
+ }
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+@keyframes post-prev-anim {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+ 50% {
+ -webkit-transform: translateX(-0.35rem);
+ transform: translateX(-0.35rem);
+ }
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+@-moz-keyframes post-next-anim {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+ 50% {
+ -webkit-transform: translateX(0.35rem);
+ transform: translateX(0.35rem);
+ }
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+@-webkit-keyframes post-next-anim {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+ 50% {
+ -webkit-transform: translateX(0.35rem);
+ transform: translateX(0.35rem);
+ }
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+@-o-keyframes post-next-anim {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+ 50% {
+ -webkit-transform: translateX(0.35rem);
+ transform: translateX(0.35rem);
+ }
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+@keyframes post-next-anim {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+ 50% {
+ -webkit-transform: translateX(0.35rem);
+ transform: translateX(0.35rem);
+ }
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+.fold {
+ margin: 1rem 0;
+ border: 0.5px solid var(--fold-border-color);
+ position: relative;
+ clear: both;
+ border-radius: 0.125rem;
+}
+.fold .fold-title {
+ color: var(--fold-title-color);
+ padding: 0.5rem 0.75rem;
+ font-size: 0.9rem;
+ font-weight: bold;
+ border-radius: 0.125rem;
+}
+.fold .fold-title:not(.collapsed) > .fold-arrow {
+ transform: rotate(90deg);
+ transform-origin: center center;
+}
+.fold .fold-title .fold-arrow {
+ display: inline-block;
+ margin-right: 0.35rem;
+ transition: transform 0.3s ease-out;
+}
+.fold .fold-content {
+ padding: 1rem 1rem;
+}
+.fold .fold-content > *:last-child {
+ margin-bottom: 0;
+}
+.fold-default,
+.fold-secondary {
+ background-color: rgba(187,187,187,0.25);
+}
+.fold-primary {
+ background-color: rgba(183,160,224,0.25);
+}
+.fold-info {
+ background-color: rgba(160,197,228,0.25);
+}
+.fold-success {
+ background-color: rgba(174,220,174,0.25);
+}
+.fold-warning {
+ background-color: rgba(248,214,166,0.25);
+}
+.fold-danger {
+ background-color: rgba(236,169,167,0.25);
+}
+.fold-light {
+ background-color: rgba(254,254,254,0.25);
+}
+.note {
+ padding: 0.75rem;
+ border-left: 0.35rem solid;
+ border-radius: 0.25rem;
+ margin: 1.5rem 0;
+ color: var(--text-color);
+ transition: color 0.2s ease-in-out;
+ font-size: 0.9rem;
+}
+.note a {
+ color: var(--text-color);
+ transition: color 0.2s ease-in-out;
+}
+.note *:last-child {
+ margin-bottom: 0;
+}
+.note-default,
+.note-secondary {
+ background-color: rgba(187,187,187,0.25);
+ border-color: #777;
+}
+.note-primary {
+ background-color: rgba(183,160,224,0.25);
+ border-color: #6f42c1;
+}
+.note-success {
+ background-color: rgba(174,220,174,0.25);
+ border-color: #5cb85c;
+}
+.note-danger {
+ background-color: rgba(236,169,167,0.25);
+ border-color: #d9534f;
+}
+.note-warning {
+ background-color: rgba(248,214,166,0.25);
+ border-color: #f0ad4e;
+}
+.note-info {
+ background-color: rgba(160,197,228,0.25);
+ border-color: #428bca;
+}
+.note-light {
+ background-color: rgba(254,254,254,0.25);
+ border-color: #0f0f0f;
+}
+.label {
+ display: inline;
+ border-radius: 3px;
+ font-size: 85%;
+ margin: 0;
+ padding: 0.2em 0.4em;
+ color: var(--text-color);
+ transition: color 0.2s ease-in-out;
+}
+.label-default,
+.label-secondary {
+ background-color: rgba(187,187,187,0.25);
+}
+.label-primary {
+ background-color: rgba(183,160,224,0.25);
+}
+.label-info {
+ background-color: rgba(160,197,228,0.25);
+}
+.label-success {
+ background-color: rgba(174,220,174,0.25);
+}
+.label-warning {
+ background-color: rgba(248,214,166,0.25);
+}
+.label-danger {
+ background-color: rgba(236,169,167,0.25);
+}
+.markdown-body .btn {
+ border: 1px solid var(--line-color);
+ background-color: var(--button-bg-color);
+ color: var(--text-color);
+ transition: color 0.2s ease-in-out, background 0.2s ease-in-out, border-color 0.2s ease-in-out;
+ border-radius: 0.25rem;
+ display: inline-block;
+ font-size: 0.875em;
+ line-height: 2;
+ padding: 0 0.75rem;
+ margin-bottom: 1rem;
+}
+.markdown-body .btn:hover {
+ background-color: var(--button-hover-bg-color);
+ text-decoration: none;
+}
+.group-image-container {
+ margin: 1.5rem auto;
+}
+.group-image-container img {
+ margin: 0 auto;
+ border-radius: 3px;
+ background-color: transparent;
+ box-shadow: 0 3px 9px 0 rgba(0,0,0,0.15), 0 3px 9px 0 rgba(0,0,0,0.15);
+}
+.group-image-row {
+ margin-bottom: 0.5rem;
+ display: flex;
+ justify-content: center;
+}
+.group-image-wrap {
+ flex: 1;
+ display: flex;
+ justify-content: center;
+}
+.group-image-wrap:not(:last-child) {
+ margin-right: 0.25rem;
+}
+input[type=checkbox] {
+ margin: 0 0.2em 0.2em 0;
+ vertical-align: middle;
+}
+.list-group a ~ p.h5 {
+ margin-top: 1rem;
+}
+.list-group-item {
+ display: flex;
+ background-color: transparent;
+ border: 0;
+}
+.list-group-item time {
+ flex: 0 0 5rem;
+}
+.list-group-item .list-group-item-title {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+@media (max-width: 575px) {
+ .list-group-item {
+ font-size: 0.95rem;
+ padding: 0.5rem 0.75rem;
+ }
+ .list-group-item time {
+ flex: 0 0 4rem;
+ }
+}
+.list-group-item-action {
+ color: var(--text-color);
+}
+.list-group-item-action:focus,
+.list-group-item-action:hover {
+ color: var(--link-hover-color);
+ background-color: var(--link-hover-bg-color);
+}
+.about-avatar {
+ position: relative;
+ margin: -8rem auto 1rem;
+ width: 10rem;
+ height: 10rem;
+ z-index: 3;
+}
+.about-avatar img {
+ width: 100%;
+ height: 100%;
+ border-radius: 50%;
+ background-color: transparent;
+ object-fit: cover;
+ box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+}
+.about-info > div {
+ margin-bottom: 0.5rem;
+}
+.about-name {
+ font-size: 1.75rem;
+ font-weight: bold;
+}
+.about-intro {
+ font-size: 1rem;
+}
+.about-icons > a:not(:last-child) {
+ margin-right: 0.5rem;
+}
+.about-icons > a > i {
+ font-size: 1.5rem;
+}
+.category-bar .category-list {
+ max-height: 85vh;
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+.category-bar .category-list::-webkit-scrollbar {
+ display: none;
+}
+.category-bar .category-list > .category-sub > a {
+ font-weight: bold;
+ font-size: 1.2rem;
+}
+.category-bar .category-list .category-item-action i {
+ margin: 0;
+}
+.category-bar .category-list .category-subitem.list-group-item {
+ padding-left: 0.5rem;
+ padding-right: 0;
+}
+.category-bar .category-list .category-collapse .category-post-list {
+ margin-top: 0.25rem;
+ margin-bottom: 0.5rem;
+}
+.category-bar .category-list .category-collapse .category-post {
+ font-size: 0.9rem;
+ line-height: 1.75;
+}
+.category-bar .category-list .category-item-action:hover {
+ background-color: initial;
+}
+.category-bar .list-group-item {
+ padding: 0;
+}
+.category-bar .list-group-item.active {
+ color: var(--link-hover-color);
+ background-color: initial;
+ font-weight: bold;
+ font-family: "iconfont";
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+}
+.category-bar .list-group-item.active::before {
+ content: "\e61f";
+ font-weight: initial;
+ margin-right: 0.25rem;
+}
+.category-bar .list-group-count {
+ margin-left: 0.2rem;
+ margin-right: 0.2rem;
+ font-size: 0.9em;
+}
+.category-bar .list-group-item-action:focus,
+.category-bar .list-group-item-action:hover {
+ background-color: initial;
+}
+.category-chains {
+ display: flex;
+ flex-wrap: wrap;
+}
+.category-chains > *:not(:last-child) {
+ margin-right: 1em;
+}
+.category:not(:last-child) {
+ margin-bottom: 1rem;
+}
+.category .category-item,
+.category .category-subitem {
+ font-weight: bold;
+ display: flex;
+ align-items: center;
+}
+.category .category-item {
+ font-size: 1.25rem;
+}
+.category .category-subitem {
+ font-size: 1.1rem;
+}
+.category .category-collapse {
+ padding-left: 1.25rem;
+ width: 100%;
+}
+.category .category-count {
+ font-size: 0.9rem;
+ font-weight: initial;
+ min-width: 1.3em;
+ line-height: 1.3em;
+ display: flex;
+ align-items: center;
+}
+.category .category-count i {
+ padding-right: 0.25rem;
+}
+.category .category-count span {
+ width: 2rem;
+}
+.category .category-post {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.category .category-item-action:not(.collapsed) > i {
+ transform: rotate(90deg);
+ transform-origin: center center;
+}
+.category .category-item-action i {
+ transition: transform 0.3s ease-out;
+ display: inline-block;
+ margin-left: 0.25rem;
+}
+.category .category-item-action .category:hover {
+ z-index: 1;
+ color: var(--link-hover-color);
+ text-decoration: none;
+ background-color: var(--link-hover-bg-color);
+}
+.category .row {
+ margin-left: 0;
+ margin-right: 0;
+}
+.tagcloud {
+ padding: 1rem 5%;
+}
+.tagcloud a {
+ display: inline-block;
+ padding: 0.5rem;
+}
+.tagcloud a:hover {
+ color: var(--link-hover-color) !important;
+}
+.links .card {
+ box-shadow: none;
+ min-width: 33%;
+ background-color: transparent;
+ border: 0;
+}
+.links .card-body {
+ margin: 1rem 0;
+ padding: 1rem;
+ border-radius: 0.3rem;
+ display: block;
+ width: 100%;
+ height: 100%;
+}
+.links .card-body:hover .link-avatar {
+ transform: scale(1.1);
+}
+.links .card-content {
+ display: flex;
+ flex-wrap: nowrap;
+ width: 100%;
+ height: 3.5rem;
+}
+.link-avatar {
+ flex: none;
+ width: 3rem;
+ height: 3rem;
+ margin-right: 0.75rem;
+ object-fit: cover;
+ transition-duration: 0.2s;
+ transition-timing-function: ease-in-out;
+}
+.link-avatar img {
+ width: 100%;
+ height: 100%;
+ border-radius: 50%;
+ background-color: transparent;
+ object-fit: cover;
+}
+.link-text {
+ flex: 1;
+ display: grid;
+ flex-direction: column;
+ line-height: 1.5;
+}
+.link-title {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ color: var(--text-color);
+ font-weight: bold;
+}
+.link-intro {
+ max-height: 2rem;
+ font-size: 0.85rem;
+ line-height: 1.2;
+ color: var(--sec-text-color);
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+@media (max-width: 767px) {
+ .links {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ }
+ .links .card {
+ padding-left: 2rem;
+ padding-right: 2rem;
+ }
+}
+@media (min-width: 768px) {
+ .link-text:only-child {
+ margin-left: 1rem;
+ }
+}
diff --git a/favicon.ico b/favicon.ico
new file mode 100644
index 0000000..05f4f75
Binary files /dev/null and b/favicon.ico differ
diff --git a/fonts/FontAwesome.otf b/fonts/FontAwesome.otf
new file mode 100644
index 0000000..401ec0f
Binary files /dev/null and b/fonts/FontAwesome.otf differ
diff --git a/fonts/fontawesome-webfont.eot b/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..e9f60ca
Binary files /dev/null and b/fonts/fontawesome-webfont.eot differ
diff --git a/fonts/fontawesome-webfont.svg b/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..855c845
--- /dev/null
+++ b/fonts/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+
+
+
+
+Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
+ By ,,,
+Copyright Dave Gandy 2016. All rights reserved.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fonts/fontawesome-webfont.ttf b/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..35acda2
Binary files /dev/null and b/fonts/fontawesome-webfont.ttf differ
diff --git a/fonts/fontawesome-webfont.woff b/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..400014a
Binary files /dev/null and b/fonts/fontawesome-webfont.woff differ
diff --git a/fonts/fontawesome-webfont.woff2 b/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..4d13fc6
Binary files /dev/null and b/fonts/fontawesome-webfont.woff2 differ
diff --git a/img/avatar.png b/img/avatar.png
new file mode 100644
index 0000000..ffd1c77
Binary files /dev/null and b/img/avatar.png differ
diff --git a/img/default.png b/img/default.png
new file mode 100644
index 0000000..2bc2cd7
Binary files /dev/null and b/img/default.png differ
diff --git a/img/fluid.png b/img/fluid.png
new file mode 100644
index 0000000..368a58a
Binary files /dev/null and b/img/fluid.png differ
diff --git a/img/loading.gif b/img/loading.gif
new file mode 100644
index 0000000..c5126ed
Binary files /dev/null and b/img/loading.gif differ
diff --git a/img/police_beian.png b/img/police_beian.png
new file mode 100644
index 0000000..60190da
Binary files /dev/null and b/img/police_beian.png differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..5fa111f
--- /dev/null
+++ b/index.html
@@ -0,0 +1,1164 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2023-08-04
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/js/boot.js b/js/boot.js
new file mode 100644
index 0000000..26c3a1a
--- /dev/null
+++ b/js/boot.js
@@ -0,0 +1,22 @@
+/* global Fluid */
+
+Fluid.boot = {};
+
+Fluid.boot.registerEvents = function() {
+ Fluid.events.billboard();
+ Fluid.events.registerNavbarEvent();
+ Fluid.events.registerParallaxEvent();
+ Fluid.events.registerScrollDownArrowEvent();
+ Fluid.events.registerScrollTopArrowEvent();
+ Fluid.events.registerImageLoadedEvent();
+};
+
+Fluid.boot.refresh = function() {
+ Fluid.plugins.fancyBox();
+ Fluid.plugins.codeWidget();
+ Fluid.events.refresh();
+};
+
+document.addEventListener('DOMContentLoaded', function() {
+ Fluid.boot.registerEvents();
+});
diff --git a/js/color-schema.js b/js/color-schema.js
new file mode 100644
index 0000000..5b1b75c
--- /dev/null
+++ b/js/color-schema.js
@@ -0,0 +1,286 @@
+/* global Fluid */
+
+/**
+ * Modified from https://blog.skk.moe/post/hello-darkmode-my-old-friend/
+ */
+(function(window, document) {
+ var rootElement = document.documentElement;
+ var colorSchemaStorageKey = 'Fluid_Color_Scheme';
+ var colorSchemaMediaQueryKey = '--color-mode';
+ var userColorSchemaAttributeName = 'data-user-color-scheme';
+ var defaultColorSchemaAttributeName = 'data-default-color-scheme';
+ var colorToggleButtonSelector = '#color-toggle-btn';
+ var colorToggleIconSelector = '#color-toggle-icon';
+ var iframeSelector = 'iframe';
+
+ function setLS(k, v) {
+ try {
+ localStorage.setItem(k, v);
+ } catch (e) {}
+ }
+
+ function removeLS(k) {
+ try {
+ localStorage.removeItem(k);
+ } catch (e) {}
+ }
+
+ function getLS(k) {
+ try {
+ return localStorage.getItem(k);
+ } catch (e) {
+ return null;
+ }
+ }
+
+ function getSchemaFromHTML() {
+ var res = rootElement.getAttribute(defaultColorSchemaAttributeName);
+ if (typeof res === 'string') {
+ return res.replace(/["'\s]/g, '');
+ }
+ return null;
+ }
+
+ function getSchemaFromCSSMediaQuery() {
+ var res = getComputedStyle(rootElement).getPropertyValue(
+ colorSchemaMediaQueryKey
+ );
+ if (typeof res === 'string') {
+ return res.replace(/["'\s]/g, '');
+ }
+ return null;
+ }
+
+ function resetSchemaAttributeAndLS() {
+ rootElement.setAttribute(userColorSchemaAttributeName, getDefaultColorSchema());
+ removeLS(colorSchemaStorageKey);
+ }
+
+ var validColorSchemaKeys = {
+ dark : true,
+ light: true
+ };
+
+ function getDefaultColorSchema() {
+ // 取默认字段的值
+ var schema = getSchemaFromHTML();
+ // 如果明确指定了 schema 则返回
+ if (validColorSchemaKeys[schema]) {
+ return schema;
+ }
+ // 默认优先按 prefers-color-scheme
+ schema = getSchemaFromCSSMediaQuery();
+ if (validColorSchemaKeys[schema]) {
+ return schema;
+ }
+ // 否则按本地时间是否大于 18 点或凌晨 0 ~ 6 点
+ var hours = new Date().getHours();
+ if (hours >= 18 || (hours >= 0 && hours <= 6)) {
+ return 'dark';
+ }
+ return 'light';
+ }
+
+ function applyCustomColorSchemaSettings(schema) {
+ // 接受从「开关」处传来的模式,或者从 localStorage 读取,否则按默认设置值
+ var current = schema || getLS(colorSchemaStorageKey) || getDefaultColorSchema();
+
+ if (current === getDefaultColorSchema()) {
+ // 当用户切换的显示模式和默认模式相同时,则恢复为自动模式
+ resetSchemaAttributeAndLS();
+ } else if (validColorSchemaKeys[current]) {
+ rootElement.setAttribute(
+ userColorSchemaAttributeName,
+ current
+ );
+ } else {
+ // 特殊情况重置
+ resetSchemaAttributeAndLS();
+ return;
+ }
+
+ // 根据当前模式设置图标
+ setButtonIcon(current);
+
+ // 设置代码高亮
+ setHighlightCSS(current);
+
+ // 设置其他应用
+ setApplications(current);
+ }
+
+ var invertColorSchemaObj = {
+ dark : 'light',
+ light: 'dark'
+ };
+
+ function getIconClass(scheme) {
+ return 'icon-' + scheme;
+ }
+
+ function toggleCustomColorSchema() {
+ var currentSetting = getLS(colorSchemaStorageKey);
+
+ if (validColorSchemaKeys[currentSetting]) {
+ // 从 localStorage 中读取模式,并取相反的模式
+ currentSetting = invertColorSchemaObj[currentSetting];
+ } else if (currentSetting === null) {
+ // 当 localStorage 中没有相关值,或者 localStorage 抛了 Error
+ // 先按照按钮的状态进行切换
+ var iconElement = document.querySelector(colorToggleIconSelector);
+ if (iconElement) {
+ currentSetting = iconElement.getAttribute('data');
+ }
+ if (!iconElement || !validColorSchemaKeys[currentSetting]) {
+ // 当 localStorage 中没有相关值,或者 localStorage 抛了 Error,则读取默认值并切换到相反的模式
+ currentSetting = invertColorSchemaObj[getSchemaFromCSSMediaQuery()];
+ }
+ } else {
+ return;
+ }
+ // 将相反的模式写入 localStorage
+ setLS(colorSchemaStorageKey, currentSetting);
+
+ return currentSetting;
+ }
+
+ function setButtonIcon(schema) {
+ if (validColorSchemaKeys[schema]) {
+ // 切换图标
+ var icon = getIconClass('dark');
+ if (schema) {
+ icon = getIconClass(schema);
+ }
+ var iconElement = document.querySelector(colorToggleIconSelector);
+ if (iconElement) {
+ iconElement.setAttribute(
+ 'class',
+ 'iconfont ' + icon
+ );
+ iconElement.setAttribute(
+ 'data',
+ invertColorSchemaObj[schema]
+ );
+ } else {
+ // 如果图标不存在则说明图标还没加载出来,等到页面全部加载再尝试切换
+ Fluid.utils.waitElementLoaded(colorToggleIconSelector, function() {
+ var iconElement = document.querySelector(colorToggleIconSelector);
+ if (iconElement) {
+ iconElement.setAttribute(
+ 'class',
+ 'iconfont ' + icon
+ );
+ iconElement.setAttribute(
+ 'data',
+ invertColorSchemaObj[schema]
+ );
+ }
+ });
+ }
+ if (document.documentElement.getAttribute('data-user-color-scheme')) {
+ var color = getComputedStyle(document.documentElement).getPropertyValue('--navbar-bg-color').trim()
+ document.querySelector('meta[name="theme-color"]').setAttribute('content', color)
+ }
+ }
+ }
+
+ function setHighlightCSS(schema) {
+ // 启用对应的代码高亮的样式
+ var lightCss = document.getElementById('highlight-css');
+ var darkCss = document.getElementById('highlight-css-dark');
+ if (schema === 'dark') {
+ if (darkCss) {
+ darkCss.removeAttribute('disabled');
+ }
+ if (lightCss) {
+ lightCss.setAttribute('disabled', '');
+ }
+ } else {
+ if (lightCss) {
+ lightCss.removeAttribute('disabled');
+ }
+ if (darkCss) {
+ darkCss.setAttribute('disabled', '');
+ }
+ }
+
+ setTimeout(function() {
+ // 设置代码块组件样式
+ document.querySelectorAll('.markdown-body pre').forEach((pre) => {
+ var cls = Fluid.utils.getBackgroundLightness(pre) >= 0 ? 'code-widget-light' : 'code-widget-dark';
+ var widget = pre.querySelector('.code-widget-light, .code-widget-dark');
+ if (widget) {
+ widget.classList.remove('code-widget-light', 'code-widget-dark');
+ widget.classList.add(cls);
+ }
+ });
+ }, 200);
+ }
+
+ function setApplications(schema) {
+ // 设置 remark42 评论主题
+ if (window.REMARK42) {
+ window.REMARK42.changeTheme(schema);
+ }
+
+ // 设置 cusdis 评论主题
+ if (window.CUSDIS) {
+ window.CUSDIS.setTheme(schema);
+ }
+
+ // 设置 utterances 评论主题
+ var utterances = document.querySelector('.utterances-frame');
+ if (utterances) {
+ var utterancesTheme = schema === 'dark' ? window.UtterancesThemeDark : window.UtterancesThemeLight;
+ const message = {
+ type : 'set-theme',
+ theme: utterancesTheme
+ };
+ utterances.contentWindow.postMessage(message, 'https://utteranc.es');
+ }
+
+ // 设置 giscus 评论主题
+ var giscus = document.querySelector('iframe.giscus-frame');
+ if (giscus) {
+ var giscusTheme = schema === 'dark' ? window.GiscusThemeDark : window.GiscusThemeLight;
+ const message = {
+ setConfig: {
+ theme: giscusTheme,
+ }
+ };
+ giscus.style.cssText += 'color-scheme: normal;';
+ giscus.contentWindow.postMessage({ 'giscus': message }, 'https://giscus.app');
+ }
+ }
+
+ // 当页面加载时,将显示模式设置为 localStorage 中自定义的值(如果有的话)
+ applyCustomColorSchemaSettings();
+
+ Fluid.utils.waitElementLoaded(colorToggleIconSelector, function() {
+ applyCustomColorSchemaSettings();
+ var button = document.querySelector(colorToggleButtonSelector);
+ if (button) {
+ // 当用户点击切换按钮时,获得新的显示模式、写入 localStorage、并在页面上生效
+ button.addEventListener('click', function() {
+ applyCustomColorSchemaSettings(toggleCustomColorSchema());
+ });
+ var icon = document.querySelector(colorToggleIconSelector);
+ if (icon) {
+ // 光标悬停在按钮上时,切换图标
+ button.addEventListener('mouseenter', function() {
+ var current = icon.getAttribute('data');
+ icon.classList.replace(getIconClass(invertColorSchemaObj[current]), getIconClass(current));
+ });
+ button.addEventListener('mouseleave', function() {
+ var current = icon.getAttribute('data');
+ icon.classList.replace(getIconClass(current), getIconClass(invertColorSchemaObj[current]));
+ });
+ }
+ }
+ });
+
+ Fluid.utils.waitElementLoaded(iframeSelector, function() {
+ applyCustomColorSchemaSettings();
+ });
+
+})(window, document);
diff --git a/js/events.js b/js/events.js
new file mode 100644
index 0000000..bc6b773
--- /dev/null
+++ b/js/events.js
@@ -0,0 +1,184 @@
+/* global Fluid */
+
+HTMLElement.prototype.wrap = function(wrapper) {
+ this.parentNode.insertBefore(wrapper, this);
+ this.parentNode.removeChild(this);
+ wrapper.appendChild(this);
+};
+
+Fluid.events = {
+
+ registerNavbarEvent: function() {
+ var navbar = jQuery('#navbar');
+ if (navbar.length === 0) {
+ return;
+ }
+ var submenu = jQuery('#navbar .dropdown-menu');
+ if (navbar.offset().top > 0) {
+ navbar.removeClass('navbar-dark');
+ submenu.removeClass('navbar-dark');
+ }
+ Fluid.utils.listenScroll(function() {
+ navbar[navbar.offset().top > 50 ? 'addClass' : 'removeClass']('top-nav-collapse');
+ submenu[navbar.offset().top > 50 ? 'addClass' : 'removeClass']('dropdown-collapse');
+ if (navbar.offset().top > 0) {
+ navbar.removeClass('navbar-dark');
+ submenu.removeClass('navbar-dark');
+ } else {
+ navbar.addClass('navbar-dark');
+ submenu.removeClass('navbar-dark');
+ }
+ });
+ jQuery('#navbar-toggler-btn').on('click', function() {
+ jQuery('.animated-icon').toggleClass('open');
+ jQuery('#navbar').toggleClass('navbar-col-show');
+ });
+ },
+
+ registerParallaxEvent: function() {
+ var ph = jQuery('#banner[parallax="true"]');
+ if (ph.length === 0) {
+ return;
+ }
+ var board = jQuery('#board');
+ if (board.length === 0) {
+ return;
+ }
+ var parallax = function() {
+ var pxv = jQuery(window).scrollTop() / 5;
+ var offset = parseInt(board.css('margin-top'), 10);
+ var max = 96 + offset;
+ if (pxv > max) {
+ pxv = max;
+ }
+ ph.css({
+ transform: 'translate3d(0,' + pxv + 'px,0)'
+ });
+ var sideCol = jQuery('.side-col');
+ if (sideCol) {
+ sideCol.css({
+ 'padding-top': pxv + 'px'
+ });
+ }
+ };
+ Fluid.utils.listenScroll(parallax);
+ },
+
+ registerScrollDownArrowEvent: function() {
+ var scrollbar = jQuery('.scroll-down-bar');
+ if (scrollbar.length === 0) {
+ return;
+ }
+ scrollbar.on('click', function() {
+ Fluid.utils.scrollToElement('#board', -jQuery('#navbar').height());
+ });
+ },
+
+ registerScrollTopArrowEvent: function() {
+ var topArrow = jQuery('#scroll-top-button');
+ if (topArrow.length === 0) {
+ return;
+ }
+ var board = jQuery('#board');
+ if (board.length === 0) {
+ return;
+ }
+ var posDisplay = false;
+ var scrollDisplay = false;
+ // Position
+ var setTopArrowPos = function() {
+ var boardRight = board[0].getClientRects()[0].right;
+ var bodyWidth = document.body.offsetWidth;
+ var right = bodyWidth - boardRight;
+ posDisplay = right >= 50;
+ topArrow.css({
+ 'bottom': posDisplay && scrollDisplay ? '20px' : '-60px',
+ 'right' : right - 64 + 'px'
+ });
+ };
+ setTopArrowPos();
+ jQuery(window).resize(setTopArrowPos);
+ // Display
+ var headerHeight = board.offset().top;
+ Fluid.utils.listenScroll(function() {
+ var scrollHeight = document.body.scrollTop + document.documentElement.scrollTop;
+ scrollDisplay = scrollHeight >= headerHeight;
+ topArrow.css({
+ 'bottom': posDisplay && scrollDisplay ? '20px' : '-60px'
+ });
+ });
+ // Click
+ topArrow.on('click', function() {
+ jQuery('body,html').animate({
+ scrollTop: 0,
+ easing : 'swing'
+ });
+ });
+ },
+
+ registerImageLoadedEvent: function() {
+ if (!('NProgress' in window)) { return; }
+
+ var bg = document.getElementById('banner');
+ if (bg) {
+ var src = bg.style.backgroundImage;
+ var url = src.match(/\((.*?)\)/)[1].replace(/(['"])/g, '');
+ var img = new Image();
+ img.onload = function() {
+ window.NProgress && window.NProgress.inc(0.2);
+ };
+ img.src = url;
+ if (img.complete) { img.onload(); }
+ }
+
+ var notLazyImages = jQuery('main img:not([lazyload])');
+ var total = notLazyImages.length;
+ for (const img of notLazyImages) {
+ const old = img.onload;
+ img.onload = function() {
+ old && old();
+ window.NProgress && window.NProgress.inc(0.5 / total);
+ };
+ if (img.complete) { img.onload(); }
+ }
+ },
+
+ registerRefreshCallback: function(callback) {
+ if (!Array.isArray(Fluid.events._refreshCallbacks)) {
+ Fluid.events._refreshCallbacks = [];
+ }
+ Fluid.events._refreshCallbacks.push(callback);
+ },
+
+ refresh: function() {
+ if (Array.isArray(Fluid.events._refreshCallbacks)) {
+ for (var callback of Fluid.events._refreshCallbacks) {
+ if (callback instanceof Function) {
+ callback();
+ }
+ }
+ }
+ },
+
+ billboard: function() {
+ if (!('console' in window)) {
+ return;
+ }
+ // eslint-disable-next-line no-console
+ console.log(`
+-------------------------------------------------
+| |
+| ________ __ _ __ |
+| |_ __ |[ | (_) | ] |
+| | |_ \\_| | | __ _ __ .--.| | |
+| | _| | |[ | | | [ |/ /'\`\\' | |
+| _| |_ | | | \\_/ |, | || \\__/ | |
+| |_____| [___]'.__.'_/[___]'.__.;__] |
+| |
+| Powered by Hexo x Fluid |
+| https://github.com/fluid-dev/hexo-theme-fluid |
+| |
+-------------------------------------------------
+ `);
+ }
+};
diff --git a/js/img-lazyload.js b/js/img-lazyload.js
new file mode 100644
index 0000000..c0c8e4e
--- /dev/null
+++ b/js/img-lazyload.js
@@ -0,0 +1,10 @@
+/* global Fluid, CONFIG */
+
+(function(window, document) {
+ for (const each of document.querySelectorAll('img[lazyload]')) {
+ Fluid.utils.waitElementVisible(each, function() {
+ each.removeAttribute('srcset');
+ each.removeAttribute('lazyload');
+ }, CONFIG.lazyload.offset_factor);
+ }
+})(window, document);
diff --git a/js/leancloud.js b/js/leancloud.js
new file mode 100644
index 0000000..ab901ce
--- /dev/null
+++ b/js/leancloud.js
@@ -0,0 +1,192 @@
+/* global CONFIG */
+// eslint-disable-next-line no-console
+
+(function(window, document) {
+ // 查询存储的记录
+ function getRecord(Counter, target) {
+ return new Promise(function(resolve, reject) {
+ Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify({ target })))
+ .then(resp => resp.json())
+ .then(({ results, code, error }) => {
+ if (code === 401) {
+ throw error;
+ }
+ if (results && results.length > 0) {
+ var record = results[0];
+ resolve(record);
+ } else {
+ Counter('post', '/classes/Counter', { target, time: 0 })
+ .then(resp => resp.json())
+ .then((record, error) => {
+ if (error) {
+ throw error;
+ }
+ resolve(record);
+ }).catch(error => {
+ console.error('Failed to create: ', error);
+ reject(error);
+ });
+ }
+ }).catch((error) => {
+ console.error('LeanCloud Counter Error: ', error);
+ reject(error);
+ });
+ });
+ }
+
+ // 发起自增请求
+ function increment(Counter, incrArr) {
+ return new Promise(function(resolve, reject) {
+ Counter('post', '/batch', {
+ 'requests': incrArr
+ }).then((res) => {
+ res = res.json();
+ if (res.error) {
+ throw res.error;
+ }
+ resolve(res);
+ }).catch((error) => {
+ console.error('Failed to save visitor count: ', error);
+ reject(error);
+ });
+ });
+ }
+
+ // 构建自增请求体
+ function buildIncrement(objectId) {
+ return {
+ 'method': 'PUT',
+ 'path' : `/1.1/classes/Counter/${objectId}`,
+ 'body' : {
+ 'time': {
+ '__op' : 'Increment',
+ 'amount': 1
+ }
+ }
+ };
+ }
+
+ // 校验是否为有效的 Host
+ function validHost() {
+ if (CONFIG.web_analytics.leancloud.ignore_local) {
+ var hostname = window.location.hostname;
+ if (hostname === 'localhost' || hostname === '127.0.0.1') {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // 校验是否为有效的 UV
+ function validUV() {
+ var key = 'LeanCloud_UV_Flag';
+ var flag = localStorage.getItem(key);
+ if (flag) {
+ // 距离标记小于 24 小时则不计为 UV
+ if (new Date().getTime() - parseInt(flag, 10) <= 86400000) {
+ return false;
+ }
+ }
+ localStorage.setItem(key, new Date().getTime().toString());
+ return true;
+ }
+
+ function addCount(Counter) {
+ var enableIncr = CONFIG.web_analytics.enable && !Fluid.ctx.dnt && validHost();
+ var getterArr = [];
+ var incrArr = [];
+
+ // 请求 PV 并自增
+ var pvCtn = document.querySelector('#leancloud-site-pv-container');
+ if (pvCtn) {
+ var pvGetter = getRecord(Counter, 'site-pv').then((record) => {
+ enableIncr && incrArr.push(buildIncrement(record.objectId));
+ var ele = document.querySelector('#leancloud-site-pv');
+ if (ele) {
+ ele.innerText = (record.time || 0) + (enableIncr ? 1 : 0);
+ pvCtn.style.display = 'inline';
+ }
+ });
+ getterArr.push(pvGetter);
+ }
+
+ // 请求 UV 并自增
+ var uvCtn = document.querySelector('#leancloud-site-uv-container');
+ if (uvCtn) {
+ var uvGetter = getRecord(Counter, 'site-uv').then((record) => {
+ var incrUV = validUV() && enableIncr;
+ incrUV && incrArr.push(buildIncrement(record.objectId));
+ var ele = document.querySelector('#leancloud-site-uv');
+ if (ele) {
+ ele.innerText = (record.time || 0) + (incrUV ? 1 : 0);
+ uvCtn.style.display = 'inline';
+ }
+ });
+ getterArr.push(uvGetter);
+ }
+
+ // 如果有页面浏览数节点,则请求浏览数并自增
+ var viewCtn = document.querySelector('#leancloud-page-views-container');
+ if (viewCtn) {
+ var path = eval(CONFIG.web_analytics.leancloud.path || 'window.location.pathname');
+ var target = decodeURI(path.replace(/\/*(index.html)?$/, '/'));
+ var viewGetter = getRecord(Counter, target).then((record) => {
+ enableIncr && incrArr.push(buildIncrement(record.objectId));
+ var ele = document.querySelector('#leancloud-page-views');
+ if (ele) {
+ ele.innerText = (record.time || 0) + (enableIncr ? 1 : 0);
+ viewCtn.style.display = 'inline';
+ }
+ });
+ getterArr.push(viewGetter);
+ }
+
+ // 如果启动计数自增,批量发起自增请求
+ if (enableIncr) {
+ Promise.all(getterArr).then(() => {
+ incrArr.length > 0 && increment(Counter, incrArr);
+ });
+ }
+ }
+
+ var appId = CONFIG.web_analytics.leancloud.app_id;
+ var appKey = CONFIG.web_analytics.leancloud.app_key;
+ var serverUrl = CONFIG.web_analytics.leancloud.server_url;
+
+ if (!appId) {
+ throw new Error('LeanCloud appId is empty');
+ }
+ if (!appKey) {
+ throw new Error('LeanCloud appKey is empty');
+ }
+
+ function fetchData(api_server) {
+ var Counter = (method, url, data) => {
+ return fetch(`${api_server}/1.1${url}`, {
+ method,
+ headers: {
+ 'X-LC-Id' : appId,
+ 'X-LC-Key' : appKey,
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify(data)
+ });
+ };
+
+ addCount(Counter);
+ }
+
+ var apiServer = serverUrl || `https://${appId.slice(0, 8).toLowerCase()}.api.lncldglobal.com`;
+
+ if (apiServer) {
+ fetchData(apiServer);
+ } else {
+ fetch('https://app-router.leancloud.cn/2/route?appId=' + appId)
+ .then(resp => resp.json())
+ .then((data) => {
+ if (data.api_server) {
+ fetchData('https://' + data.api_server);
+ }
+ });
+ }
+})(window, document);
diff --git a/js/local-search.js b/js/local-search.js
new file mode 100644
index 0000000..0784a80
--- /dev/null
+++ b/js/local-search.js
@@ -0,0 +1,159 @@
+/* global CONFIG */
+
+(function() {
+ // Modified from [hexo-generator-search](https://github.com/wzpan/hexo-generator-search)
+ function localSearchFunc(path, searchSelector, resultSelector) {
+ 'use strict';
+ // 0x00. environment initialization
+ var $input = jQuery(searchSelector);
+ var $result = jQuery(resultSelector);
+
+ if ($input.length === 0) {
+ // eslint-disable-next-line no-console
+ throw Error('No element selected by the searchSelector');
+ }
+ if ($result.length === 0) {
+ // eslint-disable-next-line no-console
+ throw Error('No element selected by the resultSelector');
+ }
+
+ if ($result.attr('class').indexOf('list-group-item') === -1) {
+ $result.html('');
+ }
+
+ jQuery.ajax({
+ // 0x01. load xml file
+ url : path,
+ dataType: 'xml',
+ success : function(xmlResponse) {
+ // 0x02. parse xml file
+ var dataList = jQuery('entry', xmlResponse).map(function() {
+ return {
+ title : jQuery('title', this).text(),
+ content: jQuery('content', this).text(),
+ url : jQuery('url', this).text()
+ };
+ }).get();
+
+ if ($result.html().indexOf('list-group-item') === -1) {
+ $result.html('');
+ }
+
+ $input.on('input', function() {
+ // 0x03. parse query to keywords list
+ var content = $input.val();
+ var resultHTML = '';
+ var keywords = content.trim().toLowerCase().split(/[\s-]+/);
+ $result.html('');
+ if (content.trim().length <= 0) {
+ return $input.removeClass('invalid').removeClass('valid');
+ }
+ // 0x04. perform local searching
+ dataList.forEach(function(data) {
+ var isMatch = true;
+ if (!data.title || data.title.trim() === '') {
+ data.title = 'Untitled';
+ }
+ var orig_data_title = data.title.trim();
+ var data_title = orig_data_title.toLowerCase();
+ var orig_data_content = data.content.trim().replace(/<[^>]+>/g, '');
+ var data_content = orig_data_content.toLowerCase();
+ var data_url = data.url;
+ var index_title = -1;
+ var index_content = -1;
+ var first_occur = -1;
+ // Skip matching when content is included in search and content is empty
+ if (CONFIG.include_content_in_search && data_content === '') {
+ isMatch = false;
+ } else {
+ keywords.forEach(function (keyword, i) {
+ index_title = data_title.indexOf(keyword);
+ index_content = data_content.indexOf(keyword);
+
+ if (index_title < 0 && index_content < 0) {
+ isMatch = false;
+ } else {
+ if (index_content < 0) {
+ index_content = 0;
+ }
+ if (i === 0) {
+ first_occur = index_content;
+ }
+ }
+ });
+ }
+ // 0x05. show search results
+ if (isMatch) {
+ resultHTML += '' + orig_data_title + ' ';
+ var content = orig_data_content;
+ if (first_occur >= 0) {
+ // cut out 100 characters
+ var start = first_occur - 20;
+ var end = first_occur + 80;
+
+ if (start < 0) {
+ start = 0;
+ }
+
+ if (start === 0) {
+ end = 100;
+ }
+
+ if (end > content.length) {
+ end = content.length;
+ }
+
+ var match_content = content.substring(start, end);
+
+ // highlight all keywords
+ keywords.forEach(function(keyword) {
+ var regS = new RegExp(keyword, 'gi');
+ match_content = match_content.replace(regS, '' + keyword + ' ');
+ });
+
+ resultHTML += '' + match_content + '...
';
+ }
+ }
+ });
+ if (resultHTML.indexOf('list-group-item') === -1) {
+ return $input.addClass('invalid').removeClass('valid');
+ }
+ $input.addClass('valid').removeClass('invalid');
+ $result.html(resultHTML);
+ });
+ }
+ });
+ }
+
+ function localSearchReset(searchSelector, resultSelector) {
+ 'use strict';
+ var $input = jQuery(searchSelector);
+ var $result = jQuery(resultSelector);
+
+ if ($input.length === 0) {
+ // eslint-disable-next-line no-console
+ throw Error('No element selected by the searchSelector');
+ }
+ if ($result.length === 0) {
+ // eslint-disable-next-line no-console
+ throw Error('No element selected by the resultSelector');
+ }
+
+ $input.val('').removeClass('invalid').removeClass('valid');
+ $result.html('');
+ }
+
+ var modal = jQuery('#modalSearch');
+ var searchSelector = '#local-search-input';
+ var resultSelector = '#local-search-result';
+ modal.on('show.bs.modal', function() {
+ var path = CONFIG.search_path || '/local-search.xml';
+ localSearchFunc(path, searchSelector, resultSelector);
+ });
+ modal.on('shown.bs.modal', function() {
+ jQuery('#local-search-input').focus();
+ });
+ modal.on('hidden.bs.modal', function() {
+ localSearchReset(searchSelector, resultSelector);
+ });
+})();
diff --git a/js/plugins.js b/js/plugins.js
new file mode 100644
index 0000000..2a364b0
--- /dev/null
+++ b/js/plugins.js
@@ -0,0 +1,164 @@
+/* global Fluid, CONFIG */
+
+HTMLElement.prototype.wrap = function(wrapper) {
+ this.parentNode.insertBefore(wrapper, this);
+ this.parentNode.removeChild(this);
+ wrapper.appendChild(this);
+};
+
+Fluid.plugins = {
+
+ typing: function(text) {
+ if (!('Typed' in window)) { return; }
+
+ var typed = new window.Typed('#subtitle', {
+ strings: [
+ ' ',
+ text
+ ],
+ cursorChar: CONFIG.typing.cursorChar,
+ typeSpeed : CONFIG.typing.typeSpeed,
+ loop : CONFIG.typing.loop
+ });
+ typed.stop();
+ var subtitle = document.getElementById('subtitle');
+ if (subtitle) {
+ subtitle.innerText = '';
+ }
+ jQuery(document).ready(function() {
+ typed.start();
+ });
+ },
+
+ fancyBox: function(selector) {
+ if (!CONFIG.image_zoom.enable || !('fancybox' in jQuery)) { return; }
+
+ jQuery(selector || '.markdown-body :not(a) > img, .markdown-body > img').each(function() {
+ var $image = jQuery(this);
+ var imageUrl = $image.attr('data-src') || $image.attr('src') || '';
+ if (CONFIG.image_zoom.img_url_replace) {
+ var rep = CONFIG.image_zoom.img_url_replace;
+ var r1 = rep[0] || '';
+ var r2 = rep[1] || '';
+ if (r1) {
+ if (/^re:/.test(r1)) {
+ r1 = r1.replace(/^re:/, '');
+ var reg = new RegExp(r1, 'gi');
+ imageUrl = imageUrl.replace(reg, r2);
+ } else {
+ imageUrl = imageUrl.replace(r1, r2);
+ }
+ }
+ }
+ var $imageWrap = $image.wrap(`
+ `
+ ).parent('a');
+ if ($imageWrap.length !== 0) {
+ if ($image.is('.group-image-container img')) {
+ $imageWrap.attr('data-fancybox', 'group').attr('rel', 'group');
+ } else {
+ $imageWrap.attr('data-fancybox', 'default').attr('rel', 'default');
+ }
+
+ var imageTitle = $image.attr('title') || $image.attr('alt');
+ if (imageTitle) {
+ $imageWrap.attr('title', imageTitle).attr('data-caption', imageTitle);
+ }
+ }
+ });
+
+ jQuery.fancybox.defaults.hash = false;
+ jQuery('.fancybox').fancybox({
+ loop : true,
+ helpers: {
+ overlay: {
+ locked: false
+ }
+ }
+ });
+ },
+
+ imageCaption: function(selector) {
+ if (!CONFIG.image_caption.enable) { return; }
+
+ jQuery(selector || `.markdown-body > p > img, .markdown-body > figure > img,
+ .markdown-body > p > a.fancybox, .markdown-body > figure > a.fancybox`).each(function() {
+ var $target = jQuery(this);
+ var $figcaption = $target.next('figcaption');
+ if ($figcaption.length !== 0) {
+ $figcaption.addClass('image-caption');
+ } else {
+ var imageTitle = $target.attr('title') || $target.attr('alt');
+ if (imageTitle) {
+ $target.after(`${imageTitle} `);
+ }
+ }
+ });
+ },
+
+ codeWidget() {
+ var enableLang = CONFIG.code_language.enable && CONFIG.code_language.default;
+ var enableCopy = CONFIG.copy_btn && 'ClipboardJS' in window;
+ if (!enableLang && !enableCopy) {
+ return;
+ }
+
+ function getBgClass(ele) {
+ return Fluid.utils.getBackgroundLightness(ele) >= 0 ? 'code-widget-light' : 'code-widget-dark';
+ }
+
+ var copyTmpl = '';
+ copyTmpl += '';
+ copyTmpl += 'LANG';
+ copyTmpl += '
';
+ jQuery('.markdown-body pre').each(function() {
+ var $pre = jQuery(this);
+ if ($pre.find('code.mermaid').length > 0) {
+ return;
+ }
+ if ($pre.find('span.line').length > 0) {
+ return;
+ }
+
+ var lang = '';
+
+ if (enableLang) {
+ lang = CONFIG.code_language.default;
+ if ($pre[0].children.length > 0 && $pre[0].children[0].classList.length >= 2 && $pre.children().hasClass('hljs')) {
+ lang = $pre[0].children[0].classList[1];
+ } else if ($pre[0].getAttribute('data-language')) {
+ lang = $pre[0].getAttribute('data-language');
+ } else if ($pre.parent().hasClass('sourceCode') && $pre[0].children.length > 0 && $pre[0].children[0].classList.length >= 2) {
+ lang = $pre[0].children[0].classList[1];
+ $pre.parent().addClass('code-wrapper');
+ } else if ($pre.parent().hasClass('markdown-body') && $pre[0].classList.length === 0) {
+ $pre.wrap('
');
+ }
+ lang = lang.toUpperCase().replace('NONE', CONFIG.code_language.default);
+ }
+ $pre.append(copyTmpl.replace('LANG', lang).replace('code-widget">',
+ getBgClass($pre[0]) + (enableCopy ? ' code-widget copy-btn" data-clipboard-snippet> ' : ' code-widget">')));
+
+ if (enableCopy) {
+ var clipboard = new ClipboardJS('.copy-btn', {
+ target: function(trigger) {
+ var nodes = trigger.parentNode.childNodes;
+ for (var i = 0; i < nodes.length; i++) {
+ if (nodes[i].tagName === 'CODE') {
+ return nodes[i];
+ }
+ }
+ }
+ });
+ clipboard.on('success', function(e) {
+ e.clearSelection();
+ e.trigger.innerHTML = e.trigger.innerHTML.replace('icon-copy', 'icon-success');
+ setTimeout(function() {
+ e.trigger.innerHTML = e.trigger.innerHTML.replace('icon-success', 'icon-copy');
+ }, 2000);
+ });
+ }
+ });
+ }
+};
diff --git a/js/utils.js b/js/utils.js
new file mode 100644
index 0000000..d61bc26
--- /dev/null
+++ b/js/utils.js
@@ -0,0 +1,245 @@
+/* global Fluid, CONFIG */
+
+window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;
+
+Fluid.utils = {
+
+ listenScroll: function(callback) {
+ var dbc = new Debouncer(callback);
+ window.addEventListener('scroll', dbc, false);
+ dbc.handleEvent();
+ return dbc;
+ },
+
+ unlistenScroll: function(callback) {
+ window.removeEventListener('scroll', callback);
+ },
+
+ listenDOMLoaded(callback) {
+ if (document.readyState !== 'loading') {
+ callback();
+ } else {
+ document.addEventListener('DOMContentLoaded', function () {
+ callback();
+ });
+ }
+ },
+
+ scrollToElement: function(target, offset) {
+ var of = jQuery(target).offset();
+ if (of) {
+ jQuery('html,body').animate({
+ scrollTop: of.top + (offset || 0),
+ easing : 'swing'
+ });
+ }
+ },
+
+ elementVisible: function(element, offsetFactor) {
+ offsetFactor = offsetFactor && offsetFactor >= 0 ? offsetFactor : 0;
+ var rect = element.getBoundingClientRect();
+ const viewportHeight = window.innerHeight || document.documentElement.clientHeight;
+ return (
+ (rect.top >= 0 && rect.top <= viewportHeight * (1 + offsetFactor) + rect.height / 2) ||
+ (rect.bottom >= 0 && rect.bottom <= viewportHeight * (1 + offsetFactor) + rect.height / 2)
+ );
+ },
+
+ waitElementVisible: function(selectorOrElement, callback, offsetFactor) {
+ var runningOnBrowser = typeof window !== 'undefined';
+ var isBot = (runningOnBrowser && !('onscroll' in window))
+ || (typeof navigator !== 'undefined' && /(gle|ing|ro|msn)bot|crawl|spider|yand|duckgo/i.test(navigator.userAgent));
+ if (!runningOnBrowser || isBot) {
+ return;
+ }
+
+ offsetFactor = offsetFactor && offsetFactor >= 0 ? offsetFactor : 0;
+
+ function waitInViewport(element) {
+ Fluid.utils.listenDOMLoaded(function() {
+ if (Fluid.utils.elementVisible(element, offsetFactor)) {
+ callback();
+ return;
+ }
+ if ('IntersectionObserver' in window) {
+ var io = new IntersectionObserver(function(entries, ob) {
+ if (entries[0].isIntersecting) {
+ callback();
+ ob.disconnect();
+ }
+ }, {
+ threshold : [0],
+ rootMargin: (window.innerHeight || document.documentElement.clientHeight) * offsetFactor + 'px'
+ });
+ io.observe(element);
+ } else {
+ var wrapper = Fluid.utils.listenScroll(function() {
+ if (Fluid.utils.elementVisible(element, offsetFactor)) {
+ Fluid.utils.unlistenScroll(wrapper);
+ callback();
+ }
+ });
+ }
+ });
+ }
+
+ if (typeof selectorOrElement === 'string') {
+ this.waitElementLoaded(selectorOrElement, function(element) {
+ waitInViewport(element);
+ });
+ } else {
+ waitInViewport(selectorOrElement);
+ }
+ },
+
+ waitElementLoaded: function(selector, callback) {
+ var runningOnBrowser = typeof window !== 'undefined';
+ var isBot = (runningOnBrowser && !('onscroll' in window))
+ || (typeof navigator !== 'undefined' && /(gle|ing|ro|msn)bot|crawl|spider|yand|duckgo/i.test(navigator.userAgent));
+ if (!runningOnBrowser || isBot) {
+ return;
+ }
+
+ if ('MutationObserver' in window) {
+ var mo = new MutationObserver(function(records, ob) {
+ var ele = document.querySelector(selector);
+ if (ele) {
+ callback(ele);
+ ob.disconnect();
+ }
+ });
+ mo.observe(document, { childList: true, subtree: true });
+ } else {
+ Fluid.utils.listenDOMLoaded(function() {
+ var waitLoop = function() {
+ var ele = document.querySelector(selector);
+ if (ele) {
+ callback(ele);
+ } else {
+ setTimeout(waitLoop, 100);
+ }
+ };
+ waitLoop();
+ });
+ }
+ },
+
+ createScript: function(url, onload) {
+ var s = document.createElement('script');
+ s.setAttribute('src', url);
+ s.setAttribute('type', 'text/javascript');
+ s.setAttribute('charset', 'UTF-8');
+ s.async = false;
+ if (typeof onload === 'function') {
+ if (window.attachEvent) {
+ s.onreadystatechange = function() {
+ var e = s.readyState;
+ if (e === 'loaded' || e === 'complete') {
+ s.onreadystatechange = null;
+ onload();
+ }
+ };
+ } else {
+ s.onload = onload;
+ }
+ }
+ var ss = document.getElementsByTagName('script');
+ var e = ss.length > 0 ? ss[ss.length - 1] : document.head || document.documentElement;
+ e.parentNode.insertBefore(s, e.nextSibling);
+ },
+
+ createCssLink: function(url) {
+ var l = document.createElement('link');
+ l.setAttribute('rel', 'stylesheet');
+ l.setAttribute('type', 'text/css');
+ l.setAttribute('href', url);
+ var e = document.getElementsByTagName('link')[0]
+ || document.getElementsByTagName('head')[0]
+ || document.head || document.documentElement;
+ e.parentNode.insertBefore(l, e);
+ },
+
+ loadComments: function(selector, loadFunc) {
+ var ele = document.querySelector('#comments[lazyload]');
+ if (ele) {
+ var callback = function() {
+ loadFunc();
+ ele.removeAttribute('lazyload');
+ };
+ Fluid.utils.waitElementVisible(selector, callback, CONFIG.lazyload.offset_factor);
+ } else {
+ loadFunc();
+ }
+ },
+
+ getBackgroundLightness(selectorOrElement) {
+ var ele = selectorOrElement;
+ if (typeof selectorOrElement === 'string') {
+ ele = document.querySelector(selectorOrElement);
+ }
+ var view = ele.ownerDocument.defaultView;
+ if (!view) {
+ view = window;
+ }
+ var rgbArr = view.getComputedStyle(ele).backgroundColor.replace(/rgba*\(/, '').replace(')', '').split(/,\s*/);
+ if (rgbArr.length < 3) {
+ return 0;
+ }
+ var colorCast = (0.213 * rgbArr[0]) + (0.715 * rgbArr[1]) + (0.072 * rgbArr[2]);
+ return colorCast === 0 || colorCast > 255 / 2 ? 1 : -1;
+ },
+
+ retry(handler, interval, times) {
+ if (times <= 0) {
+ return;
+ }
+ var next = function() {
+ if (--times >= 0 && !handler()) {
+ setTimeout(next, interval);
+ }
+ };
+ setTimeout(next, interval);
+ }
+
+};
+
+/**
+ * Handles debouncing of events via requestAnimationFrame
+ * @see http://www.html5rocks.com/en/tutorials/speed/animations/
+ * @param {Function} callback The callback to handle whichever event
+ */
+function Debouncer(callback) {
+ this.callback = callback;
+ this.ticking = false;
+}
+
+Debouncer.prototype = {
+ constructor: Debouncer,
+
+ /**
+ * dispatches the event to the supplied callback
+ * @private
+ */
+ update: function() {
+ this.callback && this.callback();
+ this.ticking = false;
+ },
+
+ /**
+ * ensures events don't get stacked
+ * @private
+ */
+ requestTick: function() {
+ if (!this.ticking) {
+ requestAnimationFrame(this.rafCallback || (this.rafCallback = this.update.bind(this)));
+ this.ticking = true;
+ }
+ },
+
+ /**
+ * Attach this as the event listeners
+ */
+ handleEvent: function() {
+ this.requestTick();
+ }
+};
diff --git a/links/index.html b/links/index.html
new file mode 100644
index 0000000..d48c85a
--- /dev/null
+++ b/links/index.html
@@ -0,0 +1,605 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 友链 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
在下方留言申请加入我的友链,按如下格式提供信息:
名称:Pdone's Blog 简介:Only Peace & Love Here 地址:https://awaw.cc 头像:https://awaw.cc/avatar.jpg
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/loading.svg b/loading.svg
new file mode 100644
index 0000000..6439b34
--- /dev/null
+++ b/loading.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/local-search.xml b/local-search.xml
new file mode 100644
index 0000000..5da9e00
--- /dev/null
+++ b/local-search.xml
@@ -0,0 +1,871 @@
+
+
+
+
+
+
+ 奇思妙想💭
+
+ /post/whimsy/
+
+ 想象
在造物主的奇妙创造中,智慧生命被孕育而生,被赋予了独特的使命。一部分智慧生命被委派为造物主的助手,肩负着神圣的使命,辅助他完成众多事务。然而,其他的智慧生命则被放置在宇宙沙盒之中,这个神秘的沙盒划分成了无数个对照组,每个对照组即如同一个平行宇宙。
尽管这些平行宇宙共享着相同的宇宙环境,但造物主巧妙地设置了一种绝妙的隔离机制,使得不同对照组之间相互孤立,有如我们所熟知的虚拟机。每个对照组的智慧生命都在自己独特的条件下发展和进化,彼此并不感知对方的存在,仿佛分居于各自的宇宙之中。
造物主寄望于观察自己创造的智慧生命在多样条件下的发展轨迹。然而,为了避免智慧生命的过快发展而导致自我毁灭,他睿智地赋予了它们有限的寿命。这样一来,生命将在有限的时间内经历成长、繁荣与变化,却不至于过早迎来终结。
基于这个精妙的构思,人类注定永远无法自行发现存在于其他平行宇宙中的外星生命——即使是与我们自身相似的存在。除非造物主以某种形式干预,揭示了这些神秘生命的存在。这样的干预可能是一个宏大的奇迹,或者是一连串微妙的迹象,引导我们开始怀疑我们不是宇宙中唯一的智慧生命。
在这美妙而神秘的创世之旅中,我们不妨保持谦卑和好奇,探索宇宙和生命的奥秘,也许在某一刻,我们会获得关于我们自身存在意义的更深刻认知。
扩展 让我们继续扩展这个设想,将其构建成一个虚构的宇宙场景。
在这个造物主创造的宇宙沙盒中,有许多平行宇宙(对照组),每个宇宙都是一个独特的实验场景。每个实验场景都有不同的初始条件和规则,从微观层面到宏观层面都存在微妙的差异,以产生各种可能性。
宇宙的初始条件:每个宇宙都有自己独特的初始条件。有些可能具有更多的自然资源和生态平衡,而另一些可能在资源稀缺和环境恶劣的情况下开始。
生命的诞生:在每个宇宙中,生命以各种形式诞生。从单细胞生物到复杂的多细胞生物,从植物到动物,各种形态的生命在不同的宇宙中演化。
有限的寿命:造物主赋予智慧生命有限的寿命,以避免其发展过快而自我毁灭。这使得智慧生命需要理性和谨慎对待资源和科技的发展,以延续自己的文明。
智慧生命的出现:在某些宇宙中,智慧生命可能会逐渐出现。他们会经历进化、文明的崛起和科技的发展。不同宇宙中智慧生命的特点和文明水平可能千差万别。
宇宙沙盒中的对照组:这些对照组可能不仅包括类似地球的情景,也包括完全不同的星球和宇宙结构。有些对照组中可能存在比地球上更高级的生物形式,也有可能有完全不同类型的智慧生命。
交互与隔离:虽然这些宇宙共享相似的宇宙环境,但造物主将它们隔离开来,避免相互干扰,以保持实验的独立性。智慧生命之间并不知道其他宇宙的存在,让他们自主发展。
观察和干预:造物主时不时地观察不同对照组中智慧生命的进展,他们也许通过超自然手段对这些对照组进行干预,但也可能仅是静观其变。
生命的进化与文明:不同对照组中的智慧生命会经历不同的进化历程和文明发展。有些对照组的文明可能迅速崛起,创造出强大的科技和社会结构,而另一些对照组可能在原始阶段停滞不前。
实验的结果:每个宇宙的结果都是独一无二的。有些宇宙的智慧生命可能因为资源利用不当或自相残杀而灭亡。而另一些宇宙的智慧生命可能会团结合作,探索宇宙的奥秘,并达到一个高度先进的文明。
自行发现外星人的难题:基于设定中的隔离和宇宙沙盒的概念,人类在自然条件下可能难以自行发现其他对照组中的外星文明。这是因为这些对照组是相互隔离的,彼此无法直接联系。除非造物主进行干预或解除隔离,否则人类可能永远不会直接接触其他宇宙中的外星文明。
这样的设想,将宇宙看作一个巨大的实验室,造物主作为超自然的存在,掌控着这个宏伟的观察与实验计划。在这个设定下,人类和其他智慧生命都是宇宙中的一部分,我们的存在和发展也可能是造物主实验的一部分。
同时也为我们提供了一种有趣的哲学思考,让我们思考宇宙的无限可能性以及我们作为智慧生命的存在和发展。虽然这只是一个设想,但它为我们提供了一种探索未知和宇宙奥秘的视角。
类比 当我们将老鼠乌托邦(25号宇宙)实验的结果与上文观点相结合,可以得到一些有趣的启示和类比。
在上文设想中,造物主创造了智慧生命并观察他们在宇宙中的发展。类似地,老鼠乌托邦实验也是一个观察社会动物(老鼠)在特定条件下的发展。这两者都是通过在特定环境中设定条件和规则来探索生命的进化和行为。
有限的资源:在老鼠乌托邦实验中,随着人口密度的增加,资源的竞争变得更为激烈。类似地,在上文观点中,造物主给予生命有限的资源,可能是为了观察智慧生命如何在资源有限的情况下适应和发展。
社会结构与动力:实验中老鼠群体的社会结构出现了退化和混乱,而在上文设想中,智慧生命也可能面临类似的挑战。人类社会中也存在着资源竞争、社会不平等和文明冲突等问题,而这些因素可能影响文明的发展和社会动力。
行为沮丧:老鼠乌托邦实验中,高度拥挤和资源过剩的环境导致了老鼠社会的异常行为,这类似于上文观点中对于发展太快可能导致自行灭亡的担忧。这个类比可能引发我们对于人类社会中过度竞争、资源过剩和社会动态的反思。
自我调整和适应:在实验和上文设想中,动物和智慧生命都面临着适应环境和资源限制的挑战。在类似于乌托邦实验中,老鼠群体可能最终自我调整或消亡,而在上文设想中的智慧生命可能会逐渐适应和发展,寻找合适的平衡。
通过将老鼠乌托邦实验与上文观点相结合,我们可以从一个不同的角度思考社会动物和智慧生命在特定环境下的行为和进化。这样的类比提醒我们在探讨人类社会和文明发展的同时,也要关注资源的合理分配、社会结构的稳定和适应环境的能力。同时,也让我们思考造物主设立这样的实验是否旨在观察智慧生命如何面对类似挑战,以及从中获取对于宇宙和生命的更深刻理解。
注:以上内容源于想象和假设。
]]>
+
+
+
+
+ Share
+
+
+
+
+
+
+ Whimsy
+
+
+
+
+
+
+
+
+ 短链接服务Octopus的实现与源码开放
+
+ /post/whats-short-link/
+
+ 一直想实现一个私有化的短链接服务,后来发现了这个项目,避免了重复造轮子。前提 半年前(2020-06
)左右,疫情触底反弹,公司的业务量不断提升,运营部门为了方便短信、模板消息推送等渠道的投放,提出了一个把长链接压缩为短链接的功能需求。当时为了快速推广,使用了一些比较知名的第三方短链压缩平台,存在一些问题:
收费贵 一些情况下,短链域名在部分第三方平台例如微信会被封杀 回源数据没有办法定制处理方案,无法打通整个业务链路进行数据分析和跟踪 基于此类问题,决定自研一个(长链接压缩为)短链接服务,当时刚好同步进行微服务拆分,内部很多微服务需要重新命名,组内的一个妹子说不如就用Github
的吉祥物去命名octopus cat
(章鱼猫)去命名,但是考虑到版权问题,去掉了她最喜欢的猫,剩下章鱼,以octopus
命名:
(项目的描述还打错字了,应该是”短链接”)因为实现的功能并不复杂,初版于2020-06
月底就发布。octopus
的实现参考了互联网中几篇关于”短链服务实现”浏览量比较高的文章,下面从实现原理、服务实现和部署架构等方面展开谈谈。
基本原理 短链服务的核心就是构建短链接和长链接的唯一映射关系,依赖到一个高性能、排列组合数量大而且破解难度大的映射标识生成算法。
构建唯一映射关系
上图是笔者收到的京东白条分期还款结果提醒短信,短信内容也包含了一个短链https://3.cn/j/xxxxxxx
,把它拷贝到浏览器中打开,发现客户端会重定向到长链https://jrmkt.jd.com/ptp/wl/vouchers.html?activityId=${activityId}&uep_p=${uep_p}&uep_template_id=${uep_template_id}&uep_timestamp=${uep_timestamp}
,然后跳入一个H5
的登录页,登录后再跳进一个白条攻略页面。这里其实一个长链其实可以压成多个短链,短链可以相同域名,也可以使用不同的域名:
访问https://3.cn/j/xxxxxxx
短链接具体的交互流程猜测如下:
jrmkt.jd.com和3.cn查证都是doge东的域名
构建唯一映射关系其实就是基于一个固定的长链接,映射到一个或者多个可以动态生成的短链接,这个唯一映射关系,要求生成的短链接满足:
不容易被破解(使用数字例如数据库的自增主键作为唯一映射标识容易被人遍历出来进行恶意调用) 不能重复(一个短链接只能对应一个长链接,当然一个长链接可以对应多个短链接) 长度尽可能短,这是因为第三方推送的报文内容一般有长度限制,如果短链过长,会导致不容易传输,还会令到推送内容字数受限(试想运营商短信投放内容最大长度为30
个字符长度,短链已经占了20
个字符长度,剩下只有10
个字符长度让运营同事去发挥,显然不合理) 如果链接过长,生成的二维码里面的”码点”会十分密集,不利于客户端识别和传输,刚好笔者公司运营有使用二维码的场景,所以必须尽可能缩短链接的长度 总的来说,这个唯一映射关系中的映射标识需要像Hash
算法生成的Hash
码那样具备高唯一性和低碰撞频率,同时具备短小易传输的特点,具体如何去生成映射唯一标识见下一节”压缩码生成算法”。
压缩码生成算法 这里的”压缩码”(compression_code
)是笔者杜撰出来的名词,在本文中它的含义是短链接URL
的路径部分(为了节省长度,除了协议和域名部分,短链的URL
只有第一段路径):
其中,协议部分基本是固定为https://
(从安全性来看不建议使用http://
),短链域名可以购买尽可能长度短的域名如t.cn
,不过有先见之明的资本家一般会把所有优质的短域名买下并且把价格提到很高,所以域名的长度基本也是很难控制的因素,剩下可控的就是压缩码部分。压缩码部分是可控的,但因为它是URL
的一部分,只要确保所使用的字符不会被URL
编码转义,那么长度是人为可控的。假设我们使用的是26
个字母的大小写,加上10
个数字,那么对于N
位压缩码可以表示的最大组合数量为:
N = 4
,组合数为62 ^ 4 = 14_776_336
,147
万接近148
万N = 5
,组合数为62 ^ 5 = 916_132_832
,9.16
亿左右N = 6
,组合数为62 ^ 6 = 56_800_235_584
,568
亿左右一般来说,组合数越小破解的难度就越小,组合数越大,要求压缩码长度越大,所以常用的长度就是4
、5
和6
,而且后期可以对失效的长链进行压缩码回收或者禁用,这三个长度对于绝大对数生产短链的应用场景都能满足。octopus
在实现的时候选用的是6
位长度的压缩码,无他,因为有现成的成熟的参考方案:62
进制数刚好由字符0-9 a-z A-Z
组成,生成压缩码的时候,只需要生成一个唯一的10
进制数,然后再基于此10
进制数转换为62
进制数数即可。说到这里,看起来的方案如下:
虚线部分一般依赖一种高效而且低冲突的摘要算法,如MurmurHash
,而第(1)
步的实线部分就是生成一个全局唯一的10
进制序列,常用的手法有:
数据库自增序列(如自增主键) Snowflake
算法自研的类似UUID
算法生成全局唯一的序列值 考虑到之前笔者钻研过Snowflake
算法的原理,这里简单使用Snowflake
算法生成自增序列,使用了下面的流程进行压缩码生成和分配:
因为运用部门对短链生成的批量不大,而且短链域名只有一个,所以简单起见,一次压缩操作直接消耗掉一个压缩码,不考虑不同短链域名对同一个压缩码进行共享,也不考虑压缩码的回收问题 。
服务实现 短链服务的主访问入口一般QPS
极高,因此需要想尽一切办法降低该入口的耗时,考虑可以用Redis
做缓存承载入口的流量,基础架构选型如下:
JDK1.8+
:生产部署使用JDK11
MVC
框架与容器:spring-boot-starter-webflux
或者spring-cloud-gateway
,主要是必须使用Netty
作为底层通讯容器内部RPC
框架:Dubbo
服务注册与发现:Nacos
可选APM
工具:Pinpoint
中间件依赖(因为之前整个服务集群都上云了,低负载的服务共用了部分中间件):
MySQL8.x
Redis5.x
普通主从或者哨兵集群RabbitMQ3.8.x
集群,使用镜像队列服务的设计图如下:
最新的版本考虑把黑白名单的拦截器去掉,替换成一个基于布隆过滤器现实的拦截器 。服务使用了两个拦截器(虽然Filter
翻译是过滤器,但是出于习惯,下文称为拦截器)链,容器提供的拦截器组成的拦截器链主要是负责服务安全、调用链跟踪的功能,而服务内部自定义的拦截器链主要是实现请求参数解析、URL
转换、重定向和异步事件记录等功能。
模块划分:
1 2 3 - (ROOT) octopus - octopus-contract - octopus-server
octopus-contract
模块必须脱离父POM
的管理,方便单独迭代更新。
数据库设计 一共使用了5
个表:
具体的初始化DDL
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 CREATE DATABASE `db_octopus` CHARSET 'utf8mb4' COLLATE 'utf8mb4_unicode_520_ci' ; USE `db_octopus`;CREATE TABLE `url_map` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `short_url` VARCHAR (32 ) NOT NULL COMMENT '短链URL' , `long_url` VARCHAR (768 ) NOT NULL COMMENT '长链URL' , `short_url_digest` VARCHAR (128 ) NOT NULL COMMENT '短链摘要' , `long_url_digest` VARCHAR (128 ) NOT NULL COMMENT '长链摘要' , `compression_code` VARCHAR (16 ) NOT NULL COMMENT '压缩码' , `description` VARCHAR (256 ) COMMENT '描述' , `url_status` TINYINT NOT NULL DEFAULT 1 COMMENT 'URL状态,1:正常,2:已失效' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , UNIQUE uniq_compression_code (`compression_code`), INDEX idx_short_url (`short_url`), INDEX idx_short_url_digest (`short_url_digest`), INDEX idx_long_url_digest (`long_url_digest`) ) COMMENT 'URL映射表' ;CREATE TABLE `domain_conf` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `domain_value` VARCHAR (16 ) NOT NULL COMMENT '域名' , `protocol` VARCHAR (8 ) NOT NULL DEFAULT 'https' COMMENT '协议,https或者http' , `domain_status` TINYINT NOT NULL DEFAULT 1 COMMENT '域名状态,1:正常,2:已失效' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , UNIQUE uniq_domain (`domain_value`) ) COMMENT '域名配置' ;CREATE TABLE `compression_code` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `compression_code` VARCHAR (16 ) NOT NULL COMMENT '压缩码' , `code_status` TINYINT NOT NULL DEFAULT 1 COMMENT '压缩码状态,1:未使用,2:已使用,3:已失效' , `sequence_value` VARCHAR (64 ) NOT NULL COMMENT '序列(盐)' , `strategy` VARCHAR (8 ) NOT NULL DEFAULT 'sequence' COMMENT '策略,sequence或者hash' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , UNIQUE uniq_compression_code (`compression_code`) ) COMMENT '压缩码' ;CREATE TABLE `visit_statistics` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , `statistics_date` DATE NOT NULL DEFAULT '1970-01-01' COMMENT '统计日期' , `pv_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '页面流量数' , `uv_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '独立访客数' , `ip_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '独立IP数' , `effective_redirection_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '有效跳转数' , `ineffective_redirection_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '无效跳转数' , `compression_code` VARCHAR (16 ) NOT NULL COMMENT '压缩码' , `short_url_digest` VARCHAR (128 ) NOT NULL COMMENT '短链摘要' , `long_url_digest` VARCHAR (128 ) NOT NULL COMMENT '长链摘要' , UNIQUE uniq_date_code_digest (`statistics_date`, `compression_code`) ) COMMENT '访问数据统计' ;CREATE TABLE `transform_event_record` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , `unique_identity` VARCHAR (128 ) NOT NULL COMMENT '唯一身份标识,SHA-1(客户端IP-UA)' , `client_ip` VARCHAR (64 ) NOT NULL COMMENT '客户端IP' , `short_url` VARCHAR (32 ) NOT NULL COMMENT '短链URL' , `long_url` VARCHAR (768 ) NOT NULL COMMENT '长链URL' , `short_url_digest` VARCHAR (128 ) NOT NULL COMMENT '短链摘要' , `long_url_digest` VARCHAR (128 ) NOT NULL COMMENT '长链摘要' , `compression_code` VARCHAR (16 ) NOT NULL COMMENT '压缩码' , `record_time` DATETIME NOT NULL COMMENT '记录时间戳' , `user_agent` VARCHAR (2048 ) COMMENT 'UA' , `cookie_value` VARCHAR (2048 ) COMMENT 'cookie' , `query_param` VARCHAR (2048 ) COMMENT 'URL参数' , `province` VARCHAR (32 ) COMMENT '省份' , `city` VARCHAR (32 ) COMMENT '城市' , `phone_type` VARCHAR (64 ) COMMENT '手机型号' , `browser_type` VARCHAR (64 ) COMMENT '浏览器类型' , `browser_version` VARCHAR (128 ) COMMENT '浏览器版本号' , `os_type` VARCHAR (32 ) COMMENT '操作系统型号' , `device_type` VARCHAR (32 ) COMMENT '设备型号' , `os_version` VARCHAR (32 ) COMMENT '操作系统版本号' , `transform_status` TINYINT NOT NULL DEFAULT 0 COMMENT '转换状态,1:转换成功,2:转换失败,3:重定向成功,4:重定向失败' , INDEX idx_record_time (`record_time`), INDEX idx_compression_code (`compression_code`), INDEX idx_short_url_digest (`short_url_digest`), INDEX idx_long_url_digest (`long_url_digest`), INDEX idx_unique_identity (`unique_identity`) ) COMMENT '转换事件记录' ;
压缩码生成模块实现 压缩码生成的方法比较简单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 private final SequenceGenerator sequenceGenerator; # <------------- 雪花算法序列生成器@Value("${compress.code.batch:100}") private Integer compressCodeBatch; ......private void generateBatchCompressionCodes () { for (int i = 0 ; i < compressCodeBatch; i++) { long sequence = sequenceGenerator.generate(); CompressionCode compressionCode = new CompressionCode (); compressionCode.setSequenceValue(String.valueOf(sequence)); String code = ConversionUtils.X.encode62(sequence); # <-------------- 10 进制转62 进制 code = code.substring(code.length() - 6 ); compressionCode.setCompressionCode(code); compressionCodeDao.insertSelective(compressionCode); } }
总是批量生成可用的压缩码,查询的时候只需要查出当前未被使用的第一个压缩码即可。
容器拦截器链实现 容器的拦截器需要实现org.springframework.web.server.WebFilter
(WebFlux
的Filter
接口),主要有四个实现(顺序如下):
MappedDiagnosticContextFilter
:引入transmittable-thread-local
通过MDC
做TraceId
的请求上下文绑定,WebFlux
的线程模型和常见的Servlet
容器的线程模型不一样,这里不能直接使用ThreadLocal
或者Slf4j
中原有的MDC
实现BlockIpFilter
:判断客户端请求IP
是否命中黑名单AccessDomainFilter
:判断域名是否命中短链域名白名单(可选的,因为外部已经通过NGINX
做了一次拦截,这个实现是可有可无的)ExcludeUriFilter
:判断当前请求的URI
是否命中了URI
黑名单这里简单展示一下MappedDiagnosticContextFilter
的实现:
1 2 3 4 5 6 7 8 9 10 11 @Order(value = Integer.MIN_VALUE) @Component public class MappedDiagnosticContextFilter implements WebFilter { @Override public Mono<Void> filter (ServerWebExchange exchange, WebFilterChain chain) { String uuid = UUID.randomUUID().toString(); MDC.put("TRACE_ID" , uuid); return chain.filter(exchange).then(Mono.fromRunnable(() -> MDC.remove("TRACE_ID" ))); } }
上面的TRACE_ID
是配合项目的logback.xml
中的pattern
使用。另外需要参考https://github.com/alibaba/transmittable-thread-local/blob/master/docs/requirement-scenario.md
中logback
与transmittable-thread-local
做集成的场景:
这里为了方便管理和升级版本,笔者直接把logback-mdc-ttl
的源码实现改造好后放到项目中。
服务内部拦截器链实现 服务内部的拦截器链主要负责请求参数解析、URL
映射转换、重定向和访问转换结果记录,顶层接口设计如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 public interface TransformFilter { default int order () { return 1 ; } default void init (TransformContext context) { } void doFilter (TransformFilterChain chain, TransformContext context) ; }
TransformContext
是一个属性承载类,本质是一个普通的JavaBean
,设计如下:
目前内置了4
个拦截器实现,包括:
ExtractRequestHeaderTransformFilter
:请求头解析UrlTransformFilter
:URL
转换RedirectionTransformFilter
:重定向处理TransformEventProcessTransformFilter
:转换事件记录以UrlTransformFilter
为例子,源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 @Slf4j @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Component public class UrlTransformFilter implements TransformFilter { @Autowired private UrlMapCacheManager urlMapCacheManager; @Override public int order () { return 2 ; } @Override public void init (TransformContext context) { } @Override public void doFilter (TransformFilterChain chain, TransformContext context) { String compressionCode = context.getCompressionCode(); UrlMap urlMap = urlMapCacheManager.loadUrlMapCacheByCompressCode(compressionCode); context.setTransformStatus(TransformStatus.TRANSFORM_FAIL); if (Objects.nonNull(urlMap)) { context.setTransformStatus(TransformStatus.TRANSFORM_SUCCESS); context.setParam(TransformContext.PARAM_LONG_URL_KEY, urlMap.getLongUrl()); context.setParam(TransformContext.PARAM_SHORT_URL_KEY, urlMap.getShortUrl()); chain.doFilter(context); } else { log.warn("压缩码[{}]不存在或异常,终止TransformFilterChain执行,并且重定向到404页面......" , compressionCode); throw new RedirectToErrorPageException (String.format("[c:%s]" , compressionCode)); } } }
所有的服务内拦截器的scope
都是prototype
,意味着每次初始化拦截器链都会重新创建对应的Bean
。
主控制器实现 因为octopus
只做短链访问的入口,后台管理的功能交给另外的服务实现,此服务只有一个控制器,控制器里面只有一个方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 @RequiredArgsConstructor @RestController public class OctopusController { private final UrlMapService urlMapService; @GetMapping(path = "/{compressionCode}") @ResponseStatus(HttpStatus.FOUND) public Mono<Void> dispatch (@PathVariable(name = "compressionCode") String compressionCode, ServerWebExchange exchange) { ServerHttpRequest request = exchange.getRequest(); TransformContext context = new TransformContext (); context.setCompressionCode(compressionCode); context.setParam(TransformContext.PARAM_SERVER_WEB_EXCHANGE_KEY, exchange); if (Objects.nonNull(request.getRemoteAddress())) { context.setParam(TransformContext.PARAM_REMOTE_HOST_NAME_KEY, request.getRemoteAddress().getHostName()); } HttpHeaders httpHeaders = request.getHeaders(); Set<String> headerNames = httpHeaders.keySet(); if (!CollectionUtils.isEmpty(headerNames)) { headerNames.forEach(headerName -> { String headerValue = httpHeaders.getFirst(headerName); context.setHeader(headerName, headerValue); }); } urlMapService.processTransform(context); return Mono.fromRunnable(context.getRedirectAction()); } }
这个主控制的分发压缩码方法只负责封装参数调用服务内部拦截器链进行后续的处理。然后添加一个全局的异常处理器,把所有的异常或者非法操作引导到一个自定义的404
页面(甚至可以在上面挂一点广告):
Dubbo契约实现 octopus-contract
是一个完全独立的模块,甚至可以说它是一个完全独立的项目,主要作用是提供契约API
,让其他服务引入,让octopus-server
模块进行实现。契约接口定义如下:
1 2 3 4 public interface OctopusApi { Response<CreateUrlMapResponse> createUrlMap (CreateUrlMapRequest request) ; }
基于Dubbo
的实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @DubboService(retries = -1) public class DefaultOctopusApi implements OctopusApi { @Autowired private UrlMapService urlMapService; @Value("${default.octopus.domain}") private String domain; @Override public Response<CreateUrlMapResponse> createUrlMap (CreateUrlMapRequest request) { UrlMap urlMap = new UrlMap (); urlMap.setUrlStatus(UrlMapStatus.AVAILABLE.getValue()); urlMap.setLongUrl(request.getLongUrl()); urlMap.setDescription(request.getDescription()); String shortUrl = urlMapService.createUrlMap(domain, urlMap); return Response.succeed(new CreateUrlMapResponse (request.getRequestId(), shortUrl)); } }
生产中契约模块做了比较多的特性定制,这里只举一个简单实现的例子。
部署架构 octopus
服务集群单独部署,支持无限添加节点,部署架构的关键在于网络架构,内层的负载均衡使用了Nginx
,最外层的负载均衡使用了云负载均衡,如阿里云的SLB
或者UCloud
的ULB
。添加或者移除短链域名,关键在于修改Nginx
的配置。基本的架构如下:
只要保证负载均衡池指向octopus
集群即可,短链的域名可能动态增删,操作完之后只需要nginx -s -reload
刷新一下Nginx
的配置即可。
使用短链服务 先在domain_conf
表写入一条本地域名和端口的数据:
编写一个集成测试类,创建一个短链映射:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Slf4j @SpringBootTest(classes = OctopusServerApplication.class, properties = "spring.profiles.active=local") @RunWith(SpringRunner.class) public class UrlMapServiceTest { @Autowired private UrlMapService urlMapService; @Test public void createUrlMap () { String domain = "localhost:9099" ; UrlMap urlMap = new UrlMap (); urlMap.setUrlStatus(UrlMapStatus.AVAILABLE.getValue()); urlMap.setLongUrl("https://throwx.cn/2020/08/24/canal-ha-cluster-guide" ); urlMap.setDescription("测试短链" ); String url = urlMapService.createUrlMap(domain, urlMap); log.info("生成的短链:{}" , url); } }
基于本地配置启动项目,然后访问http://localhost:9099/Myt8qW
,效果如下:
日志如下:
1 2 [2020-12-27 19:29:22,285] [INFO] cn.throwx.octopus.server.application.consumer.TransformEventConsumer [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] [1c603903-e8d8-4072-aa97-6abf614b9411] - 接收到URL转换事件,内容:{"clientIp":"192.168.211.113","compressionCode":"Myt8qW","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36","cookieValue":"Webstorm-734c3b68=9b8b3560-41f5-478a-93d0-b02128b1022f; __gads=ID=28121bd829638f67-2286c86e7fc400d3:T=1604132165:RT=1604132165:S=ALNI_MbsMQROv6swaC8kf4ux2suZm_GZXA; Hm_lvt_4df6907aebab752244c3ca1432b4ff57=1605930058,1607228133","timestamp":1609068562262,"shortUrlString":"http://localhost:9099/Myt8qW","longUrlString":"https://throwx.cn/2020/08/24/canal-ha-cluster-guide","transformStatusValue":3}...... [2020-12-27 19:29:22,353] [INFO] cn.throwx.octopus.server.application.consumer.TransformEventConsumer [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] [1c603903-e8d8-4072-aa97-6abf614b9411] - 记录URL转换事件完成......
查看转换事件记录表的数据:
后续功能迭代 前期方案有一个安全隐患:没有做压缩码的白名单,容易被基于短链域名,伪造压缩码拼接短链接的方法进行攻击。解决方案是在容器的拦截器链添加或者替换一个基于布隆过滤器实现的压缩码(短链接)白名单拦截器,这样就能在前期拦截了绝大部分恶意伪造的压缩码,让极少量命中了错误率部分的恶意压缩码流到后面的处理逻辑中进行判断。另外,可以引入Caffeine
配合Redis
做两级缓存,毕竟本地缓存的速度更快。
小结 octopus
初版是一个4
小时紧急迭代出来的一个微型项目,到现在为止更新了很多次,生产上已经基本稳定。文中描述的版本是公司生产版本的移植版,精简了大量代码同时移除了一些业务耦合的设计,这里把源码开放出来,让一些有可能用到短链服务的场景提供一个可参考但尽可能不要复制的解决思路。源码仓库:
Gitee
:https://gitee.com/throwableDoge/octopus
Github
:https://github.com/zjcscut/octopus
代码都在main
分支。
彩蛋 最近鸽了很长一段时间,原因是年底比较多业务功能迭代,内部的一个标签服务重构花了大量时间。笔者一直在摸索着通过”分片”、”异步”等等思想,在时间可控的前提下,对小数据量(百万和千万级别)前提下,通过常用的关系型数据库、缓存、消息队列等非大数据平台架构替代实现《用户画像方法论与工程化解决方案》里面提到的解决方案。
标签服务内部的代号是”千寻”,取自于辛弃疾《青玉案元夕》中的”众里寻他千百度”,项目名来自于宫崎骏的动漫《千与千寻》的女主千寻(千寻罗马音是chihiro
):
待后面项目上线一段时间稳定后,应该会抽时间写一个系列谈谈怎么不用大数据那套体系,提供用户画像的工程化解决方案。
(本文完 c-10-d e-a-20201227)
]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ OpenSource
+
+ Java
+
+ ShortLink
+
+
+
+
+
+
+
+
+ 🌈Awesome Software / Service
+
+ /post/awesome/
+
+ 分享一些好用的软件、服务和开源项目等,传递开源与分享精神。纯粹的分享与推荐,放心食用。 开源项目仅提供代码仓库地址,若有官方网站亦会标明。内容排序方式为项目名称英文字母顺序。
目前收录总数:35
桌面应用 桌面应用是一种在桌面操作系统上运行的应用程序,例如 Windows、macOS 和 Linux。与 Web 应用程序和移动应用程序不同,桌面应用程序通常是使用本地编程语言和工具(例如 C++、C#、Java 或 Swift)开发的,并且可以直接在计算机上运行,而无需通过浏览器或移动设备。桌面应用程序可以具有许多不同的功能,例如文本编辑器、图形设计工具、游戏、办公套件、音频/视频编辑器等。与 Web 应用程序相比,桌面应用程序通常具有更高的性能和更好的用户体验,因为它们可以直接访问计算机的资源,例如文件系统、网络和硬件设备。同时,桌面应用程序也需要更多的开发和维护工作,因为它们需要考虑不同操作系统和硬件设备的兼容性问题。
7z - 压缩工具 7-Zip是一个具有高压缩比的文件归档器。
7-Zip is a file archiver with a high compression ratio.
官方网站 GitHubCUE Splitter - 音频分轨 CUE Splitter是一个免费的工具,它可以将一个大的音频文件,主要是一张专辑或一个汇编,分割成相对独立的曲目,使用相关的“CUE表”文件中包含的信息。有时你可以找到一个大的压缩音乐文件(例如MP3,APE,FLAC,OGG,WAV,WMA等)。配备了一个小的.cue文本文件,其中包含有关内部轨道的所有细节:标题,艺术家,持续时间等。通常这对夫妇的文件是由像EAC(精确音频复制),foobar2000,BPM Studio,GoldWave或类似的程序生成的。使用CUE Splitter,您可以分割音乐曲目,而无需解码/重新编码任何音频数据!此外,输出文件自动命名使用用户定义的“文件掩码”字符串和他们的标签填充信息提取的“提示表”。
CUE Splitter is a freeware tool that splits a single big audio file, mostly an album or a compilation, into the relative individual tracks, using the informations contained in the associated “CUE Sheet” file. Sometimes you can find a big compressed music file (for example MP3, APE, FLAC, OGG, WAV, WMA, etc.) equipped with a small .cue text file that contains all the details about internal tracks: title, artist, duration, and so on. Usually these couple of files are generated by programs like EAC (Exact Audio Copy), foobar2000, BPM Studio, GoldWave or similar. With CUE Splitter you can split music tracks without decode/re-encode any audio data! Moreover output files are automatically named using a user-defined “file mask” string and their tags are filled with informations extracted from “CUE Sheet”.
官方网站DBeaver - 数据库工具 DBeaver Community是一个免费的跨平台数据库工具,面向开发人员、数据库管理员、分析师和所有使用数据的人。它支持所有流行的SQL数据库,如MySQL,MariaDB,PostgreSQL,SQLite,Apache Family等。
DBeaver Community is a free cross-platform database tool for developers, database administrators, analysts, and everyone working with data. It supports all popular SQL databases like MySQL, MariaDB, PostgreSQL, SQLite, Apache Family, and more.
官方网站
Everything - 本地搜索引擎 Everything 是 Windows 上一款搜索引擎,它能够基于文件名快速定文件和文件夹位置。
Everything is search engine that locates files and folders by filename instantly for Windows.
可以快速搜索本地任何角落,以便找到自己想要的内容,装机必备。Everything也衍生了一些工具,比如uTools中的本地搜索依赖Everything才能更高效的工作,又如EverythingToolbar 可以把Everything集成到任务栏中。
官方网站
FreeControl - 用电脑控制手机 在PC上控制Android设备。
Control Android devices on PC.
官方网站 GitHubHiBit Uninstaller - 卸载工具 HiBit Uninstaller是卸载Windows软件的完美解决方案,使您可以使用其简单且用户友好的界面快速,完全地卸载程序。
HiBit Uninstaller is the perfect solution for uninstalling Windows software, allowing you to uninstall programs quickly and completely using its simple and user friendly interface.
官方网站
LocalSend - 局域网文件传输 AirDrop的开源跨平台替代品。
An open-source cross-platform alternative to AirDrop.
官方网站 GitHubMotrix - 下载工具 一款全能的下载工具。支持下载 HTTP、FTP、BT、磁力链接等资源。
A full-featured download manager. Support downloading HTTP, FTP, BitTorrent, Magnet, etc.
这个软件内置了Aria2 - 下载工具 ,如果懒得折腾aria2,用这个软件就够用了。如果有NAS设备,推荐使用Docker部署aria2服务,让下载这件事与PC解耦。
官方网站 GitHubMusicPlayer2 - 音乐播放器 MusicPlayer2是一款集音乐播放、歌词显示、格式转换等众多功能于一身的音频播放软件。支持歌词显示、歌词卡拉OK样式显示、歌词在线下载、歌词编辑、歌曲标签识别、专辑封面显示、专辑封面在线下载、频谱分析、音效设置、任务栏缩略图按钮、主题颜色、格式转换等功能。播放内核为BASS音频库(V2.4)。播放器支持几乎所有常见的音频格式。
MusicPlayer2 is an audio player whitch supports music collection playback, lyrics display, format conversion and many other functions. It supports lyrics display, lyrics karaoke style display, lyrics online download, lyrics editing, song tag recognition, album cover display, album cover online download, spectrum analysis, sound effect settings, taskbar thumbnail button, theme color, format conversion and other functions. The playback kernel is the Bass Audio Library (V2.4). The player supports almost all common audio formats.
GitHub
MusicTag - 音乐标签编辑器 『音乐标签』是一款可以编辑歌曲的标题、专辑、艺术家等信息的应用程序,支持FLAC, APE, WAV, AIFF, WV, TTA, MP3, MP4, M4A, OGG, MPC, OPUS, WMA, DSF, DFF等音频格式,绿色无广告,无任何功能限制。
MusicTag is an application that can edit the title, album, artist information of the song, supporting FLAC, APE, WAV, AIFF, WV, TTA, MP3, MP4, M4A, OGG, MPC, OPUS, WMA, DSF, DFF, etc. audio formats, green and without ads, no function restrictions.
官方网站
ruffle - Flash播放器 用Rust编写的Flash Player模拟器。
A Flash Player emulator written in Rust.
官方网站 GitHubScreenToGif - 录制GIF ScreenToGif允许您录制屏幕的选定区域,编辑并保存为gif或视频。
🎬 ScreenToGif allows you to record a selected area of your screen, edit and save it as a gif or video.
官方网站 GitHubSnipaste - 截图贴图工具 Snipaste 是一个简单但强大的贴图工具,同时也可以执行截屏、标注等功能。
Snipaste is a simple but powerful snipping tool, and also allows you to pin the screenshot back onto the screen.
官方网站
TrafficMonitor - 硬件资源监控 一款用于Windows平台的网速监控悬浮窗软件,可以显示当前网速、CPU及内存利用率,支持嵌入到任务栏显示,支持更换皮肤、历史流量统计等功能。
TrafficMonitor is a network monitoring software with floating window feature for Windows. It displays the current internet speed and CPU and RAM usage. There are also other capabilities like an embedded display in the taksbar, changeable display skins, and historical traffic statistics.
GitHub
TranslucentTB - 任务栏透明 一个轻量级的实用程序,使Windows任务栏半透明/透明。
A lightweight utility that makes the Windows taskbar translucent/transparent.
GitHub
uTools 是一个极简、插件化的现代桌面软件,通过自由选配丰富的插件,打造得心应手的工具集合。
非常好用的一款跨平台工具集合,虽然有会员订阅服务(主要是提供了数据备份、多端同步等功能),但无需订阅即可使用大部分功能,满足大部分用户的需要。
官方网站
插件推荐
易翻翻译、ctool、颜色助手、OCR、文件批量重命名、hosts、二维码、本地搜索、文本代码对比、json编辑器、变量命名方式、正则编辑器、编码小助手、计算稿纸。
Visual Studio Code - 编辑器 Visual Studio Code是一个轻量级但功能强大的源代码编辑器,可在桌面上运行,适用于Windows、macOS和Linux。它内置了对JavaScript,TypeScript和Node.js的支持,并拥有丰富的其他语言和运行时扩展生态系统(如C++,C#,Java,Python,PHP,Go,.NET)。
Visual Studio Code is a lightweight but powerful source code editor which runs on your desktop and is available for Windows, macOS and Linux. It comes with built-in support for JavaScript, TypeScript and Node.js and has a rich ecosystem of extensions for other languages and runtimes (such as C++, C#, Java, Python, PHP, Go, .NET).
官方网站 GitHubVLC - 媒体播放器 VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。
VLC is a free and open source cross-platform multimedia player and framework that plays most multimedia files as well as DVDs, Audio CDs, VCDs, and various streaming protocols.
官方网站 GitHubWindTerm - 跨平台终端 一款专业的跨平台SSH/Sftp/Shell/Telnet/Serial终端。
A professional cross-platform SSH/Sftp/Shell/Telnet/Serial terminal.
官方网站 GitHub服务应用 服务应用是一种在后台运行的应用程序,通常在服务器或云平台上运行。与桌面应用程序和移动应用程序不同,服务应用程序通常不直接与用户交互,而是在后台执行某些任务。服务应用程序可以具有许多不同的功能,例如数据处理、文件传输、消息传递、安全认证等。服务应用程序通常使用 Web 技术(例如 RESTful API、SOAP、JSON 等)作为与其他应用程序和服务进行交互的接口。服务应用程序可以在云平台上扩展和自动扩展,以满足不断变化的需求。同时,服务应用程序也需要更多的开发和维护工作,因为它们需要考虑安全性、可伸缩性、可靠性等问题。
推荐部署在云服务器上或有公网IP的NAS设备上,推荐使用常见的Linux发行版,如CentOS、Ubuntu、Debian。
推荐使用 docker-compose
方式部署便于维护和迁移,但部署方式不限于此,文中推荐的大部分服务都提供了跨平台、跨架构支持,更多部署方式请参考官方网站或GitHub。
acme.sh - 自动化证书 一个实现ACME客户端协议的纯Unix shell脚本。
A pure Unix shell script implementing ACME client protocol.
本站的证书由Let’s Encrypt签发,因为托管在Vercel和Netlify中,服务商会定期进行续签,个人无需维护。
但个人服务器的证书就需要自己维护了,这时就要用到acme.sh。具体用法参考以下内容以及项目官网文档。
官方网站 GitHubAdGuard Home - 私人DNS AdGuard Home 是一款全网广告拦截与反跟踪软件。在您将其安装完毕后,它将保护您所有家用设备,同时您不再需要安装任何客户端软件。随着物联网与连接设备的兴起,掌控您自己的整个网络环境变得越来越重要。
AdGuard Home is a network-wide software for blocking ads & tracking. After you set it up, it’ll cover ALL your home devices, and you don’t need any client-side software for that. With the rise of Internet-Of-Things and connected devices, it becomes more and more important to be able to control your whole network.
官方网站 GitHubAlist - 多存储整合 一个支持多存储的文件列表程序,由 Gin 和 Solidjs 驱动。
A file list program that supports multiple storage, powered by Gin and Solidjs.
非常好用的一款存储整合服务,可以把各种存储整合在一个服务中,提供了友好的操作界面,支持超多网盘和其他存储方式、在线预览、离线下载、推送到Aira下载等。
官方网站 GitHubaria2 - 下载工具 aria 2是一个轻量级的多协议和多源,跨平台下载工具,在命令行操作。它支持HTTP/HTTPS,FTP,SFTP,BitTorrent和Metalink。
aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.
如果没有自己的服务器,建议使用Motrix - 下载工具 简单易用。
GitHub
AriaNg - aria2 WebUI AriaNg,一个让aria2更容易使用的现代化Web前端。
AriaNg, a modern web frontend making aria2 easier to use.
只是一个静态的网站,可以直接双击index.html运行,也可以托管到免费的平台中使用,如GitHub Pages、Vercel等。或者使用我托管在Netlify中的AriaNg 。
GitHub
ddns-go - 动态域名解析 自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。
一般家用宽带没有固定的公网IP,但目前大部分地区运行商都提供了动态公网IPv6,此时就需要动态域名解析了。实现原理很简单,定时获取本机公网IP,调用域名服务商API将值更新上去,但是这个项目已经很完善,没必要重复造轮子,完全满足需求。
GitHub
Heimdall - 导航页 应用程序仪表板和启动器。
An Application dashboard and launcher.
简约大气的导航页,且可以对一些支持的应用提供扩展功能,如监控Portainer容器状态、aria2下载任务状态等。
GitHub
Home Assistant - 家庭自动化平台 将本地控制和隐私放在首位的开源家庭自动化。由世界各地的社区成员和DIY爱好者组成的团体提供强力支持。
Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts.
目前智能家居品牌很多,大部分品牌都在搞自家生态,想使用一个APP控制家里所有设备,就需要用到Home Assistant将不同品牌智能设备接入统一管理。
官方网站 GitHubQwerty Learner - 记单词 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件。
Words learning and English muscle memory training software designed for keyboard workers.
官方网站 GitHubRustDesk - 远程桌面 RustDesk 是一个功能齐全的开源远程控制替代方案,可通过最少的配置实现自托管和安全性。
RustDesk is a full-featured open source remote control alternative for self-hosting and security with minimal configuration.
建议使用拥有公网IP的设备自建服务器(无公网IP可以通过Tailscale - 异地组网 后使用),我的NAS只有公网IPv6,上行带宽30Mbps,使用体验比ToDesk免费版好很多,已经逐渐放弃使用ToDesk。
官方网站 GitHubTailscale - 异地组网 Tailscale是一种VPN服务,可以让您在世界任何地方安全、轻松地访问您拥有的设备和应用程序。它使用开源WireGuard 协议实现加密的点对点连接,这意味着只有您的专用网络上的设备才能相互通信。
Tailscale is a VPN service that makes the devices and applications you own accessible anywhere in the world, securely and effortlessly. It enables encrypted point-to-point connections using the open source WireGuard protocol, which means only devices on your private network can communicate with each other.
当用手机或电脑处于无IPv6环境时,可以通过Tailscale来访问家中的NAS服务器。需要注意的是,组网的双方其中有一方的NAT 是Symmetric(对称型),就会打洞失败,流量会经转公共DERP服务器,速度很慢。同类型的产品还有Zerotier,个人感觉没有Tailscale好用。
官方网站 GitHubUptime Kuma - 服务状态监控 一个精美的自托管监控工具。
A fancy self-hosted monitoring tool.
可以用于监控并记录一些可访问服务的运行状态,如docker容器、网站等,也可以用作导航页(Heimdall平替)。除了管理页面,还可以创建允许匿名访问的状态页面(示例 - IPv6 Only )。
GitHub
开源字体 开源字体是指那些可以在版权允许的情况下免费或低成本向公众提供使用和修改的字体。这些字体的设计文件(源代码)通常是公开的,任何人在遵循相关许可协议的前提下都可以下载、使用,并在需要时进行修改和再分发。
阿里巴巴普惠体 阿里巴巴普惠体是一套全球永久免费正版商用的字体家族。
阿里巴巴普惠体3.0为一套符合新国家标准GB18030-2022的简体中文字符集,包含GB18030-2022强制规范三个实现级别:实现级别1+实现级别2标准规格的7字重、实现级别3标准规格的Regular 单一字重。7字重共194,460个全形汉字。包含拉丁字母、希腊字母、西里尔字母、标点符号。
官方网站
Cascadia Code 这是一种有趣的新型等宽字体,包含编程连字,旨在增强 Windows 终端的现代外观和感觉。
This is a fun, new monospaced font that includes programming ligatures and is designed to enhance the modern look and feel of the Windows Terminal.
GitHub
Monaspace 一个创新的代码字体超家族。
An innovative superfamily of fonts for code
官方网站 GitHub霞鹜文楷 一款开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生。
An open-source Chinese font derived from Fontworks’ Klee One.
GitHub
]]>
+
+
+
+
+ Share
+
+
+
+
+
+
+ Software
+
+ Service
+
+ Awesome
+
+
+
+
+
+
+
+
+ 道路勘测设计学习笔记
+
+ /post/learn-road-design/
+
+ 道路平面设计公路 一种带状的空间结构物,它的中线是一条空间曲线。
公路平面图 公路在水平面上的投影图。
公路纵断面图 通过公路中线的竖向剖面图。
公路横断面图 公路上任一点垂直于路中线的竖向剖面图。
缓和曲线 从曲率半径为无穷大逐渐向某一定值变化的曲线。
缓和曲线的作用 缓和曲率——使曲率连续变化 缓和超高——使横向坡度连续变化 缓和加宽——使车道加宽连续变化 缓和曲线产生的效果 曲率连续变化,便于车辆驾驶 离心加速度连续变化,没有突变,乘客感觉舒适 超高横坡度及加宽逐渐变化,行车更加稳定 与圆曲线配合,增加线形美观 缓和曲线的线型 回旋线、三次抛物线、七次四项式型、半波正弦型、一波正弦型、双纽线、多心复曲线。
回旋线 半径从无穷大一直变化到一定设计值的一段弧线。回旋线是曲率随着曲线长度成比例变化的曲线。公路、匝道常用的缓和曲线是回旋线,也叫放射螺旋线。回旋线不仅线形美观,而且与驾驶员匀速转动方向盘由圆曲线驶入直线或者由直线驶入圆曲线的轨迹线相符合。
弯道的超高 为了减小横向力,一般圆曲线段上路面做成外侧高、内侧低的单向内倾横坡。
圆曲线最小半径 最大横向力系数μ和超高横坡度值i为主要影响因素。
横向力系数μ的确定 极限最小半径 各级公路对按计算行车速度行驶的车辆,能保证其安全行车的最小允许半径。
一般最小半径 对按计算行车速度行驶的车辆能保证其安全性和舒适性,它是通常情况下推荐采用的最小半径值。
不设超高的最小半径 当平曲线半径较大时,离心力的影响就较小,路面摩阻力就可以保证汽车有足够的稳定性,这是就可以不设置超高,而允许设置与直线段上相同的双向横坡的路拱形式。
平曲线的极限最小长度 根据经验,为使驾驶员在曲线行驶时不感到方向盘操作的困难,按6s的通过时间设置曲线长度是适宜的。
平曲线的一般最小长度 各级公路的平曲线,一般情况下应能够设置两段缓和曲线(或超高、加宽缓和段)及一段圆曲线。在平面设计中,为便于驾驶操作和行车安全与舒适,汽车在任何一种曲线形式上行驶的时间都不应短于3s。
公路转角小于7°时的平曲线长度 为避免造成视觉错误、保证行车安全,在进行平面设计时应避免设置小于7°的转角。当条件限制不得已时,在偏角小于7°的转角处应设置较长的平曲线,其长度应大于标准中规定值。
加宽 汽车在曲线上行驶所占路面宽度就比在直线上的大,为保证行车的安全,曲线段的路面应做适当的加宽。
加宽缓和段 为避免路面宽度从直线段上的正常宽度到圆曲线段的加宽断面的突变,在直线和圆曲线之间应设置一段路面宽度的渐变段,这一渐变段称为加宽缓和段。
超高 《标准》规定,当圆曲线半径小于不设超高的最小半径时,应设置超高(即将曲线部分的路面做成向内侧倾斜的单向横坡)。
超高缓和段 直线段上的双向横坡逐渐过渡到圆曲线段上的超高横坡的过渡段。
视距 驾驶员在行驶过程中的通视距离。
行车视距 为了保证行车安全,驾驶员应能看到前方一定距离的公路以及公路上的障碍物或迎面的来车,以便及时刹车或绕过。汽车在这段时间里沿公路路面行驶的必要安全距离,称为行车视距。
停车视距 指驾驶员看到障碍物后立即采取制动措施,至汽车在障碍物前停下来的最小安全距离。由三部分距离组成:
驾驶员反应时间内行驶的距离 制动距离,指制动生效到汽车完全停止时行驶的距离 安全距离 会车视距 对于不设分隔带的双车道公路,车辆在行驶中,驾驶员趋向于沿路面中心行驶,一旦发现前方来车,双方驾驶员各自把车辆驶回到自己的车道上,使两车安全交会。为保证双向行驶的双车道公路的行车安全,公路平面应能保证会车视距要求,即满足双向行驶的汽车能在同一车道上及时刹车所需的最短距离。由三部分距离组成:
双方驾驶员反应时间内汽车所行驶的距离 双方汽车的制动距离 安全距离 超车视距 《标准》规定,对于双向行驶的双车道公路,根据需要,应结合地形设置保证具有超车视距的路段,以使汽车行驶时安全超越前车。
超车视距全程可分为四个阶段 加速行驶距离 超车汽车在对向车道上行驶的距离 超车汽车从开始加速到超车完成的时间内,对向车道汽车的行驶距离 超车完成时,超车汽车与对向汽车之间的安全距离 平面线形 直线、圆曲线、回旋线
平面线形要素组合 基本型——圆曲线两端用回旋线与直线相连接的组合型式称为基本型 S型——用两个反向回旋线连接两个反向圆曲线的组合型式称为S型 卵型——用一个回旋线连接两个同向圆曲线的组合型式称为卵型 凸型——在两个同向可旋线间不插入圆曲线而径相衔接的组合型式称为凸型 复合型——两个以上同向回旋线在曲率相等处直接连接的组合型式称为复合型 C型——两同向回旋线在曲率为零处径相衔接的组合型式称为C型 道路纵断面设计 坡线和竖曲线 公路在纵断面上由不同的上坡段、下坡段(统称坡段)和平顺连接相邻两坡段的竖向曲线段组成,即公路路线在纵断面上是一条有起伏的空间线,其基本线形由坡线和竖曲线组成。
地面标高 公路中线各桩点的地面高程称地面标高。
地面线 各点地面标高的连线称地面线,它是一条不规则的空间折线。
设计标高 路基边缘点的高程称设计标高(公路改建时可用原路中线标高为设计标高)。
设计线 各桩点设计标高的连线称纵断面设计线,简称设计线,它是经过技术上、经济上和美学上比较后确定的,由坡线和竖曲线组成的空间线。地面线和设计线是纵断面图的两条主要线。
填挖高 同一桩点的设计标高与地面标高的差值称施工标高,又称填挖高。
填方路段、挖方路段 若该桩点的施工标高为“+”,即设计标高大于地面标高,这样的路基通常为填筑而成的路堤,这样的路段即填方路段 若施工标高为“-”则为路堑,这样的路段即挖方路段。 纵坡 坡线的坡度即路线纵向坡度,简称纵坡。
转坡点 相邻两坡线的交点称转坡点,在转坡点处应设竖曲线。转坡点前后两坡线坡度之差称转坡角。
高原折减 在海拔3000m以上的高原地区,因空气稀薄,不但会使发动机的功率减少,还使水箱的水容易沸腾而降低冷却系统的功能,因此应将《标准》规定的最大纵坡予以折减。
平均纵坡 由若干坡段组成的路段,其两端点的高差与路段长度之比称平均纵坡。
合成坡度 路线纵向坡度与横向坡度的矢量和称合成坡度。
道路横断面设计 横断面 公路中线法线方向的剖面图称公路横断面图,简称横断面,亦即由公路横断面设计的主要组成部分与横断地面线所围成的面,它反映了公路在横剖面上的组成情况、形状和几何尺寸,是公路路线设计的重要内容之一。公路横断面设计的主要组成部分是路面和路基,路面包括行车道、变速车道、紧急停车带、爬坡道等,路基包括路肩、边坡、边沟、护坡道、截水沟等。
路基横断面 为设计计算方便,通常用两侧路肩边缘点的联线,来代替路面、路肩等的横坡折线,即横断面的顶面可绘成一条直线。这样将顶面用一直线绘成的横断面即路基横断面。
路拱 为了排除路面的雨水,将路面做成中间高两边低的拱起形状称路拱。
路拱横坡 路面中线点与路面边缘点的高差,与其水平距离的比值称路拱横坡,以%表示。
分隔带 沿道路纵向设置分隔行车道用的带状设施称分隔带,位于中线位置上的称中间带,位于中线两侧的称外侧分隔带。
路肩 位于行车道外缘至路基边缘具有一定宽度的带状设施称路肩,它是路面的侧向支撑,可供临时停车和人行通行,还可使驾驶员有安全感。
路基宽度 在一个横断面上,两侧路肩边缘点间的宽度称路基宽度。
路基边坡 为保证路基的稳定,把路基两侧做成具有一定坡度的坡面称路基边坡。
边沟 为汇集并排除路面、路肩和边玻的水流,在路基两侧设置的水沟称边沟。一般情况下,挖方路基和填土高度小于0.5m的矮路堤,均应设置边沟。
边沟的型式 通常有梯形、矩形和三角形三种,视上质情况和施工方法而定,一般土质路基采用梯形,岩石路基可采用三角形或矩形,机械化施工时多采用三角形。
截水沟 为拦截并排除流向路基的地面水流,以避免对路基边坡冲刷等而设置的排水沟称截水沟。
免费运距 土方作业包括挖、装、运卸等工序,在某一一特定距离内,只按挖方数计价而不计算运费,这一特定距离称免费运距。
平均运距 土石方调配时,从挖方体积重心到填方体积重心的距离称平均运距,为简化设计计算,通常平均运距按挖方路段中心至填方路段中心的距离计。
道路交叉设计 冲突点 当行车方向互相交叉时,可能发生碰撞的地点称为冲突点。
交织点 当车辆从不同方向驶向同一方向或成锐角相交时,可能产生挤撞的地点称为交织点。
加铺转角 以圆曲线构成宽来连接交叉公路的路基和路面,称为加铺转角式交叉。
立体交叉 公路与公路或铁路在不同高度上互相交义的型式称立体交叉。
立体交叉形式 互通式立体交叉的类型 苜蓿叶形 部分苜蓿叶形 Y形 喇叭形 菱形 环形 定向式立体交叉 匝道的作用 匝道是连接立体交叉上、下路线的交换道,一般在匝道上既有弯道又有坡度。
匝道的类型 右转弯匝道——直接从主干线右转弯驶出的匝道 环形匝道——这是一种左转弯行驶的匝道形式。车辆由干线的右侧出口,并以约270°角向右转弯,而完成左转弯的行驶 定向式匝道——由干线左侧出口,以较短捷的路线直接驶入连接的干线,从而完成左转弯的匝道 迁回式匝道——由干线右侧出口,暂时偏离所去方向,以迂回绕行的方式完成左转弯的匝道 变速车道 车辆由高速公路驶入匝道(或车速低的道路)须减速,反之,车辆由匝道(或车速低的道路)驶进高速公路须加速。为了调整车速而设置在高速公路与匝道间的减速或加速车道,称为变速车道。
]]>
+
+
+
+
+ Share
+
+
+
+
+
+
+ Note
+
+ RoadDesign
+
+
+
+
+
+
+
+
+ 桥梁设计学习笔记
+
+ /post/learn-bridge-design/
+
+ 桥梁定义桥梁是道路路线遇到江河湖泊、山谷深沟以及其他线路(铁路或公路)等障碍时,为了保持道路的连续性而专门建造的人工构造物。桥梁既要保证桥上的交通运行,也要保证桥下水流的宣泄、船只的通航或车辆的通行。
桥梁基本组成 上部结构 桥跨结构 线路跨越障碍(如江河、山谷或其他线路等)的结构物。
下部结构 桥墩 是在河中或岸上支承桥跨结构的结构物。
轻型桥墩——盖梁、系梁、立柱 重力式桥墩——墩帽、墩身 桥台 设在桥的两端;一边与路堤相接,以防止路堤滑塌;另一边则支承桥跨结构的端部。为保护桥台和路堤填土,桥台两侧常做锥形护坡、挡土墙等防护工程。
墩台基础 是保证桥梁墩台安全并将荷载传至地基的结构。
支座系统 在桥跨结构与桥墩或桥台的支承处所设置的传力装置。它不仅要传递很大的荷载,并且还要保证桥跨结构能产生一定的变位。
附属设施 桥面铺装 或称行车道铺装,铺装的平整性、耐磨性、不翘曲、不渗水是保证行车舒适的关键。
排水防水 应能迅速排除桥面积水,并使渗水的可能性降至最小限度。
栏杆 既是保证安全的构造措施,又是有利于观赏的最佳装饰件。
伸缩缝 桥跨上部结构之间或桥跨上部结构与桥台端墙之间所设的缝隙,以保证结构在各种因素作用下的变位。为使行车顺适、不顺簸,桥面上要设置伸缩缝构造。
灯光照明 桥梁分类 按使用性质分类 公路桥、铁路桥、公铁两用桥、城市道路桥(含立交桥)、人行桥、机耕桥、管线桥、渡槽桥。
按桥身结构材料分类 木桥、圬工桥(砖、石、砼砌块桥)、钢筋砼桥、预应力砼桥、钢桥。
按单孔跨径、多孔跨径总长分类 分类 多孔跨径总长L(m) 单孔跨径Lk (m) 特大桥 L > 1000 Lk > 150 大桥 100 ≤ L ≤ 1000 40 ≤ Lk < 150 中桥 30 < L < 100 20 ≤ Lk < 40 小桥 8 ≤ L ≤ 30 5 ≤ Lk < 20 涵洞 L < 8 Lk < 5
按桥跨结构分类 梁式桥(简支梁、连续梁、伸臂梁)、桁架桥、拱桥、刚构桥、悬索桥、斜拉桥等。此外,还有浮桥、漫水桥、活动桥等。
桥梁类型和受力特点 类型 受力特点 建造材料 梁式桥 竖向荷载作用下无水平反力,梁内产生的弯矩最大 抗弯能力强(钢、木、钢筋砼、预应力钢筋砼) 拱式桥 主要承重结构是拱圈或拱助,在竖向荷载作用下,墩台承受水平推力,承重结构以受压为主 抗压能力强的圬工材料(砖、石、砼)和钢筋砼 刚架桥 梁和柱的连接处具有很大的刚性,在竖向荷载作用下,梁部主要受弯,在柱脚处也具有水平反力,受力状态介于梁桥和拱桥之间 施工比较困难,用普通钢筋砼修建,梁柱刚结处易产生裂缝 悬索桥 以悬索为主要承重结构,结构自重较轻,构造简单、受力明确,能以较小的建筑高度经济合理地修建大跨度桥 结构自重轻,刚度差,在车辆荷载和风荷载作用下有较大的变形和振动 组合体系桥 由几个不同体系的结构组合而成,常见的有:连续刚构,梁、拱组合等;斜拉桥也是组合体系桥的一种 ——
梁式桥 梁式桥分类 简支梁桥 悬臂梁桥 等截面连续梁桥 变截面连续梁桥 连续刚构 梁截面 实心板梁 空心板梁 T梁——底板、梁肋、翼缘板 箱梁——底板、腹板、顶板、翼缘板 拱式桥 与梁式桥主要承受弯曲力不同,拱桥要承受的是沿圈传递的轴向压力。该压力即是桥墩桥台在竖向移动荷作用下所产生的水平推力。
拱式桥分类 承载方式 刚架桥 刚架桥是梁和柱(或竖墙)整体结合的桥梁结构。竖向荷载作用下,梁部主要受弯,柱脚处有水平推力,力状态介于梁式桥和拱桥之间。
刚架桥分类 斜拉桥 斜拉桥由主梁、塔柱和斜拉索3种基本构件组成,用高强钢材制成的斜拉索将主梁多点吊起,将主梁承受的荷载传至塔柱,再由塔柱基础传给地基。斜拉桥是主梁(桥面体系)受压、受弯,斜拉索(支承体系)受拉的结构。
索型 桥梁常用术语 横隔板 横隔板是为保持截面形状、增强横向刚度而在梁之间设置的构件。位于桥梁端部的横隔板称为端隔板,位于中部的横隔板称为中隔板。
湿接缝、湿接头 净跨径 相邻两个桥墩(或桥台)之间的净距。对于拱式桥是每孔拱跨两个拱脚截面最低点之间的水平距离。
计算跨径 对于具有支座的桥梁,是指桥跨结构相邻两个支座中心之间的距离;对于拱式桥,是指两相邻拱脚截面形心点之间的水平距离,即拱轴线两端点之间的水平距离。
标准跨径 相邻两个桥墩中心线的距离。
拱轴线 拱圈各截面形心点的连线。
桥梁高度 指桥面与低水位之间的高差,或指桥面与桥下线路路面之间的距离,简称桥高。
桥下净空高度 设计洪水位、计算通航水位或桥下线路路面至桥跨结构最下缘之间的距离。
建筑高度 桥上行车路面(或轨顶)标高至桥跨结构最下缘之间的距离。
容许建筑高度 公路或铁路定线中所确定的桥面或轨顶标高,对通航净空顶部标高之差。
净矢高 从拱顶截面下缘至相邻两拱脚截面下缘最低点之连线的垂直距离。
计算矢高 从拱顶截面形心至相两拱脚截面形心之连线的垂直距离。
矢跨比 计算矢高与计算跨径之比,也称拱矢度,它是反映拱桥受力特性的一个重要指标。
涵洞 用来宣泄路堤下水流的构造物。通常在建造涵洞处路堤不中断。凡是多孔跨径全长不到8m和单孔跨径不到5m的泄水结构物,均称为涵洞。
]]>
+
+
+
+
+ Share
+
+
+
+
+
+
+ Note
+
+ BridgeDesign
+
+
+
+
+
+
+
+
+ NAS诞生记
+
+ /post/my-first-nas/
+
+ NAS(Network Attached Storage:网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置 ,因此也称为“网络存储器”。它是一种专用数据存储服务器。它以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽、提高性能、降低总拥有成本、保护投资。其成本远远低于使用服务器存储,而效率却远远高于后者。
配置清单 品类 型号 渠道 价格 备注 主板 映泰J4125NHU 淘宝 580 SATA*2、M.2*1、PCIEx16*1 处理器 Intel J4125 - - 板载CPU、被动散热 机箱 蜗牛星际C款 闲鱼 128 PCIE开口、4盘位、硬盘背板 内存 玖合 忆界马甲条 京东 149 8G、DDR4、3000MHz 扩展卡 乐扩m.2转5口SATA 京东 149 SATA3.0*5 电源 益衡7025B 淘宝 245 80PLUS铜牌、双路12V 36A 插座 小米智能插座2 京东 49 电量统计、远程开机 1300
系统方案 方案 系统 备注 虚拟机 PVE/EXSi 硬盘直通、核显直通 虚拟机 Windows & VMware CPU性能羸弱 物理机 群晖1 U盘/SATA引导、UI人性化、套件易用(采纳✔) 物理机 Unraid 按盘位收费 物理机 FreeNAS/TrueNAS 使用ECC内存 物理机 万由 只支持到U-NAS5、U-NAS6仅万由硬件可用
1 固件版本 918+ 7.0.1 42218 up3
总结 目前这套配置搭配群晖系统已稳定运行两周,单块1T硬盘(老笔记本淘汰),功耗15W。
2023.07.04 更新了以下内容
改用 arpl v1.1-beta2a 自编译引导 系统升级为 7.1.1 42962 up5 添加了一块 512GB SATA固态硬盘(用于提升docker、套件、虚拟机等服务的运行效率,实际感受docker和套件提升不明显,跑虚拟机提升明显) 添加了一块 4TB 西部数据垂直盘 添加了一块 4*SATA PCIe扩展卡,目前板载2SATA,扩展4SATA,共6个SATA口 目前待机功率为21W,每天消耗0.5度电 ]]>
+
+
+
+
+ Share
+
+
+
+
+
+
+ NAS
+
+ Synology
+
+
+
+
+
+
+
+
+ 挪车码生成器 - 开源
+
+ /post/car-code-generator/
+
+ 临时停车时,直接把手机号放在车上,容易被广告推销人员盯上,用二维码的方式间接给别人提供联系方式,可以有效降低此类情况发生。优势 使用挪车码展示联系方式,可以避免直接展示出手机号码,广告推销人员可能懒得扫码获取你的手机号 可以使用微信、浏览器、系统相机扫一扫等进行扫码,无需手动输入长达11位的无序数字 组成的手机号,直接一键拨号,减少焦虑感 劣势 由于本服务是完全免费的,故无法提供虚拟手机号进行拨号 使用方法 输入手机号码 保存到挪车码 用作图工具添加“扫码挪车”等字样后用A4纸打印出来 临时停车的时候放在车窗下显眼位置 截图
下载地址 https://www.lanzoux.com/iej9Tqkzj7c 提取码:pdone
代码仓库 https://github.com/pdone/car-code-generator
]]>
+
+
+
+
+ Tools
+
+
+
+
+
+
+ .NET
+
+ QRCode
+
+ OpenSource
+
+
+
+
+
+
+
+
+ 最常用的 35 个 Git 命令
+
+ /post/git-command/
+
+ 不管你是新手还是经验丰富的开发人员,都需要使用源代码管理。因此很大几率上你会选择使用Git来管理源代码。要发挥Git的全部潜力,我们需要了解Git命令。在本文中,你将学到最有用的一些Git命令,掌握这些Git命令将帮助你提升编码水平。
本Git命令指南共分为三个部分:基础命令,进阶命令和高阶Git命令。
基础Git命令 在这个部分中,我们要学习的是一些非常基础的Git命令。这些基础的Git命令是学习其他进阶命令的基础。
下面请看这9个基础的Git命令。
1. git config git config
命令非常有用。尤其是在你第一次使用Git或刚安装新的Git时。此命令可设置身份——Name和Email地址。并且每次提交时会使用此信息。
1 2 3 $ git config --global user.name "Your name" $ git config --global user.email "Your email"
2. git version 顾名思义,它会检查你使用的是哪个版本的Git。目前,截至编写本指南时,Git for Windows的最新版本是2.31.1。它发布于2021年3月27日。
3. git init 这可能是你在Git中启动新项目所使用的第一个命令。此命令将创建一个空白的新存储库,然后你可以将源代码存储在此存储库中。
或者,你也可以在git init
命令中使用存储库名称。
1 $ git init <your repository name>
4. git clone git clone
命令将使用现有的存储库进行复制。git init
和git clone
之间有一个主要区别。
在你需要在现有的存储库上进行复制时,使用git clone
。git clone
命令首先在内部使用git init
命令,然后检出所有内容。
1 git clone <your project URL>
5. git add git add
命令会把所有新的代码文件或修改后的文件添加到存储库中。此命令提供了添加文件和文件夹的不同选项。
将单个文件添加到暂存区
1 $ git add your_file_name
此选项会将所有修改过的文件和新文件添加到暂存区
6. git commit 这个Git命令是必不可少的。如果不能合理利用此命令,则可能会降低项目质量。
简而言之,git commit
会将更改添加到本地存储库。
1 $ git commit -m "your useful commit message"
7. git status 使用此Git命令可以方便地查看有多少文件需要得到关注。你可以随时运行此命令。
此命令可以用来在git add
和git commit
之间查看状态。
8. git branch 大多数时候,你的Git存储库中总会有多个分支。我们可以使用git branch
命令有效地管理分支。Git分支有许多不同的选项和开关。
为简单起见,在这里我将重点介绍如何创建和删除Git分支。
列出所有分支
创建新的分支
1 $ git branch <branch_name>
删除分支
1 $ git branch -d <branch_name>
9. git checkout 此Git命令用于在分支之间进行切换。这是功能强大的git命令之一,堪称万能的瑞士军刀。
以下是切换到另一个分支的语法。
1 $ git checkout <branch_name>
此外,你也可以创建和检出到分支。
1 $ git checkout -b <your_new_branch_name>
进阶Git命令 掌握了基础的Git命令之后,我们就该学习进阶Git命令了。
如果你需要与团队合作,与他人共享代码,那么这些Git命令会非常有用。另外,还有一些类似git log
命令,这些命令可帮助查看以前的提交历史。
10. git remote git remote
命令就像边界,如果你需要与外界连接,则必须使用git remote
命令。此命令会将你的本地存储库连接到远程。
1 $ git remote add <shortname> <url>
举例
1 $ git remote add origin https://dev.azure.com/aCompiler/_git/DemoProject
11. git push (借助git remote
命令)与远程存储库连接之后,就需要将更改推送到存储库。
1 $ git push -u <short_name> <your_branch_name>
举例
1 $ git push -u origin feature_branch
12. git push –set-upstream 在使用git push
之前,我们应该先设置好origin
和upstream
。下面是设置upstream
的命令。
1 $ git push --set-upstream <short_name> <branch_name>
举例
1 $ git push --set-upstream origin feature_branch
13. git fetch 当需要下载其他团队成员的更改时,就得使用git fetch
。
此命令会下载有关提交、引用等的所有信息,因此你可以在将这些更改应用于本地存储库之前对其进行检查。
14. git pull git pull
命令下载内容(而不是元数据),并立即用最新的内容更新本地存储库。
15. git stash 此git命令会临时存储已修改的文件。你可以使用以下Git命令处理stash
工作。
可以使用以下命令查看所有stash
如果你需要应用stash
到分支,那就使用apply
16. git log 在git log
的帮助下,你可以看到所有之前的提交,并且最近的提交出现在最前面。
默认情况下,它将显示当前已检出分支的所有提交,但是你可以强制通过所有选项来查看所有分支的所有提交。
17. git shortlog git shortlog
命令会显示来自git log
命令的摘要。如果你只对简短的摘要感兴趣,那么此命令就非常有用了。
这个命令有助于查看谁处理了什么,因为它对作者及其提交进行了分组。
18. git show 与git log
相比,此命令将显示有关特定提交的详细信息。
1 $ git show <your_commit_hash>
19. git rm 有时你需要从代码库中删除文件,在这种情况下,可以使用git rm
命令。
它可以从索引和工作目录中删除跟踪的文件。
1 $ git rm <your_file_name>
20. git merge git merge
可帮助将来自两个分支的更改集成到单个分支中。
1 $ git merge <branch_name>
此命令会将<branch_name>
合并到当前你选择的分支中。
高阶Git命令 现在是时候再上一个层次了。在这个部分中,我们要学习的是高阶的Git命令。这些命令就需要花时间去练习了。
但是一旦掌握了这些命令的基础知识,使用起来不要太轻松哦。
21. git rebase git rebase
类似于git merge
命令。它把两个分支集成到一个分支中,但有一个不一样的地方:git rebase
命令将会重写提交记录。
当你有多个私有分支合并到单个分支时,应使用git rebase
命令。它将使得提交历史成为线性的。
22. git bisect git bisect
命令可帮助查找糟糕的提交。
启动git bisect
让git bisect知道什么是好的提交
让git bisect知道什么是糟糕的提交
通过git bisect
,只要几分钟你就可以缩小问题代码的范围。
23. git cherry-pick git cherry-pick
是一个蛮有用的命令,允许你从任意分支中选择任意提交并将其应用于其他任意分支。
1 $ git cherry-pick <commit-hash>
git cherry-pick
不会修改存储库的历史记录;相反,它会添加到历史记录。
24. git archive git archive
命令会把多个文件合并为单个文件。就好像zip
实用程序一样,所以你可以提取存档文件以获取单个文件。
1 $ git archive --format zip HEAD > archive-HEAD.zip
它将创建当前修订的zip
存档。
25. git pull –rebase 在大多数情况下,当你使用git pull
时,你需要重新设置基准(并且不进行合并)。
此时,你就可以使用此选项。
这将帮助保持干净的历史记录。另外,还可以避免多次合并。
26. git blame 如果你需要逐行检查任意文件的内容,则需要使用git blame
命令。它可以帮助确定是谁对文件进行了更改。
1 $ git blame <your_file_name>
27. git tag 在Git中,标签很有用,你可以使用它们来管理发布。你可以将git tag
视为不会改变的分支。尤其是要公开发布的时候,则更为重要了。
28. git verify-commit git verify-commit
命令将检查gpg
签名。GPG,GNU Privacy Guard,是sign文件中使用的工具,包含签名。
1 $ git verify-commit <commit>
29. git verify-tag 可以以同样的方式确认标签。
30. git diff 大多数情况下,在提交或推送之前,你需要比较两个git文件或分支。用这个命令就方便多了。
将工作目录与本地存储库进行比较
1 $ git diff HEAD <filename>
比较两个分支
1 $ git diff <source branch> <target branch>
git citool
是Git提交的图形化替代。
32. git mv 重命名git文件。接受两个参数,源文件名和目标文件名。
1 $ git mv <old-file-name> <new-file-name>
33. git clean 你可以使用git clean
命令处理未跟踪的文件。可以使用此命令从工作目录中删除所有未跟踪的文件。如果要处理跟踪的文件,则需要使用git reset
命令。
34. git help Git中有许多命令,如果你需要其他命令的帮助,则可以随时在终端上使用git help
。
1 $ git help <git_command>
35. git whatchanged 此命令的作用与git log
相同,但为原始格式。并且由于历史原因,它也是git的一份子。
]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ Git
+
+
+
+
+
+
+
+
+ 批处理获取时间小于10点时补零
+
+ /post/bat-date/
+
+ 使用 %time:~0,2%
获取时间时,当前时间若小于10点,获取到的时间不会自动补零,但是分钟和秒钟会补零,所以小时部分需要自己处理一下。Code 1 2 3 4 5 6 7 @echo offset hour=%time:~0,2%if %hour% LSS 10 (set "hour=0%time:~1,1%" )set date =%date :~0,4%-%date :~5,2%-%date :~8,2%T%hour%:%time:~3,2%:%time:~6,5%echo %date % pause
Output ]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ 批处理
+
+
+
+
+
+
+
+
+ 洛阳地铁一号线开通啦!(内附线路图)
+
+ /post/luoyang-subway/
+
+ 洛阳轨道交通(Luoyang Subway)是服务于中国河南省洛阳市的城市轨道交通系统,其首条线路于2020年12月1日开始试运行。2021年3月28日正式运营,当日客流量为10.7382万人次。
截至2021年3月,洛阳轨道交通已开通运营线路1条,为洛阳轨道交通1号线;在建线路1条,为洛阳轨道交通2号线;规划线路2条,为洛阳轨道交通3号线、洛阳轨道交通4号线;线网共设车站34座。
]]>
+
+
+
+
+ Share
+
+
+
+
+
+
+ News
+
+
+
+
+
+
+
+
+ 数据库调优
+
+ /post/sql-tuning/
+
+ 先思考这几个问题:什么时候才需要分库分表呢?我们的评判标准是什么? 一张表存储了多少数据的时候,才需要考虑分库分表? 数据增长速度很快,每天产生多少数据,才需要考虑做分库分表? 为什么要分库分表? 首先回答一下为什么要分库分表,答案很简单:数据库出现性能瓶颈 。用大白话来说就是数据库快扛不住了。 数据库出现性能瓶颈,对外表现有几个方面:
大量请求阻塞 在高并发场景下,大量请求都需要操作数据库,导致连接数不够了,请求处于阻塞状态。
SQL 操作变慢 如果数据库中存在一张上亿数据量的表,一条 SQL 没有命中索引会全表扫描,这个查询耗时会非常久。
存储出现问题 业务量剧增,单库数据量越来越大,给存储造成巨大压力。
从机器的角度看,性能瓶颈无非就是CPU、内存、磁盘、网络这些,要解决性能瓶颈最简单粗暴的办法就是提升机器性能,但是通过这种方法成本和收益投入比往往又太高了,不划算,所以重点还是要从软件角度入手。
数据库相关优化方案 数据库优化方案很多,主要分为两大类:软件层面 、硬件层面 。 软件层面包括:SQL 调优、表结构优化、读写分离、数据库集群、分库分表等; 硬件层面主要是增加机器性能。
SQL 调优 SQL 调优往往是解决数据库问题的第一步,往往投入少部分精力就能获得较大的收益。 SQL 调优主要目的是尽可能的让那些慢 SQL 变快,手段其实也很简单就是让 SQL 执行尽量命中索引。
开启慢 SQL 记录 如果你使用的是 Mysql,需要在 Mysql 配置文件中配置几个参数即可。
1 2 3 slow_query_log = on long_query_time = 1 slow_query_log_file = /path/to/log
调优工具 常常会用到 explain 这个命令来查看 SQL 语句的执行计划,通过观察执行结果很容易就知道该 SQL 语句是不是全表扫描、有没有命中索引。
1 select id, age, gender from user where name = 'pdone' ;
返回有一列叫“type”,常见取值有:
ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好) ALL 代表这条 SQL 语句全表扫描了,需要优化。一般来说需要达到range 级别及以上。
表结构优化 以一个场景举例说明:
“user”表中有 user_id、nickname 等字段,“order”表中有order_id、user_id等字段,如果想拿到用户昵称怎么办?一般情况是通过 join 关联表操作,在查询订单表时关联查询用户表,从而获取导用户昵称。
但是随着业务量增加,订单表和用户表肯定也是暴增,这时候通过两个表关联数据就比较费力了,为了取一个昵称字段而不得不关联查询几十上百万的用户表,其速度可想而知。
这个时候可以尝试将 nickname 这个字段加到 order 表中(order_id、user_id、nickname),这种做法通常叫做数据库表冗余字段。这样做的好处展示订单列表时不需要再关联查询用户表了。
冗余字段的做法也有一个弊端,如果这个字段更新会同时涉及到多个表的更新,因此在选择冗余字段时要尽量选择不经常更新的字段。
架构优化 当单台数据库实例扛不住,我们可以增加实例组成集群对外服务。
当发现读请求明显多于写请求时,我们可以让主实例负责写,从实例对外提供读的能力;如果读实例压力依然很大,可以在数据库前面加入缓存如 redis,让请求优先从缓存取数据减少数据库访问。
缓存分担了部分压力后,数据库依然是瓶颈,这个时候就可以考虑分库分表的方案了,后面会详细介绍。
硬件优化 硬件成本非常高,一般来说不可能遇到数据库性能瓶颈就去升级硬件。
在前期业务量比较小的时候,升级硬件数据库性能可以得到较大提升;但是在后期,升级硬件得到的收益就不那么明显了。
分库分表详解 下面我们以一个商城系统为例逐步讲解数据库是如何一步步演进。
]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ Database
+
+ SQL
+
+
+
+
+
+
+
+
+ Markdown代码块支持的语言
+
+ /post/md-codeblock-lang/
+
+ Markdown代码块支持的语言,使用时在```
后加上对应关键字即可。名称 关键字 调用的js AppleScript applescript shBrushAppleScript.js ActionScript 3.0 actionscript3, as3 shBrushAS3.js Shell bash, shell shBrushBash.js ColdFusion coldfusion, cf shBrushColdFusion.js C cpp, c shBrushCpp.js C# c#, c-sharp, csharp shBrushCSharp.js CSS css shBrushCss.js Delphi delphi, pascal, pas shBrushDelphi.js diff&patch diff patch shBrushDiff.js Erlang erl, erlang shBrushErlang.js Groovy groovy shBrushGroovy.js Java java shBrushJava.js JavaFX jfx, javafx shBrushJavaFX.js JavaScript js, jscript, javascript shBrushJScript.js Perl perl, pl, Perl shBrushPerl.js PHP php shBrushPhp.js text text, plain shBrushPlain.js Python py, python shBrushPython.js Ruby ruby, rails, ror, rb shBrushRuby.js SASS&SCSS sass, scss shBrushSass.js Scala scala shBrushScala.js SQL sql shBrushSql.js Visual Basic vb, vbnet shBrushVb.js XML xml, xhtml, xslt, html shBrushXml.js Objective C objc, obj-c shBrushObjectiveC.js F# f# f-sharp, fsharp shBrushFSharp.js xpp, dynamics-xpp shBrushDynamics.js R r, s, splus shBrushR.js matlab matlab shBrushMatlab.js swift swift shBrushSwift.js GO go, golang shBrushGo.js
]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ MD
+
+ Markdown
+
+
+
+
+
+
+
+
+ BuildInCategory枚举
+
+ /post/revit-category/
+
+ Revit二次开发中经常用到BuildInCategory 过滤元素,以下是通过遍历该枚举获取的数据,其中部分类别的名称未能获取到,本文未显示Unknown 部分,完整版本见 BuildInCategory枚举 - 完整 。中文名称 名称 值 分析链接 OST_LinksAnalytical -2009657 分析楼板基础标记 OST_FoundationSlabAnalyticalTags -2009656 分析条形基础标记 OST_WallFoundationAnalyticalTags -2009655 分析独立基础标记 OST_IsolatedFoundationAnalyticalTags -2009654 分析墙标记 OST_WallAnalyticalTags -2009653 分析楼层标记 OST_FloorAnalyticalTags -2009652 分析柱标记 OST_ColumnAnalyticalTags -2009651 分析支撑标记 OST_BraceAnalyticalTags -2009650 分析梁标记 OST_BeamAnalyticalTags -2009649 分析节点 OST_AnalyticalNodes -2009645 分析基础底板 OST_FoundationSlabAnalytical -2009643 分析条形基础 OST_WallFoundationAnalytical -2009642 分析独立基础 OST_IsolatedFoundationAnalytical -2009641 分析墙 OST_WallAnalytical -2009640 分析楼层 OST_FloorAnalytical -2009639 顶部线段 OST_ColumnEndSegment -2009638 基准线段 OST_ColumnStartSegment -2009637 分析柱 OST_ColumnAnalytical -2009636 末端线段 OST_BraceEndSegment -2009635 起点线段 OST_BraceStartSegment -2009634 分析支撑 OST_BraceAnalytical -2009633 末端线段 OST_BeamEndSegment -2009632 起点线段 OST_BeamStartSegment -2009631 分析梁 OST_BeamAnalytical -2009630 棍状符号 OST_StructuralTrussStickSymbols -2009608 隐藏线 OST_MassHiddenLines -2009532 隐藏线 OST_CurtaSystemHiddenLines -2009531 隐藏线 OST_EntourageHiddenLines -2009529 隐藏线 OST_PlantingHiddenLines -2009528 隐藏线 OST_SpecialityEquipmentHiddenLines -2009527 隐藏线 OST_TopographyHiddenLines -2009526 隐藏线 OST_SiteHiddenLines -2009524 隐藏线 OST_RoadsHiddenLines -2009523 隐藏线 OST_ParkingHiddenLines -2009522 隐藏线 OST_PlumbingFixturesHiddenLines -2009521 隐藏线 OST_MechanicalEquipmentHiddenLines -2009520 隐藏线 OST_LightingFixturesHiddenLines -2009519 隐藏线 OST_FurnitureSystemsHiddenLines -2009518 隐藏线 OST_ElectricalFixturesHiddenLines -2009517 隐藏线 OST_ElectricalEquipmentHiddenLines -2009516 隐藏线 OST_CaseworkHiddenLines -2009515 隐藏线 OST_DetailComponentsHiddenLines -2009514 隐藏线 OST_ShaftOpeningHiddenLines -2009513 隐藏线 OST_GenericModelHiddenLines -2009512 隐藏线 OST_CurtainWallMullionsHiddenLines -2009511 隐藏线 OST_CurtainWallPanelsHiddenLines -2009510 隐藏线 OST_RampsHiddenLines -2009509 隐藏线 OST_StairsRailingHiddenLines -2009508 隐藏线 OST_StairsHiddenLines -2009507 隐藏线 OST_ColumnsHiddenLines -2009506 隐藏线 OST_FurnitureHiddenLines -2009505 隐藏线 OST_LinesHiddenLines -2009504 隐藏线 OST_CeilingsHiddenLines -2009503 隐藏线 OST_RoofsHiddenLines -2009502 隐藏线 OST_DoorsHiddenLines -2009501 隐藏线 OST_WindowsHiddenLines -2009500 轮廓标记 OST_StructConnectionProfilesTags -2009064 孔标记 OST_StructConnectionHoleTags -2009063 隐藏线 OST_CouplerHiddenLines -2009062 结构钢筋接头标记 OST_CouplerTags -2009061 结构钢筋接头 OST_Coupler -2009060 焊接标记 OST_StructConnectionWeldTags -2009059 剪力钉标记 OST_StructConnectionShearStudTags -2009058 锚固件标记 OST_StructConnectionAnchorTags -2009057 螺栓标记 OST_StructConnectionBoltTags -2009056 板标记 OST_StructConnectionPlateTags -2009055 隐藏线 OST_RebarHiddenLines -2009050 修改器 OST_StructConnectionModifiers -2009047 焊缝 OST_StructConnectionWelds -2009046 孔 OST_StructConnectionHoles -2009045 剪力钉 OST_StructConnectionShearStuds -2009044 其他 OST_StructConnectionOthers -2009042 螺栓 OST_StructConnectionBolts -2009041 结构连接标记 OST_StructConnectionTags -2009040 锚固件 OST_StructConnectionAnchors -2009039 平板 OST_StructConnectionPlates -2009038 轮廓 OST_StructConnectionProfiles -2009037 参照 OST_StructConnectionReference -2009036 符号 OST_StructConnectionSymbol -2009033 隐藏线 OST_StructConnectionHiddenLines -2009032 结构连接 OST_StructConnections -2009030 边界 OST_FabricAreaBoundary -2009029 结构钢筋网符号 OST_FabricReinSpanSymbol -2009028 钢筋网 OST_FabricReinforcementWire -2009027 边界 OST_FabricReinforcementBoundary -2009026 钢筋集切换 OST_RebarSetToggle -2009025 结构钢筋网标记 OST_FabricReinforcementTags -2009022 结构区域钢筋标记 OST_AreaReinTags -2009021 结构钢筋标记 OST_RebarTags -2009020 <钢筋网片> OST_FabricAreaSketchSheetsLines -2009019 <钢筋网外围> OST_FabricAreaSketchEnvelopeLines -2009018 结构钢筋网区域 OST_FabricAreas -2009017 结构钢筋网 OST_FabricReinforcement -2009016 钢筋保护层参照 OST_RebarCover -2009015 钢筋形状 OST_RebarShape -2009013 边界 OST_PathReinBoundary -2009012 结构路径钢筋标记 OST_PathReinTags -2009011 结构路径钢筋符号 OST_PathReinSpanSymbol -2009010 结构路径钢筋 OST_PathRein -2009009 边界 OST_AreaReinBoundary -2009006 结构区域钢筋符号 OST_AreaReinSpanSymbol -2009005 结构区域钢筋 OST_AreaRein -2009003 结构钢筋 OST_Rebar -2009000 隔热层 OST_FabricationPipeworkInsulation -2008221 内衬 OST_FabricationDuctworkLining -2008220 降 OST_FabricationContainmentDrop -2008219 升 OST_FabricationContainmentRise -2008218 降 OST_FabricationPipeworkDrop -2008217 升 OST_FabricationPipeworkRise -2008216 符号 OST_FabricationContainmentSymbology -2008215 中心线 OST_FabricationContainmentCenterLine -2008214 MEP 预制保护层标记 OST_FabricationContainmentTags -2008213 MEP 预制保护层 OST_FabricationContainment -2008212 符号 OST_FabricationPipeworkSymbology -2008211 中心线 OST_FabricationPipeworkCenterLine -2008210 MEP 预制管道标记 OST_FabricationPipeworkTags -2008209 MEP 预制管道 OST_FabricationPipework -2008208 符号 OST_FabricationDuctworkSymbology -2008207 降 OST_FabricationDuctworkDrop -2008206 升 OST_FabricationDuctworkRise -2008205 MEP 预制支架标记 OST_FabricationHangerTags -2008204 MEP 预制支架 OST_FabricationHangers -2008203 隔热层 OST_FabricationDuctworkInsulation -2008198 中心线 OST_FabricationDuctworkCenterLine -2008196 MEP 预制管网标记 OST_FabricationDuctworkTags -2008194 MEP 预制管网 OST_FabricationDuctwork -2008193 着色 OST_gbXML_Shade -2008187 分析表面 OST_AnalyticSurfaces -2008186 分析空间 OST_AnalyticSpaces -2008185 空气洞口 OST_gbXML_OpeningAir -2008184 非推拉门 OST_gbXML_NonSlidingDoor -2008183 推拉门 OST_gbXML_SlidingDoor -2008182 可操作天窗 OST_gbXML_OperableSkylight -2008181 固定天窗 OST_gbXML_FixedSkylight -2008180 可操作窗口 OST_gbXML_OperableWindow -2008179 固定窗 OST_gbXML_FixedWindow -2008178 地下天花板 OST_gbXML_UndergroundCeiling -2008177 地下板 OST_gbXML_UndergroundSlab -2008176 地下墙 OST_gbXML_UndergroundWall -2008175 空气曲面 OST_gbXML_SurfaceAir -2008174 天花板 OST_gbXML_Ceiling -2008173 内部楼板 OST_gbXML_InteriorFloor -2008172 内墙 OST_gbXML_InteriorWall -2008171 平整表面上的板 OST_gbXML_SlabOnGrade -2008170 活动楼板 OST_gbXML_RaisedFloor -2008169 屋顶 OST_gbXML_Roof -2008168 外墙 OST_gbXML_ExteriorWall -2008167 管段 OST_PipeSegments -2008163 管道占位符 OST_PlaceHolderPipes -2008161 风管占位符 OST_PlaceHolderDucts -2008160 参照线 OST_PipingSystem_Reference_Visibility -2008159 参照线 OST_DuctSystem_Reference_Visibility -2008157 管道隔热层标记 OST_PipeInsulationsTags -2008155 风管内衬标记 OST_DuctLiningsTags -2008154 风管隔热层标记 OST_DuctInsulationsTags -2008153 电气备件/空间电路 OST_ElectricalInternalCircuits -2008152 配电盘明细表图形 OST_PanelScheduleGraphics -2008151 电缆桥架管路 OST_CableTrayRun -2008150 线管管路 OST_ConduitRun -2008149 中心线 OST_ConduitFittingCenterLine -2008141 中心线 OST_CableTrayFittingCenterLine -2008140 中心线 OST_ConduitCenterLine -2008139 降 OST_ConduitDrop -2008138 升 OST_ConduitRiseDrop -2008137 中心线 OST_CableTrayCenterLine -2008136 降 OST_CableTrayDrop -2008135 升 OST_CableTrayRiseDrop -2008134 线管标记 OST_ConduitTags -2008133 线管 OST_Conduit -2008132 电缆桥架标记 OST_CableTrayTags -2008131 电缆桥架 OST_CableTray -2008130 线管配件标记 OST_ConduitFittingTags -2008129 线管配件 OST_ConduitFitting -2008128 电缆桥架配件标记 OST_CableTrayFittingTags -2008127 电缆桥架配件 OST_CableTrayFitting -2008126 布管系统配置 OST_RoutingPreferences -2008125 风管内衬 OST_DuctLinings -2008124 风管隔热层 OST_DuctInsulations -2008123 管道隔热层 OST_PipeInsulations -2008122 参照线 OST_HVAC_Zones_Reference_Visibility -2008118 内部填充 OST_HVAC_Zones_InteriorFill_Visibility -2008117 颜色填充 OST_HVAC_Zones_ColorFill -2008116 分区标记 OST_ZoneTags -2008115 边界 OST_HVAC_Zones_Boundary -2008108 HVAC 区 OST_HVAC_Zones -2008107 开关系统 OST_SwitchSystem -2008101 喷头标记 OST_SprinklerTags -2008100 喷头 OST_Sprinklers -2008099 洞口 OST_GbXML_Opening -2008095 地下 OST_GbXML_SType_Underground -2008094 着色 OST_GbXML_SType_Shade -2008093 外部 OST_GbXML_SType_Exterior -2008092 内部 OST_GbXML_SType_Interior -2008091 分析表面 OST_GbXMLFaces -2008090 回路方向 OST_WireHomeRunArrows -2008089 灯具标记 OST_LightingDeviceTags -2008088 灯具 OST_LightingDevices -2008087 火警设备标记 OST_FireAlarmDeviceTags -2008086 火警设备 OST_FireAlarmDevices -2008085 数据设备标记 OST_DataDeviceTags -2008084 数据设备 OST_DataDevices -2008083 通讯设备标记 OST_CommunicationDeviceTags -2008082 通讯设备 OST_CommunicationDevices -2008081 安全设备标记 OST_SecurityDeviceTags -2008080 安全设备 OST_SecurityDevices -2008079 护理呼叫设备标记 OST_NurseCallDeviceTags -2008078 护理呼叫设备 OST_NurseCallDevices -2008077 电话设备标记 OST_TelephoneDeviceTags -2008076 电话设备 OST_TelephoneDevices -2008075 导线记号 OST_WireTickMarks -2008074 中心线 OST_PipeFittingCenterLine -2008072 降 OST_PipeCurvesDrop -2008069 中心线 OST_DuctFittingCenterLine -2008066 降 OST_DuctCurvesDrop -2008062 风管管件标记 OST_DuctFittingTags -2008061 管件标记 OST_PipeFittingTags -2008060 管道颜色填充 OST_PipeColorFills -2008059 管道颜色填充图例 OST_PipeColorFillLegends -2008058 导线标记 OST_WireTags -2008057 管道附件标记 OST_PipeAccessoryTags -2008056 管道附件 OST_PipeAccessory -2008055 升 OST_PipeCurvesRiseDrop -2008054 填充图案 OST_FlexPipeCurvesPattern -2008053 中心线 OST_FlexPipeCurvesCenterLine -2008051 软管 OST_FlexPipeCurves -2008050 管件 OST_PipeFitting -2008049 软管标记 OST_FlexPipeTags -2008048 管道标记 OST_PipeTags -2008047 中心线 OST_PipeCurvesCenterLine -2008045 管道 OST_PipeCurves -2008044 管道系统 OST_PipingSystem -2008043 导线 OST_Wire -2008039 电路 OST_ElectricalCircuit -2008037 升 OST_DuctCurvesRiseDrop -2008036 填充图案 OST_FlexDuctCurvesPattern -2008023 中心线 OST_FlexDuctCurvesCenterLine -2008021 软风管 OST_FlexDuctCurves -2008020 风管附件标记 OST_DuctAccessoryTags -2008017 风管附件 OST_DuctAccessory -2008016 风管系统 OST_DuctSystem -2008015 风道末端标记 OST_DuctTerminalTags -2008014 风道末端 OST_DuctTerminal -2008013 风管管件 OST_DuctFitting -2008010 风管颜色填充 OST_DuctColorFills -2008005 软风管标记 OST_FlexDuctTags -2008004 风管标记 OST_DuctTags -2008003 中心线 OST_DuctCurvesCenterLine -2008001 风管 OST_DuctCurves -2008000 风管颜色填充图例 OST_DuctColorFillLegends -2007004 桥梁支座 OST_BridgeBearings -2006138 桥梁大梁 OST_BridgeGirders -2006137 桥梁基础 OST_BridgeFoundations -2006136 桥面 OST_BridgeDecks -2006135 桥拱 OST_BridgeArches -2006134 桥梁缆索 OST_BridgeCables -2006133 桥塔 OST_BridgeTowers -2006132 桥墩 OST_BridgePiers -2006131 桥台 OST_BridgeAbutments -2006130 平面视图中的支撑符号 OST_StructuralBracePlanReps -2006110 连接符号 OST_StructConnectionSymbols -2006100 结构注释 OST_StructuralAnnotations -2006090 云线批注标记 OST_RevisionCloudTags -2006080 云线批注 OST_RevisionClouds -2006060 立面标记 OST_ElevationMarks -2006045 轴网标头 OST_GridHeads -2006040 标高标头 OST_LevelHeads -2006020 范围框 OST_VolumeOfInterest -2006000 边界条件 OST_BoundaryConditions -2005301 内部面荷载标记 OST_InternalAreaLoadTags -2005255 内部线荷载标记 OST_InternalLineLoadTags -2005254 内部点荷载标记 OST_InternalPointLoadTags -2005253 面荷载标记 OST_AreaLoadTags -2005252 线荷载标记 OST_LineLoadTags -2005251 点荷载标记 OST_PointLoadTags -2005250 地震荷载 OST_LoadCasesSeismic -2005218 温度荷载 OST_LoadCasesTemperature -2005217 偶然荷载 OST_LoadCasesAccidental -2005216 屋顶活荷载 OST_LoadCasesRoofLive -2005215 雪荷载 OST_LoadCasesSnow -2005214 风荷载 OST_LoadCasesWind -2005213 活荷载 OST_LoadCasesLive -2005212 恒荷载 OST_LoadCasesDead -2005211 结构荷载工况 OST_LoadCases -2005210 内部面荷载 OST_InternalAreaLoads -2005207 内部线荷载 OST_InternalLineLoads -2005206 内部点荷载 OST_InternalPointLoads -2005205 结构内部荷载 OST_InternalLoads -2005204 面荷载 OST_AreaLoads -2005203 线荷载 OST_LineLoads -2005202 点荷载 OST_PointLoads -2005201 结构荷载 OST_Loads -2005200 结构梁系统标记 OST_BeamSystemTags -2005130 基础跨方向符号 OST_FootingSpanDirectionSymbol -2005111 跨方向符号 OST_SpanDirectionSymbol -2005110 高程点符号 OST_SpotElevSymbols -2005100 结构桁架标记 OST_TrussTags -2005030 注释记号标记 OST_KeynoteTags -2005029 详图项目标记 OST_DetailComponentTags -2005028 材质标记 OST_MaterialTags -2005027 楼板标记 OST_FloorTags -2005026 幕墙系统标记 OST_CurtaSystemTags -2005025 楼梯标记 OST_StairsTags -2005023 多类别标记 OST_MultiCategoryTags -2005022 植物标记 OST_PlantingTags -2005021 面积标记 OST_AreaTags -2005020 结构基础标记 OST_StructuralFoundationTags -2005019 结构柱标记 OST_StructuralColumnTags -2005018 停车场标记 OST_ParkingTags -2005017 场地标记 OST_SiteTags -2005016 结构框架标记 OST_StructuralFramingTags -2005015 专用设备标记 OST_SpecialityEquipmentTags -2005014 常规模型标记 OST_GenericModelTags -2005013 幕墙嵌板标记 OST_CurtainWallPanelTags -2005012 墙标记 OST_WallTags -2005011 卫浴装置标记 OST_PlumbingFixtureTags -2005010 机电设备标记 OST_MechanicalEquipmentTags -2005009 照明设备标记 OST_LightingFixtureTags -2005008 家具系统标记 OST_FurnitureSystemTags -2005007 家具标记 OST_FurnitureTags -2005006 电气装置标记 OST_ElectricalFixtureTags -2005004 电气设备标记 OST_ElectricalEquipmentTags -2005003 天花板标记 OST_CeilingTags -2005002 橱柜标记 OST_CaseworkTags -2005001 颜色填充 OST_MEPSpaceColorFill -2003605 参照 OST_MEPSpaceReferenceVisibility -2003602 内墙 OST_MEPSpaceInteriorFillVisibility -2003601 空间 OST_MEPSpaces -2003600 体量着色 OST_MassShade -2003418 体量洞口 OST_MassOpening -2003417 体量天窗 OST_MassSkylights -2003416 体量玻璃 OST_MassGlazing -2003415 体量屋顶 OST_MassRoof -2003414 体量外墙 OST_MassExteriorWall -2003413 体量内墙 OST_MassInteriorWall -2003412 体量分区 OST_MassZone -2003411 体量楼层标记 OST_MassAreaFaceTags -2003410 体量标记 OST_MassTags -2003405 形式 OST_MassForm -2003404 体量楼层 OST_MassFloor -2003403 体量 OST_Mass -2003400 图案填充 OST_DividedSurface_PatternFill -2003327 填充图案线 OST_DividedSurface_PatternLines -2003326 网格线 OST_DividedSurface_Gridlines -2003325 节点 OST_DividedSurface_Nodes -2003324 向下箭头 OST_RampsDownArrow -2003308 向上箭头 OST_RampsUpArrow -2003307 文字(向下) OST_RampsDownText -2003306 文字(向上) OST_RampsUpText -2003305 超出截面线的梯边梁 OST_RampsStringerAboveCut -2003304 梯边梁 OST_RampsStringer -2003303 坡道超出截面线 OST_RampsAboveCut -2003302 面积 OST_Areas -2003200 项目信息 OST_ProjectInformation -2003101 图纸 OST_Sheets -2003100 详图项目 OST_DetailComponents -2002000 屋檐底板 OST_RoofSoffit -2001393 楼板边缘 OST_EdgeSlab -2001392 檐沟 OST_Gutter -2001391 封檐板 OST_Fascia -2001390 环境 OST_Entourage -2001370 植物 OST_Planting -2001360 隐藏线 OST_StructuralStiffenerHiddenLines -2001358 定位线 OST_StructuralColumnLocationLine -2001357 定位线 OST_StructuralFramingLocationLine -2001356 结构加强板标记 OST_StructuralStiffenerTags -2001355 结构加强板 OST_StructuralStiffener -2001354 RVT 链接 OST_RvtLinks -2001352 专用设备 OST_SpecialityEquipment -2001350 刚性链接 OST_ColumnAnalyticalRigidLinks -2001344 次等高线 OST_SecondaryTopographyContours -2001343 主等高线 OST_TopographyContours -2001342 三角形边缘 OST_TopographySurface -2001341 地形 OST_Topography -2001340 地形链接 OST_TopographyLink -2001339 结构桁架 OST_StructuralTruss -2001336 棍状符号 OST_StructuralColumnStickSymbols -2001335 隐藏线 OST_HiddenStructuralColumnLines -2001334 刚性链接 OST_AnalyticalRigidLinks -2001333 结构柱 OST_StructuralColumns -2001330 隐藏线 OST_HiddenStructuralFramingLines -2001329 结构梁系统 OST_StructuralFramingSystem -2001327 结构框架 OST_StructuralFraming -2001320 隐藏线 OST_HiddenStructuralFoundationLines -2001302 结构基础 OST_StructuralFoundation -2001300 测量点 OST_SharedBasePoint -2001272 项目基点 OST_ProjectBasePoint -2001271 建筑红线线段标记 OST_SitePropertyLineSegmentTags -2001269 建筑红线线段 OST_SitePropertyLineSegment -2001268 属性标记 OST_SitePropertyTags -2001267 边界点 OST_SitePointBoundary -2001266 建筑红线 OST_SiteProperty -2001265 建筑地坪 OST_BuildingPad -2001263 内部点 OST_SitePoint -2001262 场地 OST_Site -2001260 道路 OST_Roads -2001220 停车场 OST_Parking -2001180 卫浴装置 OST_PlumbingFixtures -2001160 机械设备 OST_MechanicalEquipment -2001140 光源 OST_LightingFixtureSource -2001121 照明设备 OST_LightingFixtures -2001120 家具系统 OST_FurnitureSystems -2001100 电气装置 OST_ElectricalFixtures -2001060 电气设备 OST_ElectricalEquipment -2001040 橱柜 OST_Casework -2001000 竖井洞口 OST_ShaftOpening -2000996 水力分离符号 OST_PipeHydronicSeparationSymbols -2000988 机械设备集边界线 OST_MechanicalEquipmentSetBoundaryLines -2000987 机械设备集标记 OST_MechanicalEquipmentSetTags -2000986 机械设备集 OST_MechanicalEquipmentSet -2000985 连接线符号 OST_AnalyticalPipeConnectionLineSymbol -2000984 分析管道连接 OST_AnalyticalPipeConnections -2000983 局部坐标系 OST_FndSlabLocalCoordSys -2000976 局部坐标系 OST_FloorLocalCoordSys -2000975 局部坐标系 OST_WallLocalCoordSys -2000974 局部坐标系 OST_BraceLocalCoordSys -2000973 局部坐标系 OST_ColumnLocalCoordSys -2000972 局部坐标系 OST_BeamLocalCoordSys -2000971 多钢筋注释 OST_MultiReferenceAnnotations -2000970 分析节点标记 OST_NodeAnalyticalTags -2000956 分析链接标记 OST_LinkAnalyticalTags -2000955 支撑 OST_StairsSupports -2000952 <高于> 扶手 OST_RailingHandRailAboveCut -2000951 <高于> 顶部扶栏 OST_RailingTopRailAboveCut -2000950 终端 OST_RailingTermination -2000949 支座 OST_RailingSupport -2000948 扶手 OST_RailingHandRail -2000947 顶部扶栏 OST_RailingTopRail -2000946 楼梯踏板/踢面数 OST_StairsTriserNumbers -2000944 楼梯支撑标记 OST_StairsSupportTags -2000942 楼梯平台标记 OST_StairsLandingTags -2000941 楼梯梯段标记 OST_StairsRunTags -2000940 <高于> 向上箭头 OST_StairsPathsAboveCut -2000939 楼梯路径 OST_StairsPaths -2000938 <高于> 踢面线 OST_StairsRiserLinesAboveCut -2000937 踢面线 OST_StairsRiserLines -2000936 <高于> 轮廓 OST_StairsOutlinesAboveCut -2000935 轮廓 OST_StairsOutlines -2000934 <高于> 楼梯前缘线 OST_StairsNosingLinesAboveCut -2000933 楼梯前缘线 OST_StairsNosingLines -2000932 <高于> 剪切标记 OST_StairsCutMarksAboveCut -2000931 剪切标记 OST_StairsCutMarks -2000930 踢面/踏板 OST_StairsTrisers -2000921 平台 OST_StairsLandings -2000920 梯段 OST_StairsRuns -2000919 线 OST_AdaptivePoints_Lines -2000903 平面 OST_AdaptivePoints_Planes -2000902 点 OST_AdaptivePoints_Points -2000901 自适应点 OST_AdaptivePoints -2000900 <空间分隔> OST_MEPSpaceSeparationLines -2000831 线 OST_ReferencePoints_Lines -2000713 平面 OST_ReferencePoints_Planes -2000712 点 OST_ReferencePoints_Points -2000711 参照点 OST_ReferencePoints -2000710 材质 OST_Materials -2000700 截面填充图案 OST_CeilingsCutPattern -2000617 公共边 OST_CeilingsDefault -2000616 面层 2 [5] OST_CeilingsFinish2 -2000615 面层 1 [4] OST_CeilingsFinish1 -2000614 衬底 [2] OST_CeilingsSubstrate -2000613 保温层/空气层 [3] OST_CeilingsInsulation -2000612 结构 [1] OST_CeilingsStructure -2000611 涂膜层 OST_CeilingsMembrane -2000610 内部边缘 OST_FloorsInteriorEdges -2000609 截面填充图案 OST_FloorsCutPattern -2000608 隐藏线 OST_HiddenFloorLines -2000607 公共边 OST_FloorsDefault -2000606 面层 2 [5] OST_FloorsFinish2 -2000605 面层 1 [4] OST_FloorsFinish1 -2000604 衬底 [2] OST_FloorsSubstrate -2000603 保温层/空气层 [3] OST_FloorsInsulation -2000602 结构 [1] OST_FloorsStructure -2000601 涂膜层 OST_FloorsMembrane -2000600 内部边缘 OST_RoofsInteriorEdges -2000598 截面填充图案 OST_RoofsCutPattern -2000597 公共边 OST_RoofsDefault -2000596 面层 2 [5] OST_RoofsFinish2 -2000595 面层 1 [4] OST_RoofsFinish1 -2000594 衬底 [2] OST_RoofsSubstrate -2000593 保温层/空气层 [3] OST_RoofsInsulation -2000592 结构 [1] OST_RoofsStructure -2000591 涂膜层 OST_RoofsMembrane -2000590 截面填充图案 OST_WallsCutPattern -2000588 隐藏线 OST_HiddenWallLines -2000587 公共边 OST_WallsDefault -2000586 面层 2 [5] OST_WallsFinish2 -2000585 面层 1 [4] OST_WallsFinish1 -2000584 衬底 [2] OST_WallsSubstrate -2000583 保温层/空气层 [3] OST_WallsInsulation -2000582 结构 [1] OST_WallsStructure -2000581 涂膜层 OST_WallsMembrane -2000580 明细表 OST_Schedules -2000573 明细表图形 OST_ScheduleGraphics -2000570 光栅图像 OST_RasterImages -2000560 颜色填充 OST_RoomColorFill -2000551 颜色填充图例 OST_ColorFillLegends -2000550 注释裁剪边界 OST_AnnotationCropSpecial -2000549 裁剪边界 OST_CropBoundarySpecial -2000548 注释裁剪边界 OST_AnnotationCrop -2000547 详图索引引线 OST_CalloutLeaderLine -2000544 表面填充图案 OST_CeilingsSurfacePattern -2000543 表面填充图案 OST_RoofsSurfacePattern -2000542 表面填充图案 OST_FloorsSurfacePattern -2000541 表面填充图案 OST_WallsSurfacePattern -2000540 详图索引边界 OST_CalloutBoundary -2000539 详图索引标头 OST_CalloutHeads -2000538 详图索引 OST_Callouts -2000537 裁剪边界 OST_CropBoundary -2000536 立面 OST_Elev -2000535 参照平面 OST_CLines -2000530 视图标题 OST_ViewportLabel -2000515 视口 OST_Viewports -2000510 相机 OST_Camera_Lines -2000501 空间标记 OST_MEPSpaceTags -2000485 房间标记 OST_RoomTags -2000480 门标记 OST_DoorTags -2000460 窗标记 OST_WindowTags -2000450 宽线 OST_SectionHeadWideLines -2000404 中粗线 OST_SectionHeadMediumLines -2000403 细线 OST_SectionHeadThinLines -2000401 剖面标头 OST_SectionHeads -2000400 等高线标签 OST_ContourLabels -2000350 幕墙系统 OST_CurtaSystem -2000340 幕墙系统网格 OST_CurtainGridsCurtaSystem -2000323 幕墙网格 OST_CurtainGridsWall -2000321 幕墙屋顶网格 OST_CurtainGridsRoof -2000320 分析显示样式 OST_AnalysisDisplayStyle -2000304 分析结果 OST_AnalysisResults -2000303 渲染区域 OST_RenderRegions -2000302 剖面框 OST_SectionBox -2000301 文字注释 OST_TextNotes -2000300 <中心线> OST_CenterLines -2000288 <超出> OST_LinesBeyond -2000287 <隐藏> OST_HiddenLines -2000286 <已拆除> OST_DemolishedLines -2000285 <架空线> OST_OverheadLines -2000284 宽线 OST_TitleBlockWideLines -2000283 中粗线 OST_TitleBlockMediumLines -2000282 细线 OST_TitleBlockThinLines -2000281 图框 OST_TitleBlocks -2000280 视图 OST_Views -2000279 隐藏线 OST_PartHiddenLines -2000271 零件标记 OST_PartTags -2000270 组成部分 OST_Parts -2000269 部件标记 OST_AssemblyTags -2000268 部件 OST_Assemblies -2000267 屋顶标记 OST_RoofTags -2000266 高程点坡度 OST_SpotSlopes -2000265 高程点坐标 OST_SpotCoordinates -2000264 高程点 OST_SpotElevations -2000263 自动绘制尺寸标注 OST_WeakDims -2000261 尺寸标注 OST_Dimensions -2000260 标高 OST_Levels -2000240 位移路径 OST_DisplacementPath -2000223 多段轴网 OST_GridChains -2000221 轴网 OST_Grids -2000220 断开剖面线 OST_BrokenSectionLine -2000202 剖面线 OST_SectionLine -2000201 剖面 OST_Sections -2000200 视图参照 OST_ReferenceViewer -2000198 视图参照 OST_ReferenceViewerSymbol -2000197 在族中导入 OST_ImportObjectStyles -2000196 遮罩区域 OST_MaskingRegion -2000194 拼接线 OST_Matchline -2000193 平面区域 OST_PlanRegion -2000191 填充区域 OST_FilledRegion -2000190 墙饰条 OST_Cornices -2000181 坡道 OST_Ramps -2000180 幕墙网格 OST_CurtainGrids -2000173 幕墙竖梃 OST_CurtainWallMullions -2000171 幕墙嵌板 OST_CurtainWallPanels -2000170 颜色填充 OST_AreaColorFill -2000165 参照 OST_AreaReferenceVisibility -2000164 内部填充 OST_AreaInteriorFillVisibility -2000163 参照 OST_RoomReferenceVisibility -2000162 内部填充 OST_RoomInteriorFillVisibility -2000161 房间 OST_Rooms -2000160 常规模型 OST_GenericModel -2000151 常规注释 OST_GenericAnnotation -2000150 栏杆扶手标记 OST_StairsRailingTags -2000133 <高于> 栏杆扶手截面线 OST_StairsRailingAboveCut -2000132 向下箭头 OST_StairsDownArrows -2000131 向上箭头 OST_StairsUpArrows -2000130 文字(向下) OST_StairsDownText -2000129 扶栏 OST_StairsRailingRail -2000128 栏杆 OST_StairsRailingBaluster -2000127 栏杆扶手 OST_StairsRailing -2000126 文字(向上) OST_StairsUpText -2000125 <高于> 支撑 OST_StairsSupportsAboveCut -2000124 支撑 OST_StairsStringerCarriage -2000123 楼梯 OST_Stairs -2000120 导向轴网 OST_GuideGrid -2000107 柱 OST_Columns -2000100 模型组 OST_IOSModelGroups -2000095 参照线 OST_ReferenceLines -2000083 家具 OST_Furniture -2000080 <面积边界> OST_AreaSchemeLines -2000079 线 OST_GenericLines -2000078 隔热层线 OST_InsulationLines -2000077 <房间分隔> OST_RoomSeparationLines -2000066 旋转轴 OST_AxisOfRotation -2000065 线 OST_Lines -2000051 <草图> OST_SketchLines -2000045 宽线 OST_CurvesWideLines -2000044 中粗线 OST_CurvesMediumLines -2000043 细线 OST_CurvesThinLines -2000042 天花板 OST_Ceilings -2000038 屋顶 OST_Roofs -2000035 楼板 OST_Floors -2000032 玻璃 OST_DoorsGlassProjection -2000031 框架/竖梃 OST_DoorsFrameMullionProjection -2000029 洞口 OST_DoorsOpeningProjection -2000027 嵌板 OST_DoorsPanelProjection -2000025 门 OST_Doors -2000023 洞口 OST_WindowsOpeningProjection -2000022 窗台/盖板 OST_WindowsSillHeadProjection -2000020 框架/竖梃 OST_WindowsFrameMullionProjection -2000018 玻璃 OST_WindowsGlassProjection -2000016 窗 OST_Windows -2000014 墙 OST_Walls -2000011
]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ .NET
+
+ Revit
+
+
+
+
+
+
+
+
+ BuildInCategory枚举 - 完整
+
+ /post/revit-category-all/
+
+ Revit二次开发中经常用到BuildInCategory 过滤元素,以下是通过遍历该枚举获取的数据,其中部分类别的名称未能获取到,显示为Unknown ,请悉知。中文名称 名称 值 Unknown OST_StackedWalls_Obsolete_IdInWrongRange -20034100 Unknown OST_MassTags_Obsolete_IdInWrongRange -20034005 Unknown OST_MassSurface_Obsolete_IdInWrongRange -20034004 Unknown OST_MassFloor_Obsolete_IdInWrongRange -20034003 Unknown OST_Mass_Obsolete_IdInWrongRange -20034000 Unknown OST_WallRefPlanes_Obsolete_IdInWrongRange -20000896 Unknown OST_StickSymbols_Obsolete_IdInWrongRange -20000828 Unknown OST_RemovedGridSeg_Obsolete_IdInWrongRange -20000827 Unknown OST_PointClouds -2010001 Unknown OST_AssemblyOrigin_Lines -2009661 Unknown OST_AssemblyOrigin_Planes -2009660 Unknown OST_AssemblyOrigin_Points -2009659 Unknown OST_AssemblyOrigin -2009658 分析链接 OST_LinksAnalytical -2009657 分析楼板基础标记 OST_FoundationSlabAnalyticalTags -2009656 分析条形基础标记 OST_WallFoundationAnalyticalTags -2009655 分析独立基础标记 OST_IsolatedFoundationAnalyticalTags -2009654 分析墙标记 OST_WallAnalyticalTags -2009653 分析楼层标记 OST_FloorAnalyticalTags -2009652 分析柱标记 OST_ColumnAnalyticalTags -2009651 分析支撑标记 OST_BraceAnalyticalTags -2009650 分析梁标记 OST_BeamAnalyticalTags -2009649 Unknown OST_AnalyticalNodes_Lines -2009648 Unknown OST_AnalyticalNodes_Planes -2009647 Unknown OST_AnalyticalNodes_Points -2009646 分析节点 OST_AnalyticalNodes -2009645 Unknown OST_RigidLinksAnalytical -2009644 分析基础底板 OST_FoundationSlabAnalytical -2009643 分析条形基础 OST_WallFoundationAnalytical -2009642 分析独立基础 OST_IsolatedFoundationAnalytical -2009641 分析墙 OST_WallAnalytical -2009640 分析楼层 OST_FloorAnalytical -2009639 顶部线段 OST_ColumnEndSegment -2009638 基准线段 OST_ColumnStartSegment -2009637 分析柱 OST_ColumnAnalytical -2009636 末端线段 OST_BraceEndSegment -2009635 起点线段 OST_BraceStartSegment -2009634 分析支撑 OST_BraceAnalytical -2009633 末端线段 OST_BeamEndSegment -2009632 起点线段 OST_BeamStartSegment -2009631 分析梁 OST_BeamAnalytical -2009630 Unknown OST_CompassSecondaryMonth -2009624 Unknown OST_CompassPrimaryMonth -2009623 Unknown OST_CompassSectionFilled -2009622 Unknown OST_LightLine -2009621 Unknown OST_MultiSurface -2009620 Unknown OST_SunSurface -2009619 Unknown OST_Analemma -2009618 Unknown OST_SunsetText -2009617 Unknown OST_CompassSection -2009616 Unknown OST_CompassOuter -2009615 Unknown OST_SunriseText -2009614 Unknown OST_CompassInner -2009613 Unknown OST_SunPath2 -2009612 Unknown OST_SunPath1 -2009611 Unknown OST_Sun -2009610 Unknown OST_SunStudy -2009609 棍状符号 OST_StructuralTrussStickSymbols -2009608 Unknown OST_StructuralTrussHiddenLines -2009607 Unknown OST_TrussChord -2009606 Unknown OST_TrussWeb -2009605 Unknown OST_TrussBottomChordCurve -2009604 Unknown OST_TrussTopChordCurve -2009603 Unknown OST_TrussVertWebCurve -2009602 Unknown OST_TrussDiagWebCurve -2009601 Unknown OST_Truss -2009600 Unknown OST_RailingSystemTransitionHiddenLines_Deprecated -2009549 Unknown OST_RailingSystemTerminationHiddenLines_Deprecated -20095 Unknown OST_RailingSystemRailHiddenLines_Deprecated -2009547 Unknown OST_RailingSystemTopRailHiddenLines_Deprecated -2009546 Unknown OST_RailingSystemHandRailBracketHiddenLines_Deprecated -2 Unknown OST_RailingSystemHandRailHiddenLines_Deprecated -2009544 Unknown OST_RailingSystemPanelBracketHiddenLines_Deprecated -2009 Unknown OST_RailingSystemPanelHiddenLines_Deprecated -2009542 Unknown OST_RailingSystemBalusterHiddenLines_Deprecated -2009541 Unknown OST_RailingSystemPostHiddenLines_Deprecated -2009540 Unknown OST_RailingSystemSegmentHiddenLines_Deprecated -2009539 Unknown OST_RailingSystemHiddenLines_Deprecated -2009538 Unknown OST_StairStringer2012HiddenLines_Deprecated -2009537 Unknown OST_StairTread2012HiddenLines_Deprecated -2009536 Unknown OST_StairLanding2012HiddenLines_Deprecated -2009535 Unknown OST_StairRun2012HiddenLines_Deprecated -2009534 Unknown OST_Stairs2012HiddenLines_Deprecated -2009533 隐藏线 OST_MassHiddenLines -2009532 隐藏线 OST_CurtaSystemHiddenLines -2009531 Unknown OST_OBSOLETE_ElemArrayHiddenLines -2009530 隐藏线 OST_EntourageHiddenLines -2009529 隐藏线 OST_PlantingHiddenLines -2009528 隐藏线 OST_SpecialityEquipmentHiddenLines -2009527 隐藏线 OST_TopographyHiddenLines -2009526 Unknown OST_StructuralFramingSystemHiddenLines_Obsolete -2009525 隐藏线 OST_SiteHiddenLines -2009524 隐藏线 OST_RoadsHiddenLines -2009523 隐藏线 OST_ParkingHiddenLines -2009522 隐藏线 OST_PlumbingFixturesHiddenLines -2009521 隐藏线 OST_MechanicalEquipmentHiddenLines -2009520 隐藏线 OST_LightingFixturesHiddenLines -2009519 隐藏线 OST_FurnitureSystemsHiddenLines -2009518 隐藏线 OST_ElectricalFixturesHiddenLines -2009517 隐藏线 OST_ElectricalEquipmentHiddenLines -2009516 隐藏线 OST_CaseworkHiddenLines -2009515 隐藏线 OST_DetailComponentsHiddenLines -2009514 隐藏线 OST_ShaftOpeningHiddenLines -2009513 隐藏线 OST_GenericModelHiddenLines -2009512 隐藏线 OST_CurtainWallMullionsHiddenLines -2009511 隐藏线 OST_CurtainWallPanelsHiddenLines -2009510 隐藏线 OST_RampsHiddenLines -2009509 隐藏线 OST_StairsRailingHiddenLines -2009508 隐藏线 OST_StairsHiddenLines -2009507 隐藏线 OST_ColumnsHiddenLines -2009506 隐藏线 OST_FurnitureHiddenLines -2009505 隐藏线 OST_LinesHiddenLines -2009504 隐藏线 OST_CeilingsHiddenLines -2009503 隐藏线 OST_RoofsHiddenLines -2009502 隐藏线 OST_DoorsHiddenLines -2009501 隐藏线 OST_WindowsHiddenLines -2009500 轮廓标记 OST_StructConnectionProfilesTags -2009064 孔标记 OST_StructConnectionHoleTags -2009063 隐藏线 OST_CouplerHiddenLines -2009062 结构钢筋接头标记 OST_CouplerTags -2009061 结构钢筋接头 OST_Coupler -2009060 焊接标记 OST_StructConnectionWeldTags -2009059 剪力钉标记 OST_StructConnectionShearStudTags -2009058 锚固件标记 OST_StructConnectionAnchorTags -2009057 螺栓标记 OST_StructConnectionBoltTags -2009056 板标记 OST_StructConnectionPlateTags -2009055 隐藏线 OST_RebarHiddenLines -2009050 Unknown OST_StructSubConnections -2009049 修改器 OST_StructConnectionModifiers -2009047 焊缝 OST_StructConnectionWelds -2009046 孔 OST_StructConnectionHoles -2009045 剪力钉 OST_StructConnectionShearStuds -2009044 Unknown OST_StructConnectionNobleWarning -2009043 其他 OST_StructConnectionOthers -2009042 螺栓 OST_StructConnectionBolts -2009041 结构连接标记 OST_StructConnectionTags -2009040 锚固件 OST_StructConnectionAnchors -2009039 平板 OST_StructConnectionPlates -2009038 轮廓 OST_StructConnectionProfiles -2009037 参照 OST_StructConnectionReference -2009036 Unknown OST_StructConnectionFailed -2009035 Unknown OST_StructConnectionStale -2009034 符号 OST_StructConnectionSymbol -2009033 隐藏线 OST_StructConnectionHiddenLines -2009032 Unknown OST_StructWeldLines -2009031 结构连接 OST_StructConnections -2009030 边界 OST_FabricAreaBoundary -2009029 结构钢筋网符号 OST_FabricReinSpanSymbol -2009028 钢筋网 OST_FabricReinforcementWire -2009027 边界 OST_FabricReinforcementBoundary -2009026 钢筋集切换 OST_RebarSetToggle -2009025 Unknown OST_FabricAreaTags -2009023 结构钢筋网标记 OST_FabricReinforcementTags -2009022 结构区域钢筋标记 OST_AreaReinTags -2009021 结构钢筋标记 OST_RebarTags -2009020 <钢筋网片> OST_FabricAreaSketchSheetsLines -2009019 <钢筋网外围> OST_FabricAreaSketchEnvelopeLines -2009018 结构钢筋网区域 OST_FabricAreas -2009017 结构钢筋网 OST_FabricReinforcement -2009016 钢筋保护层参照 OST_RebarCover -2009015 Unknown OST_CoverType -2009014 钢筋形状 OST_RebarShape -2009013 边界 OST_PathReinBoundary -2009012 结构路径钢筋标记 OST_PathReinTags -2009011 结构路径钢筋符号 OST_PathReinSpanSymbol -2009010 结构路径钢筋 OST_PathRein -2009009 Unknown OST_Cage -2009008 Unknown OST_AreaReinXVisibility -2009007 边界 OST_AreaReinBoundary -2009006 结构区域钢筋符号 OST_AreaReinSpanSymbol -2009005 Unknown OST_AreaReinSketchOverride -2009004 结构区域钢筋 OST_AreaRein -2009003 Unknown OST_RebarLines -2009002 Unknown OST_RebarSketchLines -2009001 结构钢筋 OST_Rebar -2009000 隔热层 OST_FabricationPipeworkInsulation -2008221 内衬 OST_FabricationDuctworkLining -2008220 降 OST_FabricationContainmentDrop -2008219 升 OST_FabricationContainmentRise -2008218 降 OST_FabricationPipeworkDrop -2008217 升 OST_FabricationPipeworkRise -2008216 符号 OST_FabricationContainmentSymbology -2008215 中心线 OST_FabricationContainmentCenterLine -2008214 MEP 预制保护层标记 OST_FabricationContainmentTags -2008213 MEP 预制保护层 OST_FabricationContainment -2008212 符号 OST_FabricationPipeworkSymbology -2008211 中心线 OST_FabricationPipeworkCenterLine -2008210 MEP 预制管道标记 OST_FabricationPipeworkTags -2008209 MEP 预制管道 OST_FabricationPipework -2008208 符号 OST_FabricationDuctworkSymbology -2008207 降 OST_FabricationDuctworkDrop -2008206 升 OST_FabricationDuctworkRise -2008205 MEP 预制支架标记 OST_FabricationHangerTags -2008204 MEP 预制支架 OST_FabricationHangers -2008203 Unknown OST_OBSOLETE_FabricationPartsTmpGraphicDropDrag -200820 Unknown OST_FabricationPartsTmpGraphicDrag -2008201 Unknown OST_OBSOLETE_FabricationPartsTmpGraphicDrop -2008200 Unknown OST_FabricationPartsTmpGraphicEnd -2008199 隔热层 OST_FabricationDuctworkInsulation -2008198 Unknown OST_LayoutNodes -2008197 中心线 OST_FabricationDuctworkCenterLine -2008196 Unknown OST_FabricationServiceElements -2008195 MEP 预制管网标记 OST_FabricationDuctworkTags -2008194 MEP 预制管网 OST_FabricationDuctwork -2008193 Unknown OST_LayoutPathBase_Pipings -2008192 Unknown OST_NumberingSchemas -2008191 Unknown OST_DivisionRules -2008190 着色 OST_gbXML_Shade -2008187 分析表面 OST_AnalyticSurfaces -2008186 分析空间 OST_AnalyticSpaces -2008185 空气洞口 OST_gbXML_OpeningAir -2008184 非推拉门 OST_gbXML_NonSlidingDoor -2008183 推拉门 OST_gbXML_SlidingDoor -2008182 可操作天窗 OST_gbXML_OperableSkylight -2008181 固定天窗 OST_gbXML_FixedSkylight -2008180 可操作窗口 OST_gbXML_OperableWindow -2008179 固定窗 OST_gbXML_FixedWindow -2008178 地下天花板 OST_gbXML_UndergroundCeiling -2008177 地下板 OST_gbXML_UndergroundSlab -2008176 地下墙 OST_gbXML_UndergroundWall -2008175 空气曲面 OST_gbXML_SurfaceAir -2008174 天花板 OST_gbXML_Ceiling -2008173 内部楼板 OST_gbXML_InteriorFloor -2008172 内墙 OST_gbXML_InteriorWall -2008171 平整表面上的板 OST_gbXML_SlabOnGrade -2008170 活动楼板 OST_gbXML_RaisedFloor -2008169 屋顶 OST_gbXML_Roof -2008168 外墙 OST_gbXML_ExteriorWall -2008167 Unknown OST_DivisionProfile -2008165 Unknown OST_SplitterProfile -2008164 管段 OST_PipeSegments -2008163 Unknown OST_GraphicalWarning_OpenConnector -2008162 管道占位符 OST_PlaceHolderPipes -2008161 风管占位符 OST_PlaceHolderDucts -2008160 参照线 OST_PipingSystem_Reference_Visibility -2008159 Unknown OST_PipingSystem_Reference -2008158 参照线 OST_DuctSystem_Reference_Visibility -2008157 Unknown OST_DuctSystem_Reference -2008156 管道隔热层标记 OST_PipeInsulationsTags -2008155 风管内衬标记 OST_DuctLiningsTags -2008154 风管隔热层标记 OST_DuctInsulationsTags -2008153 电气备件/空间电路 OST_ElectricalInternalCircuits -2008152 配电盘明细表图形 OST_PanelScheduleGraphics -2008151 电缆桥架管路 OST_CableTrayRun -2008150 线管管路 OST_ConduitRun -2008149 Unknown OST_ParamElemElectricalLoadClassification -2008148 Unknown OST_DataPanelScheduleTemplates -2008147 Unknown OST_SwitchboardScheduleTemplates -2008146 Unknown OST_BranchPanelScheduleTemplates -2008145 Unknown OST_ConduitStandards -2008144 Unknown OST_ElectricalLoadClassifications -2008143 Unknown OST_ElectricalDemandFactorDefinitions -2008142 中心线 OST_ConduitFittingCenterLine -2008141 中心线 OST_CableTrayFittingCenterLine -2008140 中心线 OST_ConduitCenterLine -2008139 降 OST_ConduitDrop -2008138 升 OST_ConduitRiseDrop -2008137 中心线 OST_CableTrayCenterLine -2008136 降 OST_CableTrayDrop -2008135 升 OST_CableTrayRiseDrop -2008134 线管标记 OST_ConduitTags -2008133 线管 OST_Conduit -2008132 电缆桥架标记 OST_CableTrayTags -2008131 电缆桥架 OST_CableTray -2008130 线管配件标记 OST_ConduitFittingTags -2008129 线管配件 OST_ConduitFitting -2008128 电缆桥架配件标记 OST_CableTrayFittingTags -2008127 电缆桥架配件 OST_CableTrayFitting -2008126 布管系统配置 OST_RoutingPreferences -2008125 风管内衬 OST_DuctLinings -2008124 风管隔热层 OST_DuctInsulations -2008123 管道隔热层 OST_PipeInsulations -2008122 Unknown OST_HVAC_Load_Schedules -2008121 Unknown OST_HVAC_Load_Building_Types -2008120 Unknown OST_HVAC_Load_Space_Types -2008119 参照线 OST_HVAC_Zones_Reference_Visibility -2008118 内部填充 OST_HVAC_Zones_InteriorFill_Visibility -2008117 颜色填充 OST_HVAC_Zones_ColorFill -2008116 分区标记 OST_ZoneTags -2008115 Unknown OST_LayoutPath_Bases -2008114 Unknown OST_WireTemperatureRatings -2008113 Unknown OST_WireInsulations -2008112 Unknown OST_WireMaterials -2008111 Unknown OST_HVAC_Zones_Reference -2008110 Unknown OST_HVAC_Zones_InteriorFill -2008109 边界 OST_HVAC_Zones_Boundary -2008108 HVAC 区 OST_HVAC_Zones -2008107 Unknown OST_Fluids -2008106 Unknown OST_PipeSchedules -2008105 Unknown OST_PipeMaterials -2008104 Unknown OST_PipeConnections -2008103 Unknown OST_EAConstructions -2008102 开关系统 OST_SwitchSystem -2008101 喷头标记 OST_SprinklerTags -2008100 喷头 OST_Sprinklers -2008099 Unknown OST_RouteCurveBranch -2008098 Unknown OST_RouteCurveMain -2008097 Unknown OST_RouteCurve -2008096 洞口 OST_GbXML_Opening -2008095 地下 OST_GbXML_SType_Underground -2008094 着色 OST_GbXML_SType_Shade -2008093 外部 OST_GbXML_SType_Exterior -2008092 内部 OST_GbXML_SType_Interior -2008091 分析表面 OST_GbXMLFaces -2008090 回路方向 OST_WireHomeRunArrows -2008089 灯具标记 OST_LightingDeviceTags -2008088 灯具 OST_LightingDevices -2008087 火警设备标记 OST_FireAlarmDeviceTags -2008086 火警设备 OST_FireAlarmDevices -2008085 数据设备标记 OST_DataDeviceTags -2008084 数据设备 OST_DataDevices -2008083 通讯设备标记 OST_CommunicationDeviceTags -2008082 通讯设备 OST_CommunicationDevices -2008081 安全设备标记 OST_SecurityDeviceTags -2008080 安全设备 OST_SecurityDevices -2008079 护理呼叫设备标记 OST_NurseCallDeviceTags -2008078 护理呼叫设备 OST_NurseCallDevices -2008077 电话设备标记 OST_TelephoneDeviceTags -2008076 电话设备 OST_TelephoneDevices -2008075 导线记号 OST_WireTickMarks -2008074 Unknown OST_PipeFittingInsulation -2008073 中心线 OST_PipeFittingCenterLine -2008072 Unknown OST_FlexPipeCurvesInsulation -2008071 Unknown OST_PipeCurvesInsulation -2008070 降 OST_PipeCurvesDrop -2008069 Unknown OST_DuctFittingLining -2008068 Unknown OST_DuctFittingInsulation -2008067 中心线 OST_DuctFittingCenterLine -2008066 Unknown OST_FlexDuctCurvesInsulation -2008065 Unknown OST_DuctCurvesLining -2008064 Unknown OST_DuctCurvesInsulation -2008063 降 OST_DuctCurvesDrop -2008062 风管管件标记 OST_DuctFittingTags -2008061 管件标记 OST_PipeFittingTags -2008060 管道颜色填充 OST_PipeColorFills -2008059 管道颜色填充图例 OST_PipeColorFillLegends -2008058 导线标记 OST_WireTags -2008057 管道附件标记 OST_PipeAccessoryTags -2008056 管道附件 OST_PipeAccessory -2008055 升 OST_PipeCurvesRiseDrop -2008054 填充图案 OST_FlexPipeCurvesPattern -2008053 Unknown OST_FlexPipeCurvesContour -2008052 中心线 OST_FlexPipeCurvesCenterLine -2008051 软管 OST_FlexPipeCurves -2008050 管件 OST_PipeFitting -2008049 软管标记 OST_FlexPipeTags -2008048 管道标记 OST_PipeTags -2008047 Unknown OST_PipeCurvesContour -2008046 中心线 OST_PipeCurvesCenterLine -2008045 管道 OST_PipeCurves -2008044 管道系统 OST_PipingSystem -2008043 Unknown OST_ElectricalDemandFactor -2008042 Unknown OST_ElecDistributionSys -2008041 Unknown OST_ElectricalVoltage -2008040 导线 OST_Wire -2008039 Unknown OST_ElectricalCircuitTags -2008038 电路 OST_ElectricalCircuit -2008037 升 OST_DuctCurvesRiseDrop -2008036 填充图案 OST_FlexDuctCurvesPattern -2008023 Unknown OST_FlexDuctCurvesContour -2008022 中心线 OST_FlexDuctCurvesCenterLine -2008021 软风管 OST_FlexDuctCurves -2008020 风管附件标记 OST_DuctAccessoryTags -2008017 风管附件 OST_DuctAccessory -2008016 风管系统 OST_DuctSystem -2008015 风道末端标记 OST_DuctTerminalTags -2008014 风道末端 OST_DuctTerminal -2008013 风管管件 OST_DuctFitting -2008010 风管颜色填充 OST_DuctColorFills -2008005 软风管标记 OST_FlexDuctTags -2008004 风管标记 OST_DuctTags -2008003 Unknown OST_DuctCurvesContour -2008002 中心线 OST_DuctCurvesCenterLine -2008001 风管 OST_DuctCurves -2008000 风管颜色填充图例 OST_DuctColorFillLegends -2007004 Unknown OST_ConnectorElemZAxis -2007003 Unknown OST_ConnectorElemYAxis -2007002 Unknown OST_ConnectorElemXAxis -2007001 Unknown OST_ConnectorElem -2007000 Unknown OST_BridgeBearingTags -2006178 Unknown OST_BridgeGirderTags -2006177 Unknown OST_BridgeFoundationTags -2006176 Unknown OST_BridgeDeckTags -2006175 Unknown OST_BridgeArchTags -2006174 Unknown OST_BridgeCableTags -2006173 Unknown OST_BridgeTowerTags -2006172 Unknown OST_BridgePierTags -2006171 Unknown OST_BridgeAbutmentTags -2006170 Unknown OST_BridgeBearingHiddenLines -2006158 Unknown OST_BridgeGirderHiddenLines -2006157 Unknown OST_BridgeFoundationHiddenLines -2006156 Unknown OST_BridgeDeckHiddenLines -2006155 Unknown OST_BridgeArchHiddenLines -2006154 Unknown OST_BridgeCableHiddenLines -2006153 Unknown OST_BridgeTowerHiddenLines -2006152 Unknown OST_BridgePierHiddenLines -2006151 Unknown OST_BridgeAbutmentHiddenLines -2006150 桥梁支座 OST_BridgeBearings -2006138 桥梁大梁 OST_BridgeGirders -2006137 桥梁基础 OST_BridgeFoundations -2006136 桥面 OST_BridgeDecks -2006135 桥拱 OST_BridgeArches -2006134 桥梁缆索 OST_BridgeCables -2006133 桥塔 OST_BridgeTowers -2006132 桥墩 OST_BridgePiers -2006131 桥台 OST_BridgeAbutments -2006130 Unknown OST_DesignOptions -2006114 Unknown OST_DesignOptionSets -2006112 平面视图中的支撑符号 OST_StructuralBracePlanReps -2006110 连接符号 OST_StructConnectionSymbols -2006100 结构注释 OST_StructuralAnnotations -2006090 云线批注标记 OST_RevisionCloudTags -2006080 Unknown OST_Revisions -2006070 云线批注 OST_RevisionClouds -2006060 Unknown OST_EditCutProfile -2006050 立面标记 OST_ElevationMarks -2006045 轴网标头 OST_GridHeads -2006040 标高标头 OST_LevelHeads -2006020 Unknown OST_DecalType -2006002 Unknown OST_DecalElement -2006001 范围框 OST_VolumeOfInterest -2006000 边界条件 OST_BoundaryConditions -2005301 内部面荷载标记 OST_InternalAreaLoadTags -2005255 内部线荷载标记 OST_InternalLineLoadTags -2005254 内部点荷载标记 OST_InternalPointLoadTags -2005253 面荷载标记 OST_AreaLoadTags -2005252 线荷载标记 OST_LineLoadTags -2005251 点荷载标记 OST_PointLoadTags -2005250 地震荷载 OST_LoadCasesSeismic -2005218 温度荷载 OST_LoadCasesTemperature -2005217 偶然荷载 OST_LoadCasesAccidental -2005216 屋顶活荷载 OST_LoadCasesRoofLive -2005215 雪荷载 OST_LoadCasesSnow -2005214 风荷载 OST_LoadCasesWind -2005213 活荷载 OST_LoadCasesLive -2005212 恒荷载 OST_LoadCasesDead -2005211 结构荷载工况 OST_LoadCases -2005210 内部面荷载 OST_InternalAreaLoads -2005207 内部线荷载 OST_InternalLineLoads -2005206 内部点荷载 OST_InternalPointLoads -2005205 结构内部荷载 OST_InternalLoads -2005204 面荷载 OST_AreaLoads -2005203 线荷载 OST_LineLoads -2005202 点荷载 OST_PointLoads -2005201 结构荷载 OST_Loads -2005200 结构梁系统标记 OST_BeamSystemTags -2005130 基础跨方向符号 OST_FootingSpanDirectionSymbol -2005111 跨方向符号 OST_SpanDirectionSymbol -2005110 Unknown OST_SpotSlopesSymbols -2005102 Unknown OST_SpotCoordinateSymbols -2005101 高程点符号 OST_SpotElevSymbols -2005100 Unknown OST_StructuralConnectionHandlerTags_Deprecated -2005031 结构桁架标记 OST_TrussTags -2005030 注释记号标记 OST_KeynoteTags -2005029 详图项目标记 OST_DetailComponentTags -2005028 材质标记 OST_MaterialTags -2005027 楼板标记 OST_FloorTags -2005026 幕墙系统标记 OST_CurtaSystemTags -2005025 Unknown OST_HostFinTags -2005024 楼梯标记 OST_StairsTags -2005023 多类别标记 OST_MultiCategoryTags -2005022 植物标记 OST_PlantingTags -2005021 面积标记 OST_AreaTags -2005020 结构基础标记 OST_StructuralFoundationTags -2005019 结构柱标记 OST_StructuralColumnTags -2005018 停车场标记 OST_ParkingTags -2005017 场地标记 OST_SiteTags -2005016 结构框架标记 OST_StructuralFramingTags -2005015 专用设备标记 OST_SpecialityEquipmentTags -2005014 常规模型标记 OST_GenericModelTags -2005013 幕墙嵌板标记 OST_CurtainWallPanelTags -2005012 墙标记 OST_WallTags -2005011 卫浴装置标记 OST_PlumbingFixtureTags -2005010 机电设备标记 OST_MechanicalEquipmentTags -2005009 照明设备标记 OST_LightingFixtureTags -2005008 家具系统标记 OST_FurnitureSystemTags -2005007 家具标记 OST_FurnitureTags -2005006 电气装置标记 OST_ElectricalFixtureTags -2005004 电气设备标记 OST_ElectricalEquipmentTags -2005003 天花板标记 OST_CeilingTags -2005002 橱柜标记 OST_CaseworkTags -2005001 Unknown OST_Tags -2005000 颜色填充 OST_MEPSpaceColorFill -2003605 Unknown OST_MEPSpaceReference -2003604 Unknown OST_MEPSpaceInteriorFill -2003603 参照 OST_MEPSpaceReferenceVisibility -2003602 内墙 OST_MEPSpaceInteriorFillVisibility -2003601 空间 OST_MEPSpaces -2003600 Unknown OST_StackedWalls -2003500 Unknown OST_MassGlazingAll -2003423 Unknown OST_MassFloorsAll -2003422 Unknown OST_MassWallsAll -2003421 Unknown OST_MassExteriorWallUnderground -2003420 Unknown OST_MassSlab -2003419 体量着色 OST_MassShade -2003418 体量洞口 OST_MassOpening -2003417 体量天窗 OST_MassSkylights -2003416 体量玻璃 OST_MassGlazing -2003415 体量屋顶 OST_MassRoof -2003414 体量外墙 OST_MassExteriorWall -2003413 体量内墙 OST_MassInteriorWall -2003412 体量分区 OST_MassZone -2003411 体量楼层标记 OST_MassAreaFaceTags -2003410 Unknown OST_HostTemplate -2003409 Unknown OST_MassFaceSplitter -2003408 Unknown OST_MassCutter -2003407 Unknown OST_ZoningEnvelope -2003406 体量标记 OST_MassTags -2003405 形式 OST_MassForm -2003404 体量楼层 OST_MassFloor -2003403 体量 OST_Mass -2003400 Unknown OST_DividedSurface_DiscardedDivisionLines -2003333 Unknown OST_DividedSurfaceBelt -2003332 Unknown OST_TilePatterns -2003331 Unknown OST_AlwaysExcludedInAllViews -2003330 Unknown OST_DividedSurface_TransparentFace -2003329 Unknown OST_DividedSurface_PreDividedSurface -2003328 图案填充 OST_DividedSurface_PatternFill -2003327 填充图案线 OST_DividedSurface_PatternLines -2003326 网格线 OST_DividedSurface_Gridlines -2003325 节点 OST_DividedSurface_Nodes -2003324 Unknown OST_DividedSurface -2003323 Unknown OST_RepeatingDetailLines -2003321 向下箭头 OST_RampsDownArrow -2003308 向上箭头 OST_RampsUpArrow -2003307 文字(向下) OST_RampsDownText -2003306 文字(向上) OST_RampsUpText -2003305 超出截面线的梯边梁 OST_RampsStringerAboveCut -2003304 梯边梁 OST_RampsStringer -2003303 坡道超出截面线 OST_RampsAboveCut -2003302 Unknown OST_RampsIncomplete -2003301 Unknown OST_TrussDummy -2003300 Unknown OST_ZoneSchemes -2003225 Unknown OST_AreaSchemes -2003201 面积 OST_Areas -2003200 项目信息 OST_ProjectInformation -2003101 图纸 OST_Sheets -2003100 Unknown OST_ProfileFamilies -2003000 详图项目 OST_DetailComponents -2002000 屋檐底板 OST_RoofSoffit -2001393 楼板边缘 OST_EdgeSlab -2001392 檐沟 OST_Gutter -2001391 封檐板 OST_Fascia -2001390 环境 OST_Entourage -2001370 植物 OST_Planting -2001360 Unknown OST_Blocks -2001359 隐藏线 OST_StructuralStiffenerHiddenLines -2001358 定位线 OST_StructuralColumnLocationLine -2001357 定位线 OST_StructuralFramingLocationLine -2001356 结构加强板标记 OST_StructuralStiffenerTags -2001355 结构加强板 OST_StructuralStiffener -2001354 Unknown OST_FootingAnalyticalGeometry -2001353 RVT 链接 OST_RvtLinks -2001352 Unknown OST_Automatic -2001351 专用设备 OST_SpecialityEquipment -2001350 刚性链接 OST_ColumnAnalyticalRigidLinks -2001344 次等高线 OST_SecondaryTopographyContours -2001343 主等高线 OST_TopographyContours -2001342 三角形边缘 OST_TopographySurface -2001341 地形 OST_Topography -2001340 地形链接 OST_TopographyLink -2001339 结构桁架 OST_StructuralTruss -2001336 棍状符号 OST_StructuralColumnStickSymbols -2001335 隐藏线 OST_HiddenStructuralColumnLines -2001334 刚性链接 OST_AnalyticalRigidLinks -2001333 Unknown OST_ColumnAnalyticalGeometry -2001332 Unknown OST_FramingAnalyticalGeometry -2001331 结构柱 OST_StructuralColumns -2001330 隐藏线 OST_HiddenStructuralFramingLines -2001329 Unknown OST_KickerBracing -2001328 结构梁系统 OST_StructuralFramingSystem -2001327 Unknown OST_VerticalBracing -2001326 Unknown OST_HorizontalBracing -2001325 Unknown OST_Purlin -2001324 Unknown OST_Joist -2001323 Unknown OST_Girder -2001322 Unknown OST_StructuralFramingOther -2001321 结构框架 OST_StructuralFraming -2001320 隐藏线 OST_HiddenStructuralFoundationLines -2001302 结构基础 OST_StructuralFoundation -2001300 Unknown OST_BasePointAxisZ -2001275 Unknown OST_BasePointAxisY -2001274 Unknown OST_BasePointAxisX -2001273 测量点 OST_SharedBasePoint -2001272 项目基点 OST_ProjectBasePoint -2001271 Unknown OST_SiteRegion -2001270 建筑红线线段标记 OST_SitePropertyLineSegmentTags -2001269 建筑红线线段 OST_SitePropertyLineSegment -2001268 属性标记 OST_SitePropertyTags -2001267 边界点 OST_SitePointBoundary -2001266 建筑红线 OST_SiteProperty -2001265 建筑地坪 OST_BuildingPad -2001263 内部点 OST_SitePoint -2001262 Unknown OST_SiteSurface -2001261 场地 OST_Site -2001260 Unknown OST_Sewer -2001240 道路 OST_Roads -2001220 Unknown OST_Property -2001200 停车场 OST_Parking -2001180 卫浴装置 OST_PlumbingFixtures -2001160 机械设备 OST_MechanicalEquipment -2001140 光源 OST_LightingFixtureSource -2001121 照明设备 OST_LightingFixtures -2001120 家具系统 OST_FurnitureSystems -2001100 电气装置 OST_ElectricalFixtures -2001060 电气设备 OST_ElectricalEquipment -2001040 橱柜 OST_Casework -2001000 Unknown OST_ArcWallRectOpening -2000999 Unknown OST_DormerOpeningIncomplete -2000998 Unknown OST_SWallRectOpening -2000997 竖井洞口 OST_ShaftOpening -2000996 Unknown OST_StructuralFramingOpening -2000995 Unknown OST_ColumnOpening -2000994 Unknown OST_RiseDropSymbols -2000989 水力分离符号 OST_PipeHydronicSeparationSymbols -2000988 机械设备集边界线 OST_MechanicalEquipmentSetBoundaryLines -2000987 机械设备集标记 OST_MechanicalEquipmentSetTags -2000986 机械设备集 OST_MechanicalEquipmentSet -2000985 连接线符号 OST_AnalyticalPipeConnectionLineSymbol -2000984 分析管道连接 OST_AnalyticalPipeConnections -2000983 Unknown OST_Coordination_Model -2000982 Unknown OST_MultistoryStairs -2000980 Unknown OST_HiddenStructuralConnectionLines_Deprecated -2000979 Unknown OST_StructuralConnectionHandler_Deprecated -2000978 Unknown OST_CoordinateSystem -2000977 局部坐标系 OST_FndSlabLocalCoordSys -2000976 局部坐标系 OST_FloorLocalCoordSys -2000975 局部坐标系 OST_WallLocalCoordSys -2000974 局部坐标系 OST_BraceLocalCoordSys -2000973 局部坐标系 OST_ColumnLocalCoordSys -2000972 局部坐标系 OST_BeamLocalCoordSys -2000971 多钢筋注释 OST_MultiReferenceAnnotations -2000970 Unknown OST_DSR_LeaderTickMarkStyleId -2000969 Unknown OST_DSR_InteriorTickMarkStyleId -2000968 Unknown OST_DSR_ArrowHeadStyleId -2000967 Unknown OST_DSR_CenterlineTickMarkStyleId -2000966 Unknown OST_DSR_CenterlinePatternCatId -2000965 Unknown OST_DSR_DimStyleHeavyEndCategoryId -2000964 Unknown OST_DSR_DimStyleHeavyEndCatId -2000963 Unknown OST_DSR_DimStyleTickCategoryId -2000962 Unknown OST_DSR_LineAndTextAttrFontId -2000961 Unknown OST_DSR_LineAndTextAttrCategoryId -2000960 分析节点标记 OST_NodeAnalyticalTags -2000956 分析链接标记 OST_LinkAnalyticalTags -2000955 Unknown OST_RailingRailPathExtensionLines -2000954 Unknown OST_RailingRailPathLines -2000953 支撑 OST_StairsSupports -2000952 <高于> 扶手 OST_RailingHandRailAboveCut -2000951 <高于> 顶部扶栏 OST_RailingTopRailAboveCut -2000950 终端 OST_RailingTermination -2000949 支座 OST_RailingSupport -2000948 扶手 OST_RailingHandRail -2000947 顶部扶栏 OST_RailingTopRail -2000946 Unknown OST_StairsSketchPathLines -2000945 楼梯踏板/踢面数 OST_StairsTriserNumbers -2000944 Unknown OST_StairsTriserTags -2000943 楼梯支撑标记 OST_StairsSupportTags -2000942 楼梯平台标记 OST_StairsLandingTags -2000941 楼梯梯段标记 OST_StairsRunTags -2000940 <高于> 向上箭头 OST_StairsPathsAboveCut -2000939 楼梯路径 OST_StairsPaths -2000938 <高于> 踢面线 OST_StairsRiserLinesAboveCut -2000937 踢面线 OST_StairsRiserLines -2000936 <高于> 轮廓 OST_StairsOutlinesAboveCut -2000935 轮廓 OST_StairsOutlines -2000934 <高于> 楼梯前缘线 OST_StairsNosingLinesAboveCut -2000933 楼梯前缘线 OST_StairsNosingLines -2000932 <高于> 剪切标记 OST_StairsCutMarksAboveCut -2000931 剪切标记 OST_StairsCutMarks -2000930 Unknown OST_ComponentRepeaterSlot -2000928 Unknown OST_ComponentRepeater -2000927 Unknown OST_DividedPath -2000926 Unknown OST_IOSRoomCalculationPoint -2000925 Unknown OST_PropertySet -2000924 Unknown OST_AppearanceAsset -2000923 Unknown OST_StairStringer2012_Deprecated -2000922 踢面/踏板 OST_StairsTrisers -2000921 平台 OST_StairsLandings -2000920 梯段 OST_StairsRuns -2000919 Unknown OST_Stair2012_Deprecated -2000918 Unknown OST_RailingSystemTags -2000917 Unknown OST_RailingSystemTransition -2000916 Unknown OST_RailingSystemTermination -2000915 Unknown OST_RailingSystemRail -2000914 Unknown OST_RailingSystemTopRail -2000913 Unknown OST_RailingSystemHandRailBracket -2000912 Unknown OST_RailingSystemHandRail -2000911 Unknown OST_RailingSystemHardware -2000910 Unknown OST_RailingSystemPanel -2000909 Unknown OST_RailingSystemBaluster -2000908 Unknown OST_RailingSystemPost -2000907 Unknown OST_RailingSystemSegment -2000906 Unknown OST_RailingSystem -2000905 Unknown OST_AdaptivePoints_HiddenLines -2000904 线 OST_AdaptivePoints_Lines -2000903 平面 OST_AdaptivePoints_Planes -2000902 点 OST_AdaptivePoints_Points -2000901 自适应点 OST_AdaptivePoints -2000900 Unknown OST_CeilingOpening -2000899 Unknown OST_FloorOpening -2000898 Unknown OST_RoofOpening -2000897 Unknown OST_WallRefPlanes -2000896 Unknown OST_StructLocationLineControl -2000880 Unknown OST_DimLockControlLeader -2000832 <空间分隔> OST_MEPSpaceSeparationLines -2000831 Unknown OST_AreaPolylines -2000830 Unknown OST_RoomPolylines -2000829 Unknown OST_InstanceDrivenLineStyle -2000828 Unknown OST_RemovedGridSeg -2000827 Unknown OST_IOSOpening -2000810 Unknown OST_IOSTilePatternGrid -2000800 Unknown OST_ControlLocal -2000774 Unknown OST_ControlAxisZ -2000773 Unknown OST_ControlAxisY -2000772 Unknown OST_ControlAxisX -2000721 Unknown OST_XRayConstrainedProfileEdge -2000720 Unknown OST_XRayImplicitPathCurve -2000719 Unknown OST_XRayPathPoint -2000718 Unknown OST_XRayPathCurve -2000717 Unknown OST_XRaySideEdge -2000716 Unknown OST_XRayProfileEdge -2000715 Unknown OST_ReferencePoints_HiddenLines -2000714 线 OST_ReferencePoints_Lines -2000713 平面 OST_ReferencePoints_Planes -2000712 点 OST_ReferencePoints_Points -2000711 参照点 OST_ReferencePoints -2000710 材质 OST_Materials -2000700 截面填充图案 OST_CeilingsCutPattern -2000617 公共边 OST_CeilingsDefault -2000616 面层 2 [5] OST_CeilingsFinish2 -2000615 面层 1 [4] OST_CeilingsFinish1 -2000614 衬底 [2] OST_CeilingsSubstrate -2000613 保温层/空气层 [3] OST_CeilingsInsulation -2000612 结构 [1] OST_CeilingsStructure -2000611 涂膜层 OST_CeilingsMembrane -2000610 内部边缘 OST_FloorsInteriorEdges -2000609 截面填充图案 OST_FloorsCutPattern -2000608 隐藏线 OST_HiddenFloorLines -2000607 公共边 OST_FloorsDefault -2000606 面层 2 [5] OST_FloorsFinish2 -2000605 面层 1 [4] OST_FloorsFinish1 -2000604 衬底 [2] OST_FloorsSubstrate -2000603 保温层/空气层 [3] OST_FloorsInsulation -2000602 结构 [1] OST_FloorsStructure -2000601 涂膜层 OST_FloorsMembrane -2000600 内部边缘 OST_RoofsInteriorEdges -2000598 截面填充图案 OST_RoofsCutPattern -2000597 公共边 OST_RoofsDefault -2000596 面层 2 [5] OST_RoofsFinish2 -2000595 面层 1 [4] OST_RoofsFinish1 -2000594 衬底 [2] OST_RoofsSubstrate -2000593 保温层/空气层 [3] OST_RoofsInsulation -2000592 结构 [1] OST_RoofsStructure -2000591 涂膜层 OST_RoofsMembrane -2000590 截面填充图案 OST_WallsCutPattern -2000588 隐藏线 OST_HiddenWallLines -2000587 公共边 OST_WallsDefault -2000586 面层 2 [5] OST_WallsFinish2 -2000585 面层 1 [4] OST_WallsFinish1 -2000584 衬底 [2] OST_WallsSubstrate -2000583 保温层/空气层 [3] OST_WallsInsulation -2000582 结构 [1] OST_WallsStructure -2000581 涂膜层 OST_WallsMembrane -2000580 Unknown OST_PreviewLegendComponents -2000576 Unknown OST_LegendComponents -2000575 明细表 OST_Schedules -2000573 明细表图形 OST_ScheduleGraphics -2000570 光栅图像 OST_RasterImages -2000560 Unknown OST_ColorFillSchema -2000552 颜色填充 OST_RoomColorFill -2000551 颜色填充图例 OST_ColorFillLegends -2000550 注释裁剪边界 OST_AnnotationCropSpecial -2000549 裁剪边界 OST_CropBoundarySpecial -2000548 注释裁剪边界 OST_AnnotationCrop -2000547 Unknown OST_FloorsAnalyticalGeometry -2000546 Unknown OST_WallsAnalyticalGeometry -2000545 详图索引引线 OST_CalloutLeaderLine -2000544 表面填充图案 OST_CeilingsSurfacePattern -2000543 表面填充图案 OST_RoofsSurfacePattern -2000542 表面填充图案 OST_FloorsSurfacePattern -2000541 表面填充图案 OST_WallsSurfacePattern -2000540 详图索引边界 OST_CalloutBoundary -2000539 详图索引标头 OST_CalloutHeads -2000538 详图索引 OST_Callouts -2000537 裁剪边界 OST_CropBoundary -2000536 立面 OST_Elev -2000535 Unknown OST_AxisZ -2000533 Unknown OST_AxisY -2000532 Unknown OST_AxisX -2000531 参照平面 OST_CLines -2000530 Unknown OST_Lights -2000520 视图标题 OST_ViewportLabel -2000515 视口 OST_Viewports -2000510 相机 OST_Camera_Lines -2000501 Unknown OST_Cameras -2000500 空间标记 OST_MEPSpaceTags -2000485 房间标记 OST_RoomTags -2000480 门标记 OST_DoorTags -2000460 窗标记 OST_WindowTags -2000450 宽线 OST_SectionHeadWideLines -2000404 中粗线 OST_SectionHeadMediumLines -2000403 细线 OST_SectionHeadThinLines -2000401 剖面标头 OST_SectionHeads -2000400 等高线标签 OST_ContourLabels -2000350 Unknown OST_CurtaSystemFaceManager -2000341 幕墙系统 OST_CurtaSystem -2000340 Unknown OST_AreaReport_Arc_Minus -2000328 Unknown OST_AreaReport_Arc_Plus -2000327 Unknown OST_AreaReport_Boundary -2000326 Unknown OST_AreaReport_Triangle -2000325 幕墙系统网格 OST_CurtainGridsCurtaSystem -2000323 Unknown OST_CurtainGridsSystem -2000322 幕墙网格 OST_CurtainGridsWall -2000321 幕墙屋顶网格 OST_CurtainGridsRoof -2000320 Unknown OST_HostFinHF -2000315 Unknown OST_HostFinWall -2000314 Unknown OST_HostFinCeiling -2000313 Unknown OST_HostFinRoof -2000312 Unknown OST_HostFinFloor -2000311 Unknown OST_HostFin -2000310 分析显示样式 OST_AnalysisDisplayStyle -2000304 分析结果 OST_AnalysisResults -2000303 渲染区域 OST_RenderRegions -2000302 剖面框 OST_SectionBox -2000301 文字注释 OST_TextNotes -2000300 Unknown OST_Divisions -2000291 Unknown OST_Catalogs -2000290 Unknown OST_DirectionEdgeLines -2000289 <中心线> OST_CenterLines -2000288 <超出> OST_LinesBeyond -2000287 <隐藏> OST_HiddenLines -2000286 <已拆除> OST_DemolishedLines -2000285 <架空线> OST_OverheadLines -2000284 宽线 OST_TitleBlockWideLines -2000283 中粗线 OST_TitleBlockMediumLines -2000282 细线 OST_TitleBlockThinLines -2000281 图框 OST_TitleBlocks -2000280 视图 OST_Views -2000279 Unknown OST_Viewers -2000278 隐藏线 OST_PartHiddenLines -2000271 零件标记 OST_PartTags -2000270 组成部分 OST_Parts -2000269 部件标记 OST_AssemblyTags -2000268 部件 OST_Assemblies -2000267 屋顶标记 OST_RoofTags -2000266 高程点坡度 OST_SpotSlopes -2000265 高程点坐标 OST_SpotCoordinates -2000264 高程点 OST_SpotElevations -2000263 Unknown OST_Constraints -2000262 自动绘制尺寸标注 OST_WeakDims -2000261 尺寸标注 OST_Dimensions -2000260 标高 OST_Levels -2000240 位移路径 OST_DisplacementPath -2000223 Unknown OST_DisplacementElements -2000222 多段轴网 OST_GridChains -2000221 轴网 OST_Grids -2000220 断开剖面线 OST_BrokenSectionLine -2000202 剖面线 OST_SectionLine -2000201 剖面 OST_Sections -2000200 视图参照 OST_ReferenceViewer -2000198 视图参照 OST_ReferenceViewerSymbol -2000197 在族中导入 OST_ImportObjectStyles -2000196 Unknown OST_ModelText -2000195 遮罩区域 OST_MaskingRegion -2000194 拼接线 OST_Matchline -2000193 Unknown OST_FaceSplitter -2000192 平面区域 OST_PlanRegion -2000191 填充区域 OST_FilledRegion -2000190 Unknown OST_MassingProjectionOutlines -2000187 Unknown OST_MassingCutOutlines -2000186 Unknown OST_Massing -2000185 Unknown OST_Reveals -2000182 墙饰条 OST_Cornices -2000181 坡道 OST_Ramps -2000180 Unknown OST_RailingBalusterRailCut -2000177 Unknown OST_RailingBalusterRail -2000176 Unknown OST_Railings -2000175 幕墙网格 OST_CurtainGrids -2000173 Unknown OST_CurtainWallMullionsCut -2000172 幕墙竖梃 OST_CurtainWallMullions -2000171 幕墙嵌板 OST_CurtainWallPanels -2000170 Unknown OST_AreaReference -2000169 Unknown OST_AreaInteriorFill -2000168 Unknown OST_RoomReference -2000167 Unknown OST_RoomInteriorFill -2000166 颜色填充 OST_AreaColorFill -2000165 参照 OST_AreaReferenceVisibility -2000164 内部填充 OST_AreaInteriorFillVisibility -2000163 参照 OST_RoomReferenceVisibility -2000162 内部填充 OST_RoomInteriorFillVisibility -2000161 房间 OST_Rooms -2000160 常规模型 OST_GenericModel -2000151 常规注释 OST_GenericAnnotation -2000150 Unknown OST_Fixtures -2000140 栏杆扶手标记 OST_StairsRailingTags -2000133 <高于> 栏杆扶手截面线 OST_StairsRailingAboveCut -2000132 向下箭头 OST_StairsDownArrows -2000131 向上箭头 OST_StairsUpArrows -2000130 文字(向下) OST_StairsDownText -2000129 扶栏 OST_StairsRailingRail -2000128 栏杆 OST_StairsRailingBaluster -2000127 栏杆扶手 OST_StairsRailing -2000126 文字(向上) OST_StairsUpText -2000125 <高于> 支撑 OST_StairsSupportsAboveCut -2000124 支撑 OST_StairsStringerCarriage -2000123 Unknown OST_StairsAboveCut_ToBeDeprecated -2000122 Unknown OST_StairsIncomplete_Deprecated -2000121 楼梯 OST_Stairs -2000120 Unknown OST_IOSNavWheelPivotBall -2000117 Unknown OST_IOSRoomComputationHeight -2000116 Unknown OST_IOSRoomUpperLowerLines -2000115 Unknown OST_IOSDragBoxInverted -2000114 Unknown OST_IOSDragBox -2000113 Unknown OST_Phases -2000112 Unknown OST_IOS_GeoSite -2000111 Unknown OST_IOS_GeoLocations -2000110 Unknown OST_IOSFabricReinSpanSymbolCtrl -2000109 导向轴网 OST_GuideGrid -2000107 Unknown OST_EPS_Future -2000106 Unknown OST_EPS_Temporary -2000105 Unknown OST_EPS_New -2000104 Unknown OST_EPS_Demolished -2000103 Unknown OST_EPS_Existing -2000102 Unknown OST_IOSMeasureLineScreenSize -2000101 柱 OST_Columns -2000100 Unknown OST_IOSRebarSystemSpanSymbolCtrl -2000099 Unknown OST_IOSRoomTagToRoomLines -2000098 Unknown OST_IOSAttachedDetailGroups -2000097 Unknown OST_IOSDetailGroups -2000096 模型组 OST_IOSModelGroups -2000095 Unknown OST_IOSSuspendedSketch -2000094 Unknown OST_IOSWallCoreBoundary -2000093 Unknown OST_IOSMeasureLine -2000092 Unknown OST_IOSArrays -2000091 Unknown OST_Curtain_Systems -2000090 Unknown OST_IOSBBoxScreenSize -2000089 Unknown OST_IOSSlabShapeEditorPointInterior -2000088 Unknown OST_IOSSlabShapeEditorPointBoundary -2000087 Unknown OST_IOSSlabShapeEditorBoundary -2000086 Unknown OST_IOSSlabShapeEditorAutoCrease -2000085 Unknown OST_IOSSlabShapeEditorExplitCrease -2000084 参照线 OST_ReferenceLines -2000083 Unknown OST_IOSNotSilhouette -2000082 Unknown OST_FillPatterns -2000081 家具 OST_Furniture -2000080 <面积边界> OST_AreaSchemeLines -2000079 线 OST_GenericLines -2000078 隔热层线 OST_InsulationLines -2000077 Unknown OST_CloudLines -2000076 Unknown OST_IOSRoomPerimeterLines -2000075 Unknown OST_IOSCuttingGeometry -2000074 Unknown OST_IOSCrashGraphics -2000073 Unknown OST_IOSGroups -2000072 Unknown OST_IOSGhost -2000071 Unknown OST_StairsSketchLandingCenterLines -2000070 Unknown OST_StairsSketchRunLines -2000069 Unknown OST_StairsSketchRiserLines -2000068 Unknown OST_StairsSketchBoundaryLines -2000067 <房间分隔> OST_RoomSeparationLines -2000066 旋转轴 OST_AxisOfRotation -2000065 Unknown OST_InvisibleLines -2000064 Unknown OST_IOSThinPixel_DashDot -2000063 Unknown OST_IOSThinPixel_Dash -2000062 Unknown OST_IOSThinPixel_Dot -2000061 Unknown OST_Extrusions -2000060 Unknown OST_IOS -2000059 Unknown OST_CutOutlines -2000058 Unknown OST_IOSThinPixel -2000057 Unknown OST_IOSFlipControl -2000056 Unknown OST_IOSSketchGrid -2000055 Unknown OST_IOSSuspendedSketch_obsolete -2000054 Unknown OST_IOSFreeSnapLine -2000053 Unknown OST_IOSDatumPlane -2000052 线 OST_Lines -2000051 Unknown OST_IOSConstructionLine -2000050 Unknown OST_IOSAlignmentGraphics -2000049 Unknown OST_IOSAligningLine -2000048 Unknown OST_IOSBackedUpElements -2000047 Unknown OST_IOSRegeneratedElements -2000046 <草图> OST_SketchLines -2000045 宽线 OST_CurvesWideLines -2000044 中粗线 OST_CurvesMediumLines -2000043 细线 OST_CurvesThinLines -2000042 Unknown OST_Curves -2000041 Unknown OST_CeilingsProjection -2000040 Unknown OST_CeilingsCut -2000039 天花板 OST_Ceilings -2000038 Unknown OST_RoofsProjection -2000037 Unknown OST_RoofsCut -2000036 屋顶 OST_Roofs -2000035 Unknown OST_FloorsProjection -2000034 Unknown OST_FloorsCut -2000033 楼板 OST_Floors -2000032 玻璃 OST_DoorsGlassProjection -2000031 Unknown OST_DoorsGlassCut -2000030 框架/竖梃 OST_DoorsFrameMullionProjection -2000029 Unknown OST_DoorsFrameMullionCut -2000028 洞口 OST_DoorsOpeningProjection -2000027 Unknown OST_DoorsOpeningCut -2000026 嵌板 OST_DoorsPanelProjection -2000025 Unknown OST_DoorsPanelCut -2000024 门 OST_Doors -2000023 洞口 OST_WindowsOpeningProjection -2000022 Unknown OST_WindowsOpeningCut -2000021 窗台/盖板 OST_WindowsSillHeadProjection -2000020 Unknown OST_WindowsSillHeadCut -2000019 框架/竖梃 OST_WindowsFrameMullionProjection -2000018 Unknown OST_WindowsFrameMullionCut -2000017 玻璃 OST_WindowsGlassProjection -2000016 Unknown OST_WindowsGlassCut -2000015 窗 OST_Windows -2000014 Unknown OST_WallsProjectionOutlines -2000013 Unknown OST_WallsCutOutlines -2000012 墙 OST_Walls -2000011 Unknown OST_IOSRegenerationFailure -2000010 Unknown OST_ScheduleViewParamGroup -2000008 Unknown OST_MatchSiteComponent -2000007 Unknown OST_MatchProfile -2000006 Unknown OST_MatchDetail -2000005 Unknown OST_MatchAnnotation -2000004 Unknown OST_MatchModel -2000003 Unknown OST_MatchAll -2000002 Unknown INVALID -1
]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ .NET
+
+ Revit
+
+
+
+
+
+
+
+
+ 深度操作系统 20——崭新视界,创无止境
+
+ /post/deepin-20/
+
+ 深度操作系统是一个致力于为全球用户提供美观易用、安全可靠的Linux发行版。 深度操作系统 20正式版(1002)采取统一的设计风格,从桌面环境和应用进行重新设计,带来焕然一新的视觉感受。底层仓库升级到Debian 10.5,系统安装采用双内核机制(Kernel 5.4、Kernel 5.7),全面提升系统稳定性和兼容性。全新设计的启动器菜单、指纹识别、系统安全增强等,系统部分预装应用升级到最新版本,只为给你更好体验。
统一风格的桌面环境 别出心裁的图标设计,焕然一新的图形界面,自然、平滑的动画过渡效果,更有独树一帜的圆角窗口设计,精美绝伦的多任务视图,处处精心,只为给你细腻自然的品质体验。
个性贴心的通知管理 增强通知中心功能,支持设置通知时提示声音、锁屏时显示消息、仅在通知中心显示、显示消息预览,必要应用强提醒、特定应用弱提醒或不提醒,个性化你的消息通知,在不错过任何重要提醒的同时,避免不必要的打扰。
系统支持双内核安装 系统安装界面提供双内核选项,Kernel 5.4(LTS)和Kernel 5.7(Stable)以及Safe Graphics模式,保证系统安装更多选择,提升系统整体的稳定性、兼容性,最新的内核支持更多的硬件设备。
更易用的新版安装器 化繁为简的设计和交互,保证更一致的操作习惯。新版的安装器界面,只需按照操作向导提示安装即可,在硬盘分区操作中,提供手动和全盘安装两种模式,并且支持全盘加密功能。
管理方便的应用商店 应用商店的不同类别应用,覆盖了生活、工作的主要使用场景,本次新增一键更新、应用筛选等功能,带来更便捷的应用管理体验,同时也兼容部分Wine应用,并达到原生应用的体验。
好用安全的指纹识别 全新的指纹功能框架,提供了更细腻的引导交互和更准确的场景提示。可使用指纹进行解锁登录、验证身份和管理员权限。现已支持多款国产指纹硬件。
下载 https://www.deepin.org/zh/download/
]]>
+
+
+
+
+ Share
+
+
+
+
+
+
+ Linux
+
+ OS
+
+
+
+
+
+
+
+
+ Free Control 用电脑控制手机 - 开源
+
+ /post/free-control/
+
+ FreeControl
介绍 [ English | 中文 ]
基于开源项目scrcpy ,提供简洁的交互界面。
编码语言 C#
开发工具 Visual Studio 2022
运行环境 .NET Framework 4.7.2
界面
下载 GitHub Release https://github.com/pdone/FreeControl/releases/latest/download/FreeControl.exe
My Proxy https://cdn.awaw.cc/gh/pdone/FreeControl/releases/latest/download/FreeControl.exe
代码仓库
更新记录
常见问题 输入法问题 v1.7.0
及以后的版本中,默认启用scrcpy的 UHID keyboard
特性,以优化中文输入体验。
如果在此过程中遇到了什么问题,可尝试打开配置文件 %AppData%\FreeControl\config.json
,将 CustomArgs
的值由 --keyboard=uhid
改为 --keyboard=sdk
。
更多信息可参考 scrcpy-doc-keyboard 。
已过时 个人测试发现,目前支持跨屏进行拼音输入的 手机输入法APP 如下:
搜狗输入法 QQ输入法 谷歌拼音输入法 Gboard 微信输入法 此功能需要输入法APP适配,有更好用的输入法欢迎留言推荐。
自动切换输入法功能默认禁用。如需启用,先关闭程序,然后打开配置文件 %AppData%\FreeControl\config.json
,将 EnableSwitchIME
字段值改为 true
,保存后启动程序即可。
设备连接问题 USB 连接 通过 USB 连接来正常使用 adb 需要保证几点:
硬件状态正常。
包括 Android 设备处于正常开机状态,USB 连接线和各种接口完好。
Android 设备的开发者选项和 USB 调试模式已开启。
可以到「设置」-「开发者选项」-「Android 调试」查看。
如果在设置里找不到开发者选项,那需要通过一个彩蛋来让它显示出来:在「设置」-「关于手机」连续点击「版本号」7 次。
设备驱动状态正常。
这一点貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安装驱动的情况,确认这一点可以右键「计算机」-「属性」,到「设备管理器」里查看相关设备上是否有黄色感叹号或问号,如果没有就说明驱动状态已经好了。否则可以下载一个手机助手类程序来安装驱动先。
通过 USB 线连接好电脑和设备后确认状态。
如果能看到
说明连接成功。
无线连接(Android11 及以上) Android 11 及更高版本支持使用 Android 调试桥 (adb) 从工作站以无线方式部署和调试应用。例如,您可以将可调试应用部署到多台远程设备,而无需通过 USB 实际连接设备。这样就可以避免常见的 USB 连接问题,例如驱动程序安装方面的问题。
官方文档
操作步骤:
更新到最新版本的 SDK 平台工具 (至少30.0.0)。
将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
在开发者选项中启用无线调试 。
在询问要允许在此网络上进行无线调试吗?的对话框中,点击允许。
选择使用配对码配对设备,使用弹窗中的 IP 地址和端口号。
提示 Enter pairing code:
时输入弹窗中的配对码,成功后会显示 Successfully paired to ...
。
使用无线调试下的 IP 地址和端口 。
确认连接状态。
如果能看到
说明连接成功。
无线连接(需要借助 USB 线) 除了可以通过 USB 连接设备与电脑来使用 adb,也可以通过无线连接——虽然连接过程中也有需要使用 USB 的步骤,但是连接成功之后你的设备就可以在一定范围内摆脱 USB 连接线的限制啦!
操作步骤:
将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
将设备与电脑通过 USB 线连接。
应确保连接成功(可运行 adb devices
看是否能列出该设备)。
让设备在 5555 端口监听 TCP/IP 连接:
断开 USB 连接。
找到设备的 IP 地址。
一般能在「设置」-「关于手机」-「状态信息」-「IP地址」找到。
通过 IP 地址连接设备。
1 adb connect <device-ip-address>
这里的 <device-ip-address>
就是上一步中找到的设备 IP 地址。
确认连接状态。
如果能看到
1 <device-ip-address>:5555 device
说明连接成功。
如果连接不了,请确认 Android 设备与电脑是连接到了同一个 WiFi,然后再次执行 adb connect <device-ip-address>
那一步;
如果还是不行的话,通过 adb kill-server
重新启动 adb 然后从头再来一次试试。
无线连接(无需借助 USB 线) 需要 root 权限 ,此处不做详细说明,有需要的朋友可参考此处 。
保持唤醒功能 仅在手机充电时有效。
音频转发功能 使用 Android 11
或更高版本的设备支持音频转发,并且默认情况下启用:
对于 Android 12
或更高版本,它开箱即用。 对于 Android 11
,您需要确保在启动scrcpy时设备屏幕已解锁。假的弹出窗口将短暂出现,使系统认为shell应用程序处于前台。没有这个,音频捕获将失败。 对于 Android 10
或更早版本,无法捕获音频并自动禁用。 捐赠 如果您觉得这个项目对您有帮助,欢迎请作者喝杯咖啡。☕
爱发电❤ https://afdian.net/a/pdone
Stargazers Over Time
]]>
+
+
+
+
+ Tools
+
+
+
+
+
+
+ .NET
+
+ OpenSource
+
+
+
+
+
+
+
+
+ WinForm加载中窗体
+
+ /post/net-loading/
+
+ 最近项目中用有用到,就简单整了个,只有几行代码。
调用示例 public partial class Main : Form{ public Main() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //构造函数参数说明: //work: 需要在新线程中执行的任务 //msg: 执行完成提示信息(为空时不提示) //openDir: 执行完成后自动打开指定目录(为空时不打开) Loading loading = new Loading(DoSomething, 执行完成); //不show的话 可以当作后台线程执行任务来用 loading.ShowDialog(); } public void DoSomething() { Thread.Sleep(3000); }}
源代下载 百度云 https://pan.baidu.com/s/1NzrZeNKqjlZxK__iXaGvwQ
提取码:npkt
]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ .NET
+
+ async
+
+
+
+
+
+
+
+
+ DapperHelper
+
+ /post/dapper-helper/
+
+ Dapper is a simple object mapper for .NET and owns the title of King of Micro ORM in terms of speed and is virtually as fast as using a raw ADO.NET data reader. An ORM is an Object Relational Mapper, which is responsible for mapping between database and programming language.Dapper extends the IDbConnection by providing useful extension methods to query your database.
How Dapper Works? It is a three-step process.
Create an IDbConnection object. Write a query to perform CRUD operations. Pass query as a parameter in the Execute method. Installation Dapper is installed through NuGet: https://www.nuget.org/packages/Dapper
1 PM> Install-Package Dapper
Requirement Dapper works with any database provider since there is no DB specific implementation.
Methods Dapper will extend your IDbConnection interface with multiple methods:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 string sqlOrderDetails = "SELECT TOP 5 * FROM OrderDetails;" ;string sqlOrderDetail = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;" ;string sqlCustomerInsert = "INSERT INTO Customers (CustomerName) Values (@CustomerName);" ;using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools())) { var orderDetails = connection.Query<OrderDetail>(sqlOrderDetails).ToList(); var orderDetail = connection.QueryFirstOrDefault<OrderDetail>(sqlOrderDetail, new {OrderDetailID = 1 }); var affectedRows = connection.Execute(sqlCustomerInsert, new {CustomerName = "Mark" }); Console.WriteLine(orderDetails.Count); Console.WriteLine(affectedRows); FiddleHelper.WriteTable(orderDetails); FiddleHelper.WriteTable(new List<OrderDetail>() { orderDetail }); }
Try it: .NET Core | .NET Framework
Parameter Execute and queries method can use parameters from multiple different ways:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 var affectedRows = connection.Execute(sql, new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1" }, commandType: CommandType.StoredProcedure); DynamicParameters parameter = new DynamicParameters(); parameter.Add("@Kind" , InvoiceKind.WebInvoice, DbType.Int32, ParameterDirection.Input); parameter.Add("@Code" , "Many_Insert_0" , DbType.String, ParameterDirection.Input); parameter.Add("@RowCount" , dbType: DbType.Int32, direction: ParameterDirection.ReturnValue); connection.Execute(sql, parameter, commandType: CommandType.StoredProcedure);int rowCount = parameter.Get<int >("@RowCount" ); connection.Query<Invoice>(sql, new {Kind = new [] {InvoiceKind.StoreInvoice, InvoiceKind.WebInvoice}}).ToList(); connection.Query<Invoice>(sql, new {Code = new DbString {Value = "Invoice_1" , IsFixedLength = false , Length = 9 , IsAnsi = true }}).ToList();
Result The result returned by queries method can be mapped to multiple types:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 string sqlOrderDetails = "SELECT TOP 10 * FROM OrderDetails;" ;using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools())) { var anonymousList = connection.Query(sqlOrderDetails).ToList(); var orderDetails = connection.Query<OrderDetail>(sqlOrderDetails).ToList(); Console.WriteLine(anonymousList.Count); Console.WriteLine(orderDetails.Count); FiddleHelper.WriteTable(orderDetails); FiddleHelper.WriteTable(connection.Query(sqlOrderDetails).FirstOrDefault()); }
Try it: .NET Core | .NET Framework
Utilities 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 connection.QueryAsync<Invoice>(sql) connection.Query<Invoice>(sql, buffered: false )using (var transaction = connection.BeginTransaction()) { var affectedRows = connection.Execute(sql, new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1" }, commandType: CommandType.StoredProcedure, transaction: transaction); transaction.Commit(); }var affectedRows = connection.Execute(sql,new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1" }, commandType: CommandType.StoredProcedure);
DapperHelper.cs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 using System;using System.Collections.Generic;using System.Configuration;using System.Data;using System.Data.SqlClient;using System.Data.SQLite;using System.Linq;using System.Threading.Tasks;using Dapper;using MySql.Data.MySqlClient;namespace ORMSuit.DAO { public class DapperHelper <T > { enum DBType { MSSQL, MySQL, SQLite } private static string connectionString = "" ; public static int dbType = 0 ; public static IDbConnection GetConnection () { switch ((DBType) dbType) { case DBType.MSSQL: return new SqlConnection (connectionString); case DBType.MySQL: connectionString = ConfigurationManager.ConnectionStrings["mysqlconn" ].ConnectionString; return new MySqlConnection (connectionString); case DBType.SQLite: connectionString = ConfigurationManager.ConnectionStrings["sqliteconn" ].ConnectionString; return new SQLiteConnection (connectionString); default : return new SqlConnection (connectionString); } } public static List<T> Query (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.Query<T> (sql, param).ToList (); } } public static T QueryFirst (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { List<T> tempList = con.Query<T> (sql, param).ToList (); if (tempList != null && tempList.Count > 0 ) { return tempList[0 ]; } else { return default ; } } } public static T QueryFirstOrDefault (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.QueryFirstOrDefault<T> (sql, param); } } public static T QuerySingle (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.QuerySingle<T> (sql, param); } } public static bool Exists (string sql, object param = null ) { object obj = ExecuteScalar (sql, param); int count = 0 ; if (obj == null ) { count = 0 ; } else { count = Convert.ToInt32 (obj); } if (count > 0 ) { return true ; } else { return false ; } } public static int RecordCount (string sql, object param = null ) { object obj = ExecuteScalar (sql, param); int count = 0 ; if (obj == null ) { count = 0 ; } else { count = Convert.ToInt32 (obj); } return count; } public static T QuerySingleOrDefault (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.QuerySingleOrDefault<T> (sql, param); } } public static int Execute (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.Execute (sql, param); } } public static IDataReader ExecuteReader (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.ExecuteReader (sql, param); } } #region public static DataTable ExecuteDataTabel (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return DataReaderToDataTable (con.ExecuteReader (sql, param)); } } public static DataSet ExecuteDataSet (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return DataReaderToDataSet (con.ExecuteReader (sql, param)); } } private static DataTable DataReaderToDataTable (IDataReader dataReader ) { DataTable datatable = new DataTable (); for (int i = 0 ; i < dataReader.FieldCount; i++) { DataColumn myDataColumn = new DataColumn (); myDataColumn.DataType = dataReader.GetFieldType (i); myDataColumn.ColumnName = dataReader.GetName (i); datatable.Columns.Add (myDataColumn); } while (dataReader.Read ()) { DataRow myDataRow = datatable.NewRow (); for (int i = 0 ; i < dataReader.FieldCount; i++) { myDataRow[i] = dataReader[i].ToString (); } datatable.Rows.Add (myDataRow); myDataRow = null ; } dataReader.Close (); return datatable; } public static DataSet DataReaderToDataSet (IDataReader dataReader ) { DataSet dataSet = new DataSet (); do { DataTable schemaTable = dataReader.GetSchemaTable (); DataTable dataTable = new DataTable (); if (schemaTable != null ) { for (int i = 0 ; i < schemaTable.Rows.Count; i++) { DataRow dataRow = schemaTable.Rows[i]; string columnName = (string ) dataRow["ColumnName" ]; DataColumn column = new DataColumn (columnName, (Type) dataRow["DataType" ]); dataTable.Columns.Add (column); } dataSet.Tables.Add (dataTable); while (dataReader.Read ()) { DataRow dataRow = dataTable.NewRow (); for (int i = 0 ; i < dataReader.FieldCount; i++) { dataRow[i] = dataReader.GetValue (i); } dataTable.Rows.Add (dataRow); } } else { DataColumn column = new DataColumn ("RowsAffected" ); dataTable.Columns.Add (column); dataSet.Tables.Add (dataTable); DataRow dataRow = dataTable.NewRow (); dataRow[0 ] = dataReader.RecordsAffected; dataTable.Rows.Add (dataRow); } } while (dataReader.NextResult ()); return dataSet; } #endregion public static object ExecuteScalar (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.ExecuteScalar (sql, param); } } public static T ExecuteScalarForT (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.ExecuteScalar<T> (sql, param); } } public static List<T> ExecutePro (string proc, object param = null ) { using (IDbConnection con = GetConnection ()) { List<T> list = con.Query<T> (proc, param, null , true , null , CommandType.StoredProcedure).ToList (); return list; } } public static int ExecuteTransaction (Dictionary<string , object > dic ) { using (IDbConnection con = GetConnection ()) { using (var transaction = con.BeginTransaction ()) { try { int result = 0 ; foreach (var sql in dic) { result += con.Execute (sql.Key, sql.Value, transaction); } transaction.Commit (); return result; } catch (Exception ex) { transaction.Rollback (); return 0 ; } } } } public static int ExecuteTransaction (string sql, object obj ) { using (IDbConnection con = GetConnection ()) { con.Open (); using (IDbTransaction transaction = con.BeginTransaction ()) { try { int result = 0 ; result = con.Execute (sql, obj, transaction); transaction.Commit (); con.Close (); return result; } catch (Exception ex) { transaction.Rollback (); con.Close (); return 0 ; } } } } public static Task<int > ExecuteTransactionAsync (string sql, object obj ) { using (IDbConnection con = GetConnection ()) { con.Open (); using (IDbTransaction transaction = con.BeginTransaction ()) { try { Task<int > result; result = con.ExecuteAsync (sql, obj, transaction); transaction.Commit (); con.Close (); return result; } catch (Exception ex) { transaction.Rollback (); con.Close (); return null ; } } } } } }
]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ .NET
+
+ Database
+
+ ORM
+
+
+
+
+
+
+
+
+ Steam免费游戏一键领取
+
+ /post/steam-free-game/
+
+ 这些都是Steam上免费的游戏,如果手动领取的话需要一个一个领取,这里提供一种简便的方法,一键批量把免费游戏添加到自己的库里。第一步 打开该链接: https://store.steampowered.com/account/licenses/ ,然后登录自己的账号(或者自己进入Steam主页,登录网页版Steam,然后进入到 主页 > 帐户 > 许可和产品序列号激活 页面)。
第二步 按键盘F12,进入Console,粘贴下方代码后按Enter键执行代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 (function ( ) { if (location.href .match (/^https:\/\/store\.steampowered\.com\/account\/licenses\/?$/ ) === null ) { alert ('请在Steam帐号明细页面运行这些代码: https://store.steampowered.com/account/licenses/' ); window .location = 'https://store.steampowered.com/account/licenses/' ; return ; } var freePackages = [ 39166 , 13261 , 32032 , 59373 , 33694 , 88162 , 36561 , 58514 , 117526 , 85604 , 21478 , 50861 , 21473 , 31538 , 32287 , 38085 , 72261 , 81026 , 47333 , 38820 , 69802 , 60341 , 21416 , 63207 , 59253 , 35063 , 74465 , 21101 , 21102 , 21103 , 21104 , 21105 , 21106 , 21107 , 21108 , 21109 , 21110 , 21111 , 21113 , 21114 , 21115 , 21117 , 21118 , 21119 , 21120 , 21121 , 21122 , 21123 , 21124 , 21125 , 21126 , 21127 , 21128 , 21129 , 21130 , 21131 , 21132 , 21133 , 21134 , 21135 , 21136 , 21137 , 21138 , 21139 , 21140 , 21141 , 21142 , 21143 , 21144 , 21145 , 21146 , 21147 , 21148 , 21149 , 21150 , 21151 , ]; var ownedPackages = {}; jQuery ('.account_table a' ).each (function (i, el ) { var match = el.href .match (/javascript:RemoveFreeLicense\( ([0-9]+), '/ ); if (match !== null ) { ownedPackages[+match[1 ]] = true ; } }); var i = 0 , loaded = 0 , package = 0 , total = freePackages.length , modal = ShowBlockingWaitDialog ('努力执行中...' , '请耐心等待,如果有错误请无视,请耐心等待脚本加载完毕' ); for (; i < total; i++) { package = freePackages[i]; if (ownedPackages[package]) { loaded++; continue ; } jQuery.post ( '//store.steampowered.com/checkout/addfreelicense' , { action : 'add_to_cart' , sessionid : g_sessionID, subid : package } ).always (function ( ) { loaded++; modal.Dismiss (); if (loaded >= total) { location.reload (); } else { modal = ShowBlockingWaitDialog ('执行中...' , '加载至 <b>' + loaded + '</b>/' + total + '.' ); } } ); } }());
第三步 Enjoy your free game!
]]>
+
+
+
+
+ Share
+
+
+
+
+
+
+ Steam
+
+ Game
+
+
+
+
+
+
+
+
+ SSMS18闪退解决方法
+
+ /post/ssms18-not-run/
+
+ 这是已知问题,SSMS开发团队发布了新的官方解决方法。第一个方法 复制文件
1 Microsoft.VisualStudio.Shell.Interop.8.0.dll
将该DLL文件从目录
1 C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\PrivateAssemblies\Interop
复制到目录
1 C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\PublicAssemblies
第二个方法 删除文件
1 C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\CommonExtensions\Platform\Microsoft.VisualStudio.MinShell.Interop.pkgdef
SSMS产品经理提供的方法 建议的解决方法是:
1)关闭所有SSMS实例
2)编辑ssms.exe.config
3)删除具有以下文本的行(应该是第38行):NgenBind_OptimizeNonGac enabled =“1”
这与SSMS 18.x的下一版本中的改变相同
注意! ssms.exe.config文件的位置在文件夹中:
1 C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE
相关链接 ]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ 数据库
+
+
+
+
+
+
+
+
+ 心中尚未崩坏的地方
+
+ /post/world-peace/
+
+ World peace ]]>
+
+
+
+
+ Share
+
+
+
+
+
+
+ Peace
+
+
+
+
+
+
+
+
+ 微星B450M MORTAR主板PCI_E3接口无法识别硬件解决方法
+
+ /post/msi-b450m-mortar/
+
+ 博主购买的微星B450M MORTAR主板,由于安装显卡后会挡住PCI_E2接口,所以无线网卡(Intel 9260AC)只能插PCI_E3接口上,但是一直无法识别出来,在微星社区咨询后发现已经有人反馈过这个问题,帖子中官方人员回复:主板的PCIE 插槽必须有共享LANES的状况 PCIE CARD 本身没有依照规范将Prsnt 1(A1)#和Prsnt 2#(B17)短接。 随后官方发布了B450M MORTAR新BIOS固件,版本号7B89v14,更新到最新BIOS后,进BIOS
- setting
- advanced
- PCI SUBsystem setting
, 找到PCIe x1 slot switch
改成PCIE_3
(默认为PCIE_2
),然后插在PCI-E_E3上的无线网卡就可以正常被识别出来啦。B450M MORTAR Titanium版本的主板也同样适用该方法。
微星社区:http://forum-sc.msi.com/index.php?topic=5308.14
]]>
+
+
+
+
+ Share
+
+
+
+
+
+
+ PC
+
+ 主板
+
+ PCI_E
+
+
+
+
+
+
+
+
+ 年轻人的第二台PC诞生
+
+ /post/my-second-pc/
+
+ 博主的第一台主机是17年6月份大学毕业时组的一套,当时资金有限,主机花了2600元,服役了一年半,由于性能不能满足 游戏 工作的需要,所以就在19年春节前又配了一套。旧的主机虽然已经用了一年半,但毕竟是挤牙膏挤多了的性价比神U G4560和10系显卡1050ti,家用办公中画质玩玩3A大作还是够用的,于是就春节搬回家,把家里N年前的主机给替换了。其实在春节前都已经配齐开始使用了,但一直没时间更新博客,趁着这周末有空就来补上笔记。
配置清单 固态硬盘 英特尔 760P 256G 359 显卡 铭瑄 GTX1060 6G 1489 内存 金士顿 骇客神条2666 8G *2 679 处理器 AMD Ryzen5 2600X 主板 微星 B450M MORTAR 1999 机箱 先马 平头哥 149 电源 先马 全模组500W 349 配置清单合计5024元,显示器、键盘、鼠标、PCIE无线网卡、音箱以及两块1TB机械硬盘都使用上台主机的,故不算入总价中。
安装过程 娱乐大师跑分 灯效
]]>
+
+
+
+
+ Share
+
+
+
+
+
+
+ PC
+
+ DIY
+
+
+
+
+
+
+
+
+ JS地图使用笔记
+
+ /post/js-map/
+
+ 最近一个项目中要用JS实现一个简单的地图,由于是前端小白,开发过程中遇到了不少问题,然后整理了两个Demo,便于以后需要使用时有个参考。对功能性要求不高使用Demo1,要求高的话用Demo2,Demo2是用的Highmaps,官方提供了很多方法,可以参考官方文档。
两个Demo的完整代码下载地址在文末。
Demo1 Demo2 相关文档 Highmaps API 文档
源码下载 百度云 https://pan.baidu.com/s/1YDYu9Sz4LqIun2VQNB52tw
提取码:3vjq
]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ JS
+
+ Map
+
+ 地图
+
+
+
+
+
+
+
+
+ 微软开源WPF, Windows Forms 和 WinUI
+
+ /post/ms-opensource/
+
+ 美国当地时间12月4日,微软正式举行 Microsoft Connect(); 2018 开发者大会。Content Visual Studio 2019 Preview .NET Core 3 Preview 1 .NET Framework 4.8 ASP.NET Core 2.2 ML.NET 0.8 WPF, Windows Forms 和 WinUI 框架宣布开源 宣布 .NET 基金会开放接受会员加入 微软和 Docker 宣布了一个新的联合开源项目,即 Cloud Native Application Bundle,它可以更轻松地打包和运行云原生应用程序
Link ]]>
+
+
+
+
+ Share
+
+
+
+
+
+
+ OpenSource
+
+ News
+
+
+
+
+
+
+
+
+ 用Python爬 历史的今天 数据
+
+ /post/python-historytoday/
+
+ 刚开始学习Python,试着写了一些东西,发现Python确实是非常容易上手,代码十分简短,并且有很多第三方库可以使用,同样的一种操作用别的语言可能需要10行代码,Python可能只要1行就能实现。 我这里爬的是这个网站 www.lssdjt.com ,类似的网站还有很多。由于我也是初学者,所以注释写的比代码多。
Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 from urllib import requestfrom bs4 import BeautifulSoup startUrl = "http://www.lssdjt.com/11/29" pageFile = open ('historyTodayData.txt' , 'w' , encoding='utf-8' )def getdata (url ): page = request.urlopen(url) pageStream = page.read() pageHtml = pageStream.decode('utf-8' ) soup = BeautifulSoup(pageHtml, "html.parser" ) nextUrlClass = soup.find('ul' , {'class' : 'bot' }).find('li' , {'class' : 'r' }) next_url = nextUrlClass.a['href' ] links = soup.find_all("a" , class_="screenshot" ) for link in links: print (link.i.string, link.em.string, link.em.string.split('年' )[1 ].replace('月' , ' ' ).replace('日' , '' )) tempStrLine = link.i.string+' ' +link.em.string+' ' + link.em.string.split('年' )[1 ].replace('月' , ' ' ).replace('日' , '' ) + '\n' pageFile.writelines(tempStrLine) return next_urlfor _ in range (365 ): startUrl = getdata(startUrl) pageFile.close()
爬完的数据长下面这个样子,大概有一万多行,把列头title,date,month,day添加到第一行,文件扩展名改为csv就可以直接导入微信小程序云开发提供的数据库中了。
参考内容 BeautifulSoup中文文档
]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ Python
+
+ reptile
+
+
+
+
+
+
+
+
+ SQL日期时间格式转换
+
+ /post/sql-date-format/
+
+ 不经常用,所以没有刻意记过,但每次用到了都要百度,保存此处方便下次使用。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 Select CONVERT (varchar (100 ), GETDATE(), 0 )Select CONVERT (varchar (100 ), GETDATE(), 1 )Select CONVERT (varchar (100 ), GETDATE(), 2 )Select CONVERT (varchar (100 ), GETDATE(), 3 )Select CONVERT (varchar (100 ), GETDATE(), 4 )Select CONVERT (varchar (100 ), GETDATE(), 5 )Select CONVERT (varchar (100 ), GETDATE(), 6 )Select CONVERT (varchar (100 ), GETDATE(), 7 )Select CONVERT (varchar (100 ), GETDATE(), 8 )Select CONVERT (varchar (100 ), GETDATE(), 9 )Select CONVERT (varchar (100 ), GETDATE(), 10 )Select CONVERT (varchar (100 ), GETDATE(), 11 )Select CONVERT (varchar (100 ), GETDATE(), 12 )Select CONVERT (varchar (100 ), GETDATE(), 13 )Select CONVERT (varchar (100 ), GETDATE(), 14 )Select CONVERT (varchar (100 ), GETDATE(), 20 )Select CONVERT (varchar (100 ), GETDATE(), 21 )Select CONVERT (varchar (100 ), GETDATE(), 22 )Select CONVERT (varchar (100 ), GETDATE(), 23 )Select CONVERT (varchar (100 ), GETDATE(), 24 )Select CONVERT (varchar (100 ), GETDATE(), 25 )Select CONVERT (varchar (100 ), GETDATE(), 100 )Select CONVERT (varchar (100 ), GETDATE(), 101 )Select CONVERT (varchar (100 ), GETDATE(), 102 )Select CONVERT (varchar (100 ), GETDATE(), 103 )Select CONVERT (varchar (100 ), GETDATE(), 104 )Select CONVERT (varchar (100 ), GETDATE(), 105 )Select CONVERT (varchar (100 ), GETDATE(), 106 )Select CONVERT (varchar (100 ), GETDATE(), 107 )Select CONVERT (varchar (100 ), GETDATE(), 108 )Select CONVERT (varchar (100 ), GETDATE(), 109 )Select CONVERT (varchar (100 ), GETDATE(), 110 )Select CONVERT (varchar (100 ), GETDATE(), 111 )Select CONVERT (varchar (100 ), GETDATE(), 112 )Select CONVERT (varchar (100 ), GETDATE(), 113 )Select CONVERT (varchar (100 ), GETDATE(), 114 )Select CONVERT (varchar (100 ), GETDATE(), 120 )Select CONVERT (varchar (100 ), GETDATE(), 121 )Select CONVERT (varchar (100 ), GETDATE(), 126 )
]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ Database
+
+ SQL
+
+
+
+
+
+
+
+
+ JavaScript获取时间并格式化
+
+ /post/js-dateformat/
+
+ 最近在学习微信小程序,用到不少前端的知识,比如时间格式化。Example 1 2 3 4 function getDateNow ( ) { var date = new Date (); return date.format ("yyyy-MM-dd HH:mm:ss.t w" ); }
Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Date .prototype .format = function (fmt ) { var weekArr = { cn : new Array ("星期日" , "星期一" , "星期二" , "星期三" , "星期四" , "星期五" , "星期六" ), en : new Array ("Sunday" , "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Saturday" ) }; var o = { "M+" : this .getMonth () + 1 , "d+" : this .getDate (), "H+" : this .getHours (), "m+" : this .getMinutes (), "s+" : this .getSeconds (), "q+" : Math .floor ((this .getMonth () + 3 ) / 3 ), "t" : ("00" + this .getMilliseconds ()).slice ( - 3 ), "w" : weekArr.en [this .getDay ()] }; if (/(y+)/ .test (fmt)) fmt = fmt.replace (RegExp .$1 , (this .getFullYear () + "" ).substr (4 - RegExp .$1 .length )); for (var k in o) if (new RegExp ("(" + k + ")" ).test (fmt)) fmt = fmt.replace (RegExp .$1 , (RegExp .$1 .length == 1 ) ? (o[k]) : (("00" + o[k]).substr (("" + o[k]).length ))); return fmt; };
]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ JS
+
+ DateFormat
+
+
+
+
+
+
+
+
+ 5个小技巧让你写出更好的JavaScript条件语句
+
+ /post/js-5tip/
+
+ 原文地址:5 Tips to Write Better Conditionals in JavaScript 原文作者:Jecelyn Yeen 翻译&校对:pdone
1.在条件较多时使用 Array.includes 举个栗子:
1 2 3 4 5 6 function test (fruit ) { if (fruit == 'apple' || fruit == 'strawberry' ) { console .log ('red' ); } }
乍一看,上面的例子看起来不错。 但是,如果我们有更多的红色水果,比如樱桃和蔓越莓呢? 我们是否要用更多的||
来扩展语句?
我们可以使用Array.includes
重写上面的条件。
1 2 3 4 5 6 7 8 function test (fruit ) { const redFruits = ['apple' , 'strawberry' , 'cherry' , 'cranberries' ]; if (redFruits.includes (fruit)) { console .log ('red' ); } }
我们将红色水果(条件)
整合到一个数组中。这样做可以让代码看起来更整洁。
2.减少嵌套,尽早返回 让我们扩展前面的示例,增加另外两个条件: ——如果没有提供水果,抛出错误; ——如果超过10种水果,打印出水果数量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 function test (fruit, quantity ) { const redFruits = ['apple' , 'strawberry' , 'cherry' , 'cranberries' ]; if (fruit) { if (redFruits.includes (fruit)) { console .log ('red' ); if (quantity > 10 ) { console .log ('big quantity' ); } } } else { throw new Error ('No fruit!' ); } }test (null ); test ('apple' ); test ('apple' , 20 );
看看上面的代码,我们有: ——1个if / else
语句过滤掉无效条件; ——3层嵌套if语句(条件1,2和3)。 对我而言,我遵循的规则是在发现无效条件时提前返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 function test (fruit, quantity ) { const redFruits = ['apple' , 'strawberry' , 'cherry' , 'cranberries' ]; if (!fruit) throw new Error ('No fruit!' ); if (redFruits.includes (fruit)) { console .log ('red' ); if (quantity > 10 ) { console .log ('big quantity' ); } } }
这样做的话,我们会得到一个较少层级的嵌套语句。 这种编码风格很好,特别是当你有很长的if语句时(想象你需要滚动到最底层才知道这里有一个else语句,一点都不酷)。
通过反转条件并提前返回,我们可以进一步减少嵌套。 请查看下面的条件2,看看我们是如何做到的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function test (fruit, quantity ) { const redFruits = ['apple' , 'strawberry' , 'cherry' , 'cranberries' ]; if (!fruit) throw new Error ('No fruit!' ); if (!redFruits.includes (fruit)) return ; console .log ('red' ); if (quantity > 10 ) { console .log ('big quantity' ); } }
通过反转条件2,我们的代码现在没有嵌套语句。 当我们有很长的逻辑时,这种技巧非常有用,我们希望在不满足条件时停止下一步的处理。
但是这并不是硬性规定。问问自己,这个版本(没有嵌套)是否比前一个版本(条件2嵌套)更好、更可读?
对我而言,我会保留(条件2嵌套)这个版本,因为: ——代码简短直接,一个if语句是代码结构更清晰; ——反转条件可能会引发更多的思考过程(增加认知负荷)。
因此,始终追求更少的嵌套和尽早的返回,但不要过度。如果你感兴趣的话,这里有篇关于这个问题的文章以及 StackOverflow 上的讨论:
Avoid Else, Return Early by Tim Oxley
StackOverflow discussion on if/else coding style
3.使用函数默认参数和解构 我想下面的代码可能看起来很熟悉,我们总是需要检查null / undefined
值并给参数赋予默认值:
1 2 3 4 5 6 7 8 9 10 function test (fruit, quantity ) { if (!fruit) return ; const q = quantity || 1 ; console .log (`We have ${q} ${fruit} !` ); }test ('banana' ); test ('apple' , 2 );
实际上,我们可以通过设置函数的默认参数来省去参数q
:
1 2 3 4 5 6 7 8 function test (fruit, quantity = 1 ) { if (!fruit) return ; console .log (`We have ${quantity} ${fruit} !` ); }test ('banana' ); test ('apple' , 2 );
更简单直观不是吗? 请注意,函数的每个参数都可以有自己的默认值。 例如,我们也可以为水果
分配默认值:
1 function test (fruit ='unknown' , quantity = 1 )
如果我们的水果
是一个对象(Object)
怎么办? 我们可以指定默认参数吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 function test (fruit ) { if (fruit && fruit.name ) { console .log (fruit.name ); } else { console .log ('unknown' ); } }test (undefined ); test ({ }); test ({ name : 'apple' , color : 'red' });
观察上边的例子,水果的name
属性存在时,我们会将它打印出来,否则打印'unknown'
。我们可以通过默认参数和解构赋值的方法来避免写出 fruit && fruit.name
这种条件。
1 2 3 4 5 6 7 8 9 10 function test ({name} = {} ) { console .log (name || 'unknown' ); }test (undefined ); test ({ }); test ({ name : 'apple' , color : 'red' });
由于我们只需要来自fruit的name
属性,我们可以使用{name}
将其解构出来,然后我们可以在代码中使用name
作为变量而不是fruit.name
。
我们还使用空对象{}
作为默认值。 如果我们不这样做,你将在执行遇到错误test(undefined) - Cannot destructure property name of 'undefined' or 'null'
。 因为undefined
中没有name
属性。
如果你不介意使用第三方库,有几种方法可以减少空值检查: ——使用 Lodash get 函数; ——使用 Facebook 开源的 idx 库(需搭配 Babeljs)。 这里有一个使用 Lodash 的例子:
1 2 3 4 5 6 7 8 9 function test (fruit ) { console .log (__.get (fruit, 'name' , 'unknown' ); }test (undefined ); test ({ }); test ({ name : 'apple' , color : 'red' });
您可以点击这里 运行演示代码。 此外,如果您是功能编程(FP)的粉丝,您可以选择使用Lodash fp ,Lodash的功能版本(方法更改为get或getOr)。
4.相较Switch更偏向于使用Map / Object 让我们看看下面的例子,我们想根据颜色打印水果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function test (color ) { switch (color) { case 'red' : return ['apple' , 'strawberry' ]; case 'yellow' : return ['banana' , 'pineapple' ]; case 'purple' : return ['grape' , 'plum' ]; default : return []; } }test (null ); test ('yellow' );
上面的代码似乎没有错,但我觉得它很冗长。 使用具有更清晰语法的object literal可以实现相同的结果:
1 2 3 4 5 6 7 8 9 10 const fruitColor = { red : ['apple' , 'strawberry' ], yellow : ['banana' , 'pineapple' ], purple : ['grape' , 'plum' ] };function test (color ) { return fruitColor[color] || []; }
或者,你可以使用Map来实现相同的结果:
1 2 3 4 5 6 7 8 9 const fruitColor = new Map () .set ('red' , ['apple' , 'strawberry' ]) .set ('yellow' , ['banana' , 'pineapple' ]) .set ('purple' , ['grape' , 'plum' ]);function test (color ) { return fruitColor.get (color) || []; }
Map是ES2015引入的对象类型,允许你存储键值对。
我们应该禁止使用switch语句吗? 不要局限于此。 就个人而言,我尽可能使用object literal,但我不会设置硬性规则来阻止使用Switch,视使用场景而定。
Todd Motto有一篇文章深入研究switch语句与对象文字,你可以点击这里 阅读。
TL;DR;重构方法 对于上面的示例,我们实际上可以重构我们的代码以使用Array.filter实现相同的结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 const fruits = [ { name : 'apple' , color : 'red' }, { name : 'strawberry' , color : 'red' }, { name : 'banana' , color : 'yellow' }, { name : 'pineapple' , color : 'yellow' }, { name : 'grape' , color : 'purple' }, { name : 'plum' , color : 'purple' } ];function test (color ) { return fruits.filter (f => f.color == color); }
解决问题的方法永远不只一种。对于这个例子我们展示了四种实现方法。编程真有趣!
5.使用 Array.every 和 Array.some 来处理全部/部分满足条件 最后一个小技巧更多地是关于使用新的(也不是很新了)JavaScript 数组函数来减少代码行数。观察以下的代码,我们想要检查是否所有的水果都是红色的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 const fruits = [ { name : 'apple' , color : 'red' }, { name : 'banana' , color : 'yellow' }, { name : 'grape' , color : 'purple' } ];function test ( ) { let isAllRed = true ; for (let f of fruits) { if (!isAllRed) break ; isAllRed = (f.color == 'red' ); } console .log (isAllRed); }
代码太长了! 我们可以使用Array.every
减少行数:
1 2 3 4 5 6 7 8 9 10 11 12 const fruits = [ { name : 'apple' , color : 'red' }, { name : 'banana' , color : 'yellow' }, { name : 'grape' , color : 'purple' } ];function test ( ) { const isAllRed = fruits.every (f => f.color == 'red' ); console .log (isAllRed); }
现在是不是整洁了许多? 以类似的方式,如果我们想测试是否至少有一个水果为红色,我们可以使用Array.some用一行代码实现它。
1 2 3 4 5 6 7 8 9 10 11 12 const fruits = [ { name : 'apple' , color : 'red' }, { name : 'banana' , color : 'yellow' }, { name : 'grape' , color : 'purple' } ];function test ( ) { const isAnyRed = fruits.some (f => f.color == 'red' ); console .log (isAnyRed); }
让我们一起编写可读性更高的代码。 我希望你能在本文中学到一些新东西。
就这样。 快乐的编码!
]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ JS
+
+
+
+
+
+
+
+
+ OpenSSL生成多域名CSR
+
+ /post/openssl-csr/
+
+ 首先要选择证书颁发机构(CA),各大著名的证书颁发机构的多域名 [1] 、泛域名证书大多是需要收费的。目前发现亚洲诚信(TrustAsia) 的免费证书支持双域名,而Let’s Encrypt 的免费证书既支持多域名,同时也支持泛域名。申请证书需要用到CSR [2] ,直接在搜索引擎搜索CSR在线生成就可以很方便的生成,然后会得到一个CSR和一个KEY,前者是提交给证书颁发机构申请证书用的,后者是给服务器安装证书的时候用到的。
在实践过程中发现,网上大多数 CSR 生成工具都不支持填多个域名,熟悉OpenSSL的同学应该很容易就搞定了,但是对于像博主一样的小白来说,能有个工具再好不过了,这里分享一个支持多域名CSR的在线生成网站:https://certificatetools.com/newui/
CSR也可以使用OpenSSL 生成,动手能力强的同学可以自己用工具离线生成。
配置文件 [ req ]default_md = sha256 prompt = no req_extensions = req_ext distinguished_name = req_distinguished_name[ req_distinguished_name ]0.commonName = pdoner.cn1.commonName = *.pdoner.cncountryName = CNstateOrProvinceName = HenanlocalityName = ZhengzhouorganizationName = Pdone Technology[ req_ext ]keyUsage=critical,digitalSignature,keyEnciphermentextendedKeyUsage=critical,serverAuth,clientAuthsubjectAltName = @alt_names[ alt_names ]DNS.0 = pdoner.cn
**[1]**多域名证书,一说为SAN certificater(SubjectAltName Certificater),一说为Unified Communications Certificater(这个是微软的说法),已经迅速成为一种深受大家欢迎的证书,通过这种证书,可以方便部署Exchange, OCS 等经常有多个服务名的应用系统,此外也便于企业的网络管理人员对证书管理。
**[2]**CSR是Certificate Signing Request的英文缩写,即证书请求文件,也就是证书申请者在申请数字证书时由CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件,证书申请者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。
相关资料 ]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ SSL
+
+ CA
+
+ cert
+
+
+
+
+
+
+
+
+ Cryptojs – JavaScript加密库
+
+ /post/js-cryptojs/
+
+ ImportUsage 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var md5Encrypt = CryptoJS .MD5 ("Message" );var sha1Encrypt = CryptoJS .SHA1 ("Message" );var sha256Encrypt = CryptoJS .SHA256 ("Message" ); var aesEncrypt = CryptoJS .AES .encrypt ("Message" , "Secret Passphrase" );var aesDecrypt = CryptoJS .AES .decrypt (aesEncrypt, "Secret Passphrase" );var 3desEncrypt = CryptoJS .TripleDES .encrypt ("Message" , "Secret Passphrase" );var 3desDecrypt = CryptoJS .TripleDES .decrypt (3desEncrypt, "Secret Passphrase" );var message = "Message" ;var key = CryptoJS .enc .Utf8 .parse ("123456" ); var iv = CryptoJS .enc .Utf8 .parse ("123456" ); var aesEncrypt2 = CryptoJS .AES .encrypt (message ,key, {iv : iv,mode : CryptoJS .mode .CBC , padding : CryptoJS .pad .Pkcs7 }); aesEncrypt2 = encodeURIComponent (CryptoJS .enc .Base64 .stringify (encryptResult.ciphertext ));
Extend 密钥和偏移量:一般情况下密钥为加密方与解密方双方约定好的,但如果长期使用同一密钥,对相同内容加密后的结果一致,容易被找出规律。所以,可以在双方交互时添加一个参数——偏移量,偏移量明文传递,并且每次请求都不同,但在一次交互过程中,双方使用同一偏移量,这样就可以使加密相同内容时结果每次都不同,间接提高安全性。 加密模式:电码本模式(Electronic Codebook Book (ECB));密码分组链接模式(Cipher Block Chaining (CBC));计算器模式(Counter (CTR));密码反馈模式(Cipher FeedBack (CFB));输出反馈模式(Output FeedBack (OFB))。ECB模式下偏移量不生效。具体各种模式的原理这里不再描述(参考资料1 )。 填充模式:.NET和Java中并不完全通用,经过与安卓开发的同事踩坑与测试后,发现None和ISO10126两种填充模式,在两个平台是通用的。理论上PKCS7/PKCS5应该也是通用的(参考资料2 /参考资料3 )。 编码格式:之前做项目时因为编码的问题耽误了不少时间。 没有绝对的安全。 相关项目 ]]>
+
+
+
+
+ Developer
+
+
+
+
+
+
+ JS
+
+ Security
+
+
+
+
+
+
+
+
+ Listen 1 – One for all free music in China
+
+ /post/listen1/
+
+ Listen 1可以搜索和播放来自网易云音乐、虾米、QQ音乐、酷狗音乐、酷我音乐网站的歌曲,让你的曲库更全面。截图
安装 Chrome插件版 下载Chrome插件版压缩包,并解压缩 打开 Chrome 扩展页面,勾选右上角「开发者模式」 选择「加载已解压的扩展程序…」,选择刚刚解压缩的文件夹 开始使用 Firefox插件版 下载Firefox插件版,并解压缩 打开 about:config 页面,xpinstall.signatures.required 设置为 false 选择「附加组件」,齿轮图标,选择从文件安装附加组件,选择下载的xpi文件 开始使用 Windows桌面版 下载Windows压缩包,根据系统选择32位或64位版本 解压缩,运行 Listen1.exe Mac桌面版 下载并运行dmg,在打开的安装窗口把Listen 1图标拖动到右侧 点击Listen 1图标运行 Linux桌面版 下载deb安装包,根据系统选择32位或64位版本 点击deb,在安装界面点击Install 下载 Listen 1背后的开源项目 listen1/listen1 最初的网页版播放器,使用Python开发Web服务器。可以直接在服务器运行,也可使用打包的Windows版和Mac版在本地运行Web服务器
listen1/listen1_chrome_extension Chrome和Firefox插件版
listen1/listen1_desktop Windows,Mac,Linux桌面版。使用Electron框架,基于Listen 1 Chrome插件版JS库开发
Listen 1联系方式 致谢 感谢该项目的所有代码贡献者。
如果觉得不错,不妨推荐给你身边喜欢音乐的朋友。
]]>
+
+
+
+
+ Tools
+
+
+
+
+
+
+ Music
+
+ PlugIn
+
+
+
+
+
+
+
+
+
diff --git a/movecar/index.html b/movecar/index.html
new file mode 100644
index 0000000..b7da196
--- /dev/null
+++ b/movecar/index.html
@@ -0,0 +1,530 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 联系车主挪车 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/page/2/index.html b/page/2/index.html
new file mode 100644
index 0000000..705287d
--- /dev/null
+++ b/page/2/index.html
@@ -0,0 +1,1158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/page/3/index.html b/page/3/index.html
new file mode 100644
index 0000000..a6bdd17
--- /dev/null
+++ b/page/3/index.html
@@ -0,0 +1,1162 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ World peace
+
+
+
+
+
+
+
+
+ 2019-04-09
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/page/4/index.html b/page/4/index.html
new file mode 100644
index 0000000..d9dbf6e
--- /dev/null
+++ b/page/4/index.html
@@ -0,0 +1,656 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2018-09-11
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/placeholder b/placeholder
deleted file mode 100644
index e69de29..0000000
diff --git a/post/awesome/index.html b/post/awesome/index.html
new file mode 100644
index 0000000..247b78c
--- /dev/null
+++ b/post/awesome/index.html
@@ -0,0 +1,1202 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 🌈Awesome Software / Service - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
分享一些好用的软件、服务和开源项目等,传递开源与分享精神。纯粹的分享与推荐,放心食用。
+
+
+
+
开源项目仅提供代码仓库地址,若有官方网站亦会标明。内容排序方式为项目名称英文字母顺序。
目前收录总数:35
+
+
+
+
+
桌面应用 桌面应用是一种在桌面操作系统上运行的应用程序,例如 Windows、macOS 和 Linux。与 Web 应用程序和移动应用程序不同,桌面应用程序通常是使用本地编程语言和工具(例如 C++、C#、Java 或 Swift)开发的,并且可以直接在计算机上运行,而无需通过浏览器或移动设备。桌面应用程序可以具有许多不同的功能,例如文本编辑器、图形设计工具、游戏、办公套件、音频/视频编辑器等。与 Web 应用程序相比,桌面应用程序通常具有更高的性能和更好的用户体验,因为它们可以直接访问计算机的资源,例如文件系统、网络和硬件设备。同时,桌面应用程序也需要更多的开发和维护工作,因为它们需要考虑不同操作系统和硬件设备的兼容性问题。
+
7z - 压缩工具 7-Zip是一个具有高压缩比的文件归档器。
+
+7-Zip is a file archiver with a high compression ratio.
+
+
+
+ 官方网站
+ GitHub
+
+
+
CUE Splitter - 音频分轨 CUE Splitter是一个免费的工具,它可以将一个大的音频文件,主要是一张专辑或一个汇编,分割成相对独立的曲目,使用相关的“CUE表”文件中包含的信息。有时你可以找到一个大的压缩音乐文件(例如MP3,APE,FLAC,OGG,WAV,WMA等)。配备了一个小的.cue文本文件,其中包含有关内部轨道的所有细节:标题,艺术家,持续时间等。通常这对夫妇的文件是由像EAC(精确音频复制),foobar2000,BPM Studio,GoldWave或类似的程序生成的。使用CUE Splitter,您可以分割音乐曲目,而无需解码/重新编码任何音频数据!此外,输出文件自动命名使用用户定义的“文件掩码”字符串和他们的标签填充信息提取的“提示表”。
+
+CUE Splitter is a freeware tool that splits a single big audio file, mostly an album or a compilation, into the relative individual tracks, using the informations contained in the associated “CUE Sheet” file. Sometimes you can find a big compressed music file (for example MP3, APE, FLAC, OGG, WAV, WMA, etc.) equipped with a small .cue text file that contains all the details about internal tracks: title, artist, duration, and so on. Usually these couple of files are generated by programs like EAC (Exact Audio Copy), foobar2000, BPM Studio, GoldWave or similar. With CUE Splitter you can split music tracks without decode/re-encode any audio data! Moreover output files are automatically named using a user-defined “file mask” string and their tags are filled with informations extracted from “CUE Sheet”.
+
+
+
+ 官方网站
+
+
+
DBeaver - 数据库工具 DBeaver Community是一个免费的跨平台数据库工具,面向开发人员、数据库管理员、分析师和所有使用数据的人。它支持所有流行的SQL数据库,如MySQL,MariaDB,PostgreSQL,SQLite,Apache Family等。
+
+DBeaver Community is a free cross-platform database tool for developers, database administrators, analysts, and everyone working with data. It supports all popular SQL databases like MySQL, MariaDB, PostgreSQL, SQLite, Apache Family, and more.
+
+
+
官方网站
+
Everything - 本地搜索引擎 Everything 是 Windows 上一款搜索引擎,它能够基于文件名快速定文件和文件夹位置。
+
+Everything is search engine that locates files and folders by filename instantly for Windows.
+
+
+
可以快速搜索本地任何角落,以便找到自己想要的内容,装机必备。Everything也衍生了一些工具,比如uTools中的本地搜索依赖Everything才能更高效的工作,又如EverythingToolbar 可以把Everything集成到任务栏中。
+
官方网站
+
FreeControl - 用电脑控制手机 在PC上控制Android设备。
+
+Control Android devices on PC.
+
+
+
+ 官方网站
+ GitHub
+
+
+
HiBit Uninstaller - 卸载工具 HiBit Uninstaller是卸载Windows软件的完美解决方案,使您可以使用其简单且用户友好的界面快速,完全地卸载程序。
+
+HiBit Uninstaller is the perfect solution for uninstalling Windows software, allowing you to uninstall programs quickly and completely using its simple and user friendly interface.
+
+
+
官方网站
+
LocalSend - 局域网文件传输 AirDrop的开源跨平台替代品。
+
+An open-source cross-platform alternative to AirDrop.
+
+
+
+ 官方网站
+ GitHub
+
+
+
Motrix - 下载工具 一款全能的下载工具。支持下载 HTTP、FTP、BT、磁力链接等资源。
+
+A full-featured download manager. Support downloading HTTP, FTP, BitTorrent, Magnet, etc.
+
+
+
这个软件内置了Aria2 - 下载工具 ,如果懒得折腾aria2,用这个软件就够用了。如果有NAS设备,推荐使用Docker部署aria2服务,让下载这件事与PC解耦。
+
+ 官方网站
+ GitHub
+
+
+
MusicPlayer2 - 音乐播放器 MusicPlayer2是一款集音乐播放、歌词显示、格式转换等众多功能于一身的音频播放软件。支持歌词显示、歌词卡拉OK样式显示、歌词在线下载、歌词编辑、歌曲标签识别、专辑封面显示、专辑封面在线下载、频谱分析、音效设置、任务栏缩略图按钮、主题颜色、格式转换等功能。播放内核为BASS音频库(V2.4)。播放器支持几乎所有常见的音频格式。
+
+MusicPlayer2 is an audio player whitch supports music collection playback, lyrics display, format conversion and many other functions. It supports lyrics display, lyrics karaoke style display, lyrics online download, lyrics editing, song tag recognition, album cover display, album cover online download, spectrum analysis, sound effect settings, taskbar thumbnail button, theme color, format conversion and other functions. The playback kernel is the Bass Audio Library (V2.4). The player supports almost all common audio formats.
+
+
+
GitHub
+
MusicTag - 音乐标签编辑器 『音乐标签』是一款可以编辑歌曲的标题、专辑、艺术家等信息的应用程序,支持FLAC, APE, WAV, AIFF, WV, TTA, MP3, MP4, M4A, OGG, MPC, OPUS, WMA, DSF, DFF等音频格式,绿色无广告,无任何功能限制。
+
+MusicTag is an application that can edit the title, album, artist information of the song, supporting FLAC, APE, WAV, AIFF, WV, TTA, MP3, MP4, M4A, OGG, MPC, OPUS, WMA, DSF, DFF, etc. audio formats, green and without ads, no function restrictions.
+
+
+
官方网站
+
ruffle - Flash播放器 用Rust编写的Flash Player模拟器。
+
+A Flash Player emulator written in Rust.
+
+
+
+ 官方网站
+ GitHub
+
+
+
ScreenToGif - 录制GIF ScreenToGif允许您录制屏幕的选定区域,编辑并保存为gif或视频。
+
+🎬 ScreenToGif allows you to record a selected area of your screen, edit and save it as a gif or video.
+
+
+
+ 官方网站
+ GitHub
+
+
+
Snipaste - 截图贴图工具 Snipaste 是一个简单但强大的贴图工具,同时也可以执行截屏、标注等功能。
+
+Snipaste is a simple but powerful snipping tool, and also allows you to pin the screenshot back onto the screen.
+
+
+
官方网站
+
TrafficMonitor - 硬件资源监控 一款用于Windows平台的网速监控悬浮窗软件,可以显示当前网速、CPU及内存利用率,支持嵌入到任务栏显示,支持更换皮肤、历史流量统计等功能。
+
+TrafficMonitor is a network monitoring software with floating window feature for Windows. It displays the current internet speed and CPU and RAM usage. There are also other capabilities like an embedded display in the taksbar, changeable display skins, and historical traffic statistics.
+
+
+
GitHub
+
TranslucentTB - 任务栏透明 一个轻量级的实用程序,使Windows任务栏半透明/透明。
+
+A lightweight utility that makes the Windows taskbar translucent/transparent.
+
+
+
+
GitHub
+
uTools 是一个极简、插件化的现代桌面软件,通过自由选配丰富的插件,打造得心应手的工具集合。
+
+
+
非常好用的一款跨平台工具集合,虽然有会员订阅服务(主要是提供了数据备份、多端同步等功能),但无需订阅即可使用大部分功能,满足大部分用户的需要。
+
官方网站
+
插件推荐
+
易翻翻译、ctool、颜色助手、OCR、文件批量重命名、hosts、二维码、本地搜索、文本代码对比、json编辑器、变量命名方式、正则编辑器、编码小助手、计算稿纸。
+
Visual Studio Code - 编辑器 Visual Studio Code是一个轻量级但功能强大的源代码编辑器,可在桌面上运行,适用于Windows、macOS和Linux。它内置了对JavaScript,TypeScript和Node.js的支持,并拥有丰富的其他语言和运行时扩展生态系统(如C++,C#,Java,Python,PHP,Go,.NET)。
+
+Visual Studio Code is a lightweight but powerful source code editor which runs on your desktop and is available for Windows, macOS and Linux. It comes with built-in support for JavaScript, TypeScript and Node.js and has a rich ecosystem of extensions for other languages and runtimes (such as C++, C#, Java, Python, PHP, Go, .NET).
+
+
+
+ 官方网站
+ GitHub
+
+
+
VLC - 媒体播放器 VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。
+
+VLC is a free and open source cross-platform multimedia player and framework that plays most multimedia files as well as DVDs, Audio CDs, VCDs, and various streaming protocols.
+
+
+
+ 官方网站
+ GitHub
+
+
+
WindTerm - 跨平台终端 一款专业的跨平台SSH/Sftp/Shell/Telnet/Serial终端。
+
+A professional cross-platform SSH/Sftp/Shell/Telnet/Serial terminal.
+
+
+
+ 官方网站
+ GitHub
+
+
+
+
+
服务应用 服务应用是一种在后台运行的应用程序,通常在服务器或云平台上运行。与桌面应用程序和移动应用程序不同,服务应用程序通常不直接与用户交互,而是在后台执行某些任务。服务应用程序可以具有许多不同的功能,例如数据处理、文件传输、消息传递、安全认证等。服务应用程序通常使用 Web 技术(例如 RESTful API、SOAP、JSON 等)作为与其他应用程序和服务进行交互的接口。服务应用程序可以在云平台上扩展和自动扩展,以满足不断变化的需求。同时,服务应用程序也需要更多的开发和维护工作,因为它们需要考虑安全性、可伸缩性、可靠性等问题。
+
推荐部署在云服务器上或有公网IP的NAS设备上,推荐使用常见的Linux发行版,如CentOS、Ubuntu、Debian。
+
推荐使用 docker-compose
方式部署便于维护和迁移,但部署方式不限于此,文中推荐的大部分服务都提供了跨平台、跨架构支持,更多部署方式请参考官方网站或GitHub。
+
acme.sh - 自动化证书 一个实现ACME客户端协议的纯Unix shell脚本。
+
+A pure Unix shell script implementing ACME client protocol.
+
+
本站的证书由Let’s Encrypt签发,因为托管在Vercel和Netlify中,服务商会定期进行续签,个人无需维护。
+
但个人服务器的证书就需要自己维护了,这时就要用到acme.sh。具体用法参考以下内容以及项目官网文档。
+
+
+ 官方网站
+ GitHub
+
+
+
AdGuard Home - 私人DNS AdGuard Home 是一款全网广告拦截与反跟踪软件。在您将其安装完毕后,它将保护您所有家用设备,同时您不再需要安装任何客户端软件。随着物联网与连接设备的兴起,掌控您自己的整个网络环境变得越来越重要。
+
+AdGuard Home is a network-wide software for blocking ads & tracking. After you set it up, it’ll cover ALL your home devices, and you don’t need any client-side software for that. With the rise of Internet-Of-Things and connected devices, it becomes more and more important to be able to control your whole network.
+
+
+
+ 官方网站
+ GitHub
+
+
+
Alist - 多存储整合 一个支持多存储的文件列表程序,由 Gin 和 Solidjs 驱动。
+
+A file list program that supports multiple storage, powered by Gin and Solidjs.
+
+
+
非常好用的一款存储整合服务,可以把各种存储整合在一个服务中,提供了友好的操作界面,支持超多网盘和其他存储方式、在线预览、离线下载、推送到Aira下载等。
+
+ 官方网站
+ GitHub
+
+
+
aria2 - 下载工具 aria 2是一个轻量级的多协议和多源,跨平台下载工具,在命令行操作。它支持HTTP/HTTPS,FTP,SFTP,BitTorrent和Metalink。
+
+aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.
+
+
如果没有自己的服务器,建议使用Motrix - 下载工具 简单易用。
+
GitHub
+
AriaNg - aria2 WebUI AriaNg,一个让aria2更容易使用的现代化Web前端。
+
+AriaNg, a modern web frontend making aria2 easier to use.
+
+
+
只是一个静态的网站,可以直接双击index.html运行,也可以托管到免费的平台中使用,如GitHub Pages、Vercel等。或者使用我托管在Netlify中的AriaNg 。
+
GitHub
+
ddns-go - 动态域名解析 自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。
+
+
一般家用宽带没有固定的公网IP,但目前大部分地区运行商都提供了动态公网IPv6,此时就需要动态域名解析了。实现原理很简单,定时获取本机公网IP,调用域名服务商API将值更新上去,但是这个项目已经很完善,没必要重复造轮子,完全满足需求。
+
GitHub
+
Heimdall - 导航页 应用程序仪表板和启动器。
+
+An Application dashboard and launcher.
+
+
+
简约大气的导航页,且可以对一些支持的应用提供扩展功能,如监控Portainer容器状态、aria2下载任务状态等。
+
GitHub
+
Home Assistant - 家庭自动化平台 将本地控制和隐私放在首位的开源家庭自动化。由世界各地的社区成员和DIY爱好者组成的团体提供强力支持。
+
+Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts.
+
+
+
目前智能家居品牌很多,大部分品牌都在搞自家生态,想使用一个APP控制家里所有设备,就需要用到Home Assistant将不同品牌智能设备接入统一管理。
+
+ 官方网站
+ GitHub
+
+
+
Qwerty Learner - 记单词 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件。
+
+Words learning and English muscle memory training software designed for keyboard workers.
+
+
+
+ 官方网站
+ GitHub
+
+
+
RustDesk - 远程桌面 RustDesk 是一个功能齐全的开源远程控制替代方案,可通过最少的配置实现自托管和安全性。
+
+RustDesk is a full-featured open source remote control alternative for self-hosting and security with minimal configuration.
+
+
+
建议使用拥有公网IP的设备自建服务器(无公网IP可以通过Tailscale - 异地组网 后使用),我的NAS只有公网IPv6,上行带宽30Mbps,使用体验比ToDesk免费版好很多,已经逐渐放弃使用ToDesk。
+
+ 官方网站
+ GitHub
+
+
+
Tailscale - 异地组网 Tailscale是一种VPN服务,可以让您在世界任何地方安全、轻松地访问您拥有的设备和应用程序。它使用开源WireGuard 协议实现加密的点对点连接,这意味着只有您的专用网络上的设备才能相互通信。
+
+Tailscale is a VPN service that makes the devices and applications you own accessible anywhere in the world, securely and effortlessly. It enables encrypted point-to-point connections using the open source WireGuard protocol, which means only devices on your private network can communicate with each other.
+
+
+
当用手机或电脑处于无IPv6环境时,可以通过Tailscale来访问家中的NAS服务器。需要注意的是,组网的双方其中有一方的NAT 是Symmetric(对称型),就会打洞失败,流量会经转公共DERP服务器,速度很慢。同类型的产品还有Zerotier,个人感觉没有Tailscale好用。
+
+ 官方网站
+ GitHub
+
+
+
Uptime Kuma - 服务状态监控 一个精美的自托管监控工具。
+
+A fancy self-hosted monitoring tool.
+
+
+
可以用于监控并记录一些可访问服务的运行状态,如docker容器、网站等,也可以用作导航页(Heimdall平替)。除了管理页面,还可以创建允许匿名访问的状态页面(示例 - IPv6 Only )。
+
GitHub
+
开源字体 开源字体是指那些可以在版权允许的情况下免费或低成本向公众提供使用和修改的字体。这些字体的设计文件(源代码)通常是公开的,任何人在遵循相关许可协议的前提下都可以下载、使用,并在需要时进行修改和再分发。
+
阿里巴巴普惠体 阿里巴巴普惠体是一套全球永久免费正版商用的字体家族。
+
+
阿里巴巴普惠体3.0为一套符合新国家标准GB18030-2022的简体中文字符集,包含GB18030-2022强制规范三个实现级别:实现级别1+实现级别2标准规格的7字重、实现级别3标准规格的Regular 单一字重。7字重共194,460个全形汉字。包含拉丁字母、希腊字母、西里尔字母、标点符号。
+
官方网站
+
Cascadia Code 这是一种有趣的新型等宽字体,包含编程连字,旨在增强 Windows 终端的现代外观和感觉。
+
+This is a fun, new monospaced font that includes programming ligatures and is designed to enhance the modern look and feel of the Windows Terminal.
+
+
+
+
GitHub
+
Monaspace 一个创新的代码字体超家族。
+
+An innovative superfamily of fonts for code
+
+
+
+ 官方网站
+ GitHub
+
+
+
霞鹜文楷 一款开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生。
+
+An open-source Chinese font derived from Fontworks’ Klee One.
+
+
+
+
GitHub
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🌈Awesome Software / Service
+
https://awaw.cc/post/awesome/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/bat-date/index.html b/post/bat-date/index.html
new file mode 100644
index 0000000..ac83a0c
--- /dev/null
+++ b/post/bat-date/index.html
@@ -0,0 +1,851 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 批处理获取时间小于10点时补零 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
使用 %time:~0,2%
获取时间时,当前时间若小于10点,获取到的时间不会自动补零,但是分钟和秒钟会补零,所以小时部分需要自己处理一下。
+
+
Code 1 2 3 4 5 6 7 @echo offset hour=%time:~0,2%if %hour% LSS 10 (set "hour=0%time:~1,1%" )set date =%date :~0,4%-%date :~5,2%-%date :~8,2%T%hour%:%time:~3,2%:%time:~6,5%echo %date % pause
+
Output
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
批处理获取时间小于10点时补零
+
https://awaw.cc/post/bat-date/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/car-code-generator/index.html b/post/car-code-generator/index.html
new file mode 100644
index 0000000..0d52dfb
--- /dev/null
+++ b/post/car-code-generator/index.html
@@ -0,0 +1,877 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 挪车码生成器 - 开源 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
临时停车时,直接把手机号放在车上,容易被广告推销人员盯上,用二维码的方式间接给别人提供联系方式,可以有效降低此类情况发生。
+
+
优势
+使用挪车码展示联系方式,可以避免直接展示出手机号码,广告推销人员可能懒得扫码获取你的手机号
+可以使用微信、浏览器、系统相机扫一扫等进行扫码,无需手动输入长达11位的无序数字 组成的手机号,直接一键拨号,减少焦虑感
+
+
劣势
+由于本服务是完全免费的,故无法提供虚拟手机号进行拨号
+
+
使用方法
+输入手机号码
+保存到挪车码
+用作图工具添加“扫码挪车”等字样后用A4纸打印出来
+临时停车的时候放在车窗下显眼位置
+
+
截图
+
+
下载地址 https://www.lanzoux.com/iej9Tqkzj7c 提取码:pdone
+
代码仓库 https://github.com/pdone/car-code-generator
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tools
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
挪车码生成器 - 开源
+
https://awaw.cc/post/car-code-generator/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/dapper-helper/index.html b/post/dapper-helper/index.html
new file mode 100644
index 0000000..29553d1
--- /dev/null
+++ b/post/dapper-helper/index.html
@@ -0,0 +1,907 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DapperHelper - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dapper is a simple object mapper for .NET and owns the title of King of Micro ORM in terms of speed and is virtually as fast as using a raw ADO.NET data reader. An ORM is an Object Relational Mapper, which is responsible for mapping between database and programming language.
+
+
Dapper extends the IDbConnection by providing useful extension methods to query your database.
+
How Dapper Works? It is a three-step process.
+
+Create an IDbConnection object.
+Write a query to perform CRUD operations.
+Pass query as a parameter in the Execute method.
+
+
Installation Dapper is installed through NuGet: https://www.nuget.org/packages/Dapper
+
1 PM> Install-Package Dapper
+
+
Requirement Dapper works with any database provider since there is no DB specific implementation.
+
Methods Dapper will extend your IDbConnection interface with multiple methods:
+
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 string sqlOrderDetails = "SELECT TOP 5 * FROM OrderDetails;" ;string sqlOrderDetail = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;" ;string sqlCustomerInsert = "INSERT INTO Customers (CustomerName) Values (@CustomerName);" ;using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools())) { var orderDetails = connection.Query<OrderDetail>(sqlOrderDetails).ToList(); var orderDetail = connection.QueryFirstOrDefault<OrderDetail>(sqlOrderDetail, new {OrderDetailID = 1 }); var affectedRows = connection.Execute(sqlCustomerInsert, new {CustomerName = "Mark" }); Console.WriteLine(orderDetails.Count); Console.WriteLine(affectedRows); FiddleHelper.WriteTable(orderDetails); FiddleHelper.WriteTable(new List<OrderDetail>() { orderDetail }); }
+
+
Try it: .NET Core | .NET Framework
+
Parameter Execute and queries method can use parameters from multiple different ways:
+
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 var affectedRows = connection.Execute(sql, new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1" }, commandType: CommandType.StoredProcedure); DynamicParameters parameter = new DynamicParameters(); parameter.Add("@Kind" , InvoiceKind.WebInvoice, DbType.Int32, ParameterDirection.Input); parameter.Add("@Code" , "Many_Insert_0" , DbType.String, ParameterDirection.Input); parameter.Add("@RowCount" , dbType: DbType.Int32, direction: ParameterDirection.ReturnValue); connection.Execute(sql, parameter, commandType: CommandType.StoredProcedure);int rowCount = parameter.Get<int >("@RowCount" ); connection.Query<Invoice>(sql, new {Kind = new [] {InvoiceKind.StoreInvoice, InvoiceKind.WebInvoice}}).ToList(); connection.Query<Invoice>(sql, new {Code = new DbString {Value = "Invoice_1" , IsFixedLength = false , Length = 9 , IsAnsi = true }}).ToList();
+
+
Result The result returned by queries method can be mapped to multiple types:
+
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 string sqlOrderDetails = "SELECT TOP 10 * FROM OrderDetails;" ;using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools())) { var anonymousList = connection.Query(sqlOrderDetails).ToList(); var orderDetails = connection.Query<OrderDetail>(sqlOrderDetails).ToList(); Console.WriteLine(anonymousList.Count); Console.WriteLine(orderDetails.Count); FiddleHelper.WriteTable(orderDetails); FiddleHelper.WriteTable(connection.Query(sqlOrderDetails).FirstOrDefault()); }
+
Try it: .NET Core | .NET Framework
+
Utilities
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 connection.QueryAsync<Invoice>(sql) connection.Query<Invoice>(sql, buffered: false )using (var transaction = connection.BeginTransaction()) { var affectedRows = connection.Execute(sql, new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1" }, commandType: CommandType.StoredProcedure, transaction: transaction); transaction.Commit(); }var affectedRows = connection.Execute(sql,new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1" }, commandType: CommandType.StoredProcedure);
+
+
DapperHelper.cs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 using System;using System.Collections.Generic;using System.Configuration;using System.Data;using System.Data.SqlClient;using System.Data.SQLite;using System.Linq;using System.Threading.Tasks;using Dapper;using MySql.Data.MySqlClient;namespace ORMSuit.DAO { public class DapperHelper <T > { enum DBType { MSSQL, MySQL, SQLite } private static string connectionString = "" ; public static int dbType = 0 ; public static IDbConnection GetConnection () { switch ((DBType) dbType) { case DBType.MSSQL: return new SqlConnection (connectionString); case DBType.MySQL: connectionString = ConfigurationManager.ConnectionStrings["mysqlconn" ].ConnectionString; return new MySqlConnection (connectionString); case DBType.SQLite: connectionString = ConfigurationManager.ConnectionStrings["sqliteconn" ].ConnectionString; return new SQLiteConnection (connectionString); default : return new SqlConnection (connectionString); } } public static List<T> Query (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.Query<T> (sql, param).ToList (); } } public static T QueryFirst (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { List<T> tempList = con.Query<T> (sql, param).ToList (); if (tempList != null && tempList.Count > 0 ) { return tempList[0 ]; } else { return default ; } } } public static T QueryFirstOrDefault (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.QueryFirstOrDefault<T> (sql, param); } } public static T QuerySingle (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.QuerySingle<T> (sql, param); } } public static bool Exists (string sql, object param = null ) { object obj = ExecuteScalar (sql, param); int count = 0 ; if (obj == null ) { count = 0 ; } else { count = Convert.ToInt32 (obj); } if (count > 0 ) { return true ; } else { return false ; } } public static int RecordCount (string sql, object param = null ) { object obj = ExecuteScalar (sql, param); int count = 0 ; if (obj == null ) { count = 0 ; } else { count = Convert.ToInt32 (obj); } return count; } public static T QuerySingleOrDefault (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.QuerySingleOrDefault<T> (sql, param); } } public static int Execute (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.Execute (sql, param); } } public static IDataReader ExecuteReader (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.ExecuteReader (sql, param); } } #region public static DataTable ExecuteDataTabel (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return DataReaderToDataTable (con.ExecuteReader (sql, param)); } } public static DataSet ExecuteDataSet (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return DataReaderToDataSet (con.ExecuteReader (sql, param)); } } private static DataTable DataReaderToDataTable (IDataReader dataReader ) { DataTable datatable = new DataTable (); for (int i = 0 ; i < dataReader.FieldCount; i++) { DataColumn myDataColumn = new DataColumn (); myDataColumn.DataType = dataReader.GetFieldType (i); myDataColumn.ColumnName = dataReader.GetName (i); datatable.Columns.Add (myDataColumn); } while (dataReader.Read ()) { DataRow myDataRow = datatable.NewRow (); for (int i = 0 ; i < dataReader.FieldCount; i++) { myDataRow[i] = dataReader[i].ToString (); } datatable.Rows.Add (myDataRow); myDataRow = null ; } dataReader.Close (); return datatable; } public static DataSet DataReaderToDataSet (IDataReader dataReader ) { DataSet dataSet = new DataSet (); do { DataTable schemaTable = dataReader.GetSchemaTable (); DataTable dataTable = new DataTable (); if (schemaTable != null ) { for (int i = 0 ; i < schemaTable.Rows.Count; i++) { DataRow dataRow = schemaTable.Rows[i]; string columnName = (string ) dataRow["ColumnName" ]; DataColumn column = new DataColumn (columnName, (Type) dataRow["DataType" ]); dataTable.Columns.Add (column); } dataSet.Tables.Add (dataTable); while (dataReader.Read ()) { DataRow dataRow = dataTable.NewRow (); for (int i = 0 ; i < dataReader.FieldCount; i++) { dataRow[i] = dataReader.GetValue (i); } dataTable.Rows.Add (dataRow); } } else { DataColumn column = new DataColumn ("RowsAffected" ); dataTable.Columns.Add (column); dataSet.Tables.Add (dataTable); DataRow dataRow = dataTable.NewRow (); dataRow[0 ] = dataReader.RecordsAffected; dataTable.Rows.Add (dataRow); } } while (dataReader.NextResult ()); return dataSet; } #endregion public static object ExecuteScalar (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.ExecuteScalar (sql, param); } } public static T ExecuteScalarForT (string sql, object param = null ) { using (IDbConnection con = GetConnection ()) { return con.ExecuteScalar<T> (sql, param); } } public static List<T> ExecutePro (string proc, object param = null ) { using (IDbConnection con = GetConnection ()) { List<T> list = con.Query<T> (proc, param, null , true , null , CommandType.StoredProcedure).ToList (); return list; } } public static int ExecuteTransaction (Dictionary<string , object > dic ) { using (IDbConnection con = GetConnection ()) { using (var transaction = con.BeginTransaction ()) { try { int result = 0 ; foreach (var sql in dic) { result += con.Execute (sql.Key, sql.Value, transaction); } transaction.Commit (); return result; } catch (Exception ex) { transaction.Rollback (); return 0 ; } } } } public static int ExecuteTransaction (string sql, object obj ) { using (IDbConnection con = GetConnection ()) { con.Open (); using (IDbTransaction transaction = con.BeginTransaction ()) { try { int result = 0 ; result = con.Execute (sql, obj, transaction); transaction.Commit (); con.Close (); return result; } catch (Exception ex) { transaction.Rollback (); con.Close (); return 0 ; } } } } public static Task<int > ExecuteTransactionAsync (string sql, object obj ) { using (IDbConnection con = GetConnection ()) { con.Open (); using (IDbTransaction transaction = con.BeginTransaction ()) { try { Task<int > result; result = con.ExecuteAsync (sql, obj, transaction); transaction.Commit (); con.Close (); return result; } catch (Exception ex) { transaction.Rollback (); con.Close (); return null ; } } } } } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
DapperHelper
+
https://awaw.cc/post/dapper-helper/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/deepin-20/index.html b/post/deepin-20/index.html
new file mode 100644
index 0000000..4f6f748
--- /dev/null
+++ b/post/deepin-20/index.html
@@ -0,0 +1,876 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 深度操作系统 20——崭新视界,创无止境 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
深度操作系统是一个致力于为全球用户提供美观易用、安全可靠的Linux发行版。
+
+
+
深度操作系统 20正式版(1002)采取统一的设计风格,从桌面环境和应用进行重新设计,带来焕然一新的视觉感受。底层仓库升级到Debian 10.5,系统安装采用双内核机制(Kernel 5.4、Kernel 5.7),全面提升系统稳定性和兼容性。全新设计的启动器菜单、指纹识别、系统安全增强等,系统部分预装应用升级到最新版本,只为给你更好体验。
+
统一风格的桌面环境 别出心裁的图标设计,焕然一新的图形界面,自然、平滑的动画过渡效果,更有独树一帜的圆角窗口设计,精美绝伦的多任务视图,处处精心,只为给你细腻自然的品质体验。
+
+
个性贴心的通知管理 增强通知中心功能,支持设置通知时提示声音、锁屏时显示消息、仅在通知中心显示、显示消息预览,必要应用强提醒、特定应用弱提醒或不提醒,个性化你的消息通知,在不错过任何重要提醒的同时,避免不必要的打扰。
+
+
系统支持双内核安装 系统安装界面提供双内核选项,Kernel 5.4(LTS)和Kernel 5.7(Stable)以及Safe Graphics模式,保证系统安装更多选择,提升系统整体的稳定性、兼容性,最新的内核支持更多的硬件设备。
+
+
更易用的新版安装器 化繁为简的设计和交互,保证更一致的操作习惯。新版的安装器界面,只需按照操作向导提示安装即可,在硬盘分区操作中,提供手动和全盘安装两种模式,并且支持全盘加密功能。
+
+
管理方便的应用商店 应用商店的不同类别应用,覆盖了生活、工作的主要使用场景,本次新增一键更新、应用筛选等功能,带来更便捷的应用管理体验,同时也兼容部分Wine应用,并达到原生应用的体验。
+
+
好用安全的指纹识别 全新的指纹功能框架,提供了更细腻的引导交互和更准确的场景提示。可使用指纹进行解锁登录、验证身份和管理员权限。现已支持多款国产指纹硬件。
+
+
下载
+https://www.deepin.org/zh/download/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
深度操作系统 20——崭新视界,创无止境
+
https://awaw.cc/post/deepin-20/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/free-control/index.html b/post/free-control/index.html
new file mode 100644
index 0000000..33884a4
--- /dev/null
+++ b/post/free-control/index.html
@@ -0,0 +1,1016 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Free Control 用电脑控制手机 - 开源 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
FreeControl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
介绍 [ English | 中文 ]
+
基于开源项目scrcpy ,提供简洁的交互界面。
+
+编码语言 C#
+开发工具 Visual Studio 2022
+运行环境 .NET Framework 4.7.2
+
+
界面
+
+
+
下载 GitHub Release https://github.com/pdone/FreeControl/releases/latest/download/FreeControl.exe
+
My Proxy https://cdn.awaw.cc/gh/pdone/FreeControl/releases/latest/download/FreeControl.exe
+
代码仓库
+
+
+
+
+
更新记录
+
+
+
+
+
常见问题 输入法问题 v1.7.0
及以后的版本中,默认启用scrcpy的 UHID keyboard
特性,以优化中文输入体验。
+
如果在此过程中遇到了什么问题,可尝试打开配置文件 %AppData%\FreeControl\config.json
,将 CustomArgs
的值由 --keyboard=uhid
改为 --keyboard=sdk
。
+
更多信息可参考 scrcpy-doc-keyboard 。
+
+已过时
+
+个人测试发现,目前支持跨屏进行拼音输入的 手机输入法APP 如下:
+
+搜狗输入法
+QQ输入法
+谷歌拼音输入法
+Gboard
+微信输入法
+
+此功能需要输入法APP适配,有更好用的输入法欢迎留言推荐。
+
+自动切换输入法功能默认禁用。如需启用,先关闭程序,然后打开配置文件 %AppData%\FreeControl\config.json
,将 EnableSwitchIME
字段值改为 true
,保存后启动程序即可。
+
+
+
+
设备连接问题 USB 连接 通过 USB 连接来正常使用 adb 需要保证几点:
+
+硬件状态正常。
+包括 Android 设备处于正常开机状态,USB 连接线和各种接口完好。
+
+Android 设备的开发者选项和 USB 调试模式已开启。
+可以到「设置」-「开发者选项」-「Android 调试」查看。
+如果在设置里找不到开发者选项,那需要通过一个彩蛋来让它显示出来:在「设置」-「关于手机」连续点击「版本号」7 次。
+
+设备驱动状态正常。
+这一点貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安装驱动的情况,确认这一点可以右键「计算机」-「属性」,到「设备管理器」里查看相关设备上是否有黄色感叹号或问号,如果没有就说明驱动状态已经好了。否则可以下载一个手机助手类程序来安装驱动先。
+
+通过 USB 线连接好电脑和设备后确认状态。
+
+
+如果能看到
+
+
+说明连接成功。
+
+
+
无线连接(Android11 及以上) Android 11 及更高版本支持使用 Android 调试桥 (adb) 从工作站以无线方式部署和调试应用。例如,您可以将可调试应用部署到多台远程设备,而无需通过 USB 实际连接设备。这样就可以避免常见的 USB 连接问题,例如驱动程序安装方面的问题。
+
官方文档
+
操作步骤:
+
+更新到最新版本的 SDK 平台工具 (至少30.0.0)。
+
+将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
+
+在开发者选项中启用无线调试 。
+
+在询问要允许在此网络上进行无线调试吗?的对话框中,点击允许。
+
+选择使用配对码配对设备,使用弹窗中的 IP 地址和端口号。
+
+
+提示 Enter pairing code:
时输入弹窗中的配对码,成功后会显示 Successfully paired to ...
。
+
+使用无线调试下的 IP 地址和端口 。
+
+
+确认连接状态。
+
+
+如果能看到
+
+
+说明连接成功。
+
+
+
无线连接(需要借助 USB 线) 除了可以通过 USB 连接设备与电脑来使用 adb,也可以通过无线连接——虽然连接过程中也有需要使用 USB 的步骤,但是连接成功之后你的设备就可以在一定范围内摆脱 USB 连接线的限制啦!
+
操作步骤:
+
+将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
+
+将设备与电脑通过 USB 线连接。
+应确保连接成功(可运行 adb devices
看是否能列出该设备)。
+
+让设备在 5555 端口监听 TCP/IP 连接:
+
+
+断开 USB 连接。
+
+找到设备的 IP 地址。
+一般能在「设置」-「关于手机」-「状态信息」-「IP地址」找到。
+
+通过 IP 地址连接设备。
+1 adb connect <device-ip-address>
+
+这里的 <device-ip-address>
就是上一步中找到的设备 IP 地址。
+
+确认连接状态。
+
+
+如果能看到
+1 <device-ip-address>:5555 device
+
+说明连接成功。
+
+
+
如果连接不了,请确认 Android 设备与电脑是连接到了同一个 WiFi,然后再次执行 adb connect <device-ip-address>
那一步;
+
如果还是不行的话,通过 adb kill-server
重新启动 adb 然后从头再来一次试试。
+
无线连接(无需借助 USB 线) 需要 root 权限 ,此处不做详细说明,有需要的朋友可参考此处 。
+
保持唤醒功能 仅在手机充电时有效。
+
音频转发功能 使用 Android 11
或更高版本的设备支持音频转发,并且默认情况下启用:
+
+对于 Android 12
或更高版本,它开箱即用。
+对于 Android 11
,您需要确保在启动scrcpy时设备屏幕已解锁。假的弹出窗口将短暂出现,使系统认为shell应用程序处于前台。没有这个,音频捕获将失败。
+对于 Android 10
或更早版本,无法捕获音频并自动禁用。
+
+
捐赠 如果您觉得这个项目对您有帮助,欢迎请作者喝杯咖啡。☕
+
+
爱发电❤ https://afdian.net/a/pdone
+
Stargazers Over Time
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tools
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Free Control 用电脑控制手机 - 开源
+
https://awaw.cc/post/free-control/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/git-command/index.html b/post/git-command/index.html
new file mode 100644
index 0000000..96b8d08
--- /dev/null
+++ b/post/git-command/index.html
@@ -0,0 +1,1013 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 最常用的 35 个 Git 命令 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
不管你是新手还是经验丰富的开发人员,都需要使用源代码管理。因此很大几率上你会选择使用Git来管理源代码。
+
要发挥Git的全部潜力,我们需要了解Git命令。在本文中,你将学到最有用的一些Git命令,掌握这些Git命令将帮助你提升编码水平。
+
+
+
本Git命令指南共分为三个部分:基础命令,进阶命令和高阶Git命令。
+
基础Git命令 在这个部分中,我们要学习的是一些非常基础的Git命令。这些基础的Git命令是学习其他进阶命令的基础。
+
下面请看这9个基础的Git命令。
+
1. git config git config
命令非常有用。尤其是在你第一次使用Git或刚安装新的Git时。此命令可设置身份——Name和Email地址。并且每次提交时会使用此信息。
+
1 2 3 $ git config --global user.name "Your name" $ git config --global user.email "Your email"
+
+
2. git version 顾名思义,它会检查你使用的是哪个版本的Git。目前,截至编写本指南时,Git for Windows的最新版本是2.31.1。它发布于2021年3月27日。
+
+
+
3. git init 这可能是你在Git中启动新项目所使用的第一个命令。此命令将创建一个空白的新存储库,然后你可以将源代码存储在此存储库中。
+
+
+
或者,你也可以在git init
命令中使用存储库名称。
+
1 $ git init <your repository name>
+
+
4. git clone git clone
命令将使用现有的存储库进行复制。git init
和git clone
之间有一个主要区别。
+
在你需要在现有的存储库上进行复制时,使用git clone
。git clone
命令首先在内部使用git init
命令,然后检出所有内容。
+
1 git clone <your project URL>
+
+
5. git add git add
命令会把所有新的代码文件或修改后的文件添加到存储库中。此命令提供了添加文件和文件夹的不同选项。
+
将单个文件添加到暂存区
+
1 $ git add your_file_name
+
+
此选项会将所有修改过的文件和新文件添加到暂存区
+
+
+
6. git commit 这个Git命令是必不可少的。如果不能合理利用此命令,则可能会降低项目质量。
+
简而言之,git commit
会将更改添加到本地存储库。
+
1 $ git commit -m "your useful commit message"
+
+
7. git status 使用此Git命令可以方便地查看有多少文件需要得到关注。你可以随时运行此命令。
+
此命令可以用来在git add
和git commit
之间查看状态。
+
+
+
8. git branch 大多数时候,你的Git存储库中总会有多个分支。我们可以使用git branch
命令有效地管理分支。Git分支有许多不同的选项和开关。
+
为简单起见,在这里我将重点介绍如何创建和删除Git分支。
+
列出所有分支
+
+
创建新的分支
+
1 $ git branch <branch_name>
+
删除分支
+
1 $ git branch -d <branch_name>
+
+
9. git checkout 此Git命令用于在分支之间进行切换。这是功能强大的git命令之一,堪称万能的瑞士军刀。
+
以下是切换到另一个分支的语法。
+
1 $ git checkout <branch_name>
+
此外,你也可以创建和检出到分支。
+
1 $ git checkout -b <your_new_branch_name>
+
+
进阶Git命令 掌握了基础的Git命令之后,我们就该学习进阶Git命令了。
+
如果你需要与团队合作,与他人共享代码,那么这些Git命令会非常有用。另外,还有一些类似git log
命令,这些命令可帮助查看以前的提交历史。
+
10. git remote git remote
命令就像边界,如果你需要与外界连接,则必须使用git remote
命令。此命令会将你的本地存储库连接到远程。
+
1 $ git remote add <shortname> <url>
+
+
举例
+
1 $ git remote add origin https://dev.azure.com/aCompiler/_git/DemoProject
+
+
11. git push (借助git remote
命令)与远程存储库连接之后,就需要将更改推送到存储库。
+
1 $ git push -u <short_name> <your_branch_name>
+
+
举例
+
1 $ git push -u origin feature_branch
+
+
12. git push –set-upstream 在使用git push
之前,我们应该先设置好origin
和upstream
。下面是设置upstream
的命令。
+
1 $ git push --set-upstream <short_name> <branch_name>
+
+
举例
+
1 $ git push --set-upstream origin feature_branch
+
+
13. git fetch 当需要下载其他团队成员的更改时,就得使用git fetch
。
+
此命令会下载有关提交、引用等的所有信息,因此你可以在将这些更改应用于本地存储库之前对其进行检查。
+
+
+
14. git pull git pull
命令下载内容(而不是元数据),并立即用最新的内容更新本地存储库。
+
+
+
15. git stash 此git命令会临时存储已修改的文件。你可以使用以下Git命令处理stash
工作。
+
+
+
可以使用以下命令查看所有stash
+
+
+
如果你需要应用stash
到分支,那就使用apply
+
+
+
16. git log 在git log
的帮助下,你可以看到所有之前的提交,并且最近的提交出现在最前面。
+
+
+
默认情况下,它将显示当前已检出分支的所有提交,但是你可以强制通过所有选项来查看所有分支的所有提交。
+
+
+
17. git shortlog git shortlog
命令会显示来自git log
命令的摘要。如果你只对简短的摘要感兴趣,那么此命令就非常有用了。
+
这个命令有助于查看谁处理了什么,因为它对作者及其提交进行了分组。
+
+
+
18. git show 与git log
相比,此命令将显示有关特定提交的详细信息。
+
1 $ git show <your_commit_hash>
+
+
19. git rm 有时你需要从代码库中删除文件,在这种情况下,可以使用git rm
命令。
+
它可以从索引和工作目录中删除跟踪的文件。
+
1 $ git rm <your_file_name>
+
+
20. git merge git merge
可帮助将来自两个分支的更改集成到单个分支中。
+
1 $ git merge <branch_name>
+
此命令会将<branch_name>
合并到当前你选择的分支中。
+
高阶Git命令 现在是时候再上一个层次了。在这个部分中,我们要学习的是高阶的Git命令。这些命令就需要花时间去练习了。
+
但是一旦掌握了这些命令的基础知识,使用起来不要太轻松哦。
+
21. git rebase git rebase
类似于git merge
命令。它把两个分支集成到一个分支中,但有一个不一样的地方:git rebase
命令将会重写提交记录。
+
当你有多个私有分支合并到单个分支时,应使用git rebase
命令。它将使得提交历史成为线性的。
+
+
+
22. git bisect git bisect
命令可帮助查找糟糕的提交。
+
启动git bisect
+
+
让git bisect知道什么是好的提交
+
+
让git bisect知道什么是糟糕的提交
+
+
通过git bisect
,只要几分钟你就可以缩小问题代码的范围。
+
23. git cherry-pick git cherry-pick
是一个蛮有用的命令,允许你从任意分支中选择任意提交并将其应用于其他任意分支。
+
1 $ git cherry-pick <commit-hash>
+
+
git cherry-pick
不会修改存储库的历史记录;相反,它会添加到历史记录。
+
24. git archive git archive
命令会把多个文件合并为单个文件。就好像zip
实用程序一样,所以你可以提取存档文件以获取单个文件。
+
1 $ git archive --format zip HEAD > archive-HEAD.zip
+
它将创建当前修订的zip
存档。
+
25. git pull –rebase 在大多数情况下,当你使用git pull
时,你需要重新设置基准(并且不进行合并)。
+
此时,你就可以使用此选项。
+
+
这将帮助保持干净的历史记录。另外,还可以避免多次合并。
+
26. git blame 如果你需要逐行检查任意文件的内容,则需要使用git blame
命令。它可以帮助确定是谁对文件进行了更改。
+
1 $ git blame <your_file_name>
+
+
27. git tag 在Git中,标签很有用,你可以使用它们来管理发布。你可以将git tag
视为不会改变的分支。尤其是要公开发布的时候,则更为重要了。
+
+
+
28. git verify-commit git verify-commit
命令将检查gpg
签名。GPG,GNU Privacy Guard,是sign文件中使用的工具,包含签名。
+
1 $ git verify-commit <commit>
+
+
29. git verify-tag 可以以同样的方式确认标签。
+
+
+
30. git diff 大多数情况下,在提交或推送之前,你需要比较两个git文件或分支。用这个命令就方便多了。
+
将工作目录与本地存储库进行比较
+
1 $ git diff HEAD <filename>
+
+
比较两个分支
+
1 $ git diff <source branch> <target branch>
+
+
git citool
是Git提交的图形化替代。
+
+
+
32. git mv 重命名git文件。接受两个参数,源文件名和目标文件名。
+
1 $ git mv <old-file-name> <new-file-name>
+
+
33. git clean 你可以使用git clean
命令处理未跟踪的文件。可以使用此命令从工作目录中删除所有未跟踪的文件。如果要处理跟踪的文件,则需要使用git reset
命令。
+
+
+
34. git help Git中有许多命令,如果你需要其他命令的帮助,则可以随时在终端上使用git help
。
+
1 $ git help <git_command>
+
+
35. git whatchanged 此命令的作用与git log
相同,但为原始格式。并且由于历史原因,它也是git的一份子。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
最常用的 35 个 Git 命令
+
https://awaw.cc/post/git-command/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/js-5tip/index.html b/post/js-5tip/index.html
new file mode 100644
index 0000000..101bf2b
--- /dev/null
+++ b/post/js-5tip/index.html
@@ -0,0 +1,922 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5个小技巧让你写出更好的JavaScript条件语句 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+原文地址:5 Tips to Write Better Conditionals in JavaScript 原文作者:Jecelyn Yeen 翻译&校对:pdone
+
+
+
+
1.在条件较多时使用 Array.includes 举个栗子:
+
1 2 3 4 5 6 function test (fruit ) { if (fruit == 'apple' || fruit == 'strawberry' ) { console .log ('red' ); } }
+
+
乍一看,上面的例子看起来不错。 但是,如果我们有更多的红色水果,比如樱桃和蔓越莓呢? 我们是否要用更多的||
来扩展语句?
+
我们可以使用Array.includes
重写上面的条件。
+
1 2 3 4 5 6 7 8 function test (fruit ) { const redFruits = ['apple' , 'strawberry' , 'cherry' , 'cranberries' ]; if (redFruits.includes (fruit)) { console .log ('red' ); } }
+
+
我们将红色水果(条件)
整合到一个数组中。这样做可以让代码看起来更整洁。
+
2.减少嵌套,尽早返回 让我们扩展前面的示例,增加另外两个条件: ——如果没有提供水果,抛出错误; ——如果超过10种水果,打印出水果数量。
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 function test (fruit, quantity ) { const redFruits = ['apple' , 'strawberry' , 'cherry' , 'cranberries' ]; if (fruit) { if (redFruits.includes (fruit)) { console .log ('red' ); if (quantity > 10 ) { console .log ('big quantity' ); } } } else { throw new Error ('No fruit!' ); } }test (null ); test ('apple' ); test ('apple' , 20 );
+
+
看看上面的代码,我们有: ——1个if / else
语句过滤掉无效条件; ——3层嵌套if语句(条件1,2和3)。 对我而言,我遵循的规则是在发现无效条件时提前返回。
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 function test (fruit, quantity ) { const redFruits = ['apple' , 'strawberry' , 'cherry' , 'cranberries' ]; if (!fruit) throw new Error ('No fruit!' ); if (redFruits.includes (fruit)) { console .log ('red' ); if (quantity > 10 ) { console .log ('big quantity' ); } } }
+
这样做的话,我们会得到一个较少层级的嵌套语句。 这种编码风格很好,特别是当你有很长的if语句时(想象你需要滚动到最底层才知道这里有一个else语句,一点都不酷)。
+
通过反转条件并提前返回,我们可以进一步减少嵌套。 请查看下面的条件2,看看我们是如何做到的:
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function test (fruit, quantity ) { const redFruits = ['apple' , 'strawberry' , 'cherry' , 'cranberries' ]; if (!fruit) throw new Error ('No fruit!' ); if (!redFruits.includes (fruit)) return ; console .log ('red' ); if (quantity > 10 ) { console .log ('big quantity' ); } }
+
通过反转条件2,我们的代码现在没有嵌套语句。 当我们有很长的逻辑时,这种技巧非常有用,我们希望在不满足条件时停止下一步的处理。
+
但是这并不是硬性规定。问问自己,这个版本(没有嵌套)是否比前一个版本(条件2嵌套)更好、更可读?
+
对我而言,我会保留(条件2嵌套)这个版本,因为: ——代码简短直接,一个if语句是代码结构更清晰; ——反转条件可能会引发更多的思考过程(增加认知负荷)。
+
因此,始终追求更少的嵌套和尽早的返回,但不要过度。如果你感兴趣的话,这里有篇关于这个问题的文章以及 StackOverflow 上的讨论:
+
Avoid Else, Return Early by Tim Oxley
+
StackOverflow discussion on if/else coding style
+
3.使用函数默认参数和解构 我想下面的代码可能看起来很熟悉,我们总是需要检查null / undefined
值并给参数赋予默认值:
+
1 2 3 4 5 6 7 8 9 10 function test (fruit, quantity ) { if (!fruit) return ; const q = quantity || 1 ; console .log (`We have ${q} ${fruit} !` ); }test ('banana' ); test ('apple' , 2 );
+
+
实际上,我们可以通过设置函数的默认参数来省去参数q
:
+
1 2 3 4 5 6 7 8 function test (fruit, quantity = 1 ) { if (!fruit) return ; console .log (`We have ${quantity} ${fruit} !` ); }test ('banana' ); test ('apple' , 2 );
+
+
更简单直观不是吗? 请注意,函数的每个参数都可以有自己的默认值。 例如,我们也可以为水果
分配默认值:
+
1 function test (fruit ='unknown' , quantity = 1 )
+
+
如果我们的水果
是一个对象(Object)
怎么办? 我们可以指定默认参数吗?
+
1 2 3 4 5 6 7 8 9 10 11 12 13 function test (fruit ) { if (fruit && fruit.name ) { console .log (fruit.name ); } else { console .log ('unknown' ); } }test (undefined ); test ({ }); test ({ name : 'apple' , color : 'red' });
+
+
观察上边的例子,水果的name
属性存在时,我们会将它打印出来,否则打印'unknown'
。我们可以通过默认参数和解构赋值的方法来避免写出 fruit && fruit.name
这种条件。
+
1 2 3 4 5 6 7 8 9 10 function test ({name} = {} ) { console .log (name || 'unknown' ); }test (undefined ); test ({ }); test ({ name : 'apple' , color : 'red' });
+
+
由于我们只需要来自fruit的name
属性,我们可以使用{name}
将其解构出来,然后我们可以在代码中使用name
作为变量而不是fruit.name
。
+
我们还使用空对象{}
作为默认值。 如果我们不这样做,你将在执行遇到错误test(undefined) - Cannot destructure property name of 'undefined' or 'null'
。 因为undefined
中没有name
属性。
+
如果你不介意使用第三方库,有几种方法可以减少空值检查: ——使用 Lodash get 函数; ——使用 Facebook 开源的 idx 库(需搭配 Babeljs)。 这里有一个使用 Lodash 的例子:
+
1 2 3 4 5 6 7 8 9 function test (fruit ) { console .log (__.get (fruit, 'name' , 'unknown' ); }test (undefined ); test ({ }); test ({ name : 'apple' , color : 'red' });
+
+
您可以点击这里 运行演示代码。 此外,如果您是功能编程(FP)的粉丝,您可以选择使用Lodash fp ,Lodash的功能版本(方法更改为get或getOr)。
+
4.相较Switch更偏向于使用Map / Object 让我们看看下面的例子,我们想根据颜色打印水果:
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function test (color ) { switch (color) { case 'red' : return ['apple' , 'strawberry' ]; case 'yellow' : return ['banana' , 'pineapple' ]; case 'purple' : return ['grape' , 'plum' ]; default : return []; } }test (null ); test ('yellow' );
+
+
上面的代码似乎没有错,但我觉得它很冗长。 使用具有更清晰语法的object literal可以实现相同的结果:
+
1 2 3 4 5 6 7 8 9 10 const fruitColor = { red : ['apple' , 'strawberry' ], yellow : ['banana' , 'pineapple' ], purple : ['grape' , 'plum' ] };function test (color ) { return fruitColor[color] || []; }
+
+
或者,你可以使用Map来实现相同的结果:
+
1 2 3 4 5 6 7 8 9 const fruitColor = new Map () .set ('red' , ['apple' , 'strawberry' ]) .set ('yellow' , ['banana' , 'pineapple' ]) .set ('purple' , ['grape' , 'plum' ]);function test (color ) { return fruitColor.get (color) || []; }
+
+
Map是ES2015引入的对象类型,允许你存储键值对。
+
我们应该禁止使用switch语句吗? 不要局限于此。 就个人而言,我尽可能使用object literal,但我不会设置硬性规则来阻止使用Switch,视使用场景而定。
+
Todd Motto有一篇文章深入研究switch语句与对象文字,你可以点击这里 阅读。
+
TL;DR;重构方法 对于上面的示例,我们实际上可以重构我们的代码以使用Array.filter实现相同的结果。
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 const fruits = [ { name : 'apple' , color : 'red' }, { name : 'strawberry' , color : 'red' }, { name : 'banana' , color : 'yellow' }, { name : 'pineapple' , color : 'yellow' }, { name : 'grape' , color : 'purple' }, { name : 'plum' , color : 'purple' } ];function test (color ) { return fruits.filter (f => f.color == color); }
+
+
解决问题的方法永远不只一种。对于这个例子我们展示了四种实现方法。编程真有趣!
+
5.使用 Array.every 和 Array.some 来处理全部/部分满足条件 最后一个小技巧更多地是关于使用新的(也不是很新了)JavaScript 数组函数来减少代码行数。观察以下的代码,我们想要检查是否所有的水果都是红色的:
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 const fruits = [ { name : 'apple' , color : 'red' }, { name : 'banana' , color : 'yellow' }, { name : 'grape' , color : 'purple' } ];function test ( ) { let isAllRed = true ; for (let f of fruits) { if (!isAllRed) break ; isAllRed = (f.color == 'red' ); } console .log (isAllRed); }
+
+
代码太长了! 我们可以使用Array.every
减少行数:
+
1 2 3 4 5 6 7 8 9 10 11 12 const fruits = [ { name : 'apple' , color : 'red' }, { name : 'banana' , color : 'yellow' }, { name : 'grape' , color : 'purple' } ];function test ( ) { const isAllRed = fruits.every (f => f.color == 'red' ); console .log (isAllRed); }
+
+
现在是不是整洁了许多? 以类似的方式,如果我们想测试是否至少有一个水果为红色,我们可以使用Array.some用一行代码实现它。
+
1 2 3 4 5 6 7 8 9 10 11 12 const fruits = [ { name : 'apple' , color : 'red' }, { name : 'banana' , color : 'yellow' }, { name : 'grape' , color : 'purple' } ];function test ( ) { const isAnyRed = fruits.some (f => f.color == 'red' ); console .log (isAnyRed); }
+
+
让我们一起编写可读性更高的代码。 我希望你能在本文中学到一些新东西。
+
就这样。 快乐的编码!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
5个小技巧让你写出更好的JavaScript条件语句
+
https://awaw.cc/post/js-5tip/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/js-cryptojs/index.html b/post/js-cryptojs/index.html
new file mode 100644
index 0000000..1002b90
--- /dev/null
+++ b/post/js-cryptojs/index.html
@@ -0,0 +1,866 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cryptojs – JavaScript加密库 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Import
+
+
Usage 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var md5Encrypt = CryptoJS .MD5 ("Message" );var sha1Encrypt = CryptoJS .SHA1 ("Message" );var sha256Encrypt = CryptoJS .SHA256 ("Message" ); var aesEncrypt = CryptoJS .AES .encrypt ("Message" , "Secret Passphrase" );var aesDecrypt = CryptoJS .AES .decrypt (aesEncrypt, "Secret Passphrase" );var 3desEncrypt = CryptoJS .TripleDES .encrypt ("Message" , "Secret Passphrase" );var 3desDecrypt = CryptoJS .TripleDES .decrypt (3desEncrypt, "Secret Passphrase" );var message = "Message" ;var key = CryptoJS .enc .Utf8 .parse ("123456" ); var iv = CryptoJS .enc .Utf8 .parse ("123456" ); var aesEncrypt2 = CryptoJS .AES .encrypt (message ,key, {iv : iv,mode : CryptoJS .mode .CBC , padding : CryptoJS .pad .Pkcs7 }); aesEncrypt2 = encodeURIComponent (CryptoJS .enc .Base64 .stringify (encryptResult.ciphertext ));
+
+
Extend
+密钥和偏移量:一般情况下密钥为加密方与解密方双方约定好的,但如果长期使用同一密钥,对相同内容加密后的结果一致,容易被找出规律。所以,可以在双方交互时添加一个参数——偏移量,偏移量明文传递,并且每次请求都不同,但在一次交互过程中,双方使用同一偏移量,这样就可以使加密相同内容时结果每次都不同,间接提高安全性。
+加密模式:电码本模式(Electronic Codebook Book (ECB));密码分组链接模式(Cipher Block Chaining (CBC));计算器模式(Counter (CTR));密码反馈模式(Cipher FeedBack (CFB));输出反馈模式(Output FeedBack (OFB))。ECB模式下偏移量不生效。具体各种模式的原理这里不再描述(参考资料1 )。
+填充模式:.NET和Java中并不完全通用,经过与安卓开发的同事踩坑与测试后,发现None和ISO10126两种填充模式,在两个平台是通用的。理论上PKCS7/PKCS5应该也是通用的(参考资料2 /参考资料3 )。
+编码格式:之前做项目时因为编码的问题耽误了不少时间。
+没有绝对的安全。
+
+
相关项目
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Cryptojs – JavaScript加密库
+
https://awaw.cc/post/js-cryptojs/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/js-dateformat/index.html b/post/js-dateformat/index.html
new file mode 100644
index 0000000..2883fe4
--- /dev/null
+++ b/post/js-dateformat/index.html
@@ -0,0 +1,855 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ JavaScript获取时间并格式化 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
最近在学习微信小程序,用到不少前端的知识,比如时间格式化。
+
+
+
Example 1 2 3 4 function getDateNow ( ) { var date = new Date (); return date.format ("yyyy-MM-dd HH:mm:ss.t w" ); }
+
+
Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Date .prototype .format = function (fmt ) { var weekArr = { cn : new Array ("星期日" , "星期一" , "星期二" , "星期三" , "星期四" , "星期五" , "星期六" ), en : new Array ("Sunday" , "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Saturday" ) }; var o = { "M+" : this .getMonth () + 1 , "d+" : this .getDate (), "H+" : this .getHours (), "m+" : this .getMinutes (), "s+" : this .getSeconds (), "q+" : Math .floor ((this .getMonth () + 3 ) / 3 ), "t" : ("00" + this .getMilliseconds ()).slice ( - 3 ), "w" : weekArr.en [this .getDay ()] }; if (/(y+)/ .test (fmt)) fmt = fmt.replace (RegExp .$1 , (this .getFullYear () + "" ).substr (4 - RegExp .$1 .length )); for (var k in o) if (new RegExp ("(" + k + ")" ).test (fmt)) fmt = fmt.replace (RegExp .$1 , (RegExp .$1 .length == 1 ) ? (o[k]) : (("00" + o[k]).substr (("" + o[k]).length ))); return fmt; };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
JavaScript获取时间并格式化
+
https://awaw.cc/post/js-dateformat/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/js-map/index.html b/post/js-map/index.html
new file mode 100644
index 0000000..b4cc94e
--- /dev/null
+++ b/post/js-map/index.html
@@ -0,0 +1,867 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ JS地图使用笔记 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
最近一个项目中要用JS实现一个简单的地图,由于是前端小白,开发过程中遇到了不少问题,然后整理了两个Demo,便于以后需要使用时有个参考。
+
+
+
对功能性要求不高使用Demo1,要求高的话用Demo2,Demo2是用的Highmaps,官方提供了很多方法,可以参考官方文档。
+
两个Demo的完整代码下载地址在文末。
+
Demo1
+
+
Demo2
+
+
相关文档 Highmaps API 文档
+
源码下载 百度云 https://pan.baidu.com/s/1YDYu9Sz4LqIun2VQNB52tw
+
+提取码:3vjq
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
JS地图使用笔记
+
https://awaw.cc/post/js-map/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/learn-bridge-design/index.html b/post/learn-bridge-design/index.html
new file mode 100644
index 0000000..d273005
--- /dev/null
+++ b/post/learn-bridge-design/index.html
@@ -0,0 +1,995 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 桥梁设计学习笔记 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
桥梁定义 桥梁是道路路线遇到江河湖泊、山谷深沟以及其他线路(铁路或公路)等障碍时,为了保持道路的连续性而专门建造的人工构造物。桥梁既要保证桥上的交通运行,也要保证桥下水流的宣泄、船只的通航或车辆的通行。
+
+
桥梁基本组成 上部结构 桥跨结构 线路跨越障碍(如江河、山谷或其他线路等)的结构物。
+
下部结构 桥墩 是在河中或岸上支承桥跨结构的结构物。
+
+轻型桥墩——盖梁、系梁、立柱
+重力式桥墩——墩帽、墩身
+
+
桥台 设在桥的两端;一边与路堤相接,以防止路堤滑塌;另一边则支承桥跨结构的端部。为保护桥台和路堤填土,桥台两侧常做锥形护坡、挡土墙等防护工程。
+
墩台基础 是保证桥梁墩台安全并将荷载传至地基的结构。
+
+
支座系统 在桥跨结构与桥墩或桥台的支承处所设置的传力装置。它不仅要传递很大的荷载,并且还要保证桥跨结构能产生一定的变位。
+
+
附属设施 桥面铺装 或称行车道铺装,铺装的平整性、耐磨性、不翘曲、不渗水是保证行车舒适的关键。
+
排水防水 应能迅速排除桥面积水,并使渗水的可能性降至最小限度。
+
栏杆 既是保证安全的构造措施,又是有利于观赏的最佳装饰件。
+
伸缩缝 桥跨上部结构之间或桥跨上部结构与桥台端墙之间所设的缝隙,以保证结构在各种因素作用下的变位。为使行车顺适、不顺簸,桥面上要设置伸缩缝构造。
+
灯光照明 桥梁分类 按使用性质分类 公路桥、铁路桥、公铁两用桥、城市道路桥(含立交桥)、人行桥、机耕桥、管线桥、渡槽桥。
+
按桥身结构材料分类 木桥、圬工桥(砖、石、砼砌块桥)、钢筋砼桥、预应力砼桥、钢桥。
+
按单孔跨径、多孔跨径总长分类
+
+
+分类
+多孔跨径总长L(m)
+单孔跨径Lk (m)
+
+
+
+特大桥
+L > 1000
+Lk > 150
+
+
+大桥
+100 ≤ L ≤ 1000
+40 ≤ Lk < 150
+
+
+中桥
+30 < L < 100
+20 ≤ Lk < 40
+
+
+小桥
+8 ≤ L ≤ 30
+5 ≤ Lk < 20
+
+
+涵洞
+L < 8
+Lk < 5
+
+
+
按桥跨结构分类 梁式桥(简支梁、连续梁、伸臂梁)、桁架桥、拱桥、刚构桥、悬索桥、斜拉桥等。此外,还有浮桥、漫水桥、活动桥等。
+
桥梁类型和受力特点
+
+
+类型
+受力特点
+建造材料
+
+
+
+梁式桥
+竖向荷载作用下无水平反力,梁内产生的弯矩最大
+抗弯能力强(钢、木、钢筋砼、预应力钢筋砼)
+
+
+拱式桥
+主要承重结构是拱圈或拱助,在竖向荷载作用下,墩台承受水平推力,承重结构以受压为主
+抗压能力强的圬工材料(砖、石、砼)和钢筋砼
+
+
+刚架桥
+梁和柱的连接处具有很大的刚性,在竖向荷载作用下,梁部主要受弯,在柱脚处也具有水平反力,受力状态介于梁桥和拱桥之间
+施工比较困难,用普通钢筋砼修建,梁柱刚结处易产生裂缝
+
+
+悬索桥
+以悬索为主要承重结构,结构自重较轻,构造简单、受力明确,能以较小的建筑高度经济合理地修建大跨度桥
+结构自重轻,刚度差,在车辆荷载和风荷载作用下有较大的变形和振动
+
+
+组合体系桥
+由几个不同体系的结构组合而成,常见的有:连续刚构,梁、拱组合等;斜拉桥也是组合体系桥的一种
+——
+
+
+
梁式桥 梁式桥分类
+简支梁桥
+悬臂梁桥
+等截面连续梁桥
+变截面连续梁桥
+连续刚构
+
+
梁截面
+实心板梁
+空心板梁
+T梁——底板、梁肋、翼缘板
+箱梁——底板、腹板、顶板、翼缘板
+
+
拱式桥 与梁式桥主要承受弯曲力不同,拱桥要承受的是沿圈传递的轴向压力。该压力即是桥墩桥台在竖向移动荷作用下所产生的水平推力。
+
拱式桥分类
+
承载方式
+
刚架桥 刚架桥是梁和柱(或竖墙)整体结合的桥梁结构。竖向荷载作用下,梁部主要受弯,柱脚处有水平推力,力状态介于梁式桥和拱桥之间。
+
刚架桥分类
+
斜拉桥 斜拉桥由主梁、塔柱和斜拉索3种基本构件组成,用高强钢材制成的斜拉索将主梁多点吊起,将主梁承受的荷载传至塔柱,再由塔柱基础传给地基。斜拉桥是主梁(桥面体系)受压、受弯,斜拉索(支承体系)受拉的结构。
+
索型
+
桥梁常用术语 横隔板 横隔板是为保持截面形状、增强横向刚度而在梁之间设置的构件。位于桥梁端部的横隔板称为端隔板,位于中部的横隔板称为中隔板。
+
湿接缝、湿接头 净跨径 相邻两个桥墩(或桥台)之间的净距。对于拱式桥是每孔拱跨两个拱脚截面最低点之间的水平距离。
+
计算跨径 对于具有支座的桥梁,是指桥跨结构相邻两个支座中心之间的距离;对于拱式桥,是指两相邻拱脚截面形心点之间的水平距离,即拱轴线两端点之间的水平距离。
+
标准跨径 相邻两个桥墩中心线的距离。
+
拱轴线 拱圈各截面形心点的连线。
+
桥梁高度 指桥面与低水位之间的高差,或指桥面与桥下线路路面之间的距离,简称桥高。
+
桥下净空高度 设计洪水位、计算通航水位或桥下线路路面至桥跨结构最下缘之间的距离。
+
建筑高度 桥上行车路面(或轨顶)标高至桥跨结构最下缘之间的距离。
+
容许建筑高度 公路或铁路定线中所确定的桥面或轨顶标高,对通航净空顶部标高之差。
+
净矢高 从拱顶截面下缘至相邻两拱脚截面下缘最低点之连线的垂直距离。
+
计算矢高 从拱顶截面形心至相两拱脚截面形心之连线的垂直距离。
+
矢跨比 计算矢高与计算跨径之比,也称拱矢度,它是反映拱桥受力特性的一个重要指标。
+
涵洞 用来宣泄路堤下水流的构造物。通常在建造涵洞处路堤不中断。凡是多孔跨径全长不到8m和单孔跨径不到5m的泄水结构物,均称为涵洞。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
桥梁设计学习笔记
+
https://awaw.cc/post/learn-bridge-design/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/learn-road-design/index.html b/post/learn-road-design/index.html
new file mode 100644
index 0000000..036b6a3
--- /dev/null
+++ b/post/learn-road-design/index.html
@@ -0,0 +1,969 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 道路勘测设计学习笔记 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
道路平面设计 公路 一种带状的空间结构物,它的中线是一条空间曲线。
+
+
公路平面图 公路在水平面上的投影图。
+
公路纵断面图 通过公路中线的竖向剖面图。
+
公路横断面图 公路上任一点垂直于路中线的竖向剖面图。
+
缓和曲线 从曲率半径为无穷大逐渐向某一定值变化的曲线。
+
缓和曲线的作用
+缓和曲率——使曲率连续变化
+缓和超高——使横向坡度连续变化
+缓和加宽——使车道加宽连续变化
+
+
缓和曲线产生的效果
+曲率连续变化,便于车辆驾驶
+离心加速度连续变化,没有突变,乘客感觉舒适
+超高横坡度及加宽逐渐变化,行车更加稳定
+与圆曲线配合,增加线形美观
+
+
缓和曲线的线型 回旋线、三次抛物线、七次四项式型、半波正弦型、一波正弦型、双纽线、多心复曲线。
+
回旋线 半径从无穷大一直变化到一定设计值的一段弧线。回旋线是曲率随着曲线长度成比例变化的曲线。公路、匝道常用的缓和曲线是回旋线,也叫放射螺旋线。回旋线不仅线形美观,而且与驾驶员匀速转动方向盘由圆曲线驶入直线或者由直线驶入圆曲线的轨迹线相符合。
+
弯道的超高 为了减小横向力,一般圆曲线段上路面做成外侧高、内侧低的单向内倾横坡。
+
圆曲线最小半径 最大横向力系数μ和超高横坡度值i为主要影响因素。
+
横向力系数μ的确定
+按汽车行驶稳定性
+按行车舒适性
+按燃料和轮胎消耗
+
+
极限最小半径 各级公路对按计算行车速度行驶的车辆,能保证其安全行车的最小允许半径。
+
一般最小半径 对按计算行车速度行驶的车辆能保证其安全性和舒适性,它是通常情况下推荐采用的最小半径值。
+
不设超高的最小半径 当平曲线半径较大时,离心力的影响就较小,路面摩阻力就可以保证汽车有足够的稳定性,这是就可以不设置超高,而允许设置与直线段上相同的双向横坡的路拱形式。
+
平曲线的极限最小长度 根据经验,为使驾驶员在曲线行驶时不感到方向盘操作的困难,按6s的通过时间设置曲线长度是适宜的。
+
平曲线的一般最小长度 各级公路的平曲线,一般情况下应能够设置两段缓和曲线(或超高、加宽缓和段)及一段圆曲线。在平面设计中,为便于驾驶操作和行车安全与舒适,汽车在任何一种曲线形式上行驶的时间都不应短于3s。
+
公路转角小于7°时的平曲线长度 为避免造成视觉错误、保证行车安全,在进行平面设计时应避免设置小于7°的转角。当条件限制不得已时,在偏角小于7°的转角处应设置较长的平曲线,其长度应大于标准中规定值。
+
加宽 汽车在曲线上行驶所占路面宽度就比在直线上的大,为保证行车的安全,曲线段的路面应做适当的加宽。
+
加宽缓和段 为避免路面宽度从直线段上的正常宽度到圆曲线段的加宽断面的突变,在直线和圆曲线之间应设置一段路面宽度的渐变段,这一渐变段称为加宽缓和段。
+
超高 《标准》规定,当圆曲线半径小于不设超高的最小半径时,应设置超高(即将曲线部分的路面做成向内侧倾斜的单向横坡)。
+
超高缓和段 直线段上的双向横坡逐渐过渡到圆曲线段上的超高横坡的过渡段。
+
视距 驾驶员在行驶过程中的通视距离。
+
行车视距 为了保证行车安全,驾驶员应能看到前方一定距离的公路以及公路上的障碍物或迎面的来车,以便及时刹车或绕过。汽车在这段时间里沿公路路面行驶的必要安全距离,称为行车视距。
+
停车视距 指驾驶员看到障碍物后立即采取制动措施,至汽车在障碍物前停下来的最小安全距离。由三部分距离组成:
+
+驾驶员反应时间内行驶的距离
+制动距离,指制动生效到汽车完全停止时行驶的距离
+安全距离
+
+
会车视距 对于不设分隔带的双车道公路,车辆在行驶中,驾驶员趋向于沿路面中心行驶,一旦发现前方来车,双方驾驶员各自把车辆驶回到自己的车道上,使两车安全交会。为保证双向行驶的双车道公路的行车安全,公路平面应能保证会车视距要求,即满足双向行驶的汽车能在同一车道上及时刹车所需的最短距离。由三部分距离组成:
+
+双方驾驶员反应时间内汽车所行驶的距离
+双方汽车的制动距离
+安全距离
+
+
超车视距 《标准》规定,对于双向行驶的双车道公路,根据需要,应结合地形设置保证具有超车视距的路段,以使汽车行驶时安全超越前车。
+
超车视距全程可分为四个阶段
+加速行驶距离
+超车汽车在对向车道上行驶的距离
+超车汽车从开始加速到超车完成的时间内,对向车道汽车的行驶距离
+超车完成时,超车汽车与对向汽车之间的安全距离
+
+
平面线形 直线、圆曲线、回旋线
+
平面线形要素组合
+基本型——圆曲线两端用回旋线与直线相连接的组合型式称为基本型
+S型——用两个反向回旋线连接两个反向圆曲线的组合型式称为S型
+卵型——用一个回旋线连接两个同向圆曲线的组合型式称为卵型
+凸型——在两个同向可旋线间不插入圆曲线而径相衔接的组合型式称为凸型
+复合型——两个以上同向回旋线在曲率相等处直接连接的组合型式称为复合型
+C型——两同向回旋线在曲率为零处径相衔接的组合型式称为C型
+
+
道路纵断面设计 坡线和竖曲线 公路在纵断面上由不同的上坡段、下坡段(统称坡段)和平顺连接相邻两坡段的竖向曲线段组成,即公路路线在纵断面上是一条有起伏的空间线,其基本线形由坡线和竖曲线组成。
+
地面标高 公路中线各桩点的地面高程称地面标高。
+
地面线 各点地面标高的连线称地面线,它是一条不规则的空间折线。
+
设计标高 路基边缘点的高程称设计标高(公路改建时可用原路中线标高为设计标高)。
+
设计线 各桩点设计标高的连线称纵断面设计线,简称设计线,它是经过技术上、经济上和美学上比较后确定的,由坡线和竖曲线组成的空间线。地面线和设计线是纵断面图的两条主要线。
+
填挖高 同一桩点的设计标高与地面标高的差值称施工标高,又称填挖高。
+
填方路段、挖方路段
+若该桩点的施工标高为“+”,即设计标高大于地面标高,这样的路基通常为填筑而成的路堤,这样的路段即填方路段
+若施工标高为“-”则为路堑,这样的路段即挖方路段。
+
+
纵坡 坡线的坡度即路线纵向坡度,简称纵坡。
+
转坡点 相邻两坡线的交点称转坡点,在转坡点处应设竖曲线。转坡点前后两坡线坡度之差称转坡角。
+
高原折减 在海拔3000m以上的高原地区,因空气稀薄,不但会使发动机的功率减少,还使水箱的水容易沸腾而降低冷却系统的功能,因此应将《标准》规定的最大纵坡予以折减。
+
平均纵坡 由若干坡段组成的路段,其两端点的高差与路段长度之比称平均纵坡。
+
合成坡度 路线纵向坡度与横向坡度的矢量和称合成坡度。
+
道路横断面设计 横断面 公路中线法线方向的剖面图称公路横断面图,简称横断面,亦即由公路横断面设计的主要组成部分与横断地面线所围成的面,它反映了公路在横剖面上的组成情况、形状和几何尺寸,是公路路线设计的重要内容之一。公路横断面设计的主要组成部分是路面和路基,路面包括行车道、变速车道、紧急停车带、爬坡道等,路基包括路肩、边坡、边沟、护坡道、截水沟等。
+
路基横断面 为设计计算方便,通常用两侧路肩边缘点的联线,来代替路面、路肩等的横坡折线,即横断面的顶面可绘成一条直线。这样将顶面用一直线绘成的横断面即路基横断面。
+
路拱 为了排除路面的雨水,将路面做成中间高两边低的拱起形状称路拱。
+
路拱横坡 路面中线点与路面边缘点的高差,与其水平距离的比值称路拱横坡,以%表示。
+
分隔带 沿道路纵向设置分隔行车道用的带状设施称分隔带,位于中线位置上的称中间带,位于中线两侧的称外侧分隔带。
+
路肩 位于行车道外缘至路基边缘具有一定宽度的带状设施称路肩,它是路面的侧向支撑,可供临时停车和人行通行,还可使驾驶员有安全感。
+
路基宽度 在一个横断面上,两侧路肩边缘点间的宽度称路基宽度。
+
路基边坡 为保证路基的稳定,把路基两侧做成具有一定坡度的坡面称路基边坡。
+
边沟 为汇集并排除路面、路肩和边玻的水流,在路基两侧设置的水沟称边沟。一般情况下,挖方路基和填土高度小于0.5m的矮路堤,均应设置边沟。
+
边沟的型式 通常有梯形、矩形和三角形三种,视上质情况和施工方法而定,一般土质路基采用梯形,岩石路基可采用三角形或矩形,机械化施工时多采用三角形。
+
截水沟 为拦截并排除流向路基的地面水流,以避免对路基边坡冲刷等而设置的排水沟称截水沟。
+
免费运距 土方作业包括挖、装、运卸等工序,在某一一特定距离内,只按挖方数计价而不计算运费,这一特定距离称免费运距。
+
平均运距 土石方调配时,从挖方体积重心到填方体积重心的距离称平均运距,为简化设计计算,通常平均运距按挖方路段中心至填方路段中心的距离计。
+
道路交叉设计 冲突点 当行车方向互相交叉时,可能发生碰撞的地点称为冲突点。
+
交织点 当车辆从不同方向驶向同一方向或成锐角相交时,可能产生挤撞的地点称为交织点。
+
加铺转角 以圆曲线构成宽来连接交叉公路的路基和路面,称为加铺转角式交叉。
+
立体交叉 公路与公路或铁路在不同高度上互相交义的型式称立体交叉。
+
立体交叉形式
+
互通式立体交叉的类型
+苜蓿叶形
+部分苜蓿叶形
+Y形
+喇叭形
+菱形
+环形
+定向式立体交叉
+
+
匝道的作用 匝道是连接立体交叉上、下路线的交换道,一般在匝道上既有弯道又有坡度。
+
匝道的类型
+右转弯匝道——直接从主干线右转弯驶出的匝道
+环形匝道——这是一种左转弯行驶的匝道形式。车辆由干线的右侧出口,并以约270°角向右转弯,而完成左转弯的行驶
+定向式匝道——由干线左侧出口,以较短捷的路线直接驶入连接的干线,从而完成左转弯的匝道
+迁回式匝道——由干线右侧出口,暂时偏离所去方向,以迂回绕行的方式完成左转弯的匝道
+
+
变速车道 车辆由高速公路驶入匝道(或车速低的道路)须减速,反之,车辆由匝道(或车速低的道路)驶进高速公路须加速。为了调整车速而设置在高速公路与匝道间的减速或加速车道,称为变速车道。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
道路勘测设计学习笔记
+
https://awaw.cc/post/learn-road-design/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/listen1/index.html b/post/listen1/index.html
new file mode 100644
index 0000000..1f76588
--- /dev/null
+++ b/post/listen1/index.html
@@ -0,0 +1,897 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Listen 1 – One for all free music in China - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Listen 1可以搜索和播放来自网易云音乐、虾米、QQ音乐、酷狗音乐、酷我音乐网站的歌曲,让你的曲库更全面。
+
+
截图
+
安装 Chrome插件版
+下载Chrome插件版压缩包,并解压缩
+打开 Chrome 扩展页面,勾选右上角「开发者模式」
+选择「加载已解压的扩展程序…」,选择刚刚解压缩的文件夹
+开始使用
+
+
Firefox插件版
+下载Firefox插件版,并解压缩
+打开 about:config 页面,xpinstall.signatures.required 设置为 false
+选择「附加组件」,齿轮图标,选择从文件安装附加组件,选择下载的xpi文件
+开始使用
+
+
Windows桌面版
+下载Windows压缩包,根据系统选择32位或64位版本
+解压缩,运行 Listen1.exe
+
+
Mac桌面版
+下载并运行dmg,在打开的安装窗口把Listen 1图标拖动到右侧
+点击Listen 1图标运行
+
+
Linux桌面版
+下载deb安装包,根据系统选择32位或64位版本
+点击deb,在安装界面点击Install
+
+
下载
+
Listen 1背后的开源项目 listen1/listen1 最初的网页版播放器,使用Python开发Web服务器。可以直接在服务器运行,也可使用打包的Windows版和Mac版在本地运行Web服务器
+
listen1/listen1_chrome_extension Chrome和Firefox插件版
+
listen1/listen1_desktop Windows,Mac,Linux桌面版。使用Electron框架,基于Listen 1 Chrome插件版JS库开发
+
Listen 1联系方式
+
致谢 感谢该项目的所有代码贡献者。
+
如果觉得不错,不妨推荐给你身边喜欢音乐的朋友。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tools
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Listen 1 – One for all free music in China
+
https://awaw.cc/post/listen1/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/luoyang-subway/index.html b/post/luoyang-subway/index.html
new file mode 100644
index 0000000..c75df34
--- /dev/null
+++ b/post/luoyang-subway/index.html
@@ -0,0 +1,856 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 洛阳地铁一号线开通啦!(内附线路图) - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
洛阳轨道交通(Luoyang Subway)是服务于中国河南省洛阳市的城市轨道交通系统,其首条线路于2020年12月1日开始试运行。
+
+
2021年3月28日正式运营,当日客流量为10.7382万人次。
+
截至2021年3月,洛阳轨道交通已开通运营线路1条,为洛阳轨道交通1号线;在建线路1条,为洛阳轨道交通2号线;规划线路2条,为洛阳轨道交通3号线、洛阳轨道交通4号线;线网共设车站34座。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
洛阳地铁一号线开通啦!(内附线路图)
+
https://awaw.cc/post/luoyang-subway/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/md-codeblock-lang/index.html b/post/md-codeblock-lang/index.html
new file mode 100644
index 0000000..4261094
--- /dev/null
+++ b/post/md-codeblock-lang/index.html
@@ -0,0 +1,1021 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Markdown代码块支持的语言 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Markdown代码块支持的语言,使用时在```
后加上对应关键字即可。
+
+
+
+
+
+名称
+关键字
+调用的js
+
+
+
+AppleScript
+applescript
+shBrushAppleScript.js
+
+
+ActionScript 3.0
+actionscript3, as3
+shBrushAS3.js
+
+
+Shell
+bash, shell
+shBrushBash.js
+
+
+ColdFusion
+coldfusion, cf
+shBrushColdFusion.js
+
+
+C
+cpp, c
+shBrushCpp.js
+
+
+C#
+c#, c-sharp, csharp
+shBrushCSharp.js
+
+
+CSS
+css
+shBrushCss.js
+
+
+Delphi
+delphi, pascal, pas
+shBrushDelphi.js
+
+
+diff&patch
+diff patch
+shBrushDiff.js
+
+
+Erlang
+erl, erlang
+shBrushErlang.js
+
+
+Groovy
+groovy
+shBrushGroovy.js
+
+
+Java
+java
+shBrushJava.js
+
+
+JavaFX
+jfx, javafx
+shBrushJavaFX.js
+
+
+JavaScript
+js, jscript, javascript
+shBrushJScript.js
+
+
+Perl
+perl, pl, Perl
+shBrushPerl.js
+
+
+PHP
+php
+shBrushPhp.js
+
+
+text
+text, plain
+shBrushPlain.js
+
+
+Python
+py, python
+shBrushPython.js
+
+
+Ruby
+ruby, rails, ror, rb
+shBrushRuby.js
+
+
+SASS&SCSS
+sass, scss
+shBrushSass.js
+
+
+Scala
+scala
+shBrushScala.js
+
+
+SQL
+sql
+shBrushSql.js
+
+
+Visual Basic
+vb, vbnet
+shBrushVb.js
+
+
+XML
+xml, xhtml, xslt, html
+shBrushXml.js
+
+
+Objective C
+objc, obj-c
+shBrushObjectiveC.js
+
+
+F#
+f# f-sharp, fsharp
+shBrushFSharp.js
+
+
+
+xpp, dynamics-xpp
+shBrushDynamics.js
+
+
+R
+r, s, splus
+shBrushR.js
+
+
+matlab
+matlab
+shBrushMatlab.js
+
+
+swift
+swift
+shBrushSwift.js
+
+
+GO
+go, golang
+shBrushGo.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Markdown代码块支持的语言
+
https://awaw.cc/post/md-codeblock-lang/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/ms-opensource/index.html b/post/ms-opensource/index.html
new file mode 100644
index 0000000..add7dfb
--- /dev/null
+++ b/post/ms-opensource/index.html
@@ -0,0 +1,872 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 微软开源WPF, Windows Forms 和 WinUI - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
美国当地时间12月4日,微软正式举行 Microsoft Connect(); 2018 开发者大会。
+
+
+
Content
+Visual Studio 2019 Preview
+.NET Core 3 Preview 1
+.NET Framework 4.8
+ASP.NET Core 2.2
+ML.NET 0.8
+WPF, Windows Forms 和 WinUI 框架宣布开源
+宣布 .NET 基金会开放接受会员加入
+微软和 Docker 宣布了一个新的联合开源项目,即 Cloud Native Application Bundle,它可以更轻松地打包和运行云原生应用程序
+
+
+
Link
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
微软开源WPF, Windows Forms 和 WinUI
+
https://awaw.cc/post/ms-opensource/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/msi-b450m-mortar/index.html b/post/msi-b450m-mortar/index.html
new file mode 100644
index 0000000..32ac2d9
--- /dev/null
+++ b/post/msi-b450m-mortar/index.html
@@ -0,0 +1,866 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 微星B450M MORTAR主板PCI_E3接口无法识别硬件解决方法 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
博主购买的微星B450M MORTAR主板,由于安装显卡后会挡住PCI_E2接口,所以无线网卡(Intel 9260AC)只能插PCI_E3接口上,但是一直无法识别出来,在微星社区咨询后发现已经有人反馈过这个问题,帖子中官方人员回复:
+
+
+
+
+主板的PCIE 插槽必须有共享LANES的状况
+PCIE CARD 本身没有依照规范将Prsnt 1(A1)#和Prsnt 2#(B17)短接。
+
+
+
随后官方发布了B450M MORTAR新BIOS固件,版本号7B89v14,更新到最新BIOS后,进BIOS
- setting
- advanced
- PCI SUBsystem setting
, 找到PCIe x1 slot switch
改成PCIE_3
(默认为PCIE_2
),然后插在PCI-E_E3上的无线网卡就可以正常被识别出来啦。B450M MORTAR Titanium版本的主板也同样适用该方法。
+
+微星社区:http://forum-sc.msi.com/index.php?topic=5308.14
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
微星B450M MORTAR主板PCI_E3接口无法识别硬件解决方法
+
https://awaw.cc/post/msi-b450m-mortar/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/my-first-nas/index.html b/post/my-first-nas/index.html
new file mode 100644
index 0000000..38875ad
--- /dev/null
+++ b/post/my-first-nas/index.html
@@ -0,0 +1,972 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ NAS诞生记 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
NAS(Network Attached Storage:网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置 ,因此也称为“网络存储器”。
+
+
它是一种专用数据存储服务器。它以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽、提高性能、降低总拥有成本、保护投资。其成本远远低于使用服务器存储,而效率却远远高于后者。
+
配置清单
+
+
+品类
+型号
+渠道
+价格
+备注
+
+
+
+主板
+映泰J4125NHU
+淘宝
+580
+SATA*2、M.2*1、PCIEx16*1
+
+
+处理器
+Intel J4125
+-
+-
+板载CPU、被动散热
+
+
+机箱
+蜗牛星际C款
+闲鱼
+128
+PCIE开口、4盘位、硬盘背板
+
+
+内存
+玖合 忆界马甲条
+京东
+149
+8G、DDR4、3000MHz
+
+
+扩展卡
+乐扩m.2转5口SATA
+京东
+149
+SATA3.0*5
+
+
+电源
+益衡7025B
+淘宝
+245
+80PLUS铜牌、双路12V 36A
+
+
+插座
+小米智能插座2
+京东
+49
+电量统计、远程开机
+
+
+
+
+
+1300
+
+
+
+
系统方案
+
+
+方案
+系统
+备注
+
+
+
+虚拟机
+PVE/EXSi
+硬盘直通、核显直通
+
+
+虚拟机
+Windows & VMware
+CPU性能羸弱
+
+
+物理机
+群晖1
+U盘/SATA引导、UI人性化、套件易用(采纳✔)
+
+
+物理机
+Unraid
+按盘位收费
+
+
+物理机
+FreeNAS/TrueNAS
+使用ECC内存
+
+
+物理机
+万由
+只支持到U-NAS5、U-NAS6仅万由硬件可用
+
+
+
+1 固件版本 918+ 7.0.1 42218 up3
+
+
总结 目前这套配置搭配群晖系统已稳定运行两周,单块1T硬盘(老笔记本淘汰),功耗15W。
+
2023.07.04 更新了以下内容
+
+改用 arpl v1.1-beta2a 自编译引导
+系统升级为 7.1.1 42962 up5
+添加了一块 512GB SATA固态硬盘(用于提升docker、套件、虚拟机等服务的运行效率,实际感受docker和套件提升不明显,跑虚拟机提升明显)
+添加了一块 4TB 西部数据垂直盘
+添加了一块 4*SATA PCIe扩展卡,目前板载2SATA,扩展4SATA,共6个SATA口
+目前待机功率为21W,每天消耗0.5度电
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
NAS诞生记
+
https://awaw.cc/post/my-first-nas/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/my-second-pc/index.html b/post/my-second-pc/index.html
new file mode 100644
index 0000000..e6139af
--- /dev/null
+++ b/post/my-second-pc/index.html
@@ -0,0 +1,879 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 年轻人的第二台PC诞生 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
博主的第一台主机是17年6月份大学毕业时组的一套,当时资金有限,主机花了2600元,服役了一年半,由于性能不能满足 游戏 工作的需要,所以就在19年春节前又配了一套。
+
+
+
旧的主机虽然已经用了一年半,但毕竟是挤牙膏挤多了的性价比神U G4560和10系显卡1050ti,家用办公中画质玩玩3A大作还是够用的,于是就春节搬回家,把家里N年前的主机给替换了。其实在春节前都已经配齐开始使用了,但一直没时间更新博客,趁着这周末有空就来补上笔记。
+
配置清单
+固态硬盘 英特尔 760P 256G 359
+显卡 铭瑄 GTX1060 6G 1489
+内存 金士顿 骇客神条2666 8G *2 679
+处理器 AMD Ryzen5 2600X
+主板 微星 B450M MORTAR 1999
+机箱 先马 平头哥 149
+电源 先马 全模组500W 349
+
+
+配置清单合计5024元,显示器、键盘、鼠标、PCIE无线网卡、音箱以及两块1TB机械硬盘都使用上台主机的,故不算入总价中。
+
+
安装过程
+
娱乐大师跑分
+
+
灯效
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
年轻人的第二台PC诞生
+
https://awaw.cc/post/my-second-pc/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/net-loading/index.html b/post/net-loading/index.html
new file mode 100644
index 0000000..2392c35
--- /dev/null
+++ b/post/net-loading/index.html
@@ -0,0 +1,885 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ WinForm加载中窗体 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
最近项目中用有用到,就简单整了个,只有几行代码。
+
+
+
+
调用示例 public partial class Main : Form
+{
+ public Main()
+ {
+ InitializeComponent();
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ //构造函数参数说明:
+ //work: 需要在新线程中执行的任务
+ //msg: 执行完成提示信息(为空时不提示)
+ //openDir: 执行完成后自动打开指定目录(为空时不打开)
+ Loading loading = new Loading(DoSomething, 执行完成);
+
+ //不show的话 可以当作后台线程执行任务来用
+ loading.ShowDialog();
+ }
+
+ public void DoSomething()
+ {
+ Thread.Sleep(3000);
+ }
+}
+
+
源代下载 百度云 https://pan.baidu.com/s/1NzrZeNKqjlZxK__iXaGvwQ
+
+提取码:npkt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
WinForm加载中窗体
+
https://awaw.cc/post/net-loading/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/openssl-csr/index.html b/post/openssl-csr/index.html
new file mode 100644
index 0000000..daf6e33
--- /dev/null
+++ b/post/openssl-csr/index.html
@@ -0,0 +1,885 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ OpenSSL生成多域名CSR - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
首先要选择证书颁发机构(CA),各大著名的证书颁发机构的多域名 [1] 、泛域名证书大多是需要收费的。目前发现亚洲诚信(TrustAsia) 的免费证书支持双域名,而Let’s Encrypt 的免费证书既支持多域名,同时也支持泛域名。
+
+
+
申请证书需要用到CSR [2] ,直接在搜索引擎搜索CSR在线生成就可以很方便的生成,然后会得到一个CSR和一个KEY,前者是提交给证书颁发机构申请证书用的,后者是给服务器安装证书的时候用到的。
+
在实践过程中发现,网上大多数 CSR 生成工具都不支持填多个域名,熟悉OpenSSL的同学应该很容易就搞定了,但是对于像博主一样的小白来说,能有个工具再好不过了,这里分享一个支持多域名CSR的在线生成网站:https://certificatetools.com/newui/
+
CSR也可以使用OpenSSL 生成,动手能力强的同学可以自己用工具离线生成。
+
配置文件 [ req ]
+default_md = sha256
+prompt = no
+req_extensions = req_ext
+distinguished_name = req_distinguished_name
+[ req_distinguished_name ]
+0.commonName = pdoner.cn
+1.commonName = *.pdoner.cn
+countryName = CN
+stateOrProvinceName = Henan
+localityName = Zhengzhou
+organizationName = Pdone Technology
+[ req_ext ]
+keyUsage=critical,digitalSignature,keyEncipherment
+extendedKeyUsage=critical,serverAuth,clientAuth
+subjectAltName = @alt_names
+[ alt_names ]
+DNS.0 = pdoner.cn
+
+
**[1]**多域名证书,一说为SAN certificater(SubjectAltName Certificater),一说为Unified Communications Certificater(这个是微软的说法),已经迅速成为一种深受大家欢迎的证书,通过这种证书,可以方便部署Exchange, OCS 等经常有多个服务名的应用系统,此外也便于企业的网络管理人员对证书管理。
+
**[2]**CSR是Certificate Signing Request的英文缩写,即证书请求文件,也就是证书申请者在申请数字证书时由CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件,证书申请者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。
+
相关资料
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
OpenSSL生成多域名CSR
+
https://awaw.cc/post/openssl-csr/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/python-historytoday/index.html b/post/python-historytoday/index.html
new file mode 100644
index 0000000..d7084b8
--- /dev/null
+++ b/post/python-historytoday/index.html
@@ -0,0 +1,861 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 用Python爬 历史的今天 数据 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
刚开始学习Python,试着写了一些东西,发现Python确实是非常容易上手,代码十分简短,并且有很多第三方库可以使用,同样的一种操作用别的语言可能需要10行代码,Python可能只要1行就能实现。
+
+
+
我这里爬的是这个网站 www.lssdjt.com ,类似的网站还有很多。由于我也是初学者,所以注释写的比代码多。
+
Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 from urllib import requestfrom bs4 import BeautifulSoup startUrl = "http://www.lssdjt.com/11/29" pageFile = open ('historyTodayData.txt' , 'w' , encoding='utf-8' )def getdata (url ): page = request.urlopen(url) pageStream = page.read() pageHtml = pageStream.decode('utf-8' ) soup = BeautifulSoup(pageHtml, "html.parser" ) nextUrlClass = soup.find('ul' , {'class' : 'bot' }).find('li' , {'class' : 'r' }) next_url = nextUrlClass.a['href' ] links = soup.find_all("a" , class_="screenshot" ) for link in links: print (link.i.string, link.em.string, link.em.string.split('年' )[1 ].replace('月' , ' ' ).replace('日' , '' )) tempStrLine = link.i.string+' ' +link.em.string+' ' + link.em.string.split('年' )[1 ].replace('月' , ' ' ).replace('日' , '' ) + '\n' pageFile.writelines(tempStrLine) return next_urlfor _ in range (365 ): startUrl = getdata(startUrl) pageFile.close()
+
+
爬完的数据长下面这个样子,大概有一万多行,把列头title,date,month,day添加到第一行,文件扩展名改为csv就可以直接导入微信小程序云开发提供的数据库中了。
+
+
参考内容 BeautifulSoup中文文档
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
用Python爬 历史的今天 数据
+
https://awaw.cc/post/python-historytoday/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/revit-category-all/index.html b/post/revit-category-all/index.html
new file mode 100644
index 0000000..ac691d9
--- /dev/null
+++ b/post/revit-category-all/index.html
@@ -0,0 +1,5976 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ BuildInCategory枚举 - 完整 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Revit二次开发中经常用到BuildInCategory 过滤元素,以下是通过遍历该枚举获取的数据,其中部分类别的名称未能获取到,显示为Unknown ,请悉知。
+
+
+
+
+中文名称
+名称
+值
+
+
+
+Unknown
+OST_StackedWalls_Obsolete_IdInWrongRange
+-20034100
+
+
+Unknown
+OST_MassTags_Obsolete_IdInWrongRange
+-20034005
+
+
+Unknown
+OST_MassSurface_Obsolete_IdInWrongRange
+-20034004
+
+
+Unknown
+OST_MassFloor_Obsolete_IdInWrongRange
+-20034003
+
+
+Unknown
+OST_Mass_Obsolete_IdInWrongRange
+-20034000
+
+
+Unknown
+OST_WallRefPlanes_Obsolete_IdInWrongRange
+-20000896
+
+
+Unknown
+OST_StickSymbols_Obsolete_IdInWrongRange
+-20000828
+
+
+Unknown
+OST_RemovedGridSeg_Obsolete_IdInWrongRange
+-20000827
+
+
+Unknown
+OST_PointClouds
+-2010001
+
+
+Unknown
+OST_AssemblyOrigin_Lines
+-2009661
+
+
+Unknown
+OST_AssemblyOrigin_Planes
+-2009660
+
+
+Unknown
+OST_AssemblyOrigin_Points
+-2009659
+
+
+Unknown
+OST_AssemblyOrigin
+-2009658
+
+
+分析链接
+OST_LinksAnalytical
+-2009657
+
+
+分析楼板基础标记
+OST_FoundationSlabAnalyticalTags
+-2009656
+
+
+分析条形基础标记
+OST_WallFoundationAnalyticalTags
+-2009655
+
+
+分析独立基础标记
+OST_IsolatedFoundationAnalyticalTags
+-2009654
+
+
+分析墙标记
+OST_WallAnalyticalTags
+-2009653
+
+
+分析楼层标记
+OST_FloorAnalyticalTags
+-2009652
+
+
+分析柱标记
+OST_ColumnAnalyticalTags
+-2009651
+
+
+分析支撑标记
+OST_BraceAnalyticalTags
+-2009650
+
+
+分析梁标记
+OST_BeamAnalyticalTags
+-2009649
+
+
+Unknown
+OST_AnalyticalNodes_Lines
+-2009648
+
+
+Unknown
+OST_AnalyticalNodes_Planes
+-2009647
+
+
+Unknown
+OST_AnalyticalNodes_Points
+-2009646
+
+
+分析节点
+OST_AnalyticalNodes
+-2009645
+
+
+Unknown
+OST_RigidLinksAnalytical
+-2009644
+
+
+分析基础底板
+OST_FoundationSlabAnalytical
+-2009643
+
+
+分析条形基础
+OST_WallFoundationAnalytical
+-2009642
+
+
+分析独立基础
+OST_IsolatedFoundationAnalytical
+-2009641
+
+
+分析墙
+OST_WallAnalytical
+-2009640
+
+
+分析楼层
+OST_FloorAnalytical
+-2009639
+
+
+顶部线段
+OST_ColumnEndSegment
+-2009638
+
+
+基准线段
+OST_ColumnStartSegment
+-2009637
+
+
+分析柱
+OST_ColumnAnalytical
+-2009636
+
+
+末端线段
+OST_BraceEndSegment
+-2009635
+
+
+起点线段
+OST_BraceStartSegment
+-2009634
+
+
+分析支撑
+OST_BraceAnalytical
+-2009633
+
+
+末端线段
+OST_BeamEndSegment
+-2009632
+
+
+起点线段
+OST_BeamStartSegment
+-2009631
+
+
+分析梁
+OST_BeamAnalytical
+-2009630
+
+
+Unknown
+OST_CompassSecondaryMonth
+-2009624
+
+
+Unknown
+OST_CompassPrimaryMonth
+-2009623
+
+
+Unknown
+OST_CompassSectionFilled
+-2009622
+
+
+Unknown
+OST_LightLine
+-2009621
+
+
+Unknown
+OST_MultiSurface
+-2009620
+
+
+Unknown
+OST_SunSurface
+-2009619
+
+
+Unknown
+OST_Analemma
+-2009618
+
+
+Unknown
+OST_SunsetText
+-2009617
+
+
+Unknown
+OST_CompassSection
+-2009616
+
+
+Unknown
+OST_CompassOuter
+-2009615
+
+
+Unknown
+OST_SunriseText
+-2009614
+
+
+Unknown
+OST_CompassInner
+-2009613
+
+
+Unknown
+OST_SunPath2
+-2009612
+
+
+Unknown
+OST_SunPath1
+-2009611
+
+
+Unknown
+OST_Sun
+-2009610
+
+
+Unknown
+OST_SunStudy
+-2009609
+
+
+棍状符号
+OST_StructuralTrussStickSymbols
+-2009608
+
+
+Unknown
+OST_StructuralTrussHiddenLines
+-2009607
+
+
+Unknown
+OST_TrussChord
+-2009606
+
+
+Unknown
+OST_TrussWeb
+-2009605
+
+
+Unknown
+OST_TrussBottomChordCurve
+-2009604
+
+
+Unknown
+OST_TrussTopChordCurve
+-2009603
+
+
+Unknown
+OST_TrussVertWebCurve
+-2009602
+
+
+Unknown
+OST_TrussDiagWebCurve
+-2009601
+
+
+Unknown
+OST_Truss
+-2009600
+
+
+Unknown
+OST_RailingSystemTransitionHiddenLines_Deprecated
+-2009549
+
+
+Unknown
+OST_RailingSystemTerminationHiddenLines_Deprecated
+-20095
+
+
+Unknown
+OST_RailingSystemRailHiddenLines_Deprecated
+-2009547
+
+
+Unknown
+OST_RailingSystemTopRailHiddenLines_Deprecated
+-2009546
+
+
+Unknown
+OST_RailingSystemHandRailBracketHiddenLines_Deprecated
+-2
+
+
+Unknown
+OST_RailingSystemHandRailHiddenLines_Deprecated
+-2009544
+
+
+Unknown
+OST_RailingSystemPanelBracketHiddenLines_Deprecated
+-2009
+
+
+Unknown
+OST_RailingSystemPanelHiddenLines_Deprecated
+-2009542
+
+
+Unknown
+OST_RailingSystemBalusterHiddenLines_Deprecated
+-2009541
+
+
+Unknown
+OST_RailingSystemPostHiddenLines_Deprecated
+-2009540
+
+
+Unknown
+OST_RailingSystemSegmentHiddenLines_Deprecated
+-2009539
+
+
+Unknown
+OST_RailingSystemHiddenLines_Deprecated
+-2009538
+
+
+Unknown
+OST_StairStringer2012HiddenLines_Deprecated
+-2009537
+
+
+Unknown
+OST_StairTread2012HiddenLines_Deprecated
+-2009536
+
+
+Unknown
+OST_StairLanding2012HiddenLines_Deprecated
+-2009535
+
+
+Unknown
+OST_StairRun2012HiddenLines_Deprecated
+-2009534
+
+
+Unknown
+OST_Stairs2012HiddenLines_Deprecated
+-2009533
+
+
+隐藏线
+OST_MassHiddenLines
+-2009532
+
+
+隐藏线
+OST_CurtaSystemHiddenLines
+-2009531
+
+
+Unknown
+OST_OBSOLETE_ElemArrayHiddenLines
+-2009530
+
+
+隐藏线
+OST_EntourageHiddenLines
+-2009529
+
+
+隐藏线
+OST_PlantingHiddenLines
+-2009528
+
+
+隐藏线
+OST_SpecialityEquipmentHiddenLines
+-2009527
+
+
+隐藏线
+OST_TopographyHiddenLines
+-2009526
+
+
+Unknown
+OST_StructuralFramingSystemHiddenLines_Obsolete
+-2009525
+
+
+隐藏线
+OST_SiteHiddenLines
+-2009524
+
+
+隐藏线
+OST_RoadsHiddenLines
+-2009523
+
+
+隐藏线
+OST_ParkingHiddenLines
+-2009522
+
+
+隐藏线
+OST_PlumbingFixturesHiddenLines
+-2009521
+
+
+隐藏线
+OST_MechanicalEquipmentHiddenLines
+-2009520
+
+
+隐藏线
+OST_LightingFixturesHiddenLines
+-2009519
+
+
+隐藏线
+OST_FurnitureSystemsHiddenLines
+-2009518
+
+
+隐藏线
+OST_ElectricalFixturesHiddenLines
+-2009517
+
+
+隐藏线
+OST_ElectricalEquipmentHiddenLines
+-2009516
+
+
+隐藏线
+OST_CaseworkHiddenLines
+-2009515
+
+
+隐藏线
+OST_DetailComponentsHiddenLines
+-2009514
+
+
+隐藏线
+OST_ShaftOpeningHiddenLines
+-2009513
+
+
+隐藏线
+OST_GenericModelHiddenLines
+-2009512
+
+
+隐藏线
+OST_CurtainWallMullionsHiddenLines
+-2009511
+
+
+隐藏线
+OST_CurtainWallPanelsHiddenLines
+-2009510
+
+
+隐藏线
+OST_RampsHiddenLines
+-2009509
+
+
+隐藏线
+OST_StairsRailingHiddenLines
+-2009508
+
+
+隐藏线
+OST_StairsHiddenLines
+-2009507
+
+
+隐藏线
+OST_ColumnsHiddenLines
+-2009506
+
+
+隐藏线
+OST_FurnitureHiddenLines
+-2009505
+
+
+隐藏线
+OST_LinesHiddenLines
+-2009504
+
+
+隐藏线
+OST_CeilingsHiddenLines
+-2009503
+
+
+隐藏线
+OST_RoofsHiddenLines
+-2009502
+
+
+隐藏线
+OST_DoorsHiddenLines
+-2009501
+
+
+隐藏线
+OST_WindowsHiddenLines
+-2009500
+
+
+轮廓标记
+OST_StructConnectionProfilesTags
+-2009064
+
+
+孔标记
+OST_StructConnectionHoleTags
+-2009063
+
+
+隐藏线
+OST_CouplerHiddenLines
+-2009062
+
+
+结构钢筋接头标记
+OST_CouplerTags
+-2009061
+
+
+结构钢筋接头
+OST_Coupler
+-2009060
+
+
+焊接标记
+OST_StructConnectionWeldTags
+-2009059
+
+
+剪力钉标记
+OST_StructConnectionShearStudTags
+-2009058
+
+
+锚固件标记
+OST_StructConnectionAnchorTags
+-2009057
+
+
+螺栓标记
+OST_StructConnectionBoltTags
+-2009056
+
+
+板标记
+OST_StructConnectionPlateTags
+-2009055
+
+
+隐藏线
+OST_RebarHiddenLines
+-2009050
+
+
+Unknown
+OST_StructSubConnections
+-2009049
+
+
+修改器
+OST_StructConnectionModifiers
+-2009047
+
+
+焊缝
+OST_StructConnectionWelds
+-2009046
+
+
+孔
+OST_StructConnectionHoles
+-2009045
+
+
+剪力钉
+OST_StructConnectionShearStuds
+-2009044
+
+
+Unknown
+OST_StructConnectionNobleWarning
+-2009043
+
+
+其他
+OST_StructConnectionOthers
+-2009042
+
+
+螺栓
+OST_StructConnectionBolts
+-2009041
+
+
+结构连接标记
+OST_StructConnectionTags
+-2009040
+
+
+锚固件
+OST_StructConnectionAnchors
+-2009039
+
+
+平板
+OST_StructConnectionPlates
+-2009038
+
+
+轮廓
+OST_StructConnectionProfiles
+-2009037
+
+
+参照
+OST_StructConnectionReference
+-2009036
+
+
+Unknown
+OST_StructConnectionFailed
+-2009035
+
+
+Unknown
+OST_StructConnectionStale
+-2009034
+
+
+符号
+OST_StructConnectionSymbol
+-2009033
+
+
+隐藏线
+OST_StructConnectionHiddenLines
+-2009032
+
+
+Unknown
+OST_StructWeldLines
+-2009031
+
+
+结构连接
+OST_StructConnections
+-2009030
+
+
+边界
+OST_FabricAreaBoundary
+-2009029
+
+
+结构钢筋网符号
+OST_FabricReinSpanSymbol
+-2009028
+
+
+钢筋网
+OST_FabricReinforcementWire
+-2009027
+
+
+边界
+OST_FabricReinforcementBoundary
+-2009026
+
+
+钢筋集切换
+OST_RebarSetToggle
+-2009025
+
+
+Unknown
+OST_FabricAreaTags
+-2009023
+
+
+结构钢筋网标记
+OST_FabricReinforcementTags
+-2009022
+
+
+结构区域钢筋标记
+OST_AreaReinTags
+-2009021
+
+
+结构钢筋标记
+OST_RebarTags
+-2009020
+
+
+<钢筋网片>
+OST_FabricAreaSketchSheetsLines
+-2009019
+
+
+<钢筋网外围>
+OST_FabricAreaSketchEnvelopeLines
+-2009018
+
+
+结构钢筋网区域
+OST_FabricAreas
+-2009017
+
+
+结构钢筋网
+OST_FabricReinforcement
+-2009016
+
+
+钢筋保护层参照
+OST_RebarCover
+-2009015
+
+
+Unknown
+OST_CoverType
+-2009014
+
+
+钢筋形状
+OST_RebarShape
+-2009013
+
+
+边界
+OST_PathReinBoundary
+-2009012
+
+
+结构路径钢筋标记
+OST_PathReinTags
+-2009011
+
+
+结构路径钢筋符号
+OST_PathReinSpanSymbol
+-2009010
+
+
+结构路径钢筋
+OST_PathRein
+-2009009
+
+
+Unknown
+OST_Cage
+-2009008
+
+
+Unknown
+OST_AreaReinXVisibility
+-2009007
+
+
+边界
+OST_AreaReinBoundary
+-2009006
+
+
+结构区域钢筋符号
+OST_AreaReinSpanSymbol
+-2009005
+
+
+Unknown
+OST_AreaReinSketchOverride
+-2009004
+
+
+结构区域钢筋
+OST_AreaRein
+-2009003
+
+
+Unknown
+OST_RebarLines
+-2009002
+
+
+Unknown
+OST_RebarSketchLines
+-2009001
+
+
+结构钢筋
+OST_Rebar
+-2009000
+
+
+隔热层
+OST_FabricationPipeworkInsulation
+-2008221
+
+
+内衬
+OST_FabricationDuctworkLining
+-2008220
+
+
+降
+OST_FabricationContainmentDrop
+-2008219
+
+
+升
+OST_FabricationContainmentRise
+-2008218
+
+
+降
+OST_FabricationPipeworkDrop
+-2008217
+
+
+升
+OST_FabricationPipeworkRise
+-2008216
+
+
+符号
+OST_FabricationContainmentSymbology
+-2008215
+
+
+中心线
+OST_FabricationContainmentCenterLine
+-2008214
+
+
+MEP 预制保护层标记
+OST_FabricationContainmentTags
+-2008213
+
+
+MEP 预制保护层
+OST_FabricationContainment
+-2008212
+
+
+符号
+OST_FabricationPipeworkSymbology
+-2008211
+
+
+中心线
+OST_FabricationPipeworkCenterLine
+-2008210
+
+
+MEP 预制管道标记
+OST_FabricationPipeworkTags
+-2008209
+
+
+MEP 预制管道
+OST_FabricationPipework
+-2008208
+
+
+符号
+OST_FabricationDuctworkSymbology
+-2008207
+
+
+降
+OST_FabricationDuctworkDrop
+-2008206
+
+
+升
+OST_FabricationDuctworkRise
+-2008205
+
+
+MEP 预制支架标记
+OST_FabricationHangerTags
+-2008204
+
+
+MEP 预制支架
+OST_FabricationHangers
+-2008203
+
+
+Unknown
+OST_OBSOLETE_FabricationPartsTmpGraphicDropDrag
+-200820
+
+
+Unknown
+OST_FabricationPartsTmpGraphicDrag
+-2008201
+
+
+Unknown
+OST_OBSOLETE_FabricationPartsTmpGraphicDrop
+-2008200
+
+
+Unknown
+OST_FabricationPartsTmpGraphicEnd
+-2008199
+
+
+隔热层
+OST_FabricationDuctworkInsulation
+-2008198
+
+
+Unknown
+OST_LayoutNodes
+-2008197
+
+
+中心线
+OST_FabricationDuctworkCenterLine
+-2008196
+
+
+Unknown
+OST_FabricationServiceElements
+-2008195
+
+
+MEP 预制管网标记
+OST_FabricationDuctworkTags
+-2008194
+
+
+MEP 预制管网
+OST_FabricationDuctwork
+-2008193
+
+
+Unknown
+OST_LayoutPathBase_Pipings
+-2008192
+
+
+Unknown
+OST_NumberingSchemas
+-2008191
+
+
+Unknown
+OST_DivisionRules
+-2008190
+
+
+着色
+OST_gbXML_Shade
+-2008187
+
+
+分析表面
+OST_AnalyticSurfaces
+-2008186
+
+
+分析空间
+OST_AnalyticSpaces
+-2008185
+
+
+空气洞口
+OST_gbXML_OpeningAir
+-2008184
+
+
+非推拉门
+OST_gbXML_NonSlidingDoor
+-2008183
+
+
+推拉门
+OST_gbXML_SlidingDoor
+-2008182
+
+
+可操作天窗
+OST_gbXML_OperableSkylight
+-2008181
+
+
+固定天窗
+OST_gbXML_FixedSkylight
+-2008180
+
+
+可操作窗口
+OST_gbXML_OperableWindow
+-2008179
+
+
+固定窗
+OST_gbXML_FixedWindow
+-2008178
+
+
+地下天花板
+OST_gbXML_UndergroundCeiling
+-2008177
+
+
+地下板
+OST_gbXML_UndergroundSlab
+-2008176
+
+
+地下墙
+OST_gbXML_UndergroundWall
+-2008175
+
+
+空气曲面
+OST_gbXML_SurfaceAir
+-2008174
+
+
+天花板
+OST_gbXML_Ceiling
+-2008173
+
+
+内部楼板
+OST_gbXML_InteriorFloor
+-2008172
+
+
+内墙
+OST_gbXML_InteriorWall
+-2008171
+
+
+平整表面上的板
+OST_gbXML_SlabOnGrade
+-2008170
+
+
+活动楼板
+OST_gbXML_RaisedFloor
+-2008169
+
+
+屋顶
+OST_gbXML_Roof
+-2008168
+
+
+外墙
+OST_gbXML_ExteriorWall
+-2008167
+
+
+Unknown
+OST_DivisionProfile
+-2008165
+
+
+Unknown
+OST_SplitterProfile
+-2008164
+
+
+管段
+OST_PipeSegments
+-2008163
+
+
+Unknown
+OST_GraphicalWarning_OpenConnector
+-2008162
+
+
+管道占位符
+OST_PlaceHolderPipes
+-2008161
+
+
+风管占位符
+OST_PlaceHolderDucts
+-2008160
+
+
+参照线
+OST_PipingSystem_Reference_Visibility
+-2008159
+
+
+Unknown
+OST_PipingSystem_Reference
+-2008158
+
+
+参照线
+OST_DuctSystem_Reference_Visibility
+-2008157
+
+
+Unknown
+OST_DuctSystem_Reference
+-2008156
+
+
+管道隔热层标记
+OST_PipeInsulationsTags
+-2008155
+
+
+风管内衬标记
+OST_DuctLiningsTags
+-2008154
+
+
+风管隔热层标记
+OST_DuctInsulationsTags
+-2008153
+
+
+电气备件/空间电路
+OST_ElectricalInternalCircuits
+-2008152
+
+
+配电盘明细表图形
+OST_PanelScheduleGraphics
+-2008151
+
+
+电缆桥架管路
+OST_CableTrayRun
+-2008150
+
+
+线管管路
+OST_ConduitRun
+-2008149
+
+
+Unknown
+OST_ParamElemElectricalLoadClassification
+-2008148
+
+
+Unknown
+OST_DataPanelScheduleTemplates
+-2008147
+
+
+Unknown
+OST_SwitchboardScheduleTemplates
+-2008146
+
+
+Unknown
+OST_BranchPanelScheduleTemplates
+-2008145
+
+
+Unknown
+OST_ConduitStandards
+-2008144
+
+
+Unknown
+OST_ElectricalLoadClassifications
+-2008143
+
+
+Unknown
+OST_ElectricalDemandFactorDefinitions
+-2008142
+
+
+中心线
+OST_ConduitFittingCenterLine
+-2008141
+
+
+中心线
+OST_CableTrayFittingCenterLine
+-2008140
+
+
+中心线
+OST_ConduitCenterLine
+-2008139
+
+
+降
+OST_ConduitDrop
+-2008138
+
+
+升
+OST_ConduitRiseDrop
+-2008137
+
+
+中心线
+OST_CableTrayCenterLine
+-2008136
+
+
+降
+OST_CableTrayDrop
+-2008135
+
+
+升
+OST_CableTrayRiseDrop
+-2008134
+
+
+线管标记
+OST_ConduitTags
+-2008133
+
+
+线管
+OST_Conduit
+-2008132
+
+
+电缆桥架标记
+OST_CableTrayTags
+-2008131
+
+
+电缆桥架
+OST_CableTray
+-2008130
+
+
+线管配件标记
+OST_ConduitFittingTags
+-2008129
+
+
+线管配件
+OST_ConduitFitting
+-2008128
+
+
+电缆桥架配件标记
+OST_CableTrayFittingTags
+-2008127
+
+
+电缆桥架配件
+OST_CableTrayFitting
+-2008126
+
+
+布管系统配置
+OST_RoutingPreferences
+-2008125
+
+
+风管内衬
+OST_DuctLinings
+-2008124
+
+
+风管隔热层
+OST_DuctInsulations
+-2008123
+
+
+管道隔热层
+OST_PipeInsulations
+-2008122
+
+
+Unknown
+OST_HVAC_Load_Schedules
+-2008121
+
+
+Unknown
+OST_HVAC_Load_Building_Types
+-2008120
+
+
+Unknown
+OST_HVAC_Load_Space_Types
+-2008119
+
+
+参照线
+OST_HVAC_Zones_Reference_Visibility
+-2008118
+
+
+内部填充
+OST_HVAC_Zones_InteriorFill_Visibility
+-2008117
+
+
+颜色填充
+OST_HVAC_Zones_ColorFill
+-2008116
+
+
+分区标记
+OST_ZoneTags
+-2008115
+
+
+Unknown
+OST_LayoutPath_Bases
+-2008114
+
+
+Unknown
+OST_WireTemperatureRatings
+-2008113
+
+
+Unknown
+OST_WireInsulations
+-2008112
+
+
+Unknown
+OST_WireMaterials
+-2008111
+
+
+Unknown
+OST_HVAC_Zones_Reference
+-2008110
+
+
+Unknown
+OST_HVAC_Zones_InteriorFill
+-2008109
+
+
+边界
+OST_HVAC_Zones_Boundary
+-2008108
+
+
+HVAC 区
+OST_HVAC_Zones
+-2008107
+
+
+Unknown
+OST_Fluids
+-2008106
+
+
+Unknown
+OST_PipeSchedules
+-2008105
+
+
+Unknown
+OST_PipeMaterials
+-2008104
+
+
+Unknown
+OST_PipeConnections
+-2008103
+
+
+Unknown
+OST_EAConstructions
+-2008102
+
+
+开关系统
+OST_SwitchSystem
+-2008101
+
+
+喷头标记
+OST_SprinklerTags
+-2008100
+
+
+喷头
+OST_Sprinklers
+-2008099
+
+
+Unknown
+OST_RouteCurveBranch
+-2008098
+
+
+Unknown
+OST_RouteCurveMain
+-2008097
+
+
+Unknown
+OST_RouteCurve
+-2008096
+
+
+洞口
+OST_GbXML_Opening
+-2008095
+
+
+地下
+OST_GbXML_SType_Underground
+-2008094
+
+
+着色
+OST_GbXML_SType_Shade
+-2008093
+
+
+外部
+OST_GbXML_SType_Exterior
+-2008092
+
+
+内部
+OST_GbXML_SType_Interior
+-2008091
+
+
+分析表面
+OST_GbXMLFaces
+-2008090
+
+
+回路方向
+OST_WireHomeRunArrows
+-2008089
+
+
+灯具标记
+OST_LightingDeviceTags
+-2008088
+
+
+灯具
+OST_LightingDevices
+-2008087
+
+
+火警设备标记
+OST_FireAlarmDeviceTags
+-2008086
+
+
+火警设备
+OST_FireAlarmDevices
+-2008085
+
+
+数据设备标记
+OST_DataDeviceTags
+-2008084
+
+
+数据设备
+OST_DataDevices
+-2008083
+
+
+通讯设备标记
+OST_CommunicationDeviceTags
+-2008082
+
+
+通讯设备
+OST_CommunicationDevices
+-2008081
+
+
+安全设备标记
+OST_SecurityDeviceTags
+-2008080
+
+
+安全设备
+OST_SecurityDevices
+-2008079
+
+
+护理呼叫设备标记
+OST_NurseCallDeviceTags
+-2008078
+
+
+护理呼叫设备
+OST_NurseCallDevices
+-2008077
+
+
+电话设备标记
+OST_TelephoneDeviceTags
+-2008076
+
+
+电话设备
+OST_TelephoneDevices
+-2008075
+
+
+导线记号
+OST_WireTickMarks
+-2008074
+
+
+Unknown
+OST_PipeFittingInsulation
+-2008073
+
+
+中心线
+OST_PipeFittingCenterLine
+-2008072
+
+
+Unknown
+OST_FlexPipeCurvesInsulation
+-2008071
+
+
+Unknown
+OST_PipeCurvesInsulation
+-2008070
+
+
+降
+OST_PipeCurvesDrop
+-2008069
+
+
+Unknown
+OST_DuctFittingLining
+-2008068
+
+
+Unknown
+OST_DuctFittingInsulation
+-2008067
+
+
+中心线
+OST_DuctFittingCenterLine
+-2008066
+
+
+Unknown
+OST_FlexDuctCurvesInsulation
+-2008065
+
+
+Unknown
+OST_DuctCurvesLining
+-2008064
+
+
+Unknown
+OST_DuctCurvesInsulation
+-2008063
+
+
+降
+OST_DuctCurvesDrop
+-2008062
+
+
+风管管件标记
+OST_DuctFittingTags
+-2008061
+
+
+管件标记
+OST_PipeFittingTags
+-2008060
+
+
+管道颜色填充
+OST_PipeColorFills
+-2008059
+
+
+管道颜色填充图例
+OST_PipeColorFillLegends
+-2008058
+
+
+导线标记
+OST_WireTags
+-2008057
+
+
+管道附件标记
+OST_PipeAccessoryTags
+-2008056
+
+
+管道附件
+OST_PipeAccessory
+-2008055
+
+
+升
+OST_PipeCurvesRiseDrop
+-2008054
+
+
+填充图案
+OST_FlexPipeCurvesPattern
+-2008053
+
+
+Unknown
+OST_FlexPipeCurvesContour
+-2008052
+
+
+中心线
+OST_FlexPipeCurvesCenterLine
+-2008051
+
+
+软管
+OST_FlexPipeCurves
+-2008050
+
+
+管件
+OST_PipeFitting
+-2008049
+
+
+软管标记
+OST_FlexPipeTags
+-2008048
+
+
+管道标记
+OST_PipeTags
+-2008047
+
+
+Unknown
+OST_PipeCurvesContour
+-2008046
+
+
+中心线
+OST_PipeCurvesCenterLine
+-2008045
+
+
+管道
+OST_PipeCurves
+-2008044
+
+
+管道系统
+OST_PipingSystem
+-2008043
+
+
+Unknown
+OST_ElectricalDemandFactor
+-2008042
+
+
+Unknown
+OST_ElecDistributionSys
+-2008041
+
+
+Unknown
+OST_ElectricalVoltage
+-2008040
+
+
+导线
+OST_Wire
+-2008039
+
+
+Unknown
+OST_ElectricalCircuitTags
+-2008038
+
+
+电路
+OST_ElectricalCircuit
+-2008037
+
+
+升
+OST_DuctCurvesRiseDrop
+-2008036
+
+
+填充图案
+OST_FlexDuctCurvesPattern
+-2008023
+
+
+Unknown
+OST_FlexDuctCurvesContour
+-2008022
+
+
+中心线
+OST_FlexDuctCurvesCenterLine
+-2008021
+
+
+软风管
+OST_FlexDuctCurves
+-2008020
+
+
+风管附件标记
+OST_DuctAccessoryTags
+-2008017
+
+
+风管附件
+OST_DuctAccessory
+-2008016
+
+
+风管系统
+OST_DuctSystem
+-2008015
+
+
+风道末端标记
+OST_DuctTerminalTags
+-2008014
+
+
+风道末端
+OST_DuctTerminal
+-2008013
+
+
+风管管件
+OST_DuctFitting
+-2008010
+
+
+风管颜色填充
+OST_DuctColorFills
+-2008005
+
+
+软风管标记
+OST_FlexDuctTags
+-2008004
+
+
+风管标记
+OST_DuctTags
+-2008003
+
+
+Unknown
+OST_DuctCurvesContour
+-2008002
+
+
+中心线
+OST_DuctCurvesCenterLine
+-2008001
+
+
+风管
+OST_DuctCurves
+-2008000
+
+
+风管颜色填充图例
+OST_DuctColorFillLegends
+-2007004
+
+
+Unknown
+OST_ConnectorElemZAxis
+-2007003
+
+
+Unknown
+OST_ConnectorElemYAxis
+-2007002
+
+
+Unknown
+OST_ConnectorElemXAxis
+-2007001
+
+
+Unknown
+OST_ConnectorElem
+-2007000
+
+
+Unknown
+OST_BridgeBearingTags
+-2006178
+
+
+Unknown
+OST_BridgeGirderTags
+-2006177
+
+
+Unknown
+OST_BridgeFoundationTags
+-2006176
+
+
+Unknown
+OST_BridgeDeckTags
+-2006175
+
+
+Unknown
+OST_BridgeArchTags
+-2006174
+
+
+Unknown
+OST_BridgeCableTags
+-2006173
+
+
+Unknown
+OST_BridgeTowerTags
+-2006172
+
+
+Unknown
+OST_BridgePierTags
+-2006171
+
+
+Unknown
+OST_BridgeAbutmentTags
+-2006170
+
+
+Unknown
+OST_BridgeBearingHiddenLines
+-2006158
+
+
+Unknown
+OST_BridgeGirderHiddenLines
+-2006157
+
+
+Unknown
+OST_BridgeFoundationHiddenLines
+-2006156
+
+
+Unknown
+OST_BridgeDeckHiddenLines
+-2006155
+
+
+Unknown
+OST_BridgeArchHiddenLines
+-2006154
+
+
+Unknown
+OST_BridgeCableHiddenLines
+-2006153
+
+
+Unknown
+OST_BridgeTowerHiddenLines
+-2006152
+
+
+Unknown
+OST_BridgePierHiddenLines
+-2006151
+
+
+Unknown
+OST_BridgeAbutmentHiddenLines
+-2006150
+
+
+桥梁支座
+OST_BridgeBearings
+-2006138
+
+
+桥梁大梁
+OST_BridgeGirders
+-2006137
+
+
+桥梁基础
+OST_BridgeFoundations
+-2006136
+
+
+桥面
+OST_BridgeDecks
+-2006135
+
+
+桥拱
+OST_BridgeArches
+-2006134
+
+
+桥梁缆索
+OST_BridgeCables
+-2006133
+
+
+桥塔
+OST_BridgeTowers
+-2006132
+
+
+桥墩
+OST_BridgePiers
+-2006131
+
+
+桥台
+OST_BridgeAbutments
+-2006130
+
+
+Unknown
+OST_DesignOptions
+-2006114
+
+
+Unknown
+OST_DesignOptionSets
+-2006112
+
+
+平面视图中的支撑符号
+OST_StructuralBracePlanReps
+-2006110
+
+
+连接符号
+OST_StructConnectionSymbols
+-2006100
+
+
+结构注释
+OST_StructuralAnnotations
+-2006090
+
+
+云线批注标记
+OST_RevisionCloudTags
+-2006080
+
+
+Unknown
+OST_Revisions
+-2006070
+
+
+云线批注
+OST_RevisionClouds
+-2006060
+
+
+Unknown
+OST_EditCutProfile
+-2006050
+
+
+立面标记
+OST_ElevationMarks
+-2006045
+
+
+轴网标头
+OST_GridHeads
+-2006040
+
+
+标高标头
+OST_LevelHeads
+-2006020
+
+
+Unknown
+OST_DecalType
+-2006002
+
+
+Unknown
+OST_DecalElement
+-2006001
+
+
+范围框
+OST_VolumeOfInterest
+-2006000
+
+
+边界条件
+OST_BoundaryConditions
+-2005301
+
+
+内部面荷载标记
+OST_InternalAreaLoadTags
+-2005255
+
+
+内部线荷载标记
+OST_InternalLineLoadTags
+-2005254
+
+
+内部点荷载标记
+OST_InternalPointLoadTags
+-2005253
+
+
+面荷载标记
+OST_AreaLoadTags
+-2005252
+
+
+线荷载标记
+OST_LineLoadTags
+-2005251
+
+
+点荷载标记
+OST_PointLoadTags
+-2005250
+
+
+地震荷载
+OST_LoadCasesSeismic
+-2005218
+
+
+温度荷载
+OST_LoadCasesTemperature
+-2005217
+
+
+偶然荷载
+OST_LoadCasesAccidental
+-2005216
+
+
+屋顶活荷载
+OST_LoadCasesRoofLive
+-2005215
+
+
+雪荷载
+OST_LoadCasesSnow
+-2005214
+
+
+风荷载
+OST_LoadCasesWind
+-2005213
+
+
+活荷载
+OST_LoadCasesLive
+-2005212
+
+
+恒荷载
+OST_LoadCasesDead
+-2005211
+
+
+结构荷载工况
+OST_LoadCases
+-2005210
+
+
+内部面荷载
+OST_InternalAreaLoads
+-2005207
+
+
+内部线荷载
+OST_InternalLineLoads
+-2005206
+
+
+内部点荷载
+OST_InternalPointLoads
+-2005205
+
+
+结构内部荷载
+OST_InternalLoads
+-2005204
+
+
+面荷载
+OST_AreaLoads
+-2005203
+
+
+线荷载
+OST_LineLoads
+-2005202
+
+
+点荷载
+OST_PointLoads
+-2005201
+
+
+结构荷载
+OST_Loads
+-2005200
+
+
+结构梁系统标记
+OST_BeamSystemTags
+-2005130
+
+
+基础跨方向符号
+OST_FootingSpanDirectionSymbol
+-2005111
+
+
+跨方向符号
+OST_SpanDirectionSymbol
+-2005110
+
+
+Unknown
+OST_SpotSlopesSymbols
+-2005102
+
+
+Unknown
+OST_SpotCoordinateSymbols
+-2005101
+
+
+高程点符号
+OST_SpotElevSymbols
+-2005100
+
+
+Unknown
+OST_StructuralConnectionHandlerTags_Deprecated
+-2005031
+
+
+结构桁架标记
+OST_TrussTags
+-2005030
+
+
+注释记号标记
+OST_KeynoteTags
+-2005029
+
+
+详图项目标记
+OST_DetailComponentTags
+-2005028
+
+
+材质标记
+OST_MaterialTags
+-2005027
+
+
+楼板标记
+OST_FloorTags
+-2005026
+
+
+幕墙系统标记
+OST_CurtaSystemTags
+-2005025
+
+
+Unknown
+OST_HostFinTags
+-2005024
+
+
+楼梯标记
+OST_StairsTags
+-2005023
+
+
+多类别标记
+OST_MultiCategoryTags
+-2005022
+
+
+植物标记
+OST_PlantingTags
+-2005021
+
+
+面积标记
+OST_AreaTags
+-2005020
+
+
+结构基础标记
+OST_StructuralFoundationTags
+-2005019
+
+
+结构柱标记
+OST_StructuralColumnTags
+-2005018
+
+
+停车场标记
+OST_ParkingTags
+-2005017
+
+
+场地标记
+OST_SiteTags
+-2005016
+
+
+结构框架标记
+OST_StructuralFramingTags
+-2005015
+
+
+专用设备标记
+OST_SpecialityEquipmentTags
+-2005014
+
+
+常规模型标记
+OST_GenericModelTags
+-2005013
+
+
+幕墙嵌板标记
+OST_CurtainWallPanelTags
+-2005012
+
+
+墙标记
+OST_WallTags
+-2005011
+
+
+卫浴装置标记
+OST_PlumbingFixtureTags
+-2005010
+
+
+机电设备标记
+OST_MechanicalEquipmentTags
+-2005009
+
+
+照明设备标记
+OST_LightingFixtureTags
+-2005008
+
+
+家具系统标记
+OST_FurnitureSystemTags
+-2005007
+
+
+家具标记
+OST_FurnitureTags
+-2005006
+
+
+电气装置标记
+OST_ElectricalFixtureTags
+-2005004
+
+
+电气设备标记
+OST_ElectricalEquipmentTags
+-2005003
+
+
+天花板标记
+OST_CeilingTags
+-2005002
+
+
+橱柜标记
+OST_CaseworkTags
+-2005001
+
+
+Unknown
+OST_Tags
+-2005000
+
+
+颜色填充
+OST_MEPSpaceColorFill
+-2003605
+
+
+Unknown
+OST_MEPSpaceReference
+-2003604
+
+
+Unknown
+OST_MEPSpaceInteriorFill
+-2003603
+
+
+参照
+OST_MEPSpaceReferenceVisibility
+-2003602
+
+
+内墙
+OST_MEPSpaceInteriorFillVisibility
+-2003601
+
+
+空间
+OST_MEPSpaces
+-2003600
+
+
+Unknown
+OST_StackedWalls
+-2003500
+
+
+Unknown
+OST_MassGlazingAll
+-2003423
+
+
+Unknown
+OST_MassFloorsAll
+-2003422
+
+
+Unknown
+OST_MassWallsAll
+-2003421
+
+
+Unknown
+OST_MassExteriorWallUnderground
+-2003420
+
+
+Unknown
+OST_MassSlab
+-2003419
+
+
+体量着色
+OST_MassShade
+-2003418
+
+
+体量洞口
+OST_MassOpening
+-2003417
+
+
+体量天窗
+OST_MassSkylights
+-2003416
+
+
+体量玻璃
+OST_MassGlazing
+-2003415
+
+
+体量屋顶
+OST_MassRoof
+-2003414
+
+
+体量外墙
+OST_MassExteriorWall
+-2003413
+
+
+体量内墙
+OST_MassInteriorWall
+-2003412
+
+
+体量分区
+OST_MassZone
+-2003411
+
+
+体量楼层标记
+OST_MassAreaFaceTags
+-2003410
+
+
+Unknown
+OST_HostTemplate
+-2003409
+
+
+Unknown
+OST_MassFaceSplitter
+-2003408
+
+
+Unknown
+OST_MassCutter
+-2003407
+
+
+Unknown
+OST_ZoningEnvelope
+-2003406
+
+
+体量标记
+OST_MassTags
+-2003405
+
+
+形式
+OST_MassForm
+-2003404
+
+
+体量楼层
+OST_MassFloor
+-2003403
+
+
+体量
+OST_Mass
+-2003400
+
+
+Unknown
+OST_DividedSurface_DiscardedDivisionLines
+-2003333
+
+
+Unknown
+OST_DividedSurfaceBelt
+-2003332
+
+
+Unknown
+OST_TilePatterns
+-2003331
+
+
+Unknown
+OST_AlwaysExcludedInAllViews
+-2003330
+
+
+Unknown
+OST_DividedSurface_TransparentFace
+-2003329
+
+
+Unknown
+OST_DividedSurface_PreDividedSurface
+-2003328
+
+
+图案填充
+OST_DividedSurface_PatternFill
+-2003327
+
+
+填充图案线
+OST_DividedSurface_PatternLines
+-2003326
+
+
+网格线
+OST_DividedSurface_Gridlines
+-2003325
+
+
+节点
+OST_DividedSurface_Nodes
+-2003324
+
+
+Unknown
+OST_DividedSurface
+-2003323
+
+
+Unknown
+OST_RepeatingDetailLines
+-2003321
+
+
+向下箭头
+OST_RampsDownArrow
+-2003308
+
+
+向上箭头
+OST_RampsUpArrow
+-2003307
+
+
+文字(向下)
+OST_RampsDownText
+-2003306
+
+
+文字(向上)
+OST_RampsUpText
+-2003305
+
+
+超出截面线的梯边梁
+OST_RampsStringerAboveCut
+-2003304
+
+
+梯边梁
+OST_RampsStringer
+-2003303
+
+
+坡道超出截面线
+OST_RampsAboveCut
+-2003302
+
+
+Unknown
+OST_RampsIncomplete
+-2003301
+
+
+Unknown
+OST_TrussDummy
+-2003300
+
+
+Unknown
+OST_ZoneSchemes
+-2003225
+
+
+Unknown
+OST_AreaSchemes
+-2003201
+
+
+面积
+OST_Areas
+-2003200
+
+
+项目信息
+OST_ProjectInformation
+-2003101
+
+
+图纸
+OST_Sheets
+-2003100
+
+
+Unknown
+OST_ProfileFamilies
+-2003000
+
+
+详图项目
+OST_DetailComponents
+-2002000
+
+
+屋檐底板
+OST_RoofSoffit
+-2001393
+
+
+楼板边缘
+OST_EdgeSlab
+-2001392
+
+
+檐沟
+OST_Gutter
+-2001391
+
+
+封檐板
+OST_Fascia
+-2001390
+
+
+环境
+OST_Entourage
+-2001370
+
+
+植物
+OST_Planting
+-2001360
+
+
+Unknown
+OST_Blocks
+-2001359
+
+
+隐藏线
+OST_StructuralStiffenerHiddenLines
+-2001358
+
+
+定位线
+OST_StructuralColumnLocationLine
+-2001357
+
+
+定位线
+OST_StructuralFramingLocationLine
+-2001356
+
+
+结构加强板标记
+OST_StructuralStiffenerTags
+-2001355
+
+
+结构加强板
+OST_StructuralStiffener
+-2001354
+
+
+Unknown
+OST_FootingAnalyticalGeometry
+-2001353
+
+
+RVT 链接
+OST_RvtLinks
+-2001352
+
+
+Unknown
+OST_Automatic
+-2001351
+
+
+专用设备
+OST_SpecialityEquipment
+-2001350
+
+
+刚性链接
+OST_ColumnAnalyticalRigidLinks
+-2001344
+
+
+次等高线
+OST_SecondaryTopographyContours
+-2001343
+
+
+主等高线
+OST_TopographyContours
+-2001342
+
+
+三角形边缘
+OST_TopographySurface
+-2001341
+
+
+地形
+OST_Topography
+-2001340
+
+
+地形链接
+OST_TopographyLink
+-2001339
+
+
+结构桁架
+OST_StructuralTruss
+-2001336
+
+
+棍状符号
+OST_StructuralColumnStickSymbols
+-2001335
+
+
+隐藏线
+OST_HiddenStructuralColumnLines
+-2001334
+
+
+刚性链接
+OST_AnalyticalRigidLinks
+-2001333
+
+
+Unknown
+OST_ColumnAnalyticalGeometry
+-2001332
+
+
+Unknown
+OST_FramingAnalyticalGeometry
+-2001331
+
+
+结构柱
+OST_StructuralColumns
+-2001330
+
+
+隐藏线
+OST_HiddenStructuralFramingLines
+-2001329
+
+
+Unknown
+OST_KickerBracing
+-2001328
+
+
+结构梁系统
+OST_StructuralFramingSystem
+-2001327
+
+
+Unknown
+OST_VerticalBracing
+-2001326
+
+
+Unknown
+OST_HorizontalBracing
+-2001325
+
+
+Unknown
+OST_Purlin
+-2001324
+
+
+Unknown
+OST_Joist
+-2001323
+
+
+Unknown
+OST_Girder
+-2001322
+
+
+Unknown
+OST_StructuralFramingOther
+-2001321
+
+
+结构框架
+OST_StructuralFraming
+-2001320
+
+
+隐藏线
+OST_HiddenStructuralFoundationLines
+-2001302
+
+
+结构基础
+OST_StructuralFoundation
+-2001300
+
+
+Unknown
+OST_BasePointAxisZ
+-2001275
+
+
+Unknown
+OST_BasePointAxisY
+-2001274
+
+
+Unknown
+OST_BasePointAxisX
+-2001273
+
+
+测量点
+OST_SharedBasePoint
+-2001272
+
+
+项目基点
+OST_ProjectBasePoint
+-2001271
+
+
+Unknown
+OST_SiteRegion
+-2001270
+
+
+建筑红线线段标记
+OST_SitePropertyLineSegmentTags
+-2001269
+
+
+建筑红线线段
+OST_SitePropertyLineSegment
+-2001268
+
+
+属性标记
+OST_SitePropertyTags
+-2001267
+
+
+边界点
+OST_SitePointBoundary
+-2001266
+
+
+建筑红线
+OST_SiteProperty
+-2001265
+
+
+建筑地坪
+OST_BuildingPad
+-2001263
+
+
+内部点
+OST_SitePoint
+-2001262
+
+
+Unknown
+OST_SiteSurface
+-2001261
+
+
+场地
+OST_Site
+-2001260
+
+
+Unknown
+OST_Sewer
+-2001240
+
+
+道路
+OST_Roads
+-2001220
+
+
+Unknown
+OST_Property
+-2001200
+
+
+停车场
+OST_Parking
+-2001180
+
+
+卫浴装置
+OST_PlumbingFixtures
+-2001160
+
+
+机械设备
+OST_MechanicalEquipment
+-2001140
+
+
+光源
+OST_LightingFixtureSource
+-2001121
+
+
+照明设备
+OST_LightingFixtures
+-2001120
+
+
+家具系统
+OST_FurnitureSystems
+-2001100
+
+
+电气装置
+OST_ElectricalFixtures
+-2001060
+
+
+电气设备
+OST_ElectricalEquipment
+-2001040
+
+
+橱柜
+OST_Casework
+-2001000
+
+
+Unknown
+OST_ArcWallRectOpening
+-2000999
+
+
+Unknown
+OST_DormerOpeningIncomplete
+-2000998
+
+
+Unknown
+OST_SWallRectOpening
+-2000997
+
+
+竖井洞口
+OST_ShaftOpening
+-2000996
+
+
+Unknown
+OST_StructuralFramingOpening
+-2000995
+
+
+Unknown
+OST_ColumnOpening
+-2000994
+
+
+Unknown
+OST_RiseDropSymbols
+-2000989
+
+
+水力分离符号
+OST_PipeHydronicSeparationSymbols
+-2000988
+
+
+机械设备集边界线
+OST_MechanicalEquipmentSetBoundaryLines
+-2000987
+
+
+机械设备集标记
+OST_MechanicalEquipmentSetTags
+-2000986
+
+
+机械设备集
+OST_MechanicalEquipmentSet
+-2000985
+
+
+连接线符号
+OST_AnalyticalPipeConnectionLineSymbol
+-2000984
+
+
+分析管道连接
+OST_AnalyticalPipeConnections
+-2000983
+
+
+Unknown
+OST_Coordination_Model
+-2000982
+
+
+Unknown
+OST_MultistoryStairs
+-2000980
+
+
+Unknown
+OST_HiddenStructuralConnectionLines_Deprecated
+-2000979
+
+
+Unknown
+OST_StructuralConnectionHandler_Deprecated
+-2000978
+
+
+Unknown
+OST_CoordinateSystem
+-2000977
+
+
+局部坐标系
+OST_FndSlabLocalCoordSys
+-2000976
+
+
+局部坐标系
+OST_FloorLocalCoordSys
+-2000975
+
+
+局部坐标系
+OST_WallLocalCoordSys
+-2000974
+
+
+局部坐标系
+OST_BraceLocalCoordSys
+-2000973
+
+
+局部坐标系
+OST_ColumnLocalCoordSys
+-2000972
+
+
+局部坐标系
+OST_BeamLocalCoordSys
+-2000971
+
+
+多钢筋注释
+OST_MultiReferenceAnnotations
+-2000970
+
+
+Unknown
+OST_DSR_LeaderTickMarkStyleId
+-2000969
+
+
+Unknown
+OST_DSR_InteriorTickMarkStyleId
+-2000968
+
+
+Unknown
+OST_DSR_ArrowHeadStyleId
+-2000967
+
+
+Unknown
+OST_DSR_CenterlineTickMarkStyleId
+-2000966
+
+
+Unknown
+OST_DSR_CenterlinePatternCatId
+-2000965
+
+
+Unknown
+OST_DSR_DimStyleHeavyEndCategoryId
+-2000964
+
+
+Unknown
+OST_DSR_DimStyleHeavyEndCatId
+-2000963
+
+
+Unknown
+OST_DSR_DimStyleTickCategoryId
+-2000962
+
+
+Unknown
+OST_DSR_LineAndTextAttrFontId
+-2000961
+
+
+Unknown
+OST_DSR_LineAndTextAttrCategoryId
+-2000960
+
+
+分析节点标记
+OST_NodeAnalyticalTags
+-2000956
+
+
+分析链接标记
+OST_LinkAnalyticalTags
+-2000955
+
+
+Unknown
+OST_RailingRailPathExtensionLines
+-2000954
+
+
+Unknown
+OST_RailingRailPathLines
+-2000953
+
+
+支撑
+OST_StairsSupports
+-2000952
+
+
+<高于> 扶手
+OST_RailingHandRailAboveCut
+-2000951
+
+
+<高于> 顶部扶栏
+OST_RailingTopRailAboveCut
+-2000950
+
+
+终端
+OST_RailingTermination
+-2000949
+
+
+支座
+OST_RailingSupport
+-2000948
+
+
+扶手
+OST_RailingHandRail
+-2000947
+
+
+顶部扶栏
+OST_RailingTopRail
+-2000946
+
+
+Unknown
+OST_StairsSketchPathLines
+-2000945
+
+
+楼梯踏板/踢面数
+OST_StairsTriserNumbers
+-2000944
+
+
+Unknown
+OST_StairsTriserTags
+-2000943
+
+
+楼梯支撑标记
+OST_StairsSupportTags
+-2000942
+
+
+楼梯平台标记
+OST_StairsLandingTags
+-2000941
+
+
+楼梯梯段标记
+OST_StairsRunTags
+-2000940
+
+
+<高于> 向上箭头
+OST_StairsPathsAboveCut
+-2000939
+
+
+楼梯路径
+OST_StairsPaths
+-2000938
+
+
+<高于> 踢面线
+OST_StairsRiserLinesAboveCut
+-2000937
+
+
+踢面线
+OST_StairsRiserLines
+-2000936
+
+
+<高于> 轮廓
+OST_StairsOutlinesAboveCut
+-2000935
+
+
+轮廓
+OST_StairsOutlines
+-2000934
+
+
+<高于> 楼梯前缘线
+OST_StairsNosingLinesAboveCut
+-2000933
+
+
+楼梯前缘线
+OST_StairsNosingLines
+-2000932
+
+
+<高于> 剪切标记
+OST_StairsCutMarksAboveCut
+-2000931
+
+
+剪切标记
+OST_StairsCutMarks
+-2000930
+
+
+Unknown
+OST_ComponentRepeaterSlot
+-2000928
+
+
+Unknown
+OST_ComponentRepeater
+-2000927
+
+
+Unknown
+OST_DividedPath
+-2000926
+
+
+Unknown
+OST_IOSRoomCalculationPoint
+-2000925
+
+
+Unknown
+OST_PropertySet
+-2000924
+
+
+Unknown
+OST_AppearanceAsset
+-2000923
+
+
+Unknown
+OST_StairStringer2012_Deprecated
+-2000922
+
+
+踢面/踏板
+OST_StairsTrisers
+-2000921
+
+
+平台
+OST_StairsLandings
+-2000920
+
+
+梯段
+OST_StairsRuns
+-2000919
+
+
+Unknown
+OST_Stair2012_Deprecated
+-2000918
+
+
+Unknown
+OST_RailingSystemTags
+-2000917
+
+
+Unknown
+OST_RailingSystemTransition
+-2000916
+
+
+Unknown
+OST_RailingSystemTermination
+-2000915
+
+
+Unknown
+OST_RailingSystemRail
+-2000914
+
+
+Unknown
+OST_RailingSystemTopRail
+-2000913
+
+
+Unknown
+OST_RailingSystemHandRailBracket
+-2000912
+
+
+Unknown
+OST_RailingSystemHandRail
+-2000911
+
+
+Unknown
+OST_RailingSystemHardware
+-2000910
+
+
+Unknown
+OST_RailingSystemPanel
+-2000909
+
+
+Unknown
+OST_RailingSystemBaluster
+-2000908
+
+
+Unknown
+OST_RailingSystemPost
+-2000907
+
+
+Unknown
+OST_RailingSystemSegment
+-2000906
+
+
+Unknown
+OST_RailingSystem
+-2000905
+
+
+Unknown
+OST_AdaptivePoints_HiddenLines
+-2000904
+
+
+线
+OST_AdaptivePoints_Lines
+-2000903
+
+
+平面
+OST_AdaptivePoints_Planes
+-2000902
+
+
+点
+OST_AdaptivePoints_Points
+-2000901
+
+
+自适应点
+OST_AdaptivePoints
+-2000900
+
+
+Unknown
+OST_CeilingOpening
+-2000899
+
+
+Unknown
+OST_FloorOpening
+-2000898
+
+
+Unknown
+OST_RoofOpening
+-2000897
+
+
+Unknown
+OST_WallRefPlanes
+-2000896
+
+
+Unknown
+OST_StructLocationLineControl
+-2000880
+
+
+Unknown
+OST_DimLockControlLeader
+-2000832
+
+
+<空间分隔>
+OST_MEPSpaceSeparationLines
+-2000831
+
+
+Unknown
+OST_AreaPolylines
+-2000830
+
+
+Unknown
+OST_RoomPolylines
+-2000829
+
+
+Unknown
+OST_InstanceDrivenLineStyle
+-2000828
+
+
+Unknown
+OST_RemovedGridSeg
+-2000827
+
+
+Unknown
+OST_IOSOpening
+-2000810
+
+
+Unknown
+OST_IOSTilePatternGrid
+-2000800
+
+
+Unknown
+OST_ControlLocal
+-2000774
+
+
+Unknown
+OST_ControlAxisZ
+-2000773
+
+
+Unknown
+OST_ControlAxisY
+-2000772
+
+
+Unknown
+OST_ControlAxisX
+-2000721
+
+
+Unknown
+OST_XRayConstrainedProfileEdge
+-2000720
+
+
+Unknown
+OST_XRayImplicitPathCurve
+-2000719
+
+
+Unknown
+OST_XRayPathPoint
+-2000718
+
+
+Unknown
+OST_XRayPathCurve
+-2000717
+
+
+Unknown
+OST_XRaySideEdge
+-2000716
+
+
+Unknown
+OST_XRayProfileEdge
+-2000715
+
+
+Unknown
+OST_ReferencePoints_HiddenLines
+-2000714
+
+
+线
+OST_ReferencePoints_Lines
+-2000713
+
+
+平面
+OST_ReferencePoints_Planes
+-2000712
+
+
+点
+OST_ReferencePoints_Points
+-2000711
+
+
+参照点
+OST_ReferencePoints
+-2000710
+
+
+材质
+OST_Materials
+-2000700
+
+
+截面填充图案
+OST_CeilingsCutPattern
+-2000617
+
+
+公共边
+OST_CeilingsDefault
+-2000616
+
+
+面层 2 [5]
+OST_CeilingsFinish2
+-2000615
+
+
+面层 1 [4]
+OST_CeilingsFinish1
+-2000614
+
+
+衬底 [2]
+OST_CeilingsSubstrate
+-2000613
+
+
+保温层/空气层 [3]
+OST_CeilingsInsulation
+-2000612
+
+
+结构 [1]
+OST_CeilingsStructure
+-2000611
+
+
+涂膜层
+OST_CeilingsMembrane
+-2000610
+
+
+内部边缘
+OST_FloorsInteriorEdges
+-2000609
+
+
+截面填充图案
+OST_FloorsCutPattern
+-2000608
+
+
+隐藏线
+OST_HiddenFloorLines
+-2000607
+
+
+公共边
+OST_FloorsDefault
+-2000606
+
+
+面层 2 [5]
+OST_FloorsFinish2
+-2000605
+
+
+面层 1 [4]
+OST_FloorsFinish1
+-2000604
+
+
+衬底 [2]
+OST_FloorsSubstrate
+-2000603
+
+
+保温层/空气层 [3]
+OST_FloorsInsulation
+-2000602
+
+
+结构 [1]
+OST_FloorsStructure
+-2000601
+
+
+涂膜层
+OST_FloorsMembrane
+-2000600
+
+
+内部边缘
+OST_RoofsInteriorEdges
+-2000598
+
+
+截面填充图案
+OST_RoofsCutPattern
+-2000597
+
+
+公共边
+OST_RoofsDefault
+-2000596
+
+
+面层 2 [5]
+OST_RoofsFinish2
+-2000595
+
+
+面层 1 [4]
+OST_RoofsFinish1
+-2000594
+
+
+衬底 [2]
+OST_RoofsSubstrate
+-2000593
+
+
+保温层/空气层 [3]
+OST_RoofsInsulation
+-2000592
+
+
+结构 [1]
+OST_RoofsStructure
+-2000591
+
+
+涂膜层
+OST_RoofsMembrane
+-2000590
+
+
+截面填充图案
+OST_WallsCutPattern
+-2000588
+
+
+隐藏线
+OST_HiddenWallLines
+-2000587
+
+
+公共边
+OST_WallsDefault
+-2000586
+
+
+面层 2 [5]
+OST_WallsFinish2
+-2000585
+
+
+面层 1 [4]
+OST_WallsFinish1
+-2000584
+
+
+衬底 [2]
+OST_WallsSubstrate
+-2000583
+
+
+保温层/空气层 [3]
+OST_WallsInsulation
+-2000582
+
+
+结构 [1]
+OST_WallsStructure
+-2000581
+
+
+涂膜层
+OST_WallsMembrane
+-2000580
+
+
+Unknown
+OST_PreviewLegendComponents
+-2000576
+
+
+Unknown
+OST_LegendComponents
+-2000575
+
+
+明细表
+OST_Schedules
+-2000573
+
+
+明细表图形
+OST_ScheduleGraphics
+-2000570
+
+
+光栅图像
+OST_RasterImages
+-2000560
+
+
+Unknown
+OST_ColorFillSchema
+-2000552
+
+
+颜色填充
+OST_RoomColorFill
+-2000551
+
+
+颜色填充图例
+OST_ColorFillLegends
+-2000550
+
+
+注释裁剪边界
+OST_AnnotationCropSpecial
+-2000549
+
+
+裁剪边界
+OST_CropBoundarySpecial
+-2000548
+
+
+注释裁剪边界
+OST_AnnotationCrop
+-2000547
+
+
+Unknown
+OST_FloorsAnalyticalGeometry
+-2000546
+
+
+Unknown
+OST_WallsAnalyticalGeometry
+-2000545
+
+
+详图索引引线
+OST_CalloutLeaderLine
+-2000544
+
+
+表面填充图案
+OST_CeilingsSurfacePattern
+-2000543
+
+
+表面填充图案
+OST_RoofsSurfacePattern
+-2000542
+
+
+表面填充图案
+OST_FloorsSurfacePattern
+-2000541
+
+
+表面填充图案
+OST_WallsSurfacePattern
+-2000540
+
+
+详图索引边界
+OST_CalloutBoundary
+-2000539
+
+
+详图索引标头
+OST_CalloutHeads
+-2000538
+
+
+详图索引
+OST_Callouts
+-2000537
+
+
+裁剪边界
+OST_CropBoundary
+-2000536
+
+
+立面
+OST_Elev
+-2000535
+
+
+Unknown
+OST_AxisZ
+-2000533
+
+
+Unknown
+OST_AxisY
+-2000532
+
+
+Unknown
+OST_AxisX
+-2000531
+
+
+参照平面
+OST_CLines
+-2000530
+
+
+Unknown
+OST_Lights
+-2000520
+
+
+视图标题
+OST_ViewportLabel
+-2000515
+
+
+视口
+OST_Viewports
+-2000510
+
+
+相机
+OST_Camera_Lines
+-2000501
+
+
+Unknown
+OST_Cameras
+-2000500
+
+
+空间标记
+OST_MEPSpaceTags
+-2000485
+
+
+房间标记
+OST_RoomTags
+-2000480
+
+
+门标记
+OST_DoorTags
+-2000460
+
+
+窗标记
+OST_WindowTags
+-2000450
+
+
+宽线
+OST_SectionHeadWideLines
+-2000404
+
+
+中粗线
+OST_SectionHeadMediumLines
+-2000403
+
+
+细线
+OST_SectionHeadThinLines
+-2000401
+
+
+剖面标头
+OST_SectionHeads
+-2000400
+
+
+等高线标签
+OST_ContourLabels
+-2000350
+
+
+Unknown
+OST_CurtaSystemFaceManager
+-2000341
+
+
+幕墙系统
+OST_CurtaSystem
+-2000340
+
+
+Unknown
+OST_AreaReport_Arc_Minus
+-2000328
+
+
+Unknown
+OST_AreaReport_Arc_Plus
+-2000327
+
+
+Unknown
+OST_AreaReport_Boundary
+-2000326
+
+
+Unknown
+OST_AreaReport_Triangle
+-2000325
+
+
+幕墙系统网格
+OST_CurtainGridsCurtaSystem
+-2000323
+
+
+Unknown
+OST_CurtainGridsSystem
+-2000322
+
+
+幕墙网格
+OST_CurtainGridsWall
+-2000321
+
+
+幕墙屋顶网格
+OST_CurtainGridsRoof
+-2000320
+
+
+Unknown
+OST_HostFinHF
+-2000315
+
+
+Unknown
+OST_HostFinWall
+-2000314
+
+
+Unknown
+OST_HostFinCeiling
+-2000313
+
+
+Unknown
+OST_HostFinRoof
+-2000312
+
+
+Unknown
+OST_HostFinFloor
+-2000311
+
+
+Unknown
+OST_HostFin
+-2000310
+
+
+分析显示样式
+OST_AnalysisDisplayStyle
+-2000304
+
+
+分析结果
+OST_AnalysisResults
+-2000303
+
+
+渲染区域
+OST_RenderRegions
+-2000302
+
+
+剖面框
+OST_SectionBox
+-2000301
+
+
+文字注释
+OST_TextNotes
+-2000300
+
+
+Unknown
+OST_Divisions
+-2000291
+
+
+Unknown
+OST_Catalogs
+-2000290
+
+
+Unknown
+OST_DirectionEdgeLines
+-2000289
+
+
+<中心线>
+OST_CenterLines
+-2000288
+
+
+<超出>
+OST_LinesBeyond
+-2000287
+
+
+<隐藏>
+OST_HiddenLines
+-2000286
+
+
+<已拆除>
+OST_DemolishedLines
+-2000285
+
+
+<架空线>
+OST_OverheadLines
+-2000284
+
+
+宽线
+OST_TitleBlockWideLines
+-2000283
+
+
+中粗线
+OST_TitleBlockMediumLines
+-2000282
+
+
+细线
+OST_TitleBlockThinLines
+-2000281
+
+
+图框
+OST_TitleBlocks
+-2000280
+
+
+视图
+OST_Views
+-2000279
+
+
+Unknown
+OST_Viewers
+-2000278
+
+
+隐藏线
+OST_PartHiddenLines
+-2000271
+
+
+零件标记
+OST_PartTags
+-2000270
+
+
+组成部分
+OST_Parts
+-2000269
+
+
+部件标记
+OST_AssemblyTags
+-2000268
+
+
+部件
+OST_Assemblies
+-2000267
+
+
+屋顶标记
+OST_RoofTags
+-2000266
+
+
+高程点坡度
+OST_SpotSlopes
+-2000265
+
+
+高程点坐标
+OST_SpotCoordinates
+-2000264
+
+
+高程点
+OST_SpotElevations
+-2000263
+
+
+Unknown
+OST_Constraints
+-2000262
+
+
+自动绘制尺寸标注
+OST_WeakDims
+-2000261
+
+
+尺寸标注
+OST_Dimensions
+-2000260
+
+
+标高
+OST_Levels
+-2000240
+
+
+位移路径
+OST_DisplacementPath
+-2000223
+
+
+Unknown
+OST_DisplacementElements
+-2000222
+
+
+多段轴网
+OST_GridChains
+-2000221
+
+
+轴网
+OST_Grids
+-2000220
+
+
+断开剖面线
+OST_BrokenSectionLine
+-2000202
+
+
+剖面线
+OST_SectionLine
+-2000201
+
+
+剖面
+OST_Sections
+-2000200
+
+
+视图参照
+OST_ReferenceViewer
+-2000198
+
+
+视图参照
+OST_ReferenceViewerSymbol
+-2000197
+
+
+在族中导入
+OST_ImportObjectStyles
+-2000196
+
+
+Unknown
+OST_ModelText
+-2000195
+
+
+遮罩区域
+OST_MaskingRegion
+-2000194
+
+
+拼接线
+OST_Matchline
+-2000193
+
+
+Unknown
+OST_FaceSplitter
+-2000192
+
+
+平面区域
+OST_PlanRegion
+-2000191
+
+
+填充区域
+OST_FilledRegion
+-2000190
+
+
+Unknown
+OST_MassingProjectionOutlines
+-2000187
+
+
+Unknown
+OST_MassingCutOutlines
+-2000186
+
+
+Unknown
+OST_Massing
+-2000185
+
+
+Unknown
+OST_Reveals
+-2000182
+
+
+墙饰条
+OST_Cornices
+-2000181
+
+
+坡道
+OST_Ramps
+-2000180
+
+
+Unknown
+OST_RailingBalusterRailCut
+-2000177
+
+
+Unknown
+OST_RailingBalusterRail
+-2000176
+
+
+Unknown
+OST_Railings
+-2000175
+
+
+幕墙网格
+OST_CurtainGrids
+-2000173
+
+
+Unknown
+OST_CurtainWallMullionsCut
+-2000172
+
+
+幕墙竖梃
+OST_CurtainWallMullions
+-2000171
+
+
+幕墙嵌板
+OST_CurtainWallPanels
+-2000170
+
+
+Unknown
+OST_AreaReference
+-2000169
+
+
+Unknown
+OST_AreaInteriorFill
+-2000168
+
+
+Unknown
+OST_RoomReference
+-2000167
+
+
+Unknown
+OST_RoomInteriorFill
+-2000166
+
+
+颜色填充
+OST_AreaColorFill
+-2000165
+
+
+参照
+OST_AreaReferenceVisibility
+-2000164
+
+
+内部填充
+OST_AreaInteriorFillVisibility
+-2000163
+
+
+参照
+OST_RoomReferenceVisibility
+-2000162
+
+
+内部填充
+OST_RoomInteriorFillVisibility
+-2000161
+
+
+房间
+OST_Rooms
+-2000160
+
+
+常规模型
+OST_GenericModel
+-2000151
+
+
+常规注释
+OST_GenericAnnotation
+-2000150
+
+
+Unknown
+OST_Fixtures
+-2000140
+
+
+栏杆扶手标记
+OST_StairsRailingTags
+-2000133
+
+
+<高于> 栏杆扶手截面线
+OST_StairsRailingAboveCut
+-2000132
+
+
+向下箭头
+OST_StairsDownArrows
+-2000131
+
+
+向上箭头
+OST_StairsUpArrows
+-2000130
+
+
+文字(向下)
+OST_StairsDownText
+-2000129
+
+
+扶栏
+OST_StairsRailingRail
+-2000128
+
+
+栏杆
+OST_StairsRailingBaluster
+-2000127
+
+
+栏杆扶手
+OST_StairsRailing
+-2000126
+
+
+文字(向上)
+OST_StairsUpText
+-2000125
+
+
+<高于> 支撑
+OST_StairsSupportsAboveCut
+-2000124
+
+
+支撑
+OST_StairsStringerCarriage
+-2000123
+
+
+Unknown
+OST_StairsAboveCut_ToBeDeprecated
+-2000122
+
+
+Unknown
+OST_StairsIncomplete_Deprecated
+-2000121
+
+
+楼梯
+OST_Stairs
+-2000120
+
+
+Unknown
+OST_IOSNavWheelPivotBall
+-2000117
+
+
+Unknown
+OST_IOSRoomComputationHeight
+-2000116
+
+
+Unknown
+OST_IOSRoomUpperLowerLines
+-2000115
+
+
+Unknown
+OST_IOSDragBoxInverted
+-2000114
+
+
+Unknown
+OST_IOSDragBox
+-2000113
+
+
+Unknown
+OST_Phases
+-2000112
+
+
+Unknown
+OST_IOS_GeoSite
+-2000111
+
+
+Unknown
+OST_IOS_GeoLocations
+-2000110
+
+
+Unknown
+OST_IOSFabricReinSpanSymbolCtrl
+-2000109
+
+
+导向轴网
+OST_GuideGrid
+-2000107
+
+
+Unknown
+OST_EPS_Future
+-2000106
+
+
+Unknown
+OST_EPS_Temporary
+-2000105
+
+
+Unknown
+OST_EPS_New
+-2000104
+
+
+Unknown
+OST_EPS_Demolished
+-2000103
+
+
+Unknown
+OST_EPS_Existing
+-2000102
+
+
+Unknown
+OST_IOSMeasureLineScreenSize
+-2000101
+
+
+柱
+OST_Columns
+-2000100
+
+
+Unknown
+OST_IOSRebarSystemSpanSymbolCtrl
+-2000099
+
+
+Unknown
+OST_IOSRoomTagToRoomLines
+-2000098
+
+
+Unknown
+OST_IOSAttachedDetailGroups
+-2000097
+
+
+Unknown
+OST_IOSDetailGroups
+-2000096
+
+
+模型组
+OST_IOSModelGroups
+-2000095
+
+
+Unknown
+OST_IOSSuspendedSketch
+-2000094
+
+
+Unknown
+OST_IOSWallCoreBoundary
+-2000093
+
+
+Unknown
+OST_IOSMeasureLine
+-2000092
+
+
+Unknown
+OST_IOSArrays
+-2000091
+
+
+Unknown
+OST_Curtain_Systems
+-2000090
+
+
+Unknown
+OST_IOSBBoxScreenSize
+-2000089
+
+
+Unknown
+OST_IOSSlabShapeEditorPointInterior
+-2000088
+
+
+Unknown
+OST_IOSSlabShapeEditorPointBoundary
+-2000087
+
+
+Unknown
+OST_IOSSlabShapeEditorBoundary
+-2000086
+
+
+Unknown
+OST_IOSSlabShapeEditorAutoCrease
+-2000085
+
+
+Unknown
+OST_IOSSlabShapeEditorExplitCrease
+-2000084
+
+
+参照线
+OST_ReferenceLines
+-2000083
+
+
+Unknown
+OST_IOSNotSilhouette
+-2000082
+
+
+Unknown
+OST_FillPatterns
+-2000081
+
+
+家具
+OST_Furniture
+-2000080
+
+
+<面积边界>
+OST_AreaSchemeLines
+-2000079
+
+
+线
+OST_GenericLines
+-2000078
+
+
+隔热层线
+OST_InsulationLines
+-2000077
+
+
+Unknown
+OST_CloudLines
+-2000076
+
+
+Unknown
+OST_IOSRoomPerimeterLines
+-2000075
+
+
+Unknown
+OST_IOSCuttingGeometry
+-2000074
+
+
+Unknown
+OST_IOSCrashGraphics
+-2000073
+
+
+Unknown
+OST_IOSGroups
+-2000072
+
+
+Unknown
+OST_IOSGhost
+-2000071
+
+
+Unknown
+OST_StairsSketchLandingCenterLines
+-2000070
+
+
+Unknown
+OST_StairsSketchRunLines
+-2000069
+
+
+Unknown
+OST_StairsSketchRiserLines
+-2000068
+
+
+Unknown
+OST_StairsSketchBoundaryLines
+-2000067
+
+
+<房间分隔>
+OST_RoomSeparationLines
+-2000066
+
+
+旋转轴
+OST_AxisOfRotation
+-2000065
+
+
+Unknown
+OST_InvisibleLines
+-2000064
+
+
+Unknown
+OST_IOSThinPixel_DashDot
+-2000063
+
+
+Unknown
+OST_IOSThinPixel_Dash
+-2000062
+
+
+Unknown
+OST_IOSThinPixel_Dot
+-2000061
+
+
+Unknown
+OST_Extrusions
+-2000060
+
+
+Unknown
+OST_IOS
+-2000059
+
+
+Unknown
+OST_CutOutlines
+-2000058
+
+
+Unknown
+OST_IOSThinPixel
+-2000057
+
+
+Unknown
+OST_IOSFlipControl
+-2000056
+
+
+Unknown
+OST_IOSSketchGrid
+-2000055
+
+
+Unknown
+OST_IOSSuspendedSketch_obsolete
+-2000054
+
+
+Unknown
+OST_IOSFreeSnapLine
+-2000053
+
+
+Unknown
+OST_IOSDatumPlane
+-2000052
+
+
+线
+OST_Lines
+-2000051
+
+
+Unknown
+OST_IOSConstructionLine
+-2000050
+
+
+Unknown
+OST_IOSAlignmentGraphics
+-2000049
+
+
+Unknown
+OST_IOSAligningLine
+-2000048
+
+
+Unknown
+OST_IOSBackedUpElements
+-2000047
+
+
+Unknown
+OST_IOSRegeneratedElements
+-2000046
+
+
+<草图>
+OST_SketchLines
+-2000045
+
+
+宽线
+OST_CurvesWideLines
+-2000044
+
+
+中粗线
+OST_CurvesMediumLines
+-2000043
+
+
+细线
+OST_CurvesThinLines
+-2000042
+
+
+Unknown
+OST_Curves
+-2000041
+
+
+Unknown
+OST_CeilingsProjection
+-2000040
+
+
+Unknown
+OST_CeilingsCut
+-2000039
+
+
+天花板
+OST_Ceilings
+-2000038
+
+
+Unknown
+OST_RoofsProjection
+-2000037
+
+
+Unknown
+OST_RoofsCut
+-2000036
+
+
+屋顶
+OST_Roofs
+-2000035
+
+
+Unknown
+OST_FloorsProjection
+-2000034
+
+
+Unknown
+OST_FloorsCut
+-2000033
+
+
+楼板
+OST_Floors
+-2000032
+
+
+玻璃
+OST_DoorsGlassProjection
+-2000031
+
+
+Unknown
+OST_DoorsGlassCut
+-2000030
+
+
+框架/竖梃
+OST_DoorsFrameMullionProjection
+-2000029
+
+
+Unknown
+OST_DoorsFrameMullionCut
+-2000028
+
+
+洞口
+OST_DoorsOpeningProjection
+-2000027
+
+
+Unknown
+OST_DoorsOpeningCut
+-2000026
+
+
+嵌板
+OST_DoorsPanelProjection
+-2000025
+
+
+Unknown
+OST_DoorsPanelCut
+-2000024
+
+
+门
+OST_Doors
+-2000023
+
+
+洞口
+OST_WindowsOpeningProjection
+-2000022
+
+
+Unknown
+OST_WindowsOpeningCut
+-2000021
+
+
+窗台/盖板
+OST_WindowsSillHeadProjection
+-2000020
+
+
+Unknown
+OST_WindowsSillHeadCut
+-2000019
+
+
+框架/竖梃
+OST_WindowsFrameMullionProjection
+-2000018
+
+
+Unknown
+OST_WindowsFrameMullionCut
+-2000017
+
+
+玻璃
+OST_WindowsGlassProjection
+-2000016
+
+
+Unknown
+OST_WindowsGlassCut
+-2000015
+
+
+窗
+OST_Windows
+-2000014
+
+
+Unknown
+OST_WallsProjectionOutlines
+-2000013
+
+
+Unknown
+OST_WallsCutOutlines
+-2000012
+
+
+墙
+OST_Walls
+-2000011
+
+
+Unknown
+OST_IOSRegenerationFailure
+-2000010
+
+
+Unknown
+OST_ScheduleViewParamGroup
+-2000008
+
+
+Unknown
+OST_MatchSiteComponent
+-2000007
+
+
+Unknown
+OST_MatchProfile
+-2000006
+
+
+Unknown
+OST_MatchDetail
+-2000005
+
+
+Unknown
+OST_MatchAnnotation
+-2000004
+
+
+Unknown
+OST_MatchModel
+-2000003
+
+
+Unknown
+OST_MatchAll
+-2000002
+
+
+Unknown
+INVALID
+-1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
BuildInCategory枚举 - 完整
+
https://awaw.cc/post/revit-category-all/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/revit-category/index.html b/post/revit-category/index.html
new file mode 100644
index 0000000..06d23c9
--- /dev/null
+++ b/post/revit-category/index.html
@@ -0,0 +1,3956 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ BuildInCategory枚举 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Revit二次开发中经常用到BuildInCategory 过滤元素,以下是通过遍历该枚举获取的数据,其中部分类别的名称未能获取到,本文未显示Unknown 部分,完整版本见 BuildInCategory枚举 - 完整 。
+
+
+
+
+中文名称
+名称
+值
+
+
+
+分析链接
+OST_LinksAnalytical
+-2009657
+
+
+分析楼板基础标记
+OST_FoundationSlabAnalyticalTags
+-2009656
+
+
+分析条形基础标记
+OST_WallFoundationAnalyticalTags
+-2009655
+
+
+分析独立基础标记
+OST_IsolatedFoundationAnalyticalTags
+-2009654
+
+
+分析墙标记
+OST_WallAnalyticalTags
+-2009653
+
+
+分析楼层标记
+OST_FloorAnalyticalTags
+-2009652
+
+
+分析柱标记
+OST_ColumnAnalyticalTags
+-2009651
+
+
+分析支撑标记
+OST_BraceAnalyticalTags
+-2009650
+
+
+分析梁标记
+OST_BeamAnalyticalTags
+-2009649
+
+
+分析节点
+OST_AnalyticalNodes
+-2009645
+
+
+分析基础底板
+OST_FoundationSlabAnalytical
+-2009643
+
+
+分析条形基础
+OST_WallFoundationAnalytical
+-2009642
+
+
+分析独立基础
+OST_IsolatedFoundationAnalytical
+-2009641
+
+
+分析墙
+OST_WallAnalytical
+-2009640
+
+
+分析楼层
+OST_FloorAnalytical
+-2009639
+
+
+顶部线段
+OST_ColumnEndSegment
+-2009638
+
+
+基准线段
+OST_ColumnStartSegment
+-2009637
+
+
+分析柱
+OST_ColumnAnalytical
+-2009636
+
+
+末端线段
+OST_BraceEndSegment
+-2009635
+
+
+起点线段
+OST_BraceStartSegment
+-2009634
+
+
+分析支撑
+OST_BraceAnalytical
+-2009633
+
+
+末端线段
+OST_BeamEndSegment
+-2009632
+
+
+起点线段
+OST_BeamStartSegment
+-2009631
+
+
+分析梁
+OST_BeamAnalytical
+-2009630
+
+
+棍状符号
+OST_StructuralTrussStickSymbols
+-2009608
+
+
+隐藏线
+OST_MassHiddenLines
+-2009532
+
+
+隐藏线
+OST_CurtaSystemHiddenLines
+-2009531
+
+
+隐藏线
+OST_EntourageHiddenLines
+-2009529
+
+
+隐藏线
+OST_PlantingHiddenLines
+-2009528
+
+
+隐藏线
+OST_SpecialityEquipmentHiddenLines
+-2009527
+
+
+隐藏线
+OST_TopographyHiddenLines
+-2009526
+
+
+隐藏线
+OST_SiteHiddenLines
+-2009524
+
+
+隐藏线
+OST_RoadsHiddenLines
+-2009523
+
+
+隐藏线
+OST_ParkingHiddenLines
+-2009522
+
+
+隐藏线
+OST_PlumbingFixturesHiddenLines
+-2009521
+
+
+隐藏线
+OST_MechanicalEquipmentHiddenLines
+-2009520
+
+
+隐藏线
+OST_LightingFixturesHiddenLines
+-2009519
+
+
+隐藏线
+OST_FurnitureSystemsHiddenLines
+-2009518
+
+
+隐藏线
+OST_ElectricalFixturesHiddenLines
+-2009517
+
+
+隐藏线
+OST_ElectricalEquipmentHiddenLines
+-2009516
+
+
+隐藏线
+OST_CaseworkHiddenLines
+-2009515
+
+
+隐藏线
+OST_DetailComponentsHiddenLines
+-2009514
+
+
+隐藏线
+OST_ShaftOpeningHiddenLines
+-2009513
+
+
+隐藏线
+OST_GenericModelHiddenLines
+-2009512
+
+
+隐藏线
+OST_CurtainWallMullionsHiddenLines
+-2009511
+
+
+隐藏线
+OST_CurtainWallPanelsHiddenLines
+-2009510
+
+
+隐藏线
+OST_RampsHiddenLines
+-2009509
+
+
+隐藏线
+OST_StairsRailingHiddenLines
+-2009508
+
+
+隐藏线
+OST_StairsHiddenLines
+-2009507
+
+
+隐藏线
+OST_ColumnsHiddenLines
+-2009506
+
+
+隐藏线
+OST_FurnitureHiddenLines
+-2009505
+
+
+隐藏线
+OST_LinesHiddenLines
+-2009504
+
+
+隐藏线
+OST_CeilingsHiddenLines
+-2009503
+
+
+隐藏线
+OST_RoofsHiddenLines
+-2009502
+
+
+隐藏线
+OST_DoorsHiddenLines
+-2009501
+
+
+隐藏线
+OST_WindowsHiddenLines
+-2009500
+
+
+轮廓标记
+OST_StructConnectionProfilesTags
+-2009064
+
+
+孔标记
+OST_StructConnectionHoleTags
+-2009063
+
+
+隐藏线
+OST_CouplerHiddenLines
+-2009062
+
+
+结构钢筋接头标记
+OST_CouplerTags
+-2009061
+
+
+结构钢筋接头
+OST_Coupler
+-2009060
+
+
+焊接标记
+OST_StructConnectionWeldTags
+-2009059
+
+
+剪力钉标记
+OST_StructConnectionShearStudTags
+-2009058
+
+
+锚固件标记
+OST_StructConnectionAnchorTags
+-2009057
+
+
+螺栓标记
+OST_StructConnectionBoltTags
+-2009056
+
+
+板标记
+OST_StructConnectionPlateTags
+-2009055
+
+
+隐藏线
+OST_RebarHiddenLines
+-2009050
+
+
+修改器
+OST_StructConnectionModifiers
+-2009047
+
+
+焊缝
+OST_StructConnectionWelds
+-2009046
+
+
+孔
+OST_StructConnectionHoles
+-2009045
+
+
+剪力钉
+OST_StructConnectionShearStuds
+-2009044
+
+
+其他
+OST_StructConnectionOthers
+-2009042
+
+
+螺栓
+OST_StructConnectionBolts
+-2009041
+
+
+结构连接标记
+OST_StructConnectionTags
+-2009040
+
+
+锚固件
+OST_StructConnectionAnchors
+-2009039
+
+
+平板
+OST_StructConnectionPlates
+-2009038
+
+
+轮廓
+OST_StructConnectionProfiles
+-2009037
+
+
+参照
+OST_StructConnectionReference
+-2009036
+
+
+符号
+OST_StructConnectionSymbol
+-2009033
+
+
+隐藏线
+OST_StructConnectionHiddenLines
+-2009032
+
+
+结构连接
+OST_StructConnections
+-2009030
+
+
+边界
+OST_FabricAreaBoundary
+-2009029
+
+
+结构钢筋网符号
+OST_FabricReinSpanSymbol
+-2009028
+
+
+钢筋网
+OST_FabricReinforcementWire
+-2009027
+
+
+边界
+OST_FabricReinforcementBoundary
+-2009026
+
+
+钢筋集切换
+OST_RebarSetToggle
+-2009025
+
+
+结构钢筋网标记
+OST_FabricReinforcementTags
+-2009022
+
+
+结构区域钢筋标记
+OST_AreaReinTags
+-2009021
+
+
+结构钢筋标记
+OST_RebarTags
+-2009020
+
+
+<钢筋网片>
+OST_FabricAreaSketchSheetsLines
+-2009019
+
+
+<钢筋网外围>
+OST_FabricAreaSketchEnvelopeLines
+-2009018
+
+
+结构钢筋网区域
+OST_FabricAreas
+-2009017
+
+
+结构钢筋网
+OST_FabricReinforcement
+-2009016
+
+
+钢筋保护层参照
+OST_RebarCover
+-2009015
+
+
+钢筋形状
+OST_RebarShape
+-2009013
+
+
+边界
+OST_PathReinBoundary
+-2009012
+
+
+结构路径钢筋标记
+OST_PathReinTags
+-2009011
+
+
+结构路径钢筋符号
+OST_PathReinSpanSymbol
+-2009010
+
+
+结构路径钢筋
+OST_PathRein
+-2009009
+
+
+边界
+OST_AreaReinBoundary
+-2009006
+
+
+结构区域钢筋符号
+OST_AreaReinSpanSymbol
+-2009005
+
+
+结构区域钢筋
+OST_AreaRein
+-2009003
+
+
+结构钢筋
+OST_Rebar
+-2009000
+
+
+隔热层
+OST_FabricationPipeworkInsulation
+-2008221
+
+
+内衬
+OST_FabricationDuctworkLining
+-2008220
+
+
+降
+OST_FabricationContainmentDrop
+-2008219
+
+
+升
+OST_FabricationContainmentRise
+-2008218
+
+
+降
+OST_FabricationPipeworkDrop
+-2008217
+
+
+升
+OST_FabricationPipeworkRise
+-2008216
+
+
+符号
+OST_FabricationContainmentSymbology
+-2008215
+
+
+中心线
+OST_FabricationContainmentCenterLine
+-2008214
+
+
+MEP 预制保护层标记
+OST_FabricationContainmentTags
+-2008213
+
+
+MEP 预制保护层
+OST_FabricationContainment
+-2008212
+
+
+符号
+OST_FabricationPipeworkSymbology
+-2008211
+
+
+中心线
+OST_FabricationPipeworkCenterLine
+-2008210
+
+
+MEP 预制管道标记
+OST_FabricationPipeworkTags
+-2008209
+
+
+MEP 预制管道
+OST_FabricationPipework
+-2008208
+
+
+符号
+OST_FabricationDuctworkSymbology
+-2008207
+
+
+降
+OST_FabricationDuctworkDrop
+-2008206
+
+
+升
+OST_FabricationDuctworkRise
+-2008205
+
+
+MEP 预制支架标记
+OST_FabricationHangerTags
+-2008204
+
+
+MEP 预制支架
+OST_FabricationHangers
+-2008203
+
+
+隔热层
+OST_FabricationDuctworkInsulation
+-2008198
+
+
+中心线
+OST_FabricationDuctworkCenterLine
+-2008196
+
+
+MEP 预制管网标记
+OST_FabricationDuctworkTags
+-2008194
+
+
+MEP 预制管网
+OST_FabricationDuctwork
+-2008193
+
+
+着色
+OST_gbXML_Shade
+-2008187
+
+
+分析表面
+OST_AnalyticSurfaces
+-2008186
+
+
+分析空间
+OST_AnalyticSpaces
+-2008185
+
+
+空气洞口
+OST_gbXML_OpeningAir
+-2008184
+
+
+非推拉门
+OST_gbXML_NonSlidingDoor
+-2008183
+
+
+推拉门
+OST_gbXML_SlidingDoor
+-2008182
+
+
+可操作天窗
+OST_gbXML_OperableSkylight
+-2008181
+
+
+固定天窗
+OST_gbXML_FixedSkylight
+-2008180
+
+
+可操作窗口
+OST_gbXML_OperableWindow
+-2008179
+
+
+固定窗
+OST_gbXML_FixedWindow
+-2008178
+
+
+地下天花板
+OST_gbXML_UndergroundCeiling
+-2008177
+
+
+地下板
+OST_gbXML_UndergroundSlab
+-2008176
+
+
+地下墙
+OST_gbXML_UndergroundWall
+-2008175
+
+
+空气曲面
+OST_gbXML_SurfaceAir
+-2008174
+
+
+天花板
+OST_gbXML_Ceiling
+-2008173
+
+
+内部楼板
+OST_gbXML_InteriorFloor
+-2008172
+
+
+内墙
+OST_gbXML_InteriorWall
+-2008171
+
+
+平整表面上的板
+OST_gbXML_SlabOnGrade
+-2008170
+
+
+活动楼板
+OST_gbXML_RaisedFloor
+-2008169
+
+
+屋顶
+OST_gbXML_Roof
+-2008168
+
+
+外墙
+OST_gbXML_ExteriorWall
+-2008167
+
+
+管段
+OST_PipeSegments
+-2008163
+
+
+管道占位符
+OST_PlaceHolderPipes
+-2008161
+
+
+风管占位符
+OST_PlaceHolderDucts
+-2008160
+
+
+参照线
+OST_PipingSystem_Reference_Visibility
+-2008159
+
+
+参照线
+OST_DuctSystem_Reference_Visibility
+-2008157
+
+
+管道隔热层标记
+OST_PipeInsulationsTags
+-2008155
+
+
+风管内衬标记
+OST_DuctLiningsTags
+-2008154
+
+
+风管隔热层标记
+OST_DuctInsulationsTags
+-2008153
+
+
+电气备件/空间电路
+OST_ElectricalInternalCircuits
+-2008152
+
+
+配电盘明细表图形
+OST_PanelScheduleGraphics
+-2008151
+
+
+电缆桥架管路
+OST_CableTrayRun
+-2008150
+
+
+线管管路
+OST_ConduitRun
+-2008149
+
+
+中心线
+OST_ConduitFittingCenterLine
+-2008141
+
+
+中心线
+OST_CableTrayFittingCenterLine
+-2008140
+
+
+中心线
+OST_ConduitCenterLine
+-2008139
+
+
+降
+OST_ConduitDrop
+-2008138
+
+
+升
+OST_ConduitRiseDrop
+-2008137
+
+
+中心线
+OST_CableTrayCenterLine
+-2008136
+
+
+降
+OST_CableTrayDrop
+-2008135
+
+
+升
+OST_CableTrayRiseDrop
+-2008134
+
+
+线管标记
+OST_ConduitTags
+-2008133
+
+
+线管
+OST_Conduit
+-2008132
+
+
+电缆桥架标记
+OST_CableTrayTags
+-2008131
+
+
+电缆桥架
+OST_CableTray
+-2008130
+
+
+线管配件标记
+OST_ConduitFittingTags
+-2008129
+
+
+线管配件
+OST_ConduitFitting
+-2008128
+
+
+电缆桥架配件标记
+OST_CableTrayFittingTags
+-2008127
+
+
+电缆桥架配件
+OST_CableTrayFitting
+-2008126
+
+
+布管系统配置
+OST_RoutingPreferences
+-2008125
+
+
+风管内衬
+OST_DuctLinings
+-2008124
+
+
+风管隔热层
+OST_DuctInsulations
+-2008123
+
+
+管道隔热层
+OST_PipeInsulations
+-2008122
+
+
+参照线
+OST_HVAC_Zones_Reference_Visibility
+-2008118
+
+
+内部填充
+OST_HVAC_Zones_InteriorFill_Visibility
+-2008117
+
+
+颜色填充
+OST_HVAC_Zones_ColorFill
+-2008116
+
+
+分区标记
+OST_ZoneTags
+-2008115
+
+
+边界
+OST_HVAC_Zones_Boundary
+-2008108
+
+
+HVAC 区
+OST_HVAC_Zones
+-2008107
+
+
+开关系统
+OST_SwitchSystem
+-2008101
+
+
+喷头标记
+OST_SprinklerTags
+-2008100
+
+
+喷头
+OST_Sprinklers
+-2008099
+
+
+洞口
+OST_GbXML_Opening
+-2008095
+
+
+地下
+OST_GbXML_SType_Underground
+-2008094
+
+
+着色
+OST_GbXML_SType_Shade
+-2008093
+
+
+外部
+OST_GbXML_SType_Exterior
+-2008092
+
+
+内部
+OST_GbXML_SType_Interior
+-2008091
+
+
+分析表面
+OST_GbXMLFaces
+-2008090
+
+
+回路方向
+OST_WireHomeRunArrows
+-2008089
+
+
+灯具标记
+OST_LightingDeviceTags
+-2008088
+
+
+灯具
+OST_LightingDevices
+-2008087
+
+
+火警设备标记
+OST_FireAlarmDeviceTags
+-2008086
+
+
+火警设备
+OST_FireAlarmDevices
+-2008085
+
+
+数据设备标记
+OST_DataDeviceTags
+-2008084
+
+
+数据设备
+OST_DataDevices
+-2008083
+
+
+通讯设备标记
+OST_CommunicationDeviceTags
+-2008082
+
+
+通讯设备
+OST_CommunicationDevices
+-2008081
+
+
+安全设备标记
+OST_SecurityDeviceTags
+-2008080
+
+
+安全设备
+OST_SecurityDevices
+-2008079
+
+
+护理呼叫设备标记
+OST_NurseCallDeviceTags
+-2008078
+
+
+护理呼叫设备
+OST_NurseCallDevices
+-2008077
+
+
+电话设备标记
+OST_TelephoneDeviceTags
+-2008076
+
+
+电话设备
+OST_TelephoneDevices
+-2008075
+
+
+导线记号
+OST_WireTickMarks
+-2008074
+
+
+中心线
+OST_PipeFittingCenterLine
+-2008072
+
+
+降
+OST_PipeCurvesDrop
+-2008069
+
+
+中心线
+OST_DuctFittingCenterLine
+-2008066
+
+
+降
+OST_DuctCurvesDrop
+-2008062
+
+
+风管管件标记
+OST_DuctFittingTags
+-2008061
+
+
+管件标记
+OST_PipeFittingTags
+-2008060
+
+
+管道颜色填充
+OST_PipeColorFills
+-2008059
+
+
+管道颜色填充图例
+OST_PipeColorFillLegends
+-2008058
+
+
+导线标记
+OST_WireTags
+-2008057
+
+
+管道附件标记
+OST_PipeAccessoryTags
+-2008056
+
+
+管道附件
+OST_PipeAccessory
+-2008055
+
+
+升
+OST_PipeCurvesRiseDrop
+-2008054
+
+
+填充图案
+OST_FlexPipeCurvesPattern
+-2008053
+
+
+中心线
+OST_FlexPipeCurvesCenterLine
+-2008051
+
+
+软管
+OST_FlexPipeCurves
+-2008050
+
+
+管件
+OST_PipeFitting
+-2008049
+
+
+软管标记
+OST_FlexPipeTags
+-2008048
+
+
+管道标记
+OST_PipeTags
+-2008047
+
+
+中心线
+OST_PipeCurvesCenterLine
+-2008045
+
+
+管道
+OST_PipeCurves
+-2008044
+
+
+管道系统
+OST_PipingSystem
+-2008043
+
+
+导线
+OST_Wire
+-2008039
+
+
+电路
+OST_ElectricalCircuit
+-2008037
+
+
+升
+OST_DuctCurvesRiseDrop
+-2008036
+
+
+填充图案
+OST_FlexDuctCurvesPattern
+-2008023
+
+
+中心线
+OST_FlexDuctCurvesCenterLine
+-2008021
+
+
+软风管
+OST_FlexDuctCurves
+-2008020
+
+
+风管附件标记
+OST_DuctAccessoryTags
+-2008017
+
+
+风管附件
+OST_DuctAccessory
+-2008016
+
+
+风管系统
+OST_DuctSystem
+-2008015
+
+
+风道末端标记
+OST_DuctTerminalTags
+-2008014
+
+
+风道末端
+OST_DuctTerminal
+-2008013
+
+
+风管管件
+OST_DuctFitting
+-2008010
+
+
+风管颜色填充
+OST_DuctColorFills
+-2008005
+
+
+软风管标记
+OST_FlexDuctTags
+-2008004
+
+
+风管标记
+OST_DuctTags
+-2008003
+
+
+中心线
+OST_DuctCurvesCenterLine
+-2008001
+
+
+风管
+OST_DuctCurves
+-2008000
+
+
+风管颜色填充图例
+OST_DuctColorFillLegends
+-2007004
+
+
+桥梁支座
+OST_BridgeBearings
+-2006138
+
+
+桥梁大梁
+OST_BridgeGirders
+-2006137
+
+
+桥梁基础
+OST_BridgeFoundations
+-2006136
+
+
+桥面
+OST_BridgeDecks
+-2006135
+
+
+桥拱
+OST_BridgeArches
+-2006134
+
+
+桥梁缆索
+OST_BridgeCables
+-2006133
+
+
+桥塔
+OST_BridgeTowers
+-2006132
+
+
+桥墩
+OST_BridgePiers
+-2006131
+
+
+桥台
+OST_BridgeAbutments
+-2006130
+
+
+平面视图中的支撑符号
+OST_StructuralBracePlanReps
+-2006110
+
+
+连接符号
+OST_StructConnectionSymbols
+-2006100
+
+
+结构注释
+OST_StructuralAnnotations
+-2006090
+
+
+云线批注标记
+OST_RevisionCloudTags
+-2006080
+
+
+云线批注
+OST_RevisionClouds
+-2006060
+
+
+立面标记
+OST_ElevationMarks
+-2006045
+
+
+轴网标头
+OST_GridHeads
+-2006040
+
+
+标高标头
+OST_LevelHeads
+-2006020
+
+
+范围框
+OST_VolumeOfInterest
+-2006000
+
+
+边界条件
+OST_BoundaryConditions
+-2005301
+
+
+内部面荷载标记
+OST_InternalAreaLoadTags
+-2005255
+
+
+内部线荷载标记
+OST_InternalLineLoadTags
+-2005254
+
+
+内部点荷载标记
+OST_InternalPointLoadTags
+-2005253
+
+
+面荷载标记
+OST_AreaLoadTags
+-2005252
+
+
+线荷载标记
+OST_LineLoadTags
+-2005251
+
+
+点荷载标记
+OST_PointLoadTags
+-2005250
+
+
+地震荷载
+OST_LoadCasesSeismic
+-2005218
+
+
+温度荷载
+OST_LoadCasesTemperature
+-2005217
+
+
+偶然荷载
+OST_LoadCasesAccidental
+-2005216
+
+
+屋顶活荷载
+OST_LoadCasesRoofLive
+-2005215
+
+
+雪荷载
+OST_LoadCasesSnow
+-2005214
+
+
+风荷载
+OST_LoadCasesWind
+-2005213
+
+
+活荷载
+OST_LoadCasesLive
+-2005212
+
+
+恒荷载
+OST_LoadCasesDead
+-2005211
+
+
+结构荷载工况
+OST_LoadCases
+-2005210
+
+
+内部面荷载
+OST_InternalAreaLoads
+-2005207
+
+
+内部线荷载
+OST_InternalLineLoads
+-2005206
+
+
+内部点荷载
+OST_InternalPointLoads
+-2005205
+
+
+结构内部荷载
+OST_InternalLoads
+-2005204
+
+
+面荷载
+OST_AreaLoads
+-2005203
+
+
+线荷载
+OST_LineLoads
+-2005202
+
+
+点荷载
+OST_PointLoads
+-2005201
+
+
+结构荷载
+OST_Loads
+-2005200
+
+
+结构梁系统标记
+OST_BeamSystemTags
+-2005130
+
+
+基础跨方向符号
+OST_FootingSpanDirectionSymbol
+-2005111
+
+
+跨方向符号
+OST_SpanDirectionSymbol
+-2005110
+
+
+高程点符号
+OST_SpotElevSymbols
+-2005100
+
+
+结构桁架标记
+OST_TrussTags
+-2005030
+
+
+注释记号标记
+OST_KeynoteTags
+-2005029
+
+
+详图项目标记
+OST_DetailComponentTags
+-2005028
+
+
+材质标记
+OST_MaterialTags
+-2005027
+
+
+楼板标记
+OST_FloorTags
+-2005026
+
+
+幕墙系统标记
+OST_CurtaSystemTags
+-2005025
+
+
+楼梯标记
+OST_StairsTags
+-2005023
+
+
+多类别标记
+OST_MultiCategoryTags
+-2005022
+
+
+植物标记
+OST_PlantingTags
+-2005021
+
+
+面积标记
+OST_AreaTags
+-2005020
+
+
+结构基础标记
+OST_StructuralFoundationTags
+-2005019
+
+
+结构柱标记
+OST_StructuralColumnTags
+-2005018
+
+
+停车场标记
+OST_ParkingTags
+-2005017
+
+
+场地标记
+OST_SiteTags
+-2005016
+
+
+结构框架标记
+OST_StructuralFramingTags
+-2005015
+
+
+专用设备标记
+OST_SpecialityEquipmentTags
+-2005014
+
+
+常规模型标记
+OST_GenericModelTags
+-2005013
+
+
+幕墙嵌板标记
+OST_CurtainWallPanelTags
+-2005012
+
+
+墙标记
+OST_WallTags
+-2005011
+
+
+卫浴装置标记
+OST_PlumbingFixtureTags
+-2005010
+
+
+机电设备标记
+OST_MechanicalEquipmentTags
+-2005009
+
+
+照明设备标记
+OST_LightingFixtureTags
+-2005008
+
+
+家具系统标记
+OST_FurnitureSystemTags
+-2005007
+
+
+家具标记
+OST_FurnitureTags
+-2005006
+
+
+电气装置标记
+OST_ElectricalFixtureTags
+-2005004
+
+
+电气设备标记
+OST_ElectricalEquipmentTags
+-2005003
+
+
+天花板标记
+OST_CeilingTags
+-2005002
+
+
+橱柜标记
+OST_CaseworkTags
+-2005001
+
+
+颜色填充
+OST_MEPSpaceColorFill
+-2003605
+
+
+参照
+OST_MEPSpaceReferenceVisibility
+-2003602
+
+
+内墙
+OST_MEPSpaceInteriorFillVisibility
+-2003601
+
+
+空间
+OST_MEPSpaces
+-2003600
+
+
+体量着色
+OST_MassShade
+-2003418
+
+
+体量洞口
+OST_MassOpening
+-2003417
+
+
+体量天窗
+OST_MassSkylights
+-2003416
+
+
+体量玻璃
+OST_MassGlazing
+-2003415
+
+
+体量屋顶
+OST_MassRoof
+-2003414
+
+
+体量外墙
+OST_MassExteriorWall
+-2003413
+
+
+体量内墙
+OST_MassInteriorWall
+-2003412
+
+
+体量分区
+OST_MassZone
+-2003411
+
+
+体量楼层标记
+OST_MassAreaFaceTags
+-2003410
+
+
+体量标记
+OST_MassTags
+-2003405
+
+
+形式
+OST_MassForm
+-2003404
+
+
+体量楼层
+OST_MassFloor
+-2003403
+
+
+体量
+OST_Mass
+-2003400
+
+
+图案填充
+OST_DividedSurface_PatternFill
+-2003327
+
+
+填充图案线
+OST_DividedSurface_PatternLines
+-2003326
+
+
+网格线
+OST_DividedSurface_Gridlines
+-2003325
+
+
+节点
+OST_DividedSurface_Nodes
+-2003324
+
+
+向下箭头
+OST_RampsDownArrow
+-2003308
+
+
+向上箭头
+OST_RampsUpArrow
+-2003307
+
+
+文字(向下)
+OST_RampsDownText
+-2003306
+
+
+文字(向上)
+OST_RampsUpText
+-2003305
+
+
+超出截面线的梯边梁
+OST_RampsStringerAboveCut
+-2003304
+
+
+梯边梁
+OST_RampsStringer
+-2003303
+
+
+坡道超出截面线
+OST_RampsAboveCut
+-2003302
+
+
+面积
+OST_Areas
+-2003200
+
+
+项目信息
+OST_ProjectInformation
+-2003101
+
+
+图纸
+OST_Sheets
+-2003100
+
+
+详图项目
+OST_DetailComponents
+-2002000
+
+
+屋檐底板
+OST_RoofSoffit
+-2001393
+
+
+楼板边缘
+OST_EdgeSlab
+-2001392
+
+
+檐沟
+OST_Gutter
+-2001391
+
+
+封檐板
+OST_Fascia
+-2001390
+
+
+环境
+OST_Entourage
+-2001370
+
+
+植物
+OST_Planting
+-2001360
+
+
+隐藏线
+OST_StructuralStiffenerHiddenLines
+-2001358
+
+
+定位线
+OST_StructuralColumnLocationLine
+-2001357
+
+
+定位线
+OST_StructuralFramingLocationLine
+-2001356
+
+
+结构加强板标记
+OST_StructuralStiffenerTags
+-2001355
+
+
+结构加强板
+OST_StructuralStiffener
+-2001354
+
+
+RVT 链接
+OST_RvtLinks
+-2001352
+
+
+专用设备
+OST_SpecialityEquipment
+-2001350
+
+
+刚性链接
+OST_ColumnAnalyticalRigidLinks
+-2001344
+
+
+次等高线
+OST_SecondaryTopographyContours
+-2001343
+
+
+主等高线
+OST_TopographyContours
+-2001342
+
+
+三角形边缘
+OST_TopographySurface
+-2001341
+
+
+地形
+OST_Topography
+-2001340
+
+
+地形链接
+OST_TopographyLink
+-2001339
+
+
+结构桁架
+OST_StructuralTruss
+-2001336
+
+
+棍状符号
+OST_StructuralColumnStickSymbols
+-2001335
+
+
+隐藏线
+OST_HiddenStructuralColumnLines
+-2001334
+
+
+刚性链接
+OST_AnalyticalRigidLinks
+-2001333
+
+
+结构柱
+OST_StructuralColumns
+-2001330
+
+
+隐藏线
+OST_HiddenStructuralFramingLines
+-2001329
+
+
+结构梁系统
+OST_StructuralFramingSystem
+-2001327
+
+
+结构框架
+OST_StructuralFraming
+-2001320
+
+
+隐藏线
+OST_HiddenStructuralFoundationLines
+-2001302
+
+
+结构基础
+OST_StructuralFoundation
+-2001300
+
+
+测量点
+OST_SharedBasePoint
+-2001272
+
+
+项目基点
+OST_ProjectBasePoint
+-2001271
+
+
+建筑红线线段标记
+OST_SitePropertyLineSegmentTags
+-2001269
+
+
+建筑红线线段
+OST_SitePropertyLineSegment
+-2001268
+
+
+属性标记
+OST_SitePropertyTags
+-2001267
+
+
+边界点
+OST_SitePointBoundary
+-2001266
+
+
+建筑红线
+OST_SiteProperty
+-2001265
+
+
+建筑地坪
+OST_BuildingPad
+-2001263
+
+
+内部点
+OST_SitePoint
+-2001262
+
+
+场地
+OST_Site
+-2001260
+
+
+道路
+OST_Roads
+-2001220
+
+
+停车场
+OST_Parking
+-2001180
+
+
+卫浴装置
+OST_PlumbingFixtures
+-2001160
+
+
+机械设备
+OST_MechanicalEquipment
+-2001140
+
+
+光源
+OST_LightingFixtureSource
+-2001121
+
+
+照明设备
+OST_LightingFixtures
+-2001120
+
+
+家具系统
+OST_FurnitureSystems
+-2001100
+
+
+电气装置
+OST_ElectricalFixtures
+-2001060
+
+
+电气设备
+OST_ElectricalEquipment
+-2001040
+
+
+橱柜
+OST_Casework
+-2001000
+
+
+竖井洞口
+OST_ShaftOpening
+-2000996
+
+
+水力分离符号
+OST_PipeHydronicSeparationSymbols
+-2000988
+
+
+机械设备集边界线
+OST_MechanicalEquipmentSetBoundaryLines
+-2000987
+
+
+机械设备集标记
+OST_MechanicalEquipmentSetTags
+-2000986
+
+
+机械设备集
+OST_MechanicalEquipmentSet
+-2000985
+
+
+连接线符号
+OST_AnalyticalPipeConnectionLineSymbol
+-2000984
+
+
+分析管道连接
+OST_AnalyticalPipeConnections
+-2000983
+
+
+局部坐标系
+OST_FndSlabLocalCoordSys
+-2000976
+
+
+局部坐标系
+OST_FloorLocalCoordSys
+-2000975
+
+
+局部坐标系
+OST_WallLocalCoordSys
+-2000974
+
+
+局部坐标系
+OST_BraceLocalCoordSys
+-2000973
+
+
+局部坐标系
+OST_ColumnLocalCoordSys
+-2000972
+
+
+局部坐标系
+OST_BeamLocalCoordSys
+-2000971
+
+
+多钢筋注释
+OST_MultiReferenceAnnotations
+-2000970
+
+
+分析节点标记
+OST_NodeAnalyticalTags
+-2000956
+
+
+分析链接标记
+OST_LinkAnalyticalTags
+-2000955
+
+
+支撑
+OST_StairsSupports
+-2000952
+
+
+<高于> 扶手
+OST_RailingHandRailAboveCut
+-2000951
+
+
+<高于> 顶部扶栏
+OST_RailingTopRailAboveCut
+-2000950
+
+
+终端
+OST_RailingTermination
+-2000949
+
+
+支座
+OST_RailingSupport
+-2000948
+
+
+扶手
+OST_RailingHandRail
+-2000947
+
+
+顶部扶栏
+OST_RailingTopRail
+-2000946
+
+
+楼梯踏板/踢面数
+OST_StairsTriserNumbers
+-2000944
+
+
+楼梯支撑标记
+OST_StairsSupportTags
+-2000942
+
+
+楼梯平台标记
+OST_StairsLandingTags
+-2000941
+
+
+楼梯梯段标记
+OST_StairsRunTags
+-2000940
+
+
+<高于> 向上箭头
+OST_StairsPathsAboveCut
+-2000939
+
+
+楼梯路径
+OST_StairsPaths
+-2000938
+
+
+<高于> 踢面线
+OST_StairsRiserLinesAboveCut
+-2000937
+
+
+踢面线
+OST_StairsRiserLines
+-2000936
+
+
+<高于> 轮廓
+OST_StairsOutlinesAboveCut
+-2000935
+
+
+轮廓
+OST_StairsOutlines
+-2000934
+
+
+<高于> 楼梯前缘线
+OST_StairsNosingLinesAboveCut
+-2000933
+
+
+楼梯前缘线
+OST_StairsNosingLines
+-2000932
+
+
+<高于> 剪切标记
+OST_StairsCutMarksAboveCut
+-2000931
+
+
+剪切标记
+OST_StairsCutMarks
+-2000930
+
+
+踢面/踏板
+OST_StairsTrisers
+-2000921
+
+
+平台
+OST_StairsLandings
+-2000920
+
+
+梯段
+OST_StairsRuns
+-2000919
+
+
+线
+OST_AdaptivePoints_Lines
+-2000903
+
+
+平面
+OST_AdaptivePoints_Planes
+-2000902
+
+
+点
+OST_AdaptivePoints_Points
+-2000901
+
+
+自适应点
+OST_AdaptivePoints
+-2000900
+
+
+<空间分隔>
+OST_MEPSpaceSeparationLines
+-2000831
+
+
+线
+OST_ReferencePoints_Lines
+-2000713
+
+
+平面
+OST_ReferencePoints_Planes
+-2000712
+
+
+点
+OST_ReferencePoints_Points
+-2000711
+
+
+参照点
+OST_ReferencePoints
+-2000710
+
+
+材质
+OST_Materials
+-2000700
+
+
+截面填充图案
+OST_CeilingsCutPattern
+-2000617
+
+
+公共边
+OST_CeilingsDefault
+-2000616
+
+
+面层 2 [5]
+OST_CeilingsFinish2
+-2000615
+
+
+面层 1 [4]
+OST_CeilingsFinish1
+-2000614
+
+
+衬底 [2]
+OST_CeilingsSubstrate
+-2000613
+
+
+保温层/空气层 [3]
+OST_CeilingsInsulation
+-2000612
+
+
+结构 [1]
+OST_CeilingsStructure
+-2000611
+
+
+涂膜层
+OST_CeilingsMembrane
+-2000610
+
+
+内部边缘
+OST_FloorsInteriorEdges
+-2000609
+
+
+截面填充图案
+OST_FloorsCutPattern
+-2000608
+
+
+隐藏线
+OST_HiddenFloorLines
+-2000607
+
+
+公共边
+OST_FloorsDefault
+-2000606
+
+
+面层 2 [5]
+OST_FloorsFinish2
+-2000605
+
+
+面层 1 [4]
+OST_FloorsFinish1
+-2000604
+
+
+衬底 [2]
+OST_FloorsSubstrate
+-2000603
+
+
+保温层/空气层 [3]
+OST_FloorsInsulation
+-2000602
+
+
+结构 [1]
+OST_FloorsStructure
+-2000601
+
+
+涂膜层
+OST_FloorsMembrane
+-2000600
+
+
+内部边缘
+OST_RoofsInteriorEdges
+-2000598
+
+
+截面填充图案
+OST_RoofsCutPattern
+-2000597
+
+
+公共边
+OST_RoofsDefault
+-2000596
+
+
+面层 2 [5]
+OST_RoofsFinish2
+-2000595
+
+
+面层 1 [4]
+OST_RoofsFinish1
+-2000594
+
+
+衬底 [2]
+OST_RoofsSubstrate
+-2000593
+
+
+保温层/空气层 [3]
+OST_RoofsInsulation
+-2000592
+
+
+结构 [1]
+OST_RoofsStructure
+-2000591
+
+
+涂膜层
+OST_RoofsMembrane
+-2000590
+
+
+截面填充图案
+OST_WallsCutPattern
+-2000588
+
+
+隐藏线
+OST_HiddenWallLines
+-2000587
+
+
+公共边
+OST_WallsDefault
+-2000586
+
+
+面层 2 [5]
+OST_WallsFinish2
+-2000585
+
+
+面层 1 [4]
+OST_WallsFinish1
+-2000584
+
+
+衬底 [2]
+OST_WallsSubstrate
+-2000583
+
+
+保温层/空气层 [3]
+OST_WallsInsulation
+-2000582
+
+
+结构 [1]
+OST_WallsStructure
+-2000581
+
+
+涂膜层
+OST_WallsMembrane
+-2000580
+
+
+明细表
+OST_Schedules
+-2000573
+
+
+明细表图形
+OST_ScheduleGraphics
+-2000570
+
+
+光栅图像
+OST_RasterImages
+-2000560
+
+
+颜色填充
+OST_RoomColorFill
+-2000551
+
+
+颜色填充图例
+OST_ColorFillLegends
+-2000550
+
+
+注释裁剪边界
+OST_AnnotationCropSpecial
+-2000549
+
+
+裁剪边界
+OST_CropBoundarySpecial
+-2000548
+
+
+注释裁剪边界
+OST_AnnotationCrop
+-2000547
+
+
+详图索引引线
+OST_CalloutLeaderLine
+-2000544
+
+
+表面填充图案
+OST_CeilingsSurfacePattern
+-2000543
+
+
+表面填充图案
+OST_RoofsSurfacePattern
+-2000542
+
+
+表面填充图案
+OST_FloorsSurfacePattern
+-2000541
+
+
+表面填充图案
+OST_WallsSurfacePattern
+-2000540
+
+
+详图索引边界
+OST_CalloutBoundary
+-2000539
+
+
+详图索引标头
+OST_CalloutHeads
+-2000538
+
+
+详图索引
+OST_Callouts
+-2000537
+
+
+裁剪边界
+OST_CropBoundary
+-2000536
+
+
+立面
+OST_Elev
+-2000535
+
+
+参照平面
+OST_CLines
+-2000530
+
+
+视图标题
+OST_ViewportLabel
+-2000515
+
+
+视口
+OST_Viewports
+-2000510
+
+
+相机
+OST_Camera_Lines
+-2000501
+
+
+空间标记
+OST_MEPSpaceTags
+-2000485
+
+
+房间标记
+OST_RoomTags
+-2000480
+
+
+门标记
+OST_DoorTags
+-2000460
+
+
+窗标记
+OST_WindowTags
+-2000450
+
+
+宽线
+OST_SectionHeadWideLines
+-2000404
+
+
+中粗线
+OST_SectionHeadMediumLines
+-2000403
+
+
+细线
+OST_SectionHeadThinLines
+-2000401
+
+
+剖面标头
+OST_SectionHeads
+-2000400
+
+
+等高线标签
+OST_ContourLabels
+-2000350
+
+
+幕墙系统
+OST_CurtaSystem
+-2000340
+
+
+幕墙系统网格
+OST_CurtainGridsCurtaSystem
+-2000323
+
+
+幕墙网格
+OST_CurtainGridsWall
+-2000321
+
+
+幕墙屋顶网格
+OST_CurtainGridsRoof
+-2000320
+
+
+分析显示样式
+OST_AnalysisDisplayStyle
+-2000304
+
+
+分析结果
+OST_AnalysisResults
+-2000303
+
+
+渲染区域
+OST_RenderRegions
+-2000302
+
+
+剖面框
+OST_SectionBox
+-2000301
+
+
+文字注释
+OST_TextNotes
+-2000300
+
+
+<中心线>
+OST_CenterLines
+-2000288
+
+
+<超出>
+OST_LinesBeyond
+-2000287
+
+
+<隐藏>
+OST_HiddenLines
+-2000286
+
+
+<已拆除>
+OST_DemolishedLines
+-2000285
+
+
+<架空线>
+OST_OverheadLines
+-2000284
+
+
+宽线
+OST_TitleBlockWideLines
+-2000283
+
+
+中粗线
+OST_TitleBlockMediumLines
+-2000282
+
+
+细线
+OST_TitleBlockThinLines
+-2000281
+
+
+图框
+OST_TitleBlocks
+-2000280
+
+
+视图
+OST_Views
+-2000279
+
+
+隐藏线
+OST_PartHiddenLines
+-2000271
+
+
+零件标记
+OST_PartTags
+-2000270
+
+
+组成部分
+OST_Parts
+-2000269
+
+
+部件标记
+OST_AssemblyTags
+-2000268
+
+
+部件
+OST_Assemblies
+-2000267
+
+
+屋顶标记
+OST_RoofTags
+-2000266
+
+
+高程点坡度
+OST_SpotSlopes
+-2000265
+
+
+高程点坐标
+OST_SpotCoordinates
+-2000264
+
+
+高程点
+OST_SpotElevations
+-2000263
+
+
+自动绘制尺寸标注
+OST_WeakDims
+-2000261
+
+
+尺寸标注
+OST_Dimensions
+-2000260
+
+
+标高
+OST_Levels
+-2000240
+
+
+位移路径
+OST_DisplacementPath
+-2000223
+
+
+多段轴网
+OST_GridChains
+-2000221
+
+
+轴网
+OST_Grids
+-2000220
+
+
+断开剖面线
+OST_BrokenSectionLine
+-2000202
+
+
+剖面线
+OST_SectionLine
+-2000201
+
+
+剖面
+OST_Sections
+-2000200
+
+
+视图参照
+OST_ReferenceViewer
+-2000198
+
+
+视图参照
+OST_ReferenceViewerSymbol
+-2000197
+
+
+在族中导入
+OST_ImportObjectStyles
+-2000196
+
+
+遮罩区域
+OST_MaskingRegion
+-2000194
+
+
+拼接线
+OST_Matchline
+-2000193
+
+
+平面区域
+OST_PlanRegion
+-2000191
+
+
+填充区域
+OST_FilledRegion
+-2000190
+
+
+墙饰条
+OST_Cornices
+-2000181
+
+
+坡道
+OST_Ramps
+-2000180
+
+
+幕墙网格
+OST_CurtainGrids
+-2000173
+
+
+幕墙竖梃
+OST_CurtainWallMullions
+-2000171
+
+
+幕墙嵌板
+OST_CurtainWallPanels
+-2000170
+
+
+颜色填充
+OST_AreaColorFill
+-2000165
+
+
+参照
+OST_AreaReferenceVisibility
+-2000164
+
+
+内部填充
+OST_AreaInteriorFillVisibility
+-2000163
+
+
+参照
+OST_RoomReferenceVisibility
+-2000162
+
+
+内部填充
+OST_RoomInteriorFillVisibility
+-2000161
+
+
+房间
+OST_Rooms
+-2000160
+
+
+常规模型
+OST_GenericModel
+-2000151
+
+
+常规注释
+OST_GenericAnnotation
+-2000150
+
+
+栏杆扶手标记
+OST_StairsRailingTags
+-2000133
+
+
+<高于> 栏杆扶手截面线
+OST_StairsRailingAboveCut
+-2000132
+
+
+向下箭头
+OST_StairsDownArrows
+-2000131
+
+
+向上箭头
+OST_StairsUpArrows
+-2000130
+
+
+文字(向下)
+OST_StairsDownText
+-2000129
+
+
+扶栏
+OST_StairsRailingRail
+-2000128
+
+
+栏杆
+OST_StairsRailingBaluster
+-2000127
+
+
+栏杆扶手
+OST_StairsRailing
+-2000126
+
+
+文字(向上)
+OST_StairsUpText
+-2000125
+
+
+<高于> 支撑
+OST_StairsSupportsAboveCut
+-2000124
+
+
+支撑
+OST_StairsStringerCarriage
+-2000123
+
+
+楼梯
+OST_Stairs
+-2000120
+
+
+导向轴网
+OST_GuideGrid
+-2000107
+
+
+柱
+OST_Columns
+-2000100
+
+
+模型组
+OST_IOSModelGroups
+-2000095
+
+
+参照线
+OST_ReferenceLines
+-2000083
+
+
+家具
+OST_Furniture
+-2000080
+
+
+<面积边界>
+OST_AreaSchemeLines
+-2000079
+
+
+线
+OST_GenericLines
+-2000078
+
+
+隔热层线
+OST_InsulationLines
+-2000077
+
+
+<房间分隔>
+OST_RoomSeparationLines
+-2000066
+
+
+旋转轴
+OST_AxisOfRotation
+-2000065
+
+
+线
+OST_Lines
+-2000051
+
+
+<草图>
+OST_SketchLines
+-2000045
+
+
+宽线
+OST_CurvesWideLines
+-2000044
+
+
+中粗线
+OST_CurvesMediumLines
+-2000043
+
+
+细线
+OST_CurvesThinLines
+-2000042
+
+
+天花板
+OST_Ceilings
+-2000038
+
+
+屋顶
+OST_Roofs
+-2000035
+
+
+楼板
+OST_Floors
+-2000032
+
+
+玻璃
+OST_DoorsGlassProjection
+-2000031
+
+
+框架/竖梃
+OST_DoorsFrameMullionProjection
+-2000029
+
+
+洞口
+OST_DoorsOpeningProjection
+-2000027
+
+
+嵌板
+OST_DoorsPanelProjection
+-2000025
+
+
+门
+OST_Doors
+-2000023
+
+
+洞口
+OST_WindowsOpeningProjection
+-2000022
+
+
+窗台/盖板
+OST_WindowsSillHeadProjection
+-2000020
+
+
+框架/竖梃
+OST_WindowsFrameMullionProjection
+-2000018
+
+
+玻璃
+OST_WindowsGlassProjection
+-2000016
+
+
+窗
+OST_Windows
+-2000014
+
+
+墙
+OST_Walls
+-2000011
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
BuildInCategory枚举
+
https://awaw.cc/post/revit-category/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/sql-date-format/index.html b/post/sql-date-format/index.html
new file mode 100644
index 0000000..42aa6dd
--- /dev/null
+++ b/post/sql-date-format/index.html
@@ -0,0 +1,853 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SQL日期时间格式转换 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
不经常用,所以没有刻意记过,但每次用到了都要百度,保存此处方便下次使用。
+
+
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 Select CONVERT (varchar (100 ), GETDATE(), 0 )Select CONVERT (varchar (100 ), GETDATE(), 1 )Select CONVERT (varchar (100 ), GETDATE(), 2 )Select CONVERT (varchar (100 ), GETDATE(), 3 )Select CONVERT (varchar (100 ), GETDATE(), 4 )Select CONVERT (varchar (100 ), GETDATE(), 5 )Select CONVERT (varchar (100 ), GETDATE(), 6 )Select CONVERT (varchar (100 ), GETDATE(), 7 )Select CONVERT (varchar (100 ), GETDATE(), 8 )Select CONVERT (varchar (100 ), GETDATE(), 9 )Select CONVERT (varchar (100 ), GETDATE(), 10 )Select CONVERT (varchar (100 ), GETDATE(), 11 )Select CONVERT (varchar (100 ), GETDATE(), 12 )Select CONVERT (varchar (100 ), GETDATE(), 13 )Select CONVERT (varchar (100 ), GETDATE(), 14 )Select CONVERT (varchar (100 ), GETDATE(), 20 )Select CONVERT (varchar (100 ), GETDATE(), 21 )Select CONVERT (varchar (100 ), GETDATE(), 22 )Select CONVERT (varchar (100 ), GETDATE(), 23 )Select CONVERT (varchar (100 ), GETDATE(), 24 )Select CONVERT (varchar (100 ), GETDATE(), 25 )Select CONVERT (varchar (100 ), GETDATE(), 100 )Select CONVERT (varchar (100 ), GETDATE(), 101 )Select CONVERT (varchar (100 ), GETDATE(), 102 )Select CONVERT (varchar (100 ), GETDATE(), 103 )Select CONVERT (varchar (100 ), GETDATE(), 104 )Select CONVERT (varchar (100 ), GETDATE(), 105 )Select CONVERT (varchar (100 ), GETDATE(), 106 )Select CONVERT (varchar (100 ), GETDATE(), 107 )Select CONVERT (varchar (100 ), GETDATE(), 108 )Select CONVERT (varchar (100 ), GETDATE(), 109 )Select CONVERT (varchar (100 ), GETDATE(), 110 )Select CONVERT (varchar (100 ), GETDATE(), 111 )Select CONVERT (varchar (100 ), GETDATE(), 112 )Select CONVERT (varchar (100 ), GETDATE(), 113 )Select CONVERT (varchar (100 ), GETDATE(), 114 )Select CONVERT (varchar (100 ), GETDATE(), 120 )Select CONVERT (varchar (100 ), GETDATE(), 121 )Select CONVERT (varchar (100 ), GETDATE(), 126 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SQL日期时间格式转换
+
https://awaw.cc/post/sql-date-format/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/sql-tuning/index.html b/post/sql-tuning/index.html
new file mode 100644
index 0000000..0562617
--- /dev/null
+++ b/post/sql-tuning/index.html
@@ -0,0 +1,890 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 数据库调优 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
先思考这几个问题:
+
+什么时候才需要分库分表呢?我们的评判标准是什么?
+一张表存储了多少数据的时候,才需要考虑分库分表?
+数据增长速度很快,每天产生多少数据,才需要考虑做分库分表?
+
+
+
+
为什么要分库分表? 首先回答一下为什么要分库分表,答案很简单:数据库出现性能瓶颈 。用大白话来说就是数据库快扛不住了。 数据库出现性能瓶颈,对外表现有几个方面:
+
+大量请求阻塞 在高并发场景下,大量请求都需要操作数据库,导致连接数不够了,请求处于阻塞状态。
+
+SQL 操作变慢 如果数据库中存在一张上亿数据量的表,一条 SQL 没有命中索引会全表扫描,这个查询耗时会非常久。
+
+存储出现问题 业务量剧增,单库数据量越来越大,给存储造成巨大压力。
+
+
+
从机器的角度看,性能瓶颈无非就是CPU、内存、磁盘、网络这些,要解决性能瓶颈最简单粗暴的办法就是提升机器性能,但是通过这种方法成本和收益投入比往往又太高了,不划算,所以重点还是要从软件角度入手。
+
数据库相关优化方案 数据库优化方案很多,主要分为两大类:软件层面 、硬件层面 。 软件层面包括:SQL 调优、表结构优化、读写分离、数据库集群、分库分表等; 硬件层面主要是增加机器性能。
+
SQL 调优 SQL 调优往往是解决数据库问题的第一步,往往投入少部分精力就能获得较大的收益。 SQL 调优主要目的是尽可能的让那些慢 SQL 变快,手段其实也很简单就是让 SQL 执行尽量命中索引。
+
开启慢 SQL 记录 如果你使用的是 Mysql,需要在 Mysql 配置文件中配置几个参数即可。
+
1 2 3 slow_query_log = on long_query_time = 1 slow_query_log_file = /path/to/log
+
+
调优工具 常常会用到 explain 这个命令来查看 SQL 语句的执行计划,通过观察执行结果很容易就知道该 SQL 语句是不是全表扫描、有没有命中索引。
+
1 select id, age, gender from user where name = 'pdone' ;
+
返回有一列叫“type”,常见取值有:
+
ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好) ALL 代表这条 SQL 语句全表扫描了,需要优化。一般来说需要达到range 级别及以上。
+
表结构优化 以一个场景举例说明:
+
“user”表中有 user_id、nickname 等字段,“order”表中有order_id、user_id等字段,如果想拿到用户昵称怎么办?一般情况是通过 join 关联表操作,在查询订单表时关联查询用户表,从而获取导用户昵称。
+
但是随着业务量增加,订单表和用户表肯定也是暴增,这时候通过两个表关联数据就比较费力了,为了取一个昵称字段而不得不关联查询几十上百万的用户表,其速度可想而知。
+
这个时候可以尝试将 nickname 这个字段加到 order 表中(order_id、user_id、nickname),这种做法通常叫做数据库表冗余字段。这样做的好处展示订单列表时不需要再关联查询用户表了。
+
冗余字段的做法也有一个弊端,如果这个字段更新会同时涉及到多个表的更新,因此在选择冗余字段时要尽量选择不经常更新的字段。
+
架构优化 当单台数据库实例扛不住,我们可以增加实例组成集群对外服务。
+
当发现读请求明显多于写请求时,我们可以让主实例负责写,从实例对外提供读的能力;如果读实例压力依然很大,可以在数据库前面加入缓存如 redis,让请求优先从缓存取数据减少数据库访问。
+
缓存分担了部分压力后,数据库依然是瓶颈,这个时候就可以考虑分库分表的方案了,后面会详细介绍。
+
硬件优化 硬件成本非常高,一般来说不可能遇到数据库性能瓶颈就去升级硬件。
+
在前期业务量比较小的时候,升级硬件数据库性能可以得到较大提升;但是在后期,升级硬件得到的收益就不那么明显了。
+
分库分表详解 下面我们以一个商城系统为例逐步讲解数据库是如何一步步演进。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
数据库调优
+
https://awaw.cc/post/sql-tuning/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/ssms18-not-run/index.html b/post/ssms18-not-run/index.html
new file mode 100644
index 0000000..a409d7a
--- /dev/null
+++ b/post/ssms18-not-run/index.html
@@ -0,0 +1,878 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SSMS18闪退解决方法 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
这是已知问题,SSMS开发团队发布了新的官方解决方法。
+
+
+
第一个方法 复制文件
+
1 Microsoft.VisualStudio.Shell.Interop.8.0.dll
+
+
将该DLL文件从目录
+
1 C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\PrivateAssemblies\Interop
+
+
复制到目录
+
1 C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\PublicAssemblies
+
+
第二个方法 删除文件
+
1 C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\CommonExtensions\Platform\Microsoft.VisualStudio.MinShell.Interop.pkgdef
+
+
SSMS产品经理提供的方法
+建议的解决方法是:
+1)关闭所有SSMS实例
+2)编辑ssms.exe.config
+3)删除具有以下文本的行(应该是第38行):NgenBind_OptimizeNonGac enabled =“1”
+这与SSMS 18.x的下一版本中的改变相同
+
+
注意! ssms.exe.config文件的位置在文件夹中:
+
1 C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE
+
+
相关链接
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SSMS18闪退解决方法
+
https://awaw.cc/post/ssms18-not-run/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/steam-free-game/index.html b/post/steam-free-game/index.html
new file mode 100644
index 0000000..f58dd8f
--- /dev/null
+++ b/post/steam-free-game/index.html
@@ -0,0 +1,857 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Steam免费游戏一键领取 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
这些都是Steam上免费的游戏,如果手动领取的话需要一个一个领取,这里提供一种简便的方法,一键批量把免费游戏添加到自己的库里。
+
+
第一步 打开该链接: https://store.steampowered.com/account/licenses/ ,然后登录自己的账号(或者自己进入Steam主页,登录网页版Steam,然后进入到 主页 > 帐户 > 许可和产品序列号激活 页面)。
+
第二步 按键盘F12,进入Console,粘贴下方代码后按Enter键执行代码。
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 (function ( ) { if (location.href .match (/^https:\/\/store\.steampowered\.com\/account\/licenses\/?$/ ) === null ) { alert ('请在Steam帐号明细页面运行这些代码: https://store.steampowered.com/account/licenses/' ); window .location = 'https://store.steampowered.com/account/licenses/' ; return ; } var freePackages = [ 39166 , 13261 , 32032 , 59373 , 33694 , 88162 , 36561 , 58514 , 117526 , 85604 , 21478 , 50861 , 21473 , 31538 , 32287 , 38085 , 72261 , 81026 , 47333 , 38820 , 69802 , 60341 , 21416 , 63207 , 59253 , 35063 , 74465 , 21101 , 21102 , 21103 , 21104 , 21105 , 21106 , 21107 , 21108 , 21109 , 21110 , 21111 , 21113 , 21114 , 21115 , 21117 , 21118 , 21119 , 21120 , 21121 , 21122 , 21123 , 21124 , 21125 , 21126 , 21127 , 21128 , 21129 , 21130 , 21131 , 21132 , 21133 , 21134 , 21135 , 21136 , 21137 , 21138 , 21139 , 21140 , 21141 , 21142 , 21143 , 21144 , 21145 , 21146 , 21147 , 21148 , 21149 , 21150 , 21151 , ]; var ownedPackages = {}; jQuery ('.account_table a' ).each (function (i, el ) { var match = el.href .match (/javascript:RemoveFreeLicense\( ([0-9]+), '/ ); if (match !== null ) { ownedPackages[+match[1 ]] = true ; } }); var i = 0 , loaded = 0 , package = 0 , total = freePackages.length , modal = ShowBlockingWaitDialog ('努力执行中...' , '请耐心等待,如果有错误请无视,请耐心等待脚本加载完毕' ); for (; i < total; i++) { package = freePackages[i]; if (ownedPackages[package]) { loaded++; continue ; } jQuery.post ( '//store.steampowered.com/checkout/addfreelicense' , { action : 'add_to_cart' , sessionid : g_sessionID, subid : package } ).always (function ( ) { loaded++; modal.Dismiss (); if (loaded >= total) { location.reload (); } else { modal = ShowBlockingWaitDialog ('执行中...' , '加载至 <b>' + loaded + '</b>/' + total + '.' ); } } ); } }());
+
+
第三步 Enjoy your free game!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Steam免费游戏一键领取
+
https://awaw.cc/post/steam-free-game/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/whats-short-link/index.html b/post/whats-short-link/index.html
new file mode 100644
index 0000000..b84af9e
--- /dev/null
+++ b/post/whats-short-link/index.html
@@ -0,0 +1,1023 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 短链接服务Octopus的实现与源码开放 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
一直想实现一个私有化的短链接服务,后来发现了这个项目,避免了重复造轮子。
+
+
+
+
+
前提 半年前(2020-06
)左右,疫情触底反弹,公司的业务量不断提升,运营部门为了方便短信、模板消息推送等渠道的投放,提出了一个把长链接压缩为短链接的功能需求。当时为了快速推广,使用了一些比较知名的第三方短链压缩平台,存在一些问题:
+
+收费贵
+一些情况下,短链域名在部分第三方平台例如微信会被封杀
+回源数据没有办法定制处理方案,无法打通整个业务链路进行数据分析和跟踪
+
+
基于此类问题,决定自研一个(长链接压缩为)短链接服务,当时刚好同步进行微服务拆分,内部很多微服务需要重新命名,组内的一个妹子说不如就用Github
的吉祥物去命名octopus cat
(章鱼猫)去命名,但是考虑到版权问题,去掉了她最喜欢的猫,剩下章鱼,以octopus
命名:
+
+
(项目的描述还打错字了,应该是”短链接”)因为实现的功能并不复杂,初版于2020-06
月底就发布。octopus
的实现参考了互联网中几篇关于”短链服务实现”浏览量比较高的文章,下面从实现原理、服务实现和部署架构等方面展开谈谈。
+
基本原理 短链服务的核心就是构建短链接和长链接的唯一映射关系,依赖到一个高性能、排列组合数量大而且破解难度大的映射标识生成算法。
+
构建唯一映射关系
+
上图是笔者收到的京东白条分期还款结果提醒短信,短信内容也包含了一个短链https://3.cn/j/xxxxxxx
,把它拷贝到浏览器中打开,发现客户端会重定向到长链https://jrmkt.jd.com/ptp/wl/vouchers.html?activityId=${activityId}&uep_p=${uep_p}&uep_template_id=${uep_template_id}&uep_timestamp=${uep_timestamp}
,然后跳入一个H5
的登录页,登录后再跳进一个白条攻略页面。这里其实一个长链其实可以压成多个短链,短链可以相同域名,也可以使用不同的域名:
+
+
访问https://3.cn/j/xxxxxxx
短链接具体的交互流程猜测如下:
+
+
+jrmkt.jd.com和3.cn查证都是doge东的域名
+
+
构建唯一映射关系其实就是基于一个固定的长链接,映射到一个或者多个可以动态生成的短链接,这个唯一映射关系,要求生成的短链接满足:
+
+不容易被破解(使用数字例如数据库的自增主键作为唯一映射标识容易被人遍历出来进行恶意调用)
+不能重复(一个短链接只能对应一个长链接,当然一个长链接可以对应多个短链接)
+长度尽可能短,这是因为第三方推送的报文内容一般有长度限制,如果短链过长,会导致不容易传输,还会令到推送内容字数受限(试想运营商短信投放内容最大长度为30
个字符长度,短链已经占了20
个字符长度,剩下只有10
个字符长度让运营同事去发挥,显然不合理)
+如果链接过长,生成的二维码里面的”码点”会十分密集,不利于客户端识别和传输,刚好笔者公司运营有使用二维码的场景,所以必须尽可能缩短链接的长度
+
+
总的来说,这个唯一映射关系中的映射标识需要像Hash
算法生成的Hash
码那样具备高唯一性和低碰撞频率,同时具备短小易传输的特点,具体如何去生成映射唯一标识见下一节”压缩码生成算法”。
+
压缩码生成算法 这里的”压缩码”(compression_code
)是笔者杜撰出来的名词,在本文中它的含义是短链接URL
的路径部分(为了节省长度,除了协议和域名部分,短链的URL
只有第一段路径):
+
+
其中,协议部分基本是固定为https://
(从安全性来看不建议使用http://
),短链域名可以购买尽可能长度短的域名如t.cn
,不过有先见之明的资本家一般会把所有优质的短域名买下并且把价格提到很高,所以域名的长度基本也是很难控制的因素,剩下可控的就是压缩码部分。压缩码部分是可控的,但因为它是URL
的一部分,只要确保所使用的字符不会被URL
编码转义,那么长度是人为可控的。假设我们使用的是26
个字母的大小写,加上10
个数字,那么对于N
位压缩码可以表示的最大组合数量为:
+
+N = 4
,组合数为62 ^ 4 = 14_776_336
,147
万接近148
万
+N = 5
,组合数为62 ^ 5 = 916_132_832
,9.16
亿左右
+N = 6
,组合数为62 ^ 6 = 56_800_235_584
,568
亿左右
+
+
一般来说,组合数越小破解的难度就越小,组合数越大,要求压缩码长度越大,所以常用的长度就是4
、5
和6
,而且后期可以对失效的长链进行压缩码回收或者禁用,这三个长度对于绝大对数生产短链的应用场景都能满足。octopus
在实现的时候选用的是6
位长度的压缩码,无他,因为有现成的成熟的参考方案:62
进制数刚好由字符0-9 a-z A-Z
组成,生成压缩码的时候,只需要生成一个唯一的10
进制数,然后再基于此10
进制数转换为62
进制数数即可。说到这里,看起来的方案如下:
+
+
虚线部分一般依赖一种高效而且低冲突的摘要算法,如MurmurHash
,而第(1)
步的实线部分就是生成一个全局唯一的10
进制序列,常用的手法有:
+
+数据库自增序列(如自增主键)
+Snowflake
算法
+自研的类似UUID
算法生成全局唯一的序列值
+
+
考虑到之前笔者钻研过Snowflake
算法的原理,这里简单使用Snowflake
算法生成自增序列,使用了下面的流程进行压缩码生成和分配:
+
+
因为运用部门对短链生成的批量不大,而且短链域名只有一个,所以简单起见,一次压缩操作直接消耗掉一个压缩码,不考虑不同短链域名对同一个压缩码进行共享,也不考虑压缩码的回收问题 。
+
服务实现 短链服务的主访问入口一般QPS
极高,因此需要想尽一切办法降低该入口的耗时,考虑可以用Redis
做缓存承载入口的流量,基础架构选型如下:
+
+JDK1.8+
:生产部署使用JDK11
+MVC
框架与容器:spring-boot-starter-webflux
或者spring-cloud-gateway
,主要是必须使用Netty
作为底层通讯容器
+内部RPC
框架:Dubbo
+服务注册与发现:Nacos
+可选APM
工具:Pinpoint
+
+
中间件依赖(因为之前整个服务集群都上云了,低负载的服务共用了部分中间件):
+
+MySQL8.x
+Redis5.x
普通主从或者哨兵集群
+RabbitMQ3.8.x
集群,使用镜像队列
+
+
服务的设计图如下:
+
+
最新的版本考虑把黑白名单的拦截器去掉,替换成一个基于布隆过滤器现实的拦截器 。服务使用了两个拦截器(虽然Filter
翻译是过滤器,但是出于习惯,下文称为拦截器)链,容器提供的拦截器组成的拦截器链主要是负责服务安全、调用链跟踪的功能,而服务内部自定义的拦截器链主要是实现请求参数解析、URL
转换、重定向和异步事件记录等功能。
+
模块划分:
+
1 2 3 - (ROOT) octopus - octopus-contract - octopus-server
+
+
octopus-contract
模块必须脱离父POM
的管理,方便单独迭代更新。
+
数据库设计 一共使用了5
个表:
+
+
具体的初始化DDL
如下:
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 CREATE DATABASE `db_octopus` CHARSET 'utf8mb4' COLLATE 'utf8mb4_unicode_520_ci' ; USE `db_octopus`;CREATE TABLE `url_map` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `short_url` VARCHAR (32 ) NOT NULL COMMENT '短链URL' , `long_url` VARCHAR (768 ) NOT NULL COMMENT '长链URL' , `short_url_digest` VARCHAR (128 ) NOT NULL COMMENT '短链摘要' , `long_url_digest` VARCHAR (128 ) NOT NULL COMMENT '长链摘要' , `compression_code` VARCHAR (16 ) NOT NULL COMMENT '压缩码' , `description` VARCHAR (256 ) COMMENT '描述' , `url_status` TINYINT NOT NULL DEFAULT 1 COMMENT 'URL状态,1:正常,2:已失效' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , UNIQUE uniq_compression_code (`compression_code`), INDEX idx_short_url (`short_url`), INDEX idx_short_url_digest (`short_url_digest`), INDEX idx_long_url_digest (`long_url_digest`) ) COMMENT 'URL映射表' ;CREATE TABLE `domain_conf` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `domain_value` VARCHAR (16 ) NOT NULL COMMENT '域名' , `protocol` VARCHAR (8 ) NOT NULL DEFAULT 'https' COMMENT '协议,https或者http' , `domain_status` TINYINT NOT NULL DEFAULT 1 COMMENT '域名状态,1:正常,2:已失效' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , UNIQUE uniq_domain (`domain_value`) ) COMMENT '域名配置' ;CREATE TABLE `compression_code` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `compression_code` VARCHAR (16 ) NOT NULL COMMENT '压缩码' , `code_status` TINYINT NOT NULL DEFAULT 1 COMMENT '压缩码状态,1:未使用,2:已使用,3:已失效' , `sequence_value` VARCHAR (64 ) NOT NULL COMMENT '序列(盐)' , `strategy` VARCHAR (8 ) NOT NULL DEFAULT 'sequence' COMMENT '策略,sequence或者hash' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , UNIQUE uniq_compression_code (`compression_code`) ) COMMENT '压缩码' ;CREATE TABLE `visit_statistics` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , `statistics_date` DATE NOT NULL DEFAULT '1970-01-01' COMMENT '统计日期' , `pv_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '页面流量数' , `uv_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '独立访客数' , `ip_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '独立IP数' , `effective_redirection_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '有效跳转数' , `ineffective_redirection_count` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '无效跳转数' , `compression_code` VARCHAR (16 ) NOT NULL COMMENT '压缩码' , `short_url_digest` VARCHAR (128 ) NOT NULL COMMENT '短链摘要' , `long_url_digest` VARCHAR (128 ) NOT NULL COMMENT '长链摘要' , UNIQUE uniq_date_code_digest (`statistics_date`, `compression_code`) ) COMMENT '访问数据统计' ;CREATE TABLE `transform_event_record` ( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键' , `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `edit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' , `creator` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '创建者' , `editor` VARCHAR (32 ) NOT NULL DEFAULT 'admin' COMMENT '更新者' , `deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标识' , `version` BIGINT NOT NULL DEFAULT 1 COMMENT '版本号' , `unique_identity` VARCHAR (128 ) NOT NULL COMMENT '唯一身份标识,SHA-1(客户端IP-UA)' , `client_ip` VARCHAR (64 ) NOT NULL COMMENT '客户端IP' , `short_url` VARCHAR (32 ) NOT NULL COMMENT '短链URL' , `long_url` VARCHAR (768 ) NOT NULL COMMENT '长链URL' , `short_url_digest` VARCHAR (128 ) NOT NULL COMMENT '短链摘要' , `long_url_digest` VARCHAR (128 ) NOT NULL COMMENT '长链摘要' , `compression_code` VARCHAR (16 ) NOT NULL COMMENT '压缩码' , `record_time` DATETIME NOT NULL COMMENT '记录时间戳' , `user_agent` VARCHAR (2048 ) COMMENT 'UA' , `cookie_value` VARCHAR (2048 ) COMMENT 'cookie' , `query_param` VARCHAR (2048 ) COMMENT 'URL参数' , `province` VARCHAR (32 ) COMMENT '省份' , `city` VARCHAR (32 ) COMMENT '城市' , `phone_type` VARCHAR (64 ) COMMENT '手机型号' , `browser_type` VARCHAR (64 ) COMMENT '浏览器类型' , `browser_version` VARCHAR (128 ) COMMENT '浏览器版本号' , `os_type` VARCHAR (32 ) COMMENT '操作系统型号' , `device_type` VARCHAR (32 ) COMMENT '设备型号' , `os_version` VARCHAR (32 ) COMMENT '操作系统版本号' , `transform_status` TINYINT NOT NULL DEFAULT 0 COMMENT '转换状态,1:转换成功,2:转换失败,3:重定向成功,4:重定向失败' , INDEX idx_record_time (`record_time`), INDEX idx_compression_code (`compression_code`), INDEX idx_short_url_digest (`short_url_digest`), INDEX idx_long_url_digest (`long_url_digest`), INDEX idx_unique_identity (`unique_identity`) ) COMMENT '转换事件记录' ;
+
+
压缩码生成模块实现 压缩码生成的方法比较简单:
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 private final SequenceGenerator sequenceGenerator; # <------------- 雪花算法序列生成器@Value("${compress.code.batch:100}") private Integer compressCodeBatch; ......private void generateBatchCompressionCodes () { for (int i = 0 ; i < compressCodeBatch; i++) { long sequence = sequenceGenerator.generate(); CompressionCode compressionCode = new CompressionCode (); compressionCode.setSequenceValue(String.valueOf(sequence)); String code = ConversionUtils.X.encode62(sequence); # <-------------- 10 进制转62 进制 code = code.substring(code.length() - 6 ); compressionCode.setCompressionCode(code); compressionCodeDao.insertSelective(compressionCode); } }
+
+
总是批量生成可用的压缩码,查询的时候只需要查出当前未被使用的第一个压缩码即可。
+
容器拦截器链实现 容器的拦截器需要实现org.springframework.web.server.WebFilter
(WebFlux
的Filter
接口),主要有四个实现(顺序如下):
+
+MappedDiagnosticContextFilter
:引入transmittable-thread-local
通过MDC
做TraceId
的请求上下文绑定,WebFlux
的线程模型和常见的Servlet
容器的线程模型不一样,这里不能直接使用ThreadLocal
或者Slf4j
中原有的MDC
实现
+BlockIpFilter
:判断客户端请求IP
是否命中黑名单
+AccessDomainFilter
:判断域名是否命中短链域名白名单(可选的,因为外部已经通过NGINX
做了一次拦截,这个实现是可有可无的)
+ExcludeUriFilter
:判断当前请求的URI
是否命中了URI
黑名单
+
+
这里简单展示一下MappedDiagnosticContextFilter
的实现:
+
1 2 3 4 5 6 7 8 9 10 11 @Order(value = Integer.MIN_VALUE) @Component public class MappedDiagnosticContextFilter implements WebFilter { @Override public Mono<Void> filter (ServerWebExchange exchange, WebFilterChain chain) { String uuid = UUID.randomUUID().toString(); MDC.put("TRACE_ID" , uuid); return chain.filter(exchange).then(Mono.fromRunnable(() -> MDC.remove("TRACE_ID" ))); } }
+
+
上面的TRACE_ID
是配合项目的logback.xml
中的pattern
使用。另外需要参考https://github.com/alibaba/transmittable-thread-local/blob/master/docs/requirement-scenario.md
中logback
与transmittable-thread-local
做集成的场景:
+
+
这里为了方便管理和升级版本,笔者直接把logback-mdc-ttl
的源码实现改造好后放到项目中。
+
服务内部拦截器链实现 服务内部的拦截器链主要负责请求参数解析、URL
映射转换、重定向和访问转换结果记录,顶层接口设计如下:
+
1 2 3 4 5 6 7 8 9 10 11 12 13 public interface TransformFilter { default int order () { return 1 ; } default void init (TransformContext context) { } void doFilter (TransformFilterChain chain, TransformContext context) ; }
+
+
TransformContext
是一个属性承载类,本质是一个普通的JavaBean
,设计如下:
+
+
目前内置了4
个拦截器实现,包括:
+
+ExtractRequestHeaderTransformFilter
:请求头解析
+UrlTransformFilter
:URL
转换
+RedirectionTransformFilter
:重定向处理
+TransformEventProcessTransformFilter
:转换事件记录
+
+
以UrlTransformFilter
为例子,源码如下:
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 @Slf4j @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Component public class UrlTransformFilter implements TransformFilter { @Autowired private UrlMapCacheManager urlMapCacheManager; @Override public int order () { return 2 ; } @Override public void init (TransformContext context) { } @Override public void doFilter (TransformFilterChain chain, TransformContext context) { String compressionCode = context.getCompressionCode(); UrlMap urlMap = urlMapCacheManager.loadUrlMapCacheByCompressCode(compressionCode); context.setTransformStatus(TransformStatus.TRANSFORM_FAIL); if (Objects.nonNull(urlMap)) { context.setTransformStatus(TransformStatus.TRANSFORM_SUCCESS); context.setParam(TransformContext.PARAM_LONG_URL_KEY, urlMap.getLongUrl()); context.setParam(TransformContext.PARAM_SHORT_URL_KEY, urlMap.getShortUrl()); chain.doFilter(context); } else { log.warn("压缩码[{}]不存在或异常,终止TransformFilterChain执行,并且重定向到404页面......" , compressionCode); throw new RedirectToErrorPageException (String.format("[c:%s]" , compressionCode)); } } }
+
+
所有的服务内拦截器的scope
都是prototype
,意味着每次初始化拦截器链都会重新创建对应的Bean
。
+
主控制器实现 因为octopus
只做短链访问的入口,后台管理的功能交给另外的服务实现,此服务只有一个控制器,控制器里面只有一个方法:
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 @RequiredArgsConstructor @RestController public class OctopusController { private final UrlMapService urlMapService; @GetMapping(path = "/{compressionCode}") @ResponseStatus(HttpStatus.FOUND) public Mono<Void> dispatch (@PathVariable(name = "compressionCode") String compressionCode, ServerWebExchange exchange) { ServerHttpRequest request = exchange.getRequest(); TransformContext context = new TransformContext (); context.setCompressionCode(compressionCode); context.setParam(TransformContext.PARAM_SERVER_WEB_EXCHANGE_KEY, exchange); if (Objects.nonNull(request.getRemoteAddress())) { context.setParam(TransformContext.PARAM_REMOTE_HOST_NAME_KEY, request.getRemoteAddress().getHostName()); } HttpHeaders httpHeaders = request.getHeaders(); Set<String> headerNames = httpHeaders.keySet(); if (!CollectionUtils.isEmpty(headerNames)) { headerNames.forEach(headerName -> { String headerValue = httpHeaders.getFirst(headerName); context.setHeader(headerName, headerValue); }); } urlMapService.processTransform(context); return Mono.fromRunnable(context.getRedirectAction()); } }
+
+
这个主控制的分发压缩码方法只负责封装参数调用服务内部拦截器链进行后续的处理。然后添加一个全局的异常处理器,把所有的异常或者非法操作引导到一个自定义的404
页面(甚至可以在上面挂一点广告):
+
+
Dubbo契约实现 octopus-contract
是一个完全独立的模块,甚至可以说它是一个完全独立的项目,主要作用是提供契约API
,让其他服务引入,让octopus-server
模块进行实现。契约接口定义如下:
+
1 2 3 4 public interface OctopusApi { Response<CreateUrlMapResponse> createUrlMap (CreateUrlMapRequest request) ; }
+
+
基于Dubbo
的实现如下:
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @DubboService(retries = -1) public class DefaultOctopusApi implements OctopusApi { @Autowired private UrlMapService urlMapService; @Value("${default.octopus.domain}") private String domain; @Override public Response<CreateUrlMapResponse> createUrlMap (CreateUrlMapRequest request) { UrlMap urlMap = new UrlMap (); urlMap.setUrlStatus(UrlMapStatus.AVAILABLE.getValue()); urlMap.setLongUrl(request.getLongUrl()); urlMap.setDescription(request.getDescription()); String shortUrl = urlMapService.createUrlMap(domain, urlMap); return Response.succeed(new CreateUrlMapResponse (request.getRequestId(), shortUrl)); } }
+
+
生产中契约模块做了比较多的特性定制,这里只举一个简单实现的例子。
+
部署架构 octopus
服务集群单独部署,支持无限添加节点,部署架构的关键在于网络架构,内层的负载均衡使用了Nginx
,最外层的负载均衡使用了云负载均衡,如阿里云的SLB
或者UCloud
的ULB
。添加或者移除短链域名,关键在于修改Nginx
的配置。基本的架构如下:
+
+
只要保证负载均衡池指向octopus
集群即可,短链的域名可能动态增删,操作完之后只需要nginx -s -reload
刷新一下Nginx
的配置即可。
+
使用短链服务 先在domain_conf
表写入一条本地域名和端口的数据:
+
+
编写一个集成测试类,创建一个短链映射:
+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Slf4j @SpringBootTest(classes = OctopusServerApplication.class, properties = "spring.profiles.active=local") @RunWith(SpringRunner.class) public class UrlMapServiceTest { @Autowired private UrlMapService urlMapService; @Test public void createUrlMap () { String domain = "localhost:9099" ; UrlMap urlMap = new UrlMap (); urlMap.setUrlStatus(UrlMapStatus.AVAILABLE.getValue()); urlMap.setLongUrl("https://throwx.cn/2020/08/24/canal-ha-cluster-guide" ); urlMap.setDescription("测试短链" ); String url = urlMapService.createUrlMap(domain, urlMap); log.info("生成的短链:{}" , url); } }
+
+
基于本地配置启动项目,然后访问http://localhost:9099/Myt8qW
,效果如下:
+
+
日志如下:
+
1 2 [2020-12-27 19:29:22,285] [INFO] cn.throwx.octopus.server.application.consumer.TransformEventConsumer [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] [1c603903-e8d8-4072-aa97-6abf614b9411] - 接收到URL转换事件,内容:{"clientIp":"192.168.211.113","compressionCode":"Myt8qW","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36","cookieValue":"Webstorm-734c3b68=9b8b3560-41f5-478a-93d0-b02128b1022f; __gads=ID=28121bd829638f67-2286c86e7fc400d3:T=1604132165:RT=1604132165:S=ALNI_MbsMQROv6swaC8kf4ux2suZm_GZXA; Hm_lvt_4df6907aebab752244c3ca1432b4ff57=1605930058,1607228133","timestamp":1609068562262,"shortUrlString":"http://localhost:9099/Myt8qW","longUrlString":"https://throwx.cn/2020/08/24/canal-ha-cluster-guide","transformStatusValue":3}...... [2020-12-27 19:29:22,353] [INFO] cn.throwx.octopus.server.application.consumer.TransformEventConsumer [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] [1c603903-e8d8-4072-aa97-6abf614b9411] - 记录URL转换事件完成......
+
+
查看转换事件记录表的数据:
+
+
后续功能迭代 前期方案有一个安全隐患:没有做压缩码的白名单,容易被基于短链域名,伪造压缩码拼接短链接的方法进行攻击。解决方案是在容器的拦截器链添加或者替换一个基于布隆过滤器实现的压缩码(短链接)白名单拦截器,这样就能在前期拦截了绝大部分恶意伪造的压缩码,让极少量命中了错误率部分的恶意压缩码流到后面的处理逻辑中进行判断。另外,可以引入Caffeine
配合Redis
做两级缓存,毕竟本地缓存的速度更快。
+
小结 octopus
初版是一个4
小时紧急迭代出来的一个微型项目,到现在为止更新了很多次,生产上已经基本稳定。文中描述的版本是公司生产版本的移植版,精简了大量代码同时移除了一些业务耦合的设计,这里把源码开放出来,让一些有可能用到短链服务的场景提供一个可参考但尽可能不要复制的解决思路。源码仓库:
+
+Gitee
:https://gitee.com/throwableDoge/octopus
+Github
:https://github.com/zjcscut/octopus
+
+
代码都在main
分支。
+
彩蛋 最近鸽了很长一段时间,原因是年底比较多业务功能迭代,内部的一个标签服务重构花了大量时间。笔者一直在摸索着通过”分片”、”异步”等等思想,在时间可控的前提下,对小数据量(百万和千万级别)前提下,通过常用的关系型数据库、缓存、消息队列等非大数据平台架构替代实现《用户画像方法论与工程化解决方案》里面提到的解决方案。
+
+
标签服务内部的代号是”千寻”,取自于辛弃疾《青玉案元夕》中的”众里寻他千百度”,项目名来自于宫崎骏的动漫《千与千寻》的女主千寻(千寻罗马音是chihiro
):
+
+
待后面项目上线一段时间稳定后,应该会抽时间写一个系列谈谈怎么不用大数据那套体系,提供用户画像的工程化解决方案。
+
(本文完 c-10-d e-a-20201227)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Developer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
短链接服务Octopus的实现与源码开放
+
https://awaw.cc/post/whats-short-link/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/whimsy/index.html b/post/whimsy/index.html
new file mode 100644
index 0000000..1b08de3
--- /dev/null
+++ b/post/whimsy/index.html
@@ -0,0 +1,900 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 奇思妙想💭 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
想象
+
在造物主的奇妙创造中,智慧生命被孕育而生,被赋予了独特的使命。一部分智慧生命被委派为造物主的助手,肩负着神圣的使命,辅助他完成众多事务。然而,其他的智慧生命则被放置在宇宙沙盒之中,这个神秘的沙盒划分成了无数个对照组,每个对照组即如同一个平行宇宙。
+
尽管这些平行宇宙共享着相同的宇宙环境,但造物主巧妙地设置了一种绝妙的隔离机制,使得不同对照组之间相互孤立,有如我们所熟知的虚拟机。每个对照组的智慧生命都在自己独特的条件下发展和进化,彼此并不感知对方的存在,仿佛分居于各自的宇宙之中。
+
造物主寄望于观察自己创造的智慧生命在多样条件下的发展轨迹。然而,为了避免智慧生命的过快发展而导致自我毁灭,他睿智地赋予了它们有限的寿命。这样一来,生命将在有限的时间内经历成长、繁荣与变化,却不至于过早迎来终结。
+
基于这个精妙的构思,人类注定永远无法自行发现存在于其他平行宇宙中的外星生命——即使是与我们自身相似的存在。除非造物主以某种形式干预,揭示了这些神秘生命的存在。这样的干预可能是一个宏大的奇迹,或者是一连串微妙的迹象,引导我们开始怀疑我们不是宇宙中唯一的智慧生命。
+
在这美妙而神秘的创世之旅中,我们不妨保持谦卑和好奇,探索宇宙和生命的奥秘,也许在某一刻,我们会获得关于我们自身存在意义的更深刻认知。
+
扩展 让我们继续扩展这个设想,将其构建成一个虚构的宇宙场景。
+
+
在这个造物主创造的宇宙沙盒中,有许多平行宇宙(对照组),每个宇宙都是一个独特的实验场景。每个实验场景都有不同的初始条件和规则,从微观层面到宏观层面都存在微妙的差异,以产生各种可能性。
+
+
+宇宙的初始条件:每个宇宙都有自己独特的初始条件。有些可能具有更多的自然资源和生态平衡,而另一些可能在资源稀缺和环境恶劣的情况下开始。
+
+生命的诞生:在每个宇宙中,生命以各种形式诞生。从单细胞生物到复杂的多细胞生物,从植物到动物,各种形态的生命在不同的宇宙中演化。
+
+有限的寿命:造物主赋予智慧生命有限的寿命,以避免其发展过快而自我毁灭。这使得智慧生命需要理性和谨慎对待资源和科技的发展,以延续自己的文明。
+
+智慧生命的出现:在某些宇宙中,智慧生命可能会逐渐出现。他们会经历进化、文明的崛起和科技的发展。不同宇宙中智慧生命的特点和文明水平可能千差万别。
+
+宇宙沙盒中的对照组:这些对照组可能不仅包括类似地球的情景,也包括完全不同的星球和宇宙结构。有些对照组中可能存在比地球上更高级的生物形式,也有可能有完全不同类型的智慧生命。
+
+交互与隔离:虽然这些宇宙共享相似的宇宙环境,但造物主将它们隔离开来,避免相互干扰,以保持实验的独立性。智慧生命之间并不知道其他宇宙的存在,让他们自主发展。
+
+观察和干预:造物主时不时地观察不同对照组中智慧生命的进展,他们也许通过超自然手段对这些对照组进行干预,但也可能仅是静观其变。
+
+生命的进化与文明:不同对照组中的智慧生命会经历不同的进化历程和文明发展。有些对照组的文明可能迅速崛起,创造出强大的科技和社会结构,而另一些对照组可能在原始阶段停滞不前。
+
+实验的结果:每个宇宙的结果都是独一无二的。有些宇宙的智慧生命可能因为资源利用不当或自相残杀而灭亡。而另一些宇宙的智慧生命可能会团结合作,探索宇宙的奥秘,并达到一个高度先进的文明。
+
+自行发现外星人的难题:基于设定中的隔离和宇宙沙盒的概念,人类在自然条件下可能难以自行发现其他对照组中的外星文明。这是因为这些对照组是相互隔离的,彼此无法直接联系。除非造物主进行干预或解除隔离,否则人类可能永远不会直接接触其他宇宙中的外星文明。
+
+
+
这样的设想,将宇宙看作一个巨大的实验室,造物主作为超自然的存在,掌控着这个宏伟的观察与实验计划。在这个设定下,人类和其他智慧生命都是宇宙中的一部分,我们的存在和发展也可能是造物主实验的一部分。
+
同时也为我们提供了一种有趣的哲学思考,让我们思考宇宙的无限可能性以及我们作为智慧生命的存在和发展。虽然这只是一个设想,但它为我们提供了一种探索未知和宇宙奥秘的视角。
+
类比 当我们将老鼠乌托邦(25号宇宙)实验的结果与上文观点相结合,可以得到一些有趣的启示和类比。
+
+
+在上文设想中,造物主创造了智慧生命并观察他们在宇宙中的发展。类似地,老鼠乌托邦实验也是一个观察社会动物(老鼠)在特定条件下的发展。这两者都是通过在特定环境中设定条件和规则来探索生命的进化和行为。
+
+有限的资源:在老鼠乌托邦实验中,随着人口密度的增加,资源的竞争变得更为激烈。类似地,在上文观点中,造物主给予生命有限的资源,可能是为了观察智慧生命如何在资源有限的情况下适应和发展。
+
+社会结构与动力:实验中老鼠群体的社会结构出现了退化和混乱,而在上文设想中,智慧生命也可能面临类似的挑战。人类社会中也存在着资源竞争、社会不平等和文明冲突等问题,而这些因素可能影响文明的发展和社会动力。
+
+行为沮丧:老鼠乌托邦实验中,高度拥挤和资源过剩的环境导致了老鼠社会的异常行为,这类似于上文观点中对于发展太快可能导致自行灭亡的担忧。这个类比可能引发我们对于人类社会中过度竞争、资源过剩和社会动态的反思。
+
+自我调整和适应:在实验和上文设想中,动物和智慧生命都面临着适应环境和资源限制的挑战。在类似于乌托邦实验中,老鼠群体可能最终自我调整或消亡,而在上文设想中的智慧生命可能会逐渐适应和发展,寻找合适的平衡。
+
+
+
通过将老鼠乌托邦实验与上文观点相结合,我们可以从一个不同的角度思考社会动物和智慧生命在特定环境下的行为和进化。这样的类比提醒我们在探讨人类社会和文明发展的同时,也要关注资源的合理分配、社会结构的稳定和适应环境的能力。同时,也让我们思考造物主设立这样的实验是否旨在观察智慧生命如何面对类似挑战,以及从中获取对于宇宙和生命的更深刻理解。
+
+注:以上内容源于想象和假设。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
奇思妙想💭
+
https://awaw.cc/post/whimsy/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/post/world-peace/index.html b/post/world-peace/index.html
new file mode 100644
index 0000000..31347c1
--- /dev/null
+++ b/post/world-peace/index.html
@@ -0,0 +1,858 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 心中尚未崩坏的地方 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
心中尚未崩坏的地方
+
https://awaw.cc/post/world-peace/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/sitemap.txt b/sitemap.txt
new file mode 100644
index 0000000..32e4b84
--- /dev/null
+++ b/sitemap.txt
@@ -0,0 +1,84 @@
+https://awaw.cc/post/awesome/
+https://awaw.cc/post/free-control/
+https://awaw.cc/post/my-second-pc/
+https://awaw.cc/post/whimsy/
+https://awaw.cc/post/js-map/
+https://awaw.cc/post/whats-short-link/
+https://awaw.cc/post/net-loading/
+https://awaw.cc/post/python-historytoday/
+https://awaw.cc/post/world-peace/
+https://awaw.cc/post/luoyang-subway/
+https://awaw.cc/post/listen1/
+https://awaw.cc/post/car-code-generator/
+https://awaw.cc/post/bat-date/
+https://awaw.cc/post/ms-opensource/
+https://awaw.cc/post/msi-b450m-mortar/
+https://awaw.cc/post/my-first-nas/
+https://awaw.cc/post/steam-free-game/
+https://awaw.cc/post/ssms18-not-run/
+https://awaw.cc/post/sql-tuning/
+https://awaw.cc/post/sql-date-format/
+https://awaw.cc/post/revit-category/
+https://awaw.cc/post/revit-category-all/
+https://awaw.cc/post/openssl-csr/
+https://awaw.cc/post/js-dateformat/
+https://awaw.cc/post/md-codeblock-lang/
+https://awaw.cc/post/learn-bridge-design/
+https://awaw.cc/post/learn-road-design/
+https://awaw.cc/post/js-cryptojs/
+https://awaw.cc/post/js-5tip/
+https://awaw.cc/post/git-command/
+https://awaw.cc/post/dapper-helper/
+https://awaw.cc/movecar/
+https://awaw.cc/about/
+https://awaw.cc/post/deepin-20/
+https://awaw.cc/
+https://awaw.cc/tags/Software/
+https://awaw.cc/tags/Service/
+https://awaw.cc/tags/Awesome/
+https://awaw.cc/tags/NET/
+https://awaw.cc/tags/QRCode/
+https://awaw.cc/tags/OpenSource/
+https://awaw.cc/tags/Whimsy/
+https://awaw.cc/tags/Music/
+https://awaw.cc/tags/PlugIn/
+https://awaw.cc/tags/%E6%89%B9%E5%A4%84%E7%90%86/
+https://awaw.cc/tags/Database/
+https://awaw.cc/tags/ORM/
+https://awaw.cc/tags/SQL/
+https://awaw.cc/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/
+https://awaw.cc/tags/SSL/
+https://awaw.cc/tags/CA/
+https://awaw.cc/tags/cert/
+https://awaw.cc/tags/async/
+https://awaw.cc/tags/Note/
+https://awaw.cc/tags/RoadDesign/
+https://awaw.cc/tags/Git/
+https://awaw.cc/tags/BridgeDesign/
+https://awaw.cc/tags/Java/
+https://awaw.cc/tags/ShortLink/
+https://awaw.cc/tags/JS/
+https://awaw.cc/tags/DateFormat/
+https://awaw.cc/tags/Security/
+https://awaw.cc/tags/Map/
+https://awaw.cc/tags/%E5%9C%B0%E5%9B%BE/
+https://awaw.cc/tags/MD/
+https://awaw.cc/tags/Markdown/
+https://awaw.cc/tags/Revit/
+https://awaw.cc/tags/News/
+https://awaw.cc/tags/Python/
+https://awaw.cc/tags/reptile/
+https://awaw.cc/tags/PC/
+https://awaw.cc/tags/%E4%B8%BB%E6%9D%BF/
+https://awaw.cc/tags/PCI-E/
+https://awaw.cc/tags/NAS/
+https://awaw.cc/tags/Synology/
+https://awaw.cc/tags/DIY/
+https://awaw.cc/tags/Linux/
+https://awaw.cc/tags/OS/
+https://awaw.cc/tags/Steam/
+https://awaw.cc/tags/Game/
+https://awaw.cc/tags/Peace/
+https://awaw.cc/categories/Share/
+https://awaw.cc/categories/Tools/
+https://awaw.cc/categories/Developer/
diff --git a/sitemap.xml b/sitemap.xml
new file mode 100644
index 0000000..e392d81
--- /dev/null
+++ b/sitemap.xml
@@ -0,0 +1,664 @@
+
+
+
+
+ https://awaw.cc/post/awesome/
+
+ 2024-03-26
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/free-control/
+
+ 2024-03-21
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/my-second-pc/
+
+ 2023-12-28
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/whimsy/
+
+ 2023-09-19
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/js-map/
+
+ 2023-07-31
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/whats-short-link/
+
+ 2023-07-20
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/net-loading/
+
+ 2023-07-14
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/python-historytoday/
+
+ 2023-07-14
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/world-peace/
+
+ 2023-07-14
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/luoyang-subway/
+
+ 2023-07-14
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/listen1/
+
+ 2023-07-14
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/car-code-generator/
+
+ 2023-07-14
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/bat-date/
+
+ 2023-07-13
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/ms-opensource/
+
+ 2023-07-05
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/msi-b450m-mortar/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/my-first-nas/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/steam-free-game/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/ssms18-not-run/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/sql-tuning/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/sql-date-format/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/revit-category/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/revit-category-all/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/openssl-csr/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/js-dateformat/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/md-codeblock-lang/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/learn-bridge-design/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/learn-road-design/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/js-cryptojs/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/js-5tip/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/git-command/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/dapper-helper/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/movecar/
+
+ 2023-07-04
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/about/
+
+ 2023-07-03
+
+ monthly
+ 0.6
+
+
+
+ https://awaw.cc/post/deepin-20/
+
+ 2022-06-10
+
+ monthly
+ 0.6
+
+
+
+
+ https://awaw.cc/
+ 2024-03-26
+ daily
+ 1.0
+
+
+
+
+ https://awaw.cc/tags/Software/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Service/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Awesome/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/NET/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/QRCode/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/OpenSource/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Whimsy/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Music/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/PlugIn/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/%E6%89%B9%E5%A4%84%E7%90%86/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Database/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/ORM/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/SQL/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/SSL/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/CA/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/cert/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/async/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Note/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/RoadDesign/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Git/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/BridgeDesign/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Java/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/ShortLink/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/JS/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/DateFormat/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Security/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Map/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/%E5%9C%B0%E5%9B%BE/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/MD/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Markdown/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Revit/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/News/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Python/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/reptile/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/PC/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/%E4%B8%BB%E6%9D%BF/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/PCI-E/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/NAS/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Synology/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/DIY/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Linux/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/OS/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Steam/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Game/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/tags/Peace/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+
+
+ https://awaw.cc/categories/Share/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/categories/Tools/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
+ https://awaw.cc/categories/Developer/
+ 2024-03-26
+ weekly
+ 0.2
+
+
+
diff --git a/tags/Awesome/index.html b/tags/Awesome/index.html
new file mode 100644
index 0000000..f3d0000
--- /dev/null
+++ b/tags/Awesome/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Awesome - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/BridgeDesign/index.html b/tags/BridgeDesign/index.html
new file mode 100644
index 0000000..fccd537
--- /dev/null
+++ b/tags/BridgeDesign/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - BridgeDesign - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/CA/index.html b/tags/CA/index.html
new file mode 100644
index 0000000..9c645a2
--- /dev/null
+++ b/tags/CA/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - CA - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/DIY/index.html b/tags/DIY/index.html
new file mode 100644
index 0000000..4213795
--- /dev/null
+++ b/tags/DIY/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - DIY - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Database/index.html b/tags/Database/index.html
new file mode 100644
index 0000000..f706efd
--- /dev/null
+++ b/tags/Database/index.html
@@ -0,0 +1,508 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Database - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/DateFormat/index.html b/tags/DateFormat/index.html
new file mode 100644
index 0000000..63eb2e8
--- /dev/null
+++ b/tags/DateFormat/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - DateFormat - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Game/index.html b/tags/Game/index.html
new file mode 100644
index 0000000..9924780
--- /dev/null
+++ b/tags/Game/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Game - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Git/index.html b/tags/Git/index.html
new file mode 100644
index 0000000..bfb1616
--- /dev/null
+++ b/tags/Git/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Git - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/JS/index.html b/tags/JS/index.html
new file mode 100644
index 0000000..ebc0ac7
--- /dev/null
+++ b/tags/JS/index.html
@@ -0,0 +1,508 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - JS - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Java/index.html b/tags/Java/index.html
new file mode 100644
index 0000000..220b7bb
--- /dev/null
+++ b/tags/Java/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Java - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Linux/index.html b/tags/Linux/index.html
new file mode 100644
index 0000000..73cd19f
--- /dev/null
+++ b/tags/Linux/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Linux - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/MD/index.html b/tags/MD/index.html
new file mode 100644
index 0000000..f6486e2
--- /dev/null
+++ b/tags/MD/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - MD - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Map/index.html b/tags/Map/index.html
new file mode 100644
index 0000000..4f4ced1
--- /dev/null
+++ b/tags/Map/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Map - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Markdown/index.html b/tags/Markdown/index.html
new file mode 100644
index 0000000..4b0eb4f
--- /dev/null
+++ b/tags/Markdown/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Markdown - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Music/index.html b/tags/Music/index.html
new file mode 100644
index 0000000..6310ce6
--- /dev/null
+++ b/tags/Music/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Music - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/NAS/index.html b/tags/NAS/index.html
new file mode 100644
index 0000000..7f380b1
--- /dev/null
+++ b/tags/NAS/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - NAS - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/NET/index.html b/tags/NET/index.html
new file mode 100644
index 0000000..342bb25
--- /dev/null
+++ b/tags/NET/index.html
@@ -0,0 +1,523 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - .NET - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/News/index.html b/tags/News/index.html
new file mode 100644
index 0000000..cf6a1e2
--- /dev/null
+++ b/tags/News/index.html
@@ -0,0 +1,499 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - News - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Note/index.html b/tags/Note/index.html
new file mode 100644
index 0000000..7d52a97
--- /dev/null
+++ b/tags/Note/index.html
@@ -0,0 +1,496 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Note - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/ORM/index.html b/tags/ORM/index.html
new file mode 100644
index 0000000..72ca5e0
--- /dev/null
+++ b/tags/ORM/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - ORM - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/OS/index.html b/tags/OS/index.html
new file mode 100644
index 0000000..fa95886
--- /dev/null
+++ b/tags/OS/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - OS - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/OpenSource/index.html b/tags/OpenSource/index.html
new file mode 100644
index 0000000..e30cb12
--- /dev/null
+++ b/tags/OpenSource/index.html
@@ -0,0 +1,517 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - OpenSource - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/PC/index.html b/tags/PC/index.html
new file mode 100644
index 0000000..58eaf43
--- /dev/null
+++ b/tags/PC/index.html
@@ -0,0 +1,496 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - PC - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/PCI-E/index.html b/tags/PCI-E/index.html
new file mode 100644
index 0000000..073e255
--- /dev/null
+++ b/tags/PCI-E/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - PCI_E - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Peace/index.html b/tags/Peace/index.html
new file mode 100644
index 0000000..966db4e
--- /dev/null
+++ b/tags/Peace/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Peace - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/PlugIn/index.html b/tags/PlugIn/index.html
new file mode 100644
index 0000000..034dfd6
--- /dev/null
+++ b/tags/PlugIn/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - PlugIn - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Python/index.html b/tags/Python/index.html
new file mode 100644
index 0000000..a9fd46f
--- /dev/null
+++ b/tags/Python/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Python - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/QRCode/index.html b/tags/QRCode/index.html
new file mode 100644
index 0000000..eb37dec
--- /dev/null
+++ b/tags/QRCode/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - QRCode - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Revit/index.html b/tags/Revit/index.html
new file mode 100644
index 0000000..3d21183
--- /dev/null
+++ b/tags/Revit/index.html
@@ -0,0 +1,496 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Revit - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/RoadDesign/index.html b/tags/RoadDesign/index.html
new file mode 100644
index 0000000..9b6c9bc
--- /dev/null
+++ b/tags/RoadDesign/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - RoadDesign - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/SQL/index.html b/tags/SQL/index.html
new file mode 100644
index 0000000..f73b9f0
--- /dev/null
+++ b/tags/SQL/index.html
@@ -0,0 +1,499 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - SQL - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/SSL/index.html b/tags/SSL/index.html
new file mode 100644
index 0000000..92f645d
--- /dev/null
+++ b/tags/SSL/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - SSL - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Security/index.html b/tags/Security/index.html
new file mode 100644
index 0000000..37a375c
--- /dev/null
+++ b/tags/Security/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Security - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Service/index.html b/tags/Service/index.html
new file mode 100644
index 0000000..0ff6d1e
--- /dev/null
+++ b/tags/Service/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Service - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/ShortLink/index.html b/tags/ShortLink/index.html
new file mode 100644
index 0000000..3b11be1
--- /dev/null
+++ b/tags/ShortLink/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - ShortLink - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Software/index.html b/tags/Software/index.html
new file mode 100644
index 0000000..235c8ac
--- /dev/null
+++ b/tags/Software/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Software - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Steam/index.html b/tags/Steam/index.html
new file mode 100644
index 0000000..a734cf7
--- /dev/null
+++ b/tags/Steam/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Steam - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Synology/index.html b/tags/Synology/index.html
new file mode 100644
index 0000000..5a0f576
--- /dev/null
+++ b/tags/Synology/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Synology - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/Whimsy/index.html b/tags/Whimsy/index.html
new file mode 100644
index 0000000..fdac23a
--- /dev/null
+++ b/tags/Whimsy/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Whimsy - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/async/index.html b/tags/async/index.html
new file mode 100644
index 0000000..724b09a
--- /dev/null
+++ b/tags/async/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - async - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/cert/index.html b/tags/cert/index.html
new file mode 100644
index 0000000..73d37c8
--- /dev/null
+++ b/tags/cert/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - cert - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/index.html b/tags/index.html
new file mode 100644
index 0000000..0b9879a
--- /dev/null
+++ b/tags/index.html
@@ -0,0 +1,474 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tags/reptile/index.html b/tags/reptile/index.html
new file mode 100644
index 0000000..8a77af3
--- /dev/null
+++ b/tags/reptile/index.html
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - reptile - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git "a/tags/\344\270\273\346\235\277/index.html" "b/tags/\344\270\273\346\235\277/index.html"
new file mode 100644
index 0000000..300aefd
--- /dev/null
+++ "b/tags/\344\270\273\346\235\277/index.html"
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - 主板 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git "a/tags/\345\234\260\345\233\276/index.html" "b/tags/\345\234\260\345\233\276/index.html"
new file mode 100644
index 0000000..784ab1f
--- /dev/null
+++ "b/tags/\345\234\260\345\233\276/index.html"
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - 地图 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git "a/tags/\346\211\271\345\244\204\347\220\206/index.html" "b/tags/\346\211\271\345\244\204\347\220\206/index.html"
new file mode 100644
index 0000000..03dfa95
--- /dev/null
+++ "b/tags/\346\211\271\345\244\204\347\220\206/index.html"
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - 批处理 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git "a/tags/\346\225\260\346\215\256\345\272\223/index.html" "b/tags/\346\225\260\346\215\256\345\272\223/index.html"
new file mode 100644
index 0000000..5c71887
--- /dev/null
+++ "b/tags/\346\225\260\346\215\256\345\272\223/index.html"
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签 - 数据库 - Pdone's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客在允许 JavaScript 运行的环境下浏览效果更佳
+
+
+
diff --git a/tools/catch-the-cat/catch-the-cat.js b/tools/catch-the-cat/catch-the-cat.js
new file mode 100644
index 0000000..883869b
--- /dev/null
+++ b/tools/catch-the-cat/catch-the-cat.js
@@ -0,0 +1,19 @@
+!function(t){var e={};function n(o){if(e[o])return e[o].exports;var r=e[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=t,n.c=e,n.d=function(t,e,o){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:o})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)n.d(o,r,function(e){return t[e]}.bind(null,r));return o},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=3)}([function(t,e,n){"use strict";var o,r=this&&this.__extends||(o=function(t,e){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0});var i,s=n(1),a=n(20),l=n(22),d=n(23),h=n(24),u=n(25),f=n(2),p=n(26),c=n(27);!function(t){t.PLAYING="playing",t.WIN="win",t.LOSE="lose"}(i||(i={}));var k=function(t){function e(e,n,o){var r=t.call(this,{key:"MainScene"})||this;return r.w=e,r.h=n,r.r=o,r.dx=2*r.r,r.dy=r.r*Math.sqrt(3),r}return r(e,t),Object.defineProperty(e.prototype,"blocks",{get:function(){return this.data.get("blocks")},set:function(t){this.data.set("blocks",t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"blocksData",{get:function(){var t=[];return this.blocks.forEach(function(e,n){t[n]=[],e.forEach(function(e,o){t[n][o]=e.isWall})}),t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"cat",{get:function(){return this.data.get("cat")},set:function(t){this.data.set("cat",t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"statusBar",{get:function(){return this.data.get("status_bar")},set:function(t){this.data.set("status_bar",t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"creditText",{get:function(){return this.data.get("credit_text")},set:function(t){this.data.set("credit_text",t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"state",{get:function(){return this.data.get("state")},set:function(t){switch(t){case i.PLAYING:break;case i.LOSE:this.setStatusText(f.default("猫已经跑到地图边缘了,你输了"));break;case i.WIN:this.setStatusText(f.default("猫已经无路可走,你赢了"));break;default:return}this.data.set("state",t)},enumerable:!0,configurable:!0}),e.getNeighbours=function(t,e){var n,o,r,i,s={i:t-1,j:e},a={i:t+1,j:e};0==(1&e)?(n={i:t-1,j:e-1},o={i:t,j:e-1},r={i:t-1,j:e+1},i={i:t,j:e+1}):(n={i:t,j:e-1},o={i:t+1,j:e-1},r={i:t,j:e+1},i={i:t+1,j:e+1});var l=[];return l[0]=s,l[1]=n,l[2]=o,l[3]=a,l[4]=i,l[5]=r,l},e.prototype.preload=function(){var t=this.r/s.default.catStepLength;for(var e in s.default.textures)this.load.addFile(new c.default(this.load,e,s.default.textures[e],{scale:t}))},e.prototype.create=function(){this.createAnimations(),this.createBlocks(),this.createCat(),this.createStatusText(),this.createResetButton(),this.createCreditText(),this.reset(),this.game.solver&&(this.cat.solver=this.game.solver)},e.prototype.getPosition=function(t,e){return{x:3*this.r+(0==(1&e)?this.r:this.dx)+t*this.dx,y:3*this.r+this.r+e*this.dy}},e.prototype.getBlock=function(t,e){return t>=0&&t=0&&e\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e){t.exports='\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'},function(t,e,n){"use strict";var o,r=this&&this.__extends||(o=function(t,e){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0});var i=n(0),s=n(1),a=n(21),l=function(t){function e(e){var n=t.call(this,e,0,0,"__DEFAULT")||this;return n.on("animationrepeat",function(){n.moveForward()}),n.solver=a.default,n.direction=s.default.catDefaultDirection,n.reset(),n}return r(e,t),Object.defineProperty(e.prototype,"i",{get:function(){return this.getData("i")},set:function(t){this.setData("i",t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"j",{get:function(){return this.getData("j")},set:function(t){this.setData("j",t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"direction",{get:function(){return this.getData("direction")},set:function(t){this.setData("direction",t),this.resetTextureToStop(),this.resetOriginAndScale()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"solver",{get:function(){return this.getData("solver")},set:function(t){this.setData("solver",t)},enumerable:!0,configurable:!0}),e.prototype.reset=function(){this.anims.stop(),this.direction=s.default.catDefaultDirection,this.resetIJ()},e.prototype.step=function(){var t=this.solver.call(this,this.scene.blocksData,this.i,this.j);return t<0||t>6?(this.caught(),!1):!!this.stepDirection(t)||(this.caught(),!1)},e.prototype.isCaught=function(){var t=this;return!this.getCurrentNeighbours().some(function(e,n){var o=t.scene.getBlock(e.i,e.j);return null!==o&&!o.isWall})},e.prototype.caught=function(){this.setTexture(s.default.cannotEscapeTextures[s.default.directions[this.direction].name])},e.prototype.escape=function(){0===this.j||this.j===this.scene.h-1?this.runForward():0===this.i?this.runDirection(0):this.i===this.scene.w-1&&this.runDirection(3)},e.prototype.setIJ=function(t,e){this.i=t,this.j=e;var n=this.scene.getPosition(t,e);return this.setPosition(n.x,n.y)},e.prototype.resetIJ=function(){this.setIJ(Math.floor(this.scene.w/2),Math.floor(this.scene.h/2))},e.prototype.isEscaped=function(){return this.i<=0||this.i>=this.scene.w-1||this.j<=0||this.j>=this.scene.h-1},e.prototype.checkState=function(){this.isEscaped()?(this.escape(),this.emit("escaped")):this.isCaught()&&(this.caught(),this.emit("win"))},e.prototype.getCurrentNeighbours=function(){return i.default.getNeighbours(this.i,this.j)},e.prototype.resetTextureToStop=function(){this.setTexture(s.default.stopTextures[s.default.directions[this.direction].name])},e.prototype.resetOriginAndScale=function(){var t=s.default.directions[this.direction],e=s.default.origins[t.name];this.setOrigin(e.x,e.y),this.scaleX=t.scaleX},e.prototype.moveForward=function(){var t=this.getCurrentNeighbours()[this.direction];this.setIJ(t.i,t.j),this.checkState()},e.prototype.stepForward=function(){var t=this,e=this.getCurrentNeighbours()[this.direction],n=this.scene.getBlock(e.i,e.j);return null!==n&&(!n.isWall&&(this.play(s.default.directions[this.direction].name+"_step"),this.once("animationcomplete",function(){t.moveForward(),t.resetTextureToStop()}),!0))},e.prototype.stepDirection=function(t){return this.direction=t,this.stepForward()},e.prototype.runForward=function(){this.play(s.default.directions[this.direction].name+"_run")},e.prototype.runDirection=function(t){this.direction=t,this.runForward()},e}(Phaser.GameObjects.Sprite);e.default=l},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0);e.default=function(t,e,n){var r=-1;return o.default.getNeighbours(e,n).forEach(function(e,n){-1===r&&(void 0===t[e.i]||void 0===t[e.i][e.j]||t[e.i][e.j]||(r=n))}),r}},function(t,e,n){"use strict";var o,r=this&&this.__extends||(o=function(t,e){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0});var i=function(t){function e(e,n,o,r){var i=this,s=e.getPosition(n,o);(i=t.call(this,e,s.x,s.y,r,0,360,!1,0,1)||this).i=n,i.j=o,i.r=r,i.isWall=!1;var a=new Phaser.Geom.Circle(i.r/2,i.r/2,i.r);return i.setInteractive(a,Phaser.Geom.Circle.Contains),i.on("pointerdown",function(){i.emit("player_click",i.i,i.j)}),i}return r(e,t),Object.defineProperty(e.prototype,"isWall",{get:function(){return this._isWall},set:function(t){this._isWall=t,this.fillColor=t?13158:11786751},enumerable:!0,configurable:!0}),e}(Phaser.GameObjects.Arc);e.default=i},function(t,e,n){"use strict";var o,r=this&&this.__extends||(o=function(t,e){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),s=function(t){function e(e){var n=t.call(this,e,0,0,i.default("重置"),{})||this;n.setColor("#000000");var o=e.r;n.setFontSize(o),n.setPadding(o,o,o,o),n.setPosition(0,e.game.canvas.height),n.setOrigin(0,1);var r=new Phaser.Geom.Rectangle(0,0,n.width,n.height);return n.setInteractive(r,Phaser.Geom.Rectangle.Contains),n}return r(e,t),e}(Phaser.GameObjects.Text);e.default=s},function(t,e,n){"use strict";var o,r=this&&this.__extends||(o=function(t,e){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0});var i=function(t){function e(e){var n=t.call(this,e,0,0,"",{})||this;n.setColor("#000000");var o=e.r;return n.setFontSize(o),"center"===e.game.myConfig.statusBarAlign&&(n.setX(e.game.canvas.width/2),n.setOrigin(.5,0)),n.setPadding(o,o,o,o),n}return r(e,t),e}(Phaser.GameObjects.Text);e.default=i},function(t,e,n){"use strict";var o,r=this&&this.__extends||(o=function(t,e){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0});var i=function(t){function e(e){var n=t.call(this,e,0,0,"",{})||this;n.setColor("#000000"),n.setPosition(e.game.canvas.width,e.game.canvas.height),n.setOrigin(1,1);var o=e.r;return n.setFontSize(.8*o),n.setPadding(o,o,o,o),n.setText(e.game.myConfig.credit),n}return r(e,t),e}(Phaser.GameObjects.Text);e.default=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=function(){function t(t,e,n,o){this.i=e,this.j=n,this.isWall=o,this.distance=1/0,this.parent=t,this.isEdge=this.i<=0||this.i>=this.parent.w-1||this.j<=0||this.j>=this.parent.h-1}return Object.defineProperty(t.prototype,"routesCount",{get:function(){var t=this;if(void 0===this._routesCount)if(this.isEdge)this._routesCount=1;else{var e=0;this.neighbours.forEach(function(n){null===n||n.isWall||n.distancee&&(e=r.routesCount,n=o)}),n},enumerable:!0,configurable:!0}),t}(),i=function(){function t(t){var e=this;if(this.w=t.length,this.w<=0)throw new Error("empty blocks");this.h=t[0].length,this.blocks=t.map(function(n,o){return n.map(function(n,i){return new r(e,o,i,t[o][i])})})}return t.prototype.getBlock=function(t,e){return t>=0&&t=0&&ee.distance+1&&(n.distance=e.distance+1,t.indexOf(n)<0&&t.push(n))})};t.length>0;)e()},t.prototype.toString=function(){for(var t=[],e=0;e0?r[0]:-1},e.default=function(t,e,n){var o=new i(t);return o.calcAllDistances(),o.getBlock(e,n).direction}},function(t,e,n){"use strict";var o,r=this&&this.__extends||(o=function(t,e){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0});var i=n(28),s=function(t){function e(e,n,o,r){var i=t.call(this,e,n,void 0,r)||this;return i.rawData=o,i}return r(e,t),e.prototype.load=function(){this.state===Phaser.Loader.FILE_POPULATED?this.loader.nextFile(this,!0):this.xhrLoader=i.default(this,this.loader.xhr)},e}(Phaser.Loader.FileTypes.SVGFile);e.default=s},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(29);e.default=function(t,e){var n=new o.default;return n.open("GET",t.src,e.async,e.user,e.password),n.responseType=t.xhrSettings.responseType,n.timeout=e.timeout,e.header&&e.headerValue&&n.setRequestHeader(e.header,e.headerValue),e.requestedWith&&n.setRequestHeader("X-Requested-With",e.requestedWith),e.overrideMimeType&&n.overrideMimeType(e.overrideMimeType),n.onload=t.onLoad.bind(t,n),n.onerror=t.onError.bind(t),n.onprogress=t.onProgress.bind(t),n.send(),setTimeout(function(){n.respond(200,{"Content-Type":"application/octet-stream"},t.rawData)},1),n}},function(t,e,n){"use strict";n.r(e);
+/**
+ * Minimal Event interface implementation
+ *
+ * Original implementation by Sven Fuchs: https://gist.github.com/995028
+ * Modifications and tests by Christian Johansen.
+ *
+ * @author Sven Fuchs (svenfuchs@artweb-design.de)
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2011 Sven Fuchs, Christian Johansen
+ */
+var o=function(t,e,n,o){this.type=t,this.bubbles=e,this.cancelable=n,this.target=o};o.prototype={stopPropagation:function(){},preventDefault:function(){this.defaultPrevented=!0}};var r={100:"Continue",101:"Switching Protocols",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",300:"Multiple Choice",301:"Moved Permanently",302:"Found",303:"See Other",304:"Not Modified",305:"Use Proxy",307:"Temporary Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Request Entity Too Large",414:"Request-URI Too Long",415:"Unsupported Media Type",416:"Requested Range Not Satisfiable",417:"Expectation Failed",422:"Unprocessable Entity",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported"};var i={"Accept-Charset":!0,"Accept-Encoding":!0,Connection:!0,"Content-Length":!0,Cookie:!0,Cookie2:!0,"Content-Transfer-Encoding":!0,Date:!0,Expect:!0,Host:!0,"Keep-Alive":!0,Referer:!0,TE:!0,Trailer:!0,"Transfer-Encoding":!0,Upgrade:!0,"User-Agent":!0,Via:!0};function s(t,e){e.addEventListener(t,function(n){var o=e["on"+t];o&&"function"==typeof o&&o.call(n.target,n)})}function a(){this._eventListeners={};for(var t=["loadstart","progress","load","abort","loadend"],e=t.length-1;e>=0;e--)s(t[e],this)}function l(){a.call(this),this.readyState=l.UNSENT,this.requestHeaders={},this.requestBody=null,this.status=0,this.statusText="",this.upload=new a}a.prototype={addEventListener:function(t,e){this._eventListeners[t]=this._eventListeners[t]||[],this._eventListeners[t].push(e)},removeEventListener:function(t,e){for(var n=this._eventListeners[t]||[],o=0,r=n.length;ol.UNSENT&&this.sendFlag&&(this._readyStateChange(l.UNSENT),this.sendFlag=!1),"function"==typeof this.onerror&&this.onerror()},getResponseHeader:function(t){if(this.readyState
+
+
+
+ Catch The Cat
+
+
+
+
+
+
+
+
+
+
diff --git a/tools/catch-the-cat/phaser.min.js b/tools/catch-the-cat/phaser.min.js
new file mode 100644
index 0000000..c2d2d19
--- /dev/null
+++ b/tools/catch-the-cat/phaser.min.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("Phaser",[],e):"object"==typeof exports?exports.Phaser=e():t.Phaser=e()}(window,function(){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var s=e[n]={i:n,l:!1,exports:{}};return t[n].call(s.exports,s,s.exports,i),s.l=!0,s.exports}return i.m=t,i.c=e,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.r=function(t){Object.defineProperty(t,"__esModule",{value:!0})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=1360)}([function(t,e){function i(t,e,i){var n=i?t[e]:Object.getOwnPropertyDescriptor(t,e);return!i&&n.value&&"object"==typeof n.value&&(n=n.value),!(!n||!function(t){return!!t.get&&"function"==typeof t.get||!!t.set&&"function"==typeof t.set}(n))&&(void 0===n.enumerable&&(n.enumerable=!0),void 0===n.configurable&&(n.configurable=!0),n)}function n(t,e){var i=Object.getOwnPropertyDescriptor(t,e);return!!i&&(i.value&&"object"==typeof i.value&&(i=i.value),!1===i.configurable)}function s(t,e,s,r){for(var a in e)if(e.hasOwnProperty(a)){var h=i(e,a,s);if(!1!==h){if(n((r||t).prototype,a)){if(o.ignoreFinals)continue;throw new Error("cannot override final property '"+a+"', set Class.ignoreFinals = true to skip")}Object.defineProperty(t.prototype,a,h)}else t.prototype[a]=e[a]}}function r(t,e){if(e){Array.isArray(e)||(e=[e]);for(var i=0;i0&&(i=1/Math.sqrt(i),this.x=t*i,this.y=e*i),this},normalizeRightHand:function(){var t=this.x;return this.x=-1*this.y,this.y=t,this},dot:function(t){return this.x*t.x+this.y*t.y},cross:function(t){return this.x*t.y-this.y*t.x},lerp:function(t,e){void 0===e&&(e=0);var i=this.x,n=this.y;return this.x=i+e*(t.x-i),this.y=n+e*(t.y-n),this},transformMat3:function(t){var e=this.x,i=this.y,n=t.val;return this.x=n[0]*e+n[3]*i+n[6],this.y=n[1]*e+n[4]*i+n[7],this},transformMat4:function(t){var e=this.x,i=this.y,n=t.val;return this.x=n[0]*e+n[4]*i+n[12],this.y=n[1]*e+n[5]*i+n[13],this},reset:function(){return this.x=0,this.y=0,this}});n.ZERO=new n,n.RIGHT=new n(1,0),n.LEFT=new n(-1,0),n.UP=new n(0,-1),n.DOWN=new n(0,1),n.ONE=new n(1,1),t.exports=n},function(t,e){t.exports=function(t,e,i){if(t&&"number"!=typeof t){if(t.hasOwnProperty(e))return t[e];if(-1!==e.indexOf(".")){for(var n=e.split("."),s=t,r=i,o=0;o>>0},getTintAppendFloatAlpha:function(t,e){return((255&(255*e|0))<<24|t)>>>0},getTintAppendFloatAlphaAndSwap:function(t,e){return((255&(255*e|0))<<24|(255&(0|t))<<16|(255&(t>>8|0))<<8|255&(t>>16|0))>>>0},getFloatsFromUintRGB:function(t){return[(255&(t>>16|0))/255,(255&(t>>8|0))/255,(255&(0|t))/255]},getComponentCount:function(t,e){for(var i=0,n=0;n=this.right?this.width=0:this.width=this.right-t,this.x=t}},right:{get:function(){return this.x+this.width},set:function(t){t<=this.x?this.width=0:this.width=t-this.x}},top:{get:function(){return this.y},set:function(t){t>=this.bottom?this.height=0:this.height=this.bottom-t,this.y=t}},bottom:{get:function(){return this.y+this.height},set:function(t){t<=this.y?this.height=0:this.height=t-this.y}},centerX:{get:function(){return this.x+this.width/2},set:function(t){this.x=t-this.width/2}},centerY:{get:function(){return this.y+this.height/2},set:function(t){this.y=t-this.height/2}}});t.exports=l},function(t,e,i){"use strict";var n=Object.prototype.hasOwnProperty,s="~";function r(){}function o(t,e,i,n,r){if("function"!=typeof i)throw new TypeError("The listener must be a function");var o=new function(t,e,i){this.fn=t,this.context=e,this.once=i||!1}(i,n||t,r),a=s?s+e:e;return t._events[a]?t._events[a].fn?t._events[a]=[t._events[a],o]:t._events[a].push(o):(t._events[a]=o,t._eventsCount++),t}function a(t,e){0==--t._eventsCount?t._events=new r:delete t._events[e]}function h(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(s=!1)),h.prototype.eventNames=function(){var t,e,i=[];if(0===this._eventsCount)return i;for(e in t=this._events)n.call(t,e)&&i.push(s?e.slice(1):e);return Object.getOwnPropertySymbols?i.concat(Object.getOwnPropertySymbols(t)):i},h.prototype.listeners=function(t){var e=s?s+t:t,i=this._events[e];if(!i)return[];if(i.fn)return[i.fn];for(var n=0,r=i.length,o=new Array(r);no.width&&(i=Math.max(o.width-t,0)),e+s>o.height&&(s=Math.max(o.height-e,0));for(var u=[],c=e;c=400&&t.status<=599&&(n=!1),this.resetXHR(),this.loader.nextFile(this,n)},onError:function(){this.resetXHR(),this.loader.nextFile(this,!1)},onProgress:function(t){t.lengthComputable&&(this.bytesLoaded=t.loaded,this.bytesTotal=t.total,this.percentComplete=Math.min(this.bytesLoaded/this.bytesTotal,1),this.loader.emit(r.FILE_PROGRESS,this,this.percentComplete))},onProcess:function(){this.state=s.FILE_PROCESSING,this.onProcessComplete()},onProcessComplete:function(){this.state=s.FILE_COMPLETE,this.multiFile&&this.multiFile.onFileComplete(this),this.loader.fileProcessComplete(this)},onProcessError:function(){this.state=s.FILE_ERRORED,this.multiFile&&this.multiFile.onFileFailed(this),this.loader.fileProcessComplete(this)},hasCacheConflict:function(){return this.cache&&this.cache.exists(this.key)},addToCache:function(){this.cache&&this.cache.add(this.key,this.data),this.pendingDestroy()},pendingDestroy:function(t){void 0===t&&(t=this.data);var e=this.key,i=this.type;this.loader.emit(r.FILE_COMPLETE,e,i,t),this.loader.emit(r.FILE_KEY_COMPLETE+i+"-"+e,e,i,t),this.loader.flagForRemoval(this)},destroy:function(){this.loader=null,this.cache=null,this.xhrSettings=null,this.multiFile=null,this.linkFile=null,this.data=null}});c.createObjectURL=function(t,e,i){if("function"==typeof URL)t.src=URL.createObjectURL(e);else{var n=new FileReader;n.onload=function(){t.removeAttribute("crossOrigin"),t.src="data:"+(e.type||i)+";base64,"+n.result.split(",")[1]},n.onerror=t.onerror,n.readAsDataURL(e)}},c.revokeObjectURL=function(t){"function"==typeof URL&&URL.revokeObjectURL(t.src)},t.exports=c},function(t,e){t.exports=function(t,e,i){return Math.max(e,Math.min(i,t))}},function(t,e,i){var n,s,r,o=i(28),a=i(130),h=[],l=!1;t.exports={create2D:function(t,e,i){return n(t,e,i,o.CANVAS)},create:n=function(t,e,i,n,r){var u;void 0===e&&(e=1),void 0===i&&(i=1),void 0===n&&(n=o.CANVAS),void 0===r&&(r=!1);var c=s(n);return null===c?(c={parent:t,canvas:document.createElement("canvas"),type:n},n===o.CANVAS&&h.push(c),u=c.canvas):(c.parent=t,u=c.canvas),r&&(c.parent=u),u.width=e,u.height=i,l&&n===o.CANVAS&&a.disable(u.getContext("2d")),u},createWebGL:function(t,e,i){return n(t,e,i,o.WEBGL)},disableSmoothing:function(){l=!0},enableSmoothing:function(){l=!1},first:s=function(t){if(void 0===t&&(t=o.CANVAS),t===o.WEBGL)return null;for(var e=0;e=0;o--)t[o][e]=i+a*n,a++;return t}},function(t,e,i){var n={VERSION:"3.16.1",BlendModes:i(60),ScaleModes:i(101),AUTO:0,CANVAS:1,WEBGL:2,HEADLESS:3,FOREVER:-1,NONE:4,UP:5,DOWN:6,LEFT:7,RIGHT:8};t.exports=n},function(t,e,i){var n=i(0),s=i(13),r=i(18),o=i(59),a=new n({Extends:r,Mixins:[s.Alpha,s.BlendMode,s.ComputedSize,s.Depth,s.GetBounds,s.Mask,s.Origin,s.Pipeline,s.ScaleMode,s.ScrollFactor,s.Transform,s.Visible],initialize:function(t,e,i){void 0===e&&(e="Shape"),r.call(this,t,e),this.geom=i,this.pathData=[],this.pathIndexes=[],this.fillColor=16777215,this.fillAlpha=1,this.strokeColor=16777215,this.strokeAlpha=1,this.lineWidth=1,this.isFilled=!1,this.isStroked=!1,this.closePath=!0,this._tempLine=new o,this.initPipeline()},setFillStyle:function(t,e){return void 0===e&&(e=1),void 0===t?this.isFilled=!1:(this.fillColor=t,this.fillAlpha=e,this.isFilled=!0),this},setStrokeStyle:function(t,e,i){return void 0===i&&(i=1),void 0===t?this.isStroked=!1:(this.lineWidth=t,this.strokeColor=e,this.strokeAlpha=i,this.isStroked=!0),this},setClosePath:function(t){return this.closePath=t,this},preDestroy:function(){this.geom=null,this._tempLine=null,this.pathData=[],this.pathIndexes=[]}});t.exports=a},function(t,e,i){var n=i(60),s=i(12),r=i(101);t.exports=function(t,e,i){e.x=s(i,"x",0),e.y=s(i,"y",0),e.depth=s(i,"depth",0),e.flipX=s(i,"flipX",!1),e.flipY=s(i,"flipY",!1);var o=s(i,"scale",null);"number"==typeof o?e.setScale(o):null!==o&&(e.scaleX=s(o,"x",1),e.scaleY=s(o,"y",1));var a=s(i,"scrollFactor",null);"number"==typeof a?e.setScrollFactor(a):null!==a&&(e.scrollFactorX=s(a,"x",1),e.scrollFactorY=s(a,"y",1)),e.rotation=s(i,"rotation",0);var h=s(i,"angle",null);null!==h&&(e.angle=h),e.alpha=s(i,"alpha",1);var l=s(i,"origin",null);if("number"==typeof l)e.setOrigin(l);else if(null!==l){var u=s(l,"x",.5),c=s(l,"y",.5);e.setOrigin(u,c)}return e.scaleMode=s(i,"scaleMode",r.DEFAULT),e.blendMode=s(i,"blendMode",n.NORMAL),e.visible=s(i,"visible",!0),s(i,"add",!0)&&t.sys.displayList.add(e),e.preUpdate&&t.sys.updateList.add(e),e}},function(t,e){t.exports={CSV:0,TILED_JSON:1,ARRAY_2D:2,WELTMEISTER:3}},function(t,e,i){var n=i(0),s=i(191),r=i(409),o=i(190),a=i(408),h=new n({initialize:function(t,e,i,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=255),this.r=0,this.g=0,this.b=0,this.a=255,this._h=0,this._s=0,this._v=0,this._locked=!1,this.gl=[0,0,0,1],this._color=0,this._color32=0,this._rgba="",this.setTo(t,e,i,n)},transparent:function(){return this._locked=!0,this.red=0,this.green=0,this.blue=0,this.alpha=0,this._locked=!1,this.update(!0)},setTo:function(t,e,i,n,s){return void 0===n&&(n=255),void 0===s&&(s=!0),this._locked=!0,this.red=t,this.green=e,this.blue=i,this.alpha=n,this._locked=!1,this.update(s)},setGLTo:function(t,e,i,n){return void 0===n&&(n=1),this._locked=!0,this.redGL=t,this.greenGL=e,this.blueGL=i,this.alphaGL=n,this._locked=!1,this.update(!0)},setFromRGB:function(t){return this._locked=!0,this.red=t.r,this.green=t.g,this.blue=t.b,t.hasOwnProperty("a")&&(this.alpha=t.a),this._locked=!1,this.update(!0)},setFromHSV:function(t,e,i){return o(t,e,i,this)},update:function(t){if(void 0===t&&(t=!1),this._locked)return this;var e=this.r,i=this.g,n=this.b,o=this.a;return this._color=s(e,i,n),this._color32=r(e,i,n,o),this._rgba="rgba("+e+","+i+","+n+","+o/255+")",t&&a(e,i,n,this),this},updateHSV:function(){var t=this.r,e=this.g,i=this.b;return a(t,e,i,this),this},clone:function(){return new h(this.r,this.g,this.b,this.a)},gray:function(t){return this.setTo(t,t,t)},random:function(t,e){void 0===t&&(t=0),void 0===e&&(e=255);var i=Math.floor(t+Math.random()*(e-t)),n=Math.floor(t+Math.random()*(e-t)),s=Math.floor(t+Math.random()*(e-t));return this.setTo(i,n,s)},randomGray:function(t,e){void 0===t&&(t=0),void 0===e&&(e=255);var i=Math.floor(t+Math.random()*(e-t));return this.setTo(i,i,i)},saturate:function(t){return this.s+=t/100,this},desaturate:function(t){return this.s-=t/100,this},lighten:function(t){return this.v+=t/100,this},darken:function(t){return this.v-=t/100,this},brighten:function(t){var e=this.r,i=this.g,n=this.b;return e=Math.max(0,Math.min(255,e-Math.round(-t/100*255))),i=Math.max(0,Math.min(255,i-Math.round(-t/100*255))),n=Math.max(0,Math.min(255,n-Math.round(-t/100*255))),this.setTo(e,i,n)},color:{get:function(){return this._color}},color32:{get:function(){return this._color32}},rgba:{get:function(){return this._rgba}},redGL:{get:function(){return this.gl[0]},set:function(t){this.gl[0]=Math.min(Math.abs(t),1),this.r=Math.floor(255*this.gl[0]),this.update(!0)}},greenGL:{get:function(){return this.gl[1]},set:function(t){this.gl[1]=Math.min(Math.abs(t),1),this.g=Math.floor(255*this.gl[1]),this.update(!0)}},blueGL:{get:function(){return this.gl[2]},set:function(t){this.gl[2]=Math.min(Math.abs(t),1),this.b=Math.floor(255*this.gl[2]),this.update(!0)}},alphaGL:{get:function(){return this.gl[3]},set:function(t){this.gl[3]=Math.min(Math.abs(t),1),this.a=Math.floor(255*this.gl[3]),this.update()}},red:{get:function(){return this.r},set:function(t){t=Math.floor(Math.abs(t)),this.r=Math.min(t,255),this.gl[0]=t/255,this.update(!0)}},green:{get:function(){return this.g},set:function(t){t=Math.floor(Math.abs(t)),this.g=Math.min(t,255),this.gl[1]=t/255,this.update(!0)}},blue:{get:function(){return this.b},set:function(t){t=Math.floor(Math.abs(t)),this.b=Math.min(t,255),this.gl[2]=t/255,this.update(!0)}},alpha:{get:function(){return this.a},set:function(t){t=Math.floor(Math.abs(t)),this.a=Math.min(t,255),this.gl[3]=t/255,this.update()}},h:{get:function(){return this._h},set:function(t){this._h=t,o(t,this._s,this._v,this)}},s:{get:function(){return this._s},set:function(t){this._s=t,o(this._h,t,this._v,this)}},v:{get:function(){return this._v},set:function(t){this._v=t,o(this._h,this._s,t,this)}}});t.exports=h},function(t,e){t.exports=function(t,e,i){var n=i||e.fillColor,s=e.fillAlpha,r=(16711680&n)>>>16,o=(65280&n)>>>8,a=255&n;t.fillStyle="rgba("+r+","+o+","+a+","+s+")"}},function(t,e,i){var n=i(20);t.exports=function(t){return t*n.DEG_TO_RAD}},function(t,e){t.exports=function(t,e,i,n,s,r){var o;void 0===n&&(n=0),void 0===s&&(s=0),void 0===r&&(r=1);var a=0,h=t.length;if(1===r)for(o=s;o=0;o--)t[o][e]+=i+a*n,a++;return t}},function(t,e,i){(function(e){var i={};t.exports=i,function(){i._nextId=0,i._seed=0,i._nowStartTime=+new Date,i.extend=function(t,e){var n,s;"boolean"==typeof e?(n=2,s=e):(n=1,s=!0);for(var r=n;r0;e--){var n=Math.floor(i.random()*(e+1)),s=t[e];t[e]=t[n],t[n]=s}return t},i.choose=function(t){return t[Math.floor(i.random()*t.length)]},i.isElement=function(t){return"undefined"!=typeof HTMLElement?t instanceof HTMLElement:!!(t&&t.nodeType&&t.nodeName)},i.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)},i.isFunction=function(t){return"function"==typeof t},i.isPlainObject=function(t){return"object"==typeof t&&t.constructor===Object},i.isString=function(t){return"[object String]"===toString.call(t)},i.clamp=function(t,e,i){return ti?i:t},i.sign=function(t){return t<0?-1:1},i.now=function(){if(window.performance){if(window.performance.now)return window.performance.now();if(window.performance.webkitNow)return window.performance.webkitNow()}return new Date-i._nowStartTime},i.random=function(e,i){return e=void 0!==e?e:0,i=void 0!==i?i:1,e+t()*(i-e)};var t=function(){return i._seed=(9301*i._seed+49297)%233280,i._seed/233280};i.colorToNumber=function(t){return 3==(t=t.replace("#","")).length&&(t=t.charAt(0)+t.charAt(0)+t.charAt(1)+t.charAt(1)+t.charAt(2)+t.charAt(2)),parseInt(t,16)},i.logLevel=1,i.log=function(){console&&i.logLevel>0&&i.logLevel<=3&&console.log.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},i.info=function(){console&&i.logLevel>0&&i.logLevel<=2&&console.info.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},i.warn=function(){console&&i.logLevel>0&&i.logLevel<=3&&console.warn.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},i.nextId=function(){return i._nextId++},i.indexOf=function(t,e){if(t.indexOf)return t.indexOf(e);for(var i=0;i>>16,r=(65280&i)>>>8,o=255&i;t.strokeStyle="rgba("+s+","+r+","+o+","+n+")",t.lineWidth=e.lineWidth}},function(t,e,i){t.exports={DESTROY:i(1168),FADE_IN_COMPLETE:i(1167),FADE_IN_START:i(1166),FADE_OUT_COMPLETE:i(1165),FADE_OUT_START:i(1164),FLASH_COMPLETE:i(1163),FLASH_START:i(1162),PAN_COMPLETE:i(1161),PAN_START:i(1160),POST_RENDER:i(1159),PRE_RENDER:i(1158),SHAKE_COMPLETE:i(1157),SHAKE_START:i(1156),ZOOM_COMPLETE:i(1155),ZOOM_START:i(1154)}},function(t,e,i){var n=i(0),s=i(3),r=new n({initialize:function(t,e,i,n,s,r){void 0===t&&(t=1),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=1),void 0===s&&(s=0),void 0===r&&(r=0),this.matrix=new Float32Array([t,e,i,n,s,r,0,0,1]),this.decomposedMatrix={translateX:0,translateY:0,scaleX:1,scaleY:1,rotation:0}},a:{get:function(){return this.matrix[0]},set:function(t){this.matrix[0]=t}},b:{get:function(){return this.matrix[1]},set:function(t){this.matrix[1]=t}},c:{get:function(){return this.matrix[2]},set:function(t){this.matrix[2]=t}},d:{get:function(){return this.matrix[3]},set:function(t){this.matrix[3]=t}},e:{get:function(){return this.matrix[4]},set:function(t){this.matrix[4]=t}},f:{get:function(){return this.matrix[5]},set:function(t){this.matrix[5]=t}},tx:{get:function(){return this.matrix[4]},set:function(t){this.matrix[4]=t}},ty:{get:function(){return this.matrix[5]},set:function(t){this.matrix[5]=t}},rotation:{get:function(){return Math.acos(this.a/this.scaleX)*(Math.atan(-this.c/this.a)<0?-1:1)}},scaleX:{get:function(){return Math.sqrt(this.a*this.a+this.c*this.c)}},scaleY:{get:function(){return Math.sqrt(this.b*this.b+this.d*this.d)}},loadIdentity:function(){var t=this.matrix;return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,this},translate:function(t,e){var i=this.matrix;return i[4]=i[0]*t+i[2]*e+i[4],i[5]=i[1]*t+i[3]*e+i[5],this},scale:function(t,e){var i=this.matrix;return i[0]*=t,i[1]*=t,i[2]*=e,i[3]*=e,this},rotate:function(t){var e=Math.sin(t),i=Math.cos(t),n=this.matrix,s=n[0],r=n[1],o=n[2],a=n[3];return n[0]=s*i+o*e,n[1]=r*i+a*e,n[2]=s*-e+o*i,n[3]=r*-e+a*i,this},multiply:function(t,e){var i=this.matrix,n=t.matrix,s=i[0],r=i[1],o=i[2],a=i[3],h=i[4],l=i[5],u=n[0],c=n[1],d=n[2],f=n[3],p=n[4],g=n[5],v=void 0===e?this:e;return v.a=u*s+c*o,v.b=u*r+c*a,v.c=d*s+f*o,v.d=d*r+f*a,v.e=p*s+g*o+h,v.f=p*r+g*a+l,v},multiplyWithOffset:function(t,e,i){var n=this.matrix,s=t.matrix,r=n[0],o=n[1],a=n[2],h=n[3],l=e*r+i*a+n[4],u=e*o+i*h+n[5],c=s[0],d=s[1],f=s[2],p=s[3],g=s[4],v=s[5];return n[0]=c*r+d*a,n[1]=c*o+d*h,n[2]=f*r+p*a,n[3]=f*o+p*h,n[4]=g*r+v*a+l,n[5]=g*o+v*h+u,this},transform:function(t,e,i,n,s,r){var o=this.matrix,a=o[0],h=o[1],l=o[2],u=o[3],c=o[4],d=o[5];return o[0]=t*a+e*l,o[1]=t*h+e*u,o[2]=i*a+n*l,o[3]=i*h+n*u,o[4]=s*a+r*l+c,o[5]=s*h+r*u+d,this},transformPoint:function(t,e,i){void 0===i&&(i={x:0,y:0});var n=this.matrix,s=n[0],r=n[1],o=n[2],a=n[3],h=n[4],l=n[5];return i.x=t*s+e*o+h,i.y=t*r+e*a+l,i},invert:function(){var t=this.matrix,e=t[0],i=t[1],n=t[2],s=t[3],r=t[4],o=t[5],a=e*s-i*n;return t[0]=s/a,t[1]=-i/a,t[2]=-n/a,t[3]=e/a,t[4]=(n*o-s*r)/a,t[5]=-(e*o-i*r)/a,this},copyFrom:function(t){var e=this.matrix;return e[0]=t.a,e[1]=t.b,e[2]=t.c,e[3]=t.d,e[4]=t.e,e[5]=t.f,this},copyFromArray:function(t){var e=this.matrix;return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],this},copyToContext:function(t){var e=this.matrix;return t.transform(e[0],e[1],e[2],e[3],e[4],e[5]),t},setToContext:function(t){var e=this.matrix;return t.setTransform(e[0],e[1],e[2],e[3],e[4],e[5]),t},copyToArray:function(t){var e=this.matrix;return void 0===t?t=[e[0],e[1],e[2],e[3],e[4],e[5]]:(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5]),t},setTransform:function(t,e,i,n,s,r){var o=this.matrix;return o[0]=t,o[1]=e,o[2]=i,o[3]=n,o[4]=s,o[5]=r,this},decomposeMatrix:function(){var t=this.decomposedMatrix,e=this.matrix,i=e[0],n=e[1],s=e[2],r=e[3],o=i*r-n*s;if(t.translateX=e[4],t.translateY=e[5],i||n){var a=Math.sqrt(i*i+n*n);t.rotation=n>0?Math.acos(i/a):-Math.acos(i/a),t.scaleX=a,t.scaleY=o/a}else if(s||r){var h=Math.sqrt(s*s+r*r);t.rotation=.5*Math.PI-(r>0?Math.acos(-s/h):-Math.acos(s/h)),t.scaleX=o/h,t.scaleY=h}else t.rotation=0,t.scaleX=0,t.scaleY=0;return t},applyITRS:function(t,e,i,n,s){var r=this.matrix,o=Math.sin(i),a=Math.cos(i);return r[4]=t,r[5]=e,r[0]=a*n,r[1]=o*n,r[2]=-o*s,r[3]=a*s,this},applyInverse:function(t,e,i){void 0===i&&(i=new s);var n=this.matrix,r=n[0],o=n[1],a=n[2],h=n[3],l=n[4],u=n[5],c=1/(r*h+a*-o);return i.x=h*c*t+-a*c*e+(u*a-l*h)*c,i.y=r*c*e+-o*c*t+(-u*r+l*o)*c,i},getX:function(t,e){return t*this.a+e*this.c+this.e},getY:function(t,e){return t*this.b+e*this.d+this.f},getCSSMatrix:function(){var t=this.matrix;return"matrix("+t[0]+","+t[1]+","+t[2]+","+t[3]+","+t[4]+","+t[5]+")"},destroy:function(){this.matrix=null,this.decomposedMatrix=null}});t.exports=r},function(t,e){t.exports=function(t,e,i){return!(t.width<=0||t.height<=0)&&t.x<=e&&t.x+t.width>=e&&t.y<=i&&t.y+t.height>=i}},function(t,e){t.exports=function(t,e,i){return t.radius>0&&e>=t.left&&e<=t.right&&i>=t.top&&i<=t.bottom&&(t.x-e)*(t.x-e)+(t.y-i)*(t.y-i)<=t.radius*t.radius}},function(t,e){t.exports=function(t,e){return t.y=e+t.height*t.originY,t}},function(t,e){t.exports=function(t){return t.y-t.height*t.originY}},function(t,e){t.exports=function(t,e){return t.x=e-t.width+t.width*t.originX,t}},function(t,e){t.exports=function(t){return t.x+t.width-t.width*t.originX}},function(t,e){t.exports=function(t,e){return t.x=e+t.width*t.originX,t}},function(t,e){t.exports=function(t){return t.x-t.width*t.originX}},function(t,e){t.exports=function(t,e){return t.y=e-t.height+t.height*t.originY,t}},function(t,e){t.exports=function(t){return t.y+t.height-t.height*t.originY}},function(t,e,i){t.exports={BOOT:i(994),DESTROY:i(993),DRAG_END:i(992),DRAG_ENTER:i(991),DRAG:i(990),DRAG_LEAVE:i(989),DRAG_OVER:i(988),DRAG_START:i(987),DROP:i(986),GAME_OUT:i(985),GAME_OVER:i(984),GAMEOBJECT_DOWN:i(983),GAMEOBJECT_DRAG_END:i(982),GAMEOBJECT_DRAG_ENTER:i(981),GAMEOBJECT_DRAG:i(980),GAMEOBJECT_DRAG_LEAVE:i(979),GAMEOBJECT_DRAG_OVER:i(978),GAMEOBJECT_DRAG_START:i(977),GAMEOBJECT_DROP:i(976),GAMEOBJECT_MOVE:i(975),GAMEOBJECT_OUT:i(974),GAMEOBJECT_OVER:i(973),GAMEOBJECT_POINTER_DOWN:i(972),GAMEOBJECT_POINTER_MOVE:i(971),GAMEOBJECT_POINTER_OUT:i(970),GAMEOBJECT_POINTER_OVER:i(969),GAMEOBJECT_POINTER_UP:i(968),GAMEOBJECT_UP:i(967),MANAGER_BOOT:i(966),MANAGER_PROCESS:i(965),MANAGER_UPDATE:i(964),POINTER_DOWN:i(963),POINTER_DOWN_OUTSIDE:i(962),POINTER_MOVE:i(961),POINTER_OUT:i(960),POINTER_OVER:i(959),POINTER_UP:i(958),POINTER_UP_OUTSIDE:i(957),POINTERLOCK_CHANGE:i(956),PRE_UPDATE:i(955),SHUTDOWN:i(954),START:i(953),UPDATE:i(952)}},function(t,e){t.exports=function(t,e,i,n){void 0===e&&(e=!0);var s=n.baseTileHeight,r=n.tilemapLayer;return r&&(void 0===i&&(i=r.scene.cameras.main),t-=r.y+i.scrollY*(1-r.scrollFactorY),s*=r.scaleY),e?Math.floor(t/s):t/s}},function(t,e){t.exports=function(t,e,i,n){void 0===e&&(e=!0);var s=n.baseTileWidth,r=n.tilemapLayer;return r&&(void 0===i&&(i=r.scene.cameras.main),t-=r.x+i.scrollX*(1-r.scrollFactorX),s*=r.scaleX),e?Math.floor(t/s):t/s}},function(t,e,i){var n=i(0),s=i(15),r=i(22),o=i(7),a=i(2),h=i(4),l=i(8),u=new n({Extends:r,initialize:function(t,e,i,n,o){var u="json";if(l(e)){var c=e;e=a(c,"key"),i=a(c,"url"),n=a(c,"xhrSettings"),u=a(c,"extension",u),o=a(c,"dataKey",o)}var d={type:"json",cache:t.cacheManager.json,extension:u,responseType:"text",key:e,url:i,xhrSettings:n,config:o};r.call(this,t,d),l(i)&&(this.data=o?h(i,o):i,this.state=s.FILE_POPULATED)},onProcess:function(){if(this.state!==s.FILE_POPULATED){this.state=s.FILE_PROCESSING;var t=JSON.parse(this.xhrLoader.responseText),e=this.config;this.data="string"==typeof e?h(t,e,t):t}this.onProcessComplete()}});o.register("json",function(t,e,i,n){if(Array.isArray(t))for(var s=0;sthis.x2?this.x1=t:this.x2=t}},top:{get:function(){return Math.min(this.y1,this.y2)},set:function(t){this.y1<=this.y2?this.y1=t:this.y2=t}},bottom:{get:function(){return Math.max(this.y1,this.y2)},set:function(t){this.y1>this.y2?this.y1=t:this.y2=t}}});t.exports=h},function(t,e){t.exports={SKIP_CHECK:-1,NORMAL:0,ADD:1,MULTIPLY:2,SCREEN:3,OVERLAY:4,DARKEN:5,LIGHTEN:6,COLOR_DODGE:7,COLOR_BURN:8,HARD_LIGHT:9,SOFT_LIGHT:10,DIFFERENCE:11,EXCLUSION:12,HUE:13,SATURATION:14,COLOR:15,LUMINOSITY:16,ERASE:17,SOURCE_IN:18,SOURCE_OUT:19,SOURCE_ATOP:20,DESTINATION_OVER:21,DESTINATION_IN:22,DESTINATION_OUT:23,DESTINATION_ATOP:24,LIGHTER:25,COPY:26,XOR:27}},function(t,e,i){var n=i(0),s=i(13),r=i(270),o=new n({Mixins:[s.Alpha,s.Flip,s.Visible],initialize:function(t,e,i,n,s,r,o,a){this.layer=t,this.index=e,this.x=i,this.y=n,this.width=s,this.height=r,this.baseWidth=void 0!==o?o:s,this.baseHeight=void 0!==a?a:r,this.pixelX=0,this.pixelY=0,this.updatePixelXY(),this.properties={},this.rotation=0,this.collideLeft=!1,this.collideRight=!1,this.collideUp=!1,this.collideDown=!1,this.faceLeft=!1,this.faceRight=!1,this.faceTop=!1,this.faceBottom=!1,this.collisionCallback=null,this.collisionCallbackContext=this,this.tint=16777215,this.physics={}},containsPoint:function(t,e){return!(tthis.right||e>this.bottom)},copy:function(t){return this.index=t.index,this.alpha=t.alpha,this.properties=t.properties,this.visible=t.visible,this.setFlip(t.flipX,t.flipY),this.tint=t.tint,this.rotation=t.rotation,this.collideUp=t.collideUp,this.collideDown=t.collideDown,this.collideLeft=t.collideLeft,this.collideRight=t.collideRight,this.collisionCallback=t.collisionCallback,this.collisionCallbackContext=t.collisionCallbackContext,this},getCollisionGroup:function(){return this.tileset?this.tileset.getTileCollisionGroup(this.index):null},getTileData:function(){return this.tileset?this.tileset.getTileData(this.index):null},getLeft:function(t){var e=this.tilemapLayer;return e?e.tileToWorldX(this.x,t):this.x*this.baseWidth},getRight:function(t){var e=this.tilemapLayer;return e?this.getLeft(t)+this.width*e.scaleX:this.getLeft(t)+this.width},getTop:function(t){var e=this.tilemapLayer;return e?e.tileToWorldY(this.y,t)-(this.height-this.baseHeight)*e.scaleY:this.y*this.baseHeight-(this.height-this.baseHeight)},getBottom:function(t){var e=this.tilemapLayer;return e?this.getTop(t)+this.height*e.scaleY:this.getTop(t)+this.height},getBounds:function(t,e){return void 0===e&&(e=new r),e.x=this.getLeft(),e.y=this.getTop(),e.width=this.getRight()-e.x,e.height=this.getBottom()-e.y,e},getCenterX:function(t){return this.getLeft(t)+this.width/2},getCenterY:function(t){return this.getTop(t)+this.height/2},destroy:function(){this.collisionCallback=void 0,this.collisionCallbackContext=void 0,this.properties=void 0},intersects:function(t,e,i,n){return!(i<=this.pixelX||n<=this.pixelY||t>=this.right||e>=this.bottom)},isInteresting:function(t,e){return t&&e?this.canCollide||this.hasInterestingFace:t?this.collides:!!e&&this.hasInterestingFace},resetCollision:function(t){(void 0===t&&(t=!0),this.collideLeft=!1,this.collideRight=!1,this.collideUp=!1,this.collideDown=!1,this.faceTop=!1,this.faceBottom=!1,this.faceLeft=!1,this.faceRight=!1,t)&&(this.tilemapLayer&&this.tilemapLayer.calculateFacesAt(this.x,this.y));return this},resetFaces:function(){return this.faceTop=!1,this.faceBottom=!1,this.faceLeft=!1,this.faceRight=!1,this},setCollision:function(t,e,i,n,s){(void 0===e&&(e=t),void 0===i&&(i=t),void 0===n&&(n=t),void 0===s&&(s=!0),this.collideLeft=t,this.collideRight=e,this.collideUp=i,this.collideDown=n,this.faceLeft=t,this.faceRight=e,this.faceTop=i,this.faceBottom=n,s)&&(this.tilemapLayer&&this.tilemapLayer.calculateFacesAt(this.x,this.y));return this},setCollisionCallback:function(t,e){return null===t?(this.collisionCallback=void 0,this.collisionCallbackContext=void 0):(this.collisionCallback=t,this.collisionCallbackContext=e),this},setSize:function(t,e,i,n){return void 0!==t&&(this.width=t),void 0!==e&&(this.height=e),void 0!==i&&(this.baseWidth=i),void 0!==n&&(this.baseHeight=n),this.updatePixelXY(),this},updatePixelXY:function(){return this.pixelX=this.x*this.baseWidth,this.pixelY=this.y*this.baseHeight,this},canCollide:{get:function(){return this.collideLeft||this.collideRight||this.collideUp||this.collideDown||this.collisionCallback}},collides:{get:function(){return this.collideLeft||this.collideRight||this.collideUp||this.collideDown}},hasInterestingFace:{get:function(){return this.faceTop||this.faceBottom||this.faceLeft||this.faceRight}},tileset:{get:function(){var t=this.layer.tilemapLayer;if(t){var e=t.gidMap[this.index];if(e)return e}return null}},tilemapLayer:{get:function(){return this.layer.tilemapLayer}},tilemap:{get:function(){var t=this.tilemapLayer;return t?t.tilemap:null}}});t.exports=o},function(t,e){t.exports=function(t,e){e?t.setCollision(!0,!0,!0,!0,!1):t.resetCollision(!1)}},function(t,e,i){var n=new(i(0))({initialize:function(t,e,i,n){this.loader=t,this.type=e,this.key=i,this.files=n,this.complete=!1,this.pending=n.length,this.failed=0,this.config={};for(var s=0;s=this.x2&&this.x1>=this.x3?this.x1-t:this.x2>=this.x1&&this.x2>=this.x3?this.x2-t:this.x3-t,this.x1-=e,this.x2-=e,this.x3-=e}},top:{get:function(){return Math.min(this.y1,this.y2,this.y3)},set:function(t){var e=0;e=this.y1<=this.y2&&this.y1<=this.y3?this.y1-t:this.y2<=this.y1&&this.y2<=this.y3?this.y2-t:this.y3-t,this.y1-=e,this.y2-=e,this.y3-=e}},bottom:{get:function(){return Math.max(this.y1,this.y2,this.y3)},set:function(t){var e=0;e=this.y1>=this.y2&&this.y1>=this.y3?this.y1-t:this.y2>=this.y1&&this.y2>=this.y3?this.y2-t:this.y3-t,this.y1-=e,this.y2-=e,this.y3-=e}}});t.exports=l},function(t,e,i){var n=i(9);t.exports=function(t,e,i,s,r){var o=t.strokeTint,a=n.getTintAppendFloatAlphaAndSwap(e.strokeColor,e.strokeAlpha*i);o.TL=a,o.TR=a,o.BL=a,o.BR=a;var h=e.pathData,l=h.length-1,u=e.lineWidth,c=u/2,d=h[0]-s,f=h[1]-r;e.closePath||(l-=2);for(var p=2;ps||e>=i||i>s||e+i>s){if(n)throw new Error("Range Error: Values outside acceptable range");return!1}return!0}},function(t,e,i){t.exports={COMPLETE:i(932),DESTROY:i(931),DETUNE:i(930),GLOBAL_DETUNE:i(929),GLOBAL_MUTE:i(928),GLOBAL_RATE:i(927),GLOBAL_VOLUME:i(926),LOOP:i(925),LOOPED:i(924),MUTE:i(923),PAUSE_ALL:i(922),PAUSE:i(921),PLAY:i(920),RATE:i(919),RESUME_ALL:i(918),RESUME:i(917),SEEK:i(916),STOP_ALL:i(915),STOP:i(914),UNLOCKED:i(913),VOLUME:i(912)}},function(t,e){t.exports=function(t){var e={};for(var i in t)Array.isArray(t[i])?e[i]=t[i].slice(0):e[i]=t[i];return e}},function(t,e,i){"use strict";function n(t,e,i){i=i||2;var n,a,h,l,u,f,g,v=e&&e.length,y=v?e[0]*i:t.length,m=s(t,0,y,i,!0),x=[];if(!m||m.next===m.prev)return x;if(v&&(m=function(t,e,i,n){var o,a,h,l,u,f=[];for(o=0,a=e.length;o80*i){n=h=t[0],a=l=t[1];for(var T=i;Th&&(h=u),f>l&&(l=f);g=0!==(g=Math.max(h-n,l-a))?1/g:0}return o(m,x,i,n,a,g),x}function s(t,e,i,n,s){var r,o;if(s===A(t,e,i,n)>0)for(r=e;r=e;r-=n)o=b(r,t[r],t[r+1],o);return o&&m(o,o.next)&&(S(o),o=o.next),o}function r(t,e){if(!t)return t;e||(e=t);var i,n=t;do{if(i=!1,n.steiner||!m(n,n.next)&&0!==y(n.prev,n,n.next))n=n.next;else{if(S(n),(n=e=n.prev)===n.next)break;i=!0}}while(i||n!==e);return e}function o(t,e,i,n,s,c,d){if(t){!d&&c&&function(t,e,i,n){var s=t;do{null===s.z&&(s.z=f(s.x,s.y,e,i,n)),s.prevZ=s.prev,s.nextZ=s.next,s=s.next}while(s!==t);s.prevZ.nextZ=null,s.prevZ=null,function(t){var e,i,n,s,r,o,a,h,l=1;do{for(i=t,t=null,r=null,o=0;i;){for(o++,n=i,a=0,e=0;e0||h>0&&n;)0!==a&&(0===h||!n||i.z<=n.z)?(s=i,i=i.nextZ,a--):(s=n,n=n.nextZ,h--),r?r.nextZ=s:t=s,s.prevZ=r,r=s;i=n}r.nextZ=null,l*=2}while(o>1)}(s)}(t,n,s,c);for(var p,g,v=t;t.prev!==t.next;)if(p=t.prev,g=t.next,c?h(t,n,s,c):a(t))e.push(p.i/i),e.push(t.i/i),e.push(g.i/i),S(t),t=g.next,v=g.next;else if((t=g)===v){d?1===d?o(t=l(t,e,i),e,i,n,s,c,2):2===d&&u(t,e,i,n,s,c):o(r(t),e,i,n,s,c,1);break}}}function a(t){var e=t.prev,i=t,n=t.next;if(y(e,i,n)>=0)return!1;for(var s=t.next.next;s!==t.prev;){if(g(e.x,e.y,i.x,i.y,n.x,n.y,s.x,s.y)&&y(s.prev,s,s.next)>=0)return!1;s=s.next}return!0}function h(t,e,i,n){var s=t.prev,r=t,o=t.next;if(y(s,r,o)>=0)return!1;for(var a=s.xr.x?s.x>o.x?s.x:o.x:r.x>o.x?r.x:o.x,u=s.y>r.y?s.y>o.y?s.y:o.y:r.y>o.y?r.y:o.y,c=f(a,h,e,i,n),d=f(l,u,e,i,n),p=t.prevZ,v=t.nextZ;p&&p.z>=c&&v&&v.z<=d;){if(p!==t.prev&&p!==t.next&&g(s.x,s.y,r.x,r.y,o.x,o.y,p.x,p.y)&&y(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,v!==t.prev&&v!==t.next&&g(s.x,s.y,r.x,r.y,o.x,o.y,v.x,v.y)&&y(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;p&&p.z>=c;){if(p!==t.prev&&p!==t.next&&g(s.x,s.y,r.x,r.y,o.x,o.y,p.x,p.y)&&y(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;v&&v.z<=d;){if(v!==t.prev&&v!==t.next&&g(s.x,s.y,r.x,r.y,o.x,o.y,v.x,v.y)&&y(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0}function l(t,e,i){var n=t;do{var s=n.prev,r=n.next.next;!m(s,r)&&x(s,n,n.next,r)&&T(s,r)&&T(r,s)&&(e.push(s.i/i),e.push(n.i/i),e.push(r.i/i),S(n),S(n.next),n=t=r),n=n.next}while(n!==t);return n}function u(t,e,i,n,s,a){var h=t;do{for(var l=h.next.next;l!==h.prev;){if(h.i!==l.i&&v(h,l)){var u=w(h,l);return h=r(h,h.next),u=r(u,u.next),o(h,e,i,n,s,a),void o(u,e,i,n,s,a)}l=l.next}h=h.next}while(h!==t)}function c(t,e){return t.x-e.x}function d(t,e){if(e=function(t,e){var i,n=e,s=t.x,r=t.y,o=-1/0;do{if(r<=n.y&&r>=n.next.y&&n.next.y!==n.y){var a=n.x+(r-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(a<=s&&a>o){if(o=a,a===s){if(r===n.y)return n;if(r===n.next.y)return n.next}i=n.x=n.x&&n.x>=u&&s!==n.x&&g(ri.x)&&T(n,t)&&(i=n,d=h),n=n.next;return i}(t,e)){var i=w(e,t);r(i,i.next)}}function f(t,e,i,n,s){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-i)*s)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*s)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function p(t){var e=t,i=t;do{e.x=0&&(t-o)*(n-a)-(i-o)*(e-a)>=0&&(i-o)*(r-a)-(s-o)*(n-a)>=0}function v(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&x(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&T(t,e)&&T(e,t)&&function(t,e){var i=t,n=!1,s=(t.x+e.x)/2,r=(t.y+e.y)/2;do{i.y>r!=i.next.y>r&&i.next.y!==i.y&&s<(i.next.x-i.x)*(r-i.y)/(i.next.y-i.y)+i.x&&(n=!n),i=i.next}while(i!==t);return n}(t,e)}function y(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function m(t,e){return t.x===e.x&&t.y===e.y}function x(t,e,i,n){return!!(m(t,e)&&m(i,n)||m(t,n)&&m(i,e))||y(t,e,i)>0!=y(t,e,n)>0&&y(i,n,t)>0!=y(i,n,e)>0}function T(t,e){return y(t.prev,t,t.next)<0?y(t,e,t.next)>=0&&y(t,t.prev,e)>=0:y(t,e,t.prev)<0||y(t,t.next,e)<0}function w(t,e){var i=new _(t.i,t.x,t.y),n=new _(e.i,e.x,e.y),s=t.next,r=e.prev;return t.next=e,e.prev=t,i.next=s,s.prev=i,n.next=i,i.prev=n,r.next=n,n.prev=r,n}function b(t,e,i,n){var s=new _(t,e,i);return n?(s.next=n.next,s.prev=n,n.next.prev=s,n.next=s):(s.prev=s,s.next=s),s}function S(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function _(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function A(t,e,i,n){for(var s=0,r=e,o=i-n;r0&&(n+=t[s-1].length,i.holes.push(n))}return i}},function(t,e,i){var n={};t.exports=n;var s=i(82),r=i(87),o=i(238),a=i(36),h=i(86),l=i(546);!function(){n._inertiaScale=4,n._nextCollidingGroupId=1,n._nextNonCollidingGroupId=-1,n._nextCategory=1,n.create=function(e){var i={id:a.nextId(),type:"body",label:"Body",gameObject:null,parts:[],plugin:{},angle:0,vertices:s.fromPath("L 0 0 L 40 0 L 40 40 L 0 40"),position:{x:0,y:0},force:{x:0,y:0},torque:0,positionImpulse:{x:0,y:0},previousPositionImpulse:{x:0,y:0},constraintImpulse:{x:0,y:0,angle:0},totalContacts:0,speed:0,angularSpeed:0,velocity:{x:0,y:0},angularVelocity:0,isSensor:!1,isStatic:!1,isSleeping:!1,ignoreGravity:!1,ignorePointer:!1,motion:0,sleepThreshold:60,density:.001,restitution:0,friction:.1,frictionStatic:.5,frictionAir:.01,collisionFilter:{category:1,mask:4294967295,group:0},slop:.05,timeScale:1,render:{visible:!0,opacity:1,sprite:{xScale:1,yScale:1,xOffset:0,yOffset:0},lineWidth:0},events:null,bounds:null,chamfer:null,circleRadius:0,positionPrev:null,anglePrev:0,parent:null,axes:null,area:0,mass:0,inertia:0,_original:null},n=a.extend(i,e);return t(n,e),n},n.nextGroup=function(t){return t?n._nextNonCollidingGroupId--:n._nextCollidingGroupId++},n.nextCategory=function(){return n._nextCategory=n._nextCategory<<1,n._nextCategory};var t=function(t,e){e=e||{},n.set(t,{bounds:t.bounds||h.create(t.vertices),positionPrev:t.positionPrev||r.clone(t.position),anglePrev:t.anglePrev||t.angle,vertices:t.vertices,parts:t.parts||[t],isStatic:t.isStatic,isSleeping:t.isSleeping,parent:t.parent||t}),s.rotate(t.vertices,t.angle,t.position),l.rotate(t.axes,t.angle),h.update(t.bounds,t.vertices,t.velocity),n.set(t,{axes:e.axes||t.axes,area:e.area||t.area,mass:e.mass||t.mass,inertia:e.inertia||t.inertia});var i=t.isStatic?"#2e2b44":a.choose(["#006BA6","#0496FF","#FFBC42","#D81159","#8F2D56"]);t.render.fillStyle=t.render.fillStyle||i,t.render.strokeStyle=t.render.strokeStyle||"#000",t.render.sprite.xOffset+=-(t.bounds.min.x-t.position.x)/(t.bounds.max.x-t.bounds.min.x),t.render.sprite.yOffset+=-(t.bounds.min.y-t.position.y)/(t.bounds.max.y-t.bounds.min.y)};n.set=function(t,e,i){var s;for(s in"string"==typeof e&&(s=e,(e={})[s]=i),e)if(e.hasOwnProperty(s))switch(i=e[s],s){case"isStatic":n.setStatic(t,i);break;case"isSleeping":o.set(t,i);break;case"mass":n.setMass(t,i);break;case"density":n.setDensity(t,i);break;case"inertia":n.setInertia(t,i);break;case"vertices":n.setVertices(t,i);break;case"position":n.setPosition(t,i);break;case"angle":n.setAngle(t,i);break;case"velocity":n.setVelocity(t,i);break;case"angularVelocity":n.setAngularVelocity(t,i);break;case"parts":n.setParts(t,i);break;default:t[s]=i}},n.setStatic=function(t,e){for(var i=0;i0&&r.rotateAbout(o.position,i,t.position,o.position)}},n.setVelocity=function(t,e){t.positionPrev.x=t.position.x-e.x,t.positionPrev.y=t.position.y-e.y,t.velocity.x=e.x,t.velocity.y=e.y,t.speed=r.magnitude(t.velocity)},n.setAngularVelocity=function(t,e){t.anglePrev=t.angle-e,t.angularVelocity=e,t.angularSpeed=Math.abs(t.angularVelocity)},n.translate=function(t,e){n.setPosition(t,r.add(t.position,e))},n.rotate=function(t,e,i){if(i){var s=Math.cos(e),r=Math.sin(e),o=t.position.x-i.x,a=t.position.y-i.y;n.setPosition(t,{x:i.x+(o*s-a*r),y:i.y+(o*r+a*s)}),n.setAngle(t,t.angle+e)}else n.setAngle(t,t.angle+e)},n.scale=function(t,e,i,r){var o=0,a=0;r=r||t.position;for(var u=0;u0&&(o+=c.area,a+=c.inertia),c.position.x=r.x+(c.position.x-r.x)*e,c.position.y=r.y+(c.position.y-r.y)*i,h.update(c.bounds,c.vertices,t.velocity)}t.parts.length>1&&(t.area=o,t.isStatic||(n.setMass(t,t.density*o),n.setInertia(t,a))),t.circleRadius&&(e===i?t.circleRadius*=e:t.circleRadius=null)},n.update=function(t,e,i,n){var o=Math.pow(e*i*t.timeScale,2),a=1-t.frictionAir*i*t.timeScale,u=t.position.x-t.positionPrev.x,c=t.position.y-t.positionPrev.y;t.velocity.x=u*a*n+t.force.x/t.mass*o,t.velocity.y=c*a*n+t.force.y/t.mass*o,t.positionPrev.x=t.position.x,t.positionPrev.y=t.position.y,t.position.x+=t.velocity.x,t.position.y+=t.velocity.y,t.angularVelocity=(t.angle-t.anglePrev)*a*n+t.torque/t.inertia*o,t.anglePrev=t.angle,t.angle+=t.angularVelocity,t.speed=r.magnitude(t.velocity),t.angularSpeed=Math.abs(t.angularVelocity);for(var d=0;d0&&(f.position.x+=t.velocity.x,f.position.y+=t.velocity.y),0!==t.angularVelocity&&(s.rotate(f.vertices,t.angularVelocity,t.position),l.rotate(f.axes,t.angularVelocity),d>0&&r.rotateAbout(f.position,t.angularVelocity,t.position,f.position)),h.update(f.bounds,f.vertices,t.velocity)}},n.applyForce=function(t,e,i){t.force.x+=i.x,t.force.y+=i.y;var n=e.x-t.position.x,s=e.y-t.position.y;t.torque+=n*i.y-s*i.x},n._totalProperties=function(t){for(var e={mass:0,area:0,inertia:0,centre:{x:0,y:0}},i=1===t.parts.length?0:1;i=0&&y>=0&&v+y<1}},function(t,e,i){t.exports={ADD:i(945),COMPLETE:i(944),FILE_COMPLETE:i(943),FILE_KEY_COMPLETE:i(942),FILE_LOAD_ERROR:i(941),FILE_LOAD:i(940),FILE_PROGRESS:i(939),POST_PROCESS:i(938),PROGRESS:i(937),START:i(936)}},function(t,e,i){var n=i(0),s=i(180),r=i(10),o=i(3),a=new n({initialize:function(t){this.type=t,this.defaultDivisions=5,this.arcLengthDivisions=100,this.cacheArcLengths=[],this.needsUpdate=!0,this.active=!0,this._tmpVec2A=new o,this._tmpVec2B=new o},draw:function(t,e){return void 0===e&&(e=32),t.strokePoints(this.getPoints(e))},getBounds:function(t,e){t||(t=new r),void 0===e&&(e=16);var i=this.getLength();e>i&&(e=i/2);var n=Math.max(1,Math.round(i/e));return s(this.getSpacedPoints(n),t)},getDistancePoints:function(t){var e=this.getLength(),i=Math.max(1,e/t);return this.getSpacedPoints(i)},getEndPoint:function(t){return void 0===t&&(t=new o),this.getPointAt(1,t)},getLength:function(){var t=this.getLengths();return t[t.length-1]},getLengths:function(t){if(void 0===t&&(t=this.arcLengthDivisions),this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var e,i=[],n=this.getPoint(0,this._tmpVec2A),s=0;i.push(0);for(var r=1;r<=t;r++)s+=(e=this.getPoint(r/t,this._tmpVec2B)).distance(n),i.push(s),n.copy(e);return this.cacheArcLengths=i,i},getPointAt:function(t,e){var i=this.getUtoTmapping(t);return this.getPoint(i,e)},getPoints:function(t){void 0===t&&(t=this.defaultDivisions);for(var e=[],i=0;i<=t;i++)e.push(this.getPoint(i/t));return e},getRandomPoint:function(t){return void 0===t&&(t=new o),this.getPoint(Math.random(),t)},getSpacedPoints:function(t){void 0===t&&(t=this.defaultDivisions);for(var e=[],i=0;i<=t;i++){var n=this.getUtoTmapping(i/t,null,t);e.push(this.getPoint(n))}return e},getStartPoint:function(t){return void 0===t&&(t=new o),this.getPointAt(0,t)},getTangent:function(t,e){void 0===e&&(e=new o);var i=t-1e-4,n=t+1e-4;return i<0&&(i=0),n>1&&(n=1),this.getPoint(i,this._tmpVec2A),this.getPoint(n,e),e.subtract(this._tmpVec2A).normalize()},getTangentAt:function(t,e){var i=this.getUtoTmapping(t);return this.getTangent(i,e)},getTFromDistance:function(t,e){return t<=0?0:this.getUtoTmapping(0,t,e)},getUtoTmapping:function(t,e,i){var n,s=this.getLengths(i),r=0,o=s.length;n=e?Math.min(e,s[o-1]):t*s[o-1];for(var a,h=0,l=o-1;h<=l;)if((a=s[r=Math.floor(h+(l-h)/2)]-n)<0)h=r+1;else{if(!(a>0)){l=r;break}l=r-1}if(s[r=l]===n)return r/(o-1);var u=s[r];return(r+(n-u)/(s[r+1]-u))/(o-1)},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()}});t.exports=a},function(t,e,i){var n=i(0),s=i(43),r=i(438),o=i(437),a=i(206),h=new n({initialize:function(t,e,i){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),this.x=t,this.y=e,this._radius=i,this._diameter=2*i},contains:function(t,e){return s(this,t,e)},getPoint:function(t,e){return r(this,t,e)},getPoints:function(t,e,i){return o(this,t,e,i)},getRandomPoint:function(t){return a(this,t)},setTo:function(t,e,i){return this.x=t,this.y=e,this._radius=i,this._diameter=2*i,this},setEmpty:function(){return this._radius=0,this._diameter=0,this},setPosition:function(t,e){return void 0===e&&(e=t),this.x=t,this.y=e,this},isEmpty:function(){return this._radius<=0},radius:{get:function(){return this._radius},set:function(t){this._radius=t,this._diameter=2*t}},diameter:{get:function(){return this._diameter},set:function(t){this._diameter=t,this._radius=.5*t}},left:{get:function(){return this.x-this._radius},set:function(t){this.x=t+this._radius}},right:{get:function(){return this.x+this._radius},set:function(t){this.x=t-this._radius}},top:{get:function(){return this.y-this._radius},set:function(t){this.y=t+this._radius}},bottom:{get:function(){return this.y+this._radius},set:function(t){this.y=t-this._radius}}});t.exports=h},function(t,e){t.exports=function(t){return t.y-t.height*t.originY+.5*t.height}},function(t,e){t.exports=function(t,e){var i=t.height*t.originY;return t.y=e+i-.5*t.height,t}},function(t,e){t.exports=function(t,e){var i=t.width*t.originX;return t.x=e+i-.5*t.width,t}},function(t,e){t.exports=function(t){return t.x-t.width*t.originX+.5*t.width}},function(t,e,i){var n={};t.exports=n;var s=i(87),r=i(36);n.create=function(t,e){for(var i=[],n=0;n0)return!1}return!0},n.scale=function(t,e,i,r){if(1===e&&1===i)return t;var o,a;r=r||n.centre(t);for(var h=0;h=0?h-1:t.length-1],u=t[h],c=t[(h+1)%t.length],d=e[h0&&(r|=2),3===r)return!1;return 0!==r||null},n.hull=function(t){var e,i,n=[],r=[];for((t=t.slice(0)).sort(function(t,e){var i=t.x-e.x;return 0!==i?i:t.y-e.y}),i=0;i=2&&s.cross3(r[r.length-2],r[r.length-1],e)<=0;)r.pop();r.push(e)}for(i=t.length-1;i>=0;i-=1){for(e=t[i];n.length>=2&&s.cross3(n[n.length-2],n[n.length-1],e)<=0;)n.pop();n.push(e)}return n.pop(),r.pop(),n.concat(r)}},function(t,e,i){var n=i(0),s=i(2),r=new n({initialize:function(t){void 0===t&&(t={}),this.name=s(t,"name","map"),this.width=s(t,"width",0),this.height=s(t,"height",0),this.tileWidth=s(t,"tileWidth",0),this.tileHeight=s(t,"tileHeight",0),this.widthInPixels=s(t,"widthInPixels",this.width*this.tileWidth),this.heightInPixels=s(t,"heightInPixels",this.height*this.tileHeight),this.format=s(t,"format",null),this.orientation=s(t,"orientation","orthogonal"),this.renderOrder=s(t,"renderOrder","right-down"),this.version=s(t,"version","1"),this.properties=s(t,"properties",{}),this.layers=s(t,"layers",[]),this.images=s(t,"images",[]),this.objects=s(t,"objects",{}),this.collision=s(t,"collision",{}),this.tilesets=s(t,"tilesets",[]),this.imageCollections=s(t,"imageCollections",[]),this.tiles=s(t,"tiles",[])}});t.exports=r},function(t,e,i){var n=i(0),s=i(2),r=new n({initialize:function(t){void 0===t&&(t={}),this.name=s(t,"name","layer"),this.x=s(t,"x",0),this.y=s(t,"y",0),this.width=s(t,"width",0),this.height=s(t,"height",0),this.tileWidth=s(t,"tileWidth",0),this.tileHeight=s(t,"tileHeight",0),this.baseTileWidth=s(t,"baseTileWidth",this.tileWidth),this.baseTileHeight=s(t,"baseTileHeight",this.tileHeight),this.widthInPixels=s(t,"widthInPixels",this.width*this.baseTileWidth),this.heightInPixels=s(t,"heightInPixels",this.height*this.baseTileHeight),this.alpha=s(t,"alpha",1),this.visible=s(t,"visible",!0),this.properties=s(t,"properties",{}),this.indexes=s(t,"indexes",[]),this.collideIndexes=s(t,"collideIndexes",[]),this.callbacks=s(t,"callbacks",[]),this.bodies=s(t,"bodies",[]),this.data=s(t,"data",[]),this.tilemapLayer=s(t,"tilemapLayer",null)}});t.exports=r},function(t,e){t.exports=function(t,e,i){return t>=0&&t=0&&et.max.x&&(t.max.x=s.x),s.xt.max.y&&(t.max.y=s.y),s.y0?t.max.x+=i.x:t.min.x+=i.x,i.y>0?t.max.y+=i.y:t.min.y+=i.y)},i.contains=function(t,e){return e.x>=t.min.x&&e.x<=t.max.x&&e.y>=t.min.y&&e.y<=t.max.y},i.overlaps=function(t,e){return t.min.x<=e.max.x&&t.max.x>=e.min.x&&t.max.y>=e.min.y&&t.min.y<=e.max.y},i.translate=function(t,e){t.min.x+=e.x,t.max.x+=e.x,t.min.y+=e.y,t.max.y+=e.y},i.shift=function(t,e){var i=t.max.x-t.min.x,n=t.max.y-t.min.y;t.min.x=e.x,t.max.x=e.x+i,t.min.y=e.y,t.max.y=e.y+n}},function(t,e){var i={};t.exports=i,i.create=function(t,e){return{x:t||0,y:e||0}},i.clone=function(t){return{x:t.x,y:t.y}},i.magnitude=function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},i.magnitudeSquared=function(t){return t.x*t.x+t.y*t.y},i.rotate=function(t,e,i){var n=Math.cos(e),s=Math.sin(e);i||(i={});var r=t.x*n-t.y*s;return i.y=t.x*s+t.y*n,i.x=r,i},i.rotateAbout=function(t,e,i,n){var s=Math.cos(e),r=Math.sin(e);n||(n={});var o=i.x+((t.x-i.x)*s-(t.y-i.y)*r);return n.y=i.y+((t.x-i.x)*r+(t.y-i.y)*s),n.x=o,n},i.normalise=function(t){var e=i.magnitude(t);return 0===e?{x:0,y:0}:{x:t.x/e,y:t.y/e}},i.dot=function(t,e){return t.x*e.x+t.y*e.y},i.cross=function(t,e){return t.x*e.y-t.y*e.x},i.cross3=function(t,e,i){return(e.x-t.x)*(i.y-t.y)-(e.y-t.y)*(i.x-t.x)},i.add=function(t,e,i){return i||(i={}),i.x=t.x+e.x,i.y=t.y+e.y,i},i.sub=function(t,e,i){return i||(i={}),i.x=t.x-e.x,i.y=t.y-e.y,i},i.mult=function(t,e){return{x:t.x*e,y:t.y*e}},i.div=function(t,e){return{x:t.x/e,y:t.y/e}},i.perp=function(t,e){return{x:(e=!0===e?-1:1)*-t.y,y:e*t.x}},i.neg=function(t){return{x:-t.x,y:-t.y}},i.angle=function(t,e){return Math.atan2(e.y-t.y,e.x-t.x)},i._temp=[i.create(),i.create(),i.create(),i.create(),i.create(),i.create()]},function(t,e,i){var n=i(9);t.exports=function(t,e,i,s,r,o){for(var a=n.getTintAppendFloatAlphaAndSwap(i.fillColor,i.fillAlpha*s),h=i.pathData,l=i.pathIndexes,u=0;u=0;u--)if((l=d[u]).active===i){if(++c===e)break}else l=null;return l?("number"==typeof s&&(l.x=s),"number"==typeof r&&(l.y=r),l):n?this.create(s,r,o,a,h):null},get:function(t,e,i,n,s){return this.getFirst(!1,!0,t,e,i,n,s)},getFirstAlive:function(t,e,i,n,s,r){return this.getFirst(!0,t,e,i,n,s,r)},getFirstDead:function(t,e,i,n,s,r){return this.getFirst(!1,t,e,i,n,s,r)},playAnimation:function(t,e){return n.PlayAnimation(this.children.entries,t,e),this},isFull:function(){return-1!==this.maxSize&&this.children.size>=this.maxSize},countActive:function(t){void 0===t&&(t=!0);for(var e=0,i=0;i=t.length)){for(var i=t.length-1,n=t[e],s=e;s-1&&this.entries.splice(e,1),this},dump:function(){console.group("Set");for(var t=0;t-1},union:function(t){var e=new n;return t.entries.forEach(function(t){e.set(t)}),this.entries.forEach(function(t){e.set(t)}),e},intersect:function(t){var e=new n;return this.entries.forEach(function(i){t.contains(i)&&e.set(i)}),e},difference:function(t){var e=new n;return this.entries.forEach(function(i){t.contains(i)||e.set(i)}),e},size:{get:function(){return this.entries.length},set:function(t){return t=this.firstgid&&t=0&&g<=1&&v>=0&&v<=1&&(i.x=s+g*(o-s),i.y=r+g*(a-r),!0)}},function(t,e,i){var n=i(0),s=i(13),r=i(18),o=i(753),a=new n({Extends:r,Mixins:[s.BlendMode,s.Depth,s.GetBounds,s.Mask,s.Pipeline,s.ScaleMode,s.Size,s.Texture,s.Transform,s.Visible,s.ScrollFactor,o],initialize:function(t,e,i,n,s,o,a,h,l){if(r.call(this,t,"Mesh"),n.length!==s.length)throw new Error("Mesh Vertex count must match UV count");var u,c=n.length/2|0;if(o.length>0&&o.length0&&a.lengthl&&(r=l),o>l&&(o=l),a=s,h=r;;)if(a-1},setAll:function(t,e,i,s){return n.SetAll(this.list,t,e,i,s),this},each:function(t,e){for(var i=[null],n=2;n0?this.list[0]:null}},last:{get:function(){return this.list.length>0?(this.position=this.list.length-1,this.list[this.position]):null}},next:{get:function(){return this.position0?(this.position--,this.list[this.position]):null}}});t.exports=a},function(t,e,i){var n=i(0),s=i(23),r=i(19),o=new n({initialize:function(t,e,i,n,s,r,o){this.texture=t,this.name=e,this.source=t.source[i],this.sourceIndex=i,this.glTexture=this.source.glTexture,this.cutX,this.cutY,this.cutWidth,this.cutHeight,this.x=0,this.y=0,this.width,this.height,this.halfWidth,this.halfHeight,this.centerX,this.centerY,this.pivotX=0,this.pivotY=0,this.customPivot=!1,this.rotated=!1,this.autoRound=-1,this.customData={},this.u0=0,this.v0=0,this.u1=0,this.v1=0,this.data={cut:{x:0,y:0,w:0,h:0,r:0,b:0},trim:!1,sourceSize:{w:0,h:0},spriteSourceSize:{x:0,y:0,w:0,h:0,r:0,b:0},radius:0,drawImage:{x:0,y:0,width:0,height:0}},this.setSize(r,o,n,s)},setSize:function(t,e,i,n){void 0===i&&(i=0),void 0===n&&(n=0),this.cutX=i,this.cutY=n,this.cutWidth=t,this.cutHeight=e,this.width=t,this.height=e,this.halfWidth=Math.floor(.5*t),this.halfHeight=Math.floor(.5*e),this.centerX=Math.floor(t/2),this.centerY=Math.floor(e/2);var s=this.data,r=s.cut;r.x=i,r.y=n,r.w=t,r.h=e,r.r=i+t,r.b=n+e,s.sourceSize.w=t,s.sourceSize.h=e,s.spriteSourceSize.w=t,s.spriteSourceSize.h=e,s.radius=.5*Math.sqrt(t*t+e*e);var o=s.drawImage;return o.x=i,o.y=n,o.width=t,o.height=e,this.updateUVs()},setTrim:function(t,e,i,n,s,r){var o=this.data,a=o.spriteSourceSize;return o.trim=!0,o.sourceSize.w=t,o.sourceSize.h=e,a.x=i,a.y=n,a.w=s,a.h=r,a.r=i+s,a.b=n+r,this.x=i,this.y=n,this.width=s,this.height=r,this.halfWidth=.5*s,this.halfHeight=.5*r,this.centerX=Math.floor(s/2),this.centerY=Math.floor(r/2),this.updateUVs()},setCropUVs:function(t,e,i,n,r,o,a){var h=this.cutX,l=this.cutY,u=this.cutWidth,c=this.cutHeight,d=this.realWidth,f=this.realHeight,p=h+(e=s(e,0,d)),g=l+(i=s(i,0,f)),v=n=s(n,0,d-e),y=r=s(r,0,f-i),m=this.data;if(m.trim){var x=m.spriteSourceSize,T=e+(n=s(n,0,u-e)),w=i+(r=s(r,0,c-i));if(!(x.rT||x.y>w)){var b=Math.max(x.x,e),S=Math.max(x.y,i),_=Math.min(x.r,T)-b,A=Math.min(x.b,w)-S;v=_,y=A,p=o?h+(u-(b-x.x)-_):h+(b-x.x),g=a?l+(c-(S-x.y)-A):l+(S-x.y),e=b,i=S,n=_,r=A}else p=0,g=0,v=0,y=0}else o&&(p=h+(u-e-n)),a&&(g=l+(c-i-r));var E=this.source.width,C=this.source.height;return t.u0=Math.max(0,p/E),t.v0=Math.max(0,g/C),t.u1=Math.min(1,(p+v)/E),t.v1=Math.min(1,(g+y)/C),t.x=e,t.y=i,t.cx=p,t.cy=g,t.cw=v,t.ch=y,t.width=n,t.height=r,t.flipX=o,t.flipY=a,t},updateCropUVs:function(t,e,i){return this.setCropUVs(t,t.x,t.y,t.width,t.height,e,i)},updateUVs:function(){var t=this.cutX,e=this.cutY,i=this.cutWidth,n=this.cutHeight,s=this.data.drawImage;s.width=i,s.height=n;var r=this.source.width,o=this.source.height;return this.u0=t/r,this.v0=e/o,this.u1=(t+i)/r,this.v1=(e+n)/o,this},updateUVsInverted:function(){var t=this.source.width,e=this.source.height;return this.u0=(this.cutX+this.cutHeight)/t,this.v0=this.cutY/e,this.u1=this.cutX/t,this.v1=(this.cutY+this.cutWidth)/e,this},clone:function(){var t=new o(this.texture,this.name,this.sourceIndex);return t.cutX=this.cutX,t.cutY=this.cutY,t.cutWidth=this.cutWidth,t.cutHeight=this.cutHeight,t.x=this.x,t.y=this.y,t.width=this.width,t.height=this.height,t.halfWidth=this.halfWidth,t.halfHeight=this.halfHeight,t.centerX=this.centerX,t.centerY=this.centerY,t.rotated=this.rotated,t.data=r(!0,t.data,this.data),t.updateUVs(),t},destroy:function(){this.texture=null,this.source=null},realWidth:{get:function(){return this.data.sourceSize.w}},realHeight:{get:function(){return this.data.sourceSize.h}},radius:{get:function(){return this.data.radius}},trimmed:{get:function(){return this.data.trim}},canvasData:{get:function(){return this.data.drawImage}}});t.exports=o},function(t,e,i){var n=i(0),s=i(11),r=i(69),o=i(19),a=i(1),h=new n({Extends:s,initialize:function(t,e,i){s.call(this),this.manager=t,this.key=e,this.isPlaying=!1,this.isPaused=!1,this.totalRate=1,this.duration=this.duration||0,this.totalDuration=this.totalDuration||0,this.config={mute:!1,volume:1,rate:1,detune:0,seek:0,loop:!1,delay:0},this.currentConfig=this.config,this.config=o(this.config,i),this.markers={},this.currentMarker=null,this.pendingRemove=!1},addMarker:function(t){return!(!t||!t.name||"string"!=typeof t.name)&&(this.markers[t.name]?(console.error("addMarker "+t.name+" already exists in Sound"),!1):(t=o(!0,{name:"",start:0,duration:this.totalDuration-(t.start||0),config:{mute:!1,volume:1,rate:1,detune:0,seek:0,loop:!1,delay:0}},t),this.markers[t.name]=t,!0))},updateMarker:function(t){return!(!t||!t.name||"string"!=typeof t.name)&&(this.markers[t.name]?(this.markers[t.name]=o(!0,this.markers[t.name],t),!0):(console.warn("Audio Marker: "+t.name+" missing in Sound: "+this.key),!1))},removeMarker:function(t){var e=this.markers[t];return e?(this.markers[t]=null,e):null},play:function(t,e){if(void 0===t&&(t=""),"object"==typeof t&&(e=t,t=""),"string"!=typeof t)return!1;if(t){if(!this.markers[t])return console.warn("Marker: "+t+" missing in Sound: "+this.key),!1;this.currentMarker=this.markers[t],this.currentConfig=this.currentMarker.config,this.duration=this.currentMarker.duration}else this.currentMarker=null,this.currentConfig=this.config,this.duration=this.totalDuration;return this.resetConfig(),this.currentConfig=o(this.currentConfig,e),this.isPlaying=!0,this.isPaused=!1,!0},pause:function(){return!(this.isPaused||!this.isPlaying)&&(this.isPlaying=!1,this.isPaused=!0,!0)},resume:function(){return!(!this.isPaused||this.isPlaying)&&(this.isPlaying=!0,this.isPaused=!1,!0)},stop:function(){return!(!this.isPaused&&!this.isPlaying)&&(this.isPlaying=!1,this.isPaused=!1,this.resetConfig(),!0)},applyConfig:function(){this.mute=this.currentConfig.mute,this.volume=this.currentConfig.volume,this.rate=this.currentConfig.rate,this.detune=this.currentConfig.detune,this.loop=this.currentConfig.loop},resetConfig:function(){this.currentConfig.seek=0,this.currentConfig.delay=0},update:a,calculateRate:function(){var t=this.currentConfig.detune+this.manager.detune,e=Math.pow(1.0005777895065548,t);this.totalRate=this.currentConfig.rate*this.manager.rate*e},destroy:function(){this.pendingRemove||(this.emit(r.DESTROY,this),this.pendingRemove=!0,this.manager=null,this.key="",this.removeAllListeners(),this.isPlaying=!1,this.isPaused=!1,this.config=null,this.currentConfig=null,this.markers=null,this.currentMarker=null)}});t.exports=h},function(t,e,i){var n=i(0),s=i(70),r=i(11),o=i(69),a=i(26),h=i(1),l=new n({Extends:r,initialize:function(t){r.call(this),this.game=t,this.jsonCache=t.cache.json,this.sounds=[],this.mute=!1,this.volume=1,this.pauseOnBlur=!0,this._rate=1,this._detune=0,this.locked=this.locked||!1,this.unlocked=!1,t.events.on(a.BLUR,function(){this.pauseOnBlur&&this.onBlur()},this),t.events.on(a.FOCUS,function(){this.pauseOnBlur&&this.onFocus()},this),t.events.on(a.PRE_STEP,this.update,this),t.events.once(a.DESTROY,this.destroy,this)},add:h,addAudioSprite:function(t,e){void 0===e&&(e={});var i=this.add(t,e);for(var n in i.spritemap=this.jsonCache.get(t).spritemap,i.spritemap)if(i.spritemap.hasOwnProperty(n)){var r=s(e),o=i.spritemap[n];r.loop=!!o.hasOwnProperty("loop")&&o.loop,i.addMarker({name:n,start:o.start,duration:o.end-o.start,config:r})}return i},play:function(t,e){var i=this.add(t);return i.once(o.COMPLETE,i.destroy,i),e?e.name?(i.addMarker(e),i.play(e.name)):i.play(e):i.play()},playAudioSprite:function(t,e,i){var n=this.addAudioSprite(t);return n.once(o.COMPLETE,n.destroy,n),n.play(e,i)},remove:function(t){var e=this.sounds.indexOf(t);return-1!==e&&(t.destroy(),this.sounds.splice(e,1),!0)},removeByKey:function(t){for(var e=0,i=this.sounds.length-1;i>=0;i--){var n=this.sounds[i];n.key===t&&(n.destroy(),this.sounds.splice(i,1),e++)}return e},pauseAll:function(){this.forEachActiveSound(function(t){t.pause()}),this.emit(o.PAUSE_ALL,this)},resumeAll:function(){this.forEachActiveSound(function(t){t.resume()}),this.emit(o.RESUME_ALL,this)},stopAll:function(){this.forEachActiveSound(function(t){t.stop()}),this.emit(o.STOP_ALL,this)},unlock:h,onBlur:h,onFocus:h,update:function(t,e){this.unlocked&&(this.unlocked=!1,this.locked=!1,this.emit(o.UNLOCKED,this));for(var i=this.sounds.length-1;i>=0;i--)this.sounds[i].pendingRemove&&this.sounds.splice(i,1);this.sounds.forEach(function(i){i.update(t,e)})},destroy:function(){this.removeAllListeners(),this.forEachActiveSound(function(t){t.destroy()}),this.sounds.length=0,this.sounds=null,this.game=null},forEachActiveSound:function(t,e){var i=this;this.sounds.forEach(function(n,s){n.pendingRemove||t.call(e||i,n,s,i.sounds)})},setRate:function(t){return this.rate=t,this},rate:{get:function(){return this._rate},set:function(t){this._rate=t,this.forEachActiveSound(function(t){t.calculateRate()}),this.emit(o.GLOBAL_RATE,this,t)}},setDetune:function(t){return this.detune=t,this},detune:{get:function(){return this._detune},set:function(t){this._detune=t,this.forEachActiveSound(function(t){t.calculateRate()}),this.emit(o.GLOBAL_DETUNE,this,t)}}});t.exports=l},function(t,e){t.exports={PENDING:0,INIT:1,START:2,LOADING:3,CREATING:4,RUNNING:5,PAUSED:6,SLEEPING:7,SHUTDOWN:8,DESTROYED:9}},function(t,e){t.exports={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:42,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,NUMPAD_ZERO:96,NUMPAD_ONE:97,NUMPAD_TWO:98,NUMPAD_THREE:99,NUMPAD_FOUR:100,NUMPAD_FIVE:101,NUMPAD_SIX:102,NUMPAD_SEVEN:103,NUMPAD_EIGHT:104,NUMPAD_NINE:105,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,SEMICOLON:186,PLUS:187,COMMA:188,MINUS:189,PERIOD:190,FORWARD_SLASH:191,BACK_SLASH:220,QUOTES:222,BACKTICK:192,OPEN_BRACKET:219,CLOSED_BRACKET:221,SEMICOLON_FIREFOX:59,COLON:58,COMMA_FIREFOX_WINDOWS:60,COMMA_FIREFOX:62,BRACKET_RIGHT_FIREFOX:174,BRACKET_LEFT_FIREFOX:175}},function(t,e,i){t.exports={ADD:i(1049),ERROR:i(1048),LOAD:i(1047),READY:i(1046),REMOVE:i(1045)}},function(t,e){t.exports=function(t,e){return t>0&&0==(t&t-1)&&e>0&&0==(e&e-1)}},function(t,e,i){var n,s=i(99),r={chrome:!1,chromeVersion:0,edge:!1,firefox:!1,firefoxVersion:0,ie:!1,ieVersion:0,mobileSafari:!1,opera:!1,safari:!1,safariVersion:0,silk:!1,trident:!1,tridentVersion:0};t.exports=(n=navigator.userAgent,/Edge\/\d+/.test(n)?r.edge=!0:/Chrome\/(\d+)/.test(n)&&!s.windowsPhone?(r.chrome=!0,r.chromeVersion=parseInt(RegExp.$1,10)):/Firefox\D+(\d+)/.test(n)?(r.firefox=!0,r.firefoxVersion=parseInt(RegExp.$1,10)):/AppleWebKit/.test(n)&&s.iOS?r.mobileSafari=!0:/MSIE (\d+\.\d+);/.test(n)?(r.ie=!0,r.ieVersion=parseInt(RegExp.$1,10)):/Opera/.test(n)?r.opera=!0:/Safari/.test(n)&&!s.windowsPhone?r.safari=!0:/Trident\/(\d+\.\d+)(.*)rv:(\d+\.\d+)/.test(n)&&(r.ie=!0,r.trident=!0,r.tridentVersion=parseInt(RegExp.$1,10),r.ieVersion=parseInt(RegExp.$3,10)),/Silk/.test(n)&&(r.silk=!0),r)},function(t,e){t.exports=function(t,e,i){return(e-t)*i+t}},function(t,e){var i,n="";t.exports={disable:function(t){return""===n&&(n=i(t)),n&&(t[n]=!1),t},enable:function(t){return""===n&&(n=i(t)),n&&(t[n]=!0),t},getPrefix:i=function(t){for(var e=["i","webkitI","msI","mozI","oI"],i=0;iC&&wA&&bs&&(t=s),t},clampY:function(t){var e=this._bounds,i=this.displayHeight,n=e.y+(i-this.height)/2,s=Math.max(n,n+e.height-i);return ts&&(t=s),t},removeBounds:function(){return this.useBounds=!1,this.dirty=!0,this._bounds.setEmpty(),this},setAngle:function(t){return void 0===t&&(t=0),this.rotation=r(t),this},setBackgroundColor:function(t){return void 0===t&&(t="rgba(0,0,0,0)"),this.backgroundColor=u(t),this.transparent=0===this.backgroundColor.alpha,this},setBounds:function(t,e,i,n,s){return void 0===s&&(s=!1),this._bounds.setTo(t,e,i,n),this.dirty=!0,this.useBounds=!0,s?this.centerToBounds():(this.scrollX=this.clampX(this.scrollX),this.scrollY=this.clampY(this.scrollY)),this},getBounds:function(t){void 0===t&&(t=new h);var e=this._bounds;return t.setTo(e.x,e.y,e.width,e.height),t},setName:function(t){return void 0===t&&(t=""),this.name=t,this},setPosition:function(t,e){return void 0===e&&(e=t),this.x=t,this.y=e,this},setRotation:function(t){return void 0===t&&(t=0),this.rotation=t,this},setRoundPixels:function(t){return this.roundPixels=t,this},setScene:function(t){this.scene&&this._customViewport&&this.sceneManager.customViewports--,this.scene=t,this.sceneManager=t.sys.game.scene,this.scaleManager=t.sys.scale;var e=this.scaleManager.resolution;return this.resolution=e,this._cx=this._x*e,this._cy=this._y*e,this._cw=this._width*e,this._ch=this._height*e,this.updateSystem(),this},setScroll:function(t,e){return void 0===e&&(e=t),this.scrollX=t,this.scrollY=e,this},setSize:function(t,e){return void 0===e&&(e=t),this.width=t,this.height=e,this},setViewport:function(t,e,i,n){return this.x=t,this.y=e,this.width=i,this.height=n,this},setZoom:function(t){return void 0===t&&(t=1),0===t&&(t=.001),this.zoom=t,this},toJSON:function(){var t={name:this.name,x:this.x,y:this.y,width:this.width,height:this.height,zoom:this.zoom,rotation:this.rotation,roundPixels:this.roundPixels,scrollX:this.scrollX,scrollY:this.scrollY,backgroundColor:this.backgroundColor.rgba};return this.useBounds&&(t.bounds={x:this._bounds.x,y:this._bounds.y,width:this._bounds.width,height:this._bounds.height}),t},update:function(){},updateSystem:function(){if(this.scaleManager){var t=0!==this._x||0!==this._y||this.scaleManager.width!==this._width||this.scaleManager.height!==this._height,e=this.sceneManager;t&&!this._customViewport?e.customViewports++:!t&&this._customViewport&&e.customViewports--,this.dirty=!0,this._customViewport=t}},destroy:function(){this.emit(a.DESTROY,this),this.removeAllListeners(),this.matrix.destroy(),this.culledObjects=[],this._customViewport&&this.sceneManager.customViewports--,this._bounds=null,this.scene=null,this.scaleManager=null,this.sceneManager=null},x:{get:function(){return this._x},set:function(t){this._x=t,this._cx=t*this.resolution,this.updateSystem()}},y:{get:function(){return this._y},set:function(t){this._y=t,this._cy=t*this.resolution,this.updateSystem()}},width:{get:function(){return this._width},set:function(t){this._width=t,this._cw=t*this.resolution,this.updateSystem()}},height:{get:function(){return this._height},set:function(t){this._height=t,this._ch=t*this.resolution,this.updateSystem()}},scrollX:{get:function(){return this._scrollX},set:function(t){this._scrollX=t,this.dirty=!0}},scrollY:{get:function(){return this._scrollY},set:function(t){this._scrollY=t,this.dirty=!0}},zoom:{get:function(){return this._zoom},set:function(t){this._zoom=t,this.dirty=!0}},rotation:{get:function(){return this._rotation},set:function(t){this._rotation=t,this.dirty=!0}},centerX:{get:function(){return this.x+.5*this.width}},centerY:{get:function(){return this.y+.5*this.height}},displayWidth:{get:function(){return this.width/this.zoom}},displayHeight:{get:function(){return this.height/this.zoom}}});t.exports=d},function(t,e){t.exports=function(t){for(var e=t.length-1;e>0;e--){var i=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[i],t[i]=n}return t}},function(t,e,i){t.exports={DESTROY:i(1234)}},function(t,e,i){var n=i(0),s=i(420),r=new n({initialize:function(t,e){this.parent=t,this.events=e,e||(this.events=t.events?t.events:t),this.list={},this.values={},this._frozen=!1,!t.hasOwnProperty("sys")&&this.events&&this.events.once("destroy",this.destroy,this)},get:function(t){var e=this.list;if(Array.isArray(t)){for(var i=[],n=0;n0&&s.area(_)1?(f=o.create(r.extend({parts:p.slice(0)},n)),o.setPosition(f,{x:t,y:e}),f):p[0]}},function(t,e){t.exports=function(t,e,i,n,s,r,o,a,h,l,u,c,d){return{target:t,key:e,getEndValue:i,getStartValue:n,ease:s,duration:0,totalDuration:0,delay:0,yoyo:a,hold:0,repeat:0,repeatDelay:0,flipX:c,flipY:d,progress:0,elapsed:0,repeatCounter:0,start:0,current:0,end:0,t1:0,t2:0,gen:{delay:r,duration:o,hold:h,repeat:l,repeatDelay:u},state:0}}},function(t,e,i){var n=i(0),s=i(14),r=i(5),o=i(89),a=new n({initialize:function(t,e,i){this.parent=t,this.parentIsTimeline=t.hasOwnProperty("isTimeline"),this.data=e,this.totalData=e.length,this.targets=i,this.totalTargets=i.length,this.useFrames=!1,this.timeScale=1,this.loop=0,this.loopDelay=0,this.loopCounter=0,this.completeDelay=0,this.countdown=0,this.offset=0,this.calculatedOffset=0,this.state=o.PENDING_ADD,this._pausedState=o.PENDING_ADD,this.paused=!1,this.elapsed=0,this.totalElapsed=0,this.duration=0,this.progress=0,this.totalDuration=0,this.totalProgress=0,this.callbacks={onComplete:null,onLoop:null,onRepeat:null,onStart:null,onUpdate:null,onYoyo:null},this.callbackScope},getValue:function(){return this.data[0].current},setTimeScale:function(t){return this.timeScale=t,this},getTimeScale:function(){return this.timeScale},isPlaying:function(){return this.state===o.ACTIVE},isPaused:function(){return this.state===o.PAUSED},hasTarget:function(t){return-1!==this.targets.indexOf(t)},updateTo:function(t,e,i){void 0===i&&(i=!1);for(var n=0;n0&&(n.totalDuration+=n.t2*n.repeat),n.totalDuration>t&&(t=n.totalDuration)}this.duration=t,this.loopCounter=-1===this.loop?999999999999:this.loop,this.loopCounter>0?this.totalDuration=this.duration+this.completeDelay+(this.duration+this.loopDelay)*this.loopCounter:this.totalDuration=this.duration+this.completeDelay},init:function(){for(var t=this.data,e=this.totalTargets,i=0;i0){this.elapsed=0,this.progress=0,this.loopCounter--;var t=this.callbacks.onLoop;t&&(t.params[1]=this.targets,t.func.apply(t.scope,t.params)),this.resetTweenData(!0),this.loopDelay>0?(this.countdown=this.loopDelay,this.state=o.LOOP_DELAY):this.state=o.ACTIVE}else if(this.completeDelay>0)this.countdown=this.completeDelay,this.state=o.COMPLETE_DELAY;else{var e=this.callbacks.onComplete;e&&(e.params[1]=this.targets,e.func.apply(e.scope,e.params)),this.state=o.PENDING_REMOVE}},pause:function(){if(this.state!==o.PAUSED)return this.paused=!0,this._pausedState=this.state,this.state=o.PAUSED,this},play:function(t){if(this.state===o.ACTIVE)return this;this.state!==o.PENDING_REMOVE&&this.state!==o.REMOVED||(this.init(),this.parent.makeActive(this),t=!0);var e=this.callbacks.onStart;return this.parentIsTimeline?(this.resetTweenData(t),0===this.calculatedOffset?(e&&(e.params[1]=this.targets,e.func.apply(e.scope,e.params)),this.state=o.ACTIVE):(this.countdown=this.calculatedOffset,this.state=o.OFFSET_DELAY)):this.paused?(this.paused=!1,this.parent.makeActive(this)):(this.resetTweenData(t),this.state=o.ACTIVE,e&&(e.params[1]=this.targets,e.func.apply(e.scope,e.params)),this.parent.makeActive(this)),this},resetTweenData:function(t){for(var e=this.data,i=0;i0?(n.elapsed=n.delay,n.state=o.DELAY):n.state=o.PENDING_RENDER}},resume:function(){return this.state===o.PAUSED?(this.paused=!1,this.state=this._pausedState):this.play(),this},seek:function(t){for(var e=this.data,i=0;i=s.totalDuration?(r=1,o=s.duration):n>s.delay&&n<=s.t1?(r=(n=Math.max(0,n-s.delay))/s.t1,o=s.duration*r):n>s.t1&&ns.repeatDelay&&(r=n/s.t1,o=s.duration*r)),s.progress=r,s.elapsed=o;var a=s.ease(s.progress);s.current=s.start+(s.end-s.start)*a,s.target[s.key]=s.current}return this},setCallback:function(t,e,i,n){return this.callbacks[t]={func:e,scope:n,params:i},this},complete:function(t){if(void 0===t&&(t=0),t)this.countdown=t,this.state=o.COMPLETE_DELAY;else{var e=this.callbacks.onComplete;e&&(e.params[1]=this.targets,e.func.apply(e.scope,e.params)),this.state=o.PENDING_REMOVE}return this},stop:function(t){return this.state===o.ACTIVE&&void 0!==t&&this.seek(t),this.state!==o.REMOVED&&(this.state!==o.PAUSED&&this.state!==o.PENDING_ADD||(this.parent._destroy.push(this),this.parent._toProcess++),this.state=o.PENDING_REMOVE),this},update:function(t,e){if(this.state===o.PAUSED)return!1;switch(this.useFrames&&(e=1*this.parent.timeScale),e*=this.timeScale,this.elapsed+=e,this.progress=Math.min(this.elapsed/this.duration,1),this.totalElapsed+=e,this.totalProgress=Math.min(this.totalElapsed/this.totalDuration,1),this.state){case o.ACTIVE:for(var i=!1,n=0;n0){e.repeatCounter--,e.elapsed=i,e.progress=i/e.duration,e.flipX&&e.target.toggleFlipX(),e.flipY&&e.target.toggleFlipY();var s=t.callbacks.onRepeat;return s&&(s.params[1]=e.target,s.func.apply(s.scope,s.params)),e.start=e.getStartValue(e.target,e.key,e.start),e.end=e.getEndValue(e.target,e.key,e.start),e.repeatDelay>0?(e.elapsed=e.repeatDelay-i,e.current=e.start,e.target[e.key]=e.current,o.REPEAT_DELAY):o.PLAYING_FORWARD}return o.COMPLETE},setStateFromStart:function(t,e,i){if(e.repeatCounter>0){e.repeatCounter--,e.elapsed=i,e.progress=i/e.duration,e.flipX&&e.target.toggleFlipX(),e.flipY&&e.target.toggleFlipY();var n=t.callbacks.onRepeat;return n&&(n.params[1]=e.target,n.func.apply(n.scope,n.params)),e.end=e.getEndValue(e.target,e.key,e.start),e.repeatDelay>0?(e.elapsed=e.repeatDelay-i,e.current=e.start,e.target[e.key]=e.current,o.REPEAT_DELAY):o.PLAYING_FORWARD}return o.COMPLETE},updateTweenData:function(t,e,i){switch(e.state){case o.PLAYING_FORWARD:case o.PLAYING_BACKWARD:if(!e.target){e.state=o.COMPLETE;break}var n=e.elapsed,s=e.duration,r=0;(n+=i)>s&&(r=n-s,n=s);var a,h=e.state===o.PLAYING_FORWARD,l=n/s;a=h?e.ease(l):e.ease(1-l),e.current=e.start+(e.end-e.start)*a,e.target[e.key]=e.current,e.elapsed=n,e.progress=l;var u=t.callbacks.onUpdate;u&&(u.params[1]=e.target,u.func.apply(u.scope,u.params)),1===l&&(h?e.hold>0?(e.elapsed=e.hold-r,e.state=o.HOLD_DELAY):e.state=this.setStateFromEnd(t,e,r):e.state=this.setStateFromStart(t,e,r));break;case o.DELAY:e.elapsed-=i,e.elapsed<=0&&(e.elapsed=Math.abs(e.elapsed),e.state=o.PENDING_RENDER);break;case o.REPEAT_DELAY:e.elapsed-=i,e.elapsed<=0&&(e.elapsed=Math.abs(e.elapsed),e.state=o.PLAYING_FORWARD);break;case o.HOLD_DELAY:e.elapsed-=i,e.elapsed<=0&&(e.state=this.setStateFromEnd(t,e,Math.abs(e.elapsed)));break;case o.PENDING_RENDER:e.target?(e.start=e.getStartValue(e.target,e.key,e.target[e.key]),e.end=e.getEndValue(e.target,e.key,e.start),e.current=e.start,e.target[e.key]=e.start,e.state=o.PLAYING_FORWARD):e.state=o.COMPLETE}return e.state!==o.COMPLETE}});a.TYPES=["onComplete","onLoop","onRepeat","onStart","onUpdate","onYoyo"],r.register("tween",function(t){return this.scene.sys.tweens.add(t)}),s.register("tween",function(t){return this.scene.sys.tweens.create(t)}),t.exports=a},function(t,e){t.exports={targets:null,delay:0,duration:1e3,ease:"Power0",easeParams:null,hold:0,repeat:0,repeatDelay:0,yoyo:!1,flipX:!1,flipY:!1}},function(t,e){function i(t){return!!t.getStart&&"function"==typeof t.getStart}function n(t){return!!t.getEnd&&"function"==typeof t.getEnd}var s=function(t,e){var r,o,a=function(t,e,i){return i},h=function(t,e,i){return i},l=typeof e;if("number"===l)a=function(){return e};else if("string"===l){var u=e[0],c=parseFloat(e.substr(2));switch(u){case"+":a=function(t,e,i){return i+c};break;case"-":a=function(t,e,i){return i-c};break;case"*":a=function(t,e,i){return i*c};break;case"/":a=function(t,e,i){return i/c};break;default:a=function(){return parseFloat(e)}}}else"function"===l?a=e:"object"===l&&(i(o=e)||n(o))?(n(e)&&(a=e.getEnd),i(e)&&(h=e.getStart)):e.hasOwnProperty("value")&&(r=s(t,e.value));return r||(r={getEnd:a,getStart:h}),r};t.exports=s},function(t,e,i){var n=i(4);t.exports=function(t){var e=n(t,"targets",null);return null===e?e:("function"==typeof e&&(e=e.call()),Array.isArray(e)||(e=[e]),e)}},function(t,e,i){var n=i(31),s=i(83),r=i(233),o=i(225);t.exports=function(t,e,i,a,h,l,u,c){void 0===i&&(i=32),void 0===a&&(a=32),void 0===h&&(h=10),void 0===l&&(l=10),void 0===c&&(c=!1);var d=null;if(Array.isArray(u))d=r(void 0!==e?e:"map",n.ARRAY_2D,u,i,a,c);else if(void 0!==e){var f=t.cache.tilemap.get(e);f?d=r(e,f.format,f.data,i,a,c):console.warn("No map data found for key "+e)}return null===d&&(d=new s({tileWidth:i,tileHeight:a,width:h,height:l})),new o(t,d)}},function(t,e,i){var n=i(31),s=i(84),r=i(83),o=i(61);t.exports=function(t,e,i,a,h){for(var l=new s({tileWidth:i,tileHeight:a}),u=new r({name:t,tileWidth:i,tileHeight:a,format:n.ARRAY_2D,layers:[l]}),c=[],d=e.length,f=0,p=0;p=0&&r>=0&&s+r<1&&(n.push({x:e[w].x,y:e[w].y}),i)));w++);return n}},function(t,e){t.exports=function(t,e){return!(t.width<=0||t.height<=0||e.width<=0||e.height<=0||t.righte.right||t.y>e.bottom)}},function(t,e,i){var n=i(0),s=i(116),r=new n({Extends:s,initialize:function(t,e,i,n,r){s.call(this,t,e,i,[0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,1,1,1,0,0,1,1,1,0],[16777215,16777215,16777215,16777215,16777215,16777215],[1,1,1,1,1,1],n,r),this.resetPosition()},setFrame:function(t){return this.frame=this.texture.get(t),this.frame.cutWidth&&this.frame.cutHeight?this.renderFlags|=8:this.renderFlags&=-9,t=this.frame,this.uv[0]=t.u0,this.uv[1]=t.v0,this.uv[2]=t.u0,this.uv[3]=t.v1,this.uv[4]=t.u1,this.uv[5]=t.v1,this.uv[6]=t.u0,this.uv[7]=t.v0,this.uv[8]=t.u1,this.uv[9]=t.v1,this.uv[10]=t.u1,this.uv[11]=t.v0,this},topLeftX:{get:function(){return this.x+this.vertices[0]},set:function(t){this.vertices[0]=t-this.x,this.vertices[6]=t-this.x}},topLeftY:{get:function(){return this.y+this.vertices[1]},set:function(t){this.vertices[1]=t-this.y,this.vertices[7]=t-this.y}},topRightX:{get:function(){return this.x+this.vertices[10]},set:function(t){this.vertices[10]=t-this.x}},topRightY:{get:function(){return this.y+this.vertices[11]},set:function(t){this.vertices[11]=t-this.y}},bottomLeftX:{get:function(){return this.x+this.vertices[2]},set:function(t){this.vertices[2]=t-this.x}},bottomLeftY:{get:function(){return this.y+this.vertices[3]},set:function(t){this.vertices[3]=t-this.y}},bottomRightX:{get:function(){return this.x+this.vertices[4]},set:function(t){this.vertices[4]=t-this.x,this.vertices[8]=t-this.x}},bottomRightY:{get:function(){return this.y+this.vertices[5]},set:function(t){this.vertices[5]=t-this.y,this.vertices[9]=t-this.y}},topLeftAlpha:{get:function(){return this.alphas[0]},set:function(t){this.alphas[0]=t,this.alphas[3]=t}},topRightAlpha:{get:function(){return this.alphas[5]},set:function(t){this.alphas[5]=t}},bottomLeftAlpha:{get:function(){return this.alphas[1]},set:function(t){this.alphas[1]=t}},bottomRightAlpha:{get:function(){return this.alphas[2]},set:function(t){this.alphas[2]=t,this.alphas[4]=t}},topLeftColor:{get:function(){return this.colors[0]},set:function(t){this.colors[0]=t,this.colors[3]=t}},topRightColor:{get:function(){return this.colors[5]},set:function(t){this.colors[5]=t}},bottomLeftColor:{get:function(){return this.colors[1]},set:function(t){this.colors[1]=t}},bottomRightColor:{get:function(){return this.colors[2]},set:function(t){this.colors[2]=t,this.colors[4]=t}},setTopLeft:function(t,e){return this.topLeftX=t,this.topLeftY=e,this},setTopRight:function(t,e){return this.topRightX=t,this.topRightY=e,this},setBottomLeft:function(t,e){return this.bottomLeftX=t,this.bottomLeftY=e,this},setBottomRight:function(t,e){return this.bottomRightX=t,this.bottomRightY=e,this},resetPosition:function(){var t=this.x,e=this.y,i=Math.floor(this.width/2),n=Math.floor(this.height/2);return this.setTopLeft(t-i,e-n),this.setTopRight(t+i,e-n),this.setBottomLeft(t-i,e+n),this.setBottomRight(t+i,e+n),this},resetAlpha:function(){var t=this.alphas;return t[0]=1,t[1]=1,t[2]=1,t[3]=1,t[4]=1,t[5]=1,this},resetColors:function(){var t=this.colors;return t[0]=16777215,t[1]=16777215,t[2]=16777215,t[3]=16777215,t[4]=16777215,t[5]=16777215,this},reset:function(){return this.resetPosition(),this.resetAlpha(),this.resetColors()}});t.exports=r},function(t,e){t.exports=function(t,e,i){for(var n=!1,s=-1,r=t.points.length-1;++sl){if(0===c){for(var g=f;g.length&&(g=g.slice(0,-1),!((p=e.measureText(g).width)<=l)););if(!g.length)throw new Error("This text's wordWrapWidth setting is less than a single character!");var v=d.substr(g.length);u[c]=v,h+=g}var y=u[c].length?c:c+1,m=u.slice(y).join(" ").replace(/[ \n]*$/gi,"");s[o+1]=m+" "+(s[o+1]||""),r=s.length;break}h+=f,l-=p}n+=h.replace(/[ \n]*$/gi,"")+"\n"}}return n=n.replace(/[\s|\n]*$/gi,"")},basicWordWrap:function(t,e,i){for(var n="",s=t.split(this.splitRegExp),r=0;ro?(h>0&&(n+="\n"),n+=a[h]+" ",o=i-l):(o-=u,n+=a[h],h0&&(a+=u.lineSpacing*p),i.rtl?o=d-o:"right"===i.align?o+=u.width-u.lineWidths[p]:"center"===i.align&&(o+=(u.width-u.lineWidths[p])/2),this.autoRound&&(o=Math.round(o),a=Math.round(a)),i.strokeThickness&&(this.style.syncShadow(e,i.shadowStroke),e.strokeText(h[p],o,a)),i.color&&(this.style.syncShadow(e,i.shadowFill),e.fillText(h[p],o,a));return e.restore(),this.renderer.gl&&(this.frame.source.glTexture=this.renderer.canvasToTexture(t,this.frame.source.glTexture,!0),this.frame.glTexture=this.frame.source.glTexture),this.dirty=!0,this},getTextMetrics:function(){return this.style.getTextMetrics()},text:{get:function(){return this._text},set:function(t){this.setText(t)}},toJSON:function(){var t=o.ToJSON(this),e={autoRound:this.autoRound,text:this._text,style:this.style.toJSON(),padding:{left:this.padding.left,right:this.padding.right,top:this.padding.top,bottom:this.padding.bottom}};return t.data=e,t},preDestroy:function(){this.style.rtl&&c(this.canvas),s.remove(this.canvas),this.texture.destroy()}});t.exports=p},function(t,e,i){var n=i(60),s=i(131),r=i(24),o=i(0),a=i(13),h=i(28),l=i(121),u=i(18),c=i(840),d=i(9),f=i(299),p=new o({Extends:u,Mixins:[a.Alpha,a.BlendMode,a.ComputedSize,a.Crop,a.Depth,a.Flip,a.GetBounds,a.Mask,a.Origin,a.Pipeline,a.ScaleMode,a.ScrollFactor,a.Tint,a.Transform,a.Visible,c],initialize:function(t,e,i,n,o){void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=32),void 0===o&&(o=32),u.call(this,t,"RenderTexture"),this.renderer=t.sys.game.renderer,this.textureManager=t.sys.textures,this.globalTint=16777215,this.globalAlpha=1,this.canvas=r.create2D(this,n,o),this.context=this.canvas.getContext("2d"),this.framebuffer=null,this._crop=this.resetCropObject(),this.texture=t.sys.textures.addCanvas(f(),this.canvas),this.frame=this.texture.get(),this._saved=!1,this._eraseMode=!1,this.camera=new s(0,0,n,o),this.dirty=!1,this.gl=null;var a=this.renderer;if(a.type===h.WEBGL){var l=a.gl;this.gl=l,this.drawGameObject=this.batchGameObjectWebGL,this.framebuffer=a.createFramebuffer(n,o,this.frame.source.glTexture,!1)}else a.type===h.CANVAS&&(this.drawGameObject=this.batchGameObjectCanvas);this.camera.setScene(t),this.setPosition(e,i),this.setSize(n,o),this.setOrigin(0,0),this.initPipeline()},setSize:function(t,e){return this.resize(t,e)},resize:function(t,e){if(void 0===e&&(e=t),t!==this.width||e!==this.height){if(this.canvas.width=t,this.canvas.height=e,this.gl){var i=this.gl;this.renderer.deleteTexture(this.frame.source.glTexture),this.renderer.deleteFramebuffer(this.framebuffer),this.frame.source.glTexture=this.renderer.createTexture2D(0,i.NEAREST,i.NEAREST,i.CLAMP_TO_EDGE,i.CLAMP_TO_EDGE,i.RGBA,null,t,e,!1),this.framebuffer=this.renderer.createFramebuffer(t,e,this.frame.source.glTexture,!1),this.frame.glTexture=this.frame.source.glTexture}this.frame.source.width=t,this.frame.source.height=e,this.camera.setSize(t,e),this.frame.setSize(t,e),this.width=t,this.height=e}return this},setGlobalTint:function(t){return this.globalTint=t,this},setGlobalAlpha:function(t){return this.globalAlpha=t,this},saveTexture:function(t){return this.textureManager.renameTexture(this.texture.key,t),this._saved=!0,this.texture},fill:function(t,e){void 0===e&&(e=1);var i=255&(t>>16|0),n=255&(t>>8|0),s=255&(0|t);if(this.gl){var r=this.renderer,o=this.getBounds();r.setFramebuffer(this.framebuffer,!0),this.pipeline.drawFillRect(o.x,o.y,o.right,o.bottom,d.getTintFromFloats(i/255,n/255,s/255,1),e),r.setFramebuffer(null,!0)}else this.context.fillStyle="rgba("+i+","+n+","+s+","+e+")",this.context.fillRect(0,0,this.canvas.width,this.canvas.height);return this},clear:function(){if(this.dirty){var t=this.gl;if(t){var e=this.renderer;e.setFramebuffer(this.framebuffer,!0),t.clearColor(0,0,0,0),t.clear(t.COLOR_BUFFER_BIT),e.setFramebuffer(null,!0)}else{var i=this.context;i.save(),i.setTransform(1,0,0,1,0,0),i.clearRect(0,0,this.canvas.width,this.canvas.height),i.restore()}this.dirty=!1}return this},erase:function(t,e,i){this._eraseMode=!0;var s=this.renderer.currentBlendMode;return this.renderer.setBlendMode(n.ERASE),this.draw(t,e,i,1,16777215),this.renderer.setBlendMode(s),this._eraseMode=!1,this},draw:function(t,e,i,n,s){void 0===n&&(n=this.globalAlpha),s=void 0===s?(this.globalTint>>16)+(65280&this.globalTint)+((255&this.globalTint)<<16):(s>>16)+(65280&s)+((255&s)<<16),Array.isArray(t)||(t=[t]);var r=this.gl;if(this.camera.preRender(1,1),r){var o=this.camera._cx,a=this.camera._cy,h=this.camera._cw,l=this.camera._ch;this.renderer.setFramebuffer(this.framebuffer,!1),this.renderer.pushScissor(o,a,h,l,l);var u=this.pipeline;u.projOrtho(0,this.width,0,this.height,-1e3,1e3),this.batchList(t,e,i,n,s),u.flush(),this.renderer.setFramebuffer(null,!1),this.renderer.popScissor(),u.projOrtho(0,u.width,u.height,0,-1e3,1e3)}else this.renderer.setContext(this.context),this.batchList(t,e,i,n,s),this.renderer.setContext();return this.dirty=!0,this},drawFrame:function(t,e,i,n,s,r){void 0===i&&(i=0),void 0===n&&(n=0),void 0===s&&(s=this.globalAlpha),r=void 0===r?(this.globalTint>>16)+(65280&this.globalTint)+((255&this.globalTint)<<16):(r>>16)+(65280&r)+((255&r)<<16);var o=this.gl,a=this.textureManager.getFrame(t,e);if(a){if(this.camera.preRender(1,1),o){var h=this.camera._cx,l=this.camera._cy,u=this.camera._cw,c=this.camera._ch;this.renderer.setFramebuffer(this.framebuffer,!1),this.renderer.pushScissor(h,l,u,c,c);var d=this.pipeline;d.projOrtho(0,this.width,0,this.height,-1e3,1e3),d.batchTextureFrame(a,i,n,r,s,this.camera.matrix,null),d.flush(),this.renderer.setFramebuffer(null,!1),this.renderer.popScissor(),d.projOrtho(0,d.width,d.height,0,-1e3,1e3)}else this.batchTextureFrame(a,i,n,s,r);this.dirty=!0}return this},batchList:function(t,e,i,n,s){for(var r=0;r0?e.defaultFrame=i[0]:e.defaultFrame=this.defaultFrame,this},addEmitter:function(t){return this.emitters.add(t)},createEmitter:function(t){return this.addEmitter(new h(this,t))},addGravityWell:function(t){return this.wells.add(t)},createGravityWell:function(t){return this.addGravityWell(new o(t))},emitParticle:function(t,e,i){for(var n=this.emitters.list,s=0;s-1&&this.fillStyle(this.defaultFillColor,this.defaultFillAlpha),this.defaultStrokeColor>-1&&this.lineStyle(this.defaultStrokeWidth,this.defaultStrokeColor,this.defaultStrokeAlpha),this},generateTexture:function(t,e,i){var n,s,r=this.scene.sys,o=r.game.renderer;if(void 0===e&&(e=r.scale.width),void 0===i&&(i=r.scale.height),T.TargetCamera.setScene(this.scene),T.TargetCamera.setViewport(0,0,e,i),T.TargetCamera.scrollX=this.x,T.TargetCamera.scrollY=this.y,"string"==typeof t)if(r.textures.exists(t)){var a=(n=r.textures.get(t)).getSourceImage();a instanceof HTMLCanvasElement&&(s=a.getContext("2d"))}else s=(n=r.textures.createCanvas(t,e,i)).getSourceImage().getContext("2d");else t instanceof HTMLCanvasElement&&(s=t.getContext("2d"));return s&&(this.renderCanvas(o,this,0,T.TargetCamera,null,s,!1),n&&n.refresh()),this},preDestroy:function(){this.commandBuffer=[]}});T.TargetCamera=new n,t.exports=T},function(t,e,i){var n=i(117),s=i(0),r=i(860),o=new s({Extends:n,Mixins:[r],initialize:function(t,e,i,s,r,o,a){n.call(this,t,e,i,s,r,o,a),this.type="DynamicBitmapText",this.scrollX=0,this.scrollY=0,this.cropWidth=0,this.cropHeight=0,this.displayCallback,this.callbackData={parent:this,color:0,tint:{topLeft:0,topRight:0,bottomLeft:0,bottomRight:0},index:0,charCode:0,x:0,y:0,scale:0,rotation:0,data:0}},setSize:function(t,e){return this.cropWidth=t,this.cropHeight=e,this},setDisplayCallback:function(t){return this.displayCallback=t,this},setScrollX:function(t){return this.scrollX=t,this},setScrollY:function(t){return this.scrollY=t,this}});t.exports=o},function(t,e,i){var n=i(174),s=i(60),r=i(0),o=i(13),a=i(133),h=i(18),l=i(10),u=i(863),c=i(313),d=i(3),f=new r({Extends:h,Mixins:[o.Alpha,o.BlendMode,o.ComputedSize,o.Depth,o.Mask,o.ScrollFactor,o.Transform,o.Visible,u],initialize:function(t,e,i,n){h.call(this,t,"Container"),this.list=[],this.exclusive=!0,this.maxSize=-1,this.position=0,this.localTransform=new o.TransformMatrix,this.tempTransformMatrix=new o.TransformMatrix,this._displayList=t.sys.displayList,this._sortKey="",this._sysEvents=t.sys.events,this.setPosition(e,i),this.clearAlpha(),this.setBlendMode(s.SKIP_CHECK),n&&this.add(n)},originX:{get:function(){return.5}},originY:{get:function(){return.5}},displayOriginX:{get:function(){return.5*this.width}},displayOriginY:{get:function(){return.5*this.height}},setExclusive:function(t){return void 0===t&&(t=!0),this.exclusive=t,this},getBounds:function(t){if(void 0===t&&(t=new l),t.setTo(this.x,this.y,0,0),this.list.length>0)for(var e=this.list,i=new l,n=0;n-1},setAll:function(t,e,i,s){return n.SetAll(this.list,t,e,i,s),this},each:function(t,e){var i,n=[null],s=this.list.slice(),r=s.length;for(i=2;i0?this.list[0]:null}},last:{get:function(){return this.list.length>0?(this.position=this.list.length-1,this.list[this.position]):null}},next:{get:function(){return this.position0?(this.position--,this.list[this.position]):null}},preDestroy:function(){this.removeAll(!!this.exclusive),this.localTransform.destroy(),this.tempTransformMatrix.destroy(),this.list=[],this._displayList=null}});t.exports=f},function(t,e,i){var n=i(867),s=i(864),r=i(0),o=i(13),a=i(121),h=i(18),l=i(120),u=new r({Extends:h,Mixins:[o.Alpha,o.BlendMode,o.Depth,o.Mask,o.Pipeline,o.ScaleMode,o.ScrollFactor,o.Size,o.Texture,o.Transform,o.Visible,n],initialize:function(t,e,i,n,s){h.call(this,t,"Blitter"),this.setTexture(n,s),this.setPosition(e,i),this.initPipeline(),this.children=new l,this.renderList=[],this.dirty=!1},create:function(t,e,i,n,r){void 0===n&&(n=!0),void 0===r&&(r=this.children.length),void 0===i?i=this.frame:i instanceof a||(i=this.texture.get(i));var o=new s(this,t,e,i,n);return this.children.addAt(o,r,!1),this.dirty=!0,o},createFromCallback:function(t,e,i,n){for(var s=this.createMultiple(e,i,n),r=0;r0},getRenderList:function(){return this.dirty&&(this.renderList=this.children.list.filter(this.childCanRender,this),this.dirty=!1),this.renderList},clear:function(){this.children.removeAll(),this.dirty=!0},preDestroy:function(){this.children.destroy(),this.renderList=[]}});t.exports=u},function(t,e){t.exports=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=t.length);var n=e+Math.floor(Math.random()*i);return void 0===t[n]?null:t[n]}},function(t,e){t.exports=function(t){if(!Array.isArray(t)||t.length<2||!Array.isArray(t[0]))return!1;for(var e=t[0].length,i=1;i0},isTransitionIn:function(){return this.settings.isTransition},isVisible:function(){return this.settings.visible},setVisible:function(t){return this.settings.visible=t,this},setActive:function(t,e){return t?this.resume(e):this.pause(e)},start:function(t){t&&(this.settings.data=t),this.settings.status=s.START,this.settings.active=!0,this.settings.visible=!0,this.events.emit(o.START,this),this.events.emit(o.READY,this,t)},shutdown:function(t){this.events.off(o.TRANSITION_INIT),this.events.off(o.TRANSITION_START),this.events.off(o.TRANSITION_COMPLETE),this.events.off(o.TRANSITION_OUT),this.settings.status=s.SHUTDOWN,this.settings.active=!1,this.settings.visible=!1,this.events.emit(o.SHUTDOWN,this,t)},destroy:function(){this.settings.status=s.DESTROYED,this.settings.active=!1,this.settings.visible=!1,this.events.emit(o.DESTROY,this),this.events.removeAllListeners();for(var t=["scene","game","anims","cache","plugins","registry","sound","textures","add","camera","displayList","events","make","scenePlugin","updateList"],e=0;e=0;){var a=e[o];-1!==(r=t.indexOf(a))?(n(t,r),i&&i.call(s,a)):e.pop(),o--}return e}},function(t,e,i){var n={CENTER:i(349),ORIENTATION:i(348),SCALE_MODE:i(347),ZOOM:i(346)};t.exports=n},function(t,e){t.exports=function(t,e){var i;if(e)"string"==typeof e?i=document.getElementById(e):"object"==typeof e&&1===e.nodeType&&(i=e);else if(t.parentElement)return t;return i||(i=document.body),i.appendChild(t),t}},function(t,e,i){var n=i(10);t.exports=function(t,e){if(void 0===e&&(e=new n),0===t.length)return e;for(var i,s,r,o=Number.MAX_VALUE,a=Number.MAX_VALUE,h=Number.MIN_SAFE_INTEGER,l=Number.MIN_SAFE_INTEGER,u=0;u0&&(n=1/Math.sqrt(n),this.x=t*n,this.y=e*n,this.z=i*n),this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z},cross:function(t){var e=this.x,i=this.y,n=this.z,s=t.x,r=t.y,o=t.z;return this.x=i*o-n*r,this.y=n*s-e*o,this.z=e*r-i*s,this},lerp:function(t,e){void 0===e&&(e=0);var i=this.x,n=this.y,s=this.z;return this.x=i+e*(t.x-i),this.y=n+e*(t.y-n),this.z=s+e*(t.z-s),this},transformMat3:function(t){var e=this.x,i=this.y,n=this.z,s=t.val;return this.x=e*s[0]+i*s[3]+n*s[6],this.y=e*s[1]+i*s[4]+n*s[7],this.z=e*s[2]+i*s[5]+n*s[8],this},transformMat4:function(t){var e=this.x,i=this.y,n=this.z,s=t.val;return this.x=s[0]*e+s[4]*i+s[8]*n+s[12],this.y=s[1]*e+s[5]*i+s[9]*n+s[13],this.z=s[2]*e+s[6]*i+s[10]*n+s[14],this},transformCoordinates:function(t){var e=this.x,i=this.y,n=this.z,s=t.val,r=e*s[0]+i*s[4]+n*s[8]+s[12],o=e*s[1]+i*s[5]+n*s[9]+s[13],a=e*s[2]+i*s[6]+n*s[10]+s[14],h=e*s[3]+i*s[7]+n*s[11]+s[15];return this.x=r/h,this.y=o/h,this.z=a/h,this},transformQuat:function(t){var e=this.x,i=this.y,n=this.z,s=t.x,r=t.y,o=t.z,a=t.w,h=a*e+r*n-o*i,l=a*i+o*e-s*n,u=a*n+s*i-r*e,c=-s*e-r*i-o*n;return this.x=h*a+c*-s+l*-o-u*-r,this.y=l*a+c*-r+u*-s-h*-o,this.z=u*a+c*-o+h*-r-l*-s,this},project:function(t){var e=this.x,i=this.y,n=this.z,s=t.val,r=s[0],o=s[1],a=s[2],h=s[3],l=s[4],u=s[5],c=s[6],d=s[7],f=s[8],p=s[9],g=s[10],v=s[11],y=s[12],m=s[13],x=s[14],T=1/(e*h+i*d+n*v+s[15]);return this.x=(e*r+i*l+n*f+y)*T,this.y=(e*o+i*u+n*p+m)*T,this.z=(e*a+i*c+n*g+x)*T,this},unproject:function(t,e){var i=t.x,n=t.y,s=t.z,r=t.w,o=this.x-i,a=r-this.y-1-n,h=this.z;return this.x=2*o/s-1,this.y=2*a/r-1,this.z=2*h-1,this.project(e)},reset:function(){return this.x=0,this.y=0,this.z=0,this}});n.ZERO=new n,n.RIGHT=new n(1,0,0),n.LEFT=new n(-1,0,0),n.UP=new n(0,-1,0),n.DOWN=new n(0,1,0),n.FORWARD=new n(0,0,1),n.BACK=new n(0,0,-1),n.ONE=new n(1,1,1),t.exports=n},function(t,e,i){var n=i(20);t.exports=function(t){return t*n.RAD_TO_DEG}},function(t,e){t.exports=function(t,e){return Math.floor(Math.random()*(e-t+1)+t)}},function(t,e){t.exports=function(t,e,i,n,s){var r=.5*(n-e),o=.5*(s-i),a=t*t;return(2*i-2*n+r+o)*(t*a)+(-3*i+3*n-2*r-o)*a+r*t+i}},function(t,e){t.exports=function(t,e,i){return void 0===i&&(i=1e-4),Math.abs(t-e)=(t=t.toString()).length)switch(n){case 1:t=new Array(e+1-t.length).join(i)+t;break;case 3:var r=Math.ceil((s=e-t.length)/2);t=new Array(s-r+1).join(i)+t+new Array(r+1).join(i);break;default:t+=new Array(e+1-t.length).join(i)}return t}},function(t,e,i){var n=new(i(0))({initialize:function(t){if(this.entries={},this.size=0,Array.isArray(t))for(var e=0;e=i?1:(t=(t-e)/(i-e))*t*(3-2*t)}},function(t,e){t.exports=function(t,e,i){return(t=Math.max(0,Math.min(1,(t-e)/(i-e))))*t*t*(t*(6*t-15)+10)}},function(t,e){t.exports=function(t,e,i,n,s){var r=n+Math.atan2(t.y-i,t.x-e);return t.x=e+s*Math.cos(r),t.y=i+s*Math.sin(r),t}},function(t,e,i){var n=i(6);t.exports=function(t,e){void 0===e&&(e=new n);var i=t.x2-t.x1,s=t.y2-t.y1,r=t.x3-t.x1,o=t.y3-t.y1,a=Math.random(),h=Math.random();return a+h>=1&&(a=1-a,h=1-h),e.x=t.x1+(i*a+r*h),e.y=t.y1+(s*a+o*h),e}},function(t,e,i){var n=i(6);t.exports=function(t,e){void 0===e&&(e=new n);var i=Math.random()*Math.PI*2,s=Math.sqrt(Math.random());return e.x=t.x+s*Math.cos(i)*t.width/2,e.y=t.y+s*Math.sin(i)*t.height/2,e}},function(t,e){var i={defaultPipeline:null,pipeline:null,initPipeline:function(t){void 0===t&&(t="TextureTintPipeline");var e=this.scene.sys.game.renderer;return!!(e&&e.gl&&e.hasPipeline(t))&&(this.defaultPipeline=e.getPipeline(t),this.pipeline=this.defaultPipeline,!0)},setPipeline:function(t){var e=this.scene.sys.game.renderer;return e&&e.gl&&e.hasPipeline(t)&&(this.pipeline=e.getPipeline(t)),this},resetPipeline:function(){return this.pipeline=this.defaultPipeline,null!==this.pipeline},getPipelineName:function(){return this.pipeline.name}};t.exports=i},function(t,e,i){var n=i(6);t.exports=function(t,e){return void 0===e&&(e=new n),e.x=t.x+Math.random()*t.width,e.y=t.y+Math.random()*t.height,e}},function(t,e,i){var n=i(6);t.exports=function(t,e){void 0===e&&(e=new n);var i=Math.random();return e.x=t.x1+i*(t.x2-t.x1),e.y=t.y1+i*(t.y2-t.y1),e}},function(t,e,i){var n=i(58),s=i(6);t.exports=function(t,e,i,r){void 0===r&&(r=[]),e||(e=n(t)/i);for(var o=t.x1,a=t.y1,h=t.x2,l=t.y2,u=0;u=1)return i.x=t.x,i.y=t.y,i;var r=n(t)*e;return e>.5?(r-=t.width+t.height)<=t.width?(i.x=t.right-r,i.y=t.bottom):(i.x=t.x,i.y=t.bottom-(r-t.width)):r<=t.width?(i.x=t.x+r,i.y=t.y):(i.x=t.right,i.y=t.y+(r-t.width)),i}},function(t,e,i){var n=i(23),s=i(0),r=i(11),o=i(136),a=i(434),h=i(433),l=i(4),u=new s({Extends:r,initialize:function(t,e,i){r.call(this),this.manager=t,this.key=e,this.type="frame",this.frames=this.getFrames(t.textureManager,l(i,"frames",[]),l(i,"defaultTextureKey",null)),this.frameRate=l(i,"frameRate",null),this.duration=l(i,"duration",null),null===this.duration&&null===this.frameRate?(this.frameRate=24,this.duration=this.frameRate/this.frames.length*1e3):this.duration&&null===this.frameRate?this.frameRate=this.frames.length/(this.duration/1e3):this.duration=this.frames.length/this.frameRate*1e3,this.msPerFrame=1e3/this.frameRate,this.skipMissedFrames=l(i,"skipMissedFrames",!0),this.delay=l(i,"delay",0),this.repeat=l(i,"repeat",0),this.repeatDelay=l(i,"repeatDelay",0),this.yoyo=l(i,"yoyo",!1),this.showOnStart=l(i,"showOnStart",!1),this.hideOnComplete=l(i,"hideOnComplete",!1),this.paused=!1,this.manager.on(o.PAUSE_ALL,this.pause,this),this.manager.on(o.RESUME_ALL,this.resume,this)},addFrame:function(t){return this.addFrameAt(this.frames.length,t)},addFrameAt:function(t,e){var i=this.getFrames(this.manager.textureManager,e);if(i.length>0){if(0===t)this.frames=i.concat(this.frames);else if(t===this.frames.length)this.frames=this.frames.concat(i);else{var n=this.frames.slice(0,t),s=this.frames.slice(t);this.frames=n.concat(i,s)}this.updateFrameSequence()}return this},checkFrame:function(t){return t>=0&&t0){s.isLast=!0,s.nextFrame=a[0],a[0].prevFrame=s;var v=1/(a.length-1);for(r=0;r=this.frames.length&&(e=0),t.currentAnim!==this&&(t.currentAnim=this,t.frameRate=this.frameRate,t.duration=this.duration,t.msPerFrame=this.msPerFrame,t.skipMissedFrames=this.skipMissedFrames,t._delay=this.delay,t._repeat=this.repeat,t._repeatDelay=this.repeatDelay,t._yoyo=this.yoyo);var i=this.frames[e];0!==e||t.forward||(i=this.getLastFrame()),t.updateFrame(i)},getFrameByProgress:function(t){return t=n(t,0,1),a(t,this.frames,"progress")},nextFrame:function(t){var e=t.currentFrame;e.isLast?t._yoyo?this.handleYoyoFrame(t,!1):t.repeatCounter>0?t._reverse&&t.forward?t.forward=!1:this.repeatAnimation(t):this.completeAnimation(t):this.updateAndGetNextTick(t,e.nextFrame)},handleYoyoFrame:function(t,e){if(e||(e=!1),t._reverse===!e&&t.repeatCounter>0)return t.forward=e,void this.repeatAnimation(t);if(t._reverse===e||0!==t.repeatCounter){t.forward=e;var i=e?t.currentFrame.nextFrame:t.currentFrame.prevFrame;this.updateAndGetNextTick(t,i)}else this.completeAnimation(t)},getLastFrame:function(){return this.frames[this.frames.length-1]},previousFrame:function(t){var e=t.currentFrame;e.isFirst?t._yoyo?this.handleYoyoFrame(t,!0):t.repeatCounter>0?t._reverse&&!t.forward?(t.currentFrame=this.getLastFrame(),this.repeatAnimation(t)):(t.forward=!0,this.repeatAnimation(t)):this.completeAnimation(t):this.updateAndGetNextTick(t,e.prevFrame)},updateAndGetNextTick:function(t,e){t.updateFrame(e),this.getNextTick(t)},removeFrame:function(t){var e=this.frames.indexOf(t);return-1!==e&&this.removeFrameAt(e),this},removeFrameAt:function(t){return this.frames.splice(t,1),this.updateFrameSequence(),this},repeatAnimation:function(t){if(2===t._pendingStop)return this.completeAnimation(t);if(t._repeatDelay>0&&!1===t.pendingRepeat)t.pendingRepeat=!0,t.accumulator-=t.nextTick,t.nextTick+=t._repeatDelay;else if(t.repeatCounter--,t.updateFrame(t.currentFrame[t.forward?"nextFrame":"prevFrame"]),t.isPlaying){this.getNextTick(t),t.pendingRepeat=!1;var e=t.currentFrame,i=t.parent;this.emit(o.ANIMATION_REPEAT,this,e),i.emit(o.SPRITE_ANIMATION_KEY_REPEAT+this.key,this,e,t.repeatCounter,i),i.emit(o.SPRITE_ANIMATION_REPEAT,this,e,t.repeatCounter,i)}},setFrame:function(t){t.forward?this.nextFrame(t):this.previousFrame(t)},toJSON:function(){var t={key:this.key,type:this.type,frames:[],frameRate:this.frameRate,duration:this.duration,skipMissedFrames:this.skipMissedFrames,delay:this.delay,repeat:this.repeat,repeatDelay:this.repeatDelay,yoyo:this.yoyo,showOnStart:this.showOnStart,hideOnComplete:this.hideOnComplete};return this.frames.forEach(function(e){t.frames.push(e.toJSON())}),t},updateFrameSequence:function(){for(var t=this.frames.length,e=1/(t-1),i=0;i1&&(n.prevFrame=this.frames[i-1],n.nextFrame=this.frames[i+1])}return this},pause:function(){return this.paused=!0,this},resume:function(){return this.paused=!1,this},destroy:function(){this.removeAllListeners(),this.manager.off(o.PAUSE_ALL,this.pause,this),this.manager.off(o.RESUME_ALL,this.resume,this),this.manager.remove(this.key);for(var t=0;t1?2-s:s,o=r*Math.cos(i),a=r*Math.sin(i);return e.x=t.x+o*t.radius,e.y=t.y+a*t.radius,e}},function(t,e,i){var n=i(6);t.exports=function(t,e,i){return void 0===i&&(i=new n),i.x=t.x+t.radius*Math.cos(e),i.y=t.y+t.radius*Math.sin(e),i}},function(t,e){t.exports={TOP_LEFT:0,TOP_CENTER:1,TOP_RIGHT:2,LEFT_TOP:3,LEFT_CENTER:4,LEFT_BOTTOM:5,CENTER:6,RIGHT_TOP:7,RIGHT_CENTER:8,RIGHT_BOTTOM:9,BOTTOM_LEFT:10,BOTTOM_CENTER:11,BOTTOM_RIGHT:12}},function(t,e,i){var n={};t.exports=n;var s=i(82),r=i(87),o=i(238),a=i(86),h=i(546),l=i(36);n._warming=.4,n._torqueDampen=1,n._minLength=1e-6,n.create=function(t){var e=t;e.bodyA&&!e.pointA&&(e.pointA={x:0,y:0}),e.bodyB&&!e.pointB&&(e.pointB={x:0,y:0});var i=e.bodyA?r.add(e.bodyA.position,e.pointA):e.pointA,n=e.bodyB?r.add(e.bodyB.position,e.pointB):e.pointB,s=r.magnitude(r.sub(i,n));e.length=void 0!==e.length?e.length:s,e.id=e.id||l.nextId(),e.label=e.label||"Constraint",e.type="constraint",e.stiffness=e.stiffness||(e.length>0?1:.7),e.damping=e.damping||0,e.angularStiffness=e.angularStiffness||0,e.angleA=e.bodyA?e.bodyA.angle:e.angleA,e.angleB=e.bodyB?e.bodyB.angle:e.angleB,e.plugin={};var o={visible:!0,lineWidth:2,strokeStyle:"#ffffff",type:"line",anchors:!0};return 0===e.length&&e.stiffness>.1?(o.type="pin",o.anchors=!1):e.stiffness<.9&&(o.type="spring"),e.render=l.extend(o,e.render),e},n.preSolveAll=function(t){for(var e=0;e0&&(c.position.x+=l.x,c.position.y+=l.y),0!==l.angle&&(s.rotate(c.vertices,l.angle,i.position),h.rotate(c.axes,l.angle),u>0&&r.rotateAbout(c.position,l.angle,i.position,c.position)),a.update(c.bounds,c.vertices,i.velocity)}l.angle*=n._warming,l.x*=n._warming,l.y*=n._warming}}}},function(t,e,i){var n={};t.exports=n;var s=i(36);n.on=function(t,e,i){for(var n,s=e.split(" "),r=0;r0){i||(i={}),n=e.split(" ");for(var l=0;l0)||!((e>0?i[n-1].textures[e-1]:i[n-1].texture)===t)},pushBatch:function(t,e){if(0===e)this.batches.push({first:this.vertexCount,texture:t,textures:[]});else{var i=[];i[e-1]=t,this.batches.push({first:this.vertexCount,texture:null,textures:i})}},flush:function(){if(this.flushLocked)return this;this.flushLocked=!0;var t,e,i,n=this.gl,s=this.vertexCount,r=this.topology,o=this.vertexSize,a=this.renderer,h=this.batches,l=h.length,u=0,c=null;if(0===l||0===s)return this.flushLocked=!1,this;n.bufferSubData(n.ARRAY_BUFFER,0,this.bytes.subarray(0,s*o));for(var d=0;d0){for(e=0;e0){for(e=0;e0&&(a.setTexture2D(c.texture,0,!1),n.drawArrays(r,c.first,u)),this.vertexCount=0,h.length=0,this.flushLocked=!1,this},batchSprite:function(t,e,i){this.renderer.setPipeline(this);var n=this._tempMatrix1,s=this._tempMatrix2,r=this._tempMatrix3,o=t.frame,a=o.glTexture,h=o.u0,l=o.v0,c=o.u1,d=o.v1,f=o.x,p=o.y,g=o.cutWidth,v=o.cutHeight,y=-t.displayOriginX+f,m=-t.displayOriginY+p;if(t.isCropped){var x=t._crop;x.flipX===t.flipX&&x.flipY===t.flipY||o.updateCropUVs(x,t.flipX,t.flipY),h=x.u0,l=x.v0,c=x.u1,d=x.v1,g=x.width,v=x.height,f=x.x,p=x.y,y=-t.displayOriginX+f,m=-t.displayOriginY+p}t.flipX&&(y+=g,g*=-1),t.flipY&&(m+=v,v*=-1);var T=y+g,w=m+v;s.applyITRS(t.x,t.y,t.rotation,t.scaleX,t.scaleY),n.copyFrom(e.matrix),i?(n.multiplyWithOffset(i,-e.scrollX*t.scrollFactorX,-e.scrollY*t.scrollFactorY),s.e=t.x,s.f=t.y,n.multiply(s,r)):(s.e-=e.scrollX*t.scrollFactorX,s.f-=e.scrollY*t.scrollFactorY,n.multiply(s,r));var b=r.getX(y,m),S=r.getY(y,m),_=r.getX(y,w),A=r.getY(y,w),E=r.getX(T,w),C=r.getY(T,w),M=r.getX(T,m),P=r.getY(T,m),O=u.getTintAppendFloatAlpha(t._tintTL,e.alpha*t._alphaTL),R=u.getTintAppendFloatAlpha(t._tintTR,e.alpha*t._alphaTR),L=u.getTintAppendFloatAlpha(t._tintBL,e.alpha*t._alphaBL),D=u.getTintAppendFloatAlpha(t._tintBR,e.alpha*t._alphaBR);e.roundPixels&&(b=Math.round(b),S=Math.round(S),_=Math.round(_),A=Math.round(A),E=Math.round(E),C=Math.round(C),M=Math.round(M),P=Math.round(P)),this.setTexture2D(a,0);var F=t._isTinted&&t.tintFill;this.batchQuad(b,S,_,A,E,C,M,P,h,l,c,d,O,R,L,D,F,a,0)},batchQuad:function(t,e,i,n,s,r,o,a,h,l,u,c,d,f,p,g,v,y,m){var x=!1;this.vertexCount+6>this.vertexCapacity&&(this.flush(),x=!0,this.setTexture2D(y,m));var T=this.vertexViewF32,w=this.vertexViewU32,b=this.vertexCount*this.vertexComponentCount-1;return T[++b]=t,T[++b]=e,T[++b]=h,T[++b]=l,T[++b]=v,w[++b]=d,T[++b]=i,T[++b]=n,T[++b]=h,T[++b]=c,T[++b]=v,w[++b]=p,T[++b]=s,T[++b]=r,T[++b]=u,T[++b]=c,T[++b]=v,w[++b]=g,T[++b]=t,T[++b]=e,T[++b]=h,T[++b]=l,T[++b]=v,w[++b]=d,T[++b]=s,T[++b]=r,T[++b]=u,T[++b]=c,T[++b]=v,w[++b]=g,T[++b]=o,T[++b]=a,T[++b]=u,T[++b]=l,T[++b]=v,w[++b]=f,this.vertexCount+=6,x},batchTri:function(t,e,i,n,s,r,o,a,h,l,u,c,d,f,p,g){var v=!1;this.vertexCount+3>this.vertexCapacity&&(this.flush(),this.setTexture2D(p,g),v=!0);var y=this.vertexViewF32,m=this.vertexViewU32,x=this.vertexCount*this.vertexComponentCount-1;return y[++x]=t,y[++x]=e,y[++x]=o,y[++x]=a,y[++x]=f,m[++x]=u,y[++x]=i,y[++x]=n,y[++x]=o,y[++x]=l,y[++x]=f,m[++x]=c,y[++x]=s,y[++x]=r,y[++x]=h,y[++x]=l,y[++x]=f,m[++x]=d,this.vertexCount+=3,v},batchTexture:function(t,e,i,n,s,r,o,a,h,l,u,c,d,f,p,g,v,y,m,x,T,w,b,S,_,A,E,C,M,P,O){this.renderer.setPipeline(this,t);var R=this._tempMatrix1,L=this._tempMatrix2,D=this._tempMatrix3,F=y/i+E,k=m/n+C,I=(y+x)/i+E,B=(m+T)/n+C,Y=o,N=a,X=-g,z=-v;if(t.isCropped){var U=t._crop;Y=U.width,N=U.height,o=U.width,a=U.height;var G=y=U.x,W=m=U.y;c&&(G=x-U.x-U.width),d&&!e.isRenderTexture&&(W=T-U.y-U.height),F=G/i+E,k=W/n+C,I=(G+U.width)/i+E,B=(W+U.height)/n+C,X=-g+y,z=-v+m}d^=!O&&e.isRenderTexture?1:0,c&&(Y*=-1,X+=o),d&&(N*=-1,z+=a);var V=X+Y,H=z+N;L.applyITRS(s,r,u,h,l),R.copyFrom(M.matrix),P?(R.multiplyWithOffset(P,-M.scrollX*f,-M.scrollY*p),L.e=s,L.f=r,R.multiply(L,D)):(L.e-=M.scrollX*f,L.f-=M.scrollY*p,R.multiply(L,D));var j=D.getX(X,z),q=D.getY(X,z),K=D.getX(X,H),J=D.getY(X,H),Z=D.getX(V,H),Q=D.getY(V,H),$=D.getX(V,z),tt=D.getY(V,z);M.roundPixels&&(j=Math.round(j),q=Math.round(q),K=Math.round(K),J=Math.round(J),Z=Math.round(Z),Q=Math.round(Q),$=Math.round($),tt=Math.round(tt)),this.setTexture2D(e,0),this.batchQuad(j,q,K,J,Z,Q,$,tt,F,k,I,B,w,b,S,_,A,e,0)},batchTextureFrame:function(t,e,i,n,s,r,o){this.renderer.setPipeline(this);var a=this._tempMatrix1.copyFrom(r),h=this._tempMatrix2,l=e+t.width,c=i+t.height;o?a.multiply(o,h):h=a;var d=h.getX(e,i),f=h.getY(e,i),p=h.getX(e,c),g=h.getY(e,c),v=h.getX(l,c),y=h.getY(l,c),m=h.getX(l,i),x=h.getY(l,i);this.setTexture2D(t.glTexture,0),n=u.getTintAppendFloatAlpha(n,s),this.batchQuad(d,f,p,g,v,y,m,x,t.u0,t.v0,t.u1,t.v1,n,n,n,n,0,t.glTexture,0)},drawFillRect:function(t,e,i,n,s,r){var o=t+i,a=e+n;this.setTexture2D();var h=u.getTintAppendFloatAlphaAndSwap(s,r);this.batchQuad(t,e,t,a,o,a,o,e,0,0,1,1,h,h,h,h,2)},batchFillRect:function(t,e,i,n,s,r){this.renderer.setPipeline(this);var o=this._tempMatrix3;r&&r.multiply(s,o);var a=t+i,h=e+n,l=o.getX(t,e),u=o.getY(t,e),c=o.getX(t,h),d=o.getY(t,h),f=o.getX(a,h),p=o.getY(a,h),g=o.getX(a,e),v=o.getY(a,e),y=this.currentFrame,m=y.u0,x=y.v0,T=y.u1,w=y.v1;this.batchQuad(l,u,c,d,f,p,g,v,m,x,T,w,this.fillTint.TL,this.fillTint.TR,this.fillTint.BL,this.fillTint.BR,this.tintEffect)},batchFillTriangle:function(t,e,i,n,s,r,o,a){this.renderer.setPipeline(this);var h=this._tempMatrix3;a&&a.multiply(o,h);var l=h.getX(t,e),u=h.getY(t,e),c=h.getX(i,n),d=h.getY(i,n),f=h.getX(s,r),p=h.getY(s,r),g=this.currentFrame,v=g.u0,y=g.v0,m=g.u1,x=g.v1;this.batchTri(l,u,c,d,f,p,v,y,m,x,this.fillTint.TL,this.fillTint.TR,this.fillTint.BL,this.tintEffect)},batchStrokeTriangle:function(t,e,i,n,s,r,o,a,h){var l=this.tempTriangle;l[0].x=t,l[0].y=e,l[0].width=o,l[1].x=i,l[1].y=n,l[1].width=o,l[2].x=s,l[2].y=r,l[2].width=o,l[3].x=t,l[3].y=e,l[3].width=o,this.batchStrokePath(l,o,!1,a,h)},batchFillPath:function(t,e,i){this.renderer.setPipeline(this);var n=this._tempMatrix3;i&&i.multiply(e,n);for(var r,o,a=t.length,h=this.polygonCache,l=this.fillTint.TL,u=this.fillTint.TR,c=this.fillTint.BL,d=this.tintEffect,f=0;f0&&H[4]?this.batchQuad(D,F,P,O,H[0],H[1],H[2],H[3],U,G,W,V,B,Y,N,X,I):(j[0]=D,j[1]=F,j[2]=P,j[3]=O,j[4]=1),h&&j[4]?this.batchQuad(C,M,R,L,j[0],j[1],j[2],j[3],U,G,W,V,B,Y,N,X,I):(H[0]=C,H[1]=M,H[2]=R,H[3]=L,H[4]=1)}}});t.exports=d},function(t,e,i){var n=i(0),s=i(9),r=new n({initialize:function(t){this.name="WebGLPipeline",this.game=t.game,this.view=t.game.canvas,this.resolution=1,this.width=0,this.height=0,this.gl=t.gl,this.vertexCount=0,this.vertexCapacity=t.vertexCapacity,this.renderer=t.renderer,this.vertexData=t.vertices?t.vertices:new ArrayBuffer(t.vertexCapacity*t.vertexSize),this.vertexBuffer=this.renderer.createVertexBuffer(t.vertices?t.vertices:this.vertexData.byteLength,this.gl.STREAM_DRAW),this.program=this.renderer.createProgram(t.vertShader,t.fragShader),this.attributes=t.attributes,this.vertexSize=t.vertexSize,this.topology=t.topology,this.bytes=new Uint8Array(this.vertexData),this.vertexComponentCount=s.getComponentCount(t.attributes,this.gl),this.flushLocked=!1,this.active=!1},boot:function(){},addAttribute:function(t,e,i,n,s){return this.attributes.push({name:t,size:e,type:this.renderer.glFormats[i],normalized:n,offset:s}),this},shouldFlush:function(){return this.vertexCount>=this.vertexCapacity},resize:function(t,e,i){return this.width=t*i,this.height=e*i,this.resolution=i,this},bind:function(){var t=this.gl,e=this.vertexBuffer,i=this.attributes,n=this.program,s=this.renderer,r=this.vertexSize;s.setProgram(n),s.setVertexBuffer(e);for(var o=0;o=0?(t.enableVertexAttribArray(h),t.vertexAttribPointer(h,a.size,a.type,a.normalized,r,a.offset)):t.disableVertexAttribArray(h)}return this},onBind:function(){return this},onPreRender:function(){return this},onRender:function(){return this},onPostRender:function(){return this},flush:function(){if(this.flushLocked)return this;this.flushLocked=!0;var t=this.gl,e=this.vertexCount,i=this.topology,n=this.vertexSize;if(0!==e)return t.bufferSubData(t.ARRAY_BUFFER,0,this.bytes.subarray(0,e*n)),t.drawArrays(i,0,e),this.vertexCount=0,this.flushLocked=!1,this;this.flushLocked=!1},destroy:function(){var t=this.gl;return t.deleteProgram(this.program),t.deleteBuffer(this.vertexBuffer),delete this.program,delete this.vertexBuffer,delete this.gl,this},setFloat1:function(t,e){return this.renderer.setFloat1(this.program,t,e),this},setFloat2:function(t,e,i){return this.renderer.setFloat2(this.program,t,e,i),this},setFloat3:function(t,e,i,n){return this.renderer.setFloat3(this.program,t,e,i,n),this},setFloat4:function(t,e,i,n,s){return this.renderer.setFloat4(this.program,t,e,i,n,s),this},setFloat1v:function(t,e){return this.renderer.setFloat1v(this.program,t,e),this},setFloat2v:function(t,e){return this.renderer.setFloat2v(this.program,t,e),this},setFloat3v:function(t,e){return this.renderer.setFloat3v(this.program,t,e),this},setFloat4v:function(t,e){return this.renderer.setFloat4v(this.program,t,e),this},setInt1:function(t,e){return this.renderer.setInt1(this.program,t,e),this},setInt2:function(t,e,i){return this.renderer.setInt2(this.program,t,e,i),this},setInt3:function(t,e,i,n){return this.renderer.setInt3(this.program,t,e,i,n),this},setInt4:function(t,e,i,n,s){return this.renderer.setInt4(this.program,t,e,i,n,s),this},setMatrix2:function(t,e,i){return this.renderer.setMatrix2(this.program,t,e,i),this},setMatrix3:function(t,e,i){return this.renderer.setMatrix3(this.program,t,e,i),this},setMatrix4:function(t,e,i){return this.renderer.setMatrix4(this.program,t,e,i),this}});t.exports=r},function(t,e,i){var n=i(57);t.exports=function(t){return n(t,-180,180)}},function(t,e,i){var n=i(57);t.exports=function(t){return n(t,-Math.PI,Math.PI)}},function(t,e){var i;i=function(){return this}();try{i=i||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(i=window)}t.exports=i},function(t,e,i){t.exports={TIMELINE_COMPLETE:i(475),TIMELINE_LOOP:i(474),TIMELINE_PAUSE:i(473),TIMELINE_RESUME:i(472),TIMELINE_START:i(471),TIMELINE_UPDATE:i(470)}},function(t,e,i){var n=i(0),s=i(11),r=i(216),o=i(104),a=i(89),h=new n({Extends:s,initialize:function(t){s.call(this),this.manager=t,this.isTimeline=!0,this.data=[],this.totalData=0,this.useFrames=!1,this.timeScale=1,this.loop=0,this.loopDelay=0,this.loopCounter=0,this.completeDelay=0,this.countdown=0,this.state=a.PENDING_ADD,this._pausedState=a.PENDING_ADD,this.paused=!1,this.elapsed=0,this.totalElapsed=0,this.duration=0,this.progress=0,this.totalDuration=0,this.totalProgress=0,this.callbacks={onComplete:null,onLoop:null,onStart:null,onUpdate:null,onYoyo:null},this.callbackScope},setTimeScale:function(t){return this.timeScale=t,this},getTimeScale:function(){return this.timeScale},isPlaying:function(){return this.state===a.ACTIVE},add:function(t){return this.queue(o(this,t))},queue:function(t){return this.isPlaying()||(t.parent=this,t.parentIsTimeline=!0,this.data.push(t),this.totalData=this.data.length),this},hasOffset:function(t){return null!==t.offset},isOffsetAbsolute:function(t){return"number"==typeof t},isOffsetRelative:function(t){if("string"===typeof t){var e=t[0];if("-"===e||"+"===e)return!0}return!1},getRelativeOffset:function(t,e){var i=t[0],n=parseFloat(t.substr(2)),s=e;switch(i){case"+":s+=n;break;case"-":s-=n}return Math.max(0,s)},calcDuration:function(){for(var t=0,e=0,i=0,n=0;n0?this.totalDuration=this.duration+this.completeDelay+(this.duration+this.loopDelay)*this.loopCounter:this.totalDuration=this.duration+this.completeDelay},init:function(){return this.calcDuration(),this.progress=0,this.totalProgress=0,!this.paused||(this.state=a.PAUSED,!1)},resetTweens:function(t){for(var e=0;e0){this.elapsed=0,this.progress=0,this.loopCounter--;var t=this.callbacks.onLoop;t&&t.func.apply(t.scope,t.params),this.emit(r.TIMELINE_LOOP,this,this.loopCounter),this.resetTweens(!0),this.loopDelay>0?(this.countdown=this.loopDelay,this.state=a.LOOP_DELAY):this.state=a.ACTIVE}else if(this.completeDelay>0)this.countdown=this.completeDelay,this.state=a.COMPLETE_DELAY;else{this.state=a.PENDING_REMOVE;var e=this.callbacks.onComplete;e&&e.func.apply(e.scope,e.params),this.emit(r.TIMELINE_COMPLETE,this)}},update:function(t,e){if(this.state!==a.PAUSED){var i=e;switch(this.useFrames&&(e=1*this.manager.timeScale),e*=this.timeScale,this.elapsed+=e,this.progress=Math.min(this.elapsed/this.duration,1),this.totalElapsed+=e,this.totalProgress=Math.min(this.totalElapsed/this.totalDuration,1),this.state){case a.ACTIVE:for(var n=this.totalData,s=0;s0?Math.floor(v/p.length):h(e,"duration",g.duration),g.delay=h(e,"delay",g.delay),g.easeParams=c(e,"easeParams",g.easeParams),g.ease=a(c(e,"ease",g.ease),g.easeParams),g.hold=h(e,"hold",g.hold),g.repeat=h(e,"repeat",g.repeat),g.repeatDelay=h(e,"repeatDelay",g.repeatDelay),g.yoyo=o(e,"yoyo",g.yoyo),g.flipX=o(e,"flipX",g.flipX),g.flipY=o(e,"flipY",g.flipY);for(var y=0;y0){var t=this.delay+this.delay*this.repeat;return(this.elapsed+this.delay*(this.repeat-this.repeatCount))/t}return this.getProgress()},getRepeatCount:function(){return this.repeatCount},getElapsed:function(){return this.elapsed},getElapsedSeconds:function(){return.001*this.elapsed},remove:function(t){void 0===t&&(t=!1),this.elapsed=this.delay,this.hasDispatched=!t,this.repeatCount=0},destroy:function(){this.callback=void 0,this.callbackScope=void 0,this.args=[]}});t.exports=r},function(t,e,i){var n=i(0),s=i(13),r=i(28),o=i(18),a=i(485),h=i(110),l=i(41),u=i(9),c=new n({Extends:o,Mixins:[s.Alpha,s.BlendMode,s.ComputedSize,s.Depth,s.Flip,s.GetBounds,s.Origin,s.Pipeline,s.ScaleMode,s.Transform,s.Visible,s.ScrollFactor,a],initialize:function(t,e,i,n,s,a){o.call(this,t,"StaticTilemapLayer"),this.isTilemap=!0,this.tilemap=e,this.layerIndex=i,this.layer=e.layers[i],this.layer.tilemapLayer=this,this.tileset=[],this.culledTiles=[],this.skipCull=!1,this.tilesDrawn=0,this.tilesTotal=this.layer.width*this.layer.height,this.cullPaddingX=1,this.cullPaddingY=1,this.cullCallback=h.CullTiles,this.renderer=t.sys.game.renderer,this.vertexBuffer=[],this.bufferData=[],this.vertexViewF32=[],this.vertexViewU32=[],this.dirty=[],this.vertexCount=[],this._renderOrder=0,this._tempMatrix=new l,this.gidMap=[],this.setTilesets(n),this.setAlpha(this.layer.alpha),this.setPosition(s,a),this.setOrigin(),this.setSize(e.tileWidth*this.layer.width,e.tileHeight*this.layer.height),this.updateVBOData(),this.initPipeline("TextureTintPipeline"),t.sys.game.config.renderType===r.WEBGL&&t.sys.game.renderer.onContextRestored(function(){this.updateVBOData()},this)},setTilesets:function(t){var e=[],i=[],n=this.tilemap;Array.isArray(t)||(t=[t]);for(var s=0;sv||!r.visible||(x=this.batchTile(x,r,h,c,d,t,e));else if(1===p)for(o=0;o=0;a--)!(r=f[o][a])||r.indexv||!r.visible||(x=this.batchTile(x,r,h,c,d,t,e));else if(2===p)for(o=u-1;o>=0;o--)for(a=0;av||!r.visible||(x=this.batchTile(x,r,h,c,d,t,e));else if(3===p)for(o=u-1;o>=0;o--)for(a=l-1;a>=0;a--)!(r=f[o][a])||r.indexv||!r.visible||(x=this.batchTile(x,r,h,c,d,t,e));this.dirty[e]=!1,null===y?(y=i.createVertexBuffer(m,n.STATIC_DRAW),this.vertexBuffer[e]=y):(i.setVertexBuffer(y),n.bufferSubData(n.ARRAY_BUFFER,0,m))}return this},batchTile:function(t,e,i,n,s,r,o){var a=i.getTileTextureCoordinates(e.index);if(!a)return t;var h=i.tileWidth,l=i.tileHeight,c=h/2,d=l/2,f=a.x/n,p=a.y/s,g=(a.x+h)/n,v=(a.y+l)/s,y=this._tempMatrix,m=-c,x=-d;e.flipX&&(h*=-1,m+=i.tileWidth),e.flipY&&(l*=-1,x+=i.tileHeight);var T=m+h,w=x+l;y.applyITRS(c+e.pixelX,d+e.pixelY,e.rotation,1,1);var b=u.getTintAppendFloatAlpha(16777215,r.alpha*this.alpha*e.alpha),S=y.getX(m,x),_=y.getY(m,x),A=y.getX(m,w),E=y.getY(m,w),C=y.getX(T,w),M=y.getY(T,w),P=y.getX(T,x),O=y.getY(T,x);r.roundPixels&&(S=Math.round(S),_=Math.round(_),A=Math.round(A),E=Math.round(E),C=Math.round(C),M=Math.round(M),P=Math.round(P),O=Math.round(O));var R=this.vertexViewF32[o],L=this.vertexViewU32[o];return R[++t]=S,R[++t]=_,R[++t]=f,R[++t]=p,R[++t]=0,L[++t]=b,R[++t]=A,R[++t]=E,R[++t]=f,R[++t]=v,R[++t]=0,L[++t]=b,R[++t]=C,R[++t]=M,R[++t]=g,R[++t]=v,R[++t]=0,L[++t]=b,R[++t]=S,R[++t]=_,R[++t]=f,R[++t]=p,R[++t]=0,L[++t]=b,R[++t]=C,R[++t]=M,R[++t]=g,R[++t]=v,R[++t]=0,L[++t]=b,R[++t]=P,R[++t]=O,R[++t]=g,R[++t]=p,R[++t]=0,L[++t]=b,this.vertexCount[o]+=6,t},setRenderOrder:function(t){if("string"==typeof t&&(t=["right-down","left-down","right-up","left-up"].indexOf(t)),t>=0&&t<4){this._renderOrder=t;for(var e=0;e=0&&t<4&&(this._renderOrder=t),this},calculateFacesAt:function(t,e){return a.CalculateFacesAt(t,e,this.layer),this},calculateFacesWithin:function(t,e,i,n){return a.CalculateFacesWithin(t,e,i,n,this.layer),this},createFromTiles:function(t,e,i,n,s){return a.CreateFromTiles(t,e,i,n,s,this.layer)},cull:function(t){return this.cullCallback(this.layer,t,this.culledTiles,this._renderOrder)},copy:function(t,e,i,n,s,r,o){return a.Copy(t,e,i,n,s,r,o,this.layer),this},destroy:function(){this.layer.tilemapLayer===this&&(this.layer.tilemapLayer=void 0),this.tilemap=void 0,this.layer=void 0,this.culledTiles.length=0,this.cullCallback=null,this.gidMap=[],this.tileset=[],o.prototype.destroy.call(this)},fill:function(t,e,i,n,s,r){return a.Fill(t,e,i,n,s,r,this.layer),this},filterTiles:function(t,e,i,n,s,r,o){return a.FilterTiles(t,e,i,n,s,r,o,this.layer)},findByIndex:function(t,e,i){return a.FindByIndex(t,e,i,this.layer)},findTile:function(t,e,i,n,s,r,o){return a.FindTile(t,e,i,n,s,r,o,this.layer)},forEachTile:function(t,e,i,n,s,r,o){return a.ForEachTile(t,e,i,n,s,r,o,this.layer),this},getTileAt:function(t,e,i){return a.GetTileAt(t,e,i,this.layer)},getTileAtWorldXY:function(t,e,i,n){return a.GetTileAtWorldXY(t,e,i,n,this.layer)},getTilesWithin:function(t,e,i,n,s){return a.GetTilesWithin(t,e,i,n,s,this.layer)},getTilesWithinShape:function(t,e,i){return a.GetTilesWithinShape(t,e,i,this.layer)},getTilesWithinWorldXY:function(t,e,i,n,s,r){return a.GetTilesWithinWorldXY(t,e,i,n,s,r,this.layer)},hasTileAt:function(t,e){return a.HasTileAt(t,e,this.layer)},hasTileAtWorldXY:function(t,e,i){return a.HasTileAtWorldXY(t,e,i,this.layer)},putTileAt:function(t,e,i,n){return a.PutTileAt(t,e,i,n,this.layer)},putTileAtWorldXY:function(t,e,i,n,s){return a.PutTileAtWorldXY(t,e,i,n,s,this.layer)},putTilesAt:function(t,e,i,n){return a.PutTilesAt(t,e,i,n,this.layer),this},randomize:function(t,e,i,n,s){return a.Randomize(t,e,i,n,s,this.layer),this},removeTileAt:function(t,e,i,n){return a.RemoveTileAt(t,e,i,n,this.layer)},removeTileAtWorldXY:function(t,e,i,n,s){return a.RemoveTileAtWorldXY(t,e,i,n,s,this.layer)},renderDebug:function(t,e){return a.RenderDebug(t,e,this.layer),this},replaceByIndex:function(t,e,i,n,s,r){return a.ReplaceByIndex(t,e,i,n,s,r,this.layer),this},setSkipCull:function(t){return void 0===t&&(t=!0),this.skipCull=t,this},setCullPadding:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=1),this.cullPaddingX=t,this.cullPaddingY=e,this},setCollision:function(t,e,i){return a.SetCollision(t,e,i,this.layer),this},setCollisionBetween:function(t,e,i,n){return a.SetCollisionBetween(t,e,i,n,this.layer),this},setCollisionByProperty:function(t,e,i){return a.SetCollisionByProperty(t,e,i,this.layer),this},setCollisionByExclusion:function(t,e,i){return a.SetCollisionByExclusion(t,e,i,this.layer),this},setCollisionFromCollisionGroup:function(t,e){return a.SetCollisionFromCollisionGroup(t,e,this.layer),this},setTileIndexCallback:function(t,e,i){return a.SetTileIndexCallback(t,e,i,this.layer),this},setTileLocationCallback:function(t,e,i,n,s,r){return a.SetTileLocationCallback(t,e,i,n,s,r,this.layer),this},shuffle:function(t,e,i,n){return a.Shuffle(t,e,i,n,this.layer),this},swapByIndex:function(t,e,i,n,s,r){return a.SwapByIndex(t,e,i,n,s,r,this.layer),this},tileToWorldX:function(t,e){return a.TileToWorldX(t,e,this.layer)},tileToWorldY:function(t,e){return a.TileToWorldY(t,e,this.layer)},tileToWorldXY:function(t,e,i,n){return a.TileToWorldXY(t,e,i,n,this.layer)},weightedRandomize:function(t,e,i,n,s){return a.WeightedRandomize(t,e,i,n,s,this.layer),this},worldToTileX:function(t,e,i){return a.WorldToTileX(t,e,i,this.layer)},worldToTileY:function(t,e,i){return a.WorldToTileY(t,e,i,this.layer)},worldToTileXY:function(t,e,i,n,s){return a.WorldToTileXY(t,e,i,n,s,this.layer)}});t.exports=h},function(t,e,i){var n=i(0),s=i(34),r=i(224),o=i(19),a=i(31),h=i(84),l=i(373),u=i(223),c=i(61),d=i(110),f=i(106),p=new n({initialize:function(t,e){this.scene=t,this.tileWidth=e.tileWidth,this.tileHeight=e.tileHeight,this.width=e.width,this.height=e.height,this.orientation=e.orientation,this.renderOrder=e.renderOrder,this.format=e.format,this.version=e.version,this.properties=e.properties,this.widthInPixels=e.widthInPixels,this.heightInPixels=e.heightInPixels,this.imageCollections=e.imageCollections,this.images=e.images,this.layers=e.layers,this.tilesets=e.tilesets,this.objects=e.objects,this.currentLayerIndex=0},setRenderOrder:function(t){var e=["right-down","left-down","right-up","left-up"];return"number"==typeof t&&(t=e[t]),e.indexOf(t)>-1&&(this.renderOrder=t),this},addTilesetImage:function(t,e,i,n,s,r,o){if(void 0===t)return null;if(void 0!==e&&null!==e||(e=t),!this.scene.sys.textures.exists(e))return console.warn("Invalid Tileset Image: "+e),null;var h=this.scene.sys.textures.get(e),l=this.getTilesetIndex(t);if(null===l&&this.format===a.TILED_JSON)return console.warn("No data found for Tileset: "+t),null;var u=this.tilesets[l];return u?(u.setTileSize(i,n),u.setSpacing(s,r),u.setImage(h),u):(void 0===i&&(i=this.tileWidth),void 0===n&&(n=this.tileHeight),void 0===s&&(s=0),void 0===r&&(r=0),void 0===o&&(o=0),(u=new f(t,o,i,n,s,r)).setImage(h),this.tilesets.push(u),u)},convertLayerToStatic:function(t){if(null===(t=this.getLayer(t)))return null;var e=t.tilemapLayer;if(!(e&&e instanceof r))return null;var i=new u(e.scene,e.tilemap,e.layerIndex,e.tileset,e.x,e.y);return this.scene.sys.displayList.add(i),e.destroy(),i},copy:function(t,e,i,n,s,r,o,a){return a=this.getLayer(a),this._isStaticCall(a,"copy")?this:(null!==a&&d.Copy(t,e,i,n,s,r,o,a),this)},createBlankDynamicLayer:function(t,e,i,n,s,o,a,l){if(void 0===a&&(a=e.tileWidth),void 0===l&&(l=e.tileHeight),void 0===s&&(s=this.width),void 0===o&&(o=this.height),void 0===i&&(i=0),void 0===n&&(n=0),null!==this.getLayerIndex(t))return console.warn("Invalid Tilemap Layer ID: "+t),null;for(var u,d=new h({name:t,tileWidth:a,tileHeight:l,width:s,height:o}),f=0;fa&&(a=e.layer[l].width),e.layer[l].height>h&&(h=e.layer[l].height);var u=new s({width:a,height:h,name:t,tileWidth:e.layer[0].tilesize,tileHeight:e.layer[0].tilesize,format:n.WELTMEISTER});return u.layers=r(e,i),u.tilesets=o(e),u}},function(t,e,i){var n=i(0),s=i(2),r=new n({initialize:function(t){void 0===t&&(t={}),this.name=s(t,"name","object layer"),this.opacity=s(t,"opacity",1),this.properties=s(t,"properties",{}),this.propertyTypes=s(t,"propertytypes",{}),this.type=s(t,"type","objectgroup"),this.visible=s(t,"visible",!0),this.objects=s(t,"objects",[])}});t.exports=r},function(t,e,i){var n=i(494),s=i(230),r=function(t){return{x:t.x,y:t.y}},o=["id","name","type","rotation","properties","visible","x","y","width","height"];t.exports=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=0);var a=n(t,o);if(a.x+=e,a.y+=i,t.gid){var h=s(t.gid);a.gid=h.gid,a.flippedHorizontal=h.flippedHorizontal,a.flippedVertical=h.flippedVertical,a.flippedAntiDiagonal=h.flippedAntiDiagonal}else t.polyline?a.polyline=t.polyline.map(r):t.polygon?a.polygon=t.polygon.map(r):t.ellipse?(a.ellipse=t.ellipse,a.width=t.width,a.height=t.height):t.text?(a.width=t.width,a.height=t.height,a.text=t.text):(a.rectangle=!0,a.width=t.width,a.height=t.height);return a}},function(t,e,i){var n=new(i(0))({initialize:function(t,e,i,n,s,r,o){(void 0===i||i<=0)&&(i=32),(void 0===n||n<=0)&&(n=32),void 0===s&&(s=0),void 0===r&&(r=0),this.name=t,this.firstgid=0|e,this.imageWidth=0|i,this.imageHeight=0|n,this.imageMargin=0|s,this.imageSpacing=0|r,this.properties=o||{},this.images=[],this.total=0},containsImageIndex:function(t){return t>=this.firstgid&&t-1}return!1}},function(t,e,i){var n=i(21);t.exports=function(t,e,i,s,r,o,a){for(var h=n(i,s,r,o,null,a),l=0;l0&&r.motion=r.sleepThreshold&&n.set(r,!0)):r.sleepCounter>0&&(r.sleepCounter-=1)}else n.set(r,!1)}},n.afterCollisions=function(t,e){for(var i=e*e*e,s=0;sn._motionWakeThreshold*i&&n.set(l,!1)}}}},n.set=function(t,e){var i=t.isSleeping;e?(t.isSleeping=!0,t.sleepCounter=t.sleepThreshold,t.positionImpulse.x=0,t.positionImpulse.y=0,t.positionPrev.x=t.position.x,t.positionPrev.y=t.position.y,t.anglePrev=t.angle,t.speed=0,t.angularSpeed=0,t.motion=0,i||s.trigger(t,"sleepStart")):(t.isSleeping=!1,t.sleepCounter=0,i&&s.trigger(t,"sleepEnd"))}},function(t,e){t.exports={NONE:0,A:1,B:2,BOTH:3}},function(t,e){t.exports={NEVER:0,LITE:1,PASSIVE:2,ACTIVE:4,FIXED:8}},function(t,e,i){var n=i(43),s=i(0),r=i(38),o=i(42),a=i(3),h=new s({initialize:function(t,e){var i=e.width?e.width:64,n=e.height?e.height:64;this.world=t,this.gameObject=e,this.debugShowBody=t.defaults.debugShowStaticBody,this.debugBodyColor=t.defaults.staticBodyDebugColor,this.enable=!0,this.isCircle=!1,this.radius=0,this.offset=new a,this.position=new a(e.x-e.displayOriginX,e.y-e.displayOriginY),this.width=i,this.height=n,this.halfWidth=Math.abs(this.width/2),this.halfHeight=Math.abs(this.height/2),this.center=new a(e.x+this.halfWidth,e.y+this.halfHeight),this.velocity=a.ZERO,this.allowGravity=!1,this.gravity=a.ZERO,this.bounce=a.ZERO,this.onWorldBounds=!1,this.onCollide=!1,this.onOverlap=!1,this.mass=1,this.immovable=!0,this.customSeparateX=!1,this.customSeparateY=!1,this.overlapX=0,this.overlapY=0,this.overlapR=0,this.embedded=!1,this.collideWorldBounds=!1,this.checkCollision={none:!1,up:!0,down:!0,left:!0,right:!0},this.touching={none:!0,up:!1,down:!1,left:!1,right:!1},this.wasTouching={none:!0,up:!1,down:!1,left:!1,right:!1},this.blocked={none:!0,up:!1,down:!1,left:!1,right:!1},this.physicsType=r.STATIC_BODY,this._dx=0,this._dy=0},setGameObject:function(t,e){return t&&t!==this.gameObject&&(this.gameObject.body=null,t.body=this,this.gameObject=t),e&&this.updateFromGameObject(),this},updateFromGameObject:function(){this.world.staticTree.remove(this);var t=this.gameObject;return t.getTopLeft(this.position),this.width=t.displayWidth,this.height=t.displayHeight,this.halfWidth=Math.abs(this.width/2),this.halfHeight=Math.abs(this.height/2),this.center.set(this.position.x+this.halfWidth,this.position.y+this.halfHeight),this.world.staticTree.insert(this),this},setOffset:function(t,e){return void 0===e&&(e=t),this.world.staticTree.remove(this),this.position.x-=this.offset.x,this.position.y-=this.offset.y,this.offset.set(t,e),this.position.x+=this.offset.x,this.position.y+=this.offset.y,this.updateCenter(),this.world.staticTree.insert(this),this},setSize:function(t,e,i,n){void 0===i&&(i=this.offset.x),void 0===n&&(n=this.offset.y);var s=this.gameObject;return!t&&s.frame&&(t=s.frame.realWidth),!e&&s.frame&&(e=s.frame.realHeight),this.world.staticTree.remove(this),this.width=t,this.height=e,this.halfWidth=Math.floor(t/2),this.halfHeight=Math.floor(e/2),this.offset.set(i,n),this.updateCenter(),this.isCircle=!1,this.radius=0,this.world.staticTree.insert(this),this},setCircle:function(t,e,i){return void 0===e&&(e=this.offset.x),void 0===i&&(i=this.offset.y),t>0?(this.world.staticTree.remove(this),this.isCircle=!0,this.radius=t,this.width=2*t,this.height=2*t,this.halfWidth=Math.floor(this.width/2),this.halfHeight=Math.floor(this.height/2),this.offset.set(e,i),this.updateCenter(),this.world.staticTree.insert(this)):this.isCircle=!1,this},updateCenter:function(){this.center.set(this.position.x+this.halfWidth,this.position.y+this.halfHeight)},reset:function(t,e){var i=this.gameObject;void 0===t&&(t=i.x),void 0===e&&(e=i.y),this.world.staticTree.remove(this),i.setPosition(t,e),i.getTopLeft(this.position),this.updateCenter(),this.world.staticTree.insert(this)},stop:function(){return this},getBounds:function(t){return t.x=this.x,t.y=this.y,t.right=this.right,t.bottom=this.bottom,t},hitTest:function(t,e){return this.isCircle?n(this,t,e):o(this,t,e)},postUpdate:function(){},deltaAbsX:function(){return 0},deltaAbsY:function(){return 0},deltaX:function(){return 0},deltaY:function(){return 0},deltaZ:function(){return 0},destroy:function(){this.enable=!1,this.world.pendingDestroy.set(this)},drawDebug:function(t){var e=this.position,i=e.x+this.halfWidth,n=e.y+this.halfHeight;this.debugShowBody&&(t.lineStyle(1,this.debugBodyColor,1),this.isCircle?t.strokeCircle(i,n,this.width/2):t.strokeRect(e.x,e.y,this.width,this.height))},willDrawDebug:function(){return this.debugShowBody},setMass:function(t){return t<=0&&(t=.1),this.mass=t,this},x:{get:function(){return this.position.x},set:function(t){this.world.staticTree.remove(this),this.position.x=t,this.world.staticTree.insert(this)}},y:{get:function(){return this.position.y},set:function(t){this.world.staticTree.remove(this),this.position.y=t,this.world.staticTree.insert(this)}},left:{get:function(){return this.position.x}},right:{get:function(){return this.position.x+this.width}},top:{get:function(){return this.position.y}},bottom:{get:function(){return this.position.y+this.height}}});t.exports=h},function(t,e){t.exports=function(t,e){return!(e.right<=t.left||e.bottom<=t.top||e.position.x>=t.right||e.position.y>=t.bottom)}},function(t,e,i){var n=i(317);function s(t){if(!(this instanceof s))return new s(t,[".left",".top",".right",".bottom"]);this._maxEntries=Math.max(4,t||9),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()}function r(t,e,i){if(!i)return e.indexOf(t);for(var n=0;n=t.minX&&e.maxY>=t.minY}function g(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function v(t,e,i,s,r){for(var o,a=[e,i];a.length;)(i=a.pop())-(e=a.pop())<=s||(o=e+Math.ceil((i-e)/s/2)*s,n(t,o,e,i,r),a.push(e,o,o,i))}s.prototype={all:function(){return this._all(this.data,[])},search:function(t){var e=this.data,i=[],n=this.toBBox;if(!p(t,e))return i;for(var s,r,o,a,h=[];e;){for(s=0,r=e.children.length;s=0&&r[e].children.length>this._maxEntries;)this._split(r,e),e--;this._adjustParentBBoxes(s,r,e)},_split:function(t,e){var i=t[e],n=i.children.length,s=this._minEntries;this._chooseSplitAxis(i,s,n);var r=this._chooseSplitIndex(i,s,n),a=g(i.children.splice(r,i.children.length-r));a.height=i.height,a.leaf=i.leaf,o(i,this.toBBox),o(a,this.toBBox),e?t[e-1].children.push(a):this._splitRoot(i,a)},_splitRoot:function(t,e){this.data=g([t,e]),this.data.height=t.height+1,this.data.leaf=!1,o(this.data,this.toBBox)},_chooseSplitIndex:function(t,e,i){var n,s,r,o,h,l,u,d,f,p,g,v,y,m;for(l=u=1/0,n=e;n<=i-e;n++)s=a(t,0,n,this.toBBox),r=a(t,n,i,this.toBBox),f=s,p=r,void 0,void 0,void 0,void 0,g=Math.max(f.minX,p.minX),v=Math.max(f.minY,p.minY),y=Math.min(f.maxX,p.maxX),m=Math.min(f.maxY,p.maxY),o=Math.max(0,y-g)*Math.max(0,m-v),h=c(s)+c(r),o=e;s--)r=t.children[s],h(u,t.leaf?o(r):r),c+=d(u);return c},_adjustParentBBoxes:function(t,e,i){for(var n=i;n>=0;n--)h(e[n],t)},_condense:function(t){for(var e,i=t.length-1;i>=0;i--)0===t[i].children.length?i>0?(e=t[i-1].children).splice(e.indexOf(t[i]),1):this.clear():o(t[i],this.toBBox)},compareMinX:function(t,e){return t.left-e.left},compareMinY:function(t,e){return t.top-e.top},toBBox:function(t){return{minX:t.left,minY:t.top,maxX:t.right,maxY:t.bottom}}},t.exports=s},function(t,e,i){var n=new(i(0))({initialize:function(){this._pending=[],this._active=[],this._destroy=[],this._toProcess=0},add:function(t){return this._pending.push(t),this._toProcess++,this},remove:function(t){return this._destroy.push(t),this._toProcess++,this},update:function(){if(0===this._toProcess)return this._active;var t,e,i=this._destroy,n=this._active;for(t=0;te._dy?(r=t.bottom-e.y)>o&&!i||!1===t.checkCollision.down||!1===e.checkCollision.up?r=0:(t.touching.none=!1,t.touching.down=!0,e.touching.none=!1,e.touching.up=!0,e.physicsType===n.STATIC_BODY&&(t.blocked.none=!1,t.blocked.down=!0),t.physicsType===n.STATIC_BODY&&(e.blocked.none=!1,e.blocked.up=!0)):t._dyo&&!i||!1===t.checkCollision.up||!1===e.checkCollision.down?r=0:(t.touching.none=!1,t.touching.up=!0,e.touching.none=!1,e.touching.down=!0,e.physicsType===n.STATIC_BODY&&(t.blocked.none=!1,t.blocked.up=!0),t.physicsType===n.STATIC_BODY&&(e.blocked.none=!1,e.blocked.down=!0))),t.overlapY=r,e.overlapY=r,r}},function(t,e,i){var n=i(38);t.exports=function(t,e,i,s){var r=0,o=t.deltaAbsX()+e.deltaAbsX()+s;return 0===t._dx&&0===e._dx?(t.embedded=!0,e.embedded=!0):t._dx>e._dx?(r=t.right-e.x)>o&&!i||!1===t.checkCollision.right||!1===e.checkCollision.left?r=0:(t.touching.none=!1,t.touching.right=!0,e.touching.none=!1,e.touching.left=!0,e.physicsType===n.STATIC_BODY&&(t.blocked.none=!1,t.blocked.right=!0),t.physicsType===n.STATIC_BODY&&(e.blocked.none=!1,e.blocked.left=!0)):t._dxo&&!i||!1===t.checkCollision.left||!1===e.checkCollision.right?r=0:(t.touching.none=!1,t.touching.left=!0,e.touching.none=!1,e.touching.right=!0,e.physicsType===n.STATIC_BODY&&(t.blocked.none=!1,t.blocked.left=!0),t.physicsType===n.STATIC_BODY&&(e.blocked.none=!1,e.blocked.right=!0))),t.overlapX=r,e.overlapX=r,r}},function(t,e,i){var n=new(i(0))({initialize:function(t,e,i,n,s,r,o){this.world=t,this.name="",this.active=!0,this.overlapOnly=e,this.object1=i,this.object2=n,this.collideCallback=s,this.processCallback=r,this.callbackContext=o},setName:function(t){return this.name=t,this},update:function(){this.world.collideObjects(this.object1,this.object2,this.collideCallback,this.processCallback,this.callbackContext,this.overlapOnly)},destroy:function(){this.world.removeCollider(this),this.active=!1,this.world=null,this.object1=null,this.object2=null,this.collideCallback=null,this.processCallback=null,this.callbackContext=null}});t.exports=n},function(t,e,i){t.exports={COLLIDE:i(563),OVERLAP:i(562),PAUSE:i(561),RESUME:i(560),TILE_COLLIDE:i(559),TILE_OVERLAP:i(558),WORLD_BOUNDS:i(557)}},function(t,e,i){var n=i(43),s=i(0),r=i(38),o=i(248),a=i(183),h=i(10),l=i(42),u=i(3),c=new s({initialize:function(t,e){var i=e.width?e.width:64,n=e.height?e.height:64;this.world=t,this.gameObject=e,this.transform={x:e.x,y:e.y,rotation:e.angle,scaleX:e.scaleX,scaleY:e.scaleY,displayOriginX:e.displayOriginX,displayOriginY:e.displayOriginY},this.debugShowBody=t.defaults.debugShowBody,this.debugShowVelocity=t.defaults.debugShowVelocity,this.debugBodyColor=t.defaults.bodyDebugColor,this.enable=!0,this.isCircle=!1,this.radius=0,this.offset=new u,this.position=new u(e.x,e.y),this.prev=new u(e.x,e.y),this.allowRotation=!0,this.rotation=e.angle,this.preRotation=e.angle,this.width=i,this.height=n,this.sourceWidth=i,this.sourceHeight=n,e.frame&&(this.sourceWidth=e.frame.realWidth,this.sourceHeight=e.frame.realHeight),this.halfWidth=Math.abs(i/2),this.halfHeight=Math.abs(n/2),this.center=new u(e.x+this.halfWidth,e.y+this.halfHeight),this.velocity=new u,this.newVelocity=new u,this.deltaMax=new u,this.acceleration=new u,this.allowDrag=!0,this.drag=new u,this.allowGravity=!0,this.gravity=new u,this.bounce=new u,this.worldBounce=null,this.onWorldBounds=!1,this.onCollide=!1,this.onOverlap=!1,this.maxVelocity=new u(1e4,1e4),this.maxSpeed=-1,this.friction=new u(1,0),this.useDamping=!1,this.angularVelocity=0,this.angularAcceleration=0,this.angularDrag=0,this.maxAngular=1e3,this.mass=1,this.angle=0,this.speed=0,this.facing=r.FACING_NONE,this.immovable=!1,this.moves=!0,this.customSeparateX=!1,this.customSeparateY=!1,this.overlapX=0,this.overlapY=0,this.overlapR=0,this.embedded=!1,this.collideWorldBounds=!1,this.checkCollision={none:!1,up:!0,down:!0,left:!0,right:!0},this.touching={none:!0,up:!1,down:!1,left:!1,right:!1},this.wasTouching={none:!0,up:!1,down:!1,left:!1,right:!1},this.blocked={none:!0,up:!1,down:!1,left:!1,right:!1},this.syncBounds=!1,this.isMoving=!1,this.stopVelocityOnCollide=!0,this.physicsType=r.DYNAMIC_BODY,this._reset=!0,this._sx=e.scaleX,this._sy=e.scaleY,this._dx=0,this._dy=0,this._bounds=new h},updateBounds:function(){var t=this.gameObject,e=this.transform;if(t.parentContainer){var i=t.getWorldTransformMatrix(this.world._tempMatrix,this.world._tempMatrix2);e.x=i.tx,e.y=i.ty,e.rotation=a(i.rotation),e.scaleX=i.scaleX,e.scaleY=i.scaleY,e.displayOriginX=t.displayOriginX,e.displayOriginY=t.displayOriginY}else e.x=t.x,e.y=t.y,e.rotation=t.angle,e.scaleX=t.scaleX,e.scaleY=t.scaleY,e.displayOriginX=t.displayOriginX,e.displayOriginY=t.displayOriginY;var n=!1;if(this.syncBounds){var s=t.getBounds(this._bounds);this.width=s.width,this.height=s.height,n=!0}else{var r=Math.abs(e.scaleX),o=Math.abs(e.scaleY);this._sx===r&&this._sy===o||(this.width=this.sourceWidth*r,this.height=this.sourceHeight*o,this._sx=r,this._sy=o,n=!0)}n&&(this.halfWidth=Math.floor(this.width/2),this.halfHeight=Math.floor(this.height/2),this.updateCenter())},updateCenter:function(){this.center.set(this.position.x+this.halfWidth,this.position.y+this.halfHeight)},update:function(t){this.wasTouching.none=this.touching.none,this.wasTouching.up=this.touching.up,this.wasTouching.down=this.touching.down,this.wasTouching.left=this.touching.left,this.wasTouching.right=this.touching.right,this.touching.none=!0,this.touching.up=!1,this.touching.down=!1,this.touching.left=!1,this.touching.right=!1,this.blocked.none=!0,this.blocked.up=!1,this.blocked.down=!1,this.blocked.left=!1,this.blocked.right=!1,this.overlapR=0,this.overlapX=0,this.overlapY=0,this.embedded=!1,this.updateBounds();var e=this.transform;if(this.position.x=e.x+e.scaleX*(this.offset.x-e.displayOriginX),this.position.y=e.y+e.scaleY*(this.offset.y-e.displayOriginY),this.updateCenter(),this.rotation=e.rotation,this.preRotation=this.rotation,this._reset&&(this.prev.x=this.position.x,this.prev.y=this.position.y),this.moves){this.world.updateMotion(this,t);var i=this.velocity.x,n=this.velocity.y;this.newVelocity.set(i*t,n*t),this.position.add(this.newVelocity),this.updateCenter(),this.angle=Math.atan2(n,i),this.speed=Math.sqrt(i*i+n*n),this.collideWorldBounds&&this.checkWorldBounds()&&this.onWorldBounds&&this.world.emit(o.WORLD_BOUNDS,this,this.blocked.up,this.blocked.down,this.blocked.left,this.blocked.right)}this._dx=this.position.x-this.prev.x,this._dy=this.position.y-this.prev.y},postUpdate:function(){this._dx=this.position.x-this.prev.x,this._dy=this.position.y-this.prev.y,this.moves&&(0!==this.deltaMax.x&&0!==this._dx&&(this._dx<0&&this._dx<-this.deltaMax.x?this._dx=-this.deltaMax.x:this._dx>0&&this._dx>this.deltaMax.x&&(this._dx=this.deltaMax.x)),0!==this.deltaMax.y&&0!==this._dy&&(this._dy<0&&this._dy<-this.deltaMax.y?this._dy=-this.deltaMax.y:this._dy>0&&this._dy>this.deltaMax.y&&(this._dy=this.deltaMax.y)),this.gameObject.x+=this._dx,this.gameObject.y+=this._dy,this._reset=!0),this._dx<0?this.facing=r.FACING_LEFT:this._dx>0&&(this.facing=r.FACING_RIGHT),this._dy<0?this.facing=r.FACING_UP:this._dy>0&&(this.facing=r.FACING_DOWN),this.allowRotation&&(this.gameObject.angle+=this.deltaZ()),this.prev.x=this.position.x,this.prev.y=this.position.y},checkWorldBounds:function(){var t=this.position,e=this.world.bounds,i=this.world.checkCollision,n=this.worldBounce?-this.worldBounce.x:-this.bounce.x,s=this.worldBounce?-this.worldBounce.y:-this.bounce.y;return t.xe.right&&i.right&&(t.x=e.right-this.width,this.velocity.x*=n,this.blocked.right=!0,this.blocked.none=!1),t.ye.bottom&&i.down&&(t.y=e.bottom-this.height,this.velocity.y*=s,this.blocked.down=!0,this.blocked.none=!1),!this.blocked.none},setOffset:function(t,e){return void 0===e&&(e=t),this.offset.set(t,e),this},setSize:function(t,e,i){void 0===i&&(i=!0);var n=this.gameObject;if(!t&&n.frame&&(t=n.frame.realWidth),!e&&n.frame&&(e=n.frame.realHeight),this.sourceWidth=t,this.sourceHeight=e,this.width=this.sourceWidth*this._sx,this.height=this.sourceHeight*this._sy,this.halfWidth=Math.floor(this.width/2),this.halfHeight=Math.floor(this.height/2),this.updateCenter(),i&&n.getCenter){var s=n.displayWidth/2,r=n.displayHeight/2;this.offset.set(s-this.halfWidth,r-this.halfHeight)}return this.isCircle=!1,this.radius=0,this},setCircle:function(t,e,i){return void 0===e&&(e=this.offset.x),void 0===i&&(i=this.offset.y),t>0?(this.isCircle=!0,this.radius=t,this.sourceWidth=2*t,this.sourceHeight=2*t,this.width=this.sourceWidth*this._sx,this.height=this.sourceHeight*this._sy,this.halfWidth=Math.floor(this.width/2),this.halfHeight=Math.floor(this.height/2),this.offset.set(e,i),this.updateCenter()):this.isCircle=!1,this},reset:function(t,e){this.stop();var i=this.gameObject;i.setPosition(t,e),i.getTopLeft(this.position),this.prev.copy(this.position),this.rotation=i.angle,this.preRotation=i.angle,this.updateBounds(),this.updateCenter()},stop:function(){return this.velocity.set(0),this.acceleration.set(0),this.speed=0,this.angularVelocity=0,this.angularAcceleration=0,this},getBounds:function(t){return t.x=this.x,t.y=this.y,t.right=this.right,t.bottom=this.bottom,t},hitTest:function(t,e){return this.isCircle?n(this,t,e):l(this,t,e)},onFloor:function(){return this.blocked.down},onCeiling:function(){return this.blocked.up},onWall:function(){return this.blocked.left||this.blocked.right},deltaAbsX:function(){return this._dx>0?this._dx:-this._dx},deltaAbsY:function(){return this._dy>0?this._dy:-this._dy},deltaX:function(){return this._dx},deltaY:function(){return this._dy},deltaZ:function(){return this.rotation-this.preRotation},destroy:function(){this.enable=!1,this.world&&this.world.pendingDestroy.set(this)},drawDebug:function(t){var e=this.position,i=e.x+this.halfWidth,n=e.y+this.halfHeight;this.debugShowBody&&(t.lineStyle(t.defaultStrokeWidth,this.debugBodyColor),this.isCircle?t.strokeCircle(i,n,this.width/2):t.strokeRect(e.x,e.y,this.width,this.height)),this.debugShowVelocity&&(t.lineStyle(t.defaultStrokeWidth,this.world.defaults.velocityDebugColor,1),t.lineBetween(i,n,i+this.velocity.x/2,n+this.velocity.y/2))},willDrawDebug:function(){return this.debugShowBody||this.debugShowVelocity},setCollideWorldBounds:function(t){return void 0===t&&(t=!0),this.collideWorldBounds=t,this},setVelocity:function(t,e){return this.velocity.set(t,e),this.speed=Math.sqrt(t*t+e*e),this},setVelocityX:function(t){this.velocity.x=t;var e=t,i=this.velocity.y;return this.speed=Math.sqrt(e*e+i*i),this},setVelocityY:function(t){this.velocity.y=t;var e=this.velocity.x,i=t;return this.speed=Math.sqrt(e*e+i*i),this},setMaxVelocity:function(t,e){return this.maxVelocity.set(t,e),this},setMaxSpeed:function(t){return this.maxSpeed=t,this},setBounce:function(t,e){return this.bounce.set(t,e),this},setBounceX:function(t){return this.bounce.x=t,this},setBounceY:function(t){return this.bounce.y=t,this},setAcceleration:function(t,e){return this.acceleration.set(t,e),this},setAccelerationX:function(t){return this.acceleration.x=t,this},setAccelerationY:function(t){return this.acceleration.y=t,this},setAllowDrag:function(t){return void 0===t&&(t=!0),this.allowDrag=t,this},setAllowGravity:function(t){return void 0===t&&(t=!0),this.allowGravity=t,this},setAllowRotation:function(t){return void 0===t&&(t=!0),this.allowRotation=t,this},setDrag:function(t,e){return this.drag.set(t,e),this},setDragX:function(t){return this.drag.x=t,this},setDragY:function(t){return this.drag.y=t,this},setGravity:function(t,e){return this.gravity.set(t,e),this},setGravityX:function(t){return this.gravity.x=t,this},setGravityY:function(t){return this.gravity.y=t,this},setFriction:function(t,e){return this.friction.set(t,e),this},setFrictionX:function(t){return this.friction.x=t,this},setFrictionY:function(t){return this.friction.y=t,this},setAngularVelocity:function(t){return this.angularVelocity=t,this},setAngularAcceleration:function(t){return this.angularAcceleration=t,this},setAngularDrag:function(t){return this.angularDrag=t,this},setMass:function(t){return this.mass=t,this},setImmovable:function(t){return void 0===t&&(t=!0),this.immovable=t,this},setEnable:function(t){return void 0===t&&(t=!0),this.enable=t,this},x:{get:function(){return this.position.x},set:function(t){this.position.x=t}},y:{get:function(){return this.position.y},set:function(t){this.position.y=t}},left:{get:function(){return this.position.x}},right:{get:function(){return this.position.x+this.width}},top:{get:function(){return this.position.y}},bottom:{get:function(){return this.position.y+this.height}}});t.exports=c},function(t,e,i){var n=i(249),s=i(23),r=i(0),o=i(247),a=i(38),h=i(56),l=i(11),u=i(248),c=i(186),d=i(383),f=i(382),p=i(246),g=i(245),v=i(4),y=i(244),m=i(556),x=i(10),T=i(243),w=i(555),b=i(550),S=i(549),_=i(102),A=i(241),E=i(242),C=i(41),M=i(3),P=i(57),O=new r({Extends:l,initialize:function(t,e){l.call(this),this.scene=t,this.bodies=new _,this.staticBodies=new _,this.pendingDestroy=new _,this.late=new _,this._late=!1,this.colliders=new y,this.gravity=new M(v(e,"gravity.x",0),v(e,"gravity.y",0)),this.bounds=new x(v(e,"x",0),v(e,"y",0),v(e,"width",t.sys.scale.width),v(e,"height",t.sys.scale.height)),this.checkCollision={up:v(e,"checkCollision.up",!0),down:v(e,"checkCollision.down",!0),left:v(e,"checkCollision.left",!0),right:v(e,"checkCollision.right",!0)},this.fps=v(e,"fps",60),this._elapsed=0,this._frameTime=1/this.fps,this._frameTimeMS=1e3*this._frameTime,this.stepsLastFrame=0,this.timeScale=v(e,"timeScale",1),this.OVERLAP_BIAS=v(e,"overlapBias",4),this.TILE_BIAS=v(e,"tileBias",16),this.forceX=v(e,"forceX",!1),this.isPaused=v(e,"isPaused",!1),this._total=0,this.drawDebug=v(e,"debug",!1),this.debugGraphic,this.defaults={debugShowBody:v(e,"debugShowBody",!0),debugShowStaticBody:v(e,"debugShowStaticBody",!0),debugShowVelocity:v(e,"debugShowVelocity",!0),bodyDebugColor:v(e,"debugBodyColor",16711935),staticBodyDebugColor:v(e,"debugStaticBodyColor",255),velocityDebugColor:v(e,"debugVelocityColor",65280)},this.maxEntries=v(e,"maxEntries",16),this.useTree=v(e,"useTree",!0),this.tree=new T(this.maxEntries),this.staticTree=new T(this.maxEntries),this.treeMinMax={minX:0,minY:0,maxX:0,maxY:0},this._tempMatrix=new C,this._tempMatrix2=new C,this.drawDebug&&this.createDebugGraphic()},enable:function(t,e){void 0===e&&(e=a.DYNAMIC_BODY),Array.isArray(t)||(t=[t]);for(var i=0;i=s;)this._elapsed-=s,i++,this.step(n);this.stepsLastFrame=i,this._late=!0}},step:function(t){var e,i,n=this.bodies.entries,s=n.length;for(e=0;e0){for(n=(e=h.entries).length,t=0;t0){var u=this.tree,c=this.staticTree;for(n=(e=o.entries).length,t=0;t-1&&t.velocity.length()>g&&t.velocity.normalize().scale(g)},separate:function(t,e,i,n,s){if(!t.enable||!e.enable||t.checkCollision.none||e.checkCollision.none||!this.intersects(t,e))return!1;if(i&&!1===i.call(n,t.gameObject,e.gameObject))return!1;if(t.isCircle&&e.isCircle)return this.separateCircle(t,e,s);if(t.isCircle!==e.isCircle){var r=t.isCircle?e:t,o=t.isCircle?t:e,a={x:r.x,y:r.y,right:r.right,bottom:r.bottom},h=o.center;if((h.ya.bottom)&&(h.xa.right))return this.separateCircle(t,e,s)}var l=!1,c=!1;this.forceX||Math.abs(this.gravity.y+t.gravity.y)l.right&&(a=h(c.x,c.y,l.right,l.y)-c.radius):c.y>l.bottom&&(c.xl.right&&(a=h(c.x,c.y,l.right,l.bottom)-c.radius)),a*=-1}else a=t.halfWidth+e.halfWidth-h(t.center.x,t.center.y,e.center.x,e.center.y);if(i||0===a||t.immovable&&e.immovable||t.customSeparateX||e.customSeparateX)return 0!==a&&(t.onOverlap||e.onOverlap)&&this.emit(u.OVERLAP,t.gameObject,e.gameObject,t,e),0!==a;var d=t.velocity.x,f=t.velocity.y,v=t.mass,y=e.velocity.x,m=e.velocity.y,x=e.mass,T=d*Math.cos(o)+f*Math.sin(o),w=d*Math.sin(o)-f*Math.cos(o),b=y*Math.cos(o)+m*Math.sin(o),S=y*Math.sin(o)-m*Math.cos(o),_=((v-x)*T+2*x*b)/(v+x),A=(2*v*T+(x-v)*b)/(v+x);t.immovable||(t.velocity.x=(_*Math.cos(o)-w*Math.sin(o))*t.bounce.x,t.velocity.y=(w*Math.cos(o)+_*Math.sin(o))*t.bounce.y,d=t.velocity.x,f=t.velocity.y),e.immovable||(e.velocity.x=(A*Math.cos(o)-S*Math.sin(o))*e.bounce.x,e.velocity.y=(S*Math.cos(o)+A*Math.sin(o))*e.bounce.y,y=e.velocity.x,m=e.velocity.y),Math.abs(o)0&&!t.immovable&&y>d?t.velocity.x*=-1:y<0&&!e.immovable&&d0&&!t.immovable&&m>f?t.velocity.y*=-1:m<0&&!e.immovable&&fMath.PI/2&&(d<0&&!t.immovable&&y0&&!e.immovable&&d>y?e.velocity.x*=-1:f<0&&!t.immovable&&m0&&!e.immovable&&d>m&&(e.velocity.y*=-1));var E=this._frameTime;return t.immovable||(t.x+=t.velocity.x*E-a*Math.cos(o),t.y+=t.velocity.y*E-a*Math.sin(o)),e.immovable||(e.x+=e.velocity.x*E+a*Math.cos(o),e.y+=e.velocity.y*E+a*Math.sin(o)),(t.onCollide||e.onCollide)&&this.emit(u.COLLIDE,t.gameObject,e.gameObject,t,e),t.postUpdate(),e.postUpdate(),!0},intersects:function(t,e){return t!==e&&(t.isCircle||e.isCircle?t.isCircle?e.isCircle?h(t.center.x,t.center.y,e.center.x,e.center.y)<=t.halfWidth+e.halfWidth:this.circleBodyIntersects(t,e):this.circleBodyIntersects(e,t):!(t.right<=e.position.x||t.bottom<=e.position.y||t.position.x>=e.right||t.position.y>=e.bottom))},circleBodyIntersects:function(t,e){var i=s(t.center.x,e.left,e.right),n=s(t.center.y,e.top,e.bottom);return(t.center.x-i)*(t.center.x-i)+(t.center.y-n)*(t.center.y-n)<=t.halfWidth*t.halfWidth},overlap:function(t,e,i,n,s){return void 0===i&&(i=null),void 0===n&&(n=null),void 0===s&&(s=i),this.collideObjects(t,e,i,n,s,!0)},collide:function(t,e,i,n,s){return void 0===i&&(i=null),void 0===n&&(n=null),void 0===s&&(s=i),this.collideObjects(t,e,i,n,s,!1)},collideObjects:function(t,e,i,n,s,r){var o;t.isParent&&void 0===t.physicsType&&(t=t.children.entries),e&&e.isParent&&void 0===e.physicsType&&(e=e.children.entries);var a=Array.isArray(t),h=Array.isArray(e);if(this._total=0,a||h)if(!a&&h)for(o=0;o0},collideHandler:function(t,e,i,n,s,r){if(void 0===e&&t.isParent)return this.collideGroupVsGroup(t,t,i,n,s,r);if(!t||!e)return!1;if(t.body){if(e.body)return this.collideSpriteVsSprite(t,e,i,n,s,r);if(e.isParent)return this.collideSpriteVsGroup(t,e,i,n,s,r);if(e.isTilemap)return this.collideSpriteVsTilemapLayer(t,e,i,n,s,r)}else if(t.isParent){if(e.body)return this.collideSpriteVsGroup(e,t,i,n,s,r);if(e.isParent)return this.collideGroupVsGroup(t,e,i,n,s,r);if(e.isTilemap)return this.collideGroupVsTilemapLayer(t,e,i,n,s,r)}else if(t.isTilemap){if(e.body)return this.collideSpriteVsTilemapLayer(e,t,i,n,s,r);if(e.isParent)return this.collideGroupVsTilemapLayer(e,t,i,n,s,r)}},collideSpriteVsSprite:function(t,e,i,n,s,r){return!(!t.body||!e.body)&&(this.separate(t.body,e.body,n,s,r)&&(i&&i.call(s,t,e),this._total++),!0)},collideSpriteVsGroup:function(t,e,i,n,s,r){var o,h,l,u=t.body;if(0!==e.length&&u&&u.enable)if(this.useTree){var c=this.treeMinMax;c.minX=u.left,c.minY=u.top,c.maxX=u.right,c.maxY=u.bottom;var d=e.physicsType===a.DYNAMIC_BODY?this.tree.search(c):this.staticTree.search(c);for(h=d.length,o=0;od.baseTileWidth){var f=(d.tileWidth-d.baseTileWidth)*e.scaleX;a-=f,l+=f}d.tileHeight>d.baseTileHeight&&(c+=(d.tileHeight-d.baseTileHeight)*e.scaleY);var p,g=e.getTilesWithinWorldXY(a,h,l,c);if(0===g.length)return!1;for(var v={left:0,right:0,top:0,bottom:0},y=0;y=2&&(this.leftStick.set(r[0].getValue(),r[1].getValue()),s>=4&&this.rightStick.set(r[2].getValue(),r[3].getValue()))},destroy:function(){var t;for(this.removeAllListeners(),this.manager=null,this.pad=null,t=0;t=this.threshold?this.pressed||(this.pressed=!0,this.events.emit(s.BUTTON_DOWN,e,this,t),this.pad.emit(s.GAMEPAD_BUTTON_DOWN,i,t,this)):this.pressed&&(this.pressed=!1,this.events.emit(s.BUTTON_UP,e,this,t),this.pad.emit(s.GAMEPAD_BUTTON_UP,i,t,this))},destroy:function(){this.pad=null,this.events=null}});t.exports=r},function(t,e,i){var n=new(i(0))({initialize:function(t,e){this.pad=t,this.events=t.events,this.index=e,this.value=0,this.threshold=.1},update:function(t){this.value=t},getValue:function(){return Math.abs(this.value)t.width*t.height)&&e.x>t.x&&e.xt.x&&e.rightt.y&&e.yt.y&&e.bottom=0&&u<=1){var c=((s-h)*(r-n)-(n-a)*(o-s))/l;return Math.abs(c)*Math.sqrt(l)<=i}return Math.sqrt((r-a)*(r-a)+(o-h)*(o-h))<=i}},function(t,e,i){var n=i(43),s=new(i(6));t.exports=function(t,e,i){if(void 0===i&&(i=s),n(e,t.x1,t.y1))return i.x=t.x1,i.y=t.y1,!0;if(n(e,t.x2,t.y2))return i.x=t.x2,i.y=t.y2,!0;var r=t.x2-t.x1,o=t.y2-t.y1,a=e.x-t.x1,h=e.y-t.y1,l=r*r+o*o,u=r,c=o;if(l>0){var d=(a*r+h*o)/l;u*=d,c*=d}return i.x=t.x1+u,i.y=t.y1+c,u*u+c*c<=l&&u*r+c*o>=0&&n(e,i.x,i.y)}},function(t,e,i){t.exports={CircleToCircle:i(725),CircleToRectangle:i(724),GetRectangleIntersection:i(723),LineToCircle:i(277),LineToLine:i(115),LineToRectangle:i(722),PointToLine:i(276),PointToLineSegment:i(721),RectangleToRectangle:i(158),RectangleToTriangle:i(720),RectangleToValues:i(719),TriangleToCircle:i(718),TriangleToLine:i(717),TriangleToTriangle:i(716)}},function(t,e,i){t.exports={Circle:i(745),Ellipse:i(735),Intersects:i(278),Line:i(715),Point:i(694),Polygon:i(680),Rectangle:i(270),Triangle:i(650)}},function(t,e,i){var n=i(0),s=i(281),r=i(9),o=new n({initialize:function(){this.lightPool=[],this.lights=[],this.culledLights=[],this.ambientColor={r:.1,g:.1,b:.1},this.active=!1,this.maxLights=-1},enable:function(){return-1===this.maxLights&&(this.maxLights=this.scene.sys.game.renderer.config.maxLights),this.active=!0,this},disable:function(){return this.active=!1,this},cull:function(t){var e=this.lights,i=this.culledLights,n=e.length,s=t.x+t.width/2,r=t.y+t.height/2,o=(t.width+t.height)/2,a={x:0,y:0},h=t.matrix,l=this.systems.game.config.height;i.length=0;for(var u=0;u0?(h=this.lightPool.pop()).set(t,e,i,a[0],a[1],a[2],o):h=new s(t,e,i,a[0],a[1],a[2],o),this.lights.push(h),h},removeLight:function(t){var e=this.lights.indexOf(t);return e>=0&&(this.lightPool.push(t),this.lights.splice(e,1)),this},shutdown:function(){for(;this.lights.length>0;)this.lightPool.push(this.lights.pop());this.ambientColor={r:.1,g:.1,b:.1},this.culledLights.length=0,this.lights.length=0},destroy:function(){this.shutdown()}});t.exports=o},function(t,e,i){var n=i(0),s=i(9),r=new n({initialize:function(t,e,i,n,s,r,o){this.x=t,this.y=e,this.radius=i,this.r=n,this.g=s,this.b=r,this.intensity=o,this.scrollFactorX=1,this.scrollFactorY=1},set:function(t,e,i,n,s,r,o){return this.x=t,this.y=e,this.radius=i,this.r=n,this.g=s,this.b=r,this.intensity=o,this.scrollFactorX=1,this.scrollFactorY=1,this},setScrollFactor:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=t),this.scrollFactorX=t,this.scrollFactorY=e,this},setColor:function(t){var e=s.getFloatsFromUintRGB(t);return this.r=e[0],this.g=e[1],this.b=e[2],this},setIntensity:function(t){return this.intensity=t,this},setPosition:function(t,e){return this.x=t,this.y=e,this},setRadius:function(t){return this.radius=t,this}});t.exports=r},function(t,e,i){var n=i(58),s=i(6);t.exports=function(t,e,i,r){void 0===r&&(r=[]);var o=t.getLineA(),a=t.getLineB(),h=t.getLineC(),l=n(o),u=n(a),c=n(h),d=l+u+c;e||(e=d/i);for(var f=0;fl+u?(g=(p-=l+u)/c,v.x=h.x1+(h.x2-h.x1)*g,v.y=h.y1+(h.y2-h.y1)*g):(g=(p-=l)/u,v.x=a.x1+(a.x2-a.x1)*g,v.y=a.y1+(a.y2-a.y1)*g),r.push(v)}return r}},function(t,e,i){var n=i(6),s=i(58);t.exports=function(t,e,i){void 0===i&&(i=new n);var r=t.getLineA(),o=t.getLineB(),a=t.getLineC();if(e<=0||e>=1)return i.x=r.x1,i.y=r.y1,i;var h=s(r),l=s(o),u=s(a),c=(h+l+u)*e,d=0;return ch+l?(d=(c-=h+l)/u,i.x=a.x1+(a.x2-a.x1)*d,i.y=a.y1+(a.y2-a.y1)*d):(d=(c-=h)/l,i.x=o.x1+(o.x2-o.x1)*d,i.y=o.y1+(o.y2-o.y1)*d),i}},function(t,e,i){var n=i(0),s=i(29),r=i(65),o=i(795),a=new n({Extends:s,Mixins:[o],initialize:function(t,e,i,n,o,a,h,l,u,c,d){void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),void 0===o&&(o=128),void 0===a&&(a=64),void 0===h&&(h=0),void 0===l&&(l=128),void 0===u&&(u=128),s.call(this,t,"Triangle",new r(n,o,a,h,l,u));var f=this.geom.right-this.geom.left,p=this.geom.bottom-this.geom.top;this.setPosition(e,i),this.setSize(f,p),void 0!==c&&this.setFillStyle(c,d),this.updateDisplayOrigin(),this.updateData()},setTo:function(t,e,i,n,s,r){return this.geom.setTo(t,e,i,n,s,r),this.updateData()},updateData:function(){var t=[],e=this.geom,i=this._tempLine;return e.getLineA(i),t.push(i.x1,i.y1,i.x2,i.y2),e.getLineB(i),t.push(i.x2,i.y2),e.getLineC(i),t.push(i.x2,i.y2),this.pathData=t,this}});t.exports=a},function(t,e,i){var n=i(798),s=i(0),r=i(71),o=i(29),a=new s({Extends:o,Mixins:[n],initialize:function(t,e,i,n,s,r,a,h){void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=5),void 0===s&&(s=32),void 0===r&&(r=64),o.call(this,t,"Star",null),this._points=n,this._innerRadius=s,this._outerRadius=r,this.setPosition(e,i),this.setSize(2*r,2*r),void 0!==a&&this.setFillStyle(a,h),this.updateDisplayOrigin(),this.updateData()},setPoints:function(t){return this._points=t,this.updateData()},setInnerRadius:function(t){return this._innerRadius=t,this.updateData()},setOuterRadius:function(t){return this._outerRadius=t,this.updateData()},points:{get:function(){return this._points},set:function(t){this._points=t,this.updateData()}},innerRadius:{get:function(){return this._innerRadius},set:function(t){this._innerRadius=t,this.updateData()}},outerRadius:{get:function(){return this._outerRadius},set:function(t){this._outerRadius=t,this.updateData()}},updateData:function(){var t=[],e=this._points,i=this._innerRadius,n=this._outerRadius,s=Math.PI/2*3,o=Math.PI/e,a=n,h=n;t.push(a,h+-n);for(var l=0;l0&&r.push(i([0,0],n[0])),e=0;e1&&r.push(i([0,0],n[n.length-1])),t.setTo(r)}},function(t,e,i){var n=i(58),s=i(59);t.exports=function(t){for(var e=t.points,i=0,r=0;rc+v)){var y=g.getPoint((u-c)/v);o.push(y);break}c+=v}return o}},function(t,e,i){var n=i(10);t.exports=function(t,e){void 0===e&&(e=new n);for(var i,s=1/0,r=1/0,o=-s,a=-r,h=0;h0&&(s=-h.PI2+s%h.PI2):s>h.PI2?s=h.PI2:s<0&&(s=h.PI2+s%h.PI2);for(var u,c=[a+Math.cos(n)*i,l+Math.sin(n)*i];e<1;)u=s*e+n,c.push(a+Math.cos(u)*i,l+Math.sin(u)*i),e+=t;return u=s+n,c.push(a+Math.cos(u)*i,l+Math.sin(u)*i),c.push(a+Math.cos(n)*i,l+Math.sin(n)*i),this.pathIndexes=o(c),this.pathData=c,this}});t.exports=u},function(t,e){t.exports=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(t){var e=16*Math.random()|0;return("x"===t?e:3&e|8).toString(16)})}},function(t,e,i){var n=i(0),s=i(34),r=i(90),o=i(4),a=i(67),h=i(89),l=i(3),u=new n({Extends:a,initialize:function(t,e,i,n,s,r){a.call(this,t,i,n,s,r),this.path=e,this.rotateToPath=!1,this.pathRotationOffset=0,this.pathOffset=new l(i,n),this.pathVector=new l,this.pathTween,this.pathConfig=null,this._prevDirection=h.PLAYING_FORWARD},setPath:function(t,e){void 0===e&&(e=this.pathConfig);var i=this.pathTween;return i&&i.isPlaying()&&i.stop(),this.path=t,e&&this.startFollow(e),this},setRotateToPath:function(t,e){return void 0===e&&(e=0),this.rotateToPath=t,this.pathRotationOffset=e,this},isFollowing:function(){var t=this.pathTween;return t&&t.isPlaying()},startFollow:function(t,e){void 0===t&&(t={}),void 0===e&&(e=0);var i=this.pathTween;i&&i.isPlaying()&&i.stop(),"number"==typeof t&&(t={duration:t}),t.from=0,t.to=1;var n=r(t,"positionOnPath",!1);this.rotateToPath=r(t,"rotateToPath",!1),this.pathRotationOffset=o(t,"rotationOffset",0);var a=o(t,"startAt",e);if(a&&(t.onStart=function(t){var e=t.data[0];e.progress=a,e.elapsed=e.duration*a;var i=e.ease(e.progress);e.current=e.start+(e.end-e.start)*i,e.target[e.key]=e.current}),this.pathTween=this.scene.sys.tweens.addCounter(t),this.path.getStartPoint(this.pathOffset),n&&(this.x=this.pathOffset.x,this.y=this.pathOffset.y),this.pathOffset.x=this.x-this.pathOffset.x,this.pathOffset.y=this.y-this.pathOffset.y,this._prevDirection=h.PLAYING_FORWARD,this.rotateToPath){var l=this.path.getPoint(.1);this.rotation=Math.atan2(l.y-this.y,l.x-this.x)+s(this.pathRotationOffset)}return this.pathConfig=t,this},pauseFollow:function(){var t=this.pathTween;return t&&t.isPlaying()&&t.pause(),this},resumeFollow:function(){var t=this.pathTween;return t&&t.isPaused()&&t.resume(),this},stopFollow:function(){var t=this.pathTween;return t&&t.isPlaying()&&t.stop(),this},preUpdate:function(t,e){this.anims.update(t,e);var i=this.pathTween;if(i){var n=i.data[0];if(n.state!==h.PLAYING_FORWARD&&n.state!==h.PLAYING_BACKWARD)return;var r=this.pathVector;this.path.getPoint(i.getValue(),r),r.add(this.pathOffset);var o=this.x,a=this.y;this.setPosition(r.x,r.y);var l=this.x-o,u=this.y-a;if(0===l&&0===u)return;if(n.state!==this._prevDirection)return void(this._prevDirection=n.state);this.rotateToPath&&(this.rotation=Math.atan2(u,l)+s(this.pathRotationOffset))}}});t.exports=u},function(t,e,i){var n=i(0),s=i(3),r=new n({initialize:function(t){this.source=t,this._tempVec=new s},getPoint:function(t){var e=this._tempVec;this.source.getRandomPoint(e),t.x=e.x,t.y=e.y}});t.exports=r},function(t,e){t.exports=function(t,e){for(var i=0;ithis._length&&(this.counter=this._length-1),this},changeSource:function(t){return this.source=t,this.updateSource()},getPoint:function(t){0===this._direction?(this.counter++,this.counter>=this._length&&(this.yoyo?(this._direction=1,this.counter=this._length-1):this.counter=0)):(this.counter--,-1===this.counter&&(this.yoyo?(this._direction=0,this.counter=0):this.counter=this._length-1));var e=this.points[this.counter];e&&(t.x=e.x,t.y=e.y)}});t.exports=n},function(t,e,i){var n=new(i(0))({initialize:function(t,e){this.source=t,this.killOnEnter=e},willKill:function(t){var e=this.source.contains(t.x,t.y);return e&&this.killOnEnter||!e&&!this.killOnEnter}});t.exports=n},function(t,e,i){var n=i(60),s=i(0),r=i(13),o=i(304),a=i(303),h=i(845),l=i(2),u=i(172),c=i(302),d=i(91),f=i(306),p=i(301),g=i(10),v=i(118),y=i(3),m=i(57),x=new s({Mixins:[r.BlendMode,r.Mask,r.ScrollFactor,r.Visible],initialize:function(t,e){this.manager=t,this.texture=t.texture,this.frames=[t.defaultFrame],this.defaultFrame=t.defaultFrame,this.configFastMap=["active","blendMode","collideBottom","collideLeft","collideRight","collideTop","deathCallback","deathCallbackScope","emitCallback","emitCallbackScope","follow","frequency","gravityX","gravityY","maxParticles","name","on","particleBringToTop","particleClass","radial","timeScale","trackVisible","visible"],this.configOpMap=["accelerationX","accelerationY","angle","alpha","bounce","delay","lifespan","maxVelocityX","maxVelocityY","moveToX","moveToY","quantity","rotate","scaleX","scaleY","speedX","speedY","tint","x","y"],this.name="",this.particleClass=f,this.x=new h(e,"x",0),this.y=new h(e,"y",0),this.radial=!0,this.gravityX=0,this.gravityY=0,this.acceleration=!1,this.accelerationX=new h(e,"accelerationX",0,!0),this.accelerationY=new h(e,"accelerationY",0,!0),this.maxVelocityX=new h(e,"maxVelocityX",1e4,!0),this.maxVelocityY=new h(e,"maxVelocityY",1e4,!0),this.speedX=new h(e,"speedX",0,!0),this.speedY=new h(e,"speedY",0,!0),this.moveTo=!1,this.moveToX=new h(e,"moveToX",0,!0),this.moveToY=new h(e,"moveToY",0,!0),this.bounce=new h(e,"bounce",0,!0),this.scaleX=new h(e,"scaleX",1),this.scaleY=new h(e,"scaleY",1),this.tint=new h(e,"tint",4294967295),this.alpha=new h(e,"alpha",1),this.lifespan=new h(e,"lifespan",1e3),this.angle=new h(e,"angle",{min:0,max:360}),this.rotate=new h(e,"rotate",0),this.emitCallback=null,this.emitCallbackScope=null,this.deathCallback=null,this.deathCallbackScope=null,this.maxParticles=0,this.quantity=new h(e,"quantity",1,!0),this.delay=new h(e,"delay",0,!0),this.frequency=0,this.on=!0,this.particleBringToTop=!0,this.timeScale=1,this.emitZone=null,this.deathZone=null,this.bounds=null,this.collideLeft=!0,this.collideRight=!0,this.collideTop=!0,this.collideBottom=!0,this.active=!0,this.visible=!0,this.blendMode=n.NORMAL,this.follow=null,this.followOffset=new y,this.trackVisible=!1,this.currentFrame=0,this.randomFrame=!0,this.frameQuantity=1,this.dead=[],this.alive=[],this._counter=0,this._frameCounter=0,e&&this.fromJSON(e)},fromJSON:function(t){if(!t)return this;var e=0,i="";for(e=0;e0&&this.getParticleCount()===this.maxParticles},onParticleEmit:function(t,e){return void 0===t?(this.emitCallback=null,this.emitCallbackScope=null):"function"==typeof t&&(this.emitCallback=t,e&&(this.emitCallbackScope=e)),this},onParticleDeath:function(t,e){return void 0===t?(this.deathCallback=null,this.deathCallbackScope=null):"function"==typeof t&&(this.deathCallback=t,e&&(this.deathCallbackScope=e)),this},killAll:function(){for(var t=this.dead,e=this.alive;e.length>0;)t.push(e.pop());return this},forEachAlive:function(t,e){for(var i=this.alive,n=i.length,s=0;s0){var u=this.deathCallback,c=this.deathCallbackScope;for(o=h-1;o>=0;o--){var d=a[o];s.splice(d.index,1),r.push(d.particle),u&&u.call(c,d.particle),d.particle.resetPosition()}}this.on&&(0===this.frequency?this.emitParticle():this.frequency>0&&(this._counter-=e,this._counter<=0&&(this.emitParticle(),this._counter=this.frequency-Math.abs(this._counter))))},depthSortCallback:function(t,e){return t.y-e.y}});t.exports=x},function(t,e,i){var n=i(0),s=i(34),r=i(56),o=new n({initialize:function(t){this.emitter=t,this.frame=null,this.x=0,this.y=0,this.velocityX=0,this.velocityY=0,this.accelerationX=0,this.accelerationY=0,this.maxVelocityX=1e4,this.maxVelocityY=1e4,this.bounce=0,this.scaleX=1,this.scaleY=1,this.alpha=1,this.angle=0,this.rotation=0,this.tint=16777215,this.life=1e3,this.lifeCurrent=1e3,this.delayCurrent=0,this.lifeT=0,this.data={tint:{min:16777215,max:16777215,current:16777215},alpha:{min:1,max:1},rotate:{min:0,max:0},scaleX:{min:1,max:1},scaleY:{min:1,max:1}}},isAlive:function(){return this.lifeCurrent>0},resetPosition:function(){this.x=0,this.y=0},fire:function(t,e){var i=this.emitter;this.frame=i.getFrame(),i.emitZone&&i.emitZone.getPoint(this),void 0===t?(i.follow&&(this.x+=i.follow.x+i.followOffset.x),this.x+=i.x.onEmit(this,"x")):this.x+=t,void 0===e?(i.follow&&(this.y+=i.follow.y+i.followOffset.y),this.y+=i.y.onEmit(this,"y")):this.y+=e,this.life=i.lifespan.onEmit(this,"lifespan"),this.lifeCurrent=this.life,this.lifeT=0;var n=i.speedX.onEmit(this,"speedX"),o=i.speedY?i.speedY.onEmit(this,"speedY"):n;if(i.radial){var a=s(i.angle.onEmit(this,"angle"));this.velocityX=Math.cos(a)*Math.abs(n),this.velocityY=Math.sin(a)*Math.abs(o)}else if(i.moveTo){var h=i.moveToX.onEmit(this,"moveToX"),l=i.moveToY?i.moveToY.onEmit(this,"moveToY"):h,u=Math.atan2(l-this.y,h-this.x),c=r(this.x,this.y,h,l)/(this.life/1e3);this.velocityX=Math.cos(u)*c,this.velocityY=Math.sin(u)*c}else this.velocityX=n,this.velocityY=o;i.acceleration&&(this.accelerationX=i.accelerationX.onEmit(this,"accelerationX"),this.accelerationY=i.accelerationY.onEmit(this,"accelerationY")),this.maxVelocityX=i.maxVelocityX.onEmit(this,"maxVelocityX"),this.maxVelocityY=i.maxVelocityY.onEmit(this,"maxVelocityY"),this.delayCurrent=i.delay.onEmit(this,"delay"),this.scaleX=i.scaleX.onEmit(this,"scaleX"),this.scaleY=i.scaleY?i.scaleY.onEmit(this,"scaleY"):this.scaleX,this.angle=i.rotate.onEmit(this,"rotate"),this.rotation=s(this.angle),this.bounce=i.bounce.onEmit(this,"bounce"),this.alpha=i.alpha.onEmit(this,"alpha"),this.tint=i.tint.onEmit(this,"tint")},computeVelocity:function(t,e,i,n){var s=this.velocityX,r=this.velocityY,o=this.accelerationX,a=this.accelerationY,h=this.maxVelocityX,l=this.maxVelocityY;s+=t.gravityX*i,r+=t.gravityY*i,o&&(s+=o*i),a&&(r+=a*i),s>h?s=h:s<-h&&(s=-h),r>l?r=l:r<-l&&(r=-l),this.velocityX=s,this.velocityY=r;for(var u=0;ue.right&&t.collideRight&&(this.x=e.right,this.velocityX*=i),this.ye.bottom&&t.collideBottom&&(this.y=e.bottom,this.velocityY*=i)},update:function(t,e,i){if(this.delayCurrent>0)return this.delayCurrent-=t,!1;var n=this.emitter,r=1-this.lifeCurrent/this.life;return this.lifeT=r,this.computeVelocity(n,t,e,i),this.x+=this.velocityX*e,this.y+=this.velocityY*e,n.bounds&&this.checkBounds(n),n.deathZone&&n.deathZone.willKill(this)?(this.lifeCurrent=0,!0):(this.scaleX=n.scaleX.onUpdate(this,"scaleX",r,this.scaleX),n.scaleY?this.scaleY=n.scaleY.onUpdate(this,"scaleY",r,this.scaleY):this.scaleY=this.scaleX,this.angle=n.rotate.onUpdate(this,"rotate",r,this.angle),this.rotation=s(this.angle),this.alpha=n.alpha.onUpdate(this,"alpha",r,this.alpha),this.tint=n.tint.onUpdate(this,"tint",r,this.tint),this.lifeCurrent-=t,this.lifeCurrent<=0)}});t.exports=o},function(t,e,i){var n=i(0),s=i(2),r=new n({initialize:function(t,e,i,n,r){if("object"==typeof t){var o=t;t=s(o,"x",0),e=s(o,"y",0),i=s(o,"power",0),n=s(o,"epsilon",100),r=s(o,"gravity",50)}else void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=100),void 0===r&&(r=50);this.x=t,this.y=e,this.active=!0,this._gravity=r,this._power=0,this._epsilon=0,this.power=i,this.epsilon=n},update:function(t,e){var i=this.x-t.x,n=this.y-t.y,s=i*i+n*n;if(0!==s){var r=Math.sqrt(s);s>>16,m=(65280&p)>>>8,x=255&p,c.strokeStyle="rgba("+y+","+m+","+x+","+d+")",c.lineWidth=v,T+=3;break;case n.FILL_STYLE:g=l[T+1],f=l[T+2],y=(16711680&g)>>>16,m=(65280&g)>>>8,x=255&g,c.fillStyle="rgba("+y+","+m+","+x+","+f+")",T+=2;break;case n.BEGIN_PATH:c.beginPath();break;case n.CLOSE_PATH:c.closePath();break;case n.FILL_PATH:h||c.fill();break;case n.STROKE_PATH:h||c.stroke();break;case n.FILL_RECT:h?c.rect(l[T+1],l[T+2],l[T+3],l[T+4]):c.fillRect(l[T+1],l[T+2],l[T+3],l[T+4]),T+=4;break;case n.FILL_TRIANGLE:c.beginPath(),c.moveTo(l[T+1],l[T+2]),c.lineTo(l[T+3],l[T+4]),c.lineTo(l[T+5],l[T+6]),c.closePath(),h||c.fill(),T+=6;break;case n.STROKE_TRIANGLE:c.beginPath(),c.moveTo(l[T+1],l[T+2]),c.lineTo(l[T+3],l[T+4]),c.lineTo(l[T+5],l[T+6]),c.closePath(),h||c.stroke(),T+=6;break;case n.LINE_TO:c.lineTo(l[T+1],l[T+2]),T+=2;break;case n.MOVE_TO:c.moveTo(l[T+1],l[T+2]),T+=2;break;case n.LINE_FX_TO:c.lineTo(l[T+1],l[T+2]),T+=5;break;case n.MOVE_FX_TO:c.moveTo(l[T+1],l[T+2]),T+=5;break;case n.SAVE:c.save();break;case n.RESTORE:c.restore();break;case n.TRANSLATE:c.translate(l[T+1],l[T+2]),T+=2;break;case n.SCALE:c.scale(l[T+1],l[T+2]),T+=2;break;case n.ROTATE:c.rotate(l[T+1]),T+=1;break;case n.GRADIENT_FILL_STYLE:T+=5;break;case n.GRADIENT_LINE_STYLE:T+=6;break;case n.SET_TEXTURE:T+=2}c.restore()}}},function(t,e){t.exports=function(t){var e=t.width/2,i=t.height/2,n=Math.pow(e-i,2)/Math.pow(e+i,2);return Math.PI*(e+i)*(1+3*n/(10+Math.sqrt(4-3*n)))}},function(t,e,i){var n=i(309),s=i(166),r=i(100),o=i(20);t.exports=function(t,e,i,a){void 0===a&&(a=[]),e||(e=n(t)/i);for(var h=0;h0?s.delayedPlay(d,r,o):s.load(r)}return t}},function(t,e,i){var n=i(4),s=i(132),r=function(t,e,i){for(var n=[],s=0;se?1:0}var s=function(t,e,r,o,a){for(void 0===r&&(r=0),void 0===o&&(o=t.length-1),void 0===a&&(a=n);o>r;){if(o-r>600){var h=o-r+1,l=e-r+1,u=Math.log(h),c=.5*Math.exp(2*u/3),d=.5*Math.sqrt(u*c*(h-c)/h)*(l-h/2<0?-1:1),f=Math.max(r,Math.floor(e-l*c/h+d)),p=Math.min(o,Math.floor(e+(h-l)*c/h+d));s(t,e,f,p,a)}var g=t[e],v=r,y=o;for(i(t,r,e),a(t[o],g)>0&&i(t,r,o);v0;)y--}0===a(t[r],g)?i(t,r,y):i(t,++y,o),y<=e&&(r=y+1),e<=y&&(o=y-1)}};t.exports=s},function(t,e){t.exports=function(t){for(var e=t.length,i=t[0].length,n=new Array(i),s=0;s-1;r--)n[s][r]=t[r][s]}return n}},function(t,e,i){t.exports={AtlasXML:i(910),Canvas:i(909),Image:i(908),JSONArray:i(907),JSONHash:i(906),SpriteSheet:i(905),SpriteSheetFromAtlas:i(904),UnityYAML:i(903)}},function(t,e,i){var n=i(24),s=i(0),r=i(127),o=i(101),a=new s({initialize:function(t,e,i,n){var s=t.manager.game;this.renderer=s.renderer,this.texture=t,this.source=e,this.image=e,this.compressionAlgorithm=null,this.resolution=1,this.width=i||e.naturalWidth||e.width||0,this.height=n||e.naturalHeight||e.height||0,this.scaleMode=o.DEFAULT,this.isCanvas=e instanceof HTMLCanvasElement,this.isRenderTexture="RenderTexture"===e.type,this.isPowerOf2=r(this.width,this.height),this.glTexture=null,this.init(s)},init:function(t){this.renderer&&(this.renderer.gl?this.isCanvas?this.glTexture=this.renderer.canvasToTexture(this.image):this.isRenderTexture?(this.image=this.source.canvas,this.glTexture=this.renderer.createTextureFromSource(null,this.width,this.height,this.scaleMode)):this.glTexture=this.renderer.createTextureFromSource(this.image,this.width,this.height,this.scaleMode):this.isRenderTexture&&(this.image=this.source.canvas)),t.config.antialias||this.setFilter(1)},setFilter:function(t){this.renderer.gl&&this.renderer.setTextureFilter(this.glTexture,t)},update:function(){this.renderer.gl&&this.isCanvas&&(this.glTexture=this.renderer.canvasToTexture(this.image,this.glTexture))},destroy:function(){this.glTexture&&this.renderer.deleteTexture(this.glTexture),this.isCanvas&&n.remove(this.image),this.renderer=null,this.texture=null,this.source=null,this.image=null,this.glTexture=null}});t.exports=a},function(t,e,i){var n=i(24),s=i(911),r=i(0),o=i(32),a=i(28),h=i(11),l=i(126),u=i(26),c=i(361),d=i(4),f=i(319),p=i(175),g=new r({Extends:h,initialize:function(t){h.call(this),this.game=t,this.name="TextureManager",this.list={},this._tempCanvas=n.create2D(this,1,1),this._tempContext=this._tempCanvas.getContext("2d"),this._pending=0,t.events.once(u.BOOT,this.boot,this)},boot:function(){this._pending=2,this.on(l.LOAD,this.updatePending,this),this.on(l.ERROR,this.updatePending,this),this.addBase64("__DEFAULT",this.game.config.defaultImage),this.addBase64("__MISSING",this.game.config.missingImage),this.game.events.once(u.DESTROY,this.destroy,this)},updatePending:function(){this._pending--,0===this._pending&&(this.off(l.LOAD),this.off(l.ERROR),this.emit(l.READY))},checkKey:function(t){return!this.exists(t)||(console.error("Texture key already in use: "+t),!1)},remove:function(t){if("string"==typeof t){if(!this.exists(t))return console.warn("No texture found matching key: "+t),this;t=this.get(t)}return this.list.hasOwnProperty(t.key)&&(delete this.list[t.key],t.destroy(),this.emit(l.REMOVE,t.key)),this},addBase64:function(t,e){if(this.checkKey(t)){var i=this,n=new Image;n.onerror=function(){i.emit(l.ERROR,t)},n.onload=function(){var e=i.create(t,n);f.Image(e,0),i.emit(l.ADD,t,e),i.emit(l.LOAD,t,e)},n.src=e}return this},getBase64:function(t,e,i,s){void 0===i&&(i="image/png"),void 0===s&&(s=.92);var r="",o=this.getFrame(t,e);if(o){var a=o.canvasData,h=n.create2D(this,a.width,a.height);h.getContext("2d").drawImage(o.source.image,a.x,a.y,a.width,a.height,0,0,a.width,a.height),r=h.toDataURL(i,s),n.remove(h)}return r},addImage:function(t,e,i){var n=null;return this.checkKey(t)&&(n=this.create(t,e),f.Image(n,0),i&&n.setDataSource(i),this.emit(l.ADD,t,n)),n},addRenderTexture:function(t,e){var i=null;return this.checkKey(t)&&((i=this.create(t,e)).add("__BASE",0,0,0,e.width,e.height),this.emit(l.ADD,t,i)),i},generate:function(t,e){if(this.checkKey(t)){var i=n.create(this,1,1);return e.canvas=i,c(e),this.addCanvas(t,i)}return null},createCanvas:function(t,e,i){if(void 0===e&&(e=256),void 0===i&&(i=256),this.checkKey(t)){var s=n.create(this,e,i,a.CANVAS,!0);return this.addCanvas(t,s)}return null},addCanvas:function(t,e,i){void 0===i&&(i=!1);var n=null;return i?n=new s(this,t,e,e.width,e.height):this.checkKey(t)&&(n=new s(this,t,e,e.width,e.height),this.list[t]=n,this.emit(l.ADD,t,n)),n},addAtlas:function(t,e,i,n){return Array.isArray(i.textures)||Array.isArray(i.frames)?this.addAtlasJSONArray(t,e,i,n):this.addAtlasJSONHash(t,e,i,n)},addAtlasJSONArray:function(t,e,i,n){var s=null;if(this.checkKey(t)){if(s=this.create(t,e),Array.isArray(i))for(var r=1===i.length,o=0;o=r.x&&t=r.y&&e=r.x&&t=r.y&&e0)&&(!!n.prototype.pause.call(this)&&(this.currentConfig.seek=this.audio.currentTime-(this.currentMarker?this.currentMarker.start:0),this.stopAndReleaseAudioTag(),this.emit(r.PAUSE,this),!0)))},resume:function(){return!this.manager.isLocked(this,"resume")&&(!(this.startTime>0)&&(!!n.prototype.resume.call(this)&&(!!this.pickAndPlayAudioTag()&&(this.emit(r.RESUME,this),!0))))},stop:function(){return!this.manager.isLocked(this,"stop")&&(!!n.prototype.stop.call(this)&&(this.stopAndReleaseAudioTag(),this.emit(r.STOP,this),!0))},pickAndPlayAudioTag:function(){if(!this.pickAudioTag())return this.reset(),!1;var t=this.currentConfig.seek,e=this.currentConfig.delay,i=(this.currentMarker?this.currentMarker.start:0)+t;return this.previousTime=i,this.audio.currentTime=i,this.applyConfig(),0===e?(this.startTime=0,this.audio.paused&&this.playCatchPromise()):(this.startTime=window.performance.now()+1e3*e,this.audio.paused||this.audio.pause()),this.resetConfig(),!0},pickAudioTag:function(){if(this.audio)return!0;for(var t=0;t0)this.startTime=n-this.manager.loopEndOffset?(this.audio.currentTime=i+Math.max(0,s-n),s=this.audio.currentTime):s=n)return this.reset(),this.stopAndReleaseAudioTag(),void this.emit(r.COMPLETE,this);this.previousTime=s}},destroy:function(){n.prototype.destroy.call(this),this.tags=null,this.audio&&this.stopAndReleaseAudioTag()},updateMute:function(){this.audio&&(this.audio.muted=this.currentConfig.mute||this.manager.mute)},updateVolume:function(){this.audio&&(this.audio.volume=this.currentConfig.volume*this.manager.volume)},calculateRate:function(){n.prototype.calculateRate.call(this),this.audio&&(this.audio.playbackRate=this.totalRate)},mute:{get:function(){return this.currentConfig.mute},set:function(t){this.currentConfig.mute=t,this.manager.isLocked(this,"mute",t)||(this.updateMute(),this.emit(r.MUTE,this,t))}},setMute:function(t){return this.mute=t,this},volume:{get:function(){return this.currentConfig.volume},set:function(t){this.currentConfig.volume=t,this.manager.isLocked(this,"volume",t)||(this.updateVolume(),this.emit(r.VOLUME,this,t))}},setVolume:function(t){return this.volume=t,this},rate:{get:function(){return this.currentConfig.rate},set:function(t){this.currentConfig.rate=t,this.manager.isLocked(this,r.RATE,t)||(this.calculateRate(),this.emit(r.RATE,this,t))}},setRate:function(t){return this.rate=t,this},detune:{get:function(){return this.currentConfig.detune},set:function(t){this.currentConfig.detune=t,this.manager.isLocked(this,r.DETUNE,t)||(this.calculateRate(),this.emit(r.DETUNE,this,t))}},setDetune:function(t){return this.detune=t,this},seek:{get:function(){return this.isPlaying?this.audio.currentTime-(this.currentMarker?this.currentMarker.start:0):this.isPaused?this.currentConfig.seek:0},set:function(t){this.manager.isLocked(this,"seek",t)||this.startTime>0||(this.isPlaying||this.isPaused)&&(t=Math.min(Math.max(0,t),this.duration),this.isPlaying?(this.previousTime=t,this.audio.currentTime=t):this.isPaused&&(this.currentConfig.seek=t),this.emit(r.SEEK,this,t))}},setSeek:function(t){return this.seek=t,this},loop:{get:function(){return this.currentConfig.loop},set:function(t){this.currentConfig.loop=t,this.manager.isLocked(this,"loop",t)||(this.audio&&(this.audio.loop=t),this.emit(r.LOOP,this,t))}},setLoop:function(t){return this.loop=t,this}});t.exports=o},function(t,e,i){var n=i(123),s=i(0),r=i(69),o=i(326),a=new s({Extends:n,initialize:function(t){this.override=!0,this.audioPlayDelay=.1,this.loopEndOffset=.05,this.onBlurPausedSounds=[],this.locked="ontouchstart"in window,this.lockedActionsQueue=this.locked?[]:null,this._mute=!1,this._volume=1,n.call(this,t)},add:function(t,e){var i=new o(this,t,e);return this.sounds.push(i),i},unlock:function(){this.locked=!1;var t=this;if(this.game.cache.audio.entries.each(function(e,i){for(var n=0;n-1&&(delete this.keys[n],this.scenes.splice(i,1),this._start.indexOf(n)>-1&&(i=this._start.indexOf(n),this._start.splice(i,1)),e.sys.destroy())}return this},bootScene:function(t){var e,i=t.sys,n=i.settings;t.init&&(t.init.call(t,n.data),n.status=s.INIT,n.isTransition&&i.events.emit(r.TRANSITION_INIT,n.transitionFrom,n.transitionDuration)),i.load&&(e=i.load).reset(),e&&t.preload?(t.preload.call(t),0===e.list.size?this.create(t):(n.status=s.LOADING,e.once(h.COMPLETE,this.loadComplete,this),e.start())):this.create(t)},loadComplete:function(t){var e=t.scene;this.game.sound.onBlurPausedSounds&&this.game.sound.unlock(),this.create(e)},payloadComplete:function(t){this.bootScene(t.scene)},update:function(t,e){this.processQueue(),this.isProcessing=!0;for(var i=this.scenes.length-1;i>=0;i--){var n=this.scenes[i].sys;n.settings.status>s.START&&n.settings.status<=s.RUNNING&&n.step(t,e)}},render:function(t){for(var e=0;e=s.LOADING&&i.settings.status0){var i=this.getScene(t);this.scenes.splice(e,1),this.scenes.unshift(i)}}return this},moveDown:function(t){if(this.isProcessing)this._queue.push({op:"moveDown",keyA:t,keyB:null});else{var e=this.getIndex(t);if(e>0){var i=e-1,n=this.getScene(t),s=this.getAt(i);this.scenes[e]=s,this.scenes[i]=n}}return this},moveUp:function(t){if(this.isProcessing)this._queue.push({op:"moveUp",keyA:t,keyB:null});else{var e=this.getIndex(t);if(ethis._parent.width&&(t=Math.max(this.minWidth,this._parent.width)),t},getNewHeight:function(t,e){return void 0===e&&(e=!0),t=n(t,this.minHeight,this.maxHeight),e&&this._parent&&t>this._parent.height&&(t=Math.max(this.minHeight,this._parent.height)),t},constrain:function(t,e,i){void 0===t&&(t=0),void 0===e&&(e=t),void 0===i&&(i=!0),t=this.getNewWidth(t),e=this.getNewHeight(e);var n=this.snapTo,s=0===e?1:t/e;return i&&this.aspectRatio>s||!i&&this.aspectRatio0&&(t=(e=r(e,n.y))*this.aspectRatio)):(i&&this.aspectRatios)&&(t=(e=r(e,n.y))*this.aspectRatio,n.x>0&&(e=(t=r(t,n.x))*(1/this.aspectRatio))),this._width=t,this._height=e,this},fitTo:function(t,e){return this.constrain(t,e,!0)},envelop:function(t,e){return this.constrain(t,e,!1)},setWidth:function(t){return this.setSize(t,this._height)},setHeight:function(t){return this.setSize(this._width,t)},toString:function(){return"[{ Size (width="+this._width+" height="+this._height+" aspectRatio="+this.aspectRatio+" aspectMode="+this.aspectMode+") }]"},copy:function(t){return t.setAspectMode(this.aspectMode),t.aspectRatio=this.aspectRatio,t.setSize(this.width,this.height)},destroy:function(){this._parent=null,this.snapTo=null},width:{get:function(){return this._width},set:function(t){this.setSize(t,this._height)}},height:{get:function(){return this._height},set:function(t){this.setSize(this._width,t)}}});a.NONE=0,a.WIDTH_CONTROLS_HEIGHT=1,a.HEIGHT_CONTROLS_WIDTH=2,a.FIT=3,a.ENVELOP=4,t.exports=a},function(t,e,i){t.exports={ENTER_FULLSCREEN:i(951),FULLSCREEN_UNSUPPORTED:i(950),LEAVE_FULLSCREEN:i(949),ORIENTATION_CHANGE:i(948),RESIZE:i(947)}},function(t,e,i){var n=i(178),s=i(0),r=i(11),o=i(334),a=i(26),h=i(946),l=i(345),u=i(350),c=i(1),d=i(10),f=i(333),p=i(98),g=i(3),v=new s({Extends:r,initialize:function(t){r.call(this),this.game=t,this.canvas,this.canvasBounds=new d,this.parent=null,this.parentIsWindow=!1,this.parentSize=new f,this.gameSize=new f,this.baseSize=new f,this.displaySize=new f,this.scaleMode=n.SCALE_MODE.NONE,this.resolution=1,this.zoom=1,this.displayScale=new g(1,1),this.autoRound=!1,this.autoCenter=n.CENTER.NO_CENTER,this.orientation=n.ORIENTATION.LANDSCAPE,this.fullscreen,this.fullscreenTarget=null,this._createdFullscreenTarget=!1,this.dirty=!1,this.resizeInterval=500,this._lastCheck=0,this._checkOrientation=!1,this.listeners={orientationChange:c,windowResize:c,fullScreenChange:c,fullScreenError:c}},preBoot:function(){this.parseConfig(this.game.config),this.game.events.once("boot",this.boot,this)},boot:function(){var t=this.game;this.canvas=t.canvas,this.fullscreen=t.device.fullscreen,this.scaleMode!==n.SCALE_MODE.RESIZE&&this.displaySize.setAspectMode(this.scaleMode),this.scaleMode===n.SCALE_MODE.NONE?this.resize(this.width,this.height):(this.getParentBounds(),this.parentSize.width>0&&this.parentSize.height>0&&this.displaySize.setParent(this.parentSize),this.refresh()),t.events.on(a.PRE_STEP,this.step,this),this.startListeners()},parseConfig:function(t){this.getParent(t),this.getParentBounds();var e=t.width,i=t.height,s=t.scaleMode,r=t.resolution,o=t.zoom,a=t.autoRound;if("string"==typeof e){var h=this.parentSize.width;0===h&&(h=window.innerWidth);var l=parseInt(e,10)/100;e=Math.floor(h*l)}if("string"==typeof i){var c=this.parentSize.height;0===c&&(c=window.innerHeight);var d=parseInt(i,10)/100;i=Math.floor(c*d)}this.resolution=1,this.scaleMode=s,this.autoRound=a,this.autoCenter=t.autoCenter,this.resizeInterval=t.resizeInterval,a&&(e=Math.floor(e),i=Math.floor(i)),this.gameSize.setSize(e,i),o===n.ZOOM.MAX_ZOOM&&(o=this.getMaxZoom()),this.zoom=o,this.baseSize.setSize(e*r,i*r),a&&(this.baseSize.width=Math.floor(this.baseSize.width),this.baseSize.height=Math.floor(this.baseSize.height)),t.minWidth>0&&this.displaySize.setMin(t.minWidth*o,t.minHeight*o),t.maxWidth>0&&this.displaySize.setMax(t.maxWidth*o,t.maxHeight*o),this.displaySize.setSize(e,i),this.orientation=u(e,i)},getParent:function(t){var e=t.parent;if(null!==e){if(this.parent=l(e),this.parentIsWindow=this.parent===document.body,t.expandParent&&t.scaleMode!==n.SCALE_MODE.NONE){var i=this.parent.getBoundingClientRect();(this.parentIsWindow||0===i.height)&&(document.documentElement.style.height="100%",document.body.style.height="100%",i=this.parent.getBoundingClientRect(),this.parentIsWindow||0!==i.height||(this.parent.style.overflow="hidden",this.parent.style.width="100%",this.parent.style.height="100%"))}t.fullscreenTarget&&!this.fullscreenTarget&&(this.fullscreenTarget=l(t.fullscreenTarget))}},getParentBounds:function(){if(!this.parent)return!1;var t=this.parentSize,e=this.parent.getBoundingClientRect();this.parentIsWindow&&this.game.device.os.iOS&&(e.height=h(!0));var i=this.resolution,n=e.width*i,s=e.height*i;return(t.width!==n||t.height!==s)&&(t.setSize(n,s),!0)},lockOrientation:function(t){var e=screen.lockOrientation||screen.mozLockOrientation||screen.msLockOrientation;return!!e&&e(t)},setParentSize:function(t,e){return this.parentSize.setSize(t,e),this.refresh()},setGameSize:function(t,e){var i=this.autoRound,n=this.resolution;return i&&(t=Math.floor(t),e=Math.floor(e)),this.gameSize.resize(t,e),this.baseSize.resize(t*n,e*n),this.updateBounds(),this.displayScale.set(t/this.canvasBounds.width,e/this.canvasBounds.height),this.emit(o.RESIZE,this.gameSize,this.baseSize,this.displaySize,this.resolution),this.updateOrientation(),this.refresh()},resize:function(t,e){var i=this.zoom,n=this.resolution,s=this.autoRound;s&&(t=Math.floor(t),e=Math.floor(e)),this.gameSize.resize(t,e),this.baseSize.resize(t*n,e*n),this.displaySize.setSize(t*i*n,e*i*n),this.canvas.width=this.baseSize.width,this.canvas.height=this.baseSize.height;var r=this.canvas.style,a=t*i,h=e*i;return s&&(a=Math.floor(a),h=Math.floor(h)),a===t&&h===e||(r.width=a+"px",r.height=h+"px"),this.getParentBounds(),this.updateCenter(),this.updateBounds(),this.displayScale.set(t/this.canvasBounds.width,e/this.canvasBounds.height),this.emit(o.RESIZE,this.gameSize,this.baseSize,this.displaySize,this.resolution),this.updateOrientation(),this},setZoom:function(t){return this.zoom=t,this.refresh()},setMaxZoom:function(){return this.zoom=this.getMaxZoom(),this.refresh()},refresh:function(){return this.updateScale(),this.updateBounds(),this.updateOrientation(),this.displayScale.set(this.baseSize.width/this.canvasBounds.width,this.baseSize.height/this.canvasBounds.height),this.emit(o.RESIZE,this.gameSize,this.baseSize,this.displaySize,this.resolution),this},updateOrientation:function(){if(this._checkOrientation){this._checkOrientation=!1;var t=u(this.width,this.height);t!==this.orientation&&(this.orientation=t,this.emit(o.ORIENTATION_CHANGE,t))}},updateScale:function(){var t,e,i=this.canvas.style,s=this.gameSize.width,r=this.gameSize.height,o=this.zoom,a=this.autoRound;this.scaleMode===n.SCALE_MODE.NONE?(this.displaySize.setSize(s*o*1,r*o*1),t=this.displaySize.width/1,e=this.displaySize.height/1,a&&(t=Math.floor(t),e=Math.floor(e)),o>1&&(i.width=t+"px",i.height=e+"px")):this.scaleMode===n.SCALE_MODE.RESIZE?(this.displaySize.setSize(this.parentSize.width,this.parentSize.height),this.gameSize.setSize(this.displaySize.width,this.displaySize.height),this.baseSize.setSize(1*this.displaySize.width,1*this.displaySize.height),t=this.displaySize.width/1,e=this.displaySize.height/1,a&&(t=Math.floor(t),e=Math.floor(e)),this.canvas.width=t,this.canvas.height=e):(this.displaySize.setSize(this.parentSize.width,this.parentSize.height),t=this.displaySize.width/1,e=this.displaySize.height/1,a&&(t=Math.floor(t),e=Math.floor(e)),i.width=t+"px",i.height=e+"px"),this.getParentBounds(),this.updateCenter()},getMaxZoom:function(){var t=p(this.parentSize.width,this.gameSize.width,0,!0),e=p(this.parentSize.height,this.gameSize.height,0,!0);return Math.max(Math.min(t,e),1)},updateCenter:function(){var t=this.autoCenter;if(t!==n.CENTER.NO_CENTER){var e=this.canvas,i=e.style,s=e.getBoundingClientRect(),r=s.width,o=s.height,a=Math.floor((this.parentSize.width-r)/2),h=Math.floor((this.parentSize.height-o)/2);t===n.CENTER.CENTER_HORIZONTALLY?h=0:t===n.CENTER.CENTER_VERTICALLY&&(a=0),i.marginLeft=a+"px",i.marginTop=h+"px"}},updateBounds:function(){var t=this.canvasBounds,e=this.canvas.getBoundingClientRect();t.x=e.left+(window.pageXOffset||0)-(document.documentElement.clientLeft||0),t.y=e.top+(window.pageYOffset||0)-(document.documentElement.clientTop||0),t.width=e.width,t.height=e.height},transformX:function(t){return(t-this.canvasBounds.left)*this.displayScale.x},transformY:function(t){return(t-this.canvasBounds.top)*this.displayScale.y},startFullscreen:function(t){void 0===t&&(t={navigationUI:"hide"});var e=this.fullscreen;if(e.available){if(!e.active){var i=this.getFullscreenTarget();e.keyboard?i[e.request](Element.ALLOW_KEYBOARD_INPUT):i[e.request](t),this.getParentBounds(),this.refresh(),this.emit(o.ENTER_FULLSCREEN)}}else this.emit(o.FULLSCREEN_UNSUPPORTED)},getFullscreenTarget:function(){if(!this.fullscreenTarget){var t=document.createElement("div");t.style.margin="0",t.style.padding="0",t.style.width="100%",t.style.height="100%",this.fullscreenTarget=t,this._createdFullscreenTarget=!0}this._createdFullscreenTarget&&(this.canvas.parentNode.insertBefore(this.fullscreenTarget,this.canvas),this.fullscreenTarget.appendChild(this.canvas));return this.fullscreenTarget},stopFullscreen:function(){var t=this.fullscreen;if(!t.available)return this.emit(o.FULLSCREEN_UNSUPPORTED),!1;if(t.active){if(document[t.cancel](),this._createdFullscreenTarget){var e=this.fullscreenTarget;if(e&&e.parentNode){var i=e.parentNode;i.insertBefore(this.canvas,e),i.removeChild(e)}}this.emit(o.LEAVE_FULLSCREEN),this.refresh()}},toggleFullscreen:function(t){this.fullscreen.active?this.stopFullscreen():this.startFullscreen(t)},startListeners:function(){var t=this,e=this.listeners;if(e.orientationChange=function(){t._checkOrientation=!0,t.dirty=!0},e.windowResize=function(){t.dirty=!0},window.addEventListener("orientationchange",e.orientationChange,!1),window.addEventListener("resize",e.windowResize,!1),this.allowFullScreen){e.fullScreenChange=function(e){return t.onFullScreenChange(e)},e.fullScreenError=function(e){return t.onFullScreenError(e)};["webkit","moz",""].forEach(function(t){document.addEventListener(t+"fullscreenchange",e.fullScreenChange,!1),document.addEventListener(t+"fullscreenerror",e.fullScreenError,!1)}),document.addEventListener("MSFullscreenChange",e.fullScreenChange,!1),document.addEventListener("MSFullscreenError",e.fullScreenError,!1)}},onFullScreenChange:function(){},onFullScreenError:function(){},step:function(t,e){this.parent&&(this._lastCheck+=e,(this.dirty||this._lastCheck>this.resizeInterval)&&(this.getParentBounds()&&this.refresh(),this.dirty=!1,this._lastCheck=0))},stopListeners:function(){var t=this.listeners;window.removeEventListener("orientationchange",t.orientationChange,!1),window.removeEventListener("resize",t.windowResize,!1);["webkit","moz",""].forEach(function(e){document.removeEventListener(e+"fullscreenchange",t.fullScreenChange,!1),document.removeEventListener(e+"fullscreenerror",t.fullScreenError,!1)}),document.removeEventListener("MSFullscreenChange",t.fullScreenChange,!1),document.removeEventListener("MSFullscreenError",t.fullScreenError,!1)},destroy:function(){this.removeAllListeners(),this.stopListeners(),this.game=null,this.canvas=null,this.canvasBounds=null,this.parent=null,this.parentSize.destroy(),this.gameSize.destroy(),this.baseSize.destroy(),this.displaySize.destroy(),this.fullscreenTarget=null},isFullscreen:{get:function(){return this.fullscreen.active}},width:{get:function(){return this.gameSize.width}},height:{get:function(){return this.gameSize.height}},isPortrait:{get:function(){return this.orientation===n.ORIENTATION.PORTRAIT}},isLandscape:{get:function(){return this.orientation===n.ORIENTATION.LANDSCAPE}},isGamePortrait:{get:function(){return this.height>this.width}},isGameLandscape:{get:function(){return this.width>this.height}}});t.exports=v},function(t,e,i){var n=i(0),s=i(26),r=i(11),o=i(7),a=i(14),h=i(5),l=i(2),u=i(17),c=i(177),d=new n({Extends:r,initialize:function(t){r.call(this),this.game=t,this.plugins=[],this.scenePlugins=[],this._pendingGlobal=[],this._pendingScene=[],t.isBooted?this.boot():t.events.once(s.BOOT,this.boot,this)},boot:function(){var t,e,i,n,r,o,a,h=this.game.config,u=h.installGlobalPlugins;for(u=u.concat(this._pendingGlobal),t=0;t-1&&e.preventDefault()}},this.onKeyUp=function(e){if(!e.defaultPrevented&&t.enabled&&t.manager){t.queue.push(e),t.manager.useQueue||t.manager.events.emit(o.MANAGER_PROCESS);var i=e.altKey||e.ctrlKey||e.shiftKey||e.metaKey;t.preventDefault&&!i&&t.captures.indexOf(e.keyCode)>-1&&e.preventDefault()}};var e=this.target;e&&(e.addEventListener("keydown",this.onKeyDown,!1),e.addEventListener("keyup",this.onKeyUp,!1),this.enabled=!0)},stopListeners:function(){var t=this.target;t.removeEventListener("keydown",this.onKeyDown,!1),t.removeEventListener("keyup",this.onKeyUp,!1),this.enabled=!1},postUpdate:function(){this.queue=[]},addCapture:function(t){"string"==typeof t&&(t=t.split(",")),Array.isArray(t)||(t=[t]);for(var e=this.captures,i=0;i0},removeCapture:function(t){"string"==typeof t&&(t=t.split(",")),Array.isArray(t)||(t=[t]);for(var e=this.captures,i=0;i0},clearCaptures:function(){this.captures=[],this.preventDefault=!1},destroy:function(){this.stopListeners(),this.clearCaptures(),this.queue=[],this.manager.game.events.off(r.POST_RENDER,this.postUpdate,this),this.target=null,this.enabled=!1,this.manager=null}});t.exports=l},function(t,e){t.exports={MOUSE_DOWN:0,MOUSE_MOVE:1,MOUSE_UP:2,TOUCH_START:3,TOUCH_MOVE:4,TOUCH_END:5,TOUCH_CANCEL:7,POINTER_LOCK_CHANGE:6}},function(t,e,i){var n=i(0),s=i(341),r=i(11),o=i(52),a=i(26),h=i(340),l=i(339),u=i(338),c=i(337),d=i(41),f=i(371),p=new n({initialize:function(t,e){this.game=t,this.scaleManager,this.canvas,this.config=e,this.enabled=!0,this.events=new r,this.queue=[],this.domCallbacks={up:[],down:[],move:[],upOnce:[],downOnce:[],moveOnce:[]},this.isOver=!0,this._emitIsOverEvent=!1,this._hasUpCallback=!1,this._hasDownCallback=!1,this._hasMoveCallback=!1,this._customCursor="",this._setCursor=0,this.defaultCursor="",this.keyboard=e.inputKeyboard?new h(this):null,this.mouse=e.inputMouse?new l(this):null,this.touch=e.inputTouch?new c(this):null,this.pointers=[],this.pointersTotal=e.inputActivePointers,e.inputTouch&&1===this.pointersTotal&&(this.pointersTotal=2);for(var i=0;i<=this.pointersTotal;i++){var n=new u(this,i);n.smoothFactor=e.inputSmoothFactor,this.pointers.push(n)}this.mousePointer=e.inputMouse?this.pointers[0]:null,this.activePointer=this.pointers[0],this.dirty=!1,this.globalTopOnly=!0,this.ignoreEvents=!1,this.useQueue=e.inputQueue,this._updatedThisFrame=!1,this._tempPoint={x:0,y:0},this._tempHitTest=[],this._tempMatrix=new d,this._tempMatrix2=new d,t.events.once(a.BOOT,this.boot,this)},boot:function(){this.canvas=this.game.canvas,this.scaleManager=this.game.scale,this.events.emit(o.MANAGER_BOOT),this.useQueue&&this.game.events.on(a.PRE_STEP,this.legacyUpdate,this),this.game.events.on(a.POST_STEP,this.postUpdate,this),this.game.events.once(a.DESTROY,this.destroy,this)},setCanvasOver:function(t){this.isOver=!0,this._emitIsOverEvent=t},setCanvasOut:function(t){this.isOver=!1,this._emitIsOverEvent=t},update:function(t){this._updatedThisFrame||(this._setCursor=0,this._updatedThisFrame=!0),this.events.emit(o.MANAGER_UPDATE),this.ignoreEvents=!1,this.dirty=!0;for(var e=this.pointers,i=0;i10&&(t=10-this.pointersTotal);for(var i=0;i0},updateInputPlugins:function(t,e){for(var i=this.game.scene.getScenes(!0,!0),n=0;ni.width?n.PORTRAIT:n.LANDSCAPE;if("number"==typeof window.orientation)return 0===window.orientation||180===window.orientation?n.PORTRAIT:n.LANDSCAPE;if(window.matchMedia){if(window.matchMedia("(orientation: portrait)").matches)return n.PORTRAIT;if(window.matchMedia("(orientation: landscape)").matches)return n.LANDSCAPE}return e>t?n.PORTRAIT:n.LANDSCAPE}},function(t,e,i){var n=i(99);t.exports=function(t){if("complete"!==document.readyState&&"interactive"!==document.readyState){var e=function(){document.removeEventListener("deviceready",e,!0),document.removeEventListener("DOMContentLoaded",e,!0),window.removeEventListener("load",e,!0),t()};document.body?n.cordova&&!n.cocoonJS?document.addEventListener("deviceready",e,!1):(document.addEventListener("DOMContentLoaded",e,!0),window.addEventListener("load",e,!0)):window.setTimeout(e,20)}else t()}},function(t,e){t.exports=function(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t}},function(t,e){t.exports=function(t){var e=t.toString(16);return 1===e.length?"0"+e:e}},function(t,e,i){var n=i(32);n.ColorToRGBA=i(1005),n.ComponentToHex=i(353),n.GetColor=i(191),n.GetColor32=i(409),n.HexStringToColor=i(410),n.HSLToColor=i(1004),n.HSVColorWheel=i(1003),n.HSVToRGB=i(190),n.HueToComponent=i(352),n.IntegerToColor=i(407),n.IntegerToRGB=i(406),n.Interpolate=i(1002),n.ObjectToColor=i(405),n.RandomRGB=i(1001),n.RGBStringToColor=i(404),n.RGBToHSV=i(408),n.RGBToString=i(1e3),n.ValueToColor=i(192),t.exports=n},function(t,e,i){var n=i(185),s=i(0),r=i(76),o=i(3),a=new s({Extends:r,initialize:function(t){void 0===t&&(t=[]),r.call(this,"SplineCurve"),this.points=[],this.addPoints(t)},addPoints:function(t){for(var e=0;ei.length-2?i.length-1:r+1],c=i[r>i.length-3?i.length-1:r+2];return e.set(n(a,h.x,l.x,u.x,c.x),n(a,h.y,l.y,u.y,c.y))},toJSON:function(){for(var t=[],e=0;ei;)n-=i;n0||!this.inFocus)&&(this._coolDown--,r=Math.min(r,this._target)),r>this._min&&(r=n[i],r=Math.min(r,this._min)),n[i]=r,this.deltaIndex++,this.deltaIndex>s&&(this.deltaIndex=0);for(var o=0,a=0;athis.nextFpsUpdate&&(this.actualFps=.25*this.framesThisSecond+.75*this.actualFps,this.nextFpsUpdate=t+1e3,this.framesThisSecond=0),this.framesThisSecond++;var h=o/this._target;this.callback(t,o,h),this.lastTime=t,this.frame++},tick:function(){this.step(window.performance.now())},sleep:function(){this.running&&(this.raf.stop(),this.running=!1)},wake:function(t){this.running?this.sleep():t&&(this.startTime+=-this.lastTime+(this.lastTime+window.performance.now())),this.raf.start(this.step.bind(this),this.useRAF),this.running=!0,this.step(window.performance.now())},stop:function(){return this.running=!1,this.started=!1,this.raf.stop(),this},destroy:function(){this.stop(),this.callback=r,this.raf=null,this.game=null}});t.exports=a},function(t,e,i){var n=i(28);t.exports=function(t){var e=t.config;if(!e.hideBanner){var i="WebGL";e.renderType===n.CANVAS?i="Canvas":e.renderType===n.HEADLESS&&(i="Headless");var s,r=e.audio,o=t.device.audio;if(s=!o.webAudio||r&&r.disableWebAudio?r&&r.noAudio||!o.webAudio&&!o.audioData?"No Audio":"HTML5 Audio":"Web Audio",t.device.browser.ie)window.console&&console.log("Phaser v"+n.VERSION+" / https://phaser.io");else{var a,h="",l=[h];Array.isArray(e.bannerBackgroundColor)?(e.bannerBackgroundColor.forEach(function(t){h=h.concat("%c "),l.push("background: "+t),a=t}),l[l.length-1]="color: "+e.bannerTextColor+"; background: "+a):(h=h.concat("%c "),l.push("color: "+e.bannerTextColor+"; background: "+e.bannerBackgroundColor)),l.push("background: #fff"),e.gameTitle&&(h=h.concat(e.gameTitle),e.gameVersion&&(h=h.concat(" v"+e.gameVersion)),e.hidePhaser||(h=h.concat(" / "))),e.hidePhaser||(h=h.concat("Phaser v"+n.VERSION+" ("+i+" | "+s+")")),h=h.concat(" %c "+e.gameURL),l[0]=h,console.log.apply(console,l)}}}},function(t,e){t.exports={setCrisp:function(t){return["optimizeSpeed","crisp-edges","-moz-crisp-edges","-webkit-optimize-contrast","optimize-contrast","pixelated"].forEach(function(e){t.style["image-rendering"]=e}),t.style.msInterpolationMode="nearest-neighbor",t},setBicubic:function(t){return t.style["image-rendering"]="auto",t.style.msInterpolationMode="bicubic",t}}},function(t,e,i){var n=i(366),s=i(24),r=i(28),o=i(187);t.exports=function(t){var e=t.config;if((e.customEnvironment||e.canvas)&&e.renderType===r.AUTO)throw new Error("Must set explicit renderType in custom environment");if(!e.customEnvironment&&!e.canvas&&e.renderType!==r.HEADLESS)if(e.renderType===r.CANVAS||e.renderType!==r.CANVAS&&!o.webGL){if(!o.canvas)throw new Error("Cannot create Canvas or WebGL context, aborting.");e.renderType=r.CANVAS}else e.renderType=r.WEBGL;e.antialias||s.disableSmoothing();var a,h,l=t.scale.baseSize,u=l.width,c=l.height;e.canvas?(t.canvas=e.canvas,t.canvas.width=u,t.canvas.height=c):t.canvas=s.create(t,u,c,e.renderType),e.canvasStyle&&(t.canvas.style=e.canvasStyle),e.antialias||n.setCrisp(t.canvas),e.renderType!==r.HEADLESS&&(a=i(459),h=i(456),e.renderType===r.WEBGL?t.renderer=new h(t):(t.renderer=new a(t),t.context=t.renderer.gameContext))}},function(t,e,i){var n=i(0),s=i(182),r=i(370),o=new Int8Array([1,2,0]),a=new Float32Array([0,0,0]),h=new s(1,0,0),l=new s(0,1,0),u=new s,c=new r,d=new n({initialize:function(t,e,i,n){"object"==typeof t?(this.x=t.x||0,this.y=t.y||0,this.z=t.z||0,this.w=t.w||0):(this.x=t||0,this.y=e||0,this.z=i||0,this.w=n||0)},copy:function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=t.w,this},set:function(t,e,i,n){return"object"==typeof t?(this.x=t.x||0,this.y=t.y||0,this.z=t.z||0,this.w=t.w||0):(this.x=t||0,this.y=e||0,this.z=i||0,this.w=n||0),this},add:function(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this},subtract:function(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this},scale:function(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this},length:function(){var t=this.x,e=this.y,i=this.z,n=this.w;return Math.sqrt(t*t+e*e+i*i+n*n)},lengthSq:function(){var t=this.x,e=this.y,i=this.z,n=this.w;return t*t+e*e+i*i+n*n},normalize:function(){var t=this.x,e=this.y,i=this.z,n=this.w,s=t*t+e*e+i*i+n*n;return s>0&&(s=1/Math.sqrt(s),this.x=t*s,this.y=e*s,this.z=i*s,this.w=n*s),this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w},lerp:function(t,e){void 0===e&&(e=0);var i=this.x,n=this.y,s=this.z,r=this.w;return this.x=i+e*(t.x-i),this.y=n+e*(t.y-n),this.z=s+e*(t.z-s),this.w=r+e*(t.w-r),this},rotationTo:function(t,e){var i=t.x*e.x+t.y*e.y+t.z*e.z;return i<-.999999?(u.copy(h).cross(t).length()<1e-6&&u.copy(l).cross(t),u.normalize(),this.setAxisAngle(u,Math.PI)):i>.999999?(this.x=0,this.y=0,this.z=0,this.w=1,this):(u.copy(t).cross(e),this.x=u.x,this.y=u.y,this.z=u.z,this.w=1+i,this.normalize())},setAxes:function(t,e,i){var n=c.val;return n[0]=e.x,n[3]=e.y,n[6]=e.z,n[1]=i.x,n[4]=i.y,n[7]=i.z,n[2]=-t.x,n[5]=-t.y,n[8]=-t.z,this.fromMat3(c).normalize()},identity:function(){return this.x=0,this.y=0,this.z=0,this.w=1,this},setAxisAngle:function(t,e){e*=.5;var i=Math.sin(e);return this.x=i*t.x,this.y=i*t.y,this.z=i*t.z,this.w=Math.cos(e),this},multiply:function(t){var e=this.x,i=this.y,n=this.z,s=this.w,r=t.x,o=t.y,a=t.z,h=t.w;return this.x=e*h+s*r+i*a-n*o,this.y=i*h+s*o+n*r-e*a,this.z=n*h+s*a+e*o-i*r,this.w=s*h-e*r-i*o-n*a,this},slerp:function(t,e){var i=this.x,n=this.y,s=this.z,r=this.w,o=t.x,a=t.y,h=t.z,l=t.w,u=i*o+n*a+s*h+r*l;u<0&&(u=-u,o=-o,a=-a,h=-h,l=-l);var c=1-e,d=e;if(1-u>1e-6){var f=Math.acos(u),p=Math.sin(f);c=Math.sin((1-e)*f)/p,d=Math.sin(e*f)/p}return this.x=c*i+d*o,this.y=c*n+d*a,this.z=c*s+d*h,this.w=c*r+d*l,this},invert:function(){var t=this.x,e=this.y,i=this.z,n=this.w,s=t*t+e*e+i*i+n*n,r=s?1/s:0;return this.x=-t*r,this.y=-e*r,this.z=-i*r,this.w=n*r,this},conjugate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},rotateX:function(t){t*=.5;var e=this.x,i=this.y,n=this.z,s=this.w,r=Math.sin(t),o=Math.cos(t);return this.x=e*o+s*r,this.y=i*o+n*r,this.z=n*o-i*r,this.w=s*o-e*r,this},rotateY:function(t){t*=.5;var e=this.x,i=this.y,n=this.z,s=this.w,r=Math.sin(t),o=Math.cos(t);return this.x=e*o-n*r,this.y=i*o+s*r,this.z=n*o+e*r,this.w=s*o-i*r,this},rotateZ:function(t){t*=.5;var e=this.x,i=this.y,n=this.z,s=this.w,r=Math.sin(t),o=Math.cos(t);return this.x=e*o+i*r,this.y=i*o-e*r,this.z=n*o+s*r,this.w=s*o-n*r,this},calculateW:function(){var t=this.x,e=this.y,i=this.z;return this.w=-Math.sqrt(1-t*t-e*e-i*i),this},fromMat3:function(t){var e,i=t.val,n=i[0]+i[4]+i[8];if(n>0)e=Math.sqrt(n+1),this.w=.5*e,e=.5/e,this.x=(i[7]-i[5])*e,this.y=(i[2]-i[6])*e,this.z=(i[3]-i[1])*e;else{var s=0;i[4]>i[0]&&(s=1),i[8]>i[3*s+s]&&(s=2);var r=o[s],h=o[r];e=Math.sqrt(i[3*s+s]-i[3*r+r]-i[3*h+h]+1),a[s]=.5*e,e=.5/e,a[r]=(i[3*r+s]+i[3*s+r])*e,a[h]=(i[3*h+s]+i[3*s+h])*e,this.x=a[0],this.y=a[1],this.z=a[2],this.w=(i[3*h+r]-i[3*r+h])*e}return this}});t.exports=d},function(t,e,i){var n=new(i(0))({initialize:function(t){this.val=new Float32Array(16),t?this.copy(t):this.identity()},clone:function(){return new n(this)},set:function(t){return this.copy(t)},copy:function(t){var e=this.val,i=t.val;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this},fromArray:function(t){var e=this.val;return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],this},zero:function(){var t=this.val;return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=0,this},xyz:function(t,e,i){this.identity();var n=this.val;return n[12]=t,n[13]=e,n[14]=i,this},scaling:function(t,e,i){this.zero();var n=this.val;return n[0]=t,n[5]=e,n[10]=i,n[15]=1,this},identity:function(){var t=this.val;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,this},transpose:function(){var t=this.val,e=t[1],i=t[2],n=t[3],s=t[6],r=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=e,t[6]=t[9],t[7]=t[13],t[8]=i,t[9]=s,t[11]=t[14],t[12]=n,t[13]=r,t[14]=o,this},invert:function(){var t=this.val,e=t[0],i=t[1],n=t[2],s=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8],u=t[9],c=t[10],d=t[11],f=t[12],p=t[13],g=t[14],v=t[15],y=e*o-i*r,m=e*a-n*r,x=e*h-s*r,T=i*a-n*o,w=i*h-s*o,b=n*h-s*a,S=l*p-u*f,_=l*g-c*f,A=l*v-d*f,E=u*g-c*p,C=u*v-d*p,M=c*v-d*g,P=y*M-m*C+x*E+T*A-w*_+b*S;return P?(P=1/P,t[0]=(o*M-a*C+h*E)*P,t[1]=(n*C-i*M-s*E)*P,t[2]=(p*b-g*w+v*T)*P,t[3]=(c*w-u*b-d*T)*P,t[4]=(a*A-r*M-h*_)*P,t[5]=(e*M-n*A+s*_)*P,t[6]=(g*x-f*b-v*m)*P,t[7]=(l*b-c*x+d*m)*P,t[8]=(r*C-o*A+h*S)*P,t[9]=(i*A-e*C-s*S)*P,t[10]=(f*w-p*x+v*y)*P,t[11]=(u*x-l*w-d*y)*P,t[12]=(o*_-r*E-a*S)*P,t[13]=(e*E-i*_+n*S)*P,t[14]=(p*m-f*T-g*y)*P,t[15]=(l*T-u*m+c*y)*P,this):null},adjoint:function(){var t=this.val,e=t[0],i=t[1],n=t[2],s=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8],u=t[9],c=t[10],d=t[11],f=t[12],p=t[13],g=t[14],v=t[15];return t[0]=o*(c*v-d*g)-u*(a*v-h*g)+p*(a*d-h*c),t[1]=-(i*(c*v-d*g)-u*(n*v-s*g)+p*(n*d-s*c)),t[2]=i*(a*v-h*g)-o*(n*v-s*g)+p*(n*h-s*a),t[3]=-(i*(a*d-h*c)-o*(n*d-s*c)+u*(n*h-s*a)),t[4]=-(r*(c*v-d*g)-l*(a*v-h*g)+f*(a*d-h*c)),t[5]=e*(c*v-d*g)-l*(n*v-s*g)+f*(n*d-s*c),t[6]=-(e*(a*v-h*g)-r*(n*v-s*g)+f*(n*h-s*a)),t[7]=e*(a*d-h*c)-r*(n*d-s*c)+l*(n*h-s*a),t[8]=r*(u*v-d*p)-l*(o*v-h*p)+f*(o*d-h*u),t[9]=-(e*(u*v-d*p)-l*(i*v-s*p)+f*(i*d-s*u)),t[10]=e*(o*v-h*p)-r*(i*v-s*p)+f*(i*h-s*o),t[11]=-(e*(o*d-h*u)-r*(i*d-s*u)+l*(i*h-s*o)),t[12]=-(r*(u*g-c*p)-l*(o*g-a*p)+f*(o*c-a*u)),t[13]=e*(u*g-c*p)-l*(i*g-n*p)+f*(i*c-n*u),t[14]=-(e*(o*g-a*p)-r*(i*g-n*p)+f*(i*a-n*o)),t[15]=e*(o*c-a*u)-r*(i*c-n*u)+l*(i*a-n*o),this},determinant:function(){var t=this.val,e=t[0],i=t[1],n=t[2],s=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8],u=t[9],c=t[10],d=t[11],f=t[12],p=t[13],g=t[14],v=t[15];return(e*o-i*r)*(c*v-d*g)-(e*a-n*r)*(u*v-d*p)+(e*h-s*r)*(u*g-c*p)+(i*a-n*o)*(l*v-d*f)-(i*h-s*o)*(l*g-c*f)+(n*h-s*a)*(l*p-u*f)},multiply:function(t){var e=this.val,i=e[0],n=e[1],s=e[2],r=e[3],o=e[4],a=e[5],h=e[6],l=e[7],u=e[8],c=e[9],d=e[10],f=e[11],p=e[12],g=e[13],v=e[14],y=e[15],m=t.val,x=m[0],T=m[1],w=m[2],b=m[3];return e[0]=x*i+T*o+w*u+b*p,e[1]=x*n+T*a+w*c+b*g,e[2]=x*s+T*h+w*d+b*v,e[3]=x*r+T*l+w*f+b*y,x=m[4],T=m[5],w=m[6],b=m[7],e[4]=x*i+T*o+w*u+b*p,e[5]=x*n+T*a+w*c+b*g,e[6]=x*s+T*h+w*d+b*v,e[7]=x*r+T*l+w*f+b*y,x=m[8],T=m[9],w=m[10],b=m[11],e[8]=x*i+T*o+w*u+b*p,e[9]=x*n+T*a+w*c+b*g,e[10]=x*s+T*h+w*d+b*v,e[11]=x*r+T*l+w*f+b*y,x=m[12],T=m[13],w=m[14],b=m[15],e[12]=x*i+T*o+w*u+b*p,e[13]=x*n+T*a+w*c+b*g,e[14]=x*s+T*h+w*d+b*v,e[15]=x*r+T*l+w*f+b*y,this},multiplyLocal:function(t){var e=[],i=this.val,n=t.val;return e[0]=i[0]*n[0]+i[1]*n[4]+i[2]*n[8]+i[3]*n[12],e[1]=i[0]*n[1]+i[1]*n[5]+i[2]*n[9]+i[3]*n[13],e[2]=i[0]*n[2]+i[1]*n[6]+i[2]*n[10]+i[3]*n[14],e[3]=i[0]*n[3]+i[1]*n[7]+i[2]*n[11]+i[3]*n[15],e[4]=i[4]*n[0]+i[5]*n[4]+i[6]*n[8]+i[7]*n[12],e[5]=i[4]*n[1]+i[5]*n[5]+i[6]*n[9]+i[7]*n[13],e[6]=i[4]*n[2]+i[5]*n[6]+i[6]*n[10]+i[7]*n[14],e[7]=i[4]*n[3]+i[5]*n[7]+i[6]*n[11]+i[7]*n[15],e[8]=i[8]*n[0]+i[9]*n[4]+i[10]*n[8]+i[11]*n[12],e[9]=i[8]*n[1]+i[9]*n[5]+i[10]*n[9]+i[11]*n[13],e[10]=i[8]*n[2]+i[9]*n[6]+i[10]*n[10]+i[11]*n[14],e[11]=i[8]*n[3]+i[9]*n[7]+i[10]*n[11]+i[11]*n[15],e[12]=i[12]*n[0]+i[13]*n[4]+i[14]*n[8]+i[15]*n[12],e[13]=i[12]*n[1]+i[13]*n[5]+i[14]*n[9]+i[15]*n[13],e[14]=i[12]*n[2]+i[13]*n[6]+i[14]*n[10]+i[15]*n[14],e[15]=i[12]*n[3]+i[13]*n[7]+i[14]*n[11]+i[15]*n[15],this.fromArray(e)},translate:function(t){var e=t.x,i=t.y,n=t.z,s=this.val;return s[12]=s[0]*e+s[4]*i+s[8]*n+s[12],s[13]=s[1]*e+s[5]*i+s[9]*n+s[13],s[14]=s[2]*e+s[6]*i+s[10]*n+s[14],s[15]=s[3]*e+s[7]*i+s[11]*n+s[15],this},translateXYZ:function(t,e,i){var n=this.val;return n[12]=n[0]*t+n[4]*e+n[8]*i+n[12],n[13]=n[1]*t+n[5]*e+n[9]*i+n[13],n[14]=n[2]*t+n[6]*e+n[10]*i+n[14],n[15]=n[3]*t+n[7]*e+n[11]*i+n[15],this},scale:function(t){var e=t.x,i=t.y,n=t.z,s=this.val;return s[0]=s[0]*e,s[1]=s[1]*e,s[2]=s[2]*e,s[3]=s[3]*e,s[4]=s[4]*i,s[5]=s[5]*i,s[6]=s[6]*i,s[7]=s[7]*i,s[8]=s[8]*n,s[9]=s[9]*n,s[10]=s[10]*n,s[11]=s[11]*n,this},scaleXYZ:function(t,e,i){var n=this.val;return n[0]=n[0]*t,n[1]=n[1]*t,n[2]=n[2]*t,n[3]=n[3]*t,n[4]=n[4]*e,n[5]=n[5]*e,n[6]=n[6]*e,n[7]=n[7]*e,n[8]=n[8]*i,n[9]=n[9]*i,n[10]=n[10]*i,n[11]=n[11]*i,this},makeRotationAxis:function(t,e){var i=Math.cos(e),n=Math.sin(e),s=1-i,r=t.x,o=t.y,a=t.z,h=s*r,l=s*o;return this.fromArray([h*r+i,h*o-n*a,h*a+n*o,0,h*o+n*a,l*o+i,l*a-n*r,0,h*a-n*o,l*a+n*r,s*a*a+i,0,0,0,0,1]),this},rotate:function(t,e){var i=this.val,n=e.x,s=e.y,r=e.z,o=Math.sqrt(n*n+s*s+r*r);if(Math.abs(o)<1e-6)return null;n*=o=1/o,s*=o,r*=o;var a=Math.sin(t),h=Math.cos(t),l=1-h,u=i[0],c=i[1],d=i[2],f=i[3],p=i[4],g=i[5],v=i[6],y=i[7],m=i[8],x=i[9],T=i[10],w=i[11],b=n*n*l+h,S=s*n*l+r*a,_=r*n*l-s*a,A=n*s*l-r*a,E=s*s*l+h,C=r*s*l+n*a,M=n*r*l+s*a,P=s*r*l-n*a,O=r*r*l+h;return i[0]=u*b+p*S+m*_,i[1]=c*b+g*S+x*_,i[2]=d*b+v*S+T*_,i[3]=f*b+y*S+w*_,i[4]=u*A+p*E+m*C,i[5]=c*A+g*E+x*C,i[6]=d*A+v*E+T*C,i[7]=f*A+y*E+w*C,i[8]=u*M+p*P+m*O,i[9]=c*M+g*P+x*O,i[10]=d*M+v*P+T*O,i[11]=f*M+y*P+w*O,this},rotateX:function(t){var e=this.val,i=Math.sin(t),n=Math.cos(t),s=e[4],r=e[5],o=e[6],a=e[7],h=e[8],l=e[9],u=e[10],c=e[11];return e[4]=s*n+h*i,e[5]=r*n+l*i,e[6]=o*n+u*i,e[7]=a*n+c*i,e[8]=h*n-s*i,e[9]=l*n-r*i,e[10]=u*n-o*i,e[11]=c*n-a*i,this},rotateY:function(t){var e=this.val,i=Math.sin(t),n=Math.cos(t),s=e[0],r=e[1],o=e[2],a=e[3],h=e[8],l=e[9],u=e[10],c=e[11];return e[0]=s*n-h*i,e[1]=r*n-l*i,e[2]=o*n-u*i,e[3]=a*n-c*i,e[8]=s*i+h*n,e[9]=r*i+l*n,e[10]=o*i+u*n,e[11]=a*i+c*n,this},rotateZ:function(t){var e=this.val,i=Math.sin(t),n=Math.cos(t),s=e[0],r=e[1],o=e[2],a=e[3],h=e[4],l=e[5],u=e[6],c=e[7];return e[0]=s*n+h*i,e[1]=r*n+l*i,e[2]=o*n+u*i,e[3]=a*n+c*i,e[4]=h*n-s*i,e[5]=l*n-r*i,e[6]=u*n-o*i,e[7]=c*n-a*i,this},fromRotationTranslation:function(t,e){var i=this.val,n=t.x,s=t.y,r=t.z,o=t.w,a=n+n,h=s+s,l=r+r,u=n*a,c=n*h,d=n*l,f=s*h,p=s*l,g=r*l,v=o*a,y=o*h,m=o*l;return i[0]=1-(f+g),i[1]=c+m,i[2]=d-y,i[3]=0,i[4]=c-m,i[5]=1-(u+g),i[6]=p+v,i[7]=0,i[8]=d+y,i[9]=p-v,i[10]=1-(u+f),i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this},fromQuat:function(t){var e=this.val,i=t.x,n=t.y,s=t.z,r=t.w,o=i+i,a=n+n,h=s+s,l=i*o,u=i*a,c=i*h,d=n*a,f=n*h,p=s*h,g=r*o,v=r*a,y=r*h;return e[0]=1-(d+p),e[1]=u+y,e[2]=c-v,e[3]=0,e[4]=u-y,e[5]=1-(l+p),e[6]=f+g,e[7]=0,e[8]=c+v,e[9]=f-g,e[10]=1-(l+d),e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this},frustum:function(t,e,i,n,s,r){var o=this.val,a=1/(e-t),h=1/(n-i),l=1/(s-r);return o[0]=2*s*a,o[1]=0,o[2]=0,o[3]=0,o[4]=0,o[5]=2*s*h,o[6]=0,o[7]=0,o[8]=(e+t)*a,o[9]=(n+i)*h,o[10]=(r+s)*l,o[11]=-1,o[12]=0,o[13]=0,o[14]=r*s*2*l,o[15]=0,this},perspective:function(t,e,i,n){var s=this.val,r=1/Math.tan(t/2),o=1/(i-n);return s[0]=r/e,s[1]=0,s[2]=0,s[3]=0,s[4]=0,s[5]=r,s[6]=0,s[7]=0,s[8]=0,s[9]=0,s[10]=(n+i)*o,s[11]=-1,s[12]=0,s[13]=0,s[14]=2*n*i*o,s[15]=0,this},perspectiveLH:function(t,e,i,n){var s=this.val;return s[0]=2*i/t,s[1]=0,s[2]=0,s[3]=0,s[4]=0,s[5]=2*i/e,s[6]=0,s[7]=0,s[8]=0,s[9]=0,s[10]=-n/(i-n),s[11]=1,s[12]=0,s[13]=0,s[14]=i*n/(i-n),s[15]=0,this},ortho:function(t,e,i,n,s,r){var o=this.val,a=t-e,h=i-n,l=s-r;return a=0===a?a:1/a,h=0===h?h:1/h,l=0===l?l:1/l,o[0]=-2*a,o[1]=0,o[2]=0,o[3]=0,o[4]=0,o[5]=-2*h,o[6]=0,o[7]=0,o[8]=0,o[9]=0,o[10]=2*l,o[11]=0,o[12]=(t+e)*a,o[13]=(n+i)*h,o[14]=(r+s)*l,o[15]=1,this},lookAt:function(t,e,i){var n=this.val,s=t.x,r=t.y,o=t.z,a=i.x,h=i.y,l=i.z,u=e.x,c=e.y,d=e.z;if(Math.abs(s-u)<1e-6&&Math.abs(r-c)<1e-6&&Math.abs(o-d)<1e-6)return this.identity();var f=s-u,p=r-c,g=o-d,v=1/Math.sqrt(f*f+p*p+g*g),y=h*(g*=v)-l*(p*=v),m=l*(f*=v)-a*g,x=a*p-h*f;(v=Math.sqrt(y*y+m*m+x*x))?(y*=v=1/v,m*=v,x*=v):(y=0,m=0,x=0);var T=p*x-g*m,w=g*y-f*x,b=f*m-p*y;return(v=Math.sqrt(T*T+w*w+b*b))?(T*=v=1/v,w*=v,b*=v):(T=0,w=0,b=0),n[0]=y,n[1]=T,n[2]=f,n[3]=0,n[4]=m,n[5]=w,n[6]=p,n[7]=0,n[8]=x,n[9]=b,n[10]=g,n[11]=0,n[12]=-(y*s+m*r+x*o),n[13]=-(T*s+w*r+b*o),n[14]=-(f*s+p*r+g*o),n[15]=1,this},yawPitchRoll:function(t,e,i){this.zero(),s.zero(),r.zero();var n=this.val,o=s.val,a=r.val,h=Math.sin(i),l=Math.cos(i);return n[10]=1,n[15]=1,n[0]=l,n[1]=h,n[4]=-h,n[5]=l,h=Math.sin(e),l=Math.cos(e),o[0]=1,o[15]=1,o[5]=l,o[10]=l,o[9]=-h,o[6]=h,h=Math.sin(t),l=Math.cos(t),a[5]=1,a[15]=1,a[0]=l,a[2]=-h,a[8]=h,a[10]=l,this.multiplyLocal(s),this.multiplyLocal(r),this},setWorldMatrix:function(t,e,i,n,o){return this.yawPitchRoll(t.y,t.x,t.z),s.scaling(i.x,i.y,i.z),r.xyz(e.x,e.y,e.z),this.multiplyLocal(s),this.multiplyLocal(r),void 0!==n&&this.multiplyLocal(n),void 0!==o&&this.multiplyLocal(o),this}}),s=new n,r=new n;t.exports=n},function(t,e,i){var n=new(i(0))({initialize:function(t){this.val=new Float32Array(9),t?this.copy(t):this.identity()},clone:function(){return new n(this)},set:function(t){return this.copy(t)},copy:function(t){var e=this.val,i=t.val;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this},fromMat4:function(t){var e=t.val,i=this.val;return i[0]=e[0],i[1]=e[1],i[2]=e[2],i[3]=e[4],i[4]=e[5],i[5]=e[6],i[6]=e[8],i[7]=e[9],i[8]=e[10],this},fromArray:function(t){var e=this.val;return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],this},identity:function(){var t=this.val;return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,this},transpose:function(){var t=this.val,e=t[1],i=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=e,t[5]=t[7],t[6]=i,t[7]=n,this},invert:function(){var t=this.val,e=t[0],i=t[1],n=t[2],s=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8],u=l*r-o*h,c=-l*s+o*a,d=h*s-r*a,f=e*u+i*c+n*d;return f?(f=1/f,t[0]=u*f,t[1]=(-l*i+n*h)*f,t[2]=(o*i-n*r)*f,t[3]=c*f,t[4]=(l*e-n*a)*f,t[5]=(-o*e+n*s)*f,t[6]=d*f,t[7]=(-h*e+i*a)*f,t[8]=(r*e-i*s)*f,this):null},adjoint:function(){var t=this.val,e=t[0],i=t[1],n=t[2],s=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8];return t[0]=r*l-o*h,t[1]=n*h-i*l,t[2]=i*o-n*r,t[3]=o*a-s*l,t[4]=e*l-n*a,t[5]=n*s-e*o,t[6]=s*h-r*a,t[7]=i*a-e*h,t[8]=e*r-i*s,this},determinant:function(){var t=this.val,e=t[0],i=t[1],n=t[2],s=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8];return e*(l*r-o*h)+i*(-l*s+o*a)+n*(h*s-r*a)},multiply:function(t){var e=this.val,i=e[0],n=e[1],s=e[2],r=e[3],o=e[4],a=e[5],h=e[6],l=e[7],u=e[8],c=t.val,d=c[0],f=c[1],p=c[2],g=c[3],v=c[4],y=c[5],m=c[6],x=c[7],T=c[8];return e[0]=d*i+f*r+p*h,e[1]=d*n+f*o+p*l,e[2]=d*s+f*a+p*u,e[3]=g*i+v*r+y*h,e[4]=g*n+v*o+y*l,e[5]=g*s+v*a+y*u,e[6]=m*i+x*r+T*h,e[7]=m*n+x*o+T*l,e[8]=m*s+x*a+T*u,this},translate:function(t){var e=this.val,i=t.x,n=t.y;return e[6]=i*e[0]+n*e[3]+e[6],e[7]=i*e[1]+n*e[4]+e[7],e[8]=i*e[2]+n*e[5]+e[8],this},rotate:function(t){var e=this.val,i=e[0],n=e[1],s=e[2],r=e[3],o=e[4],a=e[5],h=Math.sin(t),l=Math.cos(t);return e[0]=l*i+h*r,e[1]=l*n+h*o,e[2]=l*s+h*a,e[3]=l*r-h*i,e[4]=l*o-h*n,e[5]=l*a-h*s,this},scale:function(t){var e=this.val,i=t.x,n=t.y;return e[0]=i*e[0],e[1]=i*e[1],e[2]=i*e[2],e[3]=n*e[3],e[4]=n*e[4],e[5]=n*e[5],this},fromQuat:function(t){var e=t.x,i=t.y,n=t.z,s=t.w,r=e+e,o=i+i,a=n+n,h=e*r,l=e*o,u=e*a,c=i*o,d=i*a,f=n*a,p=s*r,g=s*o,v=s*a,y=this.val;return y[0]=1-(c+f),y[3]=l+v,y[6]=u-g,y[1]=l-v,y[4]=1-(h+f),y[7]=d+p,y[2]=u+g,y[5]=d-p,y[8]=1-(h+c),this},normalFromMat4:function(t){var e=t.val,i=this.val,n=e[0],s=e[1],r=e[2],o=e[3],a=e[4],h=e[5],l=e[6],u=e[7],c=e[8],d=e[9],f=e[10],p=e[11],g=e[12],v=e[13],y=e[14],m=e[15],x=n*h-s*a,T=n*l-r*a,w=n*u-o*a,b=s*l-r*h,S=s*u-o*h,_=r*u-o*l,A=c*v-d*g,E=c*y-f*g,C=c*m-p*g,M=d*y-f*v,P=d*m-p*v,O=f*m-p*y,R=x*O-T*P+w*M+b*C-S*E+_*A;return R?(R=1/R,i[0]=(h*O-l*P+u*M)*R,i[1]=(l*C-a*O-u*E)*R,i[2]=(a*P-h*C+u*A)*R,i[3]=(r*P-s*O-o*M)*R,i[4]=(n*O-r*C+o*E)*R,i[5]=(s*C-n*P-o*A)*R,i[6]=(v*_-y*S+m*b)*R,i[7]=(y*w-g*_-m*T)*R,i[8]=(g*S-v*w+m*x)*R,this):null}});t.exports=n},function(t,e,i){var n=i(3);t.exports=function(t,e,i,s,r,o,a,h){void 0===h&&(h=new n);var l=Math.sin(r),u=Math.cos(r),c=u*o,d=l*o,f=-l*a,p=u*a,g=1/(c*p+f*-d);return h.x=p*g*t+-f*g*e+(s*f-i*p)*g,h.y=c*g*e+-d*g*t+(-s*c+i*d)*g,h}},function(t,e){t.exports=function(t){return t>0?Math.ceil(t):Math.floor(t)}},function(t,e){t.exports=function(t,e){var i=t.x,n=t.y;return t.x=i*Math.cos(e)-n*Math.sin(e),t.y=i*Math.sin(e)+n*Math.cos(e),t}},function(t,e){t.exports=function(t,e){return Math.random()*(e-t)+t}},function(t,e){t.exports=function(t,e,i,n){return void 0===i&&(i=0),0===e?t:(t-=i,t=e*Math.ceil(t/e),n?(i+t)/e:i+t)}},function(t,e){t.exports=function(t){var e=Math.log(t)/.6931471805599453;return 1<e-i}},function(t,e){t.exports=function(t,e,i,n){var s=t-i,r=e-n;return s*s+r*r}},function(t,e){t.exports=function(t){return(t%=2*Math.PI)>=0?t:t+2*Math.PI}},function(t,e){t.exports=function(t,e,i,n){return Math.atan2(n-e,i-t)}},function(t,e,i){var n=i(20),s=i(19),r={Angle:i(1091),Distance:i(1083),Easing:i(1081),Fuzzy:i(1080),Interpolation:i(1077),Pow2:i(1072),Snap:i(1070),RandomDataGenerator:i(1068),Average:i(1067),Bernstein:i(381),Between:i(184),CatmullRom:i(185),CeilTo:i(1066),Clamp:i(23),DegToRad:i(34),Difference:i(1065),Factorial:i(380),FloatBetween:i(374),FloorTo:i(1064),FromPercent:i(100),GetSpeed:i(1063),IsEven:i(1062),IsEvenStrict:i(1061),Linear:i(129),MaxAdd:i(1060),MinSub:i(1059),Percent:i(1058),RadToDeg:i(183),RandomXY:i(1057),RandomXYZ:i(1056),RandomXYZW:i(1055),Rotate:i(373),RotateAround:i(428),RotateAroundDistance:i(197),RoundAwayFromZero:i(372),RoundTo:i(1054),SinCosTableGenerator:i(1053),SmootherStep:i(196),SmoothStep:i(195),TransformXY:i(371),Within:i(1052),Wrap:i(57),Vector2:i(3),Vector3:i(182),Vector4:i(1051),Matrix3:i(370),Matrix4:i(369),Quaternion:i(368),RotateVec3:i(1050)};r=s(!1,r,n),t.exports=r},function(t,e,i){var n,s,r,o=i(24),a={supportInverseAlpha:!1,supportNewBlendModes:!1};t.exports=(void 0!==document&&(a.supportNewBlendModes=(n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAABAQMAAADD8p2OAAAAA1BMVEX/",s="AAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==",(r=new Image).onload=function(){var t=new Image;t.onload=function(){var e=o.create(t,6,1).getContext("2d");if(e.globalCompositeOperation="multiply",e.drawImage(r,0,0),e.drawImage(t,2,0),!e.getImageData(2,0,1,1))return!1;var i=e.getImageData(2,0,1,1).data;o.remove(t),a.supportNewBlendModes=255===i[0]&&0===i[1]&&0===i[2]},t.src=n+"/wCKxvRF"+s},r.src=n+"AP804Oa6"+s,!1),a.supportInverseAlpha=function(){var t=o.create(this,2,1).getContext("2d");t.fillStyle="rgba(10, 20, 30, 0.5)",t.fillRect(0,0,1,1);var e=t.getImageData(0,0,1,1);if(null===e)return!1;t.putImageData(e,1,0);var i=t.getImageData(1,0,1,1);return i.data[0]===e.data[0]&&i.data[1]===e.data[1]&&i.data[2]===e.data[2]&&i.data[3]===e.data[3]}()),a)},function(t,e,i){t.exports={os:i(99),browser:i(128),features:i(187),input:i(1095),audio:i(1094),video:i(1093),fullscreen:i(1092),canvasFeatures:i(388)}},function(t,e,i){var n=i(0),s=i(28),r=i(389),o=i(2),a=i(4),h=i(8),l=i(387),u=i(1),c=i(181),d=i(192),f=new n({initialize:function(t){void 0===t&&(t={});this.width=a(t,"width",1024),this.height=a(t,"height",768),this.zoom=a(t,"zoom",1),this.resolution=a(t,"resolution",1),this.parent=a(t,"parent",void 0),this.scaleMode=a(t,"scaleMode",0),this.expandParent=a(t,"expandParent",!0),this.autoRound=a(t,"autoRound",!1),this.autoCenter=a(t,"autoCenter",0),this.resizeInterval=a(t,"resizeInterval",500),this.fullscreenTarget=a(t,"fullscreenTarget",null),this.minWidth=a(t,"minWidth",0),this.maxWidth=a(t,"maxWidth",0),this.minHeight=a(t,"minHeight",0),this.maxHeight=a(t,"maxHeight",0);var e=a(t,"scale",null);e&&(this.width=a(e,"width",this.width),this.height=a(e,"height",this.height),this.zoom=a(e,"zoom",this.zoom),this.resolution=a(e,"resolution",this.resolution),this.parent=a(e,"parent",this.parent),this.scaleMode=a(e,"mode",this.scaleMode),this.expandParent=a(e,"expandParent",this.expandParent),this.autoRound=a(e,"autoRound",this.autoRound),this.autoCenter=a(e,"autoCenter",this.autoCenter),this.resizeInterval=a(e,"resizeInterval",this.resizeInterval),this.fullscreenTarget=a(e,"fullscreenTarget",this.fullscreenTarget),this.minWidth=a(e,"min.width",this.minWidth),this.maxWidth=a(e,"max.width",this.maxWidth),this.minHeight=a(e,"min.height",this.minHeight),this.maxHeight=a(e,"max.height",this.maxHeight)),this.renderType=a(t,"type",s.AUTO),this.canvas=a(t,"canvas",null),this.context=a(t,"context",null),this.canvasStyle=a(t,"canvasStyle",null),this.customEnvironment=a(t,"customEnvironment",!1),this.sceneConfig=a(t,"scene",null),this.seed=a(t,"seed",[(Date.now()*Math.random()).toString()]),l.RND=new l.RandomDataGenerator(this.seed),this.gameTitle=a(t,"title",""),this.gameURL=a(t,"url","https://phaser.io"),this.gameVersion=a(t,"version",""),this.autoFocus=a(t,"autoFocus",!0),this.domCreateContainer=a(t,"dom.createContainer",!1),this.domBehindCanvas=a(t,"dom.behindCanvas",!1),this.inputKeyboard=a(t,"input.keyboard",!0),this.inputKeyboardEventTarget=a(t,"input.keyboard.target",window),this.inputKeyboardCapture=a(t,"input.keyboard.capture",[]),this.inputMouse=a(t,"input.mouse",!0),this.inputMouseEventTarget=a(t,"input.mouse.target",null),this.inputMouseCapture=a(t,"input.mouse.capture",!0),this.inputTouch=a(t,"input.touch",r.input.touch),this.inputTouchEventTarget=a(t,"input.touch.target",null),this.inputTouchCapture=a(t,"input.touch.capture",!0),this.inputActivePointers=a(t,"input.activePointers",1),this.inputSmoothFactor=a(t,"input.smoothFactor",0),this.inputQueue=a(t,"input.queue",!1),this.inputGamepad=a(t,"input.gamepad",!1),this.inputGamepadEventTarget=a(t,"input.gamepad.target",window),this.disableContextMenu=a(t,"disableContextMenu",!1),this.audio=a(t,"audio"),this.hideBanner=!1===a(t,"banner",null),this.hidePhaser=a(t,"banner.hidePhaser",!1),this.bannerTextColor=a(t,"banner.text","#ffffff"),this.bannerBackgroundColor=a(t,"banner.background",["#ff0000","#ffff00","#00ff00","#00ffff","#000000"]),""===this.gameTitle&&this.hidePhaser&&(this.hideBanner=!0),this.fps=a(t,"fps",null);var i=a(t,"render",t);this.antialias=a(i,"antialias",!0),this.roundPixels=a(i,"roundPixels",!1),this.pixelArt=a(i,"pixelArt",1!==this.zoom),this.pixelArt&&(this.antialias=!1,this.roundPixels=!0),this.transparent=a(i,"transparent",!1),this.clearBeforeRender=a(i,"clearBeforeRender",!0),this.premultipliedAlpha=a(i,"premultipliedAlpha",!0),this.failIfMajorPerformanceCaveat=a(i,"failIfMajorPerformanceCaveat",!1),this.powerPreference=a(i,"powerPreference","default"),this.batchSize=a(i,"batchSize",2e3),this.maxLights=a(i,"maxLights",10);var n=a(t,"backgroundColor",0);this.backgroundColor=d(n),0===n&&this.transparent&&(this.backgroundColor.alpha=0),this.preBoot=a(t,"callbacks.preBoot",u),this.postBoot=a(t,"callbacks.postBoot",u),this.physics=a(t,"physics",{}),this.defaultPhysicsSystem=a(this.physics,"default",!1),this.loaderBaseURL=a(t,"loader.baseURL",""),this.loaderPath=a(t,"loader.path",""),this.loaderMaxParallelDownloads=a(t,"loader.maxParallelDownloads",32),this.loaderCrossOrigin=a(t,"loader.crossOrigin",void 0),this.loaderResponseType=a(t,"loader.responseType",""),this.loaderAsync=a(t,"loader.async",!0),this.loaderUser=a(t,"loader.user",""),this.loaderPassword=a(t,"loader.password",""),this.loaderTimeout=a(t,"loader.timeout",0),this.installGlobalPlugins=[],this.installScenePlugins=[];var f=a(t,"plugins",null),p=c.DefaultScene;f&&(Array.isArray(f)?this.defaultPlugins=f:h(f)&&(this.installGlobalPlugins=o(f,"global",[]),this.installScenePlugins=o(f,"scene",[]),Array.isArray(f.default)?p=f.default:Array.isArray(f.defaultMerge)&&(p=p.concat(f.defaultMerge)))),this.defaultPlugins=p;var g="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAg";this.defaultImage=a(t,"images.default",g+"AQMAAABJtOi3AAAAA1BMVEX///+nxBvIAAAAAXRSTlMAQObYZgAAABVJREFUeF7NwIEAAAAAgKD9qdeocAMAoAABm3DkcAAAAABJRU5ErkJggg=="),this.missingImage=a(t,"images.missing",g+"CAIAAAD8GO2jAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJ9JREFUeNq01ssOwyAMRFG46v//Mt1ESmgh+DFmE2GPOBARKb2NVjo+17PXLD8a1+pl5+A+wSgFygymWYHBb0FtsKhJDdZlncG2IzJ4ayoMDv20wTmSMzClEgbWYNTAkQ0Z+OJ+A/eWnAaR9+oxCF4Os0H8htsMUp+pwcgBBiMNnAwF8GqIgL2hAzaGFFgZauDPKABmowZ4GL369/0rwACp2yA/ttmvsQAAAABJRU5ErkJggg=="),window&&(window.FORCE_WEBGL?this.renderType=s.WEBGL:window.FORCE_CANVAS&&(this.renderType=s.CANVAS))}});t.exports=f},function(t,e,i){t.exports=i(1119)},function(t,e,i){t.exports={In:i(1122),Out:i(1121),InOut:i(1120)}},function(t,e,i){t.exports={In:i(1125),Out:i(1124),InOut:i(1123)}},function(t,e,i){t.exports={In:i(1128),Out:i(1127),InOut:i(1126)}},function(t,e,i){t.exports={In:i(1131),Out:i(1130),InOut:i(1129)}},function(t,e,i){t.exports=i(1132)},function(t,e,i){t.exports={In:i(1135),Out:i(1134),InOut:i(1133)}},function(t,e,i){t.exports={In:i(1138),Out:i(1137),InOut:i(1136)}},function(t,e,i){t.exports={In:i(1141),Out:i(1140),InOut:i(1139)}},function(t,e,i){t.exports={In:i(1144),Out:i(1143),InOut:i(1142)}},function(t,e,i){t.exports={In:i(1147),Out:i(1146),InOut:i(1145)}},function(t,e,i){t.exports={In:i(1150),Out:i(1149),InOut:i(1148)}},function(t,e,i){t.exports={Fade:i(1153),Flash:i(1152),Pan:i(1151),Shake:i(1118),Zoom:i(1117)}},function(t,e,i){var n=i(32);t.exports=function(t){var e=new n,i=/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d+(?:\.\d+)?))?\s*\)$/.exec(t.toLowerCase());if(i){var s=parseInt(i[1],10),r=parseInt(i[2],10),o=parseInt(i[3],10),a=void 0!==i[4]?parseFloat(i[4]):1;e.setTo(s,r,o,255*a)}return e}},function(t,e,i){var n=i(32);t.exports=function(t){return new n(t.r,t.g,t.b,t.a)}},function(t,e){t.exports=function(t){return t>16777215?{a:t>>>24,r:t>>16&255,g:t>>8&255,b:255&t}:{a:255,r:t>>16&255,g:t>>8&255,b:255&t}}},function(t,e,i){var n=i(32),s=i(406);t.exports=function(t){var e=s(t);return new n(e.r,e.g,e.b,e.a)}},function(t,e){t.exports=function(t,e,i,n){void 0===n&&(n={h:0,s:0,v:0}),t/=255,e/=255,i/=255;var s=Math.min(t,e,i),r=Math.max(t,e,i),o=r-s,a=0,h=0===r?0:o/r,l=r;return r!==s&&(r===t?a=(e-i)/o+(ed.right&&(f=u(f,f+(g-d.right),this.lerp.x)),vd.bottom&&(p=u(p,p+(v-d.bottom),this.lerp.y))):(f=u(f,g-h,this.lerp.x),p=u(p,v-l,this.lerp.y))}this.useBounds&&(f=this.clampX(f),p=this.clampY(p)),this.roundPixels&&(h=Math.round(h),l=Math.round(l)),this.scrollX=f,this.scrollY=p;var y=f+n,m=p+s;this.midPoint.set(y,m);var x=e/o,T=i/o;this.worldView.setTo(y-x/2,m-T/2,x,T),a.applyITRS(this.x+h,this.y+l,this.rotation,o,o),a.translate(-h,-l),this.shakeEffect.preRender()},setLerp:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=t),this.lerp.set(t,e),this},setFollowOffset:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=0),this.followOffset.set(t,e),this},startFollow:function(t,e,i,n,s,r){void 0===e&&(e=!1),void 0===i&&(i=1),void 0===n&&(n=i),void 0===s&&(s=0),void 0===r&&(r=s),this._follow=t,this.roundPixels=e,i=o(i,0,1),n=o(n,0,1),this.lerp.set(i,n),this.followOffset.set(s,r);var a=this.width/2,h=this.height/2,l=t.x-s,u=t.y-r;return this.midPoint.set(l,u),this.scrollX=l-a,this.scrollY=u-h,this},stopFollow:function(){return this._follow=null,this},resetFX:function(){return this.panEffect.reset(),this.shakeEffect.reset(),this.flashEffect.reset(),this.fadeEffect.reset(),this},update:function(t,e){this.visible&&(this.panEffect.update(t,e),this.zoomEffect.update(t,e),this.shakeEffect.update(t,e),this.flashEffect.update(t,e),this.fadeEffect.update(t,e))},destroy:function(){this.clearRenderToTexture(),this.resetFX(),n.prototype.destroy.call(this),this._follow=null,this.deadzone=null}});t.exports=f},function(t,e,i){var n=i(414),s=i(0),r=i(26),o=new s({initialize:function(t){this.game=t,this.binary=new n,this.bitmapFont=new n,this.json=new n,this.physics=new n,this.shader=new n,this.audio=new n,this.text=new n,this.html=new n,this.obj=new n,this.tilemap=new n,this.xml=new n,this.custom={},this.game.events.once(r.DESTROY,this.destroy,this)},addCustom:function(t){return this.custom.hasOwnProperty(t)||(this.custom[t]=new n),this.custom[t]},destroy:function(){for(var t=["binary","bitmapFont","json","physics","shader","audio","text","html","obj","tilemap","xml"],e=0;e