Ë
    ¬2ÓjÒM  ã                   ól  — 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 ddlm	Z	  e	e
«      j                  «       j                  j                  Zej                  j                  d e e	e
«      j                  «       j                  «      «       ddlmZmZ ddlmZ edz  dz  Zed	z  d
z  ZdZedz  Z ee«      ej                  vr"ej                  j                  d ee«      «       d„ Zed	z  dz  Zd„ ZdZdZddddœZddddddddddddd œZ d9d!„Z!d"„ Z"ed#z   ez   Z#g d¢Z$g d$¢Z%g d%¢g d&¢d'd(gd)d*gd+d,gd$œZ&g d-¢d.d/gd0gdœZ'g d1¢g d2¢g d3¢dœZ(d:d4„Z)d5„ Z*d6„ Z+e,d7k(  r		  e+«        yy# e-$ r.Z. e/e.j`                  e«      r ed8e.j`                  z  «       ‚ dZ.[.we1$ rZ. ed8e.z  «       ‚ dZ.[.ww xY w);aí  
Prueba visual de la limpieza de accesorios (Engine/clean_accesorios.py).

Genera 1 imagen por personaje con una pose NEUTRA para comprobar que:
  - el LoRA sigue cargando (si el personaje sale generico, es que el LoRA
    no esta o el prompt se rompio)
  - los accesorios de CABEZA siguen (sombrero de Furina, X de Rem, trebol de Seed)
  - ya NO sale collar/joyas/tacones/bandas que quitamos

Usa el ensamblador REAL de test_blocks.assemble_prompt, asi que el prompt lleva
la estructura vigente (MASTER / chica / BREAK / bloque de pose).

    python Engine/test_accesorios.py --dry-run     # imprime los prompts
    python Engine/test_accesorios.py               # genera las 3
    python Engine/test_accesorios.py --seed 12345  # A/B reproducible
é    N)Údatetime)ÚPath)ÚPromptBuilderÚparse_character_line)Úassemble_promptÚArchivoszpersonajes.txtÚOutputÚtest_accesorioszhttp://127.0.0.1:7860c                 ój   — 	 ddl m}  || «       y # t        $ r}t        d|z  «       Y d }~y d }~ww xY w)Nr   )Úsend_telegram_msgz![i] aviso Telegram no enviado: %s)Únotifierr   Ú	ExceptionÚprint)Úmessager   Úes      ú8C:\Users\Usuario\Downloads\NEW\Engine\test_accesorios.pyÚnotifyr   +   s3   € ð7Ý.Ù˜'Õ"øÜò 7ÜÐ1°AÑ5×6Ñ6ûð7ús   ‚ ‘	2š-­2z.tandas_avisadasc           
      óv  — 	 t         j                  «       r-t        t         j                  d¬«      j	                  «       «      n	t        «       }| D �cg c]	  }||vsŒ|‘Œ }}|st        d«       y t        d||||j                  dj                  | «      fz  «       	 t         j                  j                  dd¬«       t         j                  dj                  t        |t        | «      z  «      «      d¬«       y # t
        $ r t        «       }Y ŒÁw xY wc c}w # t
        $ r}t        d	|z  «       Y d }~y d }~ww xY w)
