nano-pow 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,586 @@
1
+ // src/shaders/compute.wgsl
2
+ var compute_default = "struct UBO{blockhash:array<vec4<u32>,2>,random:u32,threshold:u32};@group(0)@binding(0)var<uniform> ubo:UBO;struct WORK{nonce:vec2<u32>,found:atomic<u32>};@group(0)@binding(1)var<storage,read_write>work:WORK;const BLAKE2B_IV32_1:u32=0x6A09E667u;@compute @workgroup_size(256)fn main(@builtin(global_invocation_id)id:vec3<u32>){if(atomicLoad(&work.found)!=0u){return;}let threshold:u32=ubo.threshold;var m0:u32=ubo.random ^ id.x;var m1:u32=ubo.random ^ id.y;var m2:u32=ubo.blockhash[0u].x;var m3:u32=ubo.blockhash[0u].y;var m4:u32=ubo.blockhash[0u].z;var m5:u32=ubo.blockhash[0u].w;var m6:u32=ubo.blockhash[1u].x;var m7:u32=ubo.blockhash[1u].y;var m8:u32=ubo.blockhash[1u].z;var m9:u32=ubo.blockhash[1u].w;var v0:u32=0xF2BDC900u;var v1:u32=0x6A09E667u;var v2:u32=0x84CAA73Bu;var v3:u32=0xBB67AE85u;var v4:u32=0xFE94F82Bu;var v5:u32=0x3C6EF372u;var v6:u32=0x5F1D36F1u;var v7:u32=0xA54FF53Au;var v8:u32=0xADE682D1u;var v9:u32=0x510E527Fu;var v10:u32=0x2B3E6C1Fu;var v11:u32=0x9B05688Cu;var v12:u32=0xFB41BD6Bu;var v13:u32=0x1F83D9ABu;var v14:u32=0x137E2179u;var v15:u32=0x5BE0CD19u;var v16:u32=0xF3BCC908u;var v17:u32=0x6A09E667u;var v18:u32=0x84CAA73Bu;var v19:u32=0xBB67AE85u;var v20:u32=0xFE94F82Bu;var v21:u32=0x3C6EF372u;var v22:u32=0x5F1D36F1u;var v23:u32=0xA54FF53Au;var v24:u32=0xADE682F9u;var v25:u32=0x510E527Fu;var v26:u32=0x2B3E6C1Fu;var v27:u32=0x9B05688Cu;var v28:u32=0x04BE4294u;var v29:u32=0xE07C2654u;var v30:u32=0x137E2179u;var v31:u32=0x5BE0CD19u;var o0:u32;var o1:u32;var xor0:u32;var xor1:u32;o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m0;o1=v1+m1;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m2;o1=v1+m3;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m4;o1=v3+m5;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m6;o1=v3+m7;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m8;o1=v5+m9;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m8;o1=v3+m9;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m2;o1=v1+m3;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m0;o1=v3+m1;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m4;o1=v3+m5;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m6;o1=v7+m7;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m0;o1=v3+m1;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m4;o1=v5+m5;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m6;o1=v3+m7;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m2;o1=v5+m3;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m8;o1=v7+m9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m6;o1=v3+m7;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m2;o1=v3+m3;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m4;o1=v1+m5;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m8;o1=v5+m9;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m0;o1=v5+m1;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m0;o1=v1+m1;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m4;o1=v5+m5;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m8;o1=v5+m9;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m2;o1=v1+m3;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m6;o1=v7+m7;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m4;o1=v1+m5;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m0;o1=v5+m1;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m6;o1=v7+m7;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m8;o1=v1+m9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m2;o1=v7+m3;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m2;o1=v3+m3;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m8;o1=v7+m9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m0;o1=v1+m1;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m6;o1=v3+m7;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m4;o1=v5+m5;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m2;o1=v5+m3;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m6;o1=v7+m7;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m0;o1=v1+m1;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m8;o1=v3+m9;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m4;o1=v7+m5;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m6;o1=v5+m7;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m0;o1=v7+m1;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m4;o1=v1+m5;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m2;o1=v5+m3;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m8;o1=v5+m9;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m4;o1=v1+m5;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m8;o1=v3+m9;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m2;o1=v7+m3;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m6;o1=v5+m7;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m0;o1=v7+m1;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m0;o1=v1+m1;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m2;o1=v1+m3;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m4;o1=v3+m5;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m6;o1=v3+m7;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m8;o1=v5+m9;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m8;o1=v3+m9;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m2;o1=v1+m3;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m0;o1=v3+m1;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m4;o1=v3+m5;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m6;o1=v7+m7;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);if((BLAKE2B_IV32_1 ^ v1 ^ v17)>threshold&&atomicLoad(&work.found)==0u){atomicStore(&work.found,1u);work.nonce.x=m0;work.nonce.y=m1;}return;}";
3
+
4
+ // src/shaders/gl-fragment.ts
5
+ var NanoPowGlFragmentShader = `#version 300 es
6
+ #pragma vscode_glsllint_stage: frag
7
+ precision highp float;
8
+ precision highp int;
9
+
10
+ in vec2 uv_pos;
11
+ out vec4 fragColor;
12
+
13
+ // blockhash - array of precalculated block hash components
14
+ // threshold - 0xfffffff8 for send/change blocks, 0xfffffe00 for all else
15
+ // workload - Defines canvas size
16
+ layout(std140) uniform UBO {
17
+ uint blockhash[8];
18
+ uint threshold;
19
+ float workload;
20
+ };
21
+
22
+ // Random work values
23
+ // First 2 bytes will be overwritten by texture pixel position
24
+ // Second 2 bytes will be modified if the canvas size is greater than 256x256
25
+ // Last 4 bytes remain as generated externally
26
+ layout(std140) uniform WORK {
27
+ uvec4 work[2];
28
+ };
29
+
30
+ // Defined separately from uint v[32] below as the original value is required
31
+ // to calculate the second uint32 of the digest for threshold comparison
32
+ const uint BLAKE2B_IV32_1 = 0x6A09E667u;
33
+
34
+ // Both buffers represent 16 uint64s as 32 uint32s
35
+ // because that's what GLSL offers, just like Javascript
36
+
37
+ // Compression buffer, intialized to 2 instances of the initialization vector
38
+ // The following values have been modified from the BLAKE2B_IV:
39
+ // OUTLEN is constant 8 bytes
40
+ // v[0] ^= 0x01010000u ^ uint(OUTLEN);
41
+ // INLEN is constant 40 bytes: work value (8) + block hash (32)
42
+ // v[24] ^= uint(INLEN);
43
+ // It's always the "last" compression at this INLEN
44
+ // v[28] = ~v[28];
45
+ // v[29] = ~v[29];
46
+ uint v[32] = uint[32](
47
+ 0xF2BDC900u, 0x6A09E667u, 0x84CAA73Bu, 0xBB67AE85u,
48
+ 0xFE94F82Bu, 0x3C6EF372u, 0x5F1D36F1u, 0xA54FF53Au,
49
+ 0xADE682D1u, 0x510E527Fu, 0x2B3E6C1Fu, 0x9B05688Cu,
50
+ 0xFB41BD6Bu, 0x1F83D9ABu, 0x137E2179u, 0x5BE0CD19u,
51
+ 0xF3BCC908u, 0x6A09E667u, 0x84CAA73Bu, 0xBB67AE85u,
52
+ 0xFE94F82Bu, 0x3C6EF372u, 0x5F1D36F1u, 0xA54FF53Au,
53
+ 0xADE682F9u, 0x510E527Fu, 0x2B3E6C1Fu, 0x9B05688Cu,
54
+ 0x04BE4294u, 0xE07C2654u, 0x137E2179u, 0x5BE0CD19u
55
+ );
56
+ // Input data buffer
57
+ uint m[32];
58
+
59
+ // These are offsets into the input data buffer for each mixing step.
60
+ // They are multiplied by 2 from the original SIGMA values in
61
+ // the C reference implementation, which refered to uint64s.
62
+ const uint SIGMA82[192] = uint[192](
63
+ 0u,2u,4u,6u,8u,10u,12u,14u,16u,18u,20u,22u,24u,26u,28u,30u,
64
+ 28u,20u,8u,16u,18u,30u,26u,12u,2u,24u,0u,4u,22u,14u,10u,6u,
65
+ 22u,16u,24u,0u,10u,4u,30u,26u,20u,28u,6u,12u,14u,2u,18u,8u,
66
+ 14u,18u,6u,2u,26u,24u,22u,28u,4u,12u,10u,20u,8u,0u,30u,16u,
67
+ 18u,0u,10u,14u,4u,8u,20u,30u,28u,2u,22u,24u,12u,16u,6u,26u,
68
+ 4u,24u,12u,20u,0u,22u,16u,6u,8u,26u,14u,10u,30u,28u,2u,18u,
69
+ 24u,10u,2u,30u,28u,26u,8u,20u,0u,14u,12u,6u,18u,4u,16u,22u,
70
+ 26u,22u,14u,28u,24u,2u,6u,18u,10u,0u,30u,8u,16u,12u,4u,20u,
71
+ 12u,30u,28u,18u,22u,6u,0u,16u,24u,4u,26u,14u,2u,8u,20u,10u,
72
+ 20u,4u,16u,8u,14u,12u,2u,10u,30u,22u,18u,28u,6u,24u,26u,0u,
73
+ 0u,2u,4u,6u,8u,10u,12u,14u,16u,18u,20u,22u,24u,26u,28u,30u,
74
+ 28u,20u,8u,16u,18u,30u,26u,12u,2u,24u,0u,4u,22u,14u,10u,6u
75
+ );
76
+
77
+ // G mixing function
78
+ void G (uint ix, uint iy, uint a, uint b, uint c, uint d) {
79
+ bool carry;
80
+ uint o0;
81
+ uint o1;
82
+ uint xor0;
83
+ uint xor1;
84
+
85
+ // a = a + b;
86
+ o0 = v[a] + v[b];
87
+ o1 = v[a+1u] + v[b+1u];
88
+ carry = o0 < v[a];
89
+ o1 = o1 + uint(mix(0.0, 1.0, float(carry)));
90
+ v[a] = o0;
91
+ v[a+1u] = o1;
92
+
93
+ // a = a + m[sigma[r][2*i+0]];
94
+ o0 = v[a] + m[ix];
95
+ o1 = v[a+1u] + m[ix+1u];
96
+ carry = o0 < v[a];
97
+ o1 = o1 + uint(mix(0.0, 1.0, float(carry)));
98
+ v[a] = o0;
99
+ v[a+1u] = o1;
100
+
101
+ // d = rotr64(d ^ a, 32);
102
+ xor0 = v[d] ^ v[a];
103
+ xor1 = v[d+1u] ^ v[a+1u];
104
+ v[d] = xor1;
105
+ v[d+1u] = xor0;
106
+
107
+ // c = c + d;
108
+ o0 = v[c] + v[d];
109
+ o1 = v[c+1u] + v[d+1u];
110
+ carry = o0 < v[c];
111
+ o1 = o1 + uint(mix(0.0, 1.0, float(carry)));
112
+ v[c] = o0;
113
+ v[c+1u] = o1;
114
+
115
+ // b = rotr64(b ^ c, 24);
116
+ xor0 = v[b] ^ v[c];
117
+ xor1 = v[b+1u] ^ v[c+1u];
118
+ v[b] = (xor0 >> 24u) ^ (xor1 << 8u);
119
+ v[b+1u] = (xor1 >> 24u) ^ (xor0 << 8u);
120
+
121
+ // a = a + b;
122
+ o0 = v[a] + v[b];
123
+ o1 = v[a+1u] + v[b+1u];
124
+ carry = o0 < v[a];
125
+ o1 = o1 + uint(mix(0.0, 1.0, float(carry)));
126
+ v[a] = o0;
127
+ v[a+1u] = o1;
128
+
129
+ // a = a + m[sigma[r][2*i+1]];
130
+ o0 = v[a] + m[iy];
131
+ o1 = v[a+1u] + m[iy+1u];
132
+ carry = o0 < v[a];
133
+ o1 = o1 + uint(mix(0.0, 1.0, float(carry)));
134
+ v[a] = o0;
135
+ v[a+1u] = o1;
136
+
137
+ // d = rotr64(d ^ a, 16)
138
+ xor0 = v[d] ^ v[a];
139
+ xor1 = v[d+1u] ^ v[a+1u];
140
+ v[d] = (xor0 >> 16u) ^ (xor1 << 16u);
141
+ v[d+1u] = (xor1 >> 16u) ^ (xor0 << 16u);
142
+
143
+ // c = c + d;
144
+ o0 = v[c] + v[d];
145
+ o1 = v[c+1u] + v[d+1u];
146
+ carry = o0 < v[c];
147
+ o1 = o1 + uint(mix(0.0, 1.0, float(carry)));
148
+ v[c] = o0;
149
+ v[c+1u] = o1;
150
+
151
+ // b = rotr64(b ^ c, 63)
152
+ xor0 = v[b] ^ v[c];
153
+ xor1 = v[b+1u] ^ v[c+1u];
154
+ v[b] = (xor1 >> 31u) ^ (xor0 << 1u);
155
+ v[b+1u] = (xor0 >> 31u) ^ (xor1 << 1u);
156
+ }
157
+
158
+ void main() {
159
+ int i;
160
+ uvec4 u_work0 = work[0u];
161
+ uvec4 u_work1 = work[1u];
162
+ uint uv_x = uint(uv_pos.x * workload);
163
+ uint uv_y = uint(uv_pos.y * workload);
164
+ uint x_pos = uv_x % 256u;
165
+ uint y_pos = uv_y % 256u;
166
+ uint x_index = (uv_x - x_pos) / 256u;
167
+ uint y_index = (uv_y - y_pos) / 256u;
168
+
169
+ // First 2 work bytes are the x,y pos within the 256x256 area, the next
170
+ // two bytes are modified from the random generated value, XOR'd with
171
+ // the x,y area index of where this pixel is located
172
+ m[0u] = (x_pos ^ (y_pos << 8u) ^ ((u_work0.b ^ x_index) << 16u) ^ ((u_work0.a ^ y_index) << 24u));
173
+
174
+ // Remaining bytes are un-modified from the random generated value
175
+ m[1u] = (u_work1.r ^ (u_work1.g << 8u) ^ (u_work1.b << 16u) ^ (u_work1.a << 24u));
176
+
177
+ // Block hash
178
+ for (uint i = 0u; i < 8u; i = i + 1u) {
179
+ m[i+2u] = blockhash[i];
180
+ }
181
+
182
+ // twelve rounds of mixing
183
+ for(uint i = 0u; i < 12u; i = i + 1u) {
184
+ G(SIGMA82[i * 16u + 0u], SIGMA82[i * 16u + 1u], 0u, 8u, 16u, 24u);
185
+ G(SIGMA82[i * 16u + 2u], SIGMA82[i * 16u + 3u], 2u, 10u, 18u, 26u);
186
+ G(SIGMA82[i * 16u + 4u], SIGMA82[i * 16u + 5u], 4u, 12u, 20u, 28u);
187
+ G(SIGMA82[i * 16u + 6u], SIGMA82[i * 16u + 7u], 6u, 14u, 22u, 30u);
188
+ G(SIGMA82[i * 16u + 8u], SIGMA82[i * 16u + 9u], 0u, 10u, 20u, 30u);
189
+ G(SIGMA82[i * 16u + 10u], SIGMA82[i * 16u + 11u], 2u, 12u, 22u, 24u);
190
+ G(SIGMA82[i * 16u + 12u], SIGMA82[i * 16u + 13u], 4u, 14u, 16u, 26u);
191
+ G(SIGMA82[i * 16u + 14u], SIGMA82[i * 16u + 15u], 6u, 8u, 18u, 28u);
192
+ }
193
+
194
+ // Pixel data is multipled by threshold test result (0 or 1)
195
+ // First 4 bytes insignificant, only calculate digest of second 4 bytes
196
+ if ((BLAKE2B_IV32_1 ^ v[1u] ^ v[17u]) > threshold) {
197
+ fragColor = vec4(
198
+ float(x_index + 1u)/255.0, // +1 to distinguish from 0 (unsuccessful) pixels
199
+ float(y_index + 1u)/255.0, // Same as previous
200
+ float(x_pos)/255.0, // Return the 2 custom bytes used in work value
201
+ float(y_pos)/255.0 // Second custom byte
202
+ );
203
+ } else {
204
+ discard;
205
+ }
206
+ }
207
+ `;
208
+
209
+ // src/shaders/gl-vertex.ts
210
+ var NanoPowGlVertexShader = `#version 300 es
211
+ #pragma vscode_glsllint_stage: vert
212
+ precision highp float;
213
+ layout (location=0) in vec4 position;
214
+ layout (location=1) in vec2 uv;
215
+
216
+ out vec2 uv_pos;
217
+
218
+ void main() {
219
+ uv_pos = uv;
220
+ gl_Position = position;
221
+ }
222
+ `;
223
+
224
+ // src/classes/gl.ts
225
+ var NanoPowGl = class _NanoPowGl {
226
+ /** Used to set canvas size. Must be a multiple of 256. */
227
+ static #WORKLOAD = 256 * Math.max(1, Math.floor(navigator.hardwareConcurrency));
228
+ static #hexify(arr) {
229
+ let out = "";
230
+ for (let i = arr.length - 1; i >= 0; i--) {
231
+ out += arr[i].toString(16).padStart(2, "0");
232
+ }
233
+ return out;
234
+ }
235
+ static #gl;
236
+ static #program;
237
+ static #vertexShader;
238
+ static #fragmentShader;
239
+ static #positionBuffer;
240
+ static #uvBuffer;
241
+ static #uboBuffer;
242
+ static #workBuffer;
243
+ static #query;
244
+ static #pixels;
245
+ /**Vertex Positions, 2 triangles */
246
+ static #positions = new Float32Array([
247
+ -1,
248
+ -1,
249
+ 0,
250
+ -1,
251
+ 1,
252
+ 0,
253
+ 1,
254
+ 1,
255
+ 0,
256
+ 1,
257
+ -1,
258
+ 0,
259
+ 1,
260
+ 1,
261
+ 0,
262
+ -1,
263
+ -1,
264
+ 0
265
+ ]);
266
+ /** Texture Positions */
267
+ static #uvPosArray = new Float32Array([
268
+ 1,
269
+ 1,
270
+ 1,
271
+ 0,
272
+ 0,
273
+ 0,
274
+ 0,
275
+ 1,
276
+ 0,
277
+ 0,
278
+ 1,
279
+ 1
280
+ ]);
281
+ static {
282
+ this.#gl = new OffscreenCanvas(this.#WORKLOAD, this.#WORKLOAD).getContext("webgl2");
283
+ if (this.#gl == null) throw new Error("WebGL 2 is required");
284
+ this.#gl.clearColor(0, 0, 0, 1);
285
+ this.#program = this.#gl.createProgram();
286
+ if (this.#program == null) throw new Error("Failed to create shader program");
287
+ this.#vertexShader = this.#gl.createShader(this.#gl.VERTEX_SHADER);
288
+ if (this.#vertexShader == null) throw new Error("Failed to create vertex shader");
289
+ this.#gl.shaderSource(this.#vertexShader, NanoPowGlVertexShader);
290
+ this.#gl.compileShader(this.#vertexShader);
291
+ if (!this.#gl.getShaderParameter(this.#vertexShader, this.#gl.COMPILE_STATUS))
292
+ throw new Error(this.#gl.getShaderInfoLog(this.#vertexShader) ?? `Failed to compile vertex shader`);
293
+ this.#fragmentShader = this.#gl.createShader(this.#gl.FRAGMENT_SHADER);
294
+ if (this.#fragmentShader == null) throw new Error("Failed to create fragment shader");
295
+ this.#gl.shaderSource(this.#fragmentShader, NanoPowGlFragmentShader);
296
+ this.#gl.compileShader(this.#fragmentShader);
297
+ if (!this.#gl.getShaderParameter(this.#fragmentShader, this.#gl.COMPILE_STATUS))
298
+ throw new Error(this.#gl.getShaderInfoLog(this.#fragmentShader) ?? `Failed to compile fragment shader`);
299
+ this.#gl.attachShader(this.#program, this.#vertexShader);
300
+ this.#gl.attachShader(this.#program, this.#fragmentShader);
301
+ this.#gl.linkProgram(this.#program);
302
+ if (!this.#gl.getProgramParameter(this.#program, this.#gl.LINK_STATUS))
303
+ throw new Error(this.#gl.getProgramInfoLog(this.#program) ?? `Failed to link program`);
304
+ this.#gl.useProgram(this.#program);
305
+ const triangleArray = this.#gl.createVertexArray();
306
+ this.#gl.bindVertexArray(triangleArray);
307
+ this.#positionBuffer = this.#gl.createBuffer();
308
+ this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, this.#positionBuffer);
309
+ this.#gl.bufferData(this.#gl.ARRAY_BUFFER, this.#positions, this.#gl.STATIC_DRAW);
310
+ this.#gl.vertexAttribPointer(0, 3, this.#gl.FLOAT, false, 0, 0);
311
+ this.#gl.enableVertexAttribArray(0);
312
+ this.#uvBuffer = this.#gl.createBuffer();
313
+ this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, this.#uvBuffer);
314
+ this.#gl.bufferData(this.#gl.ARRAY_BUFFER, this.#uvPosArray, this.#gl.STATIC_DRAW);
315
+ this.#gl.vertexAttribPointer(1, 2, this.#gl.FLOAT, false, 0, 0);
316
+ this.#gl.enableVertexAttribArray(1);
317
+ this.#uboBuffer = this.#gl.createBuffer();
318
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#uboBuffer);
319
+ this.#gl.bufferData(this.#gl.UNIFORM_BUFFER, 144, this.#gl.DYNAMIC_DRAW);
320
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
321
+ this.#gl.bindBufferBase(this.#gl.UNIFORM_BUFFER, 0, this.#uboBuffer);
322
+ this.#gl.uniformBlockBinding(this.#program, this.#gl.getUniformBlockIndex(this.#program, "UBO"), 0);
323
+ this.#workBuffer = this.#gl.createBuffer();
324
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#workBuffer);
325
+ this.#gl.bufferData(this.#gl.UNIFORM_BUFFER, 32, this.#gl.STREAM_DRAW);
326
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
327
+ this.#gl.bindBufferBase(this.#gl.UNIFORM_BUFFER, 1, this.#workBuffer);
328
+ this.#gl.uniformBlockBinding(this.#program, this.#gl.getUniformBlockIndex(this.#program, "WORK"), 1);
329
+ this.#pixels = new Uint8Array(this.#gl.drawingBufferWidth * this.#gl.drawingBufferHeight * 4);
330
+ this.#query = this.#gl.createQuery();
331
+ }
332
+ /**
333
+ * Finds a nonce that satisfies the Nano proof-of-work requirements.
334
+ *
335
+ * @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
336
+ * @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation
337
+ */
338
+ static async search(hash, threshold = 4294967288) {
339
+ if (_NanoPowGl.#gl == null) throw new Error("WebGL 2 is required");
340
+ if (!/^[A-F-a-f0-9]{64}$/.test(hash)) throw new Error(`invalid_hash ${hash}`);
341
+ if (typeof threshold !== "number") throw new TypeError(`Invalid threshold ${threshold}`);
342
+ if (this.#gl == null) throw new Error("WebGL 2 is required");
343
+ const uboView = new DataView(new ArrayBuffer(144));
344
+ for (let i = 0; i < 64; i += 8) {
345
+ const uint32 = hash.slice(i, i + 8);
346
+ uboView.setUint32(i * 2, parseInt(uint32, 16));
347
+ }
348
+ uboView.setUint32(128, threshold, true);
349
+ uboView.setFloat32(132, _NanoPowGl.#WORKLOAD - 1, true);
350
+ _NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, _NanoPowGl.#uboBuffer);
351
+ _NanoPowGl.#gl.bufferSubData(_NanoPowGl.#gl.UNIFORM_BUFFER, 0, uboView);
352
+ _NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, null);
353
+ let nonce = null;
354
+ const work = new Uint8Array(8);
355
+ while (nonce == null) {
356
+ this.draw(work);
357
+ const found = await this.checkQueryResult();
358
+ if (found) {
359
+ nonce = this.readResult(work);
360
+ }
361
+ }
362
+ return nonce;
363
+ }
364
+ static draw(work) {
365
+ if (this.#gl == null || this.#query == null) throw new Error("WebGL 2 is required to draw and query pixels");
366
+ if (this.#workBuffer == null) throw new Error("Work buffer is required to draw");
367
+ this.#gl.clear(this.#gl.COLOR_BUFFER_BIT);
368
+ crypto.getRandomValues(work);
369
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#workBuffer);
370
+ this.#gl.bufferSubData(this.#gl.UNIFORM_BUFFER, 0, Uint32Array.from(work));
371
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
372
+ this.#gl.beginQuery(this.#gl.ANY_SAMPLES_PASSED_CONSERVATIVE, this.#query);
373
+ this.#gl.drawArrays(this.#gl.TRIANGLES, 0, 6);
374
+ this.#gl.endQuery(this.#gl.ANY_SAMPLES_PASSED_CONSERVATIVE);
375
+ }
376
+ static async checkQueryResult() {
377
+ if (this.#gl == null || this.#query == null) throw new Error("WebGL 2 is required to check query results");
378
+ if (this.#gl.getQueryParameter(this.#query, this.#gl.QUERY_RESULT_AVAILABLE)) {
379
+ return this.#gl.getQueryParameter(this.#query, this.#gl.QUERY_RESULT);
380
+ }
381
+ return new Promise((resolve, reject) => {
382
+ try {
383
+ requestAnimationFrame(async () => {
384
+ const result = await _NanoPowGl.checkQueryResult();
385
+ resolve(result);
386
+ });
387
+ } catch (err) {
388
+ reject(err);
389
+ }
390
+ });
391
+ }
392
+ /**
393
+ * Reads pixels into the work buffer, checks every 4th pixel for the 'found'
394
+ * byte, converts the subsequent 3 pixels with the nonce byte values to a hex
395
+ * string, and returns the result.
396
+ *
397
+ * @param work - Buffer with the original random nonce value
398
+ * @returns Nonce as an 8-byte (16-char) hexadecimal string
399
+ */
400
+ static readResult(work) {
401
+ if (this.#gl == null) throw new Error("WebGL 2 is required to read pixels");
402
+ this.#gl.readPixels(0, 0, this.#gl.drawingBufferWidth, this.#gl.drawingBufferHeight, this.#gl.RGBA, this.#gl.UNSIGNED_BYTE, this.#pixels);
403
+ for (let i = 0; i < this.#pixels.length; i += 4) {
404
+ if (this.#pixels[i] !== 0) {
405
+ const hex = this.#hexify(work.subarray(4, 8)) + this.#hexify([
406
+ this.#pixels[i + 2],
407
+ this.#pixels[i + 3],
408
+ work[2] ^ this.#pixels[i] - 1,
409
+ work[3] ^ this.#pixels[i + 1] - 1
410
+ ]);
411
+ return hex;
412
+ }
413
+ }
414
+ throw new Error("Query reported result but nonce value not found");
415
+ }
416
+ };
417
+
418
+ // src/classes/gpu.ts
419
+ var NanoPowGpu = class _NanoPowGpu {
420
+ // Initialize WebGPU
421
+ static #busy = false;
422
+ static #device = null;
423
+ static #uboBuffer;
424
+ static #gpuBuffer;
425
+ static #cpuBuffer;
426
+ static #bindGroupLayout;
427
+ static #pipeline;
428
+ static {
429
+ this.init();
430
+ }
431
+ // Initialize WebGPU
432
+ static async init() {
433
+ if (this.#busy) return;
434
+ this.#busy = true;
435
+ if (navigator.gpu == null) {
436
+ throw new Error("WebGPU is not supported in this browser.");
437
+ }
438
+ try {
439
+ const adapter = await navigator.gpu.requestAdapter();
440
+ if (adapter == null) {
441
+ throw new Error("WebGPU adapter refused by browser.");
442
+ }
443
+ const device = await adapter.requestDevice();
444
+ if (!(device instanceof GPUDevice)) {
445
+ throw new Error("WebGPU device failed to load.");
446
+ }
447
+ device.lost.then(this.reset);
448
+ this.#device = device;
449
+ this.setup();
450
+ } catch (err) {
451
+ throw new Error(`WebGPU initialization failed. ${err}`);
452
+ } finally {
453
+ this.#busy = false;
454
+ }
455
+ }
456
+ static setup() {
457
+ if (this.#device == null) throw new Error(`WebGPU device failed to load.`);
458
+ this.#uboBuffer = this.#device.createBuffer({
459
+ size: 48,
460
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
461
+ });
462
+ this.#gpuBuffer = this.#device.createBuffer({
463
+ size: 16,
464
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC
465
+ });
466
+ this.#cpuBuffer = this.#device.createBuffer({
467
+ size: 16,
468
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
469
+ });
470
+ this.#bindGroupLayout = this.#device.createBindGroupLayout({
471
+ entries: [
472
+ {
473
+ binding: 0,
474
+ visibility: GPUShaderStage.COMPUTE,
475
+ buffer: { type: "uniform" }
476
+ },
477
+ {
478
+ binding: 1,
479
+ visibility: GPUShaderStage.COMPUTE,
480
+ buffer: { type: "storage" }
481
+ }
482
+ ]
483
+ });
484
+ this.#pipeline = this.#device.createComputePipeline({
485
+ layout: this.#device.createPipelineLayout({
486
+ bindGroupLayouts: [this.#bindGroupLayout]
487
+ }),
488
+ compute: {
489
+ entryPoint: "main",
490
+ module: this.#device.createShaderModule({
491
+ code: compute_default
492
+ })
493
+ }
494
+ });
495
+ }
496
+ static reset() {
497
+ console.warn(`GPU device lost. Reinitializing...`);
498
+ _NanoPowGpu.#cpuBuffer?.destroy();
499
+ _NanoPowGpu.#gpuBuffer?.destroy();
500
+ _NanoPowGpu.#uboBuffer?.destroy();
501
+ _NanoPowGpu.#busy = false;
502
+ _NanoPowGpu.init();
503
+ }
504
+ /**
505
+ * Finds a nonce that satisfies the Nano proof-of-work requirements.
506
+ *
507
+ * @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
508
+ * @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation
509
+ */
510
+ static async search(hash, threshold = 4294967288) {
511
+ if (this.#busy) {
512
+ return new Promise((resolve) => {
513
+ setTimeout(async () => {
514
+ const result = this.search(hash, threshold);
515
+ resolve(result);
516
+ }, 100);
517
+ });
518
+ }
519
+ this.#busy = true;
520
+ if (!/^[A-Fa-f0-9]{64}$/.test(hash)) throw new TypeError(`Invalid hash ${hash}`);
521
+ if (typeof threshold !== "number") throw new TypeError(`Invalid threshold ${threshold}`);
522
+ let loads = 0;
523
+ while (this.#device == null && loads < 20) {
524
+ await new Promise((resolve) => {
525
+ setTimeout(resolve, 500);
526
+ });
527
+ }
528
+ if (this.#device == null) throw new Error(`WebGPU device failed to load.`);
529
+ let nonce = 0n;
530
+ do {
531
+ const uboView = new DataView(new ArrayBuffer(48));
532
+ for (let i = 0; i < 64; i += 8) {
533
+ const uint32 = hash.slice(i, i + 8);
534
+ uboView.setUint32(i / 2, parseInt(uint32, 16));
535
+ }
536
+ const random = Math.floor(Math.random() * 4294967295);
537
+ uboView.setUint32(32, random, true);
538
+ uboView.setUint32(36, threshold, true);
539
+ this.#device.queue.writeBuffer(this.#uboBuffer, 0, uboView);
540
+ this.#device.queue.writeBuffer(this.#gpuBuffer, 0, new Uint32Array([0, 0, 0]));
541
+ const bindGroup = this.#device.createBindGroup({
542
+ layout: this.#bindGroupLayout,
543
+ entries: [
544
+ {
545
+ binding: 0,
546
+ resource: {
547
+ buffer: this.#uboBuffer
548
+ }
549
+ },
550
+ {
551
+ binding: 1,
552
+ resource: {
553
+ buffer: this.#gpuBuffer
554
+ }
555
+ }
556
+ ]
557
+ });
558
+ const commandEncoder = this.#device.createCommandEncoder();
559
+ const passEncoder = commandEncoder.beginComputePass();
560
+ passEncoder.setPipeline(this.#pipeline);
561
+ passEncoder.setBindGroup(0, bindGroup);
562
+ passEncoder.dispatchWorkgroups(255, 255);
563
+ passEncoder.end();
564
+ commandEncoder.copyBufferToBuffer(this.#gpuBuffer, 0, this.#cpuBuffer, 0, 12);
565
+ this.#device.queue.submit([commandEncoder.finish()]);
566
+ let data = null;
567
+ try {
568
+ await this.#cpuBuffer.mapAsync(GPUMapMode.READ);
569
+ await this.#device.queue.onSubmittedWorkDone();
570
+ data = new DataView(this.#cpuBuffer.getMappedRange().slice(0));
571
+ this.#cpuBuffer.unmap();
572
+ } catch (err) {
573
+ console.warn(`Error getting data from GPU. ${err}`);
574
+ return this.search(hash, threshold);
575
+ }
576
+ if (data == null) throw new Error(`Failed to get data from buffer.`);
577
+ nonce = data.getBigUint64(0, true);
578
+ this.#busy = !data.getUint32(8);
579
+ } while (this.#busy);
580
+ return nonce.toString(16).padStart(16, "0");
581
+ }
582
+ };
583
+ export {
584
+ NanoPowGl,
585
+ NanoPowGpu
586
+ };