Ë
    ‰nÉj�x  ã                   óR  — d 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dz  dz  Zedz  dz  dz  Zedz  d	z  Z ej                  d
ej                   «      Z ej                  dej                   «      Z ej                  dej                   «      Z ej                  dej                   «      Z ej                  dej                   «      Zh d£Zdddddddddddœ
ZdhZdZdZ ej                  dej                   «      Zd„ Z ej                  dej                   «      Z ej                  dej                   «      Zdddd d!d"d#œZejA                  d$d%i«       d&„ Z!d'Z"d(Z#d)Z$d*„ Z%d+„ Z&d,„ Z'd-„ Z(d1d.„Z)d/„ Z*e+d0k(  r e*«        yy)2aÇ  
WD14 blocks: convierte cada .txt de tags en UNA LINEA de wildcard, sin clasificar.

No es wd14_harvest.py. Ahi se separaba en buckets (pose/scene/outfit/...) y se
tiraba la anatomia. Esto es lo contrario: se conserva el bloque ORDENADO tal cual
sale del tagger y solo se le quitan DOS cosas:

    1. IDENTIDAD  -> pelo, color de pelo, ojos, piel, species, rasgos faciales,
                     y el tag de personaje (fujiwara_chika, arlecchino_(genshin_impact)...)
    2. ROPA       -> toda. El outfit lo pone la linea del personaje + wildcards.

Se CONSERVAN los conteos (1girl, 1boy, hetero) porqueNeeded para que la pose de
dos personas no pelee con el '1girl, solo' del MASTER, y se conservan TODOS los
tags NSFW (pussy, cum, penetration...) y de pose, que es justo lo que se quiere
transplantar.

Entrada :  Archivos/wd14/tags/**/*.txt   (salida de wd14_tagger.py)
Salida  :  Archivos/wildcards_harvest/bloques.txt   <- 1 linea = 1 wildcard
           Archivos/wildcards_harvest/bloques_*.txt (opciones de ropa extra)
           Archivos/wildcards_harvest/bloques_diff.txt (que se quito de cada uno)

    python Engine/wd14_blocks.py
    python Engine/wd14_blocks.py --min-tokens 4      # descarta bloques<muy cortos
é    N)ÚCounter)ÚPathÚArchivoszDanbooru tags.csvÚwd14ÚtagsÚwildcards_harvestan  hair|eye|pupil|sclera|bangs|ponytail|braid|twintail|ahoge|sidelock|fringe|ears?$|animal_ear|horn|tails?$|wings?$|face|facial|freckle|mole|marking|makeup|lipstick|nail|tips?$|toenail|skin|_skin|tan$|colored_skin|veins|veiny|body_fur|fur$|breast_size|large_breasts|small_breasts|medium_breasts|huge_breasts|flat_chest|busty|bouncing_breasts|hanging_breasts|breasts_squeezed_together|breasts_apart|thick_thighs|thin_legs|slender|petite|tall$|curvy|plump|muscular$|body_curve|wide_hips|narrow_waist|hourglass|thigh_gap|child$|loli|shota|minigirl|toddler|aged_|schoolgirl|furry|anthropomorphic|anthro|interspecies|elf$|demon_girl$|android|robot$|alien$|monster_girl$|dragon_girl$|fox_girl$|wolf_girl$|rabbit_girl$|cat_girl$|horse_girl$|cow_girl$|bunny_girl$|sheep_girl$|piercing$|barbell_piercing|labret|ear_gauntlet|forehead_jewel|^clenched_teeth$|^teeth$|^tongue$|^soles$|^toenail$a�  shirt|blouse|dress|skirt|panties|^bra$|.*_bra$|bralette|thighhighs|thigh_highs|kneehighs|knee_highs|stockings|pantyhose|uniform|gloves|socks|shoes|boots|jacket|coat|sweater|apron|lingerie|bikini|swimsuit|leotard|bodysuit|harness|collar|^tie$|necktie|bow|ribbon|scarf|^belt$|jewelry|earrings|necklace|neckwear|bracelet|anklet|wristband|armband|robe|kimono|miko|armor|top$|top_|bottom$|legwear|underwear|^pants$|panty|corset|garter|stocking|camisole|cardigan|turtleneck|blazer|vest|waistband|headband|ear_cover|choker|maid_apron|maid_headdress|frills?|lace|satin|leather|fur_trim|highleg|cropped|crop_top|midriff|open_clothes|see-through|nightgown|overalls|^bag$|babydoll|playboy_bunny|^thong$|sleeves|^hat$|^cap$|clothing|costume|^sunglasses$|^glasses$|^clothed$|^clothed_.+|^nude_(male|female)_|nude_male_|nude_female_|clothed_sex$^black_|^white_|^red_|^blue_|^green_|^pink_|^purple_|^yellow_|^orange_|^brown_a§  ^[:;=8xXA><*_\-]+$|watermark|signature|username|text$|_text$|speech_bubble|thought_bubble|comic|monochrome|greyscale|grayscale|border$|logo|patreon|twitter|web_address|meme|lowres|pixelated|traditional_media|comment|english|korean|japanese_text|oekaki|drawn_focus|commentary|spoken_question_mark|spoken_heart|^heart$|heart_(hands|censor)$|^broken_heart$|^breath$|motion_lines|speech_lines|focus_comic|panel$|spotlight|^\W+$zS^1girl$|^1boy$|^hetero$|^couple$|^solo$|^everyone$|^no_humans$|^group_sex$|^1other$z�^\d*\+?(girls|boys|others|people|humans)$|^twins$|^multiple_|^mixed_|^2girls$|^3girls$|^4girls$|^5girls$|^6\+girls$|^2boys$|^3boys$|^4boys$|^5boys$|^6\+boys$>   ÚposeÚposingÚhighresÚscore_9Úthe_poseÚ	absurdresÚ	no_shadowÚ	realisticÚ
no_outlineÚ
score_7_upÚ
score_8_upÚmasterpieceÚbest_qualityÚphotorealisticg333333ã?gffffffæ?g      à?gš™™™™™é?g      è?)
Ú
spread_assÚ	ass_focusÚpussy_focusÚspread_pussyÚ
pussy_peekÚspread_legsÚspread_hipsÚ	large_assÚhuge_assÚ	giant_assÚ	all_fours)ÚsexÚvaginalÚanalÚpenetrationÚcum_in_pussyÚcum_in_vaginaÚcreampieÚimplied_penetration)ÚfellatioÚoralÚblowjobÚpaizuriÚtitjobÚcum_in_mouthzÃ^(black|white|grey|gray|silver|gold|golden|navy|beige|cream|ivory|red|pink|orange|brown|tan|yellow|green|blue|purple|violet|teal|multicolored|colored|two-tone|dark|light|bright|deep|pastel|neon)_c                 óX   — d}| }||k7  r |}t         j                  d|d¬«      }||k7  rŒ |S )zJ'light_blue_thighhighs' -> 'thighhighs'. Repite: el color puede ser doble.NÚ é   )Úcount)ÚCLOTH_COLORÚsub)ÚtagÚprevÚts      úEngine/wd14_blocks.pyÚstrip_colorr:   ª   s<   € à€DØ€AØ
�!Š)ØˆÜ�O‰O˜B ¨ˆOÓ+ˆð �!‹)ð €Hó    a  ^virtual_youtuber$|^vp$|^live2d|^nijisanji|^hololive$|^median_furrow$|^armpit_crease$|^butterfly_wing$|^collarbone$|^genderswap|^two-sided_|^impossible_clothes$|^alternate_costume$|^alternate_breast_size|^jacked_off$|^halloween|^jack-o-lantern$|^jack-o'-lantern$|^trick_or_treat$|^syringe$|^nurse_cap$|^nurse$|^barcode$|^id_card$|^wedding$|^gown$|^candy$|^food$|^bread$|^cake$|^pudding$|^dango$|^outline$|^white_outline$|^blue_outline$|^outline_only$|^simple_lineart$|^no_lineart$|^sketch$|^monochrome$|^greyscale$|^lineart$zŠ^solo_focus$|^male_focus$|^solo$|^pov_crotch$|.*_focus$|^focus$|^focused$|^cross-section$|^internal_cumshot$|^doll_view$|^x-ray$|^cutaway$z`DESCARTADO (07-10-2026): pose de rodillas + camara desde atras; deformacion en pies/piernas/culozGDESCARTADO (07-10-2026): incoherencia de escena, no sale el acto pedidoz@DESCARTADO (07-10-2026): anatomia ilegible / pose no reconociblez6DESCARTADO (07-10-2026): no sale el acto sexual pedidoz9DESCARTADO (07-10-2026): fusion de piernas, anatomia rotazhDESCARTADO (07-10-2026): veredicto 'Descartado' del usuario al revisar el prompt (07_b15 / 16_b15, Seed))z+sample_288905b07701b49561080c51ec453f46.txtz+sample_1f32d22df91aaf31bbb86f5fdbebe5cf.txtz$c647558aa7dd46f804cd259e2350e710.txtz$abbaf67647d6b5124dcb079cdf8306ca.txtz+sample_306c6d5fe0bf2506246890a3a81434ef.txtz+sample_66af8aa182f78331319562743d935232.txtz12348708_bent_over_s.txtzRDESCARTADO (07-10-2026): unica pose util (bent_over), resto es atrezo de Halloweenc                 óÆ   ‡— | j                  «       }|dk(  rg S t        ˆfd„t        D «       «      rdgS dg}d‰vr|j                  d«       d‰vr|j                  d«       |S )a9  Sustituye all_fours por tags que EXISTEN en el vocabulario Danbooru.

    Verificado el 07-10-2026 con 3 pruebas sobre el mismo personaje (Rem):
      a) doggystyle, from_behind                        -> FALLA
      b) all_fours, from_behind, arched_back           -> FUNCIONA
      c) all_fours, doggystyle, from_behind, kneeling  -> FALLA

    Dos cosas que costaron una medicion:
      - 'doggy' NO existe en el catalogo. Antes se devolvia ese tag y el modelo
        no lo leia como pose. Se comprobo contra Archivos/Danbooru tags.csv:
        all_fours existe (69.711 usos), doggy no aparece.
      - 'doggystyle' NO se puede mezclar con una sola persona: implica
        penetracion y contradice la pose. Con 'kneeling' tambien falla.
    Por eso una pose a cuatro patas SIN acte es: all_fours + los tags de apoyo.
    Ú