Núutf-8©Úencodingz4[i] tanda ya avisada (claves vistas); no se reenvia.uC   âœ… Tanda terminada
%d imagenes â€” modo %s, seed %s
Carpeta: %s
%sú, T©ÚparentsÚexist_okÚ
z2[i] no se pudo escribir el centinela de tandas: %s)Ú
TANDA_FLAGÚexistsÚsetÚ	read_textÚ
splitlinesÚOSErrorr   r   ÚnameÚjoinÚparentÚmkdirÚ
write_textÚsorted)	ÚtargetsÚn_imagesÚmodoÚseedÚout_dirÚyaÚtÚnuevasr   s	            r   Úavisar_tandar1   :   s%  € ðä×"Ñ"Ô$ô ”*×&Ñ&°Ð&Ó8×CÑCÓEÔFÜ*-«%ð 	ñ !Ó0™�A A¨R¢KŠa˜€FÐ0ÙÜÐDÔEØÜ
ð à˜˜d G§L¡L°$·)±)¸GÓ2DÐEñFô GðHÜ×Ñ×Ñ¨°tÐÔ<Ü×Ñ˜dŸi™i¬¨r´C¸³LÑ/@Ó(AÓBØ'.ð 	õ 	0øô ò Ü‹UŠðüâ0øô ò HÜÐBÀQÑF×GÑGûðHús7   ‚AC9 Á	DÁDÂAD Ã9DÄDÄ	D8Ä D3Ä3D8z\front view, standing, smile, simple background, white background, dynamic pose, dynamic shotzjeans, white blousez‚thigh strap, thigh band, thighhighs, garter, garter belt, belt, collar, choker, necklace, gemstone, brooch, jewelry, blue gemstoneÚ )ÚFurinaÚReZero_Rem_IlluXLÚ,Hoseki_ZenlessZoneZero_Seed_IllustriousXL_v1zqsleeves, long sleeves, puffy sleeves, detached sleeves, cutout, shoulder cutout, clothing cutout, collar, jewelryz2shorts, short shorts, side slit shorts, thighhighszLsleeves, puffy sleeves, puffy short sleeves, detached sleeves, blouse, shirtz2sleeves, detached sleeves, shorts, collar, jewelryzCcutout, cleavage cutout, clothing cutout, cleavage, collar, jewelryzŽbikini, swimsuit, one-piece swimsuit, bikini top, bikini bottom, leotard, bodysuit, choker, collar, necklace, jewelry, clothing cutout, cutoutz„metal gorget, gorget, single pauldron, pauldron, armor, shoulder armor, armlet, arm band, armband, collar, necklace, choker, jewelryz:gem, jewel, gemstone, brooch, yellow gem, pendant, jewelryzÈbodysuit, leotard, swimsuit, one-piece swimsuit, armor, breastplate, chest armor, gold armor, bra, bikini top, chest cups, glove, white glove, thigh strap, sash, ribbon, pink ribbon, collar, neck ringz<necklace, choker, collar, jewelry, chain, pendant, neck ringzccensor bar, heart censor bar, heart, pasties, underwear, panties, bikini bottom, thong, black heartzBcollar, choker, spiked collar, neck ring, necklace, studded collar)ú.eris-boreas-greyrat-s1-ponyxl-lora-nochekaiserÚMelonyPokemonúagnes-tachyon-nekoforgeú6elinalise-dragonroad-s2-illustriousxl-lora-nochekaiserÚdomina_overwatch_ilxl_goofyÚVentiILz"training_8576657-20260726000628564z
Sense illuÚAngewomonDigimonIXLz(Robertlu1021_yunli_honkai_star_rail_v2.0ÚAsaÚJN_Ellen_Joe_Illusc                 óŽ   — g }| s|j                  t        «       |j                  t        «       dj                  d„ |D «       «      S )zÜBloque de pose (tramo normal, SIN pesos: strip_weights_of los borra).

    La negacion por sesgo del LoRA NO va aqui, va al negative prompt: meter
    'no X' en el positivo refuerza X (medido 09-10-2026 con Furina).
    r   c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­w©N© )Ú.0Úps     r   Ú	<genexpr>zbuild_block.<locals>.<genexpr>»   s   è ø€ Ð+¡˜1ª”Q¡ùs   ‚Š)ÚappendÚOUTFITÚPOSEr$   )ÚnudeÚloraÚpartss      r   Úbuild_blockrL   ±   s9   € ð €EÙØ�‰”VÔØ	‡L�L”ÔØ�9‰9Ñ+¡Ó+Ó+Ð+ó    c                 ó¸   — t         j                  | «      xs t        j                  | d«      }|s|S |j                  «       j	                  d«      }|r|›d|›�S |S )zFUne el negative del master con el extra del personaje. Solo en --nude.r2   Ú,r   )Ú	NEG_EXTRAÚgetÚNEG_PENDIENTESÚstripÚrstrip)rJ   Úbase_negÚextraÚbases       r   Úneg_forrX   ¾   sS   € ä�M‰M˜$ÓÒ?¤>×#5Ñ#5°d¸BÓ#?€EÙØˆØ�>‰>Ó×"Ñ" 3Ó'€DÙ'+’t™UÐ#Ð6°Ð6rM   r   )r6   r7   r8   r9   r:   )zlong sleeveszshoulder cutoutzwide sleeves)zshort shortszwhite shortszside slit shortszpuffy short sleeveszpuffy sleeveszdetached sleevesÚshortszcleavage cutoutzclothing cutout)Úhatztop hatzhat bowzx hair ornamentzhair ribbonzclover hair ornament)ÚascotÚjewelryÚbroochÚgemstonez
