
    4uQj9f                         d Z ddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
 dZd Zd Zd Zd Zd	 Z G d
 de
          Zedk    r2dZ ede             e	defe                                           dS dS )u.   عدسة النقوش — SAM + كلاسيكي    N)
HTTPServerBaseHTTPRequestHandleru;  <!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
<title>عدسة النقوش</title>
<style>
*{box-sizing:border-box;margin:0;padding:0}
body{background:#1e1e24;color:#f5f5f5;font-family:system-ui;padding:15px;display:flex;flex-direction:column;align-items:center}
.card{background:#2b2b36;padding:12px;border-radius:10px;width:100%;max-width:800px}
.row{display:flex;flex-direction:row;gap:6px;flex-wrap:wrap;justify-content:center;margin-top:8px;align-items:center}
.btn{width:40px;height:40px;cursor:pointer;border-radius:6px;background:rgba(200,170,130,0.05);padding:4px}
#result{display:none;width:100%;max-width:800px;margin-top:10px;position:relative}
#result img{width:100%;border-radius:8px;border:2px solid #444;display:block;touch-action:none}
#loading{display:none;text-align:center;padding:10px}
#magnifier{display:none;position:fixed;z-index:99999;width:150px;height:150px;border-radius:50%;border:2px solid #ffcc00;pointer-events:none;overflow:hidden;background:#fff}
#magnifier img{position:absolute;top:0;left:0;max-width:none;max-height:none;border:none}
#magDot{position:absolute;top:50%;left:50%;width:5px;height:5px;background:red;border-radius:50%;transform:translate(-50%,-50%);z-index:2}
.no-callout{-webkit-touch-callout:none!important;-webkit-user-select:none!important;user-select:none!important}
#mainImg{-webkit-touch-callout:none!important;-webkit-user-select:none!important;user-select:none!important}
</style>
</head>
<body>
<img src="/naqsh-header.png" style="width:100%;max-width:600px;margin-bottom:8px;border-radius:8px">
<div id="magnifier"><img id="magImg"><div id="magDot"></div></div>
<div class="card"><div class="row">
<div style="position:relative;width:120px;height:40px;cursor:pointer;border-radius:8px;overflow:hidden;background:url('/start-btn-v3.jpg') center/cover no-repeat">
<input type="file" id="imageInput" accept="image/*" style="position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;cursor:pointer;z-index:10">
</div>
</div></div>
<div id="loading" style="display:none;text-align:center;padding:10px"><img src="/loading-anim.gif" style="width:100px;height:auto;border-radius:6px"></div>
<div id="result">
<div style="position:relative" id="imgWrap" oncontextmenu="return false">
<img id="mainImg" draggable="false" oncontextmenu="return false" class="no-callout" style="width:100%;border-radius:8px;border:2px solid #444;display:block;touch-action:none">
<canvas id="overlayCanvas" style="display:none;position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;border-radius:8px"></canvas>
</div>
<div class="row" style="width:100%;max-width:800px">
<img src="/undo-icon.png" onclick="undoLast()" title="تراجع" class="btn">
<img id="toggleBtn" src="/view-icon.png" onclick="toggleView()" title="الأصل" class="btn" style="opacity:0.4">
<img id="brushBtn" src="/brush-icon.png" onclick="toggleBrush()" title="فرشاة" class="btn">
<img src="/download-icon.png" onclick="downloadResult()" title="تحميل" class="btn">
</div>
</div>
<div id="waitToast" style="display:none;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:99998;background:#1e1e24;border:3px solid #ffcc00;padding:15px;border-radius:16px">⏳</div>
<script>
let stepCount=0,magActive=false,magTimer=null,isScrolling=false;
let samActive=false,brushMode=false,currentResult=null;
let layerState=0,layerCanvas=null,_curLayer=0;

function enableToggleBtn(){const b=document.getElementById('toggleBtn');b.style.opacity='1';b.style.cursor='pointer'}
function toggleBrush(){brushMode=!brushMode;const b=document.getElementById('brushBtn');b.style.background=brushMode?'#e6b800':''}

document.getElementById('imageInput').addEventListener('change',function(){if(this.files[0])startAnalysis()});

async function startAnalysis(){
 const f=document.getElementById('imageInput').files[0];if(!f)return;
 document.getElementById('loading').style.display='block';
 document.getElementById('result').style.display='none';
 const fd=new FormData();fd.append('image',f);
 try{
  const r=await fetch('/sam_init',{method:'POST',body:fd});const d=await r.json();
  if(d.error){alert(d.error);document.getElementById('loading').style.display='none';return}
  document.getElementById('mainImg').src='data:image/jpeg;base64,'+d.original;
  document.getElementById('result').style.display='block';samActive=true;
  document.getElementById('loading').style.display='none';
  enableClicks();
 }catch(e){alert('خطأ: '+e.message);document.getElementById('loading').style.display='none'}
}

function enableClicks(){
 const img=document.getElementById('mainImg');
 img.addEventListener('touchstart',magStart,{passive:false});
 img.addEventListener('touchmove',magMove,{passive:false});
 img.addEventListener('touchend',magEnd,{passive:false});
 img.addEventListener('touchcancel',magCancel,{passive:false});
}

async function submitClick(x,y){
 stepCount++;document.getElementById('waitToast').style.display='block';
 const fd=new FormData();fd.append('image',document.getElementById('imageInput').files[0]);
 fd.append('x',x.toFixed(2));fd.append('y',y.toFixed(2));
 try{
  const r=await fetch('/sam_click',{method:'POST',body:fd});const d=await r.json();
  if(d.error){alert(d.error);document.getElementById('waitToast').style.display='none';return}
  const img=document.getElementById('mainImg');
  if(!img._orig)img._orig=img.src;
  currentResult=d.result_img||d.overlay;
  goLayer(2);
 }catch(e){alert('خطأ: '+e.message)}
 document.getElementById('waitToast').style.display='none'}

var _curLayer=0;

function goLayer(n){
 const img=document.getElementById('mainImg');
 if(n==1){
  if(img._orig)img.src=img._orig;
  _curLayer=1;
 }else if(n==2&&currentResult&&img._orig){
  _curLayer=2;
  showOrigPlusSelection(img);
 }else if(n==3&&currentResult){
  _curLayer=3;
  img.src='data:image/png;base64,'+currentResult;
 }
 updateLayerBtn();
}

function updateLayerBtn(){
 const b=document.getElementById('toggleBtn');
 if(_curLayer==1){b.src='/view-icon.png';b.title='الأصل';b.style.opacity='1'}
 else if(_curLayer==2){b.src='/layer1-icon.png';b.title='الطبقة 1'}
 else if(_curLayer==3){b.src='/layer2-icon.png';b.title='الطبقة 2'}
}

gleView(){
 if(!currentResult)return;
 if(_curLayer==1)goLayer(2);
 else if(_curLayer==2)goLayer(3);
 else goLayer(1);
}

function showOrigPlusSelection(img){
 // Composite original + SAM result onto img
 const w=img.naturalWidth||img.width, h=img.naturalHeight||img.height;
 const c=document.createElement('canvas');c.width=w;c.height=h;
 const cx=c.getContext('2d');
 const orig=new Image();
 orig.onload=function(){
  cx.drawImage(orig,0,0,w,h);
  // Load SAM result as overlay
  const ov=new Image();
  ov.onload=function(){
   const t=document.createElement('canvas');t.width=w;t.height=h;
   const tx=t.getContext('2d');tx.drawImage(ov,0,0,w,h);
   const d=tx.getImageData(0,0,w,h);
   for(let i=0;i<d.data.length;i+=4){
    if(d.data[i]+d.data[i+1]+d.data[i+2]<600)d.data[i+3]=0;
   }
   tx.putImageData(d,0,0);
   cx.drawImage(t,0,0);
   // Also add brush overlay
   if(window._brushOv){
    const b=document.createElement('canvas');b.width=w;b.height=h;
    const bx=b.getContext('2d');bx.putImageData(window._brushOv,0,0);
    cx.drawImage(b,0,0);
   }
   img.src=c.toDataURL();
  };
  ov.src='data:image/png;base64,'+currentResult;
 };
 if(img._orig)orig.src=img._orig;
 else orig.src=img.src;
}on submitClick(x,y){
 stepCount++;document.getElementById('waitToast').style.display='block';
 const fd=new FormData();fd.append('image',document.getElementById('imageInput').files[0]);
 fd.append('x',x.toFixed(2));fd.append('y',y.toFixed(2));
 try{
  const r=await fetch('/sam_click',{method:'POST',body:fd});const d=await r.json();
  if(d.error){alert(d.error);document.getElementById('waitToast').style.display='none';return}
  const img=document.getElementById('mainImg');
  if(!img._orig)img._orig=img.src;
  currentResult=d.result_img||d.overlay;
  // Just store the result - DON'T change the image at all
  document.getElementById('overlayCanvas').style.display='none';
  // Clear previous overlay data
  window._ovData=null;
  // Enable the toggle button
  layerState=0;
  enableToggleBtn();
  // Auto-show selection on original
  showLayer(1);
  document.getElementById('toggleBtn').src='/layer1-icon.png';
  document.getElementById('toggleBtn').title='الطبقة 1';
  layerState=1;
 }catch(e){alert('خطأ: '+e.message)}
 document.getElementById('waitToast').style.display='none'}

wLayer(n){
 const img=document.getElementById('mainImg');
 const ov=document.getElementById('overlayCanvas');
 if(n==2){
  ov.style.display='none';
  img.src='data:image/png;base64,'+currentResult;
 }else if(n==1){
  // Composite SAM result + brush directly onto image
  ov.style.display='none';
  if(currentResult){
   // Wait for original to load, then composite
   if(img._orig)img.src=img._orig;
   if(img.complete){
    doComposite(img,currentResult);
   }else{
    img.onload=function(){doComposite(img,currentResult)};
   }
  }
 }else{
  ov.style.display='none';
  if(img._orig)img.src=img._orig;
 }
}

omposite(img,b64){
 const w=img.naturalWidth||img.width, h=img.naturalHeight||img.height;
 const c=document.createElement('canvas');c.width=w;c.height=h;
 const cx=c.getContext('2d');cx.drawImage(img,0,0,w,h);
 // Draw brush overlay if exists
 if(window._brushOv){
  const t=document.createElement('canvas');t.width=w;t.height=h;
  const tx=t.getContext('2d');
  tx.putImageData(window._brushOv,0,0);
  cx.drawImage(t,0,0);
 }
 // Draw SAM result overlay
 const ov=new Image();
 ov.onload=function(){
  const t=document.createElement('canvas');t.width=w;t.height=h;
  const tx=t.getContext('2d');tx.drawImage(ov,0,0,w,h);
  const d=tx.getImageData(0,0,w,h);
  for(let i=0;i<d.data.length;i+=4){
   if(d.data[i]+d.data[i+1]+d.data[i+2]<600){
    d.data[i]=0;d.data[i+1]=0;d.data[i+2]=0;d.data[i+3]=0;
   }
  }
  tx.putImageData(d,0,0);
  cx.drawImage(t,0,0);
  img.src=c.toDataURL();
  document.getElementById('toggleBtn').src='/layer1-icon.png';
 };
 ov.src='data:image/png;base64,'+b64;
}

dAndComposite(img,resultB64){
 const c=document.createElement('canvas');
 c.width=img.naturalWidth;c.height=img.naturalHeight;
 const cx=c.getContext('2d');
 cx.drawImage(img,0,0,c.width,c.height);
 const overlay=new Image();
 overlay.onload=function(){
  // Draw white selection lines from result onto original
  const t=document.createElement('canvas');
  t.width=c.width;t.height=c.height;
  const tx=t.getContext('2d');
  tx.drawImage(overlay,0,0,c.width,c.height);
  const d=tx.getImageData(0,0,c.width,c.height);
  for(let i=0;i<d.data.length;i+=4){
   if(d.data[i]+d.data[i+1]+d.data[i+2]<600){
    d.data[i+3]=0;
   }
  }
  tx.putImageData(d,0,0);
  cx.drawImage(t,0,0);
  img.src=c.toDataURL();
 };
 overlay.src='data:image/png;base64,'+resultB64;
}

function toggleView(){
 const btn=document.getElementById('toggleBtn');
 if(btn.style.opacity=='0.4')return;
 if(!currentResult)return;
 if(layerState==0){showLayer(1);btn.src='/layer1-icon.png';btn.title='الطبقة 1';layerState=1}
 else if(layerState==1){showLayer(2);btn.src='/layer2-icon.png';btn.title='الطبقة 2';layerState=2}
 else{showLayer(0);btn.src='/view-icon.png';btn.title='الأصل';layerState=0}
}

function magStart(e){
 if(e.touches.length>1)return;const t=e.touches[0];
 startTX=t.clientX;startTY=t.clientY;isScrolling=false;
 if(magTimer)clearTimeout(magTimer);
 magTimer=setTimeout(function(){magTimer=null;if(!isScrolling){magActive=true;document.getElementById('magnifier').style.display='block';updateMag(t.clientX,t.clientY)}},350)
}
function magMove(e){
 if(e.touches.length>1){if(magTimer)clearTimeout(magTimer);if(magActive){magActive=false;document.getElementById('magnifier').style.display='none'}return}
 const t=e.touches[0];
 if(magActive){
  e.preventDefault();updateMag(t.clientX,t.clientY);
  if(brushMode){
   const img=document.getElementById('mainImg'),r=img.getBoundingClientRect();
   const x=((t.clientX-r.left)/r.width)*100,y=((t.clientY-r.top)/r.height)*100;
   const ov=document.getElementById('overlayCanvas');
   if(ov.width!=img.naturalWidth||ov.height!=img.naturalHeight){
    ov.width=img.naturalWidth;ov.height=img.naturalHeight;
    ov.getContext('2d').clearRect(0,0,ov.width,ov.height);
   }
   ov.style.display='block';
   const ctx=ov.getContext('2d');
   if(!ov._bx){ov._bx=x;ov._by=y}
   ctx.beginPath();ctx.moveTo(ov._bx/100*ov.width,ov._by/100*ov.height);
   ctx.lineTo(x/100*ov.width,y/100*ov.height);
   ctx.strokeStyle='rgba(255,255,255,0.9)';ctx.lineWidth=6;ctx.lineCap='round';ctx.lineJoin='round';ctx.stroke();
   ov._bx=x;ov._by=y;
  }
 }else if(magTimer&&(Math.abs(t.clientX-startTX)>10||Math.abs(t.clientY-startTY)>10)){isScrolling=true;clearTimeout(magTimer);magTimer=null}
}
function magEnd(e){
 if(magTimer){clearTimeout(magTimer);magTimer=null;return}
 if(!magActive)return;document.getElementById('magnifier').style.display='none';magActive=false;
 if(isScrolling||!samActive)return;
 const img=document.getElementById('mainImg'),r=img.getBoundingClientRect();
 const t=e.changedTouches[0];
 const x=((t.clientX-r.left)/r.width)*100,y=((t.clientY-r.top)/r.height)*100;
 if(x<0||x>100||y<0||y>100)return;
 if(brushMode){const ov=document.getElementById('overlayCanvas');ov._bx=null;ov._by=null;window._brushOv=ov.getContext('2d').getImageData(0,0,ov.width,ov.height);enableToggleBtn();return}
 submitClick(x,y)
}
function magCancel(e){if(magTimer)clearTimeout(magTimer);magActive=false;isScrolling=false;document.getElementById('magnifier').style.display='none'}
function updateMag(mx,my){
 const img=document.getElementById('mainImg'),r=img.getBoundingClientRect(),mag=document.getElementById('magnifier'),magImg=document.getElementById('magImg');
 let mx2=mx-75,my2=my-130;if(mx2<5)mx2=5;if(mx2>window.innerWidth-155)mx2=window.innerWidth-155;if(my2<5)my2=my+50;
 mag.style.left=mx2+'px';mag.style.top=my2+'px';
 magImg.src=img.src;magImg.style.width=(r.width*2.5)+'px';magImg.style.height=(r.height*2.5)+'px';
 magImg.style.left=(-(mx-r.left)*2.5+75)+'px';magImg.style.top=(-(my-r.top)*2.5+75)+'px'
}
function downloadResult(){if(!currentResult)return;const a=document.createElement('a');a.download='result.png';a.href='data:image/png;base64,'+currentResult;a.click()}
async function undoLast(){if(stepCount<=0)return;stepCount--;document.getElementById('waitToast').style.display='block';const fd=new FormData();fd.append('step',stepCount);try{const r=await fetch('/sam_undo',{method:'POST',body:fd});const d=await r.json();if(d.error){alert(d.error);document.getElementById('waitToast').style.display='none';return}const img=document.getElementById('mainImg');const ov=document.getElementById('overlayCanvas');ov.style.display='none';window._overlayData=null;img.src='data:image/png;base64,'+(d.overlay||d.result_img);currentResult=d.overlay||d.result_img;document.getElementById('toggleBtn').src='/view-icon.png';document.getElementById('toggleBtn').title='الأصل';layerState=0}catch(e){alert('خطأ: '+e.message)}document.getElementById('waitToast').style.display='none'}
</script>
</body>
</html>c                    t          j        | t           j                  }t          j        |t          j                  }|dS |j        d d         \  }}|dk    r,d|z  }t          j        |dt          ||z            f          }t          j	        d|t          j
        dg          \  }	}