doggystylec              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©N© )Ú.0ÚpÚwhole_blocks     €r9   Ú	<genexpr>z"replace_flagged.<locals>.<genexpr>  s   øè ø€ Ð
1¡[ ˆ1�Ô¡[ùs   ƒr!   Úfrom_behindÚarched_back)ÚlowerÚanyÚPENETRATIONÚappend)r6   rC   r8   Úextras    `  r9   Úreplace_flaggedrL   ü   sg   ø€ ð  	�	‰	‹€AØˆLÒØˆ	Ü
Ó
1¥[Ó
1Ô1Øˆ~ÐàˆM€EØ˜KÑ'Ø�‰�]Ô#Ø˜KÑ'Ø�‰�]Ô#Ø€Lr;   )!r"   r#   r%   r$   Úanal_sexr(   r*   r,   r-   r.   ÚhandjobÚfootjobr/   r&   r'   Úcum_overflowÚejaculationÚcumshotÚ
deepthroatÚ	after_sexÚnetorareÚ	group_sexÚ	threesomeÚstanding_sexÚcowgirl_positionÚreverse_cowgirl_positionÚ
missionaryr=   ÚdoggyÚ69_positionÚsex_from_behindr   Ú
pov_crotch)ÚpenisÚpussyÚanusÚnipplesÚ	testiclesÚclitorisÚerectionÚ
uncensoredÚtoplessÚ
bottomlessÚahegaor   r   r   Úbetween_breastsÚsideboobÚ	underboobÚpussy_juiceÚcumÚcovered_nipplesÚcum_on_bodyÚcum_on_breastsÚinternal_cumshotzcross-section)ÚnudeÚcompletely_nudeÚpartially_nudeÚ	undressedc                 óº   — | D �ch c]  }|j                  «       ’Œ }}|t        t        «      z  ry|t        t        «      z  ry|t        t        «      z  ryyc c}w )z='explicit' | 'spicy' | 'sfw' a partir de los tags del bloque.ÚexplicitÚspicyÚsfw)rG   ÚsetÚSEVERITY_EXPLICITÚSEVERITY_SEXUALÚSEVERITY_NUDITY)Úblockr8   Úss      r9   Úseverityr‚   6  sU   € á!Ó"™E�qˆ�‰�˜E€AÐ"ØŒ3Ô Ó!Ò!ØØŒ3ŒÓÒØØŒ3ŒÓÒØØùò 	#s   …Ac                 óF   — t         j                  | «      }|r	d| › d|› d�S | S )z5(tag:peso) si el tag esta en DOWNWEIGHT. Idempotente.Ú(Ú:Ú))Ú
DOWNWEIGHTÚget)r6   Úws     r9   Úapply_weightrŠ   B  s+   € ä�‰�sÓ€AÙˆQˆsˆe�1�Q�C�qˆ>Ð' CÐ'r;   c                 ó0   — t        j                  dd| «      S )z‰Invierte apply_weight sobre un bloque entero: '(ass_focus:0.7), nude'
    -> 'ass_focus, nude'. Para comparar bloques y para buscar tags.z\(([^:()]+):[\d.]+\)z\1)Úrer5   )r€   s    r9   Ústrip_weights_ofr�   H  s   € ô �6‰6Ð)¨5°%Ó8Ð8r;   c                  ó0  — t        «       t        «       i }}} t        j                  «       s| ||fS t        j                  dd¬«      5 }t	        j
                  |«      D ]ž  }|d   j                  «       |d   }}|dk(  r| j                  |«       n|dk(  r|j                  |«       |j                  d«      sŒZ|d   j                  d	«      D ].  }|j                  «       j                  «       }|sŒ$||k7  sŒ*|||<   Œ0 Œ  	 d
d
d
«       | ||fS # 1 sw Y   ŒxY w)z@Tags que el CSV Danbooru marca como personaje(4) o copyright(3).r1   úutf-8)ÚnewlineÚencodingr6   ÚtypeÚ4Ú3ÚaliasesÚ,N)r|   ÚDANBOORUÚexistsÚopenÚcsvÚ
DictReaderrG   Úaddrˆ   ÚsplitÚstrip)ÚcharsÚcopiesÚaliasÚfÚrowr6   ÚcatÚas           r9   Úload_character_tagsr¦   N  só   € ä›5¤#£%¨�5ˆ6€EÜ�?‰?ÔØ�f˜eÐ#Ð#Ü	�‰˜r¨GˆÔ	4¸Ü—>‘> !Ö$ˆCØ˜5‘z×'Ñ'Ó)¨3¨v©;�ˆCØ�cŠzØ—	‘	˜#•Ø˜’Ø—
‘
˜3”Ø�w‰w�yÕ!Ø˜Y™×-Ñ-¨cÖ2�AØŸ™›	Ÿ™Ó)�AÚ˜Q #›XØ#&˜˜ašñ 3ñ %÷ 
5ð �&˜%ÐÐ÷ 
5Ð	4ús   ÁA/DÂ77DÃ/DÃ5	DÄDc                 ó´  — dj                  d„ | D «       «      }g g }}| D �]3  }|j                  «       }|j                  «       }	|sŒ'|	|v s|	|v r|j                  |df«       ŒCt        j                  |	«      s|	t        v r;t        j                  |	«      r|j                  |«       n|j                  |df«       Œ›|	t        v r6t        |	|«      D ]  }
|j                  |
«       Œ |j                  |df«       ŒÙt        j                  |	«      r|j                  |df«       �Œt        j                  |	«      r|j                  |df«       �Œ-t        j                  |	«      r|j                  |df«       �ŒWt        j                  |	«      r|j                  |d	f«       �Œ�t        j                  |	«      r|j                  |d
f«       �Œ«t        j                  |	«      rc|rLt!        |	«      }|r-||	k7  r(|j                  |d|› �f«       |j                  |«       n%|j                  |	«       n|j                  |df«       �Œ#|j                  |«       �Œ6 ||fS )zçQuita identidad + basura + (por defecto) toda la ropa. KEEP conteos/pose/NSFW.

    Respeta el orden original del tagger. keep_outfit=True deja la ropa pero SIN
    color (para el A/B focalizado en bloques que si traian ropa).
    Ú c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr?   )rG   ©rA   r8   s     r9   rD   zclean_block.<locals>.<genexpr>i  s   è ø€ Ð.© A�a—g‘g—i©ùs   ‚Ú	personajeÚmetazPOSE ROTA -> sustituidazconteo de otras personaszatrezo/estilo del dibujozencuadre (no contenido)ÚbasuraÚ	identidadzcolor fuera -> Úropa)Újoinrž   rG   rJ   ÚKEEP_COUNTSÚmatchÚ	DROP_METAÚ	FLAG_DROPrL   ÚDROP_OTHER_COUNTSÚDROP_EJEMPLOÚsearchÚDROP_CAMERAÚ	DROP_JUNKÚDROP_IDENTITYÚDROP_OUTFITr:   )r   rŸ   r    Úkeep_outfitÚjoinedÚkeepÚdroppedr6   r8   ÚlowÚrepÚcs               r9   Úclean_blockrÃ   b  s  € ð �X‰XÑ.©Ó.Ó.€FØ˜ˆ'€DÜˆØ�I‰I‹KˆØ�g‰g‹iˆÙØà�%‰<˜3 &™=Ø�N‰N˜A˜{Ð+Ô,Øä×Ñ˜SÔ! S¬IÑ%5Ü× Ñ  Ô%Ø—‘˜A•à—‘  6˜{Ô+ØØ”)ÑÜ& s¨FÖ3�Ø—‘˜CÕ ð 4à�N‰N˜AÐ8Ð9Ô:ØÜ×"Ñ" 3Ô'Ø�N‰N˜AÐ9Ð:Ô;ÙÜ×Ñ˜sÔ#Ø�N‰N˜AÐ9Ð:Ô;ÙÜ×Ñ˜cÔ"Ø�N‰N˜AÐ8Ð9Ô:ÙÜ×Ñ˜CÔ Ø�N‰N˜A˜x˜=Ô)ÙÜ×Ñ Ô$Ø�N‰N˜A˜{Ð+Ô,ÙÜ×Ñ˜cÔ"ÙÜ Ó$�Ù˜˜cšØ—N‘N A¨¸¸Ð'<Ð#=Ô>Ø—K‘K •Nà—K‘K Õ$à—‘  6˜{Ô+ÙØ�‰�AŽð_ ð` �ˆ=Ðr;   c                  ó@  — t        j                  d¬«      } | j                  dt        t        «      ¬«       | j                  dt        t
        «      ¬«       | j                  dt        dd¬	«       | j                  «       }t        |j                  «      }|j                  «       st        d