high heels)zdetached collarzneck ribbonzblack ribbon)zbare shoulderszstirrup legwearÚarmletzwrist cuffsc                 óž  — t        | xs t        «      } i }t        j                  d¬«      j	                  «       D ]�  }|j                  «       r|j                  «       j                  d«      rŒ3t        |«      \  }}|| v sŒFt        j                  dd|j                  «       «      }||j                  «       k7  rt        d|z  «       |||<   Œ’ |S )z -> {nombre_lora: linea_original}r   r   Ú#z(?<![\w,])1girl solo(?![\w])z1girl, soloz'[fix] %s: '1girl solo' -> '1girl, solo')r   ÚTARGETSÚPERSOr    r!   rS   Ú
startswithr   ÚreÚsubr   )r)   ÚrowsÚlinerJ   Ú_Úfixeds         r   Ú
find_linesrk   ó   s²   € ä�'Ò$œWÓ%€GØ€DÜ—‘¨�Ó1×<Ñ<Ö>ˆØ�z‰zŒ|˜tŸz™z›|×6Ñ6°sÔ;ØÜ& tÓ,‰ˆˆaØ�7Š?ô
 —F‘FÐ:¸MØŸ:™:›<ó)ˆEà˜Ÿ
™
›Ò$ÜÐ?À$ÑFÔGØˆD�ŠJð ?ð €KrM   c                 óP  — t        | «      }|j                  «       s	t        |z  }g }|j                  d¬«      j	                  «       D ]\  }|j                  «       }|r|j                  d«      sd|vrŒ+|j                  |j                  dd«      d   j                  «       «       Œ^ |S )z{Lee claves de un fichero <clave>|<linea> (seccion LISTA de
    pendientes_cuerpo.txt). Ignora comentarios y lineas sin '|'.z	utf-8-sigr   ra   Ú|é   r   )	r   Úis_absoluteÚBASE_DIRr    r!   rS   rd   rF   Úsplit)ÚpathrD   ÚkeysÚlns       r   Ú	load_keysru     s�   € ô 	ˆT‹
€AØ�=‰=Œ?Ü�q‰LˆØ€DØ�k‰k ;ˆkÓ/×:Ñ:Ö<ˆØ�X‰X‹ZˆÙ�R—]‘] 3Ô'¨3°b©=ØØ�‰�B—H‘H˜S !Ó$ QÑ'×-Ñ-Ó/Õ0ð	 =ð
 €KrM   c                  ó>  — t        j                  «       } | j                  dd¬«       | j                  dt        d¬«       | j                  dt        d¬«       | j                  d	dd
¬«       | j                  ddd¬«       | j                  dd¬«       | j                  dd¬«       | j                  dt        d¬«       | j                  dt        dd¬«       | j	                  «       }|j
                  rH|j
                  j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}n÷|j                  rÒt        |j                  «      }t        |«      }|D �cg c]	  }||vsŒ|‘Œ }}|r+t        dt        |«      dj                  |d d «      fz  «       |D �cg c]	  }||v sŒ|‘Œ }}|j                  rNdd l}|j!                  |j"                  «       |j%                  |t'        |j                  t        |«      «      «      }|}n|j(                  rt*        }nt,        }|j.                  rdnd }	t        |«      }
|D �cg c]	  }||
vsŒ|‘Œ }}|rt1        d!|z  «      ‚t3        t5        t6        «      «      }|j8                  j                  «       j;                  d«      }|j<                  }dd l}	 |jA                  tB        › d"�d#¬$«      jE                  «       }t        d%|jA                  d&d'«      z  «       tH        jK                  d)d)¬*«       |j.                  rd+nd,}|j(                  r|d-z  }n#|j                  r|d.z  }n|j
                  r|d/z  }tH        |z  }|jK                  d)d)¬*«       g }|D �]  }tM        |j.                  |¬0«      }tO        ||