t          j        |
                                          }t          j        |t          j                  }t          j        dd          }|                    |          }t          j        |d	d
          }|dz  dk    r|n|dz   }t          j        |dt          j        t          j        ||          }t          j        dt           j                  }t          j        |t          j        |d          }t          j        |          }t          j	        d|          \  }	}t          j        |                                          }||dd fS )NNu#   خطأ في قراءة الصورة   i  .jpgU   g      @)   r
   )	clipLimittileGridSize)   r   r         )r   r   )
iterations.png)original
result_img)np
frombufferuint8cv2imdecodeIMREAD_COLORshaperesizeintimencodeIMWRITE_JPEG_QUALITYbase64	b64encodedecodecvtColorCOLOR_BGR2GRAYcreateCLAHEapplyGaussianBluradaptiveThresholdADAPTIVE_THRESH_GAUSSIAN_CTHRESH_BINARY_INVonesmorphologyEx
MORPH_OPENbitwise_not)	img_bytesmin_valmax_val	thickness	img_arrayimghwratio_orig_buforig_b64grayclaheenhancedblurredbsthreshkernelcleanedwhite
result_buf
result_b64s                          "/var/www/html/petroglyph_server.pyprocess_image_bytesrF   I  s   i22I
,y#"2
3
3C
{FF9RaR=DAq4xxq
3s1u9~~0F G G#,vsS-Er,JKKKAx))0022H<S/00DOc???E{{4  Hx33GaK1$$'A+B"7C1OQTQfhjlsttFWVRX&&Fvs~v!LLLGOG$$EL//MAz!*--4466J 
;;TAA    c                    ddl m}m} t          j        | t          j                  }t          j        |t          j                  }|dS |j	        d d         \  }}|dk    r,d|z  }t          j
        |dt          ||z            f          }t          j        d|t          j        dg          \  }}	t          j        |	                                          }
 |d         d	
          } ||          }|                    t          j        |t          j                             t)          dd          5 }t+          j        ||           d d d            n# 1 swxY w Y   t)          dd          5 }t+          j        |j	        d         |j	        d         d|           d d d            n# 1 swxY w Y   t          j        |          dz  }t          j        d|           t          j        d|          \  }}t          j        |                                          }t3          j        d          D ].}|                    d          rt3          j        d|            /t          j        d|           t)          dd          5 }|                    d           d d d            n# 1 swxY w Y   |