|› d�«      ‚t        |j                  d«      «      }|st        d|› �«      ‚t        «       \  }}}t        dt!        |«      › dt!        |«      › dt!        |«      › �«       t        |j"                  «      }|j%                  dd¬«       g g g }
}	}g }|D �]‰  }|j'                  d¬«      j)                  d«      D �cg c]#  }|j+                  «       sŒ|j+                  «       ‘Œ% }}|D �cg c]0  }|j-                  |j/                  «       |j/                  «       «      ‘Œ2 }}|j1                  |«      j3                  «       }|j4                  }d„ }t7        |||d¬«      \  }} ||«      }t7        |||d¬«      \  }} ||«      }|t8        v r1t8        |   }|j;                  d«      }|j=                  ||||f«       �Œ't!        |«      |j>                  k  r�ŒA|j=                  |«       |	j=                  |«       |
j=                  |t!        |«      t!        |«      |f«       �ŒŒ |dz  jA                  ddd¬«      5 }|jC                  d«       |jC                  dt!        |«      › d t!        |«      › d!|j>                  › d"�«       |jC                  d#«       tD        r?|jC                  d$d%jG                  d&„ tD        jI                  «       D «       «      z   dz   «       tJ        r3|jC                  d'd%jG                  t        tJ        «      «      z   dz   «       |jC                  d«       |D ],  }|jC                  d%jG                  d(„ |D «       «      dz   «       Œ. 	 d d d «       |d)z  jA                  ddd¬«      5 }|jC                  d*«       |jC                  dt!        |	«      › d+�«       |jC                  d,«       tJ        r3|jC                  d'd%jG                  t        tJ        «      «      z   dz   «       |jC                  d«       |	D ],  }|jC                  d%jG                  d-„ |D «       «      dz   «       Œ. 	 d d d «       d.d/d0d1œ}tM        «       }tO        |«      D ]  \  }}|tQ        |«      xx   d2z  cc<   Œ tO        |«      D ��cg c]  \  }}tQ        |«      d3k(  sŒ|‘Œ } }}d4D �]€  }!tO        |«      D ��cg c]  \  }}tQ        |«      |!k(  sŒ|‘Œ }"}}|"sŒ3|d5|!› d6�z  }|jA                  ddd¬«      5 }|jC                  d7|!jS                  «       › d8||!   › d�«       |jC                  dt!        |"«      › d9t!        |«      › d"�«       |jC                  d:«       tD        r?|jC                  d;d%jG                  d<„ tD        jI                  «       D «       «      z   dz   «       tJ        r3|jC                  d=d%jG                  t        tJ        «      «      z   dz   «       |jC                  d«       |"D ]/  }|jC                  d%jG                  d>„ ||   D «       «      dz   «       Œ1 	 d d d «       �Œƒ |d?z  jA                  ddd¬«      5 }|jC                  d@«       |jC                  dA«       tO        |«      D ].  \  }}|jC                  |› dBtQ        |«      › dB|
|   dC   › d�«       Œ0 	 d d d «       tM        «       }#d4D �]�  }!tU        t!        |«      «      D �cg c]2  }tQ        ||   «      |!k(  rt!        |	|   «      t!        ||   «      kD  r|‘Œ4 }"}t!        |"«      |#|!<   |"sŒd|d5|!› dD�z  jA                  ddd¬«      5 }|jC                  d7|!jS                  «       › dE�«       |jC                  dt!        |"«      › dF�«       |jC                  dG«       tD        r?|jC                  d;d%jG                  dH„ tD        jI                  «       D «       «      z   dz   «       tJ        r3|jC                  d=d%jG                  t        tJ        «      «      z   dz   «       |jC                  d«       |"D ]/  }|jC                  d%jG                  dI„ |	|   D «       «      dz   «       Œ1 	 d d d «       �Œ  tM        «       }#d4D �]�  }!tU        t!        |«      «      D �cg c]2  }tQ        ||   «      |!k(  rt!        |	|   «      t!        ||   «      kD  r|‘Œ4 }"}t!        |"«      |#|!<   |"sŒd|d5|!› dD�z  jA                  ddd¬«      5 }|jC                  d7|!jS                  «       › dE�«       |jC                  dt!        |"«      › dJ�«       |jC                  dG«       tD        r?|jC                  d;d%jG                  dK„ tD        jI                  «       D «       «      z   dz   «       tJ        r3|jC                  d=d%jG                  t        tJ        «      «      z   dz   «       |jC                  d«       |"D ]/  }|jC                  d%jG                  dL„ |	|   D «       «      dz   «       Œ1 	 d d d «       �Œ  |dMz  jA                  ddd¬«      5 }|jC                  dN«       |jC                  dO«       |
D ]a  \  }}$}%}|jC                  |› dP|%› dQ|$› d"�«       |r-|jC                  dRd%jG                  dS„ |D «       «      z   dz   «       |jC                  d«       Œc 	 d d d «       tW        dT„ |D «       «      }&tW        dU„ |D «       «      }'|dVz  jA                  ddd¬«      5 }|jC                  dW«       |jC                  dt!        |«      › dXt!        |«      › dY|&› dZ|'› d[�	«       |jC                  d\«       |D ]Z  \  }}(})}|jC                  |rd]nd^› |› d�«       |jC                  d_|(› d�«       |jC                  d`d%jG                  |)«      › da�«       Œ\ 	 d d d «       tW        db„ |D «       «      }*tW        dc„ |
D «       «      }+t        dt!        |«      › dd|*› dQ|+› de|*|+z  dfz  dg›dh�	«       t        di«       d4D ]D  }!|j-                  |!dC«      },|#j-                  |!dC«      }-t        dj|!dk›dl|,dm›dn|-dm›do|!› dp|!› dD�«       ŒF t        dqt!        |«      › dr�«       t        dst!        |	«      › dt�«       t        du«       t        dv«       t        dw«       |rt        dxt!        |«      › dy|&› dz|'› d{�«       | r1d%jG                  d|„ || dC      D «       «      d d} }.t        d~|.› d�«       y y c c}w c c}w # 1 sw Y   �	Œ˜xY w# 1 sw Y   �ŒÉxY wc c}}w c c}}w # 1 sw Y   �Œ{xY w# 1 sw Y   �Œ…xY wc c}w # 1 sw Y   �Œ‹xY wc c}w # 1 sw Y   �ŒðxY w# 1 sw Y   �Œ³xY w# 1 sw Y   �ŒÊxY w)€Nz+Tags WD14 -> 1 linea de wildcard por imagen)Údescriptionz--tags)Údefaultz--outz--min-tokensé   z4descarta bloques con menos tokens utiles (default 4))r’   rÆ   Úhelpz[!] No existe z. Ejecuta antes wd14_tagger.pyz*.txtz[!] No hay .txt en z[-] z bloques | personaje:z copyright:T)ÚparentsÚexist_okr�   )r‘   r–   c                 óz   — t        «       g }}| D ])  }||vsŒ|j                  |«       |j                  |«       Œ+ |S r?   )r|   rœ   rJ   )ÚseqÚseenÚoutr8   s       r9   Údedupezmain.<locals>.dedupe»  s;   € Ü›˜r�#ˆDÛ�Ø˜D’=Ø—H‘H˜Q”KØ—J‘J˜q•Mð ð ˆJr;   F)r¼   ÚREVISARzbloques.txtr‰   Ú
)r‘   r�   z/# WD14 bloques: 1 linea = 1 opcion de wildcard
z# z bloques de z imagenes (min-tokens=z)
zX# identidad (pelo/ojos/piel/species) y TODA la ropa fuera; pose+NSFW+escena conservados
z # anatomia de foco a peso bajo: z, c              3   ó0   K  — | ]  \  }}|› d |› �–— Œ y­w©r…   Nr@   ©rA   ÚkÚvs      r9   rD   zmain.<locals>.<genexpr>â  s!   è ø€ Ð KÑ8J±°°1 A 3 a¨ s¤Ñ8Jùó   ‚z # POSE ROTA (flag, sustituida): c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr?   ©rŠ   rª   s     r9   rD   zmain.<locals>.<genexpr>ç  ó   è ø€ Ð:¹°1œ|¨AŸ¹ùó   ‚zbloques_vestidos.txtz8# WD14 bloques VESTIDOS: 1 linea = 1 opcion de wildcard
zF bloques - MISMO orden que bloques.txt (indice i comparable para A/B)
z2# identidad fuera; ropa conservada pero SIN color
c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr?   rÙ   rª   s     r9   rD   zmain.<locals>.<genexpr>ó  rÚ   rÛ   z7ACTO SEXUAL explicito (penetracion / fellatio / fluido)z-SUGGESTIVO: desnudo o anatomia, pero SIN actozSEGURO: nada de desnudo ni acto)ry   rz   r{   r2   r{   )r{   rz   ry   Úbloques_z.txtz# WD14 bloques -- z: z bloques (de z?# 1 linea = 1 opcion de wildcard. identidad fuera, ropa fuera.
z# anatomia a peso bajo: c              3   ó0   K  — | ]  \  }}|› d |› �–— Œ y­wrÓ   r@   rÔ   s      r9   rD   zmain.<locals>.<genexpr>  ó!   è ø€ Ð$OÑ<N±D°A°q¨ s¨!¨A¨3¤ZÑ<Nùr×   z# POSE ROTA (flag): c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr?   rÙ   rª   s     r9   rD   zmain.<locals>.<genexpr>  s   è ø€ Ð"F¹I°q¤<°§?¹IùrÛ   zbloques_indice.txtz6# indice de bloques.txt -> severidad y .txt de origen
z'# formato: <idx>	<severidad>	<origen>

Ú	r   z_vestidos.txtz# VESTIDOS: ropa del WD14 sin color
z) bloques (solo los que ropa aporta algo)
z3# 1 linea = 1 opcion de wildcard. identidad fuera.
c              3   ó0   K  — | ]  \  }}|› d |› �–— Œ y­wrÓ   r@   rÔ   s      r9   rD   zmain.<locals>.<genexpr>.  rß   r×   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr?   rÙ   rª   s     r9   rD   zmain.<locals>.<genexpr>3  ó   è ø€ Ð"G¹J°q¤<°§?¹JùrÛ   z* bloques (solo los que ropa aportan algo)
c              3   ó0   K  — | ]  \  }}|› d |› �–— Œ y­wrÓ   r@   rÔ   s      r9   rD   zmain.<locals>.<genexpr>H  rß   r×   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr?   rÙ   rª   s     r9   rD   zmain.<locals>.<genexpr>M  rä   rÛ   zbloques_diff.txtz/# que se quito de cada bloque (revisar a mano)
z.# formato: <archivo>  (<quedado>/<original>)