|   ||	¬1«      \  }}|j.                  rtQ        ||«      n|}|j.                  rd2|v sJ d3«       ‚d2|vsJ d4«       ‚t        d5«       t        d6|z  «       t        d7«       tS        |d8«      D ]  \  }}t        d9||fz  «       Œ |tT        v r$t        d:dj                  tT        |   «      z  «       |tV        v r$t        d;dj                  tV        |   «      z  «       |tX        v r$t        d<dj                  tX        |   «      z  «       ||k7  r:t        d=|t        |j                  «       j;                  d«      «      d>z   d  z  «       |jZ                  r�Œ…||d?d@|j\                  dAdBd8d8|j                   d>dCœ}t_        j^                  «       }|ja                  tB        › dD�|dE¬F«      }|jc                  «        |jE                  «       } 	 tE        jd                  | jA                  dGdH«      «      jA                  dId'«      }!|d dJ jg                  dKdL«      }"|dM|"z  z  }#|#ji                  tk        jl                  | dN   d   «      «       t        dOt_        j^                  «       |z
  |!|#jn                  fz  «       |jq                  |#jn                  ||!tr        tt        ||tV        jA                  |g «      tX        jA                  |g «      tT        jA                  |g «      |
|   dPœ«       �Œ |jZ                  rt        dQ«       y tw        jx                  «       j{                  dR«      }$|dS|$› dT�z  }%|%j}                  tE        j~                  |dUd8¬V«      dW¬X«       t        dYt        |«      |fz  «       t        dZ|%jn                  z  «       t�        |t        |«      ||j                   |«       y c c}w c c}w c c}w c c}w # tF        $ r}t1        d(|z  «      ‚d }~ww xY w# tF        $ r d'}!Y �Œêw xY w)[Nz	--dry-runÚ
store_true)Úactionz--seedéÿÿÿÿ)ÚtypeÚdefaultz--stepsé   z--nudez3desnudez al 100%%: sin outfit y force_nude='always')rx   Úhelpz--pendientesz1prueba los 5 con ropa pendiente en vez del pilotoz--keysz5claves (LoRA) separadas por coma; sobreescribe el set)r}   z--listazQfichero de claves (formato <clave>|<linea>, p.ej. Archivos/pendientes_cuerpo.txt)z--nz7con --lista: cuantas claves al azar (por defecto todas))rz   r}   z--pick-seedé*   z2semilla del sorteo con --n (no afecta a la imagen))rz   r{   r}   rO   z8[i] %d claves sin LoRA resoluble (se ignoran), p.ej.: %sr   é   r   ÚalwaysÚautoz([!] no encontradas en personajes.txt: %sz/sdapi/v1/optionsé   )Útimeoutz[-] checkpoint: %sÚsd_model_checkpointÚ?z[!] Forge no responde: %sTr   rI   ÚoutfitÚ_pendÚ_listaÚ_keys)rI   rJ   )Ú
force_nudeÚcompletely_nudez0[ABORTO] se pidio --nude pero no salio NUDE_TAGSz<[ABORTO] el outfit no se detecto como ropa y saldria desnudazO
==============================================================================z%szN==============================================================================rn   z	  [%d] %sz  ROPA EN LINEA: %sz  conserva : %sz  quitado  : %sz  NEG+     : %sé   i@  iÀ  g      @zDPM++ 2M Karras)ÚpromptÚnegative_promptÚwidthÚheightÚstepsÚ	cfg_scaleÚsampler_nameÚ
batch_sizeÚn_iterr,   Ú	clip_skipz/sdapi/v1/txt2imgi,  )Újsonrƒ   Úinfoz{}r,   é"   Ú ri   z%s.pngÚimagesz  [OK] %.0fs seed=%s -> %s)ÚfilerJ   r,   Úposer†   r�   rŽ   ÚconservaÚquitadoÚropa_en_lineaÚchar_line_originalz7
[dry-run] nada generado. Quita --dry-run para generar.z%Y%m%d_%H%M%SÚ	manifest_z.jsonF)Úensure_asciiÚindentr   r   z
[OK] %d imagenes -> %sz[OK] manifiesto: %s)AÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsrs   rq   rS   Úlistaru   rk   r   Úlenr$   ÚnÚrandomr,   Ú	pick_seedÚsampleÚminÚ
pendientesÚPENDIENTES_5rb   rI   Ú
SystemExitr   Ústrrp   Úmaster_promptrT   rŽ   ÚrequestsrQ   ÚFORGEr—   r   ÚOUTr&   rL   r   rX   Ú	enumerateÚPENDIENTES_ROPAÚ
DEBE_TENERÚNO_DEBE_TENERÚdry_runr‘   ÚtimeÚpostÚraise_for_statusÚloadsÚreplaceÚwrite_bytesÚbase64Ú	b64decoder#   rF   rH   rG   r   ÚnowÚstrftimer'   Údumpsr1   )&ÚapÚargsÚkr)   rs   Úall_rowsÚmissingÚvalidr­   Úforcerg   r/   ÚfaltanÚBÚmasterÚnegr¶   Úckr   r+   r-   ÚmanifestrJ   ÚblockÚposÚsegsÚneg_personajeÚiÚsÚpayloadÚt0ÚrÚdatar,   ÚsafeÚoutÚstampÚmans&                                         r   Úmainrä     sê  € Ü	×	 Ñ	 Ó	"€BØ‡O�O�K¨€OÔ5Ø‡O�O�H¤3°€OÔ3Ø‡O�O�I¤C°€OÔ4Ø‡O�O�H \ØNð ô Pà‡O�O�N¨<ØLð ô Nà‡O�O�HØPð ô Rà‡O�O�Ið;ð ô <ð ‡O�O�E¤ØRð ô Tà‡O�O�M¬°RØMð ô Oà�=‰=‹?€Dà‡y‚yØ&*§i¡i§o¡o°cÔ&:ÓHÑ&: ¸a¿g¹g½i�1—7‘7•9Ð&:ˆÑHØ	�ŠÜ˜Ÿ™Ó$ˆô ˜dÓ#ˆÙ"Ó8™d˜ a¨xÒ&7’1˜dˆÐ8ÙÜÐLÜ˜“\ 4§9¡9¨W°R°a¨[Ó#9Ð:ñ;ô <á Ó2™D�q A¨¢M’˜DˆÐ2Ø�6Š6ÛØ�K‰K˜Ÿ™Ô'Ø—M‘M %¬¨T¯V©V´S¸³ZÓ)@ÓAˆEØ‰Ø	�ŠÜ‰äˆØŸ	š	‰H v€Eä�gÓ€DÙ Ó2™�A A¨T¢MŠa˜€FÐ2ÙÜÐCÀfÑLÓMÐMä”cœ(“mÓ$€AØ�_‰_×"Ñ"Ó$×+Ñ+¨CÓ0€FØ
×
Ñ
€Cãð:Ø�\‰\œU˜GÐ#4Ð5¸rˆ\ÓB×GÑGÓIˆÜÐ" R§V¡VÐ,AÀ3Ó%GÑGÔHô ‡I�I�d T€IÔ*Ø—Y’Y‰6 H€DØ‡‚Ø�‰‰Ø	�ŠØ�Ñ‰Ø	�ŠØ�‰ˆÜ�D‰j€GØ‡M�M˜$¨€MÔ.Ø€Häˆä §¡°Ô6ˆÜ# F¨D°©J¸Ø/4ô6‰	ˆˆTð /3¯iªiœ  cÔ*¸Sˆà�9Š9Ø$¨Ñ+ð CØBóCÐ+ð %¨CÑ/ð OØNóOÐ/äˆoÔÜˆd�T‰kÔÜˆhŒÜ˜d AÖ&‰DˆAˆqÜ�+  A Ñ&Õ'ð 'à”?Ñ"ÜÐ'¨$¯)©)´OÀDÑ4IÓ*JÑJÔKØ”:ÑÜÐ# d§i¡i´
¸4Ñ0@Ó&AÑAÔBØ”=Ñ ÜÐ# d§i¡i´¸dÑ0CÓ&DÑDÔEØ˜CÒÜÐ# m´C¸¿	¹	»×8JÑ8JÈ3Ó8OÓ4PÐSTÑ4TÐ4UÐ&VÑVÔWà�<Š<Ùð ¨mØ D°4·:±:ØÐ.?Ø q°$·)±)È!ñ	
ˆô �Y‰Y‹[ˆØ�M‰MœU˜GÐ#4Ð5¸GÈSˆMÓQˆØ	×ÑÔØ�v‰v‹xˆð	Ü—:‘:˜dŸh™h v¨tÓ4Ó5×9Ñ9¸&À#ÓFˆDð �C�Rˆy× Ñ   cÓ*ˆØ˜ D™Ñ)ˆØ�‰œ×(Ñ(¨¨h©¸Ñ):Ó;Ô<ÜÐ*¬d¯i©i«k¸BÑ.>ÀÀcÇhÁhÐ-OÑOÔPØ�‰Ø—H‘H d°DÜ¤F°cÈcÜ"Ÿ™ t¨RÓ0Ü$×(Ñ(¨¨rÓ2Ü,×0Ñ0°°rÓ:Ø"& t¡*ñ
ö 	ðe ðv ‡|‚|ÜÐHÔIØä�L‰L‹N×#Ñ# OÓ4€EØ
�i ˜w eÐ,Ñ
,€CØ‡N�N”4—:‘:˜h°UÀ1ÔEØ#ð ô %ä	Ð
$¬¨H«°wÐ'?Ñ
?Ô@Ü	Ð
 #§(¡(Ñ
*Ô+ô �œ#˜h›-¨¨t¯y©y¸'ÕBùòw Iùò 9ùò 3ùò 3øô ò :ÜÐ4°qÑ8Ó9Ð9ûð:ûôv ò 	Ø‹Dð	ús[   Ä]Ä&]Å+	]Å5]Æ,	]$Æ6]$É	])É])ËA]. Õ<5^Ý.	^
Ý7^Þ^
Þ^Þ^Ú__main__u    â�Œ Fallo en test_accesorios: %s)FNrA   )2Ú__doc__r¥   rÄ   r—   re   Úsysr¾   r   Úpathlibr   Ú__file__Úresolver%   rp   rr   Úinsertr´   Úprompt_builderr   r   Útest_blocksr   rc   r¸   r·   ÚARCHIVOSr   r   r1   rH   rG   rP   rR   rL   rX   ÚBLOCKrb   r²   rº   r»   r¼   rk   ru   rä   Ú__name__r³   r   Ú
isinstanceÚcoder   rB   rM   r   Ú<module>ró      sF  ðñó  Û Û Û 	Û 
Û Ý Ý á�‹>×!Ñ!Ó#×*Ñ*×1Ñ1€Ø ‡�‡��‘3‘t˜H“~×-Ñ-Ó/×6Ñ6Ó7Ô 8ç >Ý 'à�:ÑÐ 0Ñ0€Ø�ÑÐ-Ñ-€Ø€ð �jÑ €Ù€xƒ=˜Ÿ™Ñ Ø‡H�H‡O�O�A‘s˜8“}Ô%ò7ð ˜Ñ Ð#5Ñ5€
òHð2	7€ð" 
€ðð
 Ø46ñ€	ð	<àIð Að 	=àMð2ð	Nð Oð	Kð 	Gð
	,ð 	Mñ]/€ód
,ò7ð 	�‰˜Ñ€ò;€ò€ò 	<ÚIØ 5°ÐGà	˜XÐ&Ø$5Ð7HÐ#Iñ€ò ,Ø+¨]Ð;Ø5KÐ4Lñ€
ò GÚKâFñ	€óò*òPCðf ˆzÒð	Ù�ð øð ò á�a—f‘f˜cÔ"ÙÐ5¸¿¹Ñ>Ô?ØûØò ÙÐ1°AÑ5Ô6Øûðús$   Å#E, Å,F3Å1)FÆF3Æ"F.Æ.F3