|dd fS )Nr   )sam_model_registrySamPredictorr   r      r   r	   vit_bz"/var/www/html/sam_vit_b_01ec64.pth)
checkpoint/tmp/sam_predictor.pklwb/tmp/sam_dims.pklr   )img_himg_wr   /tmp/sam_white.pngr   z/tmp	sam_hist_z/tmp/z/tmp/sam_hist_0.png/tmp/sam_count.txtr5   0)r   rB   )segment_anythingrI   rJ   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   	set_imager"   COLOR_BGR2RGBopenpickledump	ones_likeimwriteoslistdir
startswithremovewrite)r.   rI   rJ   r2   r3   r4   r5   r6   r7   r8   r9   sam	predictorfrB   	white_buf	white_b64s                    rE   process_image_bytes_sam_initri   _  s   AAAAAAAAi22I
,y#"2
3
3C
{FF9RaR=DAq3wwasz#SU^^/DEE,vsS-Er,JKKKAx))0022H
%
W
%1U
V
V
VCS!!IS#*;<<===	&	-	-MFK	14M4M4MMMMMMMMMMMMMMMM	!4	(	(mAv{SYq\\_\efg\h;i;ikl/m/m/mmmmmmmmmmmmmmmmL#EK$e,,,<..LAy ++2244IZ = =<<$$<bi&<&<&<K%u---	"C	(	(;Aqwws|||;;;;;;;;;;;;;;; 955t;;s6   9EE"E6/F11F58F5J00J47J4c                 n   ddl m} t          j        | t          j                  }t          j        |t
          j                  }|dS |j        d d         \  }}|dk    r,d|z  }t          j	        |dt          ||z            f          }t          dd          5 }	t          j        |	          }
d d d            n# 1 swxY w Y   t          |dz  |
d	         z            }t          |dz  |
d
         z            }t          dd          5 }	t          j        |	          }d d d            n# 1 swxY w Y   |                    t          j        ||gg          t          j        dg          d          \  }}}|d         }|dz                      t          j                  }t          j        |t
          j        t
          j                  \  }}t          j        d          }|t          j        |          dz  }t          j        ||ddd           t          j        d|           t          dd          5 }	t          |	                                                                          }d d d            n# 1 swxY w Y   |dz  }t          j        d| d|           t          dd          5 }	|	                    t7          |                     d d d            n# 1 swxY w Y   t          j        d|          \  }}t;          j        |                                          }d|id fS )Nr   rJ   r   r   rK   rP   rb      Y@rR   rQ   rN   r   Fpoint_coordspoint_labelsmultimask_outputr   rS   )r   r   r   rU   r/tmp/sam_hist_r   r5   r    rW   rJ   r   r   r   r   r   r   r   r   r   rZ   r[   loadpredictarrayastypefindContoursRETR_EXTERNALCHAIN_APPROX_SIMPLEimreadr]   drawContoursr^   readstriprc   strr   r   r    r!   r.   click_xclick_yrJ   r2   r3   r4   r5   r6   rf   dimspxpyre   masksscoreslogitsmask
mask_uint8contoursr7   rB   cntrC   rD   s                            rE   process_image_bytes_sam_clickr   y  s^   ------i22I
,y#"2
3
3C
{FF9RaR=DAq3wwasz#SU^^/DEE	!4	(	(DAfk!nntDDDDDDDDDDDDDDD	gog.	/	/B	gog.	/	/B	&	-	-NAINNNNNNNNNNNNNNN%--28b"XJ;O;O^`^fhigj^k^k  D-  E  EE668D4#:"5"5bh"?"?Z":s/@#BYZZKHaJ+,,E}bl3//#5eUHb)Q777K$e,,,	"C	(	(JAS9I9I5J5JsJJJJJJJJJJJJJJJ1HCK****E222	"C	(	(@Aqwws3xx/@/@/@@@@@@@@@@@@@@@@L//MAz!*--4466J*%t++H   B>>CCD00D47D4 4J  JJ9#K((K,/K,c                    d|  d}t           j                            |          sdS t          j        |          }t          j        d|           t          dd          5 }|                    t          |                      ddd           n# 1 swxY w Y   t          j	        d|          \  }}t          j        |                                          }d|idfS )	zLoad history at given steprt   r   )Nu'   لا يوجد خطوات للتراجعrS   rU   r5   Nr   )r_   pathexistsr   r}   r^   rZ   rc   r   r   r   r    r!   )step	hist_pathrB   rf   r7   rC   rD   s          rE   process_image_bytes_sam_undor     s    ++++I7>>)$$\-\-\Jy!!EK$e,,,	"C	(	(AAqwws4yy/A/A/AAAAAAAAAAAAAAAAL//MAz!*--4466J*%t++s   !#BBBc                 n   ddl m} t          j        | t          j                  }t          j        |t
          j                  }|dS |j        dd         \  }}|dk    r,d|z  }t          j	        |dt          ||z            f          }t          dd          5 }	t          j        |	          }