z  (Ú/z  - c              3   ó2   K  — | ]  \  }}|› d |› d�–— Œ y­w)Ú[Ú]Nr@   )rA   r8   Úrs      r9   rD   zmain.<locals>.<genexpr>U  s!   è ø€ Ð+LÁG¹D¸A¸q¨q¨c°°1°#°Q¬KÁGùrÛ   c              3   ó,   K  — | ]  }|d    rŒ	d–— Œ y­w©é   r2   Nr@   ©rA   rë   s     r9   rD   zmain.<locals>.<genexpr>X  s   è ø€ Ð3™h˜¨a°«d”1™hùó   ‚
�c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­wrí   r@   rï   s     r9   rD   zmain.<locals>.<genexpr>Y  s   è ø€ Ð0™x˜!¨1¨Q«4”A™xùrð   zbloques_descartados.txtz<# bloques DESCARTADOS / PENDIENTES: no entran a ningun pool
z de z imagenes (z descartados, z pendientes de revisar)
z:# flageados por auditoria visual (Output/test_blocks/*/)

z[PENDIENTE] r1   z
  motivo: z
  bloque: z

c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr?   )Úlen)rA   Úbs     r9   rD   zmain.<locals>.<genexpr>e  s   è ø€ Ð&™v˜!Œs�1�v™vùrÛ   c              3   ó*   K  — | ]  \  }}}}|–— Œ y ­wr?   r@   )rA   Ú_Úraw_ns      r9   rD   zmain.<locals>.<genexpr>f  s   è ø€ Ð2©E™.˜!˜U A q”©Eùs   ‚z bloques | z tokens conservados (éd   z.0fz%)z<
POOLS POR SEVERIDAD (sacada de los tags, NO de la carpeta):z  Ú9r¨   Ú2z desnudos  +  z vestidos  -> bloques_z.txt / bloques_z
[OK] bloques.txt            (z lineas, union)z[OK] bloques_vestidos.txt   (z& lineas, ropa sin color, mismo indice)z8[OK] bloques_{sfw,spicy,explicit}.txt  (pools separados)z=[OK] bloques_indice.txt      (idx -> severidad + .txt origen)z:[OK] bloques_diff.txt        (que se quito de cada bloque)z[--] z fuera de los pools: z descartados + z0 pendientes de revisar (bloques_descartados.txt)c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr?   rÙ   rª   s     r9   rD   zmain.<locals>.<genexpr>y  s   è ø€ ÐCÑ0B¨1”| A—Ñ0BùrÛ   én   z
     ejemplo sfw: z...),ÚargparseÚArgumentParserÚadd_argumentÚstrÚTAGS_DIRÚOUT_DIRÚintÚ