ddd           n# 1 swxY w Y   t          |d	z  |
d
         z            }t          |d	z  |
d         z            }t          dd          5 }	t          j        |	          }ddd           n# 1 swxY w Y   |                    t          j        ||gg          t          j        dg          d          \  }}}|d         }|dz                      t          j                  }t          j        |t
          j        t
          j                  \  }}t          j        d          }|t          j        |          dz  }t          j        ||ddd           t          j        d|           t          dd          5 }	t          |	                                                                          }ddd           n# 1 swxY w Y   |dz  }t          j        d| d|           t          dd          5 }	|	                    t7          |                     ddd           n# 1 swxY w Y   t          j        d|          \  }}t;          j        |                                          }d|idfS )z3Erase at click point: draw white over the mask arear   rk   Nr   r   rK   rP   rl   rm   rR   rQ   rN   r   Frn   r   rS   rr   )r   r   r   rU   rs   rt   r   r5   r   ru   r   s                            rE   process_image_bytes_sam_eraser     s^   ------i22I
,y#"2
3
3C
{FF9RaR=DAq3wwasz#SU^^/DEE	!4	(	(DAfk!nntDDDDDDDDDDDDDDD	gog.	/	/B	gog.	/	/B	&	-	-NAINNNNNNNNNNNNNNN%--28b"XJ;O;O^`^fhigj^k^k  D-  E  EE668D4#:"5"5bh"?"?Z":s/@#BYZZKHaJ+,,E}bl3//#5eUHb/2>>>K$e,,,	"C	(	(JAS9I9I5J5JsJJJJJJJJJJJJJJJ1HCK****E222	"C	(	(@Aqwws3xx/@/@/@@@@@@@@@@@@@@@@L//MAz!*--4466J*%t++r   c                   &    e Zd Zd Zd Zd Zd ZdS )Handlerc                     |                      d           |                     dd           |                                  | j                            t
                                                     d S )N   Content-Typeztext/html; charset=utf-8)send_responsesend_headerend_headerswfilerc   	HTML_PAGEencode)selfs    rE   do_GETzHandler.do_GET  sg    3)CDDD
))++,,,,,rG   c                    | j         d         }t          | j         d                   }| j                            |          }|                    d          d                                         }|                    d|z             }| j        }|dk    rd }d}d}	d}
|D ]m}d	|vrd
|v r>|                    d          }|dk    r ||dz   d                              d          nd }Jd|v r]|                    d          }|dk    r?t          ||dz   d                              d          	                                          n|}d|v r^|                    d          }|dk    r?t          ||dz   d                              d          	                                          n|	}	d|v r\|                    d          }|dk    r?t          ||dz   d                              d          	                                          n|
}
o|s| 
                    ddi           d S t          |||	|
          \  }}|r| 
                    d|i           d S | 
                    |           d S |dk    rd }|D ]G}d	|v rAd
|v r=|                    d          }|dk    r ||dz   d                              d          } nH|s| 
                    ddi           d S t          |          \  }}|r| 
                    d|i           d S | 
                    |           d S |dk    rvd }d}d}|D ]}d	|vrd
|v r>|                    d          }|dk    r ||dz   d                              d          nd }Jd|v r]|                    d          }|dk    r?t          ||dz   d                              d          	                                          n|}d|v r\|                    d          }|dk    r?t          ||dz   d                              d          	                                          n|}|s| 
                    ddi           d S t          |||          \  }}|r| 
                    d|i           d S | 
                    |           d S |dk    rd}|D ]f}d	|v r`d|v r\|                    d          }|dk    r?t          ||dz   d                              d          	                                          } ngt          |          \  }}|r| 
                    d|i           d S | 
                    |           d S |dk    rvd }d}d}|D ]}d	|vrd
|v r>|                    d          }|dk    r ||dz   d                              d          nd }Jd|v r]|                    d          }|dk    r?t          ||dz   d                              d          	                                          n|}d|v r\|                    d          }|dk    r?t          ||dz   d                              d          	                                          n|}|s| 
                    ddi           d S t!          |||          \  }}|r| 
                    d|i           d S | 
                    |           d S d S )Nr   zContent-Length=r   s   --z/process   
   s   Content-Dispositions   name="image"s   

rr      s   
--s   name="min_val"s   name="max_val"s   name="thickness"erroru,   لم يتم العثور على الصورةz	/sam_initz
/sam_clickg      I@s   name="x"s   name="y"z	/sam_undor   s   name="step"z
/sam_erase)headersr   rfiler   splitr   r   findrstripr!   _jsonrF   ri   floatr   r   r   )r   ctclbodyboundarypartsr   r.   r/   r0   r1   pirs   ecxcyr   s                     rE   do_POSTzHandler.do_POST  s   \.)DLAQ4R0S0S2zr""rxx}}Q/?/F/F/H/HH

58+,,y:IgbGa) T T)22H"a''QVVK-@-@klnpkpkpaPQRSPSPTPTgnn]fNgNgNgvz))&!++1D1DQ{|  A  |A  |APSTUVWXYVYVZVZT[TbTbclTmTmTtTtTvTvPwPwPw  GNgg&!++1D1DQ{|  A  |A  |APSTUVWXYVYVZVZT[TbTbclTmTmTtTtTvTvPwPwPw  GNgg(A--166+3F3Fq  @A  CE  @E  @ETWXYZ[\]Z]Z^Z^X_XfXfgpXqXqXxXxXzXzT{T{T{  KT	kdjj'3a)bcccekek&y'7INNDAq2$**gq\***FFJJqMMMMM[  I  )Q..?a3G3G{++ABwwAacddGNN9,E,E	Ekdjj'3a)bcccekek/	::DAq2$**gq\***FFJJqMMMMM\!!I4bd @ @)22H"a''QVVK-@-@klnpkpkpaPQRSPSPTPTgnn]fNgNgNgvz)) A%%166++>+>qrsuwrwrwU1QqSTT7>>ZcKdKdKkKkKmKmEnEnEn} A%%166++>+>qrsuwrwrwU1QqSTT7>>ZcKdKdKkKkKmKmEnEnEn}kdjj'3a)bcccekek0BCCDAq2$**gq\***FFJJqMMMMM[  D  )Q..>Q3F3F{++ABwws1QqSTT7>>)+D+D+K+K+M+M'N'NE/55DAq2$**gq\***FFJJqMMMMM\!!I4bd @ @)22H"a''QVVK-@-@klnpkpkpaPQRSPSPTPTgnn]fNgNgNgvz)) A%%166++>+>qrsuwrwrwU1QqSTT7>>ZcKdKdKkKkKmKmEnEnEn} A%%166++>+>qrsuwrwrwU1QqSTT7>>ZcKdKdKkKkKmKmEnEnEn}kdjj'3a)bcccekek0BCCDAq2$**gq\***FFJJqMMMMM "!rG   c                     |                      d           |                     dd           |                                  | j                            t          j        |                                                     d S )Nr   r   zapplication/json)r   r   r   r   rc   jsondumpsr   )r   datas     rE   r   zHandler._json  sq    3);<<<
D))002233333rG   c                     d S )N )r   as     rE   log_messagezHandler.log_message  s      rG   N)__name__
__module____qualname__r   r   r   r   r   rG   rE   r   r     sI        - - -
; ; ;x4 4 4
 $####rG   r   __main__i  u5   ✍️ عدسة النقوش على http://localhost:z0.0.0.0)__doc__r   numpyr   r   r   r[   r_   http.serverr   r   r   rF   ri   r   r   r   r   r   portprintserve_foreverr   rG   rE   <module>r      sO   4 4 



                     : : : : : : : :~	@
B B B,< < <4, , ,8	, 	, 	,, , ,:G$ G$ G$ G$ G$$ G$ G$ G$R zD	E
H$
H
HIIIJ	4 '**88::::: rG   