parse_argsr   r   r˜   Ú
SystemExitÚsortedÚrglobr¦   Úprintró   rÎ   ÚmkdirÚ	read_textr�   rž   rˆ   rG   Úrelative_toÚas_posixÚnamerÃ   ÚREJECTÚ
startswithrJ   Ú
min_tokensr™   Úwriter‡   r°   Úitemsr´   r   Ú	enumerater‚   ÚupperÚrangeÚsum)/rB   ÚargsÚsrcÚfilesrŸ   r    r¡   ÚOUTÚblocksÚdressedÚdiffsÚrejectedr¢   r8   ÚrawÚcanonÚoriginr  rÏ   r¾   r¿   ÚuniqÚkeep_drö   Úuniq_dÚreasonÚpendingÚfhrô   Ú	SEV_LABELÚ	sev_countÚiÚsfw_idxÚsevÚidxsÚclothed_per_sevr÷   Úkeep_nÚn_rejectÚ	n_pendingÚwhyÚblkÚkeptÚtotalÚnÚcnÚejs/                                                  r9   Úmainr9  ž  s?  € Ü×ÑÐ,YÔZ€AØ‡N�N�8¤S¬£]€NÔ3Ø‡N�N�7¤C¬£L€NÔ1Ø‡N�N�>¬°QØNð ô Pà�<‰<‹>€Dä
ˆt�y‰y‹/€CØ�:‰:Œ<Ü˜>¨#¨Ð.LÐMÓNÐNÜ�3—9‘9˜WÓ%Ó&€EÙÜÐ.¨s¨eÐ4Ó5Ð5ä.Ó0Ñ€Eˆ6�5Ü	ˆD”�U“�Ð1´#°e³*°¸[ÌÈVËÈÐ
VÔWä
ˆt�x‰x‹.€CØ‡I�I�d T€IÔ*à  R�UˆG€FØ€HÜˆØ"#§+¡+°w +Ó"?×"EÑ"EÀcÔ"JÓXÑ"J˜QÈaÏgÉgÍiˆq�w‰w�yÐ"JˆÐXÙ:=Ó>¹#°Q�—‘˜1Ÿ7™7›9 a§g¡g£iÕ0¸#ˆÐ>Ø—‘˜sÓ#×,Ñ,Ó.ˆØ�v‰vˆò	ô $ E¨5°&ÀeÔL‰ˆˆgÙ�d‹|ˆô    u¨fÀ$ÔG‰	ˆ�Ù˜“ˆð ”6‰>Ü˜D‘\ˆFØ×'Ñ'¨	Ó2ˆGØ�O‰O˜V V¨T°7Ð;Ô<Ùäˆt‹9�t—‘Ò&ÙØ�‰�dÔØ�‰�vÔð 	�‰�fœc #›h¬¨D«	°7Ð;Ö<ðE ðJ �Ñ
×	#Ñ	# C°'À4Ð	#Ô	HÈBØ
�‰ÐCÔDØ
�‰�2”c˜&“k�] ,¬s°5«z¨lð ; Ø $§¡Ð0°ð5ô 	6à
�‰ð 2ô 	3åØ�H‰HÐ7Ø—y‘yÑ K¼
×8HÑ8HÔ8JÓ KÓKñLØNRñSô TåØ�H‰HÐ7¸$¿)¹)ÄFÌ9ÓDUÓ:VÑVÐY]Ñ]Ô^Ø
�‰�ŒÛˆAØ�H‰H�T—Y‘YÑ:¹Ó:Ó:¸TÑAÕBñ ÷ 
Ið  Ð&Ñ
&×	,Ñ	,¨S¸7ÈDÐ	,Ô	QÐUWØ
�‰ÐLÔMØ
�‰�2”c˜'“l�^ð $4ð 5ô 	6à
�‰ÐFÔGÝØ�H‰HÐ7¸$¿)¹)ÄFÌ9ÓDUÓ:VÑVÐY]Ñ]Ô^Ø
�‰�ŒÛˆAØ�H‰H�T—Y‘YÑ:¹Ó:Ó:¸TÑAÕBñ ÷ 
Rð NØ@Ø0ñ€Iô
 “	€IÜ˜&Ö!‰ˆˆ1Ø”(˜1“+Ó !Ñ#Ôð "ä& vÔ.ÔGÑ.‘T�Q˜´(¸1³+ÀÓ2FŠqÐ.€GÑGä+ˆÜ'¨Ô/ÔFÑ/‘d�a˜´8¸A³;À#Ó3E’Ð/ˆÑFÙØØ�x ˜u DÐ)Ñ)ˆØ�Y‰Y�s W°dˆYÔ;¸rØ�H‰HÐ)¨#¯)©)«+¨°b¸À3¹Ð8HÈÐKÔLØ�H‰H�rœ#˜d›)˜ M´#°f³+°¸cÐBÔCØ�H‰HÐWÔXÝØ—‘Ð3ØŸ9™9Ñ$O¼J×<LÑ<LÔ<NÓ$OÓOñPØRVñWô XåØ—‘Ð/°$·)±)¼FÄ9Ó<MÓ2NÑNÐQUÑUÔVØ�H‰H�TŒNÛ�Ø—‘˜Ÿ™Ñ"F¸FÀ1ºIÓ"FÓFÈÑMÕNñ ÷ <Ñ;ð ,ð& Ð$Ñ
$×	*Ñ	*¨3¸È$Ð	*Ô	OÐSUØ
�‰ÐJÔKØ
�‰Ð>Ô?Ü˜fÖ%‰DˆAˆqØ�H‰H˜�s˜"œX a›[˜M¨¨E°!©H°Q©K¨=¸Ð;Õ<ñ &÷ 
Pô “i€OÜ+ˆÜ ¤ V£Ô-ó TÑ-�aÜ˜F 1™IÓ&¨#Ò-´#°g¸a±j³/ÄCÈÈqÉ	ÃNÒ2Rò Ð-ˆð Tä" 4›yˆ˜ÑÙØØ�h˜s˜e =Ð1Ñ1×7Ñ7Ø˜g¨tð 8ô 5Ø8:Ø�H‰HÐ)¨#¯)©)«+¨Ð6ZÐ[Ô\Ø�H‰H�rœ#˜d›)˜Ð$NÐOÔPØ�H‰HÐKÔLÝØ—‘Ð3ØŸ9™9Ñ$O¼J×<LÑ<LÔ<NÓ$OÓOñPØRVñWô XåØ—‘Ð/°$·)±)¼FÄ9Ó<MÓ2NÑNÐQUÑUÔVØ�H‰H�TŒNÛ�Ø—‘˜Ÿ™Ñ"G¸GÀAºJÓ"GÓGÈ$ÑNÕOñ ÷5ñ 5ð ,ô2 “i€OÜ+ˆÜ ¤ V£Ô-ó TÑ-�aÜ˜F 1™IÓ&¨#Ò-´#°g¸a±j³/ÄCÈÈqÉ	ÃNÒ2Rò Ð-ˆð Tä" 4›yˆ˜ÑÙØØ�h˜s˜e =Ð1Ñ1×7Ñ7Ø˜g¨tð 8ô 5Ø8:Ø�H‰HÐ)¨#¯)©)«+¨Ð6ZÐ[Ô\Ø�H‰H�rœ#˜d›)˜Ð$OÐPÔQØ�H‰HÐKÔLÝØ—‘Ð3ØŸ9™9Ñ$O¼J×<LÑ<LÔ<NÓ$OÓOñPØRVñWô XåØ—‘Ð/°$·)±)¼FÄ9Ó<MÓ2NÑNÐQUÑUÔVØ�H‰H�TŒNÛ�Ø—‘˜Ÿ™Ñ"G¸GÀAºJÓ"GÓGÈ$ÑNÕOñ ÷5ñ 5ð ,ð( Ð"Ñ
"×	(Ñ	(¨°wÈÐ	(Ô	MÐQSØ
�‰ÐCÔDØ
�‰ÐCÔEÛ,1Ñ(ˆD�%˜ Ø�H‰H˜�v˜S  ¨¨%¨°Ð4Ô5ÙØ—‘˜ $§)¡)Ñ+LÁGÓ+LÓ"LÑLÈtÑSÔTØ�H‰H�T�Nñ	 -2÷ 
Nô Ñ3™hÓ3Ó3€HÜÑ0™xÓ0Ó0€Ià
Ð)Ñ
)×	/Ñ	/°¸gÈtÐ	/Ô	TÐXZØ
�‰ÐPÔQØ
�‰�2”c˜(“m�_ D¬¨U«¨ð 5Ø�J˜n¨Y¨KÐ7PðRô 	Sà
�‰ÐOÔPÛ)1Ñ%ˆF�C˜˜gØ�H‰H©'™°rÐ:¸6¸(À"ÐEÔFØ�H‰H�z #  bÐ)Ô*Ø�H‰H�z $§)¡)¨C£.Ð!1°Ð6Õ7ñ *2÷ 
Uô Ñ&™vÓ&Ó&€DÜÑ2©EÓ2Ó2€EÜ	ˆD”�V“�˜[¨¨¨a°¨wð 7Ø�5‰j˜‰n˜SÐ! ð%ô &ä	Ð
IÔJÛ+ˆØ�M‰M˜#˜qÓ!ˆØ× Ñ   aÓ(ˆÜ��3�q�'˜˜1˜Q˜%˜~¨b°¨Vð 4Ø˜5 °¨u°MðCõ 	Dð ,ô
 
Ð+¬C°«K¨=¸Ð
HÔIÜ	Ð)¬#¨g«,¨Ð7]Ð
^Ô_Ü	ÐFÔHÜ	ÐIÔKÜ	ÐFÔHÙÜ�”c˜(“m�_Ð$9Ø�
˜/¨)¨ð 5*ð+ô 	,ñ Ø�Y‰YÑC°°w¸q±zÒ0BÓCÓCÀDÀSÐIˆÜÐ$ R D¨Ð,Õ-ð ùòE YùÚ>÷F 
IÑ	Hú÷  
RÑ	Qüó, Hùó G÷ <Ñ;ú÷ 
PÑ	OüòT÷
5ñ 5üò*T÷
5ñ 5ú÷ 
NÑ	Mú÷ 
UÑ	Túsž   Å4vÆ
vÆ"5vË1Dv"Ð+B<v/Ô7v<Õv<Õ)wÖ wÖ'D(wÛ2AwÞ 7w"ß%Dw'ä-7w4æDw9ëB	xîB2xö"v,ö/v9÷w	÷w÷'w1	÷9x	øxøxÚ__main__)F),Ú__doc__rý   rš   rŒ   Úcollectionsr   Úpathlibr   Ú__file__ÚresolveÚparentÚBASE_DIRr—   r  r  ÚcompileÚIrº   r»   r¹   r±   rµ   r³   r‡   r´   rI   ÚORALr4   r:   r¶   r¸   r  ÚupdaterL   r}   r~   r   r‚   rŠ   r�   r¦   rÃ   r9  Ú__name__r@   r;   r9   Ú<module>rG     sL  ðñó0 Û 
Û 	Ý Ý á�‹>×!Ñ!Ó#×*Ñ*×1Ñ1€Ø�jÑ Ð#6Ñ6€Ø�jÑ  6Ñ)¨FÑ2€Ø
�ZÑ
Ð"5Ñ
5€ð �—
‘
ð;ð ‡D�Dó€ð& ˆb�j‰jðVð$ ‡D�Dó'€ð. ˆB�J‰Jðð ‡D�Dó€	ð  ˆb�j‰jðà‡D�Dó€ð �B—J‘Jð1ð ‡D�Dó	Ð òC€	ð ØØØð ØØØØØñ€
ðF ˆM€	ðC€àK€ð ˆb�j‰jðJð ‡D�Dó	€òð ˆr�z‰zð@ð ‡D�Dó€ð. ˆb�j‰jðHð ‡D�Dó	€ð$	+ð
 	RàJà@àCð	,ñ!
€ð& ‡�ð
 ð	ðô òðHÐ ð€ð M€ò	ò(ò9ò ó(9òx\.ð~ ˆzÒÙ…Fð r